From 24814e214776ae5165083a963db5c56abbde4176 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 30 Apr 2020 09:04:08 -0400 Subject: [PATCH 0001/1792] [dev.link] cmd/link: enforce single level of 'outer' sym Add code to the loader to enforce the invariant that there is only a single level of 'outer' symbol nesting. That is, if outer(X) = Y, then outer(Y) is always zero. Revise foldSubSymbolOffset based on the new invariant, allowing it to be inlined, and then fix the various "for s.Outer != nil" loops in the linker to just use an "if" instead of a loop. Change-Id: Ib895702bc6de52718248f09a5368b84cb2e0a3fa Reviewed-on: https://go-review.googlesource.com/c/go/+/231137 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/arm/asm.go | 4 +--- src/cmd/link/internal/arm64/asm.go | 8 +------- src/cmd/link/internal/ld/data.go | 16 ++++++++++++++-- src/cmd/link/internal/ld/data2.go | 18 ++---------------- src/cmd/link/internal/ld/symtab.go | 2 +- src/cmd/link/internal/loader/loader.go | 10 ++++++++++ src/cmd/link/internal/mips/asm.go | 8 +------- src/cmd/link/internal/mips64/asm.go | 8 +------- src/cmd/link/internal/ppc64/asm.go | 8 +------- 9 files changed, 32 insertions(+), 50 deletions(-) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index a2024bcede..793c2d3a2c 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -530,14 +530,12 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol // set up addend for eventual relocation via outer symbol. rs := r.Sym - r.Xadd = int64(signext24(r.Add & 0xffffff)) r.Xadd *= 4 - for rs.Outer != nil { + if rs.Outer != nil { r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) rs = rs.Outer } - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { ld.Errorf(s, "missing section for %s", rs.Name) } diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index dc3e45d6c0..7fedb04bc8 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -479,13 +479,7 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol r.Done = false // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - + rs := ld.ApplyOuterToXAdd(r) if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { ld.Errorf(s, "missing section for %s", rs.Name) } diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 162ef9ba4e..3083669465 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -126,14 +126,26 @@ func trampoline(ctxt *Link, s loader.Sym) { func foldSubSymbolOffset(ldr *loader.Loader, s loader.Sym) (loader.Sym, int64) { outer := ldr.OuterSym(s) off := int64(0) - for outer != 0 { + if outer != 0 { off += ldr.SymValue(s) - ldr.SymValue(outer) s = outer - outer = ldr.OuterSym(s) } return s, off } +// applyOuterToXAdd takes a relocation and updates the relocation's +// XAdd field to take into account the target syms's outer symbol (if +// applicable). +func ApplyOuterToXAdd(r *sym.Reloc) *sym.Symbol { + rs := r.Sym + r.Xadd = r.Add + if rs.Outer != nil { + r.Xadd += Symaddr(rs) - Symaddr(rs.Outer) + rs = rs.Outer + } + return rs +} + // relocsym resolve relocations in "s", updating the symbol's content // in "P". // The main loop walks through the list of relocations attached to "s" diff --git a/src/cmd/link/internal/ld/data2.go b/src/cmd/link/internal/ld/data2.go index d4503a4b0a..80fe79c15a 100644 --- a/src/cmd/link/internal/ld/data2.go +++ b/src/cmd/link/internal/ld/data2.go @@ -213,14 +213,7 @@ func relocsym2(target *Target, ldr *loader.Loader, err *ErrorReporter, syms *Arc r.Done = false // set up addend for eventual relocation via outer symbol. - rs := r.Sym - - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += Symaddr(rs) - Symaddr(rs.Outer) - rs = rs.Outer - } - + rs := ApplyOuterToXAdd(r) if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { Errorf(s, "missing section for relocation target %s", rs.Name) } @@ -357,14 +350,7 @@ func relocsym2(target *Target, ldr *loader.Loader, err *ErrorReporter, syms *Arc r.Done = false // set up addend for eventual relocation via outer symbol. - rs := r.Sym - - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += Symaddr(rs) - Symaddr(rs.Outer) - rs = rs.Outer - } - + rs := ApplyOuterToXAdd(r) r.Xadd -= int64(r.Siz) // relative to address after the relocated chunk if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { Errorf(s, "missing section for relocation target %s", rs.Name) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index f9eb05146f..7ddd3eb6f6 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -102,7 +102,7 @@ func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) { } xo := x - for xo.Outer != nil { + if xo.Outer != nil { xo = xo.Outer } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 2627218ced..1b62d05197 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1596,6 +1596,11 @@ func (l *Loader) SubSym(i Sym) Sym { func (l *Loader) SetOuterSym(i Sym, o Sym) { if o != 0 { l.outer[i] = o + // relocsym's foldSubSymbolOffset requires that we only + // have a single level of containment-- enforce here. + if l.outer[o] != 0 { + panic("multiply nested outer sym") + } } else { delete(l.outer, i) } @@ -2662,6 +2667,11 @@ func (l *Loader) migrateAttributes(src Sym, dst *sym.Symbol) { // Convert outer relationship if outer, ok := l.outer[src]; ok { dst.Outer = l.Syms[outer] + // relocsym's foldSubSymbolOffset requires that we only + // have a single level of containment-- enforce here. + if l.outer[outer] != 0 { + panic("multiply nested outer syms") + } } // Set sub-symbol attribute. See the comment on the AttrSubSymbol diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index a366e80ea3..73c578475c 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -107,13 +107,7 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol r.Done = false // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - + rs := ld.ApplyOuterToXAdd(r) if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { ld.Errorf(s, "missing section for %s", rs.Name) } diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index e69db29809..58011a9d6f 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -111,13 +111,7 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol r.Done = false // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - + rs := ld.ApplyOuterToXAdd(r) if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { ld.Errorf(s, "missing section for %s", rs.Name) } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 4dc50eab79..dae1a07590 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -819,13 +819,7 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol r.Done = false // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - + rs := ld.ApplyOuterToXAdd(r) if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { ld.Errorf(s, "missing section for %s", rs.Name) } -- GitLab From 6ea7a196d0a04eb913e0136fb681610055cf9b11 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 1 May 2020 12:24:03 -0400 Subject: [PATCH 0002/1792] [dev.link] cmd/internal/dwarf: revise Abbrevs() signature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The function Abbrevs() was returning an array of structures by value, which is not very efficient (this was showing up in a kubernetes kubelet linker profile). Switch the function to return a slice instead. Improves linker DwarfGenerateDebugSyms running time when linking the compiler in compilebench: DwarfGenerateDebugSyms 29.2ms ±144% 23.9ms ±125% -17.89% (p=0.000 n=99+99) Change-Id: I1132816563f208c63eb82a7932d9f2bcb2455324 Reviewed-on: https://go-review.googlesource.com/c/go/+/231558 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/internal/dwarf/dwarf.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd/internal/dwarf/dwarf.go b/src/cmd/internal/dwarf/dwarf.go index a17b574cdd..db013999da 100644 --- a/src/cmd/internal/dwarf/dwarf.go +++ b/src/cmd/internal/dwarf/dwarf.go @@ -398,9 +398,9 @@ func expandPseudoForm(form uint8) uint8 { // Abbrevs() returns the finalized abbrev array for the platform, // expanding any DW_FORM pseudo-ops to real values. -func Abbrevs() [DW_NABRV]dwAbbrev { +func Abbrevs() []dwAbbrev { if abbrevsFinalized { - return abbrevs + return abbrevs[:] } for i := 1; i < DW_NABRV; i++ { for j := 0; j < len(abbrevs[i].attr); j++ { @@ -408,7 +408,7 @@ func Abbrevs() [DW_NABRV]dwAbbrev { } } abbrevsFinalized = true - return abbrevs + return abbrevs[:] } // abbrevs is a raw table of abbrev entries; it needs to be post-processed -- GitLab From a38bc324ee3e1fb788685a946e3e6a4c63b64b41 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 29 Apr 2020 14:00:05 -0400 Subject: [PATCH 0003/1792] [dev.link] cmd/link: minor cleanup Minor cleanup: remove a couple of unused routines, and rename elfWriteDynEntSym2 to elfWriteDynEntSym. Change-Id: I7c767fd4aa18d04a469be5cb1cfbe63ebe570c83 Reviewed-on: https://go-review.googlesource.com/c/go/+/231897 Reviewed-by: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/elf.go | 37 ++++----------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 78298beafe..67fe83d8f5 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -743,39 +743,10 @@ func elfhash(name string) uint32 { return h } -func elfWriteDynEnt(arch *sys.Arch, s *sym.Symbol, tag int, val uint64) { - if elf64 { - s.AddUint64(arch, uint64(tag)) - s.AddUint64(arch, val) - } else { - s.AddUint32(arch, uint32(tag)) - s.AddUint32(arch, uint32(val)) - } -} - -func elfWriteDynEntSym2(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { +func elfWriteDynEntSym(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { Elfwritedynentsymplus2(ctxt, s, tag, t, 0) } -func Elfwritedynentsymplus(arch *sys.Arch, s *sym.Symbol, tag int, t *sym.Symbol, add int64) { - if elf64 { - s.AddUint64(arch, uint64(tag)) - } else { - s.AddUint32(arch, uint32(tag)) - } - s.AddAddrPlus(arch, t, add) -} - -func elfWriteDynEntSymSize(arch *sys.Arch, s *sym.Symbol, tag int, t *sym.Symbol) { - if elf64 { - s.AddUint64(arch, uint64(tag)) - } else { - s.AddUint32(arch, uint32(tag)) - } - s.AddSize(arch, t) -} - -// temporary func Elfwritedynent2(arch *sys.Arch, s *loader.SymbolBuilder, tag int, val uint64) { if elf64 { s.AddUint64(arch, uint64(tag)) @@ -1175,9 +1146,9 @@ func elfdynhash2(ctxt *Link) { s = ldr.CreateSymForUpdate(".dynamic", 0) elfverneed = nfile if elfverneed != 0 { - elfWriteDynEntSym2(ctxt, s, DT_VERNEED, gnuVersionR.Sym()) + elfWriteDynEntSym(ctxt, s, DT_VERNEED, gnuVersionR.Sym()) Elfwritedynent2(ctxt.Arch, s, DT_VERNEEDNUM, uint64(nfile)) - elfWriteDynEntSym2(ctxt, s, DT_VERSYM, gnuVersion.Sym()) + elfWriteDynEntSym(ctxt, s, DT_VERSYM, gnuVersion.Sym()) } sy := ldr.CreateSymForUpdate(elfRelType+".plt", 0) @@ -1188,7 +1159,7 @@ func elfdynhash2(ctxt *Link) { Elfwritedynent2(ctxt.Arch, s, DT_PLTREL, DT_REL) } elfwritedynentsymsize2(ctxt, s, DT_PLTRELSZ, sy.Sym()) - elfWriteDynEntSym2(ctxt, s, DT_JMPREL, sy.Sym()) + elfWriteDynEntSym(ctxt, s, DT_JMPREL, sy.Sym()) } Elfwritedynent2(ctxt.Arch, s, DT_NULL, 0) -- GitLab From c89251204e2b80a8234bd2e82fd3b11d912b0630 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 1 May 2020 19:13:30 -0400 Subject: [PATCH 0004/1792] [dev.link] cmd: delete old object support We are not going to merge to master until Go 1.16 cycle. The old object support can go now. Change-Id: I93e6f584974c7749d0a0c2e7a96def35134dc566 Reviewed-on: https://go-review.googlesource.com/c/go/+/231918 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/asm/internal/flags/flags.go | 2 - src/cmd/asm/main.go | 1 - src/cmd/compile/internal/gc/iexport.go | 22 +- src/cmd/compile/internal/gc/iimport.go | 16 +- src/cmd/compile/internal/gc/main.go | 3 +- src/cmd/internal/dwarf/dwarf.go | 12 - src/cmd/internal/goobj/goobj_test.go | 7 +- src/cmd/internal/obj/link.go | 1 - src/cmd/internal/obj/objfile.go | 397 +-- src/cmd/internal/obj/objfile2.go | 2 +- src/cmd/internal/obj/plist.go | 21 +- src/cmd/internal/obj/sym.go | 4 - src/cmd/link/internal/ld/main.go | 52 - src/cmd/link/internal/loader/loader.go | 2 +- src/cmd/link/link_test.go | 24 - src/cmd/nm/nm_test.go | 6 +- src/cmd/objdump/objdump_test.go | 3 +- src/cmd/oldlink/doc.go | 129 - src/cmd/oldlink/internal/amd64/asm.go | 874 ------ src/cmd/oldlink/internal/amd64/l.go | 43 - src/cmd/oldlink/internal/amd64/obj.go | 117 - src/cmd/oldlink/internal/arm/asm.go | 786 ----- src/cmd/oldlink/internal/arm/l.go | 75 - src/cmd/oldlink/internal/arm/obj.go | 107 - src/cmd/oldlink/internal/arm64/asm.go | 946 ------ src/cmd/oldlink/internal/arm64/l.go | 74 - src/cmd/oldlink/internal/arm64/obj.go | 110 - src/cmd/oldlink/internal/ld/ar.go | 193 -- src/cmd/oldlink/internal/ld/config.go | 272 -- src/cmd/oldlink/internal/ld/data.go | 2501 --------------- src/cmd/oldlink/internal/ld/deadcode.go | 409 --- src/cmd/oldlink/internal/ld/deadcode2.go | 441 --- src/cmd/oldlink/internal/ld/decodesym.go | 374 --- src/cmd/oldlink/internal/ld/dwarf.go | 2044 ------------ src/cmd/oldlink/internal/ld/elf.go | 2448 --------------- src/cmd/oldlink/internal/ld/execarchive.go | 37 - .../oldlink/internal/ld/execarchive_noexec.go | 13 - src/cmd/oldlink/internal/ld/go.go | 442 --- src/cmd/oldlink/internal/ld/ld.go | 217 -- src/cmd/oldlink/internal/ld/lib.go | 2749 ----------------- src/cmd/oldlink/internal/ld/link.go | 187 -- src/cmd/oldlink/internal/ld/macho.go | 1119 ------- .../internal/ld/macho_combine_dwarf.go | 462 --- src/cmd/oldlink/internal/ld/main.go | 338 -- src/cmd/oldlink/internal/ld/outbuf.go | 177 -- src/cmd/oldlink/internal/ld/outbuf_mmap.go | 44 - src/cmd/oldlink/internal/ld/outbuf_nommap.go | 15 - src/cmd/oldlink/internal/ld/outbuf_windows.go | 49 - src/cmd/oldlink/internal/ld/pcln.go | 530 ---- src/cmd/oldlink/internal/ld/pe.go | 1562 ---------- src/cmd/oldlink/internal/ld/sym.go | 109 - src/cmd/oldlink/internal/ld/symtab.go | 713 ----- .../ld/testdata/httptest/main/main.go | 22 - .../internal/ld/testdata/issue10978/main.go | 27 - .../internal/ld/testdata/issue10978/main.s | 1 - .../internal/ld/testdata/issue25459/a/a.go | 27 - .../ld/testdata/issue25459/main/main.go | 10 - .../ld/testdata/issue26237/b.dir/b.go | 16 - .../ld/testdata/issue26237/main/main.go | 16 - .../ld/testdata/issue32233/lib/ObjC.m | 16 - .../ld/testdata/issue32233/lib/lib.go | 19 - .../ld/testdata/issue32233/main/main.go | 11 - src/cmd/oldlink/internal/ld/typelink.go | 49 - src/cmd/oldlink/internal/ld/util.go | 97 - src/cmd/oldlink/internal/ld/xcoff.go | 1685 ---------- src/cmd/oldlink/internal/loadelf/ldelf.go | 1282 -------- src/cmd/oldlink/internal/loader/loader.go | 629 ---- src/cmd/oldlink/internal/loadmacho/ldmacho.go | 794 ----- src/cmd/oldlink/internal/loadpe/ldpe.go | 513 --- src/cmd/oldlink/internal/loadxcoff/ldxcoff.go | 238 -- src/cmd/oldlink/internal/mips/asm.go | 230 -- src/cmd/oldlink/internal/mips/l.go | 74 - src/cmd/oldlink/internal/mips/obj.go | 89 - src/cmd/oldlink/internal/mips64/asm.go | 278 -- src/cmd/oldlink/internal/mips64/l.go | 74 - src/cmd/oldlink/internal/mips64/obj.go | 98 - src/cmd/oldlink/internal/objfile/objfile.go | 664 ---- src/cmd/oldlink/internal/ppc64/asm.go | 1181 ------- src/cmd/oldlink/internal/ppc64/l.go | 74 - src/cmd/oldlink/internal/ppc64/obj.go | 106 - src/cmd/oldlink/internal/riscv64/asm.go | 168 - src/cmd/oldlink/internal/riscv64/l.go | 14 - src/cmd/oldlink/internal/riscv64/obj.go | 60 - src/cmd/oldlink/internal/s390x/asm.go | 574 ---- src/cmd/oldlink/internal/s390x/l.go | 74 - src/cmd/oldlink/internal/s390x/obj.go | 88 - src/cmd/oldlink/internal/sym/attribute.go | 117 - .../oldlink/internal/sym/compilation_unit.go | 23 - src/cmd/oldlink/internal/sym/library.go | 25 - src/cmd/oldlink/internal/sym/reloc.go | 128 - src/cmd/oldlink/internal/sym/segment.go | 58 - src/cmd/oldlink/internal/sym/sizeof_test.go | 37 - src/cmd/oldlink/internal/sym/symbol.go | 543 ---- src/cmd/oldlink/internal/sym/symbols.go | 135 - src/cmd/oldlink/internal/sym/symkind.go | 168 - .../oldlink/internal/sym/symkind_string.go | 76 - src/cmd/oldlink/internal/wasm/asm.go | 583 ---- src/cmd/oldlink/internal/wasm/obj.go | 35 - src/cmd/oldlink/internal/x86/asm.go | 699 ----- src/cmd/oldlink/internal/x86/l.go | 43 - src/cmd/oldlink/internal/x86/obj.go | 113 - src/cmd/oldlink/main.go | 71 - 102 files changed, 44 insertions(+), 33389 deletions(-) delete mode 100644 src/cmd/oldlink/doc.go delete mode 100644 src/cmd/oldlink/internal/amd64/asm.go delete mode 100644 src/cmd/oldlink/internal/amd64/l.go delete mode 100644 src/cmd/oldlink/internal/amd64/obj.go delete mode 100644 src/cmd/oldlink/internal/arm/asm.go delete mode 100644 src/cmd/oldlink/internal/arm/l.go delete mode 100644 src/cmd/oldlink/internal/arm/obj.go delete mode 100644 src/cmd/oldlink/internal/arm64/asm.go delete mode 100644 src/cmd/oldlink/internal/arm64/l.go delete mode 100644 src/cmd/oldlink/internal/arm64/obj.go delete mode 100644 src/cmd/oldlink/internal/ld/ar.go delete mode 100644 src/cmd/oldlink/internal/ld/config.go delete mode 100644 src/cmd/oldlink/internal/ld/data.go delete mode 100644 src/cmd/oldlink/internal/ld/deadcode.go delete mode 100644 src/cmd/oldlink/internal/ld/deadcode2.go delete mode 100644 src/cmd/oldlink/internal/ld/decodesym.go delete mode 100644 src/cmd/oldlink/internal/ld/dwarf.go delete mode 100644 src/cmd/oldlink/internal/ld/elf.go delete mode 100644 src/cmd/oldlink/internal/ld/execarchive.go delete mode 100644 src/cmd/oldlink/internal/ld/execarchive_noexec.go delete mode 100644 src/cmd/oldlink/internal/ld/go.go delete mode 100644 src/cmd/oldlink/internal/ld/ld.go delete mode 100644 src/cmd/oldlink/internal/ld/lib.go delete mode 100644 src/cmd/oldlink/internal/ld/link.go delete mode 100644 src/cmd/oldlink/internal/ld/macho.go delete mode 100644 src/cmd/oldlink/internal/ld/macho_combine_dwarf.go delete mode 100644 src/cmd/oldlink/internal/ld/main.go delete mode 100644 src/cmd/oldlink/internal/ld/outbuf.go delete mode 100644 src/cmd/oldlink/internal/ld/outbuf_mmap.go delete mode 100644 src/cmd/oldlink/internal/ld/outbuf_nommap.go delete mode 100644 src/cmd/oldlink/internal/ld/outbuf_windows.go delete mode 100644 src/cmd/oldlink/internal/ld/pcln.go delete mode 100644 src/cmd/oldlink/internal/ld/pe.go delete mode 100644 src/cmd/oldlink/internal/ld/sym.go delete mode 100644 src/cmd/oldlink/internal/ld/symtab.go delete mode 100644 src/cmd/oldlink/internal/ld/testdata/httptest/main/main.go delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue10978/main.go delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue10978/main.s delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue25459/a/a.go delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue25459/main/main.go delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue26237/b.dir/b.go delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue26237/main/main.go delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue32233/lib/ObjC.m delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue32233/lib/lib.go delete mode 100644 src/cmd/oldlink/internal/ld/testdata/issue32233/main/main.go delete mode 100644 src/cmd/oldlink/internal/ld/typelink.go delete mode 100644 src/cmd/oldlink/internal/ld/util.go delete mode 100644 src/cmd/oldlink/internal/ld/xcoff.go delete mode 100644 src/cmd/oldlink/internal/loadelf/ldelf.go delete mode 100644 src/cmd/oldlink/internal/loader/loader.go delete mode 100644 src/cmd/oldlink/internal/loadmacho/ldmacho.go delete mode 100644 src/cmd/oldlink/internal/loadpe/ldpe.go delete mode 100644 src/cmd/oldlink/internal/loadxcoff/ldxcoff.go delete mode 100644 src/cmd/oldlink/internal/mips/asm.go delete mode 100644 src/cmd/oldlink/internal/mips/l.go delete mode 100644 src/cmd/oldlink/internal/mips/obj.go delete mode 100644 src/cmd/oldlink/internal/mips64/asm.go delete mode 100644 src/cmd/oldlink/internal/mips64/l.go delete mode 100644 src/cmd/oldlink/internal/mips64/obj.go delete mode 100644 src/cmd/oldlink/internal/objfile/objfile.go delete mode 100644 src/cmd/oldlink/internal/ppc64/asm.go delete mode 100644 src/cmd/oldlink/internal/ppc64/l.go delete mode 100644 src/cmd/oldlink/internal/ppc64/obj.go delete mode 100644 src/cmd/oldlink/internal/riscv64/asm.go delete mode 100644 src/cmd/oldlink/internal/riscv64/l.go delete mode 100644 src/cmd/oldlink/internal/riscv64/obj.go delete mode 100644 src/cmd/oldlink/internal/s390x/asm.go delete mode 100644 src/cmd/oldlink/internal/s390x/l.go delete mode 100644 src/cmd/oldlink/internal/s390x/obj.go delete mode 100644 src/cmd/oldlink/internal/sym/attribute.go delete mode 100644 src/cmd/oldlink/internal/sym/compilation_unit.go delete mode 100644 src/cmd/oldlink/internal/sym/library.go delete mode 100644 src/cmd/oldlink/internal/sym/reloc.go delete mode 100644 src/cmd/oldlink/internal/sym/segment.go delete mode 100644 src/cmd/oldlink/internal/sym/sizeof_test.go delete mode 100644 src/cmd/oldlink/internal/sym/symbol.go delete mode 100644 src/cmd/oldlink/internal/sym/symbols.go delete mode 100644 src/cmd/oldlink/internal/sym/symkind.go delete mode 100644 src/cmd/oldlink/internal/sym/symkind_string.go delete mode 100644 src/cmd/oldlink/internal/wasm/asm.go delete mode 100644 src/cmd/oldlink/internal/wasm/obj.go delete mode 100644 src/cmd/oldlink/internal/x86/asm.go delete mode 100644 src/cmd/oldlink/internal/x86/l.go delete mode 100644 src/cmd/oldlink/internal/x86/obj.go delete mode 100644 src/cmd/oldlink/main.go diff --git a/src/cmd/asm/internal/flags/flags.go b/src/cmd/asm/internal/flags/flags.go index e8535ae9ac..1df9df9563 100644 --- a/src/cmd/asm/internal/flags/flags.go +++ b/src/cmd/asm/internal/flags/flags.go @@ -25,8 +25,6 @@ var ( SymABIs = flag.Bool("gensymabis", false, "write symbol ABI information to output file, don't assemble") Importpath = flag.String("p", "", "set expected package import to path") Spectre = flag.String("spectre", "", "enable spectre mitigations in `list` (all, ret)") - - Go115Newobj = flag.Bool("go115newobj", true, "use new object file format") ) var ( diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go index 9ca9797a45..71ee04128c 100644 --- a/src/cmd/asm/main.go +++ b/src/cmd/asm/main.go @@ -40,7 +40,6 @@ func main() { } ctxt.Flag_dynlink = *flags.Dynlink ctxt.Flag_shared = *flags.Shared || *flags.Dynlink - ctxt.Flag_go115newobj = *flags.Go115Newobj ctxt.IsAsm = true switch *flags.Spectre { default: diff --git a/src/cmd/compile/internal/gc/iexport.go b/src/cmd/compile/internal/gc/iexport.go index 35b8d985cb..32cc50fda1 100644 --- a/src/cmd/compile/internal/gc/iexport.go +++ b/src/cmd/compile/internal/gc/iexport.go @@ -997,18 +997,16 @@ func (w *exportWriter) linkname(s *types.Sym) { } func (w *exportWriter) symIdx(s *types.Sym) { - if Ctxt.Flag_go115newobj { - lsym := s.Linksym() - if lsym.PkgIdx > goobj2.PkgIdxSelf || (lsym.PkgIdx == goobj2.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)) - } + lsym := s.Linksym() + if lsym.PkgIdx > goobj2.PkgIdxSelf || (lsym.PkgIdx == goobj2.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)) } } diff --git a/src/cmd/compile/internal/gc/iimport.go b/src/cmd/compile/internal/gc/iimport.go index f3e65ff736..7c0764c677 100644 --- a/src/cmd/compile/internal/gc/iimport.go +++ b/src/cmd/compile/internal/gc/iimport.go @@ -696,16 +696,14 @@ func (r *importReader) linkname(s *types.Sym) { } func (r *importReader) symIdx(s *types.Sym) { - if Ctxt.Flag_go115newobj { - lsym := s.Linksym() - idx := int32(r.int64()) - if idx != -1 { - if s.Linkname != "" { - Fatalf("bad index for linknamed symbol: %v %d\n", lsym, idx) - } - lsym.SymIdx = idx - lsym.Set(obj.AttrIndexed, true) + lsym := s.Linksym() + idx := int32(r.int64()) + if idx != -1 { + if s.Linkname != "" { + Fatalf("bad index for linknamed symbol: %v %d\n", lsym, idx) } + lsym.SymIdx = idx + lsym.Set(obj.AttrIndexed, true) } } diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 756cdbd3c9..ba40582f4f 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -281,7 +281,6 @@ func Main(archInit func(*Arch)) { flag.StringVar(&benchfile, "bench", "", "append benchmark times to `file`") flag.BoolVar(&smallFrames, "smallframes", false, "reduce the size limit for stack allocated objects") flag.BoolVar(&Ctxt.UseBASEntries, "dwarfbasentries", Ctxt.UseBASEntries, "use base address selection entries in DWARF") - flag.BoolVar(&Ctxt.Flag_go115newobj, "go115newobj", true, "use new object file format") flag.StringVar(&jsonLogOpt, "json", "", "version,destination for JSON compiler/optimizer logging") objabi.Flagparse(usage) @@ -315,7 +314,7 @@ func Main(archInit func(*Arch)) { // Record flags that affect the build result. (And don't // record flags that don't, since that would cause spurious // changes in the binary.) - recordFlags("B", "N", "l", "msan", "race", "shared", "dynlink", "dwarflocationlists", "dwarfbasentries", "smallframes", "spectre", "go115newobj") + recordFlags("B", "N", "l", "msan", "race", "shared", "dynlink", "dwarflocationlists", "dwarfbasentries", "smallframes", "spectre") if smallFrames { maxStackVarSize = 128 * 1024 diff --git a/src/cmd/internal/dwarf/dwarf.go b/src/cmd/internal/dwarf/dwarf.go index db013999da..6ab83639ac 100644 --- a/src/cmd/internal/dwarf/dwarf.go +++ b/src/cmd/internal/dwarf/dwarf.go @@ -18,21 +18,9 @@ import ( "strings" ) -// TODO(go115newobj): clean up. Some constant prefixes here are no longer -// needed in the new object files. - // InfoPrefix is the prefix for all the symbols containing DWARF info entries. const InfoPrefix = "go.info." -// RangePrefix is the prefix for all the symbols containing DWARF location lists. -const LocPrefix = "go.loc." - -// RangePrefix is the prefix for all the symbols containing DWARF range lists. -const RangePrefix = "go.range." - -// DebugLinesPrefix is the prefix for all the symbols containing DWARF debug_line information from the compiler. -const DebugLinesPrefix = "go.debuglines." - // ConstInfoPrefix is the prefix for all symbols containing DWARF info // entries that contain constants. const ConstInfoPrefix = "go.constinfo." diff --git a/src/cmd/internal/goobj/goobj_test.go b/src/cmd/internal/goobj/goobj_test.go index 9f827c6a32..4acd30edc6 100644 --- a/src/cmd/internal/goobj/goobj_test.go +++ b/src/cmd/internal/goobj/goobj_test.go @@ -151,12 +151,9 @@ func buildGoobj() error { return nil } -// Check that a symbol has a given name, accepting both -// new and old objects. -// TODO(go115newobj): remove. +// Check that a symbol has a given name. func matchSymName(symname, want string) bool { - return symname == want || - strings.HasPrefix(symname, want+"#") // new style, with index + return strings.HasPrefix(symname, want+"#") // new style, with index } func TestParseGoobj(t *testing.T) { diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 32906a3e05..1b54df2c26 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -656,7 +656,6 @@ type Link struct { Flag_linkshared bool Flag_optimize bool Flag_locationlists bool - Flag_go115newobj bool // use new object file format Retpoline bool // emit use of retpoline stubs for indirect jmp/call Bso *bufio.Writer Pathname string diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 6d7f42ed0b..6701b9bfba 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -2,234 +2,18 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Writing of Go object files. - package obj import ( - "bufio" - "cmd/internal/bio" "cmd/internal/dwarf" "cmd/internal/objabi" "cmd/internal/sys" "fmt" "io" - "log" - "path/filepath" "sort" - "strings" "sync" ) -// objWriter writes Go object files. -type objWriter struct { - wr *bufio.Writer - ctxt *Link - // Temporary buffer for zigzag int writing. - varintbuf [10]uint8 - - // Number of objects written of each type. - nRefs int - nData int - nReloc int - nPcdata int - nFuncdata int - nFile int - - pkgpath string // the package import path (escaped), "" if unknown -} - -func (w *objWriter) addLengths(s *LSym) { - w.nData += len(s.P) - w.nReloc += len(s.R) - - if s.Type != objabi.STEXT { - return - } - - pc := &s.Func.Pcln - - data := 0 - data += len(pc.Pcsp.P) - data += len(pc.Pcfile.P) - data += len(pc.Pcline.P) - data += len(pc.Pcinline.P) - for _, pcd := range pc.Pcdata { - data += len(pcd.P) - } - - w.nData += data - w.nPcdata += len(pc.Pcdata) - - w.nFuncdata += len(pc.Funcdataoff) - w.nFile += len(pc.File) -} - -func (w *objWriter) writeLengths() { - w.writeInt(int64(w.nData)) - w.writeInt(int64(w.nReloc)) - w.writeInt(int64(w.nPcdata)) - w.writeInt(int64(0)) // TODO: remove at next object file rev - w.writeInt(int64(w.nFuncdata)) - w.writeInt(int64(w.nFile)) -} - -func newObjWriter(ctxt *Link, b *bufio.Writer, pkgpath string) *objWriter { - return &objWriter{ - ctxt: ctxt, - wr: b, - pkgpath: objabi.PathToPrefix(pkgpath), - } -} - -func WriteObjFile(ctxt *Link, bout *bio.Writer, pkgpath string) { - if ctxt.Flag_go115newobj { - WriteObjFile2(ctxt, bout, pkgpath) - return - } - - b := bout.Writer - w := newObjWriter(ctxt, b, pkgpath) - - // Magic header - w.wr.WriteString("\x00go114ld") - - // Version - w.wr.WriteByte(1) - - // Autolib - for _, p := range ctxt.Imports { - w.writeString(p.Pkg) - // This object format ignores p.Fingerprint. - } - w.writeString("") - - // DWARF File Table - fileTable := ctxt.PosTable.DebugLinesFileTable() - w.writeInt(int64(len(fileTable))) - for _, str := range fileTable { - w.writeString(filepath.ToSlash(str)) - } - - // Symbol references - for _, s := range ctxt.Text { - w.writeRefs(s) - w.addLengths(s) - } - - 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 { - return ctxt.Data[i].Name < ctxt.Data[j].Name - }) - } - - for _, s := range ctxt.Data { - w.writeRefs(s) - w.addLengths(s) - } - for _, s := range ctxt.ABIAliases { - w.writeRefs(s) - w.addLengths(s) - } - // End symbol references - w.wr.WriteByte(0xff) - - // Lengths - w.writeLengths() - - // Data block - for _, s := range ctxt.Text { - w.wr.Write(s.P) - pc := &s.Func.Pcln - w.wr.Write(pc.Pcsp.P) - w.wr.Write(pc.Pcfile.P) - w.wr.Write(pc.Pcline.P) - w.wr.Write(pc.Pcinline.P) - for _, pcd := range pc.Pcdata { - w.wr.Write(pcd.P) - } - } - for _, s := range ctxt.Data { - if len(s.P) > 0 { - switch s.Type { - case objabi.SBSS, objabi.SNOPTRBSS, objabi.STLSBSS: - ctxt.Diag("cannot provide data for %v sym %v", s.Type, s.Name) - } - } - w.wr.Write(s.P) - } - - // Symbols - for _, s := range ctxt.Text { - w.writeSym(s) - } - for _, s := range ctxt.Data { - w.writeSym(s) - } - for _, s := range ctxt.ABIAliases { - w.writeSym(s) - } - - // Magic footer - w.wr.WriteString("\xffgo114ld") -} - -// Symbols are prefixed so their content doesn't get confused with the magic footer. -const symPrefix = 0xfe - -func (w *objWriter) writeRef(s *LSym, isPath bool) { - if s == nil || s.RefIdx != 0 { - return - } - w.wr.WriteByte(symPrefix) - if isPath { - w.writeString(filepath.ToSlash(s.Name)) - } else if w.pkgpath != "" { - // w.pkgpath is already escaped. - n := strings.Replace(s.Name, "\"\".", w.pkgpath+".", -1) - w.writeString(n) - } else { - w.writeString(s.Name) - } - // Write ABI/static information. - abi := int64(s.ABI()) - if s.Static() { - abi = -1 - } - w.writeInt(abi) - w.nRefs++ - s.RefIdx = w.nRefs -} - -func (w *objWriter) writeRefs(s *LSym) { - w.writeRef(s, false) - w.writeRef(s.Gotype, false) - for _, r := range s.R { - w.writeRef(r.Sym, false) - } - - if s.Type == objabi.STEXT { - pc := &s.Func.Pcln - for _, d := range pc.Funcdata { - w.writeRef(d, false) - } - for _, f := range pc.File { - fsym := w.ctxt.Lookup(f) - w.writeRef(fsym, true) - } - for _, call := range pc.InlTree.nodes { - w.writeRef(call.Func, false) - f, _ := linkgetlineFromPos(w.ctxt, call.Pos) - fsym := w.ctxt.Lookup(f) - w.writeRef(fsym, true) - } - } -} - func (ctxt *Link) writeSymDebug(s *LSym) { ctxt.writeSymDebugNamed(s, s.Name) } @@ -311,138 +95,6 @@ func (ctxt *Link) writeSymDebugNamed(s *LSym, name string) { } } -func (w *objWriter) writeSym(s *LSym) { - ctxt := w.ctxt - if ctxt.Debugasm > 0 { - w.ctxt.writeSymDebug(s) - } - - w.wr.WriteByte(symPrefix) - w.wr.WriteByte(byte(s.Type)) - w.writeRefIndex(s) - flags := int64(0) - if s.DuplicateOK() { - flags |= 1 - } - if s.Local() { - flags |= 1 << 1 - } - if s.MakeTypelink() { - flags |= 1 << 2 - } - w.writeInt(flags) - w.writeInt(s.Size) - w.writeRefIndex(s.Gotype) - w.writeInt(int64(len(s.P))) - - w.writeInt(int64(len(s.R))) - var r *Reloc - for i := range s.R { - r = &s.R[i] - w.writeInt(int64(r.Off)) - w.writeInt(int64(r.Siz)) - w.writeInt(int64(r.Type)) - w.writeInt(r.Add) - w.writeRefIndex(r.Sym) - } - - if s.Type != objabi.STEXT { - return - } - - w.writeInt(int64(s.Func.Args)) - w.writeInt(int64(s.Func.Locals)) - w.writeInt(int64(s.Func.Align)) - w.writeBool(s.NoSplit()) - flags = int64(0) - if s.Leaf() { - flags |= 1 - } - if s.CFunc() { - flags |= 1 << 1 - } - if s.ReflectMethod() { - flags |= 1 << 2 - } - if ctxt.Flag_shared { - flags |= 1 << 3 - } - if s.TopFrame() { - flags |= 1 << 4 - } - w.writeInt(flags) - w.writeInt(int64(0)) // TODO: remove at next object file rev - - pc := &s.Func.Pcln - w.writeInt(int64(len(pc.Pcsp.P))) - w.writeInt(int64(len(pc.Pcfile.P))) - w.writeInt(int64(len(pc.Pcline.P))) - w.writeInt(int64(len(pc.Pcinline.P))) - w.writeInt(int64(len(pc.Pcdata))) - for _, pcd := range pc.Pcdata { - w.writeInt(int64(len(pcd.P))) - } - w.writeInt(int64(len(pc.Funcdataoff))) - for i := range pc.Funcdataoff { - w.writeRefIndex(pc.Funcdata[i]) - } - for i := range pc.Funcdataoff { - w.writeInt(pc.Funcdataoff[i]) - } - w.writeInt(int64(len(pc.File))) - for _, f := range pc.File { - fsym := ctxt.Lookup(f) - w.writeRefIndex(fsym) - } - w.writeInt(int64(len(pc.InlTree.nodes))) - for _, call := range pc.InlTree.nodes { - w.writeInt(int64(call.Parent)) - f, l := linkgetlineFromPos(w.ctxt, call.Pos) - fsym := ctxt.Lookup(f) - w.writeRefIndex(fsym) - w.writeInt(int64(l)) - w.writeRefIndex(call.Func) - w.writeInt(int64(call.ParentPC)) - } -} - -func (w *objWriter) writeBool(b bool) { - if b { - w.writeInt(1) - } else { - w.writeInt(0) - } -} - -func (w *objWriter) writeInt(sval int64) { - var v uint64 - uv := (uint64(sval) << 1) ^ uint64(sval>>63) - p := w.varintbuf[:] - for v = uv; v >= 0x80; v >>= 7 { - p[0] = uint8(v | 0x80) - p = p[1:] - } - p[0] = uint8(v) - p = p[1:] - w.wr.Write(w.varintbuf[:len(w.varintbuf)-len(p)]) -} - -func (w *objWriter) writeString(s string) { - w.writeInt(int64(len(s))) - w.wr.WriteString(s) -} - -func (w *objWriter) writeRefIndex(s *LSym) { - if s == nil { - w.writeInt(0) - return - } - if s.RefIdx == 0 { - log.Fatalln("writing an unreferenced symbol", s.Name) - } - w.writeInt(int64(s.RefIdx)) -} - // relocByOff sorts relocations by their offsets. type relocByOff []Reloc @@ -510,17 +162,11 @@ func (c dwCtxt) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64) func (c dwCtxt) AddFileRef(s dwarf.Sym, f interface{}) { ls := s.(*LSym) rsym := f.(*LSym) - if c.Link.Flag_go115newobj { - fidx := c.Link.PosTable.FileIndex(rsym.Name) - // Note the +1 here -- the value we're writing is going to be an - // index into the DWARF line table file section, whose entries - // are numbered starting at 1, not 0. - ls.WriteInt(c.Link, ls.Size, 4, int64(fidx+1)) - } else { - ls.WriteAddr(c.Link, ls.Size, 4, rsym, 0) - r := &ls.R[len(ls.R)-1] - r.Type = objabi.R_DWARFFILEREF - } + fidx := c.Link.PosTable.FileIndex(rsym.Name) + // Note the +1 here -- the value we're writing is going to be an + // index into the DWARF line table file section, whose entries + // are numbered starting at 1, not 0. + ls.WriteInt(c.Link, ls.Size, 4, int64(fidx+1)) } func (c dwCtxt) CurrentOffset(s dwarf.Sym) int64 { @@ -558,28 +204,19 @@ func (ctxt *Link) dwarfSym(s *LSym) (dwarfInfoSym, dwarfLocSym, dwarfRangesSym, ctxt.Diag("dwarfSym of non-TEXT %v", s) } if s.Func.dwarfInfoSym == nil { - if ctxt.Flag_go115newobj { - s.Func.dwarfInfoSym = &LSym{ - Type: objabi.SDWARFINFO, - } - if ctxt.Flag_locationlists { - s.Func.dwarfLocSym = &LSym{ - Type: objabi.SDWARFLOC, - } - } - s.Func.dwarfRangesSym = &LSym{ - Type: objabi.SDWARFRANGE, - } - s.Func.dwarfDebugLinesSym = &LSym{ - Type: objabi.SDWARFLINES, - } - } else { - s.Func.dwarfInfoSym = ctxt.LookupDerived(s, dwarf.InfoPrefix+s.Name) - if ctxt.Flag_locationlists { - s.Func.dwarfLocSym = ctxt.LookupDerived(s, dwarf.LocPrefix+s.Name) + s.Func.dwarfInfoSym = &LSym{ + Type: objabi.SDWARFINFO, + } + if ctxt.Flag_locationlists { + s.Func.dwarfLocSym = &LSym{ + Type: objabi.SDWARFLOC, } - s.Func.dwarfRangesSym = ctxt.LookupDerived(s, dwarf.RangePrefix+s.Name) - s.Func.dwarfDebugLinesSym = ctxt.LookupDerived(s, dwarf.DebugLinesPrefix+s.Name) + } + s.Func.dwarfRangesSym = &LSym{ + Type: objabi.SDWARFRANGE, + } + s.Func.dwarfDebugLinesSym = &LSym{ + Type: objabi.SDWARFLINES, } if s.WasInlined() { s.Func.dwarfAbsFnSym = ctxt.DwFixups.AbsFuncDwarfSym(s) diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 061e43c434..0b3b2be41b 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -17,7 +17,7 @@ import ( ) // Entry point of writing new object file. -func WriteObjFile2(ctxt *Link, b *bio.Writer, pkgpath string) { +func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { debugAsmEmit(ctxt) diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index 44ec4602de..c82257c9e9 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -139,26 +139,7 @@ func (ctxt *Link) InitTextSym(s *LSym, flag int) { ctxt.Text = append(ctxt.Text, s) // Set up DWARF entries for s - info, loc, ranges, _, lines := ctxt.dwarfSym(s) - - // When using new object files, the DWARF symbols are unnamed aux - // symbols and don't need to be added to ctxt.Data. - // But the old object file still needs them. - if !ctxt.Flag_go115newobj { - info.Type = objabi.SDWARFINFO - info.Set(AttrDuplicateOK, s.DuplicateOK()) - if loc != nil { - loc.Type = objabi.SDWARFLOC - loc.Set(AttrDuplicateOK, s.DuplicateOK()) - ctxt.Data = append(ctxt.Data, loc) - } - ranges.Type = objabi.SDWARFRANGE - ranges.Set(AttrDuplicateOK, s.DuplicateOK()) - ctxt.Data = append(ctxt.Data, info, ranges) - lines.Type = objabi.SDWARFLINES - lines.Set(AttrDuplicateOK, s.DuplicateOK()) - ctxt.Data = append(ctxt.Data, lines) - } + ctxt.dwarfSym(s) } func (ctxt *Link) Globl(s *LSym, size int64, flag int) { diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 4a8b0ebb6f..61ef6ff2ce 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -165,10 +165,6 @@ func (ctxt *Link) Int64Sym(i int64) *LSym { // asm is set to true if this is called by the assembler (i.e. not the compiler), // in which case all the symbols are non-package (for now). func (ctxt *Link) NumberSyms(asm bool) { - if !ctxt.Flag_go115newobj { - return - } - 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 diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 1ed8ccb828..b95bab3d89 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -39,7 +39,6 @@ import ( "flag" "log" "os" - "os/exec" "runtime" "runtime/pprof" "strings" @@ -99,8 +98,6 @@ var ( benchmarkFlag = flag.String("benchmark", "", "set to 'mem' or 'cpu' to enable phase benchmarking") benchmarkFileFlag = flag.String("benchmarkprofile", "", "emit phase profiles to `base`_phase.{cpu,mem}prof") - - flagGo115Newobj = flag.Bool("go115newobj", true, "use new object file format") ) // Main is the main entry point for the linker code. @@ -140,10 +137,6 @@ func Main(arch *sys.Arch, theArch Arch) { objabi.Flagparse(usage) - if !*flagGo115Newobj { - oldlink() - } - switch *flagHeadType { case "": case "windowsgui": @@ -415,48 +408,3 @@ func startProfile() { }) } } - -// Invoke the old linker and exit. -func oldlink() { - linker := os.Args[0] - if strings.HasSuffix(linker, "link") { - linker = linker[:len(linker)-4] + "oldlink" - } else if strings.HasSuffix(linker, "link.exe") { - linker = linker[:len(linker)-8] + "oldlink.exe" - } else { - log.Fatal("cannot find oldlink. arg0=", linker) - } - - // Copy args, filter out -go115newobj flag - args := make([]string, 0, len(os.Args)-1) - skipNext := false - for i, a := range os.Args { - if i == 0 { - continue // skip arg0 - } - if skipNext { - skipNext = false - continue - } - if a == "-go115newobj" { - skipNext = true - continue - } - if strings.HasPrefix(a, "-go115newobj=") { - continue - } - args = append(args, a) - } - - cmd := exec.Command(linker, args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Run() - if err == nil { - os.Exit(0) - } - if _, ok := err.(*exec.ExitError); ok { - os.Exit(2) // would be nice to use ExitError.ExitCode(), but that is too new - } - log.Fatal("invoke oldlink failed:", err) -} diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 1b62d05197..02cd0b89d8 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1914,7 +1914,7 @@ func (l *Loader) Preload(syms *sym.Symbols, f *bio.Reader, lib *sym.Library, uni r := goobj2.NewReaderFromBytes(roObject, readonly) if r == nil { if len(roObject) >= 8 && bytes.Equal(roObject[:8], []byte("\x00go114ld")) { - log.Fatalf("found object file %s in old format, but -go115newobj is true\nset -go115newobj consistently in all -gcflags, -asmflags, and -ldflags", f.File().Name()) + log.Fatalf("found object file %s in old format", f.File().Name()) } panic("cannot read object file") } diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 1c9e177911..145eb3c4ae 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -535,30 +535,6 @@ func TestStrictDup(t *testing.T) { } } -func TestOldLink(t *testing.T) { - // Test that old object file format still works. - // TODO(go115newobj): delete. - - testenv.MustHaveGoBuild(t) - - tmpdir, err := ioutil.TempDir("", "TestOldLink") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - src := filepath.Join(tmpdir, "main.go") - err = ioutil.WriteFile(src, []byte("package main; func main(){}\n"), 0666) - if err != nil { - t.Fatal(err) - } - - cmd := exec.Command(testenv.GoToolPath(t), "run", "-gcflags=all=-go115newobj=false", "-asmflags=all=-go115newobj=false", "-ldflags=-go115newobj=false", src) - if out, err := cmd.CombinedOutput(); err != nil { - t.Errorf("%v: %v:\n%s", cmd.Args, err, out) - } -} - const testFuncAlignSrc = ` package main import ( diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go index a49423b212..cdffb68067 100644 --- a/src/cmd/nm/nm_test.go +++ b/src/cmd/nm/nm_test.go @@ -335,11 +335,11 @@ func TestGoLib(t *testing.T) { } // Check that a symbol has a given name, accepting both -// new and old objects. -// TODO(go115newobj): remove. +// with (for packaged symbols) and without index (for +// non-package symbols). func matchSymName(symname, want string) bool { return symname == want || - strings.HasPrefix(symname, want+"#") // new style, with index + strings.HasPrefix(symname, want+"#") } const testexec = ` diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go index 814cbf4564..be271e4fa6 100644 --- a/src/cmd/objdump/objdump_test.go +++ b/src/cmd/objdump/objdump_test.go @@ -286,9 +286,8 @@ func TestDisasmGoobj(t *testing.T) { t.Fatalf("go tool compile fmthello.go: %v\n%s", err, out) } - // TODO(go115newobj): drop old object file support. need := []string{ - `main(#\d+)?\(SB\)`, // either new or old object file + `main#\d+\(SB\)`, `fmthello\.go:6`, } diff --git a/src/cmd/oldlink/doc.go b/src/cmd/oldlink/doc.go deleted file mode 100644 index 219499be0a..0000000000 --- a/src/cmd/oldlink/doc.go +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Link, typically invoked as ``go tool link,'' reads the Go archive or object -for a package main, along with its dependencies, and combines them -into an executable binary. - -Command Line - -Usage: - - go tool link [flags] main.a - -Flags: - - -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 - Set executable format type. - The default format is inferred from GOOS and GOARCH. - On Windows, -H windowsgui writes a "GUI binary" instead of a "console binary." - -I interpreter - Set the ELF dynamic linker to use. - -L dir1 -L dir2 - Search for imported packages in dir1, dir2, etc, - after consulting $GOROOT/pkg/$GOOS_$GOARCH. - -R quantum - Set address rounding quantum. - -T address - Set text segment address. - -V - Print linker version and exit. - -X importpath.name=value - Set the value of the string variable in importpath named name to value. - This is only effective if the variable is declared in the source code either uninitialized - or initialized to a constant string expression. -X will not work if the initializer makes - a function call or refers to other variables. - Note that before Go 1.5 this option took two separate arguments. - -a - Disassemble output. - -buildid id - Record id as Go toolchain build id. - -buildmode mode - Set build mode (default exe). - -c - Dump call graphs. - -compressdwarf - Compress DWARF if possible (default true). - -cpuprofile file - Write CPU profile to file. - -d - Disable generation of dynamic executables. - The emitted code is the same in either case; the option - controls only whether a dynamic header is included. - The dynamic header is on by default, even without any - references to dynamic libraries, because many common - system tools now assume the presence of the header. - -debugtramp int - Debug trampolines. - -dumpdep - Dump symbol dependency graph. - -extar ar - Set the external archive program (default "ar"). - Used only for -buildmode=c-archive. - -extld linker - Set the external linker (default "clang" or "gcc"). - -extldflags flags - Set space-separated flags to pass to the external linker. - -f - Ignore version mismatch in the linked archives. - -g - Disable Go package data checks. - -importcfg file - Read import configuration from file. - In the file, set packagefile, packageshlib to specify import resolution. - -installsuffix suffix - Look for packages in $GOROOT/pkg/$GOOS_$GOARCH_suffix - instead of $GOROOT/pkg/$GOOS_$GOARCH. - -k symbol - Set field tracking symbol. Use this flag when GOEXPERIMENT=fieldtrack is set. - -libgcc file - Set name of compiler support library. - This is only used in internal link mode. - If not set, default value comes from running the compiler, - which may be set by the -extld option. - Set to "none" to use no support library. - -linkmode mode - Set link mode (internal, external, auto). - This sets the linking mode as described in cmd/cgo/doc.go. - -linkshared - Link against installed Go shared libraries (experimental). - -memprofile file - Write memory profile to file. - -memprofilerate rate - Set runtime.MemProfileRate to rate. - -msan - Link with C/C++ memory sanitizer support. - -n - Dump symbol table. - -o file - Write output to file (default a.out, or a.out.exe on Windows). - -pluginpath path - The path name used to prefix exported plugin symbols. - -r dir1:dir2:... - Set the ELF dynamic linker search path. - -race - Link with race detection libraries. - -s - Omit the symbol table and debug information. - -shared - Generated shared object (implies -linkmode external; experimental). - -tmpdir dir - Write temporary files to dir. - Temporary files are only used in external linking mode. - -u - Reject unsafe packages. - -v - Print trace of linker operations. - -w - Omit the DWARF symbol table. -*/ -package main diff --git a/src/cmd/oldlink/internal/amd64/asm.go b/src/cmd/oldlink/internal/amd64/asm.go deleted file mode 100644 index c120e4ea81..0000000000 --- a/src/cmd/oldlink/internal/amd64/asm.go +++ /dev/null @@ -1,874 +0,0 @@ -// Inferno utils/6l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package amd64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "debug/elf" - "log" -) - -func PADDR(x uint32) uint32 { - return x &^ 0x80000000 -} - -func Addcall(ctxt *ld.Link, s *sym.Symbol, t *sym.Symbol) int64 { - s.Attr |= sym.AttrReachable - i := s.Size - s.Size += 4 - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Type = objabi.R_CALL - r.Siz = 4 - return i + int64(r.Siz) -} - -func gentext(ctxt *ld.Link) { - if !ctxt.DynlinkingGo() { - return - } - addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0) - if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin { - // we're linking a module containing the runtime -> no need for - // an init function - return - } - addmoduledata.Attr |= sym.AttrReachable - initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0) - initfunc.Type = sym.STEXT - initfunc.Attr |= sym.AttrLocal - initfunc.Attr |= sym.AttrReachable - o := func(op ...uint8) { - for _, op1 := range op { - initfunc.AddUint8(op1) - } - } - // 0000000000000000 : - // 0: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 7 - // 3: R_X86_64_PC32 runtime.firstmoduledata-0x4 - o(0x48, 0x8d, 0x3d) - initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata, 0) - // 7: e8 00 00 00 00 callq c - // 8: R_X86_64_PLT32 runtime.addmoduledata-0x4 - o(0xe8) - Addcall(ctxt, initfunc, addmoduledata) - // c: c3 retq - o(0xc3) - if ctxt.BuildMode == ld.BuildModePlugin { - ctxt.Textp = append(ctxt.Textp, addmoduledata) - } - ctxt.Textp = append(ctxt.Textp, initfunc) - initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0) - initarray_entry.Attr |= sym.AttrReachable - initarray_entry.Attr |= sym.AttrLocal - initarray_entry.Type = sym.SINITARR - initarray_entry.AddAddr(ctxt.Arch, initfunc) -} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - targ := r.Sym - - switch r.Type { - default: - if r.Type >= objabi.ElfRelocOffset { - ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) - return false - } - - // Handle relocations found in ELF object files. - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_PC32): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_X86_64_PC32 relocation for dynamic symbol %s", targ.Name) - } - // TODO(mwhudson): the test of VisibilityHidden here probably doesn't make - // sense and should be removed when someone has thought about it properly. - if (targ.Type == 0 || targ.Type == sym.SXREF) && !targ.Attr.VisibilityHidden() { - ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name) - } - r.Type = objabi.R_PCREL - r.Add += 4 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_PC64): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_X86_64_PC64 relocation for dynamic symbol %s", targ.Name) - } - if targ.Type == 0 || targ.Type == sym.SXREF { - ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name) - } - r.Type = objabi.R_PCREL - r.Add += 8 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_PLT32): - r.Type = objabi.R_PCREL - r.Add += 4 - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add += int64(targ.Plt()) - } - - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_GOTPCREL), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_GOTPCRELX), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_REX_GOTPCRELX): - if targ.Type != sym.SDYNIMPORT { - // have symbol - if r.Off >= 2 && s.P[r.Off-2] == 0x8b { - // turn MOVQ of GOT entry into LEAQ of symbol itself - s.P[r.Off-2] = 0x8d - - r.Type = objabi.R_PCREL - r.Add += 4 - return true - } - } - - // fall back to using GOT and hope for the best (CMOV*) - // TODO: just needs relocation, no need to put in .dynsym - addgotsym(ctxt, targ) - - r.Type = objabi.R_PCREL - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += 4 - r.Add += int64(targ.Got()) - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_64): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_X86_64_64 relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ADDR - if ctxt.BuildMode == ld.BuildModePIE && ctxt.LinkMode == ld.LinkInternal { - // For internal linking PIE, this R_ADDR relocation cannot - // be resolved statically. We need to generate a dynamic - // relocation. Let the code below handle it. - break - } - return true - - // Handle relocations found in Mach-O object files. - case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_UNSIGNED*2 + 0, - objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED*2 + 0, - objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_BRANCH*2 + 0: - // TODO: What is the difference between all these? - r.Type = objabi.R_ADDR - - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected reloc for dynamic symbol %s", targ.Name) - } - return true - - case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1: - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add = int64(targ.Plt()) - r.Type = objabi.R_PCREL - return true - } - fallthrough - - case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_UNSIGNED*2 + 1, - objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED*2 + 1, - objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED_1*2 + 1, - objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED_2*2 + 1, - objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED_4*2 + 1: - r.Type = objabi.R_PCREL - - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected pc-relative reloc for dynamic symbol %s", targ.Name) - } - return true - - case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_GOT_LOAD*2 + 1: - if targ.Type != sym.SDYNIMPORT { - // have symbol - // turn MOVQ of GOT entry into LEAQ of symbol itself - if r.Off < 2 || s.P[r.Off-2] != 0x8b { - ld.Errorf(s, "unexpected GOT_LOAD reloc for non-dynamic symbol %s", targ.Name) - return false - } - - s.P[r.Off-2] = 0x8d - r.Type = objabi.R_PCREL - return true - } - fallthrough - - case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_GOT*2 + 1: - if targ.Type != sym.SDYNIMPORT { - ld.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", targ.Name) - } - addgotsym(ctxt, targ) - r.Type = objabi.R_PCREL - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(targ.Got()) - return true - } - - switch r.Type { - case objabi.R_CALL, - objabi.R_PCREL: - if targ.Type != sym.SDYNIMPORT { - // nothing to do, the relocation will be laid out in reloc - return true - } - if ctxt.LinkMode == ld.LinkExternal { - // External linker will do this relocation. - return true - } - // Internal linking, for both ELF and Mach-O. - // Build a PLT entry and change the relocation target to that entry. - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add = int64(targ.Plt()) - return true - - case objabi.R_ADDR: - if s.Type == sym.STEXT && ctxt.IsELF { - if ctxt.HeadType == objabi.Hsolaris { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add += int64(targ.Plt()) - return true - } - // The code is asking for the address of an external - // function. We provide it with the address of the - // correspondent GOT symbol. - addgotsym(ctxt, targ) - - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(targ.Got()) - return true - } - - // Process dynamic relocations for the data sections. - if ctxt.BuildMode == ld.BuildModePIE && ctxt.LinkMode == ld.LinkInternal { - // When internally linking, generate dynamic relocations - // for all typical R_ADDR relocations. The exception - // are those R_ADDR that are created as part of generating - // the dynamic relocations and must be resolved statically. - // - // There are three phases relevant to understanding this: - // - // dodata() // we are here - // address() // symbol address assignment - // reloc() // resolution of static R_ADDR relocs - // - // At this point symbol addresses have not been - // assigned yet (as the final size of the .rela section - // will affect the addresses), and so we cannot write - // the Elf64_Rela.r_offset now. Instead we delay it - // until after the 'address' phase of the linker is - // complete. We do this via Addaddrplus, which creates - // a new R_ADDR relocation which will be resolved in - // the 'reloc' phase. - // - // These synthetic static R_ADDR relocs must be skipped - // now, or else we will be caught in an infinite loop - // of generating synthetic relocs for our synthetic - // relocs. - // - // Furthermore, the rela sections contain dynamic - // relocations with R_ADDR relocations on - // Elf64_Rela.r_offset. This field should contain the - // symbol offset as determined by reloc(), not the - // final dynamically linked address as a dynamic - // relocation would provide. - switch s.Name { - case ".dynsym", ".rela", ".rela.plt", ".got.plt", ".dynamic": - return false - } - } else { - // Either internally linking a static executable, - // in which case we can resolve these relocations - // statically in the 'reloc' phase, or externally - // linking, in which case the relocation will be - // prepared in the 'reloc' phase and passed to the - // external linker in the 'asmb' phase. - if s.Type != sym.SDATA && s.Type != sym.SRODATA { - break - } - } - - if ctxt.IsELF { - // Generate R_X86_64_RELATIVE relocations for best - // efficiency in the dynamic linker. - // - // As noted above, symbol addresses have not been - // assigned yet, so we can't generate the final reloc - // entry yet. We ultimately want: - // - // r_offset = s + r.Off - // r_info = R_X86_64_RELATIVE - // r_addend = targ + r.Add - // - // The dynamic linker will set *offset = base address + - // addend. - // - // AddAddrPlus is used for r_offset and r_addend to - // generate new R_ADDR relocations that will update - // these fields in the 'reloc' phase. - rela := ctxt.Syms.Lookup(".rela", 0) - rela.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) - if r.Siz == 8 { - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(0, uint32(elf.R_X86_64_RELATIVE))) - } else { - ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name) - } - rela.AddAddrPlus(ctxt.Arch, targ, int64(r.Add)) - // Not mark r done here. So we still apply it statically, - // so in the file content we'll also have the right offset - // to the relocation target. So it can be examined statically - // (e.g. go version). - return true - } - - if ctxt.HeadType == objabi.Hdarwin && s.Size == int64(ctxt.Arch.PtrSize) && r.Off == 0 { - // Mach-O relocations are a royal pain to lay out. - // They use a compact stateful bytecode representation - // that is too much bother to deal with. - // Instead, interpret the C declaration - // void *_Cvar_stderr = &stderr; - // as making _Cvar_stderr the name of a GOT entry - // for stderr. This is separate from the usual GOT entry, - // just in case the C code assigns to the variable, - // and of course it only works for single pointers, - // but we only need to support cgo and that's all it needs. - ld.Adddynsym(ctxt, targ) - - got := ctxt.Syms.Lookup(".got", 0) - s.Type = got.Type - s.Attr |= sym.AttrSubSymbol - s.Outer = got - s.Sub = got.Sub - got.Sub = s - s.Value = got.Size - got.AddUint64(ctxt.Arch, 0) - ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(targ.Dynid)) - r.Type = objabi.ElfRelocOffset // ignore during relocsym - return true - } - } - - return false -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - ctxt.Out.Write64(uint64(sectoff)) - - elfsym := r.Xsym.ElfsymForReloc() - switch r.Type { - default: - return false - case objabi.R_ADDR: - if r.Siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_32) | uint64(elfsym)<<32) - } else if r.Siz == 8 { - ctxt.Out.Write64(uint64(elf.R_X86_64_64) | uint64(elfsym)<<32) - } else { - return false - } - case objabi.R_TLS_LE: - if r.Siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_TPOFF32) | uint64(elfsym)<<32) - } else { - return false - } - case objabi.R_TLS_IE: - if r.Siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTTPOFF) | uint64(elfsym)<<32) - } else { - return false - } - case objabi.R_CALL: - if r.Siz == 4 { - if r.Xsym.Type == sym.SDYNIMPORT { - if ctxt.DynlinkingGo() { - ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) - } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) - } - } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) - } - } else { - return false - } - case objabi.R_PCREL: - if r.Siz == 4 { - if r.Xsym.Type == sym.SDYNIMPORT && r.Xsym.ElfType() == elf.STT_FUNC { - ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) - } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) - } - } else { - return false - } - case objabi.R_GOTPCREL: - if r.Siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) - } else { - return false - } - } - - ctxt.Out.Write64(uint64(r.Xadd)) - return true -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - var v uint32 - - rs := r.Xsym - - if rs.Type == sym.SHOSTOBJ || r.Type == objabi.R_PCREL || r.Type == objabi.R_GOTPCREL || r.Type == objabi.R_CALL { - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) - return false - } - - v = uint32(rs.Dynid) - v |= 1 << 27 // external relocation - } else { - v = uint32(rs.Sect.Extnum) - if v == 0 { - ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Sect.Name, rs.Type, rs.Type) - return false - } - } - - switch r.Type { - default: - return false - - case objabi.R_ADDR: - v |= ld.MACHO_X86_64_RELOC_UNSIGNED << 28 - - case objabi.R_CALL: - v |= 1 << 24 // pc-relative bit - v |= ld.MACHO_X86_64_RELOC_BRANCH << 28 - - // NOTE: Only works with 'external' relocation. Forced above. - case objabi.R_PCREL: - v |= 1 << 24 // pc-relative bit - v |= ld.MACHO_X86_64_RELOC_SIGNED << 28 - case objabi.R_GOTPCREL: - v |= 1 << 24 // pc-relative bit - v |= ld.MACHO_X86_64_RELOC_GOT_LOAD << 28 - } - - switch r.Siz { - default: - return false - - case 1: - v |= 0 << 25 - - case 2: - v |= 1 << 25 - - case 4: - v |= 2 << 25 - - case 8: - v |= 3 << 25 - } - - out.Write32(uint32(sectoff)) - out.Write32(v) - return true -} - -func pereloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - var v uint32 - - rs := r.Xsym - - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) - return false - } - - out.Write32(uint32(sectoff)) - out.Write32(uint32(rs.Dynid)) - - switch r.Type { - default: - return false - - case objabi.R_DWARFSECREF: - v = ld.IMAGE_REL_AMD64_SECREL - - case objabi.R_ADDR: - if r.Siz == 8 { - v = ld.IMAGE_REL_AMD64_ADDR64 - } else { - v = ld.IMAGE_REL_AMD64_ADDR32 - } - - case objabi.R_CALL, - objabi.R_PCREL: - v = ld.IMAGE_REL_AMD64_REL32 - } - - out.Write16(uint16(v)) - - return true -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - log.Fatalf("unexpected relocation variant") - return t -} - -func elfsetupplt(ctxt *ld.Link) { - plt := ctxt.Syms.Lookup(".plt", 0) - got := ctxt.Syms.Lookup(".got.plt", 0) - if plt.Size == 0 { - // pushq got+8(IP) - plt.AddUint8(0xff) - - plt.AddUint8(0x35) - plt.AddPCRelPlus(ctxt.Arch, got, 8) - - // jmpq got+16(IP) - plt.AddUint8(0xff) - - plt.AddUint8(0x25) - plt.AddPCRelPlus(ctxt.Arch, got, 16) - - // nopl 0(AX) - plt.AddUint32(ctxt.Arch, 0x00401f0f) - - // assume got->size == 0 too - got.AddAddrPlus(ctxt.Arch, ctxt.Syms.Lookup(".dynamic", 0), 0) - - got.AddUint64(ctxt.Arch, 0) - got.AddUint64(ctxt.Arch, 0) - } -} - -func addpltsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Plt() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - - if ctxt.IsELF { - plt := ctxt.Syms.Lookup(".plt", 0) - got := ctxt.Syms.Lookup(".got.plt", 0) - rela := ctxt.Syms.Lookup(".rela.plt", 0) - if plt.Size == 0 { - elfsetupplt(ctxt) - } - - // jmpq *got+size(IP) - plt.AddUint8(0xff) - - plt.AddUint8(0x25) - plt.AddPCRelPlus(ctxt.Arch, got, got.Size) - - // add to got: pointer to current pos in plt - got.AddAddrPlus(ctxt.Arch, plt, plt.Size) - - // pushq $x - plt.AddUint8(0x68) - - plt.AddUint32(ctxt.Arch, uint32((got.Size-24-8)/8)) - - // jmpq .plt - plt.AddUint8(0xe9) - - plt.AddUint32(ctxt.Arch, uint32(-(plt.Size + 4))) - - // rela - rela.AddAddrPlus(ctxt.Arch, got, got.Size-8) - - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_X86_64_JMP_SLOT))) - rela.AddUint64(ctxt.Arch, 0) - - s.SetPlt(int32(plt.Size - 16)) - } else if ctxt.HeadType == objabi.Hdarwin { - // To do lazy symbol lookup right, we're supposed - // to tell the dynamic loader which library each - // symbol comes from and format the link info - // section just so. I'm too lazy (ha!) to do that - // so for now we'll just use non-lazy pointers, - // which don't need to be told which library to use. - // - // https://networkpx.blogspot.com/2009/09/about-lcdyldinfoonly-command.html - // has details about what we're avoiding. - - addgotsym(ctxt, s) - plt := ctxt.Syms.Lookup(".plt", 0) - - ctxt.Syms.Lookup(".linkedit.plt", 0).AddUint32(ctxt.Arch, uint32(s.Dynid)) - - // jmpq *got+size(IP) - s.SetPlt(int32(plt.Size)) - - plt.AddUint8(0xff) - plt.AddUint8(0x25) - plt.AddPCRelPlus(ctxt.Arch, ctxt.Syms.Lookup(".got", 0), int64(s.Got())) - } else { - ld.Errorf(s, "addpltsym: unsupported binary format") - } -} - -func addgotsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Got() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - got := ctxt.Syms.Lookup(".got", 0) - s.SetGot(int32(got.Size)) - got.AddUint64(ctxt.Arch, 0) - - if ctxt.IsELF { - rela := ctxt.Syms.Lookup(".rela", 0) - rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got())) - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_X86_64_GLOB_DAT))) - rela.AddUint64(ctxt.Arch, 0) - } else if ctxt.HeadType == objabi.Hdarwin { - ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(s.Dynid)) - } else { - ld.Errorf(s, "addgotsym: unsupported binary format") - } -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - sect := ld.Segtext.Sections[0] - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - // 0xCC is INT $3 - breakpoint instruction - ld.CodeblkPad(ctxt, int64(sect.Vaddr), int64(sect.Length), []byte{0xCC}) - for _, sect = range ld.Segtext.Sections[1:] { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - if ld.Segrelrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - machlink := int64(0) - if ctxt.HeadType == objabi.Hdarwin { - machlink = ld.Domacholink(ctxt) - } - - switch ctxt.HeadType { - default: - ld.Errorf(nil, "unknown header type %v", ctxt.HeadType) - fallthrough - - case objabi.Hplan9: - break - - case objabi.Hdarwin: - ld.Flag8 = true /* 64-bit addresses */ - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd, - objabi.Hdragonfly, - objabi.Hsolaris: - ld.Flag8 = true /* 64-bit addresses */ - - case objabi.Hwindows: - break - } - - ld.Symsize = 0 - ld.Spsize = 0 - ld.Lcsize = 0 - symo := int64(0) - if !*ld.FlagS { - switch ctxt.HeadType { - default: - case objabi.Hplan9: - *ld.FlagS = true - symo = int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) - - case objabi.Hdarwin: - symo = int64(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink)) - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd, - objabi.Hdragonfly, - objabi.Hsolaris: - symo = int64(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = ld.Rnd(symo, int64(*ld.FlagRound)) - - case objabi.Hwindows: - symo = int64(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = ld.Rnd(symo, ld.PEFILEALIGN) - } - - ctxt.Out.SeekSet(symo) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ctxt.Out.SeekSet(symo) - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) - ctxt.Out.Flush() - - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - ctxt.Out.Flush() - } - - case objabi.Hwindows: - // Do nothing - - case objabi.Hdarwin: - if ctxt.LinkMode == ld.LinkExternal { - ld.Machoemitreloc(ctxt) - } - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan9 */ - magic := int32(4*26*26 + 7) - - magic |= 0x00008000 /* fat header */ - ctxt.Out.Write32b(uint32(magic)) /* magic */ - ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - vl := ld.Entryvalue(ctxt) - ctxt.Out.Write32b(PADDR(uint32(vl))) /* va of entry */ - ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ - ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ - ctxt.Out.Write64b(uint64(vl)) /* va of entry */ - - case objabi.Hdarwin: - ld.Asmbmacho(ctxt) - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd, - objabi.Hdragonfly, - objabi.Hsolaris: - ld.Asmbelf(ctxt, symo) - - case objabi.Hwindows: - ld.Asmbpe(ctxt) - } - - ctxt.Out.Flush() -} - -func tlsIEtoLE(s *sym.Symbol, off, size int) { - // Transform the PC-relative instruction into a constant load. - // That is, - // - // MOVQ X(IP), REG -> MOVQ $Y, REG - // - // To determine the instruction and register, we study the op codes. - // Consult an AMD64 instruction encoding guide to decipher this. - if off < 3 { - log.Fatal("R_X86_64_GOTTPOFF reloc not preceded by MOVQ or ADDQ instruction") - } - op := s.P[off-3 : off] - reg := op[2] >> 3 - - if op[1] == 0x8b || reg == 4 { - // MOVQ - if op[0] == 0x4c { - op[0] = 0x49 - } else if size == 4 && op[0] == 0x44 { - op[0] = 0x41 - } - if op[1] == 0x8b { - op[1] = 0xc7 - } else { - op[1] = 0x81 // special case for SP - } - op[2] = 0xc0 | reg - } else { - // An alternate op is ADDQ. This is handled by GNU gold, - // but right now is not generated by the Go compiler: - // ADDQ X(IP), REG -> ADDQ $Y, REG - // Consider adding support for it here. - log.Fatalf("expected TLS IE op to be MOVQ, got %v", op) - } -} diff --git a/src/cmd/oldlink/internal/amd64/l.go b/src/cmd/oldlink/internal/amd64/l.go deleted file mode 100644 index 393da6bf28..0000000000 --- a/src/cmd/oldlink/internal/amd64/l.go +++ /dev/null @@ -1,43 +0,0 @@ -// Inferno utils/6l/l.h -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package amd64 - -const ( - maxAlign = 32 // max data alignment - minAlign = 1 // min data alignment - funcAlign = 16 -) - -/* Used by ../internal/ld/dwarf.go */ -const ( - dwarfRegSP = 7 - dwarfRegLR = 16 -) diff --git a/src/cmd/oldlink/internal/amd64/obj.go b/src/cmd/oldlink/internal/amd64/obj.go deleted file mode 100644 index 655d9f1e03..0000000000 --- a/src/cmd/oldlink/internal/amd64/obj.go +++ /dev/null @@ -1,117 +0,0 @@ -// Inferno utils/6l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package amd64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.ArchAMD64 - - theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, - - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Machoreloc1: machoreloc1, - PEreloc1: pereloc1, - TLSIEtoLE: tlsIEtoLE, - - Linuxdynld: "/lib64/ld-linux-x86-64.so.2", - 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", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - - case objabi.Hplan9: /* plan 9 */ - ld.HEADR = 32 + 8 - - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x200000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 0x200000 - } - - case objabi.Hdarwin: /* apple MACH */ - ld.HEADR = ld.INITIAL_MACHO_HEADR - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x1000000 + int64(ld.HEADR) - } - - case objabi.Hlinux, /* elf64 executable */ - objabi.Hfreebsd, /* freebsd */ - objabi.Hnetbsd, /* netbsd */ - objabi.Hopenbsd, /* openbsd */ - objabi.Hdragonfly, /* dragonfly */ - objabi.Hsolaris: /* solaris */ - ld.Elfinit(ctxt) - - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = (1 << 22) + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - - case objabi.Hwindows: /* PE executable */ - // ld.HEADR, ld.FlagTextAddr, ld.FlagRound are set in ld.Peinit - return - } -} diff --git a/src/cmd/oldlink/internal/arm/asm.go b/src/cmd/oldlink/internal/arm/asm.go deleted file mode 100644 index de6173569a..0000000000 --- a/src/cmd/oldlink/internal/arm/asm.go +++ /dev/null @@ -1,786 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package arm - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "debug/elf" - "fmt" - "log" -) - -// This assembler: -// -// .align 2 -// local.dso_init: -// ldr r0, .Lmoduledata -// .Lloadfrom: -// ldr r0, [r0] -// b runtime.addmoduledata@plt -// .align 2 -// .Lmoduledata: -// .word local.moduledata(GOT_PREL) + (. - (.Lloadfrom + 4)) -// assembles to: -// -// 00000000 : -// 0: e59f0004 ldr r0, [pc, #4] ; c -// 4: e5900000 ldr r0, [r0] -// 8: eafffffe b 0 -// 8: R_ARM_JUMP24 runtime.addmoduledata -// c: 00000004 .word 0x00000004 -// c: R_ARM_GOT_PREL local.moduledata - -func gentext(ctxt *ld.Link) { - if !ctxt.DynlinkingGo() { - return - } - addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0) - if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin { - // we're linking a module containing the runtime -> no need for - // an init function - return - } - addmoduledata.Attr |= sym.AttrReachable - initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0) - initfunc.Type = sym.STEXT - initfunc.Attr |= sym.AttrLocal - initfunc.Attr |= sym.AttrReachable - o := func(op uint32) { - initfunc.AddUint32(ctxt.Arch, op) - } - o(0xe59f0004) - o(0xe08f0000) - - o(0xeafffffe) - rel := initfunc.AddRel() - rel.Off = 8 - rel.Siz = 4 - rel.Sym = ctxt.Syms.Lookup("runtime.addmoduledata", 0) - rel.Type = objabi.R_CALLARM - rel.Add = 0xeafffffe // vomit - - o(0x00000000) - rel = initfunc.AddRel() - rel.Off = 12 - rel.Siz = 4 - rel.Sym = ctxt.Moduledata - rel.Type = objabi.R_PCREL - rel.Add = 4 - - if ctxt.BuildMode == ld.BuildModePlugin { - ctxt.Textp = append(ctxt.Textp, addmoduledata) - } - ctxt.Textp = append(ctxt.Textp, initfunc) - initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0) - initarray_entry.Attr |= sym.AttrReachable - initarray_entry.Attr |= sym.AttrLocal - initarray_entry.Type = sym.SINITARR - initarray_entry.AddAddr(ctxt.Arch, initfunc) -} - -// Preserve highest 8 bits of a, and do addition to lower 24-bit -// of a and b; used to adjust ARM branch instruction's target -func braddoff(a int32, b int32) int32 { - return int32((uint32(a))&0xff000000 | 0x00ffffff&uint32(a+b)) -} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - targ := r.Sym - - switch r.Type { - default: - if r.Type >= objabi.ElfRelocOffset { - ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) - return false - } - - // Handle relocations found in ELF object files. - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_PLT32): - r.Type = objabi.R_CALLARM - - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add = int64(braddoff(int32(r.Add), targ.Plt()/4)) - } - - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_THM_PC22): // R_ARM_THM_CALL - ld.Exitf("R_ARM_THM_CALL, are you using -marm?") - return false - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT32): // R_ARM_GOT_BREL - if targ.Type != sym.SDYNIMPORT { - addgotsyminternal(ctxt, targ) - } else { - addgotsym(ctxt, targ) - } - - r.Type = objabi.R_CONST // write r->add during relocsym - r.Sym = nil - r.Add += int64(targ.Got()) - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT_PREL): // GOT(nil) + A - nil - if targ.Type != sym.SDYNIMPORT { - addgotsyminternal(ctxt, targ) - } else { - addgotsym(ctxt, targ) - } - - r.Type = objabi.R_PCREL - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(targ.Got()) + 4 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOTOFF): // R_ARM_GOTOFF32 - r.Type = objabi.R_GOTOFF - - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOTPC): // R_ARM_BASE_PREL - r.Type = objabi.R_PCREL - - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += 4 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_CALL): - r.Type = objabi.R_CALLARM - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add = int64(braddoff(int32(r.Add), targ.Plt()/4)) - } - - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_REL32): // R_ARM_REL32 - r.Type = objabi.R_PCREL - - r.Add += 4 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_ABS32): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ADDR - return true - - // we can just ignore this, because we are targeting ARM V5+ anyway - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_V4BX): - if r.Sym != nil { - // R_ARM_V4BX is ABS relocation, so this symbol is a dummy symbol, ignore it - r.Sym.Type = 0 - } - - r.Sym = nil - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_PC24), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_JUMP24): - r.Type = objabi.R_CALLARM - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add = int64(braddoff(int32(r.Add), targ.Plt()/4)) - } - - return true - } - - // Handle references to ELF symbols from our own object files. - if targ.Type != sym.SDYNIMPORT { - return true - } - - switch r.Type { - case objabi.R_CALLARM: - if ctxt.LinkMode == ld.LinkExternal { - // External linker will do this relocation. - return true - } - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add = int64(targ.Plt()) - return true - - case objabi.R_ADDR: - if s.Type != sym.SDATA { - break - } - if ctxt.IsELF { - ld.Adddynsym(ctxt, targ) - rel := ctxt.Syms.Lookup(".rel", 0) - rel.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) - rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(targ.Dynid), uint32(elf.R_ARM_GLOB_DAT))) // we need a nil + A dynamic reloc - r.Type = objabi.R_CONST // write r->add during relocsym - r.Sym = nil - return true - } - } - - return false -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - ctxt.Out.Write32(uint32(sectoff)) - - elfsym := r.Xsym.ElfsymForReloc() - switch r.Type { - default: - return false - case objabi.R_ADDR: - if r.Siz == 4 { - ctxt.Out.Write32(uint32(elf.R_ARM_ABS32) | uint32(elfsym)<<8) - } else { - return false - } - case objabi.R_PCREL: - if r.Siz == 4 { - ctxt.Out.Write32(uint32(elf.R_ARM_REL32) | uint32(elfsym)<<8) - } else { - return false - } - case objabi.R_CALLARM: - if r.Siz == 4 { - if r.Add&0xff000000 == 0xeb000000 { // BL - ctxt.Out.Write32(uint32(elf.R_ARM_CALL) | uint32(elfsym)<<8) - } else { - ctxt.Out.Write32(uint32(elf.R_ARM_JUMP24) | uint32(elfsym)<<8) - } - } else { - return false - } - case objabi.R_TLS_LE: - ctxt.Out.Write32(uint32(elf.R_ARM_TLS_LE32) | uint32(elfsym)<<8) - case objabi.R_TLS_IE: - ctxt.Out.Write32(uint32(elf.R_ARM_TLS_IE32) | uint32(elfsym)<<8) - case objabi.R_GOTPCREL: - if r.Siz == 4 { - ctxt.Out.Write32(uint32(elf.R_ARM_GOT_PREL) | uint32(elfsym)<<8) - } else { - return false - } - } - - return true -} - -func elfsetupplt(ctxt *ld.Link) { - plt := ctxt.Syms.Lookup(".plt", 0) - got := ctxt.Syms.Lookup(".got.plt", 0) - if plt.Size == 0 { - // str lr, [sp, #-4]! - plt.AddUint32(ctxt.Arch, 0xe52de004) - - // ldr lr, [pc, #4] - plt.AddUint32(ctxt.Arch, 0xe59fe004) - - // add lr, pc, lr - plt.AddUint32(ctxt.Arch, 0xe08fe00e) - - // ldr pc, [lr, #8]! - plt.AddUint32(ctxt.Arch, 0xe5bef008) - - // .word &GLOBAL_OFFSET_TABLE[0] - . - plt.AddPCRelPlus(ctxt.Arch, got, 4) - - // the first .plt entry requires 3 .plt.got entries - got.AddUint32(ctxt.Arch, 0) - - got.AddUint32(ctxt.Arch, 0) - got.AddUint32(ctxt.Arch, 0) - } -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - return false -} - -func pereloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - rs := r.Xsym - - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) - return false - } - - out.Write32(uint32(sectoff)) - out.Write32(uint32(rs.Dynid)) - - var v uint32 - switch r.Type { - default: - // unsupported relocation type - return false - - case objabi.R_DWARFSECREF: - v = ld.IMAGE_REL_ARM_SECREL - - case objabi.R_ADDR: - v = ld.IMAGE_REL_ARM_ADDR32 - } - - out.Write16(uint16(v)) - - return true -} - -// sign extend a 24-bit integer -func signext24(x int64) int32 { - return (int32(x) << 8) >> 8 -} - -// encode an immediate in ARM's imm12 format. copied from ../../../internal/obj/arm/asm5.go -func immrot(v uint32) uint32 { - for i := 0; i < 16; i++ { - if v&^0xff == 0 { - return uint32(i<<8) | v | 1<<25 - } - v = v<<2 | v>>30 - } - return 0 -} - -// Convert the direct jump relocation r to refer to a trampoline if the target is too far -func trampoline(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol) { - switch r.Type { - case objabi.R_CALLARM: - // r.Add is the instruction - // low 24-bit encodes the target address - t := (ld.Symaddr(r.Sym) + int64(signext24(r.Add&0xffffff)*4) - (s.Value + int64(r.Off))) / 4 - if t > 0x7fffff || t < -0x800000 || (*ld.FlagDebugTramp > 1 && s.File != r.Sym.File) { - // 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. - offset := (signext24(r.Add&0xffffff) + 2) * 4 - var tramp *sym.Symbol - for i := 0; ; i++ { - name := r.Sym.Name + fmt.Sprintf("%+d-tramp%d", offset, i) - tramp = ctxt.Syms.Lookup(name, int(r.Sym.Version)) - if tramp.Type == sym.SDYNIMPORT { - // don't reuse trampoline defined in other module - continue - } - if tramp.Value == 0 { - // either the trampoline does not exist -- we need to create one, - // or found one the address which is not assigned -- this will be - // laid down immediately after the current function. use this one. - break - } - - t = (ld.Symaddr(tramp) - 8 - (s.Value + int64(r.Off))) / 4 - if t >= -0x800000 && t < 0x7fffff { - // found an existing trampoline that is not too far - // we can just use it - break - } - } - if tramp.Type == 0 { - // trampoline does not exist, create one - ctxt.AddTramp(tramp) - if ctxt.DynlinkingGo() { - if immrot(uint32(offset)) == 0 { - ld.Errorf(s, "odd offset in dynlink direct call: %v+%d", r.Sym, offset) - } - gentrampdyn(ctxt.Arch, tramp, r.Sym, int64(offset)) - } else if ctxt.BuildMode == ld.BuildModeCArchive || ctxt.BuildMode == ld.BuildModeCShared || ctxt.BuildMode == ld.BuildModePIE { - gentramppic(ctxt.Arch, tramp, r.Sym, int64(offset)) - } else { - gentramp(ctxt.Arch, ctxt.LinkMode, tramp, r.Sym, int64(offset)) - } - } - // modify reloc to point to tramp, which will be resolved later - r.Sym = tramp - r.Add = r.Add&0xff000000 | 0xfffffe // clear the offset embedded in the instruction - r.Done = false - } - default: - ld.Errorf(s, "trampoline called with non-jump reloc: %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) - } -} - -// generate a trampoline to target+offset -func gentramp(arch *sys.Arch, linkmode ld.LinkMode, tramp, target *sym.Symbol, offset int64) { - tramp.Size = 12 // 3 instructions - tramp.P = make([]byte, tramp.Size) - t := ld.Symaddr(target) + offset - o1 := uint32(0xe5900000 | 11<<12 | 15<<16) // MOVW (R15), R11 // R15 is actual pc + 8 - o2 := uint32(0xe12fff10 | 11) // JMP (R11) - o3 := uint32(t) // WORD $target - arch.ByteOrder.PutUint32(tramp.P, o1) - arch.ByteOrder.PutUint32(tramp.P[4:], o2) - arch.ByteOrder.PutUint32(tramp.P[8:], o3) - - if linkmode == ld.LinkExternal { - r := tramp.AddRel() - r.Off = 8 - r.Type = objabi.R_ADDR - r.Siz = 4 - r.Sym = target - r.Add = offset - } -} - -// generate a trampoline to target+offset in position independent code -func gentramppic(arch *sys.Arch, tramp, target *sym.Symbol, offset int64) { - tramp.Size = 16 // 4 instructions - tramp.P = make([]byte, tramp.Size) - o1 := uint32(0xe5900000 | 11<<12 | 15<<16 | 4) // MOVW 4(R15), R11 // R15 is actual pc + 8 - o2 := uint32(0xe0800000 | 11<<12 | 15<<16 | 11) // ADD R15, R11, R11 - o3 := uint32(0xe12fff10 | 11) // JMP (R11) - o4 := uint32(0) // WORD $(target-pc) // filled in with relocation - arch.ByteOrder.PutUint32(tramp.P, o1) - arch.ByteOrder.PutUint32(tramp.P[4:], o2) - arch.ByteOrder.PutUint32(tramp.P[8:], o3) - arch.ByteOrder.PutUint32(tramp.P[12:], o4) - - r := tramp.AddRel() - r.Off = 12 - r.Type = objabi.R_PCREL - r.Siz = 4 - r.Sym = target - r.Add = offset + 4 -} - -// generate a trampoline to target+offset in dynlink mode (using GOT) -func gentrampdyn(arch *sys.Arch, tramp, target *sym.Symbol, offset int64) { - tramp.Size = 20 // 5 instructions - o1 := uint32(0xe5900000 | 11<<12 | 15<<16 | 8) // MOVW 8(R15), R11 // R15 is actual pc + 8 - o2 := uint32(0xe0800000 | 11<<12 | 15<<16 | 11) // ADD R15, R11, R11 - o3 := uint32(0xe5900000 | 11<<12 | 11<<16) // MOVW (R11), R11 - o4 := uint32(0xe12fff10 | 11) // JMP (R11) - o5 := uint32(0) // WORD $target@GOT // filled in with relocation - o6 := uint32(0) - if offset != 0 { - // insert an instruction to add offset - tramp.Size = 24 // 6 instructions - o6 = o5 - o5 = o4 - o4 = 0xe2800000 | 11<<12 | 11<<16 | immrot(uint32(offset)) // ADD $offset, R11, R11 - o1 = uint32(0xe5900000 | 11<<12 | 15<<16 | 12) // MOVW 12(R15), R11 - } - tramp.P = make([]byte, tramp.Size) - arch.ByteOrder.PutUint32(tramp.P, o1) - arch.ByteOrder.PutUint32(tramp.P[4:], o2) - arch.ByteOrder.PutUint32(tramp.P[8:], o3) - arch.ByteOrder.PutUint32(tramp.P[12:], o4) - arch.ByteOrder.PutUint32(tramp.P[16:], o5) - if offset != 0 { - arch.ByteOrder.PutUint32(tramp.P[20:], o6) - } - - r := tramp.AddRel() - r.Off = 16 - r.Type = objabi.R_GOTPCREL - r.Siz = 4 - r.Sym = target - r.Add = 8 - if offset != 0 { - // increase reloc offset by 4 as we inserted an ADD instruction - r.Off = 20 - r.Add = 12 - } -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - if ctxt.LinkMode == ld.LinkExternal { - switch r.Type { - case objabi.R_CALLARM: - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := r.Sym - - r.Xadd = int64(signext24(r.Add & 0xffffff)) - r.Xadd *= 4 - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) - } - r.Xsym = rs - - if r.Xadd/4 > 0x7fffff || r.Xadd/4 < -0x800000 { - ld.Errorf(s, "direct call too far %d", r.Xadd/4) - } - - return int64(braddoff(int32(0xff000000&uint32(r.Add)), int32(0xffffff&uint32(r.Xadd/4)))), true - } - - return -1, false - } - - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(ctxt.Syms.Lookup(".got", 0)), true - - // The following three arch specific relocations are only for generation of - // Linux/ARM ELF's PLT entry (3 assembler instruction) - case objabi.R_PLT0: // add ip, pc, #0xXX00000 - if ld.Symaddr(ctxt.Syms.Lookup(".got.plt", 0)) < ld.Symaddr(ctxt.Syms.Lookup(".plt", 0)) { - ld.Errorf(s, ".got.plt should be placed after .plt section.") - } - return 0xe28fc600 + (0xff & (int64(uint32(ld.Symaddr(r.Sym)-(ld.Symaddr(ctxt.Syms.Lookup(".plt", 0))+int64(r.Off))+r.Add)) >> 20)), true - case objabi.R_PLT1: // add ip, ip, #0xYY000 - return 0xe28cca00 + (0xff & (int64(uint32(ld.Symaddr(r.Sym)-(ld.Symaddr(ctxt.Syms.Lookup(".plt", 0))+int64(r.Off))+r.Add+4)) >> 12)), true - case objabi.R_PLT2: // ldr pc, [ip, #0xZZZ]! - return 0xe5bcf000 + (0xfff & int64(uint32(ld.Symaddr(r.Sym)-(ld.Symaddr(ctxt.Syms.Lookup(".plt", 0))+int64(r.Off))+r.Add+8))), true - case objabi.R_CALLARM: // bl XXXXXX or b YYYYYY - // r.Add is the instruction - // low 24-bit encodes the target address - t := (ld.Symaddr(r.Sym) + int64(signext24(r.Add&0xffffff)*4) - (s.Value + int64(r.Off))) / 4 - if t > 0x7fffff || t < -0x800000 { - ld.Errorf(s, "direct call too far: %s %x", r.Sym.Name, t) - } - return int64(braddoff(int32(0xff000000&uint32(r.Add)), int32(0xffffff&t))), true - } - - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - log.Fatalf("unexpected relocation variant") - return t -} - -func addpltreloc(ctxt *ld.Link, plt *sym.Symbol, got *sym.Symbol, s *sym.Symbol, typ objabi.RelocType) { - r := plt.AddRel() - r.Sym = got - r.Off = int32(plt.Size) - r.Siz = 4 - r.Type = typ - r.Add = int64(s.Got()) - 8 - - plt.Attr |= sym.AttrReachable - plt.Size += 4 - plt.Grow(plt.Size) -} - -func addpltsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Plt() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - - if ctxt.IsELF { - plt := ctxt.Syms.Lookup(".plt", 0) - got := ctxt.Syms.Lookup(".got.plt", 0) - rel := ctxt.Syms.Lookup(".rel.plt", 0) - if plt.Size == 0 { - elfsetupplt(ctxt) - } - - // .got entry - s.SetGot(int32(got.Size)) - - // In theory, all GOT should point to the first PLT entry, - // Linux/ARM's dynamic linker will do that for us, but FreeBSD/ARM's - // dynamic linker won't, so we'd better do it ourselves. - got.AddAddrPlus(ctxt.Arch, plt, 0) - - // .plt entry, this depends on the .got entry - s.SetPlt(int32(plt.Size)) - - addpltreloc(ctxt, plt, got, s, objabi.R_PLT0) // add lr, pc, #0xXX00000 - addpltreloc(ctxt, plt, got, s, objabi.R_PLT1) // add lr, lr, #0xYY000 - addpltreloc(ctxt, plt, got, s, objabi.R_PLT2) // ldr pc, [lr, #0xZZZ]! - - // rel - rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got())) - - rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_ARM_JUMP_SLOT))) - } else { - ld.Errorf(s, "addpltsym: unsupported binary format") - } -} - -func addgotsyminternal(ctxt *ld.Link, s *sym.Symbol) { - if s.Got() >= 0 { - return - } - - got := ctxt.Syms.Lookup(".got", 0) - s.SetGot(int32(got.Size)) - - got.AddAddrPlus(ctxt.Arch, s, 0) - - if ctxt.IsELF { - } else { - ld.Errorf(s, "addgotsyminternal: unsupported binary format") - } -} - -func addgotsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Got() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - got := ctxt.Syms.Lookup(".got", 0) - s.SetGot(int32(got.Size)) - got.AddUint32(ctxt.Arch, 0) - - if ctxt.IsELF { - rel := ctxt.Syms.Lookup(".rel", 0) - rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got())) - rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_ARM_GLOB_DAT))) - } else { - ld.Errorf(s, "addgotsym: unsupported binary format") - } -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - sect := ld.Segtext.Sections[0] - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - for _, sect = range ld.Segtext.Sections[1:] { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - if ld.Segrelrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - - case objabi.Hwindows: - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), ld.PEFILEALIGN)) - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) - ctxt.Out.Flush() - - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - ctxt.Out.Flush() - } - - case objabi.Hwindows: - // Do nothing - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan 9 */ - ctxt.Out.Write32b(0x647) /* magic */ - ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32b(0) - ctxt.Out.Write32b(uint32(ld.Lcsize)) - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - - case objabi.Hwindows: - ld.Asmbpe(ctxt) - } - - ctxt.Out.Flush() - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/oldlink/internal/arm/l.go b/src/cmd/oldlink/internal/arm/l.go deleted file mode 100644 index a83d26bf06..0000000000 --- a/src/cmd/oldlink/internal/arm/l.go +++ /dev/null @@ -1,75 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package arm - -// Writing object files. - -// Inferno utils/5l/l.h -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/l.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -const ( - maxAlign = 8 // max data alignment - minAlign = 1 // min data alignment - funcAlign = 4 // single-instruction alignment -) - -/* Used by ../internal/ld/dwarf.go */ -const ( - dwarfRegSP = 13 - dwarfRegLR = 14 -) diff --git a/src/cmd/oldlink/internal/arm/obj.go b/src/cmd/oldlink/internal/arm/obj.go deleted file mode 100644 index c423937355..0000000000 --- a/src/cmd/oldlink/internal/arm/obj.go +++ /dev/null @@ -1,107 +0,0 @@ -// Inferno utils/5l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package arm - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.ArchARM - - theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, - - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Trampoline: trampoline, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Machoreloc1: machoreloc1, - PEreloc1: pereloc1, - - Linuxdynld: "/lib/ld-linux.so.3", // 2 for OABI, 3 for EABI - Freebsddynld: "/usr/libexec/ld-elf.so.1", - Openbsddynld: "/usr/libexec/ld.so", - Netbsddynld: "/libexec/ld.elf_so", - Dragonflydynld: "XXX", - Solarisdynld: "XXX", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - - case objabi.Hplan9: /* plan 9 */ - ld.HEADR = 32 - - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 4128 - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - - case objabi.Hlinux, /* arm elf */ - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - *ld.FlagD = false - // with dynamic linking - ld.Elfinit(ctxt) - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 0x10000 - } - - case objabi.Hwindows: /* PE executable */ - // ld.HEADR, ld.FlagTextAddr, ld.FlagRound are set in ld.Peinit - return - } -} diff --git a/src/cmd/oldlink/internal/arm64/asm.go b/src/cmd/oldlink/internal/arm64/asm.go deleted file mode 100644 index a97671222d..0000000000 --- a/src/cmd/oldlink/internal/arm64/asm.go +++ /dev/null @@ -1,946 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package arm64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "debug/elf" - "encoding/binary" - "fmt" - "log" -) - -func gentext(ctxt *ld.Link) { - if !ctxt.DynlinkingGo() { - return - } - addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0) - if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin { - // we're linking a module containing the runtime -> no need for - // an init function - return - } - addmoduledata.Attr |= sym.AttrReachable - initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0) - initfunc.Type = sym.STEXT - initfunc.Attr |= sym.AttrLocal - initfunc.Attr |= sym.AttrReachable - o := func(op uint32) { - initfunc.AddUint32(ctxt.Arch, op) - } - // 0000000000000000 : - // 0: 90000000 adrp x0, 0 - // 0: R_AARCH64_ADR_PREL_PG_HI21 local.moduledata - // 4: 91000000 add x0, x0, #0x0 - // 4: R_AARCH64_ADD_ABS_LO12_NC local.moduledata - o(0x90000000) - o(0x91000000) - rel := initfunc.AddRel() - rel.Off = 0 - rel.Siz = 8 - rel.Sym = ctxt.Moduledata - rel.Type = objabi.R_ADDRARM64 - - // 8: 14000000 b 0 - // 8: R_AARCH64_CALL26 runtime.addmoduledata - o(0x14000000) - rel = initfunc.AddRel() - rel.Off = 8 - rel.Siz = 4 - rel.Sym = ctxt.Syms.Lookup("runtime.addmoduledata", 0) - rel.Type = objabi.R_CALLARM64 // Really should be R_AARCH64_JUMP26 but doesn't seem to make any difference - - if ctxt.BuildMode == ld.BuildModePlugin { - ctxt.Textp = append(ctxt.Textp, addmoduledata) - } - ctxt.Textp = append(ctxt.Textp, initfunc) - initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0) - initarray_entry.Attr |= sym.AttrReachable - initarray_entry.Attr |= sym.AttrLocal - initarray_entry.Type = sym.SINITARR - initarray_entry.AddAddr(ctxt.Arch, initfunc) -} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - targ := r.Sym - - switch r.Type { - default: - if r.Type >= objabi.ElfRelocOffset { - ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) - return false - } - - // Handle relocations found in ELF object files. - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_PREL32): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_AARCH64_PREL32 relocation for dynamic symbol %s", targ.Name) - } - // TODO(mwhudson): the test of VisibilityHidden here probably doesn't make - // sense and should be removed when someone has thought about it properly. - if (targ.Type == 0 || targ.Type == sym.SXREF) && !targ.Attr.VisibilityHidden() { - ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name) - } - r.Type = objabi.R_PCREL - r.Add += 4 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_PREL64): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_AARCH64_PREL64 relocation for dynamic symbol %s", targ.Name) - } - if targ.Type == 0 || targ.Type == sym.SXREF { - ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name) - } - r.Type = objabi.R_PCREL - r.Add += 8 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_CALL26), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_JUMP26): - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add += int64(targ.Plt()) - } - if (targ.Type == 0 || targ.Type == sym.SXREF) && !targ.Attr.VisibilityHidden() { - ld.Errorf(s, "unknown symbol %s in callarm64", targ.Name) - } - r.Type = objabi.R_CALLARM64 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_ADR_GOT_PAGE), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_LD64_GOT_LO12_NC): - if targ.Type != sym.SDYNIMPORT { - // have symbol - // TODO: turn LDR of GOT entry into ADR of symbol itself - } - - // fall back to using GOT - // TODO: just needs relocation, no need to put in .dynsym - addgotsym(ctxt, targ) - - r.Type = objabi.R_ARM64_GOT - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(targ.Got()) - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_ADR_PREL_PG_HI21), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_ADD_ABS_LO12_NC): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name) - } - if targ.Type == 0 || targ.Type == sym.SXREF { - ld.Errorf(s, "unknown symbol %s", targ.Name) - } - r.Type = objabi.R_ARM64_PCREL - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_ABS64): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_AARCH64_ABS64 relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ADDR - if ctxt.BuildMode == ld.BuildModePIE && ctxt.LinkMode == ld.LinkInternal { - // For internal linking PIE, this R_ADDR relocation cannot - // be resolved statically. We need to generate a dynamic - // relocation. Let the code below handle it. - break - } - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_LDST8_ABS_LO12_NC): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ARM64_LDST8 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_LDST32_ABS_LO12_NC): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ARM64_LDST32 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_LDST64_ABS_LO12_NC): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ARM64_LDST64 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_LDST128_ABS_LO12_NC): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ARM64_LDST128 - return true - } - - switch r.Type { - case objabi.R_CALL, - objabi.R_PCREL, - objabi.R_CALLARM64: - if targ.Type != sym.SDYNIMPORT { - // nothing to do, the relocation will be laid out in reloc - return true - } - if ctxt.LinkMode == ld.LinkExternal { - // External linker will do this relocation. - return true - } - - case objabi.R_ADDR: - if s.Type == sym.STEXT && ctxt.IsELF { - // The code is asking for the address of an external - // function. We provide it with the address of the - // correspondent GOT symbol. - addgotsym(ctxt, targ) - - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(targ.Got()) - return true - } - - // Process dynamic relocations for the data sections. - if ctxt.BuildMode == ld.BuildModePIE && ctxt.LinkMode == ld.LinkInternal { - // When internally linking, generate dynamic relocations - // for all typical R_ADDR relocations. The exception - // are those R_ADDR that are created as part of generating - // the dynamic relocations and must be resolved statically. - // - // There are three phases relevant to understanding this: - // - // dodata() // we are here - // address() // symbol address assignment - // reloc() // resolution of static R_ADDR relocs - // - // At this point symbol addresses have not been - // assigned yet (as the final size of the .rela section - // will affect the addresses), and so we cannot write - // the Elf64_Rela.r_offset now. Instead we delay it - // until after the 'address' phase of the linker is - // complete. We do this via Addaddrplus, which creates - // a new R_ADDR relocation which will be resolved in - // the 'reloc' phase. - // - // These synthetic static R_ADDR relocs must be skipped - // now, or else we will be caught in an infinite loop - // of generating synthetic relocs for our synthetic - // relocs. - // - // Furthermore, the rela sections contain dynamic - // relocations with R_ADDR relocations on - // Elf64_Rela.r_offset. This field should contain the - // symbol offset as determined by reloc(), not the - // final dynamically linked address as a dynamic - // relocation would provide. - switch s.Name { - case ".dynsym", ".rela", ".rela.plt", ".got.plt", ".dynamic": - return false - } - } else { - // Either internally linking a static executable, - // in which case we can resolve these relocations - // statically in the 'reloc' phase, or externally - // linking, in which case the relocation will be - // prepared in the 'reloc' phase and passed to the - // external linker in the 'asmb' phase. - if s.Type != sym.SDATA && s.Type != sym.SRODATA { - break - } - } - - if ctxt.IsELF { - // Generate R_AARCH64_RELATIVE relocations for best - // efficiency in the dynamic linker. - // - // As noted above, symbol addresses have not been - // assigned yet, so we can't generate the final reloc - // entry yet. We ultimately want: - // - // r_offset = s + r.Off - // r_info = R_AARCH64_RELATIVE - // r_addend = targ + r.Add - // - // The dynamic linker will set *offset = base address + - // addend. - // - // AddAddrPlus is used for r_offset and r_addend to - // generate new R_ADDR relocations that will update - // these fields in the 'reloc' phase. - rela := ctxt.Syms.Lookup(".rela", 0) - rela.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) - if r.Siz == 8 { - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(0, uint32(elf.R_AARCH64_RELATIVE))) - } else { - ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name) - } - rela.AddAddrPlus(ctxt.Arch, targ, int64(r.Add)) - // Not mark r done here. So we still apply it statically, - // so in the file content we'll also have the right offset - // to the relocation target. So it can be examined statically - // (e.g. go version). - return true - } - } - return false -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - ctxt.Out.Write64(uint64(sectoff)) - - elfsym := r.Xsym.ElfsymForReloc() - switch r.Type { - default: - return false - case objabi.R_ADDR: - switch r.Siz { - case 4: - ctxt.Out.Write64(uint64(elf.R_AARCH64_ABS32) | uint64(elfsym)<<32) - case 8: - ctxt.Out.Write64(uint64(elf.R_AARCH64_ABS64) | uint64(elfsym)<<32) - default: - return false - } - case objabi.R_ADDRARM64: - // two relocations: R_AARCH64_ADR_PREL_PG_HI21 and R_AARCH64_ADD_ABS_LO12_NC - ctxt.Out.Write64(uint64(elf.R_AARCH64_ADR_PREL_PG_HI21) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_AARCH64_ADD_ABS_LO12_NC) | uint64(elfsym)<<32) - case objabi.R_ARM64_TLS_LE: - ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSLE_MOVW_TPREL_G0) | uint64(elfsym)<<32) - case objabi.R_ARM64_TLS_IE: - ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) | uint64(elfsym)<<32) - case objabi.R_ARM64_GOTPCREL: - ctxt.Out.Write64(uint64(elf.R_AARCH64_ADR_GOT_PAGE) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_AARCH64_LD64_GOT_LO12_NC) | uint64(elfsym)<<32) - case objabi.R_CALLARM64: - if r.Siz != 4 { - return false - } - ctxt.Out.Write64(uint64(elf.R_AARCH64_CALL26) | uint64(elfsym)<<32) - - } - ctxt.Out.Write64(uint64(r.Xadd)) - - return true -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - var v uint32 - - rs := r.Xsym - - if rs.Type == sym.SHOSTOBJ || r.Type == objabi.R_CALLARM64 || r.Type == objabi.R_ADDRARM64 { - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) - return false - } - - v = uint32(rs.Dynid) - v |= 1 << 27 // external relocation - } else { - v = uint32(rs.Sect.Extnum) - if v == 0 { - ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Sect.Name, rs.Type, rs.Type) - return false - } - } - - switch r.Type { - default: - return false - case objabi.R_ADDR: - v |= ld.MACHO_ARM64_RELOC_UNSIGNED << 28 - case objabi.R_CALLARM64: - if r.Xadd != 0 { - ld.Errorf(s, "ld64 doesn't allow BR26 reloc with non-zero addend: %s+%d", rs.Name, r.Xadd) - } - - v |= 1 << 24 // pc-relative bit - v |= ld.MACHO_ARM64_RELOC_BRANCH26 << 28 - case objabi.R_ADDRARM64: - r.Siz = 4 - // Two relocation entries: MACHO_ARM64_RELOC_PAGEOFF12 MACHO_ARM64_RELOC_PAGE21 - // if r.Xadd is non-zero, add two MACHO_ARM64_RELOC_ADDEND. - if r.Xadd != 0 { - out.Write32(uint32(sectoff + 4)) - out.Write32((ld.MACHO_ARM64_RELOC_ADDEND << 28) | (2 << 25) | uint32(r.Xadd&0xffffff)) - } - out.Write32(uint32(sectoff + 4)) - out.Write32(v | (ld.MACHO_ARM64_RELOC_PAGEOFF12 << 28) | (2 << 25)) - if r.Xadd != 0 { - out.Write32(uint32(sectoff)) - out.Write32((ld.MACHO_ARM64_RELOC_ADDEND << 28) | (2 << 25) | uint32(r.Xadd&0xffffff)) - } - v |= 1 << 24 // pc-relative bit - v |= ld.MACHO_ARM64_RELOC_PAGE21 << 28 - } - - switch r.Siz { - default: - return false - case 1: - v |= 0 << 25 - case 2: - v |= 1 << 25 - case 4: - v |= 2 << 25 - case 8: - v |= 3 << 25 - } - - out.Write32(uint32(sectoff)) - out.Write32(v) - return true -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - if ctxt.LinkMode == ld.LinkExternal { - switch r.Type { - default: - return val, false - case objabi.R_ARM64_GOTPCREL: - var o1, o2 uint32 - if ctxt.Arch.ByteOrder == binary.BigEndian { - o1 = uint32(val >> 32) - o2 = uint32(val) - } else { - o1 = uint32(val) - o2 = uint32(val >> 32) - } - // Any relocation against a function symbol is redirected to - // be against a local symbol instead (see putelfsym in - // symtab.go) but unfortunately the system linker was buggy - // when confronted with a R_AARCH64_ADR_GOT_PAGE relocation - // against a local symbol until May 2015 - // (https://sourceware.org/bugzilla/show_bug.cgi?id=18270). So - // we convert the adrp; ld64 + R_ARM64_GOTPCREL into adrp; - // add + R_ADDRARM64. - if !(r.Sym.IsFileLocal() || r.Sym.Attr.VisibilityHidden() || r.Sym.Attr.Local()) && r.Sym.Type == sym.STEXT && ctxt.DynlinkingGo() { - if o2&0xffc00000 != 0xf9400000 { - ld.Errorf(s, "R_ARM64_GOTPCREL against unexpected instruction %x", o2) - } - o2 = 0x91000000 | (o2 & 0x000003ff) - r.Type = objabi.R_ADDRARM64 - } - if ctxt.Arch.ByteOrder == binary.BigEndian { - val = int64(o1)<<32 | int64(o2) - } else { - val = int64(o2)<<32 | int64(o1) - } - fallthrough - case objabi.R_ADDRARM64: - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) - } - r.Xsym = rs - - // Note: ld64 currently has a bug that any non-zero addend for BR26 relocation - // will make the linking fail because it thinks the code is not PIC even though - // the BR26 relocation should be fully resolved at link time. - // That is the reason why the next if block is disabled. When the bug in ld64 - // is fixed, we can enable this block and also enable duff's device in cmd/7g. - if false && ctxt.HeadType == objabi.Hdarwin { - var o0, o1 uint32 - - if ctxt.Arch.ByteOrder == binary.BigEndian { - o0 = uint32(val >> 32) - o1 = uint32(val) - } else { - o0 = uint32(val) - o1 = uint32(val >> 32) - } - // Mach-O wants the addend to be encoded in the instruction - // Note that although Mach-O supports ARM64_RELOC_ADDEND, it - // can only encode 24-bit of signed addend, but the instructions - // supports 33-bit of signed addend, so we always encode the - // addend in place. - o0 |= (uint32((r.Xadd>>12)&3) << 29) | (uint32((r.Xadd>>12>>2)&0x7ffff) << 5) - o1 |= uint32(r.Xadd&0xfff) << 10 - r.Xadd = 0 - - // when laid out, the instruction order must always be o1, o2. - if ctxt.Arch.ByteOrder == binary.BigEndian { - val = int64(o0)<<32 | int64(o1) - } else { - val = int64(o1)<<32 | int64(o0) - } - } - - return val, true - case objabi.R_CALLARM64, - objabi.R_ARM64_TLS_LE, - objabi.R_ARM64_TLS_IE: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - return val, true - } - } - - switch r.Type { - case objabi.R_CONST: - return r.Add, true - - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(ctxt.Syms.Lookup(".got", 0)), true - - case objabi.R_ADDRARM64: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - if t >= 1<<32 || t < -1<<32 { - ld.Errorf(s, "program too large, address relocation distance = %d", t) - } - - var o0, o1 uint32 - - if ctxt.Arch.ByteOrder == binary.BigEndian { - o0 = uint32(val >> 32) - o1 = uint32(val) - } else { - o0 = uint32(val) - o1 = uint32(val >> 32) - } - - o0 |= (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) - o1 |= uint32(t&0xfff) << 10 - - // when laid out, the instruction order must always be o1, o2. - if ctxt.Arch.ByteOrder == binary.BigEndian { - return int64(o0)<<32 | int64(o1), true - } - return int64(o1)<<32 | int64(o0), true - - case objabi.R_ARM64_TLS_LE: - r.Done = false - if ctxt.HeadType == objabi.Hdarwin { - ld.Errorf(s, "TLS reloc on unsupported OS %v", ctxt.HeadType) - } - // The TCB is two pointers. This is not documented anywhere, but is - // de facto part of the ABI. - v := r.Sym.Value + int64(2*ctxt.Arch.PtrSize) - if v < 0 || v >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", v) - } - return val | (v << 5), true - - case objabi.R_ARM64_TLS_IE: - if ctxt.BuildMode == ld.BuildModePIE && ctxt.IsELF { - // We are linking the final executable, so we - // can optimize any TLS IE relocation to LE. - r.Done = false - if ctxt.HeadType != objabi.Hlinux { - ld.Errorf(s, "TLS reloc on unsupported OS %v", ctxt.HeadType) - } - - // The TCB is two pointers. This is not documented anywhere, but is - // de facto part of the ABI. - v := ld.Symaddr(r.Sym) + int64(2*ctxt.Arch.PtrSize) + r.Add - if v < 0 || v >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", v) - } - - var o0, o1 uint32 - if ctxt.Arch.ByteOrder == binary.BigEndian { - o0 = uint32(val >> 32) - o1 = uint32(val) - } else { - o0 = uint32(val) - o1 = uint32(val >> 32) - } - - // R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 - // turn ADRP to MOVZ - o0 = 0xd2a00000 | uint32(o0&0x1f) | (uint32((v>>16)&0xffff) << 5) - // R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC - // turn LD64 to MOVK - if v&3 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC", v) - } - o1 = 0xf2800000 | uint32(o1&0x1f) | (uint32(v&0xffff) << 5) - - // when laid out, the instruction order must always be o0, o1. - if ctxt.Arch.ByteOrder == binary.BigEndian { - return int64(o0)<<32 | int64(o1), true - } - return int64(o1)<<32 | int64(o0), true - } else { - log.Fatalf("cannot handle R_ARM64_TLS_IE (sym %s) when linking internally", s.Name) - } - - case objabi.R_CALLARM64: - var t int64 - if r.Sym.Type == sym.SDYNIMPORT { - t = (ld.Symaddr(ctxt.Syms.Lookup(".plt", 0)) + r.Add) - (s.Value + int64(r.Off)) - } else { - t = (ld.Symaddr(r.Sym) + r.Add) - (s.Value + int64(r.Off)) - } - if t >= 1<<27 || t < -1<<27 { - ld.Errorf(s, "program too large, call relocation distance = %d", t) - } - return val | ((t >> 2) & 0x03ffffff), true - - case objabi.R_ARM64_GOT: - if s.P[r.Off+3]&0x9f == 0x90 { - // R_AARCH64_ADR_GOT_PAGE - // patch instruction: adrp - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - if t >= 1<<32 || t < -1<<32 { - ld.Errorf(s, "program too large, address relocation distance = %d", t) - } - var o0 uint32 - o0 |= (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) - return val | int64(o0), true - } else if s.P[r.Off+3] == 0xf9 { - // R_AARCH64_LD64_GOT_LO12_NC - // patch instruction: ldr - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - if t&7 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LD64_GOT_LO12_NC", t) - } - var o1 uint32 - o1 |= uint32(t&0xfff) << (10 - 3) - return val | int64(uint64(o1)), true - } else { - ld.Errorf(s, "unsupported instruction for %v R_GOTARM64", s.P[r.Off:r.Off+4]) - } - - case objabi.R_ARM64_PCREL: - if s.P[r.Off+3]&0x9f == 0x90 { - // R_AARCH64_ADR_PREL_PG_HI21 - // patch instruction: adrp - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - if t >= 1<<32 || t < -1<<32 { - ld.Errorf(s, "program too large, address relocation distance = %d", t) - } - o0 := (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) - return val | int64(o0), true - } else if s.P[r.Off+3]&0x91 == 0x91 { - // R_AARCH64_ADD_ABS_LO12_NC - // patch instruction: add - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - o1 := uint32(t&0xfff) << 10 - return val | int64(o1), true - } else { - ld.Errorf(s, "unsupported instruction for %v R_PCRELARM64", s.P[r.Off:r.Off+4]) - } - - case objabi.R_ARM64_LDST8: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - o0 := uint32(t&0xfff) << 10 - return val | int64(o0), true - - case objabi.R_ARM64_LDST32: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - if t&3 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST32_ABS_LO12_NC", t) - } - o0 := (uint32(t&0xfff) >> 2) << 10 - return val | int64(o0), true - - case objabi.R_ARM64_LDST64: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - if t&7 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST64_ABS_LO12_NC", t) - } - o0 := (uint32(t&0xfff) >> 3) << 10 - return val | int64(o0), true - - case objabi.R_ARM64_LDST128: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) - if t&15 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST128_ABS_LO12_NC", t) - } - o0 := (uint32(t&0xfff) >> 4) << 10 - return val | int64(o0), true - } - - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - log.Fatalf("unexpected relocation variant") - return -1 -} - -func elfsetupplt(ctxt *ld.Link) { - plt := ctxt.Syms.Lookup(".plt", 0) - gotplt := ctxt.Syms.Lookup(".got.plt", 0) - if plt.Size == 0 { - // stp x16, x30, [sp, #-16]! - // identifying information - plt.AddUint32(ctxt.Arch, 0xa9bf7bf0) - - // the following two instructions (adrp + ldr) load *got[2] into x17 - // adrp x16, &got[0] - plt.AddAddrPlus4(gotplt, 16) - plt.SetUint32(ctxt.Arch, plt.Size-4, 0x90000010) - plt.R[len(plt.R)-1].Type = objabi.R_ARM64_GOT - - // is the offset value of &got[2] to &got[0], the same below - // ldr x17, [x16, ] - plt.AddAddrPlus4(gotplt, 16) - plt.SetUint32(ctxt.Arch, plt.Size-4, 0xf9400211) - plt.R[len(plt.R)-1].Type = objabi.R_ARM64_GOT - - // add x16, x16, - plt.AddAddrPlus4(gotplt, 16) - plt.SetUint32(ctxt.Arch, plt.Size-4, 0x91000210) - plt.R[len(plt.R)-1].Type = objabi.R_ARM64_PCREL - - // br x17 - plt.AddUint32(ctxt.Arch, 0xd61f0220) - - // 3 nop for place holder - plt.AddUint32(ctxt.Arch, 0xd503201f) - plt.AddUint32(ctxt.Arch, 0xd503201f) - plt.AddUint32(ctxt.Arch, 0xd503201f) - - // check gotplt.size == 0 - if gotplt.Size != 0 { - ld.Errorf(gotplt, "got.plt is not empty at the very beginning") - } - gotplt.AddAddrPlus(ctxt.Arch, ctxt.Syms.Lookup(".dynamic", 0), 0) - - gotplt.AddUint64(ctxt.Arch, 0) - gotplt.AddUint64(ctxt.Arch, 0) - } -} - -func addpltsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Plt() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - - if ctxt.IsELF { - plt := ctxt.Syms.Lookup(".plt", 0) - gotplt := ctxt.Syms.Lookup(".got.plt", 0) - rela := ctxt.Syms.Lookup(".rela.plt", 0) - if plt.Size == 0 { - elfsetupplt(ctxt) - } - - // adrp x16, &got.plt[0] - plt.AddAddrPlus4(gotplt, gotplt.Size) - plt.SetUint32(ctxt.Arch, plt.Size-4, 0x90000010) - plt.R[len(plt.R)-1].Type = objabi.R_ARM64_GOT - - // is the offset value of &got.plt[n] to &got.plt[0] - // ldr x17, [x16, ] - plt.AddAddrPlus4(gotplt, gotplt.Size) - plt.SetUint32(ctxt.Arch, plt.Size-4, 0xf9400211) - plt.R[len(plt.R)-1].Type = objabi.R_ARM64_GOT - - // add x16, x16, - plt.AddAddrPlus4(gotplt, gotplt.Size) - plt.SetUint32(ctxt.Arch, plt.Size-4, 0x91000210) - plt.R[len(plt.R)-1].Type = objabi.R_ARM64_PCREL - - // br x17 - plt.AddUint32(ctxt.Arch, 0xd61f0220) - - // add to got.plt: pointer to plt[0] - gotplt.AddAddrPlus(ctxt.Arch, plt, 0) - - // rela - rela.AddAddrPlus(ctxt.Arch, gotplt, gotplt.Size-8) - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_AARCH64_JUMP_SLOT))) - rela.AddUint64(ctxt.Arch, 0) - - s.SetPlt(int32(plt.Size - 16)) - } else { - ld.Errorf(s, "addpltsym: unsupported binary format") - } -} - -func addgotsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Got() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - got := ctxt.Syms.Lookup(".got", 0) - s.SetGot(int32(got.Size)) - got.AddUint64(ctxt.Arch, 0) - - if ctxt.IsELF { - rela := ctxt.Syms.Lookup(".rela", 0) - rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got())) - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_AARCH64_GLOB_DAT))) - rela.AddUint64(ctxt.Arch, 0) - } else { - ld.Errorf(s, "addgotsym: unsupported binary format") - } -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - sect := ld.Segtext.Sections[0] - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - for _, sect = range ld.Segtext.Sections[1:] { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - if ld.Segrelrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - machlink := uint32(0) - if ctxt.HeadType == objabi.Hdarwin { - machlink = uint32(ld.Domacholink(ctxt)) - } - - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - - case objabi.Hdarwin: - symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink)) - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) - ctxt.Out.Flush() - - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - ctxt.Out.Flush() - } - - case objabi.Hdarwin: - if ctxt.LinkMode == ld.LinkExternal { - ld.Machoemitreloc(ctxt) - } - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan 9 */ - ctxt.Out.Write32(0x647) /* magic */ - ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(ld.Lcsize)) - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - - case objabi.Hdarwin: - ld.Asmbmacho(ctxt) - } - - ctxt.Out.Flush() - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/oldlink/internal/arm64/l.go b/src/cmd/oldlink/internal/arm64/l.go deleted file mode 100644 index 5f3530335e..0000000000 --- a/src/cmd/oldlink/internal/arm64/l.go +++ /dev/null @@ -1,74 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package arm64 - -// Writing object files. - -// cmd/9l/l.h from Vita Nuova. -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -const ( - maxAlign = 32 // max data alignment - minAlign = 1 // min data alignment - funcAlign = 16 -) - -/* Used by ../internal/ld/dwarf.go */ -const ( - dwarfRegSP = 31 - dwarfRegLR = 30 -) diff --git a/src/cmd/oldlink/internal/arm64/obj.go b/src/cmd/oldlink/internal/arm64/obj.go deleted file mode 100644 index 2dcc999dd1..0000000000 --- a/src/cmd/oldlink/internal/arm64/obj.go +++ /dev/null @@ -1,110 +0,0 @@ -// Inferno utils/5l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package arm64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.ArchARM64 - - theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, - - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Machoreloc1: machoreloc1, - - Androiddynld: "/system/bin/linker64", - Linuxdynld: "/lib/ld-linux-aarch64.so.1", - - Freebsddynld: "/usr/libexec/ld-elf.so.1", - Openbsddynld: "/usr/libexec/ld.so", - Netbsddynld: "/libexec/ld.elf_so", - Dragonflydynld: "XXX", - Solarisdynld: "XXX", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - - case objabi.Hplan9: /* plan 9 */ - ld.HEADR = 32 - - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 4096 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - - case objabi.Hlinux, /* arm64 elf */ - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Elfinit(ctxt) - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 0x10000 - } - - case objabi.Hdarwin: /* apple MACH */ - ld.HEADR = ld.INITIAL_MACHO_HEADR - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 4096 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - } -} diff --git a/src/cmd/oldlink/internal/ld/ar.go b/src/cmd/oldlink/internal/ld/ar.go deleted file mode 100644 index 8df859f11c..0000000000 --- a/src/cmd/oldlink/internal/ld/ar.go +++ /dev/null @@ -1,193 +0,0 @@ -// Inferno utils/include/ar.h -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/include/ar.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ld - -import ( - "cmd/internal/bio" - "cmd/internal/objabi" - "cmd/oldlink/internal/sym" - "encoding/binary" - "fmt" - "io" - "os" -) - -const ( - SARMAG = 8 - SAR_HDR = 16 + 44 -) - -const ( - ARMAG = "!\n" -) - -type ArHdr struct { - name string - date string - uid string - gid string - mode string - size string - fmag string -} - -// hostArchive reads an archive file holding host objects and links in -// required objects. The general format is the same as a Go archive -// file, but it has an armap listing symbols and the objects that -// define them. This is used for the compiler support library -// libgcc.a. -func hostArchive(ctxt *Link, name string) { - f, err := bio.Open(name) - if err != nil { - if os.IsNotExist(err) { - // It's OK if we don't have a libgcc file at all. - if ctxt.Debugvlog != 0 { - ctxt.Logf("skipping libgcc file: %v\n", err) - } - return - } - Exitf("cannot open file %s: %v", name, err) - } - defer f.Close() - - var magbuf [len(ARMAG)]byte - if _, err := io.ReadFull(f, magbuf[:]); err != nil { - Exitf("file %s too short", name) - } - - if string(magbuf[:]) != ARMAG { - Exitf("%s is not an archive file", name) - } - - var arhdr ArHdr - l := nextar(f, f.Offset(), &arhdr) - if l <= 0 { - Exitf("%s missing armap", name) - } - - var armap archiveMap - if arhdr.name == "/" || arhdr.name == "/SYM64/" { - armap = readArmap(name, f, arhdr) - } else { - Exitf("%s missing armap", name) - } - - loaded := make(map[uint64]bool) - any := true - for any { - var load []uint64 - for _, s := range ctxt.Syms.Allsym { - for i := range s.R { - r := &s.R[i] // Copying sym.Reloc has measurable impact on performance - if r.Sym != nil && r.Sym.Type == sym.SXREF { - if off := armap[r.Sym.Name]; off != 0 && !loaded[off] { - load = append(load, off) - loaded[off] = true - } - } - } - } - - for _, off := range load { - l := nextar(f, int64(off), &arhdr) - if l <= 0 { - Exitf("%s missing archive entry at offset %d", name, off) - } - pname := fmt.Sprintf("%s(%s)", name, arhdr.name) - l = atolwhex(arhdr.size) - - libgcc := sym.Library{Pkg: "libgcc"} - h := ldobj(ctxt, f, &libgcc, l, pname, name) - f.MustSeek(h.off, 0) - h.ld(ctxt, f, h.pkg, h.length, h.pn) - } - - any = len(load) > 0 - } -} - -// archiveMap is an archive symbol map: a mapping from symbol name to -// offset within the archive file. -type archiveMap map[string]uint64 - -// readArmap reads the archive symbol map. -func readArmap(filename string, f *bio.Reader, arhdr ArHdr) archiveMap { - is64 := arhdr.name == "/SYM64/" - wordSize := 4 - if is64 { - wordSize = 8 - } - - contents := make([]byte, atolwhex(arhdr.size)) - if _, err := io.ReadFull(f, contents); err != nil { - Exitf("short read from %s", filename) - } - - var c uint64 - if is64 { - c = binary.BigEndian.Uint64(contents) - } else { - c = uint64(binary.BigEndian.Uint32(contents)) - } - contents = contents[wordSize:] - - ret := make(archiveMap) - - names := contents[c*uint64(wordSize):] - for i := uint64(0); i < c; i++ { - n := 0 - for names[n] != 0 { - n++ - } - name := string(names[:n]) - names = names[n+1:] - - // For Mach-O and PE/386 files we strip a leading - // underscore from the symbol name. - if objabi.GOOS == "darwin" || (objabi.GOOS == "windows" && objabi.GOARCH == "386") { - if name[0] == '_' && len(name) > 1 { - name = name[1:] - } - } - - var off uint64 - if is64 { - off = binary.BigEndian.Uint64(contents) - } else { - off = uint64(binary.BigEndian.Uint32(contents)) - } - contents = contents[wordSize:] - - ret[name] = off - } - - return ret -} diff --git a/src/cmd/oldlink/internal/ld/config.go b/src/cmd/oldlink/internal/ld/config.go deleted file mode 100644 index 2373b500e3..0000000000 --- a/src/cmd/oldlink/internal/ld/config.go +++ /dev/null @@ -1,272 +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 ld - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "fmt" - "log" -) - -// A BuildMode indicates the sort of object we are building. -// -// Possible build modes are the same as those for the -buildmode flag -// in cmd/go, and are documented in 'go help buildmode'. -type BuildMode uint8 - -const ( - BuildModeUnset BuildMode = iota - BuildModeExe - BuildModePIE - BuildModeCArchive - BuildModeCShared - BuildModeShared - BuildModePlugin -) - -func (mode *BuildMode) Set(s string) error { - badmode := func() error { - return fmt.Errorf("buildmode %s not supported on %s/%s", s, objabi.GOOS, objabi.GOARCH) - } - switch s { - default: - return fmt.Errorf("invalid buildmode: %q", s) - case "exe": - *mode = BuildModeExe - case "pie": - switch objabi.GOOS { - case "aix", "android", "linux", "windows": - case "darwin", "freebsd": - switch objabi.GOARCH { - case "amd64": - default: - return badmode() - } - default: - return badmode() - } - *mode = BuildModePIE - case "c-archive": - switch objabi.GOOS { - case "aix", "darwin", "linux": - case "freebsd": - switch objabi.GOARCH { - case "amd64": - default: - return badmode() - } - case "windows": - switch objabi.GOARCH { - case "amd64", "386", "arm": - default: - return badmode() - } - default: - return badmode() - } - *mode = BuildModeCArchive - case "c-shared": - switch objabi.GOARCH { - case "386", "amd64", "arm", "arm64", "ppc64le", "s390x": - default: - return badmode() - } - *mode = BuildModeCShared - case "shared": - switch objabi.GOOS { - case "linux": - switch objabi.GOARCH { - case "386", "amd64", "arm", "arm64", "ppc64le", "s390x": - default: - return badmode() - } - default: - return badmode() - } - *mode = BuildModeShared - case "plugin": - switch objabi.GOOS { - case "linux": - switch objabi.GOARCH { - case "386", "amd64", "arm", "arm64", "s390x", "ppc64le": - default: - return badmode() - } - case "darwin", "freebsd": - switch objabi.GOARCH { - case "amd64": - default: - return badmode() - } - default: - return badmode() - } - *mode = BuildModePlugin - } - return nil -} - -func (mode *BuildMode) String() string { - switch *mode { - case BuildModeUnset: - return "" // avoid showing a default in usage message - case BuildModeExe: - return "exe" - case BuildModePIE: - return "pie" - case BuildModeCArchive: - return "c-archive" - case BuildModeCShared: - return "c-shared" - case BuildModeShared: - return "shared" - case BuildModePlugin: - return "plugin" - } - return fmt.Sprintf("BuildMode(%d)", uint8(*mode)) -} - -// LinkMode indicates whether an external linker is used for the final link. -type LinkMode uint8 - -const ( - LinkAuto LinkMode = iota - LinkInternal - LinkExternal -) - -func (mode *LinkMode) Set(s string) error { - switch s { - default: - return fmt.Errorf("invalid linkmode: %q", s) - case "auto": - *mode = LinkAuto - case "internal": - *mode = LinkInternal - case "external": - *mode = LinkExternal - } - return nil -} - -func (mode *LinkMode) String() string { - switch *mode { - case LinkAuto: - return "auto" - case LinkInternal: - return "internal" - case LinkExternal: - return "external" - } - return fmt.Sprintf("LinkMode(%d)", uint8(*mode)) -} - -// mustLinkExternal reports whether the program being linked requires -// the external linker be used to complete the link. -func mustLinkExternal(ctxt *Link) (res bool, reason string) { - if ctxt.Debugvlog > 1 { - defer func() { - if res { - log.Printf("external linking is forced by: %s\n", reason) - } - }() - } - - if sys.MustLinkExternal(objabi.GOOS, objabi.GOARCH) { - return true, fmt.Sprintf("%s/%s requires external linking", objabi.GOOS, objabi.GOARCH) - } - - if *flagMsan { - return true, "msan" - } - - // Internally linking cgo is incomplete on some architectures. - // https://golang.org/issue/14449 - // https://golang.org/issue/21961 - if iscgo && ctxt.Arch.InFamily(sys.MIPS64, sys.MIPS, sys.PPC64) { - return true, objabi.GOARCH + " does not support internal cgo" - } - if iscgo && objabi.GOOS == "android" { - return true, objabi.GOOS + " does not support internal cgo" - } - - // When the race flag is set, the LLVM tsan relocatable file is linked - // into the final binary, which means external linking is required because - // internal linking does not support it. - if *flagRace && ctxt.Arch.InFamily(sys.PPC64) { - return true, "race on " + objabi.GOARCH - } - - // Some build modes require work the internal linker cannot do (yet). - switch ctxt.BuildMode { - case BuildModeCArchive: - return true, "buildmode=c-archive" - case BuildModeCShared: - return true, "buildmode=c-shared" - case BuildModePIE: - switch objabi.GOOS + "/" + objabi.GOARCH { - case "linux/amd64", "linux/arm64", "android/arm64": - case "windows/386", "windows/amd64", "windows/arm": - default: - // Internal linking does not support TLS_IE. - return true, "buildmode=pie" - } - case BuildModePlugin: - return true, "buildmode=plugin" - case BuildModeShared: - return true, "buildmode=shared" - } - if ctxt.linkShared { - return true, "dynamically linking with a shared library" - } - - return false, "" -} - -// determineLinkMode sets ctxt.LinkMode. -// -// It is called after flags are processed and inputs are processed, -// so the ctxt.LinkMode variable has an initial value from the -linkmode -// flag and the iscgo externalobj variables are set. -func determineLinkMode(ctxt *Link) { - extNeeded, extReason := mustLinkExternal(ctxt) - via := "" - - if ctxt.LinkMode == LinkAuto { - // The environment variable GO_EXTLINK_ENABLED controls the - // default value of -linkmode. If it is not set when the - // linker is called we take the value it was set to when - // cmd/link was compiled. (See make.bash.) - switch objabi.Getgoextlinkenabled() { - case "0": - ctxt.LinkMode = LinkInternal - via = "via GO_EXTLINK_ENABLED " - case "1": - ctxt.LinkMode = LinkExternal - via = "via GO_EXTLINK_ENABLED " - default: - if extNeeded || (iscgo && externalobj) { - ctxt.LinkMode = LinkExternal - } else { - ctxt.LinkMode = LinkInternal - } - } - } - - switch ctxt.LinkMode { - case LinkInternal: - if extNeeded { - Exitf("internal linking requested %sbut external linking required: %s", via, extReason) - } - case LinkExternal: - switch { - case objabi.GOARCH == "riscv64": - Exitf("external linking not supported for %s/riscv64", objabi.GOOS) - case objabi.GOARCH == "ppc64" && objabi.GOOS != "aix": - Exitf("external linking not supported for %s/ppc64", objabi.GOOS) - } - } -} diff --git a/src/cmd/oldlink/internal/ld/data.go b/src/cmd/oldlink/internal/ld/data.go deleted file mode 100644 index ba4a74156b..0000000000 --- a/src/cmd/oldlink/internal/ld/data.go +++ /dev/null @@ -1,2501 +0,0 @@ -// Derived from Inferno utils/6l/obj.c and utils/6l/span.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/span.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ld - -import ( - "bufio" - "bytes" - "cmd/internal/gcprog" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "compress/zlib" - "encoding/binary" - "fmt" - "log" - "os" - "sort" - "strconv" - "strings" - "sync" -) - -// isRuntimeDepPkg reports whether pkg is the runtime package or its dependency -func isRuntimeDepPkg(pkg string) bool { - switch pkg { - case "runtime", - "sync/atomic", // runtime may call to sync/atomic, due to go:linkname - "internal/bytealg", // for IndexByte - "internal/cpu": // for cpu features - return true - } - return strings.HasPrefix(pkg, "runtime/internal/") && !strings.HasSuffix(pkg, "_test") -} - -// Estimate the max size needed to hold any new trampolines created for this function. This -// is used to determine when the section can be split if it becomes too large, to ensure that -// the trampolines are in the same section as the function that uses them. -func maxSizeTrampolinesPPC64(s *sym.Symbol, isTramp bool) uint64 { - // If thearch.Trampoline is nil, then trampoline support is not available on this arch. - // A trampoline does not need any dependent trampolines. - if thearch.Trampoline == nil || isTramp { - return 0 - } - - n := uint64(0) - for ri := range s.R { - r := &s.R[ri] - if r.Type.IsDirectCallOrJump() { - n++ - } - } - // Trampolines in ppc64 are 4 instructions. - return n * 16 -} - -// detect too-far jumps in function s, and add trampolines if necessary -// ARM, PPC64 & PPC64LE support trampoline insertion for internal and external linking -// On PPC64 & PPC64LE the text sections might be split but will still insert trampolines -// where necessary. -func trampoline(ctxt *Link, s *sym.Symbol) { - if thearch.Trampoline == nil { - return // no need or no support of trampolines on this arch - } - - for ri := range s.R { - r := &s.R[ri] - if !r.Type.IsDirectCallOrJump() { - continue - } - if Symaddr(r.Sym) == 0 && (r.Sym.Type != sym.SDYNIMPORT && r.Sym.Type != sym.SUNDEFEXT) { - if r.Sym.File != s.File { - if !isRuntimeDepPkg(s.File) || !isRuntimeDepPkg(r.Sym.File) { - ctxt.ErrorUnresolved(s, r) - } - // runtime and its dependent packages may call to each other. - // they are fine, as they will be laid down together. - } - continue - } - - thearch.Trampoline(ctxt, r, s) - } - -} - -// relocsym resolve relocations in "s". The main loop walks through -// the list of relocations attached to "s" and resolves them where -// applicable. Relocations are often architecture-specific, requiring -// calls into the 'archreloc' and/or 'archrelocvariant' functions for -// the architecture. When external linking is in effect, it may not be -// possible to completely resolve the address/offset for a symbol, in -// which case the goal is to lay the groundwork for turning a given -// relocation into an external reloc (to be applied by the external -// linker). For more on how relocations work in general, see -// -// "Linkers and Loaders", by John R. Levine (Morgan Kaufmann, 1999), ch. 7 -// -// This is a performance-critical function for the linker; be careful -// to avoid introducing unnecessary allocations in the main loop. -func relocsym(ctxt *Link, s *sym.Symbol) { - if len(s.R) == 0 { - return - } - if s.Attr.ReadOnly() { - // The symbol's content is backed by read-only memory. - // Copy it to writable memory to apply relocations. - s.P = append([]byte(nil), s.P...) - s.Attr.Set(sym.AttrReadOnly, false) - } - for ri := int32(0); ri < int32(len(s.R)); ri++ { - r := &s.R[ri] - if r.Done { - // Relocation already processed by an earlier phase. - continue - } - r.Done = true - off := r.Off - siz := int32(r.Siz) - if off < 0 || off+siz > int32(len(s.P)) { - rname := "" - if r.Sym != nil { - rname = r.Sym.Name - } - Errorf(s, "invalid relocation %s: %d+%d not in [%d,%d)", rname, off, siz, 0, len(s.P)) - continue - } - - if r.Sym != nil && ((r.Sym.Type == sym.Sxxx && !r.Sym.Attr.VisibilityHidden()) || r.Sym.Type == sym.SXREF) { - // When putting the runtime but not main into a shared library - // these symbols are undefined and that's OK. - if ctxt.BuildMode == BuildModeShared || ctxt.BuildMode == BuildModePlugin { - if r.Sym.Name == "main.main" || (ctxt.BuildMode != BuildModePlugin && r.Sym.Name == "main..inittask") { - r.Sym.Type = sym.SDYNIMPORT - } else if strings.HasPrefix(r.Sym.Name, "go.info.") { - // Skip go.info symbols. They are only needed to communicate - // DWARF info between the compiler and linker. - continue - } - } else { - ctxt.ErrorUnresolved(s, r) - continue - } - } - - if r.Type >= objabi.ElfRelocOffset { - continue - } - if r.Siz == 0 { // informational relocation - no work to do - continue - } - - // We need to be able to reference dynimport symbols when linking against - // shared libraries, and Solaris, Darwin and AIX need it always - if ctxt.HeadType != objabi.Hsolaris && ctxt.HeadType != objabi.Hdarwin && ctxt.HeadType != objabi.Haix && r.Sym != nil && r.Sym.Type == sym.SDYNIMPORT && !ctxt.DynlinkingGo() && !r.Sym.Attr.SubSymbol() { - if !(ctxt.Arch.Family == sys.PPC64 && ctxt.LinkMode == LinkExternal && r.Sym.Name == ".TOC.") { - Errorf(s, "unhandled relocation for %s (type %d (%s) rtype %d (%s))", r.Sym.Name, r.Sym.Type, r.Sym.Type, r.Type, sym.RelocName(ctxt.Arch, r.Type)) - } - } - if r.Sym != nil && r.Sym.Type != sym.STLSBSS && r.Type != objabi.R_WEAKADDROFF && !r.Sym.Attr.Reachable() { - Errorf(s, "unreachable sym in relocation: %s", r.Sym.Name) - } - - if ctxt.LinkMode == LinkExternal { - r.InitExt() - } - - // TODO(mundaym): remove this special case - see issue 14218. - if ctxt.Arch.Family == sys.S390X { - switch r.Type { - case objabi.R_PCRELDBL: - r.InitExt() - r.Type = objabi.R_PCREL - r.Variant = sym.RV_390_DBL - case objabi.R_CALL: - r.InitExt() - r.Variant = sym.RV_390_DBL - } - } - - var o int64 - switch r.Type { - default: - switch siz { - default: - Errorf(s, "bad reloc size %#x for %s", uint32(siz), r.Sym.Name) - case 1: - o = int64(s.P[off]) - case 2: - o = int64(ctxt.Arch.ByteOrder.Uint16(s.P[off:])) - case 4: - o = int64(ctxt.Arch.ByteOrder.Uint32(s.P[off:])) - case 8: - o = int64(ctxt.Arch.ByteOrder.Uint64(s.P[off:])) - } - if offset, ok := thearch.Archreloc(ctxt, r, s, o); ok { - o = offset - } else { - Errorf(s, "unknown reloc to %v: %d (%s)", r.Sym.Name, r.Type, sym.RelocName(ctxt.Arch, r.Type)) - } - case objabi.R_TLS_LE: - if ctxt.LinkMode == LinkExternal && ctxt.IsELF { - r.Done = false - if r.Sym == nil { - r.Sym = ctxt.Tlsg - } - r.Xsym = r.Sym - r.Xadd = r.Add - o = 0 - if ctxt.Arch.Family != sys.AMD64 { - o = r.Add - } - break - } - - if ctxt.IsELF && ctxt.Arch.Family == sys.ARM { - // On ELF ARM, the thread pointer is 8 bytes before - // the start of the thread-local data block, so add 8 - // to the actual TLS offset (r->sym->value). - // This 8 seems to be a fundamental constant of - // ELF on ARM (or maybe Glibc on ARM); it is not - // related to the fact that our own TLS storage happens - // to take up 8 bytes. - o = 8 + r.Sym.Value - } else if ctxt.IsELF || ctxt.HeadType == objabi.Hplan9 || ctxt.HeadType == objabi.Hdarwin { - o = int64(ctxt.Tlsoffset) + r.Add - } else if ctxt.HeadType == objabi.Hwindows { - o = r.Add - } else { - log.Fatalf("unexpected R_TLS_LE relocation for %v", ctxt.HeadType) - } - case objabi.R_TLS_IE: - if ctxt.LinkMode == LinkExternal && ctxt.IsELF { - r.Done = false - if r.Sym == nil { - r.Sym = ctxt.Tlsg - } - r.Xsym = r.Sym - r.Xadd = r.Add - o = 0 - if ctxt.Arch.Family != sys.AMD64 { - o = r.Add - } - break - } - if ctxt.BuildMode == BuildModePIE && ctxt.IsELF { - // We are linking the final executable, so we - // can optimize any TLS IE relocation to LE. - if thearch.TLSIEtoLE == nil { - log.Fatalf("internal linking of TLS IE not supported on %v", ctxt.Arch.Family) - } - thearch.TLSIEtoLE(s, int(off), int(r.Siz)) - o = int64(ctxt.Tlsoffset) - // TODO: o += r.Add when ctxt.Arch.Family != sys.AMD64? - // Why do we treat r.Add differently on AMD64? - // Is the external linker using Xadd at all? - } else { - log.Fatalf("cannot handle R_TLS_IE (sym %s) when linking internally", s.Name) - } - case objabi.R_ADDR: - if ctxt.LinkMode == LinkExternal && r.Sym.Type != sym.SCONST { - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := r.Sym - - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += Symaddr(rs) - Symaddr(rs.Outer) - rs = rs.Outer - } - - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { - Errorf(s, "missing section for relocation target %s", rs.Name) - } - r.Xsym = rs - - o = r.Xadd - if ctxt.IsELF { - if ctxt.Arch.Family == sys.AMD64 { - o = 0 - } - } else if ctxt.HeadType == objabi.Hdarwin { - if rs.Type != sym.SHOSTOBJ { - o += Symaddr(rs) - } - } else if ctxt.HeadType == objabi.Hwindows { - // nothing to do - } else if ctxt.HeadType == objabi.Haix { - o = Symaddr(r.Sym) + r.Add - } else { - Errorf(s, "unhandled pcrel relocation to %s on %v", rs.Name, ctxt.HeadType) - } - - break - } - - // On AIX, a second relocation must be done by the loader, - // as section addresses can change once loaded. - // The "default" symbol address is still needed by the loader so - // the current relocation can't be skipped. - if ctxt.HeadType == objabi.Haix && r.Sym.Type != sym.SDYNIMPORT { - // It's not possible to make a loader relocation in a - // symbol which is not inside .data section. - // FIXME: It should be forbidden to have R_ADDR from a - // symbol which isn't in .data. However, as .text has the - // same address once loaded, this is possible. - if s.Sect.Seg == &Segdata { - Xcoffadddynrel(ctxt, s, r) - } - } - - o = Symaddr(r.Sym) + r.Add - - // 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 - // fail at runtime. See https://golang.org/issue/7980. - // Instead of special casing only amd64, we treat this as an error on all - // 64-bit architectures so as to be future-proof. - if int32(o) < 0 && ctxt.Arch.PtrSize > 4 && siz == 4 { - Errorf(s, "non-pc-relative relocation address for %s is too big: %#x (%#x + %#x)", r.Sym.Name, uint64(o), Symaddr(r.Sym), r.Add) - errorexit() - } - case objabi.R_DWARFSECREF: - if r.Sym.Sect == nil { - Errorf(s, "missing DWARF section for relocation target %s", r.Sym.Name) - } - - if ctxt.LinkMode == LinkExternal { - r.Done = false - - // On most platforms, the external linker needs to adjust DWARF references - // as it combines DWARF sections. However, on Darwin, dsymutil does the - // DWARF linking, and it understands how to follow section offsets. - // Leaving in the relocation records confuses it (see - // https://golang.org/issue/22068) so drop them for Darwin. - if ctxt.HeadType == objabi.Hdarwin { - r.Done = true - } - - // PE code emits IMAGE_REL_I386_SECREL and IMAGE_REL_AMD64_SECREL - // for R_DWARFSECREF relocations, while R_ADDR is replaced with - // IMAGE_REL_I386_DIR32, IMAGE_REL_AMD64_ADDR64 and IMAGE_REL_AMD64_ADDR32. - // Do not replace R_DWARFSECREF with R_ADDR for windows - - // let PE code emit correct relocations. - if ctxt.HeadType != objabi.Hwindows { - r.Type = objabi.R_ADDR - } - - r.Xsym = ctxt.Syms.ROLookup(r.Sym.Sect.Name, 0) - r.Xadd = r.Add + Symaddr(r.Sym) - int64(r.Sym.Sect.Vaddr) - - o = r.Xadd - if ctxt.IsELF && ctxt.Arch.Family == sys.AMD64 { - o = 0 - } - break - } - o = Symaddr(r.Sym) + r.Add - int64(r.Sym.Sect.Vaddr) - case objabi.R_WEAKADDROFF: - if !r.Sym.Attr.Reachable() { - continue - } - fallthrough - case objabi.R_ADDROFF: - // 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 r.Sym.Sect.Name == ".text" { - o = Symaddr(r.Sym) - int64(Segtext.Sections[0].Vaddr) + r.Add - } else { - o = Symaddr(r.Sym) - int64(r.Sym.Sect.Vaddr) + r.Add - } - - case objabi.R_ADDRCUOFF: - // debug_range and debug_loc elements use this relocation type to get an - // offset from the start of the compile unit. - o = Symaddr(r.Sym) + r.Add - Symaddr(r.Sym.Unit.Textp[0]) - - // r->sym can be null when CALL $(constant) is transformed from absolute PC to relative PC call. - case objabi.R_GOTPCREL: - if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin && r.Sym != nil && r.Sym.Type != sym.SCONST { - r.Done = false - r.Xadd = r.Add - r.Xadd -= int64(r.Siz) // relative to address after the relocated chunk - r.Xsym = r.Sym - - o = r.Xadd - o += int64(r.Siz) - break - } - fallthrough - case objabi.R_CALL, objabi.R_PCREL: - if ctxt.LinkMode == LinkExternal && r.Sym != nil && r.Sym.Type == sym.SUNDEFEXT { - // pass through to the external linker. - r.Done = false - r.Xadd = 0 - if ctxt.IsELF { - r.Xadd -= int64(r.Siz) - } - r.Xsym = r.Sym - o = 0 - break - } - if ctxt.LinkMode == LinkExternal && r.Sym != nil && r.Sym.Type != sym.SCONST && (r.Sym.Sect != s.Sect || r.Type == objabi.R_GOTPCREL) { - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := r.Sym - - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += Symaddr(rs) - Symaddr(rs.Outer) - rs = rs.Outer - } - - r.Xadd -= int64(r.Siz) // relative to address after the relocated chunk - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - Errorf(s, "missing section for relocation target %s", rs.Name) - } - r.Xsym = rs - - o = r.Xadd - if ctxt.IsELF { - if ctxt.Arch.Family == sys.AMD64 { - o = 0 - } - } else if ctxt.HeadType == objabi.Hdarwin { - if r.Type == objabi.R_CALL { - if ctxt.LinkMode == LinkExternal && rs.Type == sym.SDYNIMPORT { - if ctxt.Arch.Family == sys.AMD64 { - // AMD64 dynamic relocations are relative to the end of the relocation. - o += int64(r.Siz) - } - } else { - if rs.Type != sym.SHOSTOBJ { - o += int64(uint64(Symaddr(rs)) - rs.Sect.Vaddr) - } - o -= int64(r.Off) // relative to section offset, not symbol - } - } else { - o += int64(r.Siz) - } - } else if ctxt.HeadType == objabi.Hwindows && ctxt.Arch.Family == sys.AMD64 { // only amd64 needs PCREL - // PE/COFF's PC32 relocation uses the address after the relocated - // bytes as the base. Compensate by skewing the addend. - o += int64(r.Siz) - } else { - Errorf(s, "unhandled pcrel relocation to %s on %v", rs.Name, ctxt.HeadType) - } - - break - } - - o = 0 - if r.Sym != nil { - o += Symaddr(r.Sym) - } - - o += r.Add - (s.Value + int64(r.Off) + int64(r.Siz)) - case objabi.R_SIZE: - o = r.Sym.Size + r.Add - - case objabi.R_XCOFFREF: - if ctxt.HeadType != objabi.Haix { - Errorf(s, "find XCOFF R_REF on non-XCOFF files") - } - if ctxt.LinkMode != LinkExternal { - Errorf(s, "find XCOFF R_REF with internal linking") - } - r.Xsym = r.Sym - r.Xadd = r.Add - r.Done = false - - // This isn't a real relocation so it must not update - // its offset value. - continue - - case objabi.R_DWARFFILEREF: - // The final file index is saved in r.Add in dwarf.go:writelines. - o = r.Add - } - - if ctxt.Arch.Family == sys.PPC64 || ctxt.Arch.Family == sys.S390X { - r.InitExt() - if r.Variant != sym.RV_NONE { - o = thearch.Archrelocvariant(ctxt, r, s, o) - } - } - - if false { - nam := "" - var addr int64 - if r.Sym != nil { - nam = r.Sym.Name - addr = Symaddr(r.Sym) - } - xnam := "" - if r.Xsym != nil { - xnam = r.Xsym.Name - } - fmt.Printf("relocate %s %#x (%#x+%#x, size %d) => %s %#x +%#x (xsym: %s +%#x) [type %d (%s)/%d, %x]\n", s.Name, s.Value+int64(off), s.Value, r.Off, r.Siz, nam, addr, r.Add, xnam, r.Xadd, r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Variant, o) - } - switch siz { - default: - Errorf(s, "bad reloc size %#x for %s", uint32(siz), r.Sym.Name) - fallthrough - - // TODO(rsc): Remove. - case 1: - s.P[off] = byte(int8(o)) - case 2: - if o != int64(int16(o)) { - Errorf(s, "relocation address for %s is too big: %#x", r.Sym.Name, o) - } - i16 := int16(o) - ctxt.Arch.ByteOrder.PutUint16(s.P[off:], uint16(i16)) - case 4: - if r.Type == objabi.R_PCREL || r.Type == objabi.R_CALL { - if o != int64(int32(o)) { - Errorf(s, "pc-relative relocation address for %s is too big: %#x", r.Sym.Name, o) - } - } else { - if o != int64(int32(o)) && o != int64(uint32(o)) { - Errorf(s, "non-pc-relative relocation address for %s is too big: %#x", r.Sym.Name, uint64(o)) - } - } - - fl := int32(o) - ctxt.Arch.ByteOrder.PutUint32(s.P[off:], uint32(fl)) - case 8: - ctxt.Arch.ByteOrder.PutUint64(s.P[off:], uint64(o)) - } - } -} - -func (ctxt *Link) reloc() { - for _, s := range ctxt.Textp { - relocsym(ctxt, s) - } - for _, s := range datap { - relocsym(ctxt, s) - } - for _, s := range dwarfp { - relocsym(ctxt, s) - } -} - -func windynrelocsym(ctxt *Link, rel, s *sym.Symbol) { - for ri := range s.R { - r := &s.R[ri] - targ := r.Sym - if targ == nil { - continue - } - if !targ.Attr.Reachable() { - if r.Type == objabi.R_WEAKADDROFF { - continue - } - Errorf(s, "dynamic relocation to unreachable symbol %s", targ.Name) - } - if r.Sym.Plt() == -2 && r.Sym.Got() != -2 { // make dynimport JMP table for PE object files. - targ.SetPlt(int32(rel.Size)) - r.Sym = rel - r.Add = int64(targ.Plt()) - - // jmp *addr - switch ctxt.Arch.Family { - default: - Errorf(s, "unsupported arch %v", ctxt.Arch.Family) - return - case sys.I386: - rel.AddUint8(0xff) - rel.AddUint8(0x25) - rel.AddAddr(ctxt.Arch, targ) - rel.AddUint8(0x90) - rel.AddUint8(0x90) - case sys.AMD64: - rel.AddUint8(0xff) - rel.AddUint8(0x24) - rel.AddUint8(0x25) - rel.AddAddrPlus4(targ, 0) - rel.AddUint8(0x90) - } - } else if r.Sym.Plt() >= 0 { - r.Sym = rel - r.Add = int64(targ.Plt()) - } - } -} - -// windynrelocsyms generates jump table to C library functions that will be -// added later. windynrelocsyms writes the table into .rel symbol. -func (ctxt *Link) windynrelocsyms() { - if !(ctxt.HeadType == objabi.Hwindows && iscgo && ctxt.LinkMode == LinkInternal) { - return - } - - /* relocation table */ - rel := ctxt.Syms.Lookup(".rel", 0) - rel.Attr |= sym.AttrReachable - rel.Type = sym.STEXT - ctxt.Textp = append(ctxt.Textp, rel) - - for _, s := range ctxt.Textp { - if s == rel { - continue - } - windynrelocsym(ctxt, rel, s) - } -} - -func dynrelocsym(ctxt *Link, s *sym.Symbol) { - for ri := range s.R { - r := &s.R[ri] - if ctxt.BuildMode == BuildModePIE && ctxt.LinkMode == LinkInternal { - // It's expected that some relocations will be done - // later by relocsym (R_TLS_LE, R_ADDROFF), so - // don't worry if Adddynrel returns false. - thearch.Adddynrel(ctxt, s, r) - continue - } - - if r.Sym != nil && r.Sym.Type == sym.SDYNIMPORT || r.Type >= objabi.ElfRelocOffset { - if r.Sym != nil && !r.Sym.Attr.Reachable() { - Errorf(s, "dynamic relocation to unreachable symbol %s", r.Sym.Name) - } - if !thearch.Adddynrel(ctxt, s, r) { - Errorf(s, "unsupported dynamic relocation for symbol %s (type=%d (%s) stype=%d (%s))", r.Sym.Name, r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Sym.Type, r.Sym.Type) - } - } - } -} - -func dynreloc(ctxt *Link, data *[sym.SXREF][]*sym.Symbol) { - if ctxt.HeadType == objabi.Hwindows { - return - } - // -d suppresses dynamic loader format, so we may as well not - // compute these sections or mark their symbols as reachable. - if *FlagD { - return - } - - for _, s := range ctxt.Textp { - dynrelocsym(ctxt, s) - } - for _, syms := range data { - for _, s := range syms { - dynrelocsym(ctxt, s) - } - } - if ctxt.IsELF { - elfdynhash(ctxt) - } -} - -func Codeblk(ctxt *Link, addr int64, size int64) { - CodeblkPad(ctxt, addr, size, zeros[:]) -} -func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte) { - if *flagA { - ctxt.Logf("codeblk [%#x,%#x) at offset %#x\n", addr, addr+size, ctxt.Out.Offset()) - } - - blk(ctxt.Out, ctxt.Textp, addr, size, pad) - - /* again for printing */ - if !*flagA { - return - } - - syms := ctxt.Textp - for i, s := range syms { - if !s.Attr.Reachable() { - continue - } - if s.Value >= addr { - syms = syms[i:] - break - } - } - - eaddr := addr + size - for _, s := range syms { - if !s.Attr.Reachable() { - continue - } - if s.Value >= eaddr { - break - } - - if addr < s.Value { - ctxt.Logf("%-20s %.8x|", "_", uint64(addr)) - for ; addr < s.Value; addr++ { - ctxt.Logf(" %.2x", 0) - } - ctxt.Logf("\n") - } - - ctxt.Logf("%.6x\t%-20s\n", uint64(addr), s.Name) - q := s.P - - for len(q) >= 16 { - ctxt.Logf("%.6x\t% x\n", uint64(addr), q[:16]) - addr += 16 - q = q[16:] - } - - if len(q) > 0 { - ctxt.Logf("%.6x\t% x\n", uint64(addr), q) - addr += int64(len(q)) - } - } - - if addr < eaddr { - ctxt.Logf("%-20s %.8x|", "_", uint64(addr)) - for ; addr < eaddr; addr++ { - ctxt.Logf(" %.2x", 0) - } - } -} - -func blk(out *OutBuf, syms []*sym.Symbol, addr, size int64, pad []byte) { - for i, s := range syms { - if !s.Attr.SubSymbol() && s.Value >= addr { - syms = syms[i:] - break - } - } - - // This doesn't distinguish the memory size from the file - // size, and it lays out the file based on Symbol.Value, which - // is the virtual address. DWARF compression changes file sizes, - // so dwarfcompress will fix this up later if necessary. - eaddr := addr + size - for _, s := range syms { - if s.Attr.SubSymbol() { - continue - } - if s.Value >= eaddr { - break - } - if s.Value < addr { - Errorf(s, "phase error: addr=%#x but sym=%#x type=%d", addr, s.Value, s.Type) - errorexit() - } - if addr < s.Value { - out.WriteStringPad("", int(s.Value-addr), pad) - addr = s.Value - } - out.WriteSym(s) - addr += int64(len(s.P)) - if addr < s.Value+s.Size { - out.WriteStringPad("", int(s.Value+s.Size-addr), pad) - addr = s.Value + s.Size - } - if addr != s.Value+s.Size { - Errorf(s, "phase error: addr=%#x value+size=%#x", addr, s.Value+s.Size) - errorexit() - } - if s.Value+s.Size >= eaddr { - break - } - } - - if addr < eaddr { - out.WriteStringPad("", int(eaddr-addr), pad) - } - out.Flush() -} - -func Datblk(ctxt *Link, addr int64, size int64) { - writeDatblkToOutBuf(ctxt, ctxt.Out, addr, size) -} - -// Used only on Wasm for now. -func DatblkBytes(ctxt *Link, addr int64, size int64) []byte { - buf := bytes.NewBuffer(make([]byte, 0, size)) - out := &OutBuf{w: bufio.NewWriter(buf)} - writeDatblkToOutBuf(ctxt, out, addr, size) - out.Flush() - return buf.Bytes() -} - -func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) { - if *flagA { - ctxt.Logf("datblk [%#x,%#x) at offset %#x\n", addr, addr+size, ctxt.Out.Offset()) - } - - blk(out, datap, addr, size, zeros[:]) - - /* again for printing */ - if !*flagA { - return - } - - syms := datap - for i, sym := range syms { - if sym.Value >= addr { - syms = syms[i:] - break - } - } - - eaddr := addr + size - for _, sym := range syms { - if sym.Value >= eaddr { - break - } - if addr < sym.Value { - ctxt.Logf("\t%.8x| 00 ...\n", uint64(addr)) - addr = sym.Value - } - - ctxt.Logf("%s\n\t%.8x|", sym.Name, uint64(addr)) - for i, b := range sym.P { - if i > 0 && i%16 == 0 { - ctxt.Logf("\n\t%.8x|", uint64(addr)+uint64(i)) - } - ctxt.Logf(" %.2x", b) - } - - addr += int64(len(sym.P)) - for ; addr < sym.Value+sym.Size; addr++ { - ctxt.Logf(" %.2x", 0) - } - ctxt.Logf("\n") - - if ctxt.LinkMode != LinkExternal { - continue - } - for i := range sym.R { - r := &sym.R[i] // Copying sym.Reloc has measurable impact on performance - rsname := "" - rsval := int64(0) - if r.Sym != nil { - rsname = r.Sym.Name - rsval = r.Sym.Value - } - typ := "?" - switch r.Type { - case objabi.R_ADDR: - typ = "addr" - case objabi.R_PCREL: - typ = "pcrel" - case objabi.R_CALL: - typ = "call" - } - ctxt.Logf("\treloc %.8x/%d %s %s+%#x [%#x]\n", uint(sym.Value+int64(r.Off)), r.Siz, typ, rsname, r.Add, rsval+r.Add) - } - } - - if addr < eaddr { - ctxt.Logf("\t%.8x| 00 ...\n", uint(addr)) - } - ctxt.Logf("\t%.8x|\n", uint(eaddr)) -} - -func Dwarfblk(ctxt *Link, addr int64, size int64) { - if *flagA { - ctxt.Logf("dwarfblk [%#x,%#x) at offset %#x\n", addr, addr+size, ctxt.Out.Offset()) - } - - blk(ctxt.Out, dwarfp, addr, size, zeros[:]) -} - -var zeros [512]byte - -var ( - strdata = make(map[string]string) - strnames []string -) - -func addstrdata1(ctxt *Link, arg string) { - eq := strings.Index(arg, "=") - dot := strings.LastIndex(arg[:eq+1], ".") - if eq < 0 || dot < 0 { - Exitf("-X flag requires argument of the form importpath.name=value") - } - pkg := arg[:dot] - if ctxt.BuildMode == BuildModePlugin && pkg == "main" { - pkg = *flagPluginPath - } - pkg = objabi.PathToPrefix(pkg) - name := pkg + arg[dot:eq] - value := arg[eq+1:] - if _, ok := strdata[name]; !ok { - strnames = append(strnames, name) - } - strdata[name] = value -} - -// addstrdata sets the initial value of the string variable name to value. -func addstrdata(ctxt *Link, name, value string) { - s := ctxt.Syms.ROLookup(name, 0) - if s == nil || s.Gotype == nil { - // Not defined in the loaded packages. - return - } - if s.Gotype.Name != "type.string" { - Errorf(s, "cannot set with -X: not a var of type string (%s)", s.Gotype.Name) - return - } - if s.Type == sym.SBSS { - s.Type = sym.SDATA - } - - p := fmt.Sprintf("%s.str", s.Name) - sp := ctxt.Syms.Lookup(p, 0) - - Addstring(sp, value) - sp.Type = sym.SRODATA - - s.Size = 0 - s.P = s.P[:0] - if s.Attr.ReadOnly() { - s.P = make([]byte, 0, ctxt.Arch.PtrSize*2) - s.Attr.Set(sym.AttrReadOnly, false) - } - s.R = s.R[:0] - reachable := s.Attr.Reachable() - s.AddAddr(ctxt.Arch, sp) - s.AddUint(ctxt.Arch, uint64(len(value))) - - // addstring, addaddr, etc., mark the symbols as reachable. - // In this case that is not necessarily true, so stick to what - // we know before entering this function. - s.Attr.Set(sym.AttrReachable, reachable) - - sp.Attr.Set(sym.AttrReachable, reachable) -} - -func (ctxt *Link) dostrdata() { - for _, name := range strnames { - addstrdata(ctxt, name, strdata[name]) - } -} - -func Addstring(s *sym.Symbol, str string) int64 { - if s.Type == 0 { - s.Type = sym.SNOPTRDATA - } - s.Attr |= sym.AttrReachable - r := s.Size - if s.Name == ".shstrtab" { - elfsetstring(s, str, int(r)) - } - s.P = append(s.P, str...) - s.P = append(s.P, 0) - s.Size = int64(len(s.P)) - return r -} - -// addgostring adds str, as a Go string value, to s. symname is the name of the -// symbol used to define the string data and must be unique per linked object. -func addgostring(ctxt *Link, s *sym.Symbol, symname, str string) { - sdata := ctxt.Syms.Lookup(symname, 0) - if sdata.Type != sym.Sxxx { - Errorf(s, "duplicate symname in addgostring: %s", symname) - } - sdata.Attr |= sym.AttrReachable - sdata.Attr |= sym.AttrLocal - sdata.Type = sym.SRODATA - sdata.Size = int64(len(str)) - sdata.P = []byte(str) - s.AddAddr(ctxt.Arch, sdata) - s.AddUint(ctxt.Arch, uint64(len(str))) -} - -func addinitarrdata(ctxt *Link, s *sym.Symbol) { - p := s.Name + ".ptr" - sp := ctxt.Syms.Lookup(p, 0) - sp.Type = sym.SINITARR - sp.Size = 0 - sp.Attr |= sym.AttrDuplicateOK - sp.AddAddr(ctxt.Arch, s) -} - -// symalign returns the required alignment for the given symbol s. -func symalign(s *sym.Symbol) int32 { - min := int32(thearch.Minalign) - if s.Align >= min { - return s.Align - } else if s.Align != 0 { - return min - } - if strings.HasPrefix(s.Name, "go.string.") || strings.HasPrefix(s.Name, "type..namedata.") { - // String data is just bytes. - // If we align it, we waste a lot of space to padding. - return min - } - align := int32(thearch.Maxalign) - for int64(align) > s.Size && align > min { - align >>= 1 - } - s.Align = align - return align -} - -func aligndatsize(datsize int64, s *sym.Symbol) int64 { - return Rnd(datsize, int64(symalign(s))) -} - -const debugGCProg = false - -type GCProg struct { - ctxt *Link - sym *sym.Symbol - w gcprog.Writer -} - -func (p *GCProg) Init(ctxt *Link, name string) { - p.ctxt = ctxt - p.sym = ctxt.Syms.Lookup(name, 0) - p.w.Init(p.writeByte(ctxt)) - if debugGCProg { - fmt.Fprintf(os.Stderr, "ld: start GCProg %s\n", name) - p.w.Debug(os.Stderr) - } -} - -func (p *GCProg) writeByte(ctxt *Link) func(x byte) { - return func(x byte) { - p.sym.AddUint8(x) - } -} - -func (p *GCProg) End(size int64) { - p.w.ZeroUntil(size / int64(p.ctxt.Arch.PtrSize)) - p.w.End() - if debugGCProg { - fmt.Fprintf(os.Stderr, "ld: end GCProg\n") - } -} - -func (p *GCProg) AddSym(s *sym.Symbol) { - typ := s.Gotype - // Things without pointers should be in sym.SNOPTRDATA or sym.SNOPTRBSS; - // everything we see should have pointers and should therefore have a type. - if typ == nil { - switch s.Name { - case "runtime.data", "runtime.edata", "runtime.bss", "runtime.ebss": - // Ignore special symbols that are sometimes laid out - // as real symbols. See comment about dyld on darwin in - // the address function. - return - } - Errorf(s, "missing Go type information for global symbol: size %d", s.Size) - return - } - - ptrsize := int64(p.ctxt.Arch.PtrSize) - nptr := decodetypePtrdata(p.ctxt.Arch, typ.P) / ptrsize - - if debugGCProg { - fmt.Fprintf(os.Stderr, "gcprog sym: %s at %d (ptr=%d+%d)\n", s.Name, s.Value, s.Value/ptrsize, nptr) - } - - if decodetypeUsegcprog(p.ctxt.Arch, typ.P) == 0 { - // Copy pointers from mask into program. - mask := decodetypeGcmask(p.ctxt, typ) - for i := int64(0); i < nptr; i++ { - if (mask[i/8]>>uint(i%8))&1 != 0 { - p.w.Ptr(s.Value/ptrsize + i) - } - } - return - } - - // Copy program. - prog := decodetypeGcprog(p.ctxt, typ) - p.w.ZeroUntil(s.Value / ptrsize) - p.w.Append(prog[4:], nptr) -} - -// dataSortKey is used to sort a slice of data symbol *sym.Symbol pointers. -// The sort keys are kept inline to improve cache behavior while sorting. -type dataSortKey struct { - size int64 - name string - sym *sym.Symbol -} - -type bySizeAndName []dataSortKey - -func (d bySizeAndName) Len() int { return len(d) } -func (d bySizeAndName) Swap(i, j int) { d[i], d[j] = d[j], d[i] } -func (d bySizeAndName) Less(i, j int) bool { - s1, s2 := d[i], d[j] - if s1.size != s2.size { - return s1.size < s2.size - } - return s1.name < s2.name -} - -// cutoff is the maximum data section size permitted by the linker -// (see issue #9862). -const cutoff = 2e9 // 2 GB (or so; looks better in errors than 2^31) - -func checkdatsize(ctxt *Link, datsize int64, symn sym.SymKind) { - if datsize > cutoff { - Errorf(nil, "too much data in section %v (over %v bytes)", symn, cutoff) - } -} - -// datap is a collection of reachable data symbols in address order. -// Generated by dodata. -var datap []*sym.Symbol - -func (ctxt *Link) dodata() { - if (ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - // The values in moduledata are filled out by relocations - // pointing to the addresses of these special symbols. - // Typically these symbols have no size and are not laid - // out with their matching section. - // - // However on darwin, dyld will find the special symbol - // in the first loaded module, even though it is local. - // - // (An hypothesis, formed without looking in the dyld sources: - // these special symbols have no size, so their address - // matches a real symbol. The dynamic linker assumes we - // want the normal symbol with the same address and finds - // it in the other module.) - // - // To work around this we lay out the symbls whose - // addresses are vital for multi-module programs to work - // as normal symbols, and give them a little size. - // - // On AIX, as all DATA sections are merged together, ld might not put - // these symbols at the beginning of their respective section if there - // aren't real symbols, their alignment might not match the - // first symbol alignment. Therefore, there are explicitly put at the - // beginning of their section with the same alignment. - bss := ctxt.Syms.Lookup("runtime.bss", 0) - bss.Size = 8 - bss.Attr.Set(sym.AttrSpecial, false) - - ctxt.Syms.Lookup("runtime.ebss", 0).Attr.Set(sym.AttrSpecial, false) - - data := ctxt.Syms.Lookup("runtime.data", 0) - data.Size = 8 - data.Attr.Set(sym.AttrSpecial, false) - - edata := ctxt.Syms.Lookup("runtime.edata", 0) - edata.Attr.Set(sym.AttrSpecial, false) - if ctxt.HeadType == objabi.Haix { - // XCOFFTOC symbols are part of .data section. - edata.Type = sym.SXCOFFTOC - } - - types := ctxt.Syms.Lookup("runtime.types", 0) - types.Type = sym.STYPE - types.Size = 8 - types.Attr.Set(sym.AttrSpecial, false) - - etypes := ctxt.Syms.Lookup("runtime.etypes", 0) - etypes.Type = sym.SFUNCTAB - etypes.Attr.Set(sym.AttrSpecial, false) - - if ctxt.HeadType == objabi.Haix { - rodata := ctxt.Syms.Lookup("runtime.rodata", 0) - rodata.Type = sym.SSTRING - rodata.Size = 8 - rodata.Attr.Set(sym.AttrSpecial, false) - - ctxt.Syms.Lookup("runtime.erodata", 0).Attr.Set(sym.AttrSpecial, false) - - } - } - - // Collect data symbols by type into data. - var data [sym.SXREF][]*sym.Symbol - for _, s := range ctxt.Syms.Allsym { - if !s.Attr.Reachable() || s.Attr.Special() || s.Attr.SubSymbol() { - continue - } - if s.Type <= sym.STEXT || s.Type >= sym.SXREF { - continue - } - data[s.Type] = append(data[s.Type], s) - } - - // Now that we have the data symbols, but before we start - // to assign addresses, record all the necessary - // dynamic relocations. These will grow the relocation - // symbol, which is itself data. - // - // On darwin, we need the symbol table numbers for dynreloc. - if ctxt.HeadType == objabi.Hdarwin { - machosymorder(ctxt) - } - dynreloc(ctxt, &data) - - if ctxt.UseRelro() { - // "read only" data with relocations needs to go in its own section - // when building a shared library. We do this by boosting objects of - // type SXXX with relocations to type SXXXRELRO. - for _, symnro := range sym.ReadOnly { - symnrelro := sym.RelROMap[symnro] - - ro := []*sym.Symbol{} - relro := data[symnrelro] - - for _, s := range data[symnro] { - isRelro := len(s.R) > 0 - switch s.Type { - case sym.STYPE, sym.STYPERELRO, sym.SGOFUNCRELRO: - // Symbols are not sorted yet, so it is possible - // that an Outer symbol has been changed to a - // relro Type before it reaches here. - isRelro = true - case sym.SFUNCTAB: - if ctxt.HeadType == objabi.Haix && s.Name == "runtime.etypes" { - // runtime.etypes must be at the end of - // the relro datas. - isRelro = true - } - } - if isRelro { - s.Type = symnrelro - if s.Outer != nil { - s.Outer.Type = s.Type - } - relro = append(relro, s) - } else { - ro = append(ro, s) - } - } - - // Check that we haven't made two symbols with the same .Outer into - // different types (because references two symbols with non-nil Outer - // become references to the outer symbol + offset it's vital that the - // symbol and the outer end up in the same section). - for _, s := range relro { - if s.Outer != nil && s.Outer.Type != s.Type { - Errorf(s, "inconsistent types for symbol and its Outer %s (%v != %v)", - s.Outer.Name, s.Type, s.Outer.Type) - } - } - - data[symnro] = ro - data[symnrelro] = relro - } - } - - // Sort symbols. - var dataMaxAlign [sym.SXREF]int32 - var wg sync.WaitGroup - for symn := range data { - symn := sym.SymKind(symn) - wg.Add(1) - go func() { - data[symn], dataMaxAlign[symn] = dodataSect(ctxt, symn, data[symn]) - wg.Done() - }() - } - wg.Wait() - - if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal { - // These symbols must have the same alignment as their section. - // Otherwize, ld might change the layout of Go sections. - ctxt.Syms.ROLookup("runtime.data", 0).Align = dataMaxAlign[sym.SDATA] - ctxt.Syms.ROLookup("runtime.bss", 0).Align = dataMaxAlign[sym.SBSS] - } - - // Allocate sections. - // Data is processed before segtext, because we need - // to see all symbols in the .data and .bss sections in order - // to generate garbage collection information. - datsize := int64(0) - - // Writable data sections that do not need any specialized handling. - writable := []sym.SymKind{ - sym.SBUILDINFO, - sym.SELFSECT, - sym.SMACHO, - sym.SMACHOGOT, - sym.SWINDOWS, - } - for _, symn := range writable { - for _, s := range data[symn] { - sect := addsection(ctxt.Arch, &Segdata, s.Name, 06) - sect.Align = symalign(s) - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - s.Sect = sect - s.Type = sym.SDATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - sect.Length = uint64(datsize) - sect.Vaddr - } - checkdatsize(ctxt, datsize, symn) - } - - // .got (and .toc on ppc64) - if len(data[sym.SELFGOT]) > 0 { - sect := addsection(ctxt.Arch, &Segdata, ".got", 06) - sect.Align = dataMaxAlign[sym.SELFGOT] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - for _, s := range data[sym.SELFGOT] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Type = sym.SDATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - - // Resolve .TOC. symbol for this object file (ppc64) - toc := ctxt.Syms.ROLookup(".TOC.", int(s.Version)) - if toc != nil { - toc.Sect = sect - toc.Outer = s - toc.Sub = s.Sub - s.Sub = toc - - toc.Value = 0x8000 - } - - datsize += s.Size - } - checkdatsize(ctxt, datsize, sym.SELFGOT) - sect.Length = uint64(datsize) - sect.Vaddr - } - - /* pointer-free data */ - sect := addsection(ctxt.Arch, &Segdata, ".noptrdata", 06) - sect.Align = dataMaxAlign[sym.SNOPTRDATA] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - ctxt.Syms.Lookup("runtime.noptrdata", 0).Sect = sect - ctxt.Syms.Lookup("runtime.enoptrdata", 0).Sect = sect - for _, s := range data[sym.SNOPTRDATA] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Type = sym.SDATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - checkdatsize(ctxt, datsize, sym.SNOPTRDATA) - sect.Length = uint64(datsize) - sect.Vaddr - - hasinitarr := ctxt.linkShared - - /* shared library initializer */ - switch ctxt.BuildMode { - case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePlugin: - hasinitarr = true - } - - if ctxt.HeadType == objabi.Haix { - if len(data[sym.SINITARR]) > 0 { - Errorf(nil, "XCOFF format doesn't allow .init_array section") - } - } - - if hasinitarr && len(data[sym.SINITARR]) > 0 { - sect := addsection(ctxt.Arch, &Segdata, ".init_array", 06) - sect.Align = dataMaxAlign[sym.SINITARR] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - for _, s := range data[sym.SINITARR] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - sect.Length = uint64(datsize) - sect.Vaddr - checkdatsize(ctxt, datsize, sym.SINITARR) - } - - /* data */ - sect = addsection(ctxt.Arch, &Segdata, ".data", 06) - sect.Align = dataMaxAlign[sym.SDATA] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - ctxt.Syms.Lookup("runtime.data", 0).Sect = sect - ctxt.Syms.Lookup("runtime.edata", 0).Sect = sect - var gc GCProg - gc.Init(ctxt, "runtime.gcdata") - for _, s := range data[sym.SDATA] { - s.Sect = sect - s.Type = sym.SDATA - datsize = aligndatsize(datsize, s) - s.Value = int64(uint64(datsize) - sect.Vaddr) - gc.AddSym(s) - datsize += s.Size - } - gc.End(datsize - int64(sect.Vaddr)) - // On AIX, TOC entries must be the last of .data - // These aren't part of gc as they won't change during the runtime. - for _, s := range data[sym.SXCOFFTOC] { - s.Sect = sect - s.Type = sym.SDATA - datsize = aligndatsize(datsize, s) - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - checkdatsize(ctxt, datsize, sym.SDATA) - sect.Length = uint64(datsize) - sect.Vaddr - - /* bss */ - sect = addsection(ctxt.Arch, &Segdata, ".bss", 06) - sect.Align = dataMaxAlign[sym.SBSS] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - ctxt.Syms.Lookup("runtime.bss", 0).Sect = sect - ctxt.Syms.Lookup("runtime.ebss", 0).Sect = sect - gc = GCProg{} - gc.Init(ctxt, "runtime.gcbss") - for _, s := range data[sym.SBSS] { - s.Sect = sect - datsize = aligndatsize(datsize, s) - s.Value = int64(uint64(datsize) - sect.Vaddr) - gc.AddSym(s) - datsize += s.Size - } - checkdatsize(ctxt, datsize, sym.SBSS) - sect.Length = uint64(datsize) - sect.Vaddr - gc.End(int64(sect.Length)) - - /* pointer-free bss */ - sect = addsection(ctxt.Arch, &Segdata, ".noptrbss", 06) - sect.Align = dataMaxAlign[sym.SNOPTRBSS] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - ctxt.Syms.Lookup("runtime.noptrbss", 0).Sect = sect - ctxt.Syms.Lookup("runtime.enoptrbss", 0).Sect = sect - for _, s := range data[sym.SNOPTRBSS] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - sect.Length = uint64(datsize) - sect.Vaddr - ctxt.Syms.Lookup("runtime.end", 0).Sect = sect - checkdatsize(ctxt, datsize, sym.SNOPTRBSS) - - // Coverage instrumentation counters for libfuzzer. - if len(data[sym.SLIBFUZZER_EXTRA_COUNTER]) > 0 { - sect := addsection(ctxt.Arch, &Segdata, "__libfuzzer_extra_counters", 06) - sect.Align = dataMaxAlign[sym.SLIBFUZZER_EXTRA_COUNTER] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - for _, s := range data[sym.SLIBFUZZER_EXTRA_COUNTER] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - sect.Length = uint64(datsize) - sect.Vaddr - checkdatsize(ctxt, datsize, sym.SLIBFUZZER_EXTRA_COUNTER) - } - - if len(data[sym.STLSBSS]) > 0 { - var sect *sym.Section - if (ctxt.IsELF || ctxt.HeadType == objabi.Haix) && (ctxt.LinkMode == LinkExternal || !*FlagD) { - sect = addsection(ctxt.Arch, &Segdata, ".tbss", 06) - sect.Align = int32(ctxt.Arch.PtrSize) - sect.Vaddr = 0 - } - datsize = 0 - - for _, s := range data[sym.STLSBSS] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Value = datsize - datsize += s.Size - } - checkdatsize(ctxt, datsize, sym.STLSBSS) - - if sect != nil { - sect.Length = uint64(datsize) - } - } - - /* - * We finished data, begin read-only data. - * Not all systems support a separate read-only non-executable data section. - * ELF and Windows PE systems do. - * OS X and Plan 9 do not. - * And if we're using external linking mode, the point is moot, - * since it's not our decision; that code expects the sections in - * segtext. - */ - var segro *sym.Segment - if ctxt.IsELF && ctxt.LinkMode == LinkInternal { - segro = &Segrodata - } else if ctxt.HeadType == objabi.Hwindows { - segro = &Segrodata - } else { - segro = &Segtext - } - - datsize = 0 - - /* read-only executable ELF, Mach-O sections */ - if len(data[sym.STEXT]) != 0 { - Errorf(nil, "dodata found an sym.STEXT symbol: %s", data[sym.STEXT][0].Name) - } - for _, s := range data[sym.SELFRXSECT] { - sect := addsection(ctxt.Arch, &Segtext, s.Name, 04) - sect.Align = symalign(s) - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - sect.Length = uint64(datsize) - sect.Vaddr - checkdatsize(ctxt, datsize, sym.SELFRXSECT) - } - - /* read-only data */ - sect = addsection(ctxt.Arch, segro, ".rodata", 04) - - sect.Vaddr = 0 - ctxt.Syms.Lookup("runtime.rodata", 0).Sect = sect - ctxt.Syms.Lookup("runtime.erodata", 0).Sect = sect - if !ctxt.UseRelro() { - ctxt.Syms.Lookup("runtime.types", 0).Sect = sect - ctxt.Syms.Lookup("runtime.etypes", 0).Sect = sect - } - for _, symn := range sym.ReadOnly { - align := dataMaxAlign[symn] - if sect.Align < align { - sect.Align = align - } - } - datsize = Rnd(datsize, int64(sect.Align)) - for _, symn := range sym.ReadOnly { - symnStartValue := datsize - for _, s := range data[symn] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - checkdatsize(ctxt, datsize, symn) - if ctxt.HeadType == objabi.Haix { - // Read-only symbols might be wrapped inside their outer - // symbol. - // XCOFF symbol table needs to know the size of - // these outer symbols. - xcoffUpdateOuterSize(ctxt, datsize-symnStartValue, symn) - } - } - sect.Length = uint64(datsize) - sect.Vaddr - - /* read-only ELF, Mach-O sections */ - for _, s := range data[sym.SELFROSECT] { - sect = addsection(ctxt.Arch, segro, s.Name, 04) - sect.Align = symalign(s) - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - sect.Length = uint64(datsize) - sect.Vaddr - } - checkdatsize(ctxt, datsize, sym.SELFROSECT) - - for _, s := range data[sym.SMACHOPLT] { - sect = addsection(ctxt.Arch, segro, s.Name, 04) - sect.Align = symalign(s) - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - sect.Length = uint64(datsize) - sect.Vaddr - } - checkdatsize(ctxt, datsize, sym.SMACHOPLT) - - // There is some data that are conceptually read-only but are written to by - // relocations. On GNU systems, we can arrange for the dynamic linker to - // mprotect sections after relocations are applied by giving them write - // permissions in the object file and calling them ".data.rel.ro.FOO". We - // divide the .rodata section between actual .rodata and .data.rel.ro.rodata, - // but for the other sections that this applies to, we just write a read-only - // .FOO section or a read-write .data.rel.ro.FOO section depending on the - // situation. - // TODO(mwhudson): It would make sense to do this more widely, but it makes - // the system linker segfault on darwin. - addrelrosection := func(suffix string) *sym.Section { - return addsection(ctxt.Arch, segro, suffix, 04) - } - - if ctxt.UseRelro() { - segrelro := &Segrelrodata - if ctxt.LinkMode == LinkExternal && ctxt.HeadType != objabi.Haix { - // Using a separate segment with an external - // linker results in some programs moving - // their data sections unexpectedly, which - // corrupts the moduledata. So we use the - // rodata segment and let the external linker - // sort out a rel.ro segment. - segrelro = segro - } else { - // Reset datsize for new segment. - datsize = 0 - } - - addrelrosection = func(suffix string) *sym.Section { - return addsection(ctxt.Arch, segrelro, ".data.rel.ro"+suffix, 06) - } - - /* data only written by relocations */ - sect = addrelrosection("") - - ctxt.Syms.Lookup("runtime.types", 0).Sect = sect - ctxt.Syms.Lookup("runtime.etypes", 0).Sect = sect - - for _, symnro := range sym.ReadOnly { - symn := sym.RelROMap[symnro] - align := dataMaxAlign[symn] - if sect.Align < align { - sect.Align = align - } - } - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - - for i, symnro := range sym.ReadOnly { - if i == 0 && symnro == sym.STYPE && ctxt.HeadType != objabi.Haix { - // Skip forward so that no type - // reference uses a zero offset. - // This is unlikely but possible in small - // programs with no other read-only data. - datsize++ - } - - symn := sym.RelROMap[symnro] - symnStartValue := datsize - for _, s := range data[symn] { - datsize = aligndatsize(datsize, s) - if s.Outer != nil && s.Outer.Sect != nil && s.Outer.Sect != sect { - Errorf(s, "s.Outer (%s) in different section from s, %s != %s", s.Outer.Name, s.Outer.Sect.Name, sect.Name) - } - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - checkdatsize(ctxt, datsize, symn) - if ctxt.HeadType == objabi.Haix { - // Read-only symbols might be wrapped inside their outer - // symbol. - // XCOFF symbol table needs to know the size of - // these outer symbols. - xcoffUpdateOuterSize(ctxt, datsize-symnStartValue, symn) - } - } - - sect.Length = uint64(datsize) - sect.Vaddr - } - - /* typelink */ - sect = addrelrosection(".typelink") - sect.Align = dataMaxAlign[sym.STYPELINK] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - typelink := ctxt.Syms.Lookup("runtime.typelink", 0) - typelink.Sect = sect - typelink.Type = sym.SRODATA - datsize += typelink.Size - checkdatsize(ctxt, datsize, sym.STYPELINK) - sect.Length = uint64(datsize) - sect.Vaddr - - /* itablink */ - sect = addrelrosection(".itablink") - sect.Align = dataMaxAlign[sym.SITABLINK] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - ctxt.Syms.Lookup("runtime.itablink", 0).Sect = sect - ctxt.Syms.Lookup("runtime.eitablink", 0).Sect = sect - for _, s := range data[sym.SITABLINK] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - checkdatsize(ctxt, datsize, sym.SITABLINK) - sect.Length = uint64(datsize) - sect.Vaddr - if ctxt.HeadType == objabi.Haix { - // Store .itablink size because its symbols are wrapped - // under an outer symbol: runtime.itablink. - xcoffUpdateOuterSize(ctxt, int64(sect.Length), sym.SITABLINK) - } - - /* gosymtab */ - sect = addrelrosection(".gosymtab") - sect.Align = dataMaxAlign[sym.SSYMTAB] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - ctxt.Syms.Lookup("runtime.symtab", 0).Sect = sect - ctxt.Syms.Lookup("runtime.esymtab", 0).Sect = sect - for _, s := range data[sym.SSYMTAB] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - checkdatsize(ctxt, datsize, sym.SSYMTAB) - sect.Length = uint64(datsize) - sect.Vaddr - - /* gopclntab */ - sect = addrelrosection(".gopclntab") - sect.Align = dataMaxAlign[sym.SPCLNTAB] - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - ctxt.Syms.Lookup("runtime.pclntab", 0).Sect = sect - ctxt.Syms.Lookup("runtime.epclntab", 0).Sect = sect - for _, s := range data[sym.SPCLNTAB] { - datsize = aligndatsize(datsize, s) - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - } - checkdatsize(ctxt, datsize, sym.SRODATA) - sect.Length = uint64(datsize) - sect.Vaddr - - // 6g uses 4-byte relocation offsets, so the entire segment must fit in 32 bits. - if datsize != int64(uint32(datsize)) { - Errorf(nil, "read-only data segment too large: %d", datsize) - } - - for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ { - datap = append(datap, data[symn]...) - } - - dwarfGenerateDebugSyms(ctxt) - - var i int - for ; i < len(dwarfp); i++ { - s := dwarfp[i] - if s.Type != sym.SDWARFSECT { - break - } - - sect = addsection(ctxt.Arch, &Segdwarf, s.Name, 04) - sect.Align = 1 - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - datsize += s.Size - sect.Length = uint64(datsize) - sect.Vaddr - } - checkdatsize(ctxt, datsize, sym.SDWARFSECT) - - for i < len(dwarfp) { - curType := dwarfp[i].Type - var sect *sym.Section - switch curType { - case sym.SDWARFINFO: - sect = addsection(ctxt.Arch, &Segdwarf, ".debug_info", 04) - case sym.SDWARFRANGE: - sect = addsection(ctxt.Arch, &Segdwarf, ".debug_ranges", 04) - case sym.SDWARFLOC: - sect = addsection(ctxt.Arch, &Segdwarf, ".debug_loc", 04) - default: - // Error is unrecoverable, so panic. - panic(fmt.Sprintf("unknown DWARF section %v", curType)) - } - - sect.Align = 1 - datsize = Rnd(datsize, int64(sect.Align)) - sect.Vaddr = uint64(datsize) - for ; i < len(dwarfp); i++ { - s := dwarfp[i] - if s.Type != curType { - break - } - s.Sect = sect - s.Type = sym.SRODATA - s.Value = int64(uint64(datsize) - sect.Vaddr) - s.Attr |= sym.AttrLocal - datsize += s.Size - - if ctxt.HeadType == objabi.Haix && curType == sym.SDWARFLOC { - // Update the size of .debug_loc for this symbol's - // package. - addDwsectCUSize(".debug_loc", s.File, uint64(s.Size)) - } - } - sect.Length = uint64(datsize) - sect.Vaddr - checkdatsize(ctxt, datsize, curType) - } - - /* number the sections */ - n := int32(1) - - for _, sect := range Segtext.Sections { - sect.Extnum = int16(n) - n++ - } - for _, sect := range Segrodata.Sections { - sect.Extnum = int16(n) - n++ - } - for _, sect := range Segrelrodata.Sections { - sect.Extnum = int16(n) - n++ - } - for _, sect := range Segdata.Sections { - sect.Extnum = int16(n) - n++ - } - for _, sect := range Segdwarf.Sections { - sect.Extnum = int16(n) - n++ - } -} - -func dodataSect(ctxt *Link, symn sym.SymKind, syms []*sym.Symbol) (result []*sym.Symbol, maxAlign int32) { - if ctxt.HeadType == objabi.Hdarwin { - // Some symbols may no longer belong in syms - // due to movement in machosymorder. - newSyms := make([]*sym.Symbol, 0, len(syms)) - for _, s := range syms { - if s.Type == symn { - newSyms = append(newSyms, s) - } - } - syms = newSyms - } - - var head, tail *sym.Symbol - symsSort := make([]dataSortKey, 0, len(syms)) - for _, s := range syms { - if s.Attr.OnList() { - log.Fatalf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - switch { - case s.Size < int64(len(s.P)): - Errorf(s, "initialize bounds (%d < %d)", s.Size, len(s.P)) - case s.Size < 0: - Errorf(s, "negative size (%d bytes)", s.Size) - case s.Size > cutoff: - Errorf(s, "symbol too large (%d bytes)", s.Size) - } - - // If the usually-special section-marker symbols are being laid - // out as regular symbols, put them either at the beginning or - // end of their section. - if (ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - switch s.Name { - case "runtime.text", "runtime.bss", "runtime.data", "runtime.types", "runtime.rodata": - head = s - continue - case "runtime.etext", "runtime.ebss", "runtime.edata", "runtime.etypes", "runtime.erodata": - tail = s - continue - } - } - - key := dataSortKey{ - size: s.Size, - name: s.Name, - sym: s, - } - - switch s.Type { - case sym.SELFGOT: - // 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). - key.size = 0 - } - - symsSort = append(symsSort, key) - } - - sort.Sort(bySizeAndName(symsSort)) - - off := 0 - if head != nil { - syms[0] = head - off++ - } - for i, symSort := range symsSort { - syms[i+off] = symSort.sym - align := symalign(symSort.sym) - if maxAlign < align { - maxAlign = align - } - } - if tail != nil { - syms[len(syms)-1] = tail - } - - if ctxt.IsELF && symn == sym.SELFROSECT { - // Make .rela and .rela.plt contiguous, the ELF ABI requires this - // and Solaris actually cares. - reli, plti := -1, -1 - for i, s := range syms { - switch s.Name { - case ".rel.plt", ".rela.plt": - plti = i - case ".rel", ".rela": - reli = i - } - } - if reli >= 0 && plti >= 0 && plti != reli+1 { - var first, second int - if plti > reli { - first, second = reli, plti - } else { - first, second = plti, reli - } - rel, plt := syms[reli], syms[plti] - copy(syms[first+2:], syms[first+1:second]) - syms[first+0] = rel - syms[first+1] = plt - - // Make sure alignment doesn't introduce a gap. - // Setting the alignment explicitly prevents - // symalign from basing it on the size and - // getting it wrong. - rel.Align = int32(ctxt.Arch.RegSize) - plt.Align = int32(ctxt.Arch.RegSize) - } - } - - return syms, maxAlign -} - -// Add buildid to beginning of text segment, on non-ELF systems. -// Non-ELF binary formats are not always flexible enough to -// give us a place to put the Go build ID. On those systems, we put it -// 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 == "" { - return - } - - s := ctxt.Syms.Lookup("go.buildid", 0) - s.Attr |= sym.AttrReachable - // The \xff is invalid UTF-8, meant to make it less likely - // to find one of these accidentally. - data := "\xff Go build ID: " + strconv.Quote(*flagBuildid) + "\n \xff" - s.Type = sym.STEXT - s.P = []byte(data) - s.Size = int64(len(s.P)) - - ctxt.Textp = append(ctxt.Textp, nil) - copy(ctxt.Textp[1:], ctxt.Textp) - ctxt.Textp[0] = s -} - -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 - } - - s := ctxt.Syms.Lookup(".go.buildinfo", 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SBUILDINFO - s.Align = 16 - // The \xff is invalid UTF-8, meant to make it less likely - // to find one of these accidentally. - const prefix = "\xff Go buildinf:" // 14 bytes, plus 2 data bytes filled in below - data := make([]byte, 32) - copy(data, prefix) - data[len(prefix)] = byte(ctxt.Arch.PtrSize) - data[len(prefix)+1] = 0 - if ctxt.Arch.ByteOrder == binary.BigEndian { - data[len(prefix)+1] = 1 - } - s.P = data - s.Size = int64(len(s.P)) - s1 := ctxt.Syms.Lookup("runtime.buildVersion", 0) - s2 := ctxt.Syms.Lookup("runtime.modinfo", 0) - s.R = []sym.Reloc{ - {Off: 16, Siz: uint8(ctxt.Arch.PtrSize), Type: objabi.R_ADDR, Sym: s1}, - {Off: 16 + int32(ctxt.Arch.PtrSize), Siz: uint8(ctxt.Arch.PtrSize), Type: objabi.R_ADDR, Sym: s2}, - } -} - -// assign addresses to text -func (ctxt *Link) textaddress() { - addsection(ctxt.Arch, &Segtext, ".text", 05) - - // Assign PCs in text segment. - // Could parallelize, by assigning to text - // and then letting threads copy down, but probably not worth it. - sect := Segtext.Sections[0] - - sect.Align = int32(Funcalign) - - text := ctxt.Syms.Lookup("runtime.text", 0) - text.Sect = sect - if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal { - // Setting runtime.text has a real symbol prevents ld to - // change its base address resulting in wrong offsets for - // reflect methods. - text.Align = sect.Align - text.Size = 0x8 - } - - if (ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - etext := ctxt.Syms.Lookup("runtime.etext", 0) - etext.Sect = sect - - ctxt.Textp = append(ctxt.Textp, etext, nil) - copy(ctxt.Textp[1:], ctxt.Textp) - ctxt.Textp[0] = text - } - - va := uint64(*FlagTextAddr) - n := 1 - sect.Vaddr = va - ntramps := 0 - for _, s := range ctxt.Textp { - sect, n, va = assignAddress(ctxt, sect, n, s, va, false) - - trampoline(ctxt, s) // resolve jumps, may add trampolines if jump too far - - // lay down trampolines after each function - for ; ntramps < len(ctxt.tramps); ntramps++ { - tramp := ctxt.tramps[ntramps] - if ctxt.HeadType == objabi.Haix && strings.HasPrefix(tramp.Name, "runtime.text.") { - // Already set in assignAddress - continue - } - sect, n, va = assignAddress(ctxt, sect, n, tramp, va, true) - } - } - - sect.Length = va - sect.Vaddr - ctxt.Syms.Lookup("runtime.etext", 0).Sect = sect - - // merge tramps into Textp, keeping Textp in address order - if ntramps != 0 { - newtextp := make([]*sym.Symbol, 0, len(ctxt.Textp)+ntramps) - i := 0 - for _, s := range ctxt.Textp { - for ; i < ntramps && ctxt.tramps[i].Value < s.Value; i++ { - newtextp = append(newtextp, ctxt.tramps[i]) - } - newtextp = append(newtextp, s) - } - newtextp = append(newtextp, ctxt.tramps[i:ntramps]...) - - ctxt.Textp = newtextp - } -} - -// assigns address for a text symbol, returns (possibly new) section, its number, and the address -// Note: once we have trampoline insertion support for external linking, this function -// will not need to create new text sections, and so no need to return sect and n. -func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint64, isTramp bool) (*sym.Section, int, uint64) { - if thearch.AssignAddress != nil { - return thearch.AssignAddress(ctxt, sect, n, s, va, isTramp) - } - - s.Sect = sect - if s.Attr.SubSymbol() { - return sect, n, va - } - if s.Align != 0 { - va = uint64(Rnd(int64(va), int64(s.Align))) - } else { - va = uint64(Rnd(int64(va), int64(Funcalign))) - } - - funcsize := uint64(MINFUNC) // spacing required for findfunctab - if s.Size > MINFUNC { - funcsize = uint64(s.Size) - } - - if sect.Align < s.Align { - sect.Align = s.Align - } - - // On ppc64x a text section should not be larger than 2^26 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 GNU linker to modify the long calls - // appropriately. The limit allows for the space needed for tables inserted by the linker. - - // If this function doesn't fit in the current text section, then create a new one. - - // Only break at outermost syms. - - if ctxt.Arch.InFamily(sys.PPC64) && s.Outer == nil && ctxt.LinkMode == LinkExternal && va-sect.Vaddr+funcsize+maxSizeTrampolinesPPC64(s, isTramp) > 0x1c00000 { - // Set the length for the previous text section - sect.Length = va - sect.Vaddr - - // Create new section, set the starting Vaddr - sect = addsection(ctxt.Arch, &Segtext, ".text", 05) - sect.Vaddr = va - s.Sect = sect - - // Create a symbol for the start of the secondary text sections - ntext := ctxt.Syms.Lookup(fmt.Sprintf("runtime.text.%d", n), 0) - ntext.Sect = sect - if ctxt.HeadType == objabi.Haix { - // runtime.text.X must be a real symbol on AIX. - // Assign its address directly in order to be the - // first symbol of this new section. - ntext.Type = sym.STEXT - ntext.Size = int64(MINFUNC) - ntext.Attr |= sym.AttrReachable - ntext.Attr |= sym.AttrOnList - ctxt.tramps = append(ctxt.tramps, ntext) - - ntext.Value = int64(va) - va += uint64(ntext.Size) - - if s.Align != 0 { - va = uint64(Rnd(int64(va), int64(s.Align))) - } else { - va = uint64(Rnd(int64(va), int64(Funcalign))) - } - } - n++ - } - - s.Value = 0 - for sub := s; sub != nil; sub = sub.Sub { - sub.Value += int64(va) - } - - va += funcsize - - return sect, n, va -} - -// address assigns virtual addresses to all segments and sections and -// returns all segments in file order. -func (ctxt *Link) address() []*sym.Segment { - var order []*sym.Segment // Layout order - - va := uint64(*FlagTextAddr) - order = append(order, &Segtext) - Segtext.Rwx = 05 - Segtext.Vaddr = va - for _, s := range Segtext.Sections { - va = uint64(Rnd(int64(va), int64(s.Align))) - s.Vaddr = va - va += s.Length - } - - Segtext.Length = va - uint64(*FlagTextAddr) - - if len(Segrodata.Sections) > 0 { - // align to page boundary so as not to mix - // rodata and executable text. - // - // Note: gold or GNU ld will reduce the size of the executable - // file by arranging for the relro segment to end at a page - // boundary, and overlap the end of the text segment with the - // start of the relro segment in the file. The PT_LOAD segments - // will be such that the last page of the text segment will be - // mapped twice, once r-x and once starting out rw- and, after - // relocation processing, changed to r--. - // - // Ideally the last page of the text segment would not be - // writable even for this short period. - va = uint64(Rnd(int64(va), int64(*FlagRound))) - - order = append(order, &Segrodata) - Segrodata.Rwx = 04 - Segrodata.Vaddr = va - for _, s := range Segrodata.Sections { - va = uint64(Rnd(int64(va), int64(s.Align))) - s.Vaddr = va - va += s.Length - } - - Segrodata.Length = va - Segrodata.Vaddr - } - if len(Segrelrodata.Sections) > 0 { - // align to page boundary so as not to mix - // rodata, rel-ro data, and executable text. - va = uint64(Rnd(int64(va), int64(*FlagRound))) - if ctxt.HeadType == objabi.Haix { - // Relro data are inside data segment on AIX. - va += uint64(XCOFFDATABASE) - uint64(XCOFFTEXTBASE) - } - - order = append(order, &Segrelrodata) - Segrelrodata.Rwx = 06 - Segrelrodata.Vaddr = va - for _, s := range Segrelrodata.Sections { - va = uint64(Rnd(int64(va), int64(s.Align))) - s.Vaddr = va - va += s.Length - } - - Segrelrodata.Length = va - Segrelrodata.Vaddr - } - - va = uint64(Rnd(int64(va), int64(*FlagRound))) - if ctxt.HeadType == objabi.Haix && len(Segrelrodata.Sections) == 0 { - // Data sections are moved to an unreachable segment - // to ensure that they are position-independent. - // Already done if relro sections exist. - va += uint64(XCOFFDATABASE) - uint64(XCOFFTEXTBASE) - } - order = append(order, &Segdata) - Segdata.Rwx = 06 - Segdata.Vaddr = va - var data *sym.Section - var noptr *sym.Section - var bss *sym.Section - var noptrbss *sym.Section - for i, s := range Segdata.Sections { - if (ctxt.IsELF || ctxt.HeadType == objabi.Haix) && s.Name == ".tbss" { - continue - } - vlen := int64(s.Length) - if i+1 < len(Segdata.Sections) && !((ctxt.IsELF || ctxt.HeadType == objabi.Haix) && Segdata.Sections[i+1].Name == ".tbss") { - vlen = int64(Segdata.Sections[i+1].Vaddr - s.Vaddr) - } - s.Vaddr = va - va += uint64(vlen) - Segdata.Length = va - Segdata.Vaddr - if s.Name == ".data" { - data = s - } - if s.Name == ".noptrdata" { - noptr = s - } - if s.Name == ".bss" { - bss = s - } - if s.Name == ".noptrbss" { - noptrbss = s - } - } - - // Assign Segdata's Filelen omitting the BSS. We do this here - // simply because right now we know where the BSS starts. - Segdata.Filelen = bss.Vaddr - Segdata.Vaddr - - va = uint64(Rnd(int64(va), int64(*FlagRound))) - order = append(order, &Segdwarf) - Segdwarf.Rwx = 06 - Segdwarf.Vaddr = va - for i, s := range Segdwarf.Sections { - vlen := int64(s.Length) - if i+1 < len(Segdwarf.Sections) { - vlen = int64(Segdwarf.Sections[i+1].Vaddr - s.Vaddr) - } - s.Vaddr = va - va += uint64(vlen) - if ctxt.HeadType == objabi.Hwindows { - va = uint64(Rnd(int64(va), PEFILEALIGN)) - } - Segdwarf.Length = va - Segdwarf.Vaddr - } - - var ( - text = Segtext.Sections[0] - rodata = ctxt.Syms.Lookup("runtime.rodata", 0).Sect - itablink = ctxt.Syms.Lookup("runtime.itablink", 0).Sect - symtab = ctxt.Syms.Lookup("runtime.symtab", 0).Sect - pclntab = ctxt.Syms.Lookup("runtime.pclntab", 0).Sect - types = ctxt.Syms.Lookup("runtime.types", 0).Sect - ) - lasttext := text - // Could be multiple .text sections - for _, sect := range Segtext.Sections { - if sect.Name == ".text" { - lasttext = sect - } - } - - for _, s := range datap { - if s.Sect != nil { - s.Value += int64(s.Sect.Vaddr) - } - for sub := s.Sub; sub != nil; sub = sub.Sub { - sub.Value += s.Value - } - } - - for _, s := range dwarfp { - if s.Sect != nil { - s.Value += int64(s.Sect.Vaddr) - } - for sub := s.Sub; sub != nil; sub = sub.Sub { - sub.Value += s.Value - } - } - - if ctxt.BuildMode == BuildModeShared { - s := ctxt.Syms.Lookup("go.link.abihashbytes", 0) - sectSym := ctxt.Syms.Lookup(".note.go.abihash", 0) - s.Sect = sectSym.Sect - s.Value = int64(sectSym.Sect.Vaddr + 16) - } - - ctxt.xdefine("runtime.text", sym.STEXT, int64(text.Vaddr)) - ctxt.xdefine("runtime.etext", sym.STEXT, int64(lasttext.Vaddr+lasttext.Length)) - - // If there are multiple text sections, create runtime.text.n for - // their section Vaddr, using n for index - n := 1 - for _, sect := range Segtext.Sections[1:] { - if sect.Name != ".text" { - break - } - symname := fmt.Sprintf("runtime.text.%d", n) - if ctxt.HeadType != objabi.Haix || ctxt.LinkMode != LinkExternal { - // Addresses are already set on AIX with external linker - // because these symbols are part of their sections. - ctxt.xdefine(symname, sym.STEXT, int64(sect.Vaddr)) - } - n++ - } - - ctxt.xdefine("runtime.rodata", sym.SRODATA, int64(rodata.Vaddr)) - ctxt.xdefine("runtime.erodata", sym.SRODATA, int64(rodata.Vaddr+rodata.Length)) - ctxt.xdefine("runtime.types", sym.SRODATA, int64(types.Vaddr)) - ctxt.xdefine("runtime.etypes", sym.SRODATA, int64(types.Vaddr+types.Length)) - ctxt.xdefine("runtime.itablink", sym.SRODATA, int64(itablink.Vaddr)) - ctxt.xdefine("runtime.eitablink", sym.SRODATA, int64(itablink.Vaddr+itablink.Length)) - - s := ctxt.Syms.Lookup("runtime.gcdata", 0) - s.Attr |= sym.AttrLocal - ctxt.xdefine("runtime.egcdata", sym.SRODATA, Symaddr(s)+s.Size) - ctxt.Syms.Lookup("runtime.egcdata", 0).Sect = s.Sect - - s = ctxt.Syms.Lookup("runtime.gcbss", 0) - s.Attr |= sym.AttrLocal - ctxt.xdefine("runtime.egcbss", sym.SRODATA, Symaddr(s)+s.Size) - ctxt.Syms.Lookup("runtime.egcbss", 0).Sect = s.Sect - - ctxt.xdefine("runtime.symtab", sym.SRODATA, int64(symtab.Vaddr)) - ctxt.xdefine("runtime.esymtab", sym.SRODATA, int64(symtab.Vaddr+symtab.Length)) - ctxt.xdefine("runtime.pclntab", sym.SRODATA, int64(pclntab.Vaddr)) - ctxt.xdefine("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length)) - ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr)) - ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr+noptr.Length)) - ctxt.xdefine("runtime.bss", sym.SBSS, int64(bss.Vaddr)) - ctxt.xdefine("runtime.ebss", sym.SBSS, int64(bss.Vaddr+bss.Length)) - ctxt.xdefine("runtime.data", sym.SDATA, int64(data.Vaddr)) - ctxt.xdefine("runtime.edata", sym.SDATA, int64(data.Vaddr+data.Length)) - ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr)) - ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length)) - ctxt.xdefine("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.Length)) - - return order -} - -// layout assigns file offsets and lengths to the segments in order. -// Returns the file size containing all the segments. -func (ctxt *Link) layout(order []*sym.Segment) uint64 { - var prev *sym.Segment - for _, seg := range order { - if prev == nil { - seg.Fileoff = uint64(HEADR) - } else { - switch ctxt.HeadType { - default: - // Assuming the previous segment was - // aligned, the following rounding - // should ensure that this segment's - // VA ≡ Fileoff mod FlagRound. - seg.Fileoff = uint64(Rnd(int64(prev.Fileoff+prev.Filelen), int64(*FlagRound))) - if seg.Vaddr%uint64(*FlagRound) != seg.Fileoff%uint64(*FlagRound) { - Exitf("bad segment rounding (Vaddr=%#x Fileoff=%#x FlagRound=%#x)", seg.Vaddr, seg.Fileoff, *FlagRound) - } - case objabi.Hwindows: - seg.Fileoff = prev.Fileoff + uint64(Rnd(int64(prev.Filelen), PEFILEALIGN)) - case objabi.Hplan9: - seg.Fileoff = prev.Fileoff + prev.Filelen - } - } - if seg != &Segdata { - // Link.address already set Segdata.Filelen to - // account for BSS. - seg.Filelen = seg.Length - } - prev = seg - } - return prev.Fileoff + prev.Filelen -} - -// add a trampoline with symbol s (to be laid down after the current function) -func (ctxt *Link) AddTramp(s *sym.Symbol) { - s.Type = sym.STEXT - s.Attr |= sym.AttrReachable - s.Attr |= sym.AttrOnList - ctxt.tramps = append(ctxt.tramps, s) - if *FlagDebugTramp > 0 && ctxt.Debugvlog > 0 { - ctxt.Logf("trampoline %s inserted\n", s) - } -} - -// compressSyms compresses syms and returns the contents of the -// compressed section. If the section would get larger, it returns nil. -func compressSyms(ctxt *Link, syms []*sym.Symbol) []byte { - var total int64 - for _, sym := range syms { - total += sym.Size - } - - var buf bytes.Buffer - buf.Write([]byte("ZLIB")) - var sizeBytes [8]byte - binary.BigEndian.PutUint64(sizeBytes[:], uint64(total)) - buf.Write(sizeBytes[:]) - - // Using zlib.BestSpeed achieves very nearly the same - // compression levels of zlib.DefaultCompression, but takes - // substantially less time. This is important because DWARF - // compression can be a significant fraction of link time. - z, err := zlib.NewWriterLevel(&buf, zlib.BestSpeed) - if err != nil { - log.Fatalf("NewWriterLevel failed: %s", err) - } - for _, s := range syms { - // s.P may be read-only. Apply relocations in a - // temporary buffer, and immediately write it out. - oldP := s.P - wasReadOnly := s.Attr.ReadOnly() - if len(s.R) != 0 && wasReadOnly { - ctxt.relocbuf = append(ctxt.relocbuf[:0], s.P...) - s.P = ctxt.relocbuf - s.Attr.Set(sym.AttrReadOnly, false) - } - relocsym(ctxt, s) - if _, err := z.Write(s.P); err != nil { - log.Fatalf("compression failed: %s", err) - } - for i := s.Size - int64(len(s.P)); i > 0; { - b := zeros[:] - if i < int64(len(b)) { - b = b[:i] - } - n, err := z.Write(b) - if err != nil { - log.Fatalf("compression failed: %s", err) - } - i -= int64(n) - } - // Restore s.P if a temporary buffer was used. If compression - // is not beneficial, we'll go back to use the uncompressed - // contents, in which case we still need s.P. - if len(s.R) != 0 && wasReadOnly { - s.P = oldP - s.Attr.Set(sym.AttrReadOnly, wasReadOnly) - for i := range s.R { - s.R[i].Done = false - } - } - } - if err := z.Close(); err != nil { - log.Fatalf("compression failed: %s", err) - } - if int64(buf.Len()) >= total { - // Compression didn't save any space. - return nil - } - return buf.Bytes() -} diff --git a/src/cmd/oldlink/internal/ld/deadcode.go b/src/cmd/oldlink/internal/ld/deadcode.go deleted file mode 100644 index 6a6813aa58..0000000000 --- a/src/cmd/oldlink/internal/ld/deadcode.go +++ /dev/null @@ -1,409 +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 ld - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "fmt" - "strings" - "unicode" -) - -// deadcode marks all reachable symbols. -// -// The basis of the dead code elimination is a flood fill of symbols, -// following their relocations, beginning at *flagEntrySymbol. -// -// This flood fill is wrapped in logic for pruning unused methods. -// All methods are mentioned by relocations on their receiver's *rtype. -// These relocations are specially defined as R_METHODOFF by the compiler -// so we can detect and manipulated them here. -// -// There are three ways a method of a reachable type can be invoked: -// -// 1. direct call -// 2. through a reachable interface type -// 3. reflect.Value.Method (or MethodByName), or reflect.Type.Method -// (or MethodByName) -// -// The first case is handled by the flood fill, a directly called method -// is marked as reachable. -// -// The second case is handled by decomposing all reachable interface -// types into method signatures. Each encountered method is compared -// against the interface method signatures, if it matches it is marked -// as reachable. This is extremely conservative, but easy and correct. -// -// The third case is handled by looking to see if any of: -// - reflect.Value.Method or MethodByName is reachable -// - reflect.Type.Method or MethodByName is called (through the -// REFLECTMETHOD attribute marked by the compiler). -// If any of these happen, all bets are off and all exported methods -// of reachable types are marked reachable. -// -// Any unreached text symbols are removed from ctxt.Textp. -func deadcode(ctxt *Link) { - if ctxt.Debugvlog != 0 { - ctxt.Logf("deadcode\n") - } - - if *flagNewobj { - deadcode2(ctxt) - return - } - - d := &deadcodepass{ - ctxt: ctxt, - ifaceMethod: make(map[methodsig]bool), - } - - // First, flood fill any symbols directly reachable in the call - // graph from *flagEntrySymbol. Ignore all methods not directly called. - d.init() - d.flood() - - methSym := ctxt.Syms.ROLookup("reflect.Value.Method", sym.SymVerABIInternal) - methByNameSym := ctxt.Syms.ROLookup("reflect.Value.MethodByName", sym.SymVerABIInternal) - reflectSeen := false - - if ctxt.DynlinkingGo() { - // Exported methods may satisfy interfaces we don't know - // about yet when dynamically linking. - reflectSeen = true - } - - for { - if !reflectSeen { - if d.reflectMethod || (methSym != nil && methSym.Attr.Reachable()) || (methByNameSym != nil && methByNameSym.Attr.Reachable()) { - // Methods might be called via reflection. Give up on - // static analysis, mark all exported methods of - // all reachable types as reachable. - reflectSeen = true - } - } - - // Mark all methods that could satisfy a discovered - // interface as reachable. We recheck old marked interfaces - // as new types (with new methods) may have been discovered - // in the last pass. - var rem []methodref - for _, m := range d.markableMethods { - if (reflectSeen && m.isExported()) || d.ifaceMethod[m.m] { - d.markMethod(m) - } else { - rem = append(rem, m) - } - } - d.markableMethods = rem - - if len(d.markQueue) == 0 { - // No new work was discovered. Done. - break - } - d.flood() - } - - // Remove all remaining unreached R_METHODOFF relocations. - for _, m := range d.markableMethods { - for _, r := range m.r { - d.cleanupReloc(r) - } - } - - if ctxt.BuildMode != BuildModeShared { - // Keep a itablink if the symbol it points at is being kept. - // (When BuildModeShared, always keep itablinks.) - for _, s := range ctxt.Syms.Allsym { - if strings.HasPrefix(s.Name, "go.itablink.") { - s.Attr.Set(sym.AttrReachable, len(s.R) == 1 && s.R[0].Sym.Attr.Reachable()) - } - } - } - - addToTextp(ctxt) -} - -func addToTextp(ctxt *Link) { - // Remove dead text but keep file information (z symbols). - textp := []*sym.Symbol{} - for _, s := range ctxt.Textp { - if s.Attr.Reachable() { - textp = append(textp, s) - } - } - - // Put reachable text symbols into Textp. - // do it in postorder so that packages are laid down in dependency order - // internal first, then everything else - ctxt.Library = postorder(ctxt.Library) - for _, doInternal := range [2]bool{true, false} { - for _, lib := range ctxt.Library { - if isRuntimeDepPkg(lib.Pkg) != doInternal { - continue - } - libtextp := lib.Textp[:0] - for _, s := range lib.Textp { - if s.Attr.Reachable() { - textp = append(textp, s) - libtextp = append(libtextp, s) - if s.Unit != nil { - s.Unit.Textp = append(s.Unit.Textp, s) - } - } - } - for _, s := range lib.DupTextSyms { - if s.Attr.Reachable() && !s.Attr.OnList() { - textp = append(textp, s) - libtextp = append(libtextp, s) - if s.Unit != nil { - s.Unit.Textp = append(s.Unit.Textp, s) - } - s.Attr |= sym.AttrOnList - // dupok symbols may be defined in multiple packages. its - // associated package is chosen sort of arbitrarily (the - // first containing package that the linker loads). canonicalize - // it here to the package with which it will be laid down - // in text. - s.File = objabi.PathToPrefix(lib.Pkg) - } - } - lib.Textp = libtextp - } - } - ctxt.Textp = textp - - if len(ctxt.Shlibs) > 0 { - // We might have overwritten some functions above (this tends to happen for the - // autogenerated type equality/hashing functions) and we don't want to generated - // pcln table entries for these any more so remove them from Textp. - textp := make([]*sym.Symbol, 0, len(ctxt.Textp)) - for _, s := range ctxt.Textp { - if s.Type != sym.SDYNIMPORT { - textp = append(textp, s) - } - } - ctxt.Textp = textp - } -} - -// methodref holds the relocations from a receiver type symbol to its -// method. There are three relocations, one for each of the fields in -// the reflect.method struct: mtyp, ifn, and tfn. -type methodref struct { - m methodsig - src *sym.Symbol // receiver type symbol - r [3]*sym.Reloc // R_METHODOFF relocations to fields of runtime.method -} - -func (m methodref) ifn() *sym.Symbol { return m.r[1].Sym } - -func (m methodref) isExported() bool { - for _, r := range m.m { - return unicode.IsUpper(r) - } - panic("methodref has no signature") -} - -// deadcodepass holds state for the deadcode flood fill. -type deadcodepass struct { - ctxt *Link - markQueue []*sym.Symbol // symbols to flood fill in next pass - ifaceMethod map[methodsig]bool // methods declared in reached interfaces - markableMethods []methodref // methods of reached types - reflectMethod bool -} - -func (d *deadcodepass) cleanupReloc(r *sym.Reloc) { - if r.Sym.Attr.Reachable() { - r.Type = objabi.R_ADDROFF - } else { - if d.ctxt.Debugvlog > 1 { - d.ctxt.Logf("removing method %s\n", r.Sym.Name) - } - r.Sym = nil - r.Siz = 0 - } -} - -// mark appends a symbol to the mark queue for flood filling. -func (d *deadcodepass) mark(s, parent *sym.Symbol) { - if s == nil || s.Attr.Reachable() { - return - } - if s.Attr.ReflectMethod() { - d.reflectMethod = true - } - if *flagDumpDep { - p := "_" - if parent != nil { - p = parent.Name - } - fmt.Printf("%s -> %s\n", p, s.Name) - } - s.Attr |= sym.AttrReachable - if d.ctxt.Reachparent != nil { - d.ctxt.Reachparent[s] = parent - } - d.markQueue = append(d.markQueue, s) -} - -// markMethod marks a method as reachable. -func (d *deadcodepass) markMethod(m methodref) { - for _, r := range m.r { - d.mark(r.Sym, m.src) - r.Type = objabi.R_ADDROFF - } -} - -// init marks all initial symbols as reachable. -// In a typical binary, this is *flagEntrySymbol. -func (d *deadcodepass) init() { - var names []string - - if d.ctxt.BuildMode == BuildModeShared { - // Mark all symbols defined in this library as reachable when - // building a shared library. - for _, s := range d.ctxt.Syms.Allsym { - if s.Type != 0 && s.Type != sym.SDYNIMPORT { - d.mark(s, nil) - } - } - } else { - // In a normal binary, start at main.main and the init - // functions and mark what is reachable from there. - - if d.ctxt.linkShared && (d.ctxt.BuildMode == BuildModeExe || d.ctxt.BuildMode == BuildModePIE) { - names = append(names, "main.main", "main..inittask") - } else { - // The external linker refers main symbol directly. - if d.ctxt.LinkMode == LinkExternal && (d.ctxt.BuildMode == BuildModeExe || d.ctxt.BuildMode == BuildModePIE) { - if d.ctxt.HeadType == objabi.Hwindows && d.ctxt.Arch.Family == sys.I386 { - *flagEntrySymbol = "_main" - } else { - *flagEntrySymbol = "main" - } - } - names = append(names, *flagEntrySymbol) - if d.ctxt.BuildMode == BuildModePlugin { - names = append(names, objabi.PathToPrefix(*flagPluginPath)+"..inittask", objabi.PathToPrefix(*flagPluginPath)+".main", "go.plugin.tabs") - - // We don't keep the go.plugin.exports symbol, - // but we do keep the symbols it refers to. - exports := d.ctxt.Syms.ROLookup("go.plugin.exports", 0) - if exports != nil { - for i := range exports.R { - d.mark(exports.R[i].Sym, nil) - } - } - } - } - for _, s := range dynexp { - d.mark(s, nil) - } - } - - for _, name := range names { - // Mark symbol as a data/ABI0 symbol. - d.mark(d.ctxt.Syms.ROLookup(name, 0), nil) - // Also mark any Go functions (internal ABI). - d.mark(d.ctxt.Syms.ROLookup(name, sym.SymVerABIInternal), nil) - } -} - -// flood fills symbols reachable from the markQueue symbols. -// As it goes, it collects methodref and interface method declarations. -func (d *deadcodepass) flood() { - for len(d.markQueue) > 0 { - s := d.markQueue[0] - d.markQueue = d.markQueue[1:] - if s.Type == sym.STEXT { - if d.ctxt.Debugvlog > 1 { - d.ctxt.Logf("marktext %s\n", s.Name) - } - } - - if strings.HasPrefix(s.Name, "type.") && s.Name[5] != '.' { - if len(s.P) == 0 { - // Probably a bug. The undefined symbol check - // later will give a better error than deadcode. - continue - } - if decodetypeKind(d.ctxt.Arch, s.P)&kindMask == kindInterface { - for _, sig := range decodeIfaceMethods(d.ctxt.Arch, s) { - if d.ctxt.Debugvlog > 1 { - d.ctxt.Logf("reached iface method: %s\n", sig) - } - d.ifaceMethod[sig] = true - } - } - } - - mpos := 0 // 0-3, the R_METHODOFF relocs of runtime.uncommontype - var methods []methodref - for i := range s.R { - r := &s.R[i] - if r.Sym == nil { - continue - } - if r.Type == objabi.R_WEAKADDROFF { - // An R_WEAKADDROFF relocation is not reason - // enough to mark the pointed-to symbol as - // reachable. - continue - } - if r.Sym.Type == sym.SABIALIAS { - // Patch this relocation through the - // ABI alias before marking. - r.Sym = resolveABIAlias(r.Sym) - } - if r.Type != objabi.R_METHODOFF { - d.mark(r.Sym, s) - continue - } - // Collect rtype pointers to methods for - // later processing in deadcode. - if mpos == 0 { - m := methodref{src: s} - m.r[0] = r - methods = append(methods, m) - } else { - methods[len(methods)-1].r[mpos] = r - } - mpos++ - if mpos == len(methodref{}.r) { - mpos = 0 - } - } - if len(methods) > 0 { - // Decode runtime type information for type methods - // to help work out which methods can be called - // dynamically via interfaces. - methodsigs := decodetypeMethods(d.ctxt.Arch, s) - if len(methods) != len(methodsigs) { - panic(fmt.Sprintf("%q has %d method relocations for %d methods", s.Name, len(methods), len(methodsigs))) - } - for i, m := range methodsigs { - name := string(m) - name = name[:strings.Index(name, "(")] - if !strings.HasSuffix(methods[i].ifn().Name, name) { - panic(fmt.Sprintf("%q relocation for %q does not match method %q", s.Name, methods[i].ifn().Name, name)) - } - methods[i].m = m - } - d.markableMethods = append(d.markableMethods, methods...) - } - - if s.FuncInfo != nil { - for i := range s.FuncInfo.Funcdata { - d.mark(s.FuncInfo.Funcdata[i], s) - } - } - d.mark(s.Gotype, s) - d.mark(s.Sub, s) - d.mark(s.Outer, s) - } -} diff --git a/src/cmd/oldlink/internal/ld/deadcode2.go b/src/cmd/oldlink/internal/ld/deadcode2.go deleted file mode 100644 index 82bfd60a47..0000000000 --- a/src/cmd/oldlink/internal/ld/deadcode2.go +++ /dev/null @@ -1,441 +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 ld - -import ( - "bytes" - "cmd/internal/dwarf" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/loader" - "cmd/oldlink/internal/sym" - "container/heap" - "fmt" - "unicode" -) - -var _ = fmt.Print - -type workQueue []loader.Sym - -// Implement container/heap.Interface. -func (q *workQueue) Len() int { return len(*q) } -func (q *workQueue) Less(i, j int) bool { return (*q)[i] < (*q)[j] } -func (q *workQueue) Swap(i, j int) { (*q)[i], (*q)[j] = (*q)[j], (*q)[i] } -func (q *workQueue) Push(i interface{}) { *q = append(*q, i.(loader.Sym)) } -func (q *workQueue) Pop() interface{} { i := (*q)[len(*q)-1]; *q = (*q)[:len(*q)-1]; return i } - -// Functions for deadcode pass to use. -// Deadcode pass should call push/pop, not Push/Pop. -func (q *workQueue) push(i loader.Sym) { heap.Push(q, i) } -func (q *workQueue) pop() loader.Sym { return heap.Pop(q).(loader.Sym) } -func (q *workQueue) empty() bool { return len(*q) == 0 } - -type deadcodePass2 struct { - ctxt *Link - ldr *loader.Loader - wq workQueue - rtmp []loader.Reloc - - ifaceMethod map[methodsig]bool // methods declared in reached interfaces - markableMethods []methodref2 // methods of reached types - reflectSeen bool // whether we have seen a reflect method call -} - -func (d *deadcodePass2) init() { - d.ldr.InitReachable() - d.ifaceMethod = make(map[methodsig]bool) - if d.ctxt.Reachparent != nil { - d.ldr.Reachparent = make([]loader.Sym, d.ldr.NSym()) - } - heap.Init(&d.wq) - - if d.ctxt.BuildMode == BuildModeShared { - // Mark all symbols defined in this library as reachable when - // building a shared library. - n := d.ldr.NDef() - for i := 1; i < n; i++ { - s := loader.Sym(i) - if !d.ldr.IsDup(s) { - d.mark(s, 0) - } - } - return - } - - var names []string - - // In a normal binary, start at main.main and the init - // functions and mark what is reachable from there. - if d.ctxt.linkShared && (d.ctxt.BuildMode == BuildModeExe || d.ctxt.BuildMode == BuildModePIE) { - names = append(names, "main.main", "main..inittask") - } else { - // The external linker refers main symbol directly. - if d.ctxt.LinkMode == LinkExternal && (d.ctxt.BuildMode == BuildModeExe || d.ctxt.BuildMode == BuildModePIE) { - if d.ctxt.HeadType == objabi.Hwindows && d.ctxt.Arch.Family == sys.I386 { - *flagEntrySymbol = "_main" - } else { - *flagEntrySymbol = "main" - } - } - names = append(names, *flagEntrySymbol) - if d.ctxt.BuildMode == BuildModePlugin { - names = append(names, objabi.PathToPrefix(*flagPluginPath)+"..inittask", objabi.PathToPrefix(*flagPluginPath)+".main", "go.plugin.tabs") - - // We don't keep the go.plugin.exports symbol, - // but we do keep the symbols it refers to. - exportsIdx := d.ldr.Lookup("go.plugin.exports", 0) - if exportsIdx != 0 { - d.ReadRelocs(exportsIdx) - for i := 0; i < len(d.rtmp); i++ { - d.mark(d.rtmp[i].Sym, 0) - } - } - } - } - - dynexpMap := d.ctxt.cgo_export_dynamic - if d.ctxt.LinkMode == LinkExternal { - dynexpMap = d.ctxt.cgo_export_static - } - for exp := range dynexpMap { - names = append(names, exp) - } - - // DWARF constant DIE symbols are not referenced, but needed by - // the dwarf pass. - if !*FlagW { - for _, lib := range d.ctxt.Library { - names = append(names, dwarf.ConstInfoPrefix+lib.Pkg) - } - } - - for _, name := range names { - // Mark symbol as a data/ABI0 symbol. - d.mark(d.ldr.Lookup(name, 0), 0) - // Also mark any Go functions (internal ABI). - d.mark(d.ldr.Lookup(name, sym.SymVerABIInternal), 0) - } -} - -func (d *deadcodePass2) flood() { - symRelocs := []loader.Reloc{} - auxSyms := []loader.Sym{} - for !d.wq.empty() { - symIdx := d.wq.pop() - - d.reflectSeen = d.reflectSeen || d.ldr.IsReflectMethod(symIdx) - - relocs := d.ldr.Relocs(symIdx) - symRelocs = relocs.ReadAll(symRelocs) - - if d.ldr.IsGoType(symIdx) { - p := d.ldr.Data(symIdx) - if len(p) != 0 && decodetypeKind(d.ctxt.Arch, p)&kindMask == kindInterface { - for _, sig := range d.decodeIfaceMethods2(d.ldr, d.ctxt.Arch, symIdx, symRelocs) { - if d.ctxt.Debugvlog > 1 { - d.ctxt.Logf("reached iface method: %s\n", sig) - } - d.ifaceMethod[sig] = true - } - } - } - - var methods []methodref2 - for i := 0; i < relocs.Count; i++ { - r := symRelocs[i] - if r.Type == objabi.R_WEAKADDROFF { - continue - } - if r.Type == objabi.R_METHODOFF { - if i+2 >= relocs.Count { - panic("expect three consecutive R_METHODOFF relocs") - } - methods = append(methods, methodref2{src: symIdx, r: i}) - i += 2 - continue - } - if r.Type == objabi.R_USETYPE { - // type symbol used for DWARF. we need to load the symbol but it may not - // be otherwise reachable in the program. - // do nothing for now as we still load all type symbols. - continue - } - d.mark(r.Sym, symIdx) - } - auxSyms = d.ldr.ReadAuxSyms(symIdx, auxSyms) - for i := 0; i < len(auxSyms); i++ { - d.mark(auxSyms[i], 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, - // so we make sure we're pulling in all outer symbols, and their sub - // symbols. This is not ideal, and these carrier/section symbols could - // be removed. - d.mark(d.ldr.OuterSym(symIdx), symIdx) - d.mark(d.ldr.SubSym(symIdx), symIdx) - - if len(methods) != 0 { - // Decode runtime type information for type methods - // to help work out which methods can be called - // dynamically via interfaces. - methodsigs := d.decodetypeMethods2(d.ldr, d.ctxt.Arch, symIdx, symRelocs) - if len(methods) != len(methodsigs) { - panic(fmt.Sprintf("%q has %d method relocations for %d methods", d.ldr.SymName(symIdx), len(methods), len(methodsigs))) - } - for i, m := range methodsigs { - methods[i].m = m - } - d.markableMethods = append(d.markableMethods, methods...) - } - } -} - -func (d *deadcodePass2) mark(symIdx, parent loader.Sym) { - if symIdx != 0 && !d.ldr.Reachable.Has(symIdx) { - d.wq.push(symIdx) - d.ldr.Reachable.Set(symIdx) - if d.ctxt.Reachparent != nil { - d.ldr.Reachparent[symIdx] = parent - } - if *flagDumpDep { - to := d.ldr.SymName(symIdx) - if to != "" { - from := "_" - if parent != 0 { - from = d.ldr.SymName(parent) - } - fmt.Printf("%s -> %s\n", from, to) - } - } - } -} - -func (d *deadcodePass2) markMethod(m methodref2) { - d.ReadRelocs(m.src) - d.mark(d.rtmp[m.r].Sym, m.src) - d.mark(d.rtmp[m.r+1].Sym, m.src) - d.mark(d.rtmp[m.r+2].Sym, m.src) -} - -func deadcode2(ctxt *Link) { - ldr := ctxt.loader - d := deadcodePass2{ctxt: ctxt, ldr: ldr} - d.init() - d.flood() - - callSym := ldr.Lookup("reflect.Value.Call", sym.SymVerABIInternal) - methSym := ldr.Lookup("reflect.Value.Method", sym.SymVerABIInternal) - if ctxt.DynlinkingGo() { - // Exported methods may satisfy interfaces we don't know - // about yet when dynamically linking. - d.reflectSeen = true - } - - for { - // Methods might be called via reflection. Give up on - // static analysis, mark all exported methods of - // all reachable types as reachable. - d.reflectSeen = d.reflectSeen || (callSym != 0 && ldr.Reachable.Has(callSym)) || (methSym != 0 && ldr.Reachable.Has(methSym)) - - // Mark all methods that could satisfy a discovered - // interface as reachable. We recheck old marked interfaces - // as new types (with new methods) may have been discovered - // in the last pass. - rem := d.markableMethods[:0] - for _, m := range d.markableMethods { - if (d.reflectSeen && m.isExported()) || d.ifaceMethod[m.m] { - d.markMethod(m) - } else { - rem = append(rem, m) - } - } - d.markableMethods = rem - - if d.wq.empty() { - // No new work was discovered. Done. - break - } - d.flood() - } - - n := ldr.NSym() - - if ctxt.BuildMode != BuildModeShared { - // Keep a itablink if the symbol it points at is being kept. - // (When BuildModeShared, always keep itablinks.) - for i := 1; i < n; i++ { - s := loader.Sym(i) - if ldr.IsItabLink(s) { - relocs := ldr.Relocs(s) - if relocs.Count > 0 && ldr.Reachable.Has(relocs.At(0).Sym) { - ldr.Reachable.Set(s) - } - } - } - } -} - -// methodref2 holds the relocations from a receiver type symbol to its -// method. There are three relocations, one for each of the fields in -// the reflect.method struct: mtyp, ifn, and tfn. -type methodref2 struct { - m methodsig - src loader.Sym // receiver type symbol - r int // the index of R_METHODOFF relocations -} - -func (m methodref2) isExported() bool { - for _, r := range m.m { - return unicode.IsUpper(r) - } - panic("methodref has no signature") -} - -// decodeMethodSig2 decodes an array of method signature information. -// Each element of the array is size bytes. The first 4 bytes is a -// nameOff for the method name, and the next 4 bytes is a typeOff for -// the function type. -// -// Conveniently this is the layout of both runtime.method and runtime.imethod. -func (d *deadcodePass2) decodeMethodSig2(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, symRelocs []loader.Reloc, off, size, count int) []methodsig { - var buf bytes.Buffer - var methods []methodsig - for i := 0; i < count; i++ { - buf.WriteString(decodetypeName2(ldr, symIdx, symRelocs, off)) - mtypSym := decodeRelocSym2(ldr, symIdx, symRelocs, int32(off+4)) - // FIXME: add some sort of caching here, since we may see some of the - // same symbols over time for param types. - d.ReadRelocs(mtypSym) - mp := ldr.Data(mtypSym) - - buf.WriteRune('(') - inCount := decodetypeFuncInCount(arch, mp) - for i := 0; i < inCount; i++ { - if i > 0 { - buf.WriteString(", ") - } - a := d.decodetypeFuncInType2(ldr, arch, mtypSym, d.rtmp, i) - buf.WriteString(ldr.SymName(a)) - } - buf.WriteString(") (") - outCount := decodetypeFuncOutCount(arch, mp) - for i := 0; i < outCount; i++ { - if i > 0 { - buf.WriteString(", ") - } - a := d.decodetypeFuncOutType2(ldr, arch, mtypSym, d.rtmp, i) - buf.WriteString(ldr.SymName(a)) - } - buf.WriteRune(')') - - off += size - methods = append(methods, methodsig(buf.String())) - buf.Reset() - } - return methods -} - -func (d *deadcodePass2) decodeIfaceMethods2(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, symRelocs []loader.Reloc) []methodsig { - p := ldr.Data(symIdx) - if decodetypeKind(arch, p)&kindMask != kindInterface { - panic(fmt.Sprintf("symbol %q is not an interface", ldr.SymName(symIdx))) - } - rel := decodeReloc2(ldr, symIdx, symRelocs, int32(commonsize(arch)+arch.PtrSize)) - if rel.Sym == 0 { - return nil - } - if rel.Sym != symIdx { - panic(fmt.Sprintf("imethod slice pointer in %q leads to a different symbol", ldr.SymName(symIdx))) - } - off := int(rel.Add) // array of reflect.imethod values - numMethods := int(decodetypeIfaceMethodCount(arch, p)) - sizeofIMethod := 4 + 4 - return d.decodeMethodSig2(ldr, arch, symIdx, symRelocs, off, sizeofIMethod, numMethods) -} - -func (d *deadcodePass2) decodetypeMethods2(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, symRelocs []loader.Reloc) []methodsig { - p := ldr.Data(symIdx) - if !decodetypeHasUncommon(arch, p) { - panic(fmt.Sprintf("no methods on %q", ldr.SymName(symIdx))) - } - off := commonsize(arch) // reflect.rtype - switch decodetypeKind(arch, p) & kindMask { - case kindStruct: // reflect.structType - off += 4 * arch.PtrSize - case kindPtr: // reflect.ptrType - off += arch.PtrSize - case kindFunc: // reflect.funcType - off += arch.PtrSize // 4 bytes, pointer aligned - case kindSlice: // reflect.sliceType - off += arch.PtrSize - case kindArray: // reflect.arrayType - off += 3 * arch.PtrSize - case kindChan: // reflect.chanType - off += 2 * arch.PtrSize - case kindMap: // reflect.mapType - off += 4*arch.PtrSize + 8 - case kindInterface: // reflect.interfaceType - off += 3 * arch.PtrSize - default: - // just Sizeof(rtype) - } - - mcount := int(decodeInuxi(arch, p[off+4:], 2)) - moff := int(decodeInuxi(arch, p[off+4+2+2:], 4)) - off += moff // offset to array of reflect.method values - const sizeofMethod = 4 * 4 // sizeof reflect.method in program - return d.decodeMethodSig2(ldr, arch, symIdx, symRelocs, off, sizeofMethod, mcount) -} - -func decodeReloc2(ldr *loader.Loader, symIdx loader.Sym, symRelocs []loader.Reloc, off int32) loader.Reloc { - for j := 0; j < len(symRelocs); j++ { - rel := symRelocs[j] - if rel.Off == off { - return rel - } - } - return loader.Reloc{} -} - -func decodeRelocSym2(ldr *loader.Loader, symIdx loader.Sym, symRelocs []loader.Reloc, off int32) loader.Sym { - return decodeReloc2(ldr, symIdx, symRelocs, off).Sym -} - -// decodetypeName2 decodes the name from a reflect.name. -func decodetypeName2(ldr *loader.Loader, symIdx loader.Sym, symRelocs []loader.Reloc, off int) string { - r := decodeRelocSym2(ldr, symIdx, symRelocs, int32(off)) - if r == 0 { - return "" - } - - data := ldr.Data(r) - namelen := int(uint16(data[1])<<8 | uint16(data[2])) - return string(data[3 : 3+namelen]) -} - -func (d *deadcodePass2) decodetypeFuncInType2(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, symRelocs []loader.Reloc, i int) loader.Sym { - uadd := commonsize(arch) + 4 - if arch.PtrSize == 8 { - uadd += 4 - } - if decodetypeHasUncommon(arch, ldr.Data(symIdx)) { - uadd += uncommonSize() - } - return decodeRelocSym2(ldr, symIdx, symRelocs, int32(uadd+i*arch.PtrSize)) -} - -func (d *deadcodePass2) decodetypeFuncOutType2(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, symRelocs []loader.Reloc, i int) loader.Sym { - return d.decodetypeFuncInType2(ldr, arch, symIdx, symRelocs, i+decodetypeFuncInCount(arch, ldr.Data(symIdx))) -} - -// readRelocs reads the relocations for the specified symbol into the -// deadcode relocs work array. Use with care, since the work array -// is a singleton. -func (d *deadcodePass2) ReadRelocs(symIdx loader.Sym) { - relocs := d.ldr.Relocs(symIdx) - d.rtmp = relocs.ReadAll(d.rtmp) -} diff --git a/src/cmd/oldlink/internal/ld/decodesym.go b/src/cmd/oldlink/internal/ld/decodesym.go deleted file mode 100644 index 0676e94e2c..0000000000 --- a/src/cmd/oldlink/internal/ld/decodesym.go +++ /dev/null @@ -1,374 +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 ld - -import ( - "bytes" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "debug/elf" - "fmt" -) - -// Decoding the type.* symbols. This has to be in sync with -// ../../runtime/type.go, or more specifically, with what -// cmd/compile/internal/gc/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/gc/reflect.go -// cmd/oldlink/internal/ld/decodesym.go -// reflect/type.go -// runtime/type.go -const ( - tflagUncommon = 1 << 0 - tflagExtraStar = 1 << 1 -) - -func decodeReloc(s *sym.Symbol, off int32) *sym.Reloc { - for i := range s.R { - if s.R[i].Off == off { - return &s.R[i] - } - } - return nil -} - -func decodeRelocSym(s *sym.Symbol, off int32) *sym.Symbol { - r := decodeReloc(s, off) - if r == nil { - return nil - } - return r.Sym -} - -func decodeInuxi(arch *sys.Arch, p []byte, sz int) uint64 { - switch sz { - case 2: - return uint64(arch.ByteOrder.Uint16(p)) - case 4: - return uint64(arch.ByteOrder.Uint32(p)) - case 8: - return arch.ByteOrder.Uint64(p) - default: - Exitf("dwarf: decode inuxi %d", sz) - panic("unreachable") - } -} - -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 - -// Type.commonType.kind -func decodetypeKind(arch *sys.Arch, p []byte) uint8 { - return p[2*arch.PtrSize+7] & objabi.KindMask // 0x13 / 0x1f -} - -// Type.commonType.kind -func decodetypeUsegcprog(arch *sys.Arch, p []byte) uint8 { - return p[2*arch.PtrSize+7] & objabi.KindGCProg // 0x13 / 0x1f -} - -// Type.commonType.size -func decodetypeSize(arch *sys.Arch, p []byte) int64 { - return int64(decodeInuxi(arch, p, arch.PtrSize)) // 0x8 / 0x10 -} - -// Type.commonType.ptrdata -func decodetypePtrdata(arch *sys.Arch, p []byte) int64 { - return int64(decodeInuxi(arch, p[arch.PtrSize:], arch.PtrSize)) // 0x8 / 0x10 -} - -// Type.commonType.tflag -func decodetypeHasUncommon(arch *sys.Arch, p []byte) bool { - return p[2*arch.PtrSize+4]&tflagUncommon != 0 -} - -// Find the elf.Section of a given shared library that contains a given address. -func findShlibSection(ctxt *Link, path string, addr uint64) *elf.Section { - for _, shlib := range ctxt.Shlibs { - if shlib.Path == path { - for _, sect := range shlib.File.Sections { - if sect.Addr <= addr && addr <= sect.Addr+sect.Size { - return sect - } - } - } - } - return nil -} - -// Type.commonType.gc -func decodetypeGcprog(ctxt *Link, s *sym.Symbol) []byte { - if s.Type == sym.SDYNIMPORT { - addr := decodetypeGcprogShlib(ctxt, s) - sect := findShlibSection(ctxt, s.File, addr) - if sect != nil { - // A gcprog is a 4-byte uint32 indicating length, followed by - // the actual program. - progsize := make([]byte, 4) - sect.ReadAt(progsize, int64(addr-sect.Addr)) - progbytes := make([]byte, ctxt.Arch.ByteOrder.Uint32(progsize)) - sect.ReadAt(progbytes, int64(addr-sect.Addr+4)) - return append(progsize, progbytes...) - } - Exitf("cannot find gcprog for %s", s.Name) - return nil - } - return decodeRelocSym(s, 2*int32(ctxt.Arch.PtrSize)+8+1*int32(ctxt.Arch.PtrSize)).P -} - -func decodetypeGcprogShlib(ctxt *Link, s *sym.Symbol) uint64 { - if ctxt.Arch.Family == sys.ARM64 { - for _, shlib := range ctxt.Shlibs { - if shlib.Path == s.File { - return shlib.gcdataAddresses[s] - } - } - return 0 - } - return decodeInuxi(ctxt.Arch, s.P[2*int32(ctxt.Arch.PtrSize)+8+1*int32(ctxt.Arch.PtrSize):], ctxt.Arch.PtrSize) -} - -func decodetypeGcmask(ctxt *Link, s *sym.Symbol) []byte { - if s.Type == sym.SDYNIMPORT { - addr := decodetypeGcprogShlib(ctxt, s) - ptrdata := decodetypePtrdata(ctxt.Arch, s.P) - sect := findShlibSection(ctxt, s.File, addr) - if sect != nil { - r := make([]byte, ptrdata/int64(ctxt.Arch.PtrSize)) - sect.ReadAt(r, int64(addr-sect.Addr)) - return r - } - Exitf("cannot find gcmask for %s", s.Name) - return nil - } - mask := decodeRelocSym(s, 2*int32(ctxt.Arch.PtrSize)+8+1*int32(ctxt.Arch.PtrSize)) - return mask.P -} - -// Type.ArrayType.elem and Type.SliceType.Elem -func decodetypeArrayElem(arch *sys.Arch, s *sym.Symbol) *sym.Symbol { - return decodeRelocSym(s, int32(commonsize(arch))) // 0x1c / 0x30 -} - -func decodetypeArrayLen(arch *sys.Arch, s *sym.Symbol) int64 { - return int64(decodeInuxi(arch, s.P[commonsize(arch)+2*arch.PtrSize:], arch.PtrSize)) -} - -// Type.PtrType.elem -func decodetypePtrElem(arch *sys.Arch, s *sym.Symbol) *sym.Symbol { - return decodeRelocSym(s, int32(commonsize(arch))) // 0x1c / 0x30 -} - -// Type.MapType.key, elem -func decodetypeMapKey(arch *sys.Arch, s *sym.Symbol) *sym.Symbol { - return decodeRelocSym(s, int32(commonsize(arch))) // 0x1c / 0x30 -} - -func decodetypeMapValue(arch *sys.Arch, s *sym.Symbol) *sym.Symbol { - return decodeRelocSym(s, int32(commonsize(arch))+int32(arch.PtrSize)) // 0x20 / 0x38 -} - -// Type.ChanType.elem -func decodetypeChanElem(arch *sys.Arch, s *sym.Symbol) *sym.Symbol { - return decodeRelocSym(s, int32(commonsize(arch))) // 0x1c / 0x30 -} - -// Type.FuncType.dotdotdot -func decodetypeFuncDotdotdot(arch *sys.Arch, p []byte) bool { - return uint16(decodeInuxi(arch, p[commonsize(arch)+2:], 2))&(1<<15) != 0 -} - -// Type.FuncType.inCount -func decodetypeFuncInCount(arch *sys.Arch, p []byte) int { - return int(decodeInuxi(arch, p[commonsize(arch):], 2)) -} - -func decodetypeFuncOutCount(arch *sys.Arch, p []byte) int { - return int(uint16(decodeInuxi(arch, p[commonsize(arch)+2:], 2)) & (1<<15 - 1)) -} - -func decodetypeFuncInType(arch *sys.Arch, s *sym.Symbol, i int) *sym.Symbol { - uadd := commonsize(arch) + 4 - if arch.PtrSize == 8 { - uadd += 4 - } - if decodetypeHasUncommon(arch, s.P) { - uadd += uncommonSize() - } - return decodeRelocSym(s, int32(uadd+i*arch.PtrSize)) -} - -func decodetypeFuncOutType(arch *sys.Arch, s *sym.Symbol, i int) *sym.Symbol { - return decodetypeFuncInType(arch, s, i+decodetypeFuncInCount(arch, s.P)) -} - -// Type.StructType.fields.Slice::length -func decodetypeStructFieldCount(arch *sys.Arch, s *sym.Symbol) int { - return int(decodeInuxi(arch, s.P[commonsize(arch)+2*arch.PtrSize:], arch.PtrSize)) -} - -func decodetypeStructFieldArrayOff(arch *sys.Arch, s *sym.Symbol, i int) int { - off := commonsize(arch) + 4*arch.PtrSize - if decodetypeHasUncommon(arch, s.P) { - off += uncommonSize() - } - off += i * structfieldSize(arch) - return off -} - -// decodetypeStr returns the contents of an rtype's str field (a nameOff). -func decodetypeStr(arch *sys.Arch, s *sym.Symbol) string { - str := decodetypeName(s, 4*arch.PtrSize+8) - if s.P[2*arch.PtrSize+4]&tflagExtraStar != 0 { - return str[1:] - } - return str -} - -// decodetypeName decodes the name from a reflect.name. -func decodetypeName(s *sym.Symbol, off int) string { - r := decodeReloc(s, int32(off)) - if r == nil { - return "" - } - - data := r.Sym.P - namelen := int(uint16(data[1])<<8 | uint16(data[2])) - return string(data[3 : 3+namelen]) -} - -func decodetypeStructFieldName(arch *sys.Arch, s *sym.Symbol, i int) string { - off := decodetypeStructFieldArrayOff(arch, s, i) - return decodetypeName(s, off) -} - -func decodetypeStructFieldType(arch *sys.Arch, s *sym.Symbol, i int) *sym.Symbol { - off := decodetypeStructFieldArrayOff(arch, s, i) - return decodeRelocSym(s, int32(off+arch.PtrSize)) -} - -func decodetypeStructFieldOffs(arch *sys.Arch, s *sym.Symbol, i int) int64 { - return decodetypeStructFieldOffsAnon(arch, s, i) >> 1 -} - -func decodetypeStructFieldOffsAnon(arch *sys.Arch, s *sym.Symbol, i int) int64 { - off := decodetypeStructFieldArrayOff(arch, s, i) - return int64(decodeInuxi(arch, s.P[off+2*arch.PtrSize:], arch.PtrSize)) -} - -// InterfaceType.methods.length -func decodetypeIfaceMethodCount(arch *sys.Arch, p []byte) int64 { - return int64(decodeInuxi(arch, p[commonsize(arch)+2*arch.PtrSize:], arch.PtrSize)) -} - -// methodsig is a fully qualified typed method signature, like -// "Visit(type.go/ast.Node) (type.go/ast.Visitor)". -type methodsig string - -// Matches runtime/typekind.go and reflect.Kind. -const ( - kindArray = 17 - kindChan = 18 - kindFunc = 19 - kindInterface = 20 - kindMap = 21 - kindPtr = 22 - kindSlice = 23 - kindStruct = 25 - kindMask = (1 << 5) - 1 -) - -// decodeMethodSig decodes an array of method signature information. -// Each element of the array is size bytes. The first 4 bytes is a -// nameOff for the method name, and the next 4 bytes is a typeOff for -// the function type. -// -// Conveniently this is the layout of both runtime.method and runtime.imethod. -func decodeMethodSig(arch *sys.Arch, s *sym.Symbol, off, size, count int) []methodsig { - var buf bytes.Buffer - var methods []methodsig - for i := 0; i < count; i++ { - buf.WriteString(decodetypeName(s, off)) - mtypSym := decodeRelocSym(s, int32(off+4)) - - buf.WriteRune('(') - inCount := decodetypeFuncInCount(arch, mtypSym.P) - for i := 0; i < inCount; i++ { - if i > 0 { - buf.WriteString(", ") - } - buf.WriteString(decodetypeFuncInType(arch, mtypSym, i).Name) - } - buf.WriteString(") (") - outCount := decodetypeFuncOutCount(arch, mtypSym.P) - for i := 0; i < outCount; i++ { - if i > 0 { - buf.WriteString(", ") - } - buf.WriteString(decodetypeFuncOutType(arch, mtypSym, i).Name) - } - buf.WriteRune(')') - - off += size - methods = append(methods, methodsig(buf.String())) - buf.Reset() - } - return methods -} - -func decodeIfaceMethods(arch *sys.Arch, s *sym.Symbol) []methodsig { - if decodetypeKind(arch, s.P)&kindMask != kindInterface { - panic(fmt.Sprintf("symbol %q is not an interface", s.Name)) - } - r := decodeReloc(s, int32(commonsize(arch)+arch.PtrSize)) - if r == nil { - return nil - } - if r.Sym != s { - panic(fmt.Sprintf("imethod slice pointer in %q leads to a different symbol", s.Name)) - } - off := int(r.Add) // array of reflect.imethod values - numMethods := int(decodetypeIfaceMethodCount(arch, s.P)) - sizeofIMethod := 4 + 4 - return decodeMethodSig(arch, s, off, sizeofIMethod, numMethods) -} - -func decodetypeMethods(arch *sys.Arch, s *sym.Symbol) []methodsig { - if !decodetypeHasUncommon(arch, s.P) { - panic(fmt.Sprintf("no methods on %q", s.Name)) - } - off := commonsize(arch) // reflect.rtype - switch decodetypeKind(arch, s.P) & kindMask { - case kindStruct: // reflect.structType - off += 4 * arch.PtrSize - case kindPtr: // reflect.ptrType - off += arch.PtrSize - case kindFunc: // reflect.funcType - off += arch.PtrSize // 4 bytes, pointer aligned - case kindSlice: // reflect.sliceType - off += arch.PtrSize - case kindArray: // reflect.arrayType - off += 3 * arch.PtrSize - case kindChan: // reflect.chanType - off += 2 * arch.PtrSize - case kindMap: // reflect.mapType - off += 4*arch.PtrSize + 8 - case kindInterface: // reflect.interfaceType - off += 3 * arch.PtrSize - default: - // just Sizeof(rtype) - } - - mcount := int(decodeInuxi(arch, s.P[off+4:], 2)) - moff := int(decodeInuxi(arch, s.P[off+4+2+2:], 4)) - off += moff // offset to array of reflect.method values - const sizeofMethod = 4 * 4 // sizeof reflect.method in program - return decodeMethodSig(arch, s, off, sizeofMethod, mcount) -} diff --git a/src/cmd/oldlink/internal/ld/dwarf.go b/src/cmd/oldlink/internal/ld/dwarf.go deleted file mode 100644 index 3d5220cbfb..0000000000 --- a/src/cmd/oldlink/internal/ld/dwarf.go +++ /dev/null @@ -1,2044 +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. - -// TODO/NICETOHAVE: -// - eliminate DW_CLS_ if not used -// - package info in compilation units -// - assign types to their packages -// - gdb uses c syntax, meaning clumsy quoting is needed for go identifiers. eg -// ptype struct '[]uint8' and qualifiers need to be quoted away -// - file:line info for variables -// - make strings a typedef so prettyprinters can see the underlying string type - -package ld - -import ( - "cmd/internal/dwarf" - "cmd/internal/obj" - "cmd/internal/objabi" - "cmd/internal/src" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "fmt" - "log" - "sort" - "strings" -) - -type dwctxt struct { - linkctxt *Link -} - -func (c dwctxt) PtrSize() int { - return c.linkctxt.Arch.PtrSize -} -func (c dwctxt) AddInt(s dwarf.Sym, size int, i int64) { - ls := s.(*sym.Symbol) - ls.AddUintXX(c.linkctxt.Arch, uint64(i), size) -} -func (c dwctxt) AddBytes(s dwarf.Sym, b []byte) { - ls := s.(*sym.Symbol) - ls.AddBytes(b) -} -func (c dwctxt) AddString(s dwarf.Sym, v string) { - Addstring(s.(*sym.Symbol), v) -} - -func (c dwctxt) AddAddress(s dwarf.Sym, data interface{}, value int64) { - if value != 0 { - value -= (data.(*sym.Symbol)).Value - } - s.(*sym.Symbol).AddAddrPlus(c.linkctxt.Arch, data.(*sym.Symbol), value) -} - -func (c dwctxt) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64) { - if value != 0 { - value -= (data.(*sym.Symbol)).Value - } - s.(*sym.Symbol).AddCURelativeAddrPlus(c.linkctxt.Arch, data.(*sym.Symbol), value) -} - -func (c dwctxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64) { - ls := s.(*sym.Symbol) - switch size { - default: - Errorf(ls, "invalid size %d in adddwarfref\n", size) - fallthrough - case c.linkctxt.Arch.PtrSize: - ls.AddAddr(c.linkctxt.Arch, t.(*sym.Symbol)) - case 4: - ls.AddAddrPlus4(t.(*sym.Symbol), 0) - } - r := &ls.R[len(ls.R)-1] - r.Type = objabi.R_ADDROFF - r.Add = ofs -} - -func (c dwctxt) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64) { - size := 4 - if isDwarf64(c.linkctxt) { - size = 8 - } - - c.AddSectionOffset(s, size, t, ofs) - ls := s.(*sym.Symbol) - ls.R[len(ls.R)-1].Type = objabi.R_DWARFSECREF -} - -func (c dwctxt) Logf(format string, args ...interface{}) { - c.linkctxt.Logf(format, args...) -} - -// At the moment these interfaces are only used in the compiler. - -func (c dwctxt) AddFileRef(s dwarf.Sym, f interface{}) { - panic("should be used only in the compiler") -} - -func (c dwctxt) CurrentOffset(s dwarf.Sym) int64 { - panic("should be used only in the compiler") -} - -func (c dwctxt) RecordDclReference(s dwarf.Sym, t dwarf.Sym, dclIdx int, inlIndex int) { - panic("should be used only in the compiler") -} - -func (c dwctxt) RecordChildDieOffsets(s dwarf.Sym, vars []*dwarf.Var, offsets []int32) { - panic("should be used only in the compiler") -} - -func isDwarf64(ctxt *Link) bool { - return ctxt.HeadType == objabi.Haix -} - -var gdbscript string - -var dwarfp []*sym.Symbol - -func writeabbrev(ctxt *Link) *sym.Symbol { - s := ctxt.Syms.Lookup(".debug_abbrev", 0) - s.Type = sym.SDWARFSECT - s.AddBytes(dwarf.GetAbbrev()) - return s -} - -var dwtypes dwarf.DWDie - -func newattr(die *dwarf.DWDie, attr uint16, cls int, value int64, data interface{}) *dwarf.DWAttr { - a := new(dwarf.DWAttr) - a.Link = die.Attr - die.Attr = a - a.Atr = attr - a.Cls = uint8(cls) - a.Value = value - a.Data = data - return a -} - -// Each DIE (except the root ones) has at least 1 attribute: its -// name. getattr moves the desired one to the front so -// frequently searched ones are found faster. -func getattr(die *dwarf.DWDie, attr uint16) *dwarf.DWAttr { - if die.Attr.Atr == attr { - return die.Attr - } - - a := die.Attr - b := a.Link - for b != nil { - if b.Atr == attr { - a.Link = b.Link - b.Link = die.Attr - die.Attr = b - return b - } - - a = b - b = b.Link - } - - return nil -} - -// Every DIE manufactured by the linker has at least an AT_name -// attribute (but it will only be written out if it is listed in the abbrev). -// The compiler does create nameless DWARF DIEs (ex: concrete subprogram -// instance). -func newdie(ctxt *Link, parent *dwarf.DWDie, abbrev int, name string, version int) *dwarf.DWDie { - die := new(dwarf.DWDie) - die.Abbrev = abbrev - die.Link = parent.Child - parent.Child = die - - newattr(die, dwarf.DW_AT_name, dwarf.DW_CLS_STRING, int64(len(name)), name) - - if name != "" && (abbrev <= dwarf.DW_ABRV_VARIABLE || abbrev >= dwarf.DW_ABRV_NULLTYPE) { - if abbrev != dwarf.DW_ABRV_VARIABLE || version == 0 { - if abbrev == dwarf.DW_ABRV_COMPUNIT { - // Avoid collisions with "real" symbol names. - name = fmt.Sprintf(".pkg.%s.%d", name, len(ctxt.compUnits)) - } - s := ctxt.Syms.Lookup(dwarf.InfoPrefix+name, version) - s.Attr |= sym.AttrNotInSymbolTable - s.Type = sym.SDWARFINFO - die.Sym = s - } - } - - return die -} - -func walktypedef(die *dwarf.DWDie) *dwarf.DWDie { - if die == nil { - return nil - } - // Resolve typedef if present. - if die.Abbrev == dwarf.DW_ABRV_TYPEDECL { - for attr := die.Attr; attr != nil; attr = attr.Link { - if attr.Atr == dwarf.DW_AT_type && attr.Cls == dwarf.DW_CLS_REFERENCE && attr.Data != nil { - return attr.Data.(*dwarf.DWDie) - } - } - } - - return die -} - -func walksymtypedef(ctxt *Link, s *sym.Symbol) *sym.Symbol { - if t := ctxt.Syms.ROLookup(s.Name+"..def", int(s.Version)); t != nil { - return t - } - return s -} - -// Find child by AT_name using hashtable if available or linear scan -// if not. -func findchild(die *dwarf.DWDie, name string) *dwarf.DWDie { - var prev *dwarf.DWDie - for ; die != prev; prev, die = die, walktypedef(die) { - for a := die.Child; a != nil; a = a.Link { - if name == getattr(a, dwarf.DW_AT_name).Data { - return a - } - } - continue - } - return nil -} - -// Used to avoid string allocation when looking up dwarf symbols -var prefixBuf = []byte(dwarf.InfoPrefix) - -func find(ctxt *Link, name string) *sym.Symbol { - n := append(prefixBuf, name...) - // The string allocation below is optimized away because it is only used in a map lookup. - s := ctxt.Syms.ROLookup(string(n), 0) - prefixBuf = n[:len(dwarf.InfoPrefix)] - if s != nil && s.Type == sym.SDWARFINFO { - return s - } - return nil -} - -func mustFind(ctxt *Link, name string) *sym.Symbol { - r := find(ctxt, name) - if r == nil { - Exitf("dwarf find: cannot find %s", name) - } - return r -} - -func adddwarfref(ctxt *Link, s *sym.Symbol, t *sym.Symbol, size int) int64 { - var result int64 - switch size { - default: - Errorf(s, "invalid size %d in adddwarfref\n", size) - fallthrough - case ctxt.Arch.PtrSize: - result = s.AddAddr(ctxt.Arch, t) - case 4: - result = s.AddAddrPlus4(t, 0) - } - r := &s.R[len(s.R)-1] - r.Type = objabi.R_DWARFSECREF - return result -} - -func newrefattr(die *dwarf.DWDie, attr uint16, ref *sym.Symbol) *dwarf.DWAttr { - if ref == nil { - return nil - } - return newattr(die, attr, dwarf.DW_CLS_REFERENCE, 0, ref) -} - -func dtolsym(s dwarf.Sym) *sym.Symbol { - if s == nil { - return nil - } - return s.(*sym.Symbol) -} - -func putdie(linkctxt *Link, ctxt dwarf.Context, syms []*sym.Symbol, die *dwarf.DWDie) []*sym.Symbol { - s := dtolsym(die.Sym) - if s == nil { - s = syms[len(syms)-1] - } else { - if s.Attr.OnList() { - log.Fatalf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - syms = append(syms, s) - } - dwarf.Uleb128put(ctxt, s, int64(die.Abbrev)) - dwarf.PutAttrs(ctxt, s, die.Abbrev, die.Attr) - if dwarf.HasChildren(die) { - for die := die.Child; die != nil; die = die.Link { - syms = putdie(linkctxt, ctxt, syms, die) - } - syms[len(syms)-1].AddUint8(0) - } - return syms -} - -func reverselist(list **dwarf.DWDie) { - curr := *list - var prev *dwarf.DWDie - for curr != nil { - next := curr.Link - curr.Link = prev - prev = curr - curr = next - } - - *list = prev -} - -func reversetree(list **dwarf.DWDie) { - reverselist(list) - for die := *list; die != nil; die = die.Link { - if dwarf.HasChildren(die) { - reversetree(&die.Child) - } - } -} - -func newmemberoffsetattr(die *dwarf.DWDie, offs int32) { - newattr(die, dwarf.DW_AT_data_member_location, dwarf.DW_CLS_CONSTANT, int64(offs), nil) -} - -// GDB doesn't like FORM_addr for AT_location, so emit a -// location expression that evals to a const. -func newabslocexprattr(die *dwarf.DWDie, addr int64, sym *sym.Symbol) { - newattr(die, dwarf.DW_AT_location, dwarf.DW_CLS_ADDRESS, addr, sym) - // below -} - -// Lookup predefined types -func lookupOrDiag(ctxt *Link, n string) *sym.Symbol { - s := ctxt.Syms.ROLookup(n, 0) - if s == nil || s.Size == 0 { - Exitf("dwarf: missing type: %s", n) - } - - return s -} - -// dwarfFuncSym looks up a DWARF metadata symbol for function symbol s. -// If the symbol does not exist, it creates it if create is true, -// or returns nil otherwise. -func dwarfFuncSym(ctxt *Link, s *sym.Symbol, meta string, create bool) *sym.Symbol { - // All function ABIs use symbol version 0 for the DWARF data. - // - // TODO(austin): It may be useful to have DWARF info for ABI - // wrappers, in which case we may want these versions to - // align. Better yet, replace these name lookups with a - // general way to attach metadata to a symbol. - ver := 0 - if s.IsFileLocal() { - ver = int(s.Version) - } - if create { - return ctxt.Syms.Lookup(meta+s.Name, ver) - } - return ctxt.Syms.ROLookup(meta+s.Name, ver) -} - -func dotypedef(ctxt *Link, parent *dwarf.DWDie, name string, def *dwarf.DWDie) *dwarf.DWDie { - // Only emit typedefs for real names. - if strings.HasPrefix(name, "map[") { - return nil - } - if strings.HasPrefix(name, "struct {") { - return nil - } - if strings.HasPrefix(name, "chan ") { - return nil - } - if name[0] == '[' || name[0] == '*' { - return nil - } - if def == nil { - Errorf(nil, "dwarf: bad def in dotypedef") - } - - s := ctxt.Syms.Lookup(dtolsym(def.Sym).Name+"..def", 0) - s.Attr |= sym.AttrNotInSymbolTable - s.Type = sym.SDWARFINFO - def.Sym = s - - // The typedef entry must be created after the def, - // so that future lookups will find the typedef instead - // of the real definition. This hooks the typedef into any - // circular definition loops, so that gdb can understand them. - die := newdie(ctxt, parent, dwarf.DW_ABRV_TYPEDECL, name, 0) - - newrefattr(die, dwarf.DW_AT_type, s) - - return die -} - -// Define gotype, for composite ones recurse into constituents. -func defgotype(ctxt *Link, gotype *sym.Symbol) *sym.Symbol { - if gotype == nil { - return mustFind(ctxt, "") - } - - if !strings.HasPrefix(gotype.Name, "type.") { - Errorf(gotype, "dwarf: type name doesn't start with \"type.\"") - return mustFind(ctxt, "") - } - - name := gotype.Name[5:] // could also decode from Type.string - - sdie := find(ctxt, name) - - if sdie != nil { - return sdie - } - - return newtype(ctxt, gotype).Sym.(*sym.Symbol) -} - -func newtype(ctxt *Link, gotype *sym.Symbol) *dwarf.DWDie { - name := gotype.Name[5:] // could also decode from Type.string - kind := decodetypeKind(ctxt.Arch, gotype.P) - bytesize := decodetypeSize(ctxt.Arch, gotype.P) - - var die, typedefdie *dwarf.DWDie - switch kind { - case objabi.KindBool: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_BASETYPE, name, 0) - newattr(die, dwarf.DW_AT_encoding, dwarf.DW_CLS_CONSTANT, dwarf.DW_ATE_boolean, 0) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - - case objabi.KindInt, - objabi.KindInt8, - objabi.KindInt16, - objabi.KindInt32, - objabi.KindInt64: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_BASETYPE, name, 0) - newattr(die, dwarf.DW_AT_encoding, dwarf.DW_CLS_CONSTANT, dwarf.DW_ATE_signed, 0) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - - case objabi.KindUint, - objabi.KindUint8, - objabi.KindUint16, - objabi.KindUint32, - objabi.KindUint64, - objabi.KindUintptr: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_BASETYPE, name, 0) - newattr(die, dwarf.DW_AT_encoding, dwarf.DW_CLS_CONSTANT, dwarf.DW_ATE_unsigned, 0) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - - case objabi.KindFloat32, - objabi.KindFloat64: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_BASETYPE, name, 0) - newattr(die, dwarf.DW_AT_encoding, dwarf.DW_CLS_CONSTANT, dwarf.DW_ATE_float, 0) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - - case objabi.KindComplex64, - objabi.KindComplex128: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_BASETYPE, name, 0) - newattr(die, dwarf.DW_AT_encoding, dwarf.DW_CLS_CONSTANT, dwarf.DW_ATE_complex_float, 0) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - - case objabi.KindArray: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_ARRAYTYPE, name, 0) - typedefdie = dotypedef(ctxt, &dwtypes, name, die) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - s := decodetypeArrayElem(ctxt.Arch, gotype) - newrefattr(die, dwarf.DW_AT_type, defgotype(ctxt, s)) - fld := newdie(ctxt, die, dwarf.DW_ABRV_ARRAYRANGE, "range", 0) - - // use actual length not upper bound; correct for 0-length arrays. - newattr(fld, dwarf.DW_AT_count, dwarf.DW_CLS_CONSTANT, decodetypeArrayLen(ctxt.Arch, gotype), 0) - - newrefattr(fld, dwarf.DW_AT_type, mustFind(ctxt, "uintptr")) - - case objabi.KindChan: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_CHANTYPE, name, 0) - s := decodetypeChanElem(ctxt.Arch, gotype) - newrefattr(die, dwarf.DW_AT_go_elem, defgotype(ctxt, s)) - // Save elem type for synthesizechantypes. We could synthesize here - // but that would change the order of DIEs we output. - newrefattr(die, dwarf.DW_AT_type, s) - - case objabi.KindFunc: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_FUNCTYPE, name, 0) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - typedefdie = dotypedef(ctxt, &dwtypes, name, die) - nfields := decodetypeFuncInCount(ctxt.Arch, gotype.P) - for i := 0; i < nfields; i++ { - s := decodetypeFuncInType(ctxt.Arch, gotype, i) - fld := newdie(ctxt, die, dwarf.DW_ABRV_FUNCTYPEPARAM, s.Name[5:], 0) - newrefattr(fld, dwarf.DW_AT_type, defgotype(ctxt, s)) - } - - if decodetypeFuncDotdotdot(ctxt.Arch, gotype.P) { - newdie(ctxt, die, dwarf.DW_ABRV_DOTDOTDOT, "...", 0) - } - nfields = decodetypeFuncOutCount(ctxt.Arch, gotype.P) - for i := 0; i < nfields; i++ { - s := decodetypeFuncOutType(ctxt.Arch, gotype, i) - fld := newdie(ctxt, die, dwarf.DW_ABRV_FUNCTYPEPARAM, s.Name[5:], 0) - newrefattr(fld, dwarf.DW_AT_type, defptrto(ctxt, defgotype(ctxt, s))) - } - - case objabi.KindInterface: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_IFACETYPE, name, 0) - typedefdie = dotypedef(ctxt, &dwtypes, name, die) - nfields := int(decodetypeIfaceMethodCount(ctxt.Arch, gotype.P)) - var s *sym.Symbol - if nfields == 0 { - s = lookupOrDiag(ctxt, "type.runtime.eface") - } else { - s = lookupOrDiag(ctxt, "type.runtime.iface") - } - newrefattr(die, dwarf.DW_AT_type, defgotype(ctxt, s)) - - case objabi.KindMap: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_MAPTYPE, name, 0) - s := decodetypeMapKey(ctxt.Arch, gotype) - newrefattr(die, dwarf.DW_AT_go_key, defgotype(ctxt, s)) - s = decodetypeMapValue(ctxt.Arch, gotype) - newrefattr(die, dwarf.DW_AT_go_elem, defgotype(ctxt, s)) - // Save gotype for use in synthesizemaptypes. We could synthesize here, - // but that would change the order of the DIEs. - newrefattr(die, dwarf.DW_AT_type, gotype) - - case objabi.KindPtr: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_PTRTYPE, name, 0) - typedefdie = dotypedef(ctxt, &dwtypes, name, die) - s := decodetypePtrElem(ctxt.Arch, gotype) - newrefattr(die, dwarf.DW_AT_type, defgotype(ctxt, s)) - - case objabi.KindSlice: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_SLICETYPE, name, 0) - typedefdie = dotypedef(ctxt, &dwtypes, name, die) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - s := decodetypeArrayElem(ctxt.Arch, gotype) - elem := defgotype(ctxt, s) - newrefattr(die, dwarf.DW_AT_go_elem, elem) - - case objabi.KindString: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_STRINGTYPE, name, 0) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - - case objabi.KindStruct: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_STRUCTTYPE, name, 0) - typedefdie = dotypedef(ctxt, &dwtypes, name, die) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, bytesize, 0) - nfields := decodetypeStructFieldCount(ctxt.Arch, gotype) - for i := 0; i < nfields; i++ { - f := decodetypeStructFieldName(ctxt.Arch, gotype, i) - s := decodetypeStructFieldType(ctxt.Arch, gotype, i) - if f == "" { - f = s.Name[5:] // skip "type." - } - fld := newdie(ctxt, die, dwarf.DW_ABRV_STRUCTFIELD, f, 0) - newrefattr(fld, dwarf.DW_AT_type, defgotype(ctxt, s)) - offsetAnon := decodetypeStructFieldOffsAnon(ctxt.Arch, gotype, i) - newmemberoffsetattr(fld, int32(offsetAnon>>1)) - if offsetAnon&1 != 0 { // is embedded field - newattr(fld, dwarf.DW_AT_go_embedded_field, dwarf.DW_CLS_FLAG, 1, 0) - } - } - - case objabi.KindUnsafePointer: - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_BARE_PTRTYPE, name, 0) - - default: - Errorf(gotype, "dwarf: definition of unknown kind %d", kind) - die = newdie(ctxt, &dwtypes, dwarf.DW_ABRV_TYPEDECL, name, 0) - newrefattr(die, dwarf.DW_AT_type, mustFind(ctxt, "")) - } - - newattr(die, dwarf.DW_AT_go_kind, dwarf.DW_CLS_CONSTANT, int64(kind), 0) - if gotype.Attr.Reachable() { - newattr(die, dwarf.DW_AT_go_runtime_type, dwarf.DW_CLS_GO_TYPEREF, 0, gotype) - } - - if _, ok := prototypedies[gotype.Name]; ok { - prototypedies[gotype.Name] = die - } - - if typedefdie != nil { - return typedefdie - } - return die -} - -func nameFromDIESym(dwtype *sym.Symbol) string { - return strings.TrimSuffix(dwtype.Name[len(dwarf.InfoPrefix):], "..def") -} - -// Find or construct *T given T. -func defptrto(ctxt *Link, dwtype *sym.Symbol) *sym.Symbol { - ptrname := "*" + nameFromDIESym(dwtype) - if die := find(ctxt, ptrname); die != nil { - return die - } - - pdie := newdie(ctxt, &dwtypes, dwarf.DW_ABRV_PTRTYPE, ptrname, 0) - newrefattr(pdie, dwarf.DW_AT_type, dwtype) - - // The DWARF info synthesizes pointer types that don't exist at the - // language level, like *hash<...> and *bucket<...>, and the data - // pointers of slices. Link to the ones we can find. - gotype := ctxt.Syms.ROLookup("type."+ptrname, 0) - if gotype != nil && gotype.Attr.Reachable() { - newattr(pdie, dwarf.DW_AT_go_runtime_type, dwarf.DW_CLS_GO_TYPEREF, 0, gotype) - } - return dtolsym(pdie.Sym) -} - -// Copies src's children into dst. Copies attributes by value. -// DWAttr.data is copied as pointer only. If except is one of -// the top-level children, it will not be copied. -func copychildrenexcept(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie, except *dwarf.DWDie) { - for src = src.Child; src != nil; src = src.Link { - if src == except { - continue - } - c := newdie(ctxt, dst, src.Abbrev, getattr(src, dwarf.DW_AT_name).Data.(string), 0) - for a := src.Attr; a != nil; a = a.Link { - newattr(c, a.Atr, int(a.Cls), a.Value, a.Data) - } - copychildrenexcept(ctxt, c, src, nil) - } - - reverselist(&dst.Child) -} - -func copychildren(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie) { - copychildrenexcept(ctxt, dst, src, nil) -} - -// Search children (assumed to have TAG_member) for the one named -// field and set its AT_type to dwtype -func substitutetype(structdie *dwarf.DWDie, field string, dwtype *sym.Symbol) { - child := findchild(structdie, field) - if child == nil { - Exitf("dwarf substitutetype: %s does not have member %s", - getattr(structdie, dwarf.DW_AT_name).Data, field) - return - } - - a := getattr(child, dwarf.DW_AT_type) - if a != nil { - a.Data = dwtype - } else { - newrefattr(child, dwarf.DW_AT_type, dwtype) - } -} - -func findprotodie(ctxt *Link, name string) *dwarf.DWDie { - die, ok := prototypedies[name] - if ok && die == nil { - defgotype(ctxt, lookupOrDiag(ctxt, name)) - die = prototypedies[name] - } - return die -} - -func synthesizestringtypes(ctxt *Link, die *dwarf.DWDie) { - prototype := walktypedef(findprotodie(ctxt, "type.runtime.stringStructDWARF")) - if prototype == nil { - return - } - - for ; die != nil; die = die.Link { - if die.Abbrev != dwarf.DW_ABRV_STRINGTYPE { - continue - } - copychildren(ctxt, die, prototype) - } -} - -func synthesizeslicetypes(ctxt *Link, die *dwarf.DWDie) { - prototype := walktypedef(findprotodie(ctxt, "type.runtime.slice")) - if prototype == nil { - return - } - - for ; die != nil; die = die.Link { - if die.Abbrev != dwarf.DW_ABRV_SLICETYPE { - continue - } - copychildren(ctxt, die, prototype) - elem := getattr(die, dwarf.DW_AT_go_elem).Data.(*sym.Symbol) - substitutetype(die, "array", defptrto(ctxt, elem)) - } -} - -func mkinternaltypename(base string, arg1 string, arg2 string) string { - if arg2 == "" { - return fmt.Sprintf("%s<%s>", base, arg1) - } - return fmt.Sprintf("%s<%s,%s>", base, arg1, arg2) -} - -// synthesizemaptypes is way too closely married to runtime/hashmap.c -const ( - MaxKeySize = 128 - MaxValSize = 128 - BucketSize = 8 -) - -func mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valname string, f func(*dwarf.DWDie)) *sym.Symbol { - name := mkinternaltypename(typename, keyname, valname) - symname := dwarf.InfoPrefix + name - s := ctxt.Syms.ROLookup(symname, 0) - if s != nil && s.Type == sym.SDWARFINFO { - return s - } - die := newdie(ctxt, &dwtypes, abbrev, name, 0) - f(die) - return dtolsym(die.Sym) -} - -func synthesizemaptypes(ctxt *Link, die *dwarf.DWDie) { - hash := walktypedef(findprotodie(ctxt, "type.runtime.hmap")) - bucket := walktypedef(findprotodie(ctxt, "type.runtime.bmap")) - - if hash == nil { - return - } - - for ; die != nil; die = die.Link { - if die.Abbrev != dwarf.DW_ABRV_MAPTYPE { - continue - } - gotype := getattr(die, dwarf.DW_AT_type).Data.(*sym.Symbol) - keytype := decodetypeMapKey(ctxt.Arch, gotype) - valtype := decodetypeMapValue(ctxt.Arch, gotype) - keysize, valsize := decodetypeSize(ctxt.Arch, keytype.P), decodetypeSize(ctxt.Arch, valtype.P) - keytype, valtype = walksymtypedef(ctxt, defgotype(ctxt, keytype)), walksymtypedef(ctxt, defgotype(ctxt, valtype)) - - // compute size info like hashmap.c does. - indirectKey, indirectVal := false, false - if keysize > MaxKeySize { - keysize = int64(ctxt.Arch.PtrSize) - indirectKey = true - } - if valsize > MaxValSize { - valsize = int64(ctxt.Arch.PtrSize) - indirectVal = true - } - - // Construct type to represent an array of BucketSize keys - keyname := nameFromDIESym(keytype) - dwhks := mkinternaltype(ctxt, dwarf.DW_ABRV_ARRAYTYPE, "[]key", keyname, "", func(dwhk *dwarf.DWDie) { - newattr(dwhk, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, BucketSize*keysize, 0) - t := keytype - if indirectKey { - t = defptrto(ctxt, keytype) - } - newrefattr(dwhk, dwarf.DW_AT_type, t) - fld := newdie(ctxt, dwhk, dwarf.DW_ABRV_ARRAYRANGE, "size", 0) - newattr(fld, dwarf.DW_AT_count, dwarf.DW_CLS_CONSTANT, BucketSize, 0) - newrefattr(fld, dwarf.DW_AT_type, mustFind(ctxt, "uintptr")) - }) - - // Construct type to represent an array of BucketSize values - valname := nameFromDIESym(valtype) - dwhvs := mkinternaltype(ctxt, dwarf.DW_ABRV_ARRAYTYPE, "[]val", valname, "", func(dwhv *dwarf.DWDie) { - newattr(dwhv, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, BucketSize*valsize, 0) - t := valtype - if indirectVal { - t = defptrto(ctxt, valtype) - } - newrefattr(dwhv, dwarf.DW_AT_type, t) - fld := newdie(ctxt, dwhv, dwarf.DW_ABRV_ARRAYRANGE, "size", 0) - newattr(fld, dwarf.DW_AT_count, dwarf.DW_CLS_CONSTANT, BucketSize, 0) - newrefattr(fld, dwarf.DW_AT_type, mustFind(ctxt, "uintptr")) - }) - - // Construct bucket - dwhbs := mkinternaltype(ctxt, dwarf.DW_ABRV_STRUCTTYPE, "bucket", keyname, valname, func(dwhb *dwarf.DWDie) { - // Copy over all fields except the field "data" from the generic - // bucket. "data" will be replaced with keys/values below. - copychildrenexcept(ctxt, dwhb, bucket, findchild(bucket, "data")) - - fld := newdie(ctxt, dwhb, dwarf.DW_ABRV_STRUCTFIELD, "keys", 0) - newrefattr(fld, dwarf.DW_AT_type, dwhks) - newmemberoffsetattr(fld, BucketSize) - fld = newdie(ctxt, dwhb, dwarf.DW_ABRV_STRUCTFIELD, "values", 0) - newrefattr(fld, dwarf.DW_AT_type, dwhvs) - newmemberoffsetattr(fld, BucketSize+BucketSize*int32(keysize)) - fld = newdie(ctxt, dwhb, dwarf.DW_ABRV_STRUCTFIELD, "overflow", 0) - newrefattr(fld, dwarf.DW_AT_type, defptrto(ctxt, dtolsym(dwhb.Sym))) - newmemberoffsetattr(fld, BucketSize+BucketSize*(int32(keysize)+int32(valsize))) - if ctxt.Arch.RegSize > ctxt.Arch.PtrSize { - fld = newdie(ctxt, dwhb, dwarf.DW_ABRV_STRUCTFIELD, "pad", 0) - newrefattr(fld, dwarf.DW_AT_type, mustFind(ctxt, "uintptr")) - newmemberoffsetattr(fld, BucketSize+BucketSize*(int32(keysize)+int32(valsize))+int32(ctxt.Arch.PtrSize)) - } - - newattr(dwhb, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, BucketSize+BucketSize*keysize+BucketSize*valsize+int64(ctxt.Arch.RegSize), 0) - }) - - // Construct hash - dwhs := mkinternaltype(ctxt, dwarf.DW_ABRV_STRUCTTYPE, "hash", keyname, valname, func(dwh *dwarf.DWDie) { - copychildren(ctxt, dwh, hash) - substitutetype(dwh, "buckets", defptrto(ctxt, dwhbs)) - substitutetype(dwh, "oldbuckets", defptrto(ctxt, dwhbs)) - newattr(dwh, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, getattr(hash, dwarf.DW_AT_byte_size).Value, nil) - }) - - // make map type a pointer to hash - newrefattr(die, dwarf.DW_AT_type, defptrto(ctxt, dwhs)) - } -} - -func synthesizechantypes(ctxt *Link, die *dwarf.DWDie) { - sudog := walktypedef(findprotodie(ctxt, "type.runtime.sudog")) - waitq := walktypedef(findprotodie(ctxt, "type.runtime.waitq")) - hchan := walktypedef(findprotodie(ctxt, "type.runtime.hchan")) - if sudog == nil || waitq == nil || hchan == nil { - return - } - - sudogsize := int(getattr(sudog, dwarf.DW_AT_byte_size).Value) - - for ; die != nil; die = die.Link { - if die.Abbrev != dwarf.DW_ABRV_CHANTYPE { - continue - } - elemgotype := getattr(die, dwarf.DW_AT_type).Data.(*sym.Symbol) - elemname := elemgotype.Name[5:] - elemtype := walksymtypedef(ctxt, defgotype(ctxt, elemgotype)) - - // sudog - dwss := mkinternaltype(ctxt, dwarf.DW_ABRV_STRUCTTYPE, "sudog", elemname, "", func(dws *dwarf.DWDie) { - copychildren(ctxt, dws, sudog) - substitutetype(dws, "elem", defptrto(ctxt, elemtype)) - newattr(dws, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, int64(sudogsize), nil) - }) - - // waitq - dwws := mkinternaltype(ctxt, dwarf.DW_ABRV_STRUCTTYPE, "waitq", elemname, "", func(dww *dwarf.DWDie) { - - copychildren(ctxt, dww, waitq) - substitutetype(dww, "first", defptrto(ctxt, dwss)) - substitutetype(dww, "last", defptrto(ctxt, dwss)) - newattr(dww, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, getattr(waitq, dwarf.DW_AT_byte_size).Value, nil) - }) - - // hchan - dwhs := mkinternaltype(ctxt, dwarf.DW_ABRV_STRUCTTYPE, "hchan", elemname, "", func(dwh *dwarf.DWDie) { - copychildren(ctxt, dwh, hchan) - substitutetype(dwh, "recvq", dwws) - substitutetype(dwh, "sendq", dwws) - newattr(dwh, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, getattr(hchan, dwarf.DW_AT_byte_size).Value, nil) - }) - - newrefattr(die, dwarf.DW_AT_type, defptrto(ctxt, dwhs)) - } -} - -func dwarfDefineGlobal(ctxt *Link, s *sym.Symbol, str string, v int64, gotype *sym.Symbol) { - // Find a suitable CU DIE to include the global. - // One would think it's as simple as just looking at the unit, but that might - // not have any reachable code. So, we go to the runtime's CU if our unit - // isn't otherwise reachable. - var unit *sym.CompilationUnit - if s.Unit != nil { - unit = s.Unit - } else { - unit = ctxt.runtimeCU - } - dv := newdie(ctxt, unit.DWInfo, dwarf.DW_ABRV_VARIABLE, str, int(s.Version)) - newabslocexprattr(dv, v, s) - if !s.IsFileLocal() { - newattr(dv, dwarf.DW_AT_external, dwarf.DW_CLS_FLAG, 1, 0) - } - dt := defgotype(ctxt, gotype) - newrefattr(dv, dwarf.DW_AT_type, dt) -} - -// For use with pass.c::genasmsym -func defdwsymb(ctxt *Link, s *sym.Symbol, str string, t SymbolType, v int64, gotype *sym.Symbol) { - if strings.HasPrefix(str, "go.string.") { - return - } - if strings.HasPrefix(str, "runtime.gcbits.") { - return - } - - switch t { - case DataSym, BSSSym: - switch s.Type { - case sym.SDATA, sym.SNOPTRDATA, sym.STYPE, sym.SBSS, sym.SNOPTRBSS, sym.STLSBSS: - // ok - case sym.SRODATA: - if gotype != nil { - defgotype(ctxt, gotype) - } - return - default: - return - } - if ctxt.LinkMode != LinkExternal && isStaticTemp(s.Name) { - return - } - dwarfDefineGlobal(ctxt, s, str, v, gotype) - - case AutoSym, ParamSym, DeletedAutoSym: - defgotype(ctxt, gotype) - } -} - -// createUnitLength creates the initial length field with value v and update -// offset of unit_length if needed. -func createUnitLength(ctxt *Link, s *sym.Symbol, v uint64) { - if isDwarf64(ctxt) { - s.AddUint32(ctxt.Arch, 0xFFFFFFFF) - } - addDwarfAddrField(ctxt, s, v) -} - -// addDwarfAddrField adds a DWARF field in DWARF 64bits or 32bits. -func addDwarfAddrField(ctxt *Link, s *sym.Symbol, v uint64) { - if isDwarf64(ctxt) { - s.AddUint(ctxt.Arch, v) - } else { - s.AddUint32(ctxt.Arch, uint32(v)) - } -} - -// addDwarfAddrRef adds a DWARF pointer in DWARF 64bits or 32bits. -func addDwarfAddrRef(ctxt *Link, s *sym.Symbol, t *sym.Symbol) { - if isDwarf64(ctxt) { - adddwarfref(ctxt, s, t, 8) - } else { - adddwarfref(ctxt, s, t, 4) - } -} - -// calcCompUnitRanges calculates the PC ranges of the compilation units. -func calcCompUnitRanges(ctxt *Link) { - var prevUnit *sym.CompilationUnit - for _, s := range ctxt.Textp { - if s.FuncInfo == nil { - continue - } - // Skip linker-created functions (ex: runtime.addmoduledata), since they - // don't have DWARF to begin with. - if s.Unit == nil { - continue - } - unit := s.Unit - // Update PC ranges. - // - // We don't simply compare the end of the previous - // symbol with the start of the next because there's - // often a little padding between them. Instead, we - // only create boundaries between symbols from - // different units. - if prevUnit != unit { - unit.PCs = append(unit.PCs, dwarf.Range{Start: s.Value - unit.Textp[0].Value}) - prevUnit = unit - } - unit.PCs[len(unit.PCs)-1].End = s.Value - unit.Textp[0].Value + s.Size - } -} - -func movetomodule(ctxt *Link, parent *dwarf.DWDie) { - die := ctxt.runtimeCU.DWInfo.Child - if die == nil { - ctxt.runtimeCU.DWInfo.Child = parent.Child - return - } - for die.Link != nil { - die = die.Link - } - die.Link = parent.Child -} - -// If the pcln table contains runtime/proc.go, use that to set gdbscript path. -func finddebugruntimepath(s *sym.Symbol) { - if gdbscript != "" { - return - } - - for i := range s.FuncInfo.File { - f := s.FuncInfo.File[i] - // We can't use something that may be dead-code - // eliminated from a binary here. proc.go contains - // main and the scheduler, so it's not going anywhere. - if i := strings.Index(f.Name, "runtime/proc.go"); i >= 0 { - gdbscript = f.Name[:i] + "runtime/runtime-gdb.py" - break - } - } -} - -/* - * Generate a sequence of opcodes that is as short as possible. - * See section 6.2.5 - */ -const ( - LINE_BASE = -4 - LINE_RANGE = 10 - PC_RANGE = (255 - OPCODE_BASE) / LINE_RANGE - OPCODE_BASE = 11 -) - -/* - * Walk prog table, emit line program and build DIE tree. - */ - -func getCompilationDir() string { - // OSX requires this be set to something, but it's not easy to choose - // a value. Linking takes place in a temporary directory, so there's - // no point including it here. Paths in the file table are usually - // absolute, in which case debuggers will ignore this value. -trimpath - // produces relative paths, but we don't know where they start, so - // all we can do here is try not to make things worse. - return "." -} - -func importInfoSymbol(ctxt *Link, dsym *sym.Symbol) { - dsym.Attr |= sym.AttrNotInSymbolTable | sym.AttrReachable - dsym.Type = sym.SDWARFINFO - for i := range dsym.R { - r := &dsym.R[i] // Copying sym.Reloc has measurable impact on performance - if r.Type == objabi.R_DWARFSECREF && r.Sym.Size == 0 { - n := nameFromDIESym(r.Sym) - defgotype(ctxt, ctxt.Syms.Lookup("type."+n, 0)) - } - } -} - -func writelines(ctxt *Link, unit *sym.CompilationUnit, ls *sym.Symbol) { - - var dwarfctxt dwarf.Context = dwctxt{ctxt} - is_stmt := uint8(1) // initially = recommended default_is_stmt = 1, tracks is_stmt toggles. - - unitstart := int64(-1) - headerstart := int64(-1) - headerend := int64(-1) - - newattr(unit.DWInfo, dwarf.DW_AT_stmt_list, dwarf.DW_CLS_PTR, ls.Size, ls) - - // Write .debug_line Line Number Program Header (sec 6.2.4) - // Fields marked with (*) must be changed for 64-bit dwarf - unitLengthOffset := ls.Size - createUnitLength(ctxt, ls, 0) // unit_length (*), filled in at end - unitstart = ls.Size - ls.AddUint16(ctxt.Arch, 2) // dwarf version (appendix F) -- version 3 is incompatible w/ XCode 9.0's dsymutil, latest supported on OSX 10.12 as of 2018-05 - headerLengthOffset := ls.Size - addDwarfAddrField(ctxt, ls, 0) // header_length (*), filled in at end - headerstart = ls.Size - - // cpos == unitstart + 4 + 2 + 4 - ls.AddUint8(1) // minimum_instruction_length - ls.AddUint8(is_stmt) // default_is_stmt - ls.AddUint8(LINE_BASE & 0xFF) // line_base - ls.AddUint8(LINE_RANGE) // line_range - ls.AddUint8(OPCODE_BASE) // opcode_base - ls.AddUint8(0) // standard_opcode_lengths[1] - ls.AddUint8(1) // standard_opcode_lengths[2] - ls.AddUint8(1) // standard_opcode_lengths[3] - ls.AddUint8(1) // standard_opcode_lengths[4] - ls.AddUint8(1) // standard_opcode_lengths[5] - ls.AddUint8(0) // standard_opcode_lengths[6] - ls.AddUint8(0) // standard_opcode_lengths[7] - ls.AddUint8(0) // standard_opcode_lengths[8] - ls.AddUint8(1) // standard_opcode_lengths[9] - ls.AddUint8(0) // standard_opcode_lengths[10] - ls.AddUint8(0) // include_directories (empty) - - // Copy over the file table. - fileNums := make(map[string]int) - for i, name := range unit.DWARFFileTable { - if len(name) != 0 { - if strings.HasPrefix(name, src.FileSymPrefix) { - name = name[len(src.FileSymPrefix):] - } - name = expandGoroot(name) - } else { - // Can't have empty filenames, and having a unique filename is quite useful - // for debugging. - name = fmt.Sprintf("_%d", i) - } - fileNums[name] = i + 1 - dwarfctxt.AddString(ls, name) - ls.AddUint8(0) - ls.AddUint8(0) - ls.AddUint8(0) - } - // Grab files for inlined functions. - // TODO: With difficulty, this could be moved into the compiler. - for _, s := range unit.Textp { - dsym := dwarfFuncSym(ctxt, s, dwarf.InfoPrefix, true) - for ri := 0; ri < len(dsym.R); ri++ { - r := &dsym.R[ri] - if r.Type != objabi.R_DWARFFILEREF { - continue - } - name := r.Sym.Name - if _, ok := fileNums[name]; ok { - continue - } - fileNums[name] = len(fileNums) + 1 - dwarfctxt.AddString(ls, name) - ls.AddUint8(0) - ls.AddUint8(0) - ls.AddUint8(0) - } - } - - // 4 zeros: the string termination + 3 fields. - ls.AddUint8(0) - // terminate file_names. - headerend = ls.Size - - // Output the state machine for each function remaining. - var lastAddr int64 - for _, s := range unit.Textp { - finddebugruntimepath(s) - - // Set the PC. - ls.AddUint8(0) - dwarf.Uleb128put(dwarfctxt, ls, 1+int64(ctxt.Arch.PtrSize)) - ls.AddUint8(dwarf.DW_LNE_set_address) - addr := ls.AddAddr(ctxt.Arch, s) - // Make sure the units are sorted. - if addr < lastAddr { - Errorf(s, "address wasn't increasing %x < %x", addr, lastAddr) - } - lastAddr = addr - - // Output the line table. - // TODO: Now that we have all the debug information in separate - // symbols, it would make sense to use a rope, and concatenate them all - // together rather then the append() below. This would allow us to have - // the compiler emit the DW_LNE_set_address and a rope data structure - // to concat them all together in the output. - lines := dwarfFuncSym(ctxt, s, dwarf.DebugLinesPrefix, false) - if lines != nil { - ls.P = append(ls.P, lines.P...) - } - } - - ls.AddUint8(0) // start extended opcode - dwarf.Uleb128put(dwarfctxt, ls, 1) - ls.AddUint8(dwarf.DW_LNE_end_sequence) - - if ctxt.HeadType == objabi.Haix { - saveDwsectCUSize(".debug_line", unit.Lib.Pkg, uint64(ls.Size-unitLengthOffset)) - } - if isDwarf64(ctxt) { - ls.SetUint(ctxt.Arch, unitLengthOffset+4, uint64(ls.Size-unitstart)) // +4 because of 0xFFFFFFFF - ls.SetUint(ctxt.Arch, headerLengthOffset, uint64(headerend-headerstart)) - } else { - ls.SetUint32(ctxt.Arch, unitLengthOffset, uint32(ls.Size-unitstart)) - ls.SetUint32(ctxt.Arch, headerLengthOffset, uint32(headerend-headerstart)) - } - - // Process any R_DWARFFILEREF relocations, since we now know the - // line table file indices for this compilation unit. Note that - // this loop visits only subprogram DIEs: if the compiler is - // changed to generate DW_AT_decl_file attributes for other - // DIE flavors (ex: variables) then those DIEs would need to - // be included below. - missing := make(map[int]interface{}) - s := unit.Textp[0] - for _, f := range unit.FuncDIEs { - for ri := range f.R { - r := &f.R[ri] - if r.Type != objabi.R_DWARFFILEREF { - continue - } - idx, ok := fileNums[r.Sym.Name] - if ok { - if int(int32(idx)) != idx { - Errorf(f, "bad R_DWARFFILEREF relocation: file index overflow") - } - if r.Siz != 4 { - Errorf(f, "bad R_DWARFFILEREF relocation: has size %d, expected 4", r.Siz) - } - if r.Off < 0 || r.Off+4 > int32(len(f.P)) { - Errorf(f, "bad R_DWARFFILEREF relocation offset %d + 4 would write past length %d", r.Off, len(s.P)) - continue - } - if r.Add != 0 { - Errorf(f, "bad R_DWARFFILEREF relocation: addend not zero") - } - r.Sym.Attr |= sym.AttrReachable | sym.AttrNotInSymbolTable - r.Add = int64(idx) // record the index in r.Add, we'll apply it in the reloc phase. - } else { - _, found := missing[int(r.Sym.Value)] - if !found { - Errorf(f, "R_DWARFFILEREF relocation file missing: %v idx %d", r.Sym, r.Sym.Value) - missing[int(r.Sym.Value)] = nil - } - } - } - } -} - -// writepcranges generates the DW_AT_ranges table for compilation unit cu. -func writepcranges(ctxt *Link, unit *sym.CompilationUnit, base *sym.Symbol, pcs []dwarf.Range, ranges *sym.Symbol) { - var dwarfctxt dwarf.Context = dwctxt{ctxt} - - unitLengthOffset := ranges.Size - - // Create PC ranges for this CU. - newattr(unit.DWInfo, dwarf.DW_AT_ranges, dwarf.DW_CLS_PTR, ranges.Size, ranges) - newattr(unit.DWInfo, dwarf.DW_AT_low_pc, dwarf.DW_CLS_ADDRESS, base.Value, base) - dwarf.PutBasedRanges(dwarfctxt, ranges, pcs) - - if ctxt.HeadType == objabi.Haix { - addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(ranges.Size-unitLengthOffset)) - } - -} - -/* - * Emit .debug_frame - */ -const ( - dataAlignmentFactor = -4 -) - -// appendPCDeltaCFA appends per-PC CFA deltas to b and returns the final slice. -func appendPCDeltaCFA(arch *sys.Arch, b []byte, deltapc, cfa int64) []byte { - b = append(b, dwarf.DW_CFA_def_cfa_offset_sf) - b = dwarf.AppendSleb128(b, cfa/dataAlignmentFactor) - - switch { - case deltapc < 0x40: - b = append(b, uint8(dwarf.DW_CFA_advance_loc+deltapc)) - case deltapc < 0x100: - b = append(b, dwarf.DW_CFA_advance_loc1) - b = append(b, uint8(deltapc)) - case deltapc < 0x10000: - b = append(b, dwarf.DW_CFA_advance_loc2, 0, 0) - arch.ByteOrder.PutUint16(b[len(b)-2:], uint16(deltapc)) - default: - b = append(b, dwarf.DW_CFA_advance_loc4, 0, 0, 0, 0) - arch.ByteOrder.PutUint32(b[len(b)-4:], uint32(deltapc)) - } - return b -} - -func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { - var dwarfctxt dwarf.Context = dwctxt{ctxt} - fs := ctxt.Syms.Lookup(".debug_frame", 0) - fs.Type = sym.SDWARFSECT - syms = append(syms, fs) - - // Length field is 4 bytes on Dwarf32 and 12 bytes on Dwarf64 - lengthFieldSize := int64(4) - if isDwarf64(ctxt) { - lengthFieldSize += 8 - } - - // Emit the CIE, Section 6.4.1 - cieReserve := uint32(16) - if haslinkregister(ctxt) { - cieReserve = 32 - } - if isDwarf64(ctxt) { - cieReserve += 4 // 4 bytes added for cid - } - createUnitLength(ctxt, fs, uint64(cieReserve)) // initial length, must be multiple of thearch.ptrsize - addDwarfAddrField(ctxt, fs, ^uint64(0)) // cid - fs.AddUint8(3) // dwarf version (appendix F) - fs.AddUint8(0) // augmentation "" - dwarf.Uleb128put(dwarfctxt, fs, 1) // code_alignment_factor - dwarf.Sleb128put(dwarfctxt, fs, dataAlignmentFactor) // all CFI offset calculations include multiplication with this factor - dwarf.Uleb128put(dwarfctxt, fs, int64(thearch.Dwarfreglr)) // return_address_register - - fs.AddUint8(dwarf.DW_CFA_def_cfa) // Set the current frame address.. - dwarf.Uleb128put(dwarfctxt, fs, int64(thearch.Dwarfregsp)) // ...to use the value in the platform's SP register (defined in l.go)... - if haslinkregister(ctxt) { - dwarf.Uleb128put(dwarfctxt, fs, int64(0)) // ...plus a 0 offset. - - fs.AddUint8(dwarf.DW_CFA_same_value) // The platform's link register is unchanged during the prologue. - dwarf.Uleb128put(dwarfctxt, fs, int64(thearch.Dwarfreglr)) - - fs.AddUint8(dwarf.DW_CFA_val_offset) // The previous value... - dwarf.Uleb128put(dwarfctxt, fs, int64(thearch.Dwarfregsp)) // ...of the platform's SP register... - dwarf.Uleb128put(dwarfctxt, fs, int64(0)) // ...is CFA+0. - } else { - dwarf.Uleb128put(dwarfctxt, fs, int64(ctxt.Arch.PtrSize)) // ...plus the word size (because the call instruction implicitly adds one word to the frame). - - fs.AddUint8(dwarf.DW_CFA_offset_extended) // The previous value... - dwarf.Uleb128put(dwarfctxt, fs, int64(thearch.Dwarfreglr)) // ...of the return address... - dwarf.Uleb128put(dwarfctxt, fs, int64(-ctxt.Arch.PtrSize)/dataAlignmentFactor) // ...is saved at [CFA - (PtrSize/4)]. - } - - pad := int64(cieReserve) + lengthFieldSize - fs.Size - - if pad < 0 { - Exitf("dwarf: cieReserve too small by %d bytes.", -pad) - } - - fs.AddBytes(zeros[:pad]) - - var deltaBuf []byte - pcsp := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) - for _, s := range ctxt.Textp { - if s.FuncInfo == nil { - continue - } - - // Emit a FDE, Section 6.4.1. - // First build the section contents into a byte buffer. - deltaBuf = deltaBuf[:0] - if haslinkregister(ctxt) && s.Attr.TopFrame() { - // Mark the link register as having an undefined value. - // This stops call stack unwinders progressing any further. - // TODO: similar mark on non-LR architectures. - deltaBuf = append(deltaBuf, dwarf.DW_CFA_undefined) - deltaBuf = dwarf.AppendUleb128(deltaBuf, uint64(thearch.Dwarfreglr)) - } - for pcsp.Init(s.FuncInfo.Pcsp.P); !pcsp.Done; pcsp.Next() { - nextpc := pcsp.NextPC - - // pciterinit goes up to the end of the function, - // but DWARF expects us to stop just before the end. - if int64(nextpc) == s.Size { - nextpc-- - if nextpc < pcsp.PC { - continue - } - } - - spdelta := int64(pcsp.Value) - if !haslinkregister(ctxt) { - // Return address has been pushed onto stack. - spdelta += int64(ctxt.Arch.PtrSize) - } - - if haslinkregister(ctxt) && !s.Attr.TopFrame() { - // TODO(bryanpkc): This is imprecise. In general, the instruction - // that stores the return address to the stack frame is not the - // same one that allocates the frame. - if pcsp.Value > 0 { - // The return address is preserved at (CFA-frame_size) - // after a stack frame has been allocated. - deltaBuf = append(deltaBuf, dwarf.DW_CFA_offset_extended_sf) - deltaBuf = dwarf.AppendUleb128(deltaBuf, uint64(thearch.Dwarfreglr)) - deltaBuf = dwarf.AppendSleb128(deltaBuf, -spdelta/dataAlignmentFactor) - } else { - // The return address is restored into the link register - // when a stack frame has been de-allocated. - deltaBuf = append(deltaBuf, dwarf.DW_CFA_same_value) - deltaBuf = dwarf.AppendUleb128(deltaBuf, uint64(thearch.Dwarfreglr)) - } - } - - deltaBuf = appendPCDeltaCFA(ctxt.Arch, deltaBuf, int64(nextpc)-int64(pcsp.PC), spdelta) - } - pad := int(Rnd(int64(len(deltaBuf)), int64(ctxt.Arch.PtrSize))) - len(deltaBuf) - deltaBuf = append(deltaBuf, zeros[:pad]...) - - // Emit the FDE header, Section 6.4.1. - // 4 bytes: length, must be multiple of thearch.ptrsize - // 4/8 bytes: Pointer to the CIE above, at offset 0 - // ptrsize: initial location - // ptrsize: address range - - fdeLength := uint64(4 + 2*ctxt.Arch.PtrSize + len(deltaBuf)) - if isDwarf64(ctxt) { - fdeLength += 4 // 4 bytes added for CIE pointer - } - createUnitLength(ctxt, fs, fdeLength) - - if ctxt.LinkMode == LinkExternal { - addDwarfAddrRef(ctxt, fs, fs) - } else { - addDwarfAddrField(ctxt, fs, 0) // CIE offset - } - fs.AddAddr(ctxt.Arch, s) - fs.AddUintXX(ctxt.Arch, uint64(s.Size), ctxt.Arch.PtrSize) // address range - fs.AddBytes(deltaBuf) - - if ctxt.HeadType == objabi.Haix { - addDwsectCUSize(".debug_frame", s.File, fdeLength+uint64(lengthFieldSize)) - } - } - return syms -} - -/* - * Walk DWarfDebugInfoEntries, and emit .debug_info - */ -const ( - COMPUNITHEADERSIZE = 4 + 2 + 4 + 1 -) - -func writeinfo(ctxt *Link, syms []*sym.Symbol, units []*sym.CompilationUnit, abbrevsym *sym.Symbol, pubNames, pubTypes *pubWriter) []*sym.Symbol { - infosec := ctxt.Syms.Lookup(".debug_info", 0) - infosec.Type = sym.SDWARFINFO - infosec.Attr |= sym.AttrReachable - syms = append(syms, infosec) - - var dwarfctxt dwarf.Context = dwctxt{ctxt} - - for _, u := range units { - compunit := u.DWInfo - s := dtolsym(compunit.Sym) - - if len(u.Textp) == 0 && u.DWInfo.Child == nil { - continue - } - - pubNames.beginCompUnit(compunit) - pubTypes.beginCompUnit(compunit) - - // Write .debug_info Compilation Unit Header (sec 7.5.1) - // Fields marked with (*) must be changed for 64-bit dwarf - // This must match COMPUNITHEADERSIZE above. - createUnitLength(ctxt, s, 0) // unit_length (*), will be filled in later. - s.AddUint16(ctxt.Arch, 4) // dwarf version (appendix F) - - // debug_abbrev_offset (*) - addDwarfAddrRef(ctxt, s, abbrevsym) - - s.AddUint8(uint8(ctxt.Arch.PtrSize)) // address_size - - dwarf.Uleb128put(dwarfctxt, s, int64(compunit.Abbrev)) - dwarf.PutAttrs(dwarfctxt, s, compunit.Abbrev, compunit.Attr) - - cu := []*sym.Symbol{s} - cu = append(cu, u.AbsFnDIEs...) - cu = append(cu, u.FuncDIEs...) - if u.Consts != nil { - cu = append(cu, u.Consts) - } - var cusize int64 - for _, child := range cu { - cusize += child.Size - } - - for die := compunit.Child; die != nil; die = die.Link { - l := len(cu) - lastSymSz := cu[l-1].Size - cu = putdie(ctxt, dwarfctxt, cu, die) - if ispubname(die) { - pubNames.add(die, cusize) - } - if ispubtype(die) { - pubTypes.add(die, cusize) - } - if lastSymSz != cu[l-1].Size { - // putdie will sometimes append directly to the last symbol of the list - cusize = cusize - lastSymSz + cu[l-1].Size - } - for _, child := range cu[l:] { - cusize += child.Size - } - } - cu[len(cu)-1].AddUint8(0) // closes compilation unit DIE - cusize++ - - // Save size for AIX symbol table. - if ctxt.HeadType == objabi.Haix { - saveDwsectCUSize(".debug_info", getPkgFromCUSym(s), uint64(cusize)) - } - if isDwarf64(ctxt) { - cusize -= 12 // exclude the length field. - s.SetUint(ctxt.Arch, 4, uint64(cusize)) // 4 because of 0XFFFFFFFF - } else { - cusize -= 4 // exclude the length field. - s.SetUint32(ctxt.Arch, 0, uint32(cusize)) - } - pubNames.endCompUnit(compunit, uint32(cusize)+4) - pubTypes.endCompUnit(compunit, uint32(cusize)+4) - syms = append(syms, cu...) - } - return syms -} - -/* - * Emit .debug_pubnames/_types. _info must have been written before, - * because we need die->offs and infoo/infosize; - */ -func ispubname(die *dwarf.DWDie) bool { - switch die.Abbrev { - case dwarf.DW_ABRV_FUNCTION, dwarf.DW_ABRV_VARIABLE: - a := getattr(die, dwarf.DW_AT_external) - return a != nil && a.Value != 0 - } - - return false -} - -func ispubtype(die *dwarf.DWDie) bool { - return die.Abbrev >= dwarf.DW_ABRV_NULLTYPE -} - -type pubWriter struct { - ctxt *Link - s *sym.Symbol - sname string - - sectionstart int64 - culengthOff int64 -} - -func newPubWriter(ctxt *Link, sname string) *pubWriter { - s := ctxt.Syms.Lookup(sname, 0) - s.Type = sym.SDWARFSECT - return &pubWriter{ctxt: ctxt, s: s, sname: sname} -} - -func (pw *pubWriter) beginCompUnit(compunit *dwarf.DWDie) { - pw.sectionstart = pw.s.Size - - // Write .debug_pubnames/types Header (sec 6.1.1) - createUnitLength(pw.ctxt, pw.s, 0) // unit_length (*), will be filled in later. - pw.s.AddUint16(pw.ctxt.Arch, 2) // dwarf version (appendix F) - addDwarfAddrRef(pw.ctxt, pw.s, dtolsym(compunit.Sym)) // debug_info_offset (of the Comp unit Header) - pw.culengthOff = pw.s.Size - addDwarfAddrField(pw.ctxt, pw.s, uint64(0)) // debug_info_length, will be filled in later. - -} - -func (pw *pubWriter) add(die *dwarf.DWDie, offset int64) { - dwa := getattr(die, dwarf.DW_AT_name) - name := dwa.Data.(string) - if die.Sym == nil { - fmt.Println("Missing sym for ", name) - } - addDwarfAddrField(pw.ctxt, pw.s, uint64(offset)) - Addstring(pw.s, name) -} - -func (pw *pubWriter) endCompUnit(compunit *dwarf.DWDie, culength uint32) { - addDwarfAddrField(pw.ctxt, pw.s, 0) // Null offset - - // On AIX, save the current size of this compilation unit. - if pw.ctxt.HeadType == objabi.Haix { - saveDwsectCUSize(pw.sname, getPkgFromCUSym(dtolsym(compunit.Sym)), uint64(pw.s.Size-pw.sectionstart)) - } - if isDwarf64(pw.ctxt) { - pw.s.SetUint(pw.ctxt.Arch, pw.sectionstart+4, uint64(pw.s.Size-pw.sectionstart)-12) // exclude the length field. - pw.s.SetUint(pw.ctxt.Arch, pw.culengthOff, uint64(culength)) - } else { - pw.s.SetUint32(pw.ctxt.Arch, pw.sectionstart, uint32(pw.s.Size-pw.sectionstart)-4) // exclude the length field. - pw.s.SetUint32(pw.ctxt.Arch, pw.culengthOff, culength) - } -} - -func writegdbscript(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { - // TODO (aix): make it available - if ctxt.HeadType == objabi.Haix { - return syms - } - if ctxt.LinkMode == LinkExternal && ctxt.HeadType == objabi.Hwindows && ctxt.BuildMode == BuildModeCArchive { - // gcc on Windows places .debug_gdb_scripts in the wrong location, which - // causes the program not to run. See https://golang.org/issue/20183 - // Non c-archives can avoid this issue via a linker script - // (see fix near writeGDBLinkerScript). - // c-archive users would need to specify the linker script manually. - // For UX it's better not to deal with this. - return syms - } - - if gdbscript != "" { - s := ctxt.Syms.Lookup(".debug_gdb_scripts", 0) - s.Type = sym.SDWARFSECT - syms = append(syms, s) - s.AddUint8(1) // magic 1 byte? - Addstring(s, gdbscript) - } - - return syms -} - -var prototypedies map[string]*dwarf.DWDie - -func dwarfEnabled(ctxt *Link) bool { - if *FlagW { // disable dwarf - return false - } - if *FlagS && ctxt.HeadType != objabi.Hdarwin { - return false - } - if ctxt.HeadType == objabi.Hplan9 || ctxt.HeadType == objabi.Hjs { - return false - } - - if ctxt.LinkMode == LinkExternal { - switch { - case ctxt.IsELF: - case ctxt.HeadType == objabi.Hdarwin: - case ctxt.HeadType == objabi.Hwindows: - case ctxt.HeadType == objabi.Haix: - res, err := dwarf.IsDWARFEnabledOnAIXLd(ctxt.extld()) - if err != nil { - Exitf("%v", err) - } - return res - default: - return false - } - } - - return true -} - -// dwarfGenerateDebugInfo generated debug info entries for all types, -// variables and functions in the program. -// Along with dwarfGenerateDebugSyms they are the two main entry points into -// dwarf generation: dwarfGenerateDebugInfo does all the work that should be -// done before symbol names are mangled while dwarfgeneratedebugsyms does -// all the work that can only be done after addresses have been assigned to -// text symbols. -func dwarfGenerateDebugInfo(ctxt *Link) { - if !dwarfEnabled(ctxt) { - return - } - - if ctxt.HeadType == objabi.Haix { - // Initial map used to store package size for each DWARF section. - dwsectCUSize = make(map[string]uint64) - } - - // Forctxt.Diagnostic messages. - newattr(&dwtypes, dwarf.DW_AT_name, dwarf.DW_CLS_STRING, int64(len("dwtypes")), "dwtypes") - - // Some types that must exist to define other ones. - newdie(ctxt, &dwtypes, dwarf.DW_ABRV_NULLTYPE, "", 0) - - newdie(ctxt, &dwtypes, dwarf.DW_ABRV_NULLTYPE, "void", 0) - newdie(ctxt, &dwtypes, dwarf.DW_ABRV_BARE_PTRTYPE, "unsafe.Pointer", 0) - - die := newdie(ctxt, &dwtypes, dwarf.DW_ABRV_BASETYPE, "uintptr", 0) // needed for array size - newattr(die, dwarf.DW_AT_encoding, dwarf.DW_CLS_CONSTANT, dwarf.DW_ATE_unsigned, 0) - newattr(die, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, int64(ctxt.Arch.PtrSize), 0) - newattr(die, dwarf.DW_AT_go_kind, dwarf.DW_CLS_CONSTANT, objabi.KindUintptr, 0) - newattr(die, dwarf.DW_AT_go_runtime_type, dwarf.DW_CLS_ADDRESS, 0, lookupOrDiag(ctxt, "type.uintptr")) - - // Prototypes needed for type synthesis. - prototypedies = map[string]*dwarf.DWDie{ - "type.runtime.stringStructDWARF": nil, - "type.runtime.slice": nil, - "type.runtime.hmap": nil, - "type.runtime.bmap": nil, - "type.runtime.sudog": nil, - "type.runtime.waitq": nil, - "type.runtime.hchan": nil, - } - - // 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.runtime.itab", - "type.runtime.imethod"} { - defgotype(ctxt, lookupOrDiag(ctxt, typ)) - } - - // fake root DIE for compile unit DIEs - var dwroot dwarf.DWDie - flagVariants := make(map[string]bool) - - for _, lib := range ctxt.Library { - consts := ctxt.Syms.ROLookup(dwarf.ConstInfoPrefix+lib.Pkg, 0) - for _, unit := range lib.Units { - // We drop the constants into the first CU. - if consts != nil { - importInfoSymbol(ctxt, consts) - unit.Consts = consts - consts = nil - } - - ctxt.compUnits = append(ctxt.compUnits, unit) - - // We need at least one runtime unit. - if unit.Lib.Pkg == "runtime" { - ctxt.runtimeCU = unit - } - - unit.DWInfo = newdie(ctxt, &dwroot, dwarf.DW_ABRV_COMPUNIT, unit.Lib.Pkg, 0) - newattr(unit.DWInfo, dwarf.DW_AT_language, dwarf.DW_CLS_CONSTANT, int64(dwarf.DW_LANG_Go), 0) - // OS X linker requires compilation dir or absolute path in comp unit name to output debug info. - compDir := getCompilationDir() - // TODO: Make this be the actual compilation directory, not - // the linker directory. If we move CU construction into the - // compiler, this should happen naturally. - newattr(unit.DWInfo, dwarf.DW_AT_comp_dir, dwarf.DW_CLS_STRING, int64(len(compDir)), compDir) - producerExtra := ctxt.Syms.Lookup(dwarf.CUInfoPrefix+"producer."+unit.Lib.Pkg, 0) - producer := "Go cmd/compile " + objabi.Version - if len(producerExtra.P) > 0 { - // We put a semicolon before the flags to clearly - // separate them from the version, which can be long - // and have lots of weird things in it in development - // versions. We promise not to put a semicolon in the - // version, so it should be safe for readers to scan - // forward to the semicolon. - producer += "; " + string(producerExtra.P) - flagVariants[string(producerExtra.P)] = true - } else { - flagVariants[""] = true - } - - newattr(unit.DWInfo, dwarf.DW_AT_producer, dwarf.DW_CLS_STRING, int64(len(producer)), producer) - - var pkgname string - if s := ctxt.Syms.ROLookup(dwarf.CUInfoPrefix+"packagename."+unit.Lib.Pkg, 0); s != nil { - pkgname = string(s.P) - } - newattr(unit.DWInfo, dwarf.DW_AT_go_package_name, dwarf.DW_CLS_STRING, int64(len(pkgname)), pkgname) - - if len(unit.Textp) == 0 { - unit.DWInfo.Abbrev = dwarf.DW_ABRV_COMPUNIT_TEXTLESS - } - - // Scan all functions in this compilation unit, create DIEs for all - // referenced types, create the file table for debug_line, find all - // referenced abstract functions. - // Collect all debug_range symbols in unit.rangeSyms - for _, s := range unit.Textp { // textp has been dead-code-eliminated already. - dsym := dwarfFuncSym(ctxt, s, dwarf.InfoPrefix, false) - dsym.Attr |= sym.AttrNotInSymbolTable | sym.AttrReachable - dsym.Type = sym.SDWARFINFO - unit.FuncDIEs = append(unit.FuncDIEs, dsym) - - rangeSym := dwarfFuncSym(ctxt, s, dwarf.RangePrefix, false) - if rangeSym != nil && rangeSym.Size > 0 { - rangeSym.Attr |= sym.AttrReachable | sym.AttrNotInSymbolTable - rangeSym.Type = sym.SDWARFRANGE - if ctxt.HeadType == objabi.Haix { - addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(rangeSym.Size)) - } - unit.RangeSyms = append(unit.RangeSyms, rangeSym) - } - - for ri := 0; ri < len(dsym.R); ri++ { - r := &dsym.R[ri] - if r.Type == objabi.R_DWARFSECREF { - rsym := r.Sym - if strings.HasPrefix(rsym.Name, dwarf.InfoPrefix) && strings.HasSuffix(rsym.Name, dwarf.AbstractFuncSuffix) && !rsym.Attr.OnList() { - // abstract function - rsym.Attr |= sym.AttrOnList - unit.AbsFnDIEs = append(unit.AbsFnDIEs, rsym) - importInfoSymbol(ctxt, rsym) - } else if rsym.Size == 0 { - // a type we do not have a DIE for - n := nameFromDIESym(rsym) - defgotype(ctxt, ctxt.Syms.Lookup("type."+n, 0)) - } - } - } - } - } - } - - // Fix for 31034: if the objects feeding into this link were compiled - // with different sets of flags, then don't issue an error if - // the -strictdups checks fail. - if checkStrictDups > 1 && len(flagVariants) > 1 { - checkStrictDups = 1 - } - - // Create DIEs for global variables and the types they use. - genasmsym(ctxt, defdwsymb) - - // Create DIEs for variable types indirectly referenced by function - // autos (which may not appear directly as param/var DIEs). - for _, lib := range ctxt.Library { - for _, unit := range lib.Units { - lists := [][]*sym.Symbol{unit.AbsFnDIEs, unit.FuncDIEs} - for _, list := range lists { - for _, s := range list { - for i := 0; i < len(s.R); i++ { - r := &s.R[i] - if r.Type == objabi.R_USETYPE { - defgotype(ctxt, r.Sym) - } - } - } - } - } - } - - synthesizestringtypes(ctxt, dwtypes.Child) - synthesizeslicetypes(ctxt, dwtypes.Child) - synthesizemaptypes(ctxt, dwtypes.Child) - synthesizechantypes(ctxt, dwtypes.Child) -} - -// dwarfGenerateDebugSyms constructs debug_line, debug_frame, debug_loc, -// debug_pubnames and debug_pubtypes. It also writes out the debug_info -// section using symbols generated in dwarfGenerateDebugInfo. -func dwarfGenerateDebugSyms(ctxt *Link) { - if !dwarfEnabled(ctxt) { - return - } - - abbrev := writeabbrev(ctxt) - syms := []*sym.Symbol{abbrev} - - calcCompUnitRanges(ctxt) - sort.Sort(compilationUnitByStartPC(ctxt.compUnits)) - - // Write per-package line and range tables and start their CU DIEs. - debugLine := ctxt.Syms.Lookup(".debug_line", 0) - debugLine.Type = sym.SDWARFSECT - debugRanges := ctxt.Syms.Lookup(".debug_ranges", 0) - debugRanges.Type = sym.SDWARFRANGE - debugRanges.Attr |= sym.AttrReachable - syms = append(syms, debugLine) - for _, u := range ctxt.compUnits { - reversetree(&u.DWInfo.Child) - if u.DWInfo.Abbrev == dwarf.DW_ABRV_COMPUNIT_TEXTLESS { - continue - } - writelines(ctxt, u, debugLine) - writepcranges(ctxt, u, u.Textp[0], u.PCs, debugRanges) - } - - // newdie adds DIEs to the *beginning* of the parent's DIE list. - // Now that we're done creating DIEs, reverse the trees so DIEs - // appear in the order they were created. - reversetree(&dwtypes.Child) - movetomodule(ctxt, &dwtypes) - - pubNames := newPubWriter(ctxt, ".debug_pubnames") - pubTypes := newPubWriter(ctxt, ".debug_pubtypes") - - // Need to reorder symbols so sym.SDWARFINFO is after all sym.SDWARFSECT - infosyms := writeinfo(ctxt, nil, ctxt.compUnits, abbrev, pubNames, pubTypes) - - syms = writeframes(ctxt, syms) - syms = append(syms, pubNames.s, pubTypes.s) - syms = writegdbscript(ctxt, syms) - // Now we're done writing SDWARFSECT symbols, so we can write - // other SDWARF* symbols. - syms = append(syms, infosyms...) - syms = collectlocs(ctxt, syms, ctxt.compUnits) - syms = append(syms, debugRanges) - for _, unit := range ctxt.compUnits { - syms = append(syms, unit.RangeSyms...) - } - dwarfp = syms -} - -func collectlocs(ctxt *Link, syms []*sym.Symbol, units []*sym.CompilationUnit) []*sym.Symbol { - empty := true - for _, u := range units { - for _, fn := range u.FuncDIEs { - for i := range fn.R { - reloc := &fn.R[i] // Copying sym.Reloc has measurable impact on performance - if reloc.Type == objabi.R_DWARFSECREF && strings.HasPrefix(reloc.Sym.Name, dwarf.LocPrefix) { - reloc.Sym.Attr |= sym.AttrReachable | sym.AttrNotInSymbolTable - syms = append(syms, reloc.Sym) - empty = false - // One location list entry per function, but many relocations to it. Don't duplicate. - break - } - } - } - } - // Don't emit .debug_loc if it's empty -- it makes the ARM linker mad. - if !empty { - locsym := ctxt.Syms.Lookup(".debug_loc", 0) - locsym.Type = sym.SDWARFLOC - locsym.Attr |= sym.AttrReachable - syms = append(syms, locsym) - } - return syms -} - -// Read a pointer-sized uint from the beginning of buf. -func readPtr(ctxt *Link, buf []byte) uint64 { - switch ctxt.Arch.PtrSize { - case 4: - return uint64(ctxt.Arch.ByteOrder.Uint32(buf)) - case 8: - return ctxt.Arch.ByteOrder.Uint64(buf) - default: - panic("unexpected pointer size") - } -} - -/* - * Elf. - */ -func dwarfaddshstrings(ctxt *Link, shstrtab *sym.Symbol) { - if *FlagW { // disable dwarf - return - } - - secs := []string{"abbrev", "frame", "info", "loc", "line", "pubnames", "pubtypes", "gdb_scripts", "ranges"} - for _, sec := range secs { - Addstring(shstrtab, ".debug_"+sec) - if ctxt.LinkMode == LinkExternal { - Addstring(shstrtab, elfRelType+".debug_"+sec) - } else { - Addstring(shstrtab, ".zdebug_"+sec) - } - } -} - -// Add section symbols for DWARF debug info. This is called before -// dwarfaddelfheaders. -func dwarfaddelfsectionsyms(ctxt *Link) { - if *FlagW { // disable dwarf - return - } - if ctxt.LinkMode != LinkExternal { - return - } - - s := ctxt.Syms.Lookup(".debug_info", 0) - putelfsectionsym(ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - s = ctxt.Syms.Lookup(".debug_abbrev", 0) - putelfsectionsym(ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - s = ctxt.Syms.Lookup(".debug_line", 0) - putelfsectionsym(ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - s = ctxt.Syms.Lookup(".debug_frame", 0) - putelfsectionsym(ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - s = ctxt.Syms.Lookup(".debug_loc", 0) - if s.Sect != nil { - putelfsectionsym(ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - } - s = ctxt.Syms.Lookup(".debug_ranges", 0) - if s.Sect != nil { - putelfsectionsym(ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - } -} - -// dwarfcompress compresses the DWARF sections. Relocations are applied -// on the fly. After this, dwarfp will contain a different (new) set of -// symbols, and sections may have been replaced. -func dwarfcompress(ctxt *Link) { - supported := ctxt.IsELF || ctxt.HeadType == objabi.Hwindows || ctxt.HeadType == objabi.Hdarwin - if !ctxt.compressDWARF || !supported || ctxt.LinkMode != LinkInternal { - return - } - - var start int - var newDwarfp []*sym.Symbol - Segdwarf.Sections = Segdwarf.Sections[:0] - for i, s := range dwarfp { - // Find the boundaries between sections and compress - // the whole section once we've found the last of its - // symbols. - if i+1 >= len(dwarfp) || s.Sect != dwarfp[i+1].Sect { - s1 := compressSyms(ctxt, dwarfp[start:i+1]) - if s1 == nil { - // Compression didn't help. - newDwarfp = append(newDwarfp, dwarfp[start:i+1]...) - Segdwarf.Sections = append(Segdwarf.Sections, s.Sect) - } else { - compressedSegName := ".zdebug_" + s.Sect.Name[len(".debug_"):] - sect := addsection(ctxt.Arch, &Segdwarf, compressedSegName, 04) - sect.Length = uint64(len(s1)) - newSym := ctxt.Syms.Lookup(compressedSegName, 0) - newSym.P = s1 - newSym.Size = int64(len(s1)) - newSym.Sect = sect - newDwarfp = append(newDwarfp, newSym) - } - start = i + 1 - } - } - dwarfp = newDwarfp - ctxt.relocbuf = nil // no longer needed, don't hold it live - - // Re-compute the locations of the compressed DWARF symbols - // and sections, since the layout of these within the file is - // based on Section.Vaddr and Symbol.Value. - pos := Segdwarf.Vaddr - var prevSect *sym.Section - for _, s := range dwarfp { - s.Value = int64(pos) - if s.Sect != prevSect { - s.Sect.Vaddr = uint64(s.Value) - prevSect = s.Sect - } - if s.Sub != nil { - log.Fatalf("%s: unexpected sub-symbols", s) - } - pos += uint64(s.Size) - if ctxt.HeadType == objabi.Hwindows { - pos = uint64(Rnd(int64(pos), PEFILEALIGN)) - } - - } - Segdwarf.Length = pos - Segdwarf.Vaddr -} - -type compilationUnitByStartPC []*sym.CompilationUnit - -func (v compilationUnitByStartPC) Len() int { return len(v) } -func (v compilationUnitByStartPC) Swap(i, j int) { v[i], v[j] = v[j], v[i] } - -func (v compilationUnitByStartPC) Less(i, j int) bool { - switch { - case len(v[i].Textp) == 0 && len(v[j].Textp) == 0: - return v[i].Lib.Pkg < v[j].Lib.Pkg - case len(v[i].Textp) != 0 && len(v[j].Textp) == 0: - return true - case len(v[i].Textp) == 0 && len(v[j].Textp) != 0: - return false - default: - return v[i].Textp[0].Value < v[j].Textp[0].Value - } -} - -// On AIX, the symbol table needs to know where are the compilation units parts -// for a specific package in each .dw section. -// dwsectCUSize map will save the size of a compilation unit for -// the corresponding .dw section. -// This size can later be retrieved with the index "sectionName.pkgName". -var dwsectCUSize map[string]uint64 - -// getDwsectCUSize retrieves the corresponding package size inside the current section. -func getDwsectCUSize(sname string, pkgname string) uint64 { - return dwsectCUSize[sname+"."+pkgname] -} - -func saveDwsectCUSize(sname string, pkgname string, size uint64) { - dwsectCUSize[sname+"."+pkgname] = size -} - -func addDwsectCUSize(sname string, pkgname string, size uint64) { - dwsectCUSize[sname+"."+pkgname] += size -} - -// getPkgFromCUSym returns the package name for the compilation unit -// represented by s. -// The prefix dwarf.InfoPrefix+".pkg." needs to be removed in order to get -// the package name. -func getPkgFromCUSym(s *sym.Symbol) string { - return strings.TrimPrefix(s.Name, dwarf.InfoPrefix+".pkg.") -} diff --git a/src/cmd/oldlink/internal/ld/elf.go b/src/cmd/oldlink/internal/ld/elf.go deleted file mode 100644 index 28cab75751..0000000000 --- a/src/cmd/oldlink/internal/ld/elf.go +++ /dev/null @@ -1,2448 +0,0 @@ -// Copyright 2009 The Go Authors. 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/internal/sys" - "cmd/oldlink/internal/sym" - "crypto/sha1" - "encoding/binary" - "encoding/hex" - "io" - "path/filepath" - "sort" - "strings" -) - -/* - * Derived from: - * $FreeBSD: src/sys/sys/elf32.h,v 1.8.14.1 2005/12/30 22:13:58 marcel Exp $ - * $FreeBSD: src/sys/sys/elf64.h,v 1.10.14.1 2005/12/30 22:13:58 marcel Exp $ - * $FreeBSD: src/sys/sys/elf_common.h,v 1.15.8.1 2005/12/30 22:13:58 marcel Exp $ - * $FreeBSD: src/sys/alpha/include/elf.h,v 1.14 2003/09/25 01:10:22 peter Exp $ - * $FreeBSD: src/sys/amd64/include/elf.h,v 1.18 2004/08/03 08:21:48 dfr Exp $ - * $FreeBSD: src/sys/arm/include/elf.h,v 1.5.2.1 2006/06/30 21:42:52 cognet Exp $ - * $FreeBSD: src/sys/i386/include/elf.h,v 1.16 2004/08/02 19:12:17 dfr Exp $ - * $FreeBSD: src/sys/powerpc/include/elf.h,v 1.7 2004/11/02 09:47:01 ssouhlal Exp $ - * $FreeBSD: src/sys/sparc64/include/elf.h,v 1.12 2003/09/25 01:10:26 peter Exp $ - * - * Copyright (c) 1996-1998 John D. Polstra. All rights reserved. - * Copyright (c) 2001 David E. O'Brien - * Portions Copyright 2009 The Go Authors. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -/* - * ELF definitions that are independent of architecture or word size. - */ - -/* - * Note header. The ".note" section contains an array of notes. Each - * begins with this header, aligned to a word boundary. Immediately - * following the note header is n_namesz bytes of name, padded to the - * next word boundary. Then comes n_descsz bytes of descriptor, again - * padded to a word boundary. The values of n_namesz and n_descsz do - * not include the padding. - */ -type elfNote struct { - nNamesz uint32 - nDescsz uint32 - nType uint32 -} - -const ( - EI_MAG0 = 0 - EI_MAG1 = 1 - EI_MAG2 = 2 - EI_MAG3 = 3 - EI_CLASS = 4 - EI_DATA = 5 - EI_VERSION = 6 - EI_OSABI = 7 - EI_ABIVERSION = 8 - OLD_EI_BRAND = 8 - EI_PAD = 9 - EI_NIDENT = 16 - ELFMAG0 = 0x7f - ELFMAG1 = 'E' - ELFMAG2 = 'L' - ELFMAG3 = 'F' - SELFMAG = 4 - EV_NONE = 0 - EV_CURRENT = 1 - ELFCLASSNONE = 0 - ELFCLASS32 = 1 - ELFCLASS64 = 2 - ELFDATANONE = 0 - ELFDATA2LSB = 1 - ELFDATA2MSB = 2 - ELFOSABI_NONE = 0 - ELFOSABI_HPUX = 1 - ELFOSABI_NETBSD = 2 - ELFOSABI_LINUX = 3 - ELFOSABI_HURD = 4 - ELFOSABI_86OPEN = 5 - ELFOSABI_SOLARIS = 6 - ELFOSABI_AIX = 7 - ELFOSABI_IRIX = 8 - ELFOSABI_FREEBSD = 9 - ELFOSABI_TRU64 = 10 - ELFOSABI_MODESTO = 11 - ELFOSABI_OPENBSD = 12 - ELFOSABI_OPENVMS = 13 - ELFOSABI_NSK = 14 - ELFOSABI_ARM = 97 - ELFOSABI_STANDALONE = 255 - ELFOSABI_SYSV = ELFOSABI_NONE - ELFOSABI_MONTEREY = ELFOSABI_AIX - ET_NONE = 0 - ET_REL = 1 - ET_EXEC = 2 - ET_DYN = 3 - ET_CORE = 4 - ET_LOOS = 0xfe00 - ET_HIOS = 0xfeff - ET_LOPROC = 0xff00 - ET_HIPROC = 0xffff - EM_NONE = 0 - EM_M32 = 1 - EM_SPARC = 2 - EM_386 = 3 - EM_68K = 4 - EM_88K = 5 - EM_860 = 7 - EM_MIPS = 8 - EM_S370 = 9 - EM_MIPS_RS3_LE = 10 - EM_PARISC = 15 - EM_VPP500 = 17 - EM_SPARC32PLUS = 18 - EM_960 = 19 - EM_PPC = 20 - EM_PPC64 = 21 - EM_S390 = 22 - EM_V800 = 36 - EM_FR20 = 37 - EM_RH32 = 38 - EM_RCE = 39 - EM_ARM = 40 - EM_SH = 42 - EM_SPARCV9 = 43 - EM_TRICORE = 44 - EM_ARC = 45 - EM_H8_300 = 46 - EM_H8_300H = 47 - EM_H8S = 48 - EM_H8_500 = 49 - EM_IA_64 = 50 - EM_MIPS_X = 51 - EM_COLDFIRE = 52 - EM_68HC12 = 53 - EM_MMA = 54 - EM_PCP = 55 - EM_NCPU = 56 - EM_NDR1 = 57 - EM_STARCORE = 58 - EM_ME16 = 59 - EM_ST100 = 60 - EM_TINYJ = 61 - EM_X86_64 = 62 - EM_AARCH64 = 183 - EM_486 = 6 - EM_MIPS_RS4_BE = 10 - EM_ALPHA_STD = 41 - EM_ALPHA = 0x9026 - EM_RISCV = 243 - SHN_UNDEF = 0 - SHN_LORESERVE = 0xff00 - SHN_LOPROC = 0xff00 - SHN_HIPROC = 0xff1f - SHN_LOOS = 0xff20 - SHN_HIOS = 0xff3f - SHN_ABS = 0xfff1 - SHN_COMMON = 0xfff2 - SHN_XINDEX = 0xffff - SHN_HIRESERVE = 0xffff - SHT_NULL = 0 - SHT_PROGBITS = 1 - SHT_SYMTAB = 2 - SHT_STRTAB = 3 - SHT_RELA = 4 - SHT_HASH = 5 - SHT_DYNAMIC = 6 - SHT_NOTE = 7 - SHT_NOBITS = 8 - SHT_REL = 9 - SHT_SHLIB = 10 - SHT_DYNSYM = 11 - SHT_INIT_ARRAY = 14 - SHT_FINI_ARRAY = 15 - SHT_PREINIT_ARRAY = 16 - SHT_GROUP = 17 - SHT_SYMTAB_SHNDX = 18 - SHT_LOOS = 0x60000000 - SHT_HIOS = 0x6fffffff - SHT_GNU_VERDEF = 0x6ffffffd - SHT_GNU_VERNEED = 0x6ffffffe - SHT_GNU_VERSYM = 0x6fffffff - SHT_LOPROC = 0x70000000 - SHT_ARM_ATTRIBUTES = 0x70000003 - SHT_HIPROC = 0x7fffffff - SHT_LOUSER = 0x80000000 - SHT_HIUSER = 0xffffffff - SHF_WRITE = 0x1 - SHF_ALLOC = 0x2 - SHF_EXECINSTR = 0x4 - SHF_MERGE = 0x10 - SHF_STRINGS = 0x20 - SHF_INFO_LINK = 0x40 - SHF_LINK_ORDER = 0x80 - SHF_OS_NONCONFORMING = 0x100 - SHF_GROUP = 0x200 - SHF_TLS = 0x400 - SHF_MASKOS = 0x0ff00000 - SHF_MASKPROC = 0xf0000000 - PT_NULL = 0 - PT_LOAD = 1 - PT_DYNAMIC = 2 - PT_INTERP = 3 - PT_NOTE = 4 - PT_SHLIB = 5 - PT_PHDR = 6 - PT_TLS = 7 - PT_LOOS = 0x60000000 - PT_HIOS = 0x6fffffff - PT_LOPROC = 0x70000000 - PT_HIPROC = 0x7fffffff - PT_GNU_STACK = 0x6474e551 - PT_GNU_RELRO = 0x6474e552 - PT_PAX_FLAGS = 0x65041580 - PT_SUNWSTACK = 0x6ffffffb - PF_X = 0x1 - PF_W = 0x2 - PF_R = 0x4 - PF_MASKOS = 0x0ff00000 - PF_MASKPROC = 0xf0000000 - DT_NULL = 0 - DT_NEEDED = 1 - DT_PLTRELSZ = 2 - DT_PLTGOT = 3 - DT_HASH = 4 - DT_STRTAB = 5 - DT_SYMTAB = 6 - DT_RELA = 7 - DT_RELASZ = 8 - DT_RELAENT = 9 - DT_STRSZ = 10 - DT_SYMENT = 11 - DT_INIT = 12 - DT_FINI = 13 - DT_SONAME = 14 - DT_RPATH = 15 - DT_SYMBOLIC = 16 - DT_REL = 17 - DT_RELSZ = 18 - DT_RELENT = 19 - DT_PLTREL = 20 - DT_DEBUG = 21 - DT_TEXTREL = 22 - DT_JMPREL = 23 - DT_BIND_NOW = 24 - DT_INIT_ARRAY = 25 - DT_FINI_ARRAY = 26 - DT_INIT_ARRAYSZ = 27 - DT_FINI_ARRAYSZ = 28 - DT_RUNPATH = 29 - DT_FLAGS = 30 - DT_ENCODING = 32 - DT_PREINIT_ARRAY = 32 - DT_PREINIT_ARRAYSZ = 33 - DT_LOOS = 0x6000000d - DT_HIOS = 0x6ffff000 - DT_LOPROC = 0x70000000 - DT_HIPROC = 0x7fffffff - DT_VERNEED = 0x6ffffffe - DT_VERNEEDNUM = 0x6fffffff - DT_VERSYM = 0x6ffffff0 - DT_PPC64_GLINK = DT_LOPROC + 0 - DT_PPC64_OPT = DT_LOPROC + 3 - DF_ORIGIN = 0x0001 - DF_SYMBOLIC = 0x0002 - DF_TEXTREL = 0x0004 - DF_BIND_NOW = 0x0008 - DF_STATIC_TLS = 0x0010 - NT_PRSTATUS = 1 - NT_FPREGSET = 2 - NT_PRPSINFO = 3 - STB_LOCAL = 0 - STB_GLOBAL = 1 - STB_WEAK = 2 - STB_LOOS = 10 - STB_HIOS = 12 - STB_LOPROC = 13 - STB_HIPROC = 15 - STT_NOTYPE = 0 - STT_OBJECT = 1 - STT_FUNC = 2 - STT_SECTION = 3 - STT_FILE = 4 - STT_COMMON = 5 - STT_TLS = 6 - STT_LOOS = 10 - STT_HIOS = 12 - STT_LOPROC = 13 - STT_HIPROC = 15 - STV_DEFAULT = 0x0 - STV_INTERNAL = 0x1 - STV_HIDDEN = 0x2 - STV_PROTECTED = 0x3 - STN_UNDEF = 0 -) - -/* For accessing the fields of r_info. */ - -/* For constructing r_info from field values. */ - -/* - * Relocation types. - */ -const ( - ARM_MAGIC_TRAMP_NUMBER = 0x5c000003 -) - -/* - * Symbol table entries. - */ - -/* For accessing the fields of st_info. */ - -/* For constructing st_info from field values. */ - -/* For accessing the fields of st_other. */ - -/* - * ELF header. - */ -type ElfEhdr struct { - ident [EI_NIDENT]uint8 - type_ uint16 - machine uint16 - version uint32 - entry uint64 - phoff uint64 - shoff uint64 - flags uint32 - ehsize uint16 - phentsize uint16 - phnum uint16 - shentsize uint16 - shnum uint16 - shstrndx uint16 -} - -/* - * Section header. - */ -type ElfShdr struct { - name uint32 - type_ uint32 - flags uint64 - addr uint64 - off uint64 - size uint64 - link uint32 - info uint32 - addralign uint64 - entsize uint64 - shnum int -} - -/* - * Program header. - */ -type ElfPhdr struct { - type_ uint32 - flags uint32 - off uint64 - vaddr uint64 - paddr uint64 - filesz uint64 - memsz uint64 - align uint64 -} - -/* For accessing the fields of r_info. */ - -/* For constructing r_info from field values. */ - -/* - * Symbol table entries. - */ - -/* For accessing the fields of st_info. */ - -/* For constructing st_info from field values. */ - -/* For accessing the fields of st_other. */ - -/* - * Go linker interface - */ -const ( - ELF64HDRSIZE = 64 - ELF64PHDRSIZE = 56 - ELF64SHDRSIZE = 64 - ELF64RELSIZE = 16 - ELF64RELASIZE = 24 - ELF64SYMSIZE = 24 - ELF32HDRSIZE = 52 - ELF32PHDRSIZE = 32 - ELF32SHDRSIZE = 40 - ELF32SYMSIZE = 16 - ELF32RELSIZE = 8 -) - -/* - * The interface uses the 64-bit structures always, - * to avoid code duplication. The writers know how to - * marshal a 32-bit representation from the 64-bit structure. - */ - -var Elfstrdat []byte - -/* - * Total amount of space to reserve at the start of the file - * for Header, PHeaders, SHeaders, and interp. - * May waste some. - * On FreeBSD, cannot be larger than a page. - */ -const ( - ELFRESERVE = 4096 -) - -/* - * We use the 64-bit data structures on both 32- and 64-bit machines - * in order to write the code just once. The 64-bit data structure is - * written in the 32-bit format on the 32-bit machines. - */ -const ( - NSECT = 400 -) - -var ( - Nelfsym = 1 - - elf64 bool - // Either ".rel" or ".rela" depending on which type of relocation the - // target platform uses. - elfRelType string - - ehdr ElfEhdr - phdr [NSECT]*ElfPhdr - shdr [NSECT]*ElfShdr - - interp string -) - -type Elfstring struct { - s string - off int -} - -var elfstr [100]Elfstring - -var nelfstr int - -var buildinfo []byte - -/* - Initialize the global variable that describes the ELF header. It will be updated as - we write section and prog headers. -*/ -func Elfinit(ctxt *Link) { - ctxt.IsELF = true - - if ctxt.Arch.InFamily(sys.AMD64, sys.ARM64, sys.MIPS64, sys.PPC64, sys.RISCV64, sys.S390X) { - elfRelType = ".rela" - } else { - elfRelType = ".rel" - } - - switch ctxt.Arch.Family { - // 64-bit architectures - case sys.PPC64, sys.S390X: - if ctxt.Arch.ByteOrder == binary.BigEndian { - ehdr.flags = 1 /* Version 1 ABI */ - } else { - ehdr.flags = 2 /* Version 2 ABI */ - } - fallthrough - case sys.AMD64, sys.ARM64, sys.MIPS64, sys.RISCV64: - if ctxt.Arch.Family == sys.MIPS64 { - ehdr.flags = 0x20000004 /* MIPS 3 CPIC */ - } - elf64 = true - - ehdr.phoff = ELF64HDRSIZE /* Must be ELF64HDRSIZE: first PHdr must follow ELF header */ - ehdr.shoff = ELF64HDRSIZE /* Will move as we add PHeaders */ - ehdr.ehsize = ELF64HDRSIZE /* Must be ELF64HDRSIZE */ - ehdr.phentsize = ELF64PHDRSIZE /* Must be ELF64PHDRSIZE */ - ehdr.shentsize = ELF64SHDRSIZE /* Must be ELF64SHDRSIZE */ - - // 32-bit architectures - case sys.ARM, sys.MIPS: - if ctxt.Arch.Family == sys.ARM { - // we use EABI on linux/arm, freebsd/arm, netbsd/arm. - if ctxt.HeadType == objabi.Hlinux || ctxt.HeadType == objabi.Hfreebsd || ctxt.HeadType == objabi.Hnetbsd { - // We set a value here that makes no indication of which - // float ABI the object uses, because this is information - // used by the dynamic linker to compare executables and - // shared libraries -- so it only matters for cgo calls, and - // the information properly comes from the object files - // produced by the host C compiler. parseArmAttributes in - // ldelf.go reads that information and updates this field as - // appropriate. - ehdr.flags = 0x5000002 // has entry point, Version5 EABI - } - } else if ctxt.Arch.Family == sys.MIPS { - ehdr.flags = 0x50001004 /* MIPS 32 CPIC O32*/ - } - fallthrough - default: - ehdr.phoff = ELF32HDRSIZE - /* Must be ELF32HDRSIZE: first PHdr must follow ELF header */ - ehdr.shoff = ELF32HDRSIZE /* Will move as we add PHeaders */ - ehdr.ehsize = ELF32HDRSIZE /* Must be ELF32HDRSIZE */ - ehdr.phentsize = ELF32PHDRSIZE /* Must be ELF32PHDRSIZE */ - ehdr.shentsize = ELF32SHDRSIZE /* Must be ELF32SHDRSIZE */ - } -} - -// Make sure PT_LOAD is aligned properly and -// that there is no gap, -// correct ELF loaders will do this implicitly, -// but buggy ELF loaders like the one in some -// versions of QEMU and UPX won't. -func fixElfPhdr(e *ElfPhdr) { - frag := int(e.vaddr & (e.align - 1)) - - e.off -= uint64(frag) - e.vaddr -= uint64(frag) - e.paddr -= uint64(frag) - e.filesz += uint64(frag) - e.memsz += uint64(frag) -} - -func elf64phdr(out *OutBuf, e *ElfPhdr) { - if e.type_ == PT_LOAD { - fixElfPhdr(e) - } - - out.Write32(e.type_) - out.Write32(e.flags) - out.Write64(e.off) - out.Write64(e.vaddr) - out.Write64(e.paddr) - out.Write64(e.filesz) - out.Write64(e.memsz) - out.Write64(e.align) -} - -func elf32phdr(out *OutBuf, e *ElfPhdr) { - if e.type_ == PT_LOAD { - fixElfPhdr(e) - } - - out.Write32(e.type_) - out.Write32(uint32(e.off)) - out.Write32(uint32(e.vaddr)) - out.Write32(uint32(e.paddr)) - out.Write32(uint32(e.filesz)) - out.Write32(uint32(e.memsz)) - out.Write32(e.flags) - out.Write32(uint32(e.align)) -} - -func elf64shdr(out *OutBuf, e *ElfShdr) { - out.Write32(e.name) - out.Write32(e.type_) - out.Write64(e.flags) - out.Write64(e.addr) - out.Write64(e.off) - out.Write64(e.size) - out.Write32(e.link) - out.Write32(e.info) - out.Write64(e.addralign) - out.Write64(e.entsize) -} - -func elf32shdr(out *OutBuf, e *ElfShdr) { - out.Write32(e.name) - out.Write32(e.type_) - out.Write32(uint32(e.flags)) - out.Write32(uint32(e.addr)) - out.Write32(uint32(e.off)) - out.Write32(uint32(e.size)) - out.Write32(e.link) - out.Write32(e.info) - out.Write32(uint32(e.addralign)) - out.Write32(uint32(e.entsize)) -} - -func elfwriteshdrs(out *OutBuf) uint32 { - if elf64 { - for i := 0; i < int(ehdr.shnum); i++ { - elf64shdr(out, shdr[i]) - } - return uint32(ehdr.shnum) * ELF64SHDRSIZE - } - - for i := 0; i < int(ehdr.shnum); i++ { - elf32shdr(out, shdr[i]) - } - return uint32(ehdr.shnum) * ELF32SHDRSIZE -} - -func elfsetstring(s *sym.Symbol, str string, off int) { - if nelfstr >= len(elfstr) { - Errorf(s, "too many elf strings") - errorexit() - } - - elfstr[nelfstr].s = str - elfstr[nelfstr].off = off - nelfstr++ -} - -func elfwritephdrs(out *OutBuf) uint32 { - if elf64 { - for i := 0; i < int(ehdr.phnum); i++ { - elf64phdr(out, phdr[i]) - } - return uint32(ehdr.phnum) * ELF64PHDRSIZE - } - - for i := 0; i < int(ehdr.phnum); i++ { - elf32phdr(out, phdr[i]) - } - return uint32(ehdr.phnum) * ELF32PHDRSIZE -} - -func newElfPhdr() *ElfPhdr { - e := new(ElfPhdr) - if ehdr.phnum >= NSECT { - Errorf(nil, "too many phdrs") - } else { - phdr[ehdr.phnum] = e - ehdr.phnum++ - } - if elf64 { - ehdr.shoff += ELF64PHDRSIZE - } else { - ehdr.shoff += ELF32PHDRSIZE - } - return e -} - -func newElfShdr(name int64) *ElfShdr { - e := new(ElfShdr) - e.name = uint32(name) - e.shnum = int(ehdr.shnum) - if ehdr.shnum >= NSECT { - Errorf(nil, "too many shdrs") - } else { - shdr[ehdr.shnum] = e - ehdr.shnum++ - } - - return e -} - -func getElfEhdr() *ElfEhdr { - return &ehdr -} - -func elf64writehdr(out *OutBuf) uint32 { - out.Write(ehdr.ident[:]) - out.Write16(ehdr.type_) - out.Write16(ehdr.machine) - out.Write32(ehdr.version) - out.Write64(ehdr.entry) - out.Write64(ehdr.phoff) - out.Write64(ehdr.shoff) - out.Write32(ehdr.flags) - out.Write16(ehdr.ehsize) - out.Write16(ehdr.phentsize) - out.Write16(ehdr.phnum) - out.Write16(ehdr.shentsize) - out.Write16(ehdr.shnum) - out.Write16(ehdr.shstrndx) - return ELF64HDRSIZE -} - -func elf32writehdr(out *OutBuf) uint32 { - out.Write(ehdr.ident[:]) - out.Write16(ehdr.type_) - out.Write16(ehdr.machine) - out.Write32(ehdr.version) - out.Write32(uint32(ehdr.entry)) - out.Write32(uint32(ehdr.phoff)) - out.Write32(uint32(ehdr.shoff)) - out.Write32(ehdr.flags) - out.Write16(ehdr.ehsize) - out.Write16(ehdr.phentsize) - out.Write16(ehdr.phnum) - out.Write16(ehdr.shentsize) - out.Write16(ehdr.shnum) - out.Write16(ehdr.shstrndx) - return ELF32HDRSIZE -} - -func elfwritehdr(out *OutBuf) uint32 { - if elf64 { - return elf64writehdr(out) - } - return elf32writehdr(out) -} - -/* Taken directly from the definition document for ELF64 */ -func elfhash(name string) uint32 { - var h uint32 - for i := 0; i < len(name); i++ { - h = (h << 4) + uint32(name[i]) - if g := h & 0xf0000000; g != 0 { - h ^= g >> 24 - } - h &= 0x0fffffff - } - return h -} - -func Elfwritedynent(ctxt *Link, s *sym.Symbol, tag int, val uint64) { - if elf64 { - s.AddUint64(ctxt.Arch, uint64(tag)) - s.AddUint64(ctxt.Arch, val) - } else { - s.AddUint32(ctxt.Arch, uint32(tag)) - s.AddUint32(ctxt.Arch, uint32(val)) - } -} - -func elfwritedynentsym(ctxt *Link, s *sym.Symbol, tag int, t *sym.Symbol) { - Elfwritedynentsymplus(ctxt, s, tag, t, 0) -} - -func Elfwritedynentsymplus(ctxt *Link, s *sym.Symbol, tag int, t *sym.Symbol, add int64) { - if elf64 { - s.AddUint64(ctxt.Arch, uint64(tag)) - } else { - s.AddUint32(ctxt.Arch, uint32(tag)) - } - s.AddAddrPlus(ctxt.Arch, t, add) -} - -func elfwritedynentsymsize(ctxt *Link, s *sym.Symbol, tag int, t *sym.Symbol) { - if elf64 { - s.AddUint64(ctxt.Arch, uint64(tag)) - } else { - s.AddUint32(ctxt.Arch, uint32(tag)) - } - s.AddSize(ctxt.Arch, t) -} - -func elfinterp(sh *ElfShdr, startva uint64, resoff uint64, p string) int { - interp = p - n := len(interp) + 1 - sh.addr = startva + resoff - uint64(n) - sh.off = resoff - uint64(n) - sh.size = uint64(n) - - return n -} - -func elfwriteinterp(out *OutBuf) int { - sh := elfshname(".interp") - out.SeekSet(int64(sh.off)) - out.WriteString(interp) - out.Write8(0) - return int(sh.size) -} - -func elfnote(sh *ElfShdr, startva uint64, resoff uint64, sz int) int { - n := 3*4 + uint64(sz) + resoff%4 - - sh.type_ = SHT_NOTE - sh.flags = SHF_ALLOC - sh.addralign = 4 - sh.addr = startva + resoff - n - sh.off = resoff - n - sh.size = n - resoff%4 - - return int(n) -} - -func elfwritenotehdr(out *OutBuf, str string, namesz uint32, descsz uint32, tag uint32) *ElfShdr { - sh := elfshname(str) - - // Write Elf_Note header. - out.SeekSet(int64(sh.off)) - - out.Write32(namesz) - out.Write32(descsz) - out.Write32(tag) - - return sh -} - -// NetBSD Signature (as per sys/exec_elf.h) -const ( - ELF_NOTE_NETBSD_NAMESZ = 7 - ELF_NOTE_NETBSD_DESCSZ = 4 - ELF_NOTE_NETBSD_TAG = 1 - ELF_NOTE_NETBSD_VERSION = 700000000 /* NetBSD 7.0 */ -) - -var ELF_NOTE_NETBSD_NAME = []byte("NetBSD\x00") - -func elfnetbsdsig(sh *ElfShdr, startva uint64, resoff uint64) int { - n := int(Rnd(ELF_NOTE_NETBSD_NAMESZ, 4) + Rnd(ELF_NOTE_NETBSD_DESCSZ, 4)) - return elfnote(sh, startva, resoff, n) -} - -func elfwritenetbsdsig(out *OutBuf) int { - // Write Elf_Note header. - sh := elfwritenotehdr(out, ".note.netbsd.ident", ELF_NOTE_NETBSD_NAMESZ, ELF_NOTE_NETBSD_DESCSZ, ELF_NOTE_NETBSD_TAG) - - if sh == nil { - return 0 - } - - // Followed by NetBSD string and version. - out.Write(ELF_NOTE_NETBSD_NAME) - out.Write8(0) - out.Write32(ELF_NOTE_NETBSD_VERSION) - - return int(sh.size) -} - -// The race detector can't handle ASLR (address space layout randomization). -// ASLR is on by default for NetBSD, so we turn the ASLR off eplicitly -// using a magic elf Note when building race binaries. - -func elfnetbsdpax(sh *ElfShdr, startva uint64, resoff uint64) int { - n := int(Rnd(4, 4) + Rnd(4, 4)) - return elfnote(sh, startva, resoff, n) -} - -func elfwritenetbsdpax(out *OutBuf) int { - sh := elfwritenotehdr(out, ".note.netbsd.pax", 4 /* length of PaX\x00 */, 4 /* length of flags */, 0x03 /* PaX type */) - if sh == nil { - return 0 - } - out.Write([]byte("PaX\x00")) - out.Write32(0x20) // 0x20 = Force disable ASLR - return int(sh.size) -} - -// OpenBSD Signature -const ( - ELF_NOTE_OPENBSD_NAMESZ = 8 - ELF_NOTE_OPENBSD_DESCSZ = 4 - ELF_NOTE_OPENBSD_TAG = 1 - ELF_NOTE_OPENBSD_VERSION = 0 -) - -var ELF_NOTE_OPENBSD_NAME = []byte("OpenBSD\x00") - -func elfopenbsdsig(sh *ElfShdr, startva uint64, resoff uint64) int { - n := ELF_NOTE_OPENBSD_NAMESZ + ELF_NOTE_OPENBSD_DESCSZ - return elfnote(sh, startva, resoff, n) -} - -func elfwriteopenbsdsig(out *OutBuf) int { - // Write Elf_Note header. - sh := elfwritenotehdr(out, ".note.openbsd.ident", ELF_NOTE_OPENBSD_NAMESZ, ELF_NOTE_OPENBSD_DESCSZ, ELF_NOTE_OPENBSD_TAG) - - if sh == nil { - return 0 - } - - // Followed by OpenBSD string and version. - out.Write(ELF_NOTE_OPENBSD_NAME) - - out.Write32(ELF_NOTE_OPENBSD_VERSION) - - return int(sh.size) -} - -func addbuildinfo(val string) { - if !strings.HasPrefix(val, "0x") { - Exitf("-B argument must start with 0x: %s", val) - } - - ov := val - val = val[2:] - - const maxLen = 32 - if hex.DecodedLen(len(val)) > maxLen { - Exitf("-B option too long (max %d digits): %s", maxLen, ov) - } - - b, err := hex.DecodeString(val) - if err != nil { - if err == hex.ErrLength { - Exitf("-B argument must have even number of digits: %s", ov) - } - if inv, ok := err.(hex.InvalidByteError); ok { - Exitf("-B argument contains invalid hex digit %c: %s", byte(inv), ov) - } - Exitf("-B argument contains invalid hex: %s", ov) - } - - buildinfo = b -} - -// Build info note -const ( - ELF_NOTE_BUILDINFO_NAMESZ = 4 - ELF_NOTE_BUILDINFO_TAG = 3 -) - -var ELF_NOTE_BUILDINFO_NAME = []byte("GNU\x00") - -func elfbuildinfo(sh *ElfShdr, startva uint64, resoff uint64) int { - n := int(ELF_NOTE_BUILDINFO_NAMESZ + Rnd(int64(len(buildinfo)), 4)) - return elfnote(sh, startva, resoff, n) -} - -func elfgobuildid(sh *ElfShdr, startva uint64, resoff uint64) int { - n := len(ELF_NOTE_GO_NAME) + int(Rnd(int64(len(*flagBuildid)), 4)) - return elfnote(sh, startva, resoff, n) -} - -func elfwritebuildinfo(out *OutBuf) int { - sh := elfwritenotehdr(out, ".note.gnu.build-id", ELF_NOTE_BUILDINFO_NAMESZ, uint32(len(buildinfo)), ELF_NOTE_BUILDINFO_TAG) - if sh == nil { - return 0 - } - - out.Write(ELF_NOTE_BUILDINFO_NAME) - out.Write(buildinfo) - var zero = make([]byte, 4) - out.Write(zero[:int(Rnd(int64(len(buildinfo)), 4)-int64(len(buildinfo)))]) - - return int(sh.size) -} - -func elfwritegobuildid(out *OutBuf) int { - sh := elfwritenotehdr(out, ".note.go.buildid", uint32(len(ELF_NOTE_GO_NAME)), uint32(len(*flagBuildid)), ELF_NOTE_GOBUILDID_TAG) - if sh == nil { - return 0 - } - - out.Write(ELF_NOTE_GO_NAME) - out.Write([]byte(*flagBuildid)) - var zero = make([]byte, 4) - out.Write(zero[:int(Rnd(int64(len(*flagBuildid)), 4)-int64(len(*flagBuildid)))]) - - return int(sh.size) -} - -// Go specific notes -const ( - ELF_NOTE_GOPKGLIST_TAG = 1 - ELF_NOTE_GOABIHASH_TAG = 2 - ELF_NOTE_GODEPS_TAG = 3 - ELF_NOTE_GOBUILDID_TAG = 4 -) - -var ELF_NOTE_GO_NAME = []byte("Go\x00\x00") - -var elfverneed int - -type Elfaux struct { - next *Elfaux - num int - vers string -} - -type Elflib struct { - next *Elflib - aux *Elfaux - file string -} - -func addelflib(list **Elflib, file string, vers string) *Elfaux { - var lib *Elflib - - for lib = *list; lib != nil; lib = lib.next { - if lib.file == file { - goto havelib - } - } - lib = new(Elflib) - lib.next = *list - lib.file = file - *list = lib - -havelib: - for aux := lib.aux; aux != nil; aux = aux.next { - if aux.vers == vers { - return aux - } - } - aux := new(Elfaux) - aux.next = lib.aux - aux.vers = vers - lib.aux = aux - - return aux -} - -func elfdynhash(ctxt *Link) { - if !ctxt.IsELF { - return - } - - nsym := Nelfsym - s := ctxt.Syms.Lookup(".hash", 0) - s.Type = sym.SELFROSECT - s.Attr |= sym.AttrReachable - - i := nsym - nbucket := 1 - for i > 0 { - nbucket++ - i >>= 1 - } - - var needlib *Elflib - need := make([]*Elfaux, nsym) - chain := make([]uint32, nsym) - buckets := make([]uint32, nbucket) - - for _, sy := range ctxt.Syms.Allsym { - if sy.Dynid <= 0 { - continue - } - - if sy.Dynimpvers() != "" { - need[sy.Dynid] = addelflib(&needlib, sy.Dynimplib(), sy.Dynimpvers()) - } - - name := sy.Extname() - hc := elfhash(name) - - b := hc % uint32(nbucket) - chain[sy.Dynid] = buckets[b] - buckets[b] = uint32(sy.Dynid) - } - - // s390x (ELF64) hash table entries are 8 bytes - if ctxt.Arch.Family == sys.S390X { - s.AddUint64(ctxt.Arch, uint64(nbucket)) - s.AddUint64(ctxt.Arch, uint64(nsym)) - for i := 0; i < nbucket; i++ { - s.AddUint64(ctxt.Arch, uint64(buckets[i])) - } - for i := 0; i < nsym; i++ { - s.AddUint64(ctxt.Arch, uint64(chain[i])) - } - } else { - s.AddUint32(ctxt.Arch, uint32(nbucket)) - s.AddUint32(ctxt.Arch, uint32(nsym)) - for i := 0; i < nbucket; i++ { - s.AddUint32(ctxt.Arch, buckets[i]) - } - for i := 0; i < nsym; i++ { - s.AddUint32(ctxt.Arch, chain[i]) - } - } - - // version symbols - dynstr := ctxt.Syms.Lookup(".dynstr", 0) - - s = ctxt.Syms.Lookup(".gnu.version_r", 0) - i = 2 - nfile := 0 - for l := needlib; l != nil; l = l.next { - nfile++ - - // header - s.AddUint16(ctxt.Arch, 1) // table version - j := 0 - for x := l.aux; x != nil; x = x.next { - j++ - } - s.AddUint16(ctxt.Arch, uint16(j)) // aux count - s.AddUint32(ctxt.Arch, uint32(Addstring(dynstr, l.file))) // file string offset - s.AddUint32(ctxt.Arch, 16) // offset from header to first aux - if l.next != nil { - s.AddUint32(ctxt.Arch, 16+uint32(j)*16) // offset from this header to next - } else { - s.AddUint32(ctxt.Arch, 0) - } - - for x := l.aux; x != nil; x = x.next { - x.num = i - i++ - - // aux struct - s.AddUint32(ctxt.Arch, elfhash(x.vers)) // hash - s.AddUint16(ctxt.Arch, 0) // flags - s.AddUint16(ctxt.Arch, uint16(x.num)) // other - index we refer to this by - s.AddUint32(ctxt.Arch, uint32(Addstring(dynstr, x.vers))) // version string offset - if x.next != nil { - s.AddUint32(ctxt.Arch, 16) // offset from this aux to next - } else { - s.AddUint32(ctxt.Arch, 0) - } - } - } - - // version references - s = ctxt.Syms.Lookup(".gnu.version", 0) - - for i := 0; i < nsym; i++ { - if i == 0 { - s.AddUint16(ctxt.Arch, 0) // first entry - no symbol - } else if need[i] == nil { - s.AddUint16(ctxt.Arch, 1) // global - } else { - s.AddUint16(ctxt.Arch, uint16(need[i].num)) - } - } - - s = ctxt.Syms.Lookup(".dynamic", 0) - elfverneed = nfile - if elfverneed != 0 { - elfwritedynentsym(ctxt, s, DT_VERNEED, ctxt.Syms.Lookup(".gnu.version_r", 0)) - Elfwritedynent(ctxt, s, DT_VERNEEDNUM, uint64(nfile)) - elfwritedynentsym(ctxt, s, DT_VERSYM, ctxt.Syms.Lookup(".gnu.version", 0)) - } - - sy := ctxt.Syms.Lookup(elfRelType+".plt", 0) - if sy.Size > 0 { - if elfRelType == ".rela" { - Elfwritedynent(ctxt, s, DT_PLTREL, DT_RELA) - } else { - Elfwritedynent(ctxt, s, DT_PLTREL, DT_REL) - } - elfwritedynentsymsize(ctxt, s, DT_PLTRELSZ, sy) - elfwritedynentsym(ctxt, s, DT_JMPREL, sy) - } - - Elfwritedynent(ctxt, s, DT_NULL, 0) -} - -func elfphload(seg *sym.Segment) *ElfPhdr { - ph := newElfPhdr() - ph.type_ = PT_LOAD - if seg.Rwx&4 != 0 { - ph.flags |= PF_R - } - if seg.Rwx&2 != 0 { - ph.flags |= PF_W - } - if seg.Rwx&1 != 0 { - ph.flags |= PF_X - } - ph.vaddr = seg.Vaddr - ph.paddr = seg.Vaddr - ph.memsz = seg.Length - ph.off = seg.Fileoff - ph.filesz = seg.Filelen - ph.align = uint64(*FlagRound) - - return ph -} - -func elfphrelro(seg *sym.Segment) { - ph := newElfPhdr() - ph.type_ = PT_GNU_RELRO - ph.vaddr = seg.Vaddr - ph.paddr = seg.Vaddr - ph.memsz = seg.Length - ph.off = seg.Fileoff - ph.filesz = seg.Filelen - ph.align = uint64(*FlagRound) -} - -func elfshname(name string) *ElfShdr { - for i := 0; i < nelfstr; i++ { - if name != elfstr[i].s { - continue - } - off := elfstr[i].off - for i = 0; i < int(ehdr.shnum); i++ { - sh := shdr[i] - if sh.name == uint32(off) { - return sh - } - } - return newElfShdr(int64(off)) - } - Exitf("cannot find elf name %s", name) - return nil -} - -// Create an ElfShdr for the section with name. -// Create a duplicate if one already exists with that name -func elfshnamedup(name string) *ElfShdr { - for i := 0; i < nelfstr; i++ { - if name == elfstr[i].s { - off := elfstr[i].off - return newElfShdr(int64(off)) - } - } - - Errorf(nil, "cannot find elf name %s", name) - errorexit() - return nil -} - -func elfshalloc(sect *sym.Section) *ElfShdr { - sh := elfshname(sect.Name) - sect.Elfsect = sh - return sh -} - -func elfshbits(linkmode LinkMode, sect *sym.Section) *ElfShdr { - var sh *ElfShdr - - if sect.Name == ".text" { - if sect.Elfsect == nil { - sect.Elfsect = elfshnamedup(sect.Name) - } - sh = sect.Elfsect.(*ElfShdr) - } else { - sh = elfshalloc(sect) - } - - // If this section has already been set up as a note, we assume type_ and - // flags are already correct, but the other fields still need filling in. - if sh.type_ == SHT_NOTE { - if linkmode != LinkExternal { - // TODO(mwhudson): the approach here will work OK when - // linking internally for notes that we want to be included - // in a loadable segment (e.g. the abihash note) but not for - // notes that we do not want to be mapped (e.g. the package - // list note). The real fix is probably to define new values - // for Symbol.Type corresponding to mapped and unmapped notes - // and handle them in dodata(). - Errorf(nil, "sh.type_ == SHT_NOTE in elfshbits when linking internally") - } - sh.addralign = uint64(sect.Align) - sh.size = sect.Length - sh.off = sect.Seg.Fileoff + sect.Vaddr - sect.Seg.Vaddr - return sh - } - if sh.type_ > 0 { - return sh - } - - if sect.Vaddr < sect.Seg.Vaddr+sect.Seg.Filelen { - sh.type_ = SHT_PROGBITS - } else { - sh.type_ = SHT_NOBITS - } - sh.flags = SHF_ALLOC - if sect.Rwx&1 != 0 { - sh.flags |= SHF_EXECINSTR - } - if sect.Rwx&2 != 0 { - sh.flags |= SHF_WRITE - } - if sect.Name == ".tbss" { - sh.flags |= SHF_TLS - sh.type_ = SHT_NOBITS - } - if strings.HasPrefix(sect.Name, ".debug") || strings.HasPrefix(sect.Name, ".zdebug") { - sh.flags = 0 - } - - if linkmode != LinkExternal { - sh.addr = sect.Vaddr - } - sh.addralign = uint64(sect.Align) - sh.size = sect.Length - if sect.Name != ".tbss" { - sh.off = sect.Seg.Fileoff + sect.Vaddr - sect.Seg.Vaddr - } - - return sh -} - -func elfshreloc(arch *sys.Arch, sect *sym.Section) *ElfShdr { - // If main section is SHT_NOBITS, nothing to relocate. - // Also nothing to relocate in .shstrtab or notes. - if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { - return nil - } - if sect.Name == ".shstrtab" || sect.Name == ".tbss" { - return nil - } - if sect.Elfsect.(*ElfShdr).type_ == SHT_NOTE { - return nil - } - - typ := SHT_REL - if elfRelType == ".rela" { - typ = SHT_RELA - } - - sh := elfshname(elfRelType + sect.Name) - // There could be multiple text sections but each needs - // its own .rela.text. - - if sect.Name == ".text" { - if sh.info != 0 && sh.info != uint32(sect.Elfsect.(*ElfShdr).shnum) { - sh = elfshnamedup(elfRelType + sect.Name) - } - } - - sh.type_ = uint32(typ) - sh.entsize = uint64(arch.RegSize) * 2 - if typ == SHT_RELA { - sh.entsize += uint64(arch.RegSize) - } - sh.link = uint32(elfshname(".symtab").shnum) - sh.info = uint32(sect.Elfsect.(*ElfShdr).shnum) - sh.off = sect.Reloff - sh.size = sect.Rellen - sh.addralign = uint64(arch.RegSize) - return sh -} - -func elfrelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { - // If main section is SHT_NOBITS, nothing to relocate. - // Also nothing to relocate in .shstrtab. - if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { - return - } - if sect.Name == ".shstrtab" { - return - } - - sect.Reloff = uint64(ctxt.Out.Offset()) - for i, s := range syms { - if !s.Attr.Reachable() { - continue - } - if uint64(s.Value) >= sect.Vaddr { - syms = syms[i:] - break - } - } - - eaddr := int32(sect.Vaddr + sect.Length) - for _, s := range syms { - if !s.Attr.Reachable() { - continue - } - if s.Value >= int64(eaddr) { - break - } - for ri := range s.R { - r := &s.R[ri] - if r.Done { - continue - } - if r.Xsym == nil { - Errorf(s, "missing xsym in relocation %#v %#v", r.Sym.Name, s) - continue - } - if r.Xsym.ElfsymForReloc() == 0 { - Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Sym.Type) - } - if !r.Xsym.Attr.Reachable() { - Errorf(s, "unreachable reloc %d (%s) target %v", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Xsym.Name) - } - if !thearch.Elfreloc1(ctxt, r, int64(uint64(s.Value+int64(r.Off))-sect.Vaddr)) { - Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Siz, r.Sym.Name) - } - } - } - - sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff -} - -func Elfemitreloc(ctxt *Link) { - for ctxt.Out.Offset()&7 != 0 { - ctxt.Out.Write8(0) - } - - for _, sect := range Segtext.Sections { - if sect.Name == ".text" { - elfrelocsect(ctxt, sect, ctxt.Textp) - } else { - elfrelocsect(ctxt, sect, datap) - } - } - - for _, sect := range Segrodata.Sections { - elfrelocsect(ctxt, sect, datap) - } - for _, sect := range Segrelrodata.Sections { - elfrelocsect(ctxt, sect, datap) - } - for _, sect := range Segdata.Sections { - elfrelocsect(ctxt, sect, datap) - } - for _, sect := range Segdwarf.Sections { - elfrelocsect(ctxt, sect, dwarfp) - } -} - -func addgonote(ctxt *Link, sectionName string, tag uint32, desc []byte) { - s := ctxt.Syms.Lookup(sectionName, 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SELFROSECT - // namesz - s.AddUint32(ctxt.Arch, uint32(len(ELF_NOTE_GO_NAME))) - // descsz - s.AddUint32(ctxt.Arch, uint32(len(desc))) - // tag - s.AddUint32(ctxt.Arch, tag) - // name + padding - s.P = append(s.P, ELF_NOTE_GO_NAME...) - for len(s.P)%4 != 0 { - s.P = append(s.P, 0) - } - // desc + padding - s.P = append(s.P, desc...) - for len(s.P)%4 != 0 { - s.P = append(s.P, 0) - } - s.Size = int64(len(s.P)) - s.Align = 4 -} - -func (ctxt *Link) doelf() { - if !ctxt.IsELF { - return - } - - /* predefine strings we need for section headers */ - shstrtab := ctxt.Syms.Lookup(".shstrtab", 0) - - shstrtab.Type = sym.SELFROSECT - shstrtab.Attr |= sym.AttrReachable - - Addstring(shstrtab, "") - Addstring(shstrtab, ".text") - Addstring(shstrtab, ".noptrdata") - Addstring(shstrtab, ".data") - Addstring(shstrtab, ".bss") - Addstring(shstrtab, ".noptrbss") - Addstring(shstrtab, "__libfuzzer_extra_counters") - Addstring(shstrtab, ".go.buildinfo") - - // 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.LinkMode == LinkExternal { - Addstring(shstrtab, ".tbss") - } - if ctxt.HeadType == objabi.Hnetbsd { - Addstring(shstrtab, ".note.netbsd.ident") - if *flagRace { - Addstring(shstrtab, ".note.netbsd.pax") - } - } - if ctxt.HeadType == objabi.Hopenbsd { - Addstring(shstrtab, ".note.openbsd.ident") - } - if len(buildinfo) > 0 { - Addstring(shstrtab, ".note.gnu.build-id") - } - if *flagBuildid != "" { - Addstring(shstrtab, ".note.go.buildid") - } - Addstring(shstrtab, ".elfdata") - Addstring(shstrtab, ".rodata") - // See the comment about data.rel.ro.FOO section names in data.go. - relro_prefix := "" - if ctxt.UseRelro() { - Addstring(shstrtab, ".data.rel.ro") - relro_prefix = ".data.rel.ro" - } - Addstring(shstrtab, relro_prefix+".typelink") - Addstring(shstrtab, relro_prefix+".itablink") - Addstring(shstrtab, relro_prefix+".gosymtab") - Addstring(shstrtab, relro_prefix+".gopclntab") - - if ctxt.LinkMode == LinkExternal { - *FlagD = true - - Addstring(shstrtab, elfRelType+".text") - Addstring(shstrtab, elfRelType+".rodata") - Addstring(shstrtab, elfRelType+relro_prefix+".typelink") - Addstring(shstrtab, elfRelType+relro_prefix+".itablink") - Addstring(shstrtab, elfRelType+relro_prefix+".gosymtab") - Addstring(shstrtab, elfRelType+relro_prefix+".gopclntab") - Addstring(shstrtab, elfRelType+".noptrdata") - Addstring(shstrtab, elfRelType+".data") - if ctxt.UseRelro() { - Addstring(shstrtab, elfRelType+".data.rel.ro") - } - Addstring(shstrtab, elfRelType+".go.buildinfo") - - // add a .note.GNU-stack section to mark the stack as non-executable - Addstring(shstrtab, ".note.GNU-stack") - - if ctxt.BuildMode == BuildModeShared { - Addstring(shstrtab, ".note.go.abihash") - Addstring(shstrtab, ".note.go.pkg-list") - Addstring(shstrtab, ".note.go.deps") - } - } - - hasinitarr := ctxt.linkShared - - /* shared library initializer */ - switch ctxt.BuildMode { - case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePlugin: - hasinitarr = true - } - - if hasinitarr { - Addstring(shstrtab, ".init_array") - Addstring(shstrtab, elfRelType+".init_array") - } - - if !*FlagS { - Addstring(shstrtab, ".symtab") - Addstring(shstrtab, ".strtab") - dwarfaddshstrings(ctxt, shstrtab) - } - - Addstring(shstrtab, ".shstrtab") - - if !*FlagD { /* -d suppresses dynamic loader format */ - Addstring(shstrtab, ".interp") - Addstring(shstrtab, ".hash") - Addstring(shstrtab, ".got") - if ctxt.Arch.Family == sys.PPC64 { - Addstring(shstrtab, ".glink") - } - Addstring(shstrtab, ".got.plt") - Addstring(shstrtab, ".dynamic") - Addstring(shstrtab, ".dynsym") - Addstring(shstrtab, ".dynstr") - Addstring(shstrtab, elfRelType) - Addstring(shstrtab, elfRelType+".plt") - - Addstring(shstrtab, ".plt") - Addstring(shstrtab, ".gnu.version") - Addstring(shstrtab, ".gnu.version_r") - - /* dynamic symbol table - first entry all zeros */ - s := ctxt.Syms.Lookup(".dynsym", 0) - - s.Type = sym.SELFROSECT - s.Attr |= sym.AttrReachable - if elf64 { - s.Size += ELF64SYMSIZE - } else { - s.Size += ELF32SYMSIZE - } - - /* dynamic string table */ - s = ctxt.Syms.Lookup(".dynstr", 0) - - s.Type = sym.SELFROSECT - s.Attr |= sym.AttrReachable - if s.Size == 0 { - Addstring(s, "") - } - dynstr := s - - /* relocation table */ - s = ctxt.Syms.Lookup(elfRelType, 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SELFROSECT - - /* global offset table */ - s = ctxt.Syms.Lookup(".got", 0) - - s.Attr |= sym.AttrReachable - s.Type = sym.SELFGOT // writable - - /* ppc64 glink resolver */ - if ctxt.Arch.Family == sys.PPC64 { - s := ctxt.Syms.Lookup(".glink", 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SELFRXSECT - } - - /* hash */ - s = ctxt.Syms.Lookup(".hash", 0) - - s.Attr |= sym.AttrReachable - s.Type = sym.SELFROSECT - - s = ctxt.Syms.Lookup(".got.plt", 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SELFSECT // writable - - s = ctxt.Syms.Lookup(".plt", 0) - - s.Attr |= sym.AttrReachable - if ctxt.Arch.Family == sys.PPC64 { - // In the ppc64 ABI, .plt is a data section - // written by the dynamic linker. - s.Type = sym.SELFSECT - } else { - s.Type = sym.SELFRXSECT - } - - thearch.Elfsetupplt(ctxt) - - s = ctxt.Syms.Lookup(elfRelType+".plt", 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SELFROSECT - - s = ctxt.Syms.Lookup(".gnu.version", 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SELFROSECT - - s = ctxt.Syms.Lookup(".gnu.version_r", 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SELFROSECT - - /* define dynamic elf table */ - s = ctxt.Syms.Lookup(".dynamic", 0) - - s.Attr |= sym.AttrReachable - s.Type = sym.SELFSECT // writable - - /* - * .dynamic table - */ - elfwritedynentsym(ctxt, s, DT_HASH, ctxt.Syms.Lookup(".hash", 0)) - - elfwritedynentsym(ctxt, s, DT_SYMTAB, ctxt.Syms.Lookup(".dynsym", 0)) - if elf64 { - Elfwritedynent(ctxt, s, DT_SYMENT, ELF64SYMSIZE) - } else { - Elfwritedynent(ctxt, s, DT_SYMENT, ELF32SYMSIZE) - } - elfwritedynentsym(ctxt, s, DT_STRTAB, ctxt.Syms.Lookup(".dynstr", 0)) - elfwritedynentsymsize(ctxt, s, DT_STRSZ, ctxt.Syms.Lookup(".dynstr", 0)) - if elfRelType == ".rela" { - elfwritedynentsym(ctxt, s, DT_RELA, ctxt.Syms.Lookup(".rela", 0)) - elfwritedynentsymsize(ctxt, s, DT_RELASZ, ctxt.Syms.Lookup(".rela", 0)) - Elfwritedynent(ctxt, s, DT_RELAENT, ELF64RELASIZE) - } else { - elfwritedynentsym(ctxt, s, DT_REL, ctxt.Syms.Lookup(".rel", 0)) - elfwritedynentsymsize(ctxt, s, DT_RELSZ, ctxt.Syms.Lookup(".rel", 0)) - Elfwritedynent(ctxt, s, DT_RELENT, ELF32RELSIZE) - } - - if rpath.val != "" { - Elfwritedynent(ctxt, s, DT_RUNPATH, uint64(Addstring(dynstr, rpath.val))) - } - - if ctxt.Arch.Family == sys.PPC64 { - elfwritedynentsym(ctxt, s, DT_PLTGOT, ctxt.Syms.Lookup(".plt", 0)) - } else if ctxt.Arch.Family == sys.S390X { - elfwritedynentsym(ctxt, s, DT_PLTGOT, ctxt.Syms.Lookup(".got", 0)) - } else { - elfwritedynentsym(ctxt, s, DT_PLTGOT, ctxt.Syms.Lookup(".got.plt", 0)) - } - - if ctxt.Arch.Family == sys.PPC64 { - Elfwritedynent(ctxt, s, DT_PPC64_OPT, 0) - } - - // Solaris dynamic linker can't handle an empty .rela.plt if - // DT_JMPREL is emitted so we have to defer generation of DT_PLTREL, - // DT_PLTRELSZ, and DT_JMPREL dynamic entries until after we know the - // size of .rel(a).plt section. - Elfwritedynent(ctxt, s, DT_DEBUG, 0) - } - - if ctxt.BuildMode == BuildModeShared { - // The go.link.abihashbytes symbol will be pointed at the appropriate - // part of the .note.go.abihash section in data.go:func address(). - s := ctxt.Syms.Lookup("go.link.abihashbytes", 0) - s.Attr |= sym.AttrLocal - s.Type = sym.SRODATA - s.Attr |= sym.AttrSpecial - s.Attr |= sym.AttrReachable - s.Size = int64(sha1.Size) - - sort.Sort(byPkg(ctxt.Library)) - h := sha1.New() - for _, l := range ctxt.Library { - io.WriteString(h, l.Hash) - } - addgonote(ctxt, ".note.go.abihash", ELF_NOTE_GOABIHASH_TAG, h.Sum([]byte{})) - addgonote(ctxt, ".note.go.pkg-list", ELF_NOTE_GOPKGLIST_TAG, pkglistfornote) - var deplist []string - for _, shlib := range ctxt.Shlibs { - deplist = append(deplist, filepath.Base(shlib.Path)) - } - addgonote(ctxt, ".note.go.deps", ELF_NOTE_GODEPS_TAG, []byte(strings.Join(deplist, "\n"))) - } - - if ctxt.LinkMode == LinkExternal && *flagBuildid != "" { - addgonote(ctxt, ".note.go.buildid", ELF_NOTE_GOBUILDID_TAG, []byte(*flagBuildid)) - } -} - -// Do not write DT_NULL. elfdynhash will finish it. -func shsym(sh *ElfShdr, s *sym.Symbol) { - addr := Symaddr(s) - if sh.flags&SHF_ALLOC != 0 { - sh.addr = uint64(addr) - } - sh.off = uint64(datoff(s, addr)) - sh.size = uint64(s.Size) -} - -func phsh(ph *ElfPhdr, sh *ElfShdr) { - ph.vaddr = sh.addr - ph.paddr = ph.vaddr - ph.off = sh.off - ph.filesz = sh.size - ph.memsz = sh.size - ph.align = sh.addralign -} - -func Asmbelfsetup() { - /* This null SHdr must appear before all others */ - elfshname("") - - for _, sect := range Segtext.Sections { - // There could be multiple .text sections. Instead check the Elfsect - // field to determine if already has an ElfShdr and if not, create one. - if sect.Name == ".text" { - if sect.Elfsect == nil { - sect.Elfsect = elfshnamedup(sect.Name) - } - } else { - elfshalloc(sect) - } - } - for _, sect := range Segrodata.Sections { - elfshalloc(sect) - } - for _, sect := range Segrelrodata.Sections { - elfshalloc(sect) - } - for _, sect := range Segdata.Sections { - elfshalloc(sect) - } - for _, sect := range Segdwarf.Sections { - elfshalloc(sect) - } -} - -func Asmbelf(ctxt *Link, symo int64) { - eh := getElfEhdr() - switch ctxt.Arch.Family { - default: - Exitf("unknown architecture in asmbelf: %v", ctxt.Arch.Family) - case sys.MIPS, sys.MIPS64: - eh.machine = EM_MIPS - case sys.ARM: - eh.machine = EM_ARM - case sys.AMD64: - eh.machine = EM_X86_64 - case sys.ARM64: - eh.machine = EM_AARCH64 - case sys.I386: - eh.machine = EM_386 - case sys.PPC64: - eh.machine = EM_PPC64 - case sys.RISCV64: - eh.machine = EM_RISCV - case sys.S390X: - eh.machine = EM_S390 - } - - elfreserve := int64(ELFRESERVE) - - numtext := int64(0) - for _, sect := range Segtext.Sections { - if sect.Name == ".text" { - numtext++ - } - } - - // If there are multiple text sections, extra space is needed - // in the elfreserve for the additional .text and .rela.text - // section headers. It can handle 4 extra now. Headers are - // 64 bytes. - - if numtext > 4 { - elfreserve += elfreserve + numtext*64*2 - } - - startva := *FlagTextAddr - int64(HEADR) - resoff := elfreserve - - var pph *ElfPhdr - var pnote *ElfPhdr - if *flagRace && ctxt.HeadType == objabi.Hnetbsd { - sh := elfshname(".note.netbsd.pax") - resoff -= int64(elfnetbsdpax(sh, uint64(startva), uint64(resoff))) - pnote = newElfPhdr() - pnote.type_ = PT_NOTE - pnote.flags = PF_R - phsh(pnote, sh) - } - if ctxt.LinkMode == LinkExternal { - /* skip program headers */ - eh.phoff = 0 - - eh.phentsize = 0 - - if ctxt.BuildMode == BuildModeShared { - sh := elfshname(".note.go.pkg-list") - sh.type_ = SHT_NOTE - sh = elfshname(".note.go.abihash") - sh.type_ = SHT_NOTE - sh.flags = SHF_ALLOC - sh = elfshname(".note.go.deps") - sh.type_ = SHT_NOTE - } - - if *flagBuildid != "" { - sh := elfshname(".note.go.buildid") - sh.type_ = SHT_NOTE - sh.flags = SHF_ALLOC - } - - goto elfobj - } - - /* program header info */ - pph = newElfPhdr() - - pph.type_ = PT_PHDR - pph.flags = PF_R - pph.off = uint64(eh.ehsize) - pph.vaddr = uint64(*FlagTextAddr) - uint64(HEADR) + pph.off - pph.paddr = uint64(*FlagTextAddr) - uint64(HEADR) + pph.off - pph.align = uint64(*FlagRound) - - /* - * PHDR must be in a loaded segment. Adjust the text - * segment boundaries downwards to include it. - */ - { - o := int64(Segtext.Vaddr - pph.vaddr) - Segtext.Vaddr -= uint64(o) - Segtext.Length += uint64(o) - o = int64(Segtext.Fileoff - pph.off) - Segtext.Fileoff -= uint64(o) - Segtext.Filelen += uint64(o) - } - - if !*FlagD { /* -d suppresses dynamic loader format */ - /* interpreter */ - sh := elfshname(".interp") - - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC - sh.addralign = 1 - - if interpreter == "" && objabi.GO_LDSO != "" { - interpreter = objabi.GO_LDSO - } - - if interpreter == "" { - switch ctxt.HeadType { - case objabi.Hlinux: - if objabi.GOOS == "android" { - interpreter = thearch.Androiddynld - if interpreter == "" { - Exitf("ELF interpreter not set") - } - } else { - interpreter = thearch.Linuxdynld - } - - case objabi.Hfreebsd: - interpreter = thearch.Freebsddynld - - case objabi.Hnetbsd: - interpreter = thearch.Netbsddynld - - case objabi.Hopenbsd: - interpreter = thearch.Openbsddynld - - case objabi.Hdragonfly: - interpreter = thearch.Dragonflydynld - - case objabi.Hsolaris: - interpreter = thearch.Solarisdynld - } - } - - resoff -= int64(elfinterp(sh, uint64(startva), uint64(resoff), interpreter)) - - ph := newElfPhdr() - ph.type_ = PT_INTERP - ph.flags = PF_R - phsh(ph, sh) - } - - pnote = nil - if ctxt.HeadType == objabi.Hnetbsd || ctxt.HeadType == objabi.Hopenbsd { - var sh *ElfShdr - switch ctxt.HeadType { - case objabi.Hnetbsd: - sh = elfshname(".note.netbsd.ident") - resoff -= int64(elfnetbsdsig(sh, uint64(startva), uint64(resoff))) - - case objabi.Hopenbsd: - sh = elfshname(".note.openbsd.ident") - resoff -= int64(elfopenbsdsig(sh, uint64(startva), uint64(resoff))) - } - - pnote = newElfPhdr() - pnote.type_ = PT_NOTE - pnote.flags = PF_R - phsh(pnote, sh) - } - - if len(buildinfo) > 0 { - sh := elfshname(".note.gnu.build-id") - resoff -= int64(elfbuildinfo(sh, uint64(startva), uint64(resoff))) - - if pnote == nil { - pnote = newElfPhdr() - pnote.type_ = PT_NOTE - pnote.flags = PF_R - } - - phsh(pnote, sh) - } - - if *flagBuildid != "" { - sh := elfshname(".note.go.buildid") - resoff -= int64(elfgobuildid(sh, uint64(startva), uint64(resoff))) - - pnote := newElfPhdr() - pnote.type_ = PT_NOTE - pnote.flags = PF_R - phsh(pnote, sh) - } - - // Additions to the reserved area must be above this line. - - elfphload(&Segtext) - if len(Segrodata.Sections) > 0 { - elfphload(&Segrodata) - } - if len(Segrelrodata.Sections) > 0 { - elfphload(&Segrelrodata) - elfphrelro(&Segrelrodata) - } - elfphload(&Segdata) - - /* Dynamic linking sections */ - if !*FlagD { - sh := elfshname(".dynsym") - sh.type_ = SHT_DYNSYM - sh.flags = SHF_ALLOC - if elf64 { - sh.entsize = ELF64SYMSIZE - } else { - sh.entsize = ELF32SYMSIZE - } - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".dynstr").shnum) - - // sh.info is the index of first non-local symbol (number of local symbols) - s := ctxt.Syms.Lookup(".dynsym", 0) - i := uint32(0) - for sub := s; sub != nil; sub = sub.Sub { - i++ - if !sub.Attr.Local() { - break - } - } - sh.info = i - shsym(sh, s) - - sh = elfshname(".dynstr") - sh.type_ = SHT_STRTAB - sh.flags = SHF_ALLOC - sh.addralign = 1 - shsym(sh, ctxt.Syms.Lookup(".dynstr", 0)) - - if elfverneed != 0 { - sh := elfshname(".gnu.version") - sh.type_ = SHT_GNU_VERSYM - sh.flags = SHF_ALLOC - sh.addralign = 2 - sh.link = uint32(elfshname(".dynsym").shnum) - sh.entsize = 2 - shsym(sh, ctxt.Syms.Lookup(".gnu.version", 0)) - - sh = elfshname(".gnu.version_r") - sh.type_ = SHT_GNU_VERNEED - sh.flags = SHF_ALLOC - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.info = uint32(elfverneed) - sh.link = uint32(elfshname(".dynstr").shnum) - shsym(sh, ctxt.Syms.Lookup(".gnu.version_r", 0)) - } - - if elfRelType == ".rela" { - sh := elfshname(".rela.plt") - sh.type_ = SHT_RELA - sh.flags = SHF_ALLOC - sh.entsize = ELF64RELASIZE - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".dynsym").shnum) - sh.info = uint32(elfshname(".plt").shnum) - shsym(sh, ctxt.Syms.Lookup(".rela.plt", 0)) - - sh = elfshname(".rela") - sh.type_ = SHT_RELA - sh.flags = SHF_ALLOC - sh.entsize = ELF64RELASIZE - sh.addralign = 8 - sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rela", 0)) - } else { - sh := elfshname(".rel.plt") - sh.type_ = SHT_REL - sh.flags = SHF_ALLOC - sh.entsize = ELF32RELSIZE - sh.addralign = 4 - sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rel.plt", 0)) - - sh = elfshname(".rel") - sh.type_ = SHT_REL - sh.flags = SHF_ALLOC - sh.entsize = ELF32RELSIZE - sh.addralign = 4 - sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rel", 0)) - } - - if eh.machine == EM_PPC64 { - sh := elfshname(".glink") - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC + SHF_EXECINSTR - sh.addralign = 4 - shsym(sh, ctxt.Syms.Lookup(".glink", 0)) - } - - sh = elfshname(".plt") - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC + SHF_EXECINSTR - if eh.machine == EM_X86_64 { - sh.entsize = 16 - } else if eh.machine == EM_S390 { - sh.entsize = 32 - } else if eh.machine == EM_PPC64 { - // On ppc64, this is just a table of addresses - // filled by the dynamic linker - sh.type_ = SHT_NOBITS - - sh.flags = SHF_ALLOC + SHF_WRITE - sh.entsize = 8 - } else { - sh.entsize = 4 - } - sh.addralign = sh.entsize - shsym(sh, ctxt.Syms.Lookup(".plt", 0)) - - // On ppc64, .got comes from the input files, so don't - // create it here, and .got.plt is not used. - if eh.machine != EM_PPC64 { - sh := elfshname(".got") - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC + SHF_WRITE - sh.entsize = uint64(ctxt.Arch.RegSize) - sh.addralign = uint64(ctxt.Arch.RegSize) - shsym(sh, ctxt.Syms.Lookup(".got", 0)) - - sh = elfshname(".got.plt") - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC + SHF_WRITE - sh.entsize = uint64(ctxt.Arch.RegSize) - sh.addralign = uint64(ctxt.Arch.RegSize) - shsym(sh, ctxt.Syms.Lookup(".got.plt", 0)) - } - - sh = elfshname(".hash") - sh.type_ = SHT_HASH - sh.flags = SHF_ALLOC - sh.entsize = 4 - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".hash", 0)) - - /* sh and PT_DYNAMIC for .dynamic section */ - sh = elfshname(".dynamic") - - sh.type_ = SHT_DYNAMIC - sh.flags = SHF_ALLOC + SHF_WRITE - sh.entsize = 2 * uint64(ctxt.Arch.RegSize) - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".dynstr").shnum) - shsym(sh, ctxt.Syms.Lookup(".dynamic", 0)) - ph := newElfPhdr() - ph.type_ = PT_DYNAMIC - ph.flags = PF_R + PF_W - phsh(ph, sh) - - /* - * Thread-local storage segment (really just size). - */ - tlssize := uint64(0) - for _, sect := range Segdata.Sections { - if sect.Name == ".tbss" { - tlssize = sect.Length - } - } - if tlssize != 0 { - ph := newElfPhdr() - ph.type_ = PT_TLS - ph.flags = PF_R - ph.memsz = tlssize - ph.align = uint64(ctxt.Arch.RegSize) - } - } - - if ctxt.HeadType == objabi.Hlinux { - ph := newElfPhdr() - ph.type_ = PT_GNU_STACK - ph.flags = PF_W + PF_R - ph.align = uint64(ctxt.Arch.RegSize) - - ph = newElfPhdr() - ph.type_ = 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_ = PT_SUNWSTACK - ph.flags = PF_W + PF_R - } - -elfobj: - sh := elfshname(".shstrtab") - sh.type_ = SHT_STRTAB - sh.addralign = 1 - shsym(sh, ctxt.Syms.Lookup(".shstrtab", 0)) - eh.shstrndx = uint16(sh.shnum) - - // put these sections early in the list - if !*FlagS { - elfshname(".symtab") - elfshname(".strtab") - } - - for _, sect := range Segtext.Sections { - elfshbits(ctxt.LinkMode, sect) - } - for _, sect := range Segrodata.Sections { - elfshbits(ctxt.LinkMode, sect) - } - for _, sect := range Segrelrodata.Sections { - elfshbits(ctxt.LinkMode, sect) - } - for _, sect := range Segdata.Sections { - elfshbits(ctxt.LinkMode, sect) - } - for _, sect := range Segdwarf.Sections { - elfshbits(ctxt.LinkMode, sect) - } - - if ctxt.LinkMode == LinkExternal { - for _, sect := range Segtext.Sections { - elfshreloc(ctxt.Arch, sect) - } - for _, sect := range Segrodata.Sections { - elfshreloc(ctxt.Arch, sect) - } - for _, sect := range Segrelrodata.Sections { - elfshreloc(ctxt.Arch, sect) - } - for _, sect := range Segdata.Sections { - elfshreloc(ctxt.Arch, sect) - } - for _, s := range dwarfp { - if len(s.R) > 0 || s.Type == sym.SDWARFINFO || s.Type == sym.SDWARFLOC { - elfshreloc(ctxt.Arch, s.Sect) - } - } - // add a .note.GNU-stack section to mark the stack as non-executable - sh := elfshname(".note.GNU-stack") - - sh.type_ = SHT_PROGBITS - sh.addralign = 1 - sh.flags = 0 - } - - if !*FlagS { - sh := elfshname(".symtab") - sh.type_ = SHT_SYMTAB - sh.off = uint64(symo) - sh.size = uint64(Symsize) - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.entsize = 8 + 2*uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".strtab").shnum) - sh.info = uint32(elfglobalsymndx) - - sh = elfshname(".strtab") - sh.type_ = SHT_STRTAB - sh.off = uint64(symo) + uint64(Symsize) - sh.size = uint64(len(Elfstrdat)) - sh.addralign = 1 - } - - /* Main header */ - eh.ident[EI_MAG0] = '\177' - - eh.ident[EI_MAG1] = 'E' - eh.ident[EI_MAG2] = 'L' - eh.ident[EI_MAG3] = 'F' - if ctxt.HeadType == objabi.Hfreebsd { - eh.ident[EI_OSABI] = ELFOSABI_FREEBSD - } else if ctxt.HeadType == objabi.Hnetbsd { - eh.ident[EI_OSABI] = ELFOSABI_NETBSD - } else if ctxt.HeadType == objabi.Hopenbsd { - eh.ident[EI_OSABI] = ELFOSABI_OPENBSD - } else if ctxt.HeadType == objabi.Hdragonfly { - eh.ident[EI_OSABI] = ELFOSABI_NONE - } - if elf64 { - eh.ident[EI_CLASS] = ELFCLASS64 - } else { - eh.ident[EI_CLASS] = ELFCLASS32 - } - if ctxt.Arch.ByteOrder == binary.BigEndian { - eh.ident[EI_DATA] = ELFDATA2MSB - } else { - eh.ident[EI_DATA] = ELFDATA2LSB - } - eh.ident[EI_VERSION] = EV_CURRENT - - if ctxt.LinkMode == LinkExternal { - eh.type_ = ET_REL - } else if ctxt.BuildMode == BuildModePIE { - eh.type_ = ET_DYN - } else { - eh.type_ = ET_EXEC - } - - if ctxt.LinkMode != LinkExternal { - eh.entry = uint64(Entryvalue(ctxt)) - } - - eh.version = EV_CURRENT - - if pph != nil { - pph.filesz = uint64(eh.phnum) * uint64(eh.phentsize) - pph.memsz = pph.filesz - } - - ctxt.Out.SeekSet(0) - a := int64(0) - a += int64(elfwritehdr(ctxt.Out)) - a += int64(elfwritephdrs(ctxt.Out)) - a += int64(elfwriteshdrs(ctxt.Out)) - if !*FlagD { - a += int64(elfwriteinterp(ctxt.Out)) - } - if ctxt.LinkMode != LinkExternal { - if ctxt.HeadType == objabi.Hnetbsd { - a += int64(elfwritenetbsdsig(ctxt.Out)) - } - if ctxt.HeadType == objabi.Hopenbsd { - a += int64(elfwriteopenbsdsig(ctxt.Out)) - } - if len(buildinfo) > 0 { - a += int64(elfwritebuildinfo(ctxt.Out)) - } - if *flagBuildid != "" { - a += int64(elfwritegobuildid(ctxt.Out)) - } - } - if *flagRace && ctxt.HeadType == objabi.Hnetbsd { - a += int64(elfwritenetbsdpax(ctxt.Out)) - } - - if a > elfreserve { - Errorf(nil, "ELFRESERVE too small: %d > %d with %d text sections", a, elfreserve, numtext) - } -} - -func elfadddynsym(ctxt *Link, s *sym.Symbol) { - if elf64 { - s.Dynid = int32(Nelfsym) - Nelfsym++ - - d := ctxt.Syms.Lookup(".dynsym", 0) - - name := s.Extname() - d.AddUint32(ctxt.Arch, uint32(Addstring(ctxt.Syms.Lookup(".dynstr", 0), name))) - - /* type */ - t := STB_GLOBAL << 4 - - if s.Attr.CgoExport() && s.Type == sym.STEXT { - t |= STT_FUNC - } else { - t |= STT_OBJECT - } - d.AddUint8(uint8(t)) - - /* reserved */ - d.AddUint8(0) - - /* section where symbol is defined */ - if s.Type == sym.SDYNIMPORT { - d.AddUint16(ctxt.Arch, SHN_UNDEF) - } else { - d.AddUint16(ctxt.Arch, 1) - } - - /* value */ - if s.Type == sym.SDYNIMPORT { - d.AddUint64(ctxt.Arch, 0) - } else { - d.AddAddr(ctxt.Arch, s) - } - - /* size of object */ - d.AddUint64(ctxt.Arch, uint64(s.Size)) - - if ctxt.Arch.Family == sys.AMD64 && !s.Attr.CgoExportDynamic() && s.Dynimplib() != "" && !seenlib[s.Dynimplib()] { - Elfwritedynent(ctxt, ctxt.Syms.Lookup(".dynamic", 0), DT_NEEDED, uint64(Addstring(ctxt.Syms.Lookup(".dynstr", 0), s.Dynimplib()))) - } - } else { - s.Dynid = int32(Nelfsym) - Nelfsym++ - - d := ctxt.Syms.Lookup(".dynsym", 0) - - /* name */ - name := s.Extname() - - d.AddUint32(ctxt.Arch, uint32(Addstring(ctxt.Syms.Lookup(".dynstr", 0), name))) - - /* value */ - if s.Type == sym.SDYNIMPORT { - d.AddUint32(ctxt.Arch, 0) - } else { - d.AddAddr(ctxt.Arch, s) - } - - /* size of object */ - d.AddUint32(ctxt.Arch, uint32(s.Size)) - - /* type */ - t := STB_GLOBAL << 4 - - // TODO(mwhudson): presumably the behavior should actually be the same on both arm and 386. - if ctxt.Arch.Family == sys.I386 && s.Attr.CgoExport() && s.Type == sym.STEXT { - t |= STT_FUNC - } else if ctxt.Arch.Family == sys.ARM && s.Attr.CgoExportDynamic() && s.Type == sym.STEXT { - t |= STT_FUNC - } else { - t |= STT_OBJECT - } - d.AddUint8(uint8(t)) - d.AddUint8(0) - - /* shndx */ - if s.Type == sym.SDYNIMPORT { - d.AddUint16(ctxt.Arch, SHN_UNDEF) - } else { - d.AddUint16(ctxt.Arch, 1) - } - } -} - -func ELF32_R_SYM(info uint32) uint32 { - return info >> 8 -} - -func ELF32_R_TYPE(info uint32) uint32 { - return uint32(uint8(info)) -} - -func ELF32_R_INFO(sym uint32, type_ uint32) uint32 { - return sym<<8 | type_ -} - -func ELF32_ST_BIND(info uint8) uint8 { - return info >> 4 -} - -func ELF32_ST_TYPE(info uint8) uint8 { - return info & 0xf -} - -func ELF32_ST_INFO(bind uint8, type_ uint8) uint8 { - return bind<<4 | type_&0xf -} - -func ELF32_ST_VISIBILITY(oth uint8) uint8 { - return oth & 3 -} - -func ELF64_R_SYM(info uint64) uint32 { - return uint32(info >> 32) -} - -func ELF64_R_TYPE(info uint64) uint32 { - return uint32(info) -} - -func ELF64_R_INFO(sym uint32, type_ uint32) uint64 { - return uint64(sym)<<32 | uint64(type_) -} - -func ELF64_ST_BIND(info uint8) uint8 { - return info >> 4 -} - -func ELF64_ST_TYPE(info uint8) uint8 { - return info & 0xf -} - -func ELF64_ST_INFO(bind uint8, type_ uint8) uint8 { - return bind<<4 | type_&0xf -} - -func ELF64_ST_VISIBILITY(oth uint8) uint8 { - return oth & 3 -} diff --git a/src/cmd/oldlink/internal/ld/execarchive.go b/src/cmd/oldlink/internal/ld/execarchive.go deleted file mode 100644 index fe5cc40865..0000000000 --- a/src/cmd/oldlink/internal/ld/execarchive.go +++ /dev/null @@ -1,37 +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. - -// +build !wasm,!windows - -package ld - -import ( - "os" - "os/exec" - "path/filepath" - "syscall" -) - -const syscallExecSupported = true - -// execArchive invokes the archiver tool with syscall.Exec(), with -// the expectation that this is the last thing that takes place -// in the linking operation. -func (ctxt *Link) execArchive(argv []string) { - var err error - argv0 := argv[0] - if filepath.Base(argv0) == argv0 { - argv0, err = exec.LookPath(argv0) - if err != nil { - Exitf("cannot find %s: %v", argv[0], err) - } - } - if ctxt.Debugvlog != 0 { - ctxt.Logf("invoking archiver with syscall.Exec()\n") - } - err = syscall.Exec(argv0, argv, os.Environ()) - if err != nil { - Exitf("running %s failed: %v", argv[0], err) - } -} diff --git a/src/cmd/oldlink/internal/ld/execarchive_noexec.go b/src/cmd/oldlink/internal/ld/execarchive_noexec.go deleted file mode 100644 index a70dea9fda..0000000000 --- a/src/cmd/oldlink/internal/ld/execarchive_noexec.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. - -// +build wasm windows - -package ld - -const syscallExecSupported = false - -func (ctxt *Link) execArchive(argv []string) { - panic("should never arrive here") -} diff --git a/src/cmd/oldlink/internal/ld/go.go b/src/cmd/oldlink/internal/ld/go.go deleted file mode 100644 index b05265580b..0000000000 --- a/src/cmd/oldlink/internal/ld/go.go +++ /dev/null @@ -1,442 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// go-specific code shared across loaders (5l, 6l, 8l). - -package ld - -import ( - "bytes" - "cmd/internal/bio" - "cmd/internal/objabi" - "cmd/oldlink/internal/sym" - "encoding/json" - "fmt" - "io" - "os" - "strings" -) - -// go-specific code shared across loaders (5l, 6l, 8l). - -// replace all "". with pkg. -func expandpkg(t0 string, pkg string) string { - return strings.Replace(t0, `"".`, pkg+".", -1) -} - -func resolveABIAlias(s *sym.Symbol) *sym.Symbol { - if s.Type != sym.SABIALIAS { - return s - } - target := s.R[0].Sym - if target.Type == sym.SABIALIAS { - panic(fmt.Sprintf("ABI alias %s references another ABI alias %s", s, target)) - } - return target -} - -// TODO: -// generate debugging section in binary. -// once the dust settles, try to move some code to -// libmach, so that other linkers and ar can share. - -func ldpkg(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, filename string) { - if *flagG { - return - } - - if int64(int(length)) != length { - fmt.Fprintf(os.Stderr, "%s: too much pkg data in %s\n", os.Args[0], filename) - if *flagU { - errorexit() - } - return - } - - bdata := make([]byte, length) - if _, err := io.ReadFull(f, bdata); err != nil { - fmt.Fprintf(os.Stderr, "%s: short pkg read %s\n", os.Args[0], filename) - if *flagU { - errorexit() - } - return - } - data := string(bdata) - - // process header lines - for data != "" { - var line string - if i := strings.Index(data, "\n"); i >= 0 { - line, data = data[:i], data[i+1:] - } else { - line, data = data, "" - } - if line == "safe" { - lib.Safe = true - } - if line == "main" { - lib.Main = true - } - if line == "" { - break - } - } - - // look for cgo section - p0 := strings.Index(data, "\n$$ // cgo") - var p1 int - if p0 >= 0 { - p0 += p1 - i := strings.IndexByte(data[p0+1:], '\n') - if i < 0 { - fmt.Fprintf(os.Stderr, "%s: found $$ // cgo but no newline in %s\n", os.Args[0], filename) - if *flagU { - errorexit() - } - return - } - p0 += 1 + i - - p1 = strings.Index(data[p0:], "\n$$") - if p1 < 0 { - p1 = strings.Index(data[p0:], "\n!\n") - } - if p1 < 0 { - fmt.Fprintf(os.Stderr, "%s: cannot find end of // cgo section in %s\n", os.Args[0], filename) - if *flagU { - errorexit() - } - return - } - p1 += p0 - loadcgo(ctxt, filename, objabi.PathToPrefix(lib.Pkg), data[p0:p1]) - } -} - -func loadcgo(ctxt *Link, file string, pkg string, p string) { - var directives [][]string - if err := json.NewDecoder(strings.NewReader(p)).Decode(&directives); err != nil { - fmt.Fprintf(os.Stderr, "%s: %s: failed decoding cgo directives: %v\n", os.Args[0], file, err) - nerrors++ - return - } - - // Find cgo_export symbols. They are roots in the deadcode pass. - for _, f := range directives { - switch f[0] { - case "cgo_export_static", "cgo_export_dynamic": - if len(f) < 2 || len(f) > 3 { - continue - } - local := f[1] - switch ctxt.BuildMode { - case BuildModeCShared, BuildModeCArchive, BuildModePlugin: - if local == "main" { - continue - } - } - local = expandpkg(local, pkg) - if f[0] == "cgo_export_static" { - ctxt.cgo_export_static[local] = true - } else { - ctxt.cgo_export_dynamic[local] = true - } - } - } - - if *flagNewobj { - // Record the directives. We'll process them later after Symbols are created. - ctxt.cgodata = append(ctxt.cgodata, cgodata{file, pkg, directives}) - } else { - setCgoAttr(ctxt, ctxt.Syms.Lookup, file, pkg, directives) - } -} - -// Set symbol attributes or flags based on cgo directives. -func setCgoAttr(ctxt *Link, lookup func(string, int) *sym.Symbol, file string, pkg string, directives [][]string) { - for _, f := range directives { - switch f[0] { - case "cgo_import_dynamic": - if len(f) < 2 || len(f) > 4 { - break - } - - local := f[1] - remote := local - if len(f) > 2 { - remote = f[2] - } - lib := "" - if len(f) > 3 { - lib = f[3] - } - - if *FlagD { - fmt.Fprintf(os.Stderr, "%s: %s: cannot use dynamic imports with -d flag\n", os.Args[0], file) - nerrors++ - return - } - - if local == "_" && remote == "_" { - // allow #pragma dynimport _ _ "foo.so" - // to force a link of foo.so. - havedynamic = 1 - - if ctxt.HeadType == objabi.Hdarwin { - machoadddynlib(lib, ctxt.LinkMode) - } else { - dynlib = append(dynlib, lib) - } - continue - } - - local = expandpkg(local, pkg) - q := "" - if i := strings.Index(remote, "#"); i >= 0 { - remote, q = remote[:i], remote[i+1:] - } - s := lookup(local, 0) - if s.Type == 0 || s.Type == sym.SXREF || s.Type == sym.SBSS || s.Type == sym.SNOPTRBSS || s.Type == sym.SHOSTOBJ { - s.SetDynimplib(lib) - s.SetExtname(remote) - s.SetDynimpvers(q) - if s.Type != sym.SHOSTOBJ { - s.Type = sym.SDYNIMPORT - } - havedynamic = 1 - } - - continue - - case "cgo_import_static": - if len(f) != 2 { - break - } - local := f[1] - - s := lookup(local, 0) - s.Type = sym.SHOSTOBJ - s.Size = 0 - continue - - case "cgo_export_static", "cgo_export_dynamic": - if len(f) < 2 || len(f) > 3 { - break - } - local := f[1] - remote := local - if len(f) > 2 { - remote = f[2] - } - local = expandpkg(local, pkg) - - // The compiler arranges for an ABI0 wrapper - // to be available for all cgo-exported - // functions. Link.loadlib will resolve any - // ABI aliases we find here (since we may not - // yet know it's an alias). - s := lookup(local, 0) - - switch ctxt.BuildMode { - case BuildModeCShared, BuildModeCArchive, BuildModePlugin: - if s == lookup("main", 0) { - continue - } - } - - // export overrides import, for openbsd/cgo. - // see issue 4878. - if s.Dynimplib() != "" { - s.ResetDyninfo() - s.SetExtname("") - s.Type = 0 - } - - if !s.Attr.CgoExport() { - s.SetExtname(remote) - } else if s.Extname() != remote { - fmt.Fprintf(os.Stderr, "%s: conflicting cgo_export directives: %s as %s and %s\n", os.Args[0], s.Name, s.Extname(), remote) - nerrors++ - return - } - - if f[0] == "cgo_export_static" { - s.Attr |= sym.AttrCgoExportStatic - } else { - s.Attr |= sym.AttrCgoExportDynamic - } - continue - - case "cgo_dynamic_linker": - if len(f) != 2 { - break - } - - if *flagInterpreter == "" { - if interpreter != "" && interpreter != f[1] { - fmt.Fprintf(os.Stderr, "%s: conflict dynlinker: %s and %s\n", os.Args[0], interpreter, f[1]) - nerrors++ - return - } - - interpreter = f[1] - } - continue - - case "cgo_ldflag": - if len(f) != 2 { - break - } - ldflag = append(ldflag, f[1]) - continue - } - - fmt.Fprintf(os.Stderr, "%s: %s: invalid cgo directive: %q\n", os.Args[0], file, f) - nerrors++ - } -} - -var seenlib = make(map[string]bool) - -func adddynlib(ctxt *Link, lib string) { - if seenlib[lib] || ctxt.LinkMode == LinkExternal { - return - } - seenlib[lib] = true - - if ctxt.IsELF { - s := ctxt.Syms.Lookup(".dynstr", 0) - if s.Size == 0 { - Addstring(s, "") - } - Elfwritedynent(ctxt, ctxt.Syms.Lookup(".dynamic", 0), DT_NEEDED, uint64(Addstring(s, lib))) - } else { - Errorf(nil, "adddynlib: unsupported binary format") - } -} - -func Adddynsym(ctxt *Link, s *sym.Symbol) { - if s.Dynid >= 0 || ctxt.LinkMode == LinkExternal { - return - } - - if ctxt.IsELF { - elfadddynsym(ctxt, s) - } else if ctxt.HeadType == objabi.Hdarwin { - Errorf(s, "adddynsym: missed symbol (Extname=%s)", s.Extname()) - } else if ctxt.HeadType == objabi.Hwindows { - // already taken care of - } else { - Errorf(s, "adddynsym: unsupported binary format") - } -} - -func fieldtrack(ctxt *Link) { - // record field tracking references - var buf bytes.Buffer - for _, s := range ctxt.Syms.Allsym { - if strings.HasPrefix(s.Name, "go.track.") { - s.Attr |= sym.AttrSpecial // do not lay out in data segment - s.Attr |= sym.AttrNotInSymbolTable - if s.Attr.Reachable() { - buf.WriteString(s.Name[9:]) - for p := ctxt.Reachparent[s]; p != nil; p = ctxt.Reachparent[p] { - buf.WriteString("\t") - buf.WriteString(p.Name) - } - buf.WriteString("\n") - } - - s.Type = sym.SCONST - s.Value = 0 - } - } - - if *flagFieldTrack == "" { - return - } - s := ctxt.Syms.ROLookup(*flagFieldTrack, 0) - if s == nil || !s.Attr.Reachable() { - return - } - s.Type = sym.SDATA - addstrdata(ctxt, *flagFieldTrack, buf.String()) -} - -func (ctxt *Link) addexport() { - // Track undefined external symbols during external link. - if ctxt.LinkMode == LinkExternal { - for _, s := range ctxt.Syms.Allsym { - if !s.Attr.Reachable() || s.Attr.Special() || s.Attr.SubSymbol() { - continue - } - if s.Type != sym.STEXT { - continue - } - for i := range s.R { - r := &s.R[i] - if r.Sym != nil && r.Sym.Type == sym.Sxxx { - r.Sym.Type = sym.SUNDEFEXT - } - } - } - } - - // TODO(aix) - if ctxt.HeadType == objabi.Hdarwin || ctxt.HeadType == objabi.Haix { - return - } - - for _, exp := range dynexp { - Adddynsym(ctxt, exp) - } - for _, lib := range dynlib { - 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/oldlink/internal/ld/ld.go b/src/cmd/oldlink/internal/ld/ld.go deleted file mode 100644 index 7420dce9de..0000000000 --- a/src/cmd/oldlink/internal/ld/ld.go +++ /dev/null @@ -1,217 +0,0 @@ -// Derived from Inferno utils/6l/obj.c and utils/6l/span.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/span.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ld - -import ( - "cmd/oldlink/internal/sym" - "io/ioutil" - "log" - "os" - "path" - "path/filepath" - "strconv" - "strings" -) - -func (ctxt *Link) readImportCfg(file string) { - ctxt.PackageFile = make(map[string]string) - ctxt.PackageShlib = make(map[string]string) - data, err := ioutil.ReadFile(file) - if err != nil { - log.Fatalf("-importcfg: %v", err) - } - - for lineNum, line := range strings.Split(string(data), "\n") { - lineNum++ // 1-based - line = strings.TrimSpace(line) - if line == "" { - continue - } - if line == "" || strings.HasPrefix(line, "#") { - continue - } - - var verb, args string - if i := strings.Index(line, " "); i < 0 { - verb = line - } else { - verb, args = line[:i], strings.TrimSpace(line[i+1:]) - } - var before, after string - if i := strings.Index(args, "="); i >= 0 { - before, after = args[:i], args[i+1:] - } - switch verb { - default: - log.Fatalf("%s:%d: unknown directive %q", file, lineNum, verb) - case "packagefile": - if before == "" || after == "" { - log.Fatalf(`%s:%d: invalid packagefile: syntax is "packagefile path=filename"`, file, lineNum) - } - ctxt.PackageFile[before] = after - case "packageshlib": - if before == "" || after == "" { - log.Fatalf(`%s:%d: invalid packageshlib: syntax is "packageshlib path=filename"`, file, lineNum) - } - ctxt.PackageShlib[before] = after - } - } -} - -func pkgname(ctxt *Link, lib string) string { - name := path.Clean(lib) - - // When using importcfg, we have the final package name. - if ctxt.PackageFile != nil { - return name - } - - // runtime.a -> runtime, runtime.6 -> runtime - pkg := name - if len(pkg) >= 2 && pkg[len(pkg)-2] == '.' { - pkg = pkg[:len(pkg)-2] - } - return pkg -} - -func findlib(ctxt *Link, lib string) (string, bool) { - name := path.Clean(lib) - - var pname string - isshlib := false - - if ctxt.linkShared && ctxt.PackageShlib[name] != "" { - pname = ctxt.PackageShlib[name] - isshlib = true - } else if ctxt.PackageFile != nil { - pname = ctxt.PackageFile[name] - if pname == "" { - ctxt.Logf("cannot find package %s (using -importcfg)\n", name) - return "", false - } - } else { - if filepath.IsAbs(name) { - pname = name - } else { - pkg := pkgname(ctxt, lib) - // Add .a if needed; the new -importcfg modes - // do not put .a into the package name anymore. - // This only matters when people try to mix - // compiles using -importcfg with links not using -importcfg, - // such as when running quick things like - // 'go tool compile x.go && go tool link x.o' - // by hand against a standard library built using -importcfg. - if !strings.HasSuffix(name, ".a") && !strings.HasSuffix(name, ".o") { - name += ".a" - } - // try dot, -L "libdir", and then goroot. - for _, dir := range ctxt.Libdir { - if ctxt.linkShared { - pname = filepath.Join(dir, pkg+".shlibname") - if _, err := os.Stat(pname); err == nil { - isshlib = true - break - } - } - pname = filepath.Join(dir, name) - if _, err := os.Stat(pname); err == nil { - break - } - } - } - pname = filepath.Clean(pname) - } - - return pname, isshlib -} - -func addlib(ctxt *Link, src string, obj string, lib string) *sym.Library { - pkg := pkgname(ctxt, lib) - - // already loaded? - if l := ctxt.LibraryByPkg[pkg]; l != nil { - return l - } - - pname, isshlib := findlib(ctxt, lib) - - if ctxt.Debugvlog > 1 { - ctxt.Logf("addlib: %s %s pulls in %s isshlib %v\n", obj, src, pname, isshlib) - } - - if isshlib { - return addlibpath(ctxt, src, obj, "", pkg, pname) - } - return addlibpath(ctxt, src, obj, pname, pkg, "") -} - -/* - * add library to library list, return added library. - * srcref: src file referring to package - * objref: object file referring to package - * file: object file, e.g., /home/rsc/go/pkg/container/vector.a - * pkg: package import path, e.g. container/vector - * shlib: path to shared library, or .shlibname file holding path - */ -func addlibpath(ctxt *Link, srcref string, objref string, file string, pkg string, shlib string) *sym.Library { - if l := ctxt.LibraryByPkg[pkg]; l != nil { - return l - } - - if ctxt.Debugvlog > 1 { - ctxt.Logf("addlibpath: srcref: %s objref: %s file: %s pkg: %s shlib: %s\n", srcref, objref, file, pkg, shlib) - } - - l := &sym.Library{} - ctxt.LibraryByPkg[pkg] = l - ctxt.Library = append(ctxt.Library, l) - l.Objref = objref - l.Srcref = srcref - l.File = file - l.Pkg = pkg - if shlib != "" { - if strings.HasSuffix(shlib, ".shlibname") { - data, err := ioutil.ReadFile(shlib) - if err != nil { - Errorf(nil, "cannot read %s: %v", shlib, err) - } - shlib = strings.TrimSpace(string(data)) - } - l.Shlib = shlib - } - return l -} - -func atolwhex(s string) int64 { - n, _ := strconv.ParseInt(s, 0, 64) - return n -} diff --git a/src/cmd/oldlink/internal/ld/lib.go b/src/cmd/oldlink/internal/ld/lib.go deleted file mode 100644 index 0fc786f1bf..0000000000 --- a/src/cmd/oldlink/internal/ld/lib.go +++ /dev/null @@ -1,2749 +0,0 @@ -// Inferno utils/8l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/8l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ld - -import ( - "bufio" - "bytes" - "cmd/internal/bio" - "cmd/internal/obj" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/loadelf" - "cmd/oldlink/internal/loader" - "cmd/oldlink/internal/loadmacho" - "cmd/oldlink/internal/loadpe" - "cmd/oldlink/internal/loadxcoff" - "cmd/oldlink/internal/objfile" - "cmd/oldlink/internal/sym" - "crypto/sha1" - "debug/elf" - "debug/macho" - "encoding/base64" - "encoding/binary" - "encoding/hex" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" - "runtime" - "sort" - "strings" - "sync" -) - -// Data layout and relocation. - -// Derived from Inferno utils/6l/l.h -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -type Arch struct { - Funcalign int - Maxalign int - Minalign int - Dwarfregsp int - Dwarfreglr int - Androiddynld string - Linuxdynld string - Freebsddynld string - Netbsddynld string - Openbsddynld string - Dragonflydynld string - Solarisdynld string - Adddynrel func(*Link, *sym.Symbol, *sym.Reloc) bool - Archinit func(*Link) - // Archreloc is an arch-specific hook that assists in - // relocation processing (invoked by 'relocsym'); it handles - // target-specific relocation tasks. Here "rel" is the current - // relocation being examined, "sym" is the symbol containing the - // chunk of data to which the relocation applies, and "off" 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) and a boolean indicating - // success/failure (a failing value indicates a fatal error). - Archreloc func(link *Link, rel *sym.Reloc, sym *sym.Symbol, - offset int64) (relocatedOffset int64, success bool) - // Archrelocvariant is a second arch-specific hook used for - // relocation processing; it handles relocations where r.Type is - // insufficient to describe the relocation (r.Variant != - // sym.RV_NONE). Here "rel" is the relocation being applied, "sym" - // is the symbol containing the chunk of data to which the - // relocation applies, and "off" is the contents of the - // to-be-relocated data item (from sym.P). Return is an updated - // offset value. - Archrelocvariant func(link *Link, rel *sym.Reloc, sym *sym.Symbol, - offset int64) (relocatedOffset int64) - Trampoline func(*Link, *sym.Reloc, *sym.Symbol) - - // Asmb and Asmb2 are arch-specific routines that write the output - // file. Typically, Asmb writes most of the content (sections and - // segments), for which we have computed the size and offset. Asmb2 - // writes the rest. - Asmb func(*Link) - Asmb2 func(*Link) - - Elfreloc1 func(*Link, *sym.Reloc, int64) bool - Elfsetupplt func(*Link) - Gentext func(*Link) - Machoreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool - PEreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool - Xcoffreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool - - // TLSIEtoLE converts a TLS Initial Executable relocation to - // a TLS Local Executable relocation. - // - // This is possible when a TLS IE relocation refers to a local - // symbol in an executable, which is typical when internally - // linking PIE binaries. - TLSIEtoLE func(s *sym.Symbol, off, size int) - - // optional override for assignAddress - AssignAddress func(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint64, isTramp bool) (*sym.Section, int, uint64) -} - -var ( - thearch Arch - Lcsize int32 - rpath Rpath - Spsize int32 - Symsize int32 -) - -const ( - MINFUNC = 16 // minimum size for a function -) - -// DynlinkingGo reports whether we are producing Go code that can live -// in separate shared libraries linked together at runtime. -func (ctxt *Link) DynlinkingGo() bool { - if !ctxt.Loaded { - panic("DynlinkingGo called before all symbols loaded") - } - return ctxt.BuildMode == BuildModeShared || ctxt.linkShared || ctxt.BuildMode == BuildModePlugin || ctxt.canUsePlugins -} - -// CanUsePlugins reports whether a plugins can be used -func (ctxt *Link) CanUsePlugins() bool { - if !ctxt.Loaded { - panic("CanUsePlugins called before all symbols loaded") - } - return ctxt.canUsePlugins -} - -// UseRelro reports whether to make use of "read only relocations" aka -// relro. -func (ctxt *Link) UseRelro() bool { - switch ctxt.BuildMode { - case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePIE, BuildModePlugin: - return ctxt.IsELF || ctxt.HeadType == objabi.Haix - default: - return ctxt.linkShared || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) - } -} - -var ( - dynexp []*sym.Symbol - dynlib []string - ldflag []string - havedynamic int - Funcalign int - iscgo bool - elfglobalsymndx int - interpreter string - - debug_s bool // backup old value of debug['s'] - HEADR int32 - - nerrors int - liveness int64 - - // See -strictdups command line flag. - checkStrictDups int // 0=off 1=warning 2=error - strictDupMsgCount int -) - -var ( - Segtext sym.Segment - Segrodata sym.Segment - Segrelrodata sym.Segment - Segdata sym.Segment - Segdwarf sym.Segment -) - -const pkgdef = "__.PKGDEF" - -var ( - // Set if we see an object compiled by the host compiler that is not - // from a package that is known to support internal linking mode. - externalobj = false - theline string -) - -func Lflag(ctxt *Link, arg string) { - ctxt.Libdir = append(ctxt.Libdir, arg) -} - -/* - * Unix doesn't like it when we write to a running (or, sometimes, - * recently run) binary, so remove the output file before writing it. - * On Windows 7, remove() can force a subsequent create() to fail. - * S_ISREG() does not exist on Plan 9. - */ -func mayberemoveoutfile() { - if fi, err := os.Lstat(*flagOutfile); err == nil && !fi.Mode().IsRegular() { - return - } - os.Remove(*flagOutfile) -} - -func libinit(ctxt *Link) { - Funcalign = thearch.Funcalign - - // add goroot to the end of the libdir list. - suffix := "" - - suffixsep := "" - if *flagInstallSuffix != "" { - suffixsep = "_" - suffix = *flagInstallSuffix - } else if *flagRace { - suffixsep = "_" - suffix = "race" - } else if *flagMsan { - suffixsep = "_" - suffix = "msan" - } - - Lflag(ctxt, filepath.Join(objabi.GOROOT, "pkg", fmt.Sprintf("%s_%s%s%s", objabi.GOOS, objabi.GOARCH, suffixsep, suffix))) - - mayberemoveoutfile() - f, err := os.OpenFile(*flagOutfile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) - if err != nil { - Exitf("cannot create %s: %v", *flagOutfile, err) - } - - ctxt.Out.w = bufio.NewWriter(f) - ctxt.Out.f = f - - if *flagEntrySymbol == "" { - switch ctxt.BuildMode { - case BuildModeCShared, BuildModeCArchive: - *flagEntrySymbol = fmt.Sprintf("_rt0_%s_%s_lib", objabi.GOARCH, objabi.GOOS) - case BuildModeExe, BuildModePIE: - *flagEntrySymbol = fmt.Sprintf("_rt0_%s_%s", objabi.GOARCH, objabi.GOOS) - case BuildModeShared, BuildModePlugin: - // No *flagEntrySymbol for -buildmode=shared and plugin - default: - Errorf(nil, "unknown *flagEntrySymbol for buildmode %v", ctxt.BuildMode) - } - } -} - -func exitIfErrors() { - if nerrors != 0 || checkStrictDups > 1 && strictDupMsgCount > 0 { - mayberemoveoutfile() - Exit(2) - } - -} - -func errorexit() { - exitIfErrors() - Exit(0) -} - -func loadinternal(ctxt *Link, name string) *sym.Library { - if ctxt.linkShared && ctxt.PackageShlib != nil { - if shlib := ctxt.PackageShlib[name]; shlib != "" { - return addlibpath(ctxt, "internal", "internal", "", name, shlib) - } - } - if ctxt.PackageFile != nil { - if pname := ctxt.PackageFile[name]; pname != "" { - return addlibpath(ctxt, "internal", "internal", pname, name, "") - } - ctxt.Logf("loadinternal: cannot find %s\n", name) - return nil - } - - for _, libdir := range ctxt.Libdir { - if ctxt.linkShared { - shlibname := filepath.Join(libdir, name+".shlibname") - if ctxt.Debugvlog != 0 { - ctxt.Logf("searching for %s.a in %s\n", name, shlibname) - } - if _, err := os.Stat(shlibname); err == nil { - return addlibpath(ctxt, "internal", "internal", "", name, shlibname) - } - } - pname := filepath.Join(libdir, name+".a") - if ctxt.Debugvlog != 0 { - ctxt.Logf("searching for %s.a in %s\n", name, pname) - } - if _, err := os.Stat(pname); err == nil { - return addlibpath(ctxt, "internal", "internal", pname, name, "") - } - } - - ctxt.Logf("warning: unable to find %s.a\n", name) - return nil -} - -// extld returns the current external linker. -func (ctxt *Link) extld() string { - if *flagExtld == "" { - *flagExtld = "gcc" - } - return *flagExtld -} - -// findLibPathCmd uses cmd command to find gcc library libname. -// It returns library full path if found, or "none" if not found. -func (ctxt *Link) findLibPathCmd(cmd, libname string) string { - extld := ctxt.extld() - args := hostlinkArchArgs(ctxt.Arch) - args = append(args, cmd) - if ctxt.Debugvlog != 0 { - ctxt.Logf("%s %v\n", extld, args) - } - out, err := exec.Command(extld, args...).Output() - if err != nil { - if ctxt.Debugvlog != 0 { - ctxt.Logf("not using a %s file because compiler failed\n%v\n%s\n", libname, err, out) - } - return "none" - } - return strings.TrimSpace(string(out)) -} - -// findLibPath searches for library libname. -// It returns library full path if found, or "none" if not found. -func (ctxt *Link) findLibPath(libname string) string { - return ctxt.findLibPathCmd("--print-file-name="+libname, libname) -} - -func (ctxt *Link) loadlib() { - if *flagNewobj { - var flags uint32 - switch *FlagStrictDups { - case 0: - // nothing to do - case 1, 2: - flags = loader.FlagStrictDups - default: - log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups) - } - ctxt.loader = loader.NewLoader(flags) - } - - ctxt.cgo_export_static = make(map[string]bool) - ctxt.cgo_export_dynamic = make(map[string]bool) - - // ctxt.Library grows during the loop, so not a range loop. - i := 0 - for ; i < len(ctxt.Library); i++ { - lib := ctxt.Library[i] - if lib.Shlib == "" { - if ctxt.Debugvlog > 1 { - ctxt.Logf("autolib: %s (from %s)\n", lib.File, lib.Objref) - } - loadobjfile(ctxt, lib) - } - } - - // load internal packages, if not already - if *flagRace { - loadinternal(ctxt, "runtime/race") - } - if *flagMsan { - loadinternal(ctxt, "runtime/msan") - } - loadinternal(ctxt, "runtime") - for ; i < len(ctxt.Library); i++ { - lib := ctxt.Library[i] - if lib.Shlib == "" { - loadobjfile(ctxt, lib) - } - } - - if *flagNewobj { - iscgo = ctxt.loader.Lookup("x_cgo_init", 0) != 0 - ctxt.canUsePlugins = ctxt.loader.Lookup("plugin.Open", sym.SymVerABIInternal) != 0 - } else { - iscgo = ctxt.Syms.ROLookup("x_cgo_init", 0) != nil - ctxt.canUsePlugins = ctxt.Syms.ROLookup("plugin.Open", sym.SymVerABIInternal) != nil - } - - // We now have enough information to determine the link mode. - determineLinkMode(ctxt) - - if ctxt.LinkMode == LinkExternal && !iscgo && ctxt.LibraryByPkg["runtime/cgo"] == nil && !(objabi.GOOS == "darwin" && ctxt.BuildMode != BuildModePlugin && ctxt.Arch.Family == sys.AMD64) { - // This indicates a user requested -linkmode=external. - // The startup code uses an import of runtime/cgo to decide - // whether to initialize the TLS. So give it one. This could - // be handled differently but it's an unusual case. - if lib := loadinternal(ctxt, "runtime/cgo"); lib != nil { - if lib.Shlib != "" { - ldshlibsyms(ctxt, lib.Shlib) - } else { - if ctxt.BuildMode == BuildModeShared || ctxt.linkShared { - Exitf("cannot implicitly include runtime/cgo in a shared library") - } - loadobjfile(ctxt, lib) - } - } - } - - for _, lib := range ctxt.Library { - if lib.Shlib != "" { - if ctxt.Debugvlog > 1 { - ctxt.Logf("autolib: %s (from %s)\n", lib.Shlib, lib.Objref) - } - ldshlibsyms(ctxt, lib.Shlib) - } - } - - if ctxt.LinkMode == LinkInternal && len(hostobj) != 0 { - if *flagNewobj { - // In newobj mode, we typically create sym.Symbols later therefore - // also set cgo attributes later. However, for internal cgo linking, - // the host object loaders still work with sym.Symbols (for now), - // and they need cgo attributes set to work properly. So process - // them now. - lookup := func(name string, ver int) *sym.Symbol { return ctxt.loader.LookupOrCreate(name, ver, ctxt.Syms) } - for _, d := range ctxt.cgodata { - setCgoAttr(ctxt, lookup, d.file, d.pkg, d.directives) - } - ctxt.cgodata = nil - } - - // Drop all the cgo_import_static declarations. - // Turns out we won't be needing them. - for _, s := range ctxt.Syms.Allsym { - if s.Type == sym.SHOSTOBJ { - // If a symbol was marked both - // cgo_import_static and cgo_import_dynamic, - // then we want to make it cgo_import_dynamic - // now. - if s.Extname() != "" && s.Dynimplib() != "" && !s.Attr.CgoExport() { - s.Type = sym.SDYNIMPORT - } else { - s.Type = 0 - } - } - } - } - - // Conditionally load host objects, or setup for external linking. - hostobjs(ctxt) - hostlinksetup(ctxt) - - if *flagNewobj { - // Add references of externally defined symbols. - ctxt.loader.LoadRefs(ctxt.Arch, ctxt.Syms) - } - - // Now that we know the link mode, set the dynexp list. - if !*flagNewobj { // set this later in newobj mode - setupdynexp(ctxt) - } - - if ctxt.LinkMode == LinkInternal && len(hostobj) != 0 { - // If we have any undefined symbols in external - // objects, try to read them from the libgcc file. - any := false - for _, s := range ctxt.Syms.Allsym { - for i := range s.R { - r := &s.R[i] // Copying sym.Reloc has measurable impact on performance - if r.Sym != nil && r.Sym.Type == sym.SXREF && r.Sym.Name != ".got" { - any = true - break - } - } - } - if any { - if *flagLibGCC == "" { - *flagLibGCC = ctxt.findLibPathCmd("--print-libgcc-file-name", "libgcc") - } - if runtime.GOOS == "openbsd" && *flagLibGCC == "libgcc.a" { - // On OpenBSD `clang --print-libgcc-file-name` returns "libgcc.a". - // In this case we fail to load libgcc.a and can encounter link - // errors - see if we can find libcompiler_rt.a instead. - *flagLibGCC = ctxt.findLibPathCmd("--print-file-name=libcompiler_rt.a", "libcompiler_rt") - } - if *flagLibGCC != "none" { - hostArchive(ctxt, *flagLibGCC) - } - if ctxt.HeadType == objabi.Hwindows { - if p := ctxt.findLibPath("libmingwex.a"); p != "none" { - hostArchive(ctxt, p) - } - if p := ctxt.findLibPath("libmingw32.a"); p != "none" { - hostArchive(ctxt, p) - } - // Link libmsvcrt.a to resolve '__acrt_iob_func' symbol - // (see https://golang.org/issue/23649 for details). - if p := ctxt.findLibPath("libmsvcrt.a"); p != "none" { - hostArchive(ctxt, p) - } - // TODO: maybe do something similar to peimporteddlls to collect all lib names - // and try link them all to final exe just like libmingwex.a and libmingw32.a: - /* - for: - #cgo windows LDFLAGS: -lmsvcrt -lm - import: - libmsvcrt.a libm.a - */ - } - } - } - - // We've loaded all the code now. - ctxt.Loaded = true - - importcycles() - - if *flagNewobj { - strictDupMsgCount = ctxt.loader.NStrictDupMsgs() - } -} - -// Set up dynexp list. -func setupdynexp(ctxt *Link) { - dynexpMap := ctxt.cgo_export_dynamic - if ctxt.LinkMode == LinkExternal { - dynexpMap = ctxt.cgo_export_static - } - dynexp = make([]*sym.Symbol, 0, len(dynexpMap)) - for exp := range dynexpMap { - s := ctxt.Syms.Lookup(exp, 0) - dynexp = append(dynexp, s) - } - sort.Sort(byName(dynexp)) - - // Resolve ABI aliases in the list of cgo-exported functions. - // This is necessary because we load the ABI0 symbol for all - // cgo exports. - for i, s := range dynexp { - if s.Type != sym.SABIALIAS { - continue - } - t := resolveABIAlias(s) - t.Attr |= s.Attr - t.SetExtname(s.Extname()) - dynexp[i] = t - } - - ctxt.cgo_export_static = nil - ctxt.cgo_export_dynamic = nil -} - -// Set up flags and special symbols depending on the platform build mode. -func (ctxt *Link) linksetup() { - switch ctxt.BuildMode { - case BuildModeCShared, BuildModePlugin: - s := ctxt.Syms.Lookup("runtime.islibrary", 0) - s.Type = sym.SNOPTRDATA - s.Attr |= sym.AttrDuplicateOK - s.AddUint8(1) - case BuildModeCArchive: - s := ctxt.Syms.Lookup("runtime.isarchive", 0) - s.Type = sym.SNOPTRDATA - s.Attr |= sym.AttrDuplicateOK - s.AddUint8(1) - } - - // Recalculate pe parameters now that we have ctxt.LinkMode set. - if ctxt.HeadType == objabi.Hwindows { - Peinit(ctxt) - } - - if ctxt.HeadType == objabi.Hdarwin && ctxt.LinkMode == LinkExternal { - *FlagTextAddr = 0 - } - - // If there are no dynamic libraries needed, gcc disables dynamic linking. - // Because of this, glibc's dynamic ELF loader occasionally (like in version 2.13) - // assumes that a dynamic binary always refers to at least one dynamic library. - // Rather than be a source of test cases for glibc, disable dynamic linking - // the same way that gcc would. - // - // Exception: on OS X, programs such as Shark only work with dynamic - // binaries, so leave it enabled on OS X (Mach-O) binaries. - // Also leave it enabled on Solaris which doesn't support - // statically linked binaries. - if ctxt.BuildMode == BuildModeExe { - if havedynamic == 0 && ctxt.HeadType != objabi.Hdarwin && ctxt.HeadType != objabi.Hsolaris { - *FlagD = true - } - } - - if ctxt.LinkMode == LinkExternal && ctxt.Arch.Family == sys.PPC64 && objabi.GOOS != "aix" { - toc := ctxt.Syms.Lookup(".TOC.", 0) - toc.Type = sym.SDYNIMPORT - } - - // The Android Q linker started to complain about underalignment of the our TLS - // section. We don't actually use the section on android, so dont't - // generate it. - if objabi.GOOS != "android" { - tlsg := ctxt.Syms.Lookup("runtime.tlsg", 0) - - // runtime.tlsg is used for external linking on platforms that do not define - // a variable to hold g in assembly (currently only intel). - if tlsg.Type == 0 { - tlsg.Type = sym.STLSBSS - tlsg.Size = int64(ctxt.Arch.PtrSize) - } else if tlsg.Type != sym.SDYNIMPORT { - Errorf(nil, "runtime declared tlsg variable %v", tlsg.Type) - } - tlsg.Attr |= sym.AttrReachable - ctxt.Tlsg = tlsg - } - - var moduledata *sym.Symbol - if ctxt.BuildMode == BuildModePlugin { - moduledata = ctxt.Syms.Lookup("local.pluginmoduledata", 0) - moduledata.Attr |= sym.AttrLocal - } else { - moduledata = ctxt.Syms.Lookup("runtime.firstmoduledata", 0) - } - if moduledata.Type != 0 && moduledata.Type != sym.SDYNIMPORT { - // If the module (toolchain-speak for "executable or shared - // library") we are linking contains the runtime package, it - // will define the runtime.firstmoduledata symbol and we - // truncate it back to 0 bytes so we can define its entire - // contents in symtab.go:symtab(). - moduledata.Size = 0 - - // In addition, on ARM, the runtime depends on the linker - // recording the value of GOARM. - if ctxt.Arch.Family == sys.ARM { - s := ctxt.Syms.Lookup("runtime.goarm", 0) - s.Type = sym.SDATA - s.Size = 0 - s.AddUint8(uint8(objabi.GOARM)) - } - - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) { - s := ctxt.Syms.Lookup("runtime.framepointer_enabled", 0) - s.Type = sym.SDATA - s.Size = 0 - s.AddUint8(1) - } - } else { - // If OTOH the module does not contain the runtime package, - // create a local symbol for the moduledata. - moduledata = ctxt.Syms.Lookup("local.moduledata", 0) - moduledata.Attr |= sym.AttrLocal - } - // In all cases way we mark the moduledata as noptrdata to hide it from - // the GC. - moduledata.Type = sym.SNOPTRDATA - moduledata.Attr |= sym.AttrReachable - ctxt.Moduledata = moduledata - - // If package versioning is required, generate a hash of the - // packages used in the link. - if ctxt.BuildMode == BuildModeShared || ctxt.BuildMode == BuildModePlugin || ctxt.CanUsePlugins() { - for _, lib := range ctxt.Library { - if lib.Shlib == "" { - genhash(ctxt, lib) - } - } - } - - if ctxt.Arch == sys.Arch386 && ctxt.HeadType != objabi.Hwindows { - if (ctxt.BuildMode == BuildModeCArchive && ctxt.IsELF) || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE || ctxt.DynlinkingGo() { - got := ctxt.Syms.Lookup("_GLOBAL_OFFSET_TABLE_", 0) - got.Type = sym.SDYNIMPORT - got.Attr |= sym.AttrReachable - } - } -} - -// mangleTypeSym shortens the names of symbols that represent Go types -// if they are visible in the symbol table. -// -// As the names of these symbols are derived from the string of -// the type, they can run to many kilobytes long. So we shorten -// them using a SHA-1 when the name appears in the final binary. -// This also removes characters that upset external linkers. -// -// These are the symbols that begin with the prefix 'type.' and -// contain run-time type information used by the runtime and reflect -// packages. All Go binaries contain these symbols, but only -// those programs loaded dynamically in multiple parts need these -// symbols to have entries in the symbol table. -func (ctxt *Link) mangleTypeSym() { - if ctxt.BuildMode != BuildModeShared && !ctxt.linkShared && ctxt.BuildMode != BuildModePlugin && !ctxt.CanUsePlugins() { - return - } - - for _, s := range ctxt.Syms.Allsym { - newName := typeSymbolMangle(s.Name) - if newName != s.Name { - ctxt.Syms.Rename(s.Name, newName, int(s.Version), ctxt.Reachparent) - } - } -} - -// typeSymbolMangle mangles the given symbol name into something shorter. -// -// Keep the type.. prefix, which parts of the linker (like the -// DWARF generator) know means the symbol is not decodable. -// Leave type.runtime. symbols alone, because other parts of -// the linker manipulates them. -func typeSymbolMangle(name string) string { - if !strings.HasPrefix(name, "type.") { - return name - } - if strings.HasPrefix(name, "type.runtime.") { - return name - } - if len(name) <= 14 && !strings.Contains(name, "@") { // Issue 19529 - return name - } - hash := sha1.Sum([]byte(name)) - prefix := "type." - if name[5] == '.' { - prefix = "type.." - } - return prefix + base64.StdEncoding.EncodeToString(hash[:6]) -} - -/* - * look for the next file in an archive. - * adapted from libmach. - */ -func nextar(bp *bio.Reader, off int64, a *ArHdr) int64 { - if off&1 != 0 { - off++ - } - bp.MustSeek(off, 0) - var buf [SAR_HDR]byte - if n, err := io.ReadFull(bp, buf[:]); err != nil { - if n == 0 && err != io.EOF { - return -1 - } - return 0 - } - - a.name = artrim(buf[0:16]) - a.date = artrim(buf[16:28]) - a.uid = artrim(buf[28:34]) - a.gid = artrim(buf[34:40]) - a.mode = artrim(buf[40:48]) - a.size = artrim(buf[48:58]) - a.fmag = artrim(buf[58:60]) - - arsize := atolwhex(a.size) - if arsize&1 != 0 { - arsize++ - } - return arsize + SAR_HDR -} - -func genhash(ctxt *Link, lib *sym.Library) { - f, err := bio.Open(lib.File) - if err != nil { - Errorf(nil, "cannot open file %s for hash generation: %v", lib.File, err) - return - } - defer f.Close() - - var magbuf [len(ARMAG)]byte - if _, err := io.ReadFull(f, magbuf[:]); err != nil { - Exitf("file %s too short", lib.File) - } - - if string(magbuf[:]) != ARMAG { - Exitf("%s is not an archive file", lib.File) - } - - var arhdr ArHdr - l := nextar(f, f.Offset(), &arhdr) - if l <= 0 { - Errorf(nil, "%s: short read on archive file symbol header", lib.File) - return - } - if arhdr.name != pkgdef { - Errorf(nil, "%s: missing package data entry", lib.File) - return - } - - h := sha1.New() - - // To compute the hash of a package, we hash the first line of - // __.PKGDEF (which contains the toolchain version and any - // GOEXPERIMENT flags) and the export data (which is between - // the first two occurrences of "\n$$"). - - pkgDefBytes := make([]byte, atolwhex(arhdr.size)) - _, err = io.ReadFull(f, pkgDefBytes) - if err != nil { - Errorf(nil, "%s: error reading package data: %v", lib.File, err) - return - } - firstEOL := bytes.IndexByte(pkgDefBytes, '\n') - if firstEOL < 0 { - Errorf(nil, "cannot parse package data of %s for hash generation, no newline found", lib.File) - return - } - firstDoubleDollar := bytes.Index(pkgDefBytes, []byte("\n$$")) - if firstDoubleDollar < 0 { - Errorf(nil, "cannot parse package data of %s for hash generation, no \\n$$ found", lib.File) - return - } - secondDoubleDollar := bytes.Index(pkgDefBytes[firstDoubleDollar+1:], []byte("\n$$")) - if secondDoubleDollar < 0 { - Errorf(nil, "cannot parse package data of %s for hash generation, only one \\n$$ found", lib.File) - return - } - h.Write(pkgDefBytes[0:firstEOL]) - h.Write(pkgDefBytes[firstDoubleDollar : firstDoubleDollar+secondDoubleDollar]) - lib.Hash = hex.EncodeToString(h.Sum(nil)) -} - -func loadobjfile(ctxt *Link, lib *sym.Library) { - pkg := objabi.PathToPrefix(lib.Pkg) - - if ctxt.Debugvlog > 1 { - ctxt.Logf("ldobj: %s (%s)\n", lib.File, pkg) - } - f, err := bio.Open(lib.File) - if err != nil { - Exitf("cannot open file %s: %v", lib.File, err) - } - defer f.Close() - defer func() { - if pkg == "main" && !lib.Main { - Exitf("%s: not package main", lib.File) - } - - // Ideally, we'd check that *all* object files within - // the archive were marked safe, but here we settle - // for *any*. - // - // Historically, cmd/link only checked the __.PKGDEF - // file, which in turn came from the first object - // file, typically produced by cmd/compile. The - // remaining object files are normally produced by - // cmd/asm, which doesn't support marking files as - // safe anyway. So at least in practice, this matches - // how safe mode has always worked. - if *flagU && !lib.Safe { - Exitf("%s: load of unsafe package %s", lib.File, pkg) - } - }() - - for i := 0; i < len(ARMAG); i++ { - if c, err := f.ReadByte(); err == nil && c == ARMAG[i] { - continue - } - - /* load it as a regular file */ - l := f.MustSeek(0, 2) - f.MustSeek(0, 0) - ldobj(ctxt, f, lib, l, lib.File, lib.File) - return - } - - /* - * load all the object files from the archive now. - * this gives us sequential file access and keeps us - * from needing to come back later to pick up more - * objects. it breaks the usual C archive model, but - * this is Go, not C. the common case in Go is that - * we need to load all the objects, and then we throw away - * the individual symbols that are unused. - * - * loading every object will also make it possible to - * load foreign objects not referenced by __.PKGDEF. - */ - var arhdr ArHdr - off := f.Offset() - for { - l := nextar(f, off, &arhdr) - if l == 0 { - break - } - if l < 0 { - Exitf("%s: malformed archive", lib.File) - } - off += l - - // __.PKGDEF isn't a real Go object file, and it's - // absent in -linkobj builds anyway. Skipping it - // ensures consistency between -linkobj and normal - // build modes. - if arhdr.name == pkgdef { - continue - } - - // Skip other special (non-object-file) sections that - // build tools may have added. Such sections must have - // short names so that the suffix is not truncated. - if len(arhdr.name) < 16 { - if ext := filepath.Ext(arhdr.name); ext != ".o" && ext != ".syso" { - continue - } - } - - pname := fmt.Sprintf("%s(%s)", lib.File, arhdr.name) - l = atolwhex(arhdr.size) - ldobj(ctxt, f, lib, l, pname, lib.File) - } -} - -type Hostobj struct { - ld func(*Link, *bio.Reader, string, int64, string) - pkg string - pn string - file string - off int64 - length int64 -} - -var hostobj []Hostobj - -// These packages can use internal linking mode. -// Others trigger external mode. -var internalpkg = []string{ - "crypto/x509", - "net", - "os/user", - "runtime/cgo", - "runtime/race", - "runtime/msan", -} - -func ldhostobj(ld func(*Link, *bio.Reader, string, int64, string), headType objabi.HeadType, f *bio.Reader, pkg string, length int64, pn string, file string) *Hostobj { - isinternal := false - for _, intpkg := range internalpkg { - if pkg == intpkg { - isinternal = true - break - } - } - - // DragonFly declares errno with __thread, which results in a symbol - // type of R_386_TLS_GD or R_X86_64_TLSGD. The Go linker does not - // currently know how to handle TLS relocations, hence we have to - // force external linking for any libraries that link in code that - // uses errno. This can be removed if the Go linker ever supports - // these relocation types. - if headType == objabi.Hdragonfly { - if pkg == "net" || pkg == "os/user" { - isinternal = false - } - } - - if !isinternal { - externalobj = true - } - - hostobj = append(hostobj, Hostobj{}) - h := &hostobj[len(hostobj)-1] - h.ld = ld - h.pkg = pkg - h.pn = pn - h.file = file - h.off = f.Offset() - h.length = length - return h -} - -func hostobjs(ctxt *Link) { - if ctxt.LinkMode != LinkInternal { - return - } - var h *Hostobj - - for i := 0; i < len(hostobj); i++ { - h = &hostobj[i] - f, err := bio.Open(h.file) - if err != nil { - Exitf("cannot reopen %s: %v", h.pn, err) - } - - f.MustSeek(h.off, 0) - h.ld(ctxt, f, h.pkg, h.length, h.pn) - f.Close() - } -} - -func hostlinksetup(ctxt *Link) { - if ctxt.LinkMode != LinkExternal { - return - } - - // For external link, record that we need to tell the external linker -s, - // and turn off -s internally: the external linker needs the symbol - // information for its final link. - debug_s = *FlagS - *FlagS = false - - // create temporary directory and arrange cleanup - if *flagTmpdir == "" { - dir, err := ioutil.TempDir("", "go-link-") - if err != nil { - log.Fatal(err) - } - *flagTmpdir = dir - ownTmpDir = true - AtExit(func() { - ctxt.Out.f.Close() - os.RemoveAll(*flagTmpdir) - }) - } - - // change our output to temporary object file - ctxt.Out.f.Close() - mayberemoveoutfile() - - p := filepath.Join(*flagTmpdir, "go.o") - var err error - f, err := os.OpenFile(p, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) - if err != nil { - Exitf("cannot create %s: %v", p, err) - } - - ctxt.Out.w = bufio.NewWriter(f) - ctxt.Out.f = f - ctxt.Out.off = 0 -} - -// hostobjCopy creates a copy of the object files in hostobj in a -// temporary directory. -func 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) - - wg.Add(1) - go func() { - sema <- struct{}{} - defer func() { - <-sema - wg.Done() - }() - f, err := os.Open(h.file) - if err != nil { - Exitf("cannot reopen %s: %v", h.pn, err) - } - defer f.Close() - if _, err := f.Seek(h.off, 0); err != nil { - Exitf("cannot seek %s: %v", h.pn, err) - } - - w, err := os.Create(dst) - if err != nil { - Exitf("cannot create %s: %v", dst, err) - } - if _, err := io.CopyN(w, f, h.length); err != nil { - Exitf("cannot write %s: %v", dst, err) - } - if err := w.Close(); err != nil { - Exitf("cannot close %s: %v", dst, err) - } - }() - } - wg.Wait() - return paths -} - -// writeGDBLinkerScript creates gcc linker script file in temp -// directory. writeGDBLinkerScript returns created file path. -// The script is used to work around gcc bug -// (see https://golang.org/issue/20183 for details). -func writeGDBLinkerScript() string { - name := "fix_debug_gdb_scripts.ld" - path := filepath.Join(*flagTmpdir, name) - src := `SECTIONS -{ - .debug_gdb_scripts BLOCK(__section_alignment__) (NOLOAD) : - { - *(.debug_gdb_scripts) - } -} -INSERT AFTER .debug_types; -` - err := ioutil.WriteFile(path, []byte(src), 0666) - if err != nil { - Errorf(nil, "WriteFile %s failed: %v", name, err) - } - return path -} - -// archive builds a .a archive from the hostobj object files. -func (ctxt *Link) archive() { - if ctxt.BuildMode != BuildModeCArchive { - return - } - - exitIfErrors() - - if *flagExtar == "" { - *flagExtar = "ar" - } - - mayberemoveoutfile() - - // Force the buffer to flush here so that external - // tools will see a complete file. - ctxt.Out.Flush() - if err := ctxt.Out.f.Close(); err != nil { - Exitf("close: %v", err) - } - ctxt.Out.f = nil - - argv := []string{*flagExtar, "-q", "-c", "-s"} - if ctxt.HeadType == objabi.Haix { - argv = append(argv, "-X64") - } - argv = append(argv, *flagOutfile) - argv = append(argv, filepath.Join(*flagTmpdir, "go.o")) - argv = append(argv, hostobjCopy()...) - - if ctxt.Debugvlog != 0 { - ctxt.Logf("archive: %s\n", strings.Join(argv, " ")) - } - - // If supported, use syscall.Exec() to invoke the archive command, - // which should be the final remaining step needed for the link. - // This will reduce peak RSS for the link (and speed up linking of - // large applications), since when the archive command runs we - // won't be holding onto all of the linker's live memory. - if syscallExecSupported && !ownTmpDir { - runAtExitFuncs() - ctxt.execArchive(argv) - panic("should not get here") - } - - // Otherwise invoke 'ar' in the usual way (fork + exec). - if out, err := exec.Command(argv[0], argv[1:]...).CombinedOutput(); err != nil { - Exitf("running %s failed: %v\n%s", argv[0], err, out) - } -} - -func (ctxt *Link) hostlink() { - if ctxt.LinkMode != LinkExternal || nerrors > 0 { - return - } - if ctxt.BuildMode == BuildModeCArchive { - return - } - - var argv []string - argv = append(argv, ctxt.extld()) - argv = append(argv, hostlinkArchArgs(ctxt.Arch)...) - - if *FlagS || debug_s { - if ctxt.HeadType == objabi.Hdarwin { - // Recent versions of macOS print - // ld: warning: option -s is obsolete and being ignored - // so do not pass any arguments. - } else { - argv = append(argv, "-s") - } - } - - switch ctxt.HeadType { - case objabi.Hdarwin: - if machoPlatform == PLATFORM_MACOS { - // -headerpad is incompatible with -fembed-bitcode. - argv = append(argv, "-Wl,-headerpad,1144") - } - if ctxt.DynlinkingGo() && !ctxt.Arch.InFamily(sys.ARM, sys.ARM64) { - argv = append(argv, "-Wl,-flat_namespace") - } - case objabi.Hopenbsd: - argv = append(argv, "-Wl,-nopie") - case objabi.Hwindows: - if windowsgui { - argv = append(argv, "-mwindows") - } else { - argv = append(argv, "-mconsole") - } - // Mark as having awareness of terminal services, to avoid - // ancient compatibility hacks. - argv = append(argv, "-Wl,--tsaware") - - // Enable DEP - argv = append(argv, "-Wl,--nxcompat") - - argv = append(argv, fmt.Sprintf("-Wl,--major-os-version=%d", PeMinimumTargetMajorVersion)) - argv = append(argv, fmt.Sprintf("-Wl,--minor-os-version=%d", PeMinimumTargetMinorVersion)) - argv = append(argv, fmt.Sprintf("-Wl,--major-subsystem-version=%d", PeMinimumTargetMajorVersion)) - argv = append(argv, fmt.Sprintf("-Wl,--minor-subsystem-version=%d", PeMinimumTargetMinorVersion)) - case objabi.Haix: - argv = append(argv, "-pthread") - // prevent ld to reorder .text functions to keep the same - // first/last functions for moduledata. - argv = append(argv, "-Wl,-bnoobjreorder") - // mcmodel=large is needed for every gcc generated files, but - // ld still need -bbigtoc in order to allow larger TOC. - argv = append(argv, "-mcmodel=large") - argv = append(argv, "-Wl,-bbigtoc") - } - - switch ctxt.BuildMode { - case BuildModeExe: - if ctxt.HeadType == objabi.Hdarwin { - if machoPlatform == PLATFORM_MACOS { - argv = append(argv, "-Wl,-no_pie") - argv = append(argv, "-Wl,-pagezero_size,4000000") - } - } - case BuildModePIE: - switch ctxt.HeadType { - case objabi.Hdarwin, objabi.Haix: - case objabi.Hwindows: - // Enable ASLR. - argv = append(argv, "-Wl,--dynamicbase") - // enable high-entropy ASLR on 64-bit. - if ctxt.Arch.PtrSize >= 8 { - argv = append(argv, "-Wl,--high-entropy-va") - } - // Work around binutils limitation that strips relocation table for dynamicbase. - // See https://sourceware.org/bugzilla/show_bug.cgi?id=19011 - argv = append(argv, "-Wl,--export-all-symbols") - default: - // ELF. - if ctxt.UseRelro() { - argv = append(argv, "-Wl,-z,relro") - } - argv = append(argv, "-pie") - } - case BuildModeCShared: - if ctxt.HeadType == objabi.Hdarwin { - argv = append(argv, "-dynamiclib") - if ctxt.Arch.Family != sys.AMD64 { - argv = append(argv, "-Wl,-read_only_relocs,suppress") - } - } else { - // ELF. - argv = append(argv, "-Wl,-Bsymbolic") - if ctxt.UseRelro() { - argv = append(argv, "-Wl,-z,relro") - } - argv = append(argv, "-shared") - if ctxt.HeadType != objabi.Hwindows { - // Pass -z nodelete to mark the shared library as - // non-closeable: a dlclose will do nothing. - argv = append(argv, "-Wl,-z,nodelete") - } - } - case BuildModeShared: - if ctxt.UseRelro() { - argv = append(argv, "-Wl,-z,relro") - } - argv = append(argv, "-shared") - case BuildModePlugin: - if ctxt.HeadType == objabi.Hdarwin { - argv = append(argv, "-dynamiclib") - } else { - if ctxt.UseRelro() { - argv = append(argv, "-Wl,-z,relro") - } - argv = append(argv, "-shared") - } - } - - if ctxt.IsELF && ctxt.DynlinkingGo() { - // We force all symbol resolution to be done at program startup - // because lazy PLT resolution can use large amounts of stack at - // times we cannot allow it to do so. - argv = append(argv, "-Wl,-znow") - - // Do not let the host linker generate COPY relocations. These - // can move symbols out of sections that rely on stable offsets - // from the beginning of the section (like sym.STYPE). - argv = append(argv, "-Wl,-znocopyreloc") - - if ctxt.Arch.InFamily(sys.ARM, sys.ARM64) && objabi.GOOS == "linux" { - // On ARM, the GNU linker will generate COPY relocations - // even with -znocopyreloc set. - // 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. - argv = append(argv, "-fuse-ld=gold") - - // If gold is not installed, gcc will silently switch - // back to ld.bfd. So we parse the version information - // and provide a useful error if gold is missing. - cmd := exec.Command(*flagExtld, "-fuse-ld=gold", "-Wl,--version") - 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) - } - } - } - } - - if ctxt.Arch.Family == sys.ARM64 && objabi.GOOS == "freebsd" { - // Switch to ld.bfd on freebsd/arm64. - argv = append(argv, "-fuse-ld=bfd") - - // Provide a useful error if ld.bfd is missing. - cmd := exec.Command(*flagExtld, "-fuse-ld=bfd", "-Wl,--version") - if out, err := cmd.CombinedOutput(); err == nil { - if !bytes.Contains(out, []byte("GNU ld")) { - log.Fatalf("ARM64 external linker must be ld.bfd (issue #35197), please install devel/binutils") - } - } - } - - if ctxt.IsELF && len(buildinfo) > 0 { - argv = append(argv, fmt.Sprintf("-Wl,--build-id=0x%x", buildinfo)) - } - - // On Windows, given -o foo, GCC will append ".exe" to produce - // "foo.exe". We have decided that we want to honor the -o - // option. To make this work, we append a '.' so that GCC - // will decide that the file already has an extension. We - // only want to do this when producing a Windows output file - // on a Windows host. - outopt := *flagOutfile - if objabi.GOOS == "windows" && runtime.GOOS == "windows" && filepath.Ext(outopt) == "" { - outopt += "." - } - argv = append(argv, "-o") - argv = append(argv, outopt) - - if rpath.val != "" { - argv = append(argv, fmt.Sprintf("-Wl,-rpath,%s", rpath.val)) - } - - // Force global symbols to be exported for dlopen, etc. - if ctxt.IsELF { - argv = append(argv, "-rdynamic") - } - if ctxt.HeadType == objabi.Haix { - fileName := xcoffCreateExportFile(ctxt) - argv = append(argv, "-Wl,-bE:"+fileName) - } - - if strings.Contains(argv[0], "clang") { - argv = append(argv, "-Qunused-arguments") - } - - const compressDWARF = "-Wl,--compress-debug-sections=zlib-gnu" - if ctxt.compressDWARF && linkerFlagSupported(argv[0], compressDWARF) { - argv = append(argv, compressDWARF) - } - - argv = append(argv, filepath.Join(*flagTmpdir, "go.o")) - argv = append(argv, hostobjCopy()...) - if ctxt.HeadType == objabi.Haix { - // We want to have C files after Go files to remove - // trampolines csects made by ld. - argv = append(argv, "-nostartfiles") - argv = append(argv, "/lib/crt0_64.o") - - extld := ctxt.extld() - // Get starting files. - getPathFile := func(file string) string { - args := []string{"-maix64", "--print-file-name=" + file} - out, err := exec.Command(extld, args...).CombinedOutput() - if err != nil { - log.Fatalf("running %s failed: %v\n%s", extld, err, out) - } - return strings.Trim(string(out), "\n") - } - argv = append(argv, getPathFile("crtcxa.o")) - argv = append(argv, getPathFile("crtdbase.o")) - } - - if ctxt.linkShared { - seenDirs := make(map[string]bool) - seenLibs := make(map[string]bool) - addshlib := func(path string) { - dir, base := filepath.Split(path) - if !seenDirs[dir] { - argv = append(argv, "-L"+dir) - if !rpath.set { - argv = append(argv, "-Wl,-rpath="+dir) - } - seenDirs[dir] = true - } - base = strings.TrimSuffix(base, ".so") - base = strings.TrimPrefix(base, "lib") - if !seenLibs[base] { - argv = append(argv, "-l"+base) - seenLibs[base] = true - } - } - for _, shlib := range ctxt.Shlibs { - addshlib(shlib.Path) - for _, dep := range shlib.Deps { - if dep == "" { - continue - } - libpath := findshlib(ctxt, dep) - if libpath != "" { - addshlib(libpath) - } - } - } - } - - // clang, unlike GCC, passes -rdynamic to the linker - // even when linking with -static, causing a linker - // error when using GNU ld. So take out -rdynamic if - // we added it. We do it in this order, rather than - // only adding -rdynamic later, so that -*extldflags - // can override -rdynamic without using -static. - checkStatic := func(arg string) { - if ctxt.IsELF && arg == "-static" { - for i := range argv { - if argv[i] == "-rdynamic" { - argv[i] = "-static" - } - } - } - } - - for _, p := range ldflag { - argv = append(argv, p) - checkStatic(p) - } - - // When building a program with the default -buildmode=exe the - // gc compiler generates code requires DT_TEXTREL in a - // position independent executable (PIE). On systems where the - // toolchain creates PIEs by default, and where DT_TEXTREL - // does not work, the resulting programs will not run. See - // issue #17847. To avoid this problem pass -no-pie to the - // toolchain if it is supported. - if ctxt.BuildMode == BuildModeExe && !ctxt.linkShared { - // GCC uses -no-pie, clang uses -nopie. - for _, nopie := range []string{"-no-pie", "-nopie"} { - if linkerFlagSupported(argv[0], nopie) { - argv = append(argv, nopie) - break - } - } - } - - for _, p := range strings.Fields(*flagExtldflags) { - argv = append(argv, p) - checkStatic(p) - } - if ctxt.HeadType == objabi.Hwindows { - // use gcc linker script to work around gcc bug - // (see https://golang.org/issue/20183 for details). - p := writeGDBLinkerScript() - argv = append(argv, "-Wl,-T,"+p) - // libmingw32 and libmingwex have some inter-dependencies, - // so must use linker groups. - argv = append(argv, "-Wl,--start-group", "-lmingwex", "-lmingw32", "-Wl,--end-group") - argv = append(argv, peimporteddlls()...) - } - - if ctxt.Debugvlog != 0 { - ctxt.Logf("host link:") - for _, v := range argv { - ctxt.Logf(" %q", v) - } - ctxt.Logf("\n") - } - - out, err := exec.Command(argv[0], argv[1:]...).CombinedOutput() - if err != nil { - Exitf("running %s failed: %v\n%s", argv[0], err, out) - } - - // Filter out useless linker warnings caused by bugs outside Go. - // See also cmd/go/internal/work/exec.go's gccld method. - var save [][]byte - var skipLines int - for _, line := range bytes.SplitAfter(out, []byte("\n")) { - // golang.org/issue/26073 - Apple Xcode bug - if bytes.Contains(line, []byte("ld: warning: text-based stub file")) { - continue - } - - if skipLines > 0 { - skipLines-- - continue - } - - // Remove TOC overflow warning on AIX. - if bytes.Contains(line, []byte("ld: 0711-783")) { - skipLines = 2 - continue - } - - save = append(save, line) - } - out = bytes.Join(save, nil) - - if len(out) > 0 { - // always print external output even if the command is successful, so that we don't - // swallow linker warnings (see https://golang.org/issue/17935). - ctxt.Logf("%s", out) - } - - if !*FlagS && !*FlagW && !debug_s && ctxt.HeadType == objabi.Hdarwin { - dsym := filepath.Join(*flagTmpdir, "go.dwarf") - if out, err := exec.Command("dsymutil", "-f", *flagOutfile, "-o", dsym).CombinedOutput(); err != nil { - Exitf("%s: running dsymutil failed: %v\n%s", os.Args[0], err, out) - } - // Skip combining if `dsymutil` didn't generate a file. See #11994. - if _, err := os.Stat(dsym); os.IsNotExist(err) { - return - } - // For os.Rename to work reliably, must be in same directory as outfile. - combinedOutput := *flagOutfile + "~" - exef, err := os.Open(*flagOutfile) - if err != nil { - Exitf("%s: combining dwarf failed: %v", os.Args[0], err) - } - defer exef.Close() - exem, err := macho.NewFile(exef) - if err != nil { - Exitf("%s: parsing Mach-O header failed: %v", os.Args[0], err) - } - // Only macOS supports unmapped segments such as our __DWARF segment. - if machoPlatform == PLATFORM_MACOS { - if err := machoCombineDwarf(ctxt, exef, exem, dsym, combinedOutput); err != nil { - Exitf("%s: combining dwarf failed: %v", os.Args[0], err) - } - os.Remove(*flagOutfile) - if err := os.Rename(combinedOutput, *flagOutfile); err != nil { - Exitf("%s: %v", os.Args[0], err) - } - } - } -} - -var createTrivialCOnce sync.Once - -func linkerFlagSupported(linker, flag string) bool { - createTrivialCOnce.Do(func() { - src := filepath.Join(*flagTmpdir, "trivial.c") - if err := ioutil.WriteFile(src, []byte("int main() { return 0; }"), 0666); err != nil { - Errorf(nil, "WriteFile trivial.c failed: %v", err) - } - }) - - flagsWithNextArgSkip := []string{ - "-F", - "-l", - "-L", - "-framework", - "-Wl,-framework", - "-Wl,-rpath", - "-Wl,-undefined", - } - flagsWithNextArgKeep := []string{ - "-arch", - "-isysroot", - "--sysroot", - "-target", - } - prefixesToKeep := []string{ - "-f", - "-m", - "-p", - "-Wl,", - "-arch", - "-isysroot", - "--sysroot", - "-target", - } - - var flags []string - keep := false - skip := false - extldflags := strings.Fields(*flagExtldflags) - for _, f := range append(extldflags, ldflag...) { - if keep { - flags = append(flags, f) - keep = false - } else if skip { - skip = false - } else if f == "" || f[0] != '-' { - } else if contains(flagsWithNextArgSkip, f) { - skip = true - } else if contains(flagsWithNextArgKeep, f) { - flags = append(flags, f) - keep = true - } else { - for _, p := range prefixesToKeep { - if strings.HasPrefix(f, p) { - flags = append(flags, f) - break - } - } - } - } - - 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")) -} - -// hostlinkArchArgs returns arguments to pass to the external linker -// based on the architecture. -func hostlinkArchArgs(arch *sys.Arch) []string { - switch arch.Family { - case sys.I386: - return []string{"-m32"} - case sys.AMD64, sys.S390X: - return []string{"-m64"} - case sys.ARM: - return []string{"-marm"} - case sys.ARM64: - // nothing needed - case sys.MIPS64: - return []string{"-mabi=64"} - case sys.MIPS: - return []string{"-mabi=32"} - case sys.PPC64: - if objabi.GOOS == "aix" { - return []string{"-maix64"} - } else { - return []string{"-m64"} - } - - } - return nil -} - -// ldobj loads an input object. If it is a host object (an object -// compiled by a non-Go compiler) it returns the Hostobj pointer. If -// it is a Go object, it returns nil. -func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, file string) *Hostobj { - pkg := objabi.PathToPrefix(lib.Pkg) - - eof := f.Offset() + length - start := f.Offset() - c1 := bgetc(f) - c2 := bgetc(f) - c3 := bgetc(f) - c4 := bgetc(f) - f.MustSeek(start, 0) - - unit := &sym.CompilationUnit{Lib: lib} - lib.Units = append(lib.Units, unit) - - magic := uint32(c1)<<24 | uint32(c2)<<16 | uint32(c3)<<8 | uint32(c4) - if magic == 0x7f454c46 { // \x7F E L F - if *flagNewobj { - ldelf := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, flags, err := loadelf.Load(ctxt.loader, ctxt.Arch, ctxt.Syms, f, pkg, length, pn, ehdr.flags) - if err != nil { - Errorf(nil, "%v", err) - return - } - ehdr.flags = flags - ctxt.Textp = append(ctxt.Textp, textp...) - } - return ldhostobj(ldelf, ctxt.HeadType, f, pkg, length, pn, file) - } else { - ldelf := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, flags, err := loadelf.LoadOld(ctxt.Arch, ctxt.Syms, f, pkg, length, pn, ehdr.flags) - if err != nil { - Errorf(nil, "%v", err) - return - } - ehdr.flags = flags - ctxt.Textp = append(ctxt.Textp, textp...) - } - return ldhostobj(ldelf, ctxt.HeadType, f, pkg, length, pn, file) - } - } - - if magic&^1 == 0xfeedface || magic&^0x01000000 == 0xcefaedfe { - if *flagNewobj { - ldmacho := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, err := loadmacho.Load(ctxt.loader, ctxt.Arch, ctxt.Syms, f, pkg, length, pn) - if err != nil { - Errorf(nil, "%v", err) - return - } - ctxt.Textp = append(ctxt.Textp, textp...) - } - return ldhostobj(ldmacho, ctxt.HeadType, f, pkg, length, pn, file) - } else { - ldmacho := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, err := loadmacho.LoadOld(ctxt.Arch, ctxt.Syms, f, pkg, length, pn) - if err != nil { - Errorf(nil, "%v", err) - return - } - ctxt.Textp = append(ctxt.Textp, textp...) - } - return ldhostobj(ldmacho, ctxt.HeadType, f, pkg, length, pn, file) - } - } - - if c1 == 0x4c && c2 == 0x01 || c1 == 0x64 && c2 == 0x86 { - if *flagNewobj { - ldpe := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, rsrc, err := loadpe.Load(ctxt.loader, ctxt.Arch, ctxt.Syms, f, pkg, length, pn) - if err != nil { - Errorf(nil, "%v", err) - return - } - if rsrc != nil { - setpersrc(ctxt, rsrc) - } - ctxt.Textp = append(ctxt.Textp, textp...) - } - return ldhostobj(ldpe, ctxt.HeadType, f, pkg, length, pn, file) - } else { - ldpe := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, rsrc, err := loadpe.LoadOld(ctxt.Arch, ctxt.Syms, f, pkg, length, pn) - if err != nil { - Errorf(nil, "%v", err) - return - } - if rsrc != nil { - setpersrc(ctxt, rsrc) - } - ctxt.Textp = append(ctxt.Textp, textp...) - } - return ldhostobj(ldpe, ctxt.HeadType, f, pkg, length, pn, file) - } - } - - if c1 == 0x01 && (c2 == 0xD7 || c2 == 0xF7) { - if *flagNewobj { - ldxcoff := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, err := loadxcoff.Load(ctxt.loader, ctxt.Arch, ctxt.Syms, f, pkg, length, pn) - if err != nil { - Errorf(nil, "%v", err) - return - } - ctxt.Textp = append(ctxt.Textp, textp...) - } - return ldhostobj(ldxcoff, ctxt.HeadType, f, pkg, length, pn, file) - } else { - ldxcoff := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, err := loadxcoff.LoadOld(ctxt.Arch, ctxt.Syms, f, pkg, length, pn) - if err != nil { - Errorf(nil, "%v", err) - return - } - ctxt.Textp = append(ctxt.Textp, textp...) - } - return ldhostobj(ldxcoff, ctxt.HeadType, f, pkg, length, pn, file) - } - } - - /* check the header */ - line, err := f.ReadString('\n') - if err != nil { - Errorf(nil, "truncated object file: %s: %v", pn, err) - return nil - } - - if !strings.HasPrefix(line, "go object ") { - if strings.HasSuffix(pn, ".go") { - Exitf("%s: uncompiled .go source file", pn) - return nil - } - - if line == ctxt.Arch.Name { - // old header format: just $GOOS - Errorf(nil, "%s: stale object file", pn) - return nil - } - - Errorf(nil, "%s: not an object file", pn) - return nil - } - - // First, check that the basic GOOS, GOARCH, and Version match. - t := fmt.Sprintf("%s %s %s ", objabi.GOOS, objabi.GOARCH, objabi.Version) - - line = strings.TrimRight(line, "\n") - if !strings.HasPrefix(line[10:]+" ", t) && !*flagF { - Errorf(nil, "%s: object is [%s] expected [%s]", pn, line[10:], t) - return nil - } - - // Second, check that longer lines match each other exactly, - // so that the Go compiler and write additional information - // that must be the same from run to run. - if len(line) >= len(t)+10 { - if theline == "" { - theline = line[10:] - } else if theline != line[10:] { - Errorf(nil, "%s: object is [%s] expected [%s]", pn, line[10:], theline) - return nil - } - } - - // Skip over exports and other info -- ends with \n!\n. - // - // Note: It's possible for "\n!\n" to appear within the binary - // package export data format. To avoid truncating the package - // definition prematurely (issue 21703), we keep track of - // how many "$$" delimiters we've seen. - - import0 := f.Offset() - - c1 = '\n' // the last line ended in \n - c2 = bgetc(f) - c3 = bgetc(f) - markers := 0 - for { - if c1 == '\n' { - if markers%2 == 0 && c2 == '!' && c3 == '\n' { - break - } - if c2 == '$' && c3 == '$' { - markers++ - } - } - - c1 = c2 - c2 = c3 - c3 = bgetc(f) - if c3 == -1 { - Errorf(nil, "truncated object file: %s", pn) - return nil - } - } - - import1 := f.Offset() - - f.MustSeek(import0, 0) - ldpkg(ctxt, f, lib, import1-import0-2, pn) // -2 for !\n - f.MustSeek(import1, 0) - - flags := 0 - switch *FlagStrictDups { - case 0: - break - case 1: - flags = objfile.StrictDupsWarnFlag - case 2: - flags = objfile.StrictDupsErrFlag - default: - log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups) - } - var c int - if *flagNewobj { - ctxt.loader.Preload(ctxt.Arch, ctxt.Syms, f, lib, unit, eof-f.Offset(), pn, flags) - } else { - c = objfile.Load(ctxt.Arch, ctxt.Syms, f, lib, unit, eof-f.Offset(), pn, flags) - } - strictDupMsgCount += c - addImports(ctxt, lib, pn) - return nil -} - -func readelfsymboldata(ctxt *Link, f *elf.File, sym *elf.Symbol) []byte { - data := make([]byte, sym.Size) - sect := f.Sections[sym.Section] - if sect.Type != elf.SHT_PROGBITS && sect.Type != elf.SHT_NOTE { - Errorf(nil, "reading %s from non-data section", sym.Name) - } - n, err := sect.ReadAt(data, int64(sym.Value-sect.Addr)) - if uint64(n) != sym.Size { - Errorf(nil, "reading contents of %s: %v", sym.Name, err) - } - return data -} - -func readwithpad(r io.Reader, sz int32) ([]byte, error) { - data := make([]byte, Rnd(int64(sz), 4)) - _, err := io.ReadFull(r, data) - if err != nil { - return nil, err - } - data = data[:sz] - return data, nil -} - -func readnote(f *elf.File, name []byte, typ int32) ([]byte, error) { - for _, sect := range f.Sections { - if sect.Type != elf.SHT_NOTE { - continue - } - r := sect.Open() - for { - var namesize, descsize, noteType int32 - err := binary.Read(r, f.ByteOrder, &namesize) - if err != nil { - if err == io.EOF { - break - } - return nil, fmt.Errorf("read namesize failed: %v", err) - } - err = binary.Read(r, f.ByteOrder, &descsize) - if err != nil { - return nil, fmt.Errorf("read descsize failed: %v", err) - } - err = binary.Read(r, f.ByteOrder, ¬eType) - if err != nil { - return nil, fmt.Errorf("read type failed: %v", err) - } - noteName, 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) - } - if string(name) == string(noteName) && typ == noteType { - return desc, nil - } - } - } - return nil, nil -} - -func findshlib(ctxt *Link, shlib string) string { - if filepath.IsAbs(shlib) { - return shlib - } - for _, libdir := range ctxt.Libdir { - libpath := filepath.Join(libdir, shlib) - if _, err := os.Stat(libpath); err == nil { - return libpath - } - } - Errorf(nil, "cannot find shared library: %s", shlib) - return "" -} - -func ldshlibsyms(ctxt *Link, shlib string) { - var libpath string - if filepath.IsAbs(shlib) { - libpath = shlib - shlib = filepath.Base(shlib) - } else { - libpath = findshlib(ctxt, shlib) - if libpath == "" { - return - } - } - for _, processedlib := range ctxt.Shlibs { - if processedlib.Path == libpath { - return - } - } - if ctxt.Debugvlog > 1 { - ctxt.Logf("ldshlibsyms: found library with name %s at %s\n", shlib, libpath) - } - - f, err := elf.Open(libpath) - if err != nil { - Errorf(nil, "cannot open shared library: %s", libpath) - return - } - defer f.Close() - - hash, err := readnote(f, ELF_NOTE_GO_NAME, ELF_NOTE_GOABIHASH_TAG) - if err != nil { - Errorf(nil, "cannot read ABI hash from shared library %s: %v", libpath, err) - return - } - - depsbytes, err := readnote(f, ELF_NOTE_GO_NAME, ELF_NOTE_GODEPS_TAG) - if err != nil { - Errorf(nil, "cannot read dep list from shared library %s: %v", libpath, err) - return - } - var deps []string - for _, dep := range strings.Split(string(depsbytes), "\n") { - if dep == "" { - continue - } - if !filepath.IsAbs(dep) { - // If the dep can be interpreted as a path relative to the shlib - // in which it was found, do that. Otherwise, we will leave it - // to be resolved by libdir lookup. - abs := filepath.Join(filepath.Dir(libpath), dep) - if _, err := os.Stat(abs); err == nil { - dep = abs - } - } - deps = append(deps, dep) - } - - syms, err := f.DynamicSymbols() - if err != nil { - Errorf(nil, "cannot read symbols from shared library: %s", libpath) - return - } - gcdataLocations := make(map[uint64]*sym.Symbol) - for _, elfsym := range syms { - if elf.ST_TYPE(elfsym.Info) == elf.STT_NOTYPE || elf.ST_TYPE(elfsym.Info) == elf.STT_SECTION { - continue - } - - // Symbols whose names start with "type." are compiler - // generated, so make functions with that prefix internal. - ver := 0 - if elf.ST_TYPE(elfsym.Info) == elf.STT_FUNC && strings.HasPrefix(elfsym.Name, "type.") { - ver = sym.SymVerABIInternal - } - - var lsym *sym.Symbol - if *flagNewobj { - i := ctxt.loader.AddExtSym(elfsym.Name, ver) - if i == 0 { - continue - } - lsym = ctxt.Syms.Newsym(elfsym.Name, ver) - ctxt.loader.Syms[i] = lsym - } else { - lsym = ctxt.Syms.Lookup(elfsym.Name, ver) - } - // Because loadlib above loads all .a files before loading any shared - // libraries, any non-dynimport symbols we find that duplicate symbols - // already loaded should be ignored (the symbols from the .a files - // "win"). - if lsym.Type != 0 && lsym.Type != sym.SDYNIMPORT { - continue - } - lsym.Type = sym.SDYNIMPORT - lsym.SetElfType(elf.ST_TYPE(elfsym.Info)) - lsym.Size = int64(elfsym.Size) - if elfsym.Section != elf.SHN_UNDEF { - // Set .File for the library that actually defines the symbol. - lsym.File = libpath - // The decodetype_* functions in decodetype.go need access to - // the type data. - if strings.HasPrefix(lsym.Name, "type.") && !strings.HasPrefix(lsym.Name, "type..") { - lsym.P = readelfsymboldata(ctxt, f, &elfsym) - gcdataLocations[elfsym.Value+2*uint64(ctxt.Arch.PtrSize)+8+1*uint64(ctxt.Arch.PtrSize)] = lsym - } - } - // For function symbols, we don't know what ABI is - // available, so alias it under both ABIs. - // - // TODO(austin): This is almost certainly wrong once - // the ABIs are actually different. We might have to - // mangle Go function names in the .so to include the - // ABI. - if elf.ST_TYPE(elfsym.Info) == elf.STT_FUNC && ver == 0 { - var alias *sym.Symbol - if *flagNewobj { - i := ctxt.loader.AddExtSym(elfsym.Name, sym.SymVerABIInternal) - if i == 0 { - continue - } - alias = ctxt.Syms.Newsym(elfsym.Name, sym.SymVerABIInternal) - ctxt.loader.Syms[i] = alias - } else { - alias = ctxt.Syms.Lookup(elfsym.Name, sym.SymVerABIInternal) - } - if alias.Type != 0 { - continue - } - alias.Type = sym.SABIALIAS - alias.R = []sym.Reloc{{Sym: lsym}} - } - } - gcdataAddresses := make(map[*sym.Symbol]uint64) - if ctxt.Arch.Family == sys.ARM64 { - for _, sect := range f.Sections { - if sect.Type == elf.SHT_RELA { - var rela elf.Rela64 - rdr := sect.Open() - for { - err := binary.Read(rdr, f.ByteOrder, &rela) - if err == io.EOF { - break - } else if err != nil { - Errorf(nil, "reading relocation failed %v", err) - return - } - t := elf.R_AARCH64(rela.Info & 0xffff) - if t != elf.R_AARCH64_RELATIVE { - continue - } - if lsym, ok := gcdataLocations[rela.Off]; ok { - gcdataAddresses[lsym] = uint64(rela.Addend) - } - } - } - } - } - - ctxt.Shlibs = append(ctxt.Shlibs, Shlib{Path: libpath, Hash: hash, Deps: deps, File: f, gcdataAddresses: gcdataAddresses}) -} - -func addsection(arch *sys.Arch, seg *sym.Segment, name string, rwx int) *sym.Section { - sect := new(sym.Section) - sect.Rwx = uint8(rwx) - sect.Name = name - sect.Seg = seg - sect.Align = int32(arch.PtrSize) // everything is at least pointer-aligned - seg.Sections = append(seg.Sections, sect) - return sect -} - -type chain struct { - sym *sym.Symbol - up *chain - limit int // limit on entry to sym -} - -var morestack *sym.Symbol - -// TODO: Record enough information in new object files to -// allow stack checks here. - -func haslinkregister(ctxt *Link) bool { - return ctxt.FixedFrameSize() != 0 -} - -func callsize(ctxt *Link) int { - if haslinkregister(ctxt) { - return 0 - } - return ctxt.Arch.RegSize -} - -func (ctxt *Link) dostkcheck() { - var ch chain - - morestack = ctxt.Syms.Lookup("runtime.morestack", 0) - - // Every splitting function ensures that there are at least StackLimit - // bytes available below SP when the splitting prologue finishes. - // If the splitting function calls F, then F begins execution with - // at least StackLimit - callsize() bytes available. - // Check that every function behaves correctly with this amount - // of stack, following direct calls in order to piece together chains - // of non-splitting functions. - ch.up = nil - - ch.limit = objabi.StackLimit - callsize(ctxt) - if objabi.GOARCH == "arm64" { - // need extra 8 bytes below SP to save FP - ch.limit -= 8 - } - - // Check every function, but do the nosplit functions in a first pass, - // to make the printed failure chains as short as possible. - for _, s := range ctxt.Textp { - // runtime.racesymbolizethunk is called from gcc-compiled C - // code running on the operating system thread stack. - // It uses more than the usual amount of stack but that's okay. - if s.Name == "runtime.racesymbolizethunk" { - continue - } - - if s.Attr.NoSplit() { - ch.sym = s - stkcheck(ctxt, &ch, 0) - } - } - - for _, s := range ctxt.Textp { - if !s.Attr.NoSplit() { - ch.sym = s - stkcheck(ctxt, &ch, 0) - } - } -} - -func stkcheck(ctxt *Link, up *chain, depth int) int { - limit := up.limit - s := up.sym - - // Don't duplicate work: only need to consider each - // function at top of safe zone once. - top := limit == objabi.StackLimit-callsize(ctxt) - if top { - if s.Attr.StackCheck() { - return 0 - } - s.Attr |= sym.AttrStackCheck - } - - if depth > 500 { - Errorf(s, "nosplit stack check too deep") - stkbroke(ctxt, up, 0) - return -1 - } - - if s.Attr.External() || s.FuncInfo == nil { - // external function. - // should never be called directly. - // onlyctxt.Diagnose the direct caller. - // TODO(mwhudson): actually think about this. - // TODO(khr): disabled for now. Calls to external functions can only happen on the g0 stack. - // See the trampolines in src/runtime/sys_darwin_$ARCH.go. - if depth == 1 && s.Type != sym.SXREF && !ctxt.DynlinkingGo() && - ctxt.BuildMode != BuildModeCArchive && ctxt.BuildMode != BuildModePIE && ctxt.BuildMode != BuildModeCShared && ctxt.BuildMode != BuildModePlugin { - //Errorf(s, "call to external function") - } - return -1 - } - - if limit < 0 { - stkbroke(ctxt, up, limit) - return -1 - } - - // morestack looks like it calls functions, - // but it switches the stack pointer first. - if s == morestack { - return 0 - } - - var ch chain - ch.up = up - - if !s.Attr.NoSplit() { - // Ensure we have enough stack to call morestack. - ch.limit = limit - callsize(ctxt) - ch.sym = morestack - if stkcheck(ctxt, &ch, depth+1) < 0 { - return -1 - } - if !top { - return 0 - } - // Raise limit to allow frame. - locals := int32(0) - if s.FuncInfo != nil { - locals = s.FuncInfo.Locals - } - limit = objabi.StackLimit + int(locals) + int(ctxt.FixedFrameSize()) - } - - // Walk through sp adjustments in function, consuming relocs. - ri := 0 - - endr := len(s.R) - var ch1 chain - pcsp := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) - var r *sym.Reloc - for pcsp.Init(s.FuncInfo.Pcsp.P); !pcsp.Done; pcsp.Next() { - // pcsp.value is in effect for [pcsp.pc, pcsp.nextpc). - - // Check stack size in effect for this span. - if int32(limit)-pcsp.Value < 0 { - stkbroke(ctxt, up, int(int32(limit)-pcsp.Value)) - return -1 - } - - // Process calls in this span. - for ; ri < endr && uint32(s.R[ri].Off) < pcsp.NextPC; ri++ { - r = &s.R[ri] - switch { - case r.Type.IsDirectCall(): - ch.limit = int(int32(limit) - pcsp.Value - int32(callsize(ctxt))) - ch.sym = r.Sym - if stkcheck(ctxt, &ch, depth+1) < 0 { - return -1 - } - - // Indirect call. Assume it is a call to a splitting function, - // so we have to make sure it can call morestack. - // Arrange the data structures to report both calls, so that - // if there is an error, stkprint shows all the steps involved. - case r.Type == objabi.R_CALLIND: - ch.limit = int(int32(limit) - pcsp.Value - int32(callsize(ctxt))) - ch.sym = nil - ch1.limit = ch.limit - callsize(ctxt) // for morestack in called prologue - ch1.up = &ch - ch1.sym = morestack - if stkcheck(ctxt, &ch1, depth+2) < 0 { - return -1 - } - } - } - } - - return 0 -} - -func stkbroke(ctxt *Link, ch *chain, limit int) { - Errorf(ch.sym, "nosplit stack overflow") - stkprint(ctxt, ch, limit) -} - -func stkprint(ctxt *Link, ch *chain, limit int) { - var name string - - if ch.sym != nil { - name = ch.sym.Name - if ch.sym.Attr.NoSplit() { - name += " (nosplit)" - } - } else { - name = "function pointer" - } - - if ch.up == nil { - // top of chain. ch->sym != nil. - if ch.sym.Attr.NoSplit() { - fmt.Printf("\t%d\tassumed on entry to %s\n", ch.limit, name) - } else { - fmt.Printf("\t%d\tguaranteed after split check in %s\n", ch.limit, name) - } - } else { - stkprint(ctxt, ch.up, ch.limit+callsize(ctxt)) - if !haslinkregister(ctxt) { - fmt.Printf("\t%d\ton entry to %s\n", ch.limit, name) - } - } - - if ch.limit != limit { - fmt.Printf("\t%d\tafter %s uses %d\n", limit, name, ch.limit-limit) - } -} - -func usage() { - fmt.Fprintf(os.Stderr, "usage: link [options] main.o\n") - objabi.Flagprint(os.Stderr) - Exit(2) -} - -type SymbolType int8 - -const ( - // see also https://9p.io/magic/man2html/1/nm - TextSym SymbolType = 'T' - DataSym SymbolType = 'D' - BSSSym SymbolType = 'B' - UndefinedSym SymbolType = 'U' - TLSSym SymbolType = 't' - FrameSym SymbolType = 'm' - ParamSym SymbolType = 'p' - AutoSym SymbolType = 'a' - - // Deleted auto (not a real sym, just placeholder for type) - DeletedAutoSym = 'x' -) - -func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int64, *sym.Symbol)) { - // These symbols won't show up in the first loop below because we - // skip sym.STEXT symbols. Normal sym.STEXT symbols are emitted by walking textp. - s := ctxt.Syms.Lookup("runtime.text", 0) - if s.Type == sym.STEXT { - // We've already included this symbol in ctxt.Textp - // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin or - // on AIX with external linker. - // See data.go:/textaddress - if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) && !(ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - put(ctxt, s, s.Name, TextSym, s.Value, nil) - } - } - - n := 0 - - // Generate base addresses for all text sections if there are multiple - for _, sect := range Segtext.Sections { - if n == 0 { - n++ - continue - } - if sect.Name != ".text" || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - // On AIX, runtime.text.X are symbols already in the symtab. - break - } - s = ctxt.Syms.ROLookup(fmt.Sprintf("runtime.text.%d", n), 0) - if s == nil { - break - } - if s.Type == sym.STEXT { - put(ctxt, s, s.Name, TextSym, s.Value, nil) - } - n++ - } - - s = ctxt.Syms.Lookup("runtime.etext", 0) - if s.Type == sym.STEXT { - // We've already included this symbol in ctxt.Textp - // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin or - // on AIX with external linker. - // See data.go:/textaddress - if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) && !(ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - put(ctxt, s, s.Name, TextSym, s.Value, nil) - } - } - - shouldBeInSymbolTable := func(s *sym.Symbol) bool { - if s.Attr.NotInSymbolTable() { - return false - } - if ctxt.HeadType == objabi.Haix && s.Name == ".go.buildinfo" { - // On AIX, .go.buildinfo must be in the symbol table as - // it has relocations. - return true - } - if (s.Name == "" || s.Name[0] == '.') && !s.IsFileLocal() && s.Name != ".rathole" && s.Name != ".TOC." { - return false - } - return true - } - - for _, s := range ctxt.Syms.Allsym { - if !shouldBeInSymbolTable(s) { - continue - } - switch s.Type { - case sym.SCONST, - sym.SRODATA, - sym.SSYMTAB, - sym.SPCLNTAB, - sym.SINITARR, - sym.SDATA, - sym.SNOPTRDATA, - sym.SELFROSECT, - sym.SMACHOGOT, - sym.STYPE, - sym.SSTRING, - sym.SGOSTRING, - sym.SGOFUNC, - sym.SGCBITS, - sym.STYPERELRO, - sym.SSTRINGRELRO, - sym.SGOSTRINGRELRO, - sym.SGOFUNCRELRO, - sym.SGCBITSRELRO, - sym.SRODATARELRO, - sym.STYPELINK, - sym.SITABLINK, - sym.SWINDOWS: - if !s.Attr.Reachable() { - continue - } - put(ctxt, s, s.Name, DataSym, Symaddr(s), s.Gotype) - - case sym.SBSS, sym.SNOPTRBSS, sym.SLIBFUZZER_EXTRA_COUNTER: - if !s.Attr.Reachable() { - continue - } - if len(s.P) > 0 { - Errorf(s, "should not be bss (size=%d type=%v special=%v)", len(s.P), s.Type, s.Attr.Special()) - } - put(ctxt, s, s.Name, BSSSym, Symaddr(s), s.Gotype) - - case sym.SUNDEFEXT: - if ctxt.HeadType == objabi.Hwindows || ctxt.HeadType == objabi.Haix || ctxt.IsELF { - put(ctxt, s, s.Name, UndefinedSym, s.Value, nil) - } - - case sym.SHOSTOBJ: - if !s.Attr.Reachable() { - continue - } - if ctxt.HeadType == objabi.Hwindows || ctxt.IsELF { - put(ctxt, s, s.Name, UndefinedSym, s.Value, nil) - } - - case sym.SDYNIMPORT: - if !s.Attr.Reachable() { - continue - } - put(ctxt, s, s.Extname(), UndefinedSym, 0, nil) - - case sym.STLSBSS: - if ctxt.LinkMode == LinkExternal { - put(ctxt, s, s.Name, TLSSym, Symaddr(s), s.Gotype) - } - } - } - - for _, s := range ctxt.Textp { - put(ctxt, s, s.Name, TextSym, s.Value, s.Gotype) - - locals := int32(0) - if s.FuncInfo != nil { - locals = s.FuncInfo.Locals - } - // NOTE(ality): acid can't produce a stack trace without .frame symbols - put(ctxt, nil, ".frame", FrameSym, int64(locals)+int64(ctxt.Arch.PtrSize), nil) - - if s.FuncInfo == nil { - continue - } - } - - if ctxt.Debugvlog != 0 || *flagN { - ctxt.Logf("symsize = %d\n", uint32(Symsize)) - } -} - -func Symaddr(s *sym.Symbol) int64 { - if !s.Attr.Reachable() { - Errorf(s, "unreachable symbol in symaddr") - } - return s.Value -} - -func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) { - s := ctxt.Syms.Lookup(p, 0) - s.Type = t - s.Value = v - s.Attr |= sym.AttrReachable - s.Attr |= sym.AttrSpecial - s.Attr |= sym.AttrLocal -} - -func datoff(s *sym.Symbol, addr int64) int64 { - if uint64(addr) >= Segdata.Vaddr { - return int64(uint64(addr) - Segdata.Vaddr + Segdata.Fileoff) - } - if uint64(addr) >= Segtext.Vaddr { - return int64(uint64(addr) - Segtext.Vaddr + Segtext.Fileoff) - } - Errorf(s, "invalid datoff %#x", addr) - return 0 -} - -func Entryvalue(ctxt *Link) int64 { - a := *flagEntrySymbol - if a[0] >= '0' && a[0] <= '9' { - return atolwhex(a) - } - s := ctxt.Syms.Lookup(a, 0) - if s.Type == 0 { - return *FlagTextAddr - } - if ctxt.HeadType != objabi.Haix && s.Type != sym.STEXT { - Errorf(s, "entry not text") - } - return s.Value -} - -func undefsym(ctxt *Link, s *sym.Symbol) { - var r *sym.Reloc - - for i := 0; i < len(s.R); i++ { - r = &s.R[i] - if r.Sym == nil { // happens for some external ARM relocs - continue - } - // TODO(mwhudson): the test of VisibilityHidden here probably doesn't make - // sense and should be removed when someone has thought about it properly. - if (r.Sym.Type == sym.Sxxx || r.Sym.Type == sym.SXREF) && !r.Sym.Attr.VisibilityHidden() { - Errorf(s, "undefined: %q", r.Sym.Name) - } - if !r.Sym.Attr.Reachable() && r.Type != objabi.R_WEAKADDROFF { - Errorf(s, "relocation target %q", r.Sym.Name) - } - } -} - -func (ctxt *Link) undef() { - // undefsym performs checks (almost) identical to checks - // that report undefined relocations in relocsym. - // Both undefsym and relocsym can report same symbol as undefined, - // which results in error message duplication (see #10978). - // - // The undef is run after Arch.Asmb and could detect some - // programming errors there, but if object being linked is already - // failed with errors, it is better to avoid duplicated errors. - if nerrors > 0 { - return - } - - for _, s := range ctxt.Textp { - undefsym(ctxt, s) - } - for _, s := range datap { - undefsym(ctxt, s) - } - if nerrors > 0 { - errorexit() - } -} - -func (ctxt *Link) callgraph() { - if !*FlagC { - return - } - - var i int - var r *sym.Reloc - for _, s := range ctxt.Textp { - for i = 0; i < len(s.R); i++ { - r = &s.R[i] - if r.Sym == nil { - continue - } - if r.Type.IsDirectCall() && r.Sym.Type == sym.STEXT { - ctxt.Logf("%s calls %s\n", s.Name, r.Sym.Name) - } - } - } -} - -func Rnd(v int64, r int64) int64 { - if r <= 0 { - return v - } - v += r - 1 - c := v % r - if c < 0 { - c += r - } - v -= c - return v -} - -func bgetc(r *bio.Reader) int { - c, err := r.ReadByte() - if err != nil { - if err != io.EOF { - log.Fatalf("reading input: %v", err) - } - return -1 - } - return int(c) -} - -type markKind uint8 // for postorder traversal -const ( - _ markKind = iota - visiting - visited -) - -func postorder(libs []*sym.Library) []*sym.Library { - order := make([]*sym.Library, 0, len(libs)) // hold the result - mark := make(map[*sym.Library]markKind, len(libs)) - for _, lib := range libs { - dfs(lib, mark, &order) - } - return order -} - -func dfs(lib *sym.Library, mark map[*sym.Library]markKind, order *[]*sym.Library) { - if mark[lib] == visited { - return - } - if mark[lib] == visiting { - panic("found import cycle while visiting " + lib.Pkg) - } - mark[lib] = visiting - for _, i := range lib.Imports { - dfs(i, mark, order) - } - mark[lib] = visited - *order = append(*order, lib) -} - -func (ctxt *Link) loadlibfull() { - // Load full symbol contents, resolve indexed references. - ctxt.loader.LoadFull(ctxt.Arch, ctxt.Syms) - - // Pull the symbols out. - ctxt.loader.ExtractSymbols(ctxt.Syms) - - // Load cgo directives. - for _, d := range ctxt.cgodata { - setCgoAttr(ctxt, ctxt.Syms.Lookup, d.file, d.pkg, d.directives) - } - - setupdynexp(ctxt) - - // Populate ctxt.Reachparent if appropriate. - if ctxt.Reachparent != nil { - for i := 0; i < len(ctxt.loader.Reachparent); i++ { - p := ctxt.loader.Reachparent[i] - if p == 0 { - continue - } - if p == loader.Sym(i) { - panic("self-cycle in reachparent") - } - sym := ctxt.loader.Syms[i] - psym := ctxt.loader.Syms[p] - ctxt.Reachparent[sym] = psym - } - } - - // Drop the reference. - ctxt.loader = nil - ctxt.cgodata = nil - - addToTextp(ctxt) -} - -func (ctxt *Link) dumpsyms() { - for _, s := range ctxt.Syms.Allsym { - fmt.Printf("%s %s %p %v %v\n", s, s.Type, s, s.Attr.Reachable(), s.Attr.OnList()) - for i := range s.R { - fmt.Println("\t", s.R[i].Type, s.R[i].Sym) - } - } -} diff --git a/src/cmd/oldlink/internal/ld/link.go b/src/cmd/oldlink/internal/ld/link.go deleted file mode 100644 index 15878f3267..0000000000 --- a/src/cmd/oldlink/internal/ld/link.go +++ /dev/null @@ -1,187 +0,0 @@ -// Derived from Inferno utils/6l/l.h and related files. -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ld - -import ( - "bufio" - "cmd/internal/obj" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/loader" - "cmd/oldlink/internal/sym" - "debug/elf" - "fmt" -) - -type Shlib struct { - Path string - Hash []byte - Deps []string - File *elf.File - gcdataAddresses map[*sym.Symbol]uint64 -} - -// Link holds the context for writing object code from a compiler -// or for reading that input into the linker. -type Link struct { - Out *OutBuf - - Syms *sym.Symbols - - Arch *sys.Arch - Debugvlog int - Bso *bufio.Writer - - Loaded bool // set after all inputs have been loaded as symbols - - IsELF bool - HeadType objabi.HeadType - - linkShared bool // link against installed Go shared libraries - LinkMode LinkMode - BuildMode BuildMode - canUsePlugins bool // initialized when Loaded is set to true - compressDWARF bool - - Tlsg *sym.Symbol - Libdir []string - Library []*sym.Library - LibraryByPkg map[string]*sym.Library - Shlibs []Shlib - Tlsoffset int - Textp []*sym.Symbol - Filesyms []*sym.Symbol - Moduledata *sym.Symbol - - PackageFile map[string]string - PackageShlib map[string]string - - tramps []*sym.Symbol // trampolines - - // unresolvedSymSet is a set of erroneous unresolved references. - // Used to avoid duplicated error messages. - unresolvedSymSet map[unresolvedSymKey]bool - - // Used to implement field tracking. - Reachparent map[*sym.Symbol]*sym.Symbol - - compUnits []*sym.CompilationUnit // DWARF compilation units - runtimeCU *sym.CompilationUnit // One of the runtime CUs, the last one seen. - - relocbuf []byte // temporary buffer for applying relocations - - loader *loader.Loader - cgodata []cgodata // cgo directives to load, three strings are args for loadcgo - - cgo_export_static map[string]bool - cgo_export_dynamic map[string]bool -} - -type cgodata struct { - file string - pkg string - directives [][]string -} - -type unresolvedSymKey struct { - from *sym.Symbol // Symbol that referenced unresolved "to" - to *sym.Symbol // Unresolved symbol referenced by "from" -} - -// ErrorUnresolved prints unresolved symbol error for r.Sym that is referenced from s. -func (ctxt *Link) ErrorUnresolved(s *sym.Symbol, r *sym.Reloc) { - if ctxt.unresolvedSymSet == nil { - ctxt.unresolvedSymSet = make(map[unresolvedSymKey]bool) - } - - k := unresolvedSymKey{from: s, to: r.Sym} - if !ctxt.unresolvedSymSet[k] { - ctxt.unresolvedSymSet[k] = true - - // Try to find symbol under another ABI. - var reqABI, haveABI obj.ABI - haveABI = ^obj.ABI(0) - reqABI, ok := sym.VersionToABI(int(r.Sym.Version)) - if ok { - for abi := obj.ABI(0); abi < obj.ABICount; abi++ { - v := sym.ABIToVersion(abi) - if v == -1 { - continue - } - if rs := ctxt.Syms.ROLookup(r.Sym.Name, v); rs != nil && rs.Type != sym.Sxxx && rs.Type != sym.SXREF { - haveABI = abi - } - } - } - - // Give a special error message for main symbol (see #24809). - if r.Sym.Name == "main.main" { - Errorf(s, "function main is undeclared in the main package") - } else if haveABI != ^obj.ABI(0) { - Errorf(s, "relocation target %s not defined for %s (but is defined for %s)", r.Sym.Name, reqABI, haveABI) - } else { - Errorf(s, "relocation target %s not defined", r.Sym.Name) - } - } -} - -// The smallest possible offset from the hardware stack pointer to a local -// variable on the stack. Architectures that use a link register save its value -// on the stack in the function prologue and so always have a pointer between -// the hardware stack pointer and the local variable area. -func (ctxt *Link) FixedFrameSize() int64 { - switch ctxt.Arch.Family { - case sys.AMD64, sys.I386: - return 0 - case sys.PPC64: - // PIC code on ppc64le requires 32 bytes of stack, and it's easier to - // just use that much stack always on ppc64x. - return int64(4 * ctxt.Arch.PtrSize) - default: - return int64(ctxt.Arch.PtrSize) - } -} - -func (ctxt *Link) Logf(format string, args ...interface{}) { - fmt.Fprintf(ctxt.Bso, format, args...) - ctxt.Bso.Flush() -} - -func addImports(ctxt *Link, l *sym.Library, pn string) { - pkg := objabi.PathToPrefix(l.Pkg) - for _, importStr := range l.ImportStrings { - lib := addlib(ctxt, pkg, pn, importStr) - if lib != nil { - l.Imports = append(l.Imports, lib) - } - } - l.ImportStrings = nil -} diff --git a/src/cmd/oldlink/internal/ld/macho.go b/src/cmd/oldlink/internal/ld/macho.go deleted file mode 100644 index 960ed29067..0000000000 --- a/src/cmd/oldlink/internal/ld/macho.go +++ /dev/null @@ -1,1119 +0,0 @@ -// Copyright 2009 The Go Authors. 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 ( - "bytes" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "debug/macho" - "encoding/binary" - "fmt" - "io" - "os" - "sort" - "strings" -) - -type MachoHdr struct { - cpu uint32 - subcpu uint32 -} - -type MachoSect struct { - name string - segname string - addr uint64 - size uint64 - off uint32 - align uint32 - reloc uint32 - nreloc uint32 - flag uint32 - res1 uint32 - res2 uint32 -} - -type MachoSeg struct { - name string - vsize uint64 - vaddr uint64 - fileoffset uint64 - filesize uint64 - prot1 uint32 - prot2 uint32 - nsect uint32 - msect uint32 - sect []MachoSect - flag uint32 -} - -// MachoPlatformLoad represents a LC_VERSION_MIN_* or -// LC_BUILD_VERSION load command. -type MachoPlatformLoad struct { - platform MachoPlatform // One of PLATFORM_* constants. - cmd MachoLoad -} - -type MachoLoad struct { - type_ uint32 - data []uint32 -} - -type MachoPlatform int - -/* - * Total amount of space to reserve at the start of the file - * for Header, PHeaders, and SHeaders. - * May waste some. - */ -const ( - INITIAL_MACHO_HEADR = 4 * 1024 -) - -const ( - MACHO_CPU_AMD64 = 1<<24 | 7 - MACHO_CPU_386 = 7 - MACHO_SUBCPU_X86 = 3 - MACHO_CPU_ARM = 12 - MACHO_SUBCPU_ARM = 0 - MACHO_SUBCPU_ARMV7 = 9 - MACHO_CPU_ARM64 = 1<<24 | 12 - MACHO_SUBCPU_ARM64_ALL = 0 - MACHO32SYMSIZE = 12 - MACHO64SYMSIZE = 16 - MACHO_X86_64_RELOC_UNSIGNED = 0 - MACHO_X86_64_RELOC_SIGNED = 1 - MACHO_X86_64_RELOC_BRANCH = 2 - MACHO_X86_64_RELOC_GOT_LOAD = 3 - MACHO_X86_64_RELOC_GOT = 4 - MACHO_X86_64_RELOC_SUBTRACTOR = 5 - MACHO_X86_64_RELOC_SIGNED_1 = 6 - MACHO_X86_64_RELOC_SIGNED_2 = 7 - MACHO_X86_64_RELOC_SIGNED_4 = 8 - MACHO_ARM_RELOC_VANILLA = 0 - MACHO_ARM_RELOC_PAIR = 1 - MACHO_ARM_RELOC_SECTDIFF = 2 - MACHO_ARM_RELOC_BR24 = 5 - MACHO_ARM64_RELOC_UNSIGNED = 0 - MACHO_ARM64_RELOC_BRANCH26 = 2 - MACHO_ARM64_RELOC_PAGE21 = 3 - MACHO_ARM64_RELOC_PAGEOFF12 = 4 - MACHO_ARM64_RELOC_ADDEND = 10 - MACHO_GENERIC_RELOC_VANILLA = 0 - MACHO_FAKE_GOTPCREL = 100 -) - -const ( - MH_MAGIC = 0xfeedface - MH_MAGIC_64 = 0xfeedfacf - - MH_OBJECT = 0x1 - MH_EXECUTE = 0x2 - - MH_NOUNDEFS = 0x1 -) - -const ( - LC_SEGMENT = 0x1 - LC_SYMTAB = 0x2 - LC_SYMSEG = 0x3 - LC_THREAD = 0x4 - LC_UNIXTHREAD = 0x5 - LC_LOADFVMLIB = 0x6 - LC_IDFVMLIB = 0x7 - LC_IDENT = 0x8 - LC_FVMFILE = 0x9 - LC_PREPAGE = 0xa - LC_DYSYMTAB = 0xb - LC_LOAD_DYLIB = 0xc - LC_ID_DYLIB = 0xd - LC_LOAD_DYLINKER = 0xe - LC_ID_DYLINKER = 0xf - LC_PREBOUND_DYLIB = 0x10 - LC_ROUTINES = 0x11 - LC_SUB_FRAMEWORK = 0x12 - LC_SUB_UMBRELLA = 0x13 - LC_SUB_CLIENT = 0x14 - LC_SUB_LIBRARY = 0x15 - LC_TWOLEVEL_HINTS = 0x16 - LC_PREBIND_CKSUM = 0x17 - LC_LOAD_WEAK_DYLIB = 0x80000018 - LC_SEGMENT_64 = 0x19 - LC_ROUTINES_64 = 0x1a - LC_UUID = 0x1b - LC_RPATH = 0x8000001c - LC_CODE_SIGNATURE = 0x1d - LC_SEGMENT_SPLIT_INFO = 0x1e - LC_REEXPORT_DYLIB = 0x8000001f - LC_LAZY_LOAD_DYLIB = 0x20 - LC_ENCRYPTION_INFO = 0x21 - LC_DYLD_INFO = 0x22 - LC_DYLD_INFO_ONLY = 0x80000022 - LC_LOAD_UPWARD_DYLIB = 0x80000023 - LC_VERSION_MIN_MACOSX = 0x24 - LC_VERSION_MIN_IPHONEOS = 0x25 - LC_FUNCTION_STARTS = 0x26 - LC_DYLD_ENVIRONMENT = 0x27 - LC_MAIN = 0x80000028 - LC_DATA_IN_CODE = 0x29 - LC_SOURCE_VERSION = 0x2A - LC_DYLIB_CODE_SIGN_DRS = 0x2B - LC_ENCRYPTION_INFO_64 = 0x2C - LC_LINKER_OPTION = 0x2D - LC_LINKER_OPTIMIZATION_HINT = 0x2E - LC_VERSION_MIN_TVOS = 0x2F - LC_VERSION_MIN_WATCHOS = 0x30 - LC_VERSION_NOTE = 0x31 - LC_BUILD_VERSION = 0x32 -) - -const ( - S_REGULAR = 0x0 - S_ZEROFILL = 0x1 - S_NON_LAZY_SYMBOL_POINTERS = 0x6 - S_SYMBOL_STUBS = 0x8 - S_MOD_INIT_FUNC_POINTERS = 0x9 - S_ATTR_PURE_INSTRUCTIONS = 0x80000000 - S_ATTR_DEBUG = 0x02000000 - S_ATTR_SOME_INSTRUCTIONS = 0x00000400 -) - -const ( - PLATFORM_MACOS MachoPlatform = 1 - PLATFORM_IOS MachoPlatform = 2 - PLATFORM_TVOS MachoPlatform = 3 - PLATFORM_WATCHOS MachoPlatform = 4 - PLATFORM_BRIDGEOS MachoPlatform = 5 -) - -// Mach-O file writing -// https://developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html - -var machohdr MachoHdr - -var load []MachoLoad - -var machoPlatform MachoPlatform - -var seg [16]MachoSeg - -var nseg int - -var ndebug int - -var nsect int - -const ( - SymKindLocal = 0 + iota - SymKindExtdef - SymKindUndef - NumSymKind -) - -var nkind [NumSymKind]int - -var sortsym []*sym.Symbol - -var nsortsym int - -// Amount of space left for adding load commands -// that refer to dynamic libraries. Because these have -// to go in the Mach-O header, we can't just pick a -// "big enough" header size. The initial header is -// one page, the non-dynamic library stuff takes -// up about 1300 bytes; we overestimate that as 2k. -var loadBudget = INITIAL_MACHO_HEADR - 2*1024 - -func getMachoHdr() *MachoHdr { - return &machohdr -} - -func newMachoLoad(arch *sys.Arch, type_ uint32, ndata uint32) *MachoLoad { - if arch.PtrSize == 8 && (ndata&1 != 0) { - ndata++ - } - - load = append(load, MachoLoad{}) - l := &load[len(load)-1] - l.type_ = type_ - l.data = make([]uint32, ndata) - return l -} - -func newMachoSeg(name string, msect int) *MachoSeg { - if nseg >= len(seg) { - Exitf("too many segs") - } - - s := &seg[nseg] - nseg++ - s.name = name - s.msect = uint32(msect) - s.sect = make([]MachoSect, msect) - return s -} - -func newMachoSect(seg *MachoSeg, name string, segname string) *MachoSect { - if seg.nsect >= seg.msect { - Exitf("too many sects in segment %s", seg.name) - } - - s := &seg.sect[seg.nsect] - seg.nsect++ - s.name = name - s.segname = segname - nsect++ - return s -} - -// Generic linking code. - -var dylib []string - -var linkoff int64 - -func machowrite(arch *sys.Arch, out *OutBuf, linkmode LinkMode) int { - o1 := out.Offset() - - loadsize := 4 * 4 * ndebug - for i := range load { - loadsize += 4 * (len(load[i].data) + 2) - } - if arch.PtrSize == 8 { - loadsize += 18 * 4 * nseg - loadsize += 20 * 4 * nsect - } else { - loadsize += 14 * 4 * nseg - loadsize += 17 * 4 * nsect - } - - if arch.PtrSize == 8 { - out.Write32(MH_MAGIC_64) - } else { - out.Write32(MH_MAGIC) - } - out.Write32(machohdr.cpu) - out.Write32(machohdr.subcpu) - if linkmode == LinkExternal { - out.Write32(MH_OBJECT) /* file type - mach object */ - } else { - out.Write32(MH_EXECUTE) /* file type - mach executable */ - } - out.Write32(uint32(len(load)) + uint32(nseg) + uint32(ndebug)) - out.Write32(uint32(loadsize)) - if nkind[SymKindUndef] == 0 { - out.Write32(MH_NOUNDEFS) /* flags - no undefines */ - } else { - out.Write32(0) /* flags */ - } - if arch.PtrSize == 8 { - out.Write32(0) /* reserved */ - } - - for i := 0; i < nseg; i++ { - s := &seg[i] - if arch.PtrSize == 8 { - out.Write32(LC_SEGMENT_64) - out.Write32(72 + 80*s.nsect) - out.WriteStringN(s.name, 16) - out.Write64(s.vaddr) - out.Write64(s.vsize) - out.Write64(s.fileoffset) - out.Write64(s.filesize) - out.Write32(s.prot1) - out.Write32(s.prot2) - out.Write32(s.nsect) - out.Write32(s.flag) - } else { - out.Write32(LC_SEGMENT) - out.Write32(56 + 68*s.nsect) - out.WriteStringN(s.name, 16) - out.Write32(uint32(s.vaddr)) - out.Write32(uint32(s.vsize)) - out.Write32(uint32(s.fileoffset)) - out.Write32(uint32(s.filesize)) - out.Write32(s.prot1) - out.Write32(s.prot2) - out.Write32(s.nsect) - out.Write32(s.flag) - } - - for j := uint32(0); j < s.nsect; j++ { - t := &s.sect[j] - if arch.PtrSize == 8 { - out.WriteStringN(t.name, 16) - out.WriteStringN(t.segname, 16) - out.Write64(t.addr) - out.Write64(t.size) - out.Write32(t.off) - out.Write32(t.align) - out.Write32(t.reloc) - out.Write32(t.nreloc) - out.Write32(t.flag) - out.Write32(t.res1) /* reserved */ - out.Write32(t.res2) /* reserved */ - out.Write32(0) /* reserved */ - } else { - out.WriteStringN(t.name, 16) - out.WriteStringN(t.segname, 16) - out.Write32(uint32(t.addr)) - out.Write32(uint32(t.size)) - out.Write32(t.off) - out.Write32(t.align) - out.Write32(t.reloc) - out.Write32(t.nreloc) - out.Write32(t.flag) - out.Write32(t.res1) /* reserved */ - out.Write32(t.res2) /* reserved */ - } - } - } - - for i := range load { - l := &load[i] - out.Write32(l.type_) - out.Write32(4 * (uint32(len(l.data)) + 2)) - for j := 0; j < len(l.data); j++ { - out.Write32(l.data[j]) - } - } - - return int(out.Offset() - o1) -} - -func (ctxt *Link) domacho() { - if *FlagD { - return - } - - // Copy platform load command. - for _, h := range hostobj { - load, err := hostobjMachoPlatform(&h) - if err != nil { - Exitf("%v", err) - } - if load != nil { - machoPlatform = load.platform - ml := newMachoLoad(ctxt.Arch, load.cmd.type_, uint32(len(load.cmd.data))) - copy(ml.data, load.cmd.data) - break - } - } - if machoPlatform == 0 { - switch ctxt.Arch.Family { - default: - machoPlatform = PLATFORM_MACOS - if ctxt.LinkMode == LinkInternal { - // For lldb, must say LC_VERSION_MIN_MACOSX or else - // it won't know that this Mach-O binary is from OS X - // (could be iOS or WatchOS instead). - // Go on iOS uses linkmode=external, and linkmode=external - // adds this itself. So we only need this code for linkmode=internal - // and we can assume OS X. - // - // See golang.org/issues/12941. - // - // The version must be at least 10.9; see golang.org/issues/30488. - ml := newMachoLoad(ctxt.Arch, LC_VERSION_MIN_MACOSX, 2) - ml.data[0] = 10<<16 | 9<<8 | 0<<0 // OS X version 10.9.0 - ml.data[1] = 10<<16 | 9<<8 | 0<<0 // SDK 10.9.0 - } - case sys.ARM, sys.ARM64: - machoPlatform = PLATFORM_IOS - } - } - - // empirically, string table must begin with " \x00". - s := ctxt.Syms.Lookup(".machosymstr", 0) - - s.Type = sym.SMACHOSYMSTR - s.Attr |= sym.AttrReachable - s.AddUint8(' ') - s.AddUint8('\x00') - - s = ctxt.Syms.Lookup(".machosymtab", 0) - s.Type = sym.SMACHOSYMTAB - s.Attr |= sym.AttrReachable - - if ctxt.LinkMode != LinkExternal { - s := ctxt.Syms.Lookup(".plt", 0) // will be __symbol_stub - s.Type = sym.SMACHOPLT - s.Attr |= sym.AttrReachable - - s = ctxt.Syms.Lookup(".got", 0) // will be __nl_symbol_ptr - s.Type = sym.SMACHOGOT - s.Attr |= sym.AttrReachable - s.Align = 4 - - s = ctxt.Syms.Lookup(".linkedit.plt", 0) // indirect table for .plt - s.Type = sym.SMACHOINDIRECTPLT - s.Attr |= sym.AttrReachable - - s = ctxt.Syms.Lookup(".linkedit.got", 0) // indirect table for .got - s.Type = sym.SMACHOINDIRECTGOT - s.Attr |= sym.AttrReachable - } - - // Add a dummy symbol that will become the __asm marker section. - if ctxt.LinkMode == LinkExternal { - s := ctxt.Syms.Lookup(".llvmasm", 0) - s.Type = sym.SMACHO - s.Attr |= sym.AttrReachable - s.AddUint8(0) - } -} - -func machoadddynlib(lib string, linkmode LinkMode) { - if seenlib[lib] || linkmode == LinkExternal { - return - } - seenlib[lib] = true - - // Will need to store the library name rounded up - // and 24 bytes of header metadata. If not enough - // space, grab another page of initial space at the - // beginning of the output file. - loadBudget -= (len(lib)+7)/8*8 + 24 - - if loadBudget < 0 { - HEADR += 4096 - *FlagTextAddr += 4096 - loadBudget += 4096 - } - - dylib = append(dylib, lib) -} - -func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string) { - buf := "__" + strings.Replace(sect.Name[1:], ".", "_", -1) - - var msect *MachoSect - if sect.Rwx&1 == 0 && segname != "__DWARF" && (ctxt.Arch.Family == sys.ARM64 || - ctxt.Arch.Family == sys.ARM || - (ctxt.Arch.Family == sys.AMD64 && ctxt.BuildMode != BuildModeExe)) { - // Darwin external linker on arm and arm64, and on amd64 in c-shared/c-archive buildmode - // complains about absolute relocs in __TEXT, so if the section is not - // executable, put it in __DATA segment. - msect = newMachoSect(mseg, buf, "__DATA") - } else { - msect = newMachoSect(mseg, buf, segname) - } - - if sect.Rellen > 0 { - msect.reloc = uint32(sect.Reloff) - msect.nreloc = uint32(sect.Rellen / 8) - } - - for 1< sect.Seg.Vaddr+sect.Seg.Filelen-sect.Vaddr { - Errorf(nil, "macho cannot represent section %s crossing data and bss", sect.Name) - } - msect.off = uint32(sect.Seg.Fileoff + sect.Vaddr - sect.Seg.Vaddr) - } else { - msect.off = 0 - msect.flag |= S_ZEROFILL - } - - if sect.Rwx&1 != 0 { - msect.flag |= S_ATTR_SOME_INSTRUCTIONS - } - - if sect.Name == ".text" { - msect.flag |= S_ATTR_PURE_INSTRUCTIONS - } - - if sect.Name == ".plt" { - msect.name = "__symbol_stub1" - msect.flag = S_ATTR_PURE_INSTRUCTIONS | S_ATTR_SOME_INSTRUCTIONS | S_SYMBOL_STUBS - msect.res1 = 0 //nkind[SymKindLocal]; - msect.res2 = 6 - } - - if sect.Name == ".got" { - msect.name = "__nl_symbol_ptr" - msect.flag = S_NON_LAZY_SYMBOL_POINTERS - msect.res1 = uint32(ctxt.Syms.Lookup(".linkedit.plt", 0).Size / 4) /* offset into indirect symbol table */ - } - - if sect.Name == ".init_array" { - msect.name = "__mod_init_func" - msect.flag = S_MOD_INIT_FUNC_POINTERS - } - - // Some platforms such as watchOS and tvOS require binaries with - // bitcode enabled. The Go toolchain can't output bitcode, so use - // a marker section in the __LLVM segment, "__asm", to tell the Apple - // toolchain that the Go text came from assembler and thus has no - // bitcode. This is not true, but Kotlin/Native, Rust and Flutter - // are also using this trick. - if sect.Name == ".llvmasm" { - msect.name = "__asm" - msect.segname = "__LLVM" - } - - if segname == "__DWARF" { - msect.flag |= S_ATTR_DEBUG - } -} - -func Asmbmacho(ctxt *Link) { - /* apple MACH */ - va := *FlagTextAddr - int64(HEADR) - - mh := getMachoHdr() - switch ctxt.Arch.Family { - default: - Exitf("unknown macho architecture: %v", ctxt.Arch.Family) - - case sys.ARM: - mh.cpu = MACHO_CPU_ARM - mh.subcpu = MACHO_SUBCPU_ARMV7 - - case sys.AMD64: - mh.cpu = MACHO_CPU_AMD64 - mh.subcpu = MACHO_SUBCPU_X86 - - case sys.ARM64: - mh.cpu = MACHO_CPU_ARM64 - mh.subcpu = MACHO_SUBCPU_ARM64_ALL - - case sys.I386: - mh.cpu = MACHO_CPU_386 - mh.subcpu = MACHO_SUBCPU_X86 - } - - var ms *MachoSeg - if ctxt.LinkMode == LinkExternal { - /* segment for entire file */ - ms = newMachoSeg("", 40) - - ms.fileoffset = Segtext.Fileoff - ms.filesize = Segdwarf.Fileoff + Segdwarf.Filelen - Segtext.Fileoff - ms.vsize = Segdwarf.Vaddr + Segdwarf.Length - Segtext.Vaddr - } - - /* segment for zero page */ - if ctxt.LinkMode != LinkExternal { - ms = newMachoSeg("__PAGEZERO", 0) - ms.vsize = uint64(va) - } - - /* text */ - v := Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound)) - - if ctxt.LinkMode != LinkExternal { - ms = newMachoSeg("__TEXT", 20) - ms.vaddr = uint64(va) - ms.vsize = uint64(v) - ms.fileoffset = 0 - ms.filesize = uint64(v) - ms.prot1 = 7 - ms.prot2 = 5 - } - - for _, sect := range Segtext.Sections { - machoshbits(ctxt, ms, sect, "__TEXT") - } - - /* data */ - if ctxt.LinkMode != LinkExternal { - w := int64(Segdata.Length) - ms = newMachoSeg("__DATA", 20) - ms.vaddr = uint64(va) + uint64(v) - ms.vsize = uint64(w) - ms.fileoffset = uint64(v) - ms.filesize = Segdata.Filelen - ms.prot1 = 3 - ms.prot2 = 3 - } - - for _, sect := range Segdata.Sections { - machoshbits(ctxt, ms, sect, "__DATA") - } - - /* dwarf */ - if !*FlagW { - if ctxt.LinkMode != LinkExternal { - ms = newMachoSeg("__DWARF", 20) - ms.vaddr = Segdwarf.Vaddr - ms.vsize = 0 - ms.fileoffset = Segdwarf.Fileoff - ms.filesize = Segdwarf.Filelen - } - for _, sect := range Segdwarf.Sections { - machoshbits(ctxt, ms, sect, "__DWARF") - } - } - - if ctxt.LinkMode != LinkExternal { - switch ctxt.Arch.Family { - default: - Exitf("unknown macho architecture: %v", ctxt.Arch.Family) - - case sys.ARM: - ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 17+2) - ml.data[0] = 1 /* thread type */ - ml.data[1] = 17 /* word count */ - ml.data[2+15] = uint32(Entryvalue(ctxt)) /* start pc */ - - case sys.AMD64: - ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 42+2) - ml.data[0] = 4 /* thread type */ - ml.data[1] = 42 /* word count */ - ml.data[2+32] = uint32(Entryvalue(ctxt)) /* start pc */ - ml.data[2+32+1] = uint32(Entryvalue(ctxt) >> 32) - - case sys.ARM64: - ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 68+2) - ml.data[0] = 6 /* thread type */ - ml.data[1] = 68 /* word count */ - ml.data[2+64] = uint32(Entryvalue(ctxt)) /* start pc */ - ml.data[2+64+1] = uint32(Entryvalue(ctxt) >> 32) - - case sys.I386: - ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 16+2) - ml.data[0] = 1 /* thread type */ - ml.data[1] = 16 /* word count */ - ml.data[2+10] = uint32(Entryvalue(ctxt)) /* start pc */ - } - } - - if !*FlagD { - // must match domacholink below - s1 := ctxt.Syms.Lookup(".machosymtab", 0) - s2 := ctxt.Syms.Lookup(".linkedit.plt", 0) - s3 := ctxt.Syms.Lookup(".linkedit.got", 0) - s4 := ctxt.Syms.Lookup(".machosymstr", 0) - - if ctxt.LinkMode != LinkExternal { - ms := newMachoSeg("__LINKEDIT", 0) - ms.vaddr = uint64(va) + uint64(v) + uint64(Rnd(int64(Segdata.Length), int64(*FlagRound))) - ms.vsize = uint64(s1.Size) + uint64(s2.Size) + uint64(s3.Size) + uint64(s4.Size) - ms.fileoffset = uint64(linkoff) - ms.filesize = ms.vsize - ms.prot1 = 7 - ms.prot2 = 3 - } - - ml := newMachoLoad(ctxt.Arch, LC_SYMTAB, 4) - ml.data[0] = uint32(linkoff) /* symoff */ - ml.data[1] = uint32(nsortsym) /* nsyms */ - ml.data[2] = uint32(linkoff + s1.Size + s2.Size + s3.Size) /* stroff */ - ml.data[3] = uint32(s4.Size) /* strsize */ - - machodysymtab(ctxt) - - if ctxt.LinkMode != LinkExternal { - ml := newMachoLoad(ctxt.Arch, LC_LOAD_DYLINKER, 6) - ml.data[0] = 12 /* offset to string */ - stringtouint32(ml.data[1:], "/usr/lib/dyld") - - for _, lib := range dylib { - ml = newMachoLoad(ctxt.Arch, LC_LOAD_DYLIB, 4+(uint32(len(lib))+1+7)/8*2) - ml.data[0] = 24 /* offset of string from beginning of load */ - ml.data[1] = 0 /* time stamp */ - ml.data[2] = 0 /* version */ - ml.data[3] = 0 /* compatibility version */ - stringtouint32(ml.data[4:], lib) - } - } - } - - a := machowrite(ctxt.Arch, ctxt.Out, ctxt.LinkMode) - if int32(a) > HEADR { - Exitf("HEADR too small: %d > %d", a, HEADR) - } -} - -func symkind(s *sym.Symbol) int { - if s.Type == sym.SDYNIMPORT { - return SymKindUndef - } - if s.Attr.CgoExport() { - return SymKindExtdef - } - return SymKindLocal -} - -func addsym(ctxt *Link, s *sym.Symbol, name string, type_ SymbolType, addr int64, gotype *sym.Symbol) { - if s == nil { - return - } - - switch type_ { - default: - return - - case DataSym, BSSSym, TextSym: - break - } - - if sortsym != nil { - sortsym[nsortsym] = s - nkind[symkind(s)]++ - } - - nsortsym++ -} - -type machoscmp []*sym.Symbol - -func (x machoscmp) Len() int { - return len(x) -} - -func (x machoscmp) Swap(i, j int) { - x[i], x[j] = x[j], x[i] -} - -func (x machoscmp) Less(i, j int) bool { - s1 := x[i] - s2 := x[j] - - k1 := symkind(s1) - k2 := symkind(s2) - if k1 != k2 { - return k1 < k2 - } - - return s1.Extname() < s2.Extname() -} - -func machogenasmsym(ctxt *Link) { - genasmsym(ctxt, addsym) - for _, s := range ctxt.Syms.Allsym { - // Some 64-bit functions have a "$INODE64" or "$INODE64$UNIX2003" suffix. - if s.Type == sym.SDYNIMPORT && s.Dynimplib() == "/usr/lib/libSystem.B.dylib" { - // But only on macOS. - if machoPlatform == PLATFORM_MACOS { - switch n := s.Extname(); n { - case "fdopendir": - switch objabi.GOARCH { - case "amd64": - s.SetExtname(n + "$INODE64") - case "386": - s.SetExtname(n + "$INODE64$UNIX2003") - } - case "readdir_r", "getfsstat": - switch objabi.GOARCH { - case "amd64", "386": - s.SetExtname(n + "$INODE64") - } - } - } - } - - if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ || s.Type == sym.SUNDEFEXT { - if s.Attr.Reachable() { - addsym(ctxt, s, "", DataSym, 0, nil) - } - } - } -} - -func machosymorder(ctxt *Link) { - // On Mac OS X Mountain Lion, we must sort exported symbols - // So we sort them here and pre-allocate dynid for them - // See https://golang.org/issue/4029 - for i := range dynexp { - dynexp[i].Attr |= sym.AttrReachable - } - machogenasmsym(ctxt) - sortsym = make([]*sym.Symbol, nsortsym) - nsortsym = 0 - machogenasmsym(ctxt) - sort.Sort(machoscmp(sortsym[:nsortsym])) - for i := 0; i < nsortsym; i++ { - sortsym[i].Dynid = int32(i) - } -} - -// machoShouldExport reports whether a symbol needs to be exported. -// -// When dynamically linking, all non-local variables and plugin-exported -// symbols need to be exported. -func machoShouldExport(ctxt *Link, s *sym.Symbol) bool { - if !ctxt.DynlinkingGo() || s.Attr.Local() { - return false - } - if ctxt.BuildMode == BuildModePlugin && strings.HasPrefix(s.Extname(), objabi.PathToPrefix(*flagPluginPath)) { - return true - } - if strings.HasPrefix(s.Name, "go.itab.") { - return true - } - if strings.HasPrefix(s.Name, "type.") && !strings.HasPrefix(s.Name, "type..") { - // reduce runtime typemap pressure, but do not - // export alg functions (type..*), as these - // appear in pclntable. - return true - } - if strings.HasPrefix(s.Name, "go.link.pkghash") { - return true - } - return s.Type >= sym.SFirstWritable // only writable sections -} - -func machosymtab(ctxt *Link) { - symtab := ctxt.Syms.Lookup(".machosymtab", 0) - symstr := ctxt.Syms.Lookup(".machosymstr", 0) - - for i := 0; i < nsortsym; i++ { - s := sortsym[i] - symtab.AddUint32(ctxt.Arch, uint32(symstr.Size)) - - export := machoShouldExport(ctxt, s) - isGoSymbol := strings.Contains(s.Extname(), ".") - - // In normal buildmodes, only add _ to C symbols, as - // Go symbols have dot in the name. - // - // Do not export C symbols in plugins, as runtime C - // symbols like crosscall2 are in pclntab and end up - // pointing at the host binary, breaking unwinding. - // See Issue #18190. - cexport := !isGoSymbol && (ctxt.BuildMode != BuildModePlugin || onlycsymbol(s)) - if cexport || export || isGoSymbol { - symstr.AddUint8('_') - } - - // replace "·" as ".", because DTrace cannot handle it. - Addstring(symstr, strings.Replace(s.Extname(), "·", ".", -1)) - - if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ || s.Type == sym.SUNDEFEXT { - symtab.AddUint8(0x01) // type N_EXT, external symbol - symtab.AddUint8(0) // no section - symtab.AddUint16(ctxt.Arch, 0) // desc - symtab.AddUintXX(ctxt.Arch, 0, ctxt.Arch.PtrSize) // no value - } else { - if s.Attr.CgoExport() || export { - symtab.AddUint8(0x0f) - } else { - symtab.AddUint8(0x0e) - } - o := s - for o.Outer != nil { - o = o.Outer - } - if o.Sect == nil { - Errorf(s, "missing section for symbol") - symtab.AddUint8(0) - } else { - symtab.AddUint8(uint8(o.Sect.Extnum)) - } - symtab.AddUint16(ctxt.Arch, 0) // desc - symtab.AddUintXX(ctxt.Arch, uint64(Symaddr(s)), ctxt.Arch.PtrSize) - } - } -} - -func machodysymtab(ctxt *Link) { - ml := newMachoLoad(ctxt.Arch, LC_DYSYMTAB, 18) - - n := 0 - ml.data[0] = uint32(n) /* ilocalsym */ - ml.data[1] = uint32(nkind[SymKindLocal]) /* nlocalsym */ - n += nkind[SymKindLocal] - - ml.data[2] = uint32(n) /* iextdefsym */ - ml.data[3] = uint32(nkind[SymKindExtdef]) /* nextdefsym */ - n += nkind[SymKindExtdef] - - ml.data[4] = uint32(n) /* iundefsym */ - ml.data[5] = uint32(nkind[SymKindUndef]) /* nundefsym */ - - ml.data[6] = 0 /* tocoffset */ - ml.data[7] = 0 /* ntoc */ - ml.data[8] = 0 /* modtaboff */ - ml.data[9] = 0 /* nmodtab */ - ml.data[10] = 0 /* extrefsymoff */ - ml.data[11] = 0 /* nextrefsyms */ - - // must match domacholink below - s1 := ctxt.Syms.Lookup(".machosymtab", 0) - - s2 := ctxt.Syms.Lookup(".linkedit.plt", 0) - s3 := ctxt.Syms.Lookup(".linkedit.got", 0) - ml.data[12] = uint32(linkoff + s1.Size) /* indirectsymoff */ - ml.data[13] = uint32((s2.Size + s3.Size) / 4) /* nindirectsyms */ - - ml.data[14] = 0 /* extreloff */ - ml.data[15] = 0 /* nextrel */ - ml.data[16] = 0 /* locreloff */ - ml.data[17] = 0 /* nlocrel */ -} - -func Domacholink(ctxt *Link) int64 { - machosymtab(ctxt) - - // write data that will be linkedit section - s1 := ctxt.Syms.Lookup(".machosymtab", 0) - - s2 := ctxt.Syms.Lookup(".linkedit.plt", 0) - s3 := ctxt.Syms.Lookup(".linkedit.got", 0) - s4 := ctxt.Syms.Lookup(".machosymstr", 0) - - // Force the linkedit section to end on a 16-byte - // boundary. This allows pure (non-cgo) Go binaries - // to be code signed correctly. - // - // Apple's codesign_allocate (a helper utility for - // the codesign utility) can do this fine itself if - // it is run on a dynamic Mach-O binary. However, - // when it is run on a pure (non-cgo) Go binary, where - // the linkedit section is mostly empty, it fails to - // account for the extra padding that it itself adds - // when adding the LC_CODE_SIGNATURE load command - // (which must be aligned on a 16-byte boundary). - // - // By forcing the linkedit section to end on a 16-byte - // boundary, codesign_allocate will not need to apply - // any alignment padding itself, working around the - // issue. - for s4.Size%16 != 0 { - s4.AddUint8(0) - } - - size := int(s1.Size + s2.Size + s3.Size + s4.Size) - - if size > 0 { - linkoff = Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound)) + Rnd(int64(Segdata.Filelen), int64(*FlagRound)) + Rnd(int64(Segdwarf.Filelen), int64(*FlagRound)) - ctxt.Out.SeekSet(linkoff) - - ctxt.Out.Write(s1.P[:s1.Size]) - ctxt.Out.Write(s2.P[:s2.Size]) - ctxt.Out.Write(s3.P[:s3.Size]) - ctxt.Out.Write(s4.P[:s4.Size]) - } - - return Rnd(int64(size), int64(*FlagRound)) -} - -func machorelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { - // If main section has no bits, nothing to relocate. - if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { - return - } - - sect.Reloff = uint64(ctxt.Out.Offset()) - for i, s := range syms { - if !s.Attr.Reachable() { - continue - } - if uint64(s.Value) >= sect.Vaddr { - syms = syms[i:] - break - } - } - - eaddr := int32(sect.Vaddr + sect.Length) - for _, s := range syms { - if !s.Attr.Reachable() { - continue - } - if s.Value >= int64(eaddr) { - break - } - for ri := range s.R { - r := &s.R[ri] - if r.Done { - continue - } - if r.Xsym == nil { - Errorf(s, "missing xsym in relocation") - continue - } - if !r.Xsym.Attr.Reachable() { - Errorf(s, "unreachable reloc %d (%s) target %v", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Xsym.Name) - } - if !thearch.Machoreloc1(ctxt.Arch, ctxt.Out, s, r, int64(uint64(s.Value+int64(r.Off))-sect.Vaddr)) { - Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Siz, r.Sym.Name) - } - } - } - - sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff -} - -func Machoemitreloc(ctxt *Link) { - for ctxt.Out.Offset()&7 != 0 { - ctxt.Out.Write8(0) - } - - machorelocsect(ctxt, Segtext.Sections[0], ctxt.Textp) - for _, sect := range Segtext.Sections[1:] { - machorelocsect(ctxt, sect, datap) - } - for _, sect := range Segdata.Sections { - machorelocsect(ctxt, sect, datap) - } - for _, sect := range Segdwarf.Sections { - machorelocsect(ctxt, sect, dwarfp) - } -} - -// hostobjMachoPlatform returns the first platform load command found -// in the host object, if any. -func hostobjMachoPlatform(h *Hostobj) (*MachoPlatformLoad, error) { - f, err := os.Open(h.file) - if err != nil { - return nil, fmt.Errorf("%s: failed to open host object: %v\n", h.file, err) - } - defer f.Close() - sr := io.NewSectionReader(f, h.off, h.length) - m, err := macho.NewFile(sr) - if err != nil { - // Not a valid Mach-O file. - return nil, nil - } - return peekMachoPlatform(m) -} - -// peekMachoPlatform returns the first LC_VERSION_MIN_* or LC_BUILD_VERSION -// load command found in the Mach-O file, if any. -func peekMachoPlatform(m *macho.File) (*MachoPlatformLoad, error) { - for _, cmd := range m.Loads { - raw := cmd.Raw() - ml := MachoLoad{ - type_: m.ByteOrder.Uint32(raw), - } - // Skip the type and command length. - data := raw[8:] - var p MachoPlatform - switch ml.type_ { - case LC_VERSION_MIN_IPHONEOS: - p = PLATFORM_IOS - case LC_VERSION_MIN_MACOSX: - p = PLATFORM_MACOS - case LC_VERSION_MIN_WATCHOS: - p = PLATFORM_WATCHOS - case LC_VERSION_MIN_TVOS: - p = PLATFORM_TVOS - case LC_BUILD_VERSION: - p = MachoPlatform(m.ByteOrder.Uint32(data)) - default: - continue - } - ml.data = make([]uint32, len(data)/4) - r := bytes.NewReader(data) - if err := binary.Read(r, m.ByteOrder, &ml.data); err != nil { - return nil, err - } - return &MachoPlatformLoad{ - platform: p, - cmd: ml, - }, nil - } - return nil, nil -} diff --git a/src/cmd/oldlink/internal/ld/macho_combine_dwarf.go b/src/cmd/oldlink/internal/ld/macho_combine_dwarf.go deleted file mode 100644 index 9d9f916b8e..0000000000 --- a/src/cmd/oldlink/internal/ld/macho_combine_dwarf.go +++ /dev/null @@ -1,462 +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 ld - -import ( - "bytes" - "compress/zlib" - "debug/macho" - "encoding/binary" - "fmt" - "io" - "os" - "reflect" - "unsafe" -) - -const ( - pageAlign = 12 // 4096 = 1 << 12 -) - -type loadCmd struct { - Cmd macho.LoadCmd - Len uint32 -} - -type dyldInfoCmd struct { - Cmd macho.LoadCmd - Len uint32 - RebaseOff, RebaseLen uint32 - BindOff, BindLen uint32 - WeakBindOff, WeakBindLen uint32 - LazyBindOff, LazyBindLen uint32 - ExportOff, ExportLen uint32 -} - -type linkEditDataCmd struct { - Cmd macho.LoadCmd - Len uint32 - DataOff, DataLen uint32 -} - -type encryptionInfoCmd struct { - Cmd macho.LoadCmd - Len uint32 - CryptOff, CryptLen uint32 - CryptId uint32 -} - -type loadCmdReader struct { - offset, next int64 - f *os.File - order binary.ByteOrder -} - -func (r *loadCmdReader) Next() (loadCmd, error) { - var cmd loadCmd - - r.offset = r.next - if _, err := r.f.Seek(r.offset, 0); err != nil { - return cmd, err - } - if err := binary.Read(r.f, r.order, &cmd); err != nil { - return cmd, err - } - r.next = r.offset + int64(cmd.Len) - return cmd, nil -} - -func (r loadCmdReader) ReadAt(offset int64, data interface{}) error { - if _, err := r.f.Seek(r.offset+offset, 0); err != nil { - return err - } - return binary.Read(r.f, r.order, data) -} - -func (r loadCmdReader) WriteAt(offset int64, data interface{}) error { - if _, err := r.f.Seek(r.offset+offset, 0); err != nil { - return err - } - return binary.Write(r.f, r.order, data) -} - -// machoCombineDwarf merges dwarf info generated by dsymutil into a macho executable. -// -// With internal linking, DWARF is embedded into the executable, this lets us do the -// same for external linking. -// exef is the file of the executable with no DWARF. It must have enough room in the macho -// header to add the DWARF sections. (Use ld's -headerpad option) -// exem is the macho representation of exef. -// dsym is the path to the macho file containing DWARF from dsymutil. -// outexe is the path where the combined executable should be saved. -func machoCombineDwarf(ctxt *Link, exef *os.File, exem *macho.File, dsym, outexe string) error { - dwarff, err := os.Open(dsym) - if err != nil { - return err - } - defer dwarff.Close() - outf, err := os.OpenFile(outexe, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755) - if err != nil { - return err - } - defer outf.Close() - dwarfm, err := macho.NewFile(dwarff) - if err != nil { - return err - } - defer dwarfm.Close() - - // The string table needs to be the last thing in the file - // for code signing to work. So we'll need to move the - // linkedit section, but all the others can be copied directly. - linkseg := exem.Segment("__LINKEDIT") - if linkseg == nil { - return fmt.Errorf("missing __LINKEDIT segment") - } - - if _, err := exef.Seek(0, 0); err != nil { - return err - } - if _, err := io.CopyN(outf, exef, int64(linkseg.Offset)); err != nil { - return err - } - - realdwarf := dwarfm.Segment("__DWARF") - if realdwarf == nil { - return fmt.Errorf("missing __DWARF segment") - } - - // Try to compress the DWARF sections. This includes some Apple - // proprietary sections like __apple_types. - compressedSects, compressedBytes, err := machoCompressSections(ctxt, dwarfm) - if err != nil { - return err - } - - // Now copy the dwarf data into the output. - // Kernel requires all loaded segments to be page-aligned in the file, - // even though we mark this one as being 0 bytes of virtual address space. - dwarfstart := machoCalcStart(realdwarf.Offset, linkseg.Offset, pageAlign) - if _, err := outf.Seek(dwarfstart, 0); err != nil { - return err - } - - if _, err := dwarff.Seek(int64(realdwarf.Offset), 0); err != nil { - return err - } - - // Write out the compressed sections, or the originals if we gave up - // on compressing them. - var dwarfsize uint64 - if compressedBytes != nil { - dwarfsize = uint64(len(compressedBytes)) - if _, err := outf.Write(compressedBytes); err != nil { - return err - } - } else { - if _, err := io.CopyN(outf, dwarff, int64(realdwarf.Filesz)); err != nil { - return err - } - dwarfsize = realdwarf.Filesz - } - - // And finally the linkedit section. - if _, err := exef.Seek(int64(linkseg.Offset), 0); err != nil { - return err - } - linkstart := machoCalcStart(linkseg.Offset, uint64(dwarfstart)+dwarfsize, pageAlign) - if _, err := outf.Seek(linkstart, 0); err != nil { - return err - } - if _, err := io.Copy(outf, exef); err != nil { - return err - } - - // Now we need to update the headers. - textsect := exem.Section("__text") - if textsect == nil { - return fmt.Errorf("missing __text section") - } - - cmdOffset := unsafe.Sizeof(exem.FileHeader) - if is64bit := exem.Magic == macho.Magic64; is64bit { - // mach_header_64 has one extra uint32. - cmdOffset += unsafe.Sizeof(exem.Magic) - } - dwarfCmdOffset := uint32(cmdOffset) + exem.FileHeader.Cmdsz - availablePadding := textsect.Offset - dwarfCmdOffset - if availablePadding < realdwarf.Len { - return fmt.Errorf("no room to add dwarf info. Need at least %d padding bytes, found %d", realdwarf.Len, availablePadding) - } - // First, copy the dwarf load command into the header. It will be - // updated later with new offsets and lengths as necessary. - if _, err := outf.Seek(int64(dwarfCmdOffset), 0); err != nil { - return err - } - if _, err := io.CopyN(outf, bytes.NewReader(realdwarf.Raw()), int64(realdwarf.Len)); err != nil { - return err - } - if _, err := outf.Seek(int64(unsafe.Offsetof(exem.FileHeader.Ncmd)), 0); err != nil { - return err - } - if err := binary.Write(outf, exem.ByteOrder, exem.Ncmd+1); err != nil { - return err - } - if err := binary.Write(outf, exem.ByteOrder, exem.Cmdsz+realdwarf.Len); err != nil { - return err - } - - reader := loadCmdReader{next: int64(cmdOffset), f: outf, order: exem.ByteOrder} - for i := uint32(0); i < exem.Ncmd; i++ { - cmd, err := reader.Next() - if err != nil { - return err - } - linkoffset := uint64(linkstart) - linkseg.Offset - switch cmd.Cmd { - case macho.LoadCmdSegment64: - err = machoUpdateSegment(reader, linkseg, linkoffset, &macho.Segment64{}, &macho.Section64{}) - case macho.LoadCmdSegment: - err = machoUpdateSegment(reader, linkseg, linkoffset, &macho.Segment32{}, &macho.Section32{}) - case LC_DYLD_INFO, LC_DYLD_INFO_ONLY: - err = machoUpdateLoadCommand(reader, linkseg, linkoffset, &dyldInfoCmd{}, "RebaseOff", "BindOff", "WeakBindOff", "LazyBindOff", "ExportOff") - case macho.LoadCmdSymtab: - err = machoUpdateLoadCommand(reader, linkseg, linkoffset, &macho.SymtabCmd{}, "Symoff", "Stroff") - case macho.LoadCmdDysymtab: - err = machoUpdateLoadCommand(reader, linkseg, linkoffset, &macho.DysymtabCmd{}, "Tocoffset", "Modtaboff", "Extrefsymoff", "Indirectsymoff", "Extreloff", "Locreloff") - case LC_CODE_SIGNATURE, LC_SEGMENT_SPLIT_INFO, LC_FUNCTION_STARTS, LC_DATA_IN_CODE, LC_DYLIB_CODE_SIGN_DRS: - err = machoUpdateLoadCommand(reader, linkseg, linkoffset, &linkEditDataCmd{}, "DataOff") - case LC_ENCRYPTION_INFO, LC_ENCRYPTION_INFO_64: - err = machoUpdateLoadCommand(reader, linkseg, linkoffset, &encryptionInfoCmd{}, "CryptOff") - case macho.LoadCmdDylib, macho.LoadCmdThread, macho.LoadCmdUnixThread, LC_PREBOUND_DYLIB, LC_UUID, LC_VERSION_MIN_MACOSX, LC_VERSION_MIN_IPHONEOS, LC_SOURCE_VERSION, LC_MAIN, LC_LOAD_DYLINKER, LC_LOAD_WEAK_DYLIB, LC_REEXPORT_DYLIB, LC_RPATH, LC_ID_DYLIB, LC_SYMSEG, LC_LOADFVMLIB, LC_IDFVMLIB, LC_IDENT, LC_FVMFILE, LC_PREPAGE, LC_ID_DYLINKER, LC_ROUTINES, LC_SUB_FRAMEWORK, LC_SUB_UMBRELLA, LC_SUB_CLIENT, LC_SUB_LIBRARY, LC_TWOLEVEL_HINTS, LC_PREBIND_CKSUM, LC_ROUTINES_64, LC_LAZY_LOAD_DYLIB, LC_LOAD_UPWARD_DYLIB, LC_DYLD_ENVIRONMENT, LC_LINKER_OPTION, LC_LINKER_OPTIMIZATION_HINT, LC_VERSION_MIN_TVOS, LC_VERSION_MIN_WATCHOS, LC_VERSION_NOTE, LC_BUILD_VERSION: - // Nothing to update - default: - err = fmt.Errorf("unknown load command 0x%x (%s)", int(cmd.Cmd), cmd.Cmd) - } - if err != nil { - return err - } - } - // Do the final update of the DWARF segment's load command. - return machoUpdateDwarfHeader(&reader, compressedSects, dwarfsize, dwarfstart, realdwarf) -} - -// machoCompressSections tries to compress the DWARF segments in dwarfm, -// returning the updated sections and segment contents, nils if the sections -// weren't compressed, or an error if there was a problem reading dwarfm. -func machoCompressSections(ctxt *Link, dwarfm *macho.File) ([]*macho.Section, []byte, error) { - if !ctxt.compressDWARF { - return nil, nil, nil - } - - dwarfseg := dwarfm.Segment("__DWARF") - var sects []*macho.Section - var buf bytes.Buffer - - for _, sect := range dwarfm.Sections { - if sect.Seg != "__DWARF" { - continue - } - - // As of writing, there are no relocations in dsymutil's output - // so there's no point in worrying about them. Bail out if that - // changes. - if sect.Nreloc != 0 { - return nil, nil, nil - } - - data, err := sect.Data() - if err != nil { - return nil, nil, err - } - - compressed, contents, err := machoCompressSection(data) - if err != nil { - return nil, nil, err - } - - newSec := *sect - newSec.Offset = uint32(dwarfseg.Offset) + uint32(buf.Len()) - newSec.Addr = dwarfseg.Addr + uint64(buf.Len()) - if compressed { - newSec.Name = "__z" + sect.Name[2:] - newSec.Size = uint64(len(contents)) - } - sects = append(sects, &newSec) - buf.Write(contents) - } - return sects, buf.Bytes(), nil -} - -// machoCompressSection compresses secBytes if it results in less data. -func machoCompressSection(sectBytes []byte) (compressed bool, contents []byte, err error) { - var buf bytes.Buffer - buf.WriteString("ZLIB") - var sizeBytes [8]byte - binary.BigEndian.PutUint64(sizeBytes[:], uint64(len(sectBytes))) - buf.Write(sizeBytes[:]) - - z := zlib.NewWriter(&buf) - if _, err := z.Write(sectBytes); err != nil { - return false, nil, err - } - if err := z.Close(); err != nil { - return false, nil, err - } - if buf.Len() >= len(sectBytes) { - return false, sectBytes, nil - } - return true, buf.Bytes(), nil -} - -// machoUpdateSegment updates the load command for a moved segment. -// Only the linkedit segment should move, and it should have 0 sections. -// seg should be a macho.Segment32 or macho.Segment64 as appropriate. -// sect should be a macho.Section32 or macho.Section64 as appropriate. -func machoUpdateSegment(r loadCmdReader, linkseg *macho.Segment, linkoffset uint64, seg, sect interface{}) error { - if err := r.ReadAt(0, seg); err != nil { - return err - } - segValue := reflect.ValueOf(seg) - offset := reflect.Indirect(segValue).FieldByName("Offset") - - // Only the linkedit segment moved, anything before that is fine. - if offset.Uint() < linkseg.Offset { - return nil - } - offset.SetUint(offset.Uint() + linkoffset) - if err := r.WriteAt(0, seg); err != nil { - return err - } - // There shouldn't be any sections, but just to make sure... - return machoUpdateSections(r, segValue, reflect.ValueOf(sect), linkoffset, nil) -} - -func machoUpdateSections(r loadCmdReader, seg, sect reflect.Value, deltaOffset uint64, compressedSects []*macho.Section) error { - iseg := reflect.Indirect(seg) - nsect := iseg.FieldByName("Nsect").Uint() - if nsect == 0 { - return nil - } - sectOffset := int64(iseg.Type().Size()) - - isect := reflect.Indirect(sect) - offsetField := isect.FieldByName("Offset") - reloffField := isect.FieldByName("Reloff") - addrField := isect.FieldByName("Addr") - nameField := isect.FieldByName("Name") - sizeField := isect.FieldByName("Size") - sectSize := int64(isect.Type().Size()) - for i := uint64(0); i < nsect; i++ { - if err := r.ReadAt(sectOffset, sect.Interface()); err != nil { - return err - } - if compressedSects != nil { - cSect := compressedSects[i] - var name [16]byte - copy(name[:], []byte(cSect.Name)) - nameField.Set(reflect.ValueOf(name)) - sizeField.SetUint(cSect.Size) - if cSect.Offset != 0 { - offsetField.SetUint(uint64(cSect.Offset) + deltaOffset) - } - if cSect.Addr != 0 { - addrField.SetUint(cSect.Addr) - } - } else { - if offsetField.Uint() != 0 { - offsetField.SetUint(offsetField.Uint() + deltaOffset) - } - if reloffField.Uint() != 0 { - reloffField.SetUint(reloffField.Uint() + deltaOffset) - } - if addrField.Uint() != 0 { - addrField.SetUint(addrField.Uint()) - } - } - if err := r.WriteAt(sectOffset, sect.Interface()); err != nil { - return err - } - sectOffset += sectSize - } - return nil -} - -// machoUpdateDwarfHeader updates the DWARF segment load command. -func machoUpdateDwarfHeader(r *loadCmdReader, compressedSects []*macho.Section, dwarfsize uint64, dwarfstart int64, realdwarf *macho.Segment) error { - var seg, sect interface{} - cmd, err := r.Next() - if err != nil { - return err - } - if cmd.Cmd == macho.LoadCmdSegment64 { - seg = new(macho.Segment64) - sect = new(macho.Section64) - } else { - seg = new(macho.Segment32) - sect = new(macho.Section32) - } - if err := r.ReadAt(0, seg); err != nil { - return err - } - segv := reflect.ValueOf(seg).Elem() - segv.FieldByName("Offset").SetUint(uint64(dwarfstart)) - - if compressedSects != nil { - var segSize uint64 - for _, newSect := range compressedSects { - segSize += newSect.Size - } - segv.FieldByName("Filesz").SetUint(segSize) - } else { - segv.FieldByName("Filesz").SetUint(dwarfsize) - } - - // We want the DWARF segment to be considered non-loadable, so - // force vmaddr and vmsize to zero. In addition, set the initial - // protection to zero so as to make the dynamic loader happy, - // since otherwise it may complain that that the vm size and file - // size don't match for the segment. See issues 21647 and 32673 - // for more context. Also useful to refer to the Apple dynamic - // loader source, specifically ImageLoaderMachO::sniffLoadCommands - // in ImageLoaderMachO.cpp (various versions can be found online, see - // https://opensource.apple.com/source/dyld/dyld-519.2.2/src/ImageLoaderMachO.cpp.auto.html - // as one example). - segv.FieldByName("Addr").SetUint(0) - segv.FieldByName("Memsz").SetUint(0) - segv.FieldByName("Prot").SetUint(0) - - if err := r.WriteAt(0, seg); err != nil { - return err - } - return machoUpdateSections(*r, segv, reflect.ValueOf(sect), uint64(dwarfstart)-realdwarf.Offset, compressedSects) -} - -func machoUpdateLoadCommand(r loadCmdReader, linkseg *macho.Segment, linkoffset uint64, cmd interface{}, fields ...string) error { - if err := r.ReadAt(0, cmd); err != nil { - return err - } - value := reflect.Indirect(reflect.ValueOf(cmd)) - - for _, name := range fields { - field := value.FieldByName(name) - if fieldval := field.Uint(); fieldval >= linkseg.Offset { - field.SetUint(fieldval + linkoffset) - } - } - if err := r.WriteAt(0, cmd); err != nil { - return err - } - return nil -} - -func machoCalcStart(origAddr, newAddr uint64, alignExp uint32) int64 { - align := uint64(1 << alignExp) - origMod, newMod := origAddr%align, newAddr%align - if origMod == newMod { - return int64(newAddr) - } - return int64(newAddr + align + origMod - newMod) -} diff --git a/src/cmd/oldlink/internal/ld/main.go b/src/cmd/oldlink/internal/ld/main.go deleted file mode 100644 index f7f3700398..0000000000 --- a/src/cmd/oldlink/internal/ld/main.go +++ /dev/null @@ -1,338 +0,0 @@ -// Inferno utils/6l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ld - -import ( - "bufio" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "flag" - "log" - "os" - "runtime" - "runtime/pprof" - "strings" -) - -var ( - pkglistfornote []byte - windowsgui bool // writes a "GUI binary" instead of a "console binary" - ownTmpDir bool // set to true if tmp dir created by linker (e.g. no -tmpdir) -) - -func init() { - flag.Var(&rpath, "r", "set the ELF dynamic linker search `path` to dir1:dir2:...") -} - -// Flags used by the linker. The exported flags are used by the architecture-specific packages. -var ( - flagBuildid = flag.String("buildid", "", "record `id` as Go toolchain build id") - - flagOutfile = flag.String("o", "", "write output to `file`") - flagPluginPath = flag.String("pluginpath", "", "full path name for plugin") - - flagInstallSuffix = flag.String("installsuffix", "", "set package directory `suffix`") - flagDumpDep = flag.Bool("dumpdep", false, "dump symbol dependency graph") - flagRace = flag.Bool("race", false, "enable race detector") - flagMsan = flag.Bool("msan", false, "enable MSan interface") - - flagFieldTrack = flag.String("k", "", "set field tracking `symbol`") - flagLibGCC = flag.String("libgcc", "", "compiler support lib for internal linking; use \"none\" to disable") - flagTmpdir = flag.String("tmpdir", "", "use `directory` for temporary files") - - flagExtld = flag.String("extld", "", "use `linker` when linking in external mode") - flagExtldflags = flag.String("extldflags", "", "pass `flags` to external linker") - flagExtar = flag.String("extar", "", "archive program for buildmode=c-archive") - - flagA = flag.Bool("a", false, "disassemble output") - FlagC = flag.Bool("c", false, "dump call graph") - FlagD = flag.Bool("d", false, "disable dynamic executable") - flagF = flag.Bool("f", false, "ignore version mismatch") - flagG = flag.Bool("g", false, "disable go package data checks") - flagH = flag.Bool("h", false, "halt on error") - flagN = flag.Bool("n", false, "dump symbol table") - FlagS = flag.Bool("s", false, "disable symbol table") - flagU = flag.Bool("u", false, "reject unsafe packages") - FlagW = flag.Bool("w", false, "disable DWARF generation") - Flag8 bool // use 64-bit addresses in symbol table - flagInterpreter = flag.String("I", "", "use `linker` as ELF dynamic linker") - FlagDebugTramp = flag.Int("debugtramp", 0, "debug trampolines") - FlagStrictDups = flag.Int("strictdups", 0, "sanity check duplicate symbol contents during object file reading (1=warn 2=err).") - flagNewobj = flag.Bool("newobj", false, "use new object file format") - - FlagRound = flag.Int("R", -1, "set address rounding `quantum`") - FlagTextAddr = flag.Int64("T", -1, "set text segment `address`") - flagEntrySymbol = flag.String("E", "", "set `entry` symbol name") - - 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`") -) - -// Main is the main entry point for the linker code. -func Main(arch *sys.Arch, theArch Arch) { - thearch = theArch - ctxt := linknew(arch) - ctxt.Bso = bufio.NewWriter(os.Stdout) - - // For testing behavior of go command when tools crash silently. - // Undocumented, not in standard flag parser to avoid - // exposing in usage message. - for _, arg := range os.Args { - if arg == "-crash_for_testing" { - os.Exit(2) - } - } - - final := gorootFinal() - addstrdata1(ctxt, "runtime/internal/sys.DefaultGoroot="+final) - addstrdata1(ctxt, "cmd/internal/objabi.defaultGOROOT="+final) - - // TODO(matloob): define these above and then check flag values here - if ctxt.Arch.Family == sys.AMD64 && objabi.GOOS == "plan9" { - flag.BoolVar(&Flag8, "8", false, "use 64-bit addresses in symbol table") - } - flagHeadType := flag.String("H", "", "set header `type`") - flag.BoolVar(&ctxt.linkShared, "linkshared", false, "link against installed Go shared libraries") - flag.Var(&ctxt.LinkMode, "linkmode", "set link `mode`") - flag.Var(&ctxt.BuildMode, "buildmode", "set build `mode`") - flag.BoolVar(&ctxt.compressDWARF, "compressdwarf", true, "compress DWARF if possible") - objabi.Flagfn1("B", "add an ELF NT_GNU_BUILD_ID `note` when using ELF", addbuildinfo) - objabi.Flagfn1("L", "add specified `directory` to library path", func(a string) { Lflag(ctxt, a) }) - objabi.AddVersionFlag() // -V - objabi.Flagfn1("X", "add string value `definition` of the form importpath.name=value", func(s string) { addstrdata1(ctxt, s) }) - objabi.Flagcount("v", "print link trace", &ctxt.Debugvlog) - objabi.Flagfn1("importcfg", "read import configuration from `file`", ctxt.readImportCfg) - - objabi.Flagparse(usage) - - switch *flagHeadType { - case "": - case "windowsgui": - ctxt.HeadType = objabi.Hwindows - windowsgui = true - default: - if err := ctxt.HeadType.Set(*flagHeadType); err != nil { - Errorf(nil, "%v", err) - usage() - } - } - - if objabi.Fieldtrack_enabled != 0 { - ctxt.Reachparent = make(map[*sym.Symbol]*sym.Symbol) - } - checkStrictDups = *FlagStrictDups - - startProfile() - if ctxt.BuildMode == BuildModeUnset { - ctxt.BuildMode = BuildModeExe - } - - if ctxt.BuildMode != BuildModeShared && flag.NArg() != 1 { - usage() - } - - if *flagOutfile == "" { - *flagOutfile = "a.out" - if ctxt.HeadType == objabi.Hwindows { - *flagOutfile += ".exe" - } - } - - interpreter = *flagInterpreter - - libinit(ctxt) // creates outfile - - if ctxt.HeadType == objabi.Hunknown { - ctxt.HeadType.Set(objabi.GOOS) - } - - ctxt.computeTLSOffset() - thearch.Archinit(ctxt) - - if ctxt.linkShared && !ctxt.IsELF { - Exitf("-linkshared can only be used on elf systems") - } - - if ctxt.Debugvlog != 0 { - ctxt.Logf("HEADER = -H%d -T0x%x -R0x%x\n", ctxt.HeadType, uint64(*FlagTextAddr), uint32(*FlagRound)) - } - - switch ctxt.BuildMode { - case BuildModeShared: - for i := 0; i < flag.NArg(); i++ { - arg := flag.Arg(i) - parts := strings.SplitN(arg, "=", 2) - var pkgpath, file string - if len(parts) == 1 { - pkgpath, file = "main", arg - } else { - pkgpath, file = parts[0], parts[1] - } - pkglistfornote = append(pkglistfornote, pkgpath...) - pkglistfornote = append(pkglistfornote, '\n') - addlibpath(ctxt, "command line", "command line", file, pkgpath, "") - } - case BuildModePlugin: - addlibpath(ctxt, "command line", "command line", flag.Arg(0), *flagPluginPath, "") - default: - addlibpath(ctxt, "command line", "command line", flag.Arg(0), "main", "") - } - ctxt.loadlib() - - deadcode(ctxt) - if *flagNewobj { - ctxt.loadlibfull() // XXX do it here for now - } - ctxt.linksetup() - ctxt.dostrdata() - - dwarfGenerateDebugInfo(ctxt) - if objabi.Fieldtrack_enabled != 0 { - fieldtrack(ctxt) - } - ctxt.mangleTypeSym() - ctxt.callgraph() - - ctxt.doelf() - if ctxt.HeadType == objabi.Hdarwin { - ctxt.domacho() - } - ctxt.dostkcheck() - if ctxt.HeadType == objabi.Hwindows { - ctxt.dope() - ctxt.windynrelocsyms() - } - if ctxt.HeadType == objabi.Haix { - ctxt.doxcoff() - } - - ctxt.addexport() - thearch.Gentext(ctxt) // trampolines, call stubs, etc. - ctxt.textbuildid() - ctxt.textaddress() - ctxt.pclntab() - ctxt.findfunctab() - ctxt.typelink() - ctxt.symtab() - ctxt.buildinfo() - ctxt.dodata() - order := ctxt.address() - dwarfcompress(ctxt) - filesize := ctxt.layout(order) - - // Write out the output file. - // It is split into two parts (Asmb and Asmb2). The first - // part writes most of the content (sections and segments), - // for which we have computed the size and offset, in a - // mmap'd region. The second part writes more content, for - // which we don't know the size. - var outputMmapped bool - if ctxt.Arch.Family != sys.Wasm { - // Don't mmap if we're building for Wasm. Wasm file - // layout is very different so filesize is meaningless. - err := ctxt.Out.Mmap(filesize) - outputMmapped = err == nil - } - if outputMmapped { - // Asmb will redirect symbols to the output file mmap, and relocations - // will be applied directly there. - thearch.Asmb(ctxt) - ctxt.reloc() - ctxt.Out.Munmap() - } else { - // If we don't mmap, we need to apply relocations before - // writing out. - ctxt.reloc() - thearch.Asmb(ctxt) - } - thearch.Asmb2(ctxt) - - ctxt.undef() - ctxt.hostlink() - if ctxt.Debugvlog != 0 { - ctxt.Logf("%d symbols\n", len(ctxt.Syms.Allsym)) - ctxt.Logf("%d liveness data\n", liveness) - } - ctxt.Bso.Flush() - ctxt.archive() - - errorexit() -} - -type Rpath struct { - set bool - val string -} - -func (r *Rpath) Set(val string) error { - r.set = true - r.val = val - return nil -} - -func (r *Rpath) String() string { - return r.val -} - -func startProfile() { - if *cpuprofile != "" { - f, err := os.Create(*cpuprofile) - if err != nil { - log.Fatalf("%v", err) - } - if err := pprof.StartCPUProfile(f); err != nil { - log.Fatalf("%v", err) - } - AtExit(pprof.StopCPUProfile) - } - if *memprofile != "" { - if *memprofilerate != 0 { - runtime.MemProfileRate = int(*memprofilerate) - } - f, err := os.Create(*memprofile) - if err != nil { - log.Fatalf("%v", err) - } - AtExit(func() { - // Profile all outstanding allocations. - runtime.GC() - // compilebench parses the memory profile to extract memstats, - // which are only written in the legacy pprof format. - // See golang.org/issue/18641 and runtime/pprof/pprof.go:writeHeap. - const writeLegacyFormat = 1 - if err := pprof.Lookup("heap").WriteTo(f, writeLegacyFormat); err != nil { - log.Fatalf("%v", err) - } - }) - } -} diff --git a/src/cmd/oldlink/internal/ld/outbuf.go b/src/cmd/oldlink/internal/ld/outbuf.go deleted file mode 100644 index 596d2395c8..0000000000 --- a/src/cmd/oldlink/internal/ld/outbuf.go +++ /dev/null @@ -1,177 +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 ld - -import ( - "bufio" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "encoding/binary" - "log" - "os" -) - -// OutBuf is a buffered file writer. -// -// It is simlar to the Writer in cmd/internal/bio with a few small differences. -// -// First, it tracks the output architecture and uses it to provide -// endian helpers. -// -// Second, it provides a very cheap offset counter that doesn't require -// any system calls to read the value. -// -// It also mmaps the output file (if available). The intended usage is: -// - Mmap the output file -// - Write the content -// - possibly apply any edits in the output buffer -// - Munmap the output file -// - possibly write more content to the file, which will not be edited later. -type OutBuf struct { - arch *sys.Arch - off int64 - w *bufio.Writer - buf []byte // backing store of mmap'd output file - f *os.File - encbuf [8]byte // temp buffer used by WriteN methods -} - -func (out *OutBuf) SeekSet(p int64) { - if p == out.off { - return - } - if out.buf == nil { - out.Flush() - if _, err := out.f.Seek(p, 0); err != nil { - Exitf("seeking to %d in %s: %v", p, out.f.Name(), err) - } - } - out.off = p -} - -func (out *OutBuf) Offset() int64 { - return out.off -} - -// Write writes the contents of v to the buffer. -// -// As Write is backed by a bufio.Writer, callers do not have -// to explicitly handle the returned error as long as Flush is -// eventually called. -func (out *OutBuf) Write(v []byte) (int, error) { - if out.buf != nil { - n := copy(out.buf[out.off:], v) - out.off += int64(n) - return n, nil - } - n, err := out.w.Write(v) - out.off += int64(n) - return n, err -} - -func (out *OutBuf) Write8(v uint8) { - if out.buf != nil { - out.buf[out.off] = v - out.off++ - return - } - if err := out.w.WriteByte(v); err == nil { - out.off++ - } -} - -// WriteByte is an alias for Write8 to fulfill the io.ByteWriter interface. -func (out *OutBuf) WriteByte(v byte) error { - out.Write8(v) - return nil -} - -func (out *OutBuf) Write16(v uint16) { - out.arch.ByteOrder.PutUint16(out.encbuf[:], v) - out.Write(out.encbuf[:2]) -} - -func (out *OutBuf) Write32(v uint32) { - out.arch.ByteOrder.PutUint32(out.encbuf[:], v) - out.Write(out.encbuf[:4]) -} - -func (out *OutBuf) Write32b(v uint32) { - binary.BigEndian.PutUint32(out.encbuf[:], v) - out.Write(out.encbuf[:4]) -} - -func (out *OutBuf) Write64(v uint64) { - out.arch.ByteOrder.PutUint64(out.encbuf[:], v) - out.Write(out.encbuf[:8]) -} - -func (out *OutBuf) Write64b(v uint64) { - binary.BigEndian.PutUint64(out.encbuf[:], v) - out.Write(out.encbuf[:8]) -} - -func (out *OutBuf) WriteString(s string) { - if out.buf != nil { - n := copy(out.buf[out.off:], s) - if n != len(s) { - log.Fatalf("WriteString truncated. buffer size: %d, offset: %d, len(s)=%d", len(out.buf), out.off, len(s)) - } - out.off += int64(n) - return - } - n, _ := out.w.WriteString(s) - out.off += int64(n) -} - -// WriteStringN writes the first n bytes of s. -// If n is larger than len(s) then it is padded with zero bytes. -func (out *OutBuf) WriteStringN(s string, n int) { - out.WriteStringPad(s, n, zeros[:]) -} - -// WriteStringPad writes the first n bytes of s. -// If n is larger than len(s) then it is padded with the bytes in pad (repeated as needed). -func (out *OutBuf) WriteStringPad(s string, n int, pad []byte) { - if len(s) >= n { - out.WriteString(s[:n]) - } else { - out.WriteString(s) - n -= len(s) - for n > len(pad) { - out.Write(pad) - n -= len(pad) - - } - out.Write(pad[:n]) - } -} - -// WriteSym writes the content of a Symbol, then changes the Symbol's content -// to point to the output buffer that we just wrote, so we can apply further -// edit to the symbol content. -// If the output file is not Mmap'd, just writes the content. -func (out *OutBuf) WriteSym(s *sym.Symbol) { - if out.buf != nil { - start := out.off - out.Write(s.P) - s.P = out.buf[start:out.off] - s.Attr.Set(sym.AttrReadOnly, false) - } else { - out.Write(s.P) - } -} - -func (out *OutBuf) Flush() { - var err error - if out.buf != nil { - err = out.Msync() - } else { - err = out.w.Flush() - } - if err != nil { - Exitf("flushing %s: %v", out.f.Name(), err) - } -} diff --git a/src/cmd/oldlink/internal/ld/outbuf_mmap.go b/src/cmd/oldlink/internal/ld/outbuf_mmap.go deleted file mode 100644 index 4075141171..0000000000 --- a/src/cmd/oldlink/internal/ld/outbuf_mmap.go +++ /dev/null @@ -1,44 +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. - -// +build darwin dragonfly freebsd linux openbsd - -package ld - -import ( - "syscall" - "unsafe" -) - -func (out *OutBuf) Mmap(filesize uint64) error { - err := out.f.Truncate(int64(filesize)) - if err != nil { - Exitf("resize output file failed: %v", err) - } - out.buf, err = syscall.Mmap(int(out.f.Fd()), 0, int(filesize), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED|syscall.MAP_FILE) - return err -} - -func (out *OutBuf) Munmap() { - err := out.Msync() - if err != nil { - Exitf("msync output file failed: %v", err) - } - syscall.Munmap(out.buf) - out.buf = nil - _, err = out.f.Seek(out.off, 0) - if err != nil { - Exitf("seek output file failed: %v", err) - } -} - -func (out *OutBuf) Msync() error { - // TODO: netbsd supports mmap and msync, but the syscall package doesn't define MSYNC. - // It is excluded from the build tag for now. - _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(&out.buf[0])), uintptr(len(out.buf)), syscall.MS_SYNC) - if errno != 0 { - return errno - } - return nil -} diff --git a/src/cmd/oldlink/internal/ld/outbuf_nommap.go b/src/cmd/oldlink/internal/ld/outbuf_nommap.go deleted file mode 100644 index fba8cd8bc4..0000000000 --- a/src/cmd/oldlink/internal/ld/outbuf_nommap.go +++ /dev/null @@ -1,15 +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. - -// +build !darwin,!dragonfly,!freebsd,!linux,!openbsd,!windows - -package ld - -import "errors" - -var errNotSupported = errors.New("mmap not supported") - -func (out *OutBuf) Mmap(filesize uint64) error { return errNotSupported } -func (out *OutBuf) Munmap() { panic("unreachable") } -func (out *OutBuf) Msync() error { panic("unreachable") } diff --git a/src/cmd/oldlink/internal/ld/outbuf_windows.go b/src/cmd/oldlink/internal/ld/outbuf_windows.go deleted file mode 100644 index 1cb05c301f..0000000000 --- a/src/cmd/oldlink/internal/ld/outbuf_windows.go +++ /dev/null @@ -1,49 +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 ld - -import ( - "reflect" - "syscall" - "unsafe" -) - -func (out *OutBuf) Mmap(filesize uint64) error { - err := out.f.Truncate(int64(filesize)) - if err != nil { - Exitf("resize output file failed: %v", err) - } - - low, high := uint32(filesize), uint32(filesize>>32) - fmap, err := syscall.CreateFileMapping(syscall.Handle(out.f.Fd()), nil, syscall.PAGE_READONLY, high, low, nil) - if err != nil { - return err - } - defer syscall.CloseHandle(fmap) - - ptr, err := syscall.MapViewOfFile(fmap, syscall.FILE_MAP_READ|syscall.FILE_MAP_WRITE, 0, 0, uintptr(filesize)) - if err != nil { - return err - } - *(*reflect.SliceHeader)(unsafe.Pointer(&out.buf)) = reflect.SliceHeader{Data: ptr, Len: int(filesize), Cap: int(filesize)} - return nil -} - -func (out *OutBuf) Munmap() { - if out.buf == nil { - return - } - err := syscall.UnmapViewOfFile(uintptr(unsafe.Pointer(&out.buf[0]))) - if err != nil { - Exitf("UnmapViewOfFile failed: %v", err) - } -} - -func (out *OutBuf) Msync() error { - if out.buf == nil { - return nil - } - return syscall.FlushViewOfFile(uintptr(unsafe.Pointer(&out.buf[0])), 0) -} diff --git a/src/cmd/oldlink/internal/ld/pcln.go b/src/cmd/oldlink/internal/ld/pcln.go deleted file mode 100644 index 7d53ab8ad4..0000000000 --- a/src/cmd/oldlink/internal/ld/pcln.go +++ /dev/null @@ -1,530 +0,0 @@ -// Copyright 2013 The Go Authors. 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/obj" - "cmd/internal/objabi" - "cmd/internal/src" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "encoding/binary" - "fmt" - "log" - "os" - "path/filepath" - "strings" -) - -func ftabaddstring(ftab *sym.Symbol, s string) int32 { - start := len(ftab.P) - ftab.Grow(int64(start + len(s) + 1)) // make room for s plus trailing NUL - copy(ftab.P[start:], s) - return int32(start) -} - -// numberfile assigns a file number to the file if it hasn't been assigned already. -func numberfile(ctxt *Link, file *sym.Symbol) { - if file.Type != sym.SFILEPATH { - ctxt.Filesyms = append(ctxt.Filesyms, file) - file.Value = int64(len(ctxt.Filesyms)) - file.Type = sym.SFILEPATH - path := file.Name[len(src.FileSymPrefix):] - file.Name = expandGoroot(path) - } -} - -func renumberfiles(ctxt *Link, files []*sym.Symbol, d *sym.Pcdata) { - // Give files numbers. - for _, f := range files { - numberfile(ctxt, f) - } - - buf := make([]byte, binary.MaxVarintLen32) - newval := int32(-1) - var out sym.Pcdata - it := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) - for it.Init(d.P); !it.Done; it.Next() { - // value delta - oldval := it.Value - - var val int32 - if oldval == -1 { - val = -1 - } else { - if oldval < 0 || oldval >= int32(len(files)) { - log.Fatalf("bad pcdata %d", oldval) - } - val = int32(files[oldval].Value) - } - - dv := val - newval - newval = val - - // value - n := binary.PutVarint(buf, int64(dv)) - out.P = append(out.P, buf[:n]...) - - // pc delta - pc := (it.NextPC - it.PC) / it.PCScale - n = binary.PutUvarint(buf, uint64(pc)) - out.P = append(out.P, buf[:n]...) - } - - // terminating value delta - // we want to write varint-encoded 0, which is just 0 - out.P = append(out.P, 0) - - *d = out -} - -// onlycsymbol reports whether this is a symbol that is referenced by C code. -func onlycsymbol(s *sym.Symbol) bool { - switch s.Name { - case "_cgo_topofstack", "__cgo_topofstack", "_cgo_panic", "crosscall2": - return true - } - if strings.HasPrefix(s.Name, "_cgoexp_") { - return true - } - return false -} - -func emitPcln(ctxt *Link, s *sym.Symbol) bool { - if s == nil { - return true - } - if ctxt.BuildMode == BuildModePlugin && ctxt.HeadType == objabi.Hdarwin && onlycsymbol(s) { - return false - } - // We want to generate func table entries only for the "lowest level" symbols, - // not containers of subsymbols. - return !s.Attr.Container() -} - -// pclntab initializes the pclntab symbol with -// runtime function and file name information. - -var pclntabZpcln sym.FuncInfo - -// These variables are used to initialize runtime.firstmoduledata, see symtab.go:symtab. -var pclntabNfunc int32 -var pclntabFiletabOffset int32 -var pclntabPclntabOffset int32 -var pclntabFirstFunc *sym.Symbol -var pclntabLastFunc *sym.Symbol - -func (ctxt *Link) pclntab() { - funcdataBytes := int64(0) - ftab := ctxt.Syms.Lookup("runtime.pclntab", 0) - ftab.Type = sym.SPCLNTAB - ftab.Attr |= sym.AttrReachable - - // See golang.org/s/go12symtab for the format. Briefly: - // 8-byte header - // nfunc [thearch.ptrsize bytes] - // function table, alternating PC and offset to func struct [each entry thearch.ptrsize bytes] - // end PC [thearch.ptrsize bytes] - // offset to file table [4 bytes] - - // Find container symbols and mark them as such. - for _, s := range ctxt.Textp { - if s.Outer != nil { - s.Outer.Attr |= sym.AttrContainer - } - } - - // Gather some basic stats and info. - var nfunc int32 - prevSect := ctxt.Textp[0].Sect - for _, s := range ctxt.Textp { - if !emitPcln(ctxt, s) { - continue - } - nfunc++ - if pclntabFirstFunc == nil { - pclntabFirstFunc = s - } - if s.Sect != prevSect { - // With multiple text sections, the external linker may insert functions - // between the sections, which are not known by Go. This leaves holes in - // the PC range covered by the func table. We need to generate an entry - // to mark the hole. - nfunc++ - prevSect = s.Sect - } - } - - pclntabNfunc = nfunc - ftab.Grow(8 + int64(ctxt.Arch.PtrSize) + int64(nfunc)*2*int64(ctxt.Arch.PtrSize) + int64(ctxt.Arch.PtrSize) + 4) - ftab.SetUint32(ctxt.Arch, 0, 0xfffffffb) - ftab.SetUint8(ctxt.Arch, 6, uint8(ctxt.Arch.MinLC)) - ftab.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize)) - ftab.SetUint(ctxt.Arch, 8, uint64(nfunc)) - pclntabPclntabOffset = int32(8 + ctxt.Arch.PtrSize) - - funcnameoff := make(map[string]int32) - nameToOffset := func(name string) int32 { - nameoff, ok := funcnameoff[name] - if !ok { - nameoff = ftabaddstring(ftab, name) - funcnameoff[name] = nameoff - } - return nameoff - } - - pctaboff := make(map[string]uint32) - writepctab := func(off int32, p []byte) int32 { - start, ok := pctaboff[string(p)] - if !ok { - if len(p) > 0 { - start = uint32(len(ftab.P)) - ftab.AddBytes(p) - } - pctaboff[string(p)] = start - } - newoff := int32(ftab.SetUint32(ctxt.Arch, int64(off), start)) - return newoff - } - - nfunc = 0 // repurpose nfunc as a running index - prevFunc := ctxt.Textp[0] - for _, s := range ctxt.Textp { - if !emitPcln(ctxt, s) { - continue - } - - if s.Sect != prevFunc.Sect { - // With multiple text sections, there may be a hole here in the address - // space (see the comment above). We use an invalid funcoff value to - // mark the hole. - // See also runtime/symtab.go:findfunc - ftab.SetAddrPlus(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), prevFunc, prevFunc.Size) - ftab.SetUint(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), ^uint64(0)) - nfunc++ - } - prevFunc = s - - pcln := s.FuncInfo - if pcln == nil { - pcln = &pclntabZpcln - } - - if len(pcln.InlTree) > 0 { - if len(pcln.Pcdata) <= objabi.PCDATA_InlTreeIndex { - // Create inlining pcdata table. - pcdata := make([]sym.Pcdata, objabi.PCDATA_InlTreeIndex+1) - copy(pcdata, pcln.Pcdata) - pcln.Pcdata = pcdata - } - - if len(pcln.Funcdataoff) <= objabi.FUNCDATA_InlTree { - // Create inline tree funcdata. - funcdata := make([]*sym.Symbol, objabi.FUNCDATA_InlTree+1) - funcdataoff := make([]int64, objabi.FUNCDATA_InlTree+1) - copy(funcdata, pcln.Funcdata) - copy(funcdataoff, pcln.Funcdataoff) - pcln.Funcdata = funcdata - pcln.Funcdataoff = funcdataoff - } - } - - funcstart := int32(len(ftab.P)) - funcstart += int32(-len(ftab.P)) & (int32(ctxt.Arch.PtrSize) - 1) // align to ptrsize - - ftab.SetAddr(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), s) - ftab.SetUint(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint64(funcstart)) - - // Write runtime._func. Keep in sync with ../../../../runtime/runtime2.go:/_func - // and package debug/gosym. - - // fixed size of struct, checked below - off := funcstart - - end := funcstart + int32(ctxt.Arch.PtrSize) + 3*4 + 5*4 + int32(len(pcln.Pcdata))*4 + int32(len(pcln.Funcdata))*int32(ctxt.Arch.PtrSize) - if len(pcln.Funcdata) > 0 && (end&int32(ctxt.Arch.PtrSize-1) != 0) { - end += 4 - } - ftab.Grow(int64(end)) - - // entry uintptr - off = int32(ftab.SetAddr(ctxt.Arch, int64(off), s)) - - // name int32 - nameoff := nameToOffset(s.Name) - off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(nameoff))) - - // args int32 - // TODO: Move into funcinfo. - args := uint32(0) - if s.FuncInfo != nil { - args = uint32(s.FuncInfo.Args) - } - off = int32(ftab.SetUint32(ctxt.Arch, int64(off), args)) - - // deferreturn - deferreturn := uint32(0) - lastWasmAddr := uint32(0) - for _, r := range s.R { - if ctxt.Arch.Family == sys.Wasm && r.Type == objabi.R_ADDR { - // Wasm does not have a live variable set at the deferreturn - // call itself. Instead it has one identified by the - // resumption point immediately preceding the deferreturn. - // The wasm code has a R_ADDR relocation which is used to - // set the resumption point to PC_B. - lastWasmAddr = uint32(r.Add) - } - if r.Type.IsDirectCall() && r.Sym != nil && r.Sym.Name == "runtime.deferreturn" { - if ctxt.Arch.Family == sys.Wasm { - deferreturn = lastWasmAddr - 1 - } else { - // Note: the relocation target is in the call instruction, but - // is not necessarily the whole instruction (for instance, on - // x86 the relocation applies to bytes [1:5] of the 5 byte call - // instruction). - deferreturn = uint32(r.Off) - switch ctxt.Arch.Family { - case sys.AMD64, sys.I386: - deferreturn-- - case sys.PPC64, sys.ARM, sys.ARM64, sys.MIPS, sys.MIPS64: - // no change - case sys.RISCV64: - // TODO(jsing): The JALR instruction is marked with - // R_CALLRISCV, whereas the actual reloc is currently - // one instruction earlier starting with the AUIPC. - deferreturn -= 4 - case sys.S390X: - deferreturn -= 2 - default: - panic(fmt.Sprint("Unhandled architecture:", ctxt.Arch.Family)) - } - } - break // only need one - } - } - off = int32(ftab.SetUint32(ctxt.Arch, int64(off), deferreturn)) - - if pcln != &pclntabZpcln { - renumberfiles(ctxt, pcln.File, &pcln.Pcfile) - if false { - // Sanity check the new numbering - it := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) - for it.Init(pcln.Pcfile.P); !it.Done; it.Next() { - if it.Value < 1 || it.Value > int32(len(ctxt.Filesyms)) { - Errorf(s, "bad file number in pcfile: %d not in range [1, %d]\n", it.Value, len(ctxt.Filesyms)) - errorexit() - } - } - } - } - - if len(pcln.InlTree) > 0 { - inlTreeSym := ctxt.Syms.Lookup("inltree."+s.Name, 0) - inlTreeSym.Type = sym.SRODATA - inlTreeSym.Attr |= sym.AttrReachable | sym.AttrDuplicateOK - - for i, call := range pcln.InlTree { - // Usually, call.File is already numbered since the file - // shows up in the Pcfile table. However, two inlined calls - // might overlap exactly so that only the innermost file - // appears in the Pcfile table. In that case, this assigns - // the outer file a number. - numberfile(ctxt, call.File) - nameoff := nameToOffset(call.Func) - - inlTreeSym.SetUint16(ctxt.Arch, int64(i*20+0), uint16(call.Parent)) - inlTreeSym.SetUint8(ctxt.Arch, int64(i*20+2), uint8(objabi.GetFuncID(call.Func, ""))) - // byte 3 is unused - inlTreeSym.SetUint32(ctxt.Arch, int64(i*20+4), uint32(call.File.Value)) - inlTreeSym.SetUint32(ctxt.Arch, int64(i*20+8), uint32(call.Line)) - inlTreeSym.SetUint32(ctxt.Arch, int64(i*20+12), uint32(nameoff)) - inlTreeSym.SetUint32(ctxt.Arch, int64(i*20+16), uint32(call.ParentPC)) - } - - pcln.Funcdata[objabi.FUNCDATA_InlTree] = inlTreeSym - pcln.Pcdata[objabi.PCDATA_InlTreeIndex] = pcln.Pcinline - } - - // pcdata - off = writepctab(off, pcln.Pcsp.P) - off = writepctab(off, pcln.Pcfile.P) - off = writepctab(off, pcln.Pcline.P) - off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(len(pcln.Pcdata)))) - - // funcID uint8 - var file string - if s.FuncInfo != nil && len(s.FuncInfo.File) > 0 { - file = s.FuncInfo.File[0].Name - } - funcID := objabi.GetFuncID(s.Name, file) - - off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(funcID))) - - // unused - off += 2 - - // nfuncdata must be the final entry. - off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(len(pcln.Funcdata)))) - for i := range pcln.Pcdata { - off = writepctab(off, pcln.Pcdata[i].P) - } - - // funcdata, must be pointer-aligned and we're only int32-aligned. - // Missing funcdata will be 0 (nil pointer). - if len(pcln.Funcdata) > 0 { - if off&int32(ctxt.Arch.PtrSize-1) != 0 { - off += 4 - } - for i := range pcln.Funcdata { - dataoff := int64(off) + int64(ctxt.Arch.PtrSize)*int64(i) - if pcln.Funcdata[i] == nil { - ftab.SetUint(ctxt.Arch, dataoff, uint64(pcln.Funcdataoff[i])) - continue - } - // TODO: Dedup. - funcdataBytes += pcln.Funcdata[i].Size - ftab.SetAddrPlus(ctxt.Arch, dataoff, pcln.Funcdata[i], pcln.Funcdataoff[i]) - } - off += int32(len(pcln.Funcdata)) * int32(ctxt.Arch.PtrSize) - } - - if off != end { - Errorf(s, "bad math in functab: funcstart=%d off=%d but end=%d (npcdata=%d nfuncdata=%d ptrsize=%d)", funcstart, off, end, len(pcln.Pcdata), len(pcln.Funcdata), ctxt.Arch.PtrSize) - errorexit() - } - - nfunc++ - } - - last := ctxt.Textp[len(ctxt.Textp)-1] - pclntabLastFunc = last - // Final entry of table is just end pc. - ftab.SetAddrPlus(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, last.Size) - - // Start file table. - start := int32(len(ftab.P)) - - start += int32(-len(ftab.P)) & (int32(ctxt.Arch.PtrSize) - 1) - pclntabFiletabOffset = start - ftab.SetUint32(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint32(start)) - - ftab.Grow(int64(start) + (int64(len(ctxt.Filesyms))+1)*4) - ftab.SetUint32(ctxt.Arch, int64(start), uint32(len(ctxt.Filesyms)+1)) - for i := len(ctxt.Filesyms) - 1; i >= 0; i-- { - s := ctxt.Filesyms[i] - ftab.SetUint32(ctxt.Arch, int64(start)+s.Value*4, uint32(ftabaddstring(ftab, s.Name))) - } - - ftab.Size = int64(len(ftab.P)) - - if ctxt.Debugvlog != 0 { - ctxt.Logf("pclntab=%d bytes, funcdata total %d bytes\n", ftab.Size, funcdataBytes) - } -} - -func gorootFinal() string { - root := objabi.GOROOT - if final := os.Getenv("GOROOT_FINAL"); final != "" { - root = final - } - return root -} - -func expandGoroot(s string) string { - const n = len("$GOROOT") - if len(s) >= n+1 && s[:n] == "$GOROOT" && (s[n] == '/' || s[n] == '\\') { - return filepath.ToSlash(filepath.Join(gorootFinal(), s[n:])) - } - return s -} - -const ( - BUCKETSIZE = 256 * MINFUNC - SUBBUCKETS = 16 - SUBBUCKETSIZE = BUCKETSIZE / SUBBUCKETS - NOIDX = 0x7fffffff -) - -// findfunctab generates a lookup table to quickly find the containing -// function for a pc. See src/runtime/symtab.go:findfunc for details. -func (ctxt *Link) findfunctab() { - t := ctxt.Syms.Lookup("runtime.findfunctab", 0) - t.Type = sym.SRODATA - t.Attr |= sym.AttrReachable - t.Attr |= sym.AttrLocal - - // find min and max address - min := ctxt.Textp[0].Value - lastp := ctxt.Textp[len(ctxt.Textp)-1] - max := lastp.Value + lastp.Size - - // for each subbucket, compute the minimum of all symbol indexes - // that map to that subbucket. - n := int32((max - min + SUBBUCKETSIZE - 1) / SUBBUCKETSIZE) - - indexes := make([]int32, n) - for i := int32(0); i < n; i++ { - indexes[i] = NOIDX - } - idx := int32(0) - for i, s := range ctxt.Textp { - if !emitPcln(ctxt, s) { - continue - } - p := s.Value - var e *sym.Symbol - i++ - if i < len(ctxt.Textp) { - e = ctxt.Textp[i] - } - for !emitPcln(ctxt, e) && i < len(ctxt.Textp) { - e = ctxt.Textp[i] - i++ - } - q := max - if e != nil { - q = e.Value - } - - //print("%d: [%lld %lld] %s\n", idx, p, q, s->name); - for ; p < q; p += SUBBUCKETSIZE { - i = int((p - min) / SUBBUCKETSIZE) - if indexes[i] > idx { - indexes[i] = idx - } - } - - i = int((q - 1 - min) / SUBBUCKETSIZE) - if indexes[i] > idx { - indexes[i] = idx - } - idx++ - } - - // allocate table - nbuckets := int32((max - min + BUCKETSIZE - 1) / BUCKETSIZE) - - t.Grow(4*int64(nbuckets) + int64(n)) - - // fill in table - for i := int32(0); i < nbuckets; i++ { - base := indexes[i*SUBBUCKETS] - if base == NOIDX { - Errorf(nil, "hole in findfunctab") - } - t.SetUint32(ctxt.Arch, int64(i)*(4+SUBBUCKETS), uint32(base)) - for j := int32(0); j < SUBBUCKETS && i*SUBBUCKETS+j < n; j++ { - idx = indexes[i*SUBBUCKETS+j] - if idx == NOIDX { - Errorf(nil, "hole in findfunctab") - } - if idx-base >= 256 { - Errorf(nil, "too many functions in a findfunc bucket! %d/%d %d %d", i, nbuckets, j, idx-base) - } - - t.SetUint8(ctxt.Arch, int64(i)*(4+SUBBUCKETS)+4+int64(j), uint8(idx-base)) - } - } -} diff --git a/src/cmd/oldlink/internal/ld/pe.go b/src/cmd/oldlink/internal/ld/pe.go deleted file mode 100644 index b40557f485..0000000000 --- a/src/cmd/oldlink/internal/ld/pe.go +++ /dev/null @@ -1,1562 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// PE (Portable Executable) file writing -// https://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx - -package ld - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "debug/pe" - "encoding/binary" - "fmt" - "sort" - "strconv" - "strings" -) - -type IMAGE_IMPORT_DESCRIPTOR struct { - OriginalFirstThunk uint32 - TimeDateStamp uint32 - ForwarderChain uint32 - Name uint32 - FirstThunk uint32 -} - -type IMAGE_EXPORT_DIRECTORY struct { - Characteristics uint32 - TimeDateStamp uint32 - MajorVersion uint16 - MinorVersion uint16 - Name uint32 - Base uint32 - NumberOfFunctions uint32 - NumberOfNames uint32 - AddressOfFunctions uint32 - AddressOfNames uint32 - AddressOfNameOrdinals uint32 -} - -const ( - PEBASE = 0x00400000 -) - -var ( - // SectionAlignment must be greater than or equal to FileAlignment. - // The default is the page size for the architecture. - PESECTALIGN int64 = 0x1000 - - // FileAlignment should be a power of 2 between 512 and 64 K, inclusive. - // The default is 512. If the SectionAlignment is less than - // the architecture's page size, then FileAlignment must match SectionAlignment. - PEFILEALIGN int64 = 2 << 8 -) - -const ( - IMAGE_SCN_CNT_CODE = 0x00000020 - IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040 - IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080 - IMAGE_SCN_MEM_EXECUTE = 0x20000000 - IMAGE_SCN_MEM_READ = 0x40000000 - IMAGE_SCN_MEM_WRITE = 0x80000000 - IMAGE_SCN_MEM_DISCARDABLE = 0x2000000 - IMAGE_SCN_LNK_NRELOC_OVFL = 0x1000000 - IMAGE_SCN_ALIGN_32BYTES = 0x600000 -) - -// 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_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_AMD64_ADDR64 = 0x0001 - IMAGE_REL_AMD64_ADDR32 = 0x0002 - IMAGE_REL_AMD64_REL32 = 0x0004 - IMAGE_REL_AMD64_SECREL = 0x000B - - IMAGE_REL_ARM_ABSOLUTE = 0x0000 - IMAGE_REL_ARM_ADDR32 = 0x0001 - IMAGE_REL_ARM_ADDR32NB = 0x0002 - IMAGE_REL_ARM_BRANCH24 = 0x0003 - IMAGE_REL_ARM_BRANCH11 = 0x0004 - IMAGE_REL_ARM_SECREL = 0x000F - - IMAGE_REL_BASED_HIGHLOW = 3 - IMAGE_REL_BASED_DIR64 = 10 -) - -const ( - PeMinimumTargetMajorVersion = 6 - PeMinimumTargetMinorVersion = 1 -) - -// DOS stub that prints out -// "This program cannot be run in DOS mode." -var dosstub = []uint8{ - 0x4d, - 0x5a, - 0x90, - 0x00, - 0x03, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xff, - 0xff, - 0x00, - 0x00, - 0x8b, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00, - 0x00, - 0x00, - 0x0e, - 0x1f, - 0xba, - 0x0e, - 0x00, - 0xb4, - 0x09, - 0xcd, - 0x21, - 0xb8, - 0x01, - 0x4c, - 0xcd, - 0x21, - 0x54, - 0x68, - 0x69, - 0x73, - 0x20, - 0x70, - 0x72, - 0x6f, - 0x67, - 0x72, - 0x61, - 0x6d, - 0x20, - 0x63, - 0x61, - 0x6e, - 0x6e, - 0x6f, - 0x74, - 0x20, - 0x62, - 0x65, - 0x20, - 0x72, - 0x75, - 0x6e, - 0x20, - 0x69, - 0x6e, - 0x20, - 0x44, - 0x4f, - 0x53, - 0x20, - 0x6d, - 0x6f, - 0x64, - 0x65, - 0x2e, - 0x0d, - 0x0d, - 0x0a, - 0x24, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, -} - -type Imp struct { - s *sym.Symbol - off uint64 - next *Imp - argsize int -} - -type Dll struct { - name string - nameoff uint64 - thunkoff uint64 - ms *Imp - next *Dll -} - -var ( - rsrcsym *sym.Symbol - PESECTHEADR int32 - PEFILEHEADR int32 - pe64 int - dr *Dll - dexport [1024]*sym.Symbol - nexport int -) - -// peStringTable is a COFF string table. -type peStringTable struct { - strings []string - stringsLen int -} - -// size returns size of string table t. -func (t *peStringTable) size() int { - // string table starts with 4-byte length at the beginning - return t.stringsLen + 4 -} - -// add adds string str to string table t. -func (t *peStringTable) add(str string) int { - off := t.size() - t.strings = append(t.strings, str) - t.stringsLen += len(str) + 1 // each string will have 0 appended to it - return off -} - -// write writes string table t into the output file. -func (t *peStringTable) write(out *OutBuf) { - out.Write32(uint32(t.size())) - for _, s := range t.strings { - out.WriteString(s) - out.Write8(0) - } -} - -// peSection represents section from COFF section table. -type peSection struct { - name string - shortName string - index int // one-based index into the Section Table - virtualSize uint32 - virtualAddress uint32 - sizeOfRawData uint32 - pointerToRawData uint32 - pointerToRelocations uint32 - numberOfRelocations uint16 - characteristics uint32 -} - -// checkOffset verifies COFF section sect offset in the file. -func (sect *peSection) checkOffset(off int64) { - if off != int64(sect.pointerToRawData) { - Errorf(nil, "%s.PointerToRawData = %#x, want %#x", sect.name, uint64(int64(sect.pointerToRawData)), uint64(off)) - errorexit() - } -} - -// checkSegment verifies COFF section sect matches address -// and file offset provided in segment seg. -func (sect *peSection) checkSegment(seg *sym.Segment) { - if seg.Vaddr-PEBASE != uint64(sect.virtualAddress) { - Errorf(nil, "%s.VirtualAddress = %#x, want %#x", sect.name, uint64(int64(sect.virtualAddress)), uint64(int64(seg.Vaddr-PEBASE))) - errorexit() - } - if seg.Fileoff != uint64(sect.pointerToRawData) { - Errorf(nil, "%s.PointerToRawData = %#x, want %#x", sect.name, uint64(int64(sect.pointerToRawData)), uint64(int64(seg.Fileoff))) - errorexit() - } -} - -// pad adds zeros to the section sect. It writes as many bytes -// as necessary to make section sect.SizeOfRawData bytes long. -// It assumes that n bytes are already written to the file. -func (sect *peSection) pad(out *OutBuf, n uint32) { - out.WriteStringN("", int(sect.sizeOfRawData-n)) -} - -// write writes COFF section sect into the output file. -func (sect *peSection) write(out *OutBuf, linkmode LinkMode) error { - h := pe.SectionHeader32{ - VirtualSize: sect.virtualSize, - SizeOfRawData: sect.sizeOfRawData, - PointerToRawData: sect.pointerToRawData, - PointerToRelocations: sect.pointerToRelocations, - NumberOfRelocations: sect.numberOfRelocations, - Characteristics: sect.characteristics, - } - if linkmode != LinkExternal { - h.VirtualAddress = sect.virtualAddress - } - copy(h.Name[:], sect.shortName) - return binary.Write(out, binary.LittleEndian, h) -} - -// emitRelocations emits the relocation entries for the sect. -// The actual relocations are emitted by relocfn. -// This updates the corresponding PE section table entry -// with the relocation offset and count. -func (sect *peSection) emitRelocations(out *OutBuf, relocfn func() int) { - sect.pointerToRelocations = uint32(out.Offset()) - // first entry: extended relocs - out.Write32(0) // placeholder for number of relocation + 1 - out.Write32(0) - out.Write16(0) - - n := relocfn() + 1 - - cpos := out.Offset() - out.SeekSet(int64(sect.pointerToRelocations)) - out.Write32(uint32(n)) - out.SeekSet(cpos) - if n > 0x10000 { - n = 0x10000 - sect.characteristics |= IMAGE_SCN_LNK_NRELOC_OVFL - } else { - sect.pointerToRelocations += 10 // skip the extend reloc entry - } - sect.numberOfRelocations = uint16(n - 1) -} - -// peFile is used to build COFF file. -type peFile struct { - sections []*peSection - stringTable peStringTable - textSect *peSection - rdataSect *peSection - dataSect *peSection - bssSect *peSection - ctorsSect *peSection - nextSectOffset uint32 - nextFileOffset uint32 - symtabOffset int64 // offset to the start of symbol table - symbolCount int // number of symbol table records written - dataDirectory [16]pe.DataDirectory -} - -// addSection adds section to the COFF file f. -func (f *peFile) addSection(name string, sectsize int, filesize int) *peSection { - sect := &peSection{ - name: name, - shortName: name, - index: len(f.sections) + 1, - virtualSize: uint32(sectsize), - virtualAddress: f.nextSectOffset, - pointerToRawData: f.nextFileOffset, - } - f.nextSectOffset = uint32(Rnd(int64(f.nextSectOffset)+int64(sectsize), PESECTALIGN)) - if filesize > 0 { - sect.sizeOfRawData = uint32(Rnd(int64(filesize), PEFILEALIGN)) - f.nextFileOffset += sect.sizeOfRawData - } - f.sections = append(f.sections, sect) - return sect -} - -// addDWARFSection adds DWARF section to the COFF file f. -// This function is similar to addSection, but DWARF section names are -// longer than 8 characters, so they need to be stored in the string table. -func (f *peFile) addDWARFSection(name string, size int) *peSection { - if size == 0 { - Exitf("DWARF section %q is empty", name) - } - // DWARF section names are longer than 8 characters. - // PE format requires such names to be stored in string table, - // and section names replaced with slash (/) followed by - // correspondent string table index. - // see http://www.microsoft.com/whdc/system/platform/firmware/PECOFFdwn.mspx - // for details - off := f.stringTable.add(name) - h := f.addSection(name, size, size) - h.shortName = fmt.Sprintf("/%d", off) - h.characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE - return h -} - -// addDWARF adds DWARF information to the COFF file f. -func (f *peFile) addDWARF() { - if *FlagS { // disable symbol table - return - } - if *FlagW { // disable dwarf - return - } - for _, sect := range Segdwarf.Sections { - h := f.addDWARFSection(sect.Name, int(sect.Length)) - fileoff := sect.Vaddr - Segdwarf.Vaddr + Segdwarf.Fileoff - if uint64(h.pointerToRawData) != fileoff { - Exitf("%s.PointerToRawData = %#x, want %#x", sect.Name, h.pointerToRawData, fileoff) - } - } -} - -// 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, - // and by observing what GCC writes here. If the initarray section grows to - // contain more than one constructor entry, the size will need to be 8 * constructor_count. - // However, the entire Go runtime is initialized from just one function, so it is unlikely - // that this will need to grow in the future. - var size int - switch objabi.GOARCH { - default: - Exitf("peFile.addInitArray: unsupported GOARCH=%q\n", objabi.GOARCH) - case "386": - size = 4 - case "amd64": - size = 8 - case "arm": - size = 4 - } - sect := f.addSection(".ctors", size, size) - sect.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ - sect.sizeOfRawData = uint32(size) - ctxt.Out.SeekSet(int64(sect.pointerToRawData)) - sect.checkOffset(ctxt.Out.Offset()) - - init_entry := ctxt.Syms.Lookup(*flagEntrySymbol, 0) - addr := uint64(init_entry.Value) - init_entry.Sect.Vaddr - switch objabi.GOARCH { - case "386", "arm": - ctxt.Out.Write32(uint32(addr)) - case "amd64": - ctxt.Out.Write64(addr) - } - return sect -} - -// emitRelocations emits relocation entries for go.o in external linking. -func (f *peFile) emitRelocations(ctxt *Link) { - for ctxt.Out.Offset()&7 != 0 { - ctxt.Out.Write8(0) - } - - // relocsect relocates symbols from first in section sect, and returns - // the total number of relocations emitted. - relocsect := func(sect *sym.Section, syms []*sym.Symbol, base uint64) int { - // If main section has no bits, nothing to relocate. - if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { - return 0 - } - relocs := 0 - sect.Reloff = uint64(ctxt.Out.Offset()) - for i, s := range syms { - if !s.Attr.Reachable() { - continue - } - if uint64(s.Value) >= sect.Vaddr { - syms = syms[i:] - break - } - } - eaddr := int32(sect.Vaddr + sect.Length) - for _, sym := range syms { - if !sym.Attr.Reachable() { - continue - } - if sym.Value >= int64(eaddr) { - break - } - for ri := range sym.R { - r := &sym.R[ri] - if r.Done { - continue - } - if r.Xsym == nil { - Errorf(sym, "missing xsym in relocation") - continue - } - if r.Xsym.Dynid < 0 { - Errorf(sym, "reloc %d to non-coff symbol %s (outer=%s) %d", r.Type, r.Sym.Name, r.Xsym.Name, r.Sym.Type) - } - if !thearch.PEreloc1(ctxt.Arch, ctxt.Out, sym, r, int64(uint64(sym.Value+int64(r.Off))-base)) { - Errorf(sym, "unsupported obj reloc %d/%d to %s", r.Type, r.Siz, r.Sym.Name) - } - relocs++ - } - } - sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff - return relocs - } - - sects := []struct { - peSect *peSection - seg *sym.Segment - syms []*sym.Symbol - }{ - {f.textSect, &Segtext, ctxt.Textp}, - {f.rdataSect, &Segrodata, datap}, - {f.dataSect, &Segdata, datap}, - } - for _, s := range sects { - s.peSect.emitRelocations(ctxt.Out, func() int { - var n int - for _, sect := range s.seg.Sections { - n += relocsect(sect, s.syms, s.seg.Vaddr) - } - return n - }) - } - -dwarfLoop: - for _, sect := range Segdwarf.Sections { - for _, pesect := range f.sections { - if sect.Name == pesect.name { - pesect.emitRelocations(ctxt.Out, func() int { - return relocsect(sect, dwarfp, sect.Vaddr) - }) - continue dwarfLoop - } - } - Errorf(nil, "emitRelocations: could not find %q section", sect.Name) - } - - f.ctorsSect.emitRelocations(ctxt.Out, func() int { - dottext := ctxt.Syms.Lookup(".text", 0) - ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(dottext.Dynid)) - switch objabi.GOARCH { - default: - Errorf(dottext, "unknown architecture for PE: %q\n", objabi.GOARCH) - case "386": - ctxt.Out.Write16(IMAGE_REL_I386_DIR32) - case "amd64": - ctxt.Out.Write16(IMAGE_REL_AMD64_ADDR64) - case "arm": - ctxt.Out.Write16(IMAGE_REL_ARM_ADDR32) - } - return 1 - }) -} - -// writeSymbol appends symbol s to file f symbol table. -// It also sets s.Dynid to written symbol number. -func (f *peFile) writeSymbol(out *OutBuf, s *sym.Symbol, value int64, sectidx int, typ uint16, class uint8) { - if len(s.Name) > 8 { - out.Write32(0) - out.Write32(uint32(f.stringTable.add(s.Name))) - } else { - out.WriteStringN(s.Name, 8) - } - out.Write32(uint32(value)) - out.Write16(uint16(sectidx)) - out.Write16(typ) - out.Write8(class) - out.Write8(0) // no aux entries - - s.Dynid = int32(f.symbolCount) - - f.symbolCount++ -} - -// mapToPESection searches peFile f for s symbol's location. -// It returns PE section index, and offset within that section. -func (f *peFile) mapToPESection(s *sym.Symbol, linkmode LinkMode) (pesectidx int, offset int64, err error) { - if s.Sect == nil { - return 0, 0, fmt.Errorf("could not map %s symbol with no section", s.Name) - } - if s.Sect.Seg == &Segtext { - return f.textSect.index, int64(uint64(s.Value) - Segtext.Vaddr), nil - } - if s.Sect.Seg == &Segrodata { - return f.rdataSect.index, int64(uint64(s.Value) - Segrodata.Vaddr), nil - } - if s.Sect.Seg != &Segdata { - return 0, 0, fmt.Errorf("could not map %s symbol with non .text or .rdata or .data section", s.Name) - } - v := uint64(s.Value) - Segdata.Vaddr - if linkmode != LinkExternal { - return f.dataSect.index, int64(v), nil - } - if s.Type == sym.SDATA { - return f.dataSect.index, int64(v), nil - } - // Note: although address of runtime.edata (type sym.SDATA) is at the start of .bss section - // it still belongs to the .data section, not the .bss section. - if v < Segdata.Filelen { - return f.dataSect.index, int64(v), nil - } - return f.bssSect.index, int64(v - Segdata.Filelen), nil -} - -// writeSymbols writes all COFF symbol table records. -func (f *peFile) writeSymbols(ctxt *Link) { - - put := func(ctxt *Link, s *sym.Symbol, name string, type_ SymbolType, addr int64, gotype *sym.Symbol) { - if s == nil { - return - } - if s.Sect == nil && type_ != UndefinedSym { - return - } - switch type_ { - default: - return - case DataSym, BSSSym, TextSym, UndefinedSym: - } - - // Only windows/386 requires underscore prefix on external symbols. - if ctxt.Arch.Family == sys.I386 && - ctxt.LinkMode == LinkExternal && - (s.Type == sym.SHOSTOBJ || s.Type == sym.SUNDEFEXT || s.Attr.CgoExport()) { - s.Name = "_" + s.Name - } - - var typ uint16 - if ctxt.LinkMode == LinkExternal { - typ = IMAGE_SYM_TYPE_NULL - } else { - // TODO: fix IMAGE_SYM_DTYPE_ARRAY value and use following expression, instead of 0x0308 - typ = IMAGE_SYM_DTYPE_ARRAY<<8 + IMAGE_SYM_TYPE_STRUCT - typ = 0x0308 // "array of structs" - } - sect, value, err := f.mapToPESection(s, ctxt.LinkMode) - if err != nil { - if type_ == UndefinedSym { - typ = IMAGE_SYM_DTYPE_FUNCTION - } else { - Errorf(s, "addpesym: %v", err) - } - } - class := IMAGE_SYM_CLASS_EXTERNAL - if s.IsFileLocal() || s.Attr.VisibilityHidden() || s.Attr.Local() { - class = IMAGE_SYM_CLASS_STATIC - } - f.writeSymbol(ctxt.Out, s, value, sect, typ, uint8(class)) - } - - if ctxt.LinkMode == LinkExternal { - // Include section symbols as external, because - // .ctors and .debug_* section relocations refer to it. - for _, pesect := range f.sections { - sym := ctxt.Syms.Lookup(pesect.name, 0) - f.writeSymbol(ctxt.Out, sym, 0, pesect.index, IMAGE_SYM_TYPE_NULL, IMAGE_SYM_CLASS_STATIC) - } - } - - genasmsym(ctxt, put) -} - -// writeSymbolTableAndStringTable writes out symbol and string tables for peFile f. -func (f *peFile) writeSymbolTableAndStringTable(ctxt *Link) { - f.symtabOffset = ctxt.Out.Offset() - - // write COFF symbol table - if !*FlagS || ctxt.LinkMode == LinkExternal { - f.writeSymbols(ctxt) - } - - // update COFF file header and section table - size := f.stringTable.size() + 18*f.symbolCount - var h *peSection - if ctxt.LinkMode != LinkExternal { - // We do not really need .symtab for go.o, and if we have one, ld - // will also include it in the exe, and that will confuse windows. - h = f.addSection(".symtab", size, size) - h.characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE - h.checkOffset(f.symtabOffset) - } - - // write COFF string table - f.stringTable.write(ctxt.Out) - if ctxt.LinkMode != LinkExternal { - h.pad(ctxt.Out, uint32(size)) - } -} - -// writeFileHeader writes COFF file header for peFile f. -func (f *peFile) writeFileHeader(ctxt *Link) { - var fh pe.FileHeader - - switch ctxt.Arch.Family { - default: - Exitf("unknown PE architecture: %v", ctxt.Arch.Family) - case sys.AMD64: - fh.Machine = pe.IMAGE_FILE_MACHINE_AMD64 - case sys.I386: - fh.Machine = pe.IMAGE_FILE_MACHINE_I386 - case sys.ARM: - fh.Machine = pe.IMAGE_FILE_MACHINE_ARMNT - } - - fh.NumberOfSections = uint16(len(f.sections)) - - // Being able to produce identical output for identical input is - // 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 - switch ctxt.Arch.Family { - case sys.AMD64, sys.I386: - if ctxt.BuildMode != BuildModePIE { - fh.Characteristics |= pe.IMAGE_FILE_RELOCS_STRIPPED - } - } - } - if pe64 != 0 { - var oh64 pe.OptionalHeader64 - fh.SizeOfOptionalHeader = uint16(binary.Size(&oh64)) - fh.Characteristics |= pe.IMAGE_FILE_LARGE_ADDRESS_AWARE - } else { - var oh pe.OptionalHeader32 - fh.SizeOfOptionalHeader = uint16(binary.Size(&oh)) - fh.Characteristics |= pe.IMAGE_FILE_32BIT_MACHINE - } - - fh.PointerToSymbolTable = uint32(f.symtabOffset) - fh.NumberOfSymbols = uint32(f.symbolCount) - - binary.Write(ctxt.Out, binary.LittleEndian, &fh) -} - -// writeOptionalHeader writes COFF optional header for peFile f. -func (f *peFile) writeOptionalHeader(ctxt *Link) { - var oh pe.OptionalHeader32 - var oh64 pe.OptionalHeader64 - - if pe64 != 0 { - oh64.Magic = 0x20b // PE32+ - } else { - oh.Magic = 0x10b // PE32 - oh.BaseOfData = f.dataSect.virtualAddress - } - - // Fill out both oh64 and oh. We only use one. Oh well. - oh64.MajorLinkerVersion = 3 - oh.MajorLinkerVersion = 3 - oh64.MinorLinkerVersion = 0 - oh.MinorLinkerVersion = 0 - oh64.SizeOfCode = f.textSect.sizeOfRawData - oh.SizeOfCode = f.textSect.sizeOfRawData - oh64.SizeOfInitializedData = f.dataSect.sizeOfRawData - oh.SizeOfInitializedData = f.dataSect.sizeOfRawData - oh64.SizeOfUninitializedData = 0 - oh.SizeOfUninitializedData = 0 - if ctxt.LinkMode != LinkExternal { - oh64.AddressOfEntryPoint = uint32(Entryvalue(ctxt) - PEBASE) - oh.AddressOfEntryPoint = uint32(Entryvalue(ctxt) - PEBASE) - } - oh64.BaseOfCode = f.textSect.virtualAddress - oh.BaseOfCode = f.textSect.virtualAddress - oh64.ImageBase = PEBASE - oh.ImageBase = PEBASE - oh64.SectionAlignment = uint32(PESECTALIGN) - oh.SectionAlignment = uint32(PESECTALIGN) - oh64.FileAlignment = uint32(PEFILEALIGN) - oh.FileAlignment = uint32(PEFILEALIGN) - oh64.MajorOperatingSystemVersion = PeMinimumTargetMajorVersion - oh.MajorOperatingSystemVersion = PeMinimumTargetMajorVersion - oh64.MinorOperatingSystemVersion = PeMinimumTargetMinorVersion - oh.MinorOperatingSystemVersion = PeMinimumTargetMinorVersion - oh64.MajorImageVersion = 1 - oh.MajorImageVersion = 1 - oh64.MinorImageVersion = 0 - oh.MinorImageVersion = 0 - oh64.MajorSubsystemVersion = PeMinimumTargetMajorVersion - oh.MajorSubsystemVersion = PeMinimumTargetMajorVersion - oh64.MinorSubsystemVersion = PeMinimumTargetMinorVersion - oh.MinorSubsystemVersion = PeMinimumTargetMinorVersion - oh64.SizeOfImage = f.nextSectOffset - oh.SizeOfImage = f.nextSectOffset - oh64.SizeOfHeaders = uint32(PEFILEHEADR) - oh.SizeOfHeaders = uint32(PEFILEHEADR) - if windowsgui { - oh64.Subsystem = pe.IMAGE_SUBSYSTEM_WINDOWS_GUI - oh.Subsystem = pe.IMAGE_SUBSYSTEM_WINDOWS_GUI - } else { - oh64.Subsystem = pe.IMAGE_SUBSYSTEM_WINDOWS_CUI - oh.Subsystem = pe.IMAGE_SUBSYSTEM_WINDOWS_CUI - } - - // Mark as having awareness of terminal services, to avoid ancient compatibility hacks. - oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE - oh.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE - - // Enable DEP - oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_NX_COMPAT - oh.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_NX_COMPAT - - // The DLL can be relocated at load time. - switch ctxt.Arch.Family { - case sys.AMD64, sys.I386: - if ctxt.BuildMode == BuildModePIE { - oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE - oh.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE - } - case sys.ARM: - oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE - oh.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE - } - - // Image can handle a high entropy 64-bit virtual address space. - if ctxt.BuildMode == BuildModePIE { - oh64.DllCharacteristics |= pe.IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA - } - - // Disable stack growth as we don't want Windows to - // fiddle with the thread stack limits, which we set - // ourselves to circumvent the stack checks in the - // Windows exception dispatcher. - // Commit size must be strictly less than reserve - // size otherwise reserve will be rounded up to a - // larger size, as verified with VMMap. - - // On 64-bit, we always reserve 2MB stacks. "Pure" Go code is - // okay with much smaller stacks, but the syscall package - // makes it easy to call into arbitrary C code without cgo, - // and system calls even in "pure" Go code are actually C - // calls that may need more stack than we think. - // - // The default stack reserve size directly affects only the main - // thread, ctrlhandler thread, and profileloop thread. For - // these, it must be greater than the stack size assumed by - // externalthreadhandler. - // - // For other threads, the runtime explicitly asks the kernel - // to use the default stack size so that all stacks are - // consistent. - // - // At thread start, in minit, the runtime queries the OS for - // the actual stack bounds so that the stack size doesn't need - // to be hard-coded into the runtime. - oh64.SizeOfStackReserve = 0x00200000 - if !iscgo { - oh64.SizeOfStackCommit = 0x00001000 - } else { - // TODO(brainman): Maybe remove optional header writing altogether for cgo. - // For cgo it is the external linker that is building final executable. - // And it probably does not use any information stored in optional header. - oh64.SizeOfStackCommit = 0x00200000 - 0x2000 // account for 2 guard pages - } - - oh.SizeOfStackReserve = 0x00100000 - if !iscgo { - oh.SizeOfStackCommit = 0x00001000 - } else { - oh.SizeOfStackCommit = 0x00100000 - 0x2000 // account for 2 guard pages - } - - oh64.SizeOfHeapReserve = 0x00100000 - oh.SizeOfHeapReserve = 0x00100000 - oh64.SizeOfHeapCommit = 0x00001000 - oh.SizeOfHeapCommit = 0x00001000 - oh64.NumberOfRvaAndSizes = 16 - oh.NumberOfRvaAndSizes = 16 - - if pe64 != 0 { - oh64.DataDirectory = f.dataDirectory - } else { - oh.DataDirectory = f.dataDirectory - } - - if pe64 != 0 { - binary.Write(ctxt.Out, binary.LittleEndian, &oh64) - } else { - binary.Write(ctxt.Out, binary.LittleEndian, &oh) - } -} - -var pefile peFile - -func Peinit(ctxt *Link) { - var l int - - switch ctxt.Arch.Family { - // 64-bit architectures - case sys.AMD64: - pe64 = 1 - var oh64 pe.OptionalHeader64 - l = binary.Size(&oh64) - - // 32-bit architectures - default: - var oh pe.OptionalHeader32 - l = binary.Size(&oh) - - } - - if ctxt.LinkMode == LinkExternal { - // .rdata section will contain "masks" and "shifts" symbols, and they - // need to be aligned to 16-bytes. So make all sections aligned - // to 32-byte and mark them all IMAGE_SCN_ALIGN_32BYTES so external - // linker will honour that requirement. - PESECTALIGN = 32 - PEFILEALIGN = 0 - } - - var sh [16]pe.SectionHeader32 - var fh pe.FileHeader - PEFILEHEADR = int32(Rnd(int64(len(dosstub)+binary.Size(&fh)+l+binary.Size(&sh)), PEFILEALIGN)) - if ctxt.LinkMode != LinkExternal { - PESECTHEADR = int32(Rnd(int64(PEFILEHEADR), PESECTALIGN)) - } else { - PESECTHEADR = 0 - } - pefile.nextSectOffset = uint32(PESECTHEADR) - pefile.nextFileOffset = uint32(PEFILEHEADR) - - if ctxt.LinkMode == LinkInternal { - // some mingw libs depend on this symbol, for example, FindPESectionByName - ctxt.xdefine("__image_base__", sym.SDATA, PEBASE) - ctxt.xdefine("_image_base__", sym.SDATA, PEBASE) - } - - HEADR = PEFILEHEADR - if *FlagTextAddr == -1 { - *FlagTextAddr = PEBASE + int64(PESECTHEADR) - } - if *FlagRound == -1 { - *FlagRound = int(PESECTALIGN) - } -} - -func pewrite(ctxt *Link) { - ctxt.Out.SeekSet(0) - if ctxt.LinkMode != LinkExternal { - ctxt.Out.Write(dosstub) - ctxt.Out.WriteStringN("PE", 4) - } - - pefile.writeFileHeader(ctxt) - - pefile.writeOptionalHeader(ctxt) - - for _, sect := range pefile.sections { - sect.write(ctxt.Out, ctxt.LinkMode) - } -} - -func strput(out *OutBuf, s string) { - out.WriteString(s) - out.Write8(0) - // string must be padded to even size - if (len(s)+1)%2 != 0 { - out.Write8(0) - } -} - -func initdynimport(ctxt *Link) *Dll { - var d *Dll - - dr = nil - var m *Imp - for _, s := range ctxt.Syms.Allsym { - if !s.Attr.Reachable() || s.Type != sym.SDYNIMPORT { - continue - } - for d = dr; d != nil; d = d.next { - if d.name == s.Dynimplib() { - m = new(Imp) - break - } - } - - if d == nil { - d = new(Dll) - d.name = s.Dynimplib() - d.next = dr - dr = d - m = new(Imp) - } - - // Because external link requires properly stdcall decorated name, - // all external symbols in runtime use %n to denote that the number - // of uinptrs this function consumes. Store the argsize and discard - // the %n suffix if any. - m.argsize = -1 - extName := s.Extname() - if i := strings.IndexByte(extName, '%'); i >= 0 { - var err error - m.argsize, err = strconv.Atoi(extName[i+1:]) - if err != nil { - Errorf(s, "failed to parse stdcall decoration: %v", err) - } - m.argsize *= ctxt.Arch.PtrSize - s.SetExtname(extName[:i]) - } - - m.s = s - m.next = d.ms - d.ms = m - } - - if ctxt.LinkMode == LinkExternal { - // Add real symbol name - for d := dr; d != nil; d = d.next { - for m = d.ms; m != nil; m = m.next { - m.s.Type = sym.SDATA - m.s.Grow(int64(ctxt.Arch.PtrSize)) - dynName := m.s.Extname() - // only windows/386 requires stdcall decoration - if ctxt.Arch.Family == sys.I386 && m.argsize >= 0 { - dynName += fmt.Sprintf("@%d", m.argsize) - } - dynSym := ctxt.Syms.Lookup(dynName, 0) - dynSym.Attr |= sym.AttrReachable - dynSym.Type = sym.SHOSTOBJ - r := m.s.AddRel() - r.Sym = dynSym - r.Off = 0 - r.Siz = uint8(ctxt.Arch.PtrSize) - r.Type = objabi.R_ADDR - } - } - } else { - dynamic := ctxt.Syms.Lookup(".windynamic", 0) - dynamic.Attr |= sym.AttrReachable - dynamic.Type = sym.SWINDOWS - for d := dr; d != nil; d = d.next { - for m = d.ms; m != nil; m = m.next { - m.s.Type = sym.SWINDOWS - m.s.Attr |= sym.AttrSubSymbol - m.s.Sub = dynamic.Sub - dynamic.Sub = m.s - m.s.Value = dynamic.Size - dynamic.Size += int64(ctxt.Arch.PtrSize) - } - - dynamic.Size += int64(ctxt.Arch.PtrSize) - } - } - - return dr -} - -// peimporteddlls returns the gcc command line argument to link all imported -// DLLs. -func peimporteddlls() []string { - var dlls []string - - for d := dr; d != nil; d = d.next { - dlls = append(dlls, "-l"+strings.TrimSuffix(d.name, ".dll")) - } - - return dlls -} - -func addimports(ctxt *Link, datsect *peSection) { - startoff := ctxt.Out.Offset() - dynamic := ctxt.Syms.Lookup(".windynamic", 0) - - // skip import descriptor table (will write it later) - n := uint64(0) - - for d := dr; d != nil; d = d.next { - n++ - } - ctxt.Out.SeekSet(startoff + int64(binary.Size(&IMAGE_IMPORT_DESCRIPTOR{}))*int64(n+1)) - - // write dll names - for d := dr; d != nil; d = d.next { - d.nameoff = uint64(ctxt.Out.Offset()) - uint64(startoff) - strput(ctxt.Out, d.name) - } - - // write function names - for d := dr; d != nil; d = d.next { - for m := d.ms; m != nil; m = m.next { - m.off = uint64(pefile.nextSectOffset) + uint64(ctxt.Out.Offset()) - uint64(startoff) - ctxt.Out.Write16(0) // hint - strput(ctxt.Out, m.s.Extname()) - } - } - - // write OriginalFirstThunks - oftbase := uint64(ctxt.Out.Offset()) - uint64(startoff) - - n = uint64(ctxt.Out.Offset()) - for d := dr; d != nil; d = d.next { - d.thunkoff = uint64(ctxt.Out.Offset()) - n - for m := d.ms; m != nil; m = m.next { - if pe64 != 0 { - ctxt.Out.Write64(m.off) - } else { - ctxt.Out.Write32(uint32(m.off)) - } - } - - if pe64 != 0 { - ctxt.Out.Write64(0) - } else { - ctxt.Out.Write32(0) - } - } - - // add pe section and pad it at the end - n = uint64(ctxt.Out.Offset()) - uint64(startoff) - - isect := pefile.addSection(".idata", int(n), int(n)) - isect.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE - isect.checkOffset(startoff) - isect.pad(ctxt.Out, uint32(n)) - endoff := ctxt.Out.Offset() - - // write FirstThunks (allocated in .data section) - ftbase := uint64(dynamic.Value) - uint64(datsect.virtualAddress) - PEBASE - - ctxt.Out.SeekSet(int64(uint64(datsect.pointerToRawData) + ftbase)) - for d := dr; d != nil; d = d.next { - for m := d.ms; m != nil; m = m.next { - if pe64 != 0 { - ctxt.Out.Write64(m.off) - } else { - ctxt.Out.Write32(uint32(m.off)) - } - } - - if pe64 != 0 { - ctxt.Out.Write64(0) - } else { - ctxt.Out.Write32(0) - } - } - - // finally write import descriptor table - out := ctxt.Out - out.SeekSet(startoff) - - for d := dr; d != nil; d = d.next { - out.Write32(uint32(uint64(isect.virtualAddress) + oftbase + d.thunkoff)) - out.Write32(0) - out.Write32(0) - out.Write32(uint32(uint64(isect.virtualAddress) + d.nameoff)) - out.Write32(uint32(uint64(datsect.virtualAddress) + ftbase + d.thunkoff)) - } - - out.Write32(0) //end - out.Write32(0) - out.Write32(0) - out.Write32(0) - out.Write32(0) - - // update data directory - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect.virtualAddress - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect.virtualSize - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = uint32(dynamic.Value - PEBASE) - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IAT].Size = uint32(dynamic.Size) - - out.SeekSet(endoff) -} - -type byExtname []*sym.Symbol - -func (s byExtname) Len() int { return len(s) } -func (s byExtname) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s byExtname) Less(i, j int) bool { return s[i].Extname() < s[j].Extname() } - -func initdynexport(ctxt *Link) { - nexport = 0 - for _, s := range ctxt.Syms.Allsym { - if !s.Attr.Reachable() || !s.Attr.CgoExportDynamic() { - continue - } - if nexport+1 > len(dexport) { - Errorf(s, "pe dynexport table is full") - errorexit() - } - - dexport[nexport] = s - nexport++ - } - - sort.Sort(byExtname(dexport[:nexport])) -} - -func addexports(ctxt *Link) { - var e IMAGE_EXPORT_DIRECTORY - - size := binary.Size(&e) + 10*nexport + len(*flagOutfile) + 1 - for i := 0; i < nexport; i++ { - size += len(dexport[i].Extname()) + 1 - } - - if nexport == 0 { - return - } - - sect := pefile.addSection(".edata", size, size) - sect.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ - sect.checkOffset(ctxt.Out.Offset()) - va := int(sect.virtualAddress) - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = uint32(va) - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_EXPORT].Size = sect.virtualSize - - vaName := va + binary.Size(&e) + nexport*4 - vaAddr := va + binary.Size(&e) - vaNa := va + binary.Size(&e) + nexport*8 - - e.Characteristics = 0 - e.MajorVersion = 0 - e.MinorVersion = 0 - e.NumberOfFunctions = uint32(nexport) - e.NumberOfNames = uint32(nexport) - e.Name = uint32(va+binary.Size(&e)) + uint32(nexport)*10 // Program names. - e.Base = 1 - e.AddressOfFunctions = uint32(vaAddr) - e.AddressOfNames = uint32(vaName) - e.AddressOfNameOrdinals = uint32(vaNa) - - out := ctxt.Out - - // put IMAGE_EXPORT_DIRECTORY - binary.Write(out, binary.LittleEndian, &e) - - // put EXPORT Address Table - for i := 0; i < nexport; i++ { - out.Write32(uint32(dexport[i].Value - PEBASE)) - } - - // put EXPORT Name Pointer Table - v := int(e.Name + uint32(len(*flagOutfile)) + 1) - - for i := 0; i < nexport; i++ { - out.Write32(uint32(v)) - v += len(dexport[i].Extname()) + 1 - } - - // put EXPORT Ordinal Table - for i := 0; i < nexport; i++ { - out.Write16(uint16(i)) - } - - // put Names - out.WriteStringN(*flagOutfile, len(*flagOutfile)+1) - - for i := 0; i < nexport; i++ { - out.WriteStringN(dexport[i].Extname(), len(dexport[i].Extname())+1) - } - sect.pad(out, uint32(size)) -} - -// peBaseRelocEntry represents a single relocation entry. -type peBaseRelocEntry struct { - typeOff uint16 - rel *sym.Reloc - sym *sym.Symbol // For debug -} - -// peBaseRelocBlock represents a Base Relocation Block. A block -// is a collection of relocation entries in a page, where each -// entry describes a single relocation. -// The block page RVA (Relative Virtual Address) is the index -// into peBaseRelocTable.blocks. -type peBaseRelocBlock struct { - entries []peBaseRelocEntry -} - -// pePages is a type used to store the list of pages for which there -// are base relocation blocks. This is defined as a type so that -// it can be sorted. -type pePages []uint32 - -func (p pePages) Len() int { return len(p) } -func (p pePages) Swap(i, j int) { p[i], p[j] = p[j], p[i] } -func (p pePages) Less(i, j int) bool { return p[i] < p[j] } - -// A PE base relocation table is a list of blocks, where each block -// contains relocation information for a single page. The blocks -// must be emitted in order of page virtual address. -// See https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format#the-reloc-section-image-only -type peBaseRelocTable struct { - blocks map[uint32]peBaseRelocBlock - - // pePages is a list of keys into blocks map. - // It is stored separately for ease of sorting. - pages pePages -} - -func (rt *peBaseRelocTable) init(ctxt *Link) { - rt.blocks = make(map[uint32]peBaseRelocBlock) -} - -func (rt *peBaseRelocTable) addentry(ctxt *Link, s *sym.Symbol, r *sym.Reloc) { - // pageSize is the size in bytes of a page - // described by a base relocation block. - const pageSize = 0x1000 - const pageMask = pageSize - 1 - - addr := s.Value + int64(r.Off) - int64(PEBASE) - page := uint32(addr &^ pageMask) - off := uint32(addr & pageMask) - - b, ok := rt.blocks[page] - if !ok { - rt.pages = append(rt.pages, page) - } - - e := peBaseRelocEntry{ - typeOff: uint16(off & 0xFFF), - rel: r, - sym: s, - } - - // Set entry type - switch r.Siz { - default: - Exitf("unsupported relocation size %d\n", r.Siz) - case 4: - e.typeOff |= uint16(IMAGE_REL_BASED_HIGHLOW << 12) - case 8: - e.typeOff |= uint16(IMAGE_REL_BASED_DIR64 << 12) - } - - b.entries = append(b.entries, e) - rt.blocks[page] = b -} - -func (rt *peBaseRelocTable) write(ctxt *Link) { - out := ctxt.Out - - // sort the pages array - sort.Sort(rt.pages) - - for _, p := range rt.pages { - b := rt.blocks[p] - const sizeOfPEbaseRelocBlock = 8 // 2 * sizeof(uint32) - blockSize := uint32(sizeOfPEbaseRelocBlock + len(b.entries)*2) - out.Write32(p) - out.Write32(blockSize) - - for _, e := range b.entries { - out.Write16(e.typeOff) - } - } -} - -func addPEBaseRelocSym(ctxt *Link, s *sym.Symbol, rt *peBaseRelocTable) { - for ri := 0; ri < len(s.R); ri++ { - r := &s.R[ri] - - if r.Sym == nil { - continue - } - if !r.Sym.Attr.Reachable() { - continue - } - if r.Type >= objabi.ElfRelocOffset { - continue - } - if r.Siz == 0 { // informational relocation - continue - } - if r.Type == objabi.R_DWARFFILEREF { - continue - } - - switch r.Type { - default: - case objabi.R_ADDR: - rt.addentry(ctxt, s, r) - } - } -} - -func addPEBaseReloc(ctxt *Link) { - // Arm does not work without base relocation table. - // 386 and amd64 will only require the table for BuildModePIE. - switch ctxt.Arch.Family { - default: - return - case sys.I386, sys.AMD64: - if ctxt.BuildMode != BuildModePIE { - return - } - case sys.ARM: - } - - var rt peBaseRelocTable - rt.init(ctxt) - - // Get relocation information - for _, s := range ctxt.Textp { - addPEBaseRelocSym(ctxt, s, &rt) - } - for _, s := range datap { - addPEBaseRelocSym(ctxt, s, &rt) - } - - // Write relocation information - startoff := ctxt.Out.Offset() - rt.write(ctxt) - size := ctxt.Out.Offset() - startoff - - // Add a PE section and pad it at the end - rsect := pefile.addSection(".reloc", int(size), int(size)) - rsect.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE - rsect.checkOffset(startoff) - rsect.pad(ctxt.Out, uint32(size)) - - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = rsect.virtualAddress - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = rsect.virtualSize -} - -func (ctxt *Link) dope() { - initdynimport(ctxt) - initdynexport(ctxt) -} - -func setpersrc(ctxt *Link, sym *sym.Symbol) { - if rsrcsym != nil { - Errorf(sym, "too many .rsrc sections") - } - - rsrcsym = sym -} - -func addpersrc(ctxt *Link) { - if rsrcsym == nil { - return - } - - h := pefile.addSection(".rsrc", int(rsrcsym.Size), int(rsrcsym.Size)) - h.characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE_SCN_CNT_INITIALIZED_DATA - h.checkOffset(ctxt.Out.Offset()) - - // relocation - for ri := range rsrcsym.R { - r := &rsrcsym.R[ri] - p := rsrcsym.P[r.Off:] - val := uint32(int64(h.virtualAddress) + r.Add) - - // 32-bit little-endian - p[0] = byte(val) - - p[1] = byte(val >> 8) - p[2] = byte(val >> 16) - p[3] = byte(val >> 24) - } - - ctxt.Out.Write(rsrcsym.P) - h.pad(ctxt.Out, uint32(rsrcsym.Size)) - - // update data directory - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = h.virtualAddress - - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = h.virtualSize -} - -func Asmbpe(ctxt *Link) { - switch ctxt.Arch.Family { - default: - Exitf("unknown PE architecture: %v", ctxt.Arch.Family) - case sys.AMD64, sys.I386, sys.ARM: - } - - t := pefile.addSection(".text", int(Segtext.Length), int(Segtext.Length)) - t.characteristics = IMAGE_SCN_CNT_CODE | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ - if ctxt.LinkMode == LinkExternal { - // some data symbols (e.g. masks) end up in the .text section, and they normally - // expect larger alignment requirement than the default text section alignment. - t.characteristics |= IMAGE_SCN_ALIGN_32BYTES - } - t.checkSegment(&Segtext) - pefile.textSect = t - - ro := pefile.addSection(".rdata", int(Segrodata.Length), int(Segrodata.Length)) - ro.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ - if ctxt.LinkMode == LinkExternal { - // some data symbols (e.g. masks) end up in the .rdata section, and they normally - // expect larger alignment requirement than the default text section alignment. - ro.characteristics |= IMAGE_SCN_ALIGN_32BYTES - } - ro.checkSegment(&Segrodata) - pefile.rdataSect = ro - - var d *peSection - if ctxt.LinkMode != LinkExternal { - d = pefile.addSection(".data", int(Segdata.Length), int(Segdata.Filelen)) - d.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE - d.checkSegment(&Segdata) - pefile.dataSect = d - } else { - d = pefile.addSection(".data", int(Segdata.Filelen), int(Segdata.Filelen)) - d.characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE_SCN_ALIGN_32BYTES - d.checkSegment(&Segdata) - pefile.dataSect = d - - b := pefile.addSection(".bss", int(Segdata.Length-Segdata.Filelen), 0) - b.characteristics = IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE_SCN_ALIGN_32BYTES - b.pointerToRawData = 0 - pefile.bssSect = b - } - - pefile.addDWARF() - - if ctxt.LinkMode == LinkExternal { - pefile.ctorsSect = pefile.addInitArray(ctxt) - } - - ctxt.Out.SeekSet(int64(pefile.nextFileOffset)) - if ctxt.LinkMode != LinkExternal { - addimports(ctxt, d) - addexports(ctxt) - addPEBaseReloc(ctxt) - } - pefile.writeSymbolTableAndStringTable(ctxt) - addpersrc(ctxt) - if ctxt.LinkMode == LinkExternal { - pefile.emitRelocations(ctxt) - } - - pewrite(ctxt) -} diff --git a/src/cmd/oldlink/internal/ld/sym.go b/src/cmd/oldlink/internal/ld/sym.go deleted file mode 100644 index 4f697d0627..0000000000 --- a/src/cmd/oldlink/internal/ld/sym.go +++ /dev/null @@ -1,109 +0,0 @@ -// Derived from Inferno utils/6l/obj.c and utils/6l/span.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/span.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ld - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "log" -) - -func linknew(arch *sys.Arch) *Link { - ctxt := &Link{ - Syms: sym.NewSymbols(), - Out: &OutBuf{arch: arch}, - Arch: arch, - LibraryByPkg: make(map[string]*sym.Library), - } - - if objabi.GOARCH != arch.Name { - log.Fatalf("invalid objabi.GOARCH %s (want %s)", objabi.GOARCH, arch.Name) - } - - AtExit(func() { - if nerrors > 0 && ctxt.Out.f != nil { - ctxt.Out.f.Close() - mayberemoveoutfile() - } - }) - - return ctxt -} - -// computeTLSOffset records the thread-local storage offset. -// Not used for Android where the TLS offset is determined at runtime. -func (ctxt *Link) computeTLSOffset() { - switch ctxt.HeadType { - default: - log.Fatalf("unknown thread-local storage offset for %v", ctxt.HeadType) - - case objabi.Hplan9, objabi.Hwindows, objabi.Hjs, objabi.Haix: - break - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd, - objabi.Hdragonfly, - objabi.Hsolaris: - /* - * ELF uses TLS offset negative from FS. - * Translate 0(FS) and 8(FS) into -16(FS) and -8(FS). - * Known to low-level assembly in package runtime and runtime/cgo. - */ - ctxt.Tlsoffset = -1 * ctxt.Arch.PtrSize - - case objabi.Hdarwin: - /* - * OS X system constants - offset from 0(GS) to our TLS. - */ - switch ctxt.Arch.Family { - default: - log.Fatalf("unknown thread-local storage offset for darwin/%s", ctxt.Arch.Name) - - /* - * For x86, Apple has reserved a slot in the TLS for Go. See issue 23617. - * That slot is at offset 0x30 on amd64. - * The slot will hold the G pointer. - * These constants should match those in runtime/sys_darwin_{386,amd64}.s - * and runtime/cgo/gcc_darwin_{386,amd64}.c. - */ - case sys.AMD64: - ctxt.Tlsoffset = 0x30 - - case sys.ARM64: - ctxt.Tlsoffset = 0 // dummy value, not needed - } - } - -} diff --git a/src/cmd/oldlink/internal/ld/symtab.go b/src/cmd/oldlink/internal/ld/symtab.go deleted file mode 100644 index a324fdf600..0000000000 --- a/src/cmd/oldlink/internal/ld/symtab.go +++ /dev/null @@ -1,713 +0,0 @@ -// Inferno utils/6l/span.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/span.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ld - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "fmt" - "path/filepath" - "strings" -) - -// Symbol table. - -func putelfstr(s string) int { - if len(Elfstrdat) == 0 && s != "" { - // first entry must be empty string - putelfstr("") - } - - off := len(Elfstrdat) - Elfstrdat = append(Elfstrdat, s...) - Elfstrdat = append(Elfstrdat, 0) - return off -} - -func putelfsyment(out *OutBuf, off int, addr int64, size int64, info int, shndx int, other int) { - if elf64 { - out.Write32(uint32(off)) - out.Write8(uint8(info)) - out.Write8(uint8(other)) - out.Write16(uint16(shndx)) - out.Write64(uint64(addr)) - out.Write64(uint64(size)) - Symsize += ELF64SYMSIZE - } else { - out.Write32(uint32(off)) - out.Write32(uint32(addr)) - out.Write32(uint32(size)) - out.Write8(uint8(info)) - out.Write8(uint8(other)) - out.Write16(uint16(shndx)) - Symsize += ELF32SYMSIZE - } -} - -var numelfsym = 1 // 0 is reserved - -var elfbind int - -func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64, go_ *sym.Symbol) { - var typ int - - switch t { - default: - return - - case TextSym: - typ = STT_FUNC - - case DataSym, BSSSym: - typ = STT_OBJECT - - case UndefinedSym: - // ElfType is only set for symbols read from Go shared libraries, but - // for other symbols it is left as STT_NOTYPE which is fine. - typ = int(x.ElfType()) - - case TLSSym: - typ = STT_TLS - } - - size := x.Size - if t == UndefinedSym { - size = 0 - } - - xo := x - for xo.Outer != nil { - xo = xo.Outer - } - - var elfshnum int - if xo.Type == sym.SDYNIMPORT || xo.Type == sym.SHOSTOBJ || xo.Type == sym.SUNDEFEXT { - elfshnum = SHN_UNDEF - } else { - if xo.Sect == nil { - Errorf(x, "missing section in putelfsym") - return - } - if xo.Sect.Elfsect == nil { - Errorf(x, "missing ELF section in putelfsym") - return - } - elfshnum = xo.Sect.Elfsect.(*ElfShdr).shnum - } - - // One pass for each binding: STB_LOCAL, STB_GLOBAL, - // maybe one day STB_WEAK. - bind := STB_GLOBAL - - if x.IsFileLocal() || x.Attr.VisibilityHidden() || x.Attr.Local() { - bind = STB_LOCAL - } - - // In external linking mode, we have to invoke gcc with -rdynamic - // to get the exported symbols put into the dynamic symbol table. - // To avoid filling the dynamic table with lots of unnecessary symbols, - // mark all Go symbols local (not global) in the final executable. - // But when we're dynamically linking, we need all those global symbols. - if !ctxt.DynlinkingGo() && ctxt.LinkMode == LinkExternal && !x.Attr.CgoExportStatic() && elfshnum != SHN_UNDEF { - bind = STB_LOCAL - } - - if ctxt.LinkMode == LinkExternal && elfshnum != SHN_UNDEF { - addr -= int64(xo.Sect.Vaddr) - } - other := STV_DEFAULT - if x.Attr.VisibilityHidden() { - // TODO(mwhudson): We only set AttrVisibilityHidden in ldelf, i.e. when - // internally linking. But STV_HIDDEN visibility only matters in object - // files and shared libraries, and as we are a long way from implementing - // internal linking for shared libraries and only create object files when - // externally linking, I don't think this makes a lot of sense. - other = STV_HIDDEN - } - if ctxt.Arch.Family == sys.PPC64 && typ == STT_FUNC && x.Attr.Shared() && x.Name != "runtime.duffzero" && x.Name != "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 - } - - // When dynamically linking, we create Symbols by reading the names from - // the symbol tables of the shared libraries and so the names need to - // match exactly. Tools like DTrace will have to wait for now. - if !ctxt.DynlinkingGo() { - // Rewrite · to . for ASCII-only tools like DTrace (sigh) - s = strings.Replace(s, "·", ".", -1) - } - - if ctxt.DynlinkingGo() && bind == STB_GLOBAL && elfbind == STB_LOCAL && x.Type == sym.STEXT { - // When dynamically linking, we want references to functions defined - // in this module to always be to the function object, not to the - // PLT. We force this by writing an additional local symbol for every - // global function symbol and making all relocations against the - // global symbol refer to this local symbol instead (see - // (*sym.Symbol).ElfsymForReloc). This is approximately equivalent to the - // ELF linker -Bsymbolic-functions option, but that is buggy on - // several platforms. - putelfsyment(ctxt.Out, putelfstr("local."+s), addr, size, STB_LOCAL<<4|typ&0xf, elfshnum, other) - x.LocalElfsym = int32(numelfsym) - numelfsym++ - return - } else if bind != elfbind { - return - } - - putelfsyment(ctxt.Out, putelfstr(s), addr, size, bind<<4|typ&0xf, elfshnum, other) - x.Elfsym = int32(numelfsym) - numelfsym++ -} - -func putelfsectionsym(out *OutBuf, s *sym.Symbol, shndx int) { - putelfsyment(out, 0, 0, 0, STB_LOCAL<<4|STT_SECTION, shndx, 0) - s.Elfsym = int32(numelfsym) - numelfsym++ -} - -func Asmelfsym(ctxt *Link) { - // the first symbol entry is reserved - putelfsyment(ctxt.Out, 0, 0, 0, STB_LOCAL<<4|STT_NOTYPE, 0, 0) - - dwarfaddelfsectionsyms(ctxt) - - // Some linkers will add a FILE sym if one is not present. - // Avoid having the working directory inserted into the symbol table. - // It is added with a name to avoid problems with external linking - // encountered on some versions of Solaris. See issue #14957. - putelfsyment(ctxt.Out, putelfstr("go.go"), 0, 0, STB_LOCAL<<4|STT_FILE, SHN_ABS, 0) - numelfsym++ - - elfbind = STB_LOCAL - genasmsym(ctxt, putelfsym) - - elfbind = STB_GLOBAL - elfglobalsymndx = numelfsym - genasmsym(ctxt, putelfsym) -} - -func putplan9sym(ctxt *Link, x *sym.Symbol, s string, typ SymbolType, addr int64, go_ *sym.Symbol) { - t := int(typ) - switch typ { - case TextSym, DataSym, BSSSym: - if x.IsFileLocal() { - t += 'a' - 'A' - } - fallthrough - - case AutoSym, ParamSym, FrameSym: - l := 4 - if ctxt.HeadType == objabi.Hplan9 && ctxt.Arch.Family == sys.AMD64 && !Flag8 { - ctxt.Out.Write32b(uint32(addr >> 32)) - l = 8 - } - - ctxt.Out.Write32b(uint32(addr)) - ctxt.Out.Write8(uint8(t + 0x80)) /* 0x80 is variable length */ - - ctxt.Out.WriteString(s) - ctxt.Out.Write8(0) - - Symsize += int32(l) + 1 + int32(len(s)) + 1 - - default: - return - } -} - -func Asmplan9sym(ctxt *Link) { - genasmsym(ctxt, putplan9sym) -} - -var symt *sym.Symbol - -type byPkg []*sym.Library - -func (libs byPkg) Len() int { - return len(libs) -} - -func (libs byPkg) Less(a, b int) bool { - return libs[a].Pkg < libs[b].Pkg -} - -func (libs byPkg) Swap(a, b int) { - libs[a], libs[b] = libs[b], libs[a] -} - -// Create a table with information on the text sections. - -func textsectionmap(ctxt *Link) uint32 { - - t := ctxt.Syms.Lookup("runtime.textsectionmap", 0) - t.Type = sym.SRODATA - t.Attr |= sym.AttrReachable - nsections := int64(0) - - for _, sect := range Segtext.Sections { - if sect.Name == ".text" { - nsections++ - } else { - break - } - } - t.Grow(3 * nsections * int64(ctxt.Arch.PtrSize)) - - off := int64(0) - n := 0 - - // The vaddr for each text section is the difference between the section's - // Vaddr and the Vaddr for the first text section as determined at compile - // time. - - // The symbol for the first text section is named runtime.text as before. - // Additional text sections are named runtime.text.n where n is the - // order of creation starting with 1. These symbols provide the section's - // address after relocation by the linker. - - textbase := Segtext.Sections[0].Vaddr - for _, sect := range Segtext.Sections { - if sect.Name != ".text" { - break - } - off = t.SetUint(ctxt.Arch, off, sect.Vaddr-textbase) - off = t.SetUint(ctxt.Arch, off, sect.Length) - if n == 0 { - s := ctxt.Syms.ROLookup("runtime.text", 0) - if s == nil { - Errorf(nil, "Unable to find symbol runtime.text\n") - } - off = t.SetAddr(ctxt.Arch, off, s) - - } else { - s := ctxt.Syms.Lookup(fmt.Sprintf("runtime.text.%d", n), 0) - if s == nil { - Errorf(nil, "Unable to find symbol runtime.text.%d\n", n) - } - off = t.SetAddr(ctxt.Arch, off, s) - } - n++ - } - return uint32(n) -} - -func (ctxt *Link) symtab() { - switch ctxt.BuildMode { - case BuildModeCArchive, BuildModeCShared: - for _, s := range ctxt.Syms.Allsym { - // Create a new entry in the .init_array section that points to the - // library initializer function. - if s.Name == *flagEntrySymbol && ctxt.HeadType != objabi.Haix { - addinitarrdata(ctxt, s) - } - } - } - - // Define these so that they'll get put into the symbol table. - // data.c:/^address will provide the actual values. - ctxt.xdefine("runtime.text", sym.STEXT, 0) - - ctxt.xdefine("runtime.etext", sym.STEXT, 0) - ctxt.xdefine("runtime.itablink", sym.SRODATA, 0) - ctxt.xdefine("runtime.eitablink", sym.SRODATA, 0) - ctxt.xdefine("runtime.rodata", sym.SRODATA, 0) - ctxt.xdefine("runtime.erodata", sym.SRODATA, 0) - ctxt.xdefine("runtime.types", sym.SRODATA, 0) - ctxt.xdefine("runtime.etypes", sym.SRODATA, 0) - ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, 0) - ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATA, 0) - ctxt.xdefine("runtime.data", sym.SDATA, 0) - ctxt.xdefine("runtime.edata", sym.SDATA, 0) - ctxt.xdefine("runtime.bss", sym.SBSS, 0) - ctxt.xdefine("runtime.ebss", sym.SBSS, 0) - ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, 0) - ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, 0) - ctxt.xdefine("runtime.end", sym.SBSS, 0) - ctxt.xdefine("runtime.epclntab", sym.SRODATA, 0) - ctxt.xdefine("runtime.esymtab", sym.SRODATA, 0) - - // garbage collection symbols - s := ctxt.Syms.Lookup("runtime.gcdata", 0) - - s.Type = sym.SRODATA - s.Size = 0 - s.Attr |= sym.AttrReachable - ctxt.xdefine("runtime.egcdata", sym.SRODATA, 0) - - s = ctxt.Syms.Lookup("runtime.gcbss", 0) - s.Type = sym.SRODATA - s.Size = 0 - s.Attr |= sym.AttrReachable - ctxt.xdefine("runtime.egcbss", sym.SRODATA, 0) - - // pseudo-symbols to mark locations of type, string, and go string data. - var symtype *sym.Symbol - var symtyperel *sym.Symbol - if !ctxt.DynlinkingGo() { - if ctxt.UseRelro() && (ctxt.BuildMode == BuildModeCArchive || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE) { - s = ctxt.Syms.Lookup("type.*", 0) - - s.Type = sym.STYPE - s.Size = 0 - s.Attr |= sym.AttrReachable - symtype = s - - s = ctxt.Syms.Lookup("typerel.*", 0) - - s.Type = sym.STYPERELRO - s.Size = 0 - s.Attr |= sym.AttrReachable - symtyperel = s - } else { - s = ctxt.Syms.Lookup("type.*", 0) - - s.Type = sym.STYPE - s.Size = 0 - s.Attr |= sym.AttrReachable - symtype = s - symtyperel = s - } - } - - groupSym := func(name string, t sym.SymKind) *sym.Symbol { - s := ctxt.Syms.Lookup(name, 0) - s.Type = t - s.Size = 0 - s.Attr |= sym.AttrLocal | sym.AttrReachable - return s - } - var ( - symgostring = groupSym("go.string.*", sym.SGOSTRING) - symgofunc = groupSym("go.func.*", sym.SGOFUNC) - symgcbits = groupSym("runtime.gcbits.*", sym.SGCBITS) - ) - - var symgofuncrel *sym.Symbol - if !ctxt.DynlinkingGo() { - if ctxt.UseRelro() { - symgofuncrel = groupSym("go.funcrel.*", sym.SGOFUNCRELRO) - } else { - symgofuncrel = symgofunc - } - } - - symitablink := ctxt.Syms.Lookup("runtime.itablink", 0) - symitablink.Type = sym.SITABLINK - - symt = ctxt.Syms.Lookup("runtime.symtab", 0) - symt.Attr |= sym.AttrLocal - symt.Type = sym.SSYMTAB - symt.Size = 0 - symt.Attr |= sym.AttrReachable - - nitablinks := 0 - - // assign specific types so that they sort together. - // within a type they sort by size, so the .* symbols - // just defined above will be first. - // hide the specific symbols. - for _, s := range ctxt.Syms.Allsym { - if ctxt.LinkMode != LinkExternal && isStaticTemp(s.Name) { - s.Attr |= sym.AttrNotInSymbolTable - } - - if !s.Attr.Reachable() || s.Attr.Special() || s.Type != sym.SRODATA { - continue - } - - switch { - case strings.HasPrefix(s.Name, "type."): - if !ctxt.DynlinkingGo() { - s.Attr |= sym.AttrNotInSymbolTable - } - if ctxt.UseRelro() { - s.Type = sym.STYPERELRO - s.Outer = symtyperel - } else { - s.Type = sym.STYPE - s.Outer = symtype - } - - case strings.HasPrefix(s.Name, "go.importpath.") && ctxt.UseRelro(): - // Keep go.importpath symbols in the same section as types and - // names, as they can be referred to by a section offset. - s.Type = sym.STYPERELRO - - case strings.HasPrefix(s.Name, "go.itablink."): - nitablinks++ - s.Type = sym.SITABLINK - s.Attr |= sym.AttrNotInSymbolTable - s.Outer = symitablink - - case strings.HasPrefix(s.Name, "go.string."): - s.Type = sym.SGOSTRING - s.Attr |= sym.AttrNotInSymbolTable - s.Outer = symgostring - - case strings.HasPrefix(s.Name, "runtime.gcbits."): - s.Type = sym.SGCBITS - s.Attr |= sym.AttrNotInSymbolTable - s.Outer = symgcbits - - case strings.HasSuffix(s.Name, "·f"): - if !ctxt.DynlinkingGo() { - s.Attr |= sym.AttrNotInSymbolTable - } - if ctxt.UseRelro() { - s.Type = sym.SGOFUNCRELRO - s.Outer = symgofuncrel - } else { - s.Type = sym.SGOFUNC - s.Outer = symgofunc - } - - case strings.HasPrefix(s.Name, "gcargs."), - strings.HasPrefix(s.Name, "gclocals."), - strings.HasPrefix(s.Name, "gclocals·"), - strings.HasPrefix(s.Name, "inltree."), - strings.HasSuffix(s.Name, ".opendefer"): - s.Type = sym.SGOFUNC - s.Attr |= sym.AttrNotInSymbolTable - s.Outer = symgofunc - s.Align = 4 - liveness += (s.Size + int64(s.Align) - 1) &^ (int64(s.Align) - 1) - } - } - - if ctxt.BuildMode == BuildModeShared { - abihashgostr := ctxt.Syms.Lookup("go.link.abihash."+filepath.Base(*flagOutfile), 0) - abihashgostr.Attr |= sym.AttrReachable - abihashgostr.Type = sym.SRODATA - hashsym := ctxt.Syms.Lookup("go.link.abihashbytes", 0) - abihashgostr.AddAddr(ctxt.Arch, hashsym) - abihashgostr.AddUint(ctxt.Arch, uint64(hashsym.Size)) - } - if ctxt.BuildMode == BuildModePlugin || ctxt.CanUsePlugins() { - for _, l := range ctxt.Library { - s := ctxt.Syms.Lookup("go.link.pkghashbytes."+l.Pkg, 0) - s.Attr |= sym.AttrReachable - s.Type = sym.SRODATA - s.Size = int64(len(l.Hash)) - s.P = []byte(l.Hash) - str := ctxt.Syms.Lookup("go.link.pkghash."+l.Pkg, 0) - str.Attr |= sym.AttrReachable - str.Type = sym.SRODATA - str.AddAddr(ctxt.Arch, s) - str.AddUint(ctxt.Arch, uint64(len(l.Hash))) - } - } - - nsections := textsectionmap(ctxt) - - // Information about the layout of the executable image for the - // runtime to use. Any changes here must be matched by changes to - // the definition of moduledata in runtime/symtab.go. - // This code uses several global variables that are set by pcln.go:pclntab. - moduledata := ctxt.Moduledata - // The pclntab slice - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.pclntab", 0)) - moduledata.AddUint(ctxt.Arch, uint64(ctxt.Syms.Lookup("runtime.pclntab", 0).Size)) - moduledata.AddUint(ctxt.Arch, uint64(ctxt.Syms.Lookup("runtime.pclntab", 0).Size)) - // The ftab slice - moduledata.AddAddrPlus(ctxt.Arch, ctxt.Syms.Lookup("runtime.pclntab", 0), int64(pclntabPclntabOffset)) - moduledata.AddUint(ctxt.Arch, uint64(pclntabNfunc+1)) - moduledata.AddUint(ctxt.Arch, uint64(pclntabNfunc+1)) - // The filetab slice - moduledata.AddAddrPlus(ctxt.Arch, ctxt.Syms.Lookup("runtime.pclntab", 0), int64(pclntabFiletabOffset)) - moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Filesyms))+1) - moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Filesyms))+1) - // findfunctab - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.findfunctab", 0)) - // minpc, maxpc - moduledata.AddAddr(ctxt.Arch, pclntabFirstFunc) - moduledata.AddAddrPlus(ctxt.Arch, pclntabLastFunc, pclntabLastFunc.Size) - // pointers to specific parts of the module - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.text", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.etext", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.noptrdata", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.enoptrdata", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.data", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.edata", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.bss", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.ebss", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.noptrbss", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.enoptrbss", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.end", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.gcdata", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.gcbss", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.types", 0)) - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.etypes", 0)) - - if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal { - // Add R_REF relocation to prevent ld's garbage collection of - // runtime.rodata, runtime.erodata and runtime.epclntab. - addRef := func(name string) { - r := moduledata.AddRel() - r.Sym = ctxt.Syms.Lookup(name, 0) - r.Type = objabi.R_XCOFFREF - r.Siz = uint8(ctxt.Arch.PtrSize) - } - addRef("runtime.rodata") - addRef("runtime.erodata") - addRef("runtime.epclntab") - } - - // text section information - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.textsectionmap", 0)) - moduledata.AddUint(ctxt.Arch, uint64(nsections)) - moduledata.AddUint(ctxt.Arch, uint64(nsections)) - - // The typelinks slice - typelinkSym := ctxt.Syms.Lookup("runtime.typelink", 0) - ntypelinks := uint64(typelinkSym.Size) / 4 - moduledata.AddAddr(ctxt.Arch, typelinkSym) - moduledata.AddUint(ctxt.Arch, ntypelinks) - moduledata.AddUint(ctxt.Arch, ntypelinks) - // The itablinks slice - moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.itablink", 0)) - moduledata.AddUint(ctxt.Arch, uint64(nitablinks)) - moduledata.AddUint(ctxt.Arch, uint64(nitablinks)) - // The ptab slice - if ptab := ctxt.Syms.ROLookup("go.plugin.tabs", 0); ptab != nil && ptab.Attr.Reachable() { - ptab.Attr |= sym.AttrLocal - ptab.Type = sym.SRODATA - - nentries := uint64(len(ptab.P) / 8) // sizeof(nameOff) + sizeof(typeOff) - moduledata.AddAddr(ctxt.Arch, ptab) - moduledata.AddUint(ctxt.Arch, nentries) - moduledata.AddUint(ctxt.Arch, nentries) - } else { - moduledata.AddUint(ctxt.Arch, 0) - moduledata.AddUint(ctxt.Arch, 0) - moduledata.AddUint(ctxt.Arch, 0) - } - if ctxt.BuildMode == BuildModePlugin { - addgostring(ctxt, moduledata, "go.link.thispluginpath", objabi.PathToPrefix(*flagPluginPath)) - - pkghashes := ctxt.Syms.Lookup("go.link.pkghashes", 0) - pkghashes.Attr |= sym.AttrReachable - pkghashes.Attr |= sym.AttrLocal - pkghashes.Type = sym.SRODATA - - for i, l := range ctxt.Library { - // pkghashes[i].name - addgostring(ctxt, pkghashes, fmt.Sprintf("go.link.pkgname.%d", i), l.Pkg) - // pkghashes[i].linktimehash - addgostring(ctxt, pkghashes, fmt.Sprintf("go.link.pkglinkhash.%d", i), l.Hash) - // pkghashes[i].runtimehash - hash := ctxt.Syms.ROLookup("go.link.pkghash."+l.Pkg, 0) - pkghashes.AddAddr(ctxt.Arch, hash) - } - moduledata.AddAddr(ctxt.Arch, pkghashes) - moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Library))) - moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Library))) - } else { - moduledata.AddUint(ctxt.Arch, 0) // pluginpath - moduledata.AddUint(ctxt.Arch, 0) - moduledata.AddUint(ctxt.Arch, 0) // pkghashes slice - moduledata.AddUint(ctxt.Arch, 0) - moduledata.AddUint(ctxt.Arch, 0) - } - if len(ctxt.Shlibs) > 0 { - thismodulename := filepath.Base(*flagOutfile) - switch ctxt.BuildMode { - case BuildModeExe, BuildModePIE: - // When linking an executable, outfile is just "a.out". Make - // it something slightly more comprehensible. - thismodulename = "the executable" - } - addgostring(ctxt, moduledata, "go.link.thismodulename", thismodulename) - - modulehashes := ctxt.Syms.Lookup("go.link.abihashes", 0) - modulehashes.Attr |= sym.AttrReachable - modulehashes.Attr |= sym.AttrLocal - modulehashes.Type = sym.SRODATA - - for i, shlib := range ctxt.Shlibs { - // modulehashes[i].modulename - modulename := filepath.Base(shlib.Path) - addgostring(ctxt, modulehashes, fmt.Sprintf("go.link.libname.%d", i), modulename) - - // modulehashes[i].linktimehash - addgostring(ctxt, modulehashes, fmt.Sprintf("go.link.linkhash.%d", i), string(shlib.Hash)) - - // modulehashes[i].runtimehash - abihash := ctxt.Syms.Lookup("go.link.abihash."+modulename, 0) - abihash.Attr |= sym.AttrReachable - modulehashes.AddAddr(ctxt.Arch, abihash) - } - - moduledata.AddAddr(ctxt.Arch, modulehashes) - moduledata.AddUint(ctxt.Arch, uint64(len(ctxt.Shlibs))) - moduledata.AddUint(ctxt.Arch, 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) - } - - hasmain := ctxt.BuildMode == BuildModeExe || ctxt.BuildMode == BuildModePIE - if hasmain { - moduledata.AddUint8(1) - } else { - moduledata.AddUint8(0) - } - - // The rest of moduledata is zero initialized. - // When linking an object that does not contain the runtime we are - // creating the moduledata from scratch and it does not have a - // compiler-provided size, so read it from the type data. - moduledatatype := ctxt.Syms.ROLookup("type.runtime.moduledata", 0) - moduledata.Size = decodetypeSize(ctxt.Arch, moduledatatype.P) - moduledata.Grow(moduledata.Size) - - lastmoduledatap := ctxt.Syms.Lookup("runtime.lastmoduledatap", 0) - if lastmoduledatap.Type != sym.SDYNIMPORT { - lastmoduledatap.Type = sym.SNOPTRDATA - lastmoduledatap.Size = 0 // overwrite existing value - lastmoduledatap.AddAddr(ctxt.Arch, moduledata) - } -} - -func isStaticTemp(name string) bool { - if i := strings.LastIndex(name, "/"); i >= 0 { - name = name[i:] - } - return strings.Contains(name, "..stmp_") -} diff --git a/src/cmd/oldlink/internal/ld/testdata/httptest/main/main.go b/src/cmd/oldlink/internal/ld/testdata/httptest/main/main.go deleted file mode 100644 index 1bce30119a..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/httptest/main/main.go +++ /dev/null @@ -1,22 +0,0 @@ -// A small test program that uses the net/http package. There is -// nothing special about net/http here, this is just a convenient way -// to pull in a lot of code. - -package main - -import ( - "net/http" - "net/http/httptest" -) - -type statusHandler int - -func (h *statusHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(int(*h)) -} - -func main() { - status := statusHandler(http.StatusNotFound) - s := httptest.NewServer(&status) - defer s.Close() -} diff --git a/src/cmd/oldlink/internal/ld/testdata/issue10978/main.go b/src/cmd/oldlink/internal/ld/testdata/issue10978/main.go deleted file mode 100644 index 5e8c09749f..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue10978/main.go +++ /dev/null @@ -1,27 +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 - -func undefined() - -func defined1() int { - // To check multiple errors for a single symbol, - // reference undefined more than once. - undefined() - undefined() - return 0 -} - -func defined2() { - undefined() - undefined() -} - -func init() { - _ = defined1() - defined2() -} - -// The "main" function remains undeclared. diff --git a/src/cmd/oldlink/internal/ld/testdata/issue10978/main.s b/src/cmd/oldlink/internal/ld/testdata/issue10978/main.s deleted file mode 100644 index 1d00e76c1d..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue10978/main.s +++ /dev/null @@ -1 +0,0 @@ -// This file is needed to make "go build" work for package with external functions. diff --git a/src/cmd/oldlink/internal/ld/testdata/issue25459/a/a.go b/src/cmd/oldlink/internal/ld/testdata/issue25459/a/a.go deleted file mode 100644 index 6032d76f49..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue25459/a/a.go +++ /dev/null @@ -1,27 +0,0 @@ -package a - -const Always = true - -var Count int - -type FuncReturningInt func() int - -var PointerToConstIf FuncReturningInt - -func ConstIf() int { - if Always { - return 1 - } - var imdead [4]int - imdead[Count] = 1 - return imdead[0] -} - -func CallConstIf() int { - Count += 3 - return ConstIf() -} - -func Another() { - defer func() { PointerToConstIf = ConstIf; Count += 1 }() -} diff --git a/src/cmd/oldlink/internal/ld/testdata/issue25459/main/main.go b/src/cmd/oldlink/internal/ld/testdata/issue25459/main/main.go deleted file mode 100644 index 3f5f365169..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue25459/main/main.go +++ /dev/null @@ -1,10 +0,0 @@ -package main - -import "cmd/oldlink/internal/ld/testdata/issue25459/a" - -var Glob int - -func main() { - a.Another() - Glob += a.ConstIf() + a.CallConstIf() -} diff --git a/src/cmd/oldlink/internal/ld/testdata/issue26237/b.dir/b.go b/src/cmd/oldlink/internal/ld/testdata/issue26237/b.dir/b.go deleted file mode 100644 index ca577490bc..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue26237/b.dir/b.go +++ /dev/null @@ -1,16 +0,0 @@ -package b - -var q int - -func Top(x int) int { - q += 1 - if q != x { - return 3 - } - return 4 -} - -func OOO(x int) int { - defer func() { q += x & 7 }() - return Top(x + 1) -} diff --git a/src/cmd/oldlink/internal/ld/testdata/issue26237/main/main.go b/src/cmd/oldlink/internal/ld/testdata/issue26237/main/main.go deleted file mode 100644 index 88b54f1678..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue26237/main/main.go +++ /dev/null @@ -1,16 +0,0 @@ -package main - -import ( - "fmt" - - b "cmd/oldlink/internal/ld/testdata/issue26237/b.dir" -) - -var skyx int - -func main() { - skyx += b.OOO(skyx) - if b.Top(1) == 99 { - fmt.Printf("Beware the Jabberwock, my son!\n") - } -} diff --git a/src/cmd/oldlink/internal/ld/testdata/issue32233/lib/ObjC.m b/src/cmd/oldlink/internal/ld/testdata/issue32233/lib/ObjC.m deleted file mode 100644 index 946278803e..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue32233/lib/ObjC.m +++ /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. - -#import -#import - -BOOL function(void) { -#if defined(MAC_OS_X_VERSION_MIN_REQUIRED) && (MAC_OS_X_VERSION_MIN_REQUIRED > 101300) - NSAppearance *darkAppearance; - if (@available(macOS 10.14, *)) { - darkAppearance = [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]; - } -#endif - return NO; -} diff --git a/src/cmd/oldlink/internal/ld/testdata/issue32233/lib/lib.go b/src/cmd/oldlink/internal/ld/testdata/issue32233/lib/lib.go deleted file mode 100644 index 514b9b9a4a..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue32233/lib/lib.go +++ /dev/null @@ -1,19 +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 lib - -/* -#cgo darwin CFLAGS: -D__MAC_OS_X_VERSION_MAX_ALLOWED=101450 -#cgo darwin LDFLAGS: -framework Foundation -framework AppKit -#include "stdlib.h" -int function(void); -*/ -import "C" -import "fmt" - -func DoC() { - C.function() - fmt.Println("called c function") -} diff --git a/src/cmd/oldlink/internal/ld/testdata/issue32233/main/main.go b/src/cmd/oldlink/internal/ld/testdata/issue32233/main/main.go deleted file mode 100644 index 9eec6cc5b5..0000000000 --- a/src/cmd/oldlink/internal/ld/testdata/issue32233/main/main.go +++ /dev/null @@ -1,11 +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 main - -import "cmd/oldlink/internal/ld/testdata/issue32233/lib" - -func main() { - lib.DoC() -} diff --git a/src/cmd/oldlink/internal/ld/typelink.go b/src/cmd/oldlink/internal/ld/typelink.go deleted file mode 100644 index 07d04bb13d..0000000000 --- a/src/cmd/oldlink/internal/ld/typelink.go +++ /dev/null @@ -1,49 +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 ld - -import ( - "cmd/internal/objabi" - "cmd/oldlink/internal/sym" - "sort" -) - -type byTypeStr []typelinkSortKey - -type typelinkSortKey struct { - TypeStr string - Type *sym.Symbol -} - -func (s byTypeStr) Less(i, j int) bool { return s[i].TypeStr < s[j].TypeStr } -func (s byTypeStr) Len() int { return len(s) } -func (s byTypeStr) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// typelink generates the typelink table which is used by reflect.typelinks(). -// Types that should be added to the typelinks table are marked with the -// MakeTypelink attribute by the compiler. -func (ctxt *Link) typelink() { - typelinks := byTypeStr{} - for _, s := range ctxt.Syms.Allsym { - if s.Attr.Reachable() && s.Attr.MakeTypelink() { - typelinks = append(typelinks, typelinkSortKey{decodetypeStr(ctxt.Arch, s), s}) - } - } - sort.Sort(typelinks) - - tl := ctxt.Syms.Lookup("runtime.typelink", 0) - tl.Type = sym.STYPELINK - tl.Attr |= sym.AttrReachable | sym.AttrLocal - tl.Size = int64(4 * len(typelinks)) - tl.P = make([]byte, tl.Size) - tl.R = make([]sym.Reloc, len(typelinks)) - for i, s := range typelinks { - r := &tl.R[i] - r.Sym = s.Type - r.Off = int32(i * 4) - r.Siz = 4 - r.Type = objabi.R_ADDROFF - } -} diff --git a/src/cmd/oldlink/internal/ld/util.go b/src/cmd/oldlink/internal/ld/util.go deleted file mode 100644 index 97c9a44c1e..0000000000 --- a/src/cmd/oldlink/internal/ld/util.go +++ /dev/null @@ -1,97 +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 ld - -import ( - "cmd/oldlink/internal/sym" - "encoding/binary" - "fmt" - "os" -) - -var atExitFuncs []func() - -func AtExit(f func()) { - atExitFuncs = append(atExitFuncs, f) -} - -// runAtExitFuncs runs the queued set of AtExit functions. -func runAtExitFuncs() { - for i := len(atExitFuncs) - 1; i >= 0; i-- { - atExitFuncs[i]() - } - atExitFuncs = nil -} - -// Exit exits with code after executing all atExitFuncs. -func Exit(code int) { - runAtExitFuncs() - os.Exit(code) -} - -// Exitf logs an error message then calls Exit(2). -func Exitf(format string, a ...interface{}) { - fmt.Fprintf(os.Stderr, os.Args[0]+": "+format+"\n", a...) - nerrors++ - Exit(2) -} - -// Errorf logs an error message. -// -// If more than 20 errors have been printed, exit with an error. -// -// Logging an error means that on exit cmd/link will delete any -// output file and return a non-zero error code. -func Errorf(s *sym.Symbol, format string, args ...interface{}) { - if s != nil { - format = s.Name + ": " + format - } - format += "\n" - fmt.Fprintf(os.Stderr, format, args...) - nerrors++ - if *flagH { - panic("error") - } - if nerrors > 20 { - Exitf("too many errors") - } -} - -func artrim(x []byte) string { - i := 0 - j := len(x) - for i < len(x) && x[i] == ' ' { - i++ - } - for j > i && x[j-1] == ' ' { - j-- - } - return string(x[i:j]) -} - -func stringtouint32(x []uint32, s string) { - for i := 0; len(s) > 0; i++ { - var buf [4]byte - s = s[copy(buf[:], s):] - x[i] = binary.LittleEndian.Uint32(buf[:]) - } -} - -// contains reports whether v is in s. -func contains(s []string, v string) bool { - for _, x := range s { - if x == v { - return true - } - } - return false -} - -// implements sort.Interface, for sorting symbols by name. -type byName []*sym.Symbol - -func (s byName) Len() int { return len(s) } -func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s byName) Less(i, j int) bool { return s[i].Name < s[j].Name } diff --git a/src/cmd/oldlink/internal/ld/xcoff.go b/src/cmd/oldlink/internal/ld/xcoff.go deleted file mode 100644 index 4d66d6d75e..0000000000 --- a/src/cmd/oldlink/internal/ld/xcoff.go +++ /dev/null @@ -1,1685 +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 ld - -import ( - "bytes" - "cmd/internal/objabi" - "cmd/oldlink/internal/sym" - "encoding/binary" - "io/ioutil" - "math/bits" - "path/filepath" - "sort" - "strings" -) - -// This file handles all algorithms related to XCOFF files generation. -// Most of them are adaptations of the ones in cmd/oldlink/internal/pe.go -// as PE and XCOFF are based on COFF files. -// XCOFF files generated are 64 bits. - -const ( - // Total amount of space to reserve at the start of the file - // for File Header, Auxiliary Header, and Section Headers. - // May waste some. - XCOFFHDRRESERVE = FILHSZ_64 + AOUTHSZ_EXEC64 + SCNHSZ_64*23 - XCOFFSECTALIGN int64 = 32 // base on dump -o - - // 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 - // segment during execution to force segfault if something is wrong. - XCOFFTEXTBASE = 0x100000000 // Start of text address - XCOFFDATABASE = 0x200000000 // Start of data address -) - -// File Header -type XcoffFileHdr64 struct { - Fmagic uint16 // Target machine - Fnscns uint16 // Number of sections - Ftimedat int32 // 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 -} - -const ( - U64_TOCMAGIC = 0767 // AIX 64-bit XCOFF -) - -// Flags that describe the type of the object file. -const ( - F_RELFLG = 0x0001 - F_EXEC = 0x0002 - F_LNNO = 0x0004 - F_FDPR_PROF = 0x0010 - F_FDPR_OPTI = 0x0020 - F_DSA = 0x0040 - F_VARPG = 0x0100 - F_DYNLOAD = 0x1000 - F_SHROBJ = 0x2000 - F_LOADONLY = 0x4000 -) - -// Auxiliary Header -type XcoffAoutHdr64 struct { - Omagic int16 // Flags - Ignored If Vstamp Is 1 - Ovstamp int16 // Version - Odebugger uint32 // Reserved For Debugger - Otextstart uint64 // Virtual Address Of Text - Odatastart uint64 // Virtual Address Of Data - Otoc uint64 // Toc Address - Osnentry int16 // Section Number For Entry Point - Osntext int16 // Section Number For Text - Osndata int16 // Section Number For Data - Osntoc int16 // Section Number For Toc - Osnloader int16 // Section Number For Loader - Osnbss int16 // Section Number For Bss - Oalgntext int16 // Max Text Alignment - Oalgndata int16 // Max Data Alignment - Omodtype [2]byte // Module Type Field - Ocpuflag uint8 // Bit Flags - Cputypes Of Objects - Ocputype uint8 // Reserved for CPU type - Otextpsize uint8 // Requested text page size - Odatapsize uint8 // Requested data page size - Ostackpsize uint8 // Requested stack page size - Oflags uint8 // Flags And TLS Alignment - Otsize uint64 // Text Size In Bytes - Odsize uint64 // Data Size In Bytes - Obsize uint64 // Bss Size In Bytes - Oentry uint64 // Entry Point Address - Omaxstack uint64 // Max Stack Size Allowed - Omaxdata uint64 // Max Data Size Allowed - Osntdata int16 // Section Number For Tdata Section - Osntbss int16 // Section Number For Tbss Section - Ox64flags uint16 // Additional Flags For 64-Bit Objects - Oresv3a int16 // Reserved - Oresv3 [2]int32 // Reserved -} - -// Section Header -type XcoffScnHdr64 struct { - Sname [8]byte // Section Name - Spaddr uint64 // Physical Address - Svaddr uint64 // Virtual Address - Ssize uint64 // Section Size - Sscnptr uint64 // File Offset To Raw Data - Srelptr uint64 // File Offset To Relocation - Slnnoptr uint64 // File Offset To Line Numbers - Snreloc uint32 // Number Of Relocation Entries - Snlnno uint32 // Number Of Line Number Entries - Sflags uint32 // flags -} - -// Flags defining the section type. -const ( - STYP_DWARF = 0x0010 - STYP_TEXT = 0x0020 - STYP_DATA = 0x0040 - STYP_BSS = 0x0080 - STYP_EXCEPT = 0x0100 - STYP_INFO = 0x0200 - STYP_TDATA = 0x0400 - STYP_TBSS = 0x0800 - STYP_LOADER = 0x1000 - STYP_DEBUG = 0x2000 - STYP_TYPCHK = 0x4000 - STYP_OVRFLO = 0x8000 -) -const ( - SSUBTYP_DWINFO = 0x10000 // DWARF info section - SSUBTYP_DWLINE = 0x20000 // DWARF line-number section - SSUBTYP_DWPBNMS = 0x30000 // DWARF public names section - SSUBTYP_DWPBTYP = 0x40000 // DWARF public types section - SSUBTYP_DWARNGE = 0x50000 // DWARF aranges section - SSUBTYP_DWABREV = 0x60000 // DWARF abbreviation section - SSUBTYP_DWSTR = 0x70000 // DWARF strings section - SSUBTYP_DWRNGES = 0x80000 // DWARF ranges section - SSUBTYP_DWLOC = 0x90000 // DWARF location lists section - SSUBTYP_DWFRAME = 0xA0000 // DWARF frames section - SSUBTYP_DWMAC = 0xB0000 // DWARF macros section -) - -// Headers size -const ( - FILHSZ_32 = 20 - FILHSZ_64 = 24 - AOUTHSZ_EXEC32 = 72 - AOUTHSZ_EXEC64 = 120 - SCNHSZ_32 = 40 - SCNHSZ_64 = 72 - LDHDRSZ_32 = 32 - LDHDRSZ_64 = 56 - LDSYMSZ_64 = 24 - RELSZ_64 = 14 -) - -// Type representing all XCOFF symbols. -type xcoffSym interface { -} - -// Symbol Table Entry -type XcoffSymEnt64 struct { - Nvalue uint64 // Symbol value - Noffset uint32 // Offset of the name in string table or .debug section - Nscnum int16 // Section number of symbol - Ntype uint16 // Basic and derived type specification - Nsclass uint8 // Storage class of symbol - Nnumaux int8 // Number of auxiliary entries -} - -const SYMESZ = 18 - -const ( - // Nscnum - N_DEBUG = -2 - N_ABS = -1 - N_UNDEF = 0 - - //Ntype - SYM_V_INTERNAL = 0x1000 - SYM_V_HIDDEN = 0x2000 - SYM_V_PROTECTED = 0x3000 - SYM_V_EXPORTED = 0x4000 - SYM_TYPE_FUNC = 0x0020 // is function -) - -// Storage Class. -const ( - C_NULL = 0 // Symbol table entry marked for deletion - C_EXT = 2 // External symbol - C_STAT = 3 // Static symbol - C_BLOCK = 100 // Beginning or end of inner block - C_FCN = 101 // Beginning or end of function - C_FILE = 103 // Source file name and compiler information - C_HIDEXT = 107 // Unnamed external symbol - C_BINCL = 108 // Beginning of include file - C_EINCL = 109 // End of include file - C_WEAKEXT = 111 // Weak external symbol - C_DWARF = 112 // DWARF symbol - C_GSYM = 128 // Global variable - C_LSYM = 129 // Automatic variable allocated on stack - C_PSYM = 130 // Argument to subroutine allocated on stack - C_RSYM = 131 // Register variable - C_RPSYM = 132 // Argument to function or procedure stored in register - C_STSYM = 133 // Statically allocated symbol - C_BCOMM = 135 // Beginning of common block - C_ECOML = 136 // Local member of common block - C_ECOMM = 137 // End of common block - C_DECL = 140 // Declaration of object - C_ENTRY = 141 // Alternate entry - C_FUN = 142 // Function or procedure - C_BSTAT = 143 // Beginning of static block - C_ESTAT = 144 // End of static block - C_GTLS = 145 // Global thread-local variable - C_STTLS = 146 // Static thread-local variable -) - -// File Auxiliary Entry -type XcoffAuxFile64 struct { - Xzeroes uint32 // The name is always in the string table - Xoffset uint32 // Offset in the string table - X_pad1 [6]byte - Xftype uint8 // Source file string type - X_pad2 [2]byte - Xauxtype uint8 // Type of auxiliary entry -} - -// Function Auxiliary Entry -type XcoffAuxFcn64 struct { - Xlnnoptr uint64 // File pointer to line number - Xfsize uint32 // Size of function in bytes - Xendndx uint32 // Symbol table index of next entry - Xpad uint8 // Unused - Xauxtype uint8 // Type of auxiliary entry -} - -// csect Auxiliary Entry. -type XcoffAuxCSect64 struct { - Xscnlenlo uint32 // Lower 4 bytes of length or symbol table index - Xparmhash uint32 // Offset of parameter type-check string - Xsnhash uint16 // .typchk section number - Xsmtyp uint8 // Symbol alignment and type - Xsmclas uint8 // Storage-mapping class - Xscnlenhi uint32 // Upper 4 bytes of length or symbol table index - Xpad uint8 // Unused - Xauxtype uint8 // Type of auxiliary entry -} - -// DWARF Auxiliary Entry -type XcoffAuxDWARF64 struct { - Xscnlen uint64 // Length of this symbol section - X_pad [9]byte - Xauxtype uint8 // Type of auxiliary entry -} - -// Auxiliary type -const ( - _AUX_EXCEPT = 255 - _AUX_FCN = 254 - _AUX_SYM = 253 - _AUX_FILE = 252 - _AUX_CSECT = 251 - _AUX_SECT = 250 -) - -// Xftype field -const ( - XFT_FN = 0 // Source File Name - XFT_CT = 1 // Compile Time Stamp - XFT_CV = 2 // Compiler Version Number - XFT_CD = 128 // Compiler Defined Information/ - -) - -// Symbol type field. -const ( - XTY_ER = 0 // External reference - XTY_SD = 1 // Section definition - XTY_LD = 2 // Label definition - XTY_CM = 3 // Common csect definition - XTY_WK = 0x8 // Weak symbol - XTY_EXP = 0x10 // Exported symbol - XTY_ENT = 0x20 // Entry point symbol - XTY_IMP = 0x40 // Imported symbol -) - -// Storage-mapping class. -const ( - XMC_PR = 0 // Program code - XMC_RO = 1 // Read-only constant - XMC_DB = 2 // Debug dictionary table - XMC_TC = 3 // TOC entry - XMC_UA = 4 // Unclassified - XMC_RW = 5 // Read/Write data - XMC_GL = 6 // Global linkage - XMC_XO = 7 // Extended operation - XMC_SV = 8 // 32-bit supervisor call descriptor - XMC_BS = 9 // BSS class - XMC_DS = 10 // Function descriptor - XMC_UC = 11 // Unnamed FORTRAN common - XMC_TC0 = 15 // TOC anchor - XMC_TD = 16 // Scalar data entry in the TOC - XMC_SV64 = 17 // 64-bit supervisor call descriptor - XMC_SV3264 = 18 // Supervisor call descriptor for both 32-bit and 64-bit - XMC_TL = 20 // Read/Write thread-local data - XMC_UL = 21 // Read/Write thread-local data (.tbss) - XMC_TE = 22 // TOC entry -) - -// Loader Header -type XcoffLdHdr64 struct { - Lversion int32 // Loader section version number - Lnsyms int32 // Number of symbol table entries - Lnreloc int32 // Number of relocation table entries - Listlen uint32 // Length of import file ID string table - Lnimpid int32 // 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 - Lsymoff uint64 // Offset to start of symbol table - Lrldoff uint64 // Offset to start of relocation entries -} - -// Loader Symbol -type XcoffLdSym64 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 - Lparm uint32 // Parameter type-check field -} - -type xcoffLoaderSymbol struct { - sym *sym.Symbol - smtype int8 - smclas int8 -} - -type XcoffLdImportFile64 struct { - Limpidpath string - Limpidbase string - Limpidmem string -} - -type XcoffLdRel64 struct { - Lvaddr uint64 // Address Field - Lrtype uint16 // Relocation Size and Type - Lrsecnm int16 // Section Number being relocated - Lsymndx int32 // Loader-Section symbol table index -} - -// xcoffLoaderReloc holds information about a relocation made by the loader. -type xcoffLoaderReloc struct { - sym *sym.Symbol - rel *sym.Reloc - rtype uint16 - symndx int32 -} - -const ( - XCOFF_R_POS = 0x00 // A(sym) Positive Relocation - XCOFF_R_NEG = 0x01 // -A(sym) Negative Relocation - XCOFF_R_REL = 0x02 // A(sym-*) Relative to self - XCOFF_R_TOC = 0x03 // A(sym-TOC) Relative to TOC - XCOFF_R_TRL = 0x12 // A(sym-TOC) TOC Relative indirect load. - - XCOFF_R_TRLA = 0x13 // A(sym-TOC) TOC Rel load address. modifiable inst - XCOFF_R_GL = 0x05 // A(external TOC of sym) Global Linkage - XCOFF_R_TCL = 0x06 // A(local TOC of sym) Local object TOC address - XCOFF_R_RL = 0x0C // A(sym) Pos indirect load. modifiable instruction - XCOFF_R_RLA = 0x0D // A(sym) Pos Load Address. modifiable instruction - XCOFF_R_REF = 0x0F // AL0(sym) Non relocating ref. No garbage collect - XCOFF_R_BA = 0x08 // A(sym) Branch absolute. Cannot modify instruction - XCOFF_R_RBA = 0x18 // A(sym) Branch absolute. modifiable instruction - XCOFF_R_BR = 0x0A // A(sym-*) Branch rel to self. non modifiable - XCOFF_R_RBR = 0x1A // A(sym-*) Branch rel to self. modifiable instr - - XCOFF_R_TLS = 0x20 // General-dynamic reference to TLS symbol - XCOFF_R_TLS_IE = 0x21 // Initial-exec reference to TLS symbol - XCOFF_R_TLS_LD = 0x22 // Local-dynamic reference to TLS symbol - XCOFF_R_TLS_LE = 0x23 // Local-exec reference to TLS symbol - XCOFF_R_TLSM = 0x24 // Module reference to TLS symbol - XCOFF_R_TLSML = 0x25 // Module reference to local (own) module - - XCOFF_R_TOCU = 0x30 // Relative to TOC - high order bits - XCOFF_R_TOCL = 0x31 // Relative to TOC - low order bits -) - -type XcoffLdStr64 struct { - size uint16 - name string -} - -// xcoffFile is used to build XCOFF file. -type xcoffFile struct { - xfhdr XcoffFileHdr64 - xahdr XcoffAoutHdr64 - sections []*XcoffScnHdr64 - sectText *XcoffScnHdr64 - sectData *XcoffScnHdr64 - sectBss *XcoffScnHdr64 - stringTable xcoffStringTable - sectNameToScnum map[string]int16 - loaderSize uint64 - symtabOffset int64 // offset to the start of symbol table - symbolCount uint32 // number of symbol table records written - symtabSym []xcoffSym // XCOFF symbols for the symbol table - dynLibraries map[string]int // Dynamic libraries in .loader section. The integer represents its import file number (- 1) - loaderSymbols []*xcoffLoaderSymbol // symbols inside .loader symbol table - loaderReloc []*xcoffLoaderReloc // Reloc that must be made inside loader -} - -// Var used by XCOFF Generation algorithms -var ( - xfile xcoffFile -) - -// xcoffStringTable is a XCOFF string table. -type xcoffStringTable struct { - strings []string - stringsLen int -} - -// size returns size of string table t. -func (t *xcoffStringTable) size() int { - // string table starts with 4-byte length at the beginning - return t.stringsLen + 4 -} - -// add adds string str to string table t. -func (t *xcoffStringTable) add(str string) int { - off := t.size() - t.strings = append(t.strings, str) - t.stringsLen += len(str) + 1 // each string will have 0 appended to it - return off -} - -// write writes string table t into the output file. -func (t *xcoffStringTable) write(out *OutBuf) { - out.Write32(uint32(t.size())) - for _, s := range t.strings { - out.WriteString(s) - out.Write8(0) - } -} - -// write writes XCOFF section sect into the output file. -func (sect *XcoffScnHdr64) write(ctxt *Link) { - binary.Write(ctxt.Out, binary.BigEndian, sect) - ctxt.Out.Write32(0) // Add 4 empty bytes at the end to match alignment -} - -// addSection adds section to the XCOFF file f. -func (f *xcoffFile) addSection(name string, addr uint64, size uint64, fileoff uint64, flags uint32) *XcoffScnHdr64 { - sect := &XcoffScnHdr64{ - Spaddr: addr, - Svaddr: addr, - Ssize: size, - Sscnptr: fileoff, - Sflags: flags, - } - copy(sect.Sname[:], name) // copy string to [8]byte - f.sections = append(f.sections, sect) - f.sectNameToScnum[name] = int16(len(f.sections)) - return sect -} - -// addDwarfSection adds a dwarf section to the XCOFF file f. -// This function is similar to addSection, but Dwarf section names -// must be modified to conventional names and they are various subtypes. -func (f *xcoffFile) addDwarfSection(s *sym.Section) *XcoffScnHdr64 { - newName, subtype := xcoffGetDwarfSubtype(s.Name) - return f.addSection(newName, 0, s.Length, s.Seg.Fileoff+s.Vaddr-s.Seg.Vaddr, STYP_DWARF|subtype) -} - -// xcoffGetDwarfSubtype returns the XCOFF name of the DWARF section str -// and its subtype constant. -func xcoffGetDwarfSubtype(str string) (string, uint32) { - switch str { - default: - Exitf("unknown DWARF section name for XCOFF: %s", str) - case ".debug_abbrev": - return ".dwabrev", SSUBTYP_DWABREV - case ".debug_info": - return ".dwinfo", SSUBTYP_DWINFO - case ".debug_frame": - return ".dwframe", SSUBTYP_DWFRAME - case ".debug_line": - return ".dwline", SSUBTYP_DWLINE - case ".debug_loc": - return ".dwloc", SSUBTYP_DWLOC - case ".debug_pubnames": - return ".dwpbnms", SSUBTYP_DWPBNMS - case ".debug_pubtypes": - return ".dwpbtyp", SSUBTYP_DWPBTYP - case ".debug_ranges": - return ".dwrnges", SSUBTYP_DWRNGES - } - // never used - return "", 0 -} - -// getXCOFFscnum returns the XCOFF section number of a Go section. -func (f *xcoffFile) getXCOFFscnum(sect *sym.Section) int16 { - switch sect.Seg { - case &Segtext: - return f.sectNameToScnum[".text"] - case &Segdata: - if sect.Name == ".noptrbss" || sect.Name == ".bss" { - return f.sectNameToScnum[".bss"] - } - if sect.Name == ".tbss" { - return f.sectNameToScnum[".tbss"] - } - return f.sectNameToScnum[".data"] - case &Segdwarf: - name, _ := xcoffGetDwarfSubtype(sect.Name) - return f.sectNameToScnum[name] - case &Segrelrodata: - return f.sectNameToScnum[".data"] - } - Errorf(nil, "getXCOFFscnum not implemented for section %s", sect.Name) - return -1 -} - -// Xcoffinit initialised some internal value and setups -// already known header information -func Xcoffinit(ctxt *Link) { - xfile.dynLibraries = make(map[string]int) - - HEADR = int32(Rnd(XCOFFHDRRESERVE, XCOFFSECTALIGN)) - if *FlagTextAddr != -1 { - Errorf(nil, "-T not available on AIX") - } - *FlagTextAddr = XCOFFTEXTBASE + int64(HEADR) - if *FlagRound != -1 { - Errorf(nil, "-R not available on AIX") - } - *FlagRound = int(XCOFFSECTALIGN) - -} - -// SYMBOL TABLE - -// type records C_FILE information needed for genasmsym in XCOFF. -type xcoffSymSrcFile struct { - name string - file *XcoffSymEnt64 // Symbol of this C_FILE - csectAux *XcoffAuxCSect64 // Symbol for the current .csect - csectSymNb uint64 // Symbol number for the current .csect - csectSize int64 -} - -var ( - currDwscnoff = make(map[string]uint64) // Needed to create C_DWARF symbols - currSymSrcFile xcoffSymSrcFile - outerSymSize = make(map[string]int64) -) - -// xcoffUpdateOuterSize stores the size of outer symbols in order to have it -// in the symbol table. -func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) { - if size == 0 { - return - } - - switch stype { - default: - Errorf(nil, "unknown XCOFF outer symbol for type %s", stype.String()) - case sym.SRODATA, sym.SRODATARELRO, sym.SFUNCTAB, sym.SSTRING: - // Nothing to do - case sym.STYPERELRO: - if ctxt.UseRelro() && (ctxt.BuildMode == BuildModeCArchive || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE) { - // runtime.types size must be removed, as it's a real symbol. - outerSymSize["typerel.*"] = size - ctxt.Syms.ROLookup("runtime.types", 0).Size - return - } - fallthrough - case sym.STYPE: - if !ctxt.DynlinkingGo() { - // runtime.types size must be removed, as it's a real symbol. - outerSymSize["type.*"] = size - ctxt.Syms.ROLookup("runtime.types", 0).Size - } - case sym.SGOSTRING: - outerSymSize["go.string.*"] = size - case sym.SGOFUNC: - if !ctxt.DynlinkingGo() { - outerSymSize["go.func.*"] = size - } - case sym.SGOFUNCRELRO: - outerSymSize["go.funcrel.*"] = size - case sym.SGCBITS: - outerSymSize["runtime.gcbits.*"] = size - case sym.SITABLINK: - outerSymSize["runtime.itablink"] = size - - } - -} - -// addSymbol writes a symbol or an auxiliary symbol entry on ctxt.out. -func (f *xcoffFile) addSymbol(sym xcoffSym) { - f.symtabSym = append(f.symtabSym, sym) - f.symbolCount++ -} - -// xcoffAlign returns the log base 2 of the symbol's alignment. -func xcoffAlign(x *sym.Symbol, t SymbolType) uint8 { - align := x.Align - if align == 0 { - if t == TextSym { - align = int32(Funcalign) - } else { - align = symalign(x) - } - } - return logBase2(int(align)) -} - -// logBase2 returns the log in base 2 of a. -func logBase2(a int) uint8 { - return uint8(bits.Len(uint(a)) - 1) -} - -// Write symbols needed when a new file appeared: -// - a C_FILE with one auxiliary entry for its name -// - C_DWARF symbols to provide debug information -// - a C_HIDEXT which will be a csect containing all of its functions -// It needs several parameters to create .csect symbols such as its entry point and its section number. -// -// Currently, a new file is in fact a new package. It seems to be OK, but it might change -// in the future. -func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint64, extnum int16) { - /* C_FILE */ - s := &XcoffSymEnt64{ - Noffset: uint32(f.stringTable.add(".file")), - Nsclass: C_FILE, - Nscnum: N_DEBUG, - Ntype: 0, // Go isn't inside predefined language. - Nnumaux: 1, - } - f.addSymbol(s) - currSymSrcFile.file = s - - // Auxiliary entry for file name. - auxf := &XcoffAuxFile64{ - Xoffset: uint32(f.stringTable.add(name)), - Xftype: XFT_FN, - Xauxtype: _AUX_FILE, - } - f.addSymbol(auxf) - - /* Dwarf */ - for _, sect := range Segdwarf.Sections { - var dwsize uint64 - if ctxt.LinkMode == LinkInternal { - // Find the size of this corresponding package DWARF compilation unit. - // This size is set during DWARF generation (see dwarf.go). - dwsize = getDwsectCUSize(sect.Name, name) - // .debug_abbrev is common to all packages and not found with the previous function - if sect.Name == ".debug_abbrev" { - s := ctxt.Syms.ROLookup(sect.Name, 0) - dwsize = uint64(s.Size) - - } - } else { - // There is only one .FILE with external linking. - dwsize = sect.Length - } - - // get XCOFF name - name, _ := xcoffGetDwarfSubtype(sect.Name) - s := &XcoffSymEnt64{ - Nvalue: currDwscnoff[sect.Name], - Noffset: uint32(f.stringTable.add(name)), - Nsclass: C_DWARF, - Nscnum: f.getXCOFFscnum(sect), - Nnumaux: 1, - } - - if currSymSrcFile.csectAux == nil { - // Dwarf relocations need the symbol number of .dw* symbols. - // It doesn't need to know it for each package, one is enough. - // currSymSrcFile.csectAux == nil means first package. - dws := ctxt.Syms.Lookup(sect.Name, 0) - dws.Dynid = int32(f.symbolCount) - - if sect.Name == ".debug_frame" && ctxt.LinkMode != LinkExternal { - // CIE size must be added to the first package. - dwsize += 48 - } - } - - f.addSymbol(s) - - // update the DWARF section offset in this file - if sect.Name != ".debug_abbrev" { - currDwscnoff[sect.Name] += dwsize - } - - // Auxiliary dwarf section - auxd := &XcoffAuxDWARF64{ - Xscnlen: dwsize, - Xauxtype: _AUX_SECT, - } - - f.addSymbol(auxd) - } - - /* .csect */ - // Check if extnum is in text. - // This is temporary and only here to check if this algorithm is correct. - if extnum != 1 { - Exitf("XCOFF symtab: A new file was detected with its first symbol not in .text") - } - - currSymSrcFile.csectSymNb = uint64(f.symbolCount) - - // No offset because no name - s = &XcoffSymEnt64{ - Nvalue: firstEntry, - Nscnum: extnum, - Nsclass: C_HIDEXT, - Ntype: 0, // check visibility ? - Nnumaux: 1, - } - f.addSymbol(s) - - aux := &XcoffAuxCSect64{ - Xsmclas: XMC_PR, - Xsmtyp: XTY_SD | logBase2(Funcalign)<<3, - Xauxtype: _AUX_CSECT, - } - f.addSymbol(aux) - - currSymSrcFile.csectAux = aux - currSymSrcFile.csectSize = 0 -} - -// Update values for the previous package. -// - Svalue of the C_FILE symbol: if it is the last one, this Svalue must be -1 -// - Xsclen of the csect symbol. -func (f *xcoffFile) updatePreviousFile(ctxt *Link, last bool) { - // first file - if currSymSrcFile.file == nil { - return - } - - // Update C_FILE - cfile := currSymSrcFile.file - if last { - cfile.Nvalue = 0xFFFFFFFFFFFFFFFF - } else { - cfile.Nvalue = uint64(f.symbolCount) - } - - // update csect scnlen in this auxiliary entry - aux := currSymSrcFile.csectAux - aux.Xscnlenlo = uint32(currSymSrcFile.csectSize & 0xFFFFFFFF) - aux.Xscnlenhi = uint32(currSymSrcFile.csectSize >> 32) -} - -// Write symbol representing a .text function. -// The symbol table is split with C_FILE corresponding to each package -// and not to each source file as it should be. -func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { - // New XCOFF symbols which will be written. - syms := []xcoffSym{} - - // Check if a new file is detected. - if strings.Contains(x.Name, "-tramp") || strings.HasPrefix(x.Name, "runtime.text.") { - // Trampoline don't have a FILE so there are considered - // in the current file. - // Same goes for runtime.text.X symbols. - } else if x.File == "" { // Undefined global symbol - // If this happens, the algorithm must be redone. - if currSymSrcFile.name != "" { - Exitf("undefined global symbol found inside another file") - } - } else { - // Current file has changed. New C_FILE, C_DWARF, etc must be generated. - if currSymSrcFile.name != x.File { - if ctxt.LinkMode == LinkInternal { - // update previous file values - xfile.updatePreviousFile(ctxt, false) - currSymSrcFile.name = x.File - f.writeSymbolNewFile(ctxt, x.File, uint64(x.Value), xfile.getXCOFFscnum(x.Sect)) - } else { - // With external linking, ld will crash if there is several - // .FILE and DWARF debugging enable, somewhere during - // the relocation phase. - // Therefore, all packages are merged under a fake .FILE - // "go_functions". - // TODO(aix); remove once ld has been fixed or the triggering - // relocation has been found and fixed. - if currSymSrcFile.name == "" { - currSymSrcFile.name = x.File - f.writeSymbolNewFile(ctxt, "go_functions", uint64(x.Value), xfile.getXCOFFscnum(x.Sect)) - } - } - - } - } - - s := &XcoffSymEnt64{ - Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(x.Extname())), - Nvalue: uint64(x.Value), - Nscnum: f.getXCOFFscnum(x.Sect), - Ntype: SYM_TYPE_FUNC, - Nnumaux: 2, - } - - if x.Version != 0 || x.Attr.VisibilityHidden() || x.Attr.Local() { - s.Nsclass = C_HIDEXT - } - - x.Dynid = int32(xfile.symbolCount) - syms = append(syms, s) - - // Update current csect size - currSymSrcFile.csectSize += x.Size - - // create auxiliary entries - a2 := &XcoffAuxFcn64{ - Xfsize: uint32(x.Size), - Xlnnoptr: 0, // TODO - Xendndx: xfile.symbolCount + 3, // this symbol + 2 aux entries - Xauxtype: _AUX_FCN, - } - syms = append(syms, a2) - - a4 := &XcoffAuxCSect64{ - Xscnlenlo: uint32(currSymSrcFile.csectSymNb & 0xFFFFFFFF), - Xscnlenhi: uint32(currSymSrcFile.csectSymNb >> 32), - Xsmclas: XMC_PR, // Program Code - Xsmtyp: XTY_LD, // label definition (based on C) - Xauxtype: _AUX_CSECT, - } - a4.Xsmtyp |= uint8(xcoffAlign(x, TextSym) << 3) - - syms = append(syms, a4) - return syms -} - -// put function used by genasmsym to write symbol table -func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, go_ *sym.Symbol) { - - // All XCOFF symbols generated by this GO symbols - // Can be a symbol entry or a auxiliary entry - syms := []xcoffSym{} - - switch t { - default: - return - - case TextSym: - if x.FuncInfo != nil || strings.Contains(x.Name, "-tramp") || strings.HasPrefix(x.Name, "runtime.text.") { - // Function within a file - syms = xfile.writeSymbolFunc(ctxt, x) - } else { - // Only runtime.text and runtime.etext come through this way - if x.Name != "runtime.text" && x.Name != "runtime.etext" && x.Name != "go.buildid" { - Exitf("putaixsym: unknown text symbol %s", x.Name) - } - s := &XcoffSymEnt64{ - Nsclass: C_HIDEXT, - Noffset: uint32(xfile.stringTable.add(str)), - Nvalue: uint64(x.Value), - Nscnum: xfile.getXCOFFscnum(x.Sect), - Ntype: SYM_TYPE_FUNC, - Nnumaux: 1, - } - x.Dynid = int32(xfile.symbolCount) - syms = append(syms, s) - - size := uint64(x.Size) - a4 := &XcoffAuxCSect64{ - Xauxtype: _AUX_CSECT, - Xscnlenlo: uint32(size & 0xFFFFFFFF), - Xscnlenhi: uint32(size >> 32), - Xsmclas: XMC_PR, - Xsmtyp: XTY_SD, - } - a4.Xsmtyp |= uint8(xcoffAlign(x, TextSym) << 3) - syms = append(syms, a4) - - } - - case DataSym, BSSSym: - s := &XcoffSymEnt64{ - Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(str)), - Nvalue: uint64(x.Value), - Nscnum: xfile.getXCOFFscnum(x.Sect), - Nnumaux: 1, - } - - if x.Version != 0 || x.Attr.VisibilityHidden() || x.Attr.Local() { - // There is more symbols in the case of a global data - // which are related to the assembly generated - // to access such symbols. - // But as Golang as its own way to check if a symbol is - // global or local (the capital letter), we don't need to - // implement them yet. - s.Nsclass = C_HIDEXT - } - - x.Dynid = int32(xfile.symbolCount) - syms = append(syms, s) - - // Create auxiliary entry - - // Normally, size should be the size of csect containing all - // the data and bss symbols of one file/package. - // However, it's easier to just have a csect for each symbol. - // It might change - size := uint64(x.Size) - a4 := &XcoffAuxCSect64{ - Xauxtype: _AUX_CSECT, - Xscnlenlo: uint32(size & 0xFFFFFFFF), - Xscnlenhi: uint32(size >> 32), - } - - if x.Type >= sym.STYPE && x.Type <= sym.SPCLNTAB { - if ctxt.LinkMode == LinkExternal && strings.HasPrefix(x.Sect.Name, ".data.rel.ro") { - // During external linking, read-only datas with relocation - // must be in .data. - a4.Xsmclas = XMC_RW - } else { - // Read only data - a4.Xsmclas = XMC_RO - } - } else if x.Type == sym.SDATA && strings.HasPrefix(x.Name, "TOC.") && ctxt.LinkMode == LinkExternal { - a4.Xsmclas = XMC_TC - } else if x.Name == "TOC" { - a4.Xsmclas = XMC_TC0 - } else { - a4.Xsmclas = XMC_RW - } - if t == DataSym { - a4.Xsmtyp |= XTY_SD - } else { - a4.Xsmtyp |= XTY_CM - } - - a4.Xsmtyp |= uint8(xcoffAlign(x, t) << 3) - - syms = append(syms, a4) - - case UndefinedSym: - if x.Type != sym.SDYNIMPORT && x.Type != sym.SHOSTOBJ && x.Type != sym.SUNDEFEXT { - return - } - s := &XcoffSymEnt64{ - Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(str)), - Nnumaux: 1, - } - x.Dynid = int32(xfile.symbolCount) - syms = append(syms, s) - - a4 := &XcoffAuxCSect64{ - Xauxtype: _AUX_CSECT, - Xsmclas: XMC_DS, - Xsmtyp: XTY_ER | XTY_IMP, - } - - if x.Name == "__n_pthreads" { - // Currently, all imported symbols made by cgo_import_dynamic are - // syscall functions, except __n_pthreads which is a variable. - // TODO(aix): Find a way to detect variables imported by cgo. - a4.Xsmclas = XMC_RW - } - - syms = append(syms, a4) - - case TLSSym: - s := &XcoffSymEnt64{ - Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(str)), - Nscnum: xfile.getXCOFFscnum(x.Sect), - Nvalue: uint64(x.Value), - Nnumaux: 1, - } - - x.Dynid = int32(xfile.symbolCount) - syms = append(syms, s) - - size := uint64(x.Size) - a4 := &XcoffAuxCSect64{ - Xauxtype: _AUX_CSECT, - Xsmclas: XMC_UL, - Xsmtyp: XTY_CM, - Xscnlenlo: uint32(size & 0xFFFFFFFF), - Xscnlenhi: uint32(size >> 32), - } - - syms = append(syms, a4) - } - - for _, s := range syms { - xfile.addSymbol(s) - } -} - -// Generate XCOFF Symbol table. -// It will be written in out file in Asmbxcoff, because it must be -// at the very end, especially after relocation sections which needs symbols' index. -func (f *xcoffFile) asmaixsym(ctxt *Link) { - // Get correct size for symbols wrapping others symbols like go.string.* - // sym.Size can be used directly as the symbols have already been written. - for name, size := range outerSymSize { - sym := ctxt.Syms.ROLookup(name, 0) - if sym == nil { - Errorf(nil, "unknown outer symbol with name %s", name) - } else { - sym.Size = size - } - } - - genasmsym(ctxt, putaixsym) - xfile.updatePreviousFile(ctxt, true) -} - -func (f *xcoffFile) genDynSym(ctxt *Link) { - var dynsyms []*sym.Symbol - for _, s := range ctxt.Syms.Allsym { - if s.Type != sym.SHOSTOBJ && s.Type != sym.SDYNIMPORT { - continue - } - dynsyms = append(dynsyms, s) - } - - for _, s := range dynsyms { - f.adddynimpsym(ctxt, s) - - if _, ok := f.dynLibraries[s.Dynimplib()]; !ok { - f.dynLibraries[s.Dynimplib()] = len(f.dynLibraries) - } - - } - -} - -// (*xcoffFile)adddynimpsym adds the dynamic symbol "s" to a XCOFF file. -// A new symbol named s.Extname() is created to be the actual dynamic symbol -// in the .loader section and in the symbol table as an External Reference. -// The symbol "s" is transformed to SXCOFFTOC to end up in .data section. -// However, there is no writing protection on those symbols and -// it might need to be added. -// TODO(aix): Handles dynamic symbols without library. -func (f *xcoffFile) adddynimpsym(ctxt *Link, s *sym.Symbol) { - // Check that library name is given. - // Pattern is already checked when compiling. - if ctxt.LinkMode == LinkInternal && s.Dynimplib() == "" { - Errorf(s, "imported symbol must have a given library") - } - - s.Type = sym.SXCOFFTOC - - // Create new dynamic symbol - extsym := ctxt.Syms.Lookup(s.Extname(), 0) - extsym.Type = sym.SDYNIMPORT - extsym.Attr |= sym.AttrReachable - extsym.SetDynimplib(s.Dynimplib()) - extsym.SetExtname(s.Extname()) - extsym.SetDynimpvers(s.Dynimpvers()) - - // Add loader symbol - lds := &xcoffLoaderSymbol{ - sym: extsym, - smtype: XTY_IMP, - smclas: XMC_DS, - } - if s.Name == "__n_pthreads" { - // Currently, all imported symbols made by cgo_import_dynamic are - // syscall functions, except __n_pthreads which is a variable. - // TODO(aix): Find a way to detect variables imported by cgo. - lds.smclas = XMC_RW - } - f.loaderSymbols = append(f.loaderSymbols, lds) - - // Relocation to retrieve the external address - s.AddBytes(make([]byte, 8)) - s.SetAddr(ctxt.Arch, 0, extsym) - -} - -// Xcoffadddynrel adds a dynamic relocation in a XCOFF file. -// This relocation will be made by the loader. -func Xcoffadddynrel(ctxt *Link, s *sym.Symbol, r *sym.Reloc) bool { - if ctxt.LinkMode == LinkExternal { - return true - } - if s.Type <= sym.SPCLNTAB { - Errorf(s, "cannot have a relocation to %s in a text section symbol", r.Sym.Name) - return false - } - - ldr := &xcoffLoaderReloc{ - sym: s, - rel: r, - } - - switch r.Type { - default: - Errorf(s, "unexpected .loader relocation to symbol: %s (type: %s)", r.Sym.Name, r.Type.String()) - return false - case objabi.R_ADDR: - if s.Type == sym.SXCOFFTOC && r.Sym.Type == sym.SDYNIMPORT { - // Imported symbol relocation - for i, dynsym := range xfile.loaderSymbols { - if dynsym.sym.Name == r.Sym.Name { - ldr.symndx = int32(i + 3) // +3 because of 3 section symbols - break - } - } - } else if s.Type == sym.SDATA { - switch r.Sym.Sect.Seg { - default: - Errorf(s, "unknown segment for .loader relocation with symbol %s", r.Sym.Name) - case &Segtext: - case &Segrodata: - ldr.symndx = 0 // .text - case &Segdata: - if r.Sym.Type == sym.SBSS || r.Sym.Type == sym.SNOPTRBSS { - ldr.symndx = 2 // .bss - } else { - ldr.symndx = 1 // .data - } - - } - - } else { - Errorf(s, "unexpected type for .loader relocation R_ADDR for symbol %s: %s to %s", r.Sym.Name, s.Type, r.Sym.Type) - return false - } - - ldr.rtype = 0x3F<<8 + XCOFF_R_POS - } - - xfile.loaderReloc = append(xfile.loaderReloc, ldr) - return true -} - -func (ctxt *Link) doxcoff() { - if *FlagD { - // All XCOFF files have dynamic symbols because of the syscalls. - Exitf("-d is not available on AIX") - } - - // TOC - toc := ctxt.Syms.Lookup("TOC", 0) - toc.Type = sym.SXCOFFTOC - toc.Attr |= sym.AttrReachable - toc.Attr |= sym.AttrVisibilityHidden - - // Add entry point to .loader symbols. - ep := ctxt.Syms.ROLookup(*flagEntrySymbol, 0) - if !ep.Attr.Reachable() { - Exitf("wrong entry point") - } - - xfile.loaderSymbols = append(xfile.loaderSymbols, &xcoffLoaderSymbol{ - sym: ep, - smtype: XTY_ENT | XTY_SD, - smclas: XMC_DS, - }) - - xfile.genDynSym(ctxt) - - for _, s := range ctxt.Syms.Allsym { - if strings.HasPrefix(s.Name, "TOC.") { - s.Type = sym.SXCOFFTOC - } - } - - if ctxt.LinkMode == LinkExternal { - // Change rt0_go name to match name in runtime/cgo:main(). - rt0 := ctxt.Syms.ROLookup("runtime.rt0_go", 0) - ctxt.Syms.Rename(rt0.Name, "runtime_rt0_go", 0, ctxt.Reachparent) - - for _, s := range ctxt.Syms.Allsym { - if !s.Attr.CgoExport() { - continue - } - - name := s.Extname() - if s.Type == sym.STEXT { - // On AIX, a exported function must have two symbols: - // - a .text symbol which must start with a ".". - // - a .data symbol which is a function descriptor. - ctxt.Syms.Rename(s.Name, "."+name, 0, ctxt.Reachparent) - - desc := ctxt.Syms.Lookup(name, 0) - desc.Type = sym.SNOPTRDATA - desc.AddAddr(ctxt.Arch, s) - desc.AddAddr(ctxt.Arch, toc) - desc.AddUint64(ctxt.Arch, 0) - } - } - } -} - -// Loader section -// Currently, this section is created from scratch when assembling the XCOFF file -// according to information retrieved in xfile object. - -// Create loader section and returns its size -func Loaderblk(ctxt *Link, off uint64) { - xfile.writeLdrScn(ctxt, off) -} - -func (f *xcoffFile) writeLdrScn(ctxt *Link, globalOff uint64) { - var symtab []*XcoffLdSym64 - var strtab []*XcoffLdStr64 - var importtab []*XcoffLdImportFile64 - var reloctab []*XcoffLdRel64 - var dynimpreloc []*XcoffLdRel64 - - // As the string table is updated in any loader subsection, - // its length must be computed at the same time. - stlen := uint32(0) - - // Loader Header - hdr := &XcoffLdHdr64{ - Lversion: 2, - Lsymoff: LDHDRSZ_64, - } - - /* Symbol table */ - for _, s := range f.loaderSymbols { - lds := &XcoffLdSym64{ - Loffset: uint32(stlen + 2), - Lsmtype: s.smtype, - Lsmclas: s.smclas, - } - switch s.smtype { - default: - Errorf(s.sym, "unexpected loader symbol type: 0x%x", s.smtype) - case XTY_ENT | XTY_SD: - lds.Lvalue = uint64(s.sym.Value) - lds.Lscnum = f.getXCOFFscnum(s.sym.Sect) - case XTY_IMP: - lds.Lifile = int32(f.dynLibraries[s.sym.Dynimplib()] + 1) - } - ldstr := &XcoffLdStr64{ - size: uint16(len(s.sym.Name) + 1), // + null terminator - name: s.sym.Name, - } - stlen += uint32(2 + ldstr.size) // 2 = sizeof ldstr.size - symtab = append(symtab, lds) - strtab = append(strtab, ldstr) - - } - - hdr.Lnsyms = int32(len(symtab)) - hdr.Lrldoff = hdr.Lsymoff + uint64(24*hdr.Lnsyms) // 24 = sizeof one symbol - off := hdr.Lrldoff // current offset is the same of reloc offset - - /* Reloc */ - ep := ctxt.Syms.ROLookup(*flagEntrySymbol, 0) - ldr := &XcoffLdRel64{ - Lvaddr: uint64(ep.Value), - Lrtype: 0x3F00, - Lrsecnm: f.getXCOFFscnum(ep.Sect), - Lsymndx: 0, - } - off += 16 - reloctab = append(reloctab, ldr) - - off += uint64(16 * len(f.loaderReloc)) - for _, r := range f.loaderReloc { - ldr = &XcoffLdRel64{ - Lvaddr: uint64(r.sym.Value + int64(r.rel.Off)), - Lrtype: r.rtype, - Lsymndx: r.symndx, - } - - if r.sym.Sect != nil { - ldr.Lrsecnm = f.getXCOFFscnum(r.sym.Sect) - } - - reloctab = append(reloctab, ldr) - } - - off += uint64(16 * len(dynimpreloc)) - reloctab = append(reloctab, dynimpreloc...) - - hdr.Lnreloc = int32(len(reloctab)) - hdr.Limpoff = off - - /* Import */ - // Default import: /usr/lib:/lib - ldimpf := &XcoffLdImportFile64{ - Limpidpath: "/usr/lib:/lib", - } - off += uint64(len(ldimpf.Limpidpath) + len(ldimpf.Limpidbase) + len(ldimpf.Limpidmem) + 3) // + null delimiter - importtab = append(importtab, ldimpf) - - // The map created by adddynimpsym associates the name to a number - // This number represents the librairie index (- 1) in this import files section - // Therefore, they must be sorted before being put inside the section - libsOrdered := make([]string, len(f.dynLibraries)) - for key, val := range f.dynLibraries { - if libsOrdered[val] != "" { - continue - } - libsOrdered[val] = key - } - - for _, lib := range libsOrdered { - // lib string is defined as base.a/mem.o or path/base.a/mem.o - n := strings.Split(lib, "/") - path := "" - base := n[len(n)-2] - mem := n[len(n)-1] - if len(n) > 2 { - path = lib[:len(lib)-len(base)-len(mem)-2] - - } - ldimpf = &XcoffLdImportFile64{ - Limpidpath: path, - Limpidbase: base, - Limpidmem: mem, - } - off += uint64(len(ldimpf.Limpidpath) + len(ldimpf.Limpidbase) + len(ldimpf.Limpidmem) + 3) // + null delimiter - importtab = append(importtab, ldimpf) - } - - hdr.Lnimpid = int32(len(importtab)) - hdr.Listlen = uint32(off - hdr.Limpoff) - hdr.Lstoff = off - hdr.Lstlen = stlen - - /* Writing */ - ctxt.Out.SeekSet(int64(globalOff)) - binary.Write(ctxt.Out, ctxt.Arch.ByteOrder, hdr) - - for _, s := range symtab { - binary.Write(ctxt.Out, ctxt.Arch.ByteOrder, s) - - } - for _, r := range reloctab { - binary.Write(ctxt.Out, ctxt.Arch.ByteOrder, r) - } - for _, f := range importtab { - ctxt.Out.WriteString(f.Limpidpath) - ctxt.Out.Write8(0) - ctxt.Out.WriteString(f.Limpidbase) - ctxt.Out.Write8(0) - ctxt.Out.WriteString(f.Limpidmem) - ctxt.Out.Write8(0) - } - for _, s := range strtab { - ctxt.Out.Write16(s.size) - ctxt.Out.WriteString(s.name) - ctxt.Out.Write8(0) // null terminator - } - - f.loaderSize = off + uint64(stlen) - ctxt.Out.Flush() - - /* again for printing */ - if !*flagA { - return - } - - ctxt.Logf("\n.loader section") - // write in buf - var buf bytes.Buffer - - binary.Write(&buf, ctxt.Arch.ByteOrder, hdr) - for _, s := range symtab { - binary.Write(&buf, ctxt.Arch.ByteOrder, s) - - } - for _, f := range importtab { - buf.WriteString(f.Limpidpath) - buf.WriteByte(0) - buf.WriteString(f.Limpidbase) - buf.WriteByte(0) - buf.WriteString(f.Limpidmem) - buf.WriteByte(0) - } - for _, s := range strtab { - binary.Write(&buf, ctxt.Arch.ByteOrder, s.size) - buf.WriteString(s.name) - buf.WriteByte(0) // null terminator - } - - // Log buffer - ctxt.Logf("\n\t%.8x|", globalOff) - for i, b := range buf.Bytes() { - if i > 0 && i%16 == 0 { - ctxt.Logf("\n\t%.8x|", uint64(globalOff)+uint64(i)) - } - ctxt.Logf(" %.2x", b) - } - ctxt.Logf("\n") - -} - -// XCOFF assembling and writing file - -func (f *xcoffFile) writeFileHeader(ctxt *Link) { - // File header - f.xfhdr.Fmagic = U64_TOCMAGIC - f.xfhdr.Fnscns = uint16(len(f.sections)) - f.xfhdr.Ftimedat = 0 - - if !*FlagS { - f.xfhdr.Fsymptr = uint64(f.symtabOffset) - f.xfhdr.Fnsyms = int32(f.symbolCount) - } - - if ctxt.BuildMode == BuildModeExe && ctxt.LinkMode == LinkInternal { - f.xfhdr.Fopthdr = AOUTHSZ_EXEC64 - f.xfhdr.Fflags = F_EXEC - - // auxiliary header - f.xahdr.Ovstamp = 1 // based on dump -o - f.xahdr.Omagic = 0x10b - copy(f.xahdr.Omodtype[:], "1L") - entry := ctxt.Syms.ROLookup(*flagEntrySymbol, 0) - f.xahdr.Oentry = uint64(entry.Value) - f.xahdr.Osnentry = f.getXCOFFscnum(entry.Sect) - toc := ctxt.Syms.ROLookup("TOC", 0) - f.xahdr.Otoc = uint64(toc.Value) - f.xahdr.Osntoc = f.getXCOFFscnum(toc.Sect) - - f.xahdr.Oalgntext = int16(logBase2(int(Funcalign))) - f.xahdr.Oalgndata = 0x5 - - binary.Write(ctxt.Out, binary.BigEndian, &f.xfhdr) - binary.Write(ctxt.Out, binary.BigEndian, &f.xahdr) - } else { - f.xfhdr.Fopthdr = 0 - binary.Write(ctxt.Out, binary.BigEndian, &f.xfhdr) - } - -} - -func xcoffwrite(ctxt *Link) { - ctxt.Out.SeekSet(0) - - xfile.writeFileHeader(ctxt) - - for _, sect := range xfile.sections { - sect.write(ctxt) - } -} - -// Generate XCOFF assembly file -func Asmbxcoff(ctxt *Link, fileoff int64) { - xfile.sectNameToScnum = make(map[string]int16) - - // Add sections - s := xfile.addSection(".text", Segtext.Vaddr, Segtext.Length, Segtext.Fileoff, STYP_TEXT) - xfile.xahdr.Otextstart = s.Svaddr - xfile.xahdr.Osntext = xfile.sectNameToScnum[".text"] - xfile.xahdr.Otsize = s.Ssize - xfile.sectText = s - - segdataVaddr := Segdata.Vaddr - segdataFilelen := Segdata.Filelen - segdataFileoff := Segdata.Fileoff - segbssFilelen := Segdata.Length - Segdata.Filelen - if len(Segrelrodata.Sections) > 0 { - // Merge relro segment to data segment as - // relro data are inside data segment on AIX. - segdataVaddr = Segrelrodata.Vaddr - segdataFileoff = Segrelrodata.Fileoff - segdataFilelen = Segdata.Vaddr + Segdata.Filelen - Segrelrodata.Vaddr - } - - s = xfile.addSection(".data", segdataVaddr, segdataFilelen, segdataFileoff, STYP_DATA) - xfile.xahdr.Odatastart = s.Svaddr - xfile.xahdr.Osndata = xfile.sectNameToScnum[".data"] - xfile.xahdr.Odsize = s.Ssize - xfile.sectData = s - - s = xfile.addSection(".bss", segdataVaddr+segdataFilelen, segbssFilelen, 0, STYP_BSS) - xfile.xahdr.Osnbss = xfile.sectNameToScnum[".bss"] - xfile.xahdr.Obsize = s.Ssize - xfile.sectBss = s - - if ctxt.LinkMode == LinkExternal { - var tbss *sym.Section - for _, s := range Segdata.Sections { - if s.Name == ".tbss" { - tbss = s - break - } - } - s = xfile.addSection(".tbss", tbss.Vaddr, tbss.Length, 0, STYP_TBSS) - } - - // add dwarf sections - for _, sect := range Segdwarf.Sections { - xfile.addDwarfSection(sect) - } - - // add and write remaining sections - if ctxt.LinkMode == LinkInternal { - // Loader section - if ctxt.BuildMode == BuildModeExe { - Loaderblk(ctxt, uint64(fileoff)) - s = xfile.addSection(".loader", 0, xfile.loaderSize, uint64(fileoff), STYP_LOADER) - xfile.xahdr.Osnloader = xfile.sectNameToScnum[".loader"] - - // Update fileoff for symbol table - fileoff += int64(xfile.loaderSize) - } - } - - // Create Symbol table - xfile.asmaixsym(ctxt) - - if ctxt.LinkMode == LinkExternal { - xfile.emitRelocations(ctxt, fileoff) - } - - // Write Symbol table - xfile.symtabOffset = ctxt.Out.Offset() - for _, s := range xfile.symtabSym { - binary.Write(ctxt.Out, ctxt.Arch.ByteOrder, s) - } - // write string table - xfile.stringTable.write(ctxt.Out) - - ctxt.Out.Flush() - - // write headers - xcoffwrite(ctxt) -} - -// byOffset is used to sort relocations by offset -type byOffset []sym.Reloc - -func (x byOffset) Len() int { return len(x) } - -func (x byOffset) Swap(i, j int) { - x[i], x[j] = x[j], x[i] -} - -func (x byOffset) Less(i, j int) bool { - return x[i].Off < x[j].Off -} - -// emitRelocations emits relocation entries for go.o in external linking. -func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { - ctxt.Out.SeekSet(fileoff) - for ctxt.Out.Offset()&7 != 0 { - ctxt.Out.Write8(0) - } - - // relocsect relocates symbols from first in section sect, and returns - // the total number of relocations emitted. - relocsect := func(sect *sym.Section, syms []*sym.Symbol, base uint64) uint32 { - // ctxt.Logf("%s 0x%x\n", sect.Name, sect.Vaddr) - // If main section has no bits, nothing to relocate. - if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { - return 0 - } - sect.Reloff = uint64(ctxt.Out.Offset()) - for i, s := range syms { - if !s.Attr.Reachable() { - continue - } - if uint64(s.Value) >= sect.Vaddr { - syms = syms[i:] - break - } - } - eaddr := int64(sect.Vaddr + sect.Length) - for _, s := range syms { - if !s.Attr.Reachable() { - continue - } - if s.Value >= int64(eaddr) { - break - } - - // Relocation must be ordered by address, so s.R is ordered by Off. - sort.Sort(byOffset(s.R)) - - for ri := range s.R { - - r := &s.R[ri] - - if r.Done { - continue - } - if r.Xsym == nil { - Errorf(s, "missing xsym in relocation") - continue - } - if r.Xsym.Dynid < 0 { - Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type.String(), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Xsym.Dynid) - } - if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, s, r, int64(uint64(s.Value+int64(r.Off))-base)) { - Errorf(s, "unsupported obj reloc %d(%s)/%d to %s", r.Type, r.Type.String(), r.Siz, r.Sym.Name) - } - } - } - sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff - return uint32(sect.Rellen) / RELSZ_64 - } - sects := []struct { - xcoffSect *XcoffScnHdr64 - segs []*sym.Segment - }{ - {f.sectText, []*sym.Segment{&Segtext}}, - {f.sectData, []*sym.Segment{&Segrelrodata, &Segdata}}, - } - for _, s := range sects { - s.xcoffSect.Srelptr = uint64(ctxt.Out.Offset()) - n := uint32(0) - for _, seg := range s.segs { - for _, sect := range seg.Sections { - if sect.Name == ".text" { - n += relocsect(sect, ctxt.Textp, 0) - } else { - n += relocsect(sect, datap, 0) - } - } - } - s.xcoffSect.Snreloc += n - } - -dwarfLoop: - for _, sect := range Segdwarf.Sections { - for _, xcoffSect := range f.sections { - _, subtyp := xcoffGetDwarfSubtype(sect.Name) - if xcoffSect.Sflags&0xF0000 == subtyp { - xcoffSect.Srelptr = uint64(ctxt.Out.Offset()) - xcoffSect.Snreloc = relocsect(sect, dwarfp, sect.Vaddr) - continue dwarfLoop - } - } - Errorf(nil, "emitRelocations: could not find %q section", sect.Name) - } -} - -// xcoffCreateExportFile creates a file with exported symbols for -// -Wl,-bE option. -// ld won't export symbols unless they are listed in an export file. -func xcoffCreateExportFile(ctxt *Link) (fname string) { - fname = filepath.Join(*flagTmpdir, "export_file.exp") - var buf bytes.Buffer - - for _, s := range ctxt.Syms.Allsym { - if !s.Attr.CgoExport() { - continue - } - if !strings.HasPrefix(s.String(), "_cgoexp_") { - continue - } - - // Retrieve the name of the initial symbol - // exported by cgo. - // The corresponding Go symbol is: - // _cgoexp_hashcode_symname. - name := strings.SplitN(s.Extname(), "_", 4)[3] - - buf.Write([]byte(name + "\n")) - } - - err := ioutil.WriteFile(fname, buf.Bytes(), 0666) - if err != nil { - Errorf(nil, "WriteFile %s failed: %v", fname, err) - } - - return fname - -} diff --git a/src/cmd/oldlink/internal/loadelf/ldelf.go b/src/cmd/oldlink/internal/loadelf/ldelf.go deleted file mode 100644 index db37db9121..0000000000 --- a/src/cmd/oldlink/internal/loadelf/ldelf.go +++ /dev/null @@ -1,1282 +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 loadelf implements an ELF file reader. -package loadelf - -import ( - "bytes" - "cmd/internal/bio" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/loader" - "cmd/oldlink/internal/sym" - "debug/elf" - "encoding/binary" - "fmt" - "io" - "log" - "sort" - "strings" -) - -/* -Derived from Plan 9 from User Space's src/libmach/elf.h, elf.c -http://code.swtch.com/plan9port/src/tip/src/libmach/ - - Copyright © 2004 Russ Cox. - Portions Copyright © 2008-2010 Google Inc. - Portions Copyright © 2010 The Go Authors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -const ( - ElfClassNone = 0 - ElfClass32 = 1 - ElfClass64 = 2 -) - -const ( - ElfDataNone = 0 - ElfDataLsb = 1 - ElfDataMsb = 2 -) - -const ( - ElfTypeNone = 0 - ElfTypeRelocatable = 1 - ElfTypeExecutable = 2 - ElfTypeSharedObject = 3 - ElfTypeCore = 4 -) - -const ( - ElfMachNone = 0 - ElfMach32100 = 1 - ElfMachSparc = 2 - ElfMach386 = 3 - ElfMach68000 = 4 - ElfMach88000 = 5 - ElfMach486 = 6 - ElfMach860 = 7 - ElfMachMips = 8 - ElfMachS370 = 9 - ElfMachMipsLe = 10 - ElfMachParisc = 15 - ElfMachVpp500 = 17 - ElfMachSparc32Plus = 18 - ElfMach960 = 19 - ElfMachPower = 20 - ElfMachPower64 = 21 - ElfMachS390 = 22 - ElfMachV800 = 36 - ElfMachFr20 = 37 - ElfMachRh32 = 38 - ElfMachRce = 39 - ElfMachArm = 40 - ElfMachAlpha = 41 - ElfMachSH = 42 - ElfMachSparc9 = 43 - ElfMachAmd64 = 62 - ElfMachArm64 = 183 -) - -const ( - ElfAbiNone = 0 - ElfAbiSystemV = 0 - ElfAbiHPUX = 1 - ElfAbiNetBSD = 2 - ElfAbiLinux = 3 - ElfAbiSolaris = 6 - ElfAbiAix = 7 - ElfAbiIrix = 8 - ElfAbiFreeBSD = 9 - ElfAbiTru64 = 10 - ElfAbiModesto = 11 - ElfAbiOpenBSD = 12 - ElfAbiARM = 97 - ElfAbiEmbedded = 255 -) - -const ( - ElfSectNone = 0 - ElfSectProgbits = 1 - ElfSectSymtab = 2 - ElfSectStrtab = 3 - ElfSectRela = 4 - ElfSectHash = 5 - ElfSectDynamic = 6 - ElfSectNote = 7 - ElfSectNobits = 8 - ElfSectRel = 9 - ElfSectShlib = 10 - ElfSectDynsym = 11 - ElfSectFlagWrite = 0x1 - ElfSectFlagAlloc = 0x2 - ElfSectFlagExec = 0x4 -) - -const ( - ElfSymBindLocal = 0 - ElfSymBindGlobal = 1 - ElfSymBindWeak = 2 -) - -const ( - ElfSymTypeNone = 0 - ElfSymTypeObject = 1 - ElfSymTypeFunc = 2 - ElfSymTypeSection = 3 - ElfSymTypeFile = 4 - ElfSymTypeCommon = 5 - ElfSymTypeTLS = 6 -) - -const ( - ElfSymShnNone = 0 - ElfSymShnAbs = 0xFFF1 - ElfSymShnCommon = 0xFFF2 -) - -const ( - ElfProgNone = 0 - ElfProgLoad = 1 - ElfProgDynamic = 2 - ElfProgInterp = 3 - ElfProgNote = 4 - ElfProgShlib = 5 - ElfProgPhdr = 6 - ElfProgFlagExec = 0x1 - ElfProgFlagWrite = 0x2 - ElfProgFlagRead = 0x4 -) - -const ( - ElfNotePrStatus = 1 - ElfNotePrFpreg = 2 - ElfNotePrPsinfo = 3 - ElfNotePrTaskstruct = 4 - ElfNotePrAuxv = 6 - ElfNotePrXfpreg = 0x46e62b7f -) - -// TODO(crawshaw): de-duplicate with cmd/oldlink/internal/ld/elf.go. -const ( - ELF64SYMSIZE = 24 - ELF32SYMSIZE = 16 - - SHT_ARM_ATTRIBUTES = 0x70000003 -) - -type ElfHdrBytes struct { - Ident [16]uint8 - Type [2]uint8 - Machine [2]uint8 - Version [4]uint8 - Entry [4]uint8 - Phoff [4]uint8 - Shoff [4]uint8 - Flags [4]uint8 - Ehsize [2]uint8 - Phentsize [2]uint8 - Phnum [2]uint8 - Shentsize [2]uint8 - Shnum [2]uint8 - Shstrndx [2]uint8 -} - -type ElfSectBytes struct { - Name [4]uint8 - Type [4]uint8 - Flags [4]uint8 - Addr [4]uint8 - Off [4]uint8 - Size [4]uint8 - Link [4]uint8 - Info [4]uint8 - Align [4]uint8 - Entsize [4]uint8 -} - -type ElfProgBytes struct { -} - -type ElfSymBytes struct { - Name [4]uint8 - Value [4]uint8 - Size [4]uint8 - Info uint8 - Other uint8 - Shndx [2]uint8 -} - -type ElfHdrBytes64 struct { - Ident [16]uint8 - Type [2]uint8 - Machine [2]uint8 - Version [4]uint8 - Entry [8]uint8 - Phoff [8]uint8 - Shoff [8]uint8 - Flags [4]uint8 - Ehsize [2]uint8 - Phentsize [2]uint8 - Phnum [2]uint8 - Shentsize [2]uint8 - Shnum [2]uint8 - Shstrndx [2]uint8 -} - -type ElfSectBytes64 struct { - Name [4]uint8 - Type [4]uint8 - Flags [8]uint8 - Addr [8]uint8 - Off [8]uint8 - Size [8]uint8 - Link [4]uint8 - Info [4]uint8 - Align [8]uint8 - Entsize [8]uint8 -} - -type ElfProgBytes64 struct { -} - -type ElfSymBytes64 struct { - Name [4]uint8 - Info uint8 - Other uint8 - Shndx [2]uint8 - Value [8]uint8 - Size [8]uint8 -} - -type ElfSect struct { - name string - nameoff uint32 - type_ uint32 - flags uint64 - addr uint64 - off uint64 - size uint64 - link uint32 - info uint32 - align uint64 - entsize uint64 - base []byte - sym *sym.Symbol -} - -type ElfObj struct { - f *bio.Reader - base int64 // offset in f where ELF begins - length int64 // length of ELF - is64 int - name string - e binary.ByteOrder - sect []ElfSect - nsect uint - nsymtab int - symtab *ElfSect - symstr *ElfSect - type_ uint32 - machine uint32 - version uint32 - entry uint64 - phoff uint64 - shoff uint64 - flags uint32 - ehsize uint32 - phentsize uint32 - phnum uint32 - shentsize uint32 - shnum uint32 - shstrndx uint32 -} - -type ElfSym struct { - name string - value uint64 - size uint64 - bind uint8 - type_ uint8 - other uint8 - shndx uint16 - sym *sym.Symbol -} - -var ElfMagic = [4]uint8{0x7F, 'E', 'L', 'F'} - -const ( - TagFile = 1 - TagCPUName = 4 - TagCPURawName = 5 - TagCompatibility = 32 - TagNoDefaults = 64 - TagAlsoCompatibleWith = 65 - TagABIVFPArgs = 28 -) - -type elfAttribute struct { - tag uint64 - sval string - ival uint64 -} - -type elfAttributeList struct { - data []byte - err error -} - -func (a *elfAttributeList) string() string { - if a.err != nil { - return "" - } - nul := bytes.IndexByte(a.data, 0) - if nul < 0 { - a.err = io.EOF - return "" - } - s := string(a.data[:nul]) - a.data = a.data[nul+1:] - return s -} - -func (a *elfAttributeList) uleb128() uint64 { - if a.err != nil { - return 0 - } - v, size := binary.Uvarint(a.data) - a.data = a.data[size:] - return v -} - -// Read an elfAttribute from the list following the rules used on ARM systems. -func (a *elfAttributeList) armAttr() elfAttribute { - attr := elfAttribute{tag: a.uleb128()} - switch { - case attr.tag == TagCompatibility: - attr.ival = a.uleb128() - attr.sval = a.string() - - case attr.tag == 64: // Tag_nodefaults has no argument - - case attr.tag == 65: // Tag_also_compatible_with - // Not really, but we don't actually care about this tag. - attr.sval = a.string() - - // Tag with string argument - case attr.tag == TagCPUName || attr.tag == TagCPURawName || (attr.tag >= 32 && attr.tag&1 != 0): - attr.sval = a.string() - - default: // Tag with integer argument - attr.ival = a.uleb128() - } - return attr -} - -func (a *elfAttributeList) done() bool { - if a.err != nil || len(a.data) == 0 { - return true - } - return false -} - -// Look for the attribute that indicates the object uses the hard-float ABI (a -// file-level attribute with tag Tag_VFP_arch and value 1). Unfortunately the -// format used means that we have to parse all of the file-level attributes to -// find the one we are looking for. This format is slightly documented in "ELF -// for the ARM Architecture" but mostly this is derived from reading the source -// to gold and readelf. -func parseArmAttributes(e binary.ByteOrder, data []byte) (found bool, ehdrFlags uint32, err error) { - found = false - if data[0] != 'A' { - return false, 0, fmt.Errorf(".ARM.attributes has unexpected format %c\n", data[0]) - } - data = data[1:] - for len(data) != 0 { - sectionlength := e.Uint32(data) - sectiondata := data[4:sectionlength] - data = data[sectionlength:] - - nulIndex := bytes.IndexByte(sectiondata, 0) - if nulIndex < 0 { - return false, 0, fmt.Errorf("corrupt .ARM.attributes (section name not NUL-terminated)\n") - } - name := string(sectiondata[:nulIndex]) - sectiondata = sectiondata[nulIndex+1:] - - if name != "aeabi" { - continue - } - for len(sectiondata) != 0 { - subsectiontag, sz := binary.Uvarint(sectiondata) - subsectionsize := e.Uint32(sectiondata[sz:]) - subsectiondata := sectiondata[sz+4 : subsectionsize] - sectiondata = sectiondata[subsectionsize:] - - if subsectiontag != TagFile { - continue - } - attrList := elfAttributeList{data: subsectiondata} - for !attrList.done() { - attr := attrList.armAttr() - if attr.tag == TagABIVFPArgs && attr.ival == 1 { - found = true - ehdrFlags = 0x5000402 // has entry point, Version5 EABI, hard-float ABI - } - } - if attrList.err != nil { - return false, 0, fmt.Errorf("could not parse .ARM.attributes\n") - } - } - } - return found, ehdrFlags, nil -} - -func Load(l *loader.Loader, arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string, flags uint32) ([]*sym.Symbol, uint32, error) { - newSym := func(name string, version int) *sym.Symbol { - return l.Create(name, syms) - } - lookup := func(name string, version int) *sym.Symbol { - return l.LookupOrCreate(name, version, syms) - } - return load(arch, syms.IncVersion(), newSym, lookup, f, pkg, length, pn, flags) -} - -func LoadOld(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string, flags uint32) ([]*sym.Symbol, uint32, error) { - return load(arch, syms.IncVersion(), syms.Newsym, syms.Lookup, f, pkg, length, pn, flags) -} - -type lookupFunc func(string, int) *sym.Symbol - -// load loads the ELF file pn from f. -// Symbols are written into syms, and a slice of the text symbols is returned. -// -// On ARM systems, Load will attempt to determine what ELF header flags to -// emit by scanning the attributes in the ELF file being loaded. The -// parameter initEhdrFlags contains the current header flags for the output -// object, and the returned ehdrFlags contains what this Load function computes. -// TODO: find a better place for this logic. -func load(arch *sys.Arch, localSymVersion int, newSym, lookup lookupFunc, f *bio.Reader, pkg string, length int64, pn string, initEhdrFlags uint32) (textp []*sym.Symbol, ehdrFlags uint32, err error) { - errorf := func(str string, args ...interface{}) ([]*sym.Symbol, uint32, error) { - return nil, 0, fmt.Errorf("loadelf: %s: %v", pn, fmt.Sprintf(str, args...)) - } - - base := f.Offset() - - var hdrbuf [64]uint8 - if _, err := io.ReadFull(f, hdrbuf[:]); err != nil { - return errorf("malformed elf file: %v", err) - } - hdr := new(ElfHdrBytes) - binary.Read(bytes.NewReader(hdrbuf[:]), binary.BigEndian, hdr) // only byte arrays; byte order doesn't matter - if string(hdr.Ident[:4]) != "\x7FELF" { - return errorf("malformed elf file, bad header") - } - var e binary.ByteOrder - switch hdr.Ident[5] { - case ElfDataLsb: - e = binary.LittleEndian - - case ElfDataMsb: - e = binary.BigEndian - - default: - return errorf("malformed elf file, unknown header") - } - - // read header - elfobj := new(ElfObj) - - elfobj.e = e - elfobj.f = f - elfobj.base = base - elfobj.length = length - elfobj.name = pn - - is64 := 0 - if hdr.Ident[4] == ElfClass64 { - is64 = 1 - hdr := new(ElfHdrBytes64) - binary.Read(bytes.NewReader(hdrbuf[:]), binary.BigEndian, hdr) // only byte arrays; byte order doesn't matter - elfobj.type_ = uint32(e.Uint16(hdr.Type[:])) - elfobj.machine = uint32(e.Uint16(hdr.Machine[:])) - elfobj.version = e.Uint32(hdr.Version[:]) - elfobj.phoff = e.Uint64(hdr.Phoff[:]) - elfobj.shoff = e.Uint64(hdr.Shoff[:]) - elfobj.flags = e.Uint32(hdr.Flags[:]) - elfobj.ehsize = uint32(e.Uint16(hdr.Ehsize[:])) - elfobj.phentsize = uint32(e.Uint16(hdr.Phentsize[:])) - elfobj.phnum = uint32(e.Uint16(hdr.Phnum[:])) - elfobj.shentsize = uint32(e.Uint16(hdr.Shentsize[:])) - elfobj.shnum = uint32(e.Uint16(hdr.Shnum[:])) - elfobj.shstrndx = uint32(e.Uint16(hdr.Shstrndx[:])) - } else { - elfobj.type_ = uint32(e.Uint16(hdr.Type[:])) - elfobj.machine = uint32(e.Uint16(hdr.Machine[:])) - elfobj.version = e.Uint32(hdr.Version[:]) - elfobj.entry = uint64(e.Uint32(hdr.Entry[:])) - elfobj.phoff = uint64(e.Uint32(hdr.Phoff[:])) - elfobj.shoff = uint64(e.Uint32(hdr.Shoff[:])) - elfobj.flags = e.Uint32(hdr.Flags[:]) - elfobj.ehsize = uint32(e.Uint16(hdr.Ehsize[:])) - elfobj.phentsize = uint32(e.Uint16(hdr.Phentsize[:])) - elfobj.phnum = uint32(e.Uint16(hdr.Phnum[:])) - elfobj.shentsize = uint32(e.Uint16(hdr.Shentsize[:])) - elfobj.shnum = uint32(e.Uint16(hdr.Shnum[:])) - elfobj.shstrndx = uint32(e.Uint16(hdr.Shstrndx[:])) - } - - elfobj.is64 = is64 - - if v := uint32(hdr.Ident[6]); v != elfobj.version { - return errorf("malformed elf version: got %d, want %d", v, elfobj.version) - } - - if e.Uint16(hdr.Type[:]) != ElfTypeRelocatable { - return errorf("elf but not elf relocatable object") - } - - switch arch.Family { - default: - return errorf("elf %s unimplemented", arch.Name) - - case sys.MIPS: - if elfobj.machine != ElfMachMips || hdr.Ident[4] != ElfClass32 { - return errorf("elf object but not mips") - } - - case sys.MIPS64: - if elfobj.machine != ElfMachMips || hdr.Ident[4] != ElfClass64 { - return errorf("elf object but not mips64") - } - - case sys.ARM: - if e != binary.LittleEndian || elfobj.machine != ElfMachArm || hdr.Ident[4] != ElfClass32 { - return errorf("elf object but not arm") - } - - case sys.AMD64: - if e != binary.LittleEndian || elfobj.machine != ElfMachAmd64 || hdr.Ident[4] != ElfClass64 { - return errorf("elf object but not amd64") - } - - case sys.ARM64: - if e != binary.LittleEndian || elfobj.machine != ElfMachArm64 || hdr.Ident[4] != ElfClass64 { - return errorf("elf object but not arm64") - } - - case sys.I386: - if e != binary.LittleEndian || elfobj.machine != ElfMach386 || hdr.Ident[4] != ElfClass32 { - return errorf("elf object but not 386") - } - - case sys.PPC64: - if elfobj.machine != ElfMachPower64 || hdr.Ident[4] != ElfClass64 { - return errorf("elf object but not ppc64") - } - - case sys.S390X: - if elfobj.machine != ElfMachS390 || hdr.Ident[4] != ElfClass64 { - return errorf("elf object but not s390x") - } - } - - // load section list into memory. - elfobj.sect = make([]ElfSect, elfobj.shnum) - - elfobj.nsect = uint(elfobj.shnum) - for i := 0; uint(i) < elfobj.nsect; i++ { - f.MustSeek(int64(uint64(base)+elfobj.shoff+uint64(int64(i)*int64(elfobj.shentsize))), 0) - sect := &elfobj.sect[i] - if is64 != 0 { - var b ElfSectBytes64 - - if err := binary.Read(f, e, &b); err != nil { - return errorf("malformed elf file: %v", err) - } - - sect.nameoff = e.Uint32(b.Name[:]) - sect.type_ = e.Uint32(b.Type[:]) - sect.flags = e.Uint64(b.Flags[:]) - sect.addr = e.Uint64(b.Addr[:]) - sect.off = e.Uint64(b.Off[:]) - sect.size = e.Uint64(b.Size[:]) - sect.link = e.Uint32(b.Link[:]) - sect.info = e.Uint32(b.Info[:]) - sect.align = e.Uint64(b.Align[:]) - sect.entsize = e.Uint64(b.Entsize[:]) - } else { - var b ElfSectBytes - - if err := binary.Read(f, e, &b); err != nil { - return errorf("malformed elf file: %v", err) - } - - sect.nameoff = e.Uint32(b.Name[:]) - sect.type_ = e.Uint32(b.Type[:]) - sect.flags = uint64(e.Uint32(b.Flags[:])) - sect.addr = uint64(e.Uint32(b.Addr[:])) - sect.off = uint64(e.Uint32(b.Off[:])) - sect.size = uint64(e.Uint32(b.Size[:])) - sect.link = e.Uint32(b.Link[:]) - sect.info = e.Uint32(b.Info[:]) - sect.align = uint64(e.Uint32(b.Align[:])) - sect.entsize = uint64(e.Uint32(b.Entsize[:])) - } - } - - // read section string table and translate names - if elfobj.shstrndx >= uint32(elfobj.nsect) { - return errorf("malformed elf file: shstrndx out of range %d >= %d", elfobj.shstrndx, elfobj.nsect) - } - - sect := &elfobj.sect[elfobj.shstrndx] - if err := elfmap(elfobj, sect); err != nil { - return errorf("malformed elf file: %v", err) - } - for i := 0; uint(i) < elfobj.nsect; i++ { - if elfobj.sect[i].nameoff != 0 { - elfobj.sect[i].name = cstring(sect.base[elfobj.sect[i].nameoff:]) - } - } - - // load string table for symbols into memory. - elfobj.symtab = section(elfobj, ".symtab") - - if elfobj.symtab == nil { - // our work is done here - no symbols means nothing can refer to this file - return - } - - if elfobj.symtab.link <= 0 || elfobj.symtab.link >= uint32(elfobj.nsect) { - return errorf("elf object has symbol table with invalid string table link") - } - - elfobj.symstr = &elfobj.sect[elfobj.symtab.link] - if is64 != 0 { - elfobj.nsymtab = int(elfobj.symtab.size / ELF64SYMSIZE) - } else { - elfobj.nsymtab = int(elfobj.symtab.size / ELF32SYMSIZE) - } - - if err := elfmap(elfobj, elfobj.symtab); err != nil { - return errorf("malformed elf file: %v", err) - } - if err := elfmap(elfobj, elfobj.symstr); err != nil { - return errorf("malformed elf file: %v", err) - } - - // load text and data segments into memory. - // they are not as small as the section lists, but we'll need - // the memory anyway for the symbol images, so we might - // as well use one large chunk. - - // create symbols for elfmapped sections - sectsymNames := make(map[string]bool) - counter := 0 - for i := 0; uint(i) < elfobj.nsect; i++ { - sect = &elfobj.sect[i] - if sect.type_ == SHT_ARM_ATTRIBUTES && sect.name == ".ARM.attributes" { - if err := elfmap(elfobj, sect); err != nil { - return errorf("%s: malformed elf file: %v", pn, err) - } - // We assume the soft-float ABI unless we see a tag indicating otherwise. - if initEhdrFlags == 0x5000002 { - ehdrFlags = 0x5000202 - } else { - ehdrFlags = initEhdrFlags - } - found, newEhdrFlags, err := parseArmAttributes(e, sect.base[:sect.size]) - if err != nil { - // TODO(dfc) should this return an error? - log.Printf("%s: %v", pn, err) - } - if found { - ehdrFlags = newEhdrFlags - } - } - if (sect.type_ != ElfSectProgbits && sect.type_ != ElfSectNobits) || sect.flags&ElfSectFlagAlloc == 0 { - continue - } - if sect.type_ != ElfSectNobits { - if err := elfmap(elfobj, sect); err != nil { - return errorf("%s: malformed elf file: %v", pn, err) - } - } - - name := fmt.Sprintf("%s(%s)", pkg, sect.name) - for sectsymNames[name] { - counter++ - name = fmt.Sprintf("%s(%s%d)", pkg, sect.name, counter) - } - sectsymNames[name] = true - - s := lookup(name, localSymVersion) - - switch int(sect.flags) & (ElfSectFlagAlloc | ElfSectFlagWrite | ElfSectFlagExec) { - default: - return errorf("%s: unexpected flags for ELF section %s", pn, sect.name) - - case ElfSectFlagAlloc: - s.Type = sym.SRODATA - - case ElfSectFlagAlloc + ElfSectFlagWrite: - if sect.type_ == ElfSectNobits { - s.Type = sym.SNOPTRBSS - } else { - s.Type = sym.SNOPTRDATA - } - - case ElfSectFlagAlloc + ElfSectFlagExec: - s.Type = sym.STEXT - } - - if sect.name == ".got" || sect.name == ".toc" { - s.Type = sym.SELFGOT - } - if sect.type_ == ElfSectProgbits { - s.P = sect.base - s.P = s.P[:sect.size] - } - - s.Size = int64(sect.size) - s.Align = int32(sect.align) - sect.sym = s - } - - // enter sub-symbols into symbol table. - // symbol 0 is the null symbol. - symbols := make([]*sym.Symbol, elfobj.nsymtab) - - for i := 1; i < elfobj.nsymtab; i++ { - var elfsym ElfSym - if err := readelfsym(newSym, lookup, arch, elfobj, i, &elfsym, 1, localSymVersion); err != nil { - return errorf("%s: malformed elf file: %v", pn, err) - } - symbols[i] = elfsym.sym - if elfsym.type_ != ElfSymTypeFunc && elfsym.type_ != ElfSymTypeObject && elfsym.type_ != ElfSymTypeNone && elfsym.type_ != ElfSymTypeCommon { - continue - } - if elfsym.shndx == ElfSymShnCommon || elfsym.type_ == ElfSymTypeCommon { - s := elfsym.sym - if uint64(s.Size) < elfsym.size { - s.Size = int64(elfsym.size) - } - if s.Type == 0 || s.Type == sym.SXREF { - s.Type = sym.SNOPTRBSS - } - continue - } - - if uint(elfsym.shndx) >= elfobj.nsect || elfsym.shndx == 0 { - continue - } - - // even when we pass needSym == 1 to readelfsym, it might still return nil to skip some unwanted symbols - if elfsym.sym == nil { - continue - } - sect = &elfobj.sect[elfsym.shndx] - if sect.sym == nil { - if strings.HasPrefix(elfsym.name, ".Linfo_string") { // clang does this - continue - } - - if elfsym.name == "" && elfsym.type_ == 0 && sect.name == ".debug_str" { - // This reportedly happens with clang 3.7 on ARM. - // See issue 13139. - continue - } - - if strings.HasPrefix(elfsym.name, "$d") && elfsym.type_ == 0 && sect.name == ".debug_frame" { - // "$d" is a marker, not a real symbol. - // This happens with gcc on ARM64. - // See https://sourceware.org/bugzilla/show_bug.cgi?id=21809 - continue - } - - if strings.HasPrefix(elfsym.name, ".LASF") { // gcc on s390x does this - continue - } - return errorf("%v: sym#%d: ignoring symbol in section %d (type %d)", elfsym.sym, i, elfsym.shndx, elfsym.type_) - } - - s := elfsym.sym - if s.Outer != nil { - if s.Attr.DuplicateOK() { - continue - } - return errorf("duplicate symbol reference: %s in both %s and %s", s.Name, s.Outer.Name, sect.sym.Name) - } - - s.Sub = sect.sym.Sub - sect.sym.Sub = s - s.Type = sect.sym.Type - s.Attr |= sym.AttrSubSymbol - if !s.Attr.CgoExportDynamic() { - s.SetDynimplib("") // satisfy dynimport - } - s.Value = int64(elfsym.value) - s.Size = int64(elfsym.size) - s.Outer = sect.sym - if sect.sym.Type == sym.STEXT { - if s.Attr.External() && !s.Attr.DuplicateOK() { - return errorf("%v: duplicate symbol definition", s) - } - s.Attr |= sym.AttrExternal - } - - if elfobj.machine == ElfMachPower64 { - flag := int(elfsym.other) >> 5 - if 2 <= flag && flag <= 6 { - s.SetLocalentry(1 << uint(flag-2)) - } else if flag == 7 { - return errorf("%v: invalid sym.other 0x%x", s, elfsym.other) - } - } - } - - // Sort outer lists by address, adding to textp. - // This keeps textp in increasing address order. - for i := uint(0); i < elfobj.nsect; i++ { - s := elfobj.sect[i].sym - if s == nil { - continue - } - if s.Sub != nil { - s.Sub = sym.SortSub(s.Sub) - } - if s.Type == sym.STEXT { - if s.Attr.OnList() { - return errorf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - textp = append(textp, s) - for s = s.Sub; s != nil; s = s.Sub { - if s.Attr.OnList() { - return errorf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - textp = append(textp, s) - } - } - } - - // load relocations - for i := uint(0); i < elfobj.nsect; i++ { - rsect := &elfobj.sect[i] - if rsect.type_ != ElfSectRela && rsect.type_ != ElfSectRel { - continue - } - if rsect.info >= uint32(elfobj.nsect) || elfobj.sect[rsect.info].base == nil { - continue - } - sect = &elfobj.sect[rsect.info] - if err := elfmap(elfobj, rsect); err != nil { - return errorf("malformed elf file: %v", err) - } - rela := 0 - if rsect.type_ == ElfSectRela { - rela = 1 - } - n := int(rsect.size / uint64(4+4*is64) / uint64(2+rela)) - r := make([]sym.Reloc, n) - p := rsect.base - for j := 0; j < n; j++ { - var add uint64 - var symIdx int - var relocType uint64 - - rp := &r[j] - if is64 != 0 { - // 64-bit rel/rela - rp.Off = int32(e.Uint64(p)) - - p = p[8:] - switch arch.Family { - case sys.MIPS64: - // https://www.linux-mips.org/pub/linux/mips/doc/ABI/elf64-2.4.pdf - // The doc shows it's different with general Linux ELF - symIdx = int(e.Uint32(p)) - relocType = uint64(p[7]) - default: - info := e.Uint64(p) - relocType = info & 0xffffffff - symIdx = int(info >> 32) - } - p = p[8:] - if rela != 0 { - add = e.Uint64(p) - p = p[8:] - } - } else { - // 32-bit rel/rela - rp.Off = int32(e.Uint32(p)) - - p = p[4:] - info := e.Uint32(p) - relocType = uint64(info & 0xff) - symIdx = int(info >> 8) - p = p[4:] - if rela != 0 { - add = uint64(e.Uint32(p)) - p = p[4:] - } - } - - if relocType == 0 { // skip R_*_NONE relocation - j-- - n-- - continue - } - - if symIdx == 0 { // absolute relocation, don't bother reading the null symbol - rp.Sym = nil - } else { - var elfsym ElfSym - if err := readelfsym(newSym, lookup, arch, elfobj, symIdx, &elfsym, 0, 0); err != nil { - return errorf("malformed elf file: %v", err) - } - elfsym.sym = symbols[symIdx] - if elfsym.sym == nil { - return errorf("malformed elf file: %s#%d: reloc of invalid sym #%d %s shndx=%d type=%d", sect.sym.Name, j, symIdx, elfsym.name, elfsym.shndx, elfsym.type_) - } - - rp.Sym = elfsym.sym - } - - rp.Type = objabi.ElfRelocOffset + objabi.RelocType(relocType) - rp.Siz, err = relSize(arch, pn, uint32(relocType)) - if err != nil { - return nil, 0, err - } - if rela != 0 { - rp.Add = int64(add) - } else { - // load addend from image - if rp.Siz == 4 { - rp.Add = int64(e.Uint32(sect.base[rp.Off:])) - } else if rp.Siz == 8 { - rp.Add = int64(e.Uint64(sect.base[rp.Off:])) - } else { - return errorf("invalid rela size %d", rp.Siz) - } - } - - if rp.Siz == 2 { - rp.Add = int64(int16(rp.Add)) - } - if rp.Siz == 4 { - rp.Add = int64(int32(rp.Add)) - } - } - - //print("rel %s %d %d %s %#llx\n", sect->sym->name, rp->type, rp->siz, rp->sym->name, rp->add); - sort.Sort(sym.RelocByOff(r[:n])) - // just in case - - s := sect.sym - s.R = r - s.R = s.R[:n] - } - - return textp, ehdrFlags, nil -} - -func section(elfobj *ElfObj, name string) *ElfSect { - for i := 0; uint(i) < elfobj.nsect; i++ { - if elfobj.sect[i].name != "" && name != "" && elfobj.sect[i].name == name { - return &elfobj.sect[i] - } - } - return nil -} - -func elfmap(elfobj *ElfObj, sect *ElfSect) (err error) { - if sect.base != nil { - return nil - } - - if sect.off+sect.size > uint64(elfobj.length) { - err = fmt.Errorf("elf section past end of file") - return err - } - - sect.base = make([]byte, sect.size) - elfobj.f.MustSeek(int64(uint64(elfobj.base)+sect.off), 0) - if _, err := io.ReadFull(elfobj.f, sect.base); err != nil { - return fmt.Errorf("short read: %v", err) - } - - return nil -} - -func readelfsym(newSym, lookup lookupFunc, arch *sys.Arch, elfobj *ElfObj, i int, elfsym *ElfSym, needSym int, localSymVersion int) (err error) { - if i >= elfobj.nsymtab || i < 0 { - err = fmt.Errorf("invalid elf symbol index") - return err - } - - if i == 0 { - return fmt.Errorf("readym: read null symbol!") - } - - if elfobj.is64 != 0 { - b := new(ElfSymBytes64) - binary.Read(bytes.NewReader(elfobj.symtab.base[i*ELF64SYMSIZE:(i+1)*ELF64SYMSIZE]), elfobj.e, b) - elfsym.name = cstring(elfobj.symstr.base[elfobj.e.Uint32(b.Name[:]):]) - elfsym.value = elfobj.e.Uint64(b.Value[:]) - elfsym.size = elfobj.e.Uint64(b.Size[:]) - elfsym.shndx = elfobj.e.Uint16(b.Shndx[:]) - elfsym.bind = b.Info >> 4 - elfsym.type_ = b.Info & 0xf - elfsym.other = b.Other - } else { - b := new(ElfSymBytes) - binary.Read(bytes.NewReader(elfobj.symtab.base[i*ELF32SYMSIZE:(i+1)*ELF32SYMSIZE]), elfobj.e, b) - elfsym.name = cstring(elfobj.symstr.base[elfobj.e.Uint32(b.Name[:]):]) - elfsym.value = uint64(elfobj.e.Uint32(b.Value[:])) - elfsym.size = uint64(elfobj.e.Uint32(b.Size[:])) - elfsym.shndx = elfobj.e.Uint16(b.Shndx[:]) - elfsym.bind = b.Info >> 4 - elfsym.type_ = b.Info & 0xf - elfsym.other = b.Other - } - - var s *sym.Symbol - if elfsym.name == "_GLOBAL_OFFSET_TABLE_" { - elfsym.name = ".got" - } - if elfsym.name == ".TOC." { - // Magic symbol on ppc64. Will be set to this object - // file's .got+0x8000. - elfsym.bind = ElfSymBindLocal - } - - switch elfsym.type_ { - case ElfSymTypeSection: - s = elfobj.sect[elfsym.shndx].sym - - case ElfSymTypeObject, ElfSymTypeFunc, ElfSymTypeNone, ElfSymTypeCommon: - switch elfsym.bind { - case ElfSymBindGlobal: - if needSym != 0 { - s = lookup(elfsym.name, 0) - - // for global scoped hidden symbols we should insert it into - // symbol hash table, but mark them as hidden. - // __i686.get_pc_thunk.bx is allowed to be duplicated, to - // workaround that we set dupok. - // TODO(minux): correctly handle __i686.get_pc_thunk.bx without - // set dupok generally. See https://golang.org/cl/5823055 - // comment #5 for details. - if s != nil && elfsym.other == 2 { - s.Attr |= sym.AttrDuplicateOK | sym.AttrVisibilityHidden - } - } - - case ElfSymBindLocal: - if (arch.Family == sys.ARM || arch.Family == sys.ARM64) && (strings.HasPrefix(elfsym.name, "$a") || strings.HasPrefix(elfsym.name, "$d") || strings.HasPrefix(elfsym.name, "$x")) { - // binutils for arm and arm64 generate these mapping - // symbols, ignore these - break - } - - if elfsym.name == ".TOC." { - // We need to be able to look this up, - // so put it in the hash table. - if needSym != 0 { - s = lookup(elfsym.name, localSymVersion) - s.Attr |= sym.AttrVisibilityHidden - } - - break - } - - if needSym != 0 { - // local names and hidden global names are unique - // and should only be referenced by their index, not name, so we - // don't bother to add them into the hash table - // FIXME: pass empty string here for name? This would - // reduce mem use, but also (possibly) make it harder - // to debug problems. - s = newSym(elfsym.name, localSymVersion) - - s.Attr |= sym.AttrVisibilityHidden - } - - case ElfSymBindWeak: - if needSym != 0 { - s = lookup(elfsym.name, 0) - if elfsym.other == 2 { - s.Attr |= sym.AttrVisibilityHidden - } - - // Allow weak symbols to be duplicated when already defined. - if s.Outer != nil { - s.Attr |= sym.AttrDuplicateOK - } - } - - default: - err = fmt.Errorf("%s: invalid symbol binding %d", elfsym.name, elfsym.bind) - return err - } - } - - // TODO(mwhudson): the test of VisibilityHidden here probably doesn't make - // sense and should be removed when someone has thought about it properly. - if s != nil && s.Type == 0 && !s.Attr.VisibilityHidden() && elfsym.type_ != ElfSymTypeSection { - s.Type = sym.SXREF - } - elfsym.sym = s - - return nil -} - -func relSize(arch *sys.Arch, pn string, elftype uint32) (uint8, error) { - // TODO(mdempsky): Replace this with a struct-valued switch statement - // once golang.org/issue/15164 is fixed or found to not impair cmd/link - // performance. - - const ( - AMD64 = uint32(sys.AMD64) - ARM = uint32(sys.ARM) - ARM64 = uint32(sys.ARM64) - I386 = uint32(sys.I386) - PPC64 = uint32(sys.PPC64) - S390X = uint32(sys.S390X) - MIPS = uint32(sys.MIPS) - MIPS64 = uint32(sys.MIPS64) - ) - - switch uint32(arch.Family) | elftype<<16 { - default: - return 0, fmt.Errorf("%s: unknown relocation type %d; compiled without -fpic?", pn, elftype) - - case MIPS | uint32(elf.R_MIPS_HI16)<<16, - MIPS | uint32(elf.R_MIPS_LO16)<<16, - MIPS | uint32(elf.R_MIPS_GOT16)<<16, - MIPS | uint32(elf.R_MIPS_GPREL16)<<16, - MIPS | uint32(elf.R_MIPS_GOT_PAGE)<<16, - MIPS | uint32(elf.R_MIPS_JALR)<<16, - MIPS | uint32(elf.R_MIPS_GOT_OFST)<<16, - MIPS64 | uint32(elf.R_MIPS_HI16)<<16, - MIPS64 | uint32(elf.R_MIPS_LO16)<<16, - MIPS64 | uint32(elf.R_MIPS_GOT16)<<16, - MIPS64 | uint32(elf.R_MIPS_GPREL16)<<16, - MIPS64 | uint32(elf.R_MIPS_GOT_PAGE)<<16, - MIPS64 | uint32(elf.R_MIPS_JALR)<<16, - MIPS64 | uint32(elf.R_MIPS_GOT_OFST)<<16: - return 4, nil - - case S390X | uint32(elf.R_390_8)<<16: - return 1, nil - - case PPC64 | uint32(elf.R_PPC64_TOC16)<<16, - PPC64 | uint32(elf.R_PPC64_TOC16_LO)<<16, - PPC64 | uint32(elf.R_PPC64_TOC16_HI)<<16, - PPC64 | uint32(elf.R_PPC64_TOC16_HA)<<16, - PPC64 | uint32(elf.R_PPC64_TOC16_DS)<<16, - PPC64 | uint32(elf.R_PPC64_TOC16_LO_DS)<<16, - PPC64 | uint32(elf.R_PPC64_REL16_LO)<<16, - PPC64 | uint32(elf.R_PPC64_REL16_HI)<<16, - PPC64 | uint32(elf.R_PPC64_REL16_HA)<<16, - S390X | uint32(elf.R_390_16)<<16, - S390X | uint32(elf.R_390_GOT16)<<16, - S390X | uint32(elf.R_390_PC16)<<16, - S390X | uint32(elf.R_390_PC16DBL)<<16, - S390X | uint32(elf.R_390_PLT16DBL)<<16: - return 2, nil - - case ARM | uint32(elf.R_ARM_ABS32)<<16, - ARM | uint32(elf.R_ARM_GOT32)<<16, - ARM | uint32(elf.R_ARM_PLT32)<<16, - ARM | uint32(elf.R_ARM_GOTOFF)<<16, - ARM | uint32(elf.R_ARM_GOTPC)<<16, - ARM | uint32(elf.R_ARM_THM_PC22)<<16, - ARM | uint32(elf.R_ARM_REL32)<<16, - ARM | uint32(elf.R_ARM_CALL)<<16, - ARM | uint32(elf.R_ARM_V4BX)<<16, - ARM | uint32(elf.R_ARM_GOT_PREL)<<16, - ARM | uint32(elf.R_ARM_PC24)<<16, - ARM | uint32(elf.R_ARM_JUMP24)<<16, - ARM64 | uint32(elf.R_AARCH64_CALL26)<<16, - ARM64 | uint32(elf.R_AARCH64_ADR_GOT_PAGE)<<16, - ARM64 | uint32(elf.R_AARCH64_LD64_GOT_LO12_NC)<<16, - ARM64 | uint32(elf.R_AARCH64_ADR_PREL_PG_HI21)<<16, - ARM64 | uint32(elf.R_AARCH64_ADD_ABS_LO12_NC)<<16, - ARM64 | uint32(elf.R_AARCH64_LDST8_ABS_LO12_NC)<<16, - ARM64 | uint32(elf.R_AARCH64_LDST32_ABS_LO12_NC)<<16, - ARM64 | uint32(elf.R_AARCH64_LDST64_ABS_LO12_NC)<<16, - ARM64 | uint32(elf.R_AARCH64_LDST128_ABS_LO12_NC)<<16, - ARM64 | uint32(elf.R_AARCH64_PREL32)<<16, - ARM64 | uint32(elf.R_AARCH64_JUMP26)<<16, - AMD64 | uint32(elf.R_X86_64_PC32)<<16, - AMD64 | uint32(elf.R_X86_64_PLT32)<<16, - AMD64 | uint32(elf.R_X86_64_GOTPCREL)<<16, - AMD64 | uint32(elf.R_X86_64_GOTPCRELX)<<16, - AMD64 | uint32(elf.R_X86_64_REX_GOTPCRELX)<<16, - I386 | uint32(elf.R_386_32)<<16, - I386 | uint32(elf.R_386_PC32)<<16, - I386 | uint32(elf.R_386_GOT32)<<16, - I386 | uint32(elf.R_386_PLT32)<<16, - I386 | uint32(elf.R_386_GOTOFF)<<16, - 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_PPC_REL32)<<16, - S390X | uint32(elf.R_390_32)<<16, - S390X | uint32(elf.R_390_PC32)<<16, - S390X | uint32(elf.R_390_GOT32)<<16, - S390X | uint32(elf.R_390_PLT32)<<16, - S390X | uint32(elf.R_390_PC32DBL)<<16, - S390X | uint32(elf.R_390_PLT32DBL)<<16, - S390X | uint32(elf.R_390_GOTPCDBL)<<16, - S390X | uint32(elf.R_390_GOTENT)<<16: - return 4, nil - - case AMD64 | uint32(elf.R_X86_64_64)<<16, - AMD64 | uint32(elf.R_X86_64_PC64)<<16, - ARM64 | uint32(elf.R_AARCH64_ABS64)<<16, - ARM64 | uint32(elf.R_AARCH64_PREL64)<<16, - PPC64 | uint32(elf.R_PPC64_ADDR64)<<16, - S390X | uint32(elf.R_390_GLOB_DAT)<<16, - S390X | uint32(elf.R_390_RELATIVE)<<16, - S390X | uint32(elf.R_390_GOTOFF)<<16, - S390X | uint32(elf.R_390_GOTPC)<<16, - S390X | uint32(elf.R_390_64)<<16, - S390X | uint32(elf.R_390_PC64)<<16, - S390X | uint32(elf.R_390_GOT64)<<16, - S390X | uint32(elf.R_390_PLT64)<<16: - return 8, nil - } -} - -func cstring(x []byte) string { - i := bytes.IndexByte(x, '\x00') - if i >= 0 { - x = x[:i] - } - return string(x) -} diff --git a/src/cmd/oldlink/internal/loader/loader.go b/src/cmd/oldlink/internal/loader/loader.go deleted file mode 100644 index 8c618bfe4d..0000000000 --- a/src/cmd/oldlink/internal/loader/loader.go +++ /dev/null @@ -1,629 +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 loader - -import ( - "bytes" - "cmd/internal/bio" - "cmd/internal/dwarf" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "fmt" - "log" - "sort" - "strconv" - "strings" -) - -var _ = fmt.Print - -// 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 - -// Relocs encapsulates the set of relocations on a given symbol; an -// instance of this type is returned by the Loader Relocs() method. -type Relocs struct { - Count int // number of relocs - - li int // local index of symbol whose relocs we're examining - r *oReader // object reader for containing package - l *Loader // loader - - ext *sym.Symbol // external symbol if not nil -} - -// Reloc contains the payload for a specific relocation. -// TODO: replace this with sym.Reloc, once we change the -// relocation target from "*sym.Symbol" to "loader.Sym" in sym.Reloc. -type Reloc struct { - Off int32 // offset to rewrite - Size uint8 // number of bytes to rewrite: 0, 1, 2, or 4 - Type objabi.RelocType // the relocation type - Add int64 // addend - Sym Sym // global index of symbol the reloc addresses -} - -// oReader is a wrapper type of obj.Reader, along with some -// extra information. -// TODO: rename to objReader once the old one is gone? -type oReader struct { - //*goobj2.Reader - unit *sym.CompilationUnit - version int // version of static symbol - flags uint32 // read from object file - pkgprefix string - rcache []Sym // cache mapping local PkgNone symbol to resolved Sym -} - -type objIdx struct { - r *oReader - i Sym // start index - e Sym // end index -} - -type nameVer struct { - name string - v int -} - -type bitmap []uint32 - -// set the i-th bit. -func (bm bitmap) Set(i Sym) { - n, r := uint(i)/32, uint(i)%32 - bm[n] |= 1 << r -} - -// whether the i-th bit is set. -func (bm bitmap) Has(i Sym) bool { - n, r := uint(i)/32, uint(i)%32 - return bm[n]&(1<= sym.SymVerStatic - if static { - if _, ok := l.extStaticSyms[nameVer{name, ver}]; ok { - return 0 - } - } else { - if _, ok := l.symsByName[ver][name]; ok { - return 0 - } - } - i := l.max + 1 - if static { - l.extStaticSyms[nameVer{name, ver}] = i - } else { - l.symsByName[ver][name] = i - } - l.max++ - if l.extStart == 0 { - l.extStart = i - } - l.extSyms = append(l.extSyms, nameVer{name, ver}) - l.growSyms(int(i)) - return i -} - -func (l *Loader) IsExternal(i Sym) bool { - return l.extStart != 0 && i >= l.extStart -} - -// Ensure Syms slice has enough space. -func (l *Loader) growSyms(i int) { - n := len(l.Syms) - if n > i { - return - } - l.Syms = append(l.Syms, make([]*sym.Symbol, i+1-n)...) -} - -// Convert a local index to a global index. -func (l *Loader) toGlobal(r *oReader, i int) Sym { - g := l.startIndex(r) + Sym(i) - if ov, ok := l.overwrite[g]; ok { - return ov - } - return g -} - -// Convert a global index to a local index. -func (l *Loader) toLocal(i Sym) (*oReader, int) { - if ov, ok := l.overwrite[i]; ok { - i = ov - } - if l.IsExternal(i) { - return nil, int(i - l.extStart) - } - oc := l.ocache - if oc != 0 && i >= l.objs[oc].i && i <= l.objs[oc].e { - return l.objs[oc].r, int(i - l.objs[oc].i) - } - // Search for the local object holding index i. - // Below k is the first one that has its start index > i, - // so k-1 is the one we want. - k := sort.Search(len(l.objs), func(k int) bool { - return l.objs[k].i > i - }) - l.ocache = k - 1 - return l.objs[k-1].r, int(i - l.objs[k-1].i) -} - -// Look up a symbol by name, return global index, or 0 if not found. -// This is more like Syms.ROLookup than Lookup -- it doesn't create -// new symbol. -func (l *Loader) Lookup(name string, ver int) Sym { - if ver >= sym.SymVerStatic || ver < 0 { - return l.extStaticSyms[nameVer{name, ver}] - } - return l.symsByName[ver][name] -} - -// Returns whether i is a dup of another symbol, and i is not -// "primary", i.e. Lookup i by name will not return i. -func (l *Loader) IsDup(i Sym) bool { - panic("unreachable") -} - -// Check that duplicate symbols have same contents. -func (l *Loader) checkdup(name string, i Sym, r *oReader, dup Sym) { - panic("unreachable") -} - -func (l *Loader) NStrictDupMsgs() int { return l.strictDupMsgs } - -// Number of total symbols. -func (l *Loader) NSym() int { - return int(l.max + 1) -} - -// Number of defined Go symbols. -func (l *Loader) NDef() int { - return int(l.extStart) -} - -// Returns the raw (unpatched) name of the i-th symbol. -func (l *Loader) RawSymName(i Sym) string { - panic("unreachable") -} - -// Returns the (patched) name of the i-th symbol. -func (l *Loader) SymName(i Sym) string { - panic("unreachable") -} - -// Returns the type of the i-th symbol. -func (l *Loader) SymType(i Sym) sym.SymKind { - panic("unreachable") -} - -// Returns the attributes of the i-th symbol. -func (l *Loader) SymAttr(i Sym) uint8 { - panic("unreachable") -} - -// Returns whether the i-th symbol has ReflectMethod attribute set. -func (l *Loader) IsReflectMethod(i Sym) bool { - panic("unreachable") -} - -// Returns whether this is a Go type symbol. -func (l *Loader) IsGoType(i Sym) bool { - panic("unreachable") -} - -// Returns whether this is a "go.itablink.*" symbol. -func (l *Loader) IsItabLink(i Sym) bool { - if _, ok := l.itablink[i]; ok { - return true - } - return false -} - -// Returns the symbol content of the i-th symbol. i is global index. -func (l *Loader) Data(i Sym) []byte { - panic("unreachable") -} - -// Returns the number of aux symbols given a global index. -func (l *Loader) NAux(i Sym) int { - panic("unreachable") -} - -// Returns the referred symbol of the j-th aux symbol of the i-th -// symbol. -func (l *Loader) AuxSym(i Sym, j int) Sym { - panic("unreachable") -} - -// ReadAuxSyms reads the aux symbol ids for the specified symbol into the -// slice passed as a parameter. If the slice capacity is not large enough, a new -// larger slice will be allocated. Final slice is returned. -func (l *Loader) ReadAuxSyms(symIdx Sym, dst []Sym) []Sym { - panic("unreachable") -} - -// OuterSym gets the outer symbol for host object loaded symbols. -func (l *Loader) OuterSym(i Sym) Sym { - sym := l.Syms[i] - if sym != nil && sym.Outer != nil { - outer := sym.Outer - return l.Lookup(outer.Name, int(outer.Version)) - } - return 0 -} - -// SubSym gets the subsymbol for host object loaded symbols. -func (l *Loader) SubSym(i Sym) Sym { - sym := l.Syms[i] - if sym != nil && sym.Sub != nil { - sub := sym.Sub - return l.Lookup(sub.Name, int(sub.Version)) - } - return 0 -} - -// Initialize Reachable bitmap for running deadcode pass. -func (l *Loader) InitReachable() { - l.Reachable = makeBitmap(l.NSym()) -} - -// At method returns the j-th reloc for a global symbol. -func (relocs *Relocs) At(j int) Reloc { - panic("unreachable") -} - -// ReadAll method reads all relocations for a symbol into the -// specified slice. If the slice capacity is not large enough, a new -// larger slice will be allocated. Final slice is returned. -func (relocs *Relocs) ReadAll(dst []Reloc) []Reloc { - panic("unreachable") -} - -// Relocs returns a Relocs object for the given global sym. -func (l *Loader) Relocs(i Sym) Relocs { - panic("unreachable") -} - -// Preload a package: add autolibs, add symbols to the symbol table. -// Does not read symbol data yet. -func (l *Loader) Preload(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, unit *sym.CompilationUnit, length int64, pn string, flags int) { - panic("unreachable") -} - -// Make sure referenced symbols are added. Most of them should already be added. -// This should only be needed for referenced external symbols. -func (l *Loader) LoadRefs(arch *sys.Arch, syms *sym.Symbols) { - for _, o := range l.objs[1:] { - loadObjRefs(l, o.r, arch, syms) - } -} - -func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch, syms *sym.Symbols) { - panic("unreachable") -} - -func abiToVer(abi uint16, localSymVersion int) int { - panic("unreachable") -} - -func preprocess(arch *sys.Arch, s *sym.Symbol) { - if s.Name != "" && s.Name[0] == '$' && len(s.Name) > 5 && s.Type == 0 && len(s.P) == 0 { - x, err := strconv.ParseUint(s.Name[5:], 16, 64) - if err != nil { - log.Panicf("failed to parse $-symbol %s: %v", s.Name, err) - } - s.Type = sym.SRODATA - s.Attr |= sym.AttrLocal - switch s.Name[:5] { - case "$f32.": - if uint64(uint32(x)) != x { - log.Panicf("$-symbol %s too large: %d", s.Name, x) - } - s.AddUint32(arch, uint32(x)) - case "$f64.", "$i64.": - s.AddUint64(arch, x) - default: - log.Panicf("unrecognized $-symbol: %s", s.Name) - } - } -} - -// Load full contents. -func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols) { - // create all Symbols first. - l.growSyms(l.NSym()) - - nr := 0 // total number of sym.Reloc's we'll need - for _, o := range l.objs[1:] { - nr += loadObjSyms(l, syms, o.r) - } - - // allocate a single large slab of relocations for all live symbols - l.relocBatch = make([]sym.Reloc, nr) - - // external symbols - for i := l.extStart; i <= l.max; i++ { - if s := l.Syms[i]; s != nil { - s.Attr.Set(sym.AttrReachable, l.Reachable.Has(i)) - continue // already loaded from external object - } - nv := l.extSyms[i-l.extStart] - if l.Reachable.Has(i) || strings.HasPrefix(nv.name, "gofile..") { // XXX file symbols are used but not marked - s := syms.Newsym(nv.name, nv.v) - preprocess(arch, s) - s.Attr.Set(sym.AttrReachable, l.Reachable.Has(i)) - l.Syms[i] = s - } - } - - // load contents of defined symbols - for _, o := range l.objs[1:] { - loadObjFull(l, o.r) - } - - // Resolve ABI aliases for external symbols. This is only - // needed for internal cgo linking. - // (The old code does this in deadcode, but deadcode2 doesn't - // do this.) - for i := l.extStart; i <= l.max; i++ { - if s := l.Syms[i]; s != nil && s.Attr.Reachable() { - for ri := range s.R { - r := &s.R[ri] - if r.Sym != nil && r.Sym.Type == sym.SABIALIAS { - r.Sym = r.Sym.R[0].Sym - } - } - } - } -} - -// ExtractSymbols grabs the symbols out of the loader for work that hasn't been -// ported to the new symbol type. -func (l *Loader) ExtractSymbols(syms *sym.Symbols) { - // Nil out overwritten symbols. - // Overwritten Go symbols aren't a problem (as they're lazy loaded), but - // symbols loaded from host object loaders are fully loaded, and we might - // have multiple symbols with the same name. This loop nils them out. - for oldI := range l.overwrite { - l.Syms[oldI] = nil - } - - // Add symbols to the ctxt.Syms lookup table. This explicitly - // skips things created via loader.Create (marked with versions - // less than zero), since if we tried to add these we'd wind up - // with collisions. Along the way, update the version from the - // negative anon version to something larger than sym.SymVerStatic - // (needed so that sym.symbol.IsFileLocal() works properly). - anonVerReplacement := syms.IncVersion() - for _, s := range l.Syms { - if s == nil { - continue - } - if s.Name != "" && s.Version >= 0 { - syms.Add(s) - } - if s.Version < 0 { - s.Version = int16(anonVerReplacement) - } - } -} - -// addNewSym adds a new sym.Symbol to the i-th index in the list of symbols. -func (l *Loader) addNewSym(i Sym, syms *sym.Symbols, name string, ver int, unit *sym.CompilationUnit, t sym.SymKind) *sym.Symbol { - s := syms.Newsym(name, ver) - if s.Type != 0 && s.Type != sym.SXREF { - fmt.Println("symbol already processed:", unit.Lib, i, s) - panic("symbol already processed") - } - if t == sym.SBSS && (s.Type == sym.SRODATA || s.Type == sym.SNOPTRBSS) { - t = s.Type - } - s.Type = t - s.Unit = unit - l.growSyms(int(i)) - l.Syms[i] = s - return s -} - -// loadObjSyms creates sym.Symbol objects for the live Syms in the -// object corresponding to object reader "r". Return value is the -// number of sym.Reloc entries required for all the new symbols. -func loadObjSyms(l *Loader, syms *sym.Symbols, r *oReader) int { - panic("unreachable") -} - -// LoadSymbol loads a single symbol by name. -// This function should only be used by the host object loaders. -// NB: This function does NOT set the symbol as reachable. -func (l *Loader) LoadSymbol(name string, version int, syms *sym.Symbols) *sym.Symbol { - panic("unreachable") -} - -// LookupOrCreate looks up a symbol by name, and creates one if not found. -// Either way, it will also create a sym.Symbol for it, if not already. -// This should only be called when interacting with parts of the linker -// that still works on sym.Symbols (i.e. internal cgo linking, for now). -func (l *Loader) LookupOrCreate(name string, version int, syms *sym.Symbols) *sym.Symbol { - i := l.Lookup(name, version) - if i != 0 { - // symbol exists - if int(i) < len(l.Syms) && l.Syms[i] != nil { - return l.Syms[i] // already loaded - } - if l.IsExternal(i) { - panic("Can't load an external symbol.") - } - return l.LoadSymbol(name, version, syms) - } - i = l.AddExtSym(name, version) - s := syms.Newsym(name, version) - l.Syms[i] = s - return s -} - -// Create creates a symbol with the specified name, returning a -// sym.Symbol object for it. This method is intended for static/hidden -// symbols discovered while loading host objects. We can see more than -// one instance of a given static symbol with the same name/version, -// so we can't add them to the lookup tables "as is". Instead assign -// them fictitious (unique) versions, starting at -1 and decreasing by -// one for each newly created symbol, and record them in the -// extStaticSyms hash. -func (l *Loader) Create(name string, syms *sym.Symbols) *sym.Symbol { - i := l.max + 1 - l.max++ - if l.extStart == 0 { - l.extStart = i - } - - // Assign a new unique negative version -- this is to mark the - // symbol so that it can be skipped when ExtractSymbols is adding - // ext syms to the sym.Symbols hash. - l.anonVersion-- - ver := l.anonVersion - l.extSyms = append(l.extSyms, nameVer{name, ver}) - l.growSyms(int(i)) - s := syms.Newsym(name, ver) - l.Syms[i] = s - l.extStaticSyms[nameVer{name, ver}] = i - - return s -} - -func loadObjFull(l *Loader, r *oReader) { - panic("unreachable") -} - -var emptyPkg = []byte(`"".`) - -func patchDWARFName1(p []byte, r *oReader) ([]byte, int) { - // This is kind of ugly. Really the package name should not - // even be included here. - if len(p) < 1 || p[0] != dwarf.DW_ABRV_FUNCTION { - return p, -1 - } - e := bytes.IndexByte(p, 0) - if e == -1 { - return p, -1 - } - if !bytes.Contains(p[:e], emptyPkg) { - return p, -1 - } - pkgprefix := []byte(r.pkgprefix) - patched := bytes.Replace(p[:e], emptyPkg, pkgprefix, -1) - return append(patched, p[e:]...), e -} - -func patchDWARFName(s *sym.Symbol, r *oReader) { - patched, e := patchDWARFName1(s.P, r) - if e == -1 { - return - } - s.P = patched - s.Attr.Set(sym.AttrReadOnly, false) - delta := int64(len(s.P)) - s.Size - s.Size = int64(len(s.P)) - for i := range s.R { - r := &s.R[i] - if r.Off > int32(e) { - r.Off += int32(delta) - } - } -} - -// For debugging. -func (l *Loader) Dump() { - fmt.Println("objs") - for _, obj := range l.objs { - if obj.r != nil { - fmt.Println(obj.i, obj.r.unit.Lib) - } - } - fmt.Println("syms") - for i, s := range l.Syms { - if i == 0 { - continue - } - if s != nil { - fmt.Println(i, s, s.Type) - } else { - fmt.Println(i, l.SymName(Sym(i)), "") - } - } - fmt.Println("overwrite:", l.overwrite) - fmt.Println("symsByName") - for name, i := range l.symsByName[0] { - fmt.Println(i, name, 0) - } - for name, i := range l.symsByName[1] { - fmt.Println(i, name, 1) - } -} diff --git a/src/cmd/oldlink/internal/loadmacho/ldmacho.go b/src/cmd/oldlink/internal/loadmacho/ldmacho.go deleted file mode 100644 index 4846239936..0000000000 --- a/src/cmd/oldlink/internal/loadmacho/ldmacho.go +++ /dev/null @@ -1,794 +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 loadmacho implements a Mach-O file reader. -package loadmacho - -import ( - "bytes" - "cmd/internal/bio" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/loader" - "cmd/oldlink/internal/sym" - "encoding/binary" - "fmt" - "io" - "sort" -) - -/* -Derived from Plan 9 from User Space's src/libmach/elf.h, elf.c -http://code.swtch.com/plan9port/src/tip/src/libmach/ - - Copyright © 2004 Russ Cox. - Portions Copyright © 2008-2010 Google Inc. - Portions Copyright © 2010 The Go Authors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -// TODO(crawshaw): de-duplicate these symbols with cmd/internal/ld -const ( - MACHO_X86_64_RELOC_UNSIGNED = 0 - MACHO_X86_64_RELOC_SIGNED = 1 - MACHO_FAKE_GOTPCREL = 100 -) - -type ldMachoObj struct { - f *bio.Reader - base int64 // off in f where Mach-O begins - length int64 // length of Mach-O - is64 bool - name string - e binary.ByteOrder - cputype uint - subcputype uint - filetype uint32 - flags uint32 - cmd []ldMachoCmd - ncmd uint -} - -type ldMachoCmd struct { - type_ int - off uint32 - size uint32 - seg ldMachoSeg - sym ldMachoSymtab - dsym ldMachoDysymtab -} - -type ldMachoSeg struct { - name string - vmaddr uint64 - vmsize uint64 - fileoff uint32 - filesz uint32 - maxprot uint32 - initprot uint32 - nsect uint32 - flags uint32 - sect []ldMachoSect -} - -type ldMachoSect struct { - name string - segname string - addr uint64 - size uint64 - off uint32 - align uint32 - reloff uint32 - nreloc uint32 - flags uint32 - res1 uint32 - res2 uint32 - sym *sym.Symbol - rel []ldMachoRel -} - -type ldMachoRel struct { - addr uint32 - symnum uint32 - pcrel uint8 - length uint8 - extrn uint8 - type_ uint8 - scattered uint8 - value uint32 -} - -type ldMachoSymtab struct { - symoff uint32 - nsym uint32 - stroff uint32 - strsize uint32 - str []byte - sym []ldMachoSym -} - -type ldMachoSym struct { - name string - type_ uint8 - sectnum uint8 - desc uint16 - kind int8 - value uint64 - sym *sym.Symbol -} - -type ldMachoDysymtab struct { - ilocalsym uint32 - nlocalsym uint32 - iextdefsym uint32 - nextdefsym uint32 - iundefsym uint32 - nundefsym uint32 - tocoff uint32 - ntoc uint32 - modtaboff uint32 - nmodtab uint32 - extrefsymoff uint32 - nextrefsyms uint32 - indirectsymoff uint32 - nindirectsyms uint32 - extreloff uint32 - nextrel uint32 - locreloff uint32 - nlocrel uint32 - indir []uint32 -} - -// ldMachoSym.type_ -const ( - N_EXT = 0x01 - N_TYPE = 0x1e - N_STAB = 0xe0 -) - -// ldMachoSym.desc -const ( - N_WEAK_REF = 0x40 - N_WEAK_DEF = 0x80 -) - -const ( - LdMachoCpuVax = 1 - LdMachoCpu68000 = 6 - LdMachoCpu386 = 7 - LdMachoCpuAmd64 = 0x1000007 - LdMachoCpuMips = 8 - LdMachoCpu98000 = 10 - LdMachoCpuHppa = 11 - LdMachoCpuArm = 12 - LdMachoCpu88000 = 13 - LdMachoCpuSparc = 14 - LdMachoCpu860 = 15 - LdMachoCpuAlpha = 16 - LdMachoCpuPower = 18 - LdMachoCmdSegment = 1 - LdMachoCmdSymtab = 2 - LdMachoCmdSymseg = 3 - LdMachoCmdThread = 4 - LdMachoCmdDysymtab = 11 - LdMachoCmdSegment64 = 25 - LdMachoFileObject = 1 - LdMachoFileExecutable = 2 - LdMachoFileFvmlib = 3 - LdMachoFileCore = 4 - LdMachoFilePreload = 5 -) - -func unpackcmd(p []byte, m *ldMachoObj, c *ldMachoCmd, type_ uint, sz uint) int { - e4 := m.e.Uint32 - e8 := m.e.Uint64 - - c.type_ = int(type_) - c.size = uint32(sz) - switch type_ { - default: - return -1 - - case LdMachoCmdSegment: - if sz < 56 { - return -1 - } - c.seg.name = cstring(p[8:24]) - c.seg.vmaddr = uint64(e4(p[24:])) - c.seg.vmsize = uint64(e4(p[28:])) - c.seg.fileoff = e4(p[32:]) - c.seg.filesz = e4(p[36:]) - c.seg.maxprot = e4(p[40:]) - c.seg.initprot = e4(p[44:]) - c.seg.nsect = e4(p[48:]) - c.seg.flags = e4(p[52:]) - c.seg.sect = make([]ldMachoSect, c.seg.nsect) - if uint32(sz) < 56+c.seg.nsect*68 { - return -1 - } - p = p[56:] - var s *ldMachoSect - for i := 0; uint32(i) < c.seg.nsect; i++ { - s = &c.seg.sect[i] - s.name = cstring(p[0:16]) - s.segname = cstring(p[16:32]) - s.addr = uint64(e4(p[32:])) - s.size = uint64(e4(p[36:])) - s.off = e4(p[40:]) - s.align = e4(p[44:]) - s.reloff = e4(p[48:]) - s.nreloc = e4(p[52:]) - s.flags = e4(p[56:]) - s.res1 = e4(p[60:]) - s.res2 = e4(p[64:]) - p = p[68:] - } - - case LdMachoCmdSegment64: - if sz < 72 { - return -1 - } - c.seg.name = cstring(p[8:24]) - c.seg.vmaddr = e8(p[24:]) - c.seg.vmsize = e8(p[32:]) - c.seg.fileoff = uint32(e8(p[40:])) - c.seg.filesz = uint32(e8(p[48:])) - c.seg.maxprot = e4(p[56:]) - c.seg.initprot = e4(p[60:]) - c.seg.nsect = e4(p[64:]) - c.seg.flags = e4(p[68:]) - c.seg.sect = make([]ldMachoSect, c.seg.nsect) - if uint32(sz) < 72+c.seg.nsect*80 { - return -1 - } - p = p[72:] - var s *ldMachoSect - for i := 0; uint32(i) < c.seg.nsect; i++ { - s = &c.seg.sect[i] - s.name = cstring(p[0:16]) - s.segname = cstring(p[16:32]) - s.addr = e8(p[32:]) - s.size = e8(p[40:]) - s.off = e4(p[48:]) - s.align = e4(p[52:]) - s.reloff = e4(p[56:]) - s.nreloc = e4(p[60:]) - s.flags = e4(p[64:]) - s.res1 = e4(p[68:]) - s.res2 = e4(p[72:]) - - // p+76 is reserved - p = p[80:] - } - - case LdMachoCmdSymtab: - if sz < 24 { - return -1 - } - c.sym.symoff = e4(p[8:]) - c.sym.nsym = e4(p[12:]) - c.sym.stroff = e4(p[16:]) - c.sym.strsize = e4(p[20:]) - - case LdMachoCmdDysymtab: - if sz < 80 { - return -1 - } - c.dsym.ilocalsym = e4(p[8:]) - c.dsym.nlocalsym = e4(p[12:]) - c.dsym.iextdefsym = e4(p[16:]) - c.dsym.nextdefsym = e4(p[20:]) - c.dsym.iundefsym = e4(p[24:]) - c.dsym.nundefsym = e4(p[28:]) - c.dsym.tocoff = e4(p[32:]) - c.dsym.ntoc = e4(p[36:]) - c.dsym.modtaboff = e4(p[40:]) - c.dsym.nmodtab = e4(p[44:]) - c.dsym.extrefsymoff = e4(p[48:]) - c.dsym.nextrefsyms = e4(p[52:]) - c.dsym.indirectsymoff = e4(p[56:]) - c.dsym.nindirectsyms = e4(p[60:]) - c.dsym.extreloff = e4(p[64:]) - c.dsym.nextrel = e4(p[68:]) - c.dsym.locreloff = e4(p[72:]) - c.dsym.nlocrel = e4(p[76:]) - } - - return 0 -} - -func macholoadrel(m *ldMachoObj, sect *ldMachoSect) int { - if sect.rel != nil || sect.nreloc == 0 { - return 0 - } - rel := make([]ldMachoRel, sect.nreloc) - n := int(sect.nreloc * 8) - buf := make([]byte, n) - m.f.MustSeek(m.base+int64(sect.reloff), 0) - if _, err := io.ReadFull(m.f, buf); err != nil { - return -1 - } - for i := uint32(0); i < sect.nreloc; i++ { - r := &rel[i] - p := buf[i*8:] - r.addr = m.e.Uint32(p) - - // TODO(rsc): Wrong interpretation for big-endian bitfields? - if r.addr&0x80000000 != 0 { - // scatterbrained relocation - r.scattered = 1 - - v := r.addr >> 24 - r.addr &= 0xFFFFFF - r.type_ = uint8(v & 0xF) - v >>= 4 - r.length = 1 << (v & 3) - v >>= 2 - r.pcrel = uint8(v & 1) - r.value = m.e.Uint32(p[4:]) - } else { - v := m.e.Uint32(p[4:]) - r.symnum = v & 0xFFFFFF - v >>= 24 - r.pcrel = uint8(v & 1) - v >>= 1 - r.length = 1 << (v & 3) - v >>= 2 - r.extrn = uint8(v & 1) - v >>= 1 - r.type_ = uint8(v) - } - } - - sect.rel = rel - return 0 -} - -func macholoaddsym(m *ldMachoObj, d *ldMachoDysymtab) int { - n := int(d.nindirectsyms) - - p := make([]byte, n*4) - m.f.MustSeek(m.base+int64(d.indirectsymoff), 0) - if _, err := io.ReadFull(m.f, p); err != nil { - return -1 - } - - d.indir = make([]uint32, n) - for i := 0; i < n; i++ { - d.indir[i] = m.e.Uint32(p[4*i:]) - } - return 0 -} - -func macholoadsym(m *ldMachoObj, symtab *ldMachoSymtab) int { - if symtab.sym != nil { - return 0 - } - - strbuf := make([]byte, symtab.strsize) - m.f.MustSeek(m.base+int64(symtab.stroff), 0) - if _, err := io.ReadFull(m.f, strbuf); err != nil { - return -1 - } - - symsize := 12 - if m.is64 { - symsize = 16 - } - n := int(symtab.nsym * uint32(symsize)) - symbuf := make([]byte, n) - m.f.MustSeek(m.base+int64(symtab.symoff), 0) - if _, err := io.ReadFull(m.f, symbuf); err != nil { - return -1 - } - sym := make([]ldMachoSym, symtab.nsym) - p := symbuf - for i := uint32(0); i < symtab.nsym; i++ { - s := &sym[i] - v := m.e.Uint32(p) - if v >= symtab.strsize { - return -1 - } - s.name = cstring(strbuf[v:]) - s.type_ = p[4] - s.sectnum = p[5] - s.desc = m.e.Uint16(p[6:]) - if m.is64 { - s.value = m.e.Uint64(p[8:]) - } else { - s.value = uint64(m.e.Uint32(p[8:])) - } - p = p[symsize:] - } - - symtab.str = strbuf - symtab.sym = sym - return 0 -} - -func Load(l *loader.Loader, arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string) ([]*sym.Symbol, error) { - newSym := func(name string, version int) *sym.Symbol { - return l.LookupOrCreate(name, version, syms) - } - return load(arch, syms.IncVersion(), newSym, f, pkg, length, pn) -} - -func LoadOld(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, err error) { - return load(arch, syms.IncVersion(), syms.Lookup, f, pkg, length, pn) -} - -// load the Mach-O file pn from f. -// Symbols are written into syms, and a slice of the text symbols is returned. -func load(arch *sys.Arch, localSymVersion int, lookup func(string, int) *sym.Symbol, f *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, err error) { - errorf := func(str string, args ...interface{}) ([]*sym.Symbol, error) { - return nil, fmt.Errorf("loadmacho: %v: %v", pn, fmt.Sprintf(str, args...)) - } - - base := f.Offset() - - var hdr [7 * 4]uint8 - if _, err := io.ReadFull(f, hdr[:]); err != nil { - return errorf("reading hdr: %v", err) - } - - var e binary.ByteOrder - if binary.BigEndian.Uint32(hdr[:])&^1 == 0xFEEDFACE { - e = binary.BigEndian - } else if binary.LittleEndian.Uint32(hdr[:])&^1 == 0xFEEDFACE { - e = binary.LittleEndian - } else { - return errorf("bad magic - not mach-o file") - } - - is64 := e.Uint32(hdr[:]) == 0xFEEDFACF - ncmd := e.Uint32(hdr[4*4:]) - cmdsz := e.Uint32(hdr[5*4:]) - if ncmd > 0x10000 || cmdsz >= 0x01000000 { - return errorf("implausible mach-o header ncmd=%d cmdsz=%d", ncmd, cmdsz) - } - - if is64 { - f.MustSeek(4, 1) // skip reserved word in header - } - - m := &ldMachoObj{ - f: f, - e: e, - cputype: uint(e.Uint32(hdr[1*4:])), - subcputype: uint(e.Uint32(hdr[2*4:])), - filetype: e.Uint32(hdr[3*4:]), - ncmd: uint(ncmd), - flags: e.Uint32(hdr[6*4:]), - is64: is64, - base: base, - length: length, - name: pn, - } - - switch arch.Family { - default: - return errorf("mach-o %s unimplemented", arch.Name) - - case sys.AMD64: - if e != binary.LittleEndian || m.cputype != LdMachoCpuAmd64 { - return errorf("mach-o object but not amd64") - } - } - - m.cmd = make([]ldMachoCmd, ncmd) - cmdp := make([]byte, cmdsz) - if _, err := io.ReadFull(f, cmdp); err != nil { - return errorf("reading cmds: %v", err) - } - - // read and parse load commands - var c *ldMachoCmd - - var symtab *ldMachoSymtab - var dsymtab *ldMachoDysymtab - - off := uint32(len(hdr)) - for i := uint32(0); i < ncmd; i++ { - ty := e.Uint32(cmdp) - sz := e.Uint32(cmdp[4:]) - m.cmd[i].off = off - unpackcmd(cmdp, m, &m.cmd[i], uint(ty), uint(sz)) - cmdp = cmdp[sz:] - off += sz - if ty == LdMachoCmdSymtab { - if symtab != nil { - return errorf("multiple symbol tables") - } - - symtab = &m.cmd[i].sym - macholoadsym(m, symtab) - } - - if ty == LdMachoCmdDysymtab { - dsymtab = &m.cmd[i].dsym - macholoaddsym(m, dsymtab) - } - - if (is64 && ty == LdMachoCmdSegment64) || (!is64 && ty == LdMachoCmdSegment) { - if c != nil { - return errorf("multiple load commands") - } - - c = &m.cmd[i] - } - } - - // load text and data segments into memory. - // they are not as small as the load commands, but we'll need - // the memory anyway for the symbol images, so we might - // as well use one large chunk. - if c == nil { - return errorf("no load command") - } - - if symtab == nil { - // our work is done here - no symbols means nothing can refer to this file - return - } - - if int64(c.seg.fileoff+c.seg.filesz) >= length { - return errorf("load segment out of range") - } - - f.MustSeek(m.base+int64(c.seg.fileoff), 0) - dat := make([]byte, c.seg.filesz) - if _, err := io.ReadFull(f, dat); err != nil { - return errorf("cannot load object data: %v", err) - } - - for i := uint32(0); i < c.seg.nsect; i++ { - sect := &c.seg.sect[i] - if sect.segname != "__TEXT" && sect.segname != "__DATA" { - continue - } - if sect.name == "__eh_frame" { - continue - } - name := fmt.Sprintf("%s(%s/%s)", pkg, sect.segname, sect.name) - s := lookup(name, localSymVersion) - if s.Type != 0 { - return errorf("duplicate %s/%s", sect.segname, sect.name) - } - - if sect.flags&0xff == 1 { // S_ZEROFILL - s.P = make([]byte, sect.size) - } else { - s.P = dat[sect.addr-c.seg.vmaddr:][:sect.size] - } - s.Size = int64(len(s.P)) - - if sect.segname == "__TEXT" { - if sect.name == "__text" { - s.Type = sym.STEXT - } else { - s.Type = sym.SRODATA - } - } else { - if sect.name == "__bss" { - s.Type = sym.SNOPTRBSS - s.P = s.P[:0] - } else { - s.Type = sym.SNOPTRDATA - } - } - - sect.sym = s - } - - // enter sub-symbols into symbol table. - // have to guess sizes from next symbol. - for i := uint32(0); i < symtab.nsym; i++ { - machsym := &symtab.sym[i] - if machsym.type_&N_STAB != 0 { - continue - } - - // TODO: check sym->type against outer->type. - name := machsym.name - - if name[0] == '_' && name[1] != '\x00' { - name = name[1:] - } - v := 0 - if machsym.type_&N_EXT == 0 { - v = localSymVersion - } - s := lookup(name, v) - if machsym.type_&N_EXT == 0 { - s.Attr |= sym.AttrDuplicateOK - } - if machsym.desc&(N_WEAK_REF|N_WEAK_DEF) != 0 { - s.Attr |= sym.AttrDuplicateOK - } - machsym.sym = s - if machsym.sectnum == 0 { // undefined - continue - } - if uint32(machsym.sectnum) > c.seg.nsect { - return errorf("reference to invalid section %d", machsym.sectnum) - } - - sect := &c.seg.sect[machsym.sectnum-1] - outer := sect.sym - if outer == nil { - continue // ignore reference to invalid section - } - - if s.Outer != nil { - if s.Attr.DuplicateOK() { - continue - } - return errorf("duplicate symbol reference: %s in both %s and %s", s.Name, s.Outer.Name, sect.sym.Name) - } - - s.Type = outer.Type - s.Attr |= sym.AttrSubSymbol - s.Sub = outer.Sub - outer.Sub = s - s.Outer = outer - s.Value = int64(machsym.value - sect.addr) - if !s.Attr.CgoExportDynamic() { - s.SetDynimplib("") // satisfy dynimport - } - if outer.Type == sym.STEXT { - if s.Attr.External() && !s.Attr.DuplicateOK() { - return errorf("%v: duplicate symbol definition", s) - } - s.Attr |= sym.AttrExternal - } - - machsym.sym = s - } - - // Sort outer lists by address, adding to textp. - // This keeps textp in increasing address order. - for i := 0; uint32(i) < c.seg.nsect; i++ { - sect := &c.seg.sect[i] - s := sect.sym - if s == nil { - continue - } - if s.Sub != nil { - s.Sub = sym.SortSub(s.Sub) - - // assign sizes, now that we know symbols in sorted order. - for s1 := s.Sub; s1 != nil; s1 = s1.Sub { - if s1.Sub != nil { - s1.Size = s1.Sub.Value - s1.Value - } else { - s1.Size = s.Value + s.Size - s1.Value - } - } - } - - if s.Type == sym.STEXT { - if s.Attr.OnList() { - return errorf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - textp = append(textp, s) - for s1 := s.Sub; s1 != nil; s1 = s1.Sub { - if s1.Attr.OnList() { - return errorf("symbol %s listed multiple times", s1.Name) - } - s1.Attr |= sym.AttrOnList - textp = append(textp, s1) - } - } - } - - // load relocations - for i := 0; uint32(i) < c.seg.nsect; i++ { - sect := &c.seg.sect[i] - s := sect.sym - if s == nil { - continue - } - macholoadrel(m, sect) - if sect.rel == nil { - continue - } - r := make([]sym.Reloc, sect.nreloc) - rpi := 0 - for j := uint32(0); j < sect.nreloc; j++ { - rp := &r[rpi] - rel := §.rel[j] - if rel.scattered != 0 { - // mach-o only uses scattered relocation on 32-bit platforms, - // which are no longer supported. - return errorf("%v: unexpected scattered relocation", s) - } - - rp.Siz = rel.length - rp.Type = objabi.MachoRelocOffset + (objabi.RelocType(rel.type_) << 1) + objabi.RelocType(rel.pcrel) - rp.Off = int32(rel.addr) - - // Handle X86_64_RELOC_SIGNED referencing a section (rel->extrn == 0). - if arch.Family == sys.AMD64 && rel.extrn == 0 && rel.type_ == MACHO_X86_64_RELOC_SIGNED { - // Calculate the addend as the offset into the section. - // - // The rip-relative offset stored in the object file is encoded - // as follows: - // - // movsd 0x00000360(%rip),%xmm0 - // - // To get the absolute address of the value this rip-relative address is pointing - // to, we must add the address of the next instruction to it. This is done by - // taking the address of the relocation and adding 4 to it (since the rip-relative - // offset can at most be 32 bits long). To calculate the offset into the section the - // relocation is referencing, we subtract the vaddr of the start of the referenced - // section found in the original object file. - // - // [For future reference, see Darwin's /usr/include/mach-o/x86_64/reloc.h] - secaddr := c.seg.sect[rel.symnum-1].addr - - rp.Add = int64(uint64(int64(int32(e.Uint32(s.P[rp.Off:])))+int64(rp.Off)+4) - secaddr) - } else { - rp.Add = int64(int32(e.Uint32(s.P[rp.Off:]))) - } - - // An unsigned internal relocation has a value offset - // by the section address. - if arch.Family == sys.AMD64 && rel.extrn == 0 && rel.type_ == MACHO_X86_64_RELOC_UNSIGNED { - secaddr := c.seg.sect[rel.symnum-1].addr - rp.Add -= int64(secaddr) - } - - if rel.extrn == 0 { - if rel.symnum < 1 || rel.symnum > c.seg.nsect { - return errorf("invalid relocation: section reference out of range %d vs %d", rel.symnum, c.seg.nsect) - } - - rp.Sym = c.seg.sect[rel.symnum-1].sym - if rp.Sym == nil { - return errorf("invalid relocation: %s", c.seg.sect[rel.symnum-1].name) - } - } else { - if rel.symnum >= symtab.nsym { - return errorf("invalid relocation: symbol reference out of range") - } - - rp.Sym = symtab.sym[rel.symnum].sym - } - - rpi++ - } - - sort.Sort(sym.RelocByOff(r[:rpi])) - s.R = r - s.R = s.R[:rpi] - } - - return textp, nil -} - -func cstring(x []byte) string { - i := bytes.IndexByte(x, '\x00') - if i >= 0 { - x = x[:i] - } - return string(x) -} diff --git a/src/cmd/oldlink/internal/loadpe/ldpe.go b/src/cmd/oldlink/internal/loadpe/ldpe.go deleted file mode 100644 index f7df774661..0000000000 --- a/src/cmd/oldlink/internal/loadpe/ldpe.go +++ /dev/null @@ -1,513 +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 loadpe implements a PE/COFF file reader. -package loadpe - -import ( - "cmd/internal/bio" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/loader" - "cmd/oldlink/internal/sym" - "debug/pe" - "encoding/binary" - "errors" - "fmt" - "io" - "sort" - "strings" -) - -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 - IMAGE_SYM_TYPE_NULL = 0 - IMAGE_SYM_TYPE_VOID = 1 - IMAGE_SYM_TYPE_CHAR = 2 - IMAGE_SYM_TYPE_SHORT = 3 - IMAGE_SYM_TYPE_INT = 4 - IMAGE_SYM_TYPE_LONG = 5 - IMAGE_SYM_TYPE_FLOAT = 6 - IMAGE_SYM_TYPE_DOUBLE = 7 - IMAGE_SYM_TYPE_STRUCT = 8 - IMAGE_SYM_TYPE_UNION = 9 - IMAGE_SYM_TYPE_ENUM = 10 - IMAGE_SYM_TYPE_MOE = 11 - IMAGE_SYM_TYPE_BYTE = 12 - IMAGE_SYM_TYPE_WORD = 13 - IMAGE_SYM_TYPE_UINT = 14 - 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_CLASS_END_OF_FUNCTION = -1 - IMAGE_SYM_CLASS_NULL = 0 - IMAGE_SYM_CLASS_AUTOMATIC = 1 - IMAGE_SYM_CLASS_EXTERNAL = 2 - IMAGE_SYM_CLASS_STATIC = 3 - IMAGE_SYM_CLASS_REGISTER = 4 - IMAGE_SYM_CLASS_EXTERNAL_DEF = 5 - IMAGE_SYM_CLASS_LABEL = 6 - IMAGE_SYM_CLASS_UNDEFINED_LABEL = 7 - IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 8 - IMAGE_SYM_CLASS_ARGUMENT = 9 - IMAGE_SYM_CLASS_STRUCT_TAG = 10 - IMAGE_SYM_CLASS_MEMBER_OF_UNION = 11 - IMAGE_SYM_CLASS_UNION_TAG = 12 - IMAGE_SYM_CLASS_TYPE_DEFINITION = 13 - IMAGE_SYM_CLASS_UNDEFINED_STATIC = 14 - IMAGE_SYM_CLASS_ENUM_TAG = 15 - IMAGE_SYM_CLASS_MEMBER_OF_ENUM = 16 - IMAGE_SYM_CLASS_REGISTER_PARAM = 17 - IMAGE_SYM_CLASS_BIT_FIELD = 18 - IMAGE_SYM_CLASS_FAR_EXTERNAL = 68 /* Not in PECOFF v8 spec */ - IMAGE_SYM_CLASS_BLOCK = 100 - IMAGE_SYM_CLASS_FUNCTION = 101 - IMAGE_SYM_CLASS_END_OF_STRUCT = 102 - IMAGE_SYM_CLASS_FILE = 103 - IMAGE_SYM_CLASS_SECTION = 104 - IMAGE_SYM_CLASS_WEAK_EXTERNAL = 105 - IMAGE_SYM_CLASS_CLR_TOKEN = 107 - IMAGE_REL_I386_ABSOLUTE = 0x0000 - IMAGE_REL_I386_DIR16 = 0x0001 - IMAGE_REL_I386_REL16 = 0x0002 - IMAGE_REL_I386_DIR32 = 0x0006 - IMAGE_REL_I386_DIR32NB = 0x0007 - IMAGE_REL_I386_SEG12 = 0x0009 - IMAGE_REL_I386_SECTION = 0x000A - IMAGE_REL_I386_SECREL = 0x000B - IMAGE_REL_I386_TOKEN = 0x000C - IMAGE_REL_I386_SECREL7 = 0x000D - IMAGE_REL_I386_REL32 = 0x0014 - IMAGE_REL_AMD64_ABSOLUTE = 0x0000 - IMAGE_REL_AMD64_ADDR64 = 0x0001 - IMAGE_REL_AMD64_ADDR32 = 0x0002 - IMAGE_REL_AMD64_ADDR32NB = 0x0003 - IMAGE_REL_AMD64_REL32 = 0x0004 - IMAGE_REL_AMD64_REL32_1 = 0x0005 - IMAGE_REL_AMD64_REL32_2 = 0x0006 - IMAGE_REL_AMD64_REL32_3 = 0x0007 - IMAGE_REL_AMD64_REL32_4 = 0x0008 - IMAGE_REL_AMD64_REL32_5 = 0x0009 - IMAGE_REL_AMD64_SECTION = 0x000A - IMAGE_REL_AMD64_SECREL = 0x000B - IMAGE_REL_AMD64_SECREL7 = 0x000C - IMAGE_REL_AMD64_TOKEN = 0x000D - IMAGE_REL_AMD64_SREL32 = 0x000E - IMAGE_REL_AMD64_PAIR = 0x000F - IMAGE_REL_AMD64_SSPAN32 = 0x0010 - IMAGE_REL_ARM_ABSOLUTE = 0x0000 - IMAGE_REL_ARM_ADDR32 = 0x0001 - IMAGE_REL_ARM_ADDR32NB = 0x0002 - IMAGE_REL_ARM_BRANCH24 = 0x0003 - IMAGE_REL_ARM_BRANCH11 = 0x0004 - IMAGE_REL_ARM_SECTION = 0x000E - IMAGE_REL_ARM_SECREL = 0x000F - IMAGE_REL_ARM_MOV32 = 0x0010 - IMAGE_REL_THUMB_MOV32 = 0x0011 - IMAGE_REL_THUMB_BRANCH20 = 0x0012 - IMAGE_REL_THUMB_BRANCH24 = 0x0014 - IMAGE_REL_THUMB_BLX23 = 0x0015 - IMAGE_REL_ARM_PAIR = 0x0016 -) - -// TODO(crawshaw): de-duplicate these symbols with cmd/internal/ld, ideally in debug/pe. -const ( - IMAGE_SCN_CNT_CODE = 0x00000020 - IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040 - IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080 - IMAGE_SCN_MEM_DISCARDABLE = 0x02000000 - IMAGE_SCN_MEM_EXECUTE = 0x20000000 - IMAGE_SCN_MEM_READ = 0x40000000 - IMAGE_SCN_MEM_WRITE = 0x80000000 -) - -// TODO(brainman): maybe just add ReadAt method to bio.Reader instead of creating peBiobuf - -// peBiobuf makes bio.Reader look like io.ReaderAt. -type peBiobuf bio.Reader - -func (f *peBiobuf) ReadAt(p []byte, off int64) (int, error) { - ret := ((*bio.Reader)(f)).MustSeek(off, 0) - if ret < 0 { - return 0, errors.New("fail to seek") - } - n, err := f.Read(p) - if err != nil { - return 0, err - } - return n, nil -} - -func Load(l *loader.Loader, arch *sys.Arch, syms *sym.Symbols, input *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, rsrc *sym.Symbol, err error) { - lookup := func(name string, version int) *sym.Symbol { - return l.LookupOrCreate(name, version, syms) - } - return load(arch, lookup, syms.IncVersion(), input, pkg, length, pn) -} - -func LoadOld(arch *sys.Arch, syms *sym.Symbols, input *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, rsrc *sym.Symbol, err error) { - return load(arch, syms.Lookup, syms.IncVersion(), input, pkg, length, pn) -} - -// load loads the PE file pn from input. -// Symbols are written into syms, and a slice of the text symbols is returned. -// If an .rsrc section is found, its symbol is returned as rsrc. -func load(arch *sys.Arch, lookup func(string, int) *sym.Symbol, localSymVersion int, input *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, rsrc *sym.Symbol, err error) { - sectsyms := make(map[*pe.Section]*sym.Symbol) - sectdata := make(map[*pe.Section][]byte) - - // Some input files are archives containing multiple of - // object files, and pe.NewFile seeks to the start of - // input file and get confused. Create section reader - // to stop pe.NewFile looking before current position. - sr := io.NewSectionReader((*peBiobuf)(input), input.Offset(), 1<<63-1) - - // TODO: replace pe.NewFile with pe.Load (grep for "add Load function" in debug/pe for details) - f, err := pe.NewFile(sr) - if err != nil { - return nil, nil, err - } - defer f.Close() - - // TODO return error if found .cormeta - - // create symbols for mapped sections - for _, sect := range f.Sections { - if sect.Characteristics&IMAGE_SCN_MEM_DISCARDABLE != 0 { - continue - } - - if sect.Characteristics&(IMAGE_SCN_CNT_CODE|IMAGE_SCN_CNT_INITIALIZED_DATA|IMAGE_SCN_CNT_UNINITIALIZED_DATA) == 0 { - // This has been seen for .idata sections, which we - // want to ignore. See issues 5106 and 5273. - continue - } - - name := fmt.Sprintf("%s(%s)", pkg, sect.Name) - s := lookup(name, localSymVersion) - - switch sect.Characteristics & (IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE) { - case IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ: //.rdata - s.Type = sym.SRODATA - - case IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE: //.bss - s.Type = sym.SNOPTRBSS - - case IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE: //.data - s.Type = sym.SNOPTRDATA - - case IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ: //.text - s.Type = sym.STEXT - - default: - return nil, nil, fmt.Errorf("unexpected flags %#06x for PE section %s", sect.Characteristics, sect.Name) - } - - if s.Type != sym.SNOPTRBSS { - data, err := sect.Data() - if err != nil { - return nil, nil, err - } - sectdata[sect] = data - s.P = data - } - s.Size = int64(sect.Size) - sectsyms[sect] = s - if sect.Name == ".rsrc" { - rsrc = s - } - } - - // load relocations - for _, rsect := range f.Sections { - if _, found := sectsyms[rsect]; !found { - continue - } - if rsect.NumberOfRelocations == 0 { - continue - } - if rsect.Characteristics&IMAGE_SCN_MEM_DISCARDABLE != 0 { - continue - } - if rsect.Characteristics&(IMAGE_SCN_CNT_CODE|IMAGE_SCN_CNT_INITIALIZED_DATA|IMAGE_SCN_CNT_UNINITIALIZED_DATA) == 0 { - // This has been seen for .idata sections, which we - // want to ignore. See issues 5106 and 5273. - continue - } - - rs := make([]sym.Reloc, rsect.NumberOfRelocations) - for j, r := range rsect.Relocs { - rp := &rs[j] - if int(r.SymbolTableIndex) >= len(f.COFFSymbols) { - return nil, nil, fmt.Errorf("relocation number %d symbol index idx=%d cannot be large then number of symbols %d", j, r.SymbolTableIndex, len(f.COFFSymbols)) - } - pesym := &f.COFFSymbols[r.SymbolTableIndex] - gosym, err := readpesym(arch, lookup, f, pesym, sectsyms, localSymVersion) - if err != nil { - return nil, nil, err - } - if gosym == nil { - name, err := pesym.FullName(f.StringTable) - if err != nil { - name = string(pesym.Name[:]) - } - return nil, nil, fmt.Errorf("reloc of invalid sym %s idx=%d type=%d", name, r.SymbolTableIndex, pesym.Type) - } - - rp.Sym = gosym - rp.Siz = 4 - rp.Off = int32(r.VirtualAddress) - switch arch.Family { - default: - return nil, nil, fmt.Errorf("%s: unsupported arch %v", pn, arch.Family) - case sys.I386, sys.AMD64: - switch r.Type { - default: - return nil, nil, fmt.Errorf("%s: %v: unknown relocation type %v", pn, sectsyms[rsect], r.Type) - - case IMAGE_REL_I386_REL32, IMAGE_REL_AMD64_REL32, - IMAGE_REL_AMD64_ADDR32, // R_X86_64_PC32 - IMAGE_REL_AMD64_ADDR32NB: - rp.Type = objabi.R_PCREL - - rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:]))) - - case IMAGE_REL_I386_DIR32NB, IMAGE_REL_I386_DIR32: - rp.Type = objabi.R_ADDR - - // load addend from image - rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:]))) - - case IMAGE_REL_AMD64_ADDR64: // R_X86_64_64 - rp.Siz = 8 - - rp.Type = objabi.R_ADDR - - // load addend from image - rp.Add = int64(binary.LittleEndian.Uint64(sectdata[rsect][rp.Off:])) - } - - case sys.ARM: - switch r.Type { - default: - return nil, nil, fmt.Errorf("%s: %v: unknown ARM relocation type %v", pn, sectsyms[rsect], r.Type) - - case IMAGE_REL_ARM_SECREL: - rp.Type = objabi.R_PCREL - - rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:]))) - - case IMAGE_REL_ARM_ADDR32: - rp.Type = objabi.R_ADDR - - rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:]))) - - case IMAGE_REL_ARM_BRANCH24: - rp.Type = objabi.R_CALLARM - - rp.Add = int64(int32(binary.LittleEndian.Uint32(sectdata[rsect][rp.Off:]))) - } - } - - // ld -r could generate multiple section symbols for the - // same section but with different values, we have to take - // that into account - if issect(pesym) { - rp.Add += int64(pesym.Value) - } - } - - sort.Sort(sym.RelocByOff(rs[:rsect.NumberOfRelocations])) - - s := sectsyms[rsect] - s.R = rs - s.R = s.R[:rsect.NumberOfRelocations] - } - - // enter sub-symbols into symbol table. - for i, numaux := 0, 0; i < len(f.COFFSymbols); i += numaux + 1 { - pesym := &f.COFFSymbols[i] - - numaux = int(pesym.NumberOfAuxSymbols) - - name, err := pesym.FullName(f.StringTable) - if err != nil { - return nil, nil, err - } - if name == "" { - continue - } - if issect(pesym) { - continue - } - if int(pesym.SectionNumber) > len(f.Sections) { - continue - } - if pesym.SectionNumber == IMAGE_SYM_DEBUG { - continue - } - var sect *pe.Section - if pesym.SectionNumber > 0 { - sect = f.Sections[pesym.SectionNumber-1] - if _, found := sectsyms[sect]; !found { - continue - } - } - - s, err := readpesym(arch, lookup, f, pesym, sectsyms, localSymVersion) - if err != nil { - return nil, nil, err - } - - if pesym.SectionNumber == 0 { // extern - if s.Type == sym.SDYNIMPORT { - s.SetPlt(-2) // flag for dynimport in PE object files. - } - if s.Type == sym.SXREF && pesym.Value > 0 { // global data - s.Type = sym.SNOPTRDATA - s.Size = int64(pesym.Value) - } - - continue - } else if pesym.SectionNumber > 0 && int(pesym.SectionNumber) <= len(f.Sections) { - sect = f.Sections[pesym.SectionNumber-1] - if _, found := sectsyms[sect]; !found { - return nil, nil, fmt.Errorf("%s: %v: missing sect.sym", pn, s) - } - } else { - return nil, nil, fmt.Errorf("%s: %v: sectnum < 0!", pn, s) - } - - if sect == nil { - return nil, rsrc, nil - } - - if s.Outer != nil { - if s.Attr.DuplicateOK() { - continue - } - return nil, nil, fmt.Errorf("%s: duplicate symbol reference: %s in both %s and %s", pn, s.Name, s.Outer.Name, sectsyms[sect].Name) - } - - sectsym := sectsyms[sect] - s.Sub = sectsym.Sub - sectsym.Sub = s - s.Type = sectsym.Type - s.Attr |= sym.AttrSubSymbol - s.Value = int64(pesym.Value) - s.Size = 4 - s.Outer = sectsym - if sectsym.Type == sym.STEXT { - if s.Attr.External() && !s.Attr.DuplicateOK() { - return nil, nil, fmt.Errorf("%s: duplicate symbol definition", s.Name) - } - s.Attr |= sym.AttrExternal - } - } - - // Sort outer lists by address, adding to textp. - // This keeps textp in increasing address order. - for _, sect := range f.Sections { - s := sectsyms[sect] - if s == nil { - continue - } - if s.Sub != nil { - s.Sub = sym.SortSub(s.Sub) - } - if s.Type == sym.STEXT { - if s.Attr.OnList() { - return nil, nil, fmt.Errorf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - textp = append(textp, s) - for s = s.Sub; s != nil; s = s.Sub { - if s.Attr.OnList() { - return nil, nil, fmt.Errorf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - textp = append(textp, s) - } - } - } - - return textp, rsrc, nil -} - -func issect(s *pe.COFFSymbol) bool { - return s.StorageClass == IMAGE_SYM_CLASS_STATIC && s.Type == 0 && s.Name[0] == '.' -} - -func readpesym(arch *sys.Arch, lookup func(string, int) *sym.Symbol, f *pe.File, pesym *pe.COFFSymbol, sectsyms map[*pe.Section]*sym.Symbol, localSymVersion int) (*sym.Symbol, error) { - symname, err := pesym.FullName(f.StringTable) - if err != nil { - return nil, err - } - var name string - if issect(pesym) { - name = sectsyms[f.Sections[pesym.SectionNumber-1]].Name - } else { - name = symname - switch arch.Family { - case sys.AMD64: - if name == "__imp___acrt_iob_func" { - // Do not rename __imp___acrt_iob_func into __acrt_iob_func, - // because __imp___acrt_iob_func symbol is real - // (see commit b295099 from git://git.code.sf.net/p/mingw-w64/mingw-w64 for details). - } else { - name = strings.TrimPrefix(name, "__imp_") // __imp_Name => Name - } - case sys.I386: - if name == "__imp____acrt_iob_func" { - // Do not rename __imp____acrt_iob_func into ___acrt_iob_func, - // because __imp____acrt_iob_func symbol is real - // (see commit b295099 from git://git.code.sf.net/p/mingw-w64/mingw-w64 for details). - } else { - name = strings.TrimPrefix(name, "__imp_") // __imp_Name => Name - } - if name[0] == '_' { - name = name[1:] // _Name => Name - } - } - } - - // remove last @XXX - if i := strings.LastIndex(name, "@"); i >= 0 { - name = name[:i] - } - - var s *sym.Symbol - switch pesym.Type { - default: - return nil, fmt.Errorf("%s: invalid symbol type %d", symname, pesym.Type) - - case IMAGE_SYM_DTYPE_FUNCTION, IMAGE_SYM_DTYPE_NULL: - switch pesym.StorageClass { - case IMAGE_SYM_CLASS_EXTERNAL: //global - s = lookup(name, 0) - - case IMAGE_SYM_CLASS_NULL, IMAGE_SYM_CLASS_STATIC, IMAGE_SYM_CLASS_LABEL: - s = lookup(name, localSymVersion) - s.Attr |= sym.AttrDuplicateOK - - default: - return nil, fmt.Errorf("%s: invalid symbol binding %d", symname, pesym.StorageClass) - } - } - - if s != nil && s.Type == 0 && (pesym.StorageClass != IMAGE_SYM_CLASS_STATIC || pesym.Value != 0) { - s.Type = sym.SXREF - } - if strings.HasPrefix(symname, "__imp_") { - s.SetGot(-2) // flag for __imp_ - } - - return s, nil -} diff --git a/src/cmd/oldlink/internal/loadxcoff/ldxcoff.go b/src/cmd/oldlink/internal/loadxcoff/ldxcoff.go deleted file mode 100644 index 832b1681c7..0000000000 --- a/src/cmd/oldlink/internal/loadxcoff/ldxcoff.go +++ /dev/null @@ -1,238 +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 loadxcoff implements a XCOFF file reader. -package loadxcoff - -import ( - "cmd/internal/bio" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/loader" - "cmd/oldlink/internal/sym" - "errors" - "fmt" - "internal/xcoff" -) - -// ldSection is an XCOFF section with its symbols. -type ldSection struct { - xcoff.Section - sym *sym.Symbol -} - -// TODO(brainman): maybe just add ReadAt method to bio.Reader instead of creating xcoffBiobuf - -// xcoffBiobuf makes bio.Reader look like io.ReaderAt. -type xcoffBiobuf bio.Reader - -func (f *xcoffBiobuf) ReadAt(p []byte, off int64) (int, error) { - ret := ((*bio.Reader)(f)).MustSeek(off, 0) - if ret < 0 { - return 0, errors.New("fail to seek") - } - n, err := f.Read(p) - if err != nil { - return 0, err - } - return n, nil -} - -// Load loads xcoff files with the indexed object files. -func Load(l *loader.Loader, arch *sys.Arch, syms *sym.Symbols, input *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, err error) { - lookup := func(name string, version int) *sym.Symbol { - return l.LookupOrCreate(name, version, syms) - } - return load(arch, lookup, syms.IncVersion(), input, pkg, length, pn) -} - -// LoadOld uses the old version of object loading. -func LoadOld(arch *sys.Arch, syms *sym.Symbols, input *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, err error) { - return load(arch, syms.Lookup, syms.IncVersion(), input, pkg, length, pn) -} - -// loads the Xcoff file pn from f. -// Symbols are written into syms, and a slice of the text symbols is returned. -func load(arch *sys.Arch, lookup func(string, int) *sym.Symbol, localSymVersion int, input *bio.Reader, pkg string, length int64, pn string) (textp []*sym.Symbol, err error) { - errorf := func(str string, args ...interface{}) ([]*sym.Symbol, error) { - return nil, fmt.Errorf("loadxcoff: %v: %v", pn, fmt.Sprintf(str, args...)) - } - - var ldSections []*ldSection - - f, err := xcoff.NewFile((*xcoffBiobuf)(input)) - if err != nil { - return nil, err - } - defer f.Close() - - for _, sect := range f.Sections { - //only text, data and bss section - if sect.Type < xcoff.STYP_TEXT || sect.Type > xcoff.STYP_BSS { - continue - } - lds := new(ldSection) - lds.Section = *sect - name := fmt.Sprintf("%s(%s)", pkg, lds.Name) - s := lookup(name, localSymVersion) - - switch lds.Type { - default: - return errorf("unrecognized section type 0x%x", lds.Type) - case xcoff.STYP_TEXT: - s.Type = sym.STEXT - case xcoff.STYP_DATA: - s.Type = sym.SNOPTRDATA - case xcoff.STYP_BSS: - s.Type = sym.SNOPTRBSS - } - - s.Size = int64(lds.Size) - if s.Type != sym.SNOPTRBSS { - data, err := lds.Section.Data() - if err != nil { - return nil, err - } - s.P = data - } - - lds.sym = s - ldSections = append(ldSections, lds) - } - - // sx = symbol from file - // s = symbol for syms - for _, sx := range f.Symbols { - // get symbol type - stype, errmsg := getSymbolType(f, sx) - if errmsg != "" { - return errorf("error reading symbol %s: %s", sx.Name, errmsg) - } - if stype == sym.Sxxx { - continue - } - - s := lookup(sx.Name, 0) - - // Text symbol - if s.Type == sym.STEXT { - if s.Attr.OnList() { - return errorf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - textp = append(textp, s) - } - } - - // Read relocations - for _, sect := range ldSections { - // TODO(aix): Dwarf section relocation if needed - if sect.Type != xcoff.STYP_TEXT && sect.Type != xcoff.STYP_DATA { - continue - } - rs := make([]sym.Reloc, sect.Nreloc) - for i, rx := range sect.Relocs { - r := &rs[i] - - r.Sym = lookup(rx.Symbol.Name, 0) - if uint64(int32(rx.VirtualAddress)) != rx.VirtualAddress { - return errorf("virtual address of a relocation is too big: 0x%x", rx.VirtualAddress) - } - r.Off = int32(rx.VirtualAddress) - switch rx.Type { - default: - return errorf("section %s: unknown relocation of type 0x%x", sect.Name, rx.Type) - case xcoff.R_POS: - // Reloc the address of r.Sym - // Length should be 64 - if rx.Length != 64 { - return errorf("section %s: relocation R_POS has length different from 64: %d", sect.Name, rx.Length) - } - r.Siz = 8 - r.Type = objabi.R_CONST - r.Add = int64(rx.Symbol.Value) - - case xcoff.R_RBR: - r.Siz = 4 - r.Type = objabi.R_CALLPOWER - r.Add = 0 // - - } - } - s := sect.sym - s.R = rs - s.R = s.R[:sect.Nreloc] - } - return textp, nil - -} - -// Convert symbol xcoff type to sym.SymKind -// Returns nil if this shouldn't be added into syms (like .file or .dw symbols ) -func getSymbolType(f *xcoff.File, s *xcoff.Symbol) (stype sym.SymKind, err string) { - // .file symbol - if s.SectionNumber == -2 { - if s.StorageClass == xcoff.C_FILE { - return sym.Sxxx, "" - } - return sym.Sxxx, "unrecognised StorageClass for sectionNumber = -2" - } - - // extern symbols - // TODO(aix) - if s.SectionNumber == 0 { - return sym.Sxxx, "" - } - - sectType := f.Sections[s.SectionNumber-1].SectionHeader.Type - switch sectType { - default: - return sym.Sxxx, fmt.Sprintf("getSymbolType for Section type 0x%x not implemented", sectType) - case xcoff.STYP_DWARF, xcoff.STYP_DEBUG: - return sym.Sxxx, "" - case xcoff.STYP_DATA, xcoff.STYP_BSS, xcoff.STYP_TEXT: - } - - switch s.StorageClass { - default: - return sym.Sxxx, fmt.Sprintf("getSymbolType for Storage class 0x%x not implemented", s.StorageClass) - case xcoff.C_HIDEXT, xcoff.C_EXT, xcoff.C_WEAKEXT: - switch s.AuxCSect.StorageMappingClass { - default: - return sym.Sxxx, fmt.Sprintf("getSymbolType for Storage class 0x%x and Storage Map 0x%x not implemented", s.StorageClass, s.AuxCSect.StorageMappingClass) - - // Program Code - case xcoff.XMC_PR: - if sectType == xcoff.STYP_TEXT { - return sym.STEXT, "" - } - return sym.Sxxx, fmt.Sprintf("unrecognised Section Type 0x%x for Storage Class 0x%x with Storage Map XMC_PR", sectType, s.StorageClass) - - // Read/Write Data - case xcoff.XMC_RW: - if sectType == xcoff.STYP_DATA { - return sym.SDATA, "" - } - if sectType == xcoff.STYP_BSS { - return sym.SBSS, "" - } - return sym.Sxxx, fmt.Sprintf("unrecognised Section Type 0x%x for Storage Class 0x%x with Storage Map XMC_RW", sectType, s.StorageClass) - - // Function descriptor - case xcoff.XMC_DS: - if sectType == xcoff.STYP_DATA { - return sym.SDATA, "" - } - return sym.Sxxx, fmt.Sprintf("unrecognised Section Type 0x%x for Storage Class 0x%x with Storage Map XMC_DS", sectType, s.StorageClass) - - // TOC anchor and TOC entry - case xcoff.XMC_TC0, xcoff.XMC_TE: - if sectType == xcoff.STYP_DATA { - return sym.SXCOFFTOC, "" - } - return sym.Sxxx, fmt.Sprintf("unrecognised Section Type 0x%x for Storage Class 0x%x with Storage Map XMC_DS", sectType, s.StorageClass) - - } - } -} diff --git a/src/cmd/oldlink/internal/mips/asm.go b/src/cmd/oldlink/internal/mips/asm.go deleted file mode 100644 index 48a2324151..0000000000 --- a/src/cmd/oldlink/internal/mips/asm.go +++ /dev/null @@ -1,230 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2016 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package mips - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "debug/elf" - "fmt" - "log" -) - -func gentext(ctxt *ld.Link) { - return -} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - log.Fatalf("adddynrel not implemented") - return false -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - ctxt.Out.Write32(uint32(sectoff)) - - elfsym := r.Xsym.ElfsymForReloc() - switch r.Type { - default: - return false - case objabi.R_ADDR: - if r.Siz != 4 { - return false - } - ctxt.Out.Write32(uint32(elf.R_MIPS_32) | uint32(elfsym)<<8) - case objabi.R_ADDRMIPS: - ctxt.Out.Write32(uint32(elf.R_MIPS_LO16) | uint32(elfsym)<<8) - case objabi.R_ADDRMIPSU: - ctxt.Out.Write32(uint32(elf.R_MIPS_HI16) | uint32(elfsym)<<8) - case objabi.R_ADDRMIPSTLS: - ctxt.Out.Write32(uint32(elf.R_MIPS_TLS_TPREL_LO16) | uint32(elfsym)<<8) - case objabi.R_CALLMIPS, objabi.R_JMPMIPS: - ctxt.Out.Write32(uint32(elf.R_MIPS_26) | uint32(elfsym)<<8) - } - - return true -} - -func elfsetupplt(ctxt *ld.Link) { - return -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - return false -} - -func applyrel(arch *sys.Arch, r *sym.Reloc, s *sym.Symbol, val int64, t int64) int64 { - o := arch.ByteOrder.Uint32(s.P[r.Off:]) - switch r.Type { - case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSTLS: - return int64(o&0xffff0000 | uint32(t)&0xffff) - case objabi.R_ADDRMIPSU: - return int64(o&0xffff0000 | uint32((t+(1<<15))>>16)&0xffff) - case objabi.R_CALLMIPS, objabi.R_JMPMIPS: - return int64(o&0xfc000000 | uint32(t>>2)&^0xfc000000) - default: - return val - } -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - if ctxt.LinkMode == ld.LinkExternal { - switch r.Type { - default: - return val, false - case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) - } - r.Xsym = rs - return applyrel(ctxt.Arch, r, s, val, r.Xadd), true - case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - return applyrel(ctxt.Arch, r, s, val, r.Add), true - } - } - - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(ctxt.Syms.Lookup(".got", 0)), true - case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - t := ld.Symaddr(r.Sym) + r.Add - return applyrel(ctxt.Arch, r, s, val, t), true - case objabi.R_CALLMIPS, objabi.R_JMPMIPS: - t := ld.Symaddr(r.Sym) + r.Add - - if t&3 != 0 { - ld.Errorf(s, "direct call is not aligned: %s %x", r.Sym.Name, t) - } - - // check if target address is in the same 256 MB region as the next instruction - if (s.Value+int64(r.Off)+4)&0xf0000000 != (t & 0xf0000000) { - ld.Errorf(s, "direct call too far: %s %x", r.Sym.Name, t) - } - - return applyrel(ctxt.Arch, r, s, val, t), true - case objabi.R_ADDRMIPSTLS: - // thread pointer is at 0x7000 offset from the start of TLS data area - t := ld.Symaddr(r.Sym) + r.Add - 0x7000 - if t < -32768 || t >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", t) - } - return applyrel(ctxt.Arch, r, s, val, t), true - } - - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - return -1 -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - sect := ld.Segtext.Sections[0] - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - for _, sect = range ld.Segtext.Sections[1:] { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - if !ctxt.IsELF { - ld.Errorf(nil, "unsupported executable format") - } - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - - ctxt.Out.SeekSet(int64(symo)) - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - ld.Errorf(nil, "unsupported operating system") - case objabi.Hlinux: - ld.Asmbelf(ctxt, int64(symo)) - } - - ctxt.Out.Flush() - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/oldlink/internal/mips/l.go b/src/cmd/oldlink/internal/mips/l.go deleted file mode 100644 index adbde40f7c..0000000000 --- a/src/cmd/oldlink/internal/mips/l.go +++ /dev/null @@ -1,74 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2016 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package mips - -// Writing object files. - -// cmd/9l/l.h from Vita Nuova. -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others -// Portions Copyright © 2016 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -const ( - MaxAlign = 32 // max data alignment - MinAlign = 1 // min data alignment - FuncAlign = 4 -) - -/* Used by ../internal/ld/dwarf.go */ -const ( - DWARFREGSP = 29 - DWARFREGLR = 31 -) diff --git a/src/cmd/oldlink/internal/mips/obj.go b/src/cmd/oldlink/internal/mips/obj.go deleted file mode 100644 index c80824ff14..0000000000 --- a/src/cmd/oldlink/internal/mips/obj.go +++ /dev/null @@ -1,89 +0,0 @@ -// Inferno utils/5l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2016 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package mips - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.ArchMIPS - if objabi.GOARCH == "mipsle" { - arch = sys.ArchMIPSLE - } - - theArch := ld.Arch{ - Funcalign: FuncAlign, - Maxalign: MaxAlign, - Minalign: MinAlign, - Dwarfregsp: DWARFREGSP, - Dwarfreglr: DWARFREGLR, - - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Machoreloc1: machoreloc1, - - Linuxdynld: "/lib/ld.so.1", - - Freebsddynld: "XXX", - Openbsddynld: "XXX", - Netbsddynld: "XXX", - Dragonflydynld: "XXX", - Solarisdynld: "XXX", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - case objabi.Hlinux: /* mips elf */ - ld.Elfinit(ctxt) - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 0x10000 - } - } -} diff --git a/src/cmd/oldlink/internal/mips64/asm.go b/src/cmd/oldlink/internal/mips64/asm.go deleted file mode 100644 index 775b74e1fd..0000000000 --- a/src/cmd/oldlink/internal/mips64/asm.go +++ /dev/null @@ -1,278 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package mips64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "debug/elf" - "fmt" - "log" -) - -func gentext(ctxt *ld.Link) {} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - log.Fatalf("adddynrel not implemented") - return false -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - // mips64 ELF relocation (endian neutral) - // offset uint64 - // sym uint32 - // ssym uint8 - // type3 uint8 - // type2 uint8 - // type uint8 - // addend int64 - - ctxt.Out.Write64(uint64(sectoff)) - - elfsym := r.Xsym.ElfsymForReloc() - ctxt.Out.Write32(uint32(elfsym)) - ctxt.Out.Write8(0) - ctxt.Out.Write8(0) - ctxt.Out.Write8(0) - switch r.Type { - default: - return false - case objabi.R_ADDR: - switch r.Siz { - case 4: - ctxt.Out.Write8(uint8(elf.R_MIPS_32)) - case 8: - ctxt.Out.Write8(uint8(elf.R_MIPS_64)) - default: - return false - } - case objabi.R_ADDRMIPS: - ctxt.Out.Write8(uint8(elf.R_MIPS_LO16)) - case objabi.R_ADDRMIPSU: - ctxt.Out.Write8(uint8(elf.R_MIPS_HI16)) - case objabi.R_ADDRMIPSTLS: - ctxt.Out.Write8(uint8(elf.R_MIPS_TLS_TPREL_LO16)) - case objabi.R_CALLMIPS, - objabi.R_JMPMIPS: - ctxt.Out.Write8(uint8(elf.R_MIPS_26)) - } - ctxt.Out.Write64(uint64(r.Xadd)) - - return true -} - -func elfsetupplt(ctxt *ld.Link) { - return -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - return false -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - if ctxt.LinkMode == ld.LinkExternal { - switch r.Type { - default: - return val, false - case objabi.R_ADDRMIPS, - objabi.R_ADDRMIPSU: - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) - } - r.Xsym = rs - - return val, true - case objabi.R_ADDRMIPSTLS, - objabi.R_CALLMIPS, - objabi.R_JMPMIPS: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - return val, true - } - } - - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(ctxt.Syms.Lookup(".got", 0)), true - case objabi.R_ADDRMIPS, - objabi.R_ADDRMIPSU: - t := ld.Symaddr(r.Sym) + r.Add - o1 := ctxt.Arch.ByteOrder.Uint32(s.P[r.Off:]) - if r.Type == objabi.R_ADDRMIPS { - return int64(o1&0xffff0000 | uint32(t)&0xffff), true - } - return int64(o1&0xffff0000 | uint32((t+1<<15)>>16)&0xffff), true - case objabi.R_ADDRMIPSTLS: - // thread pointer is at 0x7000 offset from the start of TLS data area - t := ld.Symaddr(r.Sym) + r.Add - 0x7000 - if t < -32768 || t >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", t) - } - o1 := ctxt.Arch.ByteOrder.Uint32(s.P[r.Off:]) - return int64(o1&0xffff0000 | uint32(t)&0xffff), true - case objabi.R_CALLMIPS, - objabi.R_JMPMIPS: - // Low 26 bits = (S + A) >> 2 - t := ld.Symaddr(r.Sym) + r.Add - o1 := ctxt.Arch.ByteOrder.Uint32(s.P[r.Off:]) - return int64(o1&0xfc000000 | uint32(t>>2)&^0xfc000000), true - } - - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - return -1 -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - sect := ld.Segtext.Sections[0] - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - for _, sect = range ld.Segtext.Sections[1:] { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - if ld.Segrelrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) - ctxt.Out.Flush() - - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - ctxt.Out.Flush() - } - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan 9 */ - magic := uint32(4*18*18 + 7) - if ctxt.Arch == sys.ArchMIPS64LE { - magic = uint32(4*26*26 + 7) - } - ctxt.Out.Write32(magic) /* magic */ - ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(ld.Lcsize)) - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - } - - ctxt.Out.Flush() - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/oldlink/internal/mips64/l.go b/src/cmd/oldlink/internal/mips64/l.go deleted file mode 100644 index d794122f0b..0000000000 --- a/src/cmd/oldlink/internal/mips64/l.go +++ /dev/null @@ -1,74 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package mips64 - -// Writing object files. - -// cmd/9l/l.h from Vita Nuova. -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -const ( - maxAlign = 32 // max data alignment - minAlign = 1 // min data alignment - funcAlign = 8 -) - -/* Used by ../internal/ld/dwarf.go */ -const ( - dwarfRegSP = 29 - dwarfRegLR = 31 -) diff --git a/src/cmd/oldlink/internal/mips64/obj.go b/src/cmd/oldlink/internal/mips64/obj.go deleted file mode 100644 index 1ddce45c06..0000000000 --- a/src/cmd/oldlink/internal/mips64/obj.go +++ /dev/null @@ -1,98 +0,0 @@ -// Inferno utils/5l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package mips64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.ArchMIPS64 - if objabi.GOARCH == "mips64le" { - arch = sys.ArchMIPS64LE - } - - theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Machoreloc1: machoreloc1, - - Linuxdynld: "/lib64/ld64.so.1", - Freebsddynld: "XXX", - Openbsddynld: "XXX", - Netbsddynld: "XXX", - Dragonflydynld: "XXX", - Solarisdynld: "XXX", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - - case objabi.Hplan9: /* plan 9 */ - ld.HEADR = 32 - - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 16*1024 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 16 * 1024 - } - - case objabi.Hlinux: /* mips64 elf */ - ld.Elfinit(ctxt) - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 0x10000 - } - } -} diff --git a/src/cmd/oldlink/internal/objfile/objfile.go b/src/cmd/oldlink/internal/objfile/objfile.go deleted file mode 100644 index 6882b7694b..0000000000 --- a/src/cmd/oldlink/internal/objfile/objfile.go +++ /dev/null @@ -1,664 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package objfile reads Go object files for the Go linker, cmd/link. -// -// This package is similar to cmd/internal/objfile which also reads -// Go object files. -package objfile - -import ( - "bufio" - "bytes" - "cmd/internal/bio" - "cmd/internal/dwarf" - "cmd/internal/goobj2" - "cmd/internal/obj" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/sym" - "fmt" - "internal/unsafeheader" - "io" - "log" - "os" - "strconv" - "strings" - "unsafe" -) - -const ( - startmagic = "\x00go114ld" - endmagic = "\xffgo114ld" -) - -var emptyPkg = []byte(`"".`) - -// objReader reads Go object files. -type objReader struct { - rd *bio.Reader - arch *sys.Arch - syms *sym.Symbols - lib *sym.Library - unit *sym.CompilationUnit - pn string - dupSym *sym.Symbol - localSymVersion int - flags int - strictDupMsgs int - dataSize int - - // rdBuf is used by readString and readSymName as scratch for reading strings. - rdBuf []byte - - // List of symbol references for the file being read. - refs []*sym.Symbol - data []byte - reloc []sym.Reloc - pcdata []sym.Pcdata - funcdata []*sym.Symbol - funcdataoff []int64 - file []*sym.Symbol - pkgpref string // objabi.PathToPrefix(r.lib.Pkg) + "." - - roObject []byte // from read-only mmap of object file (may be nil) - roOffset int64 // offset into readonly object data examined so far - - dataReadOnly bool // whether data is backed by read-only memory -} - -// Flags to enable optional behavior during object loading/reading. - -const ( - NoFlag int = iota - - // Sanity-check duplicate symbol contents, issuing warning - // when duplicates have different lengths or contents. - StrictDupsWarnFlag - - // Similar to StrictDupsWarnFlag, but issue fatal error. - StrictDupsErrFlag -) - -// Load loads an object file f into library lib. -// The symbols loaded are added to syms. -func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, unit *sym.CompilationUnit, length int64, pn string, flags int) int { - start := f.Offset() - roObject := f.SliceRO(uint64(length)) - if roObject != nil { - f.MustSeek(int64(-length), os.SEEK_CUR) - } - r := &objReader{ - rd: f, - lib: lib, - unit: unit, - arch: arch, - syms: syms, - pn: pn, - dupSym: &sym.Symbol{Name: ".dup"}, - localSymVersion: syms.IncVersion(), - flags: flags, - roObject: roObject, - pkgpref: objabi.PathToPrefix(lib.Pkg) + ".", - } - r.loadObjFile() - if roObject != nil { - if r.roOffset != length { - log.Fatalf("%s: unexpected end at %d, want %d", pn, r.roOffset, start+length) - } - r.rd.MustSeek(int64(length), os.SEEK_CUR) - } else if f.Offset() != start+length { - log.Fatalf("%s: unexpected end at %d, want %d", pn, f.Offset(), start+length) - } - return r.strictDupMsgs -} - -func (r *objReader) loadObjFile() { - // Magic header - var buf [8]uint8 - r.readFull(buf[:]) - if string(buf[:]) != startmagic { - if string(buf[:]) == goobj2.Magic { - log.Fatalf("found object file %s in new format, but -go115newobj is false\nset -go115newobj consistently in all -gcflags, -asmflags, and -ldflags", r.pn) - } - log.Fatalf("%s: invalid file start %x %x %x %x %x %x %x %x", r.pn, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]) - } - - // Version - c, err := r.readByte() - if err != nil || c != 1 { - log.Fatalf("%s: invalid file version number %d", r.pn, c) - } - - // Autolib - for { - lib := r.readString() - if lib == "" { - break - } - r.lib.ImportStrings = append(r.lib.ImportStrings, lib) - } - - // DWARF strings - count := r.readInt() - r.unit.DWARFFileTable = make([]string, count) - for i := 0; i < count; i++ { - // TODO: This should probably be a call to mkROString. - r.unit.DWARFFileTable[i] = r.readString() - } - - // Symbol references - r.refs = []*sym.Symbol{nil} // zeroth ref is nil - for { - c, err := r.peek(1) - if err != nil { - log.Fatalf("%s: peeking: %v", r.pn, err) - } - if c[0] == 0xff { - r.readByte() - break - } - r.readRef() - } - - // Lengths - r.readSlices() - - // Data section - err = r.readDataSection() - if err != nil { - log.Fatalf("%s: error reading %s", r.pn, err) - } - - // Defined symbols - for { - c, err := r.peek(1) - if err != nil { - log.Fatalf("%s: peeking: %v", r.pn, err) - } - if c[0] == 0xff { - break - } - r.readSym() - } - - // Magic footer - buf = [8]uint8{} - r.readFull(buf[:]) - if string(buf[:]) != endmagic { - log.Fatalf("%s: invalid file end", r.pn) - } -} - -func (r *objReader) readSlices() { - r.dataSize = r.readInt() - n := r.readInt() - r.reloc = make([]sym.Reloc, n) - n = r.readInt() - r.pcdata = make([]sym.Pcdata, n) - _ = r.readInt() // TODO: remove on next object file rev (autom count) - n = r.readInt() - r.funcdata = make([]*sym.Symbol, n) - r.funcdataoff = make([]int64, n) - n = r.readInt() - r.file = make([]*sym.Symbol, n) -} - -func (r *objReader) readDataSection() (err error) { - if r.roObject != nil { - r.data, r.dataReadOnly, err = - r.roObject[r.roOffset:r.roOffset+int64(r.dataSize)], true, nil - r.roOffset += int64(r.dataSize) - return - } - r.data, r.dataReadOnly, err = r.rd.Slice(uint64(r.dataSize)) - return -} - -// Symbols are prefixed so their content doesn't get confused with the magic footer. -const symPrefix = 0xfe - -func (r *objReader) readSym() { - var c byte - var err error - if c, err = r.readByte(); c != symPrefix || err != nil { - log.Fatalln("readSym out of sync") - } - if c, err = r.readByte(); err != nil { - log.Fatalln("error reading input: ", err) - } - t := sym.AbiSymKindToSymKind[c] - s := r.readSymIndex() - flags := r.readInt() - dupok := flags&1 != 0 - local := flags&2 != 0 - makeTypelink := flags&4 != 0 - size := r.readInt() - typ := r.readSymIndex() - data := r.readData() - nreloc := r.readInt() - isdup := false - - var dup *sym.Symbol - if s.Type != 0 && s.Type != sym.SXREF { - if (t == sym.SDATA || t == sym.SBSS || t == sym.SNOPTRBSS) && len(data) == 0 && nreloc == 0 { - if s.Size < int64(size) { - s.Size = int64(size) - } - if typ != nil && s.Gotype == nil { - s.Gotype = typ - } - return - } - - if (s.Type == sym.SDATA || s.Type == sym.SBSS || s.Type == sym.SNOPTRBSS) && len(s.P) == 0 && len(s.R) == 0 { - goto overwrite - } - if s.Type != sym.SBSS && s.Type != sym.SNOPTRBSS && !dupok && !s.Attr.DuplicateOK() { - log.Fatalf("duplicate symbol %s (types %d and %d) in %s and %s", s.Name, s.Type, t, s.File, r.pn) - } - if len(s.P) > 0 { - dup = s - s = r.dupSym - isdup = true - } - } - -overwrite: - s.File = r.pkgpref[:len(r.pkgpref)-1] - s.Unit = r.unit - if dupok { - s.Attr |= sym.AttrDuplicateOK - } - if t == sym.SXREF { - log.Fatalf("bad sxref") - } - if t == 0 { - log.Fatalf("missing type for %s in %s", s.Name, r.pn) - } - if t == sym.SBSS && (s.Type == sym.SRODATA || s.Type == sym.SNOPTRBSS) { - t = s.Type - } - s.Type = t - if s.Size < int64(size) { - s.Size = int64(size) - } - s.Attr.Set(sym.AttrLocal, local) - s.Attr.Set(sym.AttrMakeTypelink, makeTypelink) - if typ != nil { - s.Gotype = typ - } - if isdup && typ != nil { // if bss sym defined multiple times, take type from any one def - dup.Gotype = typ - } - s.P = data - s.Attr.Set(sym.AttrReadOnly, r.dataReadOnly) - if nreloc > 0 { - s.R = r.reloc[:nreloc:nreloc] - if !isdup { - r.reloc = r.reloc[nreloc:] - } - - for i := 0; i < nreloc; i++ { - s.R[i] = sym.Reloc{ - Off: r.readInt32(), - Siz: r.readUint8(), - Type: objabi.RelocType(r.readInt32()), - Add: r.readInt64(), - Sym: r.readSymIndex(), - } - } - } - - if s.Type == sym.STEXT { - s.FuncInfo = new(sym.FuncInfo) - pc := s.FuncInfo - - pc.Args = r.readInt32() - pc.Locals = r.readInt32() - s.Align = r.readInt32() - if r.readUint8() != 0 { - s.Attr |= sym.AttrNoSplit - } - flags := r.readInt() - if flags&(1<<2) != 0 { - s.Attr |= sym.AttrReflectMethod - } - if flags&(1<<3) != 0 { - s.Attr |= sym.AttrShared - } - if flags&(1<<4) != 0 { - s.Attr |= sym.AttrTopFrame - } - n := r.readInt() - if n != 0 { - log.Fatalf("stale object file: autom count nonzero") - } - - pc.Pcsp.P = r.readData() - pc.Pcfile.P = r.readData() - pc.Pcline.P = r.readData() - pc.Pcinline.P = r.readData() - n = r.readInt() - pc.Pcdata = r.pcdata[:n:n] - if !isdup { - r.pcdata = r.pcdata[n:] - } - for i := 0; i < n; i++ { - pc.Pcdata[i].P = r.readData() - } - n = r.readInt() - pc.Funcdata = r.funcdata[:n:n] - pc.Funcdataoff = r.funcdataoff[:n:n] - if !isdup { - r.funcdata = r.funcdata[n:] - r.funcdataoff = r.funcdataoff[n:] - } - for i := 0; i < n; i++ { - pc.Funcdata[i] = r.readSymIndex() - } - for i := 0; i < n; i++ { - pc.Funcdataoff[i] = r.readInt64() - } - n = r.readInt() - pc.File = r.file[:n:n] - if !isdup { - r.file = r.file[n:] - } - for i := 0; i < n; i++ { - pc.File[i] = r.readSymIndex() - } - n = r.readInt() - pc.InlTree = make([]sym.InlinedCall, n) - for i := 0; i < n; i++ { - pc.InlTree[i].Parent = r.readInt32() - pc.InlTree[i].File = r.readSymIndex() - pc.InlTree[i].Line = r.readInt32() - pc.InlTree[i].Func = r.readSymIndex().Name - pc.InlTree[i].ParentPC = r.readInt32() - } - - if !dupok { - if s.Attr.OnList() { - log.Fatalf("symbol %s listed multiple times", s.Name) - } - s.Attr |= sym.AttrOnList - r.lib.Textp = append(r.lib.Textp, s) - } else { - // there may ba a dup in another package - // put into a temp list and add to text later - if !isdup { - r.lib.DupTextSyms = append(r.lib.DupTextSyms, s) - } else { - r.lib.DupTextSyms = append(r.lib.DupTextSyms, dup) - } - } - } - if s.Type == sym.SDWARFINFO { - r.patchDWARFName(s) - } - - if isdup && r.flags&(StrictDupsWarnFlag|StrictDupsErrFlag) != 0 { - // Compare the just-read symbol with the previously read - // symbol of the same name, verifying that they have the same - // payload. If not, issue a warning and possibly an error. - if !bytes.Equal(s.P, dup.P) { - reason := "same length but different contents" - if len(s.P) != len(dup.P) { - reason = fmt.Sprintf("new length %d != old length %d", - len(data), len(dup.P)) - } - fmt.Fprintf(os.Stderr, "cmd/link: while reading object for '%v': duplicate symbol '%s', previous def at '%v', with mismatched payload: %s\n", r.lib, dup, dup.Unit.Lib, reason) - - // For the moment, whitelist DWARF subprogram DIEs for - // auto-generated wrapper functions. What seems to happen - // here is that we get different line numbers on formal - // params; I am guessing that the pos is being inherited - // from the spot where the wrapper is needed. - whitelist := (strings.HasPrefix(dup.Name, "go.info.go.interface") || - strings.HasPrefix(dup.Name, "go.info.go.builtin") || - strings.HasPrefix(dup.Name, "go.isstmt.go.builtin") || - strings.HasPrefix(dup.Name, "go.debuglines")) - if !whitelist { - r.strictDupMsgs++ - } - } - } -} - -func (r *objReader) patchDWARFName(s *sym.Symbol) { - // This is kind of ugly. Really the package name should not - // even be included here. - if s.Size < 1 || s.P[0] != dwarf.DW_ABRV_FUNCTION { - return - } - e := bytes.IndexByte(s.P, 0) - if e == -1 { - return - } - p := bytes.Index(s.P[:e], emptyPkg) - if p == -1 { - return - } - pkgprefix := []byte(r.pkgpref) - patched := bytes.Replace(s.P[:e], emptyPkg, pkgprefix, -1) - - s.P = append(patched, s.P[e:]...) - delta := int64(len(s.P)) - s.Size - s.Size = int64(len(s.P)) - for i := range s.R { - r := &s.R[i] - if r.Off > int32(e) { - r.Off += int32(delta) - } - } -} - -func (r *objReader) readFull(b []byte) { - if r.roObject != nil { - copy(b, r.roObject[r.roOffset:]) - r.roOffset += int64(len(b)) - return - } - _, err := io.ReadFull(r.rd, b) - if err != nil { - log.Fatalf("%s: error reading %s", r.pn, err) - } -} - -func (r *objReader) readByte() (byte, error) { - if r.roObject != nil { - b := r.roObject[r.roOffset] - r.roOffset++ - return b, nil - } - return r.rd.ReadByte() -} - -func (r *objReader) peek(n int) ([]byte, error) { - if r.roObject != nil { - return r.roObject[r.roOffset : r.roOffset+int64(n)], nil - } - return r.rd.Peek(n) -} - -func (r *objReader) readRef() { - if c, err := r.readByte(); c != symPrefix || err != nil { - log.Fatalf("readSym out of sync") - } - name := r.readSymName() - var v int - if abi := r.readInt(); abi == -1 { - // Static - v = r.localSymVersion - } else if abiver := sym.ABIToVersion(obj.ABI(abi)); abiver != -1 { - // Note that data symbols are "ABI0", which maps to version 0. - v = abiver - } else { - log.Fatalf("invalid symbol ABI for %q: %d", name, abi) - } - s := r.syms.Lookup(name, v) - r.refs = append(r.refs, s) - - if s == nil || v == r.localSymVersion { - return - } - if s.Name[0] == '$' && len(s.Name) > 5 && s.Type == 0 && len(s.P) == 0 { - x, err := strconv.ParseUint(s.Name[5:], 16, 64) - if err != nil { - log.Panicf("failed to parse $-symbol %s: %v", s.Name, err) - } - s.Type = sym.SRODATA - s.Attr |= sym.AttrLocal - switch s.Name[:5] { - case "$f32.": - if uint64(uint32(x)) != x { - log.Panicf("$-symbol %s too large: %d", s.Name, x) - } - s.AddUint32(r.arch, uint32(x)) - case "$f64.", "$i64.": - s.AddUint64(r.arch, x) - default: - log.Panicf("unrecognized $-symbol: %s", s.Name) - } - s.Attr.Set(sym.AttrReachable, false) - } - if strings.HasPrefix(s.Name, "runtime.gcbits.") { - s.Attr |= sym.AttrLocal - } -} - -func (r *objReader) readInt64() int64 { - uv := uint64(0) - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - log.Fatalf("corrupt input") - } - c, err := r.readByte() - if err != nil { - log.Fatalln("error reading input: ", err) - } - uv |= uint64(c&0x7F) << shift - if c&0x80 == 0 { - break - } - } - - return int64(uv>>1) ^ (int64(uv<<63) >> 63) -} - -func (r *objReader) readInt() int { - n := r.readInt64() - if int64(int(n)) != n { - log.Panicf("%v out of range for int", n) - } - return int(n) -} - -func (r *objReader) readInt32() int32 { - n := r.readInt64() - if int64(int32(n)) != n { - log.Panicf("%v out of range for int32", n) - } - return int32(n) -} - -func (r *objReader) readInt16() int16 { - n := r.readInt64() - if int64(int16(n)) != n { - log.Panicf("%v out of range for int16", n) - } - return int16(n) -} - -func (r *objReader) readUint8() uint8 { - n := r.readInt64() - if int64(uint8(n)) != n { - log.Panicf("%v out of range for uint8", n) - } - return uint8(n) -} - -func (r *objReader) readString() string { - n := r.readInt() - if cap(r.rdBuf) < n { - r.rdBuf = make([]byte, 2*n) - } - r.readFull(r.rdBuf[:n]) - return string(r.rdBuf[:n]) -} - -func (r *objReader) readData() []byte { - n := r.readInt() - p := r.data[:n:n] - r.data = r.data[n:] - return p -} - -func mkROString(rodata []byte) string { - if len(rodata) == 0 { - return "" - } - - var s string - hdr := (*unsafeheader.String)(unsafe.Pointer(&s)) - hdr.Data = unsafe.Pointer(&rodata[0]) - hdr.Len = len(rodata) - - return s -} - -// readSymName reads a symbol name, replacing all "". with pkg. -func (r *objReader) readSymName() string { - n := r.readInt() - if n == 0 { - r.readInt64() - return "" - } - if cap(r.rdBuf) < n { - r.rdBuf = make([]byte, 2*n) - } - sOffset := r.roOffset - origName, err := r.peek(n) - if err == bufio.ErrBufferFull { - // Long symbol names are rare but exist. One source is type - // symbols for types with long string forms. See #15104. - origName = make([]byte, n) - r.readFull(origName) - } else if err != nil { - log.Fatalf("%s: error reading symbol: %v", r.pn, err) - } - adjName := r.rdBuf[:0] - nPkgRefs := 0 - for { - i := bytes.Index(origName, emptyPkg) - if i == -1 { - var s string - if r.roObject != nil && nPkgRefs == 0 { - s = mkROString(r.roObject[sOffset : sOffset+int64(n)]) - } else { - s = string(append(adjName, origName...)) - } - // Read past the peeked origName, now that we're done with it, - // using the rfBuf (also no longer used) as the scratch space. - // TODO: use bufio.Reader.Discard if available instead? - if err == nil { - r.readFull(r.rdBuf[:n]) - } - r.rdBuf = adjName[:0] // in case 2*n wasn't enough - return s - } - nPkgRefs++ - adjName = append(adjName, origName[:i]...) - adjName = append(adjName, r.pkgpref[:len(r.pkgpref)-1]...) - adjName = append(adjName, '.') - origName = origName[i+len(emptyPkg):] - } -} - -// Reads the index of a symbol reference and resolves it to a symbol -func (r *objReader) readSymIndex() *sym.Symbol { - i := r.readInt() - return r.refs[i] -} diff --git a/src/cmd/oldlink/internal/ppc64/asm.go b/src/cmd/oldlink/internal/ppc64/asm.go deleted file mode 100644 index 608bdecca6..0000000000 --- a/src/cmd/oldlink/internal/ppc64/asm.go +++ /dev/null @@ -1,1181 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ppc64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "debug/elf" - "encoding/binary" - "fmt" - "log" - "strings" -) - -func genplt(ctxt *ld.Link) { - // 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. - // - // 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"). - // - // 2) We reserve space for a pointer in the .plt section (once - // per referenced dynamic function). .plt is a data - // section filled solely by the dynamic linker (more like - // .plt.got on other architectures). Initially, the - // 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). - // - // 4) We generate the "symbol resolver stub" x@plt (once per - // dynamic function). This is solely a branch to the glink - // resolver stub. - // - // 5) We generate the glink resolver stub (only once). This - // computes which symbol resolver stub we came through and - // invokes the dynamic resolver via a pointer provided by - // the dynamic linker. This will patch up the .plt slot to - // point directly at the function so future calls go - // straight from the call stub to the real function, and - // then call the function. - - // NOTE: It's possible we could make ppc64 closer to other - // architectures: ppc64's .plt is like .plt.got on other - // 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. - var stubs []*sym.Symbol - for _, s := range ctxt.Textp { - for i := range s.R { - r := &s.R[i] - if r.Type != objabi.ElfRelocOffset+objabi.RelocType(elf.R_PPC64_REL24) || r.Sym.Type != sym.SDYNIMPORT { - continue - } - - // Reserve PLT entry and generate symbol - // resolver - addpltsym(ctxt, r.Sym) - - // Generate call stub - n := fmt.Sprintf("%s.%s", s.Name, r.Sym.Name) - - stub := ctxt.Syms.Lookup(n, 0) - if s.Attr.Reachable() { - stub.Attr |= sym.AttrReachable - } - if stub.Size == 0 { - // Need outer to resolve .TOC. - stub.Outer = s - stubs = append(stubs, stub) - gencallstub(ctxt, 1, stub, r.Sym) - } - - // Update the relocation to use the call stub - r.Sym = stub - - // Restore TOC after bl. The compiler put a - // nop here for us to overwrite. - const o1 = 0xe8410018 // ld r2,24(r1) - ctxt.Arch.ByteOrder.PutUint32(s.P[r.Off+4:], o1) - } - } - // Put call stubs at the beginning (instead of the end). - // So when resolving the relocations to calls to the stubs, - // the addresses are known and trampolines can be inserted - // when necessary. - ctxt.Textp = append(stubs, ctxt.Textp...) -} - -func genaddmoduledata(ctxt *ld.Link) { - addmoduledata := ctxt.Syms.ROLookup("runtime.addmoduledata", sym.SymVerABI0) - if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin { - return - } - addmoduledata.Attr |= sym.AttrReachable - initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0) - initfunc.Type = sym.STEXT - initfunc.Attr |= sym.AttrLocal - initfunc.Attr |= sym.AttrReachable - o := func(op uint32) { - initfunc.AddUint32(ctxt.Arch, op) - } - // addis r2, r12, .TOC.-func@ha - rel := initfunc.AddRel() - rel.Off = int32(initfunc.Size) - rel.Siz = 8 - rel.Sym = ctxt.Syms.Lookup(".TOC.", 0) - rel.Sym.Attr |= sym.AttrReachable - rel.Type = objabi.R_ADDRPOWER_PCREL - 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 - rel = initfunc.AddRel() - rel.Off = int32(initfunc.Size) - rel.Siz = 8 - if s := ctxt.Syms.ROLookup("local.moduledata", 0); s != nil { - rel.Sym = s - } else if s := ctxt.Syms.ROLookup("local.pluginmoduledata", 0); s != nil { - rel.Sym = s - } else { - rel.Sym = ctxt.Syms.Lookup("runtime.firstmoduledata", 0) - } - rel.Sym.Attr |= sym.AttrReachable - rel.Sym.Attr |= sym.AttrLocal - rel.Type = objabi.R_ADDRPOWER_GOT - o(0x3c620000) - // ld r3, local.moduledata@got@l(r3) - o(0xe8630000) - // bl runtime.addmoduledata - rel = initfunc.AddRel() - rel.Off = int32(initfunc.Size) - rel.Siz = 4 - rel.Sym = addmoduledata - rel.Type = objabi.R_CALLPOWER - 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 ctxt.BuildMode == ld.BuildModePlugin { - ctxt.Textp = append(ctxt.Textp, addmoduledata) - } - initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0) - ctxt.Textp = append(ctxt.Textp, initfunc) - initarray_entry.Attr |= sym.AttrReachable - initarray_entry.Attr |= sym.AttrLocal - initarray_entry.Type = sym.SINITARR - initarray_entry.AddAddr(ctxt.Arch, initfunc) -} - -func gentext(ctxt *ld.Link) { - if ctxt.DynlinkingGo() { - genaddmoduledata(ctxt) - } - - if ctxt.LinkMode == ld.LinkInternal { - genplt(ctxt) - } -} - -// Construct a call stub in stub that calls symbol targ via its PLT -// entry. -func gencallstub(ctxt *ld.Link, abicase int, stub *sym.Symbol, targ *sym.Symbol) { - 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") - } - - plt := ctxt.Syms.Lookup(".plt", 0) - - stub.Type = 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. - r := stub.AddRel() - - r.Off = int32(stub.Size) - r.Sym = plt - r.Add = int64(targ.Plt()) - r.Siz = 2 - if ctxt.Arch.ByteOrder == binary.BigEndian { - r.Off += int32(r.Siz) - } - r.Type = objabi.R_POWER_TOC - r.Variant = sym.RV_POWER_HA - stub.AddUint32(ctxt.Arch, 0x3d820000) // addis r12,r2,targ@plt@toc@ha - r = stub.AddRel() - r.Off = int32(stub.Size) - r.Sym = plt - r.Add = int64(targ.Plt()) - r.Siz = 2 - if ctxt.Arch.ByteOrder == binary.BigEndian { - r.Off += int32(r.Siz) - } - r.Type = objabi.R_POWER_TOC - r.Variant = 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 -} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - if ctxt.IsELF { - return addelfdynrel(ctxt, s, r) - } else if ctxt.HeadType == objabi.Haix { - return ld.Xcoffadddynrel(ctxt, s, r) - } - return false -} -func addelfdynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - targ := r.Sym - r.InitExt() - - switch r.Type { - default: - if r.Type >= objabi.ElfRelocOffset { - ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) - return false - } - - // Handle relocations found in ELF object files. - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24): - r.Type = objabi.R_CALLPOWER - - // This is a local call, so the caller isn't setting - // up r12 and r2 is the same for the caller and - // 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.) - r.Add += int64(r.Sym.Localentry()) * 4 - - if targ.Type == sym.SDYNIMPORT { - // Should have been handled in elfsetupplt - ld.Errorf(s, "unexpected R_PPC64_REL24 for dyn import") - } - - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC_REL32): - r.Type = objabi.R_PCREL - r.Add += 4 - - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_PPC_REL32 for dyn import") - } - - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_ADDR64): - r.Type = objabi.R_ADDR - if targ.Type == sym.SDYNIMPORT { - // These happen in .toc sections - ld.Adddynsym(ctxt, targ) - - rela := ctxt.Syms.Lookup(".rela", 0) - rela.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), uint32(elf.R_PPC64_ADDR64))) - rela.AddUint64(ctxt.Arch, uint64(r.Add)) - r.Type = objabi.ElfRelocOffset // ignore during relocsym - } - - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16): - r.Type = objabi.R_POWER_TOC - r.Variant = sym.RV_POWER_LO | sym.RV_CHECK_OVERFLOW - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_LO): - r.Type = objabi.R_POWER_TOC - r.Variant = sym.RV_POWER_LO - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_HA): - r.Type = objabi.R_POWER_TOC - r.Variant = sym.RV_POWER_HA | sym.RV_CHECK_OVERFLOW - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_HI): - r.Type = objabi.R_POWER_TOC - r.Variant = sym.RV_POWER_HI | sym.RV_CHECK_OVERFLOW - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_DS): - r.Type = objabi.R_POWER_TOC - r.Variant = sym.RV_POWER_DS | sym.RV_CHECK_OVERFLOW - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_LO_DS): - r.Type = objabi.R_POWER_TOC - r.Variant = sym.RV_POWER_DS - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL16_LO): - r.Type = objabi.R_PCREL - r.Variant = sym.RV_POWER_LO - r.Add += 2 // Compensate for relocation size of 2 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL16_HI): - r.Type = objabi.R_PCREL - r.Variant = sym.RV_POWER_HI | sym.RV_CHECK_OVERFLOW - r.Add += 2 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL16_HA): - r.Type = objabi.R_PCREL - r.Variant = sym.RV_POWER_HA | sym.RV_CHECK_OVERFLOW - r.Add += 2 - return true - } - - // Handle references to ELF symbols from our own object files. - if targ.Type != sym.SDYNIMPORT { - return true - } - - // TODO(austin): Translate our relocations to ELF - - return false -} - -func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - rs := r.Xsym - - emitReloc := func(v uint16, off uint64) { - out.Write64(uint64(sectoff) + off) - out.Write32(uint32(rs.Dynid)) - out.Write16(v) - } - - var v uint16 - switch r.Type { - default: - return false - case objabi.R_ADDR: - v = ld.XCOFF_R_POS - if r.Siz == 4 { - v |= 0x1F << 8 - } else { - v |= 0x3F << 8 - } - emitReloc(v, 0) - case objabi.R_ADDRPOWER_TOCREL: - case objabi.R_ADDRPOWER_TOCREL_DS: - emitReloc(ld.XCOFF_R_TOCU|(0x0F<<8), 2) - emitReloc(ld.XCOFF_R_TOCL|(0x0F<<8), 6) - case objabi.R_POWER_TLS_LE: - emitReloc(ld.XCOFF_R_TLS_LE|0x0F<<8, 2) - case objabi.R_CALLPOWER: - if r.Siz != 4 { - return false - } - emitReloc(ld.XCOFF_R_RBR|0x19<<8, 0) - case objabi.R_XCOFFREF: - emitReloc(ld.XCOFF_R_REF|0x3F<<8, 0) - - } - return true - -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - // Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines. - if r.Type == objabi.R_ADDR || r.Type == objabi.R_POWER_TLS || r.Type == objabi.R_CALLPOWER { - } else { - if ctxt.Arch.ByteOrder == binary.BigEndian { - sectoff += 2 - } - } - ctxt.Out.Write64(uint64(sectoff)) - - elfsym := r.Xsym.ElfsymForReloc() - switch r.Type { - default: - return false - case objabi.R_ADDR: - switch r.Siz { - case 4: - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR32) | uint64(elfsym)<<32) - case 8: - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR64) | uint64(elfsym)<<32) - default: - return false - } - case objabi.R_POWER_TLS: - ctxt.Out.Write64(uint64(elf.R_PPC64_TLS) | uint64(elfsym)<<32) - case objabi.R_POWER_TLS_LE: - ctxt.Out.Write64(uint64(elf.R_PPC64_TPREL16) | uint64(elfsym)<<32) - case objabi.R_POWER_TLS_IE: - ctxt.Out.Write64(uint64(elf.R_PPC64_GOT_TPREL16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_GOT_TPREL16_LO_DS) | uint64(elfsym)<<32) - case objabi.R_ADDRPOWER: - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_LO) | uint64(elfsym)<<32) - case objabi.R_ADDRPOWER_DS: - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_LO_DS) | uint64(elfsym)<<32) - case objabi.R_ADDRPOWER_GOT: - ctxt.Out.Write64(uint64(elf.R_PPC64_GOT16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_GOT16_LO_DS) | uint64(elfsym)<<32) - case objabi.R_ADDRPOWER_PCREL: - ctxt.Out.Write64(uint64(elf.R_PPC64_REL16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_REL16_LO) | uint64(elfsym)<<32) - r.Xadd += 4 - case objabi.R_ADDRPOWER_TOCREL: - ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_LO) | uint64(elfsym)<<32) - case objabi.R_ADDRPOWER_TOCREL_DS: - ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_LO_DS) | uint64(elfsym)<<32) - case objabi.R_CALLPOWER: - if r.Siz != 4 { - return false - } - ctxt.Out.Write64(uint64(elf.R_PPC64_REL24) | uint64(elfsym)<<32) - - } - ctxt.Out.Write64(uint64(r.Xadd)) - - return true -} - -func elfsetupplt(ctxt *ld.Link) { - plt := ctxt.Syms.Lookup(".plt", 0) - if plt.Size == 0 { - // The dynamic linker stores the address of the - // dynamic resolver and the DSO identifier in the two - // doublewords at the beginning of the .plt section - // before the PLT array. Reserve space for these. - plt.Size = 16 - } -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - return false -} - -// Return the value of .TOC. for symbol s -func symtoc(ctxt *ld.Link, s *sym.Symbol) int64 { - var toc *sym.Symbol - - if s.Outer != nil { - toc = ctxt.Syms.ROLookup(".TOC.", int(s.Outer.Version)) - } else { - toc = ctxt.Syms.ROLookup(".TOC.", int(s.Version)) - } - - if toc == nil { - ld.Errorf(s, "TOC-relative relocation in object without .TOC.") - return 0 - } - - return toc.Value -} - -// archreloctoc relocates a TOC relative symbol. -// If the symbol pointed by this TOC relative symbol is in .data or .bss, the -// default load instruction can be changed to an addi instruction and the -// symbol address can be used directly. -// This code is for AIX only. -func archreloctoc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) int64 { - if ctxt.HeadType == objabi.Hlinux { - ld.Errorf(s, "archrelocaddr called for %s relocation\n", r.Sym.Name) - } - var o1, o2 uint32 - - o1 = uint32(val >> 32) - o2 = uint32(val) - - var t int64 - useAddi := false - const prefix = "TOC." - var tarSym *sym.Symbol - if strings.HasPrefix(r.Sym.Name, prefix) { - tarSym = r.Sym.R[0].Sym - } else { - ld.Errorf(s, "archreloctoc called for a symbol without TOC anchor") - } - - if ctxt.LinkMode == ld.LinkInternal && tarSym != nil && tarSym.Attr.Reachable() && (tarSym.Sect.Seg == &ld.Segdata) { - t = ld.Symaddr(tarSym) + r.Add - ctxt.Syms.ROLookup("TOC", 0).Value - // change ld to addi in the second instruction - o2 = (o2 & 0x03FF0000) | 0xE<<26 - useAddi = true - } else { - t = ld.Symaddr(r.Sym) + r.Add - ctxt.Syms.ROLookup("TOC", 0).Value - } - - if t != int64(int32(t)) { - ld.Errorf(s, "TOC relocation for %s is too big to relocate %s: 0x%x", s.Name, r.Sym, t) - } - - if t&0x8000 != 0 { - t += 0x10000 - } - - o1 |= uint32((t >> 16) & 0xFFFF) - - switch r.Type { - case objabi.R_ADDRPOWER_TOCREL_DS: - if useAddi { - o2 |= uint32(t) & 0xFFFF - } else { - if t&3 != 0 { - ld.Errorf(s, "bad DS reloc for %s: %d", s.Name, ld.Symaddr(r.Sym)) - } - o2 |= uint32(t) & 0xFFFC - } - default: - return -1 - } - - return int64(o1)<<32 | int64(o2) -} - -// archrelocaddr relocates a symbol address. -// This code is for AIX only. -func archrelocaddr(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) int64 { - if ctxt.HeadType == objabi.Haix { - ld.Errorf(s, "archrelocaddr called for %s relocation\n", r.Sym.Name) - } - var o1, o2 uint32 - if ctxt.Arch.ByteOrder == binary.BigEndian { - o1 = uint32(val >> 32) - o2 = uint32(val) - } else { - o1 = uint32(val) - o2 = uint32(val >> 32) - } - - // We are spreading a 31-bit address across two instructions, putting the - // high (adjusted) part in the low 16 bits of the first instruction and the - // low part in the low 16 bits of the second instruction, or, in the DS case, - // bits 15-2 (inclusive) of the address into bits 15-2 of the second - // instruction (it is an error in this case if the low 2 bits of the address - // are non-zero). - - t := ld.Symaddr(r.Sym) + r.Add - if t < 0 || t >= 1<<31 { - ld.Errorf(s, "relocation for %s is too big (>=2G): 0x%x", s.Name, ld.Symaddr(r.Sym)) - } - if t&0x8000 != 0 { - t += 0x10000 - } - - switch r.Type { - case objabi.R_ADDRPOWER: - o1 |= (uint32(t) >> 16) & 0xffff - o2 |= uint32(t) & 0xffff - case objabi.R_ADDRPOWER_DS: - o1 |= (uint32(t) >> 16) & 0xffff - if t&3 != 0 { - ld.Errorf(s, "bad DS reloc for %s: %d", s.Name, ld.Symaddr(r.Sym)) - } - o2 |= uint32(t) & 0xfffc - default: - return -1 - } - - if ctxt.Arch.ByteOrder == binary.BigEndian { - return int64(o1)<<32 | int64(o2) - } - return int64(o2)<<32 | int64(o1) -} - -// resolve direct jump relocation r in s, and add trampoline if necessary -func trampoline(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol) { - - // Trampolines are created if the branch offset is too large and the linker cannot insert a call stub to handle it. - // For internal linking, trampolines are always created for long calls. - // For external linking, the linker can insert a call stub to handle a long call, but depends on having the TOC address in - // r2. For those build modes with external linking where the TOC address is not maintained in r2, trampolines must be created. - if ctxt.LinkMode == ld.LinkExternal && (ctxt.DynlinkingGo() || ctxt.BuildMode == ld.BuildModeCArchive || ctxt.BuildMode == ld.BuildModeCShared || ctxt.BuildMode == ld.BuildModePIE) { - // No trampolines needed since r2 contains the TOC - return - } - - t := ld.Symaddr(r.Sym) + r.Add - (s.Value + int64(r.Off)) - switch r.Type { - case objabi.R_CALLPOWER: - - // If branch offset is too far then create a trampoline. - - if (ctxt.LinkMode == ld.LinkExternal && s.Sect != r.Sym.Sect) || (ctxt.LinkMode == ld.LinkInternal && int64(int32(t<<6)>>6) != t) || (*ld.FlagDebugTramp > 1 && s.File != r.Sym.File) { - var tramp *sym.Symbol - for i := 0; ; i++ { - - // Using r.Add as part of the name is significant in functions like duffzero where the call - // target is at some offset within the function. Calls to duff+8 and duff+256 must appear as - // distinct trampolines. - - name := r.Sym.Name - if r.Add == 0 { - name = name + fmt.Sprintf("-tramp%d", i) - } else { - name = name + fmt.Sprintf("%+x-tramp%d", r.Add, i) - } - - // Look up the trampoline in case it already exists - - tramp = ctxt.Syms.Lookup(name, int(r.Sym.Version)) - if tramp.Value == 0 { - break - } - - t = ld.Symaddr(tramp) + r.Add - (s.Value + int64(r.Off)) - - // With internal linking, the trampoline can be used if it is not too far. - // With external linking, the trampoline must be in this section for it to be reused. - if (ctxt.LinkMode == ld.LinkInternal && int64(int32(t<<6)>>6) == t) || (ctxt.LinkMode == ld.LinkExternal && s.Sect == tramp.Sect) { - break - } - } - if tramp.Type == 0 { - if ctxt.DynlinkingGo() || ctxt.BuildMode == ld.BuildModeCArchive || ctxt.BuildMode == ld.BuildModeCShared || ctxt.BuildMode == ld.BuildModePIE { - // Should have returned for above cases - ld.Errorf(s, "unexpected trampoline for shared or dynamic linking\n") - } else { - ctxt.AddTramp(tramp) - gentramp(ctxt, tramp, r.Sym, r.Add) - } - } - r.Sym = tramp - r.Add = 0 // This was folded into the trampoline target address - r.Done = false - } - default: - ld.Errorf(s, "trampoline called with non-jump reloc: %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) - } -} - -func gentramp(ctxt *ld.Link, tramp, target *sym.Symbol, offset int64) { - tramp.Size = 16 // 4 instructions - tramp.P = make([]byte, tramp.Size) - t := ld.Symaddr(target) + offset - var o1, o2 uint32 - - if ctxt.HeadType == objabi.Haix { - // 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(0x3fe20000) // lis r2, toctargetaddr hi - o2 = uint32(0xebff0000) // ld r31, toctargetaddr lo - - toctramp := ctxt.Syms.Lookup("TOC."+tramp.Name, 0) - toctramp.Type = sym.SXCOFFTOC - toctramp.Attr |= sym.AttrReachable - toctramp.AddAddr(ctxt.Arch, target) - - tr := tramp.AddRel() - tr.Off = 0 - tr.Type = objabi.R_ADDRPOWER_TOCREL_DS - tr.Siz = 8 // generates 2 relocations: HA + LO - tr.Sym = toctramp - tr.Add = 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(0x3fe00000) // lis r31,targetaddr hi - o2 = uint32(0x3bff0000) // addi r31,targetaddr lo - - // With external linking, the target address must be - // relocated using LO and HA - if ctxt.LinkMode == ld.LinkExternal { - tr := tramp.AddRel() - tr.Off = 0 - tr.Type = objabi.R_ADDRPOWER - tr.Siz = 8 // generates 2 relocations: HA + LO - tr.Sym = target - tr.Add = offset - - } else { - // adjustment needed if lo has sign bit set - // when using addi to compute address - val := uint32((t & 0xffff0000) >> 16) - if t&0x8000 != 0 { - val += 1 - } - o1 |= val // hi part of addr - o2 |= uint32(t & 0xffff) // lo part of addr - } - } - - o3 := uint32(0x7fe903a6) // mtctr r31 - o4 := uint32(0x4e800420) // bctr - ctxt.Arch.ByteOrder.PutUint32(tramp.P, o1) - ctxt.Arch.ByteOrder.PutUint32(tramp.P[4:], o2) - ctxt.Arch.ByteOrder.PutUint32(tramp.P[8:], o3) - ctxt.Arch.ByteOrder.PutUint32(tramp.P[12:], o4) -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - if ctxt.LinkMode == ld.LinkExternal { - // On AIX, relocations (except TLS ones) must be also done to the - // value with the current addresses. - switch r.Type { - default: - if ctxt.HeadType != objabi.Haix { - return val, false - } - case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE: - r.Done = false - // check Outer is nil, Type is TLSBSS? - r.Xadd = r.Add - r.Xsym = r.Sym - return val, true - case objabi.R_ADDRPOWER, - objabi.R_ADDRPOWER_DS, - objabi.R_ADDRPOWER_TOCREL, - objabi.R_ADDRPOWER_TOCREL_DS, - objabi.R_ADDRPOWER_GOT, - objabi.R_ADDRPOWER_PCREL: - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = r.Add - for rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) - } - r.Xsym = rs - - if ctxt.HeadType != objabi.Haix { - return val, true - } - case objabi.R_CALLPOWER: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - if ctxt.HeadType != objabi.Haix { - return val, true - } - } - } - - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(ctxt.Syms.Lookup(".got", 0)), true - case objabi.R_ADDRPOWER_TOCREL, objabi.R_ADDRPOWER_TOCREL_DS: - return archreloctoc(ctxt, r, s, val), true - case objabi.R_ADDRPOWER, objabi.R_ADDRPOWER_DS: - return archrelocaddr(ctxt, r, s, val), true - case objabi.R_CALLPOWER: - // Bits 6 through 29 = (S + A - P) >> 2 - - t := ld.Symaddr(r.Sym) + r.Add - (s.Value + int64(r.Off)) - - if t&3 != 0 { - ld.Errorf(s, "relocation for %s+%d is not aligned: %d", r.Sym.Name, r.Off, t) - } - // If branch offset is too far then create a trampoline. - - if int64(int32(t<<6)>>6) != t { - ld.Errorf(s, "direct call too far: %s %x", r.Sym.Name, t) - } - return val | int64(uint32(t)&^0xfc000003), true - case objabi.R_POWER_TOC: // S + A - .TOC. - return ld.Symaddr(r.Sym) + r.Add - symtoc(ctxt, s), true - - case objabi.R_POWER_TLS_LE: - // The thread pointer points 0x7000 bytes after the start of the - // thread local storage area as documented in section "3.7.2 TLS - // Runtime Handling" of "Power Architecture 64-Bit ELF V2 ABI - // Specification". - v := r.Sym.Value - 0x7000 - if ctxt.HeadType == objabi.Haix { - // On AIX, the thread pointer points 0x7800 bytes after - // the TLS. - v -= 0x800 - } - if int64(int16(v)) != v { - ld.Errorf(s, "TLS offset out of range %d", v) - } - return (val &^ 0xffff) | (v & 0xffff), true - } - - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - switch r.Variant & sym.RV_TYPE_MASK { - default: - ld.Errorf(s, "unexpected relocation variant %d", r.Variant) - fallthrough - - case sym.RV_NONE: - return t - - case sym.RV_POWER_LO: - if r.Variant&sym.RV_CHECK_OVERFLOW != 0 { - // Whether to check for signed or unsigned - // overflow depends on the instruction - var o1 uint32 - if ctxt.Arch.ByteOrder == binary.BigEndian { - o1 = binary.BigEndian.Uint32(s.P[r.Off-2:]) - } else { - o1 = binary.LittleEndian.Uint32(s.P[r.Off:]) - } - switch o1 >> 26 { - case 24, // ori - 26, // xori - 28: // andi - if t>>16 != 0 { - goto overflow - } - - default: - if int64(int16(t)) != t { - goto overflow - } - } - } - - return int64(int16(t)) - - case sym.RV_POWER_HA: - t += 0x8000 - fallthrough - - // Fallthrough - case sym.RV_POWER_HI: - t >>= 16 - - if r.Variant&sym.RV_CHECK_OVERFLOW != 0 { - // Whether to check for signed or unsigned - // overflow depends on the instruction - var o1 uint32 - if ctxt.Arch.ByteOrder == binary.BigEndian { - o1 = binary.BigEndian.Uint32(s.P[r.Off-2:]) - } else { - o1 = binary.LittleEndian.Uint32(s.P[r.Off:]) - } - switch o1 >> 26 { - case 25, // oris - 27, // xoris - 29: // andis - if t>>16 != 0 { - goto overflow - } - - default: - if int64(int16(t)) != t { - goto overflow - } - } - } - - return int64(int16(t)) - - case sym.RV_POWER_DS: - var o1 uint32 - if ctxt.Arch.ByteOrder == binary.BigEndian { - o1 = uint32(binary.BigEndian.Uint16(s.P[r.Off:])) - } else { - o1 = uint32(binary.LittleEndian.Uint16(s.P[r.Off:])) - } - if t&3 != 0 { - ld.Errorf(s, "relocation for %s+%d is not aligned: %d", r.Sym.Name, r.Off, t) - } - if (r.Variant&sym.RV_CHECK_OVERFLOW != 0) && int64(int16(t)) != t { - goto overflow - } - return int64(o1)&0x3 | int64(int16(t)) - } - -overflow: - ld.Errorf(s, "relocation for %s+%d is too big: %d", r.Sym.Name, r.Off, t) - return t -} - -func addpltsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Plt() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - - if ctxt.IsELF { - plt := ctxt.Syms.Lookup(".plt", 0) - rela := ctxt.Syms.Lookup(".rela.plt", 0) - if plt.Size == 0 { - elfsetupplt(ctxt) - } - - // Create the glink resolver if necessary - glink := ensureglinkresolver(ctxt) - - // Write symbol resolver stub (just a branch to the - // glink resolver stub) - r := glink.AddRel() - - r.Sym = glink - r.Off = int32(glink.Size) - r.Siz = 4 - r.Type = objabi.R_CALLPOWER - glink.AddUint32(ctxt.Arch, 0x48000000) // b .glink - - // In the ppc64 ABI, the dynamic linker is responsible - // for writing the entire PLT. We just need to - // reserve 8 bytes for each PLT entry and generate a - // JMP_SLOT dynamic relocation for it. - // - // TODO(austin): ABI v1 is different - s.SetPlt(int32(plt.Size)) - - plt.Size += 8 - - rela.AddAddrPlus(ctxt.Arch, plt, int64(s.Plt())) - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_PPC64_JMP_SLOT))) - rela.AddUint64(ctxt.Arch, 0) - } else { - ld.Errorf(s, "addpltsym: unsupported binary format") - } -} - -// Generate the glink resolver stub if necessary and return the .glink section -func ensureglinkresolver(ctxt *ld.Link) *sym.Symbol { - glink := ctxt.Syms.Lookup(".glink", 0) - if glink.Size != 0 { - return glink - } - - // This is essentially the resolver from the ppc64 ELF ABI. - // At entry, r12 holds the address of the symbol resolver stub - // for the target routine and the argument registers hold the - // arguments for the target routine. - // - // This stub is PIC, so first get the PC of label 1 into r11. - // Other things will be relative to this. - glink.AddUint32(ctxt.Arch, 0x7c0802a6) // mflr r0 - glink.AddUint32(ctxt.Arch, 0x429f0005) // bcl 20,31,1f - glink.AddUint32(ctxt.Arch, 0x7d6802a6) // 1: mflr r11 - glink.AddUint32(ctxt.Arch, 0x7c0803a6) // mtlf r0 - - // Compute the .plt array index from the entry point address. - // Because this is PIC, everything is relative to label 1b (in - // r11): - // r0 = ((r12 - r11) - (res_0 - r11)) / 4 = (r12 - res_0) / 4 - glink.AddUint32(ctxt.Arch, 0x3800ffd0) // li r0,-(res_0-1b)=-48 - glink.AddUint32(ctxt.Arch, 0x7c006214) // add r0,r0,r12 - glink.AddUint32(ctxt.Arch, 0x7c0b0050) // sub r0,r0,r11 - glink.AddUint32(ctxt.Arch, 0x7800f082) // srdi r0,r0,2 - - // r11 = address of the first byte of the PLT - r := glink.AddRel() - - r.Off = int32(glink.Size) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Siz = 8 - r.Type = objabi.R_ADDRPOWER - - glink.AddUint32(ctxt.Arch, 0x3d600000) // addis r11,0,.plt@ha - glink.AddUint32(ctxt.Arch, 0x396b0000) // addi r11,r11,.plt@l - - // Load r12 = dynamic resolver address and r11 = DSO - // identifier from the first two doublewords of the PLT. - glink.AddUint32(ctxt.Arch, 0xe98b0000) // ld r12,0(r11) - 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 - - // The symbol resolvers must immediately follow. - // res_0: - - // Add DT_PPC64_GLINK .dynamic entry, which points to 32 bytes - // before the first symbol resolver stub. - s := ctxt.Syms.Lookup(".dynamic", 0) - - ld.Elfwritedynentsymplus(ctxt, s, ld.DT_PPC64_GLINK, glink, glink.Size-32) - - return glink -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - for _, sect := range ld.Segtext.Sections { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - // Handle additional text sections with Codeblk - if sect.Name == ".text" { - ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } else { - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - if ld.Segrelrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - - case objabi.Haix: - // Nothing to do - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) - ctxt.Out.Flush() - - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - ctxt.Out.Flush() - } - - case objabi.Haix: - // symtab must be added once sections have been created in ld.Asmbxcoff - ctxt.Out.Flush() - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan 9 */ - ctxt.Out.Write32(0x647) /* magic */ - ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(ld.Lcsize)) - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - - case objabi.Haix: - fileoff := uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - fileoff = uint32(ld.Rnd(int64(fileoff), int64(*ld.FlagRound))) - ld.Asmbxcoff(ctxt, int64(fileoff)) - } - - ctxt.Out.Flush() - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/oldlink/internal/ppc64/l.go b/src/cmd/oldlink/internal/ppc64/l.go deleted file mode 100644 index c78535be58..0000000000 --- a/src/cmd/oldlink/internal/ppc64/l.go +++ /dev/null @@ -1,74 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ppc64 - -// Writing object files. - -// cmd/9l/l.h from Vita Nuova. -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -const ( - maxAlign = 32 // max data alignment - minAlign = 1 // min data alignment - funcAlign = 16 -) - -/* Used by ../internal/ld/dwarf.go */ -const ( - dwarfRegSP = 1 - dwarfRegLR = 65 -) diff --git a/src/cmd/oldlink/internal/ppc64/obj.go b/src/cmd/oldlink/internal/ppc64/obj.go deleted file mode 100644 index e9da5a36d5..0000000000 --- a/src/cmd/oldlink/internal/ppc64/obj.go +++ /dev/null @@ -1,106 +0,0 @@ -// Inferno utils/5l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package ppc64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.ArchPPC64 - if objabi.GOARCH == "ppc64le" { - arch = sys.ArchPPC64LE - } - - theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, - - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Trampoline: trampoline, - Machoreloc1: machoreloc1, - Xcoffreloc1: xcoffreloc1, - - // TODO(austin): ABI v1 uses /usr/lib/ld.so.1, - Linuxdynld: "/lib64/ld64.so.1", - - Freebsddynld: "XXX", - Openbsddynld: "XXX", - Netbsddynld: "XXX", - Dragonflydynld: "XXX", - Solarisdynld: "XXX", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - - case objabi.Hplan9: /* plan 9 */ - ld.HEADR = 32 - - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 4128 - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - - case objabi.Hlinux: /* ppc64 elf */ - ld.Elfinit(ctxt) - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 0x10000 - } - - case objabi.Haix: - ld.Xcoffinit(ctxt) - } -} diff --git a/src/cmd/oldlink/internal/riscv64/asm.go b/src/cmd/oldlink/internal/riscv64/asm.go deleted file mode 100644 index f4db32df8a..0000000000 --- a/src/cmd/oldlink/internal/riscv64/asm.go +++ /dev/null @@ -1,168 +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 riscv64 - -import ( - "cmd/internal/obj/riscv" - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "fmt" - "log" -) - -func gentext(ctxt *ld.Link) { -} - -func adddynrela(ctxt *ld.Link, rel *sym.Symbol, s *sym.Symbol, r *sym.Reloc) { - log.Fatalf("adddynrela not implemented") -} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - log.Fatalf("adddynrel not implemented") - return false -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - log.Fatalf("elfreloc1") - return false -} - -func elfsetupplt(ctxt *ld.Link) { - log.Fatalf("elfsetuplt") -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - log.Fatalf("machoreloc1 not implemented") - return false -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - switch r.Type { - case objabi.R_CALLRISCV: - // Nothing to do. - return val, true - - case objabi.R_RISCV_PCREL_ITYPE, objabi.R_RISCV_PCREL_STYPE: - pc := s.Value + int64(r.Off) - off := ld.Symaddr(r.Sym) + r.Add - pc - - // Generate AUIPC and second instruction immediates. - low, high, err := riscv.Split32BitImmediate(off) - if err != nil { - ld.Errorf(s, "R_RISCV_PCREL_ relocation does not fit in 32-bits: %d", off) - } - - auipcImm, err := riscv.EncodeUImmediate(high) - if err != nil { - ld.Errorf(s, "cannot encode R_RISCV_PCREL_ AUIPC relocation offset for %s: %v", r.Sym.Name, err) - } - - var secondImm, secondImmMask int64 - switch r.Type { - case objabi.R_RISCV_PCREL_ITYPE: - secondImmMask = riscv.ITypeImmMask - secondImm, err = riscv.EncodeIImmediate(low) - if err != nil { - ld.Errorf(s, "cannot encode R_RISCV_PCREL_ITYPE I-type instruction relocation offset for %s: %v", r.Sym.Name, err) - } - case objabi.R_RISCV_PCREL_STYPE: - secondImmMask = riscv.STypeImmMask - secondImm, err = riscv.EncodeSImmediate(low) - if err != nil { - ld.Errorf(s, "cannot encode R_RISCV_PCREL_STYPE S-type instruction relocation offset for %s: %v", r.Sym.Name, err) - } - default: - panic(fmt.Sprintf("Unknown relocation type: %v", r.Type)) - } - - auipc := int64(uint32(val)) - second := int64(uint32(val >> 32)) - - auipc = (auipc &^ riscv.UTypeImmMask) | int64(uint32(auipcImm)) - second = (second &^ secondImmMask) | int64(uint32(secondImm)) - - return second<<32 | auipc, true - } - - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - log.Fatalf("archrelocvariant") - return -1 -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - sect := ld.Segtext.Sections[0] - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - for _, sect = range ld.Segtext.Sections[1:] { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - if ld.Segrelrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - ld.Symsize = 0 - ld.Lcsize = 0 - symo := uint32(0) - - if !*ld.FlagS { - if !ctxt.IsELF { - ld.Errorf(nil, "unsupported executable format") - } - - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - ctxt.Out.SeekSet(int64(symo)) - - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - case objabi.Hlinux: - ld.Asmbelf(ctxt, int64(symo)) - default: - ld.Errorf(nil, "unsupported operating system") - } - ctxt.Out.Flush() - - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/oldlink/internal/riscv64/l.go b/src/cmd/oldlink/internal/riscv64/l.go deleted file mode 100644 index a302657726..0000000000 --- a/src/cmd/oldlink/internal/riscv64/l.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. - -package riscv64 - -const ( - maxAlign = 32 // max data alignment - minAlign = 1 - funcAlign = 8 - - dwarfRegLR = 1 - dwarfRegSP = 2 -) diff --git a/src/cmd/oldlink/internal/riscv64/obj.go b/src/cmd/oldlink/internal/riscv64/obj.go deleted file mode 100644 index a6a5adb86c..0000000000 --- a/src/cmd/oldlink/internal/riscv64/obj.go +++ /dev/null @@ -1,60 +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 riscv64 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.ArchRISCV64 - - theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, - - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Machoreloc1: machoreloc1, - - Linuxdynld: "/lib/ld.so.1", - - Freebsddynld: "XXX", - Netbsddynld: "XXX", - Openbsddynld: "XXX", - Dragonflydynld: "XXX", - Solarisdynld: "XXX", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - case objabi.Hlinux: - ld.Elfinit(ctxt) - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 0x10000 - } - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - } -} diff --git a/src/cmd/oldlink/internal/s390x/asm.go b/src/cmd/oldlink/internal/s390x/asm.go deleted file mode 100644 index 6c5744dc95..0000000000 --- a/src/cmd/oldlink/internal/s390x/asm.go +++ /dev/null @@ -1,574 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package s390x - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "debug/elf" - "fmt" -) - -// gentext generates assembly to append the local moduledata to the global -// moduledata linked list at initialization time. This is only done if the runtime -// is in a different module. -// -// : -// larl %r2, -// jg -// undef -// -// The job of appending the moduledata is delegated to runtime.addmoduledata. -func gentext(ctxt *ld.Link) { - if !ctxt.DynlinkingGo() { - return - } - addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0) - if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin { - // we're linking a module containing the runtime -> no need for - // an init function - return - } - addmoduledata.Attr |= sym.AttrReachable - initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0) - initfunc.Type = sym.STEXT - initfunc.Attr |= sym.AttrLocal - initfunc.Attr |= sym.AttrReachable - - // larl %r2, - initfunc.AddUint8(0xc0) - initfunc.AddUint8(0x20) - lmd := initfunc.AddRel() - lmd.InitExt() - lmd.Off = int32(initfunc.Size) - lmd.Siz = 4 - lmd.Sym = ctxt.Moduledata - lmd.Type = objabi.R_PCREL - lmd.Variant = sym.RV_390_DBL - lmd.Add = 2 + int64(lmd.Siz) - initfunc.AddUint32(ctxt.Arch, 0) - - // jg - initfunc.AddUint8(0xc0) - initfunc.AddUint8(0xf4) - rel := initfunc.AddRel() - rel.InitExt() - rel.Off = int32(initfunc.Size) - rel.Siz = 4 - rel.Sym = ctxt.Syms.Lookup("runtime.addmoduledata", 0) - rel.Type = objabi.R_CALL - rel.Variant = sym.RV_390_DBL - rel.Add = 2 + int64(rel.Siz) - initfunc.AddUint32(ctxt.Arch, 0) - - // undef (for debugging) - initfunc.AddUint32(ctxt.Arch, 0) - if ctxt.BuildMode == ld.BuildModePlugin { - ctxt.Textp = append(ctxt.Textp, addmoduledata) - } - ctxt.Textp = append(ctxt.Textp, initfunc) - initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0) - initarray_entry.Attr |= sym.AttrLocal - initarray_entry.Attr |= sym.AttrReachable - initarray_entry.Type = sym.SINITARR - initarray_entry.AddAddr(ctxt.Arch, initfunc) -} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - targ := r.Sym - r.InitExt() - - switch r.Type { - default: - if r.Type >= objabi.ElfRelocOffset { - ld.Errorf(s, "unexpected relocation type %d", r.Type) - return false - } - - // Handle relocations found in ELF object files. - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_12), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOT12): - ld.Errorf(s, "s390x 12-bit relocations have not been implemented (relocation type %d)", r.Type-objabi.ElfRelocOffset) - return false - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_8), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_16), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_32), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_64): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_390_nn relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ADDR - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC16), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC32), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC64): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_390_PCnn relocation for dynamic symbol %s", targ.Name) - } - // TODO(mwhudson): the test of VisibilityHidden here probably doesn't make - // sense and should be removed when someone has thought about it properly. - if (targ.Type == 0 || targ.Type == sym.SXREF) && !targ.Attr.VisibilityHidden() { - ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name) - } - r.Type = objabi.R_PCREL - r.Add += int64(r.Siz) - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOT16), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOT32), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOT64): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PLT16DBL), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PLT32DBL): - r.Type = objabi.R_PCREL - r.Variant = sym.RV_390_DBL - r.Add += int64(r.Siz) - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add += int64(targ.Plt()) - } - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PLT32), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PLT64): - r.Type = objabi.R_PCREL - r.Add += int64(r.Siz) - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add += int64(targ.Plt()) - } - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_COPY): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) - return false - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GLOB_DAT): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) - return false - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_JMP_SLOT): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) - return false - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_RELATIVE): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) - return false - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTOFF): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_390_GOTOFF relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_GOTOFF - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTPC): - r.Type = objabi.R_PCREL - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(r.Siz) - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC16DBL), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC32DBL): - r.Type = objabi.R_PCREL - r.Variant = sym.RV_390_DBL - r.Add += int64(r.Siz) - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_390_PCnnDBL relocation for dynamic symbol %s", targ.Name) - } - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTPCDBL): - r.Type = objabi.R_PCREL - r.Variant = sym.RV_390_DBL - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(r.Siz) - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTENT): - addgotsym(ctxt, targ) - - r.Type = objabi.R_PCREL - r.Variant = sym.RV_390_DBL - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(targ.Got()) - r.Add += int64(r.Siz) - return true - } - // Handle references to ELF symbols from our own object files. - if targ.Type != sym.SDYNIMPORT { - return true - } - - return false -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - ctxt.Out.Write64(uint64(sectoff)) - - elfsym := r.Xsym.ElfsymForReloc() - switch r.Type { - default: - return false - case objabi.R_TLS_LE: - switch r.Siz { - default: - return false - case 4: - // WARNING - silently ignored by linker in ELF64 - ctxt.Out.Write64(uint64(elf.R_390_TLS_LE32) | uint64(elfsym)<<32) - case 8: - // WARNING - silently ignored by linker in ELF32 - ctxt.Out.Write64(uint64(elf.R_390_TLS_LE64) | uint64(elfsym)<<32) - } - case objabi.R_TLS_IE: - switch r.Siz { - default: - return false - case 4: - ctxt.Out.Write64(uint64(elf.R_390_TLS_IEENT) | uint64(elfsym)<<32) - } - case objabi.R_ADDR: - switch r.Siz { - default: - return false - case 4: - ctxt.Out.Write64(uint64(elf.R_390_32) | uint64(elfsym)<<32) - case 8: - ctxt.Out.Write64(uint64(elf.R_390_64) | uint64(elfsym)<<32) - } - case objabi.R_GOTPCREL: - if r.Siz == 4 { - ctxt.Out.Write64(uint64(elf.R_390_GOTENT) | uint64(elfsym)<<32) - } else { - return false - } - case objabi.R_PCREL, objabi.R_PCRELDBL, objabi.R_CALL: - elfrel := elf.R_390_NONE - isdbl := r.Variant&sym.RV_TYPE_MASK == sym.RV_390_DBL - // TODO(mundaym): all DBL style relocations should be - // signalled using the variant - see issue 14218. - switch r.Type { - case objabi.R_PCRELDBL, objabi.R_CALL: - isdbl = true - } - if r.Xsym.Type == sym.SDYNIMPORT && (r.Xsym.ElfType() == elf.STT_FUNC || r.Type == objabi.R_CALL) { - if isdbl { - switch r.Siz { - case 2: - elfrel = elf.R_390_PLT16DBL - case 4: - elfrel = elf.R_390_PLT32DBL - } - } else { - switch r.Siz { - case 4: - elfrel = elf.R_390_PLT32 - case 8: - elfrel = elf.R_390_PLT64 - } - } - } else { - if isdbl { - switch r.Siz { - case 2: - elfrel = elf.R_390_PC16DBL - case 4: - elfrel = elf.R_390_PC32DBL - } - } else { - switch r.Siz { - case 2: - elfrel = elf.R_390_PC16 - case 4: - elfrel = elf.R_390_PC32 - case 8: - elfrel = elf.R_390_PC64 - } - } - } - if elfrel == elf.R_390_NONE { - return false // unsupported size/dbl combination - } - ctxt.Out.Write64(uint64(elfrel) | uint64(elfsym)<<32) - } - - ctxt.Out.Write64(uint64(r.Xadd)) - return true -} - -func elfsetupplt(ctxt *ld.Link) { - plt := ctxt.Syms.Lookup(".plt", 0) - got := ctxt.Syms.Lookup(".got", 0) - if plt.Size == 0 { - // stg %r1,56(%r15) - plt.AddUint8(0xe3) - plt.AddUint8(0x10) - plt.AddUint8(0xf0) - plt.AddUint8(0x38) - plt.AddUint8(0x00) - plt.AddUint8(0x24) - // larl %r1,_GLOBAL_OFFSET_TABLE_ - plt.AddUint8(0xc0) - plt.AddUint8(0x10) - plt.AddPCRelPlus(ctxt.Arch, got, 6) - // mvc 48(8,%r15),8(%r1) - plt.AddUint8(0xd2) - plt.AddUint8(0x07) - plt.AddUint8(0xf0) - plt.AddUint8(0x30) - plt.AddUint8(0x10) - plt.AddUint8(0x08) - // lg %r1,16(%r1) - plt.AddUint8(0xe3) - plt.AddUint8(0x10) - plt.AddUint8(0x10) - plt.AddUint8(0x10) - plt.AddUint8(0x00) - plt.AddUint8(0x04) - // br %r1 - plt.AddUint8(0x07) - plt.AddUint8(0xf1) - // nopr %r0 - plt.AddUint8(0x07) - plt.AddUint8(0x00) - // nopr %r0 - plt.AddUint8(0x07) - plt.AddUint8(0x00) - // nopr %r0 - plt.AddUint8(0x07) - plt.AddUint8(0x00) - - // assume got->size == 0 too - got.AddAddrPlus(ctxt.Arch, ctxt.Syms.Lookup(".dynamic", 0), 0) - - got.AddUint64(ctxt.Arch, 0) - got.AddUint64(ctxt.Arch, 0) - } -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - return false -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - if ctxt.LinkMode == ld.LinkExternal { - return val, false - } - - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(ctxt.Syms.Lookup(".got", 0)), true - } - - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - switch r.Variant & sym.RV_TYPE_MASK { - default: - ld.Errorf(s, "unexpected relocation variant %d", r.Variant) - return t - - case sym.RV_NONE: - return t - - case sym.RV_390_DBL: - if (t & 1) != 0 { - ld.Errorf(s, "%s+%v is not 2-byte aligned", r.Sym.Name, r.Sym.Value) - } - return t >> 1 - } -} - -func addpltsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Plt() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - - if ctxt.IsELF { - plt := ctxt.Syms.Lookup(".plt", 0) - got := ctxt.Syms.Lookup(".got", 0) - rela := ctxt.Syms.Lookup(".rela.plt", 0) - if plt.Size == 0 { - elfsetupplt(ctxt) - } - // larl %r1,_GLOBAL_OFFSET_TABLE_+index - - plt.AddUint8(0xc0) - plt.AddUint8(0x10) - plt.AddPCRelPlus(ctxt.Arch, got, got.Size+6) // need variant? - - // add to got: pointer to current pos in plt - got.AddAddrPlus(ctxt.Arch, plt, plt.Size+8) // weird but correct - // lg %r1,0(%r1) - plt.AddUint8(0xe3) - plt.AddUint8(0x10) - plt.AddUint8(0x10) - plt.AddUint8(0x00) - plt.AddUint8(0x00) - plt.AddUint8(0x04) - // br %r1 - plt.AddUint8(0x07) - plt.AddUint8(0xf1) - // basr %r1,%r0 - plt.AddUint8(0x0d) - plt.AddUint8(0x10) - // lgf %r1,12(%r1) - plt.AddUint8(0xe3) - plt.AddUint8(0x10) - plt.AddUint8(0x10) - plt.AddUint8(0x0c) - plt.AddUint8(0x00) - plt.AddUint8(0x14) - // jg .plt - plt.AddUint8(0xc0) - plt.AddUint8(0xf4) - - plt.AddUint32(ctxt.Arch, uint32(-((plt.Size - 2) >> 1))) // roll-your-own relocation - //.plt index - plt.AddUint32(ctxt.Arch, uint32(rela.Size)) // rela size before current entry - - // rela - rela.AddAddrPlus(ctxt.Arch, got, got.Size-8) - - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_390_JMP_SLOT))) - rela.AddUint64(ctxt.Arch, 0) - - s.SetPlt(int32(plt.Size - 32)) - - } else { - ld.Errorf(s, "addpltsym: unsupported binary format") - } -} - -func addgotsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Got() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - got := ctxt.Syms.Lookup(".got", 0) - s.SetGot(int32(got.Size)) - got.AddUint64(ctxt.Arch, 0) - - if ctxt.IsELF { - rela := ctxt.Syms.Lookup(".rela", 0) - rela.AddAddrPlus(ctxt.Arch, got, int64(s.Got())) - rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(s.Dynid), uint32(elf.R_390_GLOB_DAT))) - rela.AddUint64(ctxt.Arch, 0) - } else { - ld.Errorf(s, "addgotsym: unsupported binary format") - } -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - sect := ld.Segtext.Sections[0] - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Codeblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - for _, sect = range ld.Segtext.Sections[1:] { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - if ld.Segrelrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - if !ctxt.IsELF { - ld.Errorf(nil, "unsupported executable format") - } - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - - ctxt.Out.SeekSet(int64(symo)) - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - ld.Errorf(nil, "unsupported operating system") - case objabi.Hlinux: - ld.Asmbelf(ctxt, int64(symo)) - } - - ctxt.Out.Flush() - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/oldlink/internal/s390x/l.go b/src/cmd/oldlink/internal/s390x/l.go deleted file mode 100644 index 87d10ee782..0000000000 --- a/src/cmd/oldlink/internal/s390x/l.go +++ /dev/null @@ -1,74 +0,0 @@ -// Inferno utils/5l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package s390x - -// Writing object files. - -// cmd/9l/l.h from Vita Nuova. -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -const ( - maxAlign = 32 // max data alignment - minAlign = 2 // min data alignment - funcAlign = 16 -) - -/* Used by ../internal/ld/dwarf.go */ -const ( - dwarfRegSP = 15 - dwarfRegLR = 14 -) diff --git a/src/cmd/oldlink/internal/s390x/obj.go b/src/cmd/oldlink/internal/s390x/obj.go deleted file mode 100644 index b4af86bd75..0000000000 --- a/src/cmd/oldlink/internal/s390x/obj.go +++ /dev/null @@ -1,88 +0,0 @@ -// Inferno utils/5l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/5l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package s390x - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.ArchS390X - - theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, - - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, // in asm.go - Asmb2: asmb2, // in asm.go - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Machoreloc1: machoreloc1, - - Linuxdynld: "/lib64/ld64.so.1", - - // not relevant for s390x - Freebsddynld: "XXX", - Openbsddynld: "XXX", - Netbsddynld: "XXX", - Dragonflydynld: "XXX", - Solarisdynld: "XXX", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - - case objabi.Hlinux: // s390x ELF - ld.Elfinit(ctxt) - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 0x10000 - } - } -} diff --git a/src/cmd/oldlink/internal/sym/attribute.go b/src/cmd/oldlink/internal/sym/attribute.go deleted file mode 100644 index 4b69bf32d0..0000000000 --- a/src/cmd/oldlink/internal/sym/attribute.go +++ /dev/null @@ -1,117 +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 sym - -// Attribute is a set of common symbol attributes. -type Attribute int32 - -const ( - // AttrDuplicateOK marks a symbol that can be present in multiple object - // files. - AttrDuplicateOK Attribute = 1 << iota - // AttrExternal marks function symbols loaded from host object files. - AttrExternal - // AttrNoSplit marks functions that cannot split the stack; the linker - // cares because it checks that there are no call chains of nosplit - // functions that require more than StackLimit bytes (see - // lib.go:dostkcheck) - AttrNoSplit - // AttrReachable marks symbols that are transitively referenced from the - // entry points. Unreachable symbols are not written to the output. - AttrReachable - // AttrCgoExportDynamic and AttrCgoExportStatic mark symbols referenced - // by directives written by cgo (in response to //export directives in - // the source). - AttrCgoExportDynamic - AttrCgoExportStatic - // AttrSpecial marks symbols that do not have their address (i.e. Value) - // computed by the usual mechanism of data.go:dodata() & - // data.go:address(). - AttrSpecial - // AttrStackCheck is used by dostkcheck to only check each NoSplit - // function's stack usage once. - AttrStackCheck - // AttrNotInSymbolTable marks symbols that are not written to the symbol table. - AttrNotInSymbolTable - // AttrOnList marks symbols that are on some list (such as the list of - // all text symbols, or one of the lists of data symbols) and is - // consulted to avoid bugs where a symbol is put on a list twice. - AttrOnList - // AttrLocal marks symbols that are only visible within the module - // (executable or shared library) being linked. Only relevant when - // dynamically linking Go code. - AttrLocal - // AttrReflectMethod marks certain methods from the reflect package that - // can be used to call arbitrary methods. If no symbol with this bit set - // is marked as reachable, more dead code elimination can be done. - AttrReflectMethod - // AttrMakeTypelink Amarks types that should be added to the typelink - // table. See typelinks.go:typelinks(). - AttrMakeTypelink - // AttrShared marks symbols compiled with the -shared option. - AttrShared - // AttrVisibilityHidden symbols are ELF symbols with - // visibility set to STV_HIDDEN. They become local symbols in - // the final executable. Only relevant when internally linking - // on an ELF platform. - AttrVisibilityHidden - // AttrSubSymbol mostly means that the symbol appears on the Sub list of some - // other symbol. Unfortunately, it's not 100% reliable; at least, it's not set - // correctly for the .TOC. symbol in Link.dodata. Usually the Outer field of the - // symbol points to the symbol whose list it is on, but that it is not set for the - // symbols added to .windynamic in initdynimport in pe.go. - // - // TODO(mwhudson): fix the inconsistencies noticed above. - // - // Sub lists are used when loading host objects (sections from the host object - // become regular linker symbols and symbols go on the Sub list of their section) - // and for constructing the global offset table when internally linking a dynamic - // executable. - // - // TODO(mwhudson): perhaps a better name for this is AttrNonGoSymbol. - AttrSubSymbol - // AttrContainer is set on text symbols that are present as the .Outer for some - // other symbol. - AttrContainer - // AttrTopFrame means that the function is an entry point and unwinders - // should stop when they hit this function. - AttrTopFrame - // AttrReadOnly indicates whether the symbol's content (Symbol.P) is backed by - // read-only memory. - AttrReadOnly - // 19 attributes defined so far. -) - -func (a Attribute) DuplicateOK() bool { return a&AttrDuplicateOK != 0 } -func (a Attribute) External() bool { return a&AttrExternal != 0 } -func (a Attribute) NoSplit() bool { return a&AttrNoSplit != 0 } -func (a Attribute) Reachable() bool { return a&AttrReachable != 0 } -func (a Attribute) CgoExportDynamic() bool { return a&AttrCgoExportDynamic != 0 } -func (a Attribute) CgoExportStatic() bool { return a&AttrCgoExportStatic != 0 } -func (a Attribute) Special() bool { return a&AttrSpecial != 0 } -func (a Attribute) StackCheck() bool { return a&AttrStackCheck != 0 } -func (a Attribute) NotInSymbolTable() bool { return a&AttrNotInSymbolTable != 0 } -func (a Attribute) OnList() bool { return a&AttrOnList != 0 } -func (a Attribute) Local() bool { return a&AttrLocal != 0 } -func (a Attribute) ReflectMethod() bool { return a&AttrReflectMethod != 0 } -func (a Attribute) MakeTypelink() bool { return a&AttrMakeTypelink != 0 } -func (a Attribute) Shared() bool { return a&AttrShared != 0 } -func (a Attribute) VisibilityHidden() bool { return a&AttrVisibilityHidden != 0 } -func (a Attribute) SubSymbol() bool { return a&AttrSubSymbol != 0 } -func (a Attribute) Container() bool { return a&AttrContainer != 0 } -func (a Attribute) TopFrame() bool { return a&AttrTopFrame != 0 } -func (a Attribute) ReadOnly() bool { return a&AttrReadOnly != 0 } - -func (a Attribute) CgoExport() bool { - return a.CgoExportDynamic() || a.CgoExportStatic() -} - -func (a *Attribute) Set(flag Attribute, value bool) { - if value { - *a |= flag - } else { - *a &^= flag - } -} diff --git a/src/cmd/oldlink/internal/sym/compilation_unit.go b/src/cmd/oldlink/internal/sym/compilation_unit.go deleted file mode 100644 index 02fb0cfab8..0000000000 --- a/src/cmd/oldlink/internal/sym/compilation_unit.go +++ /dev/null @@ -1,23 +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 sym - -import "cmd/internal/dwarf" - -// CompilationUnit is an abstraction used by DWARF to represent a chunk of -// debug-related data. We create a CompilationUnit per Object file in a -// library (so, one for all the Go code, one for each assembly file, etc.). -type CompilationUnit struct { - Pkg string // The package name, eg ("fmt", or "runtime") - Lib *Library // Our library - Consts *Symbol // Package constants DIEs - PCs []dwarf.Range // PC ranges, relative to Textp[0] - DWInfo *dwarf.DWDie // CU root DIE - FuncDIEs []*Symbol // Function DIE subtrees - AbsFnDIEs []*Symbol // Abstract function DIE subtrees - RangeSyms []*Symbol // Symbols for debug_range - Textp []*Symbol // Text symbols in this CU - DWARFFileTable []string // The file table used to generate the .debug_lines -} diff --git a/src/cmd/oldlink/internal/sym/library.go b/src/cmd/oldlink/internal/sym/library.go deleted file mode 100644 index 4f2023b8f7..0000000000 --- a/src/cmd/oldlink/internal/sym/library.go +++ /dev/null @@ -1,25 +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 sym - -type Library struct { - Objref string - Srcref string - File string - Pkg string - Shlib string - Hash string - ImportStrings []string - Imports []*Library - Textp []*Symbol // text symbols defined in this library - DupTextSyms []*Symbol // dupok text symbols defined in this library - Main bool - Safe bool - Units []*CompilationUnit -} - -func (l Library) String() string { - return l.Pkg -} diff --git a/src/cmd/oldlink/internal/sym/reloc.go b/src/cmd/oldlink/internal/sym/reloc.go deleted file mode 100644 index 4809db8c80..0000000000 --- a/src/cmd/oldlink/internal/sym/reloc.go +++ /dev/null @@ -1,128 +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 sym - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "debug/elf" -) - -// Reloc is a relocation. -// -// The typical Reloc rewrites part of a symbol at offset Off to address Sym. -// A Reloc is stored in a slice on the Symbol it rewrites. -// -// Relocations are generated by the compiler as the type -// cmd/internal/obj.Reloc, which is encoded into the object file wire -// format and decoded by the linker into this type. A separate type is -// used to hold linker-specific state about the relocation. -// -// Some relocations are created by cmd/link. -type Reloc struct { - Off int32 // offset to rewrite - Siz uint8 // number of bytes to rewrite, 1, 2, or 4 - Done bool // set to true when relocation is complete - Type objabi.RelocType // the relocation type - Add int64 // addend - Sym *Symbol // symbol the relocation addresses - *relocExt // extra fields (see below), may be nil, call InitExt before use -} - -// relocExt contains extra fields in Reloc that are used only in -// certain cases. -type relocExt struct { - Xadd int64 // addend passed to external linker - Xsym *Symbol // symbol passed to external linker - Variant RelocVariant // variation on Type, currently used only on PPC64 and S390X -} - -func (r *Reloc) InitExt() { - if r.relocExt == nil { - r.relocExt = new(relocExt) - } -} - -// RelocVariant is a linker-internal variation on a relocation. -type RelocVariant uint8 - -const ( - RV_NONE RelocVariant = iota - RV_POWER_LO - RV_POWER_HI - RV_POWER_HA - RV_POWER_DS - - // RV_390_DBL is a s390x-specific relocation variant that indicates that - // the value to be placed into the relocatable field should first be - // divided by 2. - RV_390_DBL - - RV_CHECK_OVERFLOW RelocVariant = 1 << 7 - RV_TYPE_MASK RelocVariant = RV_CHECK_OVERFLOW - 1 -) - -func RelocName(arch *sys.Arch, r objabi.RelocType) string { - // We didn't have some relocation types at Go1.4. - // Uncomment code when we include those in bootstrap code. - - switch { - case r >= objabi.MachoRelocOffset: // Mach-O - // nr := (r - objabi.MachoRelocOffset)>>1 - // switch ctxt.Arch.Family { - // case sys.AMD64: - // return macho.RelocTypeX86_64(nr).String() - // case sys.ARM: - // return macho.RelocTypeARM(nr).String() - // case sys.ARM64: - // return macho.RelocTypeARM64(nr).String() - // case sys.I386: - // return macho.RelocTypeGeneric(nr).String() - // default: - // panic("unreachable") - // } - case r >= objabi.ElfRelocOffset: // ELF - nr := r - objabi.ElfRelocOffset - switch arch.Family { - case sys.AMD64: - return elf.R_X86_64(nr).String() - case sys.ARM: - return elf.R_ARM(nr).String() - case sys.ARM64: - return elf.R_AARCH64(nr).String() - case sys.I386: - return elf.R_386(nr).String() - case sys.MIPS, sys.MIPS64: - return elf.R_MIPS(nr).String() - case sys.PPC64: - return elf.R_PPC64(nr).String() - case sys.S390X: - return elf.R_390(nr).String() - default: - panic("unreachable") - } - } - - return r.String() -} - -// RelocByOff implements sort.Interface for sorting relocations by offset. -type RelocByOff []Reloc - -func (x RelocByOff) Len() int { return len(x) } - -func (x RelocByOff) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x RelocByOff) Less(i, j int) bool { - a := &x[i] - b := &x[j] - if a.Off < b.Off { - return true - } - if a.Off > b.Off { - return false - } - return false -} diff --git a/src/cmd/oldlink/internal/sym/segment.go b/src/cmd/oldlink/internal/sym/segment.go deleted file mode 100644 index d5255bf142..0000000000 --- a/src/cmd/oldlink/internal/sym/segment.go +++ /dev/null @@ -1,58 +0,0 @@ -// Inferno utils/8l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/8l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package sym - -// Terrible but standard terminology. -// A segment describes a block of file to load into memory. -// A section further describes the pieces of that block for -// use in debuggers and such. - -type Segment struct { - Rwx uint8 // permission as usual unix bits (5 = r-x etc) - Vaddr uint64 // virtual address - Length uint64 // length in memory - Fileoff uint64 // file offset - Filelen uint64 // length on disk - Sections []*Section -} - -type Section struct { - Rwx uint8 - Extnum int16 - Align int32 - Name string - Vaddr uint64 - Length uint64 - Seg *Segment - Elfsect interface{} // an *ld.ElfShdr - Reloff uint64 - Rellen uint64 -} diff --git a/src/cmd/oldlink/internal/sym/sizeof_test.go b/src/cmd/oldlink/internal/sym/sizeof_test.go deleted file mode 100644 index e6e3916dad..0000000000 --- a/src/cmd/oldlink/internal/sym/sizeof_test.go +++ /dev/null @@ -1,37 +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 sym - -import ( - "reflect" - "testing" - "unsafe" -) - -// Assert that the size of important structures do not change unexpectedly. - -func TestSizeof(t *testing.T) { - const nbit = unsafe.Sizeof(uintptr(0)) * 8 - const _64bit = nbit == 64 - - var tests = []struct { - val interface{} // type as a value - _32bit uintptr // size on 32bit platforms - _64bit uintptr // size on 64bit platforms - }{ - {Symbol{}, 108, 176}, - } - - for _, tt := range tests { - want := tt._32bit - if _64bit { - want = tt._64bit - } - got := reflect.TypeOf(tt.val).Size() - if want != got { - t.Errorf("%d bit unsafe.Sizeof(%T) = %d, want %d", nbit, tt.val, got, want) - } - } -} diff --git a/src/cmd/oldlink/internal/sym/symbol.go b/src/cmd/oldlink/internal/sym/symbol.go deleted file mode 100644 index 2756acd211..0000000000 --- a/src/cmd/oldlink/internal/sym/symbol.go +++ /dev/null @@ -1,543 +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 sym - -import ( - "cmd/internal/obj" - "cmd/internal/objabi" - "cmd/internal/sys" - "debug/elf" - "fmt" - "log" -) - -// Symbol is an entry in the symbol table. -type Symbol struct { - Name string - Type SymKind - Version int16 - Attr Attribute - Dynid int32 - Align int32 - Elfsym int32 - LocalElfsym int32 - Value int64 - Size int64 - Sub *Symbol - Outer *Symbol - Gotype *Symbol - File string // actually package! - auxinfo *AuxSymbol - Sect *Section - FuncInfo *FuncInfo - Unit *CompilationUnit - // P contains the raw symbol data. - P []byte - R []Reloc -} - -// AuxSymbol contains less-frequently used sym.Symbol fields. -type AuxSymbol struct { - extname string - dynimplib string - dynimpvers string - localentry uint8 - plt int32 - got int32 - // ElfType is set for symbols read from shared libraries by ldshlibsyms. It - // is not set for symbols defined by the packages being linked or by symbols - // read by ldelf (and so is left as elf.STT_NOTYPE). - elftype elf.SymType -} - -const ( - SymVerABI0 = 0 - SymVerABIInternal = 1 - SymVerStatic = 10 // Minimum version used by static (file-local) syms -) - -func ABIToVersion(abi obj.ABI) int { - switch abi { - case obj.ABI0: - return SymVerABI0 - case obj.ABIInternal: - return SymVerABIInternal - } - return -1 -} - -func VersionToABI(v int) (obj.ABI, bool) { - switch v { - case SymVerABI0: - return obj.ABI0, true - case SymVerABIInternal: - return obj.ABIInternal, true - } - return ^obj.ABI(0), false -} - -func (s *Symbol) String() string { - if s.Version == 0 { - return s.Name - } - return fmt.Sprintf("%s<%d>", s.Name, s.Version) -} - -func (s *Symbol) IsFileLocal() bool { - return s.Version >= SymVerStatic -} - -func (s *Symbol) ElfsymForReloc() int32 { - // If putelfsym created a local version of this symbol, use that in all - // relocations. - if s.LocalElfsym != 0 { - return s.LocalElfsym - } else { - return s.Elfsym - } -} - -func (s *Symbol) Length(_ interface{}) int64 { - return s.Size -} - -func (s *Symbol) Grow(siz int64) { - if int64(int(siz)) != siz { - log.Fatalf("symgrow size %d too long", siz) - } - if int64(len(s.P)) >= siz { - return - } - if cap(s.P) < int(siz) { - p := make([]byte, 2*(siz+1)) - s.P = append(p[:0], s.P...) - } - s.P = s.P[:siz] -} - -func (s *Symbol) AddBytes(bytes []byte) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - s.P = append(s.P, bytes...) - s.Size = int64(len(s.P)) - - return s.Size -} - -func (s *Symbol) AddUint8(v uint8) int64 { - off := s.Size - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - s.Size++ - s.P = append(s.P, v) - - return off -} - -func (s *Symbol) AddUint16(arch *sys.Arch, v uint16) int64 { - return s.AddUintXX(arch, uint64(v), 2) -} - -func (s *Symbol) AddUint32(arch *sys.Arch, v uint32) int64 { - return s.AddUintXX(arch, uint64(v), 4) -} - -func (s *Symbol) AddUint64(arch *sys.Arch, v uint64) int64 { - return s.AddUintXX(arch, v, 8) -} - -func (s *Symbol) AddUint(arch *sys.Arch, v uint64) int64 { - return s.AddUintXX(arch, v, arch.PtrSize) -} - -func (s *Symbol) SetUint8(arch *sys.Arch, r int64, v uint8) int64 { - return s.setUintXX(arch, r, uint64(v), 1) -} - -func (s *Symbol) SetUint16(arch *sys.Arch, r int64, v uint16) int64 { - return s.setUintXX(arch, r, uint64(v), 2) -} - -func (s *Symbol) SetUint32(arch *sys.Arch, r int64, v uint32) int64 { - return s.setUintXX(arch, r, uint64(v), 4) -} - -func (s *Symbol) SetUint(arch *sys.Arch, r int64, v uint64) int64 { - return s.setUintXX(arch, r, v, int64(arch.PtrSize)) -} - -func (s *Symbol) addAddrPlus(arch *sys.Arch, t *Symbol, add int64, typ objabi.RelocType) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - i := s.Size - s.Size += int64(arch.PtrSize) - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Siz = uint8(arch.PtrSize) - r.Type = typ - r.Add = add - return i + int64(r.Siz) -} - -func (s *Symbol) AddAddrPlus(arch *sys.Arch, t *Symbol, add int64) int64 { - return s.addAddrPlus(arch, t, add, objabi.R_ADDR) -} - -func (s *Symbol) AddCURelativeAddrPlus(arch *sys.Arch, t *Symbol, add int64) int64 { - return s.addAddrPlus(arch, t, add, objabi.R_ADDRCUOFF) -} - -func (s *Symbol) AddPCRelPlus(arch *sys.Arch, t *Symbol, add int64) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - i := s.Size - s.Size += 4 - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Add = add - r.Type = objabi.R_PCREL - r.Siz = 4 - if arch.Family == sys.S390X || arch.Family == sys.PPC64 { - r.InitExt() - } - if arch.Family == sys.S390X { - r.Variant = RV_390_DBL - } - return i + int64(r.Siz) -} - -func (s *Symbol) AddAddr(arch *sys.Arch, t *Symbol) int64 { - return s.AddAddrPlus(arch, t, 0) -} - -func (s *Symbol) SetAddrPlus(arch *sys.Arch, off int64, t *Symbol, add int64) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - if off+int64(arch.PtrSize) > s.Size { - s.Size = off + int64(arch.PtrSize) - s.Grow(s.Size) - } - - r := s.AddRel() - r.Sym = t - r.Off = int32(off) - r.Siz = uint8(arch.PtrSize) - r.Type = objabi.R_ADDR - r.Add = add - return off + int64(r.Siz) -} - -func (s *Symbol) SetAddr(arch *sys.Arch, off int64, t *Symbol) int64 { - return s.SetAddrPlus(arch, off, t, 0) -} - -func (s *Symbol) AddSize(arch *sys.Arch, t *Symbol) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - i := s.Size - s.Size += int64(arch.PtrSize) - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Siz = uint8(arch.PtrSize) - r.Type = objabi.R_SIZE - return i + int64(r.Siz) -} - -func (s *Symbol) AddAddrPlus4(t *Symbol, add int64) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - i := s.Size - s.Size += 4 - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Siz = 4 - r.Type = objabi.R_ADDR - r.Add = add - return i + int64(r.Siz) -} - -func (s *Symbol) AddRel() *Reloc { - s.R = append(s.R, Reloc{}) - return &s.R[len(s.R)-1] -} - -func (s *Symbol) AddUintXX(arch *sys.Arch, v uint64, wid int) int64 { - off := s.Size - s.setUintXX(arch, off, v, int64(wid)) - return off -} - -func (s *Symbol) setUintXX(arch *sys.Arch, off int64, v uint64, wid int64) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - if s.Size < off+wid { - s.Size = off + wid - s.Grow(s.Size) - } - - switch wid { - case 1: - s.P[off] = uint8(v) - case 2: - arch.ByteOrder.PutUint16(s.P[off:], uint16(v)) - case 4: - arch.ByteOrder.PutUint32(s.P[off:], uint32(v)) - case 8: - arch.ByteOrder.PutUint64(s.P[off:], v) - } - - return off + wid -} - -func (s *Symbol) makeAuxInfo() { - if s.auxinfo == nil { - s.auxinfo = &AuxSymbol{extname: s.Name, plt: -1, got: -1} - } -} - -func (s *Symbol) Extname() string { - if s.auxinfo == nil { - return s.Name - } - return s.auxinfo.extname -} - -func (s *Symbol) SetExtname(n string) { - if s.auxinfo == nil { - if s.Name == n { - return - } - s.makeAuxInfo() - } - s.auxinfo.extname = n -} - -func (s *Symbol) Dynimplib() string { - if s.auxinfo == nil { - return "" - } - return s.auxinfo.dynimplib -} - -func (s *Symbol) Dynimpvers() string { - if s.auxinfo == nil { - return "" - } - return s.auxinfo.dynimpvers -} - -func (s *Symbol) SetDynimplib(lib string) { - if s.auxinfo == nil { - s.makeAuxInfo() - } - s.auxinfo.dynimplib = lib -} - -func (s *Symbol) SetDynimpvers(vers string) { - if s.auxinfo == nil { - s.makeAuxInfo() - } - s.auxinfo.dynimpvers = vers -} - -func (s *Symbol) ResetDyninfo() { - if s.auxinfo != nil { - s.auxinfo.dynimplib = "" - s.auxinfo.dynimpvers = "" - } -} - -func (s *Symbol) Localentry() uint8 { - if s.auxinfo == nil { - return 0 - } - return s.auxinfo.localentry -} - -func (s *Symbol) SetLocalentry(val uint8) { - if s.auxinfo == nil { - if val != 0 { - return - } - s.makeAuxInfo() - } - s.auxinfo.localentry = val -} - -func (s *Symbol) Plt() int32 { - if s.auxinfo == nil { - return -1 - } - return s.auxinfo.plt -} - -func (s *Symbol) SetPlt(val int32) { - if s.auxinfo == nil { - if val == -1 { - return - } - s.makeAuxInfo() - } - s.auxinfo.plt = val -} - -func (s *Symbol) Got() int32 { - if s.auxinfo == nil { - return -1 - } - return s.auxinfo.got -} - -func (s *Symbol) SetGot(val int32) { - if s.auxinfo == nil { - if val == -1 { - return - } - s.makeAuxInfo() - } - s.auxinfo.got = val -} - -func (s *Symbol) ElfType() elf.SymType { - if s.auxinfo == nil { - return elf.STT_NOTYPE - } - return s.auxinfo.elftype -} - -func (s *Symbol) SetElfType(val elf.SymType) { - if s.auxinfo == nil { - if val == elf.STT_NOTYPE { - return - } - s.makeAuxInfo() - } - s.auxinfo.elftype = val -} - -// SortSub sorts a linked-list (by Sub) of *Symbol by Value. -// Used for sub-symbols when loading host objects (see e.g. ldelf.go). -func SortSub(l *Symbol) *Symbol { - if l == nil || l.Sub == nil { - return l - } - - l1 := l - l2 := l - for { - l2 = l2.Sub - if l2 == nil { - break - } - l2 = l2.Sub - if l2 == nil { - break - } - l1 = l1.Sub - } - - l2 = l1.Sub - l1.Sub = nil - l1 = SortSub(l) - l2 = SortSub(l2) - - /* set up lead element */ - if l1.Value < l2.Value { - l = l1 - l1 = l1.Sub - } else { - l = l2 - l2 = l2.Sub - } - - le := l - - for { - if l1 == nil { - for l2 != nil { - le.Sub = l2 - le = l2 - l2 = l2.Sub - } - - le.Sub = nil - break - } - - if l2 == nil { - for l1 != nil { - le.Sub = l1 - le = l1 - l1 = l1.Sub - } - - break - } - - if l1.Value < l2.Value { - le.Sub = l1 - le = l1 - l1 = l1.Sub - } else { - le.Sub = l2 - le = l2 - l2 = l2.Sub - } - } - - le.Sub = nil - return l -} - -type FuncInfo struct { - Args int32 - Locals int32 - Pcsp Pcdata - Pcfile Pcdata - Pcline Pcdata - Pcinline Pcdata - Pcdata []Pcdata - Funcdata []*Symbol - Funcdataoff []int64 - File []*Symbol - InlTree []InlinedCall -} - -// InlinedCall is a node in a local inlining tree (FuncInfo.InlTree). -type InlinedCall struct { - Parent int32 // index of parent in InlTree - File *Symbol // file of the inlined call - Line int32 // line number of the inlined call - Func string // name of the function that was inlined - ParentPC int32 // PC of the instruction just before the inlined body (offset from function start) -} - -type Pcdata struct { - P []byte -} diff --git a/src/cmd/oldlink/internal/sym/symbols.go b/src/cmd/oldlink/internal/sym/symbols.go deleted file mode 100644 index e772496534..0000000000 --- a/src/cmd/oldlink/internal/sym/symbols.go +++ /dev/null @@ -1,135 +0,0 @@ -// Derived from Inferno utils/6l/l.h and related files. -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package sym - -type Symbols struct { - symbolBatch []Symbol - - // Symbol lookup based on name and indexed by version. - hash []map[string]*Symbol - - Allsym []*Symbol -} - -func NewSymbols() *Symbols { - hash := make([]map[string]*Symbol, SymVerStatic) - // Preallocate about 2mb for hash of non static symbols - hash[0] = make(map[string]*Symbol, 100000) - // And another 1mb for internal ABI text symbols. - hash[SymVerABIInternal] = make(map[string]*Symbol, 50000) - return &Symbols{ - hash: hash, - Allsym: make([]*Symbol, 0, 100000), - } -} - -func (syms *Symbols) Newsym(name string, v int) *Symbol { - batch := syms.symbolBatch - if len(batch) == 0 { - batch = make([]Symbol, 1000) - } - s := &batch[0] - syms.symbolBatch = batch[1:] - - s.Dynid = -1 - s.Name = name - s.Version = int16(v) - syms.Allsym = append(syms.Allsym, s) - - return s -} - -// Look up the symbol with the given name and version, creating the -// symbol if it is not found. -func (syms *Symbols) Lookup(name string, v int) *Symbol { - m := syms.hash[v] - s := m[name] - if s != nil { - return s - } - s = syms.Newsym(name, v) - m[name] = s - return s -} - -// Look up the symbol with the given name and version, returning nil -// if it is not found. -func (syms *Symbols) ROLookup(name string, v int) *Symbol { - return syms.hash[v][name] -} - -// Add an existing symbol to the symbol table. -func (syms *Symbols) Add(s *Symbol) { - name := s.Name - v := int(s.Version) - m := syms.hash[v] - if _, ok := m[name]; ok { - panic(name + " already added") - } - m[name] = s -} - -// Allocate a new version (i.e. symbol namespace). -func (syms *Symbols) IncVersion() int { - syms.hash = append(syms.hash, make(map[string]*Symbol)) - return len(syms.hash) - 1 -} - -// Rename renames a symbol. -func (syms *Symbols) Rename(old, new string, v int, reachparent map[*Symbol]*Symbol) { - s := syms.hash[v][old] - oldExtName := s.Extname() - s.Name = new - if oldExtName == old { - s.SetExtname(new) - } - delete(syms.hash[v], old) - - dup := syms.hash[v][new] - if dup == nil { - syms.hash[v][new] = s - } else { - if s.Type == 0 { - dup.Attr |= s.Attr - if s.Attr.Reachable() && reachparent != nil { - reachparent[dup] = reachparent[s] - } - *s = *dup - } else if dup.Type == 0 { - s.Attr |= dup.Attr - if dup.Attr.Reachable() && reachparent != nil { - reachparent[s] = reachparent[dup] - } - *dup = *s - syms.hash[v][new] = s - } - } -} diff --git a/src/cmd/oldlink/internal/sym/symkind.go b/src/cmd/oldlink/internal/sym/symkind.go deleted file mode 100644 index 1933dd7b21..0000000000 --- a/src/cmd/oldlink/internal/sym/symkind.go +++ /dev/null @@ -1,168 +0,0 @@ -// Derived from Inferno utils/6l/l.h and related files. -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package sym - -// A SymKind describes the kind of memory represented by a symbol. -type SymKind uint8 - -// Defined SymKind values. -// -// TODO(rsc): Give idiomatic Go names. -//go:generate stringer -type=SymKind -const ( - Sxxx SymKind = iota - STEXT - SELFRXSECT - - // Read-only sections. - STYPE - SSTRING - SGOSTRING - SGOFUNC - SGCBITS - SRODATA - SFUNCTAB - - SELFROSECT - SMACHOPLT - - // Read-only sections with relocations. - // - // Types STYPE-SFUNCTAB above are written to the .rodata section by default. - // When linking a shared object, some conceptually "read only" types need to - // be written to by relocations and putting them in a section called - // ".rodata" interacts poorly with the system linkers. The GNU linkers - // support this situation by arranging for sections of the name - // ".data.rel.ro.XXX" to be mprotected read only by the dynamic linker after - // relocations have applied, so when the Go linker is creating a shared - // object it checks all objects of the above types and bumps any object that - // has a relocation to it to the corresponding type below, which are then - // written to sections with appropriate magic names. - STYPERELRO - SSTRINGRELRO - SGOSTRINGRELRO - SGOFUNCRELRO - SGCBITSRELRO - SRODATARELRO - SFUNCTABRELRO - - // Part of .data.rel.ro if it exists, otherwise part of .rodata. - STYPELINK - SITABLINK - SSYMTAB - SPCLNTAB - - // Writable sections. - SFirstWritable - SBUILDINFO - SELFSECT - SMACHO - SMACHOGOT - SWINDOWS - SELFGOT - SNOPTRDATA - SINITARR - SDATA - SXCOFFTOC - SBSS - SNOPTRBSS - SLIBFUZZER_EXTRA_COUNTER - STLSBSS - SXREF - SMACHOSYMSTR - SMACHOSYMTAB - SMACHOINDIRECTPLT - SMACHOINDIRECTGOT - SFILEPATH - SCONST - SDYNIMPORT - SHOSTOBJ - SUNDEFEXT // Undefined symbol for resolution by external linker - - // Sections for debugging information - SDWARFSECT - SDWARFINFO - SDWARFRANGE - SDWARFLOC - SDWARFLINES - - // ABI aliases (these never appear in the output) - SABIALIAS -) - -// AbiSymKindToSymKind maps values read from object files (which are -// of type cmd/internal/objabi.SymKind) to values of type SymKind. -var AbiSymKindToSymKind = [...]SymKind{ - Sxxx, - STEXT, - SRODATA, - SNOPTRDATA, - SDATA, - SBSS, - SNOPTRBSS, - STLSBSS, - SDWARFINFO, - SDWARFRANGE, - SDWARFLOC, - SDWARFLINES, - SABIALIAS, - SLIBFUZZER_EXTRA_COUNTER, -} - -// ReadOnly are the symbol kinds that form read-only sections. In some -// cases, if they will require relocations, they are transformed into -// rel-ro sections using relROMap. -var ReadOnly = []SymKind{ - STYPE, - SSTRING, - SGOSTRING, - SGOFUNC, - SGCBITS, - SRODATA, - SFUNCTAB, -} - -// RelROMap describes the transformation of read-only symbols to rel-ro -// symbols. -var RelROMap = map[SymKind]SymKind{ - STYPE: STYPERELRO, - SSTRING: SSTRINGRELRO, - SGOSTRING: SGOSTRINGRELRO, - SGOFUNC: SGOFUNCRELRO, - SGCBITS: SGCBITSRELRO, - SRODATA: SRODATARELRO, - SFUNCTAB: SFUNCTABRELRO, -} - -// IsData returns true if the type is a data type. -func (t SymKind) IsData() bool { - return t == SDATA || t == SNOPTRDATA || t == SBSS || t == SNOPTRBSS -} diff --git a/src/cmd/oldlink/internal/sym/symkind_string.go b/src/cmd/oldlink/internal/sym/symkind_string.go deleted file mode 100644 index 97af9925d5..0000000000 --- a/src/cmd/oldlink/internal/sym/symkind_string.go +++ /dev/null @@ -1,76 +0,0 @@ -// Code generated by "stringer -type=SymKind symkind.go"; DO NOT EDIT. - -package sym - -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[Sxxx-0] - _ = x[STEXT-1] - _ = x[SELFRXSECT-2] - _ = x[STYPE-3] - _ = x[SSTRING-4] - _ = x[SGOSTRING-5] - _ = x[SGOFUNC-6] - _ = x[SGCBITS-7] - _ = x[SRODATA-8] - _ = x[SFUNCTAB-9] - _ = x[SELFROSECT-10] - _ = x[SMACHOPLT-11] - _ = x[STYPERELRO-12] - _ = x[SSTRINGRELRO-13] - _ = x[SGOSTRINGRELRO-14] - _ = x[SGOFUNCRELRO-15] - _ = x[SGCBITSRELRO-16] - _ = x[SRODATARELRO-17] - _ = x[SFUNCTABRELRO-18] - _ = x[STYPELINK-19] - _ = x[SITABLINK-20] - _ = x[SSYMTAB-21] - _ = x[SPCLNTAB-22] - _ = x[SFirstWritable-23] - _ = x[SBUILDINFO-24] - _ = x[SELFSECT-25] - _ = x[SMACHO-26] - _ = x[SMACHOGOT-27] - _ = x[SWINDOWS-28] - _ = x[SELFGOT-29] - _ = x[SNOPTRDATA-30] - _ = x[SINITARR-31] - _ = x[SDATA-32] - _ = x[SXCOFFTOC-33] - _ = x[SBSS-34] - _ = x[SNOPTRBSS-35] - _ = x[SLIBFUZZER_EXTRA_COUNTER-36] - _ = x[STLSBSS-37] - _ = x[SXREF-38] - _ = x[SMACHOSYMSTR-39] - _ = x[SMACHOSYMTAB-40] - _ = x[SMACHOINDIRECTPLT-41] - _ = x[SMACHOINDIRECTGOT-42] - _ = x[SFILEPATH-43] - _ = x[SCONST-44] - _ = x[SDYNIMPORT-45] - _ = x[SHOSTOBJ-46] - _ = x[SUNDEFEXT-47] - _ = x[SDWARFSECT-48] - _ = x[SDWARFINFO-49] - _ = x[SDWARFRANGE-50] - _ = x[SDWARFLOC-51] - _ = x[SDWARFLINES-52] - _ = x[SABIALIAS-53] -} - -const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_EXTRA_COUNTERSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSCONSTSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFINFOSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS" - -var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 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, 337, 344, 349, 361, 373, 390, 407, 416, 422, 432, 440, 449, 459, 469, 480, 489, 500, 509} - -func (i SymKind) String() string { - if i >= SymKind(len(_SymKind_index)-1) { - return "SymKind(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _SymKind_name[_SymKind_index[i]:_SymKind_index[i+1]] -} diff --git a/src/cmd/oldlink/internal/wasm/asm.go b/src/cmd/oldlink/internal/wasm/asm.go deleted file mode 100644 index 35bc7b1c95..0000000000 --- a/src/cmd/oldlink/internal/wasm/asm.go +++ /dev/null @@ -1,583 +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 wasm - -import ( - "bytes" - "cmd/internal/objabi" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "io" - "regexp" -) - -const ( - I32 = 0x7F - I64 = 0x7E - F32 = 0x7D - F64 = 0x7C -) - -const ( - sectionCustom = 0 - sectionType = 1 - sectionImport = 2 - sectionFunction = 3 - sectionTable = 4 - sectionMemory = 5 - sectionGlobal = 6 - sectionExport = 7 - sectionStart = 8 - sectionElement = 9 - sectionCode = 10 - sectionData = 11 -) - -// funcValueOffset is the offset between the PC_F value of a function and the index of the function in WebAssembly -const funcValueOffset = 0x1000 // TODO(neelance): make function addresses play nice with heap addresses - -func gentext(ctxt *ld.Link) { -} - -type wasmFunc struct { - Name string - Type uint32 - Code []byte -} - -type wasmFuncType struct { - Params []byte - Results []byte -} - -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.wasmMove": {Params: []byte{I32, I32, I32}}, // dst, src, len - "runtime.wasmZero": {Params: []byte{I32, I32}}, // ptr, len - "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 -} - -func assignAddress(ctxt *ld.Link, sect *sym.Section, n int, s *sym.Symbol, va uint64, isTramp bool) (*sym.Section, int, uint64) { - // WebAssembly functions do not live in the same address space as the linear memory. - // Instead, WebAssembly automatically assigns indices. Imported functions (section "import") - // have indices 0 to n. They are followed by native functions (sections "function" and "code") - // with indices n+1 and following. - // - // The following rules describe how wasm handles function indices and addresses: - // PC_F = funcValueOffset + WebAssembly function index (not including the imports) - // s.Value = PC = PC_F<<16 + PC_B - // - // The funcValueOffset is necessary to avoid conflicts with expectations - // that the Go runtime has about function addresses. - // The field "s.Value" corresponds to the concept of PC at runtime. - // However, there is no PC register, only PC_F and PC_B. PC_F denotes the function, - // PC_B the resume point inside of that function. The entry of the function has PC_B = 0. - s.Sect = sect - s.Value = int64(funcValueOffset+va/ld.MINFUNC) << 16 // va starts at zero - va += uint64(ld.MINFUNC) - return sect, n, va -} - -func asmb(ctxt *ld.Link) {} // dummy - -// asmb writes the final WebAssembly module binary. -// Spec: https://webassembly.github.io/spec/core/binary/modules.html -func asmb2(ctxt *ld.Link) { - types := []*wasmFuncType{ - // For normal Go functions, the single parameter is PC_B, - // the return value is - // 0 if the function returned normally or - // 1 if the stack needs to be unwound. - {Params: []byte{I32}, Results: []byte{I32}}, - } - - // collect host imports (functions that get imported from the WebAssembly host, usually JavaScript) - hostImports := []*wasmFunc{ - { - Name: "debug", - Type: lookupType(&wasmFuncType{Params: []byte{I32}}, &types), - }, - } - hostImportMap := make(map[*sym.Symbol]int64) - for _, fn := range ctxt.Textp { - for _, r := range fn.R { - if r.Type == objabi.R_WASMIMPORT { - hostImportMap[r.Sym] = int64(len(hostImports)) - hostImports = append(hostImports, &wasmFunc{ - Name: r.Sym.Name, - Type: lookupType(&wasmFuncType{Params: []byte{I32}}, &types), - }) - } - } - } - - // collect functions with WebAssembly body - var buildid []byte - fns := make([]*wasmFunc, len(ctxt.Textp)) - for i, fn := range ctxt.Textp { - wfn := new(bytes.Buffer) - if fn.Name == "go.buildid" { - writeUleb128(wfn, 0) // number of sets of locals - writeI32Const(wfn, 0) - wfn.WriteByte(0x0b) // end - buildid = fn.P - } else { - // Relocations have variable length, handle them here. - off := int32(0) - for _, r := range fn.R { - wfn.Write(fn.P[off:r.Off]) - off = r.Off - switch r.Type { - case objabi.R_ADDR: - writeSleb128(wfn, r.Sym.Value+r.Add) - case objabi.R_CALL: - writeSleb128(wfn, int64(len(hostImports))+r.Sym.Value>>16-funcValueOffset) - case objabi.R_WASMIMPORT: - writeSleb128(wfn, hostImportMap[r.Sym]) - default: - ld.Errorf(fn, "bad reloc type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) - continue - } - } - wfn.Write(fn.P[off:]) - } - - typ := uint32(0) - if sig, ok := wasmFuncTypes[fn.Name]; ok { - typ = lookupType(sig, &types) - } - - name := nameRegexp.ReplaceAllString(fn.Name, "_") - fns[i] = &wasmFunc{Name: name, Type: typ, Code: wfn.Bytes()} - } - - ctxt.Out.Write([]byte{0x00, 0x61, 0x73, 0x6d}) // magic - ctxt.Out.Write([]byte{0x01, 0x00, 0x00, 0x00}) // version - - // Add any buildid early in the binary: - if len(buildid) != 0 { - writeBuildID(ctxt, buildid) - } - - writeTypeSec(ctxt, types) - writeImportSec(ctxt, hostImports) - writeFunctionSec(ctxt, fns) - writeTableSec(ctxt, fns) - writeMemorySec(ctxt) - writeGlobalSec(ctxt) - writeExportSec(ctxt, len(hostImports)) - writeElementSec(ctxt, uint64(len(hostImports)), uint64(len(fns))) - writeCodeSec(ctxt, fns) - writeDataSec(ctxt) - writeProducerSec(ctxt) - if !*ld.FlagS { - writeNameSec(ctxt, len(hostImports), fns) - } - - ctxt.Out.Flush() -} - -func lookupType(sig *wasmFuncType, types *[]*wasmFuncType) uint32 { - for i, t := range *types { - if bytes.Equal(sig.Params, t.Params) && bytes.Equal(sig.Results, t.Results) { - return uint32(i) - } - } - *types = append(*types, sig) - return uint32(len(*types) - 1) -} - -func writeSecHeader(ctxt *ld.Link, id uint8) int64 { - ctxt.Out.WriteByte(id) - sizeOffset := ctxt.Out.Offset() - ctxt.Out.Write(make([]byte, 5)) // placeholder for length - return sizeOffset -} - -func writeSecSize(ctxt *ld.Link, sizeOffset int64) { - endOffset := ctxt.Out.Offset() - ctxt.Out.SeekSet(sizeOffset) - writeUleb128FixedLength(ctxt.Out, uint64(endOffset-sizeOffset-5), 5) - ctxt.Out.SeekSet(endOffset) -} - -func writeBuildID(ctxt *ld.Link, buildid []byte) { - sizeOffset := writeSecHeader(ctxt, sectionCustom) - writeName(ctxt.Out, "go.buildid") - ctxt.Out.Write(buildid) - writeSecSize(ctxt, sizeOffset) -} - -// writeTypeSec writes the section that declares all function types -// so they can be referenced by index. -func writeTypeSec(ctxt *ld.Link, types []*wasmFuncType) { - sizeOffset := writeSecHeader(ctxt, sectionType) - - writeUleb128(ctxt.Out, uint64(len(types))) - - for _, t := range types { - ctxt.Out.WriteByte(0x60) // functype - writeUleb128(ctxt.Out, uint64(len(t.Params))) - for _, v := range t.Params { - ctxt.Out.WriteByte(byte(v)) - } - writeUleb128(ctxt.Out, uint64(len(t.Results))) - for _, v := range t.Results { - ctxt.Out.WriteByte(byte(v)) - } - } - - writeSecSize(ctxt, sizeOffset) -} - -// writeImportSec writes the section that lists the functions that get -// imported from the WebAssembly host, usually JavaScript. -func writeImportSec(ctxt *ld.Link, hostImports []*wasmFunc) { - sizeOffset := writeSecHeader(ctxt, sectionImport) - - 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 - writeName(ctxt.Out, fn.Name) - ctxt.Out.WriteByte(0x00) // func import - writeUleb128(ctxt.Out, uint64(fn.Type)) - } - - writeSecSize(ctxt, sizeOffset) -} - -// writeFunctionSec writes the section that declares the types of functions. -// The bodies of these functions will later be provided in the "code" section. -func writeFunctionSec(ctxt *ld.Link, fns []*wasmFunc) { - sizeOffset := writeSecHeader(ctxt, sectionFunction) - - writeUleb128(ctxt.Out, uint64(len(fns))) - for _, fn := range fns { - writeUleb128(ctxt.Out, uint64(fn.Type)) - } - - writeSecSize(ctxt, sizeOffset) -} - -// writeTableSec writes the section that declares tables. Currently there is only a single table -// that is used by the CallIndirect operation to dynamically call any function. -// The contents of the table get initialized by the "element" section. -func writeTableSec(ctxt *ld.Link, fns []*wasmFunc) { - sizeOffset := writeSecHeader(ctxt, sectionTable) - - numElements := uint64(funcValueOffset + len(fns)) - writeUleb128(ctxt.Out, 1) // number of tables - ctxt.Out.WriteByte(0x70) // type: anyfunc - ctxt.Out.WriteByte(0x00) // no max - writeUleb128(ctxt.Out, numElements) // min - - writeSecSize(ctxt, sizeOffset) -} - -// writeMemorySec writes the section that declares linear memories. Currently one linear memory is being used. -// Linear memory always starts at address zero. More memory can be requested with the GrowMemory instruction. -func writeMemorySec(ctxt *ld.Link) { - sizeOffset := writeSecHeader(ctxt, sectionMemory) - - dataSection := ctxt.Syms.Lookup("runtime.data", 0).Sect - dataEnd := dataSection.Vaddr + dataSection.Length - var initialSize = dataEnd + 16<<20 // 16MB, enough for runtime init without growing - - const wasmPageSize = 64 << 10 // 64KB - - writeUleb128(ctxt.Out, 1) // number of memories - ctxt.Out.WriteByte(0x00) // no maximum memory size - writeUleb128(ctxt.Out, initialSize/wasmPageSize) // minimum (initial) memory size - - writeSecSize(ctxt, sizeOffset) -} - -// writeGlobalSec writes the section that declares global variables. -func writeGlobalSec(ctxt *ld.Link) { - sizeOffset := writeSecHeader(ctxt, sectionGlobal) - - globalRegs := []byte{ - I32, // 0: SP - I64, // 1: CTXT - I64, // 2: g - I64, // 3: RET0 - I64, // 4: RET1 - I64, // 5: RET2 - I64, // 6: RET3 - I32, // 7: PAUSE - } - - writeUleb128(ctxt.Out, uint64(len(globalRegs))) // number of globals - - for _, typ := range globalRegs { - ctxt.Out.WriteByte(typ) - ctxt.Out.WriteByte(0x01) // var - switch typ { - case I32: - writeI32Const(ctxt.Out, 0) - case I64: - writeI64Const(ctxt.Out, 0) - } - ctxt.Out.WriteByte(0x0b) // end - } - - writeSecSize(ctxt, sizeOffset) -} - -// writeExportSec writes the section that declares exports. -// Exports can be accessed by the WebAssembly host, usually JavaScript. -// The wasm_export_* functions and the linear memory get exported. -func writeExportSec(ctxt *ld.Link, lenHostImports int) { - sizeOffset := writeSecHeader(ctxt, sectionExport) - - writeUleb128(ctxt.Out, 4) // number of exports - - for _, name := range []string{"run", "resume", "getsp"} { - idx := uint32(lenHostImports) + uint32(ctxt.Syms.ROLookup("wasm_export_"+name, 0).Value>>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 - - writeSecSize(ctxt, sizeOffset) -} - -// writeElementSec writes the section that initializes the tables declared by the "table" section. -// The table for CallIndirect gets initialized in a very simple way so that each table index (PC_F value) -// maps linearly to the function index (numImports + PC_F). -func writeElementSec(ctxt *ld.Link, numImports, numFns uint64) { - sizeOffset := writeSecHeader(ctxt, sectionElement) - - writeUleb128(ctxt.Out, 1) // number of element segments - - writeUleb128(ctxt.Out, 0) // tableidx - writeI32Const(ctxt.Out, funcValueOffset) - ctxt.Out.WriteByte(0x0b) // end - - writeUleb128(ctxt.Out, numFns) // number of entries - for i := uint64(0); i < numFns; i++ { - writeUleb128(ctxt.Out, numImports+i) - } - - writeSecSize(ctxt, sizeOffset) -} - -// writeElementSec writes the section that provides the function bodies for the functions -// declared by the "func" section. -func writeCodeSec(ctxt *ld.Link, fns []*wasmFunc) { - sizeOffset := writeSecHeader(ctxt, sectionCode) - - writeUleb128(ctxt.Out, uint64(len(fns))) // number of code entries - for _, fn := range fns { - writeUleb128(ctxt.Out, uint64(len(fn.Code))) - ctxt.Out.Write(fn.Code) - } - - writeSecSize(ctxt, sizeOffset) -} - -// writeDataSec writes the section that provides data that will be used to initialize the linear memory. -func writeDataSec(ctxt *ld.Link) { - sizeOffset := writeSecHeader(ctxt, sectionData) - - sections := []*sym.Section{ - ctxt.Syms.Lookup("runtime.rodata", 0).Sect, - ctxt.Syms.Lookup("runtime.typelink", 0).Sect, - ctxt.Syms.Lookup("runtime.itablink", 0).Sect, - ctxt.Syms.Lookup("runtime.symtab", 0).Sect, - ctxt.Syms.Lookup("runtime.pclntab", 0).Sect, - ctxt.Syms.Lookup("runtime.noptrdata", 0).Sect, - ctxt.Syms.Lookup("runtime.data", 0).Sect, - } - - type dataSegment struct { - offset int32 - data []byte - } - - // Omit blocks of zeroes and instead emit data segments with offsets skipping the zeroes. - // This reduces the size of the WebAssembly binary. We use 8 bytes as an estimate for the - // overhead of adding a new segment (same as wasm-opt's memory-packing optimization uses). - const segmentOverhead = 8 - - // Generate at most this many segments. A higher number of segments gets rejected by some WebAssembly runtimes. - const maxNumSegments = 100000 - - var segments []*dataSegment - for secIndex, sec := range sections { - data := ld.DatblkBytes(ctxt, int64(sec.Vaddr), int64(sec.Length)) - offset := int32(sec.Vaddr) - - // skip leading zeroes - for len(data) > 0 && data[0] == 0 { - data = data[1:] - offset++ - } - - for len(data) > 0 { - dataLen := int32(len(data)) - var segmentEnd, zeroEnd int32 - if len(segments)+(len(sections)-secIndex) == maxNumSegments { - segmentEnd = dataLen - zeroEnd = dataLen - } else { - for { - // look for beginning of zeroes - for segmentEnd < dataLen && data[segmentEnd] != 0 { - segmentEnd++ - } - // look for end of zeroes - zeroEnd = segmentEnd - for zeroEnd < dataLen && data[zeroEnd] == 0 { - zeroEnd++ - } - // emit segment if omitting zeroes reduces the output size - if zeroEnd-segmentEnd >= segmentOverhead || zeroEnd == dataLen { - break - } - segmentEnd = zeroEnd - } - } - - segments = append(segments, &dataSegment{ - offset: offset, - data: data[:segmentEnd], - }) - data = data[zeroEnd:] - offset += zeroEnd - } - } - - writeUleb128(ctxt.Out, uint64(len(segments))) // number of data entries - for _, seg := range segments { - writeUleb128(ctxt.Out, 0) // memidx - writeI32Const(ctxt.Out, seg.offset) - ctxt.Out.WriteByte(0x0b) // end - writeUleb128(ctxt.Out, uint64(len(seg.data))) - ctxt.Out.Write(seg.data) - } - - writeSecSize(ctxt, sizeOffset) -} - -// writeProducerSec writes an optional section that reports the source language and compiler version. -func writeProducerSec(ctxt *ld.Link) { - sizeOffset := writeSecHeader(ctxt, sectionCustom) - writeName(ctxt.Out, "producers") - - writeUleb128(ctxt.Out, 2) // number of fields - - writeName(ctxt.Out, "language") // field name - writeUleb128(ctxt.Out, 1) // number of values - writeName(ctxt.Out, "Go") // value: name - writeName(ctxt.Out, objabi.Version) // value: version - - writeName(ctxt.Out, "processed-by") // field name - writeUleb128(ctxt.Out, 1) // number of values - writeName(ctxt.Out, "Go cmd/compile") // value: name - writeName(ctxt.Out, objabi.Version) // value: version - - writeSecSize(ctxt, sizeOffset) -} - -var nameRegexp = regexp.MustCompile(`[^\w\.]`) - -// writeNameSec writes an optional section that assigns names to the functions declared by the "func" section. -// The names are only used by WebAssembly stack traces, debuggers and decompilers. -// TODO(neelance): add symbol table of DATA symbols -func writeNameSec(ctxt *ld.Link, firstFnIndex int, fns []*wasmFunc) { - sizeOffset := writeSecHeader(ctxt, sectionCustom) - writeName(ctxt.Out, "name") - - sizeOffset2 := writeSecHeader(ctxt, 0x01) // function names - writeUleb128(ctxt.Out, uint64(len(fns))) - for i, fn := range fns { - writeUleb128(ctxt.Out, uint64(firstFnIndex+i)) - writeName(ctxt.Out, fn.Name) - } - writeSecSize(ctxt, sizeOffset2) - - writeSecSize(ctxt, sizeOffset) -} - -type nameWriter interface { - io.ByteWriter - io.Writer -} - -func writeI32Const(w io.ByteWriter, v int32) { - w.WriteByte(0x41) // i32.const - writeSleb128(w, int64(v)) -} - -func writeI64Const(w io.ByteWriter, v int64) { - w.WriteByte(0x42) // i64.const - writeSleb128(w, v) -} - -func writeName(w nameWriter, name string) { - writeUleb128(w, uint64(len(name))) - w.Write([]byte(name)) -} - -func writeUleb128(w io.ByteWriter, v uint64) { - if v < 128 { - w.WriteByte(uint8(v)) - return - } - more := true - for more { - c := uint8(v & 0x7f) - v >>= 7 - more = v != 0 - if more { - c |= 0x80 - } - w.WriteByte(c) - } -} - -func writeUleb128FixedLength(w io.ByteWriter, v uint64, length int) { - for i := 0; i < length; i++ { - c := uint8(v & 0x7f) - v >>= 7 - if i < length-1 { - c |= 0x80 - } - w.WriteByte(c) - } - if v != 0 { - panic("writeUleb128FixedLength: length too small") - } -} - -func writeSleb128(w io.ByteWriter, v int64) { - more := true - for more { - c := uint8(v & 0x7f) - s := uint8(v & 0x40) - v >>= 7 - more = !((v == 0 && s == 0) || (v == -1 && s != 0)) - if more { - c |= 0x80 - } - w.WriteByte(c) - } -} diff --git a/src/cmd/oldlink/internal/wasm/obj.go b/src/cmd/oldlink/internal/wasm/obj.go deleted file mode 100644 index fdc9fb796a..0000000000 --- a/src/cmd/oldlink/internal/wasm/obj.go +++ /dev/null @@ -1,35 +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 wasm - -import ( - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - theArch := ld.Arch{ - Funcalign: 16, - Maxalign: 32, - Minalign: 1, - - Archinit: archinit, - AssignAddress: assignAddress, - Asmb: asmb, - Asmb2: asmb2, - Gentext: gentext, - } - - return sys.ArchWasm, theArch -} - -func archinit(ctxt *ld.Link) { - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0 - } -} diff --git a/src/cmd/oldlink/internal/x86/asm.go b/src/cmd/oldlink/internal/x86/asm.go deleted file mode 100644 index e8e52f671f..0000000000 --- a/src/cmd/oldlink/internal/x86/asm.go +++ /dev/null @@ -1,699 +0,0 @@ -// Inferno utils/8l/asm.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/8l/asm.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package x86 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/sym" - "debug/elf" - "log" -) - -// Append 4 bytes to s and create a R_CALL relocation targeting t to fill them in. -func addcall(ctxt *ld.Link, s *sym.Symbol, t *sym.Symbol) { - s.Attr |= sym.AttrReachable - i := s.Size - s.Size += 4 - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Type = objabi.R_CALL - r.Siz = 4 -} - -func gentext(ctxt *ld.Link) { - if ctxt.DynlinkingGo() { - // We need get_pc_thunk. - } else { - switch ctxt.BuildMode { - case ld.BuildModeCArchive: - if !ctxt.IsELF { - return - } - case ld.BuildModePIE, ld.BuildModeCShared, ld.BuildModePlugin: - // We need get_pc_thunk. - default: - return - } - } - - // Generate little thunks that load the PC of the next instruction into a register. - thunks := make([]*sym.Symbol, 0, 7+len(ctxt.Textp)) - for _, r := range [...]struct { - name string - num uint8 - }{ - {"ax", 0}, - {"cx", 1}, - {"dx", 2}, - {"bx", 3}, - // sp - {"bp", 5}, - {"si", 6}, - {"di", 7}, - } { - thunkfunc := ctxt.Syms.Lookup("__x86.get_pc_thunk."+r.name, 0) - thunkfunc.Type = sym.STEXT - thunkfunc.Attr |= sym.AttrLocal - thunkfunc.Attr |= sym.AttrReachable //TODO: remove? - o := func(op ...uint8) { - for _, op1 := range op { - thunkfunc.AddUint8(op1) - } - } - // 8b 04 24 mov (%esp),%eax - // Destination register is in bits 3-5 of the middle byte, so add that in. - o(0x8b, 0x04+r.num<<3, 0x24) - // c3 ret - o(0xc3) - - thunks = append(thunks, thunkfunc) - } - ctxt.Textp = append(thunks, ctxt.Textp...) // keep Textp in dependency order - - addmoduledata := ctxt.Syms.Lookup("runtime.addmoduledata", 0) - if addmoduledata.Type == sym.STEXT && ctxt.BuildMode != ld.BuildModePlugin { - // we're linking a module containing the runtime -> no need for - // an init function - return - } - - addmoduledata.Attr |= sym.AttrReachable - - initfunc := ctxt.Syms.Lookup("go.link.addmoduledata", 0) - initfunc.Type = sym.STEXT - initfunc.Attr |= sym.AttrLocal - initfunc.Attr |= sym.AttrReachable - o := func(op ...uint8) { - for _, op1 := range op { - initfunc.AddUint8(op1) - } - } - - // go.link.addmoduledata: - // 53 push %ebx - // e8 00 00 00 00 call __x86.get_pc_thunk.cx + R_CALL __x86.get_pc_thunk.cx - // 8d 81 00 00 00 00 lea 0x0(%ecx), %eax + R_PCREL ctxt.Moduledata - // 8d 99 00 00 00 00 lea 0x0(%ecx), %ebx + R_GOTPC _GLOBAL_OFFSET_TABLE_ - // e8 00 00 00 00 call runtime.addmoduledata@plt + R_CALL runtime.addmoduledata - // 5b pop %ebx - // c3 ret - - o(0x53) - - o(0xe8) - addcall(ctxt, initfunc, ctxt.Syms.Lookup("__x86.get_pc_thunk.cx", 0)) - - o(0x8d, 0x81) - initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata, 6) - - o(0x8d, 0x99) - i := initfunc.Size - initfunc.Size += 4 - initfunc.Grow(initfunc.Size) - r := initfunc.AddRel() - r.Sym = ctxt.Syms.Lookup("_GLOBAL_OFFSET_TABLE_", 0) - r.Off = int32(i) - r.Type = objabi.R_PCREL - r.Add = 12 - r.Siz = 4 - - o(0xe8) - addcall(ctxt, initfunc, addmoduledata) - - o(0x5b) - - o(0xc3) - - if ctxt.BuildMode == ld.BuildModePlugin { - ctxt.Textp = append(ctxt.Textp, addmoduledata) - } - ctxt.Textp = append(ctxt.Textp, initfunc) - initarray_entry := ctxt.Syms.Lookup("go.link.addmoduledatainit", 0) - initarray_entry.Attr |= sym.AttrReachable - initarray_entry.Attr |= sym.AttrLocal - initarray_entry.Type = sym.SINITARR - initarray_entry.AddAddr(ctxt.Arch, initfunc) -} - -func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { - targ := r.Sym - - switch r.Type { - default: - if r.Type >= objabi.ElfRelocOffset { - ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) - return false - } - - // Handle relocations found in ELF object files. - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_PC32): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_386_PC32 relocation for dynamic symbol %s", targ.Name) - } - // TODO(mwhudson): the test of VisibilityHidden here probably doesn't make - // sense and should be removed when someone has thought about it properly. - if (targ.Type == 0 || targ.Type == sym.SXREF) && !targ.Attr.VisibilityHidden() { - ld.Errorf(s, "unknown symbol %s in pcrel", targ.Name) - } - r.Type = objabi.R_PCREL - r.Add += 4 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_PLT32): - r.Type = objabi.R_PCREL - r.Add += 4 - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add += int64(targ.Plt()) - } - - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOT32), - objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOT32X): - if targ.Type != sym.SDYNIMPORT { - // have symbol - if r.Off >= 2 && s.P[r.Off-2] == 0x8b { - // turn MOVL of GOT entry into LEAL of symbol address, relative to GOT. - s.P[r.Off-2] = 0x8d - - r.Type = objabi.R_GOTOFF - return true - } - - if r.Off >= 2 && s.P[r.Off-2] == 0xff && s.P[r.Off-1] == 0xb3 { - // turn PUSHL of GOT entry into PUSHL of symbol itself. - // use unnecessary SS prefix to keep instruction same length. - s.P[r.Off-2] = 0x36 - - s.P[r.Off-1] = 0x68 - r.Type = objabi.R_ADDR - return true - } - - ld.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", targ.Name) - return false - } - - addgotsym(ctxt, targ) - r.Type = objabi.R_CONST // write r->add during relocsym - r.Sym = nil - r.Add += int64(targ.Got()) - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOTOFF): - r.Type = objabi.R_GOTOFF - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOTPC): - r.Type = objabi.R_PCREL - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += 4 - return true - - case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_32): - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected R_386_32 relocation for dynamic symbol %s", targ.Name) - } - r.Type = objabi.R_ADDR - return true - - case objabi.MachoRelocOffset + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 0: - r.Type = objabi.R_ADDR - if targ.Type == sym.SDYNIMPORT { - ld.Errorf(s, "unexpected reloc for dynamic symbol %s", targ.Name) - } - return true - - case objabi.MachoRelocOffset + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1: - if targ.Type == sym.SDYNIMPORT { - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add = int64(targ.Plt()) - r.Type = objabi.R_PCREL - return true - } - - r.Type = objabi.R_PCREL - return true - - case objabi.MachoRelocOffset + ld.MACHO_FAKE_GOTPCREL: - if targ.Type != sym.SDYNIMPORT { - // have symbol - // turn MOVL of GOT entry into LEAL of symbol itself - if r.Off < 2 || s.P[r.Off-2] != 0x8b { - ld.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", targ.Name) - return false - } - - s.P[r.Off-2] = 0x8d - r.Type = objabi.R_PCREL - return true - } - - addgotsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".got", 0) - r.Add += int64(targ.Got()) - r.Type = objabi.R_PCREL - return true - } - - // Handle references to ELF symbols from our own object files. - if targ.Type != sym.SDYNIMPORT { - return true - } - switch r.Type { - case objabi.R_CALL, - objabi.R_PCREL: - if ctxt.LinkMode == ld.LinkExternal { - // External linker will do this relocation. - return true - } - addpltsym(ctxt, targ) - r.Sym = ctxt.Syms.Lookup(".plt", 0) - r.Add = int64(targ.Plt()) - return true - - case objabi.R_ADDR: - if s.Type != sym.SDATA { - break - } - if ctxt.IsELF { - ld.Adddynsym(ctxt, targ) - rel := ctxt.Syms.Lookup(".rel", 0) - rel.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) - rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(targ.Dynid), uint32(elf.R_386_32))) - r.Type = objabi.R_CONST // write r->add during relocsym - r.Sym = nil - return true - } - - if ctxt.HeadType == objabi.Hdarwin && s.Size == int64(ctxt.Arch.PtrSize) && r.Off == 0 { - // Mach-O relocations are a royal pain to lay out. - // They use a compact stateful bytecode representation - // that is too much bother to deal with. - // Instead, interpret the C declaration - // void *_Cvar_stderr = &stderr; - // as making _Cvar_stderr the name of a GOT entry - // for stderr. This is separate from the usual GOT entry, - // just in case the C code assigns to the variable, - // and of course it only works for single pointers, - // but we only need to support cgo and that's all it needs. - ld.Adddynsym(ctxt, targ) - - got := ctxt.Syms.Lookup(".got", 0) - s.Type = got.Type - s.Attr |= sym.AttrSubSymbol - s.Outer = got - s.Sub = got.Sub - got.Sub = s - s.Value = got.Size - got.AddUint32(ctxt.Arch, 0) - ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(targ.Dynid)) - r.Type = objabi.ElfRelocOffset // ignore during relocsym - return true - } - } - - return false -} - -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - ctxt.Out.Write32(uint32(sectoff)) - - elfsym := r.Xsym.ElfsymForReloc() - switch r.Type { - default: - return false - case objabi.R_ADDR: - if r.Siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_32) | uint32(elfsym)<<8) - } else { - return false - } - case objabi.R_GOTPCREL: - if r.Siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_GOTPC)) - if r.Xsym.Name != "_GLOBAL_OFFSET_TABLE_" { - ctxt.Out.Write32(uint32(sectoff)) - ctxt.Out.Write32(uint32(elf.R_386_GOT32) | uint32(elfsym)<<8) - } - } else { - return false - } - case objabi.R_CALL: - if r.Siz == 4 { - if r.Xsym.Type == sym.SDYNIMPORT { - ctxt.Out.Write32(uint32(elf.R_386_PLT32) | uint32(elfsym)<<8) - } else { - ctxt.Out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8) - } - } else { - return false - } - case objabi.R_PCREL: - if r.Siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8) - } else { - return false - } - case objabi.R_TLS_LE: - if r.Siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_TLS_LE) | uint32(elfsym)<<8) - } else { - return false - } - case objabi.R_TLS_IE: - if r.Siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_GOTPC)) - ctxt.Out.Write32(uint32(sectoff)) - ctxt.Out.Write32(uint32(elf.R_386_TLS_GOTIE) | uint32(elfsym)<<8) - } else { - return false - } - } - - return true -} - -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - return false -} - -func pereloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { - var v uint32 - - rs := r.Xsym - - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) - return false - } - - out.Write32(uint32(sectoff)) - out.Write32(uint32(rs.Dynid)) - - switch r.Type { - default: - return false - - case objabi.R_DWARFSECREF: - v = ld.IMAGE_REL_I386_SECREL - - case objabi.R_ADDR: - v = ld.IMAGE_REL_I386_DIR32 - - case objabi.R_CALL, - objabi.R_PCREL: - v = ld.IMAGE_REL_I386_REL32 - } - - out.Write16(uint16(v)) - - return true -} - -func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - if ctxt.LinkMode == ld.LinkExternal { - return val, false - } - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(ctxt.Syms.Lookup(".got", 0)), true - } - - return val, false -} - -func archrelocvariant(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - log.Fatalf("unexpected relocation variant") - return t -} - -func elfsetupplt(ctxt *ld.Link) { - plt := ctxt.Syms.Lookup(".plt", 0) - got := ctxt.Syms.Lookup(".got.plt", 0) - if plt.Size == 0 { - // pushl got+4 - plt.AddUint8(0xff) - - plt.AddUint8(0x35) - plt.AddAddrPlus(ctxt.Arch, got, 4) - - // jmp *got+8 - plt.AddUint8(0xff) - - plt.AddUint8(0x25) - plt.AddAddrPlus(ctxt.Arch, got, 8) - - // zero pad - plt.AddUint32(ctxt.Arch, 0) - - // assume got->size == 0 too - got.AddAddrPlus(ctxt.Arch, ctxt.Syms.Lookup(".dynamic", 0), 0) - - got.AddUint32(ctxt.Arch, 0) - got.AddUint32(ctxt.Arch, 0) - } -} - -func addpltsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Plt() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - - if ctxt.IsELF { - plt := ctxt.Syms.Lookup(".plt", 0) - got := ctxt.Syms.Lookup(".got.plt", 0) - rel := ctxt.Syms.Lookup(".rel.plt", 0) - if plt.Size == 0 { - elfsetupplt(ctxt) - } - - // jmpq *got+size - plt.AddUint8(0xff) - - plt.AddUint8(0x25) - plt.AddAddrPlus(ctxt.Arch, got, got.Size) - - // add to got: pointer to current pos in plt - got.AddAddrPlus(ctxt.Arch, plt, plt.Size) - - // pushl $x - plt.AddUint8(0x68) - - plt.AddUint32(ctxt.Arch, uint32(rel.Size)) - - // jmp .plt - plt.AddUint8(0xe9) - - plt.AddUint32(ctxt.Arch, uint32(-(plt.Size + 4))) - - // rel - rel.AddAddrPlus(ctxt.Arch, got, got.Size-4) - - rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_386_JMP_SLOT))) - - s.SetPlt(int32(plt.Size - 16)) - } else if ctxt.HeadType == objabi.Hdarwin { - // Same laziness as in 6l. - - plt := ctxt.Syms.Lookup(".plt", 0) - - addgotsym(ctxt, s) - - ctxt.Syms.Lookup(".linkedit.plt", 0).AddUint32(ctxt.Arch, uint32(s.Dynid)) - - // jmpq *got+size(IP) - s.SetPlt(int32(plt.Size)) - - plt.AddUint8(0xff) - plt.AddUint8(0x25) - plt.AddAddrPlus(ctxt.Arch, ctxt.Syms.Lookup(".got", 0), int64(s.Got())) - } else { - ld.Errorf(s, "addpltsym: unsupported binary format") - } -} - -func addgotsym(ctxt *ld.Link, s *sym.Symbol) { - if s.Got() >= 0 { - return - } - - ld.Adddynsym(ctxt, s) - got := ctxt.Syms.Lookup(".got", 0) - s.SetGot(int32(got.Size)) - got.AddUint32(ctxt.Arch, 0) - - if ctxt.IsELF { - rel := ctxt.Syms.Lookup(".rel", 0) - rel.AddAddrPlus(ctxt.Arch, got, int64(s.Got())) - rel.AddUint32(ctxt.Arch, ld.ELF32_R_INFO(uint32(s.Dynid), uint32(elf.R_386_GLOB_DAT))) - } else if ctxt.HeadType == objabi.Hdarwin { - ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(s.Dynid)) - } else { - ld.Errorf(s, "addgotsym: unsupported binary format") - } -} - -func asmb(ctxt *ld.Link) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - sect := ld.Segtext.Sections[0] - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - // 0xCC is INT $3 - breakpoint instruction - ld.CodeblkPad(ctxt, int64(sect.Vaddr), int64(sect.Length), []byte{0xCC}) - for _, sect = range ld.Segtext.Sections[1:] { - ctxt.Out.SeekSet(int64(sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff)) - ld.Datblk(ctxt, int64(sect.Vaddr), int64(sect.Length)) - } - - if ld.Segrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrodata.Vaddr), int64(ld.Segrodata.Filelen)) - } - if ld.Segrelrodata.Filelen > 0 { - ctxt.Out.SeekSet(int64(ld.Segrelrodata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segrelrodata.Vaddr), int64(ld.Segrelrodata.Filelen)) - } - - ctxt.Out.SeekSet(int64(ld.Segdata.Fileoff)) - ld.Datblk(ctxt, int64(ld.Segdata.Vaddr), int64(ld.Segdata.Filelen)) - - ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) - ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) -} - -func asmb2(ctxt *ld.Link) { - machlink := uint32(0) - if ctxt.HeadType == objabi.Hdarwin { - machlink = uint32(ld.Domacholink(ctxt)) - } - - ld.Symsize = 0 - ld.Spsize = 0 - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - - case objabi.Hdarwin: - symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink)) - - case objabi.Hwindows: - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), ld.PEFILEALIGN)) - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Flush() - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) - ctxt.Out.Flush() - - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - ctxt.Out.Flush() - } - - case objabi.Hwindows: - // Do nothing - - case objabi.Hdarwin: - if ctxt.LinkMode == ld.LinkExternal { - ld.Machoemitreloc(ctxt) - } - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan9 */ - magic := int32(4*11*11 + 7) - - ctxt.Out.Write32b(uint32(magic)) /* magic */ - ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ - ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ - - case objabi.Hdarwin: - ld.Asmbmacho(ctxt) - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - - case objabi.Hwindows: - ld.Asmbpe(ctxt) - } - - ctxt.Out.Flush() -} diff --git a/src/cmd/oldlink/internal/x86/l.go b/src/cmd/oldlink/internal/x86/l.go deleted file mode 100644 index 0f104eab57..0000000000 --- a/src/cmd/oldlink/internal/x86/l.go +++ /dev/null @@ -1,43 +0,0 @@ -// Inferno utils/8l/l.h -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/8l/l.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package x86 - -const ( - maxAlign = 32 // max data alignment - minAlign = 1 // min data alignment - funcAlign = 16 -) - -/* Used by ../internal/ld/dwarf.go */ -const ( - dwarfRegSP = 4 - dwarfRegLR = 8 -) diff --git a/src/cmd/oldlink/internal/x86/obj.go b/src/cmd/oldlink/internal/x86/obj.go deleted file mode 100644 index b78ccbaf99..0000000000 --- a/src/cmd/oldlink/internal/x86/obj.go +++ /dev/null @@ -1,113 +0,0 @@ -// Inferno utils/8l/obj.c -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/8l/obj.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package x86 - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/ld" -) - -func Init() (*sys.Arch, ld.Arch) { - arch := sys.Arch386 - - theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, - - Adddynrel: adddynrel, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext: gentext, - Machoreloc1: machoreloc1, - PEreloc1: pereloc1, - - Linuxdynld: "/lib/ld-linux.so.2", - Freebsddynld: "/usr/libexec/ld-elf.so.1", - Openbsddynld: "/usr/libexec/ld.so", - Netbsddynld: "/usr/libexec/ld.elf_so", - Solarisdynld: "/lib/ld.so.1", - } - - return arch, theArch -} - -func archinit(ctxt *ld.Link) { - switch ctxt.HeadType { - default: - ld.Exitf("unknown -H option: %v", ctxt.HeadType) - - case objabi.Hplan9: /* plan 9 */ - ld.HEADR = 32 - - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 4096 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - - case objabi.Hdarwin: /* apple MACH */ - ld.HEADR = ld.INITIAL_MACHO_HEADR - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 4096 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - - case objabi.Hlinux, /* elf32 executable */ - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Elfinit(ctxt) - - ld.HEADR = ld.ELFRESERVE - if *ld.FlagTextAddr == -1 { - *ld.FlagTextAddr = 0x08048000 + int64(ld.HEADR) - } - if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 - } - - case objabi.Hwindows: /* PE executable */ - // ld.HEADR, ld.FlagTextAddr, ld.FlagRound are set in ld.Peinit - return - } -} diff --git a/src/cmd/oldlink/main.go b/src/cmd/oldlink/main.go deleted file mode 100644 index be1d0fde3b..0000000000 --- a/src/cmd/oldlink/main.go +++ /dev/null @@ -1,71 +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. - -// TODO(go115newobj): delete. - -package main - -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/oldlink/internal/amd64" - "cmd/oldlink/internal/arm" - "cmd/oldlink/internal/arm64" - "cmd/oldlink/internal/ld" - "cmd/oldlink/internal/mips" - "cmd/oldlink/internal/mips64" - "cmd/oldlink/internal/ppc64" - "cmd/oldlink/internal/riscv64" - "cmd/oldlink/internal/s390x" - "cmd/oldlink/internal/wasm" - "cmd/oldlink/internal/x86" - "fmt" - "os" -) - -// The bulk of the linker implementation lives in cmd/oldlink/internal/ld. -// Architecture-specific code lives in cmd/oldlink/internal/GOARCH. -// -// Program initialization: -// -// Before any argument parsing is done, the Init function of relevant -// architecture package is called. The only job done in Init is -// configuration of the architecture-specific variables. -// -// Then control flow passes to ld.Main, which parses flags, makes -// some configuration decisions, and then gives the architecture -// packages a second chance to modify the linker's configuration -// via the ld.Arch.Archinit function. - -func main() { - var arch *sys.Arch - var theArch ld.Arch - - switch objabi.GOARCH { - default: - fmt.Fprintf(os.Stderr, "link: unknown architecture %q\n", objabi.GOARCH) - os.Exit(2) - case "386": - arch, theArch = x86.Init() - case "amd64": - arch, theArch = amd64.Init() - case "arm": - arch, theArch = arm.Init() - case "arm64": - arch, theArch = arm64.Init() - case "mips", "mipsle": - arch, theArch = mips.Init() - case "mips64", "mips64le": - arch, theArch = mips64.Init() - case "ppc64", "ppc64le": - arch, theArch = ppc64.Init() - case "riscv64": - arch, theArch = riscv64.Init() - case "s390x": - arch, theArch = s390x.Init() - case "wasm": - arch, theArch = wasm.Init() - } - ld.Main(arch, theArch) -} -- GitLab From 0586fbb9d34a56abffbe3111e3701f3bd88033f5 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Apr 2020 22:22:33 -0400 Subject: [PATCH 0005/1792] [dev.link] cmd/link: use new reloc pass on S390X Change-Id: Ia51ca2c89f1d382813a27310211c1f8631afb125 Reviewed-on: https://go-review.googlesource.com/c/go/+/231919 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data.go | 36 ++++++++++++++++-------------- src/cmd/link/internal/ld/lib.go | 5 ++++- src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/s390x/asm.go | 25 ++++++--------------- src/cmd/link/internal/s390x/obj.go | 20 ++++++++--------- 5 files changed, 41 insertions(+), 47 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 3083669465..3336bfac70 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -239,18 +239,21 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { rr.Idx = ri } + var rv sym.RelocVariant + if target.IsPPC64() || target.IsS390X() { + rv = ldr.RelocVariant(s, ri) + } + // TODO(mundaym): remove this special case - see issue 14218. - //if target.IsS390X() { - // switch r.Type { - // case objabi.R_PCRELDBL: - // r.InitExt() - // r.Type = objabi.R_PCREL - // r.Variant = sym.RV_390_DBL - // case objabi.R_CALL: - // r.InitExt() - // r.Variant = sym.RV_390_DBL - // } - //} + if target.IsS390X() { + switch rt { + case objabi.R_PCRELDBL: + rt = objabi.R_PCREL + rv = sym.RV_390_DBL + case objabi.R_CALL: + rv = sym.RV_390_DBL + } + } var o int64 switch rt { @@ -556,12 +559,11 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.GOT2) } - //if target.IsPPC64() || target.IsS390X() { - // r.InitExt() - // if r.Variant != sym.RV_NONE { - // o = thearch.Archrelocvariant(ldr, target, syms, &r, s, o) - // } - //} + if target.IsPPC64() || target.IsS390X() { + if rv != sym.RV_NONE { + o = thearch.Archrelocvariant2(target, ldr, r, rv, s, o) + } + } switch siz { default: diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 3c60901124..c5c38d4b47 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -246,7 +246,8 @@ type Arch struct { // indicates a fatal error). Archreloc func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol, offset int64) (relocatedOffset int64, success bool) - Archreloc2 func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, bool, bool) + Archreloc2 func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc, + loader.Sym, int64) (relocatedOffset int64, needExtReloc bool, ok bool) // Archrelocvariant is a second arch-specific hook used for // relocation processing; it handles relocations where r.Type is // insufficient to describe the relocation (r.Variant != @@ -257,6 +258,8 @@ type Arch struct { // offset value. Archrelocvariant func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol, offset int64) (relocatedOffset int64) + Archrelocvariant2 func(target *Target, ldr *loader.Loader, rel loader.Reloc2, + rv sym.RelocVariant, sym loader.Sym, offset int64) (relocatedOffset int64) // Generate a trampoline for a call from s to rs if necessary. ri is // index of the relocation. diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index b95bab3d89..fe1dbd2136 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -319,7 +319,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - newreloc := ctxt.IsAMD64() || ctxt.Is386() || ctxt.IsWasm() + newreloc := ctxt.IsAMD64() || ctxt.Is386() || ctxt.IsWasm() || ctxt.IsS390X() if newreloc { bench.Start("reloc") ctxt.reloc() diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index bec7705be5..91455cc6c2 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -367,33 +367,22 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se return false } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - if target.IsExternal() { - return val, false - } - - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(syms.GOT), true - } - - return val, false +func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { + return val, false, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - switch r.Variant & sym.RV_TYPE_MASK { +func archrelocvariant2(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) int64 { + switch rv & sym.RV_TYPE_MASK { default: - ld.Errorf(s, "unexpected relocation variant %d", r.Variant) + ldr.Errorf(s, "unexpected relocation variant %d", rv) return t case sym.RV_NONE: return t case sym.RV_390_DBL: - if (t & 1) != 0 { - ld.Errorf(s, "%s+%v is not 2-byte aligned", r.Sym.Name, r.Sym.Value) + if t&1 != 0 { + ldr.Errorf(s, "%s+%v is not 2-byte aligned", ldr.SymName(r.Sym()), ldr.SymValue(r.Sym())) } return t >> 1 } diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 129c6a7ee4..8c4180501a 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -46,16 +46,16 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, // in asm.go - Asmb2: asmb2, // in asm.go - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext2: gentext2, - Machoreloc1: machoreloc1, + Adddynrel2: adddynrel2, + Archinit: archinit, + Archreloc2: archreloc2, + Archrelocvariant2: archrelocvariant2, + Asmb: asmb, + Asmb2: asmb2, + Elfreloc1: elfreloc1, + Elfsetupplt: elfsetupplt, + Gentext2: gentext2, + Machoreloc1: machoreloc1, Linuxdynld: "/lib64/ld64.so.1", -- GitLab From 781c94e4c6f806b091f3bb75b9498e20550758be Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 4 May 2020 11:25:01 -0400 Subject: [PATCH 0006/1792] [dev.link] cmd/link: mmap on more platforms We didn't mmap on them because they don't support msync. Now we no longer use msync, we can mmap. Change-Id: I9988278566e0db10be90a994509fc6b733e784a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/231920 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/outbuf_mmap.go | 2 +- src/cmd/link/internal/ld/outbuf_nommap.go | 2 +- src/cmd/link/internal/ld/outbuf_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd/link/internal/ld/outbuf_mmap.go b/src/cmd/link/internal/ld/outbuf_mmap.go index e6ee041abb..f5ccfc9584 100644 --- a/src/cmd/link/internal/ld/outbuf_mmap.go +++ b/src/cmd/link/internal/ld/outbuf_mmap.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. -// +build darwin dragonfly freebsd linux openbsd +// +build aix darwin dragonfly freebsd linux netbsd openbsd package ld diff --git a/src/cmd/link/internal/ld/outbuf_nommap.go b/src/cmd/link/internal/ld/outbuf_nommap.go index 51218d8ae7..bad01dc6d5 100644 --- a/src/cmd/link/internal/ld/outbuf_nommap.go +++ b/src/cmd/link/internal/ld/outbuf_nommap.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. -// +build !darwin,!dragonfly,!freebsd,!linux,!openbsd,!windows +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!windows package ld diff --git a/src/cmd/link/internal/ld/outbuf_test.go b/src/cmd/link/internal/ld/outbuf_test.go index d8c21426b3..db0a92485e 100644 --- a/src/cmd/link/internal/ld/outbuf_test.go +++ b/src/cmd/link/internal/ld/outbuf_test.go @@ -17,7 +17,7 @@ func TestMMap(t *testing.T) { switch runtime.GOOS { default: t.Skip("unsupported OS") - case "darwin", "dragonfly", "freebsd", "linux", "openbsd", "windows": + case "aix", "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "windows": } dir, err := ioutil.TempDir("", "TestMMap") if err != nil { -- GitLab From 8f697c7ac8e077e8b8d856aa25ad410fab312892 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Apr 2020 18:41:30 -0400 Subject: [PATCH 0007/1792] [dev.link] cmd/link: use new reloc pass on MIPS64 Change-Id: I1c5da63d88e917877c70c1783bb350a697d6e207 Reviewed-on: https://go-review.googlesource.com/c/go/+/231937 Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data.go | 8 ++-- src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/mips64/asm.go | 64 ++++++++++++++--------------- src/cmd/link/internal/mips64/obj.go | 2 +- 4 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 3336bfac70..7b06972c0a 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -120,10 +120,10 @@ func trampoline(ctxt *Link, s loader.Sym) { } -// foldSubSymbolOffset computes the offset of symbol s to its top-level outer +// FoldSubSymbolOffset computes the offset of symbol s to its top-level outer // symbol. Returns the top-level symbol and the offset. // This is used in generating external relocations. -func foldSubSymbolOffset(ldr *loader.Loader, s loader.Sym) (loader.Sym, int64) { +func FoldSubSymbolOffset(ldr *loader.Loader, s loader.Sym) (loader.Sym, int64) { outer := ldr.OuterSym(s) off := int64(0) if outer != 0 { @@ -352,7 +352,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // set up addend for eventual relocation via outer symbol. rs := rs - rs, off := foldSubSymbolOffset(ldr, rs) + rs, off := FoldSubSymbolOffset(ldr, rs) rr.Xadd = r.Add() + off rst := ldr.SymType(rs) if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { @@ -483,7 +483,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // set up addend for eventual relocation via outer symbol. rs := rs - rs, off := foldSubSymbolOffset(ldr, rs) + rs, off := FoldSubSymbolOffset(ldr, rs) rr.Xadd = r.Add() + off rr.Xadd -= int64(siz) // relative to address after the relocated chunk rst := ldr.SymType(rs) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index fe1dbd2136..b2841780a2 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -319,7 +319,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - newreloc := ctxt.IsAMD64() || ctxt.Is386() || ctxt.IsWasm() || ctxt.IsS390X() + newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS64() || ctxt.IsS390X() || ctxt.IsWasm() if newreloc { bench.Start("reloc") ctxt.reloc() diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 58011a9d6f..9024ef0060 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -101,63 +101,63 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se return false } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { +func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { + rs := r.Sym() + rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { - switch r.Type { + switch r.Type() { default: - return val, false + return val, false, false + case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - r.Done = false - // set up addend for eventual relocation via outer symbol. - rs := ld.ApplyOuterToXAdd(r) - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } - r.Xsym = rs + rr.Xsym = rs + return val, true, true - return val, true case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - return val, true + rr.Xsym = rs + rr.Xadd = r.Add() + return val, true, true } } - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(syms.GOT), true + const isOk = true + const noExtReloc = false + switch r.Type() { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - t := ld.Symaddr(r.Sym) + r.Add - o1 := target.Arch.ByteOrder.Uint32(s.P[r.Off:]) - if r.Type == objabi.R_ADDRMIPS { - return int64(o1&0xffff0000 | uint32(t)&0xffff), true + t := ldr.SymValue(rs) + r.Add() + o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) + if r.Type() == objabi.R_ADDRMIPS { + return int64(o1&0xffff0000 | uint32(t)&0xffff), noExtReloc, isOk } - return int64(o1&0xffff0000 | uint32((t+1<<15)>>16)&0xffff), true + return int64(o1&0xffff0000 | uint32((t+1<<15)>>16)&0xffff), noExtReloc, isOk case objabi.R_ADDRMIPSTLS: // thread pointer is at 0x7000 offset from the start of TLS data area - t := ld.Symaddr(r.Sym) + r.Add - 0x7000 + t := ldr.SymValue(rs) + r.Add() - 0x7000 if t < -32768 || t >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", t) + ldr.Errorf(s, "TLS offset out of range %d", t) } - o1 := target.Arch.ByteOrder.Uint32(s.P[r.Off:]) - return int64(o1&0xffff0000 | uint32(t)&0xffff), true + o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) + return int64(o1&0xffff0000 | uint32(t)&0xffff), noExtReloc, isOk case objabi.R_CALLMIPS, objabi.R_JMPMIPS: // Low 26 bits = (S + A) >> 2 - t := ld.Symaddr(r.Sym) + r.Add - o1 := target.Arch.ByteOrder.Uint32(s.P[r.Off:]) - return int64(o1&0xfc000000 | uint32(t>>2)&^0xfc000000), true + t := ldr.SymValue(rs) + r.Add() + o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) + return int64(o1&0xfc000000 | uint32(t>>2)&^0xfc000000), noExtReloc, isOk } - return val, false + return val, false, false } func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index b5f7ae1405..ab23c342b3 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -50,7 +50,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfreglr: dwarfRegLR, Adddynrel: adddynrel, Archinit: archinit, - Archreloc: archreloc, + Archreloc2: archreloc2, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, -- GitLab From 9408417d449f9241b81e83841a701c1dbeb9a4ac Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Apr 2020 18:59:15 -0400 Subject: [PATCH 0008/1792] [dev.link] cmd/link: use new reloc pass on MIPS Change-Id: Icb4e44bf2d02e7064d96fe644c731b545d32a086 Reviewed-on: https://go-review.googlesource.com/c/go/+/231938 Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/mips/asm.go | 67 ++++++++++++++++--------------- src/cmd/link/internal/mips/obj.go | 2 +- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index b2841780a2..c82402699f 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -319,7 +319,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS64() || ctxt.IsS390X() || ctxt.IsWasm() + newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsS390X() || ctxt.IsWasm() if newreloc { bench.Start("reloc") ctxt.reloc() diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 73c578475c..ae37d3cdaf 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -84,9 +84,9 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se return false } -func applyrel(arch *sys.Arch, r *sym.Reloc, s *sym.Symbol, val int64, t int64) int64 { - o := arch.ByteOrder.Uint32(s.P[r.Off:]) - switch r.Type { +func applyrel(arch *sys.Arch, ldr *loader.Loader, rt objabi.RelocType, off int32, s loader.Sym, val int64, t int64) int64 { + o := arch.ByteOrder.Uint32(ldr.OutData(s)[off:]) + switch rt { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSTLS: return int64(o&0xffff0000 | uint32(t)&0xffff) case objabi.R_ADDRMIPSU: @@ -98,60 +98,61 @@ func applyrel(arch *sys.Arch, r *sym.Reloc, s *sym.Symbol, val int64, t int64) i } } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { +func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { + rs := r.Sym() + rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { - switch r.Type { + switch r.Type() { default: - return val, false - case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - r.Done = false + return val, false, false + case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: // set up addend for eventual relocation via outer symbol. - rs := ld.ApplyOuterToXAdd(r) - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } - r.Xsym = rs - return applyrel(target.Arch, r, s, val, r.Xadd), true + rr.Xsym = rs + return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), true, true + case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - return applyrel(target.Arch, r, s, val, r.Add), true + rr.Xsym = rs + rr.Xadd = r.Add() + return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), true, true } } - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(syms.GOT), true + const isOk = true + const noExtReloc = false + switch rt := r.Type(); rt { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - t := ld.Symaddr(r.Sym) + r.Add - return applyrel(target.Arch, r, s, val, t), true + t := ldr.SymValue(rs) + r.Add() + return applyrel(target.Arch, ldr, rt, r.Off(), s, val, t), noExtReloc, isOk case objabi.R_CALLMIPS, objabi.R_JMPMIPS: - t := ld.Symaddr(r.Sym) + r.Add + t := ldr.SymValue(rs) + r.Add() if t&3 != 0 { - ld.Errorf(s, "direct call is not aligned: %s %x", r.Sym.Name, t) + ldr.Errorf(s, "direct call is not aligned: %s %x", ldr.SymName(rs), t) } // check if target address is in the same 256 MB region as the next instruction - if (s.Value+int64(r.Off)+4)&0xf0000000 != (t & 0xf0000000) { - ld.Errorf(s, "direct call too far: %s %x", r.Sym.Name, t) + if (ldr.SymValue(s)+int64(r.Off())+4)&0xf0000000 != (t & 0xf0000000) { + ldr.Errorf(s, "direct call too far: %s %x", ldr.SymName(rs), t) } - return applyrel(target.Arch, r, s, val, t), true + return applyrel(target.Arch, ldr, rt, r.Off(), s, val, t), noExtReloc, isOk case objabi.R_ADDRMIPSTLS: // thread pointer is at 0x7000 offset from the start of TLS data area - t := ld.Symaddr(r.Sym) + r.Add - 0x7000 + t := ldr.SymValue(rs) + r.Add() - 0x7000 if t < -32768 || t >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", t) + ldr.Errorf(s, "TLS offset out of range %d", t) } - return applyrel(target.Arch, r, s, val, t), true + return applyrel(target.Arch, ldr, rt, r.Off(), s, val, t), noExtReloc, isOk } - return val, false + return val, false, false } func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index b646adaf40..c309a85052 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -51,7 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel: adddynrel, Archinit: archinit, - Archreloc: archreloc, + Archreloc2: archreloc2, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, -- GitLab From 9f80d91b131c849beb70fe380430be87ce7ad3b9 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Apr 2020 19:07:57 -0400 Subject: [PATCH 0009/1792] [dev.link] cmd/link: use new reloc pass on RISCV64 Change-Id: I119e8d91454ea0a594ec7a04383d0a318bc7157f Reviewed-on: https://go-review.googlesource.com/c/go/+/232018 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/riscv64/asm.go | 28 +++++++++++++++------------- src/cmd/link/internal/riscv64/obj.go | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index c82402699f..4ec6a78203 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -319,7 +319,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsS390X() || ctxt.IsWasm() + newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() if newreloc { bench.Start("reloc") ctxt.reloc() diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index 5183de8d6b..e259ef40f2 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -42,43 +42,45 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se return false } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - switch r.Type { +func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { + rs := r.Sym() + rs = ldr.ResolveABIAlias(rs) + switch r.Type() { case objabi.R_CALLRISCV: // Nothing to do. - return val, true + return val, false, true case objabi.R_RISCV_PCREL_ITYPE, objabi.R_RISCV_PCREL_STYPE: - pc := s.Value + int64(r.Off) - off := ld.Symaddr(r.Sym) + r.Add - pc + pc := ldr.SymValue(s) + int64(r.Off()) + off := ldr.SymValue(rs) + r.Add() - pc // Generate AUIPC and second instruction immediates. low, high, err := riscv.Split32BitImmediate(off) if err != nil { - ld.Errorf(s, "R_RISCV_PCREL_ relocation does not fit in 32-bits: %d", off) + ldr.Errorf(s, "R_RISCV_PCREL_ relocation does not fit in 32-bits: %d", off) } auipcImm, err := riscv.EncodeUImmediate(high) if err != nil { - ld.Errorf(s, "cannot encode R_RISCV_PCREL_ AUIPC relocation offset for %s: %v", r.Sym.Name, err) + ldr.Errorf(s, "cannot encode R_RISCV_PCREL_ AUIPC relocation offset for %s: %v", ldr.SymName(rs), err) } var secondImm, secondImmMask int64 - switch r.Type { + switch r.Type() { case objabi.R_RISCV_PCREL_ITYPE: secondImmMask = riscv.ITypeImmMask secondImm, err = riscv.EncodeIImmediate(low) if err != nil { - ld.Errorf(s, "cannot encode R_RISCV_PCREL_ITYPE I-type instruction relocation offset for %s: %v", r.Sym.Name, err) + ldr.Errorf(s, "cannot encode R_RISCV_PCREL_ITYPE I-type instruction relocation offset for %s: %v", ldr.SymName(rs), err) } case objabi.R_RISCV_PCREL_STYPE: secondImmMask = riscv.STypeImmMask secondImm, err = riscv.EncodeSImmediate(low) if err != nil { - ld.Errorf(s, "cannot encode R_RISCV_PCREL_STYPE S-type instruction relocation offset for %s: %v", r.Sym.Name, err) + ldr.Errorf(s, "cannot encode R_RISCV_PCREL_STYPE S-type instruction relocation offset for %s: %v", ldr.SymName(rs), err) } default: - panic(fmt.Sprintf("Unknown relocation type: %v", r.Type)) + panic(fmt.Sprintf("Unknown relocation type: %v", r.Type())) } auipc := int64(uint32(val)) @@ -87,10 +89,10 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol auipc = (auipc &^ riscv.UTypeImmMask) | int64(uint32(auipcImm)) second = (second &^ secondImmMask) | int64(uint32(secondImm)) - return second<<32 | auipc, true + return second<<32 | auipc, false, true } - return val, false + return val, false, false } func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { diff --git a/src/cmd/link/internal/riscv64/obj.go b/src/cmd/link/internal/riscv64/obj.go index 4fa0ebe79a..53d6bfb660 100644 --- a/src/cmd/link/internal/riscv64/obj.go +++ b/src/cmd/link/internal/riscv64/obj.go @@ -22,7 +22,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel: adddynrel, Archinit: archinit, - Archreloc: archreloc, + Archreloc2: archreloc2, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, -- GitLab From afbf9d47dd993fe235c58df611a3fdb4eb526bfc Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 5 May 2020 00:00:54 -0400 Subject: [PATCH 0010/1792] [dev.link] cmd/link: use new reloc pass on ARM Change-Id: I7dde19dbc0b912c4d2446c90364f86e7213add81 Reviewed-on: https://go-review.googlesource.com/c/go/+/232299 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/arm/asm.go | 70 +++++++++++++------------------- src/cmd/link/internal/arm/obj.go | 2 +- src/cmd/link/internal/ld/main.go | 2 +- 3 files changed, 30 insertions(+), 44 deletions(-) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 793c2d3a2c..d33ea9d54a 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -522,72 +522,58 @@ func gentrampdyn(arch *sys.Arch, tramp *loader.SymbolBuilder, target loader.Sym, tramp.AddReloc(r) } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { +func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { + rs := r.Sym() + rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { - switch r.Type { + switch r.Type() { case objabi.R_CALLARM: - r.Done = false - // set up addend for eventual relocation via outer symbol. - rs := r.Sym - r.Xadd = int64(signext24(r.Add & 0xffffff)) - r.Xadd *= 4 - if rs.Outer != nil { - r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer) - rs = rs.Outer - } - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) - } - r.Xsym = rs - - // ld64 for arm seems to want the symbol table to contain offset - // into the section rather than pseudo virtual address that contains - // the section load address. - // we need to compensate that by removing the instruction's address - // from addend. - if target.IsDarwin() { - r.Xadd -= ld.Symaddr(s) + int64(r.Off) + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = int64(signext24(r.Add() & 0xffffff)) + rr.Xadd *= 4 + rr.Xadd += off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } + rr.Xsym = rs - if r.Xadd/4 > 0x7fffff || r.Xadd/4 < -0x800000 { - ld.Errorf(s, "direct call too far %d", r.Xadd/4) + if rr.Xadd/4 > 0x7fffff || rr.Xadd/4 < -0x800000 { + ldr.Errorf(s, "direct call too far %d", rr.Xadd/4) } - return int64(braddoff(int32(0xff000000&uint32(r.Add)), int32(0xffffff&uint32(r.Xadd/4)))), true + return int64(braddoff(int32(0xff000000&uint32(r.Add())), int32(0xffffff&uint32(rr.Xadd/4)))), true, true } - return -1, false + return -1, false, false } - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(syms.GOT), true - + const isOk = true + const noExtReloc = false + switch r.Type() { // The following three arch specific relocations are only for generation of // Linux/ARM ELF's PLT entry (3 assembler instruction) case objabi.R_PLT0: // add ip, pc, #0xXX00000 - if ld.Symaddr(syms.GOTPLT) < ld.Symaddr(syms.PLT) { - ld.Errorf(s, ".got.plt should be placed after .plt section.") + if ldr.SymValue(syms.GOTPLT2) < ldr.SymValue(syms.PLT2) { + ldr.Errorf(s, ".got.plt should be placed after .plt section.") } - return 0xe28fc600 + (0xff & (int64(uint32(ld.Symaddr(r.Sym)-(ld.Symaddr(syms.PLT)+int64(r.Off))+r.Add)) >> 20)), true + return 0xe28fc600 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add())) >> 20)), noExtReloc, isOk case objabi.R_PLT1: // add ip, ip, #0xYY000 - return 0xe28cca00 + (0xff & (int64(uint32(ld.Symaddr(r.Sym)-(ld.Symaddr(syms.PLT)+int64(r.Off))+r.Add+4)) >> 12)), true + return 0xe28cca00 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add()+4)) >> 12)), noExtReloc, isOk case objabi.R_PLT2: // ldr pc, [ip, #0xZZZ]! - return 0xe5bcf000 + (0xfff & int64(uint32(ld.Symaddr(r.Sym)-(ld.Symaddr(syms.PLT)+int64(r.Off))+r.Add+8))), true + return 0xe5bcf000 + (0xfff & int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add()+8))), noExtReloc, isOk case objabi.R_CALLARM: // bl XXXXXX or b YYYYYY // r.Add is the instruction // low 24-bit encodes the target address - t := (ld.Symaddr(r.Sym) + int64(signext24(r.Add&0xffffff)*4) - (s.Value + int64(r.Off))) / 4 + t := (ldr.SymValue(rs) + int64(signext24(r.Add()&0xffffff)*4) - (ldr.SymValue(s) + int64(r.Off()))) / 4 if t > 0x7fffff || t < -0x800000 { - ld.Errorf(s, "direct call too far: %s %x", r.Sym.Name, t) + ldr.Errorf(s, "direct call too far: %s %x", ldr.SymName(rs), t) } - return int64(braddoff(int32(0xff000000&uint32(r.Add)), int32(0xffffff&t))), true + return int64(braddoff(int32(0xff000000&uint32(r.Add())), int32(0xffffff&t))), noExtReloc, isOk } - return val, false + return val, false, false } func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index 653f16dba1..ed62cc804b 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -48,7 +48,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel2: adddynrel2, Archinit: archinit, - Archreloc: archreloc, + Archreloc2: archreloc2, Archrelocvariant: archrelocvariant, Trampoline: trampoline, Asmb: asmb, diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 4ec6a78203..394c8bfa16 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -319,7 +319,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() + newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsARM() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() if newreloc { bench.Start("reloc") ctxt.reloc() -- GitLab From 9a097ea8f2e7d00606481c4a5dcddfb8c519ce1b Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 4 May 2020 14:24:03 -0400 Subject: [PATCH 0011/1792] [dev.link] cmd/link: remove elderly ld bug workaround on arm64 The arm64 archreloc method contains a workaround for a 2015-era binutils/linker bug, https://sourceware.org/bugzilla/show_bug.cgi?id=18270. This bug has been fixed for some time now, so remove the workaround for it (the workaround includes some code that mutates a relocation type, which is something we want to void doing in the new linker). Change-Id: I9b7584e4daad240bbb85de673d704731705c8148 Reviewed-on: https://go-review.googlesource.com/c/go/+/232200 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/arm64/asm.go | 33 ++---------------------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 7fedb04bc8..0d26878699 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -445,37 +445,8 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol switch r.Type { default: return val, false - case objabi.R_ARM64_GOTPCREL: - var o1, o2 uint32 - if target.IsBigEndian() { - o1 = uint32(val >> 32) - o2 = uint32(val) - } else { - o1 = uint32(val) - o2 = uint32(val >> 32) - } - // Any relocation against a function symbol is redirected to - // be against a local symbol instead (see putelfsym in - // symtab.go) but unfortunately the system linker was buggy - // when confronted with a R_AARCH64_ADR_GOT_PAGE relocation - // against a local symbol until May 2015 - // (https://sourceware.org/bugzilla/show_bug.cgi?id=18270). So - // we convert the adrp; ld64 + R_ARM64_GOTPCREL into adrp; - // add + R_ADDRARM64. - if !(r.Sym.IsFileLocal() || r.Sym.Attr.VisibilityHidden() || r.Sym.Attr.Local()) && r.Sym.Type == sym.STEXT && target.IsDynlinkingGo() { - if o2&0xffc00000 != 0xf9400000 { - ld.Errorf(s, "R_ARM64_GOTPCREL against unexpected instruction %x", o2) - } - o2 = 0x91000000 | (o2 & 0x000003ff) - r.Type = objabi.R_ADDRARM64 - } - if target.IsBigEndian() { - val = int64(o1)<<32 | int64(o2) - } else { - val = int64(o2)<<32 | int64(o1) - } - fallthrough - case objabi.R_ADDRARM64: + case objabi.R_ARM64_GOTPCREL, + objabi.R_ADDRARM64: r.Done = false // set up addend for eventual relocation via outer symbol. -- GitLab From dc048e24abe0954f2ce9e022974e6e1d718f6778 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 4 May 2020 14:19:22 -0400 Subject: [PATCH 0012/1792] [dev.link] cmd/link: convert archreloc for arm64 Switch to using loader interfaces for the arm64 version of archreloc. Change-Id: I12608a95d27622a7d578a2943a35fa8c89c11d52 Reviewed-on: https://go-review.googlesource.com/c/go/+/232201 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/arm64/asm.go | 149 ++++++++++++++--------------- src/cmd/link/internal/arm64/obj.go | 2 +- src/cmd/link/internal/ld/main.go | 3 +- 3 files changed, 76 insertions(+), 78 deletions(-) diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 0d26878699..54a9d9556e 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -440,21 +440,26 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se return true } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { +func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (int64, bool, bool) { + const extRelocNeeded = true + const extRelocNotNeeded = false + const isOk = true + + rs := ldr.ResolveABIAlias(r.Sym()) + if target.IsExternal() { - switch r.Type { + switch r.Type() { default: - return val, false case objabi.R_ARM64_GOTPCREL, objabi.R_ADDRARM64: - r.Done = false - // set up addend for eventual relocation via outer symbol. - rs := ld.ApplyOuterToXAdd(r) - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } - r.Xsym = rs + rr.Xsym = rs // Note: ld64 currently has a bug that any non-zero addend for BR26 relocation // will make the linking fail because it thinks the code is not PIC even though @@ -476,9 +481,9 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol // can only encode 24-bit of signed addend, but the instructions // supports 33-bit of signed addend, so we always encode the // addend in place. - o0 |= (uint32((r.Xadd>>12)&3) << 29) | (uint32((r.Xadd>>12>>2)&0x7ffff) << 5) - o1 |= uint32(r.Xadd&0xfff) << 10 - r.Xadd = 0 + o0 |= (uint32((rr.Xadd>>12)&3) << 29) | (uint32((rr.Xadd>>12>>2)&0x7ffff) << 5) + o1 |= uint32(rr.Xadd&0xfff) << 10 + rr.Xadd = 0 // when laid out, the instruction order must always be o1, o2. if target.IsBigEndian() { @@ -488,28 +493,21 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol } } - return val, true + return val, extRelocNeeded, isOk case objabi.R_CALLARM64, objabi.R_ARM64_TLS_LE, objabi.R_ARM64_TLS_IE: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add - return val, true + rr.Xsym = rs + rr.Xadd = r.Add() + return val, extRelocNeeded, isOk } } - switch r.Type { - case objabi.R_CONST: - return r.Add, true - - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(syms.GOT), true - + switch r.Type() { case objabi.R_ADDRARM64: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) if t >= 1<<32 || t < -1<<32 { - ld.Errorf(s, "program too large, address relocation distance = %d", t) + ldr.Errorf(s, "program too large, address relocation distance = %d", t) } var o0, o1 uint32 @@ -527,37 +525,36 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol // when laid out, the instruction order must always be o1, o2. if target.IsBigEndian() { - return int64(o0)<<32 | int64(o1), true + return int64(o0)<<32 | int64(o1), extRelocNotNeeded, true } - return int64(o1)<<32 | int64(o0), true + return int64(o1)<<32 | int64(o0), extRelocNotNeeded, true case objabi.R_ARM64_TLS_LE: - r.Done = false if target.IsDarwin() { - ld.Errorf(s, "TLS reloc on unsupported OS %v", target.HeadType) + ldr.Errorf(s, "TLS reloc on unsupported OS %v", target.HeadType) } // The TCB is two pointers. This is not documented anywhere, but is // de facto part of the ABI. - v := r.Sym.Value + int64(2*target.Arch.PtrSize) + v := ldr.SymValue(rs) + int64(2*target.Arch.PtrSize) if v < 0 || v >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", v) + ldr.Errorf(s, "TLS offset out of range %d", v) } - return val | (v << 5), true + return val | (v << 5), extRelocNeeded, true case objabi.R_ARM64_TLS_IE: if target.IsPIE() && target.IsElf() { // We are linking the final executable, so we // can optimize any TLS IE relocation to LE. - r.Done = false + if !target.IsLinux() { - ld.Errorf(s, "TLS reloc on unsupported OS %v", target.HeadType) + ldr.Errorf(s, "TLS reloc on unsupported OS %v", target.HeadType) } // The TCB is two pointers. This is not documented anywhere, but is // de facto part of the ABI. - v := ld.Symaddr(r.Sym) + int64(2*target.Arch.PtrSize) + r.Add + v := ldr.SymAddr(rs) + int64(2*target.Arch.PtrSize) + r.Add() if v < 0 || v >= 32678 { - ld.Errorf(s, "TLS offset out of range %d", v) + ldr.Errorf(s, "TLS offset out of range %d", v) } var o0, o1 uint32 @@ -575,107 +572,109 @@ func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol // R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC // turn LD64 to MOVK if v&3 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC", v) + ldr.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC", v) } o1 = 0xf2800000 | uint32(o1&0x1f) | (uint32(v&0xffff) << 5) // when laid out, the instruction order must always be o0, o1. if target.IsBigEndian() { - return int64(o0)<<32 | int64(o1), true + return int64(o0)<<32 | int64(o1), extRelocNotNeeded, isOk } - return int64(o1)<<32 | int64(o0), true + return int64(o1)<<32 | int64(o0), extRelocNotNeeded, isOk } else { - log.Fatalf("cannot handle R_ARM64_TLS_IE (sym %s) when linking internally", s.Name) + log.Fatalf("cannot handle R_ARM64_TLS_IE (sym %s) when linking internally", ldr.SymName(s)) } case objabi.R_CALLARM64: var t int64 - if r.Sym.Type == sym.SDYNIMPORT { - t = (ld.Symaddr(syms.PLT) + r.Add) - (s.Value + int64(r.Off)) + if ldr.SymType(rs) == sym.SDYNIMPORT { + t = (ldr.SymAddr(syms.PLT2) + r.Add()) - (ldr.SymValue(s) + int64(r.Off())) } else { - t = (ld.Symaddr(r.Sym) + r.Add) - (s.Value + int64(r.Off)) + t = (ldr.SymAddr(rs) + r.Add()) - (ldr.SymValue(s) + int64(r.Off())) } if t >= 1<<27 || t < -1<<27 { - ld.Errorf(s, "program too large, call relocation distance = %d", t) + ldr.Errorf(s, "program too large, call relocation distance = %d", t) } - return val | ((t >> 2) & 0x03ffffff), true + return val | ((t >> 2) & 0x03ffffff), extRelocNotNeeded, true case objabi.R_ARM64_GOT: - if s.P[r.Off+3]&0x9f == 0x90 { + sData := ldr.Data(s) + if sData[r.Off()+3]&0x9f == 0x90 { // R_AARCH64_ADR_GOT_PAGE // patch instruction: adrp - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) if t >= 1<<32 || t < -1<<32 { - ld.Errorf(s, "program too large, address relocation distance = %d", t) + ldr.Errorf(s, "program too large, address relocation distance = %d", t) } var o0 uint32 o0 |= (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) - return val | int64(o0), true - } else if s.P[r.Off+3] == 0xf9 { + return val | int64(o0), extRelocNotNeeded, isOk + } else if sData[r.Off()+3] == 0xf9 { // R_AARCH64_LD64_GOT_LO12_NC // patch instruction: ldr - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) if t&7 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LD64_GOT_LO12_NC", t) + ldr.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LD64_GOT_LO12_NC", t) } var o1 uint32 o1 |= uint32(t&0xfff) << (10 - 3) - return val | int64(uint64(o1)), true + return val | int64(uint64(o1)), extRelocNotNeeded, isOk } else { - ld.Errorf(s, "unsupported instruction for %v R_GOTARM64", s.P[r.Off:r.Off+4]) + ldr.Errorf(s, "unsupported instruction for %v R_GOTARM64", sData[r.Off():r.Off()+4]) } case objabi.R_ARM64_PCREL: - if s.P[r.Off+3]&0x9f == 0x90 { + sData := ldr.Data(s) + if sData[r.Off()+3]&0x9f == 0x90 { // R_AARCH64_ADR_PREL_PG_HI21 // patch instruction: adrp - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) if t >= 1<<32 || t < -1<<32 { - ld.Errorf(s, "program too large, address relocation distance = %d", t) + ldr.Errorf(s, "program too large, address relocation distance = %d", t) } o0 := (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) - return val | int64(o0), true - } else if s.P[r.Off+3]&0x91 == 0x91 { + return val | int64(o0), extRelocNotNeeded, isOk + } else if sData[r.Off()+3]&0x91 == 0x91 { // R_AARCH64_ADD_ABS_LO12_NC // patch instruction: add - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) o1 := uint32(t&0xfff) << 10 - return val | int64(o1), true + return val | int64(o1), extRelocNotNeeded, isOk } else { - ld.Errorf(s, "unsupported instruction for %v R_PCRELARM64", s.P[r.Off:r.Off+4]) + ldr.Errorf(s, "unsupported instruction for %v R_PCRELARM64", sData[r.Off():r.Off()+4]) } case objabi.R_ARM64_LDST8: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) o0 := uint32(t&0xfff) << 10 - return val | int64(o0), true + return val | int64(o0), extRelocNotNeeded, true case objabi.R_ARM64_LDST32: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) if t&3 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST32_ABS_LO12_NC", t) + ldr.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST32_ABS_LO12_NC", t) } o0 := (uint32(t&0xfff) >> 2) << 10 - return val | int64(o0), true + return val | int64(o0), extRelocNotNeeded, true case objabi.R_ARM64_LDST64: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) if t&7 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST64_ABS_LO12_NC", t) + ldr.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST64_ABS_LO12_NC", t) } o0 := (uint32(t&0xfff) >> 3) << 10 - return val | int64(o0), true + return val | int64(o0), extRelocNotNeeded, true case objabi.R_ARM64_LDST128: - t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff) + t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) if t&15 != 0 { - ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST128_ABS_LO12_NC", t) + ldr.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST128_ABS_LO12_NC", t) } o0 := (uint32(t&0xfff) >> 4) << 10 - return val | int64(o0), true + return val | int64(o0), extRelocNotNeeded, true } - return val, false + return val, false, false } func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index ffce0cb17d..8ccb8685c5 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -48,7 +48,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel2: adddynrel2, Archinit: archinit, - Archreloc: archreloc, + Archreloc2: archreloc2, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 394c8bfa16..80be4d95be 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -318,8 +318,7 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("Asmb") ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - - newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsARM() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() + newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsARM() || ctxt.IsARM64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() if newreloc { bench.Start("reloc") ctxt.reloc() -- GitLab From 2867a855413ac7cb10c1e5ca5b68f15c0125b40f Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 6 May 2020 12:06:52 -0400 Subject: [PATCH 0013/1792] [dev.link] cmd/link: delete undef pass The undef pass basically double-checks the relocation targets are defined. We already do that in the reloc pass, and for external relocations we check that when we emit relocations. The undef pass doesn't seem necessary. Change-Id: Iecfa654dc014fdc6e59c624cbf5948ad65fd367a Reviewed-on: https://go-review.googlesource.com/c/go/+/232577 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/lib.go | 43 -------------------------------- src/cmd/link/internal/ld/main.go | 2 -- 2 files changed, 45 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index c5c38d4b47..a612bfadec 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2692,49 +2692,6 @@ func Entryvalue(ctxt *Link) int64 { return s.Value } -func undefsym(ctxt *Link, s *sym.Symbol) { - var r *sym.Reloc - - for i := 0; i < len(s.R); i++ { - r = &s.R[i] - if r.Sym == nil { // happens for some external ARM relocs - continue - } - // TODO(mwhudson): the test of VisibilityHidden here probably doesn't make - // sense and should be removed when someone has thought about it properly. - if (r.Sym.Type == sym.Sxxx || r.Sym.Type == sym.SXREF) && !r.Sym.Attr.VisibilityHidden() { - Errorf(s, "undefined: %q", r.Sym.Name) - } - if !r.Sym.Attr.Reachable() && r.Type != objabi.R_WEAKADDROFF { - Errorf(s, "relocation target %q", r.Sym.Name) - } - } -} - -func (ctxt *Link) undef() { - // undefsym performs checks (almost) identical to checks - // that report undefined relocations in relocsym. - // Both undefsym and relocsym can report same symbol as undefined, - // which results in error message duplication (see #10978). - // - // The undef is run after Arch.Asmb and could detect some - // programming errors there, but if object being linked is already - // failed with errors, it is better to avoid duplicated errors. - if nerrors > 0 { - return - } - - for _, s := range ctxt.Textp { - undefsym(ctxt, s) - } - for _, s := range ctxt.datap { - undefsym(ctxt, s) - } - if nerrors > 0 { - errorexit() - } -} - func (ctxt *Link) callgraph() { if !*FlagC { return diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 80be4d95be..7d3f25540d 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -343,8 +343,6 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("Munmap") ctxt.Out.Close() // Close handles Munmapping if necessary. - bench.Start("undef") - ctxt.undef() bench.Start("hostlink") ctxt.hostlink() if ctxt.Debugvlog != 0 { -- GitLab From 75ca90e309117b132bf2c95c691b55502bf2eaca Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 6 May 2020 12:33:36 -0400 Subject: [PATCH 0014/1792] [dev.link] cmd/link: convert asmb2 pass to new style on darwin Now we no longer do loadlibfull on darwin. While here, remove residual darwin/386 and darwin/arm code. Change-Id: I6efdcd81baeeca29d1fe91c4fab0cc8241a58e2d Reviewed-on: https://go-review.googlesource.com/c/go/+/232597 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/asm.go | 19 +-- src/cmd/link/internal/arm/asm.go | 2 +- src/cmd/link/internal/arm64/asm.go | 24 ++-- src/cmd/link/internal/ld/lib.go | 18 ++- src/cmd/link/internal/ld/macho.go | 194 ++++++++++++--------------- src/cmd/link/internal/ld/main.go | 21 +-- src/cmd/link/internal/mips/asm.go | 2 +- src/cmd/link/internal/mips64/asm.go | 2 +- src/cmd/link/internal/ppc64/asm.go | 2 +- src/cmd/link/internal/riscv64/asm.go | 2 +- src/cmd/link/internal/s390x/asm.go | 2 +- src/cmd/link/internal/x86/asm.go | 2 +- 12 files changed, 148 insertions(+), 142 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index c2d54703c1..f2b76fb78b 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -458,28 +458,29 @@ func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo return true } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { var v uint32 rs := r.Xsym + rt := r.Type() - if rs.Type == sym.SHOSTOBJ || r.Type == objabi.R_PCREL || r.Type == objabi.R_GOTPCREL || r.Type == objabi.R_CALL { - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) + if ldr.SymType(rs) == sym.SHOSTOBJ || rt == objabi.R_PCREL || rt == objabi.R_GOTPCREL || rt == objabi.R_CALL { + 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 } - v = uint32(rs.Dynid) + v = uint32(ldr.SymDynid(rs)) v |= 1 << 27 // external relocation } else { - v = uint32(rs.Sect.Extnum) + v = uint32(ldr.SymSect(rs).Extnum) if v == 0 { - ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Sect.Name, rs.Type, rs.Type) + ldr.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymSect(rs).Name, ldr.SymType(rs), ldr.SymType(rs)) return false } } - switch r.Type { + switch rt { default: return false @@ -499,7 +500,7 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se v |= ld.MACHO_X86_64_RELOC_GOT_LOAD << 28 } - switch r.Siz { + switch r.Siz() { default: return false diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index d33ea9d54a..e01124f0a9 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -318,7 +318,7 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S } } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { return false } diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 54a9d9556e..d28e3efbb4 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -371,41 +371,43 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { return true } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { var v uint32 rs := r.Xsym + rt := r.Type() + siz := r.Siz() - if rs.Type == sym.SHOSTOBJ || r.Type == objabi.R_CALLARM64 || r.Type == objabi.R_ADDRARM64 { - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) + if ldr.SymType(rs) == sym.SHOSTOBJ || rt == objabi.R_CALLARM64 || rt == objabi.R_ADDRARM64 { + 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 } - v = uint32(rs.Dynid) + v = uint32(ldr.SymDynid(rs)) v |= 1 << 27 // external relocation } else { - v = uint32(rs.Sect.Extnum) + v = uint32(ldr.SymSect(rs).Extnum) if v == 0 { - ld.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Sect.Name, rs.Type, rs.Type) + ldr.Errorf(s, "reloc %d (%s) to symbol %s in non-macho section %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymSect(rs).Name, ldr.SymType(rs), ldr.SymType(rs)) return false } } - switch r.Type { + switch rt { default: return false case objabi.R_ADDR: v |= ld.MACHO_ARM64_RELOC_UNSIGNED << 28 case objabi.R_CALLARM64: if r.Xadd != 0 { - ld.Errorf(s, "ld64 doesn't allow BR26 reloc with non-zero addend: %s+%d", rs.Name, r.Xadd) + ldr.Errorf(s, "ld64 doesn't allow BR26 reloc with non-zero addend: %s+%d", ldr.SymName(rs), r.Xadd) } v |= 1 << 24 // pc-relative bit v |= ld.MACHO_ARM64_RELOC_BRANCH26 << 28 case objabi.R_ADDRARM64: - r.Siz = 4 + siz = 4 // Two relocation entries: MACHO_ARM64_RELOC_PAGEOFF12 MACHO_ARM64_RELOC_PAGE21 // if r.Xadd is non-zero, add two MACHO_ARM64_RELOC_ADDEND. if r.Xadd != 0 { @@ -422,7 +424,7 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se v |= ld.MACHO_ARM64_RELOC_PAGE21 << 28 } - switch r.Siz { + switch siz { default: return false case 1: diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index a612bfadec..8fc1f737c2 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -277,7 +277,7 @@ type Arch struct { Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) Gentext func(*Link) Gentext2 func(*Link, *loader.Loader) - Machoreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool + Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool PEreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool Xcoffreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool @@ -2692,6 +2692,22 @@ func Entryvalue(ctxt *Link) int64 { return s.Value } +func Entryvalue2(ctxt *Link) int64 { + a := *flagEntrySymbol + if a[0] >= '0' && a[0] <= '9' { + return atolwhex(a) + } + s := ctxt.loader.Lookup(a, 0) + typ := ctxt.loader.SymType(s) + if typ == 0 { + return *FlagTextAddr + } + if ctxt.HeadType != objabi.Haix && typ != sym.STEXT { + ctxt.Errorf(s, "entry not text") + } + return ctxt.loader.SymValue(s) +} + func (ctxt *Link) callgraph() { if !*FlagC { return diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 4dc7f819eb..badb388b8f 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -501,9 +501,8 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string) var msect *MachoSect if sect.Rwx&1 == 0 && segname != "__DWARF" && (ctxt.Arch.Family == sys.ARM64 || - ctxt.Arch.Family == sys.ARM || (ctxt.Arch.Family == sys.AMD64 && ctxt.BuildMode != BuildModeExe)) { - // Darwin external linker on arm and arm64, and on amd64 in c-shared/c-archive buildmode + // Darwin external linker on arm64, and on amd64 in c-shared/c-archive buildmode // complains about absolute relocs in __TEXT, so if the section is not // executable, put it in __DATA segment. msect = newMachoSect(mseg, buf, "__DATA") @@ -551,7 +550,7 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string) if sect.Name == ".got" { msect.name = "__nl_symbol_ptr" msect.flag = S_NON_LAZY_SYMBOL_POINTERS - msect.res1 = uint32(ctxt.Syms.Lookup(".linkedit.plt", 0).Size / 4) /* offset into indirect symbol table */ + msect.res1 = uint32(ctxt.loader.SymSize(ctxt.ArchSyms.LinkEditPLT2) / 4) /* offset into indirect symbol table */ } if sect.Name == ".init_array" { @@ -584,10 +583,6 @@ func Asmbmacho(ctxt *Link) { default: Exitf("unknown macho architecture: %v", ctxt.Arch.Family) - case sys.ARM: - mh.cpu = MACHO_CPU_ARM - mh.subcpu = MACHO_SUBCPU_ARMV7 - case sys.AMD64: mh.cpu = MACHO_CPU_AMD64 mh.subcpu = MACHO_SUBCPU_X86 @@ -595,10 +590,6 @@ func Asmbmacho(ctxt *Link) { case sys.ARM64: mh.cpu = MACHO_CPU_ARM64 mh.subcpu = MACHO_SUBCPU_ARM64_ALL - - case sys.I386: - mh.cpu = MACHO_CPU_386 - mh.subcpu = MACHO_SUBCPU_X86 } var ms *MachoSeg @@ -669,45 +660,35 @@ func Asmbmacho(ctxt *Link) { default: Exitf("unknown macho architecture: %v", ctxt.Arch.Family) - case sys.ARM: - ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 17+2) - ml.data[0] = 1 /* thread type */ - ml.data[1] = 17 /* word count */ - ml.data[2+15] = uint32(Entryvalue(ctxt)) /* start pc */ - case sys.AMD64: ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 42+2) - ml.data[0] = 4 /* thread type */ - ml.data[1] = 42 /* word count */ - ml.data[2+32] = uint32(Entryvalue(ctxt)) /* start pc */ - ml.data[2+32+1] = uint32(Entryvalue(ctxt) >> 32) + ml.data[0] = 4 /* thread type */ + ml.data[1] = 42 /* word count */ + ml.data[2+32] = uint32(Entryvalue2(ctxt)) /* start pc */ + ml.data[2+32+1] = uint32(Entryvalue2(ctxt) >> 32) case sys.ARM64: ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 68+2) - ml.data[0] = 6 /* thread type */ - ml.data[1] = 68 /* word count */ - ml.data[2+64] = uint32(Entryvalue(ctxt)) /* start pc */ - ml.data[2+64+1] = uint32(Entryvalue(ctxt) >> 32) - - case sys.I386: - ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 16+2) - ml.data[0] = 1 /* thread type */ - ml.data[1] = 16 /* word count */ - ml.data[2+10] = uint32(Entryvalue(ctxt)) /* start pc */ + ml.data[0] = 6 /* thread type */ + ml.data[1] = 68 /* word count */ + ml.data[2+64] = uint32(Entryvalue2(ctxt)) /* start pc */ + ml.data[2+64+1] = uint32(Entryvalue2(ctxt) >> 32) } } if !*FlagD { + ldr := ctxt.loader + // must match domacholink below - s1 := ctxt.Syms.Lookup(".machosymtab", 0) - s2 := ctxt.Syms.Lookup(".linkedit.plt", 0) - s3 := ctxt.Syms.Lookup(".linkedit.got", 0) - s4 := ctxt.Syms.Lookup(".machosymstr", 0) + s1 := ldr.SymSize(ldr.Lookup(".machosymtab", 0)) + s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT2) + s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT2) + s4 := ldr.SymSize(ldr.Lookup(".machosymstr", 0)) if ctxt.LinkMode != LinkExternal { ms := newMachoSeg("__LINKEDIT", 0) ms.vaddr = uint64(va) + uint64(v) + uint64(Rnd(int64(Segdata.Length), int64(*FlagRound))) - ms.vsize = uint64(s1.Size) + uint64(s2.Size) + uint64(s3.Size) + uint64(s4.Size) + ms.vsize = uint64(s1) + uint64(s2) + uint64(s3) + uint64(s4) ms.fileoffset = uint64(linkoff) ms.filesize = ms.vsize ms.prot1 = 7 @@ -715,10 +696,10 @@ func Asmbmacho(ctxt *Link) { } ml := newMachoLoad(ctxt.Arch, LC_SYMTAB, 4) - ml.data[0] = uint32(linkoff) /* symoff */ - ml.data[1] = uint32(nsortsym) /* nsyms */ - ml.data[2] = uint32(linkoff + s1.Size + s2.Size + s3.Size) /* stroff */ - ml.data[3] = uint32(s4.Size) /* strsize */ + ml.data[0] = uint32(linkoff) /* symoff */ + ml.data[1] = uint32(nsortsym) /* nsyms */ + ml.data[2] = uint32(linkoff + s1 + s2 + s3) /* stroff */ + ml.data[3] = uint32(s4) /* strsize */ machodysymtab(ctxt) @@ -870,38 +851,39 @@ func machosymorder(ctxt *Link) { // // When dynamically linking, all non-local variables and plugin-exported // symbols need to be exported. -func machoShouldExport(ctxt *Link, s *sym.Symbol) bool { - if !ctxt.DynlinkingGo() || s.Attr.Local() { +func machoShouldExport(ctxt *Link, ldr *loader.Loader, s loader.Sym) bool { + if !ctxt.DynlinkingGo() || ldr.AttrLocal(s) { return false } - if ctxt.BuildMode == BuildModePlugin && strings.HasPrefix(s.Extname(), objabi.PathToPrefix(*flagPluginPath)) { + if ctxt.BuildMode == BuildModePlugin && strings.HasPrefix(ldr.SymExtname(s), objabi.PathToPrefix(*flagPluginPath)) { return true } - if strings.HasPrefix(s.Name, "go.itab.") { + name := ldr.RawSymName(s) + if strings.HasPrefix(name, "go.itab.") { return true } - if strings.HasPrefix(s.Name, "type.") && !strings.HasPrefix(s.Name, "type..") { + if strings.HasPrefix(name, "type.") && !strings.HasPrefix(name, "type..") { // reduce runtime typemap pressure, but do not // export alg functions (type..*), as these // appear in pclntable. return true } - if strings.HasPrefix(s.Name, "go.link.pkghash") { + if strings.HasPrefix(name, "go.link.pkghash") { return true } - return s.Type >= sym.SFirstWritable // only writable sections + return ldr.SymType(s) >= sym.SFirstWritable // only writable sections } func machosymtab(ctxt *Link) { - symtab := ctxt.Syms.Lookup(".machosymtab", 0) - symstr := ctxt.Syms.Lookup(".machosymstr", 0) + ldr := ctxt.loader + symtab := ldr.CreateSymForUpdate(".machosymtab", 0) + symstr := ldr.CreateSymForUpdate(".machosymstr", 0) - for i := 0; i < nsortsym; i++ { - s := ctxt.loader.Syms[sortsym[i]] - symtab.AddUint32(ctxt.Arch, uint32(symstr.Size)) + for _, s := range sortsym[:nsortsym] { + symtab.AddUint32(ctxt.Arch, uint32(symstr.Size())) - export := machoShouldExport(ctxt, s) - isGoSymbol := strings.Contains(s.Extname(), ".") + export := machoShouldExport(ctxt, ldr, s) + isGoSymbol := strings.Contains(ldr.SymExtname(s), ".") // In normal buildmodes, only add _ to C symbols, as // Go symbols have dot in the name. @@ -910,37 +892,37 @@ func machosymtab(ctxt *Link) { // symbols like crosscall2 are in pclntab and end up // pointing at the host binary, breaking unwinding. // See Issue #18190. - cexport := !isGoSymbol && (ctxt.BuildMode != BuildModePlugin || onlycsymbol(s.Name)) + cexport := !isGoSymbol && (ctxt.BuildMode != BuildModePlugin || onlycsymbol(ldr.SymName(s))) if cexport || export || isGoSymbol { symstr.AddUint8('_') } // replace "·" as ".", because DTrace cannot handle it. - Addstring(symstr, strings.Replace(s.Extname(), "·", ".", -1)) + symstr.Addstring(strings.Replace(ldr.SymExtname(s), "·", ".", -1)) - if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ || s.Type == sym.SUNDEFEXT { + if t := ldr.SymType(s); t == sym.SDYNIMPORT || t == sym.SHOSTOBJ || t == sym.SUNDEFEXT { symtab.AddUint8(0x01) // type N_EXT, external symbol symtab.AddUint8(0) // no section symtab.AddUint16(ctxt.Arch, 0) // desc symtab.AddUintXX(ctxt.Arch, 0, ctxt.Arch.PtrSize) // no value } else { - if s.Attr.CgoExport() || export { + if ldr.AttrCgoExport(s) || export { symtab.AddUint8(0x0f) } else { symtab.AddUint8(0x0e) } o := s - for o.Outer != nil { - o = o.Outer + if outer := ldr.OuterSym(o); outer != 0 { + o = outer } - if o.Sect == nil { - Errorf(s, "missing section for symbol") + if ldr.SymSect(o) == nil { + ldr.Errorf(s, "missing section for symbol") symtab.AddUint8(0) } else { - symtab.AddUint8(uint8(o.Sect.Extnum)) + symtab.AddUint8(uint8(ldr.SymSect(o).Extnum)) } symtab.AddUint16(ctxt.Arch, 0) // desc - symtab.AddUintXX(ctxt.Arch, uint64(Symaddr(s)), ctxt.Arch.PtrSize) + symtab.AddUintXX(ctxt.Arch, uint64(ldr.SymAddr(s)), ctxt.Arch.PtrSize) } } } @@ -967,13 +949,14 @@ func machodysymtab(ctxt *Link) { ml.data[10] = 0 /* extrefsymoff */ ml.data[11] = 0 /* nextrefsyms */ - // must match domacholink below - s1 := ctxt.Syms.Lookup(".machosymtab", 0) + ldr := ctxt.loader - s2 := ctxt.Syms.Lookup(".linkedit.plt", 0) - s3 := ctxt.Syms.Lookup(".linkedit.got", 0) - ml.data[12] = uint32(linkoff + s1.Size) /* indirectsymoff */ - ml.data[13] = uint32((s2.Size + s3.Size) / 4) /* nindirectsyms */ + // must match domacholink below + s1 := ldr.SymSize(ldr.Lookup(".machosymtab", 0)) + s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT2) + s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT2) + ml.data[12] = uint32(linkoff + s1) /* indirectsymoff */ + ml.data[13] = uint32((s2 + s3) / 4) /* nindirectsyms */ ml.data[14] = 0 /* extreloff */ ml.data[15] = 0 /* nextrel */ @@ -984,12 +967,13 @@ func machodysymtab(ctxt *Link) { func Domacholink(ctxt *Link) int64 { machosymtab(ctxt) - // write data that will be linkedit section - s1 := ctxt.Syms.Lookup(".machosymtab", 0) + ldr := ctxt.loader - s2 := ctxt.Syms.Lookup(".linkedit.plt", 0) - s3 := ctxt.Syms.Lookup(".linkedit.got", 0) - s4 := ctxt.Syms.Lookup(".machosymstr", 0) + // write data that will be linkedit section + s1 := ldr.Lookup(".machosymtab", 0) + s2 := ctxt.ArchSyms.LinkEditPLT2 + s3 := ctxt.ArchSyms.LinkEditGOT2 + s4 := ldr.Lookup(".machosymstr", 0) // Force the linkedit section to end on a 16-byte // boundary. This allows pure (non-cgo) Go binaries @@ -1008,26 +992,27 @@ func Domacholink(ctxt *Link) int64 { // boundary, codesign_allocate will not need to apply // any alignment padding itself, working around the // issue. - for s4.Size%16 != 0 { - s4.AddUint8(0) + s4b := ldr.MakeSymbolUpdater(s4) + for s4b.Size()%16 != 0 { + s4b.AddUint8(0) } - size := int(s1.Size + s2.Size + s3.Size + s4.Size) + size := int(ldr.SymSize(s1) + ldr.SymSize(s2) + ldr.SymSize(s3) + ldr.SymSize(s4)) if size > 0 { linkoff = Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound)) + Rnd(int64(Segdata.Filelen), int64(*FlagRound)) + Rnd(int64(Segdwarf.Filelen), int64(*FlagRound)) ctxt.Out.SeekSet(linkoff) - ctxt.Out.Write(s1.P[:s1.Size]) - ctxt.Out.Write(s2.P[:s2.Size]) - ctxt.Out.Write(s3.P[:s3.Size]) - ctxt.Out.Write(s4.P[:s4.Size]) + ctxt.Out.Write(ldr.Data(s1)) + ctxt.Out.Write(ldr.Data(s2)) + ctxt.Out.Write(ldr.Data(s3)) + ctxt.Out.Write(ldr.Data(s4)) } return Rnd(int64(size), int64(*FlagRound)) } -func machorelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { +func machorelocsect(ctxt *Link, ldr *loader.Loader, sect *sym.Section, syms []loader.Sym) { // If main section has no bits, nothing to relocate. if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { return @@ -1035,10 +1020,10 @@ func machorelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { sect.Reloff = uint64(ctxt.Out.Offset()) for i, s := range syms { - if !s.Attr.Reachable() { + if !ldr.AttrReachable(s) { continue } - if uint64(s.Value) >= sect.Vaddr { + if uint64(ldr.SymValue(s)) >= sect.Vaddr { syms = syms[i:] break } @@ -1046,26 +1031,24 @@ func machorelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { eaddr := int32(sect.Vaddr + sect.Length) for _, s := range syms { - if !s.Attr.Reachable() { + if !ldr.AttrReachable(s) { continue } - if s.Value >= int64(eaddr) { + if ldr.SymValue(s) >= int64(eaddr) { break } - for ri := range s.R { - r := &s.R[ri] - if r.Done { - continue - } - if r.Xsym == nil { - Errorf(s, "missing xsym in relocation") + relocs := ldr.ExtRelocs(s) + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At(ri) + if r.Xsym == 0 { + ldr.Errorf(s, "missing xsym in relocation") continue } - if !r.Xsym.Attr.Reachable() { - Errorf(s, "unreachable reloc %d (%s) target %v", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Xsym.Name) + if !ldr.AttrReachable(r.Xsym) { + ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) } - if !thearch.Machoreloc1(ctxt.Arch, ctxt.Out, s, r, int64(uint64(s.Value+int64(r.Off))-sect.Vaddr)) { - Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Siz, r.Sym.Name) + if !thearch.Machoreloc1(ctxt.Arch, ctxt.Out, ldr, s, r, 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())) } } } @@ -1078,21 +1061,22 @@ func Machoemitreloc(ctxt *Link) { ctxt.Out.Write8(0) } - machorelocsect(ctxt, Segtext.Sections[0], ctxt.Textp) + ldr := ctxt.loader + machorelocsect(ctxt, ldr, Segtext.Sections[0], ctxt.Textp2) for _, sect := range Segtext.Sections[1:] { - machorelocsect(ctxt, sect, ctxt.datap) + machorelocsect(ctxt, ldr, sect, ctxt.datap2) } for _, sect := range Segdata.Sections { - machorelocsect(ctxt, sect, ctxt.datap) + machorelocsect(ctxt, ldr, sect, ctxt.datap2) } for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] - si := dwarfp[i] - if si.secSym() != sect.Sym || - si.secSym().Sect != sect { + si := dwarfp2[i] + if si.secSym() != loader.Sym(sect.Sym2) || + ctxt.loader.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } - machorelocsect(ctxt, sect, si.syms) + machorelocsect(ctxt, ldr, sect, si.syms) } } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 7d3f25540d..838f92af9e 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -319,18 +319,21 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsARM() || ctxt.IsARM64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() + newasmb2 := ctxt.IsDarwin() if newreloc { bench.Start("reloc") ctxt.reloc() - bench.Start("loadlibfull") - // We don't need relocations at this point. - // An exception is internal linking on Windows, see pe.go:addPEBaseRelocSym - // Wasm is another exception, where it applies text relocations in Asmb2. - needReloc := (ctxt.IsWindows() && ctxt.IsInternal()) || ctxt.IsWasm() - // On AMD64 ELF, we directly use the loader's ExtRelocs, so we don't - // need conversion. Otherwise we do. - needExtReloc := ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) - ctxt.loadlibfull(symGroupType, needReloc, needExtReloc) // XXX do it here for now + if !newasmb2 { + bench.Start("loadlibfull") + // We don't need relocations at this point. + // An exception is internal linking on Windows, see pe.go:addPEBaseRelocSym + // Wasm is another exception, where it applies text relocations in Asmb2. + needReloc := (ctxt.IsWindows() && ctxt.IsInternal()) || ctxt.IsWasm() + // On AMD64 ELF, we directly use the loader's ExtRelocs, so we don't + // need conversion. Otherwise we do. + needExtReloc := ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) + ctxt.loadlibfull(symGroupType, needReloc, needExtReloc) // XXX do it here for now + } } else { bench.Start("loadlibfull") ctxt.loadlibfull(symGroupType, true, false) // XXX do it here for now diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index ae37d3cdaf..65f32ad940 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -80,7 +80,7 @@ func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loade return } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { return false } diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 9024ef0060..c23360ea3b 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -97,7 +97,7 @@ func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loade return } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { return false } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index dae1a07590..ab923c324e 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -528,7 +528,7 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S } } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { return false } diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index e259ef40f2..88c6d8790e 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -37,7 +37,7 @@ func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loade log.Fatalf("elfsetuplt") } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { log.Fatalf("machoreloc1 not implemented") return false } diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 91455cc6c2..e1e7f0b249 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -363,7 +363,7 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S } } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { return false } diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 21ea5780cb..5297d15e39 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -398,7 +398,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { return true } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { return false } -- GitLab From fee06a6bda8e7ca5a35b13c7b5befc1d73e93c35 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 5 May 2020 12:34:10 -0400 Subject: [PATCH 0015/1792] [dev.link] cmd/link: convert ppc64 archreloc over to Loader Change-Id: I68945a8284fb3dd9ceb5a9cd774b5b4b91e63ce0 Reviewed-on: https://go-review.googlesource.com/c/go/+/230917 Reviewed-by: Cherry Zhang Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data.go | 11 +- src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/ld/xcoff.go | 2 +- src/cmd/link/internal/ppc64/asm.go | 156 ++++++++++++++--------------- src/cmd/link/internal/ppc64/obj.go | 24 ++--- 5 files changed, 96 insertions(+), 99 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 7b06972c0a..c6270af42f 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -372,7 +372,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } else if target.IsWindows() { // nothing to do } else if target.IsAIX() { - o = ldr.SymValue(rs) + r.Add() + o = ldr.SymValue(rs) + rr.Xadd } else { st.err.Errorf(s, "unhandled pcrel relocation to %s on %v", ldr.SymName(rs), target.HeadType) } @@ -391,8 +391,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // symbol which isn't in .data. However, as .text has the // same address once loaded, this is possible. if ldr.SymSect(s).Seg == &Segdata { - panic("not implemented") - //Xcoffadddynrel(target, ldr, err, s, &r) // XXX + Xcoffadddynrel2(target, ldr, syms, s, r, ri) } } @@ -543,10 +542,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { needExtReloc = true rr.Xsym = rs rr.Xadd = r.Add() - - // This isn't a real relocation so it must not update - // its offset value. - continue + goto addExtReloc case objabi.R_DWARFFILEREF: // We don't renumber files in dwarf.go:writelines anymore. @@ -590,6 +586,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { target.Arch.ByteOrder.PutUint64(P[off:], uint64(o)) } + addExtReloc: if needExtReloc { extRelocs = append(extRelocs, rr) } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 838f92af9e..75d6bbf05d 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -318,7 +318,7 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("Asmb") ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsARM() || ctxt.IsARM64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() + newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsARM() || ctxt.IsARM64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() || ctxt.IsPPC64() newasmb2 := ctxt.IsDarwin() if newreloc { bench.Start("reloc") diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 281747b64d..f0ddc408fe 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1122,7 +1122,7 @@ func Xcoffadddynrel2(target *Target, ldr *loader.Loader, syms *ArchSyms, s loade sym2: s, roff: r.Off(), } - targ := r.Sym() + targ := ldr.ResolveABIAlias(r.Sym()) var targType sym.SymKind if targ != 0 { targType = ldr.SymType(targ) diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index ab923c324e..22021ee8c4 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -416,7 +416,7 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se switch r.Type { default: return false - case objabi.R_ADDR: + case objabi.R_ADDR, objabi.R_DWARFSECREF: v = ld.XCOFF_R_POS if r.Siz == 4 { v |= 0x1F << 8 @@ -437,7 +437,6 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se emitReloc(ld.XCOFF_R_RBR|0x19<<8, 0) case objabi.R_XCOFFREF: emitReloc(ld.XCOFF_R_REF|0x3F<<8, 0) - } return true @@ -533,19 +532,19 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe } // Return the value of .TOC. for symbol s -func symtoc(syms *ld.ArchSyms, s *sym.Symbol) int64 { - v := s.Version - if s.Outer != nil { - v = s.Outer.Version +func symtoc(ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) int64 { + v := ldr.SymVersion(s) + if out := ldr.OuterSym(s); out != 0 { + v = ldr.SymVersion(out) } - toc := syms.DotTOC[v] - if toc == nil { - ld.Errorf(s, "TOC-relative relocation in object without .TOC.") + toc := syms.DotTOC2[v] + if toc == 0 { + ldr.Errorf(s, "TOC-relative relocation in object without .TOC.") return 0 } - return toc.Value + return ldr.SymValue(toc) } // archreloctoc relocates a TOC relative symbol. @@ -553,36 +552,35 @@ func symtoc(syms *ld.ArchSyms, s *sym.Symbol) int64 { // default load instruction can be changed to an addi instruction and the // symbol address can be used directly. // This code is for AIX only. -func archreloctoc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) int64 { +func archreloctoc(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) int64 { + rs := ldr.ResolveABIAlias(r.Sym()) if target.IsLinux() { - ld.Errorf(s, "archrelocaddr called for %s relocation\n", r.Sym.Name) + ldr.Errorf(s, "archrelocaddr called for %s relocation\n", ldr.SymName(rs)) } var o1, o2 uint32 o1 = uint32(val >> 32) o2 = uint32(val) + if !strings.HasPrefix(ldr.SymName(rs), "TOC.") { + ldr.Errorf(s, "archreloctoc called for a symbol without TOC anchor") + } var t int64 useAddi := false - const prefix = "TOC." - var tarSym *sym.Symbol - if strings.HasPrefix(r.Sym.Name, prefix) { - tarSym = r.Sym.R[0].Sym - } else { - ld.Errorf(s, "archreloctoc called for a symbol without TOC anchor") - } + relocs := ldr.Relocs(rs) + tarSym := ldr.ResolveABIAlias(relocs.At2(0).Sym()) - if target.IsInternal() && tarSym != nil && tarSym.Attr.Reachable() && (tarSym.Sect.Seg == &ld.Segdata) { - t = ld.Symaddr(tarSym) + r.Add - syms.TOC.Value + if target.IsInternal() && tarSym != 0 && ldr.AttrReachable(tarSym) && ldr.SymSect(tarSym).Seg == &ld.Segdata { + t = ldr.SymValue(tarSym) + r.Add() - ldr.SymValue(syms.TOC2) // change ld to addi in the second instruction o2 = (o2 & 0x03FF0000) | 0xE<<26 useAddi = true } else { - t = ld.Symaddr(r.Sym) + r.Add - syms.TOC.Value + t = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.TOC2) } if t != int64(int32(t)) { - ld.Errorf(s, "TOC relocation for %s is too big to relocate %s: 0x%x", s.Name, r.Sym, t) + ldr.Errorf(s, "TOC relocation for %s is too big to relocate %s: 0x%x", ldr.SymName(s), rs, t) } if t&0x8000 != 0 { @@ -591,13 +589,13 @@ func archreloctoc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Sym o1 |= uint32((t >> 16) & 0xFFFF) - switch r.Type { + switch r.Type() { case objabi.R_ADDRPOWER_TOCREL_DS: if useAddi { o2 |= uint32(t) & 0xFFFF } else { if t&3 != 0 { - ld.Errorf(s, "bad DS reloc for %s: %d", s.Name, ld.Symaddr(r.Sym)) + ldr.Errorf(s, "bad DS reloc for %s: %d", ldr.SymName(s), ldr.SymValue(rs)) } o2 |= uint32(t) & 0xFFFC } @@ -610,9 +608,10 @@ func archreloctoc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Sym // archrelocaddr relocates a symbol address. // This code is for AIX only. -func archrelocaddr(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) int64 { +func archrelocaddr(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) int64 { + rs := ldr.ResolveABIAlias(r.Sym()) if target.IsAIX() { - ld.Errorf(s, "archrelocaddr called for %s relocation\n", r.Sym.Name) + ldr.Errorf(s, "archrelocaddr called for %s relocation\n", ldr.SymName(rs)) } var o1, o2 uint32 if target.IsBigEndian() { @@ -630,22 +629,22 @@ func archrelocaddr(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Sy // instruction (it is an error in this case if the low 2 bits of the address // are non-zero). - t := ld.Symaddr(r.Sym) + r.Add + t := ldr.SymAddr(rs) + r.Add() if t < 0 || t >= 1<<31 { - ld.Errorf(s, "relocation for %s is too big (>=2G): 0x%x", s.Name, ld.Symaddr(r.Sym)) + ldr.Errorf(s, "relocation for %s is too big (>=2G): 0x%x", ldr.SymName(s), ldr.SymValue(rs)) } if t&0x8000 != 0 { t += 0x10000 } - switch r.Type { + switch r.Type() { case objabi.R_ADDRPOWER: o1 |= (uint32(t) >> 16) & 0xffff o2 |= uint32(t) & 0xffff case objabi.R_ADDRPOWER_DS: o1 |= (uint32(t) >> 16) & 0xffff if t&3 != 0 { - ld.Errorf(s, "bad DS reloc for %s: %d", s.Name, ld.Symaddr(r.Sym)) + ldr.Errorf(s, "bad DS reloc for %s: %d", ldr.SymName(s), ldr.SymValue(rs)) } o2 |= uint32(t) & 0xfffc default: @@ -795,113 +794,114 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta tramp.SetData(P) } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (relocatedOffset int64, needExtReloc bool, ok bool) { + needExternal := false + rs := ldr.ResolveABIAlias(r.Sym()) if target.IsExternal() { // On AIX, relocations (except TLS ones) must be also done to the // value with the current addresses. - switch r.Type { + switch r.Type() { default: if target.IsAIX() { - return val, false + return val, needExternal, false } case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE: - r.Done = false // check Outer is nil, Type is TLSBSS? - r.Xadd = r.Add - r.Xsym = r.Sym - return val, true + needExternal = true + rr.Xadd = r.Add() + rr.Xsym = rs + return val, needExternal, true case objabi.R_ADDRPOWER, objabi.R_ADDRPOWER_DS, objabi.R_ADDRPOWER_TOCREL, objabi.R_ADDRPOWER_TOCREL_DS, objabi.R_ADDRPOWER_GOT, objabi.R_ADDRPOWER_PCREL: - r.Done = false + needExternal = true // set up addend for eventual relocation via outer symbol. - rs := ld.ApplyOuterToXAdd(r) - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { - ld.Errorf(s, "missing section for %s", rs.Name) + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } - r.Xsym = rs + rr.Xsym = rs if !target.IsAIX() { - return val, true + return val, needExternal, true } case objabi.R_CALLPOWER: - r.Done = false - r.Xsym = r.Sym - r.Xadd = r.Add + needExternal = true + rr.Xsym = rs + rr.Xadd = r.Add() if !target.IsAIX() { - return val, true + return val, needExternal, true } } } - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(syms.GOT), true + switch r.Type() { case objabi.R_ADDRPOWER_TOCREL, objabi.R_ADDRPOWER_TOCREL_DS: - return archreloctoc(target, syms, r, s, val), true + return archreloctoc(ldr, target, syms, r, s, val), needExternal, true case objabi.R_ADDRPOWER, objabi.R_ADDRPOWER_DS: - return archrelocaddr(target, syms, r, s, val), true + return archrelocaddr(ldr, target, syms, r, s, val), needExternal, true case objabi.R_CALLPOWER: // Bits 6 through 29 = (S + A - P) >> 2 - t := ld.Symaddr(r.Sym) + r.Add - (s.Value + int64(r.Off)) + t := ldr.SymValue(rs) + r.Add() - (ldr.SymValue(s) + int64(r.Off())) if t&3 != 0 { - ld.Errorf(s, "relocation for %s+%d is not aligned: %d", r.Sym.Name, r.Off, t) + ldr.Errorf(s, "relocation for %s+%d is not aligned: %d", ldr.SymName(rs), r.Off(), t) } // If branch offset is too far then create a trampoline. if int64(int32(t<<6)>>6) != t { - ld.Errorf(s, "direct call too far: %s %x", r.Sym.Name, t) + ldr.Errorf(s, "direct call too far: %s %x", ldr.SymName(rs), t) } - return val | int64(uint32(t)&^0xfc000003), true + return val | int64(uint32(t)&^0xfc000003), needExternal, true case objabi.R_POWER_TOC: // S + A - .TOC. - return ld.Symaddr(r.Sym) + r.Add - symtoc(syms, s), true + return ldr.SymValue(rs) + r.Add() - symtoc(ldr, syms, s), needExternal, true case objabi.R_POWER_TLS_LE: // The thread pointer points 0x7000 bytes after the start of the // thread local storage area as documented in section "3.7.2 TLS // Runtime Handling" of "Power Architecture 64-Bit ELF V2 ABI // Specification". - v := r.Sym.Value - 0x7000 + v := ldr.SymValue(rs) - 0x7000 if target.IsAIX() { // On AIX, the thread pointer points 0x7800 bytes after // the TLS. v -= 0x800 } if int64(int16(v)) != v { - ld.Errorf(s, "TLS offset out of range %d", v) + ldr.Errorf(s, "TLS offset out of range %d", v) } - return (val &^ 0xffff) | (v & 0xffff), true + return (val &^ 0xffff) | (v & 0xffff), needExternal, true } - return val, false + return val, needExternal, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { - switch r.Variant & sym.RV_TYPE_MASK { +func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) (relocatedOffset int64) { + rs := ldr.ResolveABIAlias(r.Sym()) + switch rv & sym.RV_TYPE_MASK { default: - ld.Errorf(s, "unexpected relocation variant %d", r.Variant) + ldr.Errorf(s, "unexpected relocation variant %d", rv) fallthrough case sym.RV_NONE: return t case sym.RV_POWER_LO: - if r.Variant&sym.RV_CHECK_OVERFLOW != 0 { + if rv&sym.RV_CHECK_OVERFLOW != 0 { // Whether to check for signed or unsigned // overflow depends on the instruction var o1 uint32 if target.IsBigEndian() { - o1 = binary.BigEndian.Uint32(s.P[r.Off-2:]) + o1 = binary.BigEndian.Uint32(ldr.Data(s)[r.Off()-2:]) } else { - o1 = binary.LittleEndian.Uint32(s.P[r.Off:]) + o1 = binary.LittleEndian.Uint32(ldr.Data(s)[r.Off():]) } switch o1 >> 26 { case 24, // ori @@ -928,14 +928,14 @@ func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym case sym.RV_POWER_HI: t >>= 16 - if r.Variant&sym.RV_CHECK_OVERFLOW != 0 { + if rv&sym.RV_CHECK_OVERFLOW != 0 { // Whether to check for signed or unsigned // overflow depends on the instruction var o1 uint32 if target.IsBigEndian() { - o1 = binary.BigEndian.Uint32(s.P[r.Off-2:]) + o1 = binary.BigEndian.Uint32(ldr.Data(s)[r.Off()-2:]) } else { - o1 = binary.LittleEndian.Uint32(s.P[r.Off:]) + o1 = binary.LittleEndian.Uint32(ldr.Data(s)[r.Off():]) } switch o1 >> 26 { case 25, // oris @@ -957,21 +957,21 @@ func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym case sym.RV_POWER_DS: var o1 uint32 if target.IsBigEndian() { - o1 = uint32(binary.BigEndian.Uint16(s.P[r.Off:])) + o1 = uint32(binary.BigEndian.Uint16(ldr.Data(s)[r.Off():])) } else { - o1 = uint32(binary.LittleEndian.Uint16(s.P[r.Off:])) + o1 = uint32(binary.LittleEndian.Uint16(ldr.Data(s)[r.Off():])) } if t&3 != 0 { - ld.Errorf(s, "relocation for %s+%d is not aligned: %d", r.Sym.Name, r.Off, t) + ldr.Errorf(s, "relocation for %s+%d is not aligned: %d", ldr.SymName(rs), r.Off(), t) } - if (r.Variant&sym.RV_CHECK_OVERFLOW != 0) && int64(int16(t)) != t { + if (rv&sym.RV_CHECK_OVERFLOW != 0) && int64(int16(t)) != t { goto overflow } return int64(o1)&0x3 | int64(int16(t)) } overflow: - ld.Errorf(s, "relocation for %s+%d is too big: %d", r.Sym.Name, r.Off, t) + ldr.Errorf(s, "relocation for %s+%d is too big: %d", ldr.SymName(rs), r.Off(), t) return t } diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index 67002bc719..16882d4d45 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -49,18 +49,18 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, - Archinit: archinit, - Archreloc: archreloc, - Archrelocvariant: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext2: gentext2, - Trampoline: trampoline, - Machoreloc1: machoreloc1, - Xcoffreloc1: xcoffreloc1, + Adddynrel2: adddynrel2, + Archinit: archinit, + Archreloc2: archreloc, + Archrelocvariant2: archrelocvariant, + Asmb: asmb, + Asmb2: asmb2, + Elfreloc1: elfreloc1, + Elfsetupplt: elfsetupplt, + Gentext2: gentext2, + Trampoline: trampoline, + Machoreloc1: machoreloc1, + Xcoffreloc1: xcoffreloc1, // TODO(austin): ABI v1 uses /usr/lib/ld.so.1, Linuxdynld: "/lib64/ld64.so.1", -- GitLab From fdb9249d82617d832bdd5064546c94f6e966f501 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 7 May 2020 22:22:54 -0400 Subject: [PATCH 0016/1792] [dev.link] cmd/link: convert asmb2 pass to new style on windows Now we no longer do loadlibfull on windows. Change-Id: Ideb015597c28f27538bd50829e089ea728017162 Reviewed-on: https://go-review.googlesource.com/c/go/+/232979 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/asm.go | 13 +- src/cmd/link/internal/arm/asm.go | 11 +- src/cmd/link/internal/ld/lib.go | 2 +- src/cmd/link/internal/ld/main.go | 7 +- src/cmd/link/internal/ld/pe.go | 262 ++++++++++++++----------- src/cmd/link/internal/loader/loader.go | 2 + src/cmd/link/internal/x86/asm.go | 11 +- 7 files changed, 176 insertions(+), 132 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index f2b76fb78b..30fab9de1c 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -522,20 +522,21 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy return true } -func pereloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { var v uint32 rs := r.Xsym + rt := r.Type() - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) + if ldr.SymDynid(rs) < 0 { + ldr.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs)) return false } out.Write32(uint32(sectoff)) - out.Write32(uint32(rs.Dynid)) + out.Write32(uint32(ldr.SymDynid(rs))) - switch r.Type { + switch rt { default: return false @@ -543,7 +544,7 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, secto v = ld.IMAGE_REL_AMD64_SECREL case objabi.R_ADDR: - if r.Siz == 8 { + if r.Siz() == 8 { v = ld.IMAGE_REL_AMD64_ADDR64 } else { v = ld.IMAGE_REL_AMD64_ADDR32 diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index e01124f0a9..e910d3785f 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -322,19 +322,20 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func pereloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { rs := r.Xsym + rt := r.Type() - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) + if ldr.SymDynid(rs) < 0 { + ldr.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs)) return false } out.Write32(uint32(sectoff)) - out.Write32(uint32(rs.Dynid)) + out.Write32(uint32(ldr.SymDynid(rs))) var v uint32 - switch r.Type { + switch rt { default: // unsupported relocation type return false diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 8fc1f737c2..3c9914a219 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -278,7 +278,7 @@ type Arch struct { Gentext func(*Link) Gentext2 func(*Link, *loader.Loader) Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - PEreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool + PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool Xcoffreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool // TLSIEtoLE converts a TLS Initial Executable relocation to diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 75d6bbf05d..176c3b00bf 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -319,16 +319,15 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsARM() || ctxt.IsARM64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() || ctxt.IsPPC64() - newasmb2 := ctxt.IsDarwin() + newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() if newreloc { bench.Start("reloc") ctxt.reloc() if !newasmb2 { bench.Start("loadlibfull") // We don't need relocations at this point. - // An exception is internal linking on Windows, see pe.go:addPEBaseRelocSym - // Wasm is another exception, where it applies text relocations in Asmb2. - needReloc := (ctxt.IsWindows() && ctxt.IsInternal()) || ctxt.IsWasm() + // Wasm is an exception, where it applies text relocations in Asmb2. + needReloc := ctxt.IsWasm() // On AMD64 ELF, we directly use the loader's ExtRelocs, so we don't // need conversion. Otherwise we do. needExtReloc := ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 362d2fd0a5..5edba67a59 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -472,8 +472,8 @@ func (f *peFile) addInitArray(ctxt *Link) *peSection { ctxt.Out.SeekSet(int64(sect.pointerToRawData)) sect.checkOffset(ctxt.Out.Offset()) - init_entry := ctxt.Syms.Lookup(*flagEntrySymbol, 0) - addr := uint64(init_entry.Value) - init_entry.Sect.Vaddr + init_entry := ctxt.loader.Lookup(*flagEntrySymbol, 0) + addr := uint64(ctxt.loader.SymValue(init_entry)) - ctxt.loader.SymSect(init_entry).Vaddr switch objabi.GOARCH { case "386", "arm": ctxt.Out.Write32(uint32(addr)) @@ -489,62 +489,62 @@ func (f *peFile) emitRelocations(ctxt *Link) { ctxt.Out.Write8(0) } + ldr := ctxt.loader + // relocsect relocates symbols from first in section sect, and returns // the total number of relocations emitted. - relocsect := func(sect *sym.Section, syms []*sym.Symbol, base uint64) int { + relocsect := func(sect *sym.Section, syms []loader.Sym, base uint64) int { // If main section has no bits, nothing to relocate. if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { return 0 } - relocs := 0 + nrelocs := 0 sect.Reloff = uint64(ctxt.Out.Offset()) for i, s := range syms { - if !s.Attr.Reachable() { + if !ldr.AttrReachable(s) { continue } - if uint64(s.Value) >= sect.Vaddr { + if uint64(ldr.SymValue(s)) >= sect.Vaddr { syms = syms[i:] break } } eaddr := int32(sect.Vaddr + sect.Length) - for _, sym := range syms { - if !sym.Attr.Reachable() { + for _, s := range syms { + if !ldr.AttrReachable(s) { continue } - if sym.Value >= int64(eaddr) { + if ldr.SymValue(s) >= int64(eaddr) { break } - for ri := range sym.R { - r := &sym.R[ri] - if r.Done { + relocs := ldr.ExtRelocs(s) + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At(ri) + if r.Xsym == 0 { + ctxt.Errorf(s, "missing xsym in relocation") continue } - if r.Xsym == nil { - Errorf(sym, "missing xsym in relocation") - continue + if ldr.SymDynid(r.Xsym) < 0 { + ctxt.Errorf(s, "reloc %d to non-coff symbol %s (outer=%s) %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym())) } - if r.Xsym.Dynid < 0 { - Errorf(sym, "reloc %d to non-coff symbol %s (outer=%s) %d", r.Type, r.Sym.Name, r.Xsym.Name, r.Sym.Type) + if !thearch.PEreloc1(ctxt.Arch, ctxt.Out, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { + ctxt.Errorf(s, "unsupported obj reloc %d/%d to %s", r.Type(), r.Siz(), ldr.SymName(r.Sym())) } - if !thearch.PEreloc1(ctxt.Arch, ctxt.Out, sym, r, int64(uint64(sym.Value+int64(r.Off))-base)) { - Errorf(sym, "unsupported obj reloc %d/%d to %s", r.Type, r.Siz, r.Sym.Name) - } - relocs++ + nrelocs++ } } sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff - return relocs + return nrelocs } sects := []struct { peSect *peSection seg *sym.Segment - syms []*sym.Symbol + syms []loader.Sym }{ - {f.textSect, &Segtext, ctxt.Textp}, - {f.rdataSect, &Segrodata, ctxt.datap}, - {f.dataSect, &Segdata, ctxt.datap}, + {f.textSect, &Segtext, ctxt.Textp2}, + {f.rdataSect, &Segrodata, ctxt.datap2}, + {f.dataSect, &Segdata, ctxt.datap2}, } for _, s := range sects { s.peSect.emitRelocations(ctxt.Out, func() int { @@ -559,9 +559,9 @@ func (f *peFile) emitRelocations(ctxt *Link) { dwarfLoop: for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] - si := dwarfp[i] - if si.secSym() != sect.Sym || - si.secSym().Sect != sect { + si := dwarfp2[i] + if si.secSym() != loader.Sym(sect.Sym2) || + ldr.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } for _, pesect := range f.sections { @@ -576,12 +576,12 @@ dwarfLoop: } f.ctorsSect.emitRelocations(ctxt.Out, func() int { - dottext := ctxt.Syms.Lookup(".text", 0) + dottext := ldr.Lookup(".text", 0) ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(dottext.Dynid)) + ctxt.Out.Write32(uint32(ldr.SymDynid(dottext))) switch objabi.GOARCH { default: - Errorf(dottext, "unknown architecture for PE: %q\n", objabi.GOARCH) + ctxt.Errorf(dottext, "unknown architecture for PE: %q\n", objabi.GOARCH) case "386": ctxt.Out.Write16(IMAGE_REL_I386_DIR32) case "amd64": @@ -595,12 +595,12 @@ dwarfLoop: // writeSymbol appends symbol s to file f symbol table. // It also sets s.Dynid to written symbol number. -func (f *peFile) writeSymbol(out *OutBuf, s *sym.Symbol, value int64, sectidx int, typ uint16, class uint8) { - if len(s.Name) > 8 { +func (f *peFile) writeSymbol(out *OutBuf, ldr *loader.Loader, s loader.Sym, name string, value int64, sectidx int, typ uint16, class uint8) { + if len(name) > 8 { out.Write32(0) - out.Write32(uint32(f.stringTable.add(s.Name))) + out.Write32(uint32(f.stringTable.add(name))) } else { - out.WriteStringN(s.Name, 8) + out.WriteStringN(name, 8) } out.Write32(uint32(value)) out.Write16(uint16(sectidx)) @@ -608,31 +608,32 @@ func (f *peFile) writeSymbol(out *OutBuf, s *sym.Symbol, value int64, sectidx in out.Write8(class) out.Write8(0) // no aux entries - s.Dynid = int32(f.symbolCount) + ldr.SetSymDynid(s, int32(f.symbolCount)) f.symbolCount++ } // mapToPESection searches peFile f for s symbol's location. // It returns PE section index, and offset within that section. -func (f *peFile) mapToPESection(s *sym.Symbol, linkmode LinkMode) (pesectidx int, offset int64, err error) { - if s.Sect == nil { - return 0, 0, fmt.Errorf("could not map %s symbol with no section", s.Name) +func (f *peFile) mapToPESection(ldr *loader.Loader, s loader.Sym, linkmode LinkMode) (pesectidx int, offset int64, err error) { + sect := ldr.SymSect(s) + if sect == nil { + return 0, 0, fmt.Errorf("could not map %s symbol with no section", ldr.SymName(s)) } - if s.Sect.Seg == &Segtext { - return f.textSect.index, int64(uint64(s.Value) - Segtext.Vaddr), nil + if sect.Seg == &Segtext { + return f.textSect.index, int64(uint64(ldr.SymValue(s)) - Segtext.Vaddr), nil } - if s.Sect.Seg == &Segrodata { - return f.rdataSect.index, int64(uint64(s.Value) - Segrodata.Vaddr), nil + if sect.Seg == &Segrodata { + return f.rdataSect.index, int64(uint64(ldr.SymValue(s)) - Segrodata.Vaddr), nil } - if s.Sect.Seg != &Segdata { - return 0, 0, fmt.Errorf("could not map %s symbol with non .text or .rdata or .data section", s.Name) + if sect.Seg != &Segdata { + return 0, 0, fmt.Errorf("could not map %s symbol with non .text or .rdata or .data section", ldr.SymName(s)) } - v := uint64(s.Value) - Segdata.Vaddr + v := uint64(ldr.SymValue(s)) - Segdata.Vaddr if linkmode != LinkExternal { return f.dataSect.index, int64(v), nil } - if s.Type == sym.SDATA { + if ldr.SymType(s) == sym.SDATA { return f.dataSect.index, int64(v), nil } // Note: although address of runtime.edata (type sym.SDATA) is at the start of .bss section @@ -645,60 +646,100 @@ func (f *peFile) mapToPESection(s *sym.Symbol, linkmode LinkMode) (pesectidx int // writeSymbols writes all COFF symbol table records. func (f *peFile) writeSymbols(ctxt *Link) { - - put := func(ctxt *Link, s *sym.Symbol, name string, type_ SymbolType, addr int64) { - if s == nil { - return - } - if s.Sect == nil && type_ != UndefinedSym { - return - } - switch type_ { - default: + ldr := ctxt.loader + addsym := func(s loader.Sym) { + t := ldr.SymType(s) + if ldr.SymSect(s) == nil && t != sym.SDYNIMPORT && t != sym.SHOSTOBJ && t != sym.SUNDEFEXT { return - case DataSym, BSSSym, TextSym, UndefinedSym: } + name := ldr.SymName(s) + // Only windows/386 requires underscore prefix on external symbols. - if ctxt.Arch.Family == sys.I386 && - ctxt.LinkMode == LinkExternal && - (s.Type == sym.SHOSTOBJ || s.Type == sym.SUNDEFEXT || s.Attr.CgoExport()) { - s.Name = "_" + s.Name + if ctxt.Is386() && ctxt.IsExternal() && + (t == sym.SHOSTOBJ || t == sym.SUNDEFEXT || ldr.AttrCgoExport(s)) { + name = "_" + name } - var typ uint16 - if ctxt.LinkMode == LinkExternal { - typ = IMAGE_SYM_TYPE_NULL + 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 - typ = IMAGE_SYM_DTYPE_ARRAY<<8 + IMAGE_SYM_TYPE_STRUCT - typ = 0x0308 // "array of structs" + // peSymType = IMAGE_SYM_DTYPE_ARRAY<<8 + IMAGE_SYM_TYPE_STRUCT + peSymType = 0x0308 // "array of structs" } - sect, value, err := f.mapToPESection(s, ctxt.LinkMode) + sect, value, err := f.mapToPESection(ldr, s, ctxt.LinkMode) if err != nil { - if type_ == UndefinedSym { - typ = IMAGE_SYM_DTYPE_FUNCTION + if t == sym.SDYNIMPORT || t == sym.SHOSTOBJ || t == sym.SUNDEFEXT { + peSymType = IMAGE_SYM_DTYPE_FUNCTION } else { - Errorf(s, "addpesym: %v", err) + ctxt.Errorf(s, "addpesym: %v", err) } } class := IMAGE_SYM_CLASS_EXTERNAL - if s.IsFileLocal() || s.Attr.VisibilityHidden() || s.Attr.Local() { + if ldr.IsFileLocal(s) || ldr.AttrVisibilityHidden(s) || ldr.AttrLocal(s) { class = IMAGE_SYM_CLASS_STATIC } - f.writeSymbol(ctxt.Out, s, value, sect, typ, uint8(class)) + f.writeSymbol(ctxt.Out, ldr, s, name, value, sect, peSymType, uint8(class)) } if ctxt.LinkMode == LinkExternal { // Include section symbols as external, because // .ctors and .debug_* section relocations refer to it. for _, pesect := range f.sections { - sym := ctxt.Syms.Lookup(pesect.name, 0) - f.writeSymbol(ctxt.Out, sym, 0, pesect.index, IMAGE_SYM_TYPE_NULL, IMAGE_SYM_CLASS_STATIC) + s := ldr.LookupOrCreateSym(pesect.name, 0) + f.writeSymbol(ctxt.Out, ldr, s, pesect.name, 0, pesect.index, IMAGE_SYM_TYPE_NULL, IMAGE_SYM_CLASS_STATIC) + } + } + + // Add special runtime.text and runtime.etext symbols. + s := ldr.Lookup("runtime.text", 0) + if ldr.SymType(s) == sym.STEXT { + addsym(s) + } + s = ldr.Lookup("runtime.etext", 0) + if ldr.SymType(s) == sym.STEXT { + addsym(s) + } + + // Add text symbols. + for _, s := range ctxt.Textp2 { + addsym(s) + } + + shouldBeInSymbolTable := func(s loader.Sym) bool { + if ldr.AttrNotInSymbolTable(s) { + return false } + name := ldr.RawSymName(s) // TODO: try not to read the name + if name == "" || name[0] == '.' { + return false + } + return true } - genasmsym(ctxt, put) + // Add data symbols and external references. + for s := loader.Sym(1); s < loader.Sym(ldr.NSym()); s++ { + if !ldr.AttrReachable(s) { + continue + } + t := ldr.SymType(s) + if t >= sym.SELFRXSECT && t < sym.SXREF { // data sections handled in dodata + if t == sym.STLSBSS { + continue + } + if !shouldBeInSymbolTable(s) { + continue + } + addsym(s) + } + + switch t { + case sym.SDYNIMPORT, sym.SHOSTOBJ, sym.SUNDEFEXT, sym.SCONST: + addsym(s) + } + } } // writeSymbolTableAndStringTable writes out symbol and string tables for peFile f. @@ -800,8 +841,8 @@ func (f *peFile) writeOptionalHeader(ctxt *Link) { oh64.SizeOfUninitializedData = 0 oh.SizeOfUninitializedData = 0 if ctxt.LinkMode != LinkExternal { - oh64.AddressOfEntryPoint = uint32(Entryvalue(ctxt) - PEBASE) - oh.AddressOfEntryPoint = uint32(Entryvalue(ctxt) - PEBASE) + oh64.AddressOfEntryPoint = uint32(Entryvalue2(ctxt) - PEBASE) + oh.AddressOfEntryPoint = uint32(Entryvalue2(ctxt) - PEBASE) } oh64.BaseOfCode = f.textSect.virtualAddress oh.BaseOfCode = f.textSect.virtualAddress @@ -1109,7 +1150,7 @@ func peimporteddlls() []string { func addimports(ctxt *Link, datsect *peSection) { ldr := ctxt.loader startoff := ctxt.Out.Offset() - dynamic := ctxt.Syms.Lookup(".windynamic", 0) + dynamic := ldr.LookupOrCreateSym(".windynamic", 0) // skip import descriptor table (will write it later) n := uint64(0) @@ -1130,7 +1171,7 @@ func addimports(ctxt *Link, datsect *peSection) { for m := d.ms; m != nil; m = m.next { m.off = uint64(pefile.nextSectOffset) + uint64(ctxt.Out.Offset()) - uint64(startoff) ctxt.Out.Write16(0) // hint - strput(ctxt.Out, ldr.Syms[m.s].Extname()) + strput(ctxt.Out, ldr.SymExtname(m.s)) } } @@ -1165,7 +1206,7 @@ func addimports(ctxt *Link, datsect *peSection) { endoff := ctxt.Out.Offset() // write FirstThunks (allocated in .data section) - ftbase := uint64(dynamic.Value) - uint64(datsect.virtualAddress) - PEBASE + ftbase := uint64(ldr.SymValue(dynamic)) - uint64(datsect.virtualAddress) - PEBASE ctxt.Out.SeekSet(int64(uint64(datsect.pointerToRawData) + ftbase)) for d := dr; d != nil; d = d.next { @@ -1205,8 +1246,8 @@ func addimports(ctxt *Link, datsect *peSection) { // update data directory pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress = isect.virtualAddress pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IMPORT].Size = isect.virtualSize - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = uint32(dynamic.Value - PEBASE) - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IAT].Size = uint32(dynamic.Size) + pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IAT].VirtualAddress = uint32(ldr.SymValue(dynamic) - PEBASE) + pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_IAT].Size = uint32(ldr.SymSize(dynamic)) out.SeekSet(endoff) } @@ -1235,7 +1276,7 @@ func addexports(ctxt *Link) { nexport := len(dexport) size := binary.Size(&e) + 10*nexport + len(*flagOutfile) + 1 for _, s := range dexport { - size += len(ldr.Syms[s].Extname()) + 1 + size += len(ldr.SymExtname(s)) + 1 } if nexport == 0 { @@ -1271,7 +1312,7 @@ func addexports(ctxt *Link) { // put EXPORT Address Table for _, s := range dexport { - out.Write32(uint32(ldr.Syms[s].Value - PEBASE)) + out.Write32(uint32(ldr.SymValue(s) - PEBASE)) } // put EXPORT Name Pointer Table @@ -1279,7 +1320,7 @@ func addexports(ctxt *Link) { for _, s := range dexport { out.Write32(uint32(v)) - v += len(ldr.Syms[s].Extname()) + 1 + v += len(ldr.SymExtname(s)) + 1 } // put EXPORT Ordinal Table @@ -1291,8 +1332,8 @@ func addexports(ctxt *Link) { out.WriteStringN(*flagOutfile, len(*flagOutfile)+1) for _, s := range dexport { - ss := ldr.Syms[s] - out.WriteStringN(ss.Extname(), len(ss.Extname())+1) + name := ldr.SymExtname(s) + out.WriteStringN(name, len(name)+1) } sect.pad(out, uint32(size)) } @@ -1300,8 +1341,6 @@ func addexports(ctxt *Link) { // peBaseRelocEntry represents a single relocation entry. type peBaseRelocEntry struct { typeOff uint16 - rel *sym.Reloc - sym *sym.Symbol // For debug } // peBaseRelocBlock represents a Base Relocation Block. A block @@ -1338,13 +1377,13 @@ func (rt *peBaseRelocTable) init(ctxt *Link) { rt.blocks = make(map[uint32]peBaseRelocBlock) } -func (rt *peBaseRelocTable) addentry(ctxt *Link, s *sym.Symbol, r *sym.Reloc) { +func (rt *peBaseRelocTable) addentry(ldr *loader.Loader, s loader.Sym, r *loader.Reloc2) { // pageSize is the size in bytes of a page // described by a base relocation block. const pageSize = 0x1000 const pageMask = pageSize - 1 - addr := s.Value + int64(r.Off) - int64(PEBASE) + addr := ldr.SymValue(s) + int64(r.Off()) - int64(PEBASE) page := uint32(addr &^ pageMask) off := uint32(addr & pageMask) @@ -1355,12 +1394,10 @@ func (rt *peBaseRelocTable) addentry(ctxt *Link, s *sym.Symbol, r *sym.Reloc) { e := peBaseRelocEntry{ typeOff: uint16(off & 0xFFF), - rel: r, - sym: s, } // Set entry type - switch r.Siz { + switch r.Siz() { default: Exitf("unsupported relocation size %d\n", r.Siz) case 4: @@ -1392,30 +1429,32 @@ func (rt *peBaseRelocTable) write(ctxt *Link) { } } -func addPEBaseRelocSym(ctxt *Link, s *sym.Symbol, rt *peBaseRelocTable) { - for ri := 0; ri < len(s.R); ri++ { - r := &s.R[ri] - - if r.Sym == nil { +func addPEBaseRelocSym(ldr *loader.Loader, s loader.Sym, rt *peBaseRelocTable) { + relocs := ldr.Relocs(s) + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At2(ri) + if r.Type() >= objabi.ElfRelocOffset { continue } - if !r.Sym.Attr.Reachable() { + if r.Siz() == 0 { // informational relocation continue } - if r.Type >= objabi.ElfRelocOffset { + if r.Type() == objabi.R_DWARFFILEREF { continue } - if r.Siz == 0 { // informational relocation + rs := r.Sym() + rs = ldr.ResolveABIAlias(rs) + if rs == 0 { continue } - if r.Type == objabi.R_DWARFFILEREF { + if !ldr.AttrReachable(s) { continue } - switch r.Type { + switch r.Type() { default: case objabi.R_ADDR: - rt.addentry(ctxt, s, r) + rt.addentry(ldr, s, &r) } } } @@ -1437,11 +1476,12 @@ func addPEBaseReloc(ctxt *Link) { rt.init(ctxt) // Get relocation information - for _, s := range ctxt.Textp { - addPEBaseRelocSym(ctxt, s, &rt) + ldr := ctxt.loader + for _, s := range ctxt.Textp2 { + addPEBaseRelocSym(ldr, s, &rt) } - for _, s := range ctxt.datap { - addPEBaseRelocSym(ctxt, s, &rt) + for _, s := range ctxt.datap2 { + addPEBaseRelocSym(ldr, s, &rt) } // Write relocation information diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 02cd0b89d8..0990768903 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -692,6 +692,8 @@ func (l *Loader) SymVersion(i Sym) int { return int(abiToVer(r.Sym(li).ABI(), r.version)) } +func (l *Loader) IsFileLocal(i Sym) bool { return l.SymVersion(i) >= sym.SymVerStatic } + // Returns the type of the i-th symbol. func (l *Loader) SymType(i Sym) sym.SymKind { if l.IsExternal(i) { diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 5297d15e39..b42bfd3dc2 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -402,20 +402,21 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func pereloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { var v uint32 rs := r.Xsym + rt := r.Type() - if rs.Dynid < 0 { - ld.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type) + if ldr.SymDynid(rs) < 0 { + ldr.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs)) return false } out.Write32(uint32(sectoff)) - out.Write32(uint32(rs.Dynid)) + out.Write32(uint32(ldr.SymDynid(rs))) - switch r.Type { + switch rt { default: return false -- GitLab From 85298173f6edec77eddf9568357f591842b12575 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 8 May 2020 13:17:51 -0400 Subject: [PATCH 0017/1792] [dev.link] cmd/link: delete old reloc pass We use the new one everywhere now. Change-Id: Ic9b1314e71e4666500cbf1689bb93839e040682a Reviewed-on: https://go-review.googlesource.com/c/go/+/232982 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/asm.go | 8 +- src/cmd/link/internal/arm/asm.go | 6 +- src/cmd/link/internal/arm/obj.go | 2 +- src/cmd/link/internal/arm64/asm.go | 4 +- src/cmd/link/internal/arm64/obj.go | 2 +- src/cmd/link/internal/ld/data.go | 8 +- src/cmd/link/internal/ld/data2.go | 468 --------------------------- src/cmd/link/internal/ld/lib.go | 8 +- src/cmd/link/internal/ld/main.go | 28 +- src/cmd/link/internal/mips/asm.go | 4 +- src/cmd/link/internal/mips/obj.go | 2 +- src/cmd/link/internal/mips64/asm.go | 4 +- src/cmd/link/internal/mips64/obj.go | 2 +- src/cmd/link/internal/ppc64/obj.go | 24 +- src/cmd/link/internal/riscv64/asm.go | 4 +- src/cmd/link/internal/riscv64/obj.go | 2 +- src/cmd/link/internal/s390x/asm.go | 4 +- src/cmd/link/internal/s390x/obj.go | 20 +- src/cmd/link/internal/x86/asm.go | 8 +- src/cmd/link/internal/x86/obj.go | 2 +- 20 files changed, 65 insertions(+), 545 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 30fab9de1c..a0eaf64c8e 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -560,13 +560,13 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { - return val, false +func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, bool, bool) { + return -1, false, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("unexpected relocation variant") - return t + return -1 } func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.Sym) { diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index e910d3785f..275b5fe34f 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -523,7 +523,7 @@ func gentrampdyn(arch *sys.Arch, tramp *loader.SymbolBuilder, target loader.Sym, tramp.AddReloc(r) } -func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { @@ -577,9 +577,9 @@ func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r load return val, false, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("unexpected relocation variant") - return t + return -1 } func addpltreloc2(ldr *loader.Loader, plt *loader.SymbolBuilder, got *loader.SymbolBuilder, s loader.Sym, typ objabi.RelocType) { diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index ed62cc804b..653f16dba1 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -48,7 +48,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel2: adddynrel2, Archinit: archinit, - Archreloc2: archreloc2, + Archreloc: archreloc, Archrelocvariant: archrelocvariant, Trampoline: trampoline, Asmb: asmb, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index d28e3efbb4..8e0c75621c 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -442,7 +442,7 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy return true } -func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (int64, bool, bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (int64, bool, bool) { const extRelocNeeded = true const extRelocNotNeeded = false const isOk = true @@ -679,7 +679,7 @@ func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r load return val, false, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("unexpected relocation variant") return -1 } diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 8ccb8685c5..ffce0cb17d 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -48,7 +48,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel2: adddynrel2, Archinit: archinit, - Archreloc2: archreloc2, + Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index c6270af42f..b361f8356f 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -272,14 +272,14 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } var rp *loader.ExtReloc if target.IsExternal() { - // Don't pass &rr directly to Archreloc2, which will escape rr + // Don't pass &rr directly to Archreloc, which will escape rr // even if this case is not taken. Instead, as Archreloc2 will // likely return true, we speculatively add rr to extRelocs - // and use that space to pass to Archreloc2. + // and use that space to pass to Archreloc. extRelocs = append(extRelocs, rr) rp = &extRelocs[len(extRelocs)-1] } - out, needExtReloc1, ok := thearch.Archreloc2(target, ldr, syms, r, rp, s, o) + out, needExtReloc1, ok := thearch.Archreloc(target, ldr, syms, r, rp, s, o) if target.IsExternal() && !needExtReloc1 { // Speculation failed. Undo the append. extRelocs = extRelocs[:len(extRelocs)-1] @@ -557,7 +557,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { if target.IsPPC64() || target.IsS390X() { if rv != sym.RV_NONE { - o = thearch.Archrelocvariant2(target, ldr, r, rv, s, o) + o = thearch.Archrelocvariant(target, ldr, r, rv, s, o) } } diff --git a/src/cmd/link/internal/ld/data2.go b/src/cmd/link/internal/ld/data2.go index 80fe79c15a..0b3c6f01e1 100644 --- a/src/cmd/link/internal/ld/data2.go +++ b/src/cmd/link/internal/ld/data2.go @@ -5,13 +5,8 @@ package ld import ( - "cmd/internal/objabi" - "cmd/link/internal/loader" "cmd/link/internal/sym" - "fmt" - "log" "strings" - "sync" ) // Temporary dumping around for sym.Symbol version of helper @@ -19,21 +14,6 @@ import ( // FIXME: get rid of this file when dodata() is completely // converted. -func Addstring(s *sym.Symbol, str string) int64 { - if s.Type == 0 { - s.Type = sym.SNOPTRDATA - } - s.Attr |= sym.AttrReachable - r := s.Size - if s.Name == ".shstrtab" { - elfsetstring(s, str, int(r)) - } - s.P = append(s.P, str...) - s.P = append(s.P, 0) - s.Size = int64(len(s.P)) - return r -} - // symalign returns the required alignment for the given symbol s. func symalign(s *sym.Symbol) int32 { min := int32(thearch.Minalign) @@ -54,451 +34,3 @@ func symalign(s *sym.Symbol) int32 { s.Align = align return align } - -func relocsym2(target *Target, ldr *loader.Loader, err *ErrorReporter, syms *ArchSyms, s *sym.Symbol) { - if len(s.R) == 0 { - return - } - for ri := int32(0); ri < int32(len(s.R)); ri++ { - r := &s.R[ri] - if r.Done { - // Relocation already processed by an earlier phase. - continue - } - r.Done = true - off := r.Off - siz := int32(r.Siz) - if off < 0 || off+siz > int32(len(s.P)) { - rname := "" - if r.Sym != nil { - rname = r.Sym.Name - } - Errorf(s, "invalid relocation %s: %d+%d not in [%d,%d)", rname, off, siz, 0, len(s.P)) - continue - } - - if r.Sym != nil && ((r.Sym.Type == sym.Sxxx && !r.Sym.Attr.VisibilityHidden()) || r.Sym.Type == sym.SXREF) { - // When putting the runtime but not main into a shared library - // these symbols are undefined and that's OK. - if target.IsShared() || target.IsPlugin() { - if r.Sym.Name == "main.main" || (!target.IsPlugin() && r.Sym.Name == "main..inittask") { - r.Sym.Type = sym.SDYNIMPORT - } else if strings.HasPrefix(r.Sym.Name, "go.info.") { - // Skip go.info symbols. They are only needed to communicate - // DWARF info between the compiler and linker. - continue - } - } else { - err.errorUnresolved2(s, r) - continue - } - } - - if r.Type >= objabi.ElfRelocOffset { - continue - } - if r.Siz == 0 { // informational relocation - no work to do - continue - } - - // We need to be able to reference dynimport symbols when linking against - // shared libraries, and Solaris, Darwin and AIX need it always - if !target.IsSolaris() && !target.IsDarwin() && !target.IsAIX() && r.Sym != nil && r.Sym.Type == sym.SDYNIMPORT && !target.IsDynlinkingGo() && !r.Sym.Attr.SubSymbol() { - if !(target.IsPPC64() && target.IsExternal() && r.Sym.Name == ".TOC.") { - Errorf(s, "unhandled relocation for %s (type %d (%s) rtype %d (%s))", r.Sym.Name, r.Sym.Type, r.Sym.Type, r.Type, sym.RelocName(target.Arch, r.Type)) - } - } - if r.Sym != nil && r.Sym.Type != sym.STLSBSS && r.Type != objabi.R_WEAKADDROFF && !r.Sym.Attr.Reachable() { - Errorf(s, "unreachable sym in relocation: %s", r.Sym.Name) - } - - if target.IsExternal() { - r.InitExt() - } - - // TODO(mundaym): remove this special case - see issue 14218. - if target.IsS390X() { - switch r.Type { - case objabi.R_PCRELDBL: - r.InitExt() - r.Type = objabi.R_PCREL - r.Variant = sym.RV_390_DBL - case objabi.R_CALL: - r.InitExt() - r.Variant = sym.RV_390_DBL - } - } - - var o int64 - switch r.Type { - default: - switch siz { - default: - Errorf(s, "bad reloc size %#x for %s", uint32(siz), r.Sym.Name) - case 1: - o = int64(s.P[off]) - case 2: - o = int64(target.Arch.ByteOrder.Uint16(s.P[off:])) - case 4: - o = int64(target.Arch.ByteOrder.Uint32(s.P[off:])) - case 8: - o = int64(target.Arch.ByteOrder.Uint64(s.P[off:])) - } - if offset, ok := thearch.Archreloc(target, syms, r, s, o); ok { - o = offset - } else { - Errorf(s, "unknown reloc to %v: %d (%s)", r.Sym.Name, r.Type, sym.RelocName(target.Arch, r.Type)) - } - case objabi.R_TLS_LE: - if target.IsExternal() && target.IsElf() { - r.Done = false - if r.Sym == nil { - r.Sym = syms.Tlsg - } - r.Xsym = r.Sym - r.Xadd = r.Add - o = 0 - if !target.IsAMD64() { - o = r.Add - } - break - } - - if target.IsElf() && target.IsARM() { - // On ELF ARM, the thread pointer is 8 bytes before - // the start of the thread-local data block, so add 8 - // to the actual TLS offset (r->sym->value). - // This 8 seems to be a fundamental constant of - // ELF on ARM (or maybe Glibc on ARM); it is not - // related to the fact that our own TLS storage happens - // to take up 8 bytes. - o = 8 + r.Sym.Value - } else if target.IsElf() || target.IsPlan9() || target.IsDarwin() { - o = int64(syms.Tlsoffset) + r.Add - } else if target.IsWindows() { - o = r.Add - } else { - log.Fatalf("unexpected R_TLS_LE relocation for %v", target.HeadType) - } - case objabi.R_TLS_IE: - if target.IsExternal() && target.IsElf() { - r.Done = false - if r.Sym == nil { - r.Sym = syms.Tlsg - } - r.Xsym = r.Sym - r.Xadd = r.Add - o = 0 - if !target.IsAMD64() { - o = r.Add - } - break - } - if target.IsPIE() && target.IsElf() { - // We are linking the final executable, so we - // can optimize any TLS IE relocation to LE. - if thearch.TLSIEtoLE == nil { - log.Fatalf("internal linking of TLS IE not supported on %v", target.Arch.Family) - } - thearch.TLSIEtoLE(s.P, int(off), int(r.Siz)) - o = int64(syms.Tlsoffset) - // TODO: o += r.Add when !target.IsAmd64()? - // Why do we treat r.Add differently on AMD64? - // Is the external linker using Xadd at all? - } else { - log.Fatalf("cannot handle R_TLS_IE (sym %s) when linking internally", s.Name) - } - case objabi.R_ADDR: - if target.IsExternal() && r.Sym.Type != sym.SCONST { - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := ApplyOuterToXAdd(r) - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil { - Errorf(s, "missing section for relocation target %s", rs.Name) - } - r.Xsym = rs - - o = r.Xadd - if target.IsElf() { - if target.IsAMD64() { - o = 0 - } - } else if target.IsDarwin() { - if rs.Type != sym.SHOSTOBJ { - o += Symaddr(rs) - } - } else if target.IsWindows() { - // nothing to do - } else if target.IsAIX() { - o = Symaddr(r.Sym) + r.Add - } else { - Errorf(s, "unhandled pcrel relocation to %s on %v", rs.Name, target.HeadType) - } - - break - } - - // On AIX, a second relocation must be done by the loader, - // as section addresses can change once loaded. - // The "default" symbol address is still needed by the loader so - // the current relocation can't be skipped. - if target.IsAIX() && r.Sym.Type != sym.SDYNIMPORT { - // It's not possible to make a loader relocation in a - // symbol which is not inside .data section. - // FIXME: It should be forbidden to have R_ADDR from a - // symbol which isn't in .data. However, as .text has the - // same address once loaded, this is possible. - if s.Sect.Seg == &Segdata { - Xcoffadddynrel(target, ldr, s, r) - } - } - - o = Symaddr(r.Sym) + r.Add - - // 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 - // fail at runtime. See https://golang.org/issue/7980. - // Instead of special casing only amd64, we treat this as an error on all - // 64-bit architectures so as to be future-proof. - if int32(o) < 0 && target.Arch.PtrSize > 4 && siz == 4 { - Errorf(s, "non-pc-relative relocation address for %s is too big: %#x (%#x + %#x)", r.Sym.Name, uint64(o), Symaddr(r.Sym), r.Add) - errorexit() - } - case objabi.R_DWARFSECREF: - if r.Sym.Sect == nil { - Errorf(s, "missing DWARF section for relocation target %s", r.Sym.Name) - } - - if target.IsExternal() { - r.Done = false - - // On most platforms, the external linker needs to adjust DWARF references - // as it combines DWARF sections. However, on Darwin, dsymutil does the - // DWARF linking, and it understands how to follow section offsets. - // Leaving in the relocation records confuses it (see - // https://golang.org/issue/22068) so drop them for Darwin. - if target.IsDarwin() { - r.Done = true - } - - // PE code emits IMAGE_REL_I386_SECREL and IMAGE_REL_AMD64_SECREL - // for R_DWARFSECREF relocations, while R_ADDR is replaced with - // IMAGE_REL_I386_DIR32, IMAGE_REL_AMD64_ADDR64 and IMAGE_REL_AMD64_ADDR32. - // Do not replace R_DWARFSECREF with R_ADDR for windows - - // let PE code emit correct relocations. - if !target.IsWindows() { - r.Type = objabi.R_ADDR - } - - r.Xsym = r.Sym.Sect.Sym - r.Xadd = r.Add + Symaddr(r.Sym) - int64(r.Sym.Sect.Vaddr) - - o = r.Xadd - if target.IsElf() && target.IsAMD64() { - o = 0 - } - break - } - o = Symaddr(r.Sym) + r.Add - int64(r.Sym.Sect.Vaddr) - case objabi.R_WEAKADDROFF: - if !r.Sym.Attr.Reachable() { - continue - } - fallthrough - case objabi.R_ADDROFF: - // 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 r.Sym.Sect.Name == ".text" { - o = Symaddr(r.Sym) - int64(Segtext.Sections[0].Vaddr) + r.Add - } else { - o = Symaddr(r.Sym) - int64(r.Sym.Sect.Vaddr) + r.Add - } - - case objabi.R_ADDRCUOFF: - // debug_range and debug_loc elements use this relocation type to get an - // offset from the start of the compile unit. - u := ldr.SymUnit(loader.Sym(r.Sym.SymIdx)) - o = Symaddr(r.Sym) + r.Add - Symaddr(ldr.Syms[u.Textp2[0]]) - - // r->sym can be null when CALL $(constant) is transformed from absolute PC to relative PC call. - case objabi.R_GOTPCREL: - if target.IsDynlinkingGo() && target.IsDarwin() && r.Sym != nil && r.Sym.Type != sym.SCONST { - r.Done = false - r.Xadd = r.Add - r.Xadd -= int64(r.Siz) // relative to address after the relocated chunk - r.Xsym = r.Sym - - o = r.Xadd - o += int64(r.Siz) - break - } - fallthrough - case objabi.R_CALL, objabi.R_PCREL: - if target.IsExternal() && r.Sym != nil && r.Sym.Type == sym.SUNDEFEXT { - // pass through to the external linker. - r.Done = false - r.Xadd = 0 - if target.IsElf() { - r.Xadd -= int64(r.Siz) - } - r.Xsym = r.Sym - o = 0 - break - } - if target.IsExternal() && r.Sym != nil && r.Sym.Type != sym.SCONST && (r.Sym.Sect != s.Sect || r.Type == objabi.R_GOTPCREL) { - r.Done = false - - // set up addend for eventual relocation via outer symbol. - rs := ApplyOuterToXAdd(r) - r.Xadd -= int64(r.Siz) // relative to address after the relocated chunk - if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil { - Errorf(s, "missing section for relocation target %s", rs.Name) - } - r.Xsym = rs - - o = r.Xadd - if target.IsElf() { - if target.IsAMD64() { - o = 0 - } - } else if target.IsDarwin() { - if r.Type == objabi.R_CALL { - if target.IsExternal() && rs.Type == sym.SDYNIMPORT { - if target.IsAMD64() { - // AMD64 dynamic relocations are relative to the end of the relocation. - o += int64(r.Siz) - } - } else { - if rs.Type != sym.SHOSTOBJ { - o += int64(uint64(Symaddr(rs)) - rs.Sect.Vaddr) - } - o -= int64(r.Off) // relative to section offset, not symbol - } - } else { - o += int64(r.Siz) - } - } else if target.IsWindows() && target.IsAMD64() { // only amd64 needs PCREL - // PE/COFF's PC32 relocation uses the address after the relocated - // bytes as the base. Compensate by skewing the addend. - o += int64(r.Siz) - } else { - Errorf(s, "unhandled pcrel relocation to %s on %v", rs.Name, target.HeadType) - } - - break - } - - o = 0 - if r.Sym != nil { - o += Symaddr(r.Sym) - } - - o += r.Add - (s.Value + int64(r.Off) + int64(r.Siz)) - case objabi.R_SIZE: - o = r.Sym.Size + r.Add - - case objabi.R_XCOFFREF: - if !target.IsAIX() { - Errorf(s, "find XCOFF R_REF on non-XCOFF files") - } - if !target.IsExternal() { - Errorf(s, "find XCOFF R_REF with internal linking") - } - r.Xsym = r.Sym - r.Xadd = r.Add - r.Done = false - - // This isn't a real relocation so it must not update - // its offset value. - continue - - case objabi.R_DWARFFILEREF: - // The final file index is saved in r.Add in dwarf.go:writelines. - o = r.Add - } - - if target.IsPPC64() || target.IsS390X() { - r.InitExt() - if r.Variant != sym.RV_NONE { - o = thearch.Archrelocvariant(target, syms, r, s, o) - } - } - - if false { - nam := "" - var addr int64 - if r.Sym != nil { - nam = r.Sym.Name - addr = Symaddr(r.Sym) - } - xnam := "" - if r.Xsym != nil { - xnam = r.Xsym.Name - } - fmt.Printf("relocate %s %#x (%#x+%#x, size %d) => %s %#x +%#x (xsym: %s +%#x) [type %d (%s)/%d, %x]\n", s.Name, s.Value+int64(off), s.Value, r.Off, r.Siz, nam, addr, r.Add, xnam, r.Xadd, r.Type, sym.RelocName(target.Arch, r.Type), r.Variant, o) - } - switch siz { - default: - Errorf(s, "bad reloc size %#x for %s", uint32(siz), r.Sym.Name) - fallthrough - - // TODO(rsc): Remove. - case 1: - s.P[off] = byte(int8(o)) - case 2: - if o != int64(int16(o)) { - Errorf(s, "relocation address for %s is too big: %#x", r.Sym.Name, o) - } - i16 := int16(o) - target.Arch.ByteOrder.PutUint16(s.P[off:], uint16(i16)) - case 4: - if r.Type == objabi.R_PCREL || r.Type == objabi.R_CALL { - if o != int64(int32(o)) { - Errorf(s, "pc-relative relocation address for %s is too big: %#x", r.Sym.Name, o) - } - } else { - if o != int64(int32(o)) && o != int64(uint32(o)) { - Errorf(s, "non-pc-relative relocation address for %s is too big: %#x", r.Sym.Name, uint64(o)) - } - } - - fl := int32(o) - target.Arch.ByteOrder.PutUint32(s.P[off:], uint32(fl)) - case 8: - target.Arch.ByteOrder.PutUint64(s.P[off:], uint64(o)) - } - } -} - -func (ctxt *Link) reloc2() { - var wg sync.WaitGroup - target := &ctxt.Target - ldr := ctxt.loader - reporter := &ctxt.ErrorReporter - syms := &ctxt.ArchSyms - wg.Add(3) - go func() { - if !ctxt.IsWasm() { // On Wasm, text relocations are applied in Asmb2. - for _, s := range ctxt.Textp { - relocsym2(target, ldr, reporter, syms, s) - } - } - wg.Done() - }() - go func() { - for _, s := range ctxt.datap { - relocsym2(target, ldr, reporter, syms, s) - } - wg.Done() - }() - go func() { - for _, si := range dwarfp { - for _, s := range si.syms { - relocsym2(target, ldr, reporter, syms, s) - } - } - wg.Done() - }() - wg.Wait() -} diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 3c9914a219..7f25e0c18d 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -244,9 +244,7 @@ type Arch struct { // same spot in sym.P), a boolean indicating if the external relocations' // been used, and a boolean indicating success/failure (a failing value // indicates a fatal error). - Archreloc func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol, - offset int64) (relocatedOffset int64, success bool) - Archreloc2 func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc, + Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (relocatedOffset int64, needExtReloc bool, ok bool) // Archrelocvariant is a second arch-specific hook used for // relocation processing; it handles relocations where r.Type is @@ -256,9 +254,7 @@ type Arch struct { // relocation applies, and "off" is the contents of the // to-be-relocated data item (from sym.P). Return is an updated // offset value. - Archrelocvariant func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol, - offset int64) (relocatedOffset int64) - Archrelocvariant2 func(target *Target, ldr *loader.Loader, rel loader.Reloc2, + Archrelocvariant func(target *Target, ldr *loader.Loader, rel loader.Reloc2, rv sym.RelocVariant, sym loader.Sym, offset int64) (relocatedOffset int64) // Generate a trampoline for a call from s to rs if necessary. ri is diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 176c3b00bf..5b16314955 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -318,26 +318,18 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("Asmb") ctxt.loader.InitOutData() thearch.Asmb(ctxt, ctxt.loader) - newreloc := ctxt.Is386() || ctxt.IsAMD64() || ctxt.IsARM() || ctxt.IsARM64() || ctxt.IsMIPS() || ctxt.IsMIPS64() || ctxt.IsRISCV64() || ctxt.IsS390X() || ctxt.IsWasm() || ctxt.IsPPC64() + bench.Start("reloc") + ctxt.reloc() newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() - if newreloc { - bench.Start("reloc") - ctxt.reloc() - if !newasmb2 { - bench.Start("loadlibfull") - // We don't need relocations at this point. - // Wasm is an exception, where it applies text relocations in Asmb2. - needReloc := ctxt.IsWasm() - // On AMD64 ELF, we directly use the loader's ExtRelocs, so we don't - // need conversion. Otherwise we do. - needExtReloc := ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) - ctxt.loadlibfull(symGroupType, needReloc, needExtReloc) // XXX do it here for now - } - } else { + if !newasmb2 { bench.Start("loadlibfull") - ctxt.loadlibfull(symGroupType, true, false) // XXX do it here for now - bench.Start("reloc") - ctxt.reloc2() + // We don't need relocations at this point. + // Wasm is an exception, where it applies text relocations in Asmb2. + needReloc := ctxt.IsWasm() + // On AMD64 ELF, we directly use the loader's ExtRelocs, so we don't + // need conversion. Otherwise we do. + needExtReloc := ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) + ctxt.loadlibfull(symGroupType, needReloc, needExtReloc) // XXX do it here for now } bench.Start("Asmb2") thearch.Asmb2(ctxt) diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 65f32ad940..e372a5a7ec 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -98,7 +98,7 @@ func applyrel(arch *sys.Arch, ldr *loader.Loader, rt objabi.RelocType, off int32 } } -func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { @@ -155,7 +155,7 @@ func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r load return val, false, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { return -1 } diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index c309a85052..b646adaf40 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -51,7 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel: adddynrel, Archinit: archinit, - Archreloc2: archreloc2, + Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index c23360ea3b..317ede70a7 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -101,7 +101,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { @@ -160,7 +160,7 @@ func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r load return val, false, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { return -1 } diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index ab23c342b3..b5f7ae1405 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -50,7 +50,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfreglr: dwarfRegLR, Adddynrel: adddynrel, Archinit: archinit, - Archreloc2: archreloc2, + Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index 16882d4d45..67002bc719 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -49,18 +49,18 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, - Archinit: archinit, - Archreloc2: archreloc, - Archrelocvariant2: archrelocvariant, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext2: gentext2, - Trampoline: trampoline, - Machoreloc1: machoreloc1, - Xcoffreloc1: xcoffreloc1, + Adddynrel2: adddynrel2, + Archinit: archinit, + Archreloc: archreloc, + Archrelocvariant: archrelocvariant, + Asmb: asmb, + Asmb2: asmb2, + Elfreloc1: elfreloc1, + Elfsetupplt: elfsetupplt, + Gentext2: gentext2, + Trampoline: trampoline, + Machoreloc1: machoreloc1, + Xcoffreloc1: xcoffreloc1, // TODO(austin): ABI v1 uses /usr/lib/ld.so.1, Linuxdynld: "/lib64/ld64.so.1", diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index 88c6d8790e..b82f98fda8 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -42,7 +42,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) switch r.Type() { @@ -95,7 +95,7 @@ func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r load return val, false, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("archrelocvariant") return -1 } diff --git a/src/cmd/link/internal/riscv64/obj.go b/src/cmd/link/internal/riscv64/obj.go index 53d6bfb660..4fa0ebe79a 100644 --- a/src/cmd/link/internal/riscv64/obj.go +++ b/src/cmd/link/internal/riscv64/obj.go @@ -22,7 +22,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel: adddynrel, Archinit: archinit, - Archreloc2: archreloc2, + Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index e1e7f0b249..a39ddcf787 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -367,11 +367,11 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { return val, false, false } -func archrelocvariant2(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) int64 { +func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) int64 { switch rv & sym.RV_TYPE_MASK { default: ldr.Errorf(s, "unexpected relocation variant %d", rv) diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 8c4180501a..9a480f118e 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -46,16 +46,16 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, - Archinit: archinit, - Archreloc2: archreloc2, - Archrelocvariant2: archrelocvariant2, - Asmb: asmb, - Asmb2: asmb2, - Elfreloc1: elfreloc1, - Elfsetupplt: elfsetupplt, - Gentext2: gentext2, - Machoreloc1: machoreloc1, + Adddynrel2: adddynrel2, + Archinit: archinit, + Archreloc: archreloc, + Archrelocvariant: archrelocvariant, + Asmb: asmb, + Asmb2: asmb2, + Elfreloc1: elfreloc1, + Elfsetupplt: elfsetupplt, + Gentext2: gentext2, + Machoreloc1: machoreloc1, Linuxdynld: "/lib64/ld64.so.1", diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index b42bfd3dc2..ddf04083af 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -436,13 +436,13 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, sym loader.Sym, val int64) (int64, bool, bool) { - return val, false, false +func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, bool, bool) { + return -1, false, false } -func archrelocvariant(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, t int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("unexpected relocation variant") - return t + return -1 } func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.Sym) { diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index 06a1a6a96d..61e3077b5b 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -48,7 +48,7 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel2: adddynrel2, Archinit: archinit, - Archreloc2: archreloc2, + Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, -- GitLab From 744641ef37f38790e7234709144eb4c4aa4cd6e5 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 8 May 2020 14:09:57 -0400 Subject: [PATCH 0018/1792] [dev.link] cmd/link: convert asmb2 pass to new style on Wasm And no longer do loadlibfull there. Change-Id: I3dd41d25f5f7db4ef1d112559299e322acb32641 Reviewed-on: https://go-review.googlesource.com/c/go/+/232987 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/asm.go | 2 +- src/cmd/link/internal/arm/asm.go | 2 +- src/cmd/link/internal/arm64/asm.go | 2 +- src/cmd/link/internal/ld/lib.go | 2 +- src/cmd/link/internal/ld/main.go | 7 ++-- src/cmd/link/internal/mips/asm.go | 2 +- src/cmd/link/internal/mips64/asm.go | 2 +- src/cmd/link/internal/ppc64/asm.go | 2 +- src/cmd/link/internal/riscv64/asm.go | 2 +- src/cmd/link/internal/s390x/asm.go | 2 +- src/cmd/link/internal/wasm/asm.go | 63 +++++++++++++++------------- src/cmd/link/internal/x86/asm.go | 2 +- 12 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index a0eaf64c8e..c05767022c 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -722,7 +722,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { machlink := int64(0) if ctxt.HeadType == objabi.Hdarwin { machlink = ld.Domacholink(ctxt) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 275b5fe34f..5990179fe7 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -696,7 +696,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 8e0c75621c..306eb7d46c 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -825,7 +825,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { machlink := uint32(0) if ctxt.HeadType == objabi.Hdarwin { machlink = uint32(ld.Domacholink(ctxt)) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 7f25e0c18d..20c483ea44 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -266,7 +266,7 @@ type Arch struct { // segments), for which we have computed the size and offset. Asmb2 // writes the rest. Asmb func(*Link, *loader.Loader) - Asmb2 func(*Link) + Asmb2 func(*Link, *loader.Loader) Elfreloc1 func(*Link, *sym.Reloc, int64) bool Elfreloc2 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 5b16314955..3c28a8b6da 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -320,19 +320,18 @@ func Main(arch *sys.Arch, theArch Arch) { thearch.Asmb(ctxt, ctxt.loader) bench.Start("reloc") ctxt.reloc() - newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() + newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() if !newasmb2 { bench.Start("loadlibfull") // We don't need relocations at this point. - // Wasm is an exception, where it applies text relocations in Asmb2. - needReloc := ctxt.IsWasm() + needReloc := false // On AMD64 ELF, we directly use the loader's ExtRelocs, so we don't // need conversion. Otherwise we do. needExtReloc := ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) ctxt.loadlibfull(symGroupType, needReloc, needExtReloc) // XXX do it here for now } bench.Start("Asmb2") - thearch.Asmb2(ctxt) + thearch.Asmb2(ctxt, ctxt.loader) bench.Start("Munmap") ctxt.Out.Close() // Close handles Munmapping if necessary. diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index e372a5a7ec..67b3726271 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -184,7 +184,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 317ede70a7..c67753c290 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -193,7 +193,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index b0adf27f9b..c6ee3d6033 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -1106,7 +1106,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index b82f98fda8..f76a42b1c0 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -129,7 +129,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { ld.Symsize = 0 ld.Lcsize = 0 symo := uint32(0) diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index a39ddcf787..3e7b1ffb14 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -503,7 +503,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/wasm/asm.go b/src/cmd/link/internal/wasm/asm.go index 1eb3291db6..e52f44b94a 100644 --- a/src/cmd/link/internal/wasm/asm.go +++ b/src/cmd/link/internal/wasm/asm.go @@ -119,7 +119,7 @@ func asmb(ctxt *ld.Link, ldr *loader.Loader) { // asmb writes the final WebAssembly module binary. // Spec: https://webassembly.github.io/spec/core/binary/modules.html -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, ldr *loader.Loader) { types := []*wasmFuncType{ // For normal Go functions, the single parameter is PC_B, // the return value is @@ -135,13 +135,15 @@ func asmb2(ctxt *ld.Link) { Type: lookupType(&wasmFuncType{Params: []byte{I32}}, &types), }, } - hostImportMap := make(map[*sym.Symbol]int64) - for _, fn := range ctxt.Textp { - for _, r := range fn.R { - if r.Type == objabi.R_WASMIMPORT { - hostImportMap[r.Sym] = int64(len(hostImports)) + hostImportMap := make(map[loader.Sym]int64) + for _, fn := range ctxt.Textp2 { + relocs := ldr.Relocs(fn) + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At2(ri) + if r.Type() == objabi.R_WASMIMPORT { + hostImportMap[r.Sym()] = int64(len(hostImports)) hostImports = append(hostImports, &wasmFunc{ - Name: r.Sym.Name, + Name: ldr.SymName(r.Sym()), Type: lookupType(&wasmFuncType{Params: []byte{I32}}, &types), }) } @@ -150,41 +152,45 @@ func asmb2(ctxt *ld.Link) { // collect functions with WebAssembly body var buildid []byte - fns := make([]*wasmFunc, len(ctxt.Textp)) - for i, fn := range ctxt.Textp { + fns := make([]*wasmFunc, len(ctxt.Textp2)) + for i, fn := range ctxt.Textp2 { wfn := new(bytes.Buffer) - if fn.Name == "go.buildid" { + if ldr.SymName(fn) == "go.buildid" { writeUleb128(wfn, 0) // number of sets of locals writeI32Const(wfn, 0) wfn.WriteByte(0x0b) // end - buildid = fn.P + buildid = ldr.Data(fn) } else { // Relocations have variable length, handle them here. + relocs := ldr.Relocs(fn) + P := ldr.Data(fn) off := int32(0) - for _, r := range fn.R { - wfn.Write(fn.P[off:r.Off]) - off = r.Off - switch r.Type { + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At2(ri) + wfn.Write(P[off:r.Off()]) + off = r.Off() + rs := ldr.ResolveABIAlias(r.Sym()) + switch r.Type() { case objabi.R_ADDR: - writeSleb128(wfn, r.Sym.Value+r.Add) + writeSleb128(wfn, ldr.SymValue(rs)+r.Add()) case objabi.R_CALL: - writeSleb128(wfn, int64(len(hostImports))+r.Sym.Value>>16-funcValueOffset) + writeSleb128(wfn, int64(len(hostImports))+ldr.SymValue(rs)>>16-funcValueOffset) case objabi.R_WASMIMPORT: - writeSleb128(wfn, hostImportMap[r.Sym]) + writeSleb128(wfn, hostImportMap[rs]) default: - ld.Errorf(fn, "bad reloc type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) + ldr.Errorf(fn, "bad reloc type %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type())) continue } } - wfn.Write(fn.P[off:]) + wfn.Write(P[off:]) } typ := uint32(0) - if sig, ok := wasmFuncTypes[fn.Name]; ok { + if sig, ok := wasmFuncTypes[ldr.SymName(fn)]; ok { typ = lookupType(sig, &types) } - name := nameRegexp.ReplaceAllString(fn.Name, "_") + name := nameRegexp.ReplaceAllString(ldr.SymName(fn), "_") fns[i] = &wasmFunc{Name: name, Type: typ, Code: wfn.Bytes()} } @@ -200,9 +206,9 @@ func asmb2(ctxt *ld.Link) { writeImportSec(ctxt, hostImports) writeFunctionSec(ctxt, fns) writeTableSec(ctxt, fns) - writeMemorySec(ctxt) + writeMemorySec(ctxt, ldr) writeGlobalSec(ctxt) - writeExportSec(ctxt, len(hostImports)) + writeExportSec(ctxt, ldr, len(hostImports)) writeElementSec(ctxt, uint64(len(hostImports)), uint64(len(fns))) writeCodeSec(ctxt, fns) writeDataSec(ctxt) @@ -311,10 +317,10 @@ func writeTableSec(ctxt *ld.Link, fns []*wasmFunc) { // writeMemorySec writes the section that declares linear memories. Currently one linear memory is being used. // Linear memory always starts at address zero. More memory can be requested with the GrowMemory instruction. -func writeMemorySec(ctxt *ld.Link) { +func writeMemorySec(ctxt *ld.Link, ldr *loader.Loader) { sizeOffset := writeSecHeader(ctxt, sectionMemory) - dataSection := ctxt.Syms.Lookup("runtime.data", 0).Sect + dataSection := ldr.SymSect(ldr.Lookup("runtime.data", 0)) dataEnd := dataSection.Vaddr + dataSection.Length var initialSize = dataEnd + 16<<20 // 16MB, enough for runtime init without growing @@ -362,13 +368,14 @@ func writeGlobalSec(ctxt *ld.Link) { // writeExportSec writes the section that declares exports. // Exports can be accessed by the WebAssembly host, usually JavaScript. // The wasm_export_* functions and the linear memory get exported. -func writeExportSec(ctxt *ld.Link, lenHostImports int) { +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"} { - idx := uint32(lenHostImports) + uint32(ctxt.Syms.ROLookup("wasm_export_"+name, 0).Value>>16) - funcValueOffset + 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 diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index ddf04083af..824e20b828 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -587,7 +587,7 @@ func asmb(ctxt *ld.Link, _ *loader.Loader) { wg.Wait() } -func asmb2(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link, _ *loader.Loader) { machlink := uint32(0) if ctxt.HeadType == objabi.Hdarwin { machlink = uint32(ld.Domacholink(ctxt)) -- GitLab From 88a12a99b468c61e2fb3ff306623bdb1ede1da5b Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 11 May 2020 12:52:37 -0400 Subject: [PATCH 0019/1792] [dev.link] cmd/link: convert asmb2 pass to new style on Plan 9 And no longer do loadlibfull there. Change-Id: I0359f40123f6b0b7855d6fced5876fd4da9c6130 Reviewed-on: https://go-review.googlesource.com/c/go/+/233337 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/asm.go | 8 +-- src/cmd/link/internal/arm/asm.go | 10 +--- src/cmd/link/internal/arm64/asm.go | 10 +--- src/cmd/link/internal/ld/lib.go | 2 +- src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/ld/symtab.go | 88 +++++++++++++++++++++-------- src/cmd/link/internal/mips64/asm.go | 10 +--- src/cmd/link/internal/ppc64/asm.go | 10 +--- src/cmd/link/internal/x86/asm.go | 14 ++--- 9 files changed, 79 insertions(+), 75 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index c05767022c..c8b4a1f261 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -795,12 +795,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: ld.Asmplan9sym(ctxt) - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - } - case objabi.Hwindows: // Do nothing @@ -823,7 +817,7 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - vl := ld.Entryvalue(ctxt) + vl := ld.Entryvalue2(ctxt) ctxt.Out.Write32b(PADDR(uint32(vl))) /* va of entry */ ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 5990179fe7..e268c15565 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -734,12 +734,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: ld.Asmplan9sym(ctxt) - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - } - case objabi.Hwindows: // Do nothing } @@ -753,8 +747,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */ + ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32b(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32b(0) ctxt.Out.Write32b(uint32(ld.Lcsize)) diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 306eb7d46c..787851bbd2 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -867,12 +867,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: ld.Asmplan9sym(ctxt) - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - } - case objabi.Hdarwin: if ctxt.LinkMode == ld.LinkExternal { ld.Machoemitreloc(ctxt) @@ -888,8 +882,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ + ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32(0) ctxt.Out.Write32(uint32(ld.Lcsize)) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 20c483ea44..229ed12f26 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2477,7 +2477,7 @@ func usage() { Exit(2) } -type SymbolType int8 +type SymbolType int8 // TODO: after genasmsym is gone, maybe rename to plan9typeChar or something const ( // see also https://9p.io/magic/man2html/1/nm diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 3c28a8b6da..bcb1e888a0 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -320,7 +320,7 @@ func Main(arch *sys.Arch, theArch Arch) { thearch.Asmb(ctxt, ctxt.loader) bench.Start("reloc") ctxt.reloc() - newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() + newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() || ctxt.IsPlan9() if !newasmb2 { bench.Start("loadlibfull") // We don't need relocations at this point. diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 7ddd3eb6f6..9748de96d1 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -224,37 +224,77 @@ func Asmelfsym(ctxt *Link) { genasmsym(ctxt, putelfsym) } -func putplan9sym(ctxt *Link, x *sym.Symbol, s string, typ SymbolType, addr int64) { - t := int(typ) - switch typ { - case TextSym, DataSym, BSSSym: - if x.IsFileLocal() { - t += 'a' - 'A' - } - fallthrough +func putplan9sym(ctxt *Link, ldr *loader.Loader, s loader.Sym, char SymbolType) { + t := int(char) + if ldr.IsFileLocal(s) { + t += 'a' - 'A' + } + l := 4 + addr := ldr.SymValue(s) + if ctxt.IsAMD64() && !Flag8 { + ctxt.Out.Write32b(uint32(addr >> 32)) + l = 8 + } - case AutoSym, ParamSym, FrameSym: - l := 4 - if ctxt.HeadType == objabi.Hplan9 && ctxt.Arch.Family == sys.AMD64 && !Flag8 { - ctxt.Out.Write32b(uint32(addr >> 32)) - l = 8 - } + ctxt.Out.Write32b(uint32(addr)) + ctxt.Out.Write8(uint8(t + 0x80)) /* 0x80 is variable length */ - ctxt.Out.Write32b(uint32(addr)) - ctxt.Out.Write8(uint8(t + 0x80)) /* 0x80 is variable length */ + name := ldr.SymName(s) + ctxt.Out.WriteString(name) + ctxt.Out.Write8(0) - ctxt.Out.WriteString(s) - ctxt.Out.Write8(0) + Symsize += int32(l) + 1 + int32(len(name)) + 1 +} - Symsize += int32(l) + 1 + int32(len(s)) + 1 +func Asmplan9sym(ctxt *Link) { + ldr := ctxt.loader - default: - return + // Add special runtime.text and runtime.etext symbols. + s := ldr.Lookup("runtime.text", 0) + if ldr.SymType(s) == sym.STEXT { + putplan9sym(ctxt, ldr, s, TextSym) + } + s = ldr.Lookup("runtime.etext", 0) + if ldr.SymType(s) == sym.STEXT { + putplan9sym(ctxt, ldr, s, TextSym) } -} -func Asmplan9sym(ctxt *Link) { - genasmsym(ctxt, putplan9sym) + // Add text symbols. + for _, s := range ctxt.Textp2 { + putplan9sym(ctxt, ldr, s, TextSym) + } + + shouldBeInSymbolTable := func(s loader.Sym) bool { + if ldr.AttrNotInSymbolTable(s) { + return false + } + name := ldr.RawSymName(s) // TODO: try not to read the name + if name == "" || name[0] == '.' { + return false + } + return true + } + + // Add data symbols and external references. + for s := loader.Sym(1); s < loader.Sym(ldr.NSym()); s++ { + if !ldr.AttrReachable(s) { + continue + } + t := ldr.SymType(s) + if t >= sym.SELFRXSECT && t < sym.SXREF { // data sections handled in dodata + if t == sym.STLSBSS { + continue + } + if !shouldBeInSymbolTable(s) { + continue + } + char := DataSym + if t == sym.SBSS || t == sym.SNOPTRBSS { + char = BSSSym + } + putplan9sym(ctxt, ldr, s, char) + } + } } type byPkg []*sym.Library diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index c67753c290..479157cb50 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -226,12 +226,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: ld.Asmplan9sym(ctxt) - - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - } } } @@ -247,8 +241,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ + ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32(0) ctxt.Out.Write32(uint32(ld.Lcsize)) diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index c6ee3d6033..7e08e534b3 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -1143,12 +1143,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: ld.Asmplan9sym(ctxt) - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - } - case objabi.Haix: // symtab must be added once sections have been created in ld.Asmbxcoff } @@ -1162,8 +1156,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ + ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ ctxt.Out.Write32(0) ctxt.Out.Write32(uint32(ld.Lcsize)) diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 824e20b828..5858845475 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -632,12 +632,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: ld.Asmplan9sym(ctxt) - sym := ctxt.Syms.Lookup("pclntab", 0) - if sym != nil { - ld.Lcsize = int32(len(sym.P)) - ctxt.Out.Write(sym.P) - } - case objabi.Hwindows: // Do nothing @@ -658,10 +652,10 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ - ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ + ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32b(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ + ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ + ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ case objabi.Hdarwin: ld.Asmbmacho(ctxt) -- GitLab From 25e9417b9807bc6166b127f698d145ce060cd23f Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 7 May 2020 10:06:28 -0400 Subject: [PATCH 0020/1792] [dev.link] cmd/link: convert Asmb2 path to loader APIs for Elf/AMD64 This patch converts the linker's Asmb2 phase to use loader APIs for AMD64 (other architectures to be converted in a subsequent patch). Change-Id: I5a9aa9b03769cabc1a22b982f48fd113213d7bcf Reviewed-on: https://go-review.googlesource.com/c/go/+/233338 Run-TryBot: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 8 +- src/cmd/link/internal/ld/data.go | 5 + src/cmd/link/internal/ld/dwarf.go | 22 +- src/cmd/link/internal/ld/dwarf2.go | 14 +- src/cmd/link/internal/ld/elf.go | 117 +++--- src/cmd/link/internal/ld/elf2.go | 585 ++++++++++++++++++++++++++++ src/cmd/link/internal/ld/lib.go | 39 +- src/cmd/link/internal/ld/lib2.go | 51 +++ src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/ld/symtab.go | 155 +++++--- src/cmd/link/internal/ld/symtab2.go | 166 ++++++++ 11 files changed, 1004 insertions(+), 160 deletions(-) create mode 100644 src/cmd/link/internal/ld/lib2.go create mode 100644 src/cmd/link/internal/ld/symtab2.go diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index c8b4a1f261..554379d625 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -396,9 +396,9 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff)) - xsym := ldr.Syms[r.Xsym] - elfsym := ld.ElfSymForReloc(ctxt, xsym) + elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) siz := r.Siz() + xst := ldr.SymType(r.Xsym) switch r.Type() { default: return false @@ -424,7 +424,7 @@ func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo } case objabi.R_CALL: if siz == 4 { - if xsym.Type == sym.SDYNIMPORT { + if xst == sym.SDYNIMPORT { if ctxt.DynlinkingGo() { ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { @@ -438,7 +438,7 @@ func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo } case objabi.R_PCREL: if siz == 4 { - if xsym.Type == sym.SDYNIMPORT && xsym.ElfType() == elf.STT_FUNC { + if xst == sym.SDYNIMPORT && ldr.SymElfType(r.Xsym) == elf.STT_FUNC { ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 1502c60078..f17a9eba63 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2104,6 +2104,11 @@ func (ctxt *Link) buildinfo() { ldr := ctxt.loader s := ldr.CreateSymForUpdate(".go.buildinfo", 0) s.SetReachable(true) + if !ctxt.IsAIX() { + // On AIX, .go.buildinfo must be in the symbol table as + // it has relocations. + s.SetNotInSymbolTable(true) + } s.SetType(sym.SBUILDINFO) s.SetAlign(16) // The \xff is invalid UTF-8, meant to make it less likely diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 95e6b12282..964ed7abf6 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -2112,12 +2112,6 @@ func (d *dwctxt2) dwarfaddshstrings(ctxt *Link, shstrtab loader.Sym) { panic("not yet implemented") } -// Add section symbols for DWARF debug info. This is called before -// dwarfaddelfheaders. -func (d *dwctxt2) dwarfaddelfsectionsyms(ctxt *Link) { - panic("not yet implemented") -} - // dwarfcompress compresses the DWARF sections. Relocations are applied // on the fly. After this, dwarfp will contain a different (new) set of // symbols, and sections may have been replaced. @@ -2152,3 +2146,19 @@ func saveDwsectCUSize(sname string, pkgname string, size uint64) { func addDwsectCUSize(sname string, pkgname string, size uint64) { dwsectCUSize[sname+"."+pkgname] += size } + +func dwarfaddelfsectionsyms(ctxt *Link) { + if *FlagW { // disable dwarf + return + } + if ctxt.LinkMode != LinkExternal { + return + } + + ldr := ctxt.loader + for _, si := range dwarfp2 { + s := si.secSym() + sect := ldr.SymSect(si.secSym()) + putelfsectionsym(ctxt, ctxt.Out, s, sect.Elfsect.(*ElfShdr).shnum) + } +} diff --git a/src/cmd/link/internal/ld/dwarf2.go b/src/cmd/link/internal/ld/dwarf2.go index 79abccfdf3..02090e1e07 100644 --- a/src/cmd/link/internal/ld/dwarf2.go +++ b/src/cmd/link/internal/ld/dwarf2.go @@ -67,7 +67,7 @@ func dwarfaddshstrings(ctxt *Link, shstrtab *loader.SymbolBuilder) { // Add section symbols for DWARF debug info. This is called before // dwarfaddelfheaders. -func dwarfaddelfsectionsyms(ctxt *Link) { +func dwarfaddelfsectionsyms2(ctxt *Link) { if *FlagW { // disable dwarf return } @@ -76,20 +76,20 @@ func dwarfaddelfsectionsyms(ctxt *Link) { } s := ctxt.Syms.Lookup(".debug_info", 0) - putelfsectionsym(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) + putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) s = ctxt.Syms.Lookup(".debug_abbrev", 0) - putelfsectionsym(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) + putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) s = ctxt.Syms.Lookup(".debug_line", 0) - putelfsectionsym(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) + putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) s = ctxt.Syms.Lookup(".debug_frame", 0) - putelfsectionsym(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) + putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) s = ctxt.Syms.Lookup(".debug_loc", 0) if s.Sect != nil { - putelfsectionsym(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) + putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) } s = ctxt.Syms.Lookup(".debug_ranges", 0) if s.Sect != nil { - putelfsectionsym(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) + putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) } } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 67fe83d8f5..9cf1339aa4 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1344,12 +1344,7 @@ func elfshreloc(arch *sys.Arch, sect *sym.Section) *ElfShdr { return sh } -func elfrelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { - if !ctxt.IsAMD64() { - elfrelocsect2(ctxt, sect, syms) - return - } - +func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) { // If main section is SHT_NOBITS, nothing to relocate. // Also nothing to relocate in .shstrtab. if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { @@ -1359,43 +1354,43 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { return } + ldr := ctxt.loader sect.Reloff = uint64(ctxt.Out.Offset()) for i, s := range syms { - if !s.Attr.Reachable() { - continue + if !ldr.AttrReachable(s) { + panic("should never happen") } - if uint64(s.Value) >= sect.Vaddr { + if uint64(ldr.SymValue(s)) >= sect.Vaddr { syms = syms[i:] break } } - ldr := ctxt.loader eaddr := int32(sect.Vaddr + sect.Length) for _, s := range syms { - if !s.Attr.Reachable() { + if !ldr.AttrReachable(s) { continue } - if s.Value >= int64(eaddr) { + if ldr.SymValue(s) >= int64(eaddr) { break } - i := loader.Sym(s.SymIdx) - relocs := ldr.ExtRelocs(i) + + relocs := ldr.ExtRelocs(s) for ri := 0; ri < relocs.Count(); ri++ { r := relocs.At(ri) if r.Xsym == 0 { - Errorf(s, "missing xsym in relocation %v", ldr.SymName(r.Sym())) + ldr.Errorf(s, "missing xsym in relocation") continue } - esr := ElfSymForReloc(ctxt, ldr.Syms[r.Xsym]) + esr := ElfSymForReloc2(ctxt, r.Xsym) if esr == 0 { - Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.Syms[r.Sym()].Name, ldr.Syms[r.Xsym].Name, ldr.Syms[r.Sym()].Type, ldr.Syms[r.Sym()].Type) + ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) } if !ldr.AttrReachable(r.Xsym) { - Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.Syms[r.Xsym].Name) + ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) } - if !thearch.Elfreloc2(ctxt, ldr, i, r, int64(uint64(s.Value+int64(r.Off()))-sect.Vaddr)) { - Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), r.Siz(), ldr.Syms[r.Sym()].Name) + if !thearch.Elfreloc2(ctxt, ldr, s, r, 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())) } } } @@ -1404,32 +1399,37 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { } func Elfemitreloc(ctxt *Link) { + if !ctxt.IsAMD64() { + Elfemitreloc2(ctxt) + return + } + for ctxt.Out.Offset()&7 != 0 { ctxt.Out.Write8(0) } for _, sect := range Segtext.Sections { if sect.Name == ".text" { - elfrelocsect(ctxt, sect, ctxt.Textp) + elfrelocsect(ctxt, sect, ctxt.Textp2) } else { - elfrelocsect(ctxt, sect, ctxt.datap) + elfrelocsect(ctxt, sect, ctxt.datap2) } } for _, sect := range Segrodata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap) + elfrelocsect(ctxt, sect, ctxt.datap2) } for _, sect := range Segrelrodata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap) + elfrelocsect(ctxt, sect, ctxt.datap2) } for _, sect := range Segdata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap) + elfrelocsect(ctxt, sect, ctxt.datap2) } for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] - si := dwarfp[i] - if si.secSym() != sect.Sym || - si.secSym().Sect != sect { + si := dwarfp2[i] + if si.secSym() != loader.Sym(sect.Sym2) || + ctxt.loader.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } elfrelocsect(ctxt, sect, si.syms) @@ -1734,13 +1734,16 @@ func (ctxt *Link) doelf() { } // Do not write DT_NULL. elfdynhash will finish it. -func shsym(sh *ElfShdr, s *sym.Symbol) { - addr := Symaddr(s) +func shsym2(sh *ElfShdr, ldr *loader.Loader, s loader.Sym) { + if s == 0 { + panic("bad symbol in shsym2") + } + addr := ldr.SymValue(s) if sh.flags&SHF_ALLOC != 0 { sh.addr = uint64(addr) } - sh.off = uint64(datoff(s, addr)) - sh.size = uint64(s.Size) + sh.off = uint64(datoff(ldr, s, addr)) + sh.size = uint64(ldr.SymSize(s)) } func phsh(ph *ElfPhdr, sh *ElfShdr) { @@ -1782,6 +1785,12 @@ func Asmbelfsetup() { } func Asmbelf(ctxt *Link, symo int64) { + if !ctxt.IsAMD64() { + Asmbelf2(ctxt, symo) + return + } + + ldr := ctxt.loader eh := getElfEhdr() switch ctxt.Arch.Family { default: @@ -2000,22 +2009,22 @@ func Asmbelf(ctxt *Link, symo int64) { sh.link = uint32(elfshname(".dynstr").shnum) // sh.info is the index of first non-local symbol (number of local symbols) - s := ctxt.Syms.Lookup(".dynsym", 0) + s := ldr.Lookup(".dynsym", 0) i := uint32(0) - for sub := s; sub != nil; sub = symSub(ctxt, sub) { + for sub := s; sub != 0; sub = ldr.SubSym(sub) { i++ - if !sub.Attr.Local() { + if !ldr.AttrLocal(sub) { break } } sh.info = i - shsym(sh, s) + shsym2(sh, ldr, s) sh = elfshname(".dynstr") sh.type_ = SHT_STRTAB sh.flags = SHF_ALLOC sh.addralign = 1 - shsym(sh, ctxt.Syms.Lookup(".dynstr", 0)) + shsym2(sh, ldr, ldr.Lookup(".dynstr", 0)) if elfverneed != 0 { sh := elfshname(".gnu.version") @@ -2024,7 +2033,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.addralign = 2 sh.link = uint32(elfshname(".dynsym").shnum) sh.entsize = 2 - shsym(sh, ctxt.Syms.Lookup(".gnu.version", 0)) + shsym2(sh, ldr, ldr.Lookup(".gnu.version", 0)) sh = elfshname(".gnu.version_r") sh.type_ = SHT_GNU_VERNEED @@ -2032,7 +2041,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.addralign = uint64(ctxt.Arch.RegSize) sh.info = uint32(elfverneed) sh.link = uint32(elfshname(".dynstr").shnum) - shsym(sh, ctxt.Syms.Lookup(".gnu.version_r", 0)) + shsym2(sh, ldr, ldr.Lookup(".gnu.version_r", 0)) } if elfRelType == ".rela" { @@ -2043,7 +2052,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.addralign = uint64(ctxt.Arch.RegSize) sh.link = uint32(elfshname(".dynsym").shnum) sh.info = uint32(elfshname(".plt").shnum) - shsym(sh, ctxt.Syms.Lookup(".rela.plt", 0)) + shsym2(sh, ldr, ldr.Lookup(".rela.plt", 0)) sh = elfshname(".rela") sh.type_ = SHT_RELA @@ -2051,7 +2060,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = ELF64RELASIZE sh.addralign = 8 sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rela", 0)) + shsym2(sh, ldr, ldr.Lookup(".rela", 0)) } else { sh := elfshname(".rel.plt") sh.type_ = SHT_REL @@ -2059,7 +2068,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = ELF32RELSIZE sh.addralign = 4 sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rel.plt", 0)) + shsym2(sh, ldr, ldr.Lookup(".rel.plt", 0)) sh = elfshname(".rel") sh.type_ = SHT_REL @@ -2067,7 +2076,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = ELF32RELSIZE sh.addralign = 4 sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rel", 0)) + shsym2(sh, ldr, ldr.Lookup(".rel", 0)) } if eh.machine == EM_PPC64 { @@ -2075,7 +2084,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.type_ = SHT_PROGBITS sh.flags = SHF_ALLOC + SHF_EXECINSTR sh.addralign = 4 - shsym(sh, ctxt.Syms.Lookup(".glink", 0)) + shsym2(sh, ldr, ldr.Lookup(".glink", 0)) } sh = elfshname(".plt") @@ -2096,7 +2105,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = 4 } sh.addralign = sh.entsize - shsym(sh, ctxt.Syms.Lookup(".plt", 0)) + shsym2(sh, ldr, ldr.Lookup(".plt", 0)) // On ppc64, .got comes from the input files, so don't // create it here, and .got.plt is not used. @@ -2106,14 +2115,14 @@ func Asmbelf(ctxt *Link, symo int64) { sh.flags = SHF_ALLOC + SHF_WRITE sh.entsize = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize) - shsym(sh, ctxt.Syms.Lookup(".got", 0)) + shsym2(sh, ldr, ldr.Lookup(".got", 0)) sh = elfshname(".got.plt") sh.type_ = SHT_PROGBITS sh.flags = SHF_ALLOC + SHF_WRITE sh.entsize = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize) - shsym(sh, ctxt.Syms.Lookup(".got.plt", 0)) + shsym2(sh, ldr, ldr.Lookup(".got.plt", 0)) } sh = elfshname(".hash") @@ -2122,7 +2131,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = 4 sh.addralign = uint64(ctxt.Arch.RegSize) sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".hash", 0)) + shsym2(sh, ldr, ldr.Lookup(".hash", 0)) /* sh and PT_DYNAMIC for .dynamic section */ sh = elfshname(".dynamic") @@ -2132,7 +2141,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = 2 * uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize) sh.link = uint32(elfshname(".dynstr").shnum) - shsym(sh, ctxt.Syms.Lookup(".dynamic", 0)) + shsym2(sh, ldr, ldr.Lookup(".dynamic", 0)) ph := newElfPhdr() ph.type_ = PT_DYNAMIC ph.flags = PF_R + PF_W @@ -2176,7 +2185,7 @@ elfobj: sh := elfshname(".shstrtab") sh.type_ = SHT_STRTAB sh.addralign = 1 - shsym(sh, ctxt.Syms.Lookup(".shstrtab", 0)) + shsym2(sh, ldr, ldr.Lookup(".shstrtab", 0)) eh.shstrndx = uint16(sh.shnum) // put these sections early in the list @@ -2214,9 +2223,9 @@ elfobj: for _, sect := range Segdata.Sections { elfshreloc(ctxt.Arch, sect) } - for _, si := range dwarfp { - s := si.secSym() - elfshreloc(ctxt.Arch, s.Sect) + for _, si := range dwarfp2 { + sect := ldr.SymSect(si.secSym()) + elfshreloc(ctxt.Arch, sect) } // add a .note.GNU-stack section to mark the stack as non-executable sh := elfshname(".note.GNU-stack") @@ -2279,7 +2288,7 @@ elfobj: } if ctxt.LinkMode != LinkExternal { - eh.entry = uint64(Entryvalue(ctxt)) + eh.entry = uint64(Entryvalue2(ctxt)) } eh.version = EV_CURRENT diff --git a/src/cmd/link/internal/ld/elf2.go b/src/cmd/link/internal/ld/elf2.go index 07b64cfcb0..a1f822546c 100644 --- a/src/cmd/link/internal/ld/elf2.go +++ b/src/cmd/link/internal/ld/elf2.go @@ -5,7 +5,10 @@ package ld import ( + "cmd/internal/objabi" + "cmd/internal/sys" "cmd/link/internal/sym" + "encoding/binary" ) // Temporary dumping around for sym.Symbol version of helper @@ -24,6 +27,588 @@ func elfsetstring(s *sym.Symbol, str string, off int) { nelfstr++ } +func Asmbelf2(ctxt *Link, symo int64) { + eh := getElfEhdr() + switch ctxt.Arch.Family { + default: + Exitf("unknown architecture in asmbelf: %v", ctxt.Arch.Family) + case sys.MIPS, sys.MIPS64: + eh.machine = EM_MIPS + case sys.ARM: + eh.machine = EM_ARM + case sys.AMD64: + eh.machine = EM_X86_64 + case sys.ARM64: + eh.machine = EM_AARCH64 + case sys.I386: + eh.machine = EM_386 + case sys.PPC64: + eh.machine = EM_PPC64 + case sys.RISCV64: + eh.machine = EM_RISCV + case sys.S390X: + eh.machine = EM_S390 + } + + elfreserve := int64(ELFRESERVE) + + numtext := int64(0) + for _, sect := range Segtext.Sections { + if sect.Name == ".text" { + numtext++ + } + } + + // If there are multiple text sections, extra space is needed + // in the elfreserve for the additional .text and .rela.text + // section headers. It can handle 4 extra now. Headers are + // 64 bytes. + + if numtext > 4 { + elfreserve += elfreserve + numtext*64*2 + } + + startva := *FlagTextAddr - int64(HEADR) + resoff := elfreserve + + var pph *ElfPhdr + var pnote *ElfPhdr + if *flagRace && ctxt.IsNetbsd() { + sh := elfshname(".note.netbsd.pax") + resoff -= int64(elfnetbsdpax(sh, uint64(startva), uint64(resoff))) + pnote = newElfPhdr() + pnote.type_ = PT_NOTE + pnote.flags = PF_R + phsh(pnote, sh) + } + if ctxt.LinkMode == LinkExternal { + /* skip program headers */ + eh.phoff = 0 + + eh.phentsize = 0 + + if ctxt.BuildMode == BuildModeShared { + sh := elfshname(".note.go.pkg-list") + sh.type_ = SHT_NOTE + sh = elfshname(".note.go.abihash") + sh.type_ = SHT_NOTE + sh.flags = SHF_ALLOC + sh = elfshname(".note.go.deps") + sh.type_ = SHT_NOTE + } + + if *flagBuildid != "" { + sh := elfshname(".note.go.buildid") + sh.type_ = SHT_NOTE + sh.flags = SHF_ALLOC + } + + goto elfobj + } + + /* program header info */ + pph = newElfPhdr() + + pph.type_ = PT_PHDR + pph.flags = PF_R + pph.off = uint64(eh.ehsize) + pph.vaddr = uint64(*FlagTextAddr) - uint64(HEADR) + pph.off + pph.paddr = uint64(*FlagTextAddr) - uint64(HEADR) + pph.off + pph.align = uint64(*FlagRound) + + /* + * PHDR must be in a loaded segment. Adjust the text + * segment boundaries downwards to include it. + */ + { + o := int64(Segtext.Vaddr - pph.vaddr) + Segtext.Vaddr -= uint64(o) + Segtext.Length += uint64(o) + o = int64(Segtext.Fileoff - pph.off) + Segtext.Fileoff -= uint64(o) + Segtext.Filelen += uint64(o) + } + + if !*FlagD { /* -d suppresses dynamic loader format */ + /* interpreter */ + sh := elfshname(".interp") + + sh.type_ = SHT_PROGBITS + sh.flags = SHF_ALLOC + sh.addralign = 1 + + if interpreter == "" && objabi.GO_LDSO != "" { + interpreter = objabi.GO_LDSO + } + + if interpreter == "" { + switch ctxt.HeadType { + case objabi.Hlinux: + if objabi.GOOS == "android" { + interpreter = thearch.Androiddynld + if interpreter == "" { + Exitf("ELF interpreter not set") + } + } else { + interpreter = thearch.Linuxdynld + } + + case objabi.Hfreebsd: + interpreter = thearch.Freebsddynld + + case objabi.Hnetbsd: + interpreter = thearch.Netbsddynld + + case objabi.Hopenbsd: + interpreter = thearch.Openbsddynld + + case objabi.Hdragonfly: + interpreter = thearch.Dragonflydynld + + case objabi.Hsolaris: + interpreter = thearch.Solarisdynld + } + } + + resoff -= int64(elfinterp(sh, uint64(startva), uint64(resoff), interpreter)) + + ph := newElfPhdr() + ph.type_ = PT_INTERP + ph.flags = PF_R + phsh(ph, sh) + } + + pnote = nil + if ctxt.HeadType == objabi.Hnetbsd || ctxt.HeadType == objabi.Hopenbsd { + var sh *ElfShdr + switch ctxt.HeadType { + case objabi.Hnetbsd: + sh = elfshname(".note.netbsd.ident") + resoff -= int64(elfnetbsdsig(sh, uint64(startva), uint64(resoff))) + + case objabi.Hopenbsd: + sh = elfshname(".note.openbsd.ident") + resoff -= int64(elfopenbsdsig(sh, uint64(startva), uint64(resoff))) + } + + pnote = newElfPhdr() + pnote.type_ = PT_NOTE + pnote.flags = PF_R + phsh(pnote, sh) + } + + if len(buildinfo) > 0 { + sh := elfshname(".note.gnu.build-id") + resoff -= int64(elfbuildinfo(sh, uint64(startva), uint64(resoff))) + + if pnote == nil { + pnote = newElfPhdr() + pnote.type_ = PT_NOTE + pnote.flags = PF_R + } + + phsh(pnote, sh) + } + + if *flagBuildid != "" { + sh := elfshname(".note.go.buildid") + resoff -= int64(elfgobuildid(sh, uint64(startva), uint64(resoff))) + + pnote := newElfPhdr() + pnote.type_ = PT_NOTE + pnote.flags = PF_R + phsh(pnote, sh) + } + + // Additions to the reserved area must be above this line. + + elfphload(&Segtext) + if len(Segrodata.Sections) > 0 { + elfphload(&Segrodata) + } + if len(Segrelrodata.Sections) > 0 { + elfphload(&Segrelrodata) + elfphrelro(&Segrelrodata) + } + elfphload(&Segdata) + + /* Dynamic linking sections */ + if !*FlagD { + sh := elfshname(".dynsym") + sh.type_ = SHT_DYNSYM + sh.flags = SHF_ALLOC + if elf64 { + sh.entsize = ELF64SYMSIZE + } else { + sh.entsize = ELF32SYMSIZE + } + sh.addralign = uint64(ctxt.Arch.RegSize) + sh.link = uint32(elfshname(".dynstr").shnum) + + // sh.info is the index of first non-local symbol (number of local symbols) + s := ctxt.Syms.Lookup(".dynsym", 0) + i := uint32(0) + for sub := s; sub != nil; sub = symSub(ctxt, sub) { + i++ + if !sub.Attr.Local() { + break + } + } + sh.info = i + shsym(sh, s) + + sh = elfshname(".dynstr") + sh.type_ = SHT_STRTAB + sh.flags = SHF_ALLOC + sh.addralign = 1 + shsym(sh, ctxt.Syms.Lookup(".dynstr", 0)) + + if elfverneed != 0 { + sh := elfshname(".gnu.version") + sh.type_ = SHT_GNU_VERSYM + sh.flags = SHF_ALLOC + sh.addralign = 2 + sh.link = uint32(elfshname(".dynsym").shnum) + sh.entsize = 2 + shsym(sh, ctxt.Syms.Lookup(".gnu.version", 0)) + + sh = elfshname(".gnu.version_r") + sh.type_ = SHT_GNU_VERNEED + sh.flags = SHF_ALLOC + sh.addralign = uint64(ctxt.Arch.RegSize) + sh.info = uint32(elfverneed) + sh.link = uint32(elfshname(".dynstr").shnum) + shsym(sh, ctxt.Syms.Lookup(".gnu.version_r", 0)) + } + + if elfRelType == ".rela" { + sh := elfshname(".rela.plt") + sh.type_ = SHT_RELA + sh.flags = SHF_ALLOC + sh.entsize = ELF64RELASIZE + sh.addralign = uint64(ctxt.Arch.RegSize) + sh.link = uint32(elfshname(".dynsym").shnum) + sh.info = uint32(elfshname(".plt").shnum) + shsym(sh, ctxt.Syms.Lookup(".rela.plt", 0)) + + sh = elfshname(".rela") + sh.type_ = SHT_RELA + sh.flags = SHF_ALLOC + sh.entsize = ELF64RELASIZE + sh.addralign = 8 + sh.link = uint32(elfshname(".dynsym").shnum) + shsym(sh, ctxt.Syms.Lookup(".rela", 0)) + } else { + sh := elfshname(".rel.plt") + sh.type_ = SHT_REL + sh.flags = SHF_ALLOC + sh.entsize = ELF32RELSIZE + sh.addralign = 4 + sh.link = uint32(elfshname(".dynsym").shnum) + shsym(sh, ctxt.Syms.Lookup(".rel.plt", 0)) + + sh = elfshname(".rel") + sh.type_ = SHT_REL + sh.flags = SHF_ALLOC + sh.entsize = ELF32RELSIZE + sh.addralign = 4 + sh.link = uint32(elfshname(".dynsym").shnum) + shsym(sh, ctxt.Syms.Lookup(".rel", 0)) + } + + if eh.machine == EM_PPC64 { + sh := elfshname(".glink") + sh.type_ = SHT_PROGBITS + sh.flags = SHF_ALLOC + SHF_EXECINSTR + sh.addralign = 4 + shsym(sh, ctxt.Syms.Lookup(".glink", 0)) + } + + sh = elfshname(".plt") + sh.type_ = SHT_PROGBITS + sh.flags = SHF_ALLOC + SHF_EXECINSTR + if eh.machine == EM_X86_64 { + sh.entsize = 16 + } else if eh.machine == EM_S390 { + sh.entsize = 32 + } else if eh.machine == EM_PPC64 { + // On ppc64, this is just a table of addresses + // filled by the dynamic linker + sh.type_ = SHT_NOBITS + + sh.flags = SHF_ALLOC + SHF_WRITE + sh.entsize = 8 + } else { + sh.entsize = 4 + } + sh.addralign = sh.entsize + shsym(sh, ctxt.Syms.Lookup(".plt", 0)) + + // On ppc64, .got comes from the input files, so don't + // create it here, and .got.plt is not used. + if eh.machine != EM_PPC64 { + sh := elfshname(".got") + sh.type_ = SHT_PROGBITS + sh.flags = SHF_ALLOC + SHF_WRITE + sh.entsize = uint64(ctxt.Arch.RegSize) + sh.addralign = uint64(ctxt.Arch.RegSize) + shsym(sh, ctxt.Syms.Lookup(".got", 0)) + + sh = elfshname(".got.plt") + sh.type_ = SHT_PROGBITS + sh.flags = SHF_ALLOC + SHF_WRITE + sh.entsize = uint64(ctxt.Arch.RegSize) + sh.addralign = uint64(ctxt.Arch.RegSize) + shsym(sh, ctxt.Syms.Lookup(".got.plt", 0)) + } + + sh = elfshname(".hash") + sh.type_ = SHT_HASH + sh.flags = SHF_ALLOC + sh.entsize = 4 + sh.addralign = uint64(ctxt.Arch.RegSize) + sh.link = uint32(elfshname(".dynsym").shnum) + shsym(sh, ctxt.Syms.Lookup(".hash", 0)) + + /* sh and PT_DYNAMIC for .dynamic section */ + sh = elfshname(".dynamic") + + sh.type_ = SHT_DYNAMIC + sh.flags = SHF_ALLOC + SHF_WRITE + sh.entsize = 2 * uint64(ctxt.Arch.RegSize) + sh.addralign = uint64(ctxt.Arch.RegSize) + sh.link = uint32(elfshname(".dynstr").shnum) + shsym(sh, ctxt.Syms.Lookup(".dynamic", 0)) + ph := newElfPhdr() + ph.type_ = PT_DYNAMIC + ph.flags = PF_R + PF_W + phsh(ph, sh) + + /* + * Thread-local storage segment (really just size). + */ + tlssize := uint64(0) + for _, sect := range Segdata.Sections { + if sect.Name == ".tbss" { + tlssize = sect.Length + } + } + if tlssize != 0 { + ph := newElfPhdr() + ph.type_ = PT_TLS + ph.flags = PF_R + ph.memsz = tlssize + ph.align = uint64(ctxt.Arch.RegSize) + } + } + + if ctxt.HeadType == objabi.Hlinux { + ph := newElfPhdr() + ph.type_ = PT_GNU_STACK + ph.flags = PF_W + PF_R + ph.align = uint64(ctxt.Arch.RegSize) + + ph = newElfPhdr() + ph.type_ = 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_ = PT_SUNWSTACK + ph.flags = PF_W + PF_R + } + +elfobj: + sh := elfshname(".shstrtab") + sh.type_ = SHT_STRTAB + sh.addralign = 1 + shsym(sh, ctxt.Syms.Lookup(".shstrtab", 0)) + eh.shstrndx = uint16(sh.shnum) + + // put these sections early in the list + if !*FlagS { + elfshname(".symtab") + elfshname(".strtab") + } + + for _, sect := range Segtext.Sections { + elfshbits(ctxt.LinkMode, sect) + } + for _, sect := range Segrodata.Sections { + elfshbits(ctxt.LinkMode, sect) + } + for _, sect := range Segrelrodata.Sections { + elfshbits(ctxt.LinkMode, sect) + } + for _, sect := range Segdata.Sections { + elfshbits(ctxt.LinkMode, sect) + } + for _, sect := range Segdwarf.Sections { + elfshbits(ctxt.LinkMode, sect) + } + + if ctxt.LinkMode == LinkExternal { + for _, sect := range Segtext.Sections { + elfshreloc(ctxt.Arch, sect) + } + for _, sect := range Segrodata.Sections { + elfshreloc(ctxt.Arch, sect) + } + for _, sect := range Segrelrodata.Sections { + elfshreloc(ctxt.Arch, sect) + } + for _, sect := range Segdata.Sections { + elfshreloc(ctxt.Arch, sect) + } + for _, si := range dwarfp { + s := si.secSym() + elfshreloc(ctxt.Arch, s.Sect) + } + // add a .note.GNU-stack section to mark the stack as non-executable + sh := elfshname(".note.GNU-stack") + + sh.type_ = SHT_PROGBITS + sh.addralign = 1 + sh.flags = 0 + } + + if !*FlagS { + sh := elfshname(".symtab") + sh.type_ = SHT_SYMTAB + sh.off = uint64(symo) + sh.size = uint64(Symsize) + sh.addralign = uint64(ctxt.Arch.RegSize) + sh.entsize = 8 + 2*uint64(ctxt.Arch.RegSize) + sh.link = uint32(elfshname(".strtab").shnum) + sh.info = uint32(elfglobalsymndx) + + sh = elfshname(".strtab") + sh.type_ = SHT_STRTAB + sh.off = uint64(symo) + uint64(Symsize) + sh.size = uint64(len(Elfstrdat)) + sh.addralign = 1 + } + + /* Main header */ + eh.ident[EI_MAG0] = '\177' + + eh.ident[EI_MAG1] = 'E' + eh.ident[EI_MAG2] = 'L' + eh.ident[EI_MAG3] = 'F' + if ctxt.HeadType == objabi.Hfreebsd { + eh.ident[EI_OSABI] = ELFOSABI_FREEBSD + } else if ctxt.HeadType == objabi.Hnetbsd { + eh.ident[EI_OSABI] = ELFOSABI_NETBSD + } else if ctxt.HeadType == objabi.Hopenbsd { + eh.ident[EI_OSABI] = ELFOSABI_OPENBSD + } else if ctxt.HeadType == objabi.Hdragonfly { + eh.ident[EI_OSABI] = ELFOSABI_NONE + } + if elf64 { + eh.ident[EI_CLASS] = ELFCLASS64 + } else { + eh.ident[EI_CLASS] = ELFCLASS32 + } + if ctxt.Arch.ByteOrder == binary.BigEndian { + eh.ident[EI_DATA] = ELFDATA2MSB + } else { + eh.ident[EI_DATA] = ELFDATA2LSB + } + eh.ident[EI_VERSION] = EV_CURRENT + + if ctxt.LinkMode == LinkExternal { + eh.type_ = ET_REL + } else if ctxt.BuildMode == BuildModePIE { + eh.type_ = ET_DYN + } else { + eh.type_ = ET_EXEC + } + + if ctxt.LinkMode != LinkExternal { + eh.entry = uint64(Entryvalue(ctxt)) + } + + eh.version = EV_CURRENT + + if pph != nil { + pph.filesz = uint64(eh.phnum) * uint64(eh.phentsize) + pph.memsz = pph.filesz + } + + ctxt.Out.SeekSet(0) + a := int64(0) + a += int64(elfwritehdr(ctxt.Out)) + a += int64(elfwritephdrs(ctxt.Out)) + a += int64(elfwriteshdrs(ctxt.Out)) + if !*FlagD { + a += int64(elfwriteinterp(ctxt.Out)) + } + if ctxt.LinkMode != LinkExternal { + if ctxt.HeadType == objabi.Hnetbsd { + a += int64(elfwritenetbsdsig(ctxt.Out)) + } + if ctxt.HeadType == objabi.Hopenbsd { + a += int64(elfwriteopenbsdsig(ctxt.Out)) + } + if len(buildinfo) > 0 { + a += int64(elfwritebuildinfo(ctxt.Out)) + } + if *flagBuildid != "" { + a += int64(elfwritegobuildid(ctxt.Out)) + } + } + if *flagRace && ctxt.IsNetbsd() { + a += int64(elfwritenetbsdpax(ctxt.Out)) + } + + if a > elfreserve { + Errorf(nil, "ELFRESERVE too small: %d > %d with %d text sections", a, elfreserve, numtext) + } +} + +// Do not write DT_NULL. elfdynhash will finish it. +func shsym(sh *ElfShdr, s *sym.Symbol) { + addr := Symaddr(s) + if sh.flags&SHF_ALLOC != 0 { + sh.addr = uint64(addr) + } + sh.off = uint64(datoff2(s, addr)) + sh.size = uint64(s.Size) +} + +func Elfemitreloc2(ctxt *Link) { + for ctxt.Out.Offset()&7 != 0 { + ctxt.Out.Write8(0) + } + + for _, sect := range Segtext.Sections { + if sect.Name == ".text" { + elfrelocsect2(ctxt, sect, ctxt.Textp) + } else { + elfrelocsect2(ctxt, sect, ctxt.datap) + } + } + + for _, sect := range Segrodata.Sections { + elfrelocsect2(ctxt, sect, ctxt.datap) + } + for _, sect := range Segrelrodata.Sections { + elfrelocsect2(ctxt, sect, ctxt.datap) + } + for _, sect := range Segdata.Sections { + elfrelocsect2(ctxt, sect, ctxt.datap) + } + for i := 0; i < len(Segdwarf.Sections); i++ { + sect := Segdwarf.Sections[i] + si := dwarfp[i] + if si.secSym() != sect.Sym || + si.secSym().Sect != sect { + panic("inconsistency between dwarfp and Segdwarf") + } + elfrelocsect2(ctxt, sect, si.syms) + } +} + func elfrelocsect2(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { // If main section is SHT_NOBITS, nothing to relocate. // Also nothing to relocate in .shstrtab. diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 229ed12f26..752dbeebf1 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2662,46 +2662,32 @@ func (ctxt *Link) xdefine2(p string, t sym.SymKind, v int64) { s.SetLocal(true) } -func datoff(s *sym.Symbol, addr int64) int64 { +func datoff(ldr *loader.Loader, s loader.Sym, addr int64) int64 { if uint64(addr) >= Segdata.Vaddr { return int64(uint64(addr) - Segdata.Vaddr + Segdata.Fileoff) } if uint64(addr) >= Segtext.Vaddr { return int64(uint64(addr) - Segtext.Vaddr + Segtext.Fileoff) } - Errorf(s, "invalid datoff %#x", addr) + ldr.Errorf(s, "invalid datoff %#x", addr) return 0 } -func Entryvalue(ctxt *Link) int64 { - a := *flagEntrySymbol - if a[0] >= '0' && a[0] <= '9' { - return atolwhex(a) - } - s := ctxt.Syms.Lookup(a, 0) - if s.Type == 0 { - return *FlagTextAddr - } - if ctxt.HeadType != objabi.Haix && s.Type != sym.STEXT { - Errorf(s, "entry not text") - } - return s.Value -} - func Entryvalue2(ctxt *Link) int64 { a := *flagEntrySymbol if a[0] >= '0' && a[0] <= '9' { return atolwhex(a) } - s := ctxt.loader.Lookup(a, 0) - typ := ctxt.loader.SymType(s) - if typ == 0 { + ldr := ctxt.loader + s := ldr.Lookup(a, 0) + st := ldr.SymType(s) + if st == 0 { return *FlagTextAddr } - if ctxt.HeadType != objabi.Haix && typ != sym.STEXT { - ctxt.Errorf(s, "entry not text") + if !ctxt.IsAIX() && st != sym.STEXT { + ldr.Errorf(s, "entry not text") } - return ctxt.loader.SymValue(s) + return ldr.SymValue(s) } func (ctxt *Link) callgraph() { @@ -2799,6 +2785,7 @@ func addToTextp(ctxt *Link) { } func (ctxt *Link) loadlibfull(symGroupType []sym.SymKind, needReloc, needExtReloc bool) { + // Load full symbol contents, resolve indexed references. ctxt.loader.LoadFull(ctxt.Arch, ctxt.Syms, needReloc, needExtReloc) @@ -2891,14 +2878,14 @@ func symPkg(ctxt *Link, s *sym.Symbol) string { return ctxt.loader.SymPkg(loader.Sym(s.SymIdx)) } -func ElfSymForReloc(ctxt *Link, s *sym.Symbol) int32 { +func ElfSymForReloc2(ctxt *Link, s loader.Sym) int32 { // If putelfsym created a local version of this symbol, use that in all // relocations. - les := ctxt.loader.SymLocalElfSym(loader.Sym(s.SymIdx)) + les := ctxt.loader.SymLocalElfSym(s) if les != 0 { return les } else { - return ctxt.loader.SymElfSym(loader.Sym(s.SymIdx)) + return ctxt.loader.SymElfSym(s) } } diff --git a/src/cmd/link/internal/ld/lib2.go b/src/cmd/link/internal/ld/lib2.go new file mode 100644 index 0000000000..296d6d2785 --- /dev/null +++ b/src/cmd/link/internal/ld/lib2.go @@ -0,0 +1,51 @@ +// 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 ld + +import ( + "cmd/internal/objabi" + "cmd/link/internal/loader" + "cmd/link/internal/sym" +) + +// Temporary dumping around for sym.Symbol version of helper +// functions in lib.go, still being used for some archs/oses. + +func Entryvalue(ctxt *Link) int64 { + a := *flagEntrySymbol + if a[0] >= '0' && a[0] <= '9' { + return atolwhex(a) + } + s := ctxt.Syms.Lookup(a, 0) + if s.Type == 0 { + return *FlagTextAddr + } + if ctxt.HeadType != objabi.Haix && s.Type != sym.STEXT { + Errorf(s, "entry not text") + } + return s.Value +} + +func datoff2(s *sym.Symbol, addr int64) int64 { + if uint64(addr) >= Segdata.Vaddr { + return int64(uint64(addr) - Segdata.Vaddr + Segdata.Fileoff) + } + if uint64(addr) >= Segtext.Vaddr { + return int64(uint64(addr) - Segtext.Vaddr + Segtext.Fileoff) + } + Errorf(s, "invalid datoff %#x", addr) + return 0 +} + +func ElfSymForReloc(ctxt *Link, s *sym.Symbol) int32 { + // If putelfsym created a local version of this symbol, use that in all + // relocations. + les := ctxt.loader.SymLocalElfSym(loader.Sym(s.SymIdx)) + if les != 0 { + return les + } else { + return ctxt.loader.SymElfSym(loader.Sym(s.SymIdx)) + } +} diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index bcb1e888a0..6c16785b43 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -320,7 +320,7 @@ func Main(arch *sys.Arch, theArch Arch) { thearch.Asmb(ctxt, ctxt.loader) bench.Start("reloc") ctxt.reloc() - newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() || ctxt.IsPlan9() + newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() || ctxt.IsPlan9() || (ctxt.IsElf() && ctxt.IsAMD64()) if !newasmb2 { bench.Start("loadlibfull") // We don't need relocations at this point. diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 9748de96d1..18036038fa 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -32,7 +32,6 @@ package ld import ( "cmd/internal/objabi" - "cmd/internal/sys" "cmd/link/internal/loader" "cmd/link/internal/sym" "fmt" @@ -74,58 +73,38 @@ func putelfsyment(out *OutBuf, off int, addr int64, size int64, info int, shndx } } -func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) { - var typ int - - switch t { - default: - return - - case TextSym: - typ = STT_FUNC - - case DataSym, BSSSym: - typ = STT_OBJECT - - case UndefinedSym: - // ElfType is only set for symbols read from Go shared libraries, but - // for other symbols it is left as STT_NOTYPE which is fine. - typ = int(x.ElfType()) - - case TLSSym: - typ = STT_TLS - } - - size := x.Size - if t == UndefinedSym { - size = 0 - } +func putelfsym(ctxt *Link, x loader.Sym, typ int, curbind int) { + ldr := ctxt.loader + addr := ldr.SymValue(x) + size := ldr.SymSize(x) xo := x - if xo.Outer != nil { - xo = xo.Outer + if ldr.OuterSym(x) != 0 { + xo = ldr.OuterSym(x) } + xot := ldr.SymType(xo) + xosect := ldr.SymSect(xo) var elfshnum int - if xo.Type == sym.SDYNIMPORT || xo.Type == sym.SHOSTOBJ || xo.Type == sym.SUNDEFEXT { + if xot == sym.SDYNIMPORT || xot == sym.SHOSTOBJ || xot == sym.SUNDEFEXT { elfshnum = SHN_UNDEF + size = 0 } else { - if xo.Sect == nil { - Errorf(x, "missing section in putelfsym") + if xosect == nil { + ldr.Errorf(x, "missing section in putelfsym") return } - if xo.Sect.Elfsect == nil { - Errorf(x, "missing ELF section in putelfsym") + if xosect.Elfsect == nil { + ldr.Errorf(x, "missing ELF section in putelfsym") return } - elfshnum = xo.Sect.Elfsect.(*ElfShdr).shnum + elfshnum = xosect.Elfsect.(*ElfShdr).shnum } // One pass for each binding: STB_LOCAL, STB_GLOBAL, // maybe one day STB_WEAK. bind := STB_GLOBAL - - if x.IsFileLocal() || x.Attr.VisibilityHidden() || x.Attr.Local() { + if ldr.IsFileLocal(x) || ldr.AttrVisibilityHidden(x) || ldr.AttrLocal(x) { bind = STB_LOCAL } @@ -134,15 +113,15 @@ func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) { // To avoid filling the dynamic table with lots of unnecessary symbols, // mark all Go symbols local (not global) in the final executable. // But when we're dynamically linking, we need all those global symbols. - if !ctxt.DynlinkingGo() && ctxt.LinkMode == LinkExternal && !x.Attr.CgoExportStatic() && elfshnum != SHN_UNDEF { + if !ctxt.DynlinkingGo() && ctxt.IsExternal() && !ldr.AttrCgoExportStatic(x) && elfshnum != SHN_UNDEF { bind = STB_LOCAL } if ctxt.LinkMode == LinkExternal && elfshnum != SHN_UNDEF { - addr -= int64(xo.Sect.Vaddr) + addr -= int64(xosect.Vaddr) } other := STV_DEFAULT - if x.Attr.VisibilityHidden() { + if ldr.AttrVisibilityHidden(x) { // TODO(mwhudson): We only set AttrVisibilityHidden in ldelf, i.e. when // internally linking. But STV_HIDDEN visibility only matters in object // files and shared libraries, and as we are a long way from implementing @@ -150,7 +129,7 @@ func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) { // externally linking, I don't think this makes a lot of sense. other = STV_HIDDEN } - if ctxt.Arch.Family == sys.PPC64 && typ == STT_FUNC && x.Attr.Shared() && x.Name != "runtime.duffzero" && x.Name != "runtime.duffcopy" { + if ctxt.IsPPC64() && typ == 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. @@ -160,22 +139,17 @@ func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) { other |= 3 << 5 } - if s == x.Name { - // We should use Extname for ELF symbol table. - // TODO: maybe genasmsym should have done this. That function is too - // overloaded and I would rather not change it for now. - s = x.Extname() - } + sname := ldr.SymExtname(x) // When dynamically linking, we create Symbols by reading the names from // the symbol tables of the shared libraries and so the names need to // match exactly. Tools like DTrace will have to wait for now. if !ctxt.DynlinkingGo() { // Rewrite · to . for ASCII-only tools like DTrace (sigh) - s = strings.Replace(s, "·", ".", -1) + sname = strings.Replace(sname, "·", ".", -1) } - if ctxt.DynlinkingGo() && bind == STB_GLOBAL && ctxt.elfbind == STB_LOCAL && x.Type == sym.STEXT { + if ctxt.DynlinkingGo() && bind == STB_GLOBAL && curbind == STB_LOCAL && ldr.SymType(x) == sym.STEXT { // When dynamically linking, we want references to functions defined // in this module to always be to the function object, not to the // PLT. We force this by writing an additional local symbol for every @@ -184,26 +158,82 @@ func putelfsym(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) { // (*sym.Symbol).ElfsymForReloc). This is approximately equivalent to the // ELF linker -Bsymbolic-functions option, but that is buggy on // several platforms. - putelfsyment(ctxt.Out, putelfstr("local."+s), addr, size, STB_LOCAL<<4|typ&0xf, elfshnum, other) - ctxt.loader.SetSymLocalElfSym(loader.Sym(x.SymIdx), int32(ctxt.numelfsym)) + putelfsyment(ctxt.Out, putelfstr("local."+sname), addr, size, STB_LOCAL<<4|typ&0xf, elfshnum, other) + ldr.SetSymLocalElfSym(x, int32(ctxt.numelfsym)) ctxt.numelfsym++ return - } else if bind != ctxt.elfbind { + } else if bind != curbind { return } - putelfsyment(ctxt.Out, putelfstr(s), addr, size, bind<<4|typ&0xf, elfshnum, other) - ctxt.loader.SetSymElfSym(loader.Sym(x.SymIdx), int32(ctxt.numelfsym)) + putelfsyment(ctxt.Out, putelfstr(sname), addr, size, bind<<4|typ&0xf, elfshnum, other) + ldr.SetSymElfSym(x, int32(ctxt.numelfsym)) ctxt.numelfsym++ } -func putelfsectionsym(ctxt *Link, out *OutBuf, s *sym.Symbol, shndx int) { +func putelfsectionsym(ctxt *Link, out *OutBuf, s loader.Sym, shndx int) { putelfsyment(out, 0, 0, 0, STB_LOCAL<<4|STT_SECTION, shndx, 0) - ctxt.loader.SetSymElfSym(loader.Sym(s.SymIdx), int32(ctxt.numelfsym)) + ctxt.loader.SetSymElfSym(s, int32(ctxt.numelfsym)) ctxt.numelfsym++ } +func genelfsym(ctxt *Link, elfbind int) { + ldr := ctxt.loader + + // Text symbols. + s := ldr.Lookup("runtime.text", 0) + putelfsym(ctxt, s, STT_FUNC, elfbind) + for _, s := range ctxt.Textp2 { + putelfsym(ctxt, s, STT_FUNC, elfbind) + } + s = ldr.Lookup("runtime.etext", 0) + if ldr.SymType(s) == sym.STEXT { + putelfsym(ctxt, s, STT_FUNC, elfbind) + } + + shouldBeInSymbolTable := func(s loader.Sym) bool { + if ldr.AttrNotInSymbolTable(s) { + return false + } + // FIXME: avoid having to do name inspections here. + sn := ldr.SymName(s) + if (sn == "" || sn[0] == '.') && !ldr.IsFileLocal(s) { + return false + } + return true + } + + // Data symbols. + for s := loader.Sym(1); s < loader.Sym(ldr.NSym()); s++ { + if !ldr.AttrReachable(s) { + continue + } + st := ldr.SymType(s) + if st >= sym.SELFRXSECT && st < sym.SXREF { + typ := STT_OBJECT + if st == sym.STLSBSS { + if ctxt.IsInternal() { + continue + } + typ = STT_TLS + } + if !shouldBeInSymbolTable(s) { + continue + } + putelfsym(ctxt, s, typ, elfbind) + continue + } + if st == sym.SHOSTOBJ || st == sym.SDYNIMPORT || st == sym.SUNDEFEXT { + putelfsym(ctxt, s, int(ldr.SymElfType(s)), elfbind) + } + } +} + func Asmelfsym(ctxt *Link) { + if !ctxt.IsAMD64() { + Asmelfsym2(ctxt) + return + } // the first symbol entry is reserved putelfsyment(ctxt.Out, 0, 0, 0, STB_LOCAL<<4|STT_NOTYPE, 0, 0) @@ -216,12 +246,13 @@ func Asmelfsym(ctxt *Link) { putelfsyment(ctxt.Out, putelfstr("go.go"), 0, 0, STB_LOCAL<<4|STT_FILE, SHN_ABS, 0) ctxt.numelfsym++ - ctxt.elfbind = STB_LOCAL - genasmsym(ctxt, putelfsym) - - ctxt.elfbind = STB_GLOBAL - elfglobalsymndx = ctxt.numelfsym - genasmsym(ctxt, putelfsym) + bindings := []int{STB_LOCAL, STB_GLOBAL} + for _, elfbind := range bindings { + if elfbind == STB_GLOBAL { + elfglobalsymndx = ctxt.numelfsym + } + genelfsym(ctxt, elfbind) + } } func putplan9sym(ctxt *Link, ldr *loader.Loader, s loader.Sym, char SymbolType) { diff --git a/src/cmd/link/internal/ld/symtab2.go b/src/cmd/link/internal/ld/symtab2.go new file mode 100644 index 0000000000..8108d723fc --- /dev/null +++ b/src/cmd/link/internal/ld/symtab2.go @@ -0,0 +1,166 @@ +// 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 ld + +import ( + "cmd/internal/sys" + "cmd/link/internal/loader" + "cmd/link/internal/sym" + "strings" +) + +// Temporary dumping around for sym.Symbol version of helper +// functions in symtab.go, still being used for some archs/oses. + +func Asmelfsym2(ctxt *Link) { + + // the first symbol entry is reserved + putelfsyment(ctxt.Out, 0, 0, 0, STB_LOCAL<<4|STT_NOTYPE, 0, 0) + + dwarfaddelfsectionsyms2(ctxt) + + // Some linkers will add a FILE sym if one is not present. + // Avoid having the working directory inserted into the symbol table. + // It is added with a name to avoid problems with external linking + // encountered on some versions of Solaris. See issue #14957. + putelfsyment(ctxt.Out, putelfstr("go.go"), 0, 0, STB_LOCAL<<4|STT_FILE, SHN_ABS, 0) + ctxt.numelfsym++ + + ctxt.elfbind = STB_LOCAL + genasmsym(ctxt, putelfsym2) + + ctxt.elfbind = STB_GLOBAL + elfglobalsymndx = ctxt.numelfsym + genasmsym(ctxt, putelfsym2) +} + +func putelfsectionsym2(ctxt *Link, out *OutBuf, s *sym.Symbol, shndx int) { + putelfsyment(out, 0, 0, 0, STB_LOCAL<<4|STT_SECTION, shndx, 0) + ctxt.loader.SetSymElfSym(loader.Sym(s.SymIdx), int32(ctxt.numelfsym)) + ctxt.numelfsym++ +} + +func putelfsym2(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) { + var typ int + + switch t { + default: + return + + case TextSym: + typ = STT_FUNC + + case DataSym, BSSSym: + typ = STT_OBJECT + + case UndefinedSym: + // ElfType is only set for symbols read from Go shared libraries, but + // for other symbols it is left as STT_NOTYPE which is fine. + typ = int(x.ElfType()) + + case TLSSym: + typ = STT_TLS + } + + size := x.Size + if t == UndefinedSym { + size = 0 + } + + xo := x + if xo.Outer != nil { + xo = xo.Outer + } + + var elfshnum int + if xo.Type == sym.SDYNIMPORT || xo.Type == sym.SHOSTOBJ || xo.Type == sym.SUNDEFEXT { + elfshnum = SHN_UNDEF + } else { + if xo.Sect == nil { + Errorf(x, "missing section in putelfsym") + return + } + if xo.Sect.Elfsect == nil { + Errorf(x, "missing ELF section in putelfsym") + return + } + elfshnum = xo.Sect.Elfsect.(*ElfShdr).shnum + } + + // One pass for each binding: STB_LOCAL, STB_GLOBAL, + // maybe one day STB_WEAK. + bind := STB_GLOBAL + + if x.IsFileLocal() || x.Attr.VisibilityHidden() || x.Attr.Local() { + bind = STB_LOCAL + } + + // In external linking mode, we have to invoke gcc with -rdynamic + // to get the exported symbols put into the dynamic symbol table. + // To avoid filling the dynamic table with lots of unnecessary symbols, + // mark all Go symbols local (not global) in the final executable. + // But when we're dynamically linking, we need all those global symbols. + if !ctxt.DynlinkingGo() && ctxt.LinkMode == LinkExternal && !x.Attr.CgoExportStatic() && elfshnum != SHN_UNDEF { + bind = STB_LOCAL + } + + if ctxt.LinkMode == LinkExternal && elfshnum != SHN_UNDEF { + addr -= int64(xo.Sect.Vaddr) + } + other := STV_DEFAULT + if x.Attr.VisibilityHidden() { + // TODO(mwhudson): We only set AttrVisibilityHidden in ldelf, i.e. when + // internally linking. But STV_HIDDEN visibility only matters in object + // files and shared libraries, and as we are a long way from implementing + // internal linking for shared libraries and only create object files when + // externally linking, I don't think this makes a lot of sense. + other = STV_HIDDEN + } + if ctxt.Arch.Family == sys.PPC64 && typ == STT_FUNC && x.Attr.Shared() && x.Name != "runtime.duffzero" && x.Name != "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 s == x.Name { + // We should use Extname for ELF symbol table. + // TODO: maybe genasmsym should have done this. That function is too + // overloaded and I would rather not change it for now. + s = x.Extname() + } + + // When dynamically linking, we create Symbols by reading the names from + // the symbol tables of the shared libraries and so the names need to + // match exactly. Tools like DTrace will have to wait for now. + if !ctxt.DynlinkingGo() { + // Rewrite · to . for ASCII-only tools like DTrace (sigh) + s = strings.Replace(s, "·", ".", -1) + } + + if ctxt.DynlinkingGo() && bind == STB_GLOBAL && ctxt.elfbind == STB_LOCAL && x.Type == sym.STEXT { + // When dynamically linking, we want references to functions defined + // in this module to always be to the function object, not to the + // PLT. We force this by writing an additional local symbol for every + // global function symbol and making all relocations against the + // global symbol refer to this local symbol instead (see + // (*sym.Symbol).ElfsymForReloc). This is approximately equivalent to the + // ELF linker -Bsymbolic-functions option, but that is buggy on + // several platforms. + putelfsyment(ctxt.Out, putelfstr("local."+s), addr, size, STB_LOCAL<<4|typ&0xf, elfshnum, other) + ctxt.loader.SetSymLocalElfSym(loader.Sym(x.SymIdx), int32(ctxt.numelfsym)) + ctxt.numelfsym++ + return + } else if bind != ctxt.elfbind { + return + } + + putelfsyment(ctxt.Out, putelfstr(s), addr, size, bind<<4|typ&0xf, elfshnum, other) + ctxt.loader.SetSymElfSym(loader.Sym(x.SymIdx), int32(ctxt.numelfsym)) + ctxt.numelfsym++ +} -- GitLab From 4098ab3ff4de53df4bf2e9b2db0f49e4d12b3d9c Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 11 May 2020 15:11:36 -0400 Subject: [PATCH 0021/1792] [dev.link] cmd/link: reduce allocations in Preload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don't create loader.Syms until LoadFull (it will be gone soon anyway.) Preallocate loader.objSym array. Don't create loader.values until preloading is done. Linking cmd/compile: name old alloc/op new alloc/op delta Loadlib_GC 36.2MB ± 0% 20.0MB ± 0% -44.91% (p=0.016 n=5+4) Change-Id: I82eddcfa7fb8fc4e84e8174a47e59cf1183dd83b Reviewed-on: https://go-review.googlesource.com/c/go/+/233341 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- src/cmd/link/internal/loader/loader.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 0990768903..e906ec3d5e 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -338,8 +338,8 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor nbuiltin := goobj2.NBuiltin() ldr := &Loader{ start: make(map[*oReader]Sym), - objs: []objIdx{{}}, // reserve index 0 for nil symbol - objSyms: []objSym{{}}, // reserve index 0 for nil symbol + objs: []objIdx{{}}, // reserve index 0 for nil symbol + objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol extReader: &oReader{}, symsByName: [2]map[string]Sym{make(map[string]Sym, 100000), make(map[string]Sym, 50000)}, // preallocate ~2MB for ABI0 and ~1MB for ABI1 symbols objByPkg: make(map[string]*oReader), @@ -463,7 +463,8 @@ func (l *Loader) newExtSym(name string, ver int) Sym { if l.extStart == 0 { l.extStart = i } - l.growSyms(int(i)) + l.growValues(int(i) + 1) + l.growAttrBitmaps(int(i) + 1) pi := l.newPayload(name, ver) l.objSyms = append(l.objSyms, objSym{l.extReader, int(pi)}) l.extReader.syms = append(l.extReader.syms, i) @@ -1180,7 +1181,7 @@ func (l *Loader) SymSect(i Sym) *sym.Section { return l.sects[l.symSects[i]] } -// SetSymValue sets the section of the i-th symbol. i is global index. +// SetSymSect sets the section of the i-th symbol. i is global index. func (l *Loader) SetSymSect(i Sym, sect *sym.Section) { if int(i) >= len(l.symSects) { l.symSects = append(l.symSects, make([]uint16, l.NSym()-len(l.symSects))...) @@ -1960,7 +1961,6 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { default: panic("preloadSyms: bad kind") } - l.growSyms(len(l.objSyms) + end - start) l.growAttrBitmaps(len(l.objSyms) + end - start) for i := start; i < end; i++ { osym := r.Sym(i) @@ -2007,6 +2007,7 @@ func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { for _, o := range l.objs[1:] { loadObjRefs(l, o.r, arch) } + l.values = make([]int64, l.NSym(), l.NSym()+1000) // +1000 make some room for external symbols } func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { @@ -2535,12 +2536,10 @@ func loadObjSyms(l *Loader, syms *sym.Symbols, r *oReader, needReloc, needExtRel // a symbol originally discovered as part of an object file, it's // easier to do this if we make the updates to an external symbol // payload. -// XXX maybe rename? makeExtPayload? func (l *Loader) cloneToExternal(symIdx Sym) { if l.IsExternal(symIdx) { panic("sym is already external, no need for clone") } - l.growSyms(int(symIdx)) // Read the particulars from object. r, li := l.toLocal(symIdx) -- GitLab From 69261d1f367ae8b14f943c39d7ab80faf80b2e03 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 11 May 2020 16:00:13 -0400 Subject: [PATCH 0022/1792] [dev.link] cmd/link: expand architecture support for elf asmb2 path Adds in support for remaining architectures to the linker's ELF asmb2 path, along with deleting most of the older sym.Symbol based code. Change-Id: I67c96525db72b7d6dd3187cf2b9f6faddc296291 Reviewed-on: https://go-review.googlesource.com/c/go/+/233362 Reviewed-by: Cherry Zhang --- src/cmd/link/internal/arm/asm.go | 17 +- src/cmd/link/internal/arm/obj.go | 2 +- src/cmd/link/internal/arm64/asm.go | 11 +- src/cmd/link/internal/arm64/obj.go | 2 +- src/cmd/link/internal/ld/data.go | 8 +- src/cmd/link/internal/ld/dwarf2.go | 28 -- src/cmd/link/internal/ld/elf.go | 8 - src/cmd/link/internal/ld/elf2.go | 643 +-------------------------- src/cmd/link/internal/ld/lib.go | 1 - src/cmd/link/internal/ld/lib2.go | 51 --- src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/ld/symtab.go | 5 +- src/cmd/link/internal/ld/symtab2.go | 166 ------- src/cmd/link/internal/ld/xcoff2.go | 113 ----- src/cmd/link/internal/mips/asm.go | 8 +- src/cmd/link/internal/mips/obj.go | 2 +- src/cmd/link/internal/mips64/asm.go | 9 +- src/cmd/link/internal/mips64/obj.go | 2 +- src/cmd/link/internal/ppc64/asm.go | 13 +- src/cmd/link/internal/ppc64/obj.go | 2 +- src/cmd/link/internal/riscv64/asm.go | 4 +- src/cmd/link/internal/riscv64/obj.go | 2 +- src/cmd/link/internal/s390x/asm.go | 31 +- src/cmd/link/internal/s390x/obj.go | 2 +- src/cmd/link/internal/x86/asm.go | 23 +- src/cmd/link/internal/x86/obj.go | 2 +- 26 files changed, 76 insertions(+), 1081 deletions(-) delete mode 100644 src/cmd/link/internal/ld/lib2.go delete mode 100644 src/cmd/link/internal/ld/symtab2.go delete mode 100644 src/cmd/link/internal/ld/xcoff2.go diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index e268c15565..0c1f89c6c8 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -249,28 +249,29 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load return false } -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { +func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write32(uint32(sectoff)) - elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - switch r.Type { + elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + siz := r.Siz() + switch r.Type() { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write32(uint32(elf.R_ARM_ABS32) | uint32(elfsym)<<8) } else { return false } case objabi.R_PCREL: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write32(uint32(elf.R_ARM_REL32) | uint32(elfsym)<<8) } else { return false } case objabi.R_CALLARM: - if r.Siz == 4 { - if r.Add&0xff000000 == 0xeb000000 { // BL + if siz == 4 { + if r.Add()&0xff000000 == 0xeb000000 { // BL ctxt.Out.Write32(uint32(elf.R_ARM_CALL) | uint32(elfsym)<<8) } else { ctxt.Out.Write32(uint32(elf.R_ARM_JUMP24) | uint32(elfsym)<<8) @@ -283,7 +284,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { case objabi.R_TLS_IE: ctxt.Out.Write32(uint32(elf.R_ARM_TLS_IE32) | uint32(elfsym)<<8) case objabi.R_GOTPCREL: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write32(uint32(elf.R_ARM_GOT_PREL) | uint32(elfsym)<<8) } else { return false diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index 653f16dba1..ecdddb597b 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -53,7 +53,7 @@ func Init() (*sys.Arch, ld.Arch) { Trampoline: trampoline, Asmb: asmb, Asmb2: asmb2, - Elfreloc1: elfreloc1, + Elfreloc2: elfreloc2, Elfsetupplt: elfsetupplt, Gentext2: gentext2, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 787851bbd2..bb6a059c46 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -325,15 +325,16 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load return false } -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { +func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - switch r.Type { + elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + siz := r.Siz() + switch r.Type() { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - switch r.Siz { + switch siz { case 4: ctxt.Out.Write64(uint64(elf.R_AARCH64_ABS32) | uint64(elfsym)<<32) case 8: @@ -360,7 +361,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(elf.R_AARCH64_LD64_GOT_LO12_NC) | uint64(elfsym)<<32) case objabi.R_CALLARM64: - if r.Siz != 4 { + if siz != 4 { return false } ctxt.Out.Write64(uint64(elf.R_AARCH64_CALL26) | uint64(elfsym)<<32) diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index ffce0cb17d..e948273ab9 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -52,7 +52,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc1: elfreloc1, + Elfreloc2: elfreloc2, Elfsetupplt: elfsetupplt, Gentext2: gentext2, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index f17a9eba63..71e2c30798 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2104,11 +2104,9 @@ func (ctxt *Link) buildinfo() { ldr := ctxt.loader s := ldr.CreateSymForUpdate(".go.buildinfo", 0) s.SetReachable(true) - if !ctxt.IsAIX() { - // On AIX, .go.buildinfo must be in the symbol table as - // it has relocations. - s.SetNotInSymbolTable(true) - } + // On AIX, .go.buildinfo must be in the symbol table as + // it has relocations. + s.SetNotInSymbolTable(!ctxt.IsAIX()) s.SetType(sym.SBUILDINFO) s.SetAlign(16) // The \xff is invalid UTF-8, meant to make it less likely diff --git a/src/cmd/link/internal/ld/dwarf2.go b/src/cmd/link/internal/ld/dwarf2.go index 02090e1e07..66f8aace0f 100644 --- a/src/cmd/link/internal/ld/dwarf2.go +++ b/src/cmd/link/internal/ld/dwarf2.go @@ -65,34 +65,6 @@ func dwarfaddshstrings(ctxt *Link, shstrtab *loader.SymbolBuilder) { } } -// Add section symbols for DWARF debug info. This is called before -// dwarfaddelfheaders. -func dwarfaddelfsectionsyms2(ctxt *Link) { - if *FlagW { // disable dwarf - return - } - if ctxt.LinkMode != LinkExternal { - return - } - - s := ctxt.Syms.Lookup(".debug_info", 0) - putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - s = ctxt.Syms.Lookup(".debug_abbrev", 0) - putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - s = ctxt.Syms.Lookup(".debug_line", 0) - putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - s = ctxt.Syms.Lookup(".debug_frame", 0) - putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - s = ctxt.Syms.Lookup(".debug_loc", 0) - if s.Sect != nil { - putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - } - s = ctxt.Syms.Lookup(".debug_ranges", 0) - if s.Sect != nil { - putelfsectionsym2(ctxt, ctxt.Out, s, s.Sect.Elfsect.(*ElfShdr).shnum) - } -} - // dwarfcompress compresses the DWARF sections. Relocations are applied // on the fly. After this, dwarfp will contain a different (new) set of // symbols, and sections may have been replaced. diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 9cf1339aa4..b6ef555a6b 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1399,10 +1399,6 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) { } func Elfemitreloc(ctxt *Link) { - if !ctxt.IsAMD64() { - Elfemitreloc2(ctxt) - return - } for ctxt.Out.Offset()&7 != 0 { ctxt.Out.Write8(0) @@ -1785,10 +1781,6 @@ func Asmbelfsetup() { } func Asmbelf(ctxt *Link, symo int64) { - if !ctxt.IsAMD64() { - Asmbelf2(ctxt, symo) - return - } ldr := ctxt.loader eh := getElfEhdr() diff --git a/src/cmd/link/internal/ld/elf2.go b/src/cmd/link/internal/ld/elf2.go index a1f822546c..c7fab6c623 100644 --- a/src/cmd/link/internal/ld/elf2.go +++ b/src/cmd/link/internal/ld/elf2.go @@ -4,12 +4,7 @@ package ld -import ( - "cmd/internal/objabi" - "cmd/internal/sys" - "cmd/link/internal/sym" - "encoding/binary" -) +import "cmd/link/internal/sym" // Temporary dumping around for sym.Symbol version of helper // functions in elf.go, still being used for some archs/oses. @@ -26,639 +21,3 @@ func elfsetstring(s *sym.Symbol, str string, off int) { elfstr[nelfstr].off = off nelfstr++ } - -func Asmbelf2(ctxt *Link, symo int64) { - eh := getElfEhdr() - switch ctxt.Arch.Family { - default: - Exitf("unknown architecture in asmbelf: %v", ctxt.Arch.Family) - case sys.MIPS, sys.MIPS64: - eh.machine = EM_MIPS - case sys.ARM: - eh.machine = EM_ARM - case sys.AMD64: - eh.machine = EM_X86_64 - case sys.ARM64: - eh.machine = EM_AARCH64 - case sys.I386: - eh.machine = EM_386 - case sys.PPC64: - eh.machine = EM_PPC64 - case sys.RISCV64: - eh.machine = EM_RISCV - case sys.S390X: - eh.machine = EM_S390 - } - - elfreserve := int64(ELFRESERVE) - - numtext := int64(0) - for _, sect := range Segtext.Sections { - if sect.Name == ".text" { - numtext++ - } - } - - // If there are multiple text sections, extra space is needed - // in the elfreserve for the additional .text and .rela.text - // section headers. It can handle 4 extra now. Headers are - // 64 bytes. - - if numtext > 4 { - elfreserve += elfreserve + numtext*64*2 - } - - startva := *FlagTextAddr - int64(HEADR) - resoff := elfreserve - - var pph *ElfPhdr - var pnote *ElfPhdr - if *flagRace && ctxt.IsNetbsd() { - sh := elfshname(".note.netbsd.pax") - resoff -= int64(elfnetbsdpax(sh, uint64(startva), uint64(resoff))) - pnote = newElfPhdr() - pnote.type_ = PT_NOTE - pnote.flags = PF_R - phsh(pnote, sh) - } - if ctxt.LinkMode == LinkExternal { - /* skip program headers */ - eh.phoff = 0 - - eh.phentsize = 0 - - if ctxt.BuildMode == BuildModeShared { - sh := elfshname(".note.go.pkg-list") - sh.type_ = SHT_NOTE - sh = elfshname(".note.go.abihash") - sh.type_ = SHT_NOTE - sh.flags = SHF_ALLOC - sh = elfshname(".note.go.deps") - sh.type_ = SHT_NOTE - } - - if *flagBuildid != "" { - sh := elfshname(".note.go.buildid") - sh.type_ = SHT_NOTE - sh.flags = SHF_ALLOC - } - - goto elfobj - } - - /* program header info */ - pph = newElfPhdr() - - pph.type_ = PT_PHDR - pph.flags = PF_R - pph.off = uint64(eh.ehsize) - pph.vaddr = uint64(*FlagTextAddr) - uint64(HEADR) + pph.off - pph.paddr = uint64(*FlagTextAddr) - uint64(HEADR) + pph.off - pph.align = uint64(*FlagRound) - - /* - * PHDR must be in a loaded segment. Adjust the text - * segment boundaries downwards to include it. - */ - { - o := int64(Segtext.Vaddr - pph.vaddr) - Segtext.Vaddr -= uint64(o) - Segtext.Length += uint64(o) - o = int64(Segtext.Fileoff - pph.off) - Segtext.Fileoff -= uint64(o) - Segtext.Filelen += uint64(o) - } - - if !*FlagD { /* -d suppresses dynamic loader format */ - /* interpreter */ - sh := elfshname(".interp") - - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC - sh.addralign = 1 - - if interpreter == "" && objabi.GO_LDSO != "" { - interpreter = objabi.GO_LDSO - } - - if interpreter == "" { - switch ctxt.HeadType { - case objabi.Hlinux: - if objabi.GOOS == "android" { - interpreter = thearch.Androiddynld - if interpreter == "" { - Exitf("ELF interpreter not set") - } - } else { - interpreter = thearch.Linuxdynld - } - - case objabi.Hfreebsd: - interpreter = thearch.Freebsddynld - - case objabi.Hnetbsd: - interpreter = thearch.Netbsddynld - - case objabi.Hopenbsd: - interpreter = thearch.Openbsddynld - - case objabi.Hdragonfly: - interpreter = thearch.Dragonflydynld - - case objabi.Hsolaris: - interpreter = thearch.Solarisdynld - } - } - - resoff -= int64(elfinterp(sh, uint64(startva), uint64(resoff), interpreter)) - - ph := newElfPhdr() - ph.type_ = PT_INTERP - ph.flags = PF_R - phsh(ph, sh) - } - - pnote = nil - if ctxt.HeadType == objabi.Hnetbsd || ctxt.HeadType == objabi.Hopenbsd { - var sh *ElfShdr - switch ctxt.HeadType { - case objabi.Hnetbsd: - sh = elfshname(".note.netbsd.ident") - resoff -= int64(elfnetbsdsig(sh, uint64(startva), uint64(resoff))) - - case objabi.Hopenbsd: - sh = elfshname(".note.openbsd.ident") - resoff -= int64(elfopenbsdsig(sh, uint64(startva), uint64(resoff))) - } - - pnote = newElfPhdr() - pnote.type_ = PT_NOTE - pnote.flags = PF_R - phsh(pnote, sh) - } - - if len(buildinfo) > 0 { - sh := elfshname(".note.gnu.build-id") - resoff -= int64(elfbuildinfo(sh, uint64(startva), uint64(resoff))) - - if pnote == nil { - pnote = newElfPhdr() - pnote.type_ = PT_NOTE - pnote.flags = PF_R - } - - phsh(pnote, sh) - } - - if *flagBuildid != "" { - sh := elfshname(".note.go.buildid") - resoff -= int64(elfgobuildid(sh, uint64(startva), uint64(resoff))) - - pnote := newElfPhdr() - pnote.type_ = PT_NOTE - pnote.flags = PF_R - phsh(pnote, sh) - } - - // Additions to the reserved area must be above this line. - - elfphload(&Segtext) - if len(Segrodata.Sections) > 0 { - elfphload(&Segrodata) - } - if len(Segrelrodata.Sections) > 0 { - elfphload(&Segrelrodata) - elfphrelro(&Segrelrodata) - } - elfphload(&Segdata) - - /* Dynamic linking sections */ - if !*FlagD { - sh := elfshname(".dynsym") - sh.type_ = SHT_DYNSYM - sh.flags = SHF_ALLOC - if elf64 { - sh.entsize = ELF64SYMSIZE - } else { - sh.entsize = ELF32SYMSIZE - } - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".dynstr").shnum) - - // sh.info is the index of first non-local symbol (number of local symbols) - s := ctxt.Syms.Lookup(".dynsym", 0) - i := uint32(0) - for sub := s; sub != nil; sub = symSub(ctxt, sub) { - i++ - if !sub.Attr.Local() { - break - } - } - sh.info = i - shsym(sh, s) - - sh = elfshname(".dynstr") - sh.type_ = SHT_STRTAB - sh.flags = SHF_ALLOC - sh.addralign = 1 - shsym(sh, ctxt.Syms.Lookup(".dynstr", 0)) - - if elfverneed != 0 { - sh := elfshname(".gnu.version") - sh.type_ = SHT_GNU_VERSYM - sh.flags = SHF_ALLOC - sh.addralign = 2 - sh.link = uint32(elfshname(".dynsym").shnum) - sh.entsize = 2 - shsym(sh, ctxt.Syms.Lookup(".gnu.version", 0)) - - sh = elfshname(".gnu.version_r") - sh.type_ = SHT_GNU_VERNEED - sh.flags = SHF_ALLOC - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.info = uint32(elfverneed) - sh.link = uint32(elfshname(".dynstr").shnum) - shsym(sh, ctxt.Syms.Lookup(".gnu.version_r", 0)) - } - - if elfRelType == ".rela" { - sh := elfshname(".rela.plt") - sh.type_ = SHT_RELA - sh.flags = SHF_ALLOC - sh.entsize = ELF64RELASIZE - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".dynsym").shnum) - sh.info = uint32(elfshname(".plt").shnum) - shsym(sh, ctxt.Syms.Lookup(".rela.plt", 0)) - - sh = elfshname(".rela") - sh.type_ = SHT_RELA - sh.flags = SHF_ALLOC - sh.entsize = ELF64RELASIZE - sh.addralign = 8 - sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rela", 0)) - } else { - sh := elfshname(".rel.plt") - sh.type_ = SHT_REL - sh.flags = SHF_ALLOC - sh.entsize = ELF32RELSIZE - sh.addralign = 4 - sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rel.plt", 0)) - - sh = elfshname(".rel") - sh.type_ = SHT_REL - sh.flags = SHF_ALLOC - sh.entsize = ELF32RELSIZE - sh.addralign = 4 - sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".rel", 0)) - } - - if eh.machine == EM_PPC64 { - sh := elfshname(".glink") - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC + SHF_EXECINSTR - sh.addralign = 4 - shsym(sh, ctxt.Syms.Lookup(".glink", 0)) - } - - sh = elfshname(".plt") - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC + SHF_EXECINSTR - if eh.machine == EM_X86_64 { - sh.entsize = 16 - } else if eh.machine == EM_S390 { - sh.entsize = 32 - } else if eh.machine == EM_PPC64 { - // On ppc64, this is just a table of addresses - // filled by the dynamic linker - sh.type_ = SHT_NOBITS - - sh.flags = SHF_ALLOC + SHF_WRITE - sh.entsize = 8 - } else { - sh.entsize = 4 - } - sh.addralign = sh.entsize - shsym(sh, ctxt.Syms.Lookup(".plt", 0)) - - // On ppc64, .got comes from the input files, so don't - // create it here, and .got.plt is not used. - if eh.machine != EM_PPC64 { - sh := elfshname(".got") - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC + SHF_WRITE - sh.entsize = uint64(ctxt.Arch.RegSize) - sh.addralign = uint64(ctxt.Arch.RegSize) - shsym(sh, ctxt.Syms.Lookup(".got", 0)) - - sh = elfshname(".got.plt") - sh.type_ = SHT_PROGBITS - sh.flags = SHF_ALLOC + SHF_WRITE - sh.entsize = uint64(ctxt.Arch.RegSize) - sh.addralign = uint64(ctxt.Arch.RegSize) - shsym(sh, ctxt.Syms.Lookup(".got.plt", 0)) - } - - sh = elfshname(".hash") - sh.type_ = SHT_HASH - sh.flags = SHF_ALLOC - sh.entsize = 4 - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".dynsym").shnum) - shsym(sh, ctxt.Syms.Lookup(".hash", 0)) - - /* sh and PT_DYNAMIC for .dynamic section */ - sh = elfshname(".dynamic") - - sh.type_ = SHT_DYNAMIC - sh.flags = SHF_ALLOC + SHF_WRITE - sh.entsize = 2 * uint64(ctxt.Arch.RegSize) - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".dynstr").shnum) - shsym(sh, ctxt.Syms.Lookup(".dynamic", 0)) - ph := newElfPhdr() - ph.type_ = PT_DYNAMIC - ph.flags = PF_R + PF_W - phsh(ph, sh) - - /* - * Thread-local storage segment (really just size). - */ - tlssize := uint64(0) - for _, sect := range Segdata.Sections { - if sect.Name == ".tbss" { - tlssize = sect.Length - } - } - if tlssize != 0 { - ph := newElfPhdr() - ph.type_ = PT_TLS - ph.flags = PF_R - ph.memsz = tlssize - ph.align = uint64(ctxt.Arch.RegSize) - } - } - - if ctxt.HeadType == objabi.Hlinux { - ph := newElfPhdr() - ph.type_ = PT_GNU_STACK - ph.flags = PF_W + PF_R - ph.align = uint64(ctxt.Arch.RegSize) - - ph = newElfPhdr() - ph.type_ = 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_ = PT_SUNWSTACK - ph.flags = PF_W + PF_R - } - -elfobj: - sh := elfshname(".shstrtab") - sh.type_ = SHT_STRTAB - sh.addralign = 1 - shsym(sh, ctxt.Syms.Lookup(".shstrtab", 0)) - eh.shstrndx = uint16(sh.shnum) - - // put these sections early in the list - if !*FlagS { - elfshname(".symtab") - elfshname(".strtab") - } - - for _, sect := range Segtext.Sections { - elfshbits(ctxt.LinkMode, sect) - } - for _, sect := range Segrodata.Sections { - elfshbits(ctxt.LinkMode, sect) - } - for _, sect := range Segrelrodata.Sections { - elfshbits(ctxt.LinkMode, sect) - } - for _, sect := range Segdata.Sections { - elfshbits(ctxt.LinkMode, sect) - } - for _, sect := range Segdwarf.Sections { - elfshbits(ctxt.LinkMode, sect) - } - - if ctxt.LinkMode == LinkExternal { - for _, sect := range Segtext.Sections { - elfshreloc(ctxt.Arch, sect) - } - for _, sect := range Segrodata.Sections { - elfshreloc(ctxt.Arch, sect) - } - for _, sect := range Segrelrodata.Sections { - elfshreloc(ctxt.Arch, sect) - } - for _, sect := range Segdata.Sections { - elfshreloc(ctxt.Arch, sect) - } - for _, si := range dwarfp { - s := si.secSym() - elfshreloc(ctxt.Arch, s.Sect) - } - // add a .note.GNU-stack section to mark the stack as non-executable - sh := elfshname(".note.GNU-stack") - - sh.type_ = SHT_PROGBITS - sh.addralign = 1 - sh.flags = 0 - } - - if !*FlagS { - sh := elfshname(".symtab") - sh.type_ = SHT_SYMTAB - sh.off = uint64(symo) - sh.size = uint64(Symsize) - sh.addralign = uint64(ctxt.Arch.RegSize) - sh.entsize = 8 + 2*uint64(ctxt.Arch.RegSize) - sh.link = uint32(elfshname(".strtab").shnum) - sh.info = uint32(elfglobalsymndx) - - sh = elfshname(".strtab") - sh.type_ = SHT_STRTAB - sh.off = uint64(symo) + uint64(Symsize) - sh.size = uint64(len(Elfstrdat)) - sh.addralign = 1 - } - - /* Main header */ - eh.ident[EI_MAG0] = '\177' - - eh.ident[EI_MAG1] = 'E' - eh.ident[EI_MAG2] = 'L' - eh.ident[EI_MAG3] = 'F' - if ctxt.HeadType == objabi.Hfreebsd { - eh.ident[EI_OSABI] = ELFOSABI_FREEBSD - } else if ctxt.HeadType == objabi.Hnetbsd { - eh.ident[EI_OSABI] = ELFOSABI_NETBSD - } else if ctxt.HeadType == objabi.Hopenbsd { - eh.ident[EI_OSABI] = ELFOSABI_OPENBSD - } else if ctxt.HeadType == objabi.Hdragonfly { - eh.ident[EI_OSABI] = ELFOSABI_NONE - } - if elf64 { - eh.ident[EI_CLASS] = ELFCLASS64 - } else { - eh.ident[EI_CLASS] = ELFCLASS32 - } - if ctxt.Arch.ByteOrder == binary.BigEndian { - eh.ident[EI_DATA] = ELFDATA2MSB - } else { - eh.ident[EI_DATA] = ELFDATA2LSB - } - eh.ident[EI_VERSION] = EV_CURRENT - - if ctxt.LinkMode == LinkExternal { - eh.type_ = ET_REL - } else if ctxt.BuildMode == BuildModePIE { - eh.type_ = ET_DYN - } else { - eh.type_ = ET_EXEC - } - - if ctxt.LinkMode != LinkExternal { - eh.entry = uint64(Entryvalue(ctxt)) - } - - eh.version = EV_CURRENT - - if pph != nil { - pph.filesz = uint64(eh.phnum) * uint64(eh.phentsize) - pph.memsz = pph.filesz - } - - ctxt.Out.SeekSet(0) - a := int64(0) - a += int64(elfwritehdr(ctxt.Out)) - a += int64(elfwritephdrs(ctxt.Out)) - a += int64(elfwriteshdrs(ctxt.Out)) - if !*FlagD { - a += int64(elfwriteinterp(ctxt.Out)) - } - if ctxt.LinkMode != LinkExternal { - if ctxt.HeadType == objabi.Hnetbsd { - a += int64(elfwritenetbsdsig(ctxt.Out)) - } - if ctxt.HeadType == objabi.Hopenbsd { - a += int64(elfwriteopenbsdsig(ctxt.Out)) - } - if len(buildinfo) > 0 { - a += int64(elfwritebuildinfo(ctxt.Out)) - } - if *flagBuildid != "" { - a += int64(elfwritegobuildid(ctxt.Out)) - } - } - if *flagRace && ctxt.IsNetbsd() { - a += int64(elfwritenetbsdpax(ctxt.Out)) - } - - if a > elfreserve { - Errorf(nil, "ELFRESERVE too small: %d > %d with %d text sections", a, elfreserve, numtext) - } -} - -// Do not write DT_NULL. elfdynhash will finish it. -func shsym(sh *ElfShdr, s *sym.Symbol) { - addr := Symaddr(s) - if sh.flags&SHF_ALLOC != 0 { - sh.addr = uint64(addr) - } - sh.off = uint64(datoff2(s, addr)) - sh.size = uint64(s.Size) -} - -func Elfemitreloc2(ctxt *Link) { - for ctxt.Out.Offset()&7 != 0 { - ctxt.Out.Write8(0) - } - - for _, sect := range Segtext.Sections { - if sect.Name == ".text" { - elfrelocsect2(ctxt, sect, ctxt.Textp) - } else { - elfrelocsect2(ctxt, sect, ctxt.datap) - } - } - - for _, sect := range Segrodata.Sections { - elfrelocsect2(ctxt, sect, ctxt.datap) - } - for _, sect := range Segrelrodata.Sections { - elfrelocsect2(ctxt, sect, ctxt.datap) - } - for _, sect := range Segdata.Sections { - elfrelocsect2(ctxt, sect, ctxt.datap) - } - for i := 0; i < len(Segdwarf.Sections); i++ { - sect := Segdwarf.Sections[i] - si := dwarfp[i] - if si.secSym() != sect.Sym || - si.secSym().Sect != sect { - panic("inconsistency between dwarfp and Segdwarf") - } - elfrelocsect2(ctxt, sect, si.syms) - } -} - -func elfrelocsect2(ctxt *Link, sect *sym.Section, syms []*sym.Symbol) { - // If main section is SHT_NOBITS, nothing to relocate. - // Also nothing to relocate in .shstrtab. - if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { - return - } - if sect.Name == ".shstrtab" { - return - } - - sect.Reloff = uint64(ctxt.Out.Offset()) - for i, s := range syms { - if !s.Attr.Reachable() { - continue - } - if uint64(s.Value) >= sect.Vaddr { - syms = syms[i:] - break - } - } - - eaddr := int32(sect.Vaddr + sect.Length) - for _, s := range syms { - if !s.Attr.Reachable() { - continue - } - if s.Value >= int64(eaddr) { - break - } - for ri := range s.R { - r := &s.R[ri] - if r.Done { - continue - } - if r.Xsym == nil { - Errorf(s, "missing xsym in relocation %#v %#v", r.Sym.Name, s) - continue - } - esr := ElfSymForReloc(ctxt, r.Xsym) - if esr == 0 { - Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Sym.Type) - } - if !r.Xsym.Attr.Reachable() { - Errorf(s, "unreachable reloc %d (%s) target %v", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Xsym.Name) - } - if !thearch.Elfreloc1(ctxt, r, int64(uint64(s.Value+int64(r.Off))-sect.Vaddr)) { - Errorf(s, "unsupported obj reloc %d (%s)/%d to %s", r.Type, sym.RelocName(ctxt.Arch, r.Type), r.Siz, r.Sym.Name) - } - } - } - - sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff -} diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 752dbeebf1..34052f1f6b 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -268,7 +268,6 @@ type Arch struct { Asmb func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader) - Elfreloc1 func(*Link, *sym.Reloc, int64) bool Elfreloc2 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) Gentext func(*Link) diff --git a/src/cmd/link/internal/ld/lib2.go b/src/cmd/link/internal/ld/lib2.go deleted file mode 100644 index 296d6d2785..0000000000 --- a/src/cmd/link/internal/ld/lib2.go +++ /dev/null @@ -1,51 +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 ld - -import ( - "cmd/internal/objabi" - "cmd/link/internal/loader" - "cmd/link/internal/sym" -) - -// Temporary dumping around for sym.Symbol version of helper -// functions in lib.go, still being used for some archs/oses. - -func Entryvalue(ctxt *Link) int64 { - a := *flagEntrySymbol - if a[0] >= '0' && a[0] <= '9' { - return atolwhex(a) - } - s := ctxt.Syms.Lookup(a, 0) - if s.Type == 0 { - return *FlagTextAddr - } - if ctxt.HeadType != objabi.Haix && s.Type != sym.STEXT { - Errorf(s, "entry not text") - } - return s.Value -} - -func datoff2(s *sym.Symbol, addr int64) int64 { - if uint64(addr) >= Segdata.Vaddr { - return int64(uint64(addr) - Segdata.Vaddr + Segdata.Fileoff) - } - if uint64(addr) >= Segtext.Vaddr { - return int64(uint64(addr) - Segtext.Vaddr + Segtext.Fileoff) - } - Errorf(s, "invalid datoff %#x", addr) - return 0 -} - -func ElfSymForReloc(ctxt *Link, s *sym.Symbol) int32 { - // If putelfsym created a local version of this symbol, use that in all - // relocations. - les := ctxt.loader.SymLocalElfSym(loader.Sym(s.SymIdx)) - if les != 0 { - return les - } else { - return ctxt.loader.SymElfSym(loader.Sym(s.SymIdx)) - } -} diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 6c16785b43..d22657cf93 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -320,7 +320,7 @@ func Main(arch *sys.Arch, theArch Arch) { thearch.Asmb(ctxt, ctxt.loader) bench.Start("reloc") ctxt.reloc() - newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() || ctxt.IsPlan9() || (ctxt.IsElf() && ctxt.IsAMD64()) + newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() || ctxt.IsPlan9() || ctxt.IsElf() if !newasmb2 { bench.Start("loadlibfull") // We don't need relocations at this point. diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 18036038fa..bc76210be3 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -230,10 +230,7 @@ func genelfsym(ctxt *Link, elfbind int) { } func Asmelfsym(ctxt *Link) { - if !ctxt.IsAMD64() { - Asmelfsym2(ctxt) - return - } + // the first symbol entry is reserved putelfsyment(ctxt.Out, 0, 0, 0, STB_LOCAL<<4|STT_NOTYPE, 0, 0) diff --git a/src/cmd/link/internal/ld/symtab2.go b/src/cmd/link/internal/ld/symtab2.go deleted file mode 100644 index 8108d723fc..0000000000 --- a/src/cmd/link/internal/ld/symtab2.go +++ /dev/null @@ -1,166 +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 ld - -import ( - "cmd/internal/sys" - "cmd/link/internal/loader" - "cmd/link/internal/sym" - "strings" -) - -// Temporary dumping around for sym.Symbol version of helper -// functions in symtab.go, still being used for some archs/oses. - -func Asmelfsym2(ctxt *Link) { - - // the first symbol entry is reserved - putelfsyment(ctxt.Out, 0, 0, 0, STB_LOCAL<<4|STT_NOTYPE, 0, 0) - - dwarfaddelfsectionsyms2(ctxt) - - // Some linkers will add a FILE sym if one is not present. - // Avoid having the working directory inserted into the symbol table. - // It is added with a name to avoid problems with external linking - // encountered on some versions of Solaris. See issue #14957. - putelfsyment(ctxt.Out, putelfstr("go.go"), 0, 0, STB_LOCAL<<4|STT_FILE, SHN_ABS, 0) - ctxt.numelfsym++ - - ctxt.elfbind = STB_LOCAL - genasmsym(ctxt, putelfsym2) - - ctxt.elfbind = STB_GLOBAL - elfglobalsymndx = ctxt.numelfsym - genasmsym(ctxt, putelfsym2) -} - -func putelfsectionsym2(ctxt *Link, out *OutBuf, s *sym.Symbol, shndx int) { - putelfsyment(out, 0, 0, 0, STB_LOCAL<<4|STT_SECTION, shndx, 0) - ctxt.loader.SetSymElfSym(loader.Sym(s.SymIdx), int32(ctxt.numelfsym)) - ctxt.numelfsym++ -} - -func putelfsym2(ctxt *Link, x *sym.Symbol, s string, t SymbolType, addr int64) { - var typ int - - switch t { - default: - return - - case TextSym: - typ = STT_FUNC - - case DataSym, BSSSym: - typ = STT_OBJECT - - case UndefinedSym: - // ElfType is only set for symbols read from Go shared libraries, but - // for other symbols it is left as STT_NOTYPE which is fine. - typ = int(x.ElfType()) - - case TLSSym: - typ = STT_TLS - } - - size := x.Size - if t == UndefinedSym { - size = 0 - } - - xo := x - if xo.Outer != nil { - xo = xo.Outer - } - - var elfshnum int - if xo.Type == sym.SDYNIMPORT || xo.Type == sym.SHOSTOBJ || xo.Type == sym.SUNDEFEXT { - elfshnum = SHN_UNDEF - } else { - if xo.Sect == nil { - Errorf(x, "missing section in putelfsym") - return - } - if xo.Sect.Elfsect == nil { - Errorf(x, "missing ELF section in putelfsym") - return - } - elfshnum = xo.Sect.Elfsect.(*ElfShdr).shnum - } - - // One pass for each binding: STB_LOCAL, STB_GLOBAL, - // maybe one day STB_WEAK. - bind := STB_GLOBAL - - if x.IsFileLocal() || x.Attr.VisibilityHidden() || x.Attr.Local() { - bind = STB_LOCAL - } - - // In external linking mode, we have to invoke gcc with -rdynamic - // to get the exported symbols put into the dynamic symbol table. - // To avoid filling the dynamic table with lots of unnecessary symbols, - // mark all Go symbols local (not global) in the final executable. - // But when we're dynamically linking, we need all those global symbols. - if !ctxt.DynlinkingGo() && ctxt.LinkMode == LinkExternal && !x.Attr.CgoExportStatic() && elfshnum != SHN_UNDEF { - bind = STB_LOCAL - } - - if ctxt.LinkMode == LinkExternal && elfshnum != SHN_UNDEF { - addr -= int64(xo.Sect.Vaddr) - } - other := STV_DEFAULT - if x.Attr.VisibilityHidden() { - // TODO(mwhudson): We only set AttrVisibilityHidden in ldelf, i.e. when - // internally linking. But STV_HIDDEN visibility only matters in object - // files and shared libraries, and as we are a long way from implementing - // internal linking for shared libraries and only create object files when - // externally linking, I don't think this makes a lot of sense. - other = STV_HIDDEN - } - if ctxt.Arch.Family == sys.PPC64 && typ == STT_FUNC && x.Attr.Shared() && x.Name != "runtime.duffzero" && x.Name != "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 s == x.Name { - // We should use Extname for ELF symbol table. - // TODO: maybe genasmsym should have done this. That function is too - // overloaded and I would rather not change it for now. - s = x.Extname() - } - - // When dynamically linking, we create Symbols by reading the names from - // the symbol tables of the shared libraries and so the names need to - // match exactly. Tools like DTrace will have to wait for now. - if !ctxt.DynlinkingGo() { - // Rewrite · to . for ASCII-only tools like DTrace (sigh) - s = strings.Replace(s, "·", ".", -1) - } - - if ctxt.DynlinkingGo() && bind == STB_GLOBAL && ctxt.elfbind == STB_LOCAL && x.Type == sym.STEXT { - // When dynamically linking, we want references to functions defined - // in this module to always be to the function object, not to the - // PLT. We force this by writing an additional local symbol for every - // global function symbol and making all relocations against the - // global symbol refer to this local symbol instead (see - // (*sym.Symbol).ElfsymForReloc). This is approximately equivalent to the - // ELF linker -Bsymbolic-functions option, but that is buggy on - // several platforms. - putelfsyment(ctxt.Out, putelfstr("local."+s), addr, size, STB_LOCAL<<4|typ&0xf, elfshnum, other) - ctxt.loader.SetSymLocalElfSym(loader.Sym(x.SymIdx), int32(ctxt.numelfsym)) - ctxt.numelfsym++ - return - } else if bind != ctxt.elfbind { - return - } - - putelfsyment(ctxt.Out, putelfstr(s), addr, size, bind<<4|typ&0xf, elfshnum, other) - ctxt.loader.SetSymElfSym(loader.Sym(x.SymIdx), int32(ctxt.numelfsym)) - ctxt.numelfsym++ -} diff --git a/src/cmd/link/internal/ld/xcoff2.go b/src/cmd/link/internal/ld/xcoff2.go deleted file mode 100644 index 27edbcb22d..0000000000 --- a/src/cmd/link/internal/ld/xcoff2.go +++ /dev/null @@ -1,113 +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 ld - -import ( - "cmd/internal/objabi" - "cmd/link/internal/loader" - "cmd/link/internal/sym" -) - -// Temporary dumping around for sym.Symbol version of helper -// functions in xcoff.go, still being used for some archs/oses. -// FIXME: get rid of this file when dodata() is completely -// converted. - -// xcoffUpdateOuterSize stores the size of outer symbols in order to have it -// in the symbol table. -func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) { - if size == 0 { - return - } - - switch stype { - default: - Errorf(nil, "unknown XCOFF outer symbol for type %s", stype.String()) - case sym.SRODATA, sym.SRODATARELRO, sym.SFUNCTAB, sym.SSTRING: - // Nothing to do - case sym.STYPERELRO: - if ctxt.UseRelro() && (ctxt.BuildMode == BuildModeCArchive || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE) { - // runtime.types size must be removed, as it's a real symbol. - outerSymSize["typerel.*"] = size - ctxt.Syms.ROLookup("runtime.types", 0).Size - return - } - fallthrough - case sym.STYPE: - if !ctxt.DynlinkingGo() { - // runtime.types size must be removed, as it's a real symbol. - outerSymSize["type.*"] = size - ctxt.Syms.ROLookup("runtime.types", 0).Size - } - case sym.SGOSTRING: - outerSymSize["go.string.*"] = size - case sym.SGOFUNC: - if !ctxt.DynlinkingGo() { - outerSymSize["go.func.*"] = size - } - case sym.SGOFUNCRELRO: - outerSymSize["go.funcrel.*"] = size - case sym.SGCBITS: - outerSymSize["runtime.gcbits.*"] = size - case sym.SITABLINK: - outerSymSize["runtime.itablink"] = size - - } -} - -// Xcoffadddynrel adds a dynamic relocation in a XCOFF file. -// This relocation will be made by the loader. -func Xcoffadddynrel(target *Target, ldr *loader.Loader, s *sym.Symbol, r *sym.Reloc) bool { - if target.IsExternal() { - return true - } - if s.Type <= sym.SPCLNTAB { - Errorf(s, "cannot have a relocation to %s in a text section symbol", r.Sym.Name) - return false - } - - xldr := &xcoffLoaderReloc{ - sym: s, - roff: r.Off, - } - - switch r.Type { - default: - Errorf(s, "unexpected .loader relocation to symbol: %s (type: %s)", r.Sym.Name, r.Type.String()) - return false - case objabi.R_ADDR: - if s.Type == sym.SXCOFFTOC && r.Sym.Type == sym.SDYNIMPORT { - // Imported symbol relocation - for i, dynsym := range xfile.loaderSymbols { - if ldr.Syms[dynsym.sym].Name == r.Sym.Name { - xldr.symndx = int32(i + 3) // +3 because of 3 section symbols - break - } - } - } else if s.Type == sym.SDATA || s.Type == sym.SNOPTRDATA || s.Type == sym.SBUILDINFO || s.Type == sym.SXCOFFTOC { - switch r.Sym.Sect.Seg { - default: - Errorf(s, "unknown segment for .loader relocation with symbol %s", r.Sym.Name) - case &Segtext: - case &Segrodata: - xldr.symndx = 0 // .text - case &Segdata: - if r.Sym.Type == sym.SBSS || r.Sym.Type == sym.SNOPTRBSS { - xldr.symndx = 2 // .bss - } else { - xldr.symndx = 1 // .data - } - - } - - } else { - Errorf(s, "unexpected type for .loader relocation R_ADDR for symbol %s: %s to %s", r.Sym.Name, s.Type, r.Sym.Type) - return false - } - - xldr.rtype = 0x3F<<8 + XCOFF_R_POS - } - - xfile.loaderReloc = append(xfile.loaderReloc, xldr) - return true -} diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 67b3726271..49002c6dd5 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -51,15 +51,15 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym. return false } -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { +func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write32(uint32(sectoff)) - elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - switch r.Type { + elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + switch r.Type() { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - if r.Siz != 4 { + if r.Siz() != 4 { return false } ctxt.Out.Write32(uint32(elf.R_MIPS_32) | uint32(elfsym)<<8) diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index b646adaf40..7fc14638e5 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -55,7 +55,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc1: elfreloc1, + Elfreloc2: elfreloc2, Elfsetupplt: elfsetupplt, Gentext2: gentext2, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 479157cb50..3834d74c66 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -49,7 +49,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym. return false } -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { +func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + // mips64 ELF relocation (endian neutral) // offset uint64 // sym uint32 @@ -61,16 +62,16 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) ctxt.Out.Write32(uint32(elfsym)) ctxt.Out.Write8(0) ctxt.Out.Write8(0) ctxt.Out.Write8(0) - switch r.Type { + switch r.Type() { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - switch r.Siz { + switch r.Siz() { case 4: ctxt.Out.Write8(uint8(elf.R_MIPS_32)) case 8: diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index b5f7ae1405..e56e31f222 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -54,7 +54,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc1: elfreloc1, + Elfreloc2: elfreloc2, Elfsetupplt: elfsetupplt, Gentext2: gentext2, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 7e08e534b3..5d4157c200 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -442,9 +442,10 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se } -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { +func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { // Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines. - if r.Type == objabi.R_ADDR || r.Type == objabi.R_POWER_TLS || r.Type == objabi.R_CALLPOWER { + rt := r.Type() + if rt == objabi.R_ADDR || rt == objabi.R_POWER_TLS || rt == objabi.R_CALLPOWER { } else { if ctxt.Arch.ByteOrder == binary.BigEndian { sectoff += 2 @@ -452,12 +453,12 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { } ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - switch r.Type { + elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + switch rt { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - switch r.Siz { + switch r.Siz() { case 4: ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR32) | uint64(elfsym)<<32) case 8: @@ -506,7 +507,7 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff + 4)) ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_LO_DS) | uint64(elfsym)<<32) case objabi.R_CALLPOWER: - if r.Siz != 4 { + if r.Siz() != 4 { return false } ctxt.Out.Write64(uint64(elf.R_PPC64_REL24) | uint64(elfsym)<<32) diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index 67002bc719..ffd07d62bd 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -55,7 +55,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc1: elfreloc1, + Elfreloc2: elfreloc2, Elfsetupplt: elfsetupplt, Gentext2: gentext2, Trampoline: trampoline, diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index f76a42b1c0..cd4cd1015d 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -28,8 +28,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym. return false } -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { - log.Fatalf("elfreloc1") +func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + log.Fatalf("elfreloc2") return false } diff --git a/src/cmd/link/internal/riscv64/obj.go b/src/cmd/link/internal/riscv64/obj.go index 4fa0ebe79a..a46b6cefb9 100644 --- a/src/cmd/link/internal/riscv64/obj.go +++ b/src/cmd/link/internal/riscv64/obj.go @@ -26,7 +26,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc1: elfreloc1, + Elfreloc2: elfreloc2, Elfsetupplt: elfsetupplt, Gentext2: gentext2, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 3e7b1ffb14..8c91dd724a 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -221,15 +221,17 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load return false } -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { +func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - switch r.Type { + elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + siz := r.Siz() + xst := ldr.SymType(r.Xsym) + switch r.Type() { default: return false case objabi.R_TLS_LE: - switch r.Siz { + switch siz { default: return false case 4: @@ -240,14 +242,14 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ctxt.Out.Write64(uint64(elf.R_390_TLS_LE64) | uint64(elfsym)<<32) } case objabi.R_TLS_IE: - switch r.Siz { + switch siz { default: return false case 4: ctxt.Out.Write64(uint64(elf.R_390_TLS_IEENT) | uint64(elfsym)<<32) } case objabi.R_ADDR, objabi.R_DWARFSECREF: - switch r.Siz { + switch siz { default: return false case 4: @@ -256,30 +258,31 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { ctxt.Out.Write64(uint64(elf.R_390_64) | uint64(elfsym)<<32) } case objabi.R_GOTPCREL: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write64(uint64(elf.R_390_GOTENT) | uint64(elfsym)<<32) } else { return false } case objabi.R_PCREL, objabi.R_PCRELDBL, objabi.R_CALL: elfrel := elf.R_390_NONE - isdbl := r.Variant&sym.RV_TYPE_MASK == sym.RV_390_DBL + rVariant := ldr.RelocVariant(s, r.Idx) + isdbl := rVariant&sym.RV_TYPE_MASK == sym.RV_390_DBL // TODO(mundaym): all DBL style relocations should be // signalled using the variant - see issue 14218. - switch r.Type { + switch r.Type() { case objabi.R_PCRELDBL, objabi.R_CALL: isdbl = true } - if r.Xsym.Type == sym.SDYNIMPORT && (r.Xsym.ElfType() == elf.STT_FUNC || r.Type == objabi.R_CALL) { + if xst == sym.SDYNIMPORT && (ldr.SymElfType(r.Xsym) == elf.STT_FUNC || r.Type() == objabi.R_CALL) { if isdbl { - switch r.Siz { + switch siz { case 2: elfrel = elf.R_390_PLT16DBL case 4: elfrel = elf.R_390_PLT32DBL } } else { - switch r.Siz { + switch siz { case 4: elfrel = elf.R_390_PLT32 case 8: @@ -288,14 +291,14 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { } } else { if isdbl { - switch r.Siz { + switch siz { case 2: elfrel = elf.R_390_PC16DBL case 4: elfrel = elf.R_390_PC32DBL } } else { - switch r.Siz { + switch siz { case 2: elfrel = elf.R_390_PC16 case 4: diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 9a480f118e..72da719ee4 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -52,7 +52,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc1: elfreloc1, + Elfreloc2: elfreloc2, Elfsetupplt: elfsetupplt, Gentext2: gentext2, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 5858845475..a058bdb9b3 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -340,23 +340,24 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load return false } -func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { +func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write32(uint32(sectoff)) - elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - switch r.Type { + elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + siz := r.Siz() + switch r.Type() { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write32(uint32(elf.R_386_32) | uint32(elfsym)<<8) } else { return false } case objabi.R_GOTPCREL: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write32(uint32(elf.R_386_GOTPC)) - if r.Xsym.Name != "_GLOBAL_OFFSET_TABLE_" { + if ldr.SymName(r.Xsym) != "_GLOBAL_OFFSET_TABLE_" { ctxt.Out.Write32(uint32(sectoff)) ctxt.Out.Write32(uint32(elf.R_386_GOT32) | uint32(elfsym)<<8) } @@ -364,8 +365,8 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { return false } case objabi.R_CALL: - if r.Siz == 4 { - if r.Xsym.Type == sym.SDYNIMPORT { + if siz == 4 { + if ldr.SymType(r.Xsym) == sym.SDYNIMPORT { ctxt.Out.Write32(uint32(elf.R_386_PLT32) | uint32(elfsym)<<8) } else { ctxt.Out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8) @@ -374,19 +375,19 @@ func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { return false } case objabi.R_PCREL: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8) } else { return false } case objabi.R_TLS_LE: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write32(uint32(elf.R_386_TLS_LE) | uint32(elfsym)<<8) } else { return false } case objabi.R_TLS_IE: - if r.Siz == 4 { + if siz == 4 { ctxt.Out.Write32(uint32(elf.R_386_GOTPC)) ctxt.Out.Write32(uint32(sectoff)) ctxt.Out.Write32(uint32(elf.R_386_TLS_GOTIE) | uint32(elfsym)<<8) diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index 61e3077b5b..dc1a0021fa 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -52,7 +52,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc1: elfreloc1, + Elfreloc2: elfreloc2, Elfsetupplt: elfsetupplt, Gentext2: gentext2, Machoreloc1: machoreloc1, -- GitLab From 2eb475be6bff9f2a2e57d077ec174abed40c318c Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 12 May 2020 17:16:51 -0400 Subject: [PATCH 0023/1792] [dev.link] cmd/link: remove elfsetstring No longer needed. Change-Id: I7cd08915e4731c4546414340df69521e2347367f Reviewed-on: https://go-review.googlesource.com/c/go/+/233521 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/elf.go | 2 +- src/cmd/link/internal/ld/elf2.go | 23 ------------------- src/cmd/link/internal/ld/lib.go | 3 ++- src/cmd/link/internal/loader/loader.go | 2 +- src/cmd/link/internal/loader/loader_test.go | 2 +- src/cmd/link/internal/loader/symbolbuilder.go | 2 +- 6 files changed, 6 insertions(+), 28 deletions(-) delete mode 100644 src/cmd/link/internal/ld/elf2.go diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index b6ef555a6b..341ac84469 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -628,7 +628,7 @@ func elfwriteshdrs(out *OutBuf) uint32 { return uint32(ehdr.shnum) * ELF32SHDRSIZE } -func elfsetstring2(ctxt *Link, s loader.Sym, str string, off int) { +func elfsetstring(ctxt *Link, s loader.Sym, str string, off int) { if nelfstr >= len(elfstr) { ctxt.Errorf(s, "too many elf strings") errorexit() diff --git a/src/cmd/link/internal/ld/elf2.go b/src/cmd/link/internal/ld/elf2.go deleted file mode 100644 index c7fab6c623..0000000000 --- a/src/cmd/link/internal/ld/elf2.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. - -package ld - -import "cmd/link/internal/sym" - -// Temporary dumping around for sym.Symbol version of helper -// functions in elf.go, still being used for some archs/oses. -// FIXME: get rid of this file when dodata() is completely -// converted and the sym.Symbol functions are not needed. - -func elfsetstring(s *sym.Symbol, str string, off int) { - if nelfstr >= len(elfstr) { - Errorf(s, "too many elf strings") - errorexit() - } - - elfstr[nelfstr].s = str - elfstr[nelfstr].off = off - nelfstr++ -} diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 34052f1f6b..09b9c18024 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -506,7 +506,8 @@ func (ctxt *Link) loadlib() { default: log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups) } - ctxt.loader = loader.NewLoader(flags, elfsetstring, &ctxt.ErrorReporter.ErrorReporter) + elfsetstring1 := func(str string, off int) { elfsetstring(ctxt, 0, str, off) } + ctxt.loader = loader.NewLoader(flags, elfsetstring1, &ctxt.ErrorReporter.ErrorReporter) ctxt.ErrorReporter.SymName = func(s loader.Sym) string { return ctxt.loader.SymName(s) } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index e906ec3d5e..7ee5bacb5a 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -312,7 +312,7 @@ const ( nonPkgRef ) -type elfsetstringFunc func(s *sym.Symbol, str string, off int) +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). diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 60ef69afb9..dfaad6e0d2 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -28,7 +28,7 @@ func addDummyObjSym(t *testing.T, ldr *Loader, or *oReader, name string) Sym { } func mkLoader() *Loader { - edummy := func(s *sym.Symbol, str string, off int) {} + edummy := func(str string, off int) {} er := ErrorReporter{} ldr := NewLoader(0, edummy, &er) er.ldr = ldr diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index 70adb369a4..b84a96d15c 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -363,7 +363,7 @@ func (sb *SymbolBuilder) Addstring(str string) int64 { r := sb.size if sb.name == ".shstrtab" { // FIXME: find a better mechanism for this - sb.l.elfsetstring(nil, str, int(r)) + sb.l.elfsetstring(str, int(r)) } sb.data = append(sb.data, str...) sb.data = append(sb.data, 0) -- GitLab From ef3a41c0ffbc794aa56ac08ea09341200ae9a39a Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 12 May 2020 17:18:05 -0400 Subject: [PATCH 0024/1792] [dev.link] cmd/link: rename adddynrel2 back to adddynrel Minor renaming cleanup to get rid of a couple of old sym.Symbol adddynrel helpers and rename the current crop of adddynrel2 methods/functions back to adddynrel. Change-Id: I67e76decff84d603ef765f3b6a0cd78c7f3743ec Reviewed-on: https://go-review.googlesource.com/c/go/+/233523 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 2 +- src/cmd/link/internal/amd64/obj.go | 2 +- src/cmd/link/internal/arm/asm.go | 2 +- src/cmd/link/internal/arm/obj.go | 2 +- src/cmd/link/internal/arm64/asm.go | 2 +- src/cmd/link/internal/arm64/obj.go | 2 +- src/cmd/link/internal/ld/data.go | 6 +++--- src/cmd/link/internal/ld/lib.go | 3 +-- src/cmd/link/internal/ld/xcoff.go | 2 +- src/cmd/link/internal/mips/asm.go | 6 ------ src/cmd/link/internal/mips/obj.go | 1 - src/cmd/link/internal/mips64/asm.go | 6 ------ src/cmd/link/internal/mips64/obj.go | 1 - src/cmd/link/internal/ppc64/asm.go | 8 ++++---- src/cmd/link/internal/ppc64/obj.go | 2 +- src/cmd/link/internal/riscv64/asm.go | 9 --------- src/cmd/link/internal/riscv64/obj.go | 1 - src/cmd/link/internal/s390x/asm.go | 2 +- src/cmd/link/internal/s390x/obj.go | 2 +- src/cmd/link/internal/x86/asm.go | 2 +- src/cmd/link/internal/x86/obj.go | 2 +- 21 files changed, 20 insertions(+), 45 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 554379d625..0b65d5dec4 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -78,7 +78,7 @@ func makeWritable(s *sym.Symbol) { } } -func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { targ := r.Sym() var targType sym.SymKind if targ != 0 { diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index 1fa8cbb4d0..a98fff6b69 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -51,7 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 0c1f89c6c8..8222b74099 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -103,7 +103,7 @@ func braddoff(a int32, b int32) int32 { return int32((uint32(a))&0xff000000 | 0x00ffffff&uint32(a+b)) } -func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { targ := r.Sym() var targType sym.SymKind diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index ecdddb597b..9a66c44a03 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -46,7 +46,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index bb6a059c46..45bf47ec44 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -78,7 +78,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { initfunc.AddReloc(rel2) } -func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { targ := r.Sym() var targType sym.SymKind diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index e948273ab9..6bac8b42a2 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -46,7 +46,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 71e2c30798..7254d2b172 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -391,7 +391,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // symbol which isn't in .data. However, as .text has the // same address once loaded, this is possible. if ldr.SymSect(s).Seg == &Segdata { - Xcoffadddynrel2(target, ldr, syms, s, r, ri) + Xcoffadddynrel(target, ldr, syms, s, r, ri) } } @@ -775,7 +775,7 @@ func dynrelocsym2(ctxt *Link, s loader.Sym) { // It's expected that some relocations will be done // later by relocsym (R_TLS_LE, R_ADDROFF), so // don't worry if Adddynrel returns false. - thearch.Adddynrel2(target, ldr, syms, s, r, ri) + thearch.Adddynrel(target, ldr, syms, s, r, ri) continue } @@ -784,7 +784,7 @@ func dynrelocsym2(ctxt *Link, s loader.Sym) { if rSym != 0 && !ldr.AttrReachable(rSym) { ctxt.Errorf(s, "dynamic relocation to unreachable symbol %s", ldr.SymName(rSym)) } - if !thearch.Adddynrel2(target, ldr, syms, s, r, ri) { + if !thearch.Adddynrel(target, ldr, syms, s, r, ri) { ctxt.Errorf(s, "unsupported dynamic relocation for symbol %s (type=%d (%s) stype=%d (%s))", ldr.SymName(rSym), r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymType(rSym), ldr.SymType(rSym)) } } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 09b9c18024..e5378225dc 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -232,8 +232,7 @@ type Arch struct { Openbsddynld string Dragonflydynld string Solarisdynld string - Adddynrel func(*Target, *loader.Loader, *ArchSyms, *sym.Symbol, *sym.Reloc) bool - Adddynrel2 func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool + Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool Archinit func(*Link) // Archreloc is an arch-specific hook that assists in relocation processing // (invoked by 'relocsym'); it handles target-specific relocation tasks. diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index f0ddc408fe..96c5a58af5 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1109,7 +1109,7 @@ func (f *xcoffFile) adddynimpsym(ctxt *Link, s loader.Sym) { // Xcoffadddynrel adds a dynamic relocation in a XCOFF file. // This relocation will be made by the loader. -func Xcoffadddynrel2(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func Xcoffadddynrel(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { if target.IsExternal() { return true } diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 49002c6dd5..81e1582c0a 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -38,7 +38,6 @@ import ( "cmd/link/internal/sym" "debug/elf" "fmt" - "log" "sync" ) @@ -46,11 +45,6 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { return } -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool { - log.Fatalf("adddynrel not implemented") - return false -} - func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write32(uint32(sectoff)) diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index 7fc14638e5..3594f4ac6c 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -49,7 +49,6 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: DWARFREGSP, Dwarfreglr: DWARFREGLR, - Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 3834d74c66..044dcd6a71 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -38,17 +38,11 @@ import ( "cmd/link/internal/sym" "debug/elf" "fmt" - "log" "sync" ) func gentext2(ctxt *ld.Link, ldr *loader.Loader) {} -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool { - log.Fatalf("adddynrel not implemented") - return false -} - func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { // mips64 ELF relocation (endian neutral) diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index e56e31f222..bf464c207b 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -48,7 +48,6 @@ func Init() (*sys.Arch, ld.Arch) { Minalign: minAlign, Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 5d4157c200..185d668db7 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -267,16 +267,16 @@ func gencallstub2(ctxt *ld.Link, ldr *loader.Loader, abicase int, stub *loader.S stub.AddUint32(ctxt.Arch, 0x4e800420) // bctr } -func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { if target.IsElf() { - return addelfdynrel2(target, ldr, syms, s, r, rIdx) + return addelfdynrel(target, ldr, syms, s, r, rIdx) } else if target.IsAIX() { - return ld.Xcoffadddynrel2(target, ldr, syms, s, r, rIdx) + return ld.Xcoffadddynrel(target, ldr, syms, s, r, rIdx) } return false } -func addelfdynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func addelfdynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { targ := r.Sym() var targType sym.SymKind if targ != 0 { diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index ffd07d62bd..1589df4abc 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -49,7 +49,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index cd4cd1015d..c21f667da2 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -19,15 +19,6 @@ import ( func gentext2(ctxt *ld.Link, ldr *loader.Loader) { } -func adddynrela(target *ld.Target, syms *ld.ArchSyms, rel *sym.Symbol, s *sym.Symbol, r *sym.Reloc) { - log.Fatalf("adddynrela not implemented") -} - -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s *sym.Symbol, r *sym.Reloc) bool { - log.Fatalf("adddynrel not implemented") - return false -} - func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { log.Fatalf("elfreloc2") return false diff --git a/src/cmd/link/internal/riscv64/obj.go b/src/cmd/link/internal/riscv64/obj.go index a46b6cefb9..9e6cec2b35 100644 --- a/src/cmd/link/internal/riscv64/obj.go +++ b/src/cmd/link/internal/riscv64/obj.go @@ -20,7 +20,6 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 8c91dd724a..63d397f887 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -75,7 +75,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { initfunc.AddUint32(ctxt.Arch, 0) } -func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { targ := r.Sym() var targType sym.SymKind if targ != 0 { diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 72da719ee4..8d8dd76133 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -46,7 +46,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index a058bdb9b3..39cca29239 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -129,7 +129,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { o(0xc3) } -func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { targ := r.Sym() var targType sym.SymKind if targ != 0 { diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index dc1a0021fa..286d6a83dd 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -46,7 +46,7 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, - Adddynrel2: adddynrel2, + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, -- GitLab From 9c3c8c1b12747dc84ac2c0efdf265f8a49ae9d88 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 12 May 2020 20:16:07 -0400 Subject: [PATCH 0025/1792] [dev.link] cmd/link: minor fix for -v log Now we no longer create loader.Syms array on most platforms. Use NSym(), instead of len(Syms), for the number of symbols in -v log. Change-Id: I8538c00d9c196b701d154eb7d04d911ee2cad73c Reviewed-on: https://go-review.googlesource.com/c/go/+/233777 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index d22657cf93..465a765db8 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -339,7 +339,7 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("hostlink") ctxt.hostlink() if ctxt.Debugvlog != 0 { - ctxt.Logf("%d symbols, %d reachable\n", len(ctxt.loader.Syms), ctxt.loader.NReachableSym()) + ctxt.Logf("%d symbols, %d reachable\n", ctxt.loader.NSym(), ctxt.loader.NReachableSym()) ctxt.Logf("%d liveness data\n", liveness) } bench.Start("Flush") -- GitLab From 1024cabc4833fb654f3e2661a416367342277f95 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 12 May 2020 18:53:55 -0400 Subject: [PATCH 0026/1792] [dev.link] cmd/link: remove extSymPayload.gotype field We have the information from auxs. Remove the field, slightly reduce memory usage. Change-Id: I3881777cfb40b03d0e2b0e7a326b0738080548b0 Reviewed-on: https://go-review.googlesource.com/c/go/+/233778 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/loader/loader.go | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 7ee5bacb5a..60f24a3b41 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -322,7 +322,6 @@ type extSymPayload struct { ver int kind sym.SymKind objidx uint32 // index of original object if sym made by cloneToExternal - gotype Sym // Gotype (0 if not present) relocs []goobj2.Reloc reltypes []objabi.RelocType // relocation types data []byte @@ -1411,12 +1410,17 @@ func (l *Loader) DynidSyms() []Sym { // results in to a map (might want to try this at some point and see // if it helps speed things up). func (l *Loader) SymGoType(i Sym) Sym { + var r *oReader + var auxs []goobj2.Aux if l.IsExternal(i) { pp := l.getPayload(i) - return pp.gotype + r = l.objs[pp.objidx].r + auxs = pp.auxs + } else { + var li int + r, li = l.toLocal(i) + auxs = r.Auxs(li) } - r, li := l.toLocal(i) - auxs := r.Auxs(li) for j := range auxs { a := &auxs[j] switch a.Type() { @@ -2580,17 +2584,6 @@ func (l *Loader) cloneToExternal(symIdx Sym) { // Gotype, so as to propagate it to the new symbol. auxs := r.Auxs(li) pp.auxs = auxs -loop: - for j := range auxs { - a := &auxs[j] - switch a.Type() { - case goobj2.AuxGotype: - pp.gotype = l.resolve(r, a.Sym()) - break loop - default: - // nothing to do - } - } // Install new payload to global index space. // (This needs to happen at the end, as the accessors above -- GitLab From d72ea427c6853742e8e49cb9dbcd64c36bb6270d Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 13 May 2020 11:42:36 -0400 Subject: [PATCH 0027/1792] [dev.link] cmd/link/internal/loader: remove Propagate* shim functions Remove the loader's PropagateSymbolChangesBackToLoader and PropagateLoaderChangesToSymbols shim functions. These were used at one point to enable conversion of phases in the linker that were "downstream" of loadlibfull -- given the current wavefront position there's not much point keeping them around. Change-Id: I3f01f25b70b1b80240369c8f3a10dca89931610f Reviewed-on: https://go-review.googlesource.com/c/go/+/233817 Run-TryBot: Than McIntosh Reviewed-by: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/link/internal/loader/loader.go | 139 ------------------------- 1 file changed, 139 deletions(-) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 60f24a3b41..8528170d3b 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -2245,145 +2245,6 @@ func (l *Loader) ResolveABIAlias(s Sym) Sym { return target } -// PropagateSymbolChangesBackToLoader is a temporary shim function -// that copies over a given sym.Symbol into the equivalent representation -// in the loader world. The intent is to enable converting a given -// linker phase/pass from dealing with sym.Symbol's to a modernized -// pass that works with loader.Sym, in cases where the "loader.Sym -// wavefront" has not yet reached the pass in question. For such work -// the recipe is to first call PropagateSymbolChangesBackToLoader(), -// then exexute the pass working with the loader, then call -// PropagateLoaderChangesToSymbols to copy the changes made by the -// pass back to the sym.Symbol world. -func (l *Loader) PropagateSymbolChangesBackToLoader() { - - // For the moment we only copy symbol values, and we don't touch - // any new sym.Symbols created since loadlibfull() was run. This - // seems to be what's needed for DWARF gen. - for i := Sym(1); i < Sym(len(l.objSyms)); i++ { - s := l.Syms[i] - if s != nil { - if s.Value != l.SymValue(i) { - l.SetSymValue(i, s.Value) - } - } - } -} - -// PropagateLoaderChangesToSymbols is a temporary shim function that -// takes a list of loader.Sym symbols and works to copy their contents -// and attributes over to a corresponding sym.Symbol. The parameter -// anonVerReplacement specifies a version number for any new anonymous -// symbols encountered on the list, when creating sym.Symbols for them -// (or zero if we don't expect to encounter any new anon symbols). See -// the PropagateSymbolChangesBackToLoader header comment for more -// info. -// -// WARNING: this function is brittle and depends heavily on loader -// implementation. A key problem with doing this is that as things -// stand at the moment, some sym.Symbol contents/attributes are -// populated only when converting from loader.Sym to sym.Symbol in -// loadlibfull, meaning we may wipe out some information when copying -// back. - -func (l *Loader) PropagateLoaderChangesToSymbols(toconvert []Sym, anonVerReplacement int) []*sym.Symbol { - - result := []*sym.Symbol{} - relocfixup := []Sym{} - - // Note: this loop needs to allow for the possibility that we may - // see "new" symbols on the 'toconvert' list that come from object - // files (for example, DWARF location lists), as opposed to just - // newly manufactured symbols (ex: DWARF section symbols such as - // ".debug_info"). This means that we have to be careful not to - // stomp on sym.Symbol attributes/content that was set up in - // in loadlibfull(). - - // Also note that in order for the relocation fixup to work, we - // have to do this in two passes -- one pass to create the symbols, - // and then a second fix up the relocations once all necessary - // sym.Symbols are created. - - // First pass, symbol creation and symbol data fixup. - for _, cand := range toconvert { - - sn := l.SymName(cand) - sv := l.SymVersion(cand) - st := l.SymType(cand) - if sv < 0 { - if anonVerReplacement == 0 { - panic("expected valid anon version replacement") - } - sv = anonVerReplacement - } - - s := l.Syms[cand] - - isnew := false - if sn == "" { - // Don't install anonymous symbols in the lookup tab. - if s == nil { - s = l.allocSym(sn, sv) - l.installSym(cand, s) - } - isnew = true - } else { - if s != nil { - // Already have a symbol for this -- it must be - // something that was previously processed by - // loadObjFull. Note that the symbol in question may - // or may not be in the name lookup map. - } else { - isnew = true - s = l.SymLookup(sn, sv) - } - } - result = append(result, s) - - // Always copy these from new to old. - s.Value = l.SymValue(cand) - s.Type = st - - // If the data for a symbol has increased in size, make sure - // we bring the new content across. - relfix := isnew - if isnew || len(l.Data(cand)) > len(s.P) { - s.P = l.Data(cand) - s.Size = int64(len(s.P)) - relfix = true - } - - // For 'new' symbols, copy other content. - if relfix { - relocfixup = append(relocfixup, cand) - } - - // If new symbol, call a helper to migrate attributes. - // Otherwise touch only not-in-symbol-table, since there are - // some attrs that are only set up at the point where we - // convert loader.Sym to sym.Symbol. - if isnew { - l.migrateAttributes(cand, s) - } else { - if l.AttrNotInSymbolTable(cand) { - s.Attr.Set(sym.AttrNotInSymbolTable, true) - } - } - } - - // Second pass to fix up relocations. - for _, cand := range relocfixup { - s := l.Syms[cand] - relocs := l.Relocs(cand) - if len(s.R) != relocs.Count() { - s.R = make([]sym.Reloc, relocs.Count()) - } - l.convertRelocations(cand, &relocs, s, true) - } - - return result -} - // ExtractSymbols grabs the symbols out of the loader for work that hasn't been // ported to the new symbol type. func (l *Loader) ExtractSymbols(syms *sym.Symbols) { -- GitLab From ce36e7f79ee4abde0e3c2be4bd3cb069469c3bd5 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 12 May 2020 20:08:27 -0400 Subject: [PATCH 0028/1792] [dev.link] cmd/internal/goobj2, cmd/link: change data type for local object/index representation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use uint32 consistently for local index (this is what the object file uses). Use a index, instead of a pointer, to refer to the object file. This reduces memory usage and GC work. This reduces some allocations. Linking cmd/compile, name old alloc/op new alloc/op delta Loadlib_GC 19.9MB ± 0% 16.9MB ± 0% -15.33% (p=0.008 n=5+5) name old live-B new live-B delta Loadlib_GC 12.6M ± 0% 11.3M ± 0% -9.97% (p=0.008 n=5+5) Change-Id: I20ce60bbb6d31abd2e9e932bdf959e2ae840ab98 Reviewed-on: https://go-review.googlesource.com/c/go/+/233779 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/internal/goobj/readnew.go | 20 ++--- src/cmd/internal/goobj2/objfile.go | 36 ++++----- src/cmd/link/internal/loader/loader.go | 86 +++++++++++---------- src/cmd/link/internal/loader/loader_test.go | 2 +- 4 files changed, 76 insertions(+), 68 deletions(-) diff --git a/src/cmd/internal/goobj/readnew.go b/src/cmd/internal/goobj/readnew.go index 3e710576b6..43f0fdabed 100644 --- a/src/cmd/internal/goobj/readnew.go +++ b/src/cmd/internal/goobj/readnew.go @@ -43,7 +43,7 @@ func (r *objReader) readNew() { } resolveSymRef := func(s goobj2.SymRef) SymID { - var i int + var i uint32 switch p := s.PkgIdx; p { case goobj2.PkgIdxInvalid: if s.SymIdx != 0 { @@ -51,12 +51,12 @@ func (r *objReader) readNew() { } return SymID{} case goobj2.PkgIdxNone: - i = int(s.SymIdx) + rr.NSym() + i = s.SymIdx + uint32(rr.NSym()) case goobj2.PkgIdxBuiltin: name, abi := goobj2.BuiltinName(int(s.SymIdx)) return SymID{name, int64(abi)} case goobj2.PkgIdxSelf: - i = int(s.SymIdx) + i = s.SymIdx default: // Symbol from other package, referenced by index. // We don't know the name. Use index. @@ -71,10 +71,10 @@ func (r *objReader) readNew() { // Symbols pcdataBase := start + rr.PcdataBase() - n := rr.NSym() + rr.NNonpkgdef() + rr.NNonpkgref() - npkgdef := rr.NSym() - ndef := rr.NSym() + rr.NNonpkgdef() - for i := 0; i < n; i++ { + n := uint32(rr.NSym() + rr.NNonpkgdef() + rr.NNonpkgref()) + npkgdef := uint32(rr.NSym()) + ndef := uint32(rr.NSym() + rr.NNonpkgdef()) + for i := uint32(0); i < n; i++ { osym := rr.Sym(i) if osym.Name(rr) == "" { continue // not a real symbol @@ -122,7 +122,7 @@ func (r *objReader) readNew() { } // Aux symbol info - isym := -1 + isym := ^uint32(0) funcdata := make([]goobj2.SymRef, 0, 4) auxs := rr.Auxs(i) for j := range auxs { @@ -134,7 +134,7 @@ func (r *objReader) readNew() { if a.Sym().PkgIdx != goobj2.PkgIdxSelf { panic("funcinfo symbol not defined in current package") } - isym = int(a.Sym().SymIdx) + isym = a.Sym().SymIdx case goobj2.AuxFuncdata: funcdata = append(funcdata, a.Sym()) case goobj2.AuxDwarfInfo, goobj2.AuxDwarfLoc, goobj2.AuxDwarfRanges, goobj2.AuxDwarfLines: @@ -145,7 +145,7 @@ func (r *objReader) readNew() { } // Symbol Info - if isym == -1 { + if isym == ^uint32(0) { continue } b := rr.BytesAt(rr.DataOff(isym), rr.DataSize(isym)) diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index ab07624563..fde482e079 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -578,83 +578,83 @@ func (r *Reader) NNonpkgref() int { } // SymOff returns the offset of the i-th symbol. -func (r *Reader) SymOff(i int) uint32 { +func (r *Reader) SymOff(i uint32) uint32 { return r.h.Offsets[BlkSymdef] + uint32(i*SymSize) } // Sym returns a pointer to the i-th symbol. -func (r *Reader) Sym(i int) *Sym { +func (r *Reader) Sym(i uint32) *Sym { off := r.SymOff(i) return (*Sym)(unsafe.Pointer(&r.b[off])) } // NReloc returns the number of relocations of the i-th symbol. -func (r *Reader) NReloc(i int) int { +func (r *Reader) NReloc(i uint32) int { relocIdxOff := r.h.Offsets[BlkRelocIdx] + uint32(i*4) return int(r.uint32At(relocIdxOff+4) - r.uint32At(relocIdxOff)) } // RelocOff returns the offset of the j-th relocation of the i-th symbol. -func (r *Reader) RelocOff(i int, j int) uint32 { +func (r *Reader) RelocOff(i uint32, j int) uint32 { relocIdxOff := r.h.Offsets[BlkRelocIdx] + uint32(i*4) relocIdx := r.uint32At(relocIdxOff) return r.h.Offsets[BlkReloc] + (relocIdx+uint32(j))*uint32(RelocSize) } // Reloc returns a pointer to the j-th relocation of the i-th symbol. -func (r *Reader) Reloc(i int, j int) *Reloc { +func (r *Reader) Reloc(i uint32, j int) *Reloc { off := r.RelocOff(i, j) return (*Reloc)(unsafe.Pointer(&r.b[off])) } // Relocs returns a pointer to the relocations of the i-th symbol. -func (r *Reader) Relocs(i int) []Reloc { +func (r *Reader) Relocs(i uint32) []Reloc { off := r.RelocOff(i, 0) n := r.NReloc(i) return (*[1 << 20]Reloc)(unsafe.Pointer(&r.b[off]))[:n:n] } // NAux returns the number of aux symbols of the i-th symbol. -func (r *Reader) NAux(i int) int { - auxIdxOff := r.h.Offsets[BlkAuxIdx] + uint32(i*4) +func (r *Reader) NAux(i uint32) int { + auxIdxOff := r.h.Offsets[BlkAuxIdx] + i*4 return int(r.uint32At(auxIdxOff+4) - r.uint32At(auxIdxOff)) } // AuxOff returns the offset of the j-th aux symbol of the i-th symbol. -func (r *Reader) AuxOff(i int, j int) uint32 { - auxIdxOff := r.h.Offsets[BlkAuxIdx] + uint32(i*4) +func (r *Reader) AuxOff(i uint32, j int) uint32 { + auxIdxOff := r.h.Offsets[BlkAuxIdx] + i*4 auxIdx := r.uint32At(auxIdxOff) return r.h.Offsets[BlkAux] + (auxIdx+uint32(j))*uint32(AuxSize) } // Aux returns a pointer to the j-th aux symbol of the i-th symbol. -func (r *Reader) Aux(i int, j int) *Aux { +func (r *Reader) Aux(i uint32, j int) *Aux { off := r.AuxOff(i, j) return (*Aux)(unsafe.Pointer(&r.b[off])) } // Auxs returns the aux symbols of the i-th symbol. -func (r *Reader) Auxs(i int) []Aux { +func (r *Reader) Auxs(i uint32) []Aux { off := r.AuxOff(i, 0) n := r.NAux(i) return (*[1 << 20]Aux)(unsafe.Pointer(&r.b[off]))[:n:n] } // DataOff returns the offset of the i-th symbol's data. -func (r *Reader) DataOff(i int) uint32 { - dataIdxOff := r.h.Offsets[BlkDataIdx] + uint32(i*4) +func (r *Reader) DataOff(i uint32) uint32 { + dataIdxOff := r.h.Offsets[BlkDataIdx] + i*4 return r.h.Offsets[BlkData] + r.uint32At(dataIdxOff) } // DataSize returns the size of the i-th symbol's data. -func (r *Reader) DataSize(i int) int { - dataIdxOff := r.h.Offsets[BlkDataIdx] + uint32(i*4) +func (r *Reader) DataSize(i uint32) int { + dataIdxOff := r.h.Offsets[BlkDataIdx] + i*4 return int(r.uint32At(dataIdxOff+4) - r.uint32At(dataIdxOff)) } // Data returns the i-th symbol's data. -func (r *Reader) Data(i int) []byte { - dataIdxOff := r.h.Offsets[BlkDataIdx] + uint32(i*4) +func (r *Reader) Data(i uint32) []byte { + dataIdxOff := r.h.Offsets[BlkDataIdx] + i*4 base := r.h.Offsets[BlkData] off := r.uint32At(dataIdxOff) end := r.uint32At(dataIdxOff + 4) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 8528170d3b..64952a3283 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -33,7 +33,7 @@ type Sym int type Relocs struct { rs []goobj2.Reloc - li int // local index of symbol whose relocs we're examining + li uint32 // local index of symbol whose relocs we're examining r *oReader // object reader for containing package l *Loader // loader } @@ -125,12 +125,12 @@ type objIdx struct { // objSym represents a symbol in an object file. It is a tuple of // the object and the symbol's local index. -// For external symbols, r is l.extReader, s is its index into the -// payload array. -// {nil, 0} represents the nil symbol. +// For external symbols, objidx is the index of l.extReader (extObj), +// s is its index into the payload array. +// {0, 0} represents the nil symbol. type objSym struct { - r *oReader - s int // local index + objidx uint32 // index of the object (in l.objs array) + s uint32 // local index } type nameVer struct { @@ -312,6 +312,13 @@ const ( nonPkgRef ) +// objidx +const ( + nilObj = iota + extObj + goObjStart +) + type elfsetstringFunc func(str string, off int) // extSymPayload holds the payload (data + relocations) for linker-synthesized @@ -335,11 +342,12 @@ const ( func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorReporter) *Loader { nbuiltin := goobj2.NBuiltin() + extReader := &oReader{objidx: extObj} ldr := &Loader{ start: make(map[*oReader]Sym), - objs: []objIdx{{}}, // reserve index 0 for nil symbol - objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol - extReader: &oReader{}, + objs: []objIdx{{}, {extReader, 0}}, // reserve index 0 for nil symbol, 1 for external symbols + objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol + extReader: extReader, symsByName: [2]map[string]Sym{make(map[string]Sym, 100000), make(map[string]Sym, 50000)}, // preallocate ~2MB for ABI0 and ~1MB for ABI1 symbols objByPkg: make(map[string]*oReader), outer: make(map[Sym]Sym), @@ -389,13 +397,13 @@ func (l *Loader) addObj(pkg string, r *oReader) Sym { // Add a symbol from an object file, return the global index and whether it is added. // If the symbol already exist, it returns the index of that symbol. -func (l *Loader) AddSym(name string, ver int, r *oReader, li int, kind int, dupok bool, typ sym.SymKind) (Sym, bool) { +func (l *Loader) AddSym(name string, ver int, r *oReader, li uint32, kind int, dupok bool, typ sym.SymKind) (Sym, bool) { if l.extStart != 0 { panic("AddSym called after external symbol is created") } i := Sym(len(l.objSyms)) addToGlobal := func() { - l.objSyms = append(l.objSyms, objSym{r, li}) + l.objSyms = append(l.objSyms, objSym{r.objidx, li}) } if name == "" { addToGlobal() @@ -445,7 +453,7 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li int, kind int, dupo if !(oldtyp.IsData() && oldr.DataSize(oldli) == 0) { log.Fatalf("duplicated definition of symbol " + name) } - l.objSyms[oldi] = objSym{r, li} + l.objSyms[oldi] = objSym{r.objidx, li} } else { // old symbol overwrites new symbol. if !typ.IsData() { // only allow overwriting data symbol @@ -465,7 +473,7 @@ func (l *Loader) newExtSym(name string, ver int) Sym { l.growValues(int(i) + 1) l.growAttrBitmaps(int(i) + 1) pi := l.newPayload(name, ver) - l.objSyms = append(l.objSyms, objSym{l.extReader, int(pi)}) + l.objSyms = append(l.objSyms, objSym{l.extReader.objidx, uint32(pi)}) l.extReader.syms = append(l.extReader.syms, i) return i } @@ -566,13 +574,13 @@ func (l *Loader) growSyms(i int) { } // Convert a local index to a global index. -func (l *Loader) toGlobal(r *oReader, i int) Sym { +func (l *Loader) toGlobal(r *oReader, i uint32) Sym { return r.syms[i] } // Convert a global index to a local index. -func (l *Loader) toLocal(i Sym) (*oReader, int) { - return l.objSyms[i].r, int(l.objSyms[i].s) +func (l *Loader) toLocal(i Sym) (*oReader, uint32) { + return l.objs[l.objSyms[i].objidx].r, l.objSyms[i].s } // Resolve a local symbol reference. Return global index. @@ -605,7 +613,7 @@ func (l *Loader) resolve(r *oReader, s goobj2.SymRef) Sym { log.Fatalf("reference of nonexisted package %s, from %v", pkg, r.unit.Lib) } } - return l.toGlobal(rr, int(s.SymIdx)) + return l.toGlobal(rr, s.SymIdx) } // Look up a symbol by name, return global index, or 0 if not found. @@ -619,7 +627,7 @@ func (l *Loader) Lookup(name string, ver int) Sym { } // Check that duplicate symbols have same contents. -func (l *Loader) checkdup(name string, r *oReader, li int, dup Sym) { +func (l *Loader) checkdup(name string, r *oReader, li uint32, dup Sym) { p := r.Data(li) rdup, ldup := l.toLocal(dup) pdup := rdup.Data(ldup) @@ -1417,7 +1425,7 @@ func (l *Loader) SymGoType(i Sym) Sym { r = l.objs[pp.objidx].r auxs = pp.auxs } else { - var li int + var li uint32 r, li = l.toLocal(i) auxs = r.Auxs(li) } @@ -1703,7 +1711,7 @@ func (l *Loader) Relocs(i Sym) Relocs { } // Relocs returns a Relocs object given a local sym index and reader. -func (l *Loader) relocs(r *oReader, li int) Relocs { +func (l *Loader) relocs(r *oReader, li uint32) Relocs { var rs []goobj2.Reloc if l.isExtReader(r) { pp := l.payloads[li] @@ -1895,14 +1903,14 @@ func (l *Loader) FuncInfo(i Sym) FuncInfo { r = l.objs[pp.objidx].r auxs = pp.auxs } else { - var li int + var li uint32 r, li = l.toLocal(i) auxs = r.Auxs(li) } for j := range auxs { a := &auxs[j] if a.Type() == goobj2.AuxFuncInfo { - b := r.Data(int(a.Sym().SymIdx)) + b := r.Data(a.Sym().SymIdx) return FuncInfo{l, r, b, auxs, goobj2.FuncInfoLengths{}} } } @@ -1952,9 +1960,9 @@ func (l *Loader) Preload(syms *sym.Symbols, f *bio.Reader, lib *sym.Library, uni // Preload symbols of given kind from an object. func (l *Loader) preloadSyms(r *oReader, kind int) { - ndef := r.NSym() - nnonpkgdef := r.NNonpkgdef() - var start, end int + ndef := uint32(r.NSym()) + nnonpkgdef := uint32(r.NNonpkgdef()) + var start, end uint32 switch kind { case pkgDef: start = 0 @@ -1965,7 +1973,7 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { default: panic("preloadSyms: bad kind") } - l.growAttrBitmaps(len(l.objSyms) + end - start) + l.growAttrBitmaps(len(l.objSyms) + int(end-start)) for i := start; i < end; i++ { osym := r.Sym(i) name := strings.Replace(osym.Name(r.Reader), "\"\".", r.pkgprefix, -1) @@ -2005,18 +2013,18 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { // Add non-package symbols and references to external symbols (which are always // named). func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { - for _, o := range l.objs[1:] { + for _, o := range l.objs[goObjStart:] { l.preloadSyms(o.r, nonPkgDef) } - for _, o := range l.objs[1:] { + for _, o := range l.objs[goObjStart:] { loadObjRefs(l, o.r, arch) } l.values = make([]int64, l.NSym(), l.NSym()+1000) // +1000 make some room for external symbols } func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { - ndef := r.NSym() + r.NNonpkgdef() - for i, n := 0, r.NNonpkgref(); i < n; i++ { + ndef := uint32(r.NSym() + r.NNonpkgdef()) + for i, n := uint32(0), uint32(r.NNonpkgref()); i < n; i++ { osym := r.Sym(ndef + i) name := strings.Replace(osym.Name(r.Reader), "\"\".", r.pkgprefix, -1) v := abiToVer(osym.ABI(), r.version) @@ -2084,7 +2092,7 @@ func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols, needReloc, needExtR } nr := 0 // total number of sym.Reloc's we'll need - for _, o := range l.objs[1:] { + for _, o := range l.objs[goObjStart:] { nr += loadObjSyms(l, syms, o.r, needReloc, needExtReloc) } @@ -2152,7 +2160,7 @@ func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols, needReloc, needExtR } // load contents of defined symbols - for _, o := range l.objs[1:] { + for _, o := range l.objs[goObjStart:] { loadObjFull(l, o.r, needReloc, needExtReloc) } @@ -2356,7 +2364,7 @@ func topLevelSym(sname string, skind sym.SymKind) bool { // number of sym.Reloc entries required for all the new symbols. func loadObjSyms(l *Loader, syms *sym.Symbols, r *oReader, needReloc, needExtReloc bool) int { nr := 0 - for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ { + for i, n := uint32(0), uint32(r.NSym()+r.NNonpkgdef()); i < n; i++ { gi := r.syms[i] if r2, i2 := l.toLocal(gi); r2 != r || i2 != i { continue // come from a different object @@ -2423,7 +2431,7 @@ func (l *Loader) cloneToExternal(symIdx Sym) { // If this is a def, then copy the guts. We expect this case // to be very rare (one case it may come up is with -X). - if li < (r.NSym() + r.NNonpkgdef()) { + if li < uint32(r.NSym()+r.NNonpkgdef()) { // Copy relocations relocs := l.Relocs(symIdx) @@ -2449,7 +2457,7 @@ func (l *Loader) cloneToExternal(symIdx Sym) { // Install new payload to global index space. // (This needs to happen at the end, as the accessors above // need to access the old symbol content.) - l.objSyms[symIdx] = objSym{l.extReader, pi} + l.objSyms[symIdx] = objSym{l.extReader.objidx, uint32(pi)} l.extReader.syms = append(l.extReader.syms, symIdx) } @@ -2587,7 +2595,7 @@ func (l *Loader) FreeSym(i Sym) { } func loadObjFull(l *Loader, r *oReader, needReloc, needExtReloc bool) { - for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ { + for i, n := uint32(0), uint32(r.NSym()+r.NNonpkgdef()); i < n; i++ { // A symbol may be a dup or overwritten. In this case, its // content will actually be provided by a different object // (to which its global index points). Skip those symbols. @@ -2814,10 +2822,10 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts // Walk through all text symbols from Go object files and append // them to their corresponding library's textp2 list. - for _, o := range l.objs[1:] { + for _, o := range l.objs[goObjStart:] { r := o.r lib := r.unit.Lib - for i, n := 0, r.NSym()+r.NNonpkgdef(); i < n; i++ { + for i, n := uint32(0), uint32(r.NSym()+r.NNonpkgdef()); i < n; i++ { gi := l.toGlobal(r, i) if !l.attrReachable.Has(gi) { continue @@ -2920,7 +2928,7 @@ func (l *Loader) Errorf(s Sym, format string, args ...interface{}) { // For debugging. func (l *Loader) Dump() { fmt.Println("objs") - for _, obj := range l.objs { + for _, obj := range l.objs[goObjStart:] { if obj.r != nil { fmt.Println(obj.i, obj.r.unit.Lib) } diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index dfaad6e0d2..3213ad5203 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -19,7 +19,7 @@ import ( // do anything interesting with this symbol (such as look at its // data or relocations). func addDummyObjSym(t *testing.T, ldr *Loader, or *oReader, name string) Sym { - idx := len(ldr.objSyms) + idx := uint32(len(ldr.objSyms)) s, ok := ldr.AddSym(name, 0, or, idx, nonPkgDef, false, sym.SRODATA) if !ok { t.Errorf("AddrSym failed for '" + name + "'") -- GitLab From 9963add628eb48edb5fbaafef156ebb899ce32bf Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 14 May 2020 13:15:53 -0400 Subject: [PATCH 0029/1792] [dev.link] cmd/link: simplify field tracking support Currently, for the special field tracking symbol go.track.XXX, when they are reachable, we set its type to SCONST. There is no need to do that. Just leave it unset (as Sxxx). The symbol is done after this point. Change-Id: I966d80775008f7fb5d30fbc6b9e4a30ae8316b6c Reviewed-on: https://go-review.googlesource.com/c/go/+/233998 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/data.go | 6 +++--- src/cmd/link/internal/ld/go.go | 10 +++------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 7254d2b172..da96b36882 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -191,6 +191,9 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { st.err.Errorf(s, "invalid relocation %s: %d+%d not in [%d,%d)", rname, off, siz, 0, len(P)) continue } + if siz == 0 { // informational relocation - no work to do + continue + } var rst sym.SymKind if rs != 0 { @@ -218,9 +221,6 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { if rt >= objabi.ElfRelocOffset { continue } - if siz == 0 { // informational relocation - no work to do - continue - } // We need to be able to reference dynimport symbols when linking against // shared libraries, and Solaris, Darwin and AIX need it always diff --git a/src/cmd/link/internal/ld/go.go b/src/cmd/link/internal/ld/go.go index 9a63a3a0bb..c3c987dcae 100644 --- a/src/cmd/link/internal/ld/go.go +++ b/src/cmd/link/internal/ld/go.go @@ -351,19 +351,15 @@ func fieldtrack(arch *sys.Arch, l *loader.Loader) { var buf bytes.Buffer for i := loader.Sym(1); i < loader.Sym(l.NSym()); i++ { if name := l.SymName(i); strings.HasPrefix(name, "go.track.") { - bld := l.MakeSymbolUpdater(i) - bld.SetSpecial(true) - bld.SetNotInSymbolTable(true) - if bld.Reachable() { + if l.AttrReachable(i) { + l.SetAttrSpecial(i, true) + l.SetAttrNotInSymbolTable(i, true) buf.WriteString(name[9:]) for p := l.Reachparent[i]; p != 0; p = l.Reachparent[p] { buf.WriteString("\t") buf.WriteString(l.SymName(p)) } buf.WriteString("\n") - - bld.SetType(sym.SCONST) - bld.SetValue(0) } } } -- GitLab From ff1a2d02dcd2bf5b61ce15b62c20b471dc7868ef Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Mon, 11 May 2020 12:02:42 -0400 Subject: [PATCH 0030/1792] [dev.link] cmd/link: remove dependence on dodatastate on symalign2 Needed for xcoff. Change-Id: I17d4675a01651b799dfaef92644fdc8267996f10 Reviewed-on: https://go-review.googlesource.com/c/go/+/233339 Run-TryBot: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/data.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index da96b36882..2d975010e6 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1105,9 +1105,8 @@ func addinitarrdata(ctxt *Link, ldr *loader.Loader, s loader.Sym) { } // symalign returns the required alignment for the given symbol s. -func (state *dodataState) symalign2(s loader.Sym) int32 { +func symalign2(ldr *loader.Loader, s loader.Sym) int32 { min := int32(thearch.Minalign) - ldr := state.ctxt.loader align := ldr.SymAlign(s) if align >= min { return align @@ -1131,7 +1130,7 @@ func (state *dodataState) symalign2(s loader.Sym) int32 { } func aligndatsize2(state *dodataState, datsize int64, s loader.Sym) int64 { - return Rnd(datsize, int64(state.symalign2(s))) + return Rnd(datsize, int64(symalign2(state.ctxt.loader, s))) } const debugGCProg = false @@ -1549,7 +1548,7 @@ func (state *dodataState) allocateDataSectionForSym2(seg *sym.Segment, s loader. ldr := state.ctxt.loader sname := ldr.SymName(s) sect := addsection(ldr, state.ctxt.Arch, seg, sname, rwx) - sect.Align = state.symalign2(s) + sect.Align = symalign2(ldr, s) state.datsize = Rnd(state.datsize, int64(sect.Align)) sect.Vaddr = uint64(state.datsize) return sect @@ -2056,7 +2055,7 @@ func (state *dodataState) dodataSect2(ctxt *Link, symn sym.SymKind, syms []loade for k := range sl { s := sl[k].sym if s != head && s != tail { - align := state.symalign2(s) + align := symalign2(ldr, s) if maxAlign < align { maxAlign = align } -- GitLab From 4e03dac77c2a8f5c3a16fc2a66477f2140d8394b Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Mon, 11 May 2020 14:35:54 -0400 Subject: [PATCH 0031/1792] [dev.link] cmd/link: move xcoff to loader represenatation Change-Id: I5b260493ffd7945f665c466e892be18d81e7940a Reviewed-on: https://go-review.googlesource.com/c/go/+/233340 Run-TryBot: Jeremy Faller Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/data2.go | 36 --- src/cmd/link/internal/ld/lib.go | 9 +- src/cmd/link/internal/ld/main.go | 10 - src/cmd/link/internal/ld/xcoff.go | 348 ++++++++++++++++++----------- src/cmd/link/internal/ppc64/asm.go | 10 +- 5 files changed, 226 insertions(+), 187 deletions(-) delete mode 100644 src/cmd/link/internal/ld/data2.go diff --git a/src/cmd/link/internal/ld/data2.go b/src/cmd/link/internal/ld/data2.go deleted file mode 100644 index 0b3c6f01e1..0000000000 --- a/src/cmd/link/internal/ld/data2.go +++ /dev/null @@ -1,36 +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 ld - -import ( - "cmd/link/internal/sym" - "strings" -) - -// Temporary dumping around for sym.Symbol version of helper -// functions in dodata(), still being used for some archs/oses. -// FIXME: get rid of this file when dodata() is completely -// converted. - -// symalign returns the required alignment for the given symbol s. -func symalign(s *sym.Symbol) int32 { - min := int32(thearch.Minalign) - if s.Align >= min { - return s.Align - } else if s.Align != 0 { - return min - } - if strings.HasPrefix(s.Name, "go.string.") || strings.HasPrefix(s.Name, "type..namedata.") { - // String data is just bytes. - // If we align it, we waste a lot of space to padding. - return min - } - align := int32(thearch.Maxalign) - for int64(align) > s.Size && align > min { - align >>= 1 - } - s.Align = align - return align -} diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index e5378225dc..d3382b5252 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -273,7 +273,7 @@ type Arch struct { Gentext2 func(*Link, *loader.Loader) Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - Xcoffreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool + Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool // TLSIEtoLE converts a TLS Initial Executable relocation to // a TLS Local Executable relocation. @@ -2870,13 +2870,6 @@ func (ctxt *Link) loadlibfull(symGroupType []sym.SymKind, needReloc, needExtRelo } } -func symPkg(ctxt *Link, s *sym.Symbol) string { - if s == nil { - return "" - } - return ctxt.loader.SymPkg(loader.Sym(s.SymIdx)) -} - func ElfSymForReloc2(ctxt *Link, s loader.Sym) int32 { // If putelfsym created a local version of this symbol, use that in all // relocations. diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 465a765db8..bc170f9eb8 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -320,16 +320,6 @@ func Main(arch *sys.Arch, theArch Arch) { thearch.Asmb(ctxt, ctxt.loader) bench.Start("reloc") ctxt.reloc() - newasmb2 := ctxt.IsDarwin() || ctxt.IsWindows() || ctxt.IsWasm() || ctxt.IsPlan9() || ctxt.IsElf() - if !newasmb2 { - bench.Start("loadlibfull") - // We don't need relocations at this point. - needReloc := false - // On AMD64 ELF, we directly use the loader's ExtRelocs, so we don't - // need conversion. Otherwise we do. - needExtReloc := ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) - ctxt.loadlibfull(symGroupType, needReloc, needExtReloc) // XXX do it here for now - } bench.Start("Asmb2") thearch.Asmb2(ctxt, ctxt.loader) diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 96c5a58af5..506dde232f 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -10,6 +10,7 @@ import ( "cmd/link/internal/loader" "cmd/link/internal/sym" "encoding/binary" + "fmt" "io/ioutil" "math/bits" "path/filepath" @@ -359,7 +360,6 @@ type XcoffLdRel64 struct { // xcoffLoaderReloc holds information about a relocation made by the loader. type xcoffLoaderReloc struct { - sym *sym.Symbol sym2 loader.Sym roff int32 rtype uint16 @@ -616,13 +616,13 @@ func (f *xcoffFile) addSymbol(sym xcoffSym) { } // xcoffAlign returns the log base 2 of the symbol's alignment. -func xcoffAlign(x *sym.Symbol, t SymbolType) uint8 { - align := x.Align +func xcoffAlign(ldr *loader.Loader, x loader.Sym, t SymbolType) uint8 { + align := ldr.SymAlign(x) if align == 0 { if t == TextSym { align = int32(Funcalign) } else { - align = symalign(x) + align = symalign2(ldr, x) } } return logBase2(int(align)) @@ -642,6 +642,7 @@ func logBase2(a int) uint8 { // Currently, a new file is in fact a new package. It seems to be OK, but it might change // in the future. func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint64, extnum int16) { + ldr := ctxt.loader /* C_FILE */ s := &XcoffSymEnt64{ Noffset: uint32(f.stringTable.add(".file")), @@ -670,8 +671,7 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 dwsize = getDwsectCUSize(sect.Name, name) // .debug_abbrev is common to all packages and not found with the previous function if sect.Name == ".debug_abbrev" { - s := ctxt.Syms.ROLookup(sect.Name, 0) - dwsize = uint64(s.Size) + dwsize = uint64(ldr.SymSize(loader.Sym(sect.Sym2))) } } else { @@ -693,8 +693,7 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 // Dwarf relocations need the symbol number of .dw* symbols. // It doesn't need to know it for each package, one is enough. // currSymSrcFile.csectAux == nil means first package. - dws := ctxt.Syms.Lookup(sect.Name, 0) - dws.Dynid = int32(f.symbolCount) + ldr.SetSymDynid(loader.Sym(sect.Sym2), int32(f.symbolCount)) if sect.Name == ".debug_frame" && ctxt.LinkMode != LinkExternal { // CIE size must be added to the first package. @@ -774,28 +773,30 @@ func (f *xcoffFile) updatePreviousFile(ctxt *Link, last bool) { // Write symbol representing a .text function. // The symbol table is split with C_FILE corresponding to each package // and not to each source file as it should be. -func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { +func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x loader.Sym) []xcoffSym { // New XCOFF symbols which will be written. syms := []xcoffSym{} // Check if a new file is detected. - if strings.Contains(x.Name, "-tramp") || strings.HasPrefix(x.Name, "runtime.text.") { + ldr := ctxt.loader + name := ldr.SymName(x) + if strings.Contains(name, "-tramp") || strings.HasPrefix(name, "runtime.text.") { // Trampoline don't have a FILE so there are considered // in the current file. // Same goes for runtime.text.X symbols. - } else if symPkg(ctxt, x) == "" { // Undefined global symbol + } else if ldr.SymPkg(x) == "" { // Undefined global symbol // If this happens, the algorithm must be redone. if currSymSrcFile.name != "" { Exitf("undefined global symbol found inside another file") } } else { // Current file has changed. New C_FILE, C_DWARF, etc must be generated. - if currSymSrcFile.name != symPkg(ctxt, x) { + if currSymSrcFile.name != ldr.SymPkg(x) { if ctxt.LinkMode == LinkInternal { // update previous file values xfile.updatePreviousFile(ctxt, false) - currSymSrcFile.name = symPkg(ctxt, x) - f.writeSymbolNewFile(ctxt, symPkg(ctxt, x), uint64(x.Value), xfile.getXCOFFscnum(x.Sect)) + currSymSrcFile.name = ldr.SymPkg(x) + f.writeSymbolNewFile(ctxt, ldr.SymPkg(x), uint64(ldr.SymValue(x)), xfile.getXCOFFscnum(ldr.SymSect(x))) } else { // With external linking, ld will crash if there is several // .FILE and DWARF debugging enable, somewhere during @@ -805,8 +806,8 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { // TODO(aix); remove once ld has been fixed or the triggering // relocation has been found and fixed. if currSymSrcFile.name == "" { - currSymSrcFile.name = symPkg(ctxt, x) - f.writeSymbolNewFile(ctxt, "go_functions", uint64(x.Value), xfile.getXCOFFscnum(x.Sect)) + currSymSrcFile.name = ldr.SymPkg(x) + f.writeSymbolNewFile(ctxt, "go_functions", uint64(ldr.SymValue(x)), xfile.getXCOFFscnum(ldr.SymSect(x))) } } @@ -815,26 +816,26 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { s := &XcoffSymEnt64{ Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(x.Extname())), - Nvalue: uint64(x.Value), - Nscnum: f.getXCOFFscnum(x.Sect), + Noffset: uint32(xfile.stringTable.add(ldr.SymExtname(x))), + Nvalue: uint64(ldr.SymValue(x)), + Nscnum: f.getXCOFFscnum(ldr.SymSect(x)), Ntype: SYM_TYPE_FUNC, Nnumaux: 2, } - if x.Version != 0 || x.Attr.VisibilityHidden() || x.Attr.Local() { + if ldr.SymVersion(x) != 0 || ldr.AttrVisibilityHidden(x) || ldr.AttrLocal(x) { s.Nsclass = C_HIDEXT } - x.Dynid = int32(xfile.symbolCount) + ldr.SetSymDynid(x, int32(xfile.symbolCount)) syms = append(syms, s) // Update current csect size - currSymSrcFile.csectSize += x.Size + currSymSrcFile.csectSize += ldr.SymSize(x) // create auxiliary entries a2 := &XcoffAuxFcn64{ - Xfsize: uint32(x.Size), + Xfsize: uint32(ldr.SymSize(x)), Xlnnoptr: 0, // TODO Xendndx: xfile.symbolCount + 3, // this symbol + 2 aux entries Xauxtype: _AUX_FCN, @@ -848,44 +849,49 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { Xsmtyp: XTY_LD, // label definition (based on C) Xauxtype: _AUX_CSECT, } - a4.Xsmtyp |= uint8(xcoffAlign(x, TextSym) << 3) + a4.Xsmtyp |= uint8(xcoffAlign(ldr, x, TextSym) << 3) syms = append(syms, a4) return syms } // put function used by genasmsym to write symbol table -func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) { - +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 syms := []xcoffSym{} + ldr := ctxt.loader + name := ldr.SymName(x) + if t == UndefinedSym { + name = ldr.SymExtname(x) + } + switch t { default: return case TextSym: - if symPkg(ctxt, x) != "" || strings.Contains(x.Name, "-tramp") || strings.HasPrefix(x.Name, "runtime.text.") { + if ldr.SymPkg(x) != "" || strings.Contains(name, "-tramp") || strings.HasPrefix(name, "runtime.text.") { // Function within a file syms = xfile.writeSymbolFunc(ctxt, x) } else { // Only runtime.text and runtime.etext come through this way - if x.Name != "runtime.text" && x.Name != "runtime.etext" && x.Name != "go.buildid" { - Exitf("putaixsym: unknown text symbol %s", x.Name) + if name != "runtime.text" && name != "runtime.etext" && name != "go.buildid" { + Exitf("putaixsym: unknown text symbol %s", name) } s := &XcoffSymEnt64{ Nsclass: C_HIDEXT, - Noffset: uint32(xfile.stringTable.add(str)), - Nvalue: uint64(x.Value), - Nscnum: xfile.getXCOFFscnum(x.Sect), + Noffset: uint32(xfile.stringTable.add(name)), + Nvalue: uint64(ldr.SymValue(x)), + Nscnum: xfile.getXCOFFscnum(ldr.SymSect(x)), Ntype: SYM_TYPE_FUNC, Nnumaux: 1, } - x.Dynid = int32(xfile.symbolCount) + ldr.SetSymDynid(x, int32(xfile.symbolCount)) syms = append(syms, s) - size := uint64(x.Size) + size := uint64(ldr.SymSize(x)) a4 := &XcoffAuxCSect64{ Xauxtype: _AUX_CSECT, Xscnlenlo: uint32(size & 0xFFFFFFFF), @@ -893,21 +899,20 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) Xsmclas: XMC_PR, Xsmtyp: XTY_SD, } - a4.Xsmtyp |= uint8(xcoffAlign(x, TextSym) << 3) + a4.Xsmtyp |= uint8(xcoffAlign(ldr, x, TextSym) << 3) syms = append(syms, a4) - } case DataSym, BSSSym: s := &XcoffSymEnt64{ Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(str)), - Nvalue: uint64(x.Value), - Nscnum: xfile.getXCOFFscnum(x.Sect), + Noffset: uint32(xfile.stringTable.add(name)), + Nvalue: uint64(ldr.SymValue(x)), + Nscnum: xfile.getXCOFFscnum(ldr.SymSect(x)), Nnumaux: 1, } - if x.Version != 0 || x.Attr.VisibilityHidden() || x.Attr.Local() { + if ldr.SymVersion(x) != 0 || ldr.AttrVisibilityHidden(x) || ldr.AttrLocal(x) { // There is more symbols in the case of a global data // which are related to the assembly generated // to access such symbols. @@ -917,7 +922,7 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) s.Nsclass = C_HIDEXT } - x.Dynid = int32(xfile.symbolCount) + ldr.SetSymDynid(x, int32(xfile.symbolCount)) syms = append(syms, s) // Create auxiliary entry @@ -926,15 +931,15 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) // the data and bss symbols of one file/package. // However, it's easier to just have a csect for each symbol. // It might change - size := uint64(x.Size) + size := uint64(ldr.SymSize(x)) a4 := &XcoffAuxCSect64{ Xauxtype: _AUX_CSECT, Xscnlenlo: uint32(size & 0xFFFFFFFF), Xscnlenhi: uint32(size >> 32), } - if x.Type >= sym.STYPE && x.Type <= sym.SPCLNTAB { - if ctxt.LinkMode == LinkExternal && strings.HasPrefix(x.Sect.Name, ".data.rel.ro") { + if ty := ldr.SymType(x); ty >= sym.STYPE && ty <= sym.SPCLNTAB { + if ctxt.IsExternal() && strings.HasPrefix(ldr.SymSect(x).Name, ".data.rel.ro") { // During external linking, read-only datas with relocation // must be in .data. a4.Xsmclas = XMC_RW @@ -942,9 +947,9 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) // Read only data a4.Xsmclas = XMC_RO } - } else if x.Type == sym.SDATA && strings.HasPrefix(x.Name, "TOC.") && ctxt.LinkMode == LinkExternal { + } else if /*ty == sym.SDATA &&*/ strings.HasPrefix(ldr.SymName(x), "TOC.") && ctxt.IsExternal() { a4.Xsmclas = XMC_TC - } else if x.Name == "TOC" { + } else if ldr.SymName(x) == "TOC" { a4.Xsmclas = XMC_TC0 } else { a4.Xsmclas = XMC_RW @@ -955,20 +960,20 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) a4.Xsmtyp |= XTY_CM } - a4.Xsmtyp |= uint8(xcoffAlign(x, t) << 3) + a4.Xsmtyp |= uint8(xcoffAlign(ldr, x, t) << 3) syms = append(syms, a4) case UndefinedSym: - if x.Type != sym.SDYNIMPORT && x.Type != sym.SHOSTOBJ && x.Type != sym.SUNDEFEXT { + if ty := ldr.SymType(x); ty != sym.SDYNIMPORT && ty != sym.SHOSTOBJ && ty != sym.SUNDEFEXT { return } s := &XcoffSymEnt64{ Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(str)), + Noffset: uint32(xfile.stringTable.add(name)), Nnumaux: 1, } - x.Dynid = int32(xfile.symbolCount) + ldr.SetSymDynid(x, int32(xfile.symbolCount)) syms = append(syms, s) a4 := &XcoffAuxCSect64{ @@ -977,7 +982,7 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) Xsmtyp: XTY_ER | XTY_IMP, } - if x.Name == "__n_pthreads" { + if ldr.SymName(x) == "__n_pthreads" { // Currently, all imported symbols made by cgo_import_dynamic are // syscall functions, except __n_pthreads which is a variable. // TODO(aix): Find a way to detect variables imported by cgo. @@ -989,16 +994,16 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) case TLSSym: s := &XcoffSymEnt64{ Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(str)), - Nscnum: xfile.getXCOFFscnum(x.Sect), - Nvalue: uint64(x.Value), + Noffset: uint32(xfile.stringTable.add(name)), + Nscnum: xfile.getXCOFFscnum(ldr.SymSect(x)), + Nvalue: uint64(ldr.SymValue(x)), Nnumaux: 1, } - x.Dynid = int32(xfile.symbolCount) + ldr.SetSymDynid(x, int32(xfile.symbolCount)) syms = append(syms, s) - size := uint64(x.Size) + size := uint64(ldr.SymSize(x)) a4 := &XcoffAuxCSect64{ Xauxtype: _AUX_CSECT, Xsmclas: XMC_UL, @@ -1019,18 +1024,114 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64) // It will be written in out file in Asmbxcoff, because it must be // at the very end, especially after relocation sections which needs symbols' index. func (f *xcoffFile) asmaixsym(ctxt *Link) { + ldr := ctxt.loader // Get correct size for symbols wrapping others symbols like go.string.* // sym.Size can be used directly as the symbols have already been written. for name, size := range outerSymSize { - sym := ctxt.Syms.ROLookup(name, 0) - if sym == nil { + sym := ldr.Lookup(name, 0) + if sym == 0 { Errorf(nil, "unknown outer symbol with name %s", name) } else { - sym.Size = size + s := ldr.MakeSymbolUpdater(sym) + s.SetSize(size) + } + } + + // These symbols won't show up in the first loop below because we + // skip sym.STEXT symbols. Normal sym.STEXT symbols are emitted by walking textp. + s := ldr.Lookup("runtime.text", 0) + if ldr.SymType(s) == sym.STEXT { + // We've already included this symbol in ctxt.Textp on AIX with external linker. + // See data.go:/textaddress + if !ctxt.IsExternal() { + putaixsym(ctxt, s, TextSym) + } + } + + n := 1 + // Generate base addresses for all text sections if there are multiple + for _, sect := range Segtext.Sections[1:] { + if sect.Name != ".text" || ctxt.IsExternal() { + // On AIX, runtime.text.X are symbols already in the symtab. + break + } + s = ldr.Lookup(fmt.Sprintf("runtime.text.%d", n), 0) + if s == 0 { + break + } + if ldr.SymType(s) == sym.STEXT { + putaixsym(ctxt, s, TextSym) } + n++ } - genasmsym(ctxt, putaixsym) + s = ldr.Lookup("runtime.etext", 0) + if ldr.SymType(s) == sym.STEXT { + // We've already included this symbol in ctxt.Textp + // on AIX with external linker. + // See data.go:/textaddress + if !ctxt.IsExternal() { + putaixsym(ctxt, s, TextSym) + } + } + + 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 + } + if (name == "" || name[0] == '.') && !ldr.IsFileLocal(s) && name != ".TOC." { + return false + } + return true + } + + for s, nsym := loader.Sym(1), loader.Sym(ldr.NSym()); s < nsym; s++ { + if !shouldBeInSymbolTable(s, ldr.SymName(s)) { + continue + } + st := ldr.SymType(s) + switch { + case st == sym.STLSBSS: + if ctxt.IsExternal() { + putaixsym(ctxt, s, TLSSym) + } + + case st == sym.SBSS, st == sym.SNOPTRBSS, st == sym.SLIBFUZZER_EXTRA_COUNTER: + if ldr.AttrReachable(s) { + data := ldr.Data(s) + if len(data) > 0 { + ldr.Errorf(s, "should not be bss (size=%d type=%v special=%v)", len(data), ldr.SymType(s), ldr.AttrSpecial(s)) + } + putaixsym(ctxt, s, BSSSym) + } + + case st >= sym.SELFRXSECT && st < sym.SXREF: // data sections handled in dodata + if ldr.AttrReachable(s) { + putaixsym(ctxt, s, DataSym) + } + + case st == sym.SUNDEFEXT: + putaixsym(ctxt, s, UndefinedSym) + + case st == sym.SDYNIMPORT: + if ldr.AttrReachable(s) { + putaixsym(ctxt, s, UndefinedSym) + } + } + } + + for _, s := range ctxt.Textp2 { + putaixsym(ctxt, s, TextSym) + } + + if ctxt.Debugvlog != 0 || *flagN { + ctxt.Logf("symsize = %d\n", uint32(Symsize)) + } xfile.updatePreviousFile(ctxt, true) } @@ -1264,6 +1365,7 @@ func (f *xcoffFile) writeLdrScn(ctxt *Link, globalOff uint64) { Lsymoff: LDHDRSZ_64, } + ldr := ctxt.loader /* Symbol table */ for _, s := range f.loaderSymbols { lds := &XcoffLdSym64{ @@ -1271,19 +1373,19 @@ func (f *xcoffFile) writeLdrScn(ctxt *Link, globalOff uint64) { Lsmtype: s.smtype, Lsmclas: s.smclas, } - sym := ctxt.loader.Syms[s.sym] + sym := s.sym switch s.smtype { default: - Errorf(sym, "unexpected loader symbol type: 0x%x", s.smtype) + ldr.Errorf(sym, "unexpected loader symbol type: 0x%x", s.smtype) case XTY_ENT | XTY_SD: - lds.Lvalue = uint64(sym.Value) - lds.Lscnum = f.getXCOFFscnum(sym.Sect) + lds.Lvalue = uint64(ldr.SymValue(sym)) + lds.Lscnum = f.getXCOFFscnum(ldr.SymSect(sym)) case XTY_IMP: - lds.Lifile = int32(f.dynLibraries[sym.Dynimplib()] + 1) + lds.Lifile = int32(f.dynLibraries[ldr.SymDynimplib(sym)] + 1) } ldstr := &XcoffLdStr64{ - size: uint16(len(sym.Name) + 1), // + null terminator - name: sym.Name, + size: uint16(len(ldr.SymName(sym)) + 1), // + null terminator + name: ldr.SymName(sym), } stlen += uint32(2 + ldstr.size) // 2 = sizeof ldstr.size symtab = append(symtab, lds) @@ -1296,11 +1398,11 @@ func (f *xcoffFile) writeLdrScn(ctxt *Link, globalOff uint64) { off := hdr.Lrldoff // current offset is the same of reloc offset /* Reloc */ - ep := ctxt.Syms.ROLookup(*flagEntrySymbol, 0) + ep := ldr.Lookup(*flagEntrySymbol, 0) xldr := &XcoffLdRel64{ - Lvaddr: uint64(ep.Value), + Lvaddr: uint64(ldr.SymValue(ep)), Lrtype: 0x3F00, - Lrsecnm: f.getXCOFFscnum(ep.Sect), + Lrsecnm: f.getXCOFFscnum(ldr.SymSect(ep)), Lsymndx: 0, } off += 16 @@ -1308,18 +1410,18 @@ func (f *xcoffFile) writeLdrScn(ctxt *Link, globalOff uint64) { off += uint64(16 * len(f.loaderReloc)) for _, r := range f.loaderReloc { - symp := r.sym - if symp == nil { - symp = ctxt.loader.Syms[r.sym2] + symp := r.sym2 + if symp == 0 { + panic("unexpected 0 sym value") } xldr = &XcoffLdRel64{ - Lvaddr: uint64(symp.Value + int64(r.roff)), + Lvaddr: uint64(ldr.SymValue(symp) + int64(r.roff)), Lrtype: r.rtype, Lsymndx: r.symndx, } - if symp.Sect != nil { - xldr.Lrsecnm = f.getXCOFFscnum(symp.Sect) + if ldr.SymSect(symp) != nil { + xldr.Lrsecnm = f.getXCOFFscnum(ldr.SymSect(symp)) } reloctab = append(reloctab, xldr) @@ -1416,6 +1518,7 @@ func (f *xcoffFile) writeFileHeader(ctxt *Link) { } if ctxt.BuildMode == BuildModeExe && ctxt.LinkMode == LinkInternal { + ldr := ctxt.loader f.xfhdr.Fopthdr = AOUTHSZ_EXEC64 f.xfhdr.Fflags = F_EXEC @@ -1423,12 +1526,12 @@ func (f *xcoffFile) writeFileHeader(ctxt *Link) { f.xahdr.Ovstamp = 1 // based on dump -o f.xahdr.Omagic = 0x10b copy(f.xahdr.Omodtype[:], "1L") - entry := ctxt.Syms.ROLookup(*flagEntrySymbol, 0) - f.xahdr.Oentry = uint64(entry.Value) - f.xahdr.Osnentry = f.getXCOFFscnum(entry.Sect) - toc := ctxt.Syms.ROLookup("TOC", 0) - f.xahdr.Otoc = uint64(toc.Value) - f.xahdr.Osntoc = f.getXCOFFscnum(toc.Sect) + entry := ldr.Lookup(*flagEntrySymbol, 0) + f.xahdr.Oentry = uint64(ldr.SymValue(entry)) + f.xahdr.Osnentry = f.getXCOFFscnum(ldr.SymSect(entry)) + toc := ldr.Lookup("TOC", 0) + f.xahdr.Otoc = uint64(ldr.SymValue(toc)) + f.xahdr.Osntoc = f.getXCOFFscnum(ldr.SymSect(toc)) f.xahdr.Oalgntext = int16(logBase2(int(Funcalign))) f.xahdr.Oalgndata = 0x5 @@ -1534,19 +1637,6 @@ func Asmbxcoff(ctxt *Link, fileoff int64) { xcoffwrite(ctxt) } -// byOffset is used to sort relocations by offset -type byOffset []sym.Reloc - -func (x byOffset) Len() int { return len(x) } - -func (x byOffset) Swap(i, j int) { - x[i], x[j] = x[j], x[i] -} - -func (x byOffset) Less(i, j int) bool { - return x[i].Off < x[j].Off -} - // emitRelocations emits relocation entries for go.o in external linking. func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { ctxt.Out.SeekSet(fileoff) @@ -1554,9 +1644,10 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { ctxt.Out.Write8(0) } + ldr := ctxt.loader // relocsect relocates symbols from first in section sect, and returns // the total number of relocations emitted. - relocsect := func(sect *sym.Section, syms []*sym.Symbol, base uint64) uint32 { + relocsect := func(sect *sym.Section, syms []loader.Sym, base uint64) uint32 { // ctxt.Logf("%s 0x%x\n", sect.Name, sect.Vaddr) // If main section has no bits, nothing to relocate. if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { @@ -1564,42 +1655,45 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { } sect.Reloff = uint64(ctxt.Out.Offset()) for i, s := range syms { - if !s.Attr.Reachable() { + if !ldr.AttrReachable(s) { continue } - if uint64(s.Value) >= sect.Vaddr { + if uint64(ldr.SymValue(s)) >= sect.Vaddr { syms = syms[i:] break } } eaddr := int64(sect.Vaddr + sect.Length) for _, s := range syms { - if !s.Attr.Reachable() { + if !ldr.AttrReachable(s) { continue } - if s.Value >= int64(eaddr) { + if ldr.SymValue(s) >= int64(eaddr) { break } - // Relocation must be ordered by address, so s.R is ordered by Off. - sort.Sort(byOffset(s.R)) - - for ri := range s.R { + // Relocation must be ordered by address, so create a list of sorted indices. + relocs := ldr.ExtRelocs(s) + sorted := make([]int, relocs.Count()) + for i := 0; i < relocs.Count(); i++ { + sorted[i] = i + } + sort.Slice(sorted, func(i, j int) bool { + return relocs.At(sorted[i]).Off() < relocs.At(sorted[j]).Off() + }) - r := &s.R[ri] + for _, ri := range sorted { + r := relocs.At(ri) - if r.Done { - continue - } - if r.Xsym == nil { - Errorf(s, "missing xsym in relocation") + if r.Xsym == 0 { + ldr.Errorf(s, "missing xsym in relocation") continue } - if r.Xsym.Dynid < 0 { - Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type.String(), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Xsym.Dynid) + if ldr.SymDynid(r.Xsym) < 0 { + ldr.Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymDynid(r.Xsym)) } - if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, s, r, int64(uint64(s.Value+int64(r.Off))-base)) { - Errorf(s, "unsupported obj reloc %d(%s)/%d to %s", r.Type, r.Type.String(), r.Siz, r.Sym.Name) + if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { + ldr.Errorf(s, "unsupported obj reloc %d(%s)/%d to %s", r.Type(), r.Type(), r.Siz(), ldr.SymName(r.Sym())) } } } @@ -1619,9 +1713,9 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { for _, seg := range s.segs { for _, sect := range seg.Sections { if sect.Name == ".text" { - n += relocsect(sect, ctxt.Textp, 0) + n += relocsect(sect, ctxt.Textp2, 0) } else { - n += relocsect(sect, ctxt.datap, 0) + n += relocsect(sect, ctxt.datap2, 0) } } } @@ -1631,9 +1725,9 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { dwarfLoop: for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] - si := dwarfp[i] - if si.secSym() != sect.Sym || - si.secSym().Sect != sect { + si := dwarfp2[i] + if si.secSym() != loader.Sym(sect.Sym2) || + ldr.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } for _, xcoffSect := range f.sections { @@ -1655,17 +1749,16 @@ func xcoffCreateExportFile(ctxt *Link) (fname string) { fname = filepath.Join(*flagTmpdir, "export_file.exp") var buf bytes.Buffer - for _, s := range ctxt.loader.Syms { - if s == nil { - continue - } - if !s.Attr.CgoExport() { + ldr := ctxt.loader + for s, nsym := loader.Sym(1), loader.Sym(ldr.NSym()); s < nsym; s++ { + if !ldr.AttrCgoExport(s) { continue } - if !strings.HasPrefix(s.Extname(), "._cgoexp_") { + extname := ldr.SymExtname(s) + if !strings.HasPrefix(extname, "._cgoexp_") { continue } - if s.Version != 0 { + if ldr.SymVersion(s) != 0 { continue // Only export version 0 symbols. See the comment in doxcoff. } @@ -1673,7 +1766,7 @@ func xcoffCreateExportFile(ctxt *Link) (fname string) { // exported by cgo. // The corresponding Go symbol is: // _cgoexp_hashcode_symname. - name := strings.SplitN(s.Extname(), "_", 4)[3] + name := strings.SplitN(extname, "_", 4)[3] buf.Write([]byte(name + "\n")) } @@ -1684,5 +1777,4 @@ func xcoffCreateExportFile(ctxt *Link) (fname string) { } return fname - } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 185d668db7..9e89b4b801 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -403,22 +403,22 @@ func addelfdynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s lo return false } -func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { +func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { rs := r.Xsym emitReloc := func(v uint16, off uint64) { out.Write64(uint64(sectoff) + off) - out.Write32(uint32(rs.Dynid)) + out.Write32(uint32(ldr.SymDynid(rs))) out.Write16(v) } var v uint16 - switch r.Type { + switch r.Type() { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: v = ld.XCOFF_R_POS - if r.Siz == 4 { + if r.Siz() == 4 { v |= 0x1F << 8 } else { v |= 0x3F << 8 @@ -431,7 +431,7 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se case objabi.R_POWER_TLS_LE: emitReloc(ld.XCOFF_R_TLS_LE|0x0F<<8, 2) case objabi.R_CALLPOWER: - if r.Siz != 4 { + if r.Siz() != 4 { return false } emitReloc(ld.XCOFF_R_RBR|0x19<<8, 0) -- GitLab From b97212d1f1a60b4b83e7f88be1cd9d336b627ae2 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 14 May 2020 16:05:29 -0400 Subject: [PATCH 0032/1792] [dev.link] cmd/link: delete sym.Symbol and sym.Reloc This deletes all sym.Symbol and sym.Reloc references. This is certainly not complete, and there are more cleanups to do. But I feel this makes a good first round. Change-Id: I7621d016957f7ef114be5f0606fcb3ad6aee71c8 Reviewed-on: https://go-review.googlesource.com/c/go/+/234097 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/amd64/asm.go | 8 - src/cmd/link/internal/ld/data.go | 17 +- src/cmd/link/internal/ld/dwarf2.go | 22 - src/cmd/link/internal/ld/errors.go | 45 -- src/cmd/link/internal/ld/go.go | 11 - src/cmd/link/internal/ld/lib.go | 382 +------------ src/cmd/link/internal/ld/link.go | 3 - src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/ld/util.go | 16 +- src/cmd/link/internal/loader/loader.go | 525 +----------------- src/cmd/link/internal/loader/loader_test.go | 4 +- src/cmd/link/internal/loader/symbolbuilder.go | 12 - src/cmd/link/internal/sym/compilation_unit.go | 5 - src/cmd/link/internal/sym/reloc.go | 54 -- src/cmd/link/internal/sym/segment.go | 1 - src/cmd/link/internal/sym/sizeof_test.go | 37 -- src/cmd/link/internal/sym/symbol.go | 395 ------------- src/cmd/link/internal/sym/symbols.go | 10 - 18 files changed, 34 insertions(+), 1515 deletions(-) delete mode 100644 src/cmd/link/internal/sym/sizeof_test.go diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 0b65d5dec4..4cc3efb57b 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -70,14 +70,6 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { o(0xc3) } -// makeWritable makes a readonly symbol writable if we do opcode rewriting. -func makeWritable(s *sym.Symbol) { - if s.Attr.ReadOnly() { - s.Attr.Set(sym.AttrReadOnly, false) - s.P = append([]byte(nil), s.P...) - } -} - func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { targ := r.Sym() var targType sym.SymKind diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 2d975010e6..3747dfd139 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -133,19 +133,6 @@ func FoldSubSymbolOffset(ldr *loader.Loader, s loader.Sym) (loader.Sym, int64) { return s, off } -// applyOuterToXAdd takes a relocation and updates the relocation's -// XAdd field to take into account the target syms's outer symbol (if -// applicable). -func ApplyOuterToXAdd(r *sym.Reloc) *sym.Symbol { - rs := r.Sym - r.Xadd = r.Add - if rs.Outer != nil { - r.Xadd += Symaddr(rs) - Symaddr(rs.Outer) - rs = rs.Outer - } - return rs -} - // relocsym resolve relocations in "s", updating the symbol's content // in "P". // The main loop walks through the list of relocations attached to "s" @@ -1359,8 +1346,6 @@ type dodataState struct { // Link context ctxt *Link // Data symbols bucketed by type. - data [sym.SXREF][]*sym.Symbol - // Data symbols bucketed by type. data2 [sym.SXREF][]loader.Sym // Max alignment for each flavor of data symbol. dataMaxAlign [sym.SXREF]int32 @@ -1740,7 +1725,7 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.end", 0), sect) // Coverage instrumentation counters for libfuzzer. - if len(state.data[sym.SLIBFUZZER_EXTRA_COUNTER]) > 0 { + if len(state.data2[sym.SLIBFUZZER_EXTRA_COUNTER]) > 0 { state.allocateNamedSectionAndAssignSyms2(&Segdata, "__libfuzzer_extra_counters", sym.SLIBFUZZER_EXTRA_COUNTER, sym.Sxxx, 06) } diff --git a/src/cmd/link/internal/ld/dwarf2.go b/src/cmd/link/internal/ld/dwarf2.go index 66f8aace0f..1848e89ec6 100644 --- a/src/cmd/link/internal/ld/dwarf2.go +++ b/src/cmd/link/internal/ld/dwarf2.go @@ -24,28 +24,6 @@ func isDwarf64(ctxt *Link) bool { return ctxt.HeadType == objabi.Haix } -// dwarfSecInfo2 is a replica of the dwarfSecInfo struct but with -// *sym.Symbol content instead of loader.Sym content. -type dwarfSecInfo2 struct { - syms []*sym.Symbol -} - -func (dsi *dwarfSecInfo2) secSym() *sym.Symbol { - if len(dsi.syms) == 0 { - return nil - } - return dsi.syms[0] -} - -func (dsi *dwarfSecInfo2) subSyms() []*sym.Symbol { - if len(dsi.syms) == 0 { - return []*sym.Symbol{} - } - return dsi.syms[1:] -} - -var dwarfp []dwarfSecInfo2 - /* * Elf. */ diff --git a/src/cmd/link/internal/ld/errors.go b/src/cmd/link/internal/ld/errors.go index c2c191d058..c5ce097fde 100644 --- a/src/cmd/link/internal/ld/errors.go +++ b/src/cmd/link/internal/ld/errors.go @@ -15,12 +15,6 @@ type unresolvedSymKey struct { to loader.Sym // Unresolved symbol referenced by "from" } -type unresolvedSymKey2 struct { - from *sym.Symbol // Symbol that referenced unresolved "to" - to *sym.Symbol // Unresolved symbol referenced by "from" -} - -type lookupFn func(name string, version int) *sym.Symbol type symNameFn func(s loader.Sym) string // ErrorReporter is used to make error reporting thread safe. @@ -28,9 +22,7 @@ type ErrorReporter struct { loader.ErrorReporter unresOnce sync.Once unresSyms map[unresolvedSymKey]bool - unresSyms2 map[unresolvedSymKey2]bool unresMutex sync.Mutex - lookup lookupFn SymName symNameFn } @@ -71,40 +63,3 @@ func (reporter *ErrorReporter) errorUnresolved(ldr *loader.Loader, s, rs loader. } } } - -// errorUnresolved2 prints unresolved symbol error for r.Sym that is referenced from s. -func (reporter *ErrorReporter) errorUnresolved2(s *sym.Symbol, r *sym.Reloc) { - reporter.unresOnce.Do(func() { reporter.unresSyms2 = make(map[unresolvedSymKey2]bool) }) - - k := unresolvedSymKey2{from: s, to: r.Sym} - reporter.unresMutex.Lock() - defer reporter.unresMutex.Unlock() - if !reporter.unresSyms2[k] { - reporter.unresSyms2[k] = true - - // Try to find symbol under another ABI. - var reqABI, haveABI obj.ABI - haveABI = ^obj.ABI(0) - reqABI, ok := sym.VersionToABI(int(r.Sym.Version)) - if ok { - for abi := obj.ABI(0); abi < obj.ABICount; abi++ { - v := sym.ABIToVersion(abi) - if v == -1 { - continue - } - if rs := reporter.lookup(r.Sym.Name, v); rs != nil && rs.Type != sym.Sxxx && rs.Type != sym.SXREF { - haveABI = abi - } - } - } - - // Give a special error message for main symbol (see #24809). - if r.Sym.Name == "main.main" { - Errorf(s, "function main is undeclared in the main package") - } else if haveABI != ^obj.ABI(0) { - Errorf(s, "relocation target %s not defined for %s (but is defined for %s)", r.Sym.Name, reqABI, haveABI) - } else { - Errorf(s, "relocation target %s not defined", r.Sym.Name) - } - } -} diff --git a/src/cmd/link/internal/ld/go.go b/src/cmd/link/internal/ld/go.go index c3c987dcae..d9030f4a01 100644 --- a/src/cmd/link/internal/ld/go.go +++ b/src/cmd/link/internal/ld/go.go @@ -27,17 +27,6 @@ func expandpkg(t0 string, pkg string) string { return strings.Replace(t0, `"".`, pkg+".", -1) } -func resolveABIAlias(s *sym.Symbol) *sym.Symbol { - if s.Type != sym.SABIALIAS { - return s - } - target := s.R[0].Sym - if target.Type == sym.SABIALIAS { - panic(fmt.Sprintf("ABI alias %s references another ABI alias %s", s, target)) - } - return target -} - // TODO: // generate debugging section in binary. // once the dust settles, try to move some code to diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d3382b5252..6d795cac69 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -94,38 +94,10 @@ import ( // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -type LookupFn func(name string, version int) *sym.Symbol - // ArchSyms holds a number of architecture specific symbols used during // relocation. Rather than allowing them universal access to all symbols, // we keep a subset for relocation application. type ArchSyms struct { - TOC *sym.Symbol - DotTOC []*sym.Symbol // for each version - - GOT *sym.Symbol - PLT *sym.Symbol - GOTPLT *sym.Symbol - - Tlsg *sym.Symbol - Tlsoffset int - - Dynamic *sym.Symbol - DynSym *sym.Symbol - DynStr *sym.Symbol - - // Elf specific - Rel *sym.Symbol - Rela *sym.Symbol - RelPLT *sym.Symbol - RelaPLT *sym.Symbol - - // Darwin symbols - LinkEditGOT *sym.Symbol - LinkEditPLT *sym.Symbol - - // ----- loader.Sym equivalents ----- - Rel2 loader.Sym Rela2 loader.Sym RelPLT2 loader.Sym @@ -141,7 +113,8 @@ type ArchSyms struct { PLT2 loader.Sym GOTPLT2 loader.Sym - Tlsg2 loader.Sym + Tlsg2 loader.Sym + Tlsoffset int Dynamic2 loader.Sym DynSym2 loader.Sym @@ -151,43 +124,30 @@ type ArchSyms struct { const BeforeLoadlibFull = 1 const AfterLoadlibFull = 2 -// mkArchSym is a helper for setArchSyms, invoked once before loadlibfull -// and once after. On the first call it creates a loader.Sym with the -// specified name, and on the second call a corresponding sym.Symbol. -func (ctxt *Link) mkArchSym(which int, name string, ver int, ls *loader.Sym, ss **sym.Symbol) { - if which == BeforeLoadlibFull { - *ls = ctxt.loader.LookupOrCreateSym(name, ver) - } else { - *ss = ctxt.loader.Syms[*ls] - } +// mkArchSym is a helper for setArchSyms, to set up a special symbol. +func (ctxt *Link) mkArchSym(name string, ver int, ls *loader.Sym) { + *ls = ctxt.loader.LookupOrCreateSym(name, ver) } // mkArchVecSym is similar to setArchSyms, but operates on elements within // a slice, where each element corresponds to some symbol version. -func (ctxt *Link) mkArchSymVec(which int, name string, ver int, ls []loader.Sym, ss []*sym.Symbol) { - if which == BeforeLoadlibFull { - ls[ver] = ctxt.loader.LookupOrCreateSym(name, ver) - } else if ls[ver] != 0 { - ss[ver] = ctxt.loader.Syms[ls[ver]] - } +func (ctxt *Link) mkArchSymVec(name string, ver int, ls []loader.Sym) { + ls[ver] = ctxt.loader.LookupOrCreateSym(name, ver) } // setArchSyms sets up the ArchSyms structure, and must be called before // relocations are applied. This function is invoked twice, once prior // to loadlibfull(), and once after the work of loadlibfull is complete. -func (ctxt *Link) setArchSyms(which int) { - if which != BeforeLoadlibFull && which != AfterLoadlibFull { - panic("internal error") - } - ctxt.mkArchSym(which, ".got", 0, &ctxt.GOT2, &ctxt.GOT) - ctxt.mkArchSym(which, ".plt", 0, &ctxt.PLT2, &ctxt.PLT) - ctxt.mkArchSym(which, ".got.plt", 0, &ctxt.GOTPLT2, &ctxt.GOTPLT) - ctxt.mkArchSym(which, ".dynamic", 0, &ctxt.Dynamic2, &ctxt.Dynamic) - ctxt.mkArchSym(which, ".dynsym", 0, &ctxt.DynSym2, &ctxt.DynSym) - ctxt.mkArchSym(which, ".dynstr", 0, &ctxt.DynStr2, &ctxt.DynStr) +func (ctxt *Link) setArchSyms() { + ctxt.mkArchSym(".got", 0, &ctxt.GOT2) + ctxt.mkArchSym(".plt", 0, &ctxt.PLT2) + ctxt.mkArchSym(".got.plt", 0, &ctxt.GOTPLT2) + ctxt.mkArchSym(".dynamic", 0, &ctxt.Dynamic2) + ctxt.mkArchSym(".dynsym", 0, &ctxt.DynSym2) + ctxt.mkArchSym(".dynstr", 0, &ctxt.DynStr2) if ctxt.IsPPC64() { - ctxt.mkArchSym(which, "TOC", 0, &ctxt.TOC2, &ctxt.TOC) + ctxt.mkArchSym("TOC", 0, &ctxt.TOC2) // NB: note the +2 below for DotTOC2 compared to the +1 for // DocTOC. This is because loadlibfull() creates an additional @@ -195,27 +155,23 @@ func (ctxt *Link) setArchSyms(which int) { // *sym.Symbol symbols. Symbols that are assigned this final // version are not going to have TOC references, so it should // be ok for them to inherit an invalid .TOC. symbol. - if which == BeforeLoadlibFull { - ctxt.DotTOC2 = make([]loader.Sym, ctxt.Syms.MaxVersion()+2) - } else { - ctxt.DotTOC = make([]*sym.Symbol, ctxt.Syms.MaxVersion()+1) - } + ctxt.DotTOC2 = make([]loader.Sym, ctxt.Syms.MaxVersion()+2) for i := 0; i <= ctxt.Syms.MaxVersion(); i++ { if i >= 2 && i < sym.SymVerStatic { // these versions are not used currently continue } - ctxt.mkArchSymVec(which, ".TOC.", i, ctxt.DotTOC2, ctxt.DotTOC) + ctxt.mkArchSymVec(".TOC.", i, ctxt.DotTOC2) } } if ctxt.IsElf() { - ctxt.mkArchSym(which, ".rel", 0, &ctxt.Rel2, &ctxt.Rel) - ctxt.mkArchSym(which, ".rela", 0, &ctxt.Rela2, &ctxt.Rela) - ctxt.mkArchSym(which, ".rel.plt", 0, &ctxt.RelPLT2, &ctxt.RelPLT) - ctxt.mkArchSym(which, ".rela.plt", 0, &ctxt.RelaPLT2, &ctxt.RelaPLT) + ctxt.mkArchSym(".rel", 0, &ctxt.Rel2) + ctxt.mkArchSym(".rela", 0, &ctxt.Rela2) + ctxt.mkArchSym(".rel.plt", 0, &ctxt.RelPLT2) + ctxt.mkArchSym(".rela.plt", 0, &ctxt.RelaPLT2) } if ctxt.IsDarwin() { - ctxt.mkArchSym(which, ".linkedit.got", 0, &ctxt.LinkEditGOT2, &ctxt.LinkEditGOT) - ctxt.mkArchSym(which, ".linkedit.plt", 0, &ctxt.LinkEditPLT2, &ctxt.LinkEditPLT) + ctxt.mkArchSym(".linkedit.got", 0, &ctxt.LinkEditGOT2) + ctxt.mkArchSym(".linkedit.plt", 0, &ctxt.LinkEditPLT2) } } @@ -317,7 +273,6 @@ func (ctxt *Link) CanUsePlugins() bool { } var ( - dynexp []*sym.Symbol dynlib []string ldflag []string havedynamic int @@ -636,15 +591,6 @@ func (ctxt *Link) loadlib() { strictDupMsgCount = ctxt.loader.NStrictDupMsgs() } -// genSymsForDynexp constructs a *sym.Symbol version of ctxt.dynexp, -// writing to the global variable 'dynexp'. -func genSymsForDynexp(ctxt *Link) { - dynexp = make([]*sym.Symbol, len(ctxt.dynexp2)) - for i, s := range ctxt.dynexp2 { - dynexp[i] = ctxt.loader.Syms[s] - } -} - // setupdynexp constructs ctxt.dynexp, a list of loader.Sym. func setupdynexp(ctxt *Link) { dynexpMap := ctxt.cgo_export_dynamic @@ -2493,164 +2439,6 @@ const ( DeletedAutoSym = 'x' ) -func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int64)) { - // These symbols won't show up in the first loop below because we - // skip sym.STEXT symbols. Normal sym.STEXT symbols are emitted by walking textp. - s := ctxt.Syms.Lookup("runtime.text", 0) - if s.Type == sym.STEXT { - // We've already included this symbol in ctxt.Textp - // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin or - // on AIX with external linker. - // See data.go:/textaddress - if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) && !(ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - put(ctxt, s, s.Name, TextSym, s.Value) - } - } - - n := 0 - - // Generate base addresses for all text sections if there are multiple - for _, sect := range Segtext.Sections { - if n == 0 { - n++ - continue - } - if sect.Name != ".text" || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - // On AIX, runtime.text.X are symbols already in the symtab. - break - } - s = ctxt.Syms.ROLookup(fmt.Sprintf("runtime.text.%d", n), 0) - if s == nil { - break - } - if s.Type == sym.STEXT { - put(ctxt, s, s.Name, TextSym, s.Value) - } - n++ - } - - s = ctxt.Syms.Lookup("runtime.etext", 0) - if s.Type == sym.STEXT { - // We've already included this symbol in ctxt.Textp - // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin or - // on AIX with external linker. - // See data.go:/textaddress - if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) && !(ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { - put(ctxt, s, s.Name, TextSym, s.Value) - } - } - - shouldBeInSymbolTable := func(s *sym.Symbol) bool { - if s.Attr.NotInSymbolTable() { - return false - } - if ctxt.HeadType == objabi.Haix && s.Name == ".go.buildinfo" { - // On AIX, .go.buildinfo must be in the symbol table as - // it has relocations. - return true - } - if (s.Name == "" || s.Name[0] == '.') && !s.IsFileLocal() && s.Name != ".rathole" && s.Name != ".TOC." { - return false - } - return true - } - - for _, s := range ctxt.loader.Syms { - if s == nil { - continue - } - if !shouldBeInSymbolTable(s) { - continue - } - switch s.Type { - case sym.SCONST, - sym.SRODATA, - sym.SSYMTAB, - sym.SPCLNTAB, - sym.SINITARR, - sym.SDATA, - sym.SNOPTRDATA, - sym.SELFROSECT, - sym.SMACHOGOT, - sym.STYPE, - sym.SSTRING, - sym.SGOSTRING, - sym.SGOFUNC, - sym.SGCBITS, - sym.STYPERELRO, - sym.SSTRINGRELRO, - sym.SGOSTRINGRELRO, - sym.SGOFUNCRELRO, - sym.SGCBITSRELRO, - sym.SRODATARELRO, - sym.STYPELINK, - sym.SITABLINK, - sym.SWINDOWS: - if !s.Attr.Reachable() { - continue - } - put(ctxt, s, s.Name, DataSym, Symaddr(s)) - - case sym.SBSS, sym.SNOPTRBSS, sym.SLIBFUZZER_EXTRA_COUNTER: - if !s.Attr.Reachable() { - continue - } - if len(s.P) > 0 { - Errorf(s, "should not be bss (size=%d type=%v special=%v)", len(s.P), s.Type, s.Attr.Special()) - } - put(ctxt, s, s.Name, BSSSym, Symaddr(s)) - - case sym.SUNDEFEXT: - if ctxt.HeadType == objabi.Hwindows || ctxt.HeadType == objabi.Haix || ctxt.IsELF { - put(ctxt, s, s.Name, UndefinedSym, s.Value) - } - - case sym.SHOSTOBJ: - if !s.Attr.Reachable() { - continue - } - if ctxt.HeadType == objabi.Hwindows || ctxt.IsELF { - put(ctxt, s, s.Name, UndefinedSym, s.Value) - } - - case sym.SDYNIMPORT: - if !s.Attr.Reachable() { - continue - } - put(ctxt, s, s.Extname(), UndefinedSym, 0) - - case sym.STLSBSS: - if ctxt.LinkMode == LinkExternal { - put(ctxt, s, s.Name, TLSSym, Symaddr(s)) - } - } - } - - for _, s := range ctxt.Textp { - put(ctxt, s, s.Name, TextSym, s.Value) - } - - if ctxt.Debugvlog != 0 || *flagN { - ctxt.Logf("symsize = %d\n", uint32(Symsize)) - } -} - -func Symaddr(s *sym.Symbol) int64 { - if !s.Attr.Reachable() { - Errorf(s, "unreachable symbol in symaddr") - } - return s.Value -} - -func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) { - s := ctxt.Syms.Lookup(p, 0) - s.Type = t - s.Value = v - s.Attr |= sym.AttrReachable - s.Attr |= sym.AttrSpecial - s.Attr |= sym.AttrLocal -} - func (ctxt *Link) xdefine2(p string, t sym.SymKind, v int64) { ldr := ctxt.loader s := ldr.CreateSymForUpdate(p, 0) @@ -2765,111 +2553,6 @@ func dfs(lib *sym.Library, mark map[*sym.Library]markKind, order *[]*sym.Library *order = append(*order, lib) } -// addToTextp populates the context Textp slice. -func addToTextp(ctxt *Link) { - // Set up ctxt.Textp, based on ctxt.Textp2. - textp := make([]*sym.Symbol, 0, len(ctxt.Textp2)) - haveshlibs := len(ctxt.Shlibs) > 0 - for _, tsym := range ctxt.Textp2 { - sp := ctxt.loader.Syms[tsym] - if sp == nil || !ctxt.loader.AttrReachable(tsym) { - panic("should never happen") - } - if haveshlibs && sp.Type == sym.SDYNIMPORT { - continue - } - textp = append(textp, sp) - } - ctxt.Textp = textp -} - -func (ctxt *Link) loadlibfull(symGroupType []sym.SymKind, needReloc, needExtReloc bool) { - - // Load full symbol contents, resolve indexed references. - ctxt.loader.LoadFull(ctxt.Arch, ctxt.Syms, needReloc, needExtReloc) - - // Convert ctxt.Moduledata2 to ctxt.Moduledata, etc - if ctxt.Moduledata2 != 0 { - ctxt.Moduledata = ctxt.loader.Syms[ctxt.Moduledata2] - ctxt.Tlsg = ctxt.loader.Syms[ctxt.Tlsg2] - } - - // Pull the symbols out. - ctxt.loader.ExtractSymbols(ctxt.Syms) - ctxt.lookup = ctxt.Syms.ROLookup - - // Recreate dynexp using *sym.Symbol instead of loader.Sym - genSymsForDynexp(ctxt) - - // Drop the cgodata reference. - ctxt.cgodata = nil - - addToTextp(ctxt) - - // Set special global symbols. - ctxt.setArchSyms(AfterLoadlibFull) - - // Populate dwarfp from dwarfp2. If we see a symbol index - // whose loader.Syms entry is nil, something went wrong. - for _, si := range dwarfp2 { - syms := make([]*sym.Symbol, 0, len(si.syms)) - for _, symIdx := range si.syms { - s := ctxt.loader.Syms[symIdx] - if s == nil { - panic(fmt.Sprintf("nil sym for dwarfp2 element %d", symIdx)) - } - s.Attr |= sym.AttrLocal - syms = append(syms, s) - } - dwarfp = append(dwarfp, dwarfSecInfo2{syms: syms}) - } - - // Populate datap from datap2 - ctxt.datap = make([]*sym.Symbol, len(ctxt.datap2)) - for i, symIdx := range ctxt.datap2 { - s := ctxt.loader.Syms[symIdx] - if s == nil { - panic(fmt.Sprintf("nil sym for datap2 element %d", symIdx)) - } - ctxt.datap[i] = s - } - - // Populate the sym.Section 'Sym' fields based on their 'Sym2' - // fields. - allSegments := []*sym.Segment{&Segtext, &Segrodata, &Segrelrodata, &Segdata, &Segdwarf} - for _, seg := range allSegments { - for _, sect := range seg.Sections { - if sect.Sym2 != 0 { - s := ctxt.loader.Syms[sect.Sym2] - if s == nil { - panic(fmt.Sprintf("nil sym for sect %s sym %d", sect.Name, sect.Sym2)) - } - sect.Sym = s - } - } - } - - // For now, overwrite symbol type with its "group" type, as dodata - // expected. Once we converted dodata, this will probably not be - // needed. - for i, t := range symGroupType { - if t != sym.Sxxx { - s := ctxt.loader.Syms[i] - if s == nil { - continue // in dwarfcompress we drop compressed DWARF symbols - } - s.Type = t - } - } - symGroupType = nil - - if ctxt.Debugvlog > 1 { - // loadlibfull is likely a good place to dump. - // Only dump under -v=2 and above. - ctxt.dumpsyms() - } -} - func ElfSymForReloc2(ctxt *Link, s loader.Sym) int32 { // If putelfsym created a local version of this symbol, use that in all // relocations. @@ -2880,22 +2563,3 @@ func ElfSymForReloc2(ctxt *Link, s loader.Sym) int32 { return ctxt.loader.SymElfSym(s) } } - -func symSub(ctxt *Link, s *sym.Symbol) *sym.Symbol { - if lsub := ctxt.loader.SubSym(loader.Sym(s.SymIdx)); lsub != 0 { - return ctxt.loader.Syms[lsub] - } - return nil -} - -func (ctxt *Link) dumpsyms() { - for _, s := range ctxt.loader.Syms { - if s == nil { - continue - } - fmt.Printf("%s %s reachable=%v onlist=%v outer=%v sub=%v\n", s, s.Type, s.Attr.Reachable(), s.Attr.OnList(), s.Outer, symSub(ctxt, s)) - for i := range s.R { - fmt.Println("\t", s.R[i].Type, s.R[i].Sym) - } - } -} diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 84b1f9121e..20c44eb9b3 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -70,10 +70,8 @@ type Link struct { Library []*sym.Library LibraryByPkg map[string]*sym.Library Shlibs []Shlib - Textp []*sym.Symbol Textp2 []loader.Sym NumFilesyms int - Moduledata *sym.Symbol Moduledata2 loader.Sym PackageFile map[string]string @@ -90,7 +88,6 @@ type Link struct { cgo_export_static map[string]bool cgo_export_dynamic map[string]bool - datap []*sym.Symbol datap2 []loader.Sym dynexp2 []loader.Sym diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index bc170f9eb8..f24dc732b4 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -272,7 +272,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.textbuildid() bench.Start("addexport") setupdynexp(ctxt) - ctxt.setArchSyms(BeforeLoadlibFull) + ctxt.setArchSyms() ctxt.addexport() bench.Start("Gentext") thearch.Gentext2(ctxt, ctxt.loader) // trampolines, call stubs, etc. diff --git a/src/cmd/link/internal/ld/util.go b/src/cmd/link/internal/ld/util.go index 2186503f0c..9228ed163d 100644 --- a/src/cmd/link/internal/ld/util.go +++ b/src/cmd/link/internal/ld/util.go @@ -6,7 +6,6 @@ package ld import ( "cmd/link/internal/loader" - "cmd/link/internal/sym" "encoding/binary" "fmt" "os" @@ -57,10 +56,10 @@ func afterErrorAction() { // // Logging an error means that on exit cmd/link will delete any // output file and return a non-zero error code. -func Errorf(s *sym.Symbol, format string, args ...interface{}) { - if s != nil { - format = s.Name + ": " + format - } +// +// TODO: remove. Use ctxt.Errof instead. +// All remaining calls use nil as first arg. +func Errorf(dummy *int, format string, args ...interface{}) { format += "\n" fmt.Fprintf(os.Stderr, format, args...) afterErrorAction() @@ -113,10 +112,3 @@ func contains(s []string, v string) bool { } return false } - -// implements sort.Interface, for sorting symbols by name. -type byName []*sym.Symbol - -func (s byName) Len() int { return len(s) } -func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s byName) Less(i, j int) bool { return s[i].Name < s[j].Name } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 64952a3283..d500861272 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -202,13 +202,6 @@ func growBitmap(reqLen int, b Bitmap) Bitmap { // extending the external symbol index space range. The host object // loader stores symbol payloads in loader.payloads using SymbolBuilder. // -// - For now, in loader.LoadFull we convert all symbols (Go + external) -// to sym.Symbols. -// -// - At some point (when the wayfront is pushed through all of the -// linker), all external symbols will be payload-based, and we can -// get rid of the loader.Syms array. -// // - Each symbol gets a unique global index. For duplicated and // overwriting/overwritten symbols, the second (or later) appearance // of the symbol gets the same global index as the first appearance. @@ -240,9 +233,6 @@ type Loader struct { objByPkg map[string]*oReader // map package path to its Go object reader - Syms []*sym.Symbol // indexed symbols. XXX we still make sym.Symbol for now. - symBatch []sym.Symbol // batch of symbols. - anonVersion int // most recently assigned ext static sym pseudo-version // Bitmaps and other side structures used to store data used to store @@ -292,9 +282,6 @@ type Loader struct { // the symbol that triggered the marking of symbol K as live. Reachparent []Sym - relocBatch []sym.Reloc // for bulk allocation of relocations - relocExtBatch []sym.RelocExt // for bulk allocation of relocations - flags uint32 strictDupMsgs int // number of strict-dup warning/errors, when FlagStrictDups is enabled @@ -302,8 +289,6 @@ type Loader struct { elfsetstring elfsetstringFunc errorReporter *ErrorReporter - - SymLookup func(name string, ver int) *sym.Symbol } const ( @@ -562,17 +547,6 @@ func (ms *extSymPayload) Grow(siz int64) { ms.data = ms.data[:siz] } -// Ensure Syms slice has enough space. -func (l *Loader) growSyms(i int) { - n := len(l.Syms) - if n > i { - return - } - l.Syms = append(l.Syms, make([]*sym.Symbol, i+1-n)...) - l.growValues(int(i) + 1) - l.growAttrBitmaps(int(i) + 1) -} - // Convert a local index to a global index. func (l *Loader) toGlobal(r *oReader, i uint32) Sym { return r.syms[i] @@ -2078,163 +2052,6 @@ func (l *Loader) preprocess(arch *sys.Arch, s Sym, name string) { } } -// Load full contents. -func (l *Loader) LoadFull(arch *sys.Arch, syms *sym.Symbols, needReloc, needExtReloc bool) { - // create all Symbols first. - l.growSyms(l.NSym()) - l.growSects(l.NSym()) - - if needReloc && len(l.extRelocs) != 0 { - // If needReloc is true, we are going to convert the loader's - // "internal" relocations to sym.Relocs. In this case, external - // relocations shouldn't be used. - panic("phase error") - } - - nr := 0 // total number of sym.Reloc's we'll need - for _, o := range l.objs[goObjStart:] { - nr += loadObjSyms(l, syms, o.r, needReloc, needExtReloc) - } - - // Make a first pass through the external symbols, making - // sure that each external symbol has a non-nil entry in - // l.Syms (note that relocations and symbol content will - // be copied in a later loop). - toConvert := make([]Sym, 0, len(l.payloads)) - for _, i := range l.extReader.syms { - if !l.attrReachable.Has(i) { - continue - } - pp := l.getPayload(i) - if needReloc { - nr += len(pp.relocs) - } - if needExtReloc && int(i) < len(l.extRelocs) { - nr += len(l.extRelocs[i]) - } - // create and install the sym.Symbol here so that l.Syms will - // be fully populated when we do relocation processing and - // outer/sub processing below. Note that once we do this, - // we'll need to get at the payload for a symbol with direct - // reference to l.payloads[] as opposed to calling l.getPayload(). - s := l.allocSym(pp.name, 0) - l.installSym(i, s) - toConvert = append(toConvert, i) - } - - // allocate a single large slab of relocations for all live symbols - if nr != 0 { - l.relocBatch = make([]sym.Reloc, nr) - if needExtReloc { - l.relocExtBatch = make([]sym.RelocExt, nr) - } - } - - // convert payload-based external symbols into sym.Symbol-based - for _, i := range toConvert { - - // Copy kind/size/value etc. - pp := l.payloads[l.extIndex(i)] - s := l.Syms[i] - s.Version = int16(pp.ver) - s.Type = pp.kind - s.Size = pp.size - - // Copy relocations - if needReloc { - batch := l.relocBatch - s.R = batch[:len(pp.relocs):len(pp.relocs)] - l.relocBatch = batch[len(pp.relocs):] - relocs := l.Relocs(i) - l.convertRelocations(i, &relocs, s, false) - } - if needExtReloc { - l.convertExtRelocs(s, i) - } - - // Copy data - s.P = pp.data - - // Transfer over attributes. - l.migrateAttributes(i, s) - } - - // load contents of defined symbols - for _, o := range l.objs[goObjStart:] { - loadObjFull(l, o.r, needReloc, needExtReloc) - } - - // Sanity check: we should have consumed all batched allocations. - if len(l.relocBatch) != 0 || len(l.relocExtBatch) != 0 { - panic("batch allocation mismatch") - } - - // Note: resolution of ABI aliases is now also handled in - // loader.convertRelocations, so once the host object loaders move - // completely to loader.Sym, we can remove the code below. - - // Resolve ABI aliases for external symbols. This is only - // needed for internal cgo linking. - if needReloc { - for _, i := range l.extReader.syms { - if s := l.Syms[i]; s != nil && s.Attr.Reachable() { - for ri := range s.R { - r := &s.R[ri] - if r.Sym != nil && r.Sym.Type == sym.SABIALIAS { - r.Sym = r.Sym.R[0].Sym - } - } - } - } - } - - // Free some memory. - // At this point we still need basic index mapping, and some fields of - // external symbol payloads, but not much else. - l.values = nil - l.symSects = nil - l.outdata = nil - l.itablink = nil - l.attrOnList = nil - l.attrLocal = nil - l.attrNotInSymbolTable = nil - l.attrVisibilityHidden = nil - l.attrDuplicateOK = nil - l.attrShared = nil - l.attrExternal = nil - l.attrReadOnly = nil - l.attrTopFrame = nil - l.attrSpecial = nil - l.attrCgoExportDynamic = nil - l.attrCgoExportStatic = nil - l.outer = nil - l.align = nil - l.dynimplib = nil - l.dynimpvers = nil - l.localentry = nil - l.extname = nil - l.elfType = nil - l.plt = nil - l.got = nil - l.dynid = nil - if needExtReloc { // converted to sym.Relocs, drop loader references - l.relocVariant = nil - l.extRelocs = nil - } - - // Drop fields that are no longer needed. - for _, i := range l.extReader.syms { - pp := l.getPayload(i) - pp.name = "" - pp.auxs = nil - pp.data = nil - if needExtReloc { - pp.relocs = nil - pp.reltypes = nil - } - } -} - // ResolveABIAlias given a symbol returns the ABI alias target of that // symbol. If the sym in question is not an alias, the sym itself is // returned. @@ -2253,88 +2070,6 @@ func (l *Loader) ResolveABIAlias(s Sym) Sym { return target } -// ExtractSymbols grabs the symbols out of the loader for work that hasn't been -// ported to the new symbol type. -func (l *Loader) ExtractSymbols(syms *sym.Symbols) { - // Add symbols to the ctxt.Syms lookup table. This explicitly skips things - // created via loader.Create (marked with versions less than zero), since - // if we tried to add these we'd wind up with collisions. We do, however, - // add these symbols to the list of global symbols so that other future - // steps (like pclntab generation) can find these symbols if neceassary. - // Along the way, update the version from the negative anon version to - // something larger than sym.SymVerStatic (needed so that - // sym.symbol.IsFileLocal() works properly). - anonVerReplacement := syms.IncVersion() - for _, s := range l.Syms { - if s == nil { - continue - } - if s.Version < 0 { - s.Version = int16(anonVerReplacement) - } - } - - // Provide lookup functions for sym.Symbols. - l.SymLookup = func(name string, ver int) *sym.Symbol { - i := l.LookupOrCreateSym(name, ver) - if s := l.Syms[i]; s != nil { - return s - } - s := l.allocSym(name, ver) - l.installSym(i, s) - return s - } - syms.Lookup = l.SymLookup - syms.ROLookup = func(name string, ver int) *sym.Symbol { - i := l.Lookup(name, ver) - return l.Syms[i] - } -} - -// allocSym allocates a new symbol backing. -func (l *Loader) allocSym(name string, version int) *sym.Symbol { - batch := l.symBatch - if len(batch) == 0 { - batch = make([]sym.Symbol, 1000) - } - s := &batch[0] - l.symBatch = batch[1:] - - s.Dynid = -1 - s.Name = name - s.Version = int16(version) - - return s -} - -// installSym sets the underlying sym.Symbol for the specified sym index. -func (l *Loader) installSym(i Sym, s *sym.Symbol) { - if s == nil { - panic("installSym nil symbol") - } - if l.Syms[i] != nil { - panic("sym already present in installSym") - } - l.Syms[i] = s - s.SymIdx = sym.LoaderSym(i) -} - -// addNewSym adds a new sym.Symbol to the i-th index in the list of symbols. -func (l *Loader) addNewSym(i Sym, name string, ver int, unit *sym.CompilationUnit, t sym.SymKind) *sym.Symbol { - s := l.allocSym(name, ver) - if s.Type != 0 && s.Type != sym.SXREF { - fmt.Println("symbol already processed:", unit.Lib, i, s) - panic("symbol already processed") - } - if t == sym.SBSS && (s.Type == sym.SRODATA || s.Type == sym.SNOPTRBSS) { - t = s.Type - } - s.Type = t - l.growSyms(int(i)) - l.installSym(i, s) - return s -} - // TopLevelSym tests a symbol (by name and kind) to determine whether // the symbol first class sym (participating in the link) or is an // anonymous aux or sub-symbol containing some sub-part or payload of @@ -2359,49 +2094,6 @@ func topLevelSym(sname string, skind sym.SymKind) bool { } } -// loadObjSyms creates sym.Symbol objects for the live Syms in the -// object corresponding to object reader "r". Return value is the -// number of sym.Reloc entries required for all the new symbols. -func loadObjSyms(l *Loader, syms *sym.Symbols, r *oReader, needReloc, needExtReloc bool) int { - nr := 0 - for i, n := uint32(0), uint32(r.NSym()+r.NNonpkgdef()); i < n; i++ { - gi := r.syms[i] - if r2, i2 := l.toLocal(gi); r2 != r || i2 != i { - continue // come from a different object - } - osym := r.Sym(i) - name := strings.Replace(osym.Name(r.Reader), "\"\".", r.pkgprefix, -1) - t := sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type())] - - // Skip non-dwarf anonymous symbols (e.g. funcdata), - // since they will never be turned into sym.Symbols. - if !topLevelSym(name, t) { - continue - } - ver := abiToVer(osym.ABI(), r.version) - if t == sym.SXREF { - log.Fatalf("bad sxref") - } - if t == 0 { - log.Fatalf("missing type for %s in %s", name, r.unit.Lib) - } - if !l.attrReachable.Has(gi) && name != "runtime.addmoduledata" && name != "runtime.lastmoduledatap" { - // No need to load unreachable symbols. - // XXX reference to runtime.addmoduledata may be generated later by the linker in plugin mode. - continue - } - - l.addNewSym(gi, name, ver, r.unit, t) - if needReloc { - nr += r.NReloc(i) - } - if needExtReloc && int(gi) < len(l.extRelocs) { - nr += len(l.extRelocs[gi]) - } - } - return nr -} - // cloneToExternal takes the existing object file symbol (symIdx) // and creates a new external symbol payload that is a clone with // respect to name, version, type, relocations, etc. The idea here @@ -2505,72 +2197,6 @@ func (l *Loader) CopyAttributes(src Sym, dst Sym) { l.SetAttrReadOnly(dst, l.AttrReadOnly(src)) } -// migrateAttributes copies over all of the attributes of symbol 'src' to -// sym.Symbol 'dst'. -func (l *Loader) migrateAttributes(src Sym, dst *sym.Symbol) { - dst.Value = l.SymValue(src) - dst.Align = l.SymAlign(src) - dst.Sect = l.SymSect(src) - - dst.Attr.Set(sym.AttrReachable, l.AttrReachable(src)) - dst.Attr.Set(sym.AttrOnList, l.AttrOnList(src)) - dst.Attr.Set(sym.AttrLocal, l.AttrLocal(src)) - dst.Attr.Set(sym.AttrNotInSymbolTable, l.AttrNotInSymbolTable(src)) - dst.Attr.Set(sym.AttrNoSplit, l.IsNoSplit(src)) - dst.Attr.Set(sym.AttrVisibilityHidden, l.AttrVisibilityHidden(src)) - dst.Attr.Set(sym.AttrDuplicateOK, l.AttrDuplicateOK(src)) - dst.Attr.Set(sym.AttrShared, l.AttrShared(src)) - dst.Attr.Set(sym.AttrExternal, l.AttrExternal(src)) - dst.Attr.Set(sym.AttrTopFrame, l.AttrTopFrame(src)) - dst.Attr.Set(sym.AttrSpecial, l.AttrSpecial(src)) - dst.Attr.Set(sym.AttrCgoExportDynamic, l.AttrCgoExportDynamic(src)) - dst.Attr.Set(sym.AttrCgoExportStatic, l.AttrCgoExportStatic(src)) - dst.Attr.Set(sym.AttrReadOnly, l.AttrReadOnly(src)) - - // Convert outer relationship - if outer, ok := l.outer[src]; ok { - dst.Outer = l.Syms[outer] - // relocsym's foldSubSymbolOffset requires that we only - // have a single level of containment-- enforce here. - if l.outer[outer] != 0 { - panic("multiply nested outer syms") - } - } - - // Set sub-symbol attribute. See the comment on the AttrSubSymbol - // method for more on this, there is some tricky stuff here. - dst.Attr.Set(sym.AttrSubSymbol, l.outer[src] != 0 && l.sub[l.outer[src]] != 0) - - // Copy over dynimplib, dynimpvers, extname. - if name, ok := l.extname[src]; ok { - dst.SetExtname(name) - } - if l.SymDynimplib(src) != "" { - dst.SetDynimplib(l.SymDynimplib(src)) - } - if l.SymDynimpvers(src) != "" { - dst.SetDynimpvers(l.SymDynimpvers(src)) - } - - // Copy ELF type if set. - if et, ok := l.elfType[src]; ok { - dst.SetElfType(et) - } - - // Copy pe objects values if set. - if plt, ok := l.plt[src]; ok { - dst.SetPlt(plt) - } - if got, ok := l.got[src]; ok { - dst.SetGot(got) - } - - // Copy dynid - if dynid, ok := l.dynid[src]; ok { - dst.Dynid = dynid - } -} - // CreateExtSym creates a new external symbol with the specified name // without adding it to any lookup tables, returning a Sym index for it. func (l *Loader) CreateExtSym(name string, ver int) Sym { @@ -2581,8 +2207,7 @@ func (l *Loader) CreateExtSym(name string, ver int) Sym { // without adding it to any lookup tables, returning a Sym index for it. func (l *Loader) CreateStaticSym(name string) Sym { // Assign a new unique negative version -- this is to mark the - // symbol so that it can be skipped when ExtractSymbols is adding - // ext syms to the sym.Symbols hash. + // symbol so that it is not included in the name lookup table. l.anonVersion-- return l.newExtSym(name, l.anonVersion) } @@ -2594,144 +2219,6 @@ func (l *Loader) FreeSym(i Sym) { } } -func loadObjFull(l *Loader, r *oReader, needReloc, needExtReloc bool) { - for i, n := uint32(0), uint32(r.NSym()+r.NNonpkgdef()); i < n; i++ { - // A symbol may be a dup or overwritten. In this case, its - // content will actually be provided by a different object - // (to which its global index points). Skip those symbols. - gi := l.toGlobal(r, i) - if r2, i2 := l.toLocal(gi); r2 != r || i2 != i { - continue - } - s := l.Syms[gi] - if s == nil { - continue - } - - l.migrateAttributes(gi, s) - // Be careful not to overwrite attributes set by the linker. - // Don't use the attributes from the object file. - - osym := r.Sym(i) - size := osym.Siz() - - // Symbol data - s.P = l.OutData(gi) - - // Relocs - if needReloc { - relocs := l.relocs(r, i) - batch := l.relocBatch - s.R = batch[:relocs.Count():relocs.Count()] - l.relocBatch = batch[relocs.Count():] - l.convertRelocations(gi, &relocs, s, false) - } - if needExtReloc { - l.convertExtRelocs(s, gi) - } - - // Aux symbol info - auxs := r.Auxs(i) - for j := range auxs { - a := &auxs[j] - switch a.Type() { - case goobj2.AuxFuncInfo, goobj2.AuxFuncdata, goobj2.AuxGotype: - // already handled - case goobj2.AuxDwarfInfo, goobj2.AuxDwarfLoc, goobj2.AuxDwarfRanges, goobj2.AuxDwarfLines: - // ignored for now - default: - panic("unknown aux type") - } - } - - if s.Size < int64(size) { - s.Size = int64(size) - } - } -} - -// convertRelocations takes a vector of loader.Reloc relocations and -// translates them into an equivalent set of sym.Reloc relocations on -// the symbol "dst", performing fixups along the way for ABI aliases, -// etc. It is assumed that the caller has pre-allocated the dst symbol -// relocations slice. If 'strict' is set, then this method will -// panic if it finds a relocation targeting a nil symbol. -func (l *Loader) convertRelocations(symIdx Sym, src *Relocs, dst *sym.Symbol, strict bool) { - for j := range dst.R { - r := src.At2(j) - rs := r.Sym() - sz := r.Siz() - rt := r.Type() - if rt == objabi.R_METHODOFF { - if l.attrReachable.Has(rs) { - rt = objabi.R_ADDROFF - } else { - sz = 0 - rs = 0 - } - } - if rt == objabi.R_WEAKADDROFF && !l.attrReachable.Has(rs) { - rs = 0 - sz = 0 - } - if rs != 0 && l.Syms[rs] != nil && l.Syms[rs].Type == sym.SABIALIAS { - rsrelocs := l.Relocs(rs) - rs = rsrelocs.At2(0).Sym() - } - if strict && rs != 0 && l.Syms[rs] == nil && rt != objabi.R_USETYPE { - panic("nil reloc target in convertRelocations") - } - dst.R[j] = sym.Reloc{ - Off: r.Off(), - Siz: sz, - Type: rt, - Add: r.Add(), - Sym: l.Syms[rs], - } - if rv := l.RelocVariant(symIdx, j); rv != 0 { - dst.R[j].InitExt() - dst.R[j].Variant = rv - } - } -} - -// Convert external relocations to sym.Relocs on symbol dst. -func (l *Loader) convertExtRelocs(dst *sym.Symbol, src Sym) { - if int(src) >= len(l.extRelocs) { - return - } - extRelocs := l.extRelocs[src] - if len(extRelocs) == 0 { - return - } - if len(dst.R) != 0 { - panic("bad") - } - - n := len(extRelocs) - batch := l.relocBatch - dst.R = batch[:n:n] - l.relocBatch = batch[n:] - relocs := l.Relocs(src) - for i := range dst.R { - er := &extRelocs[i] - sr := relocs.At2(er.Idx) - r := &dst.R[i] - r.RelocExt = &l.relocExtBatch[0] - l.relocExtBatch = l.relocExtBatch[1:] - r.Off = sr.Off() - r.Siz = sr.Siz() - r.Type = sr.Type() - r.Sym = l.Syms[l.ResolveABIAlias(sr.Sym())] - r.Add = sr.Add() - r.Xsym = l.Syms[er.Xsym] - r.Xadd = er.Xadd - if rv := l.RelocVariant(src, er.Idx); rv != 0 { - r.Variant = rv - } - } -} - // relocId is essentially a tuple identifying the Rth // relocation of symbol S. type relocId struct { @@ -2941,15 +2428,7 @@ func (l *Loader) Dump() { if l.IsExternal(i) { pi = fmt.Sprintf("", l.extIndex(i)) } - var s *sym.Symbol - if int(i) < len(l.Syms) { - s = l.Syms[i] - } - if s != nil { - fmt.Println(i, s, s.Type, pi) - } else { - fmt.Println(i, l.SymName(i), "", pi) - } + fmt.Println(i, l.SymName(i), l.SymType(i), pi) } fmt.Println("symsByName") for name, i := range l.symsByName[0] { diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 3213ad5203..8805a1ee16 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -72,7 +72,9 @@ func TestAddMaterializedSymbol(t *testing.T) { // Suppose we create some more symbols, which triggers a grow. // Make sure the symbol builder's payload pointer is valid, // even across a grow. - ldr.growSyms(9999) + for i := 0; i < 9999; i++ { + ldr.CreateStaticSym("dummy") + } // Check get/set symbol type es3typ := sb3.Type() diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index b84a96d15c..b6e07dbe4a 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -9,7 +9,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/sym" - "fmt" "sort" ) @@ -26,9 +25,6 @@ type SymbolBuilder struct { func (l *Loader) MakeSymbolBuilder(name string) *SymbolBuilder { // for now assume that any new sym is intended to be static symIdx := l.CreateStaticSym(name) - if l.Syms[symIdx] != nil { - panic("can't build if sym.Symbol already present") - } sb := &SymbolBuilder{l: l, symIdx: symIdx} sb.extSymPayload = l.getPayload(symIdx) return sb @@ -47,14 +43,6 @@ func (l *Loader) MakeSymbolUpdater(symIdx Sym) *SymbolBuilder { // Create a clone with the same name/version/kind etc. l.cloneToExternal(symIdx) } - // Now that we're doing phase 2 DWARF generation using the loader - // but before the wavefront has reached dodata(), we can't have this - // assertion here. Commented out for now. - if false { - if l.Syms[symIdx] != nil { - panic(fmt.Sprintf("can't build if sym.Symbol %q already present", l.RawSymName(symIdx))) - } - } // Construct updater and return. sb := &SymbolBuilder{l: l, symIdx: symIdx} diff --git a/src/cmd/link/internal/sym/compilation_unit.go b/src/cmd/link/internal/sym/compilation_unit.go index b8b6845e6e..79ab2a8015 100644 --- a/src/cmd/link/internal/sym/compilation_unit.go +++ b/src/cmd/link/internal/sym/compilation_unit.go @@ -16,13 +16,8 @@ type LoaderSym int type CompilationUnit struct { Pkg string // The package name, eg ("fmt", or "runtime") Lib *Library // Our library - Consts *Symbol // Package constants DIEs PCs []dwarf.Range // PC ranges, relative to Textp[0] DWInfo *dwarf.DWDie // CU root DIE - FuncDIEs []*Symbol // Function DIE subtrees - AbsFnDIEs []*Symbol // Abstract function DIE subtrees - RangeSyms []*Symbol // Symbols for debug_range - Textp []*Symbol // Text symbols in this CU DWARFFileTable []string // The file table used to generate the .debug_lines Consts2 LoaderSym // Package constants DIEs (loader) diff --git a/src/cmd/link/internal/sym/reloc.go b/src/cmd/link/internal/sym/reloc.go index f589447be8..a543233a1d 100644 --- a/src/cmd/link/internal/sym/reloc.go +++ b/src/cmd/link/internal/sym/reloc.go @@ -10,41 +10,6 @@ import ( "debug/elf" ) -// Reloc is a relocation. -// -// The typical Reloc rewrites part of a symbol at offset Off to address Sym. -// A Reloc is stored in a slice on the Symbol it rewrites. -// -// Relocations are generated by the compiler as the type -// cmd/internal/obj.Reloc, which is encoded into the object file wire -// format and decoded by the linker into this type. A separate type is -// used to hold linker-specific state about the relocation. -// -// Some relocations are created by cmd/link. -type Reloc struct { - Off int32 // offset to rewrite - Siz uint8 // number of bytes to rewrite, 1, 2, or 4 - Done bool // set to true when relocation is complete - Type objabi.RelocType // the relocation type - Add int64 // addend - Sym *Symbol // symbol the relocation addresses - *RelocExt // extra fields (see below), may be nil, call InitExt before use -} - -// relocExt contains extra fields in Reloc that are used only in -// certain cases. -type RelocExt struct { - Xadd int64 // addend passed to external linker - Xsym *Symbol // symbol passed to external linker - Variant RelocVariant // variation on Type, currently used only on PPC64 and S390X -} - -func (r *Reloc) InitExt() { - if r.RelocExt == nil { - r.RelocExt = new(RelocExt) - } -} - // RelocVariant is a linker-internal variation on a relocation. type RelocVariant uint8 @@ -107,22 +72,3 @@ func RelocName(arch *sys.Arch, r objabi.RelocType) string { return r.String() } - -// RelocByOff implements sort.Interface for sorting relocations by offset. -type RelocByOff []Reloc - -func (x RelocByOff) Len() int { return len(x) } - -func (x RelocByOff) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x RelocByOff) Less(i, j int) bool { - a := &x[i] - b := &x[j] - if a.Off < b.Off { - return true - } - if a.Off > b.Off { - return false - } - return false -} diff --git a/src/cmd/link/internal/sym/segment.go b/src/cmd/link/internal/sym/segment.go index 662e8e0c8f..464952ac8a 100644 --- a/src/cmd/link/internal/sym/segment.go +++ b/src/cmd/link/internal/sym/segment.go @@ -55,7 +55,6 @@ type Section struct { Elfsect interface{} // an *ld.ElfShdr Reloff uint64 Rellen uint64 - Sym *Symbol // symbol for the section, if any Sym2 LoaderSym // symbol for the section, if any Index uint16 // each section has a unique index, used internally } diff --git a/src/cmd/link/internal/sym/sizeof_test.go b/src/cmd/link/internal/sym/sizeof_test.go deleted file mode 100644 index f358ccee66..0000000000 --- a/src/cmd/link/internal/sym/sizeof_test.go +++ /dev/null @@ -1,37 +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 sym - -import ( - "reflect" - "testing" - "unsafe" -) - -// Assert that the size of important structures do not change unexpectedly. - -func TestSizeof(t *testing.T) { - const nbit = unsafe.Sizeof(uintptr(0)) * 8 - const _64bit = nbit == 64 - - var tests = []struct { - val interface{} // type as a value - _32bit uintptr // size on 32bit platforms - _64bit uintptr // size on 64bit platforms - }{ - {Symbol{}, 80, 128}, - } - - for _, tt := range tests { - want := tt._32bit - if _64bit { - want = tt._64bit - } - got := reflect.TypeOf(tt.val).Size() - if want != got { - t.Errorf("%d bit unsafe.Sizeof(%T) = %d, want %d", nbit, tt.val, got, want) - } - } -} diff --git a/src/cmd/link/internal/sym/symbol.go b/src/cmd/link/internal/sym/symbol.go index 3c3717ff31..1a4165ebf7 100644 --- a/src/cmd/link/internal/sym/symbol.go +++ b/src/cmd/link/internal/sym/symbol.go @@ -6,46 +6,8 @@ package sym import ( "cmd/internal/obj" - "cmd/internal/objabi" - "cmd/internal/sys" - "debug/elf" - "fmt" - "log" ) -// Symbol is an entry in the symbol table. -type Symbol struct { - Name string - Type SymKind - Version int16 - Attr Attribute - Dynid int32 - Align int32 - Value int64 - Size int64 - Outer *Symbol - SymIdx LoaderSym - auxinfo *AuxSymbol - Sect *Section - // P contains the raw symbol data. - P []byte - R []Reloc -} - -// AuxSymbol contains less-frequently used sym.Symbol fields. -type AuxSymbol struct { - extname string - dynimplib string - dynimpvers string - localentry uint8 - plt int32 - got int32 - // ElfType is set for symbols read from shared libraries by ldshlibsyms. It - // is not set for symbols defined by the packages being linked or by symbols - // read by ldelf (and so is left as elf.STT_NOTYPE). - elftype elf.SymType -} - const ( SymVerABI0 = 0 SymVerABIInternal = 1 @@ -72,363 +34,6 @@ func VersionToABI(v int) (obj.ABI, bool) { return ^obj.ABI(0), false } -func (s *Symbol) String() string { - if s.Version == 0 { - return s.Name - } - return fmt.Sprintf("%s<%d>", s.Name, s.Version) -} - -func (s *Symbol) IsFileLocal() bool { - return s.Version >= SymVerStatic -} - -func (s *Symbol) Len() int64 { - return s.Size -} - -func (s *Symbol) Length(dwarfContext interface{}) int64 { - return s.Size -} - -func (s *Symbol) Grow(siz int64) { - if int64(int(siz)) != siz { - log.Fatalf("symgrow size %d too long", siz) - } - if int64(len(s.P)) >= siz { - return - } - if cap(s.P) < int(siz) { - p := make([]byte, 2*(siz+1)) - s.P = append(p[:0], s.P...) - } - s.P = s.P[:siz] -} - -func (s *Symbol) AddBytes(bytes []byte) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - s.P = append(s.P, bytes...) - s.Size = int64(len(s.P)) - - return s.Size -} - -func (s *Symbol) AddUint8(v uint8) int64 { - off := s.Size - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - s.Size++ - s.P = append(s.P, v) - - return off -} - -func (s *Symbol) AddUint16(arch *sys.Arch, v uint16) int64 { - return s.AddUintXX(arch, uint64(v), 2) -} - -func (s *Symbol) AddUint32(arch *sys.Arch, v uint32) int64 { - return s.AddUintXX(arch, uint64(v), 4) -} - -func (s *Symbol) AddUint64(arch *sys.Arch, v uint64) int64 { - return s.AddUintXX(arch, v, 8) -} - -func (s *Symbol) AddUint(arch *sys.Arch, v uint64) int64 { - return s.AddUintXX(arch, v, arch.PtrSize) -} - -func (s *Symbol) SetUint8(arch *sys.Arch, r int64, v uint8) int64 { - return s.setUintXX(arch, r, uint64(v), 1) -} - -func (s *Symbol) SetUint16(arch *sys.Arch, r int64, v uint16) int64 { - return s.setUintXX(arch, r, uint64(v), 2) -} - -func (s *Symbol) SetUint32(arch *sys.Arch, r int64, v uint32) int64 { - return s.setUintXX(arch, r, uint64(v), 4) -} - -func (s *Symbol) SetUint(arch *sys.Arch, r int64, v uint64) int64 { - return s.setUintXX(arch, r, v, int64(arch.PtrSize)) -} - -func (s *Symbol) addAddrPlus(arch *sys.Arch, t *Symbol, add int64, typ objabi.RelocType) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - i := s.Size - s.Size += int64(arch.PtrSize) - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Siz = uint8(arch.PtrSize) - r.Type = typ - r.Add = add - return i + int64(r.Siz) -} - -func (s *Symbol) AddAddrPlus(arch *sys.Arch, t *Symbol, add int64) int64 { - return s.addAddrPlus(arch, t, add, objabi.R_ADDR) -} - -func (s *Symbol) AddCURelativeAddrPlus(arch *sys.Arch, t *Symbol, add int64) int64 { - return s.addAddrPlus(arch, t, add, objabi.R_ADDRCUOFF) -} - -func (s *Symbol) AddPCRelPlus(arch *sys.Arch, t *Symbol, add int64) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - i := s.Size - s.Size += 4 - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Add = add - r.Type = objabi.R_PCREL - r.Siz = 4 - if arch.Family == sys.S390X || arch.Family == sys.PPC64 { - r.InitExt() - } - if arch.Family == sys.S390X { - r.Variant = RV_390_DBL - } - return i + int64(r.Siz) -} - -func (s *Symbol) AddAddr(arch *sys.Arch, t *Symbol) int64 { - return s.AddAddrPlus(arch, t, 0) -} - -func (s *Symbol) SetAddrPlus(arch *sys.Arch, off int64, t *Symbol, add int64) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - if off+int64(arch.PtrSize) > s.Size { - s.Size = off + int64(arch.PtrSize) - s.Grow(s.Size) - } - - r := s.AddRel() - r.Sym = t - r.Off = int32(off) - r.Siz = uint8(arch.PtrSize) - r.Type = objabi.R_ADDR - r.Add = add - return off + int64(r.Siz) -} - -func (s *Symbol) SetAddr(arch *sys.Arch, off int64, t *Symbol) int64 { - return s.SetAddrPlus(arch, off, t, 0) -} - -func (s *Symbol) AddSize(arch *sys.Arch, t *Symbol) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - i := s.Size - s.Size += int64(arch.PtrSize) - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Siz = uint8(arch.PtrSize) - r.Type = objabi.R_SIZE - return i + int64(r.Siz) -} - -func (s *Symbol) AddAddrPlus4(t *Symbol, add int64) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - i := s.Size - s.Size += 4 - s.Grow(s.Size) - r := s.AddRel() - r.Sym = t - r.Off = int32(i) - r.Siz = 4 - r.Type = objabi.R_ADDR - r.Add = add - return i + int64(r.Siz) -} - -func (s *Symbol) AddRel() *Reloc { - s.R = append(s.R, Reloc{}) - return &s.R[len(s.R)-1] -} - -func (s *Symbol) AddUintXX(arch *sys.Arch, v uint64, wid int) int64 { - off := s.Size - s.setUintXX(arch, off, v, int64(wid)) - return off -} - -func (s *Symbol) setUintXX(arch *sys.Arch, off int64, v uint64, wid int64) int64 { - if s.Type == 0 { - s.Type = SDATA - } - s.Attr |= AttrReachable - if s.Size < off+wid { - s.Size = off + wid - s.Grow(s.Size) - } - - switch wid { - case 1: - s.P[off] = uint8(v) - case 2: - arch.ByteOrder.PutUint16(s.P[off:], uint16(v)) - case 4: - arch.ByteOrder.PutUint32(s.P[off:], uint32(v)) - case 8: - arch.ByteOrder.PutUint64(s.P[off:], v) - } - - return off + wid -} - -func (s *Symbol) makeAuxInfo() { - if s.auxinfo == nil { - s.auxinfo = &AuxSymbol{extname: s.Name, plt: -1, got: -1} - } -} - -func (s *Symbol) Extname() string { - if s.auxinfo == nil { - return s.Name - } - return s.auxinfo.extname -} - -func (s *Symbol) SetExtname(n string) { - if s.auxinfo == nil { - if s.Name == n { - return - } - s.makeAuxInfo() - } - s.auxinfo.extname = n -} - -func (s *Symbol) Dynimplib() string { - if s.auxinfo == nil { - return "" - } - return s.auxinfo.dynimplib -} - -func (s *Symbol) Dynimpvers() string { - if s.auxinfo == nil { - return "" - } - return s.auxinfo.dynimpvers -} - -func (s *Symbol) SetDynimplib(lib string) { - if s.auxinfo == nil { - s.makeAuxInfo() - } - s.auxinfo.dynimplib = lib -} - -func (s *Symbol) SetDynimpvers(vers string) { - if s.auxinfo == nil { - s.makeAuxInfo() - } - s.auxinfo.dynimpvers = vers -} - -func (s *Symbol) ResetDyninfo() { - if s.auxinfo != nil { - s.auxinfo.dynimplib = "" - s.auxinfo.dynimpvers = "" - } -} - -func (s *Symbol) Localentry() uint8 { - if s.auxinfo == nil { - return 0 - } - return s.auxinfo.localentry -} - -func (s *Symbol) SetLocalentry(val uint8) { - if s.auxinfo == nil { - if val != 0 { - return - } - s.makeAuxInfo() - } - s.auxinfo.localentry = val -} - -func (s *Symbol) Plt() int32 { - if s.auxinfo == nil { - return -1 - } - return s.auxinfo.plt -} - -func (s *Symbol) SetPlt(val int32) { - if s.auxinfo == nil { - if val == -1 { - return - } - s.makeAuxInfo() - } - s.auxinfo.plt = val -} - -func (s *Symbol) Got() int32 { - if s.auxinfo == nil { - return -1 - } - return s.auxinfo.got -} - -func (s *Symbol) SetGot(val int32) { - if s.auxinfo == nil { - if val == -1 { - return - } - s.makeAuxInfo() - } - s.auxinfo.got = val -} - -func (s *Symbol) ElfType() elf.SymType { - if s.auxinfo == nil { - return elf.STT_NOTYPE - } - return s.auxinfo.elftype -} - -func (s *Symbol) SetElfType(val elf.SymType) { - if s.auxinfo == nil { - if val == elf.STT_NOTYPE { - return - } - s.makeAuxInfo() - } - s.auxinfo.elftype = val -} - type Pcdata struct { P []byte } diff --git a/src/cmd/link/internal/sym/symbols.go b/src/cmd/link/internal/sym/symbols.go index ff139fedff..fbf32b0bca 100644 --- a/src/cmd/link/internal/sym/symbols.go +++ b/src/cmd/link/internal/sym/symbols.go @@ -33,16 +33,6 @@ package sym type Symbols struct { // Symbol lookup based on name and indexed by version. versions int - - // Provided by the loader - - // Look up the symbol with the given name and version, creating the - // symbol if it is not found. - Lookup func(name string, v int) *Symbol - - // Look up the symbol with the given name and version, returning nil - // if it is not found. - ROLookup func(name string, v int) *Symbol } func NewSymbols() *Symbols { -- GitLab From 7f872be02f9df73df64b2e6af7b00f15c440c3df Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 14 May 2020 20:20:20 -0400 Subject: [PATCH 0033/1792] [dev.link] cmd/link: delete some deadcode Change-Id: Ic4ca89ced19bf91e3d3ee10b7522d7ebe6b7c7fb Reviewed-on: https://go-review.googlesource.com/c/go/+/234116 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/dwarf.go | 21 --------------------- src/cmd/link/internal/ld/lib.go | 6 +----- src/cmd/link/internal/ld/link.go | 1 - 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 964ed7abf6..dc5bcd7b0e 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -349,9 +349,6 @@ func findchild(die *dwarf.DWDie, name string) *dwarf.DWDie { return nil } -// Used to avoid string allocation when looking up dwarf symbols -var prefixBuf = []byte(dwarf.InfoPrefix) - // find looks up the loader symbol for the DWARF DIE generated for the // type with the specified name. func (d *dwctxt2) find(name string) loader.Sym { @@ -1157,10 +1154,6 @@ func expandFile(fname string) string { return expandGoroot(fname) } -func expandFileSym(l *loader.Loader, fsym loader.Sym) string { - return expandFile(l.SymName(fsym)) -} - func (d *dwctxt2) writelines(unit *sym.CompilationUnit, ls loader.Sym) { is_stmt := uint8(1) // initially = recommended default_is_stmt = 1, tracks is_stmt toggles. @@ -2105,20 +2098,6 @@ func (d *dwctxt2) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo { return dwarfSecInfo{syms: append([]loader.Sym{locsym}, syms...)} } -/* - * Elf. - */ -func (d *dwctxt2) dwarfaddshstrings(ctxt *Link, shstrtab loader.Sym) { - panic("not yet implemented") -} - -// dwarfcompress compresses the DWARF sections. Relocations are applied -// on the fly. After this, dwarfp will contain a different (new) set of -// symbols, and sections may have been replaced. -func (d *dwctxt2) dwarfcompress(ctxt *Link) { - panic("not yet implemented") -} - // getPkgFromCUSym returns the package name for the compilation unit // represented by s. // The prefix dwarf.InfoPrefix+".pkg." needs to be removed in order to get diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 6d795cac69..2e8aefbd88 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -121,9 +121,6 @@ type ArchSyms struct { DynStr2 loader.Sym } -const BeforeLoadlibFull = 1 -const AfterLoadlibFull = 2 - // mkArchSym is a helper for setArchSyms, to set up a special symbol. func (ctxt *Link) mkArchSym(name string, ver int, ls *loader.Sym) { *ls = ctxt.loader.LookupOrCreateSym(name, ver) @@ -136,8 +133,7 @@ func (ctxt *Link) mkArchSymVec(name string, ver int, ls []loader.Sym) { } // setArchSyms sets up the ArchSyms structure, and must be called before -// relocations are applied. This function is invoked twice, once prior -// to loadlibfull(), and once after the work of loadlibfull is complete. +// relocations are applied. func (ctxt *Link) setArchSyms() { ctxt.mkArchSym(".got", 0, &ctxt.GOT2) ctxt.mkArchSym(".plt", 0, &ctxt.PLT2) diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 20c44eb9b3..8bb42e2ac6 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -93,7 +93,6 @@ type Link struct { // Elf symtab variables. numelfsym int // starts at 0, 1 is reserved - elfbind int } type cgodata struct { -- GitLab From 4e974292d4d5e91c7be554482d8ec8a2fdbbe228 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 15 May 2020 19:12:21 -0400 Subject: [PATCH 0034/1792] [dev.link] cmd/link: delete sym.Attribute Change-Id: I1a3ad5e02e9586168a0c5cd37bee37ab5b65e501 Reviewed-on: https://go-review.googlesource.com/c/go/+/234039 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- src/cmd/link/internal/sym/attribute.go | 129 ------------------------- 1 file changed, 129 deletions(-) delete mode 100644 src/cmd/link/internal/sym/attribute.go diff --git a/src/cmd/link/internal/sym/attribute.go b/src/cmd/link/internal/sym/attribute.go deleted file mode 100644 index eda3fe60e4..0000000000 --- a/src/cmd/link/internal/sym/attribute.go +++ /dev/null @@ -1,129 +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 sym - -import "sync/atomic" - -// Attribute is a set of common symbol attributes. -type Attribute int32 - -const ( - // AttrDuplicateOK marks a symbol that can be present in multiple object - // files. - AttrDuplicateOK Attribute = 1 << iota - // AttrExternal marks function symbols loaded from host object files. - AttrExternal - // AttrNoSplit marks functions that cannot split the stack; the linker - // cares because it checks that there are no call chains of nosplit - // functions that require more than StackLimit bytes (see - // lib.go:dostkcheck) - AttrNoSplit - // AttrReachable marks symbols that are transitively referenced from the - // entry points. Unreachable symbols are not written to the output. - AttrReachable - // AttrCgoExportDynamic and AttrCgoExportStatic mark symbols referenced - // by directives written by cgo (in response to //export directives in - // the source). - AttrCgoExportDynamic - AttrCgoExportStatic - // AttrSpecial marks symbols that do not have their address (i.e. Value) - // computed by the usual mechanism of data.go:dodata() & - // data.go:address(). - AttrSpecial - // AttrStackCheck is used by dostkcheck to only check each NoSplit - // function's stack usage once. - AttrStackCheck - // AttrNotInSymbolTable marks symbols that are not written to the symbol table. - AttrNotInSymbolTable - // AttrOnList marks symbols that are on some list (such as the list of - // all text symbols, or one of the lists of data symbols) and is - // consulted to avoid bugs where a symbol is put on a list twice. - AttrOnList - // AttrLocal marks symbols that are only visible within the module - // (executable or shared library) being linked. Only relevant when - // dynamically linking Go code. - AttrLocal - // AttrReflectMethod marks certain methods from the reflect package that - // can be used to call arbitrary methods. If no symbol with this bit set - // is marked as reachable, more dead code elimination can be done. - AttrReflectMethod - // AttrMakeTypelink Amarks types that should be added to the typelink - // table. See typelinks.go:typelinks(). - AttrMakeTypelink - // AttrShared marks symbols compiled with the -shared option. - AttrShared - // AttrVisibilityHidden symbols are ELF symbols with - // visibility set to STV_HIDDEN. They become local symbols in - // the final executable. Only relevant when internally linking - // on an ELF platform. - AttrVisibilityHidden - // AttrSubSymbol mostly means that the symbol appears on the Sub list of some - // other symbol. Unfortunately, it's not 100% reliable; at least, it's not set - // correctly for the .TOC. symbol in Link.dodata. Usually the Outer field of the - // symbol points to the symbol whose list it is on, but that it is not set for the - // symbols added to .windynamic in initdynimport in pe.go. - // - // TODO(mwhudson): fix the inconsistencies noticed above. - // - // Sub lists are used when loading host objects (sections from the host object - // become regular linker symbols and symbols go on the Sub list of their section) - // and for constructing the global offset table when internally linking a dynamic - // executable. - // - // TODO(mwhudson): perhaps a better name for this is AttrNonGoSymbol. - AttrSubSymbol - // AttrContainer is set on text symbols that are present as the .Outer for some - // other symbol. - AttrContainer - // AttrTopFrame means that the function is an entry point and unwinders - // should stop when they hit this function. - AttrTopFrame - // AttrReadOnly indicates whether the symbol's content (Symbol.P) is backed by - // read-only memory. - AttrReadOnly - // 19 attributes defined so far. -) - -func (a *Attribute) load() Attribute { return Attribute(atomic.LoadInt32((*int32)(a))) } - -func (a *Attribute) DuplicateOK() bool { return a.load()&AttrDuplicateOK != 0 } -func (a *Attribute) External() bool { return a.load()&AttrExternal != 0 } -func (a *Attribute) NoSplit() bool { return a.load()&AttrNoSplit != 0 } -func (a *Attribute) Reachable() bool { return a.load()&AttrReachable != 0 } -func (a *Attribute) CgoExportDynamic() bool { return a.load()&AttrCgoExportDynamic != 0 } -func (a *Attribute) CgoExportStatic() bool { return a.load()&AttrCgoExportStatic != 0 } -func (a *Attribute) Special() bool { return a.load()&AttrSpecial != 0 } -func (a *Attribute) StackCheck() bool { return a.load()&AttrStackCheck != 0 } -func (a *Attribute) NotInSymbolTable() bool { return a.load()&AttrNotInSymbolTable != 0 } -func (a *Attribute) OnList() bool { return a.load()&AttrOnList != 0 } -func (a *Attribute) Local() bool { return a.load()&AttrLocal != 0 } -func (a *Attribute) ReflectMethod() bool { return a.load()&AttrReflectMethod != 0 } -func (a *Attribute) MakeTypelink() bool { return a.load()&AttrMakeTypelink != 0 } -func (a *Attribute) Shared() bool { return a.load()&AttrShared != 0 } -func (a *Attribute) VisibilityHidden() bool { return a.load()&AttrVisibilityHidden != 0 } -func (a *Attribute) SubSymbol() bool { return a.load()&AttrSubSymbol != 0 } -func (a *Attribute) Container() bool { return a.load()&AttrContainer != 0 } -func (a *Attribute) TopFrame() bool { return a.load()&AttrTopFrame != 0 } -func (a *Attribute) ReadOnly() bool { return a.load()&AttrReadOnly != 0 } - -func (a *Attribute) CgoExport() bool { - return a.CgoExportDynamic() || a.CgoExportStatic() -} - -func (a *Attribute) Set(flag Attribute, value bool) { - // XXX it would be nice if we have atomic And, Or. - for { - a0 := a.load() - var anew Attribute - if value { - anew = a0 | flag - } else { - anew = a0 &^ flag - } - if atomic.CompareAndSwapInt32((*int32)(a), int32(a0), int32(anew)) { - return - } - } -} -- GitLab From 1ccd585e9402429d239bfd92ad9d6140286814e4 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 15 May 2020 18:35:05 -0400 Subject: [PATCH 0035/1792] [dev.link] cmd/link: remove "2" from names Change-Id: I203caaf9cbe7136cf2060de7dc91c28f6ced1ee2 Reviewed-on: https://go-review.googlesource.com/c/go/+/234038 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- src/cmd/link/internal/amd64/asm.go | 74 ++--- src/cmd/link/internal/amd64/obj.go | 4 +- src/cmd/link/internal/arm/asm.go | 82 ++--- src/cmd/link/internal/arm/obj.go | 4 +- src/cmd/link/internal/arm64/asm.go | 46 +-- src/cmd/link/internal/arm64/obj.go | 4 +- src/cmd/link/internal/ld/data.go | 286 +++++++++--------- src/cmd/link/internal/ld/dwarf.go | 200 ++++++------ src/cmd/link/internal/ld/dwarf2.go | 14 +- src/cmd/link/internal/ld/elf.go | 122 ++++---- src/cmd/link/internal/ld/go.go | 16 +- src/cmd/link/internal/ld/ld.go | 6 +- src/cmd/link/internal/ld/lib.go | 95 +++--- src/cmd/link/internal/ld/link.go | 8 +- src/cmd/link/internal/ld/macho.go | 44 +-- src/cmd/link/internal/ld/main.go | 4 +- src/cmd/link/internal/ld/pcln.go | 28 +- src/cmd/link/internal/ld/pe.go | 20 +- src/cmd/link/internal/ld/symtab.go | 48 +-- src/cmd/link/internal/ld/xcoff.go | 24 +- src/cmd/link/internal/loader/loader.go | 38 +-- src/cmd/link/internal/mips/asm.go | 6 +- src/cmd/link/internal/mips/obj.go | 4 +- src/cmd/link/internal/mips64/asm.go | 10 +- src/cmd/link/internal/mips64/obj.go | 4 +- src/cmd/link/internal/ppc64/asm.go | 60 ++-- src/cmd/link/internal/ppc64/obj.go | 4 +- src/cmd/link/internal/riscv64/asm.go | 4 +- src/cmd/link/internal/riscv64/obj.go | 4 +- src/cmd/link/internal/s390x/asm.go | 42 +-- src/cmd/link/internal/s390x/obj.go | 4 +- src/cmd/link/internal/sym/compilation_unit.go | 10 +- src/cmd/link/internal/sym/library.go | 4 +- src/cmd/link/internal/sym/segment.go | 2 +- src/cmd/link/internal/wasm/asm.go | 8 +- src/cmd/link/internal/wasm/obj.go | 2 +- src/cmd/link/internal/x86/asm.go | 78 ++--- src/cmd/link/internal/x86/obj.go | 4 +- 38 files changed, 708 insertions(+), 709 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 4cc3efb57b..06c5f30983 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -45,7 +45,7 @@ func PADDR(x uint32) uint32 { return x &^ 0x80000000 } -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) if initfunc == nil { return @@ -61,7 +61,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { // 0: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 7 // 3: R_X86_64_PC32 runtime.firstmoduledata-0x4 o(0x48, 0x8d, 0x3d) - initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata2, 0) + initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata, 0) // 7: e8 00 00 00 00 callq c // 8: R_X86_64_PLT32 runtime.addmoduledata-0x4 o(0xe8) @@ -116,8 +116,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocAdd(rIdx, r.Add()+4) if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.PLT2) + addpltsym(target, ldr, syms, targ) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) } @@ -143,10 +143,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // fall back to using GOT and hope for the best (CMOV*) // TODO: just needs relocation, no need to put in .dynsym - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) su.SetRelocType(rIdx, objabi.R_PCREL) - su.SetRelocSym(rIdx, syms.GOT2) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+4+int64(ldr.SymGot(targ))) return true @@ -179,9 +179,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1: if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) + addpltsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) - su.SetRelocSym(rIdx, syms.PLT2) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) return true @@ -224,10 +224,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade if targType != sym.SDYNIMPORT { ldr.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", ldr.SymName(targ)) } - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) - su.SetRelocSym(rIdx, syms.GOT2) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) return true } @@ -249,9 +249,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } // Internal linking, for both ELF and Mach-O. // Build a PLT entry and change the relocation target to that entry. - addpltsym2(target, ldr, syms, targ) + addpltsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) - su.SetRelocSym(rIdx, syms.PLT2) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) return true @@ -259,17 +259,17 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade if ldr.SymType(s) == sym.STEXT && target.IsElf() { su := ldr.MakeSymbolUpdater(s) if target.IsSolaris() { - addpltsym2(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.PLT2) + addpltsym(target, ldr, syms, targ) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) return true } // The code is asking for the address of an external // function. We provide it with the address of the // correspondent GOT symbol. - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.GOT2) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) return true } @@ -341,7 +341,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // AddAddrPlus is used for r_offset and r_addend to // generate new R_ADDR relocations that will update // these fields in the 'reloc' phase. - rela := ldr.MakeSymbolUpdater(syms.Rela2) + rela := ldr.MakeSymbolUpdater(syms.Rela) rela.AddAddrPlus(target.Arch, s, int64(r.Off())) if r.Siz() == 8 { rela.AddUint64(target.Arch, ld.ELF64_R_INFO(0, uint32(elf.R_X86_64_RELATIVE))) @@ -367,15 +367,15 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // just in case the C code assigns to the variable, // and of course it only works for single pointers, // but we only need to support cgo and that's all it needs. - ld.Adddynsym2(ldr, target, syms, targ) + ld.Adddynsym(ldr, target, syms, targ) - got := ldr.MakeSymbolUpdater(syms.GOT2) + got := ldr.MakeSymbolUpdater(syms.GOT) su := ldr.MakeSymbolUpdater(s) su.SetType(got.Type()) got.PrependSub(s) su.SetValue(got.Size()) got.AddUint64(target.Arch, 0) - leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT2) + leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) leg.AddUint32(target.Arch, uint32(ldr.SymDynid(targ))) su.SetRelocType(rIdx, objabi.ElfRelocOffset) // ignore during relocsym return true @@ -385,10 +385,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() xst := ldr.SymType(r.Xsym) switch r.Type() { @@ -586,17 +586,17 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S } } -func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymPlt(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) + ld.Adddynsym(ldr, target, syms, s) if target.IsElf() { - plt := ldr.MakeSymbolUpdater(syms.PLT2) - got := ldr.MakeSymbolUpdater(syms.GOTPLT2) - rela := ldr.MakeSymbolUpdater(syms.RelaPLT2) + plt := ldr.MakeSymbolUpdater(syms.PLT) + got := ldr.MakeSymbolUpdater(syms.GOTPLT) + rela := ldr.MakeSymbolUpdater(syms.RelaPLT) if plt.Size() == 0 { panic("plt is not set up") } @@ -639,11 +639,11 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load // https://networkpx.blogspot.com/2009/09/about-lcdyldinfoonly-command.html // has details about what we're avoiding. - addgotsym2(target, ldr, syms, s) - plt := ldr.MakeSymbolUpdater(syms.PLT2) + addgotsym(target, ldr, syms, s) + plt := ldr.MakeSymbolUpdater(syms.PLT) sDynid := ldr.SymDynid(s) - lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT2) + lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT) lep.AddUint32(target.Arch, uint32(sDynid)) // jmpq *got+size(IP) @@ -651,29 +651,29 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load plt.AddUint8(0xff) plt.AddUint8(0x25) - plt.AddPCRelPlus(target.Arch, syms.GOT2, int64(ldr.SymGot(s))) + plt.AddPCRelPlus(target.Arch, syms.GOT, int64(ldr.SymGot(s))) } else { ldr.Errorf(s, "addpltsym: unsupported binary format") } } -func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymGot(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT2) + ld.Adddynsym(ldr, target, syms, s) + got := ldr.MakeSymbolUpdater(syms.GOT) ldr.SetGot(s, int32(got.Size())) got.AddUint64(target.Arch, 0) if target.IsElf() { - rela := ldr.MakeSymbolUpdater(syms.Rela2) + rela := ldr.MakeSymbolUpdater(syms.Rela) rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_X86_64_GLOB_DAT))) rela.AddUint64(target.Arch, 0) } else if target.IsDarwin() { - leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT2) + leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s))) } else { ldr.Errorf(s, "addgotsym: unsupported binary format") @@ -809,7 +809,7 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - vl := ld.Entryvalue2(ctxt) + vl := ld.Entryvalue(ctxt) ctxt.Out.Write32b(PADDR(uint32(vl))) /* va of entry */ ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index a98fff6b69..3239c61864 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -57,9 +57,9 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Machoreloc1: machoreloc1, PEreloc1: pereloc1, TLSIEtoLE: tlsIEtoLE, diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 8222b74099..08f6c765c6 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -63,7 +63,7 @@ import ( // c: 00000004 .word 0x00000004 // c: R_ARM_GOT_PREL local.moduledata -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) if initfunc == nil { return @@ -91,7 +91,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { Off: 12, Size: 4, Type: objabi.R_PCREL, - Sym: ctxt.Moduledata2, + Sym: ctxt.Moduledata, Add: 4, } initfunc.AddReloc(rel2) @@ -124,8 +124,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade su.SetRelocType(rIdx, objabi.R_CALLARM) if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.PLT2) + addpltsym(target, ldr, syms, targ) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4))) } @@ -137,9 +137,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT32): // R_ARM_GOT_BREL if targType != sym.SDYNIMPORT { - addgotsyminternal2(target, ldr, syms, targ) + addgotsyminternal(target, ldr, syms, targ) } else { - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) } su := ldr.MakeSymbolUpdater(s) @@ -150,13 +150,13 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT_PREL): // GOT(nil) + A - nil if targType != sym.SDYNIMPORT { - addgotsyminternal2(target, ldr, syms, targ) + addgotsyminternal(target, ldr, syms, targ) } else { - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) } su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) - su.SetRelocSym(rIdx, syms.GOT2) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+4+int64(ldr.SymGot(targ))) return true @@ -168,7 +168,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOTPC): // R_ARM_BASE_PREL su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) - su.SetRelocSym(rIdx, syms.GOT2) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+4) return true @@ -176,8 +176,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_CALLARM) if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.PLT2) + addpltsym(target, ldr, syms, targ) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4))) } return true @@ -201,8 +201,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_CALLARM) if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.PLT2) + addpltsym(target, ldr, syms, targ) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4))) } @@ -224,9 +224,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // External linker will do this relocation. return true } - addpltsym2(target, ldr, syms, targ) + addpltsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) - su.SetRelocSym(rIdx, syms.PLT2) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) return true @@ -235,8 +235,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade break } if target.IsElf() { - ld.Adddynsym2(ldr, target, syms, targ) - rel := ldr.MakeSymbolUpdater(syms.Rel2) + ld.Adddynsym(ldr, target, syms, targ) + rel := ldr.MakeSymbolUpdater(syms.Rel) rel.AddAddrPlus(target.Arch, s, int64(r.Off())) rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_ARM_GLOB_DAT))) // we need a nil + A dynamic reloc su := ldr.MakeSymbolUpdater(s) @@ -249,10 +249,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write32(uint32(sectoff)) - elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() switch r.Type() { default: @@ -557,14 +557,14 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade // The following three arch specific relocations are only for generation of // Linux/ARM ELF's PLT entry (3 assembler instruction) case objabi.R_PLT0: // add ip, pc, #0xXX00000 - if ldr.SymValue(syms.GOTPLT2) < ldr.SymValue(syms.PLT2) { + if ldr.SymValue(syms.GOTPLT) < ldr.SymValue(syms.PLT) { ldr.Errorf(s, ".got.plt should be placed after .plt section.") } - return 0xe28fc600 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add())) >> 20)), noExtReloc, isOk + return 0xe28fc600 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT)+int64(r.Off()))+r.Add())) >> 20)), noExtReloc, isOk case objabi.R_PLT1: // add ip, ip, #0xYY000 - return 0xe28cca00 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add()+4)) >> 12)), noExtReloc, isOk + return 0xe28cca00 + (0xff & (int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT)+int64(r.Off()))+r.Add()+4)) >> 12)), noExtReloc, isOk case objabi.R_PLT2: // ldr pc, [ip, #0xZZZ]! - return 0xe5bcf000 + (0xfff & int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT2)+int64(r.Off()))+r.Add()+8))), noExtReloc, isOk + return 0xe5bcf000 + (0xfff & int64(uint32(ldr.SymValue(rs)-(ldr.SymValue(syms.PLT)+int64(r.Off()))+r.Add()+8))), noExtReloc, isOk case objabi.R_CALLARM: // bl XXXXXX or b YYYYYY // r.Add is the instruction // low 24-bit encodes the target address @@ -583,7 +583,7 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian return -1 } -func addpltreloc2(ldr *loader.Loader, plt *loader.SymbolBuilder, got *loader.SymbolBuilder, s loader.Sym, typ objabi.RelocType) { +func addpltreloc(ldr *loader.Loader, plt *loader.SymbolBuilder, got *loader.SymbolBuilder, s loader.Sym, typ objabi.RelocType) { r, _ := plt.AddRel(typ) r.SetSym(got.Sym()) r.SetOff(int32(plt.Size())) @@ -595,17 +595,17 @@ func addpltreloc2(ldr *loader.Loader, plt *loader.SymbolBuilder, got *loader.Sym plt.Grow(plt.Size()) } -func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymPlt(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) + ld.Adddynsym(ldr, target, syms, s) if target.IsElf() { - plt := ldr.MakeSymbolUpdater(syms.PLT2) - got := ldr.MakeSymbolUpdater(syms.GOTPLT2) - rel := ldr.MakeSymbolUpdater(syms.RelPLT2) + plt := ldr.MakeSymbolUpdater(syms.PLT) + got := ldr.MakeSymbolUpdater(syms.GOTPLT) + rel := ldr.MakeSymbolUpdater(syms.RelPLT) if plt.Size() == 0 { panic("plt is not set up") } @@ -621,9 +621,9 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load // .plt entry, this depends on the .got entry ldr.SetPlt(s, int32(plt.Size())) - addpltreloc2(ldr, plt, got, s, objabi.R_PLT0) // add lr, pc, #0xXX00000 - addpltreloc2(ldr, plt, got, s, objabi.R_PLT1) // add lr, lr, #0xYY000 - addpltreloc2(ldr, plt, got, s, objabi.R_PLT2) // ldr pc, [lr, #0xZZZ]! + addpltreloc(ldr, plt, got, s, objabi.R_PLT0) // add lr, pc, #0xXX00000 + addpltreloc(ldr, plt, got, s, objabi.R_PLT1) // add lr, lr, #0xYY000 + addpltreloc(ldr, plt, got, s, objabi.R_PLT2) // ldr pc, [lr, #0xZZZ]! // rel rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) @@ -634,12 +634,12 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load } } -func addgotsyminternal2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addgotsyminternal(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymGot(s) >= 0 { return } - got := ldr.MakeSymbolUpdater(syms.GOT2) + got := ldr.MakeSymbolUpdater(syms.GOT) ldr.SetGot(s, int32(got.Size())) got.AddAddrPlus(target.Arch, s, 0) @@ -649,18 +649,18 @@ func addgotsyminternal2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms } } -func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymGot(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT2) + ld.Adddynsym(ldr, target, syms, s) + got := ldr.MakeSymbolUpdater(syms.GOT) ldr.SetGot(s, int32(got.Size())) got.AddUint64(target.Arch, 0) if target.IsElf() { - rel := ldr.MakeSymbolUpdater(syms.Rel2) + rel := ldr.MakeSymbolUpdater(syms.Rel) rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_ARM_GLOB_DAT))) } else { @@ -748,8 +748,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32b(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ + ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */ ctxt.Out.Write32b(0) ctxt.Out.Write32b(uint32(ld.Lcsize)) diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index 9a66c44a03..003c80a508 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -53,9 +53,9 @@ func Init() (*sys.Arch, ld.Arch) { Trampoline: trampoline, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Machoreloc1: machoreloc1, PEreloc1: pereloc1, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 45bf47ec44..fae3aa5ac2 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -42,7 +42,7 @@ import ( "sync" ) -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) if initfunc == nil { return @@ -62,7 +62,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { Off: 0, Size: 8, Type: objabi.R_ADDRARM64, - Sym: ctxt.Moduledata2, + Sym: ctxt.Moduledata, } initfunc.AddReloc(rel) @@ -123,9 +123,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_CALL26), objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_JUMP26): if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) + addpltsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) - su.SetRelocSym(rIdx, syms.PLT2) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) } if (targType == 0 || targType == sym.SXREF) && !ldr.AttrVisibilityHidden(targ) { @@ -144,10 +144,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // fall back to using GOT // TODO: just needs relocation, no need to put in .dynsym - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_ARM64_GOT) - su.SetRelocSym(rIdx, syms.GOT2) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) return true @@ -233,9 +233,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // The code is asking for the address of an external // function. We provide it with the address of the // correspondent GOT symbol. - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) - su.SetRelocSym(rIdx, syms.GOT2) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) return true } @@ -307,7 +307,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // AddAddrPlus is used for r_offset and r_addend to // generate new R_ADDR relocations that will update // these fields in the 'reloc' phase. - rela := ldr.MakeSymbolUpdater(syms.Rela2) + rela := ldr.MakeSymbolUpdater(syms.Rela) rela.AddAddrPlus(target.Arch, s, int64(r.Off())) if r.Siz() == 8 { rela.AddUint64(target.Arch, ld.ELF64_R_INFO(0, uint32(elf.R_AARCH64_RELATIVE))) @@ -325,10 +325,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() switch r.Type() { default: @@ -591,7 +591,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade case objabi.R_CALLARM64: var t int64 if ldr.SymType(rs) == sym.SDYNIMPORT { - t = (ldr.SymAddr(syms.PLT2) + r.Add()) - (ldr.SymValue(s) + int64(r.Off())) + t = (ldr.SymAddr(syms.PLT) + r.Add()) - (ldr.SymValue(s) + int64(r.Off())) } else { t = (ldr.SymAddr(rs) + r.Add()) - (ldr.SymValue(s) + int64(r.Off())) } @@ -724,17 +724,17 @@ func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loade } } -func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymPlt(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) + ld.Adddynsym(ldr, target, syms, s) if target.IsElf() { - plt := ldr.MakeSymbolUpdater(syms.PLT2) - gotplt := ldr.MakeSymbolUpdater(syms.GOTPLT2) - rela := ldr.MakeSymbolUpdater(syms.RelaPLT2) + plt := ldr.MakeSymbolUpdater(syms.PLT) + gotplt := ldr.MakeSymbolUpdater(syms.GOTPLT) + rela := ldr.MakeSymbolUpdater(syms.RelaPLT) if plt.Size() == 0 { panic("plt is not set up") } @@ -777,18 +777,18 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load } } -func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymGot(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT2) + ld.Adddynsym(ldr, target, syms, s) + got := ldr.MakeSymbolUpdater(syms.GOT) ldr.SetGot(s, int32(got.Size())) got.AddUint64(target.Arch, 0) if target.IsElf() { - rela := ldr.MakeSymbolUpdater(syms.Rela2) + rela := ldr.MakeSymbolUpdater(syms.Rela) rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_AARCH64_GLOB_DAT))) rela.AddUint64(target.Arch, 0) @@ -883,8 +883,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ + ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ ctxt.Out.Write32(0) ctxt.Out.Write32(uint32(ld.Lcsize)) diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 6bac8b42a2..4ed05c087a 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -52,9 +52,9 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Machoreloc1: machoreloc1, Androiddynld: "/system/bin/linker64", diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 3747dfd139..e273841ddb 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -282,7 +282,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { needExtReloc = true rr.Xsym = rs if rr.Xsym == 0 { - rr.Xsym = syms.Tlsg2 + rr.Xsym = syms.Tlsg } rr.Xadd = r.Add() o = 0 @@ -313,7 +313,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { needExtReloc = true rr.Xsym = rs if rr.Xsym == 0 { - rr.Xsym = syms.Tlsg2 + rr.Xsym = syms.Tlsg } rr.Xadd = r.Add() o = 0 @@ -410,7 +410,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { needExtReloc = false } - rr.Xsym = loader.Sym(ldr.SymSect(rs).Sym2) + rr.Xsym = loader.Sym(ldr.SymSect(rs).Sym) rr.Xadd = r.Add() + ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr) o = rr.Xadd @@ -437,7 +437,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { case objabi.R_ADDRCUOFF: // debug_range and debug_loc elements use this relocation type to get an // offset from the start of the compile unit. - o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(loader.Sym(ldr.SymUnit(rs).Textp2[0])) + o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(loader.Sym(ldr.SymUnit(rs).Textp[0])) // r.Sym() can be 0 when CALL $(constant) is transformed from absolute PC to relative PC call. case objabi.R_GOTPCREL: @@ -539,7 +539,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { o = r.Add() case objabi.R_GOTOFF: - o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.GOT2) + o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.GOT) } if target.IsPPC64() || target.IsS390X() { @@ -650,7 +650,7 @@ func (ctxt *Link) reloc() { go func() { if !ctxt.IsWasm() { // On Wasm, text relocations are applied in Asmb2. st := ctxt.makeRelocSymState() - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { st.relocsym(s, ldr.OutData(s)) } } @@ -658,14 +658,14 @@ func (ctxt *Link) reloc() { }() go func() { st := ctxt.makeRelocSymState() - for _, s := range ctxt.datap2 { + for _, s := range ctxt.datap { st.relocsym(s, ldr.OutData(s)) } wg.Done() }() go func() { st := ctxt.makeRelocSymState() - for _, si := range dwarfp2 { + for _, si := range dwarfp { for _, s := range si.syms { st.relocsym(s, ldr.OutData(s)) } @@ -744,14 +744,14 @@ func (ctxt *Link) windynrelocsyms() { relu := ctxt.loader.MakeSymbolUpdater(rel) relu.SetType(sym.STEXT) - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { windynrelocsym(ctxt, relu, s) } - ctxt.Textp2 = append(ctxt.Textp2, rel) + ctxt.Textp = append(ctxt.Textp, rel) } -func dynrelocsym2(ctxt *Link, s loader.Sym) { +func dynrelocsym(ctxt *Link, s loader.Sym) { target := &ctxt.Target ldr := ctxt.loader syms := &ctxt.ArchSyms @@ -778,7 +778,7 @@ func dynrelocsym2(ctxt *Link, s loader.Sym) { } } -func (state *dodataState) dynreloc2(ctxt *Link) { +func (state *dodataState) dynreloc(ctxt *Link) { if ctxt.HeadType == objabi.Hwindows { return } @@ -788,16 +788,16 @@ func (state *dodataState) dynreloc2(ctxt *Link) { return } - for _, s := range ctxt.Textp2 { - dynrelocsym2(ctxt, s) + for _, s := range ctxt.Textp { + dynrelocsym(ctxt, s) } - for _, syms := range state.data2 { + for _, syms := range state.data { for _, s := range syms { - dynrelocsym2(ctxt, s) + dynrelocsym(ctxt, s) } } if ctxt.IsELF { - elfdynhash2(ctxt) + elfdynhash(ctxt) } } @@ -806,7 +806,7 @@ func Codeblk(ctxt *Link, out *OutBuf, addr int64, size int64) { } func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte) { - writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp2, addr, size, pad) + writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad) } const blockSize = 1 << 20 // 1MB chunks written at a time. @@ -978,7 +978,7 @@ func DatblkBytes(ctxt *Link, addr int64, size int64) []byte { } func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) { - writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap2, addr, size, zeros[:]) + writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap, addr, size, zeros[:]) } func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) { @@ -989,12 +989,12 @@ func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) { // section, but this would run the risk of undoing any file offset // adjustments made during layout. n := 0 - for i := range dwarfp2 { - n += len(dwarfp2[i].syms) + for i := range dwarfp { + n += len(dwarfp[i].syms) } syms := make([]loader.Sym, 0, n) - for i := range dwarfp2 { - syms = append(syms, dwarfp2[i].syms...) + for i := range dwarfp { + syms = append(syms, dwarfp[i].syms...) } writeBlocks(out, ctxt.outSem, ctxt.loader, syms, addr, size, zeros[:]) } @@ -1092,7 +1092,7 @@ func addinitarrdata(ctxt *Link, ldr *loader.Loader, s loader.Sym) { } // symalign returns the required alignment for the given symbol s. -func symalign2(ldr *loader.Loader, s loader.Sym) int32 { +func symalign(ldr *loader.Loader, s loader.Sym) int32 { min := int32(thearch.Minalign) align := ldr.SymAlign(s) if align >= min { @@ -1116,19 +1116,19 @@ func symalign2(ldr *loader.Loader, s loader.Sym) int32 { return align } -func aligndatsize2(state *dodataState, datsize int64, s loader.Sym) int64 { - return Rnd(datsize, int64(symalign2(state.ctxt.loader, s))) +func aligndatsize(state *dodataState, datsize int64, s loader.Sym) int64 { + return Rnd(datsize, int64(symalign(state.ctxt.loader, s))) } const debugGCProg = false -type GCProg2 struct { +type GCProg struct { ctxt *Link sym *loader.SymbolBuilder w gcprog.Writer } -func (p *GCProg2) Init(ctxt *Link, name string) { +func (p *GCProg) Init(ctxt *Link, name string) { p.ctxt = ctxt symIdx := ctxt.loader.LookupOrCreateSym(name, 0) p.sym = ctxt.loader.MakeSymbolUpdater(symIdx) @@ -1139,13 +1139,13 @@ func (p *GCProg2) Init(ctxt *Link, name string) { } } -func (p *GCProg2) writeByte() func(x byte) { +func (p *GCProg) writeByte() func(x byte) { return func(x byte) { p.sym.AddUint8(x) } } -func (p *GCProg2) End(size int64) { +func (p *GCProg) End(size int64) { p.w.ZeroUntil(size / int64(p.ctxt.Arch.PtrSize)) p.w.End() if debugGCProg { @@ -1153,7 +1153,7 @@ func (p *GCProg2) End(size int64) { } } -func (p *GCProg2) AddSym(s loader.Sym) { +func (p *GCProg) AddSym(s loader.Sym) { ldr := p.ctxt.loader typ := ldr.SymGoType(s) @@ -1208,7 +1208,7 @@ func (state *dodataState) checkdatsize(symn sym.SymKind) { } // fixZeroSizedSymbols gives a few special symbols with zero size some space. -func fixZeroSizedSymbols2(ctxt *Link) { +func fixZeroSizedSymbols(ctxt *Link) { // The values in moduledata are filled out by relocations // pointing to the addresses of these special symbols. // Typically these symbols have no size and are not laid @@ -1277,7 +1277,7 @@ func fixZeroSizedSymbols2(ctxt *Link) { } // makeRelroForSharedLib creates a section of readonly data if necessary. -func (state *dodataState) makeRelroForSharedLib2(target *Link) { +func (state *dodataState) makeRelroForSharedLib(target *Link) { if !target.UseRelro() { return } @@ -1290,9 +1290,9 @@ func (state *dodataState) makeRelroForSharedLib2(target *Link) { symnrelro := sym.RelROMap[symnro] ro := []loader.Sym{} - relro := state.data2[symnrelro] + relro := state.data[symnrelro] - for _, s := range state.data2[symnro] { + for _, s := range state.data[symnro] { relocs := ldr.Relocs(s) isRelro := relocs.Count() > 0 switch state.symType(s) { @@ -1334,8 +1334,8 @@ func (state *dodataState) makeRelroForSharedLib2(target *Link) { } } - state.data2[symnro] = ro - state.data2[symnrelro] = relro + state.data[symnro] = ro + state.data[symnrelro] = relro } } @@ -1346,7 +1346,7 @@ type dodataState struct { // Link context ctxt *Link // Data symbols bucketed by type. - data2 [sym.SXREF][]loader.Sym + data [sym.SXREF][]loader.Sym // Max alignment for each flavor of data symbol. dataMaxAlign [sym.SXREF]int32 // Overridden sym type @@ -1389,10 +1389,10 @@ func (state *dodataState) setSymType(s loader.Sym, kind sym.SymKind) { } } -func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { +func (ctxt *Link) dodata(symGroupType []sym.SymKind) { // Give zeros sized symbols space if necessary. - fixZeroSizedSymbols2(ctxt) + fixZeroSizedSymbols(ctxt) // Collect data symbols by type into data. state := dodataState{ctxt: ctxt, symGroupType: symGroupType} @@ -1408,7 +1408,7 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { if st <= sym.STEXT || st >= sym.SXREF { continue } - state.data2[st] = append(state.data2[st], s) + state.data[st] = append(state.data[st], s) // Similarly with checking the onlist attr. if ldr.AttrOnList(s) { @@ -1426,10 +1426,10 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { if ctxt.HeadType == objabi.Hdarwin { machosymorder(ctxt) } - state.dynreloc2(ctxt) + state.dynreloc(ctxt) // Move any RO data with relocations to a separate section. - state.makeRelroForSharedLib2(ctxt) + state.makeRelroForSharedLib(ctxt) // Set alignment for the symbol with the largest known index, // so as to trigger allocation of the loader's internal @@ -1440,11 +1440,11 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { // Sort symbols. var wg sync.WaitGroup - for symn := range state.data2 { + for symn := range state.data { symn := sym.SymKind(symn) wg.Add(1) go func() { - state.data2[symn], state.dataMaxAlign[symn] = state.dodataSect2(ctxt, symn, state.data2[symn]) + state.data[symn], state.dataMaxAlign[symn] = state.dodataSect(ctxt, symn, state.data[symn]) wg.Done() }() } @@ -1453,7 +1453,7 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { if ctxt.IsELF { // Make .rela and .rela.plt contiguous, the ELF ABI requires this // and Solaris actually cares. - syms := state.data2[sym.SELFROSECT] + syms := state.data[sym.SELFROSECT] reli, plti := -1, -1 for i, s := range syms { switch ldr.SymName(s) { @@ -1482,7 +1482,7 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { ldr.SetSymAlign(rel, int32(ctxt.Arch.RegSize)) ldr.SetSymAlign(plt, int32(ctxt.Arch.RegSize)) } - state.data2[sym.SELFROSECT] = syms + state.data[sym.SELFROSECT] = syms } if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal { @@ -1494,11 +1494,11 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { // Create *sym.Section objects and assign symbols to sections for // data/rodata (and related) symbols. - state.allocateDataSections2(ctxt) + state.allocateDataSections(ctxt) // Create *sym.Section objects and assign symbols to sections for // DWARF symbols. - state.allocateDwarfSections2(ctxt) + state.allocateDwarfSections(ctxt) /* number the sections */ n := int16(1) @@ -1529,11 +1529,11 @@ func (ctxt *Link) dodata2(symGroupType []sym.SymKind) { // 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. -func (state *dodataState) allocateDataSectionForSym2(seg *sym.Segment, s loader.Sym, rwx int) *sym.Section { +func (state *dodataState) allocateDataSectionForSym(seg *sym.Segment, s loader.Sym, rwx int) *sym.Section { ldr := state.ctxt.loader sname := ldr.SymName(s) sect := addsection(ldr, state.ctxt.Arch, seg, sname, rwx) - sect.Align = symalign2(ldr, s) + sect.Align = symalign(ldr, s) state.datsize = Rnd(state.datsize, int64(sect.Align)) sect.Vaddr = uint64(state.datsize) return sect @@ -1569,7 +1569,7 @@ func (state *dodataState) allocateNamedDataSection(seg *sym.Segment, sName strin // "forceType" (if non-zero) contains a new sym type to apply to each // sym during the assignment, and "aligner" is a hook to call to // handle alignment during the assignment process. -func (state *dodataState) assignDsymsToSection2(sect *sym.Section, syms []loader.Sym, forceType sym.SymKind, aligner func(state *dodataState, datsize int64, s loader.Sym) int64) { +func (state *dodataState) assignDsymsToSection(sect *sym.Section, syms []loader.Sym, forceType sym.SymKind, aligner func(state *dodataState, datsize int64, s loader.Sym) int64) { ldr := state.ctxt.loader for _, s := range syms { state.datsize = aligner(state, state.datsize, s) @@ -1583,8 +1583,8 @@ func (state *dodataState) assignDsymsToSection2(sect *sym.Section, syms []loader sect.Length = uint64(state.datsize) - sect.Vaddr } -func (state *dodataState) assignToSection2(sect *sym.Section, symn sym.SymKind, forceType sym.SymKind) { - state.assignDsymsToSection2(sect, state.data2[symn], forceType, aligndatsize2) +func (state *dodataState) assignToSection(sect *sym.Section, symn sym.SymKind, forceType sym.SymKind) { + state.assignDsymsToSection(sect, state.data[symn], forceType, aligndatsize) state.checkdatsize(symn) } @@ -1594,10 +1594,10 @@ func (state *dodataState) assignToSection2(sect *sym.Section, symn sym.SymKind, // symbol name. "Seg" is the segment into which to place the new // section, "forceType" is the new sym.SymKind to assign to the symbol // within the section, and "rwx" holds section permissions. -func (state *dodataState) allocateSingleSymSections2(seg *sym.Segment, symn sym.SymKind, forceType sym.SymKind, rwx int) { +func (state *dodataState) allocateSingleSymSections(seg *sym.Segment, symn sym.SymKind, forceType sym.SymKind, rwx int) { ldr := state.ctxt.loader - for _, s := range state.data2[symn] { - sect := state.allocateDataSectionForSym2(seg, s, rwx) + for _, s := range state.data[symn] { + sect := state.allocateDataSectionForSym(seg, s, rwx) ldr.SetSymSect(s, sect) state.setSymType(s, forceType) ldr.SetSymValue(s, int64(uint64(state.datsize)-sect.Vaddr)) @@ -1614,16 +1614,16 @@ func (state *dodataState) allocateSingleSymSections2(seg *sym.Segment, symn sym. // name to give to the new section, "forceType" (if non-zero) contains // a new sym type to apply to each sym during the assignment, and // "rwx" holds section permissions. -func (state *dodataState) allocateNamedSectionAndAssignSyms2(seg *sym.Segment, secName string, symn sym.SymKind, forceType sym.SymKind, rwx int) *sym.Section { +func (state *dodataState) allocateNamedSectionAndAssignSyms(seg *sym.Segment, secName string, symn sym.SymKind, forceType sym.SymKind, rwx int) *sym.Section { sect := state.allocateNamedDataSection(seg, secName, []sym.SymKind{symn}, rwx) - state.assignDsymsToSection2(sect, state.data2[symn], forceType, aligndatsize2) + state.assignDsymsToSection(sect, state.data[symn], forceType, aligndatsize) return sect } // allocateDataSections allocates sym.Section objects for data/rodata // (and related) symbols, and then assigns symbols to those sections. -func (state *dodataState) allocateDataSections2(ctxt *Link) { +func (state *dodataState) allocateDataSections(ctxt *Link) { // Allocate sections. // Data is processed before segtext, because we need // to see all symbols in the .data and .bss sections in order @@ -1638,15 +1638,15 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { sym.SWINDOWS, } for _, symn := range writable { - state.allocateSingleSymSections2(&Segdata, symn, sym.SDATA, 06) + state.allocateSingleSymSections(&Segdata, symn, sym.SDATA, 06) } ldr := ctxt.loader // .got (and .toc on ppc64) - if len(state.data2[sym.SELFGOT]) > 0 { - sect := state.allocateNamedSectionAndAssignSyms2(&Segdata, ".got", sym.SELFGOT, sym.SDATA, 06) + if len(state.data[sym.SELFGOT]) > 0 { + sect := state.allocateNamedSectionAndAssignSyms(&Segdata, ".got", sym.SELFGOT, sym.SDATA, 06) if ctxt.IsPPC64() { - for _, s := range state.data2[sym.SELFGOT] { + for _, s := range state.data[sym.SELFGOT] { // Resolve .TOC. symbol for this object file (ppc64) toc := ldr.Lookup(".TOC.", int(ldr.SymVersion(s))) @@ -1660,7 +1660,7 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { } /* pointer-free data */ - sect := state.allocateNamedSectionAndAssignSyms2(&Segdata, ".noptrdata", sym.SNOPTRDATA, sym.SDATA, 06) + sect := state.allocateNamedSectionAndAssignSyms(&Segdata, ".noptrdata", sym.SNOPTRDATA, sym.SDATA, 06) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.noptrdata", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.enoptrdata", 0), sect) @@ -1673,29 +1673,29 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { } if ctxt.HeadType == objabi.Haix { - if len(state.data2[sym.SINITARR]) > 0 { + if len(state.data[sym.SINITARR]) > 0 { Errorf(nil, "XCOFF format doesn't allow .init_array section") } } - if hasinitarr && len(state.data2[sym.SINITARR]) > 0 { - state.allocateNamedSectionAndAssignSyms2(&Segdata, ".init_array", sym.SINITARR, sym.Sxxx, 06) + if hasinitarr && len(state.data[sym.SINITARR]) > 0 { + state.allocateNamedSectionAndAssignSyms(&Segdata, ".init_array", sym.SINITARR, sym.Sxxx, 06) } /* data */ - sect = state.allocateNamedSectionAndAssignSyms2(&Segdata, ".data", sym.SDATA, sym.SDATA, 06) + sect = state.allocateNamedSectionAndAssignSyms(&Segdata, ".data", sym.SDATA, sym.SDATA, 06) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.data", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.edata", 0), sect) dataGcEnd := state.datsize - int64(sect.Vaddr) // On AIX, TOC entries must be the last of .data // These aren't part of gc as they won't change during the runtime. - state.assignToSection2(sect, sym.SXCOFFTOC, sym.SDATA) + state.assignToSection(sect, sym.SXCOFFTOC, sym.SDATA) state.checkdatsize(sym.SDATA) sect.Length = uint64(state.datsize) - sect.Vaddr /* bss */ - sect = state.allocateNamedSectionAndAssignSyms2(&Segdata, ".bss", sym.SBSS, sym.Sxxx, 06) + sect = state.allocateNamedSectionAndAssignSyms(&Segdata, ".bss", sym.SBSS, sym.Sxxx, 06) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.bss", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.ebss", 0), sect) bssGcEnd := state.datsize - int64(sect.Vaddr) @@ -1710,26 +1710,26 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { {"runtime.gcbss", sym.SBSS, bssGcEnd}, } for _, g := range gcsToEmit { - var gc GCProg2 + var gc GCProg gc.Init(ctxt, g.symName) - for _, s := range state.data2[g.symKind] { + for _, s := range state.data[g.symKind] { gc.AddSym(s) } gc.End(g.gcEnd) } /* pointer-free bss */ - sect = state.allocateNamedSectionAndAssignSyms2(&Segdata, ".noptrbss", sym.SNOPTRBSS, sym.Sxxx, 06) + sect = state.allocateNamedSectionAndAssignSyms(&Segdata, ".noptrbss", sym.SNOPTRBSS, sym.Sxxx, 06) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.noptrbss", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.enoptrbss", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.end", 0), sect) // Coverage instrumentation counters for libfuzzer. - if len(state.data2[sym.SLIBFUZZER_EXTRA_COUNTER]) > 0 { - state.allocateNamedSectionAndAssignSyms2(&Segdata, "__libfuzzer_extra_counters", sym.SLIBFUZZER_EXTRA_COUNTER, sym.Sxxx, 06) + if len(state.data[sym.SLIBFUZZER_EXTRA_COUNTER]) > 0 { + state.allocateNamedSectionAndAssignSyms(&Segdata, "__libfuzzer_extra_counters", sym.SLIBFUZZER_EXTRA_COUNTER, sym.Sxxx, 06) } - if len(state.data2[sym.STLSBSS]) > 0 { + if len(state.data[sym.STLSBSS]) > 0 { var sect *sym.Section // FIXME: not clear why it is sometimes necessary to suppress .tbss section creation. if (ctxt.IsELF || ctxt.HeadType == objabi.Haix) && (ctxt.LinkMode == LinkExternal || !*FlagD) { @@ -1740,8 +1740,8 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { } state.datsize = 0 - for _, s := range state.data2[sym.STLSBSS] { - state.datsize = aligndatsize2(state, state.datsize, s) + for _, s := range state.data[sym.STLSBSS] { + state.datsize = aligndatsize(state, state.datsize, s) if sect != nil { ldr.SetSymSect(s, sect) } @@ -1776,11 +1776,11 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { state.datsize = 0 /* read-only executable ELF, Mach-O sections */ - if len(state.data2[sym.STEXT]) != 0 { - culprit := ldr.SymName(state.data2[sym.STEXT][0]) + if len(state.data[sym.STEXT]) != 0 { + culprit := ldr.SymName(state.data[sym.STEXT][0]) Errorf(nil, "dodata found an sym.STEXT symbol: %s", culprit) } - state.allocateSingleSymSections2(&Segtext, sym.SELFRXSECT, sym.SRODATA, 04) + state.allocateSingleSymSections(&Segtext, sym.SELFRXSECT, sym.SRODATA, 04) /* read-only data */ sect = state.allocateNamedDataSection(segro, ".rodata", sym.ReadOnly, 04) @@ -1792,19 +1792,19 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { } for _, symn := range sym.ReadOnly { symnStartValue := state.datsize - state.assignToSection2(sect, symn, sym.SRODATA) + state.assignToSection(sect, symn, sym.SRODATA) if ctxt.HeadType == objabi.Haix { // Read-only symbols might be wrapped inside their outer // symbol. // XCOFF symbol table needs to know the size of // these outer symbols. - xcoffUpdateOuterSize2(ctxt, state.datsize-symnStartValue, symn) + xcoffUpdateOuterSize(ctxt, state.datsize-symnStartValue, symn) } } /* read-only ELF, Mach-O sections */ - state.allocateSingleSymSections2(segro, sym.SELFROSECT, sym.SRODATA, 04) - state.allocateSingleSymSections2(segro, sym.SMACHOPLT, sym.SRODATA, 04) + state.allocateSingleSymSections(segro, sym.SELFROSECT, sym.SRODATA, 04) + state.allocateSingleSymSections(segro, sym.SMACHOPLT, sym.SRODATA, 04) // There is some data that are conceptually read-only but are written to by // relocations. On GNU systems, we can arrange for the dynamic linker to @@ -1868,19 +1868,19 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { symn := sym.RelROMap[symnro] symnStartValue := state.datsize - for _, s := range state.data2[symn] { + for _, s := range state.data[symn] { outer := ldr.OuterSym(s) if s != 0 && ldr.SymSect(outer) != nil && ldr.SymSect(outer) != sect { ctxt.Errorf(s, "s.Outer (%s) in different section from s, %s != %s", ldr.SymName(outer), ldr.SymSect(outer).Name, sect.Name) } } - state.assignToSection2(sect, symn, sym.SRODATA) + state.assignToSection(sect, symn, sym.SRODATA) if ctxt.HeadType == objabi.Haix { // Read-only symbols might be wrapped inside their outer // symbol. // XCOFF symbol table needs to know the size of // these outer symbols. - xcoffUpdateOuterSize2(ctxt, state.datsize-symnStartValue, symn) + xcoffUpdateOuterSize(ctxt, state.datsize-symnStartValue, symn) } } @@ -1898,22 +1898,22 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { sect.Length = uint64(state.datsize) - sect.Vaddr /* itablink */ - sect = state.allocateNamedSectionAndAssignSyms2(seg, genrelrosecname(".itablink"), sym.SITABLINK, sym.Sxxx, relroSecPerm) + sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".itablink"), sym.SITABLINK, sym.Sxxx, relroSecPerm) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.itablink", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.eitablink", 0), sect) if ctxt.HeadType == objabi.Haix { // Store .itablink size because its symbols are wrapped // under an outer symbol: runtime.itablink. - xcoffUpdateOuterSize2(ctxt, int64(sect.Length), sym.SITABLINK) + xcoffUpdateOuterSize(ctxt, int64(sect.Length), sym.SITABLINK) } /* gosymtab */ - sect = state.allocateNamedSectionAndAssignSyms2(seg, genrelrosecname(".gosymtab"), sym.SSYMTAB, sym.SRODATA, relroSecPerm) + sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".gosymtab"), sym.SSYMTAB, sym.SRODATA, relroSecPerm) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.symtab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.esymtab", 0), sect) /* gopclntab */ - sect = state.allocateNamedSectionAndAssignSyms2(seg, genrelrosecname(".gopclntab"), sym.SPCLNTAB, sym.SRODATA, relroSecPerm) + sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".gopclntab"), sym.SPCLNTAB, sym.SRODATA, relroSecPerm) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.epclntab", 0), sect) @@ -1924,35 +1924,35 @@ func (state *dodataState) allocateDataSections2(ctxt *Link) { siz := 0 for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ { - siz += len(state.data2[symn]) + siz += len(state.data[symn]) } - ctxt.datap2 = make([]loader.Sym, 0, siz) + ctxt.datap = make([]loader.Sym, 0, siz) for symn := sym.SELFRXSECT; symn < sym.SXREF; symn++ { - ctxt.datap2 = append(ctxt.datap2, state.data2[symn]...) + ctxt.datap = append(ctxt.datap, state.data[symn]...) } } // allocateDwarfSections allocates sym.Section objects for DWARF // symbols, and assigns symbols to sections. -func (state *dodataState) allocateDwarfSections2(ctxt *Link) { +func (state *dodataState) allocateDwarfSections(ctxt *Link) { alignOne := func(state *dodataState, datsize int64, s loader.Sym) int64 { return datsize } ldr := ctxt.loader - for i := 0; i < len(dwarfp2); i++ { + for i := 0; i < len(dwarfp); i++ { // First the section symbol. - s := dwarfp2[i].secSym() + s := dwarfp[i].secSym() sect := state.allocateNamedDataSection(&Segdwarf, ldr.SymName(s), []sym.SymKind{}, 04) ldr.SetSymSect(s, sect) - sect.Sym2 = sym.LoaderSym(s) + sect.Sym = sym.LoaderSym(s) curType := ldr.SymType(s) state.setSymType(s, sym.SRODATA) ldr.SetSymValue(s, int64(uint64(state.datsize)-sect.Vaddr)) state.datsize += ldr.SymSize(s) // Then any sub-symbols for the section symbol. - subSyms := dwarfp2[i].subSyms() - state.assignDsymsToSection2(sect, subSyms, sym.SRODATA, alignOne) + subSyms := dwarfp[i].subSyms() + state.assignDsymsToSection(sect, subSyms, sym.SRODATA, alignOne) for j := 0; j < len(subSyms); j++ { s := subSyms[j] @@ -1973,7 +1973,7 @@ type symNameSize struct { sym loader.Sym } -func (state *dodataState) dodataSect2(ctxt *Link, symn sym.SymKind, syms []loader.Sym) (result []loader.Sym, maxAlign int32) { +func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader.Sym) (result []loader.Sym, maxAlign int32) { var head, tail loader.Sym ldr := ctxt.loader sl := make([]symNameSize, len(syms)) @@ -2040,7 +2040,7 @@ func (state *dodataState) dodataSect2(ctxt *Link, symn sym.SymKind, syms []loade for k := range sl { s := sl[k].sym if s != head && s != tail { - align := symalign2(ldr, s) + align := symalign(ldr, s) if maxAlign < align { maxAlign = align } @@ -2071,9 +2071,9 @@ func (ctxt *Link) textbuildid() { s.SetData([]byte(data)) s.SetSize(int64(len(data))) - ctxt.Textp2 = append(ctxt.Textp2, 0) - copy(ctxt.Textp2[1:], ctxt.Textp2) - ctxt.Textp2[0] = s.Sym() + ctxt.Textp = append(ctxt.Textp, 0) + copy(ctxt.Textp[1:], ctxt.Textp) + ctxt.Textp[0] = s.Sym() } func (ctxt *Link) buildinfo() { @@ -2143,16 +2143,16 @@ func (ctxt *Link) textaddress() { etext := ldr.LookupOrCreateSym("runtime.etext", 0) ldr.SetSymSect(etext, sect) - ctxt.Textp2 = append(ctxt.Textp2, etext, 0) - copy(ctxt.Textp2[1:], ctxt.Textp2) - ctxt.Textp2[0] = text + ctxt.Textp = append(ctxt.Textp, etext, 0) + copy(ctxt.Textp[1:], ctxt.Textp) + ctxt.Textp[0] = text } va := uint64(*FlagTextAddr) n := 1 sect.Vaddr = va ntramps := 0 - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { sect, n, va = assignAddress(ctxt, sect, n, s, va, false) trampoline(ctxt, s) // resolve jumps, may add trampolines if jump too far @@ -2175,9 +2175,9 @@ func (ctxt *Link) textaddress() { // merge tramps into Textp, keeping Textp in address order if ntramps != 0 { - newtextp := make([]loader.Sym, 0, len(ctxt.Textp2)+ntramps) + newtextp := make([]loader.Sym, 0, len(ctxt.Textp)+ntramps) i := 0 - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { for ; i < ntramps && ldr.SymValue(ctxt.tramps[i]) < ldr.SymValue(s); i++ { newtextp = append(newtextp, ctxt.tramps[i]) } @@ -2185,7 +2185,7 @@ func (ctxt *Link) textaddress() { } newtextp = append(newtextp, ctxt.tramps[i:ntramps]...) - ctxt.Textp2 = newtextp + ctxt.Textp = newtextp } } @@ -2410,7 +2410,7 @@ func (ctxt *Link) address() []*sym.Segment { } } - for _, s := range ctxt.datap2 { + for _, s := range ctxt.datap { if sect := ldr.SymSect(s); sect != nil { ldr.AddToSymValue(s, int64(sect.Vaddr)) } @@ -2420,7 +2420,7 @@ func (ctxt *Link) address() []*sym.Segment { } } - for _, si := range dwarfp2 { + for _, si := range dwarfp { for _, s := range si.syms { if sect := ldr.SymSect(s); sect != nil { ldr.AddToSymValue(s, int64(sect.Vaddr)) @@ -2443,8 +2443,8 @@ func (ctxt *Link) address() []*sym.Segment { ldr.SetSymValue(s, int64(sect.Vaddr+16)) } - ctxt.xdefine2("runtime.text", sym.STEXT, int64(text.Vaddr)) - ctxt.xdefine2("runtime.etext", sym.STEXT, int64(lasttext.Vaddr+lasttext.Length)) + ctxt.xdefine("runtime.text", sym.STEXT, int64(text.Vaddr)) + ctxt.xdefine("runtime.etext", sym.STEXT, int64(lasttext.Vaddr+lasttext.Length)) // If there are multiple text sections, create runtime.text.n for // their section Vaddr, using n for index @@ -2457,41 +2457,41 @@ func (ctxt *Link) address() []*sym.Segment { if ctxt.HeadType != objabi.Haix || ctxt.LinkMode != LinkExternal { // Addresses are already set on AIX with external linker // because these symbols are part of their sections. - ctxt.xdefine2(symname, sym.STEXT, int64(sect.Vaddr)) + ctxt.xdefine(symname, sym.STEXT, int64(sect.Vaddr)) } n++ } - ctxt.xdefine2("runtime.rodata", sym.SRODATA, int64(rodata.Vaddr)) - ctxt.xdefine2("runtime.erodata", sym.SRODATA, int64(rodata.Vaddr+rodata.Length)) - ctxt.xdefine2("runtime.types", sym.SRODATA, int64(types.Vaddr)) - ctxt.xdefine2("runtime.etypes", sym.SRODATA, int64(types.Vaddr+types.Length)) - ctxt.xdefine2("runtime.itablink", sym.SRODATA, int64(itablink.Vaddr)) - ctxt.xdefine2("runtime.eitablink", sym.SRODATA, int64(itablink.Vaddr+itablink.Length)) + ctxt.xdefine("runtime.rodata", sym.SRODATA, int64(rodata.Vaddr)) + ctxt.xdefine("runtime.erodata", sym.SRODATA, int64(rodata.Vaddr+rodata.Length)) + ctxt.xdefine("runtime.types", sym.SRODATA, int64(types.Vaddr)) + ctxt.xdefine("runtime.etypes", sym.SRODATA, int64(types.Vaddr+types.Length)) + ctxt.xdefine("runtime.itablink", sym.SRODATA, int64(itablink.Vaddr)) + ctxt.xdefine("runtime.eitablink", sym.SRODATA, int64(itablink.Vaddr+itablink.Length)) s := ldr.Lookup("runtime.gcdata", 0) ldr.SetAttrLocal(s, true) - ctxt.xdefine2("runtime.egcdata", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s)) + ctxt.xdefine("runtime.egcdata", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s)) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.egcdata", 0), ldr.SymSect(s)) s = ldr.LookupOrCreateSym("runtime.gcbss", 0) ldr.SetAttrLocal(s, true) - ctxt.xdefine2("runtime.egcbss", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s)) + ctxt.xdefine("runtime.egcbss", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s)) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.egcbss", 0), ldr.SymSect(s)) - ctxt.xdefine2("runtime.symtab", sym.SRODATA, int64(symtab.Vaddr)) - ctxt.xdefine2("runtime.esymtab", sym.SRODATA, int64(symtab.Vaddr+symtab.Length)) - ctxt.xdefine2("runtime.pclntab", sym.SRODATA, int64(pclntab.Vaddr)) - ctxt.xdefine2("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length)) - ctxt.xdefine2("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr)) - ctxt.xdefine2("runtime.enoptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr+noptr.Length)) - ctxt.xdefine2("runtime.bss", sym.SBSS, int64(bss.Vaddr)) - ctxt.xdefine2("runtime.ebss", sym.SBSS, int64(bss.Vaddr+bss.Length)) - ctxt.xdefine2("runtime.data", sym.SDATA, int64(data.Vaddr)) - ctxt.xdefine2("runtime.edata", sym.SDATA, int64(data.Vaddr+data.Length)) - ctxt.xdefine2("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr)) - ctxt.xdefine2("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length)) - ctxt.xdefine2("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.Length)) + ctxt.xdefine("runtime.symtab", sym.SRODATA, int64(symtab.Vaddr)) + ctxt.xdefine("runtime.esymtab", sym.SRODATA, int64(symtab.Vaddr+symtab.Length)) + ctxt.xdefine("runtime.pclntab", sym.SRODATA, int64(pclntab.Vaddr)) + ctxt.xdefine("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length)) + ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr)) + ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr+noptr.Length)) + ctxt.xdefine("runtime.bss", sym.SBSS, int64(bss.Vaddr)) + ctxt.xdefine("runtime.ebss", sym.SBSS, int64(bss.Vaddr+bss.Length)) + ctxt.xdefine("runtime.data", sym.SDATA, int64(data.Vaddr)) + ctxt.xdefine("runtime.edata", sym.SDATA, int64(data.Vaddr+data.Length)) + ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr)) + ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length)) + ctxt.xdefine("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.Length)) if ctxt.IsSolaris() { // On Solaris, in the runtime it sets the external names of the @@ -2503,9 +2503,9 @@ func (ctxt *Link) address() []*sym.Segment { ldr.SetSymExtname(etext, "runtime.etext") ldr.SetSymExtname(edata, "runtime.edata") ldr.SetSymExtname(end, "runtime.end") - ctxt.xdefine2("_etext", ldr.SymType(etext), ldr.SymValue(etext)) - ctxt.xdefine2("_edata", ldr.SymType(edata), ldr.SymValue(edata)) - ctxt.xdefine2("_end", ldr.SymType(end), ldr.SymValue(end)) + ctxt.xdefine("_etext", ldr.SymType(etext), ldr.SymValue(etext)) + ctxt.xdefine("_edata", ldr.SymType(edata), ldr.SymValue(edata)) + ctxt.xdefine("_end", ldr.SymType(end), ldr.SymValue(end)) ldr.SetSymSect(ldr.Lookup("_etext", 0), ldr.SymSect(etext)) ldr.SetSymSect(ldr.Lookup("_edata", 0), ldr.SymSect(edata)) ldr.SetSymSect(ldr.Lookup("_end", 0), ldr.SymSect(end)) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index dc5bcd7b0e..18fcdbd141 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -27,13 +27,13 @@ import ( "strings" ) -// dwctxt2 is a wrapper intended to satisfy the method set of +// dwctxt is a wrapper intended to satisfy the method set of // dwarf.Context, so that functions like dwarf.PutAttrs will work with // DIEs that use loader.Sym as opposed to *sym.Symbol. It is also // being used as a place to store tables/maps that are useful as part // of type conversion (this is just a convenience; it would be easy to // split these things out into another type if need be). -type dwctxt2 struct { +type dwctxt struct { linkctxt *Link ldr *loader.Loader arch *sys.Arch @@ -59,8 +59,8 @@ type dwctxt2 struct { uintptrInfoSym loader.Sym } -func newdwctxt2(linkctxt *Link, forTypeGen bool) dwctxt2 { - d := dwctxt2{ +func newdwctxt(linkctxt *Link, forTypeGen bool) dwctxt { + d := dwctxt{ linkctxt: linkctxt, ldr: linkctxt.loader, arch: linkctxt.Arch, @@ -79,33 +79,33 @@ func newdwctxt2(linkctxt *Link, forTypeGen bool) dwctxt2 { type dwSym loader.Sym func (s dwSym) Length(dwarfContext interface{}) int64 { - l := dwarfContext.(dwctxt2).ldr + l := dwarfContext.(dwctxt).ldr return int64(len(l.Data(loader.Sym(s)))) } -func (c dwctxt2) PtrSize() int { +func (c dwctxt) PtrSize() int { return c.arch.PtrSize } -func (c dwctxt2) AddInt(s dwarf.Sym, size int, i int64) { +func (c dwctxt) AddInt(s dwarf.Sym, size int, i int64) { ds := loader.Sym(s.(dwSym)) dsu := c.ldr.MakeSymbolUpdater(ds) dsu.AddUintXX(c.arch, uint64(i), size) } -func (c dwctxt2) AddBytes(s dwarf.Sym, b []byte) { +func (c dwctxt) AddBytes(s dwarf.Sym, b []byte) { ds := loader.Sym(s.(dwSym)) dsu := c.ldr.MakeSymbolUpdater(ds) dsu.AddBytes(b) } -func (c dwctxt2) AddString(s dwarf.Sym, v string) { +func (c dwctxt) AddString(s dwarf.Sym, v string) { ds := loader.Sym(s.(dwSym)) dsu := c.ldr.MakeSymbolUpdater(ds) dsu.Addstring(v) } -func (c dwctxt2) AddAddress(s dwarf.Sym, data interface{}, value int64) { +func (c dwctxt) AddAddress(s dwarf.Sym, data interface{}, value int64) { ds := loader.Sym(s.(dwSym)) dsu := c.ldr.MakeSymbolUpdater(ds) if value != 0 { @@ -115,7 +115,7 @@ func (c dwctxt2) AddAddress(s dwarf.Sym, data interface{}, value int64) { dsu.AddAddrPlus(c.arch, tgtds, value) } -func (c dwctxt2) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64) { +func (c dwctxt) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64) { ds := loader.Sym(s.(dwSym)) dsu := c.ldr.MakeSymbolUpdater(ds) if value != 0 { @@ -125,7 +125,7 @@ func (c dwctxt2) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64 dsu.AddCURelativeAddrPlus(c.arch, tgtds, value) } -func (c dwctxt2) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64) { +func (c dwctxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64) { ds := loader.Sym(s.(dwSym)) dsu := c.ldr.MakeSymbolUpdater(ds) tds := loader.Sym(t.(dwSym)) @@ -137,7 +137,7 @@ func (c dwctxt2) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int6 dsu.AddSymRef(c.arch, tds, ofs, objabi.R_ADDROFF, size) } -func (c dwctxt2) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64) { +func (c dwctxt) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64) { size := 4 if isDwarf64(c.linkctxt) { size = 8 @@ -153,25 +153,25 @@ func (c dwctxt2) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64 dsu.AddSymRef(c.arch, tds, ofs, objabi.R_DWARFSECREF, size) } -func (c dwctxt2) Logf(format string, args ...interface{}) { +func (c dwctxt) Logf(format string, args ...interface{}) { c.linkctxt.Logf(format, args...) } // At the moment these interfaces are only used in the compiler. -func (c dwctxt2) AddFileRef(s dwarf.Sym, f interface{}) { +func (c dwctxt) AddFileRef(s dwarf.Sym, f interface{}) { panic("should be used only in the compiler") } -func (c dwctxt2) CurrentOffset(s dwarf.Sym) int64 { +func (c dwctxt) CurrentOffset(s dwarf.Sym) int64 { panic("should be used only in the compiler") } -func (c dwctxt2) RecordDclReference(s dwarf.Sym, t dwarf.Sym, dclIdx int, inlIndex int) { +func (c dwctxt) RecordDclReference(s dwarf.Sym, t dwarf.Sym, dclIdx int, inlIndex int) { panic("should be used only in the compiler") } -func (c dwctxt2) RecordChildDieOffsets(s dwarf.Sym, vars []*dwarf.Var, offsets []int32) { +func (c dwctxt) RecordChildDieOffsets(s dwarf.Sym, vars []*dwarf.Var, offsets []int32) { panic("should be used only in the compiler") } @@ -207,11 +207,11 @@ func (dsi *dwarfSecInfo) subSyms() []loader.Sym { return dsi.syms[1:] } -// dwarfp2 stores the collected DWARF symbols created during +// dwarfp stores the collected DWARF symbols created during // dwarf generation. -var dwarfp2 []dwarfSecInfo +var dwarfp []dwarfSecInfo -func (d *dwctxt2) writeabbrev() dwarfSecInfo { +func (d *dwctxt) writeabbrev() dwarfSecInfo { abrvs := d.ldr.LookupOrCreateSym(".debug_abbrev", 0) u := d.ldr.MakeSymbolUpdater(abrvs) u.SetType(sym.SDWARFSECT) @@ -269,7 +269,7 @@ func getattr(die *dwarf.DWDie, attr uint16) *dwarf.DWAttr { // The compiler does create nameless DWARF DIEs (ex: concrete subprogram // instance). // FIXME: it would be more efficient to bulk-allocate DIEs. -func (d *dwctxt2) newdie(parent *dwarf.DWDie, abbrev int, name string, version int) *dwarf.DWDie { +func (d *dwctxt) newdie(parent *dwarf.DWDie, abbrev int, name string, version int) *dwarf.DWDie { die := new(dwarf.DWDie) die.Abbrev = abbrev die.Link = parent.Child @@ -316,7 +316,7 @@ func walktypedef(die *dwarf.DWDie) *dwarf.DWDie { return die } -func (d *dwctxt2) walksymtypedef(symIdx loader.Sym) loader.Sym { +func (d *dwctxt) walksymtypedef(symIdx loader.Sym) loader.Sym { // We're being given the loader symbol for the type DIE, e.g. // "go.info.type.uintptr". Map that first to the type symbol (e.g. @@ -351,11 +351,11 @@ func findchild(die *dwarf.DWDie, name string) *dwarf.DWDie { // find looks up the loader symbol for the DWARF DIE generated for the // type with the specified name. -func (d *dwctxt2) find(name string) loader.Sym { +func (d *dwctxt) find(name string) loader.Sym { return d.tmap[name] } -func (d *dwctxt2) mustFind(name string) loader.Sym { +func (d *dwctxt) mustFind(name string) loader.Sym { r := d.find(name) if r == 0 { Exitf("dwarf find: cannot find %s", name) @@ -363,7 +363,7 @@ func (d *dwctxt2) mustFind(name string) loader.Sym { return r } -func (d *dwctxt2) adddwarfref(sb *loader.SymbolBuilder, t loader.Sym, size int) int64 { +func (d *dwctxt) adddwarfref(sb *loader.SymbolBuilder, t loader.Sym, size int) int64 { var result int64 switch size { default: @@ -374,14 +374,14 @@ func (d *dwctxt2) adddwarfref(sb *loader.SymbolBuilder, t loader.Sym, size int) return result } -func (d *dwctxt2) newrefattr(die *dwarf.DWDie, attr uint16, ref loader.Sym) *dwarf.DWAttr { +func (d *dwctxt) newrefattr(die *dwarf.DWDie, attr uint16, ref loader.Sym) *dwarf.DWAttr { if ref == 0 { return nil } return newattr(die, attr, dwarf.DW_CLS_REFERENCE, 0, dwSym(ref)) } -func (d *dwctxt2) dtolsym(s dwarf.Sym) loader.Sym { +func (d *dwctxt) dtolsym(s dwarf.Sym) loader.Sym { if s == nil { return 0 } @@ -389,7 +389,7 @@ func (d *dwctxt2) dtolsym(s dwarf.Sym) loader.Sym { return dws } -func (d *dwctxt2) putdie(syms []loader.Sym, die *dwarf.DWDie) []loader.Sym { +func (d *dwctxt) putdie(syms []loader.Sym, die *dwarf.DWDie) []loader.Sym { s := d.dtolsym(die.Sym) if s == 0 { s = syms[len(syms)-1] @@ -441,11 +441,11 @@ func newmemberoffsetattr(die *dwarf.DWDie, offs int32) { // GDB doesn't like FORM_addr for AT_location, so emit a // location expression that evals to a const. -func (d *dwctxt2) newabslocexprattr(die *dwarf.DWDie, addr int64, symIdx loader.Sym) { +func (d *dwctxt) newabslocexprattr(die *dwarf.DWDie, addr int64, symIdx loader.Sym) { newattr(die, dwarf.DW_AT_location, dwarf.DW_CLS_ADDRESS, addr, dwSym(symIdx)) } -func (d *dwctxt2) lookupOrDiag(n string) loader.Sym { +func (d *dwctxt) lookupOrDiag(n string) loader.Sym { symIdx := d.ldr.Lookup(n, 0) if symIdx == 0 { Exitf("dwarf: missing type: %s", n) @@ -457,7 +457,7 @@ func (d *dwctxt2) lookupOrDiag(n string) loader.Sym { return symIdx } -func (d *dwctxt2) dotypedef(parent *dwarf.DWDie, gotype loader.Sym, name string, def *dwarf.DWDie) *dwarf.DWDie { +func (d *dwctxt) dotypedef(parent *dwarf.DWDie, gotype loader.Sym, name string, def *dwarf.DWDie) *dwarf.DWDie { // Only emit typedefs for real names. if strings.HasPrefix(name, "map[") { return nil @@ -497,7 +497,7 @@ func (d *dwctxt2) dotypedef(parent *dwarf.DWDie, gotype loader.Sym, name string, } // Define gotype, for composite ones recurse into constituents. -func (d *dwctxt2) defgotype(gotype loader.Sym) loader.Sym { +func (d *dwctxt) defgotype(gotype loader.Sym) loader.Sym { if gotype == 0 { return d.mustFind("") } @@ -524,7 +524,7 @@ func (d *dwctxt2) defgotype(gotype loader.Sym) loader.Sym { return loader.Sym(gtdwSym.Sym.(dwSym)) } -func (d *dwctxt2) newtype(gotype loader.Sym) *dwarf.DWDie { +func (d *dwctxt) newtype(gotype loader.Sym) *dwarf.DWDie { sn := d.ldr.SymName(gotype) name := sn[5:] // could also decode from Type.string tdata := d.ldr.Data(gotype) @@ -714,12 +714,12 @@ func (d *dwctxt2) newtype(gotype loader.Sym) *dwarf.DWDie { return die } -func (d *dwctxt2) nameFromDIESym(dwtypeDIESym loader.Sym) string { +func (d *dwctxt) nameFromDIESym(dwtypeDIESym loader.Sym) string { sn := d.ldr.SymName(dwtypeDIESym) return sn[len(dwarf.InfoPrefix):] } -func (d *dwctxt2) defptrto(dwtype loader.Sym) loader.Sym { +func (d *dwctxt) defptrto(dwtype loader.Sym) loader.Sym { // FIXME: it would be nice if the compiler attached an aux symbol // ref from the element type to the pointer type -- it would be @@ -753,7 +753,7 @@ func (d *dwctxt2) defptrto(dwtype loader.Sym) loader.Sym { // Copies src's children into dst. Copies attributes by value. // DWAttr.data is copied as pointer only. If except is one of // the top-level children, it will not be copied. -func (d *dwctxt2) copychildrenexcept(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie, except *dwarf.DWDie) { +func (d *dwctxt) copychildrenexcept(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie, except *dwarf.DWDie) { for src = src.Child; src != nil; src = src.Link { if src == except { continue @@ -768,13 +768,13 @@ func (d *dwctxt2) copychildrenexcept(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DW reverselist(&dst.Child) } -func (d *dwctxt2) copychildren(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie) { +func (d *dwctxt) copychildren(ctxt *Link, dst *dwarf.DWDie, src *dwarf.DWDie) { d.copychildrenexcept(ctxt, dst, src, nil) } // Search children (assumed to have TAG_member) for the one named // field and set its AT_type to dwtype -func (d *dwctxt2) substitutetype(structdie *dwarf.DWDie, field string, dwtype loader.Sym) { +func (d *dwctxt) substitutetype(structdie *dwarf.DWDie, field string, dwtype loader.Sym) { child := findchild(structdie, field) if child == nil { Exitf("dwarf substitutetype: %s does not have member %s", @@ -790,7 +790,7 @@ func (d *dwctxt2) substitutetype(structdie *dwarf.DWDie, field string, dwtype lo } } -func (d *dwctxt2) findprotodie(ctxt *Link, name string) *dwarf.DWDie { +func (d *dwctxt) findprotodie(ctxt *Link, name string) *dwarf.DWDie { die, ok := prototypedies[name] if ok && die == nil { d.defgotype(d.lookupOrDiag(name)) @@ -802,7 +802,7 @@ func (d *dwctxt2) findprotodie(ctxt *Link, name string) *dwarf.DWDie { return die } -func (d *dwctxt2) synthesizestringtypes(ctxt *Link, die *dwarf.DWDie) { +func (d *dwctxt) synthesizestringtypes(ctxt *Link, die *dwarf.DWDie) { prototype := walktypedef(d.findprotodie(ctxt, "type.runtime.stringStructDWARF")) if prototype == nil { return @@ -816,7 +816,7 @@ func (d *dwctxt2) synthesizestringtypes(ctxt *Link, die *dwarf.DWDie) { } } -func (d *dwctxt2) synthesizeslicetypes(ctxt *Link, die *dwarf.DWDie) { +func (d *dwctxt) synthesizeslicetypes(ctxt *Link, die *dwarf.DWDie) { prototype := walktypedef(d.findprotodie(ctxt, "type.runtime.slice")) if prototype == nil { return @@ -846,7 +846,7 @@ const ( BucketSize = 8 ) -func (d *dwctxt2) mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valname string, f func(*dwarf.DWDie)) loader.Sym { +func (d *dwctxt) mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valname string, f func(*dwarf.DWDie)) loader.Sym { name := mkinternaltypename(typename, keyname, valname) symname := dwarf.InfoPrefix + name s := d.ldr.Lookup(symname, 0) @@ -858,7 +858,7 @@ func (d *dwctxt2) mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valn return d.dtolsym(die.Sym) } -func (d *dwctxt2) synthesizemaptypes(ctxt *Link, die *dwarf.DWDie) { +func (d *dwctxt) synthesizemaptypes(ctxt *Link, die *dwarf.DWDie) { hash := walktypedef(d.findprotodie(ctxt, "type.runtime.hmap")) bucket := walktypedef(d.findprotodie(ctxt, "type.runtime.bmap")) @@ -954,7 +954,7 @@ func (d *dwctxt2) synthesizemaptypes(ctxt *Link, die *dwarf.DWDie) { } } -func (d *dwctxt2) synthesizechantypes(ctxt *Link, die *dwarf.DWDie) { +func (d *dwctxt) synthesizechantypes(ctxt *Link, die *dwarf.DWDie) { sudog := walktypedef(d.findprotodie(ctxt, "type.runtime.sudog")) waitq := walktypedef(d.findprotodie(ctxt, "type.runtime.waitq")) hchan := walktypedef(d.findprotodie(ctxt, "type.runtime.hchan")) @@ -1001,7 +1001,7 @@ func (d *dwctxt2) synthesizechantypes(ctxt *Link, die *dwarf.DWDie) { } } -func (d *dwctxt2) dwarfDefineGlobal(ctxt *Link, symIdx loader.Sym, str string, v int64, gotype loader.Sym) { +func (d *dwctxt) dwarfDefineGlobal(ctxt *Link, symIdx loader.Sym, str string, v int64, gotype loader.Sym) { // Find a suitable CU DIE to include the global. // One would think it's as simple as just looking at the unit, but that might // not have any reachable code. So, we go to the runtime's CU if our unit @@ -1022,7 +1022,7 @@ func (d *dwctxt2) dwarfDefineGlobal(ctxt *Link, symIdx loader.Sym, str string, v // createUnitLength creates the initial length field with value v and update // offset of unit_length if needed. -func (d *dwctxt2) createUnitLength(su *loader.SymbolBuilder, v uint64) { +func (d *dwctxt) createUnitLength(su *loader.SymbolBuilder, v uint64) { if isDwarf64(d.linkctxt) { su.AddUint32(d.arch, 0xFFFFFFFF) } @@ -1030,7 +1030,7 @@ func (d *dwctxt2) createUnitLength(su *loader.SymbolBuilder, v uint64) { } // addDwarfAddrField adds a DWARF field in DWARF 64bits or 32bits. -func (d *dwctxt2) addDwarfAddrField(sb *loader.SymbolBuilder, v uint64) { +func (d *dwctxt) addDwarfAddrField(sb *loader.SymbolBuilder, v uint64) { if isDwarf64(d.linkctxt) { sb.AddUint(d.arch, v) } else { @@ -1039,7 +1039,7 @@ func (d *dwctxt2) addDwarfAddrField(sb *loader.SymbolBuilder, v uint64) { } // addDwarfAddrRef adds a DWARF pointer in DWARF 64bits or 32bits. -func (d *dwctxt2) addDwarfAddrRef(sb *loader.SymbolBuilder, t loader.Sym) { +func (d *dwctxt) addDwarfAddrRef(sb *loader.SymbolBuilder, t loader.Sym) { if isDwarf64(d.linkctxt) { d.adddwarfref(sb, t, 8) } else { @@ -1048,9 +1048,9 @@ func (d *dwctxt2) addDwarfAddrRef(sb *loader.SymbolBuilder, t loader.Sym) { } // calcCompUnitRanges calculates the PC ranges of the compilation units. -func (d *dwctxt2) calcCompUnitRanges() { +func (d *dwctxt) calcCompUnitRanges() { var prevUnit *sym.CompilationUnit - for _, s := range d.linkctxt.Textp2 { + for _, s := range d.linkctxt.Textp { sym := loader.Sym(s) fi := d.ldr.FuncInfo(sym) @@ -1073,7 +1073,7 @@ func (d *dwctxt2) calcCompUnitRanges() { // only create boundaries between symbols from // different units. sval := d.ldr.SymValue(sym) - u0val := d.ldr.SymValue(loader.Sym(unit.Textp2[0])) + u0val := d.ldr.SymValue(loader.Sym(unit.Textp[0])) if prevUnit != unit { unit.PCs = append(unit.PCs, dwarf.Range{Start: sval - u0val}) prevUnit = unit @@ -1119,7 +1119,7 @@ func getCompilationDir() string { return "." } -func (d *dwctxt2) importInfoSymbol(ctxt *Link, dsym loader.Sym) { +func (d *dwctxt) importInfoSymbol(ctxt *Link, dsym loader.Sym) { d.ldr.SetAttrReachable(dsym, true) d.ldr.SetAttrNotInSymbolTable(dsym, true) if d.ldr.SymType(dsym) != sym.SDWARFINFO { @@ -1154,7 +1154,7 @@ func expandFile(fname string) string { return expandGoroot(fname) } -func (d *dwctxt2) writelines(unit *sym.CompilationUnit, ls loader.Sym) { +func (d *dwctxt) writelines(unit *sym.CompilationUnit, ls loader.Sym) { is_stmt := uint8(1) // initially = recommended default_is_stmt = 1, tracks is_stmt toggles. @@ -1230,7 +1230,7 @@ func (d *dwctxt2) writelines(unit *sym.CompilationUnit, ls loader.Sym) { // Output the state machine for each function remaining. var lastAddr int64 - for _, s := range unit.Textp2 { + for _, s := range unit.Textp { fnSym := loader.Sym(s) // Set the PC. @@ -1274,7 +1274,7 @@ func (d *dwctxt2) writelines(unit *sym.CompilationUnit, ls loader.Sym) { } // writepcranges generates the DW_AT_ranges table for compilation unit cu. -func (d *dwctxt2) writepcranges(unit *sym.CompilationUnit, base loader.Sym, pcs []dwarf.Range, ranges loader.Sym) { +func (d *dwctxt) writepcranges(unit *sym.CompilationUnit, base loader.Sym, pcs []dwarf.Range, ranges loader.Sym) { rsu := d.ldr.MakeSymbolUpdater(ranges) rDwSym := dwSym(ranges) @@ -1319,7 +1319,7 @@ func appendPCDeltaCFA(arch *sys.Arch, b []byte, deltapc, cfa int64) []byte { return b } -func (d *dwctxt2) writeframes() dwarfSecInfo { +func (d *dwctxt) writeframes() dwarfSecInfo { fs := d.ldr.LookupOrCreateSym(".debug_frame", 0) fsd := dwSym(fs) fsu := d.ldr.MakeSymbolUpdater(fs) @@ -1381,7 +1381,7 @@ func (d *dwctxt2) writeframes() dwarfSecInfo { var deltaBuf []byte pcsp := obj.NewPCIter(uint32(d.arch.MinLC)) - for _, s := range d.linkctxt.Textp2 { + for _, s := range d.linkctxt.Textp { fn := loader.Sym(s) fi := d.ldr.FuncInfo(fn) if !fi.Valid() { @@ -1488,7 +1488,7 @@ func appendSyms(syms []loader.Sym, src []sym.LoaderSym) []loader.Sym { return syms } -func (d *dwctxt2) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, pubNames, pubTypes *pubWriter2) dwarfSecInfo { +func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, pubNames, pubTypes *pubWriter) dwarfSecInfo { infosec := d.ldr.LookupOrCreateSym(".debug_info", 0) disu := d.ldr.MakeSymbolUpdater(infosec) @@ -1501,7 +1501,7 @@ func (d *dwctxt2) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, s := d.dtolsym(compunit.Sym) su := d.ldr.MakeSymbolUpdater(s) - if len(u.Textp2) == 0 && u.DWInfo.Child == nil { + if len(u.Textp) == 0 && u.DWInfo.Child == nil { continue } @@ -1524,10 +1524,10 @@ func (d *dwctxt2) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, dwarf.PutAttrs(d, ds, compunit.Abbrev, compunit.Attr) cu := []loader.Sym{s} - cu = appendSyms(cu, u.AbsFnDIEs2) - cu = appendSyms(cu, u.FuncDIEs2) - if u.Consts2 != 0 { - cu = append(cu, loader.Sym(u.Consts2)) + cu = appendSyms(cu, u.AbsFnDIEs) + cu = appendSyms(cu, u.FuncDIEs) + if u.Consts != 0 { + cu = append(cu, loader.Sym(u.Consts)) } var cusize int64 for _, child := range cu { @@ -1581,8 +1581,8 @@ func (d *dwctxt2) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, * because we need die->offs and infoo/infosize; */ -type pubWriter2 struct { - d *dwctxt2 +type pubWriter struct { + d *dwctxt s loader.Sym su *loader.SymbolBuilder sname string @@ -1591,14 +1591,14 @@ type pubWriter2 struct { culengthOff int64 } -func newPubWriter2(d *dwctxt2, sname string) *pubWriter2 { +func newPubWriter(d *dwctxt, sname string) *pubWriter { s := d.ldr.LookupOrCreateSym(sname, 0) u := d.ldr.MakeSymbolUpdater(s) u.SetType(sym.SDWARFSECT) - return &pubWriter2{d: d, s: s, su: u, sname: sname} + return &pubWriter{d: d, s: s, su: u, sname: sname} } -func (pw *pubWriter2) beginCompUnit(compunit *dwarf.DWDie) { +func (pw *pubWriter) beginCompUnit(compunit *dwarf.DWDie) { pw.sectionstart = pw.su.Size() // Write .debug_pubnames/types Header (sec 6.1.1) @@ -1609,7 +1609,7 @@ func (pw *pubWriter2) beginCompUnit(compunit *dwarf.DWDie) { pw.d.addDwarfAddrField(pw.su, uint64(0)) // debug_info_length, will be filled in later. } -func (pw *pubWriter2) add(die *dwarf.DWDie, offset int64) { +func (pw *pubWriter) add(die *dwarf.DWDie, offset int64) { dwa := getattr(die, dwarf.DW_AT_name) name := dwa.Data.(string) if pw.d.dtolsym(die.Sym) == 0 { @@ -1619,7 +1619,7 @@ func (pw *pubWriter2) add(die *dwarf.DWDie, offset int64) { pw.su.Addstring(name) } -func (pw *pubWriter2) endCompUnit(compunit *dwarf.DWDie, culength uint32) { +func (pw *pubWriter) endCompUnit(compunit *dwarf.DWDie, culength uint32) { pw.d.addDwarfAddrField(pw.su, 0) // Null offset // On AIX, save the current size of this compilation unit. @@ -1649,7 +1649,7 @@ func ispubtype(die *dwarf.DWDie) bool { return die.Abbrev >= dwarf.DW_ABRV_NULLTYPE } -func (d *dwctxt2) writegdbscript() dwarfSecInfo { +func (d *dwctxt) writegdbscript() dwarfSecInfo { // TODO (aix): make it available if d.linkctxt.HeadType == objabi.Haix { return dwarfSecInfo{} @@ -1713,7 +1713,7 @@ func dwarfEnabled(ctxt *Link) bool { // mkBuiltinType populates the dwctxt2 sym lookup maps for the // newly created builtin type DIE 'typeDie'. -func (d *dwctxt2) mkBuiltinType(ctxt *Link, abrv int, tname string) *dwarf.DWDie { +func (d *dwctxt) mkBuiltinType(ctxt *Link, abrv int, tname string) *dwarf.DWDie { // create type DIE die := d.newdie(&dwtypes, abrv, tname, 0) @@ -1742,7 +1742,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { return } - d := newdwctxt2(ctxt, true) + d := newdwctxt(ctxt, true) if ctxt.HeadType == objabi.Haix { // Initial map used to store package size for each DWARF section. @@ -1803,7 +1803,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { for _, unit := range lib.Units { // We drop the constants into the first CU. if consts != 0 { - unit.Consts2 = sym.LoaderSym(consts) + unit.Consts = sym.LoaderSym(consts) d.importInfoSymbol(ctxt, consts) consts = 0 } @@ -1850,7 +1850,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { } newattr(unit.DWInfo, dwarf.DW_AT_go_package_name, dwarf.DW_CLS_STRING, int64(len(pkgname)), pkgname) - if len(unit.Textp2) == 0 { + if len(unit.Textp) == 0 { unit.DWInfo.Abbrev = dwarf.DW_ABRV_COMPUNIT_TEXTLESS } @@ -1858,7 +1858,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { // referenced types, create the file table for debug_line, find all // referenced abstract functions. // Collect all debug_range symbols in unit.rangeSyms - for _, s := range unit.Textp2 { // textp2 has been dead-code-eliminated already. + for _, s := range unit.Textp { // Textp has been dead-code-eliminated already. fnSym := loader.Sym(s) infosym, _, rangesym, _ := d.ldr.GetFuncDwarfAuxSyms(fnSym) if infosym == 0 { @@ -1867,7 +1867,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { d.ldr.SetAttrNotInSymbolTable(infosym, true) d.ldr.SetAttrReachable(infosym, true) - unit.FuncDIEs2 = append(unit.FuncDIEs2, sym.LoaderSym(infosym)) + unit.FuncDIEs = append(unit.FuncDIEs, sym.LoaderSym(infosym)) if rangesym != 0 { rs := len(d.ldr.Data(rangesym)) d.ldr.SetAttrNotInSymbolTable(rangesym, true) @@ -1875,7 +1875,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { if ctxt.HeadType == objabi.Haix { addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(rs)) } - unit.RangeSyms2 = append(unit.RangeSyms2, sym.LoaderSym(rangesym)) + unit.RangeSyms = append(unit.RangeSyms, sym.LoaderSym(rangesym)) } drelocs := d.ldr.Relocs(infosym) @@ -1891,7 +1891,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { if strings.HasPrefix(rsn, dwarf.InfoPrefix) && strings.HasSuffix(rsn, dwarf.AbstractFuncSuffix) && !d.ldr.AttrOnList(rsym) { // abstract function d.ldr.SetAttrOnList(rsym, true) - unit.AbsFnDIEs2 = append(unit.AbsFnDIEs2, sym.LoaderSym(rsym)) + unit.AbsFnDIEs = append(unit.AbsFnDIEs, sym.LoaderSym(rsym)) d.importInfoSymbol(ctxt, rsym) continue } @@ -1956,7 +1956,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { // autos (which may not appear directly as param/var DIEs). for _, lib := range ctxt.Library { for _, unit := range lib.Units { - lists := [][]sym.LoaderSym{unit.AbsFnDIEs2, unit.FuncDIEs2} + lists := [][]sym.LoaderSym{unit.AbsFnDIEs, unit.FuncDIEs} for _, list := range lists { for _, s := range list { symIdx := loader.Sym(s) @@ -1990,7 +1990,7 @@ func dwarfGenerateDebugSyms(ctxt *Link) { if !dwarfEnabled(ctxt) { return } - d := &dwctxt2{ + d := &dwctxt{ linkctxt: ctxt, ldr: ctxt.loader, arch: ctxt.Arch, @@ -1998,9 +1998,9 @@ func dwarfGenerateDebugSyms(ctxt *Link) { d.dwarfGenerateDebugSyms() } -func (d *dwctxt2) dwarfGenerateDebugSyms() { +func (d *dwctxt) dwarfGenerateDebugSyms() { abbrevSec := d.writeabbrev() - dwarfp2 = append(dwarfp2, abbrevSec) + dwarfp = append(dwarfp, abbrevSec) d.calcCompUnitRanges() sort.Sort(compilationUnitByStartPC(d.linkctxt.compUnits)) @@ -2010,7 +2010,7 @@ func (d *dwctxt2) dwarfGenerateDebugSyms() { dlu := d.ldr.MakeSymbolUpdater(debugLine) dlu.SetType(sym.SDWARFSECT) d.ldr.SetAttrReachable(debugLine, true) - dwarfp2 = append(dwarfp2, dwarfSecInfo{syms: []loader.Sym{debugLine}}) + dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{debugLine}}) debugRanges := d.ldr.LookupOrCreateSym(".debug_ranges", 0) dru := d.ldr.MakeSymbolUpdater(debugRanges) @@ -2024,7 +2024,7 @@ func (d *dwctxt2) dwarfGenerateDebugSyms() { continue } d.writelines(u, debugLine) - base := loader.Sym(u.Textp2[0]) + base := loader.Sym(u.Textp[0]) d.writepcranges(u, base, u.PCs, debugRanges) } @@ -2034,39 +2034,39 @@ func (d *dwctxt2) dwarfGenerateDebugSyms() { reversetree(&dwtypes.Child) movetomodule(d.linkctxt, &dwtypes) - pubNames := newPubWriter2(d, ".debug_pubnames") - pubTypes := newPubWriter2(d, ".debug_pubtypes") + pubNames := newPubWriter(d, ".debug_pubnames") + pubTypes := newPubWriter(d, ".debug_pubtypes") infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym(), pubNames, pubTypes) framesSec := d.writeframes() - dwarfp2 = append(dwarfp2, framesSec) - dwarfp2 = append(dwarfp2, dwarfSecInfo{syms: []loader.Sym{pubNames.s}}) - dwarfp2 = append(dwarfp2, dwarfSecInfo{syms: []loader.Sym{pubTypes.s}}) + dwarfp = append(dwarfp, framesSec) + dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{pubNames.s}}) + dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{pubTypes.s}}) gdbScriptSec := d.writegdbscript() if gdbScriptSec.secSym() != 0 { - dwarfp2 = append(dwarfp2, gdbScriptSec) + dwarfp = append(dwarfp, gdbScriptSec) } - dwarfp2 = append(dwarfp2, infoSec) + dwarfp = append(dwarfp, infoSec) locSec := d.collectlocs(d.linkctxt.compUnits) if locSec.secSym() != 0 { - dwarfp2 = append(dwarfp2, locSec) + dwarfp = append(dwarfp, locSec) } rsyms := []loader.Sym{debugRanges} for _, unit := range d.linkctxt.compUnits { - for _, s := range unit.RangeSyms2 { + for _, s := range unit.RangeSyms { rsyms = append(rsyms, loader.Sym(s)) } } - dwarfp2 = append(dwarfp2, dwarfSecInfo{syms: rsyms}) + dwarfp = append(dwarfp, dwarfSecInfo{syms: rsyms}) } -func (d *dwctxt2) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo { +func (d *dwctxt) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo { empty := true syms := []loader.Sym{} for _, u := range units { - for _, fn := range u.FuncDIEs2 { + for _, fn := range u.FuncDIEs { relocs := d.ldr.Relocs(loader.Sym(fn)) for i := 0; i < relocs.Count(); i++ { reloc := relocs.At2(i) @@ -2102,7 +2102,7 @@ func (d *dwctxt2) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo { // represented by s. // The prefix dwarf.InfoPrefix+".pkg." needs to be removed in order to get // the package name. -func (d *dwctxt2) getPkgFromCUSym(s loader.Sym) string { +func (d *dwctxt) getPkgFromCUSym(s loader.Sym) string { return strings.TrimPrefix(d.ldr.SymName(s), dwarf.InfoPrefix+".pkg.") } @@ -2135,7 +2135,7 @@ func dwarfaddelfsectionsyms(ctxt *Link) { } ldr := ctxt.loader - for _, si := range dwarfp2 { + for _, si := range dwarfp { s := si.secSym() sect := ldr.SymSect(si.secSym()) putelfsectionsym(ctxt, ctxt.Out, s, sect.Elfsect.(*ElfShdr).shnum) diff --git a/src/cmd/link/internal/ld/dwarf2.go b/src/cmd/link/internal/ld/dwarf2.go index 1848e89ec6..0c1a0ca221 100644 --- a/src/cmd/link/internal/ld/dwarf2.go +++ b/src/cmd/link/internal/ld/dwarf2.go @@ -61,10 +61,10 @@ func dwarfcompress(ctxt *Link) { var compressedCount int resChannel := make(chan compressedSect) - for i := range dwarfp2 { + for i := range dwarfp { go func(resIndex int, syms []loader.Sym) { resChannel <- compressedSect{resIndex, compressSyms(ctxt, syms), syms} - }(compressedCount, dwarfp2[i].syms) + }(compressedCount, dwarfp[i].syms) compressedCount++ } res := make([]compressedSect, compressedCount) @@ -103,14 +103,14 @@ func dwarfcompress(ctxt *Link) { } } } - dwarfp2 = newDwarfp + dwarfp = newDwarfp // Re-compute the locations of the compressed DWARF symbols // and sections, since the layout of these within the file is // based on Section.Vaddr and Symbol.Value. pos := Segdwarf.Vaddr var prevSect *sym.Section - for _, si := range dwarfp2 { + for _, si := range dwarfp { for _, s := range si.syms { ldr.SetSymValue(s, int64(pos)) sect := ldr.SymSect(s) @@ -137,11 +137,11 @@ func (v compilationUnitByStartPC) Swap(i, j int) { v[i], v[j] = v[j], v[i] } func (v compilationUnitByStartPC) Less(i, j int) bool { switch { - case len(v[i].Textp2) == 0 && len(v[j].Textp2) == 0: + case len(v[i].Textp) == 0 && len(v[j].Textp) == 0: return v[i].Lib.Pkg < v[j].Lib.Pkg - case len(v[i].Textp2) != 0 && len(v[j].Textp2) == 0: + case len(v[i].Textp) != 0 && len(v[j].Textp) == 0: return true - case len(v[i].Textp2) == 0 && len(v[j].Textp2) != 0: + case len(v[i].Textp) == 0 && len(v[j].Textp) != 0: return false default: return v[i].PCs[0].Start < v[j].PCs[0].Start diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 341ac84469..6e75e6ffaf 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -744,10 +744,10 @@ func elfhash(name string) uint32 { } func elfWriteDynEntSym(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { - Elfwritedynentsymplus2(ctxt, s, tag, t, 0) + Elfwritedynentsymplus(ctxt, s, tag, t, 0) } -func Elfwritedynent2(arch *sys.Arch, s *loader.SymbolBuilder, tag int, val uint64) { +func Elfwritedynent(arch *sys.Arch, s *loader.SymbolBuilder, tag int, val uint64) { if elf64 { s.AddUint64(arch, uint64(tag)) s.AddUint64(arch, val) @@ -757,11 +757,11 @@ func Elfwritedynent2(arch *sys.Arch, s *loader.SymbolBuilder, tag int, val uint6 } } -func elfwritedynentsym2(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { - Elfwritedynentsymplus2(ctxt, s, tag, t, 0) +func elfwritedynentsym(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { + Elfwritedynentsymplus(ctxt, s, tag, t, 0) } -func Elfwritedynentsymplus2(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym, add int64) { +func Elfwritedynentsymplus(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym, add int64) { if elf64 { s.AddUint64(ctxt.Arch, uint64(tag)) } else { @@ -770,7 +770,7 @@ func Elfwritedynentsymplus2(ctxt *Link, s *loader.SymbolBuilder, tag int, t load s.AddAddrPlus(ctxt.Arch, t, add) } -func elfwritedynentsymsize2(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { +func elfwritedynentsymsize(ctxt *Link, s *loader.SymbolBuilder, tag int, t loader.Sym) { if elf64 { s.AddUint64(ctxt.Arch, uint64(tag)) } else { @@ -1028,7 +1028,7 @@ havelib: return aux } -func elfdynhash2(ctxt *Link) { +func elfdynhash(ctxt *Link) { if !ctxt.IsELF { return } @@ -1147,22 +1147,22 @@ func elfdynhash2(ctxt *Link) { elfverneed = nfile if elfverneed != 0 { elfWriteDynEntSym(ctxt, s, DT_VERNEED, gnuVersionR.Sym()) - Elfwritedynent2(ctxt.Arch, s, DT_VERNEEDNUM, uint64(nfile)) + Elfwritedynent(ctxt.Arch, s, DT_VERNEEDNUM, uint64(nfile)) elfWriteDynEntSym(ctxt, s, DT_VERSYM, gnuVersion.Sym()) } sy := ldr.CreateSymForUpdate(elfRelType+".plt", 0) if sy.Size() > 0 { if elfRelType == ".rela" { - Elfwritedynent2(ctxt.Arch, s, DT_PLTREL, DT_RELA) + Elfwritedynent(ctxt.Arch, s, DT_PLTREL, DT_RELA) } else { - Elfwritedynent2(ctxt.Arch, s, DT_PLTREL, DT_REL) + Elfwritedynent(ctxt.Arch, s, DT_PLTREL, DT_REL) } - elfwritedynentsymsize2(ctxt, s, DT_PLTRELSZ, sy.Sym()) + elfwritedynentsymsize(ctxt, s, DT_PLTRELSZ, sy.Sym()) elfWriteDynEntSym(ctxt, s, DT_JMPREL, sy.Sym()) } - Elfwritedynent2(ctxt.Arch, s, DT_NULL, 0) + Elfwritedynent(ctxt.Arch, s, DT_NULL, 0) } func elfphload(seg *sym.Segment) *ElfPhdr { @@ -1382,14 +1382,14 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) { ldr.Errorf(s, "missing xsym in relocation") continue } - esr := ElfSymForReloc2(ctxt, r.Xsym) + esr := ElfSymForReloc(ctxt, r.Xsym) if esr == 0 { ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) } if !ldr.AttrReachable(r.Xsym) { ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) } - if !thearch.Elfreloc2(ctxt, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) { + if !thearch.Elfreloc1(ctxt, ldr, s, r, 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())) } } @@ -1406,25 +1406,25 @@ func Elfemitreloc(ctxt *Link) { for _, sect := range Segtext.Sections { if sect.Name == ".text" { - elfrelocsect(ctxt, sect, ctxt.Textp2) + elfrelocsect(ctxt, sect, ctxt.Textp) } else { - elfrelocsect(ctxt, sect, ctxt.datap2) + elfrelocsect(ctxt, sect, ctxt.datap) } } for _, sect := range Segrodata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap2) + elfrelocsect(ctxt, sect, ctxt.datap) } for _, sect := range Segrelrodata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap2) + elfrelocsect(ctxt, sect, ctxt.datap) } for _, sect := range Segdata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap2) + elfrelocsect(ctxt, sect, ctxt.datap) } for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] - si := dwarfp2[i] - if si.secSym() != loader.Sym(sect.Sym2) || + si := dwarfp[i] + if si.secSym() != loader.Sym(sect.Sym) || ctxt.loader.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } @@ -1656,47 +1656,47 @@ func (ctxt *Link) doelf() { /* * .dynamic table */ - elfwritedynentsym2(ctxt, dynamic, DT_HASH, hash.Sym()) + elfwritedynentsym(ctxt, dynamic, DT_HASH, hash.Sym()) - elfwritedynentsym2(ctxt, dynamic, DT_SYMTAB, dynsym.Sym()) + elfwritedynentsym(ctxt, dynamic, DT_SYMTAB, dynsym.Sym()) if elf64 { - Elfwritedynent2(ctxt.Arch, dynamic, DT_SYMENT, ELF64SYMSIZE) + Elfwritedynent(ctxt.Arch, dynamic, DT_SYMENT, ELF64SYMSIZE) } else { - Elfwritedynent2(ctxt.Arch, dynamic, DT_SYMENT, ELF32SYMSIZE) + Elfwritedynent(ctxt.Arch, dynamic, DT_SYMENT, ELF32SYMSIZE) } - elfwritedynentsym2(ctxt, dynamic, DT_STRTAB, dynstr.Sym()) - elfwritedynentsymsize2(ctxt, dynamic, DT_STRSZ, dynstr.Sym()) + elfwritedynentsym(ctxt, dynamic, DT_STRTAB, dynstr.Sym()) + elfwritedynentsymsize(ctxt, dynamic, DT_STRSZ, dynstr.Sym()) if elfRelType == ".rela" { rela := ldr.LookupOrCreateSym(".rela", 0) - elfwritedynentsym2(ctxt, dynamic, DT_RELA, rela) - elfwritedynentsymsize2(ctxt, dynamic, DT_RELASZ, rela) - Elfwritedynent2(ctxt.Arch, dynamic, DT_RELAENT, ELF64RELASIZE) + elfwritedynentsym(ctxt, dynamic, DT_RELA, rela) + elfwritedynentsymsize(ctxt, dynamic, DT_RELASZ, rela) + Elfwritedynent(ctxt.Arch, dynamic, DT_RELAENT, ELF64RELASIZE) } else { rel := ldr.LookupOrCreateSym(".rel", 0) - elfwritedynentsym2(ctxt, dynamic, DT_REL, rel) - elfwritedynentsymsize2(ctxt, dynamic, DT_RELSZ, rel) - Elfwritedynent2(ctxt.Arch, dynamic, DT_RELENT, ELF32RELSIZE) + elfwritedynentsym(ctxt, dynamic, DT_REL, rel) + elfwritedynentsymsize(ctxt, dynamic, DT_RELSZ, rel) + Elfwritedynent(ctxt.Arch, dynamic, DT_RELENT, ELF32RELSIZE) } if rpath.val != "" { - Elfwritedynent2(ctxt.Arch, dynamic, DT_RUNPATH, uint64(dynstr.Addstring(rpath.val))) + Elfwritedynent(ctxt.Arch, dynamic, DT_RUNPATH, uint64(dynstr.Addstring(rpath.val))) } if ctxt.IsPPC64() { - elfwritedynentsym2(ctxt, dynamic, DT_PLTGOT, plt.Sym()) + elfwritedynentsym(ctxt, dynamic, DT_PLTGOT, plt.Sym()) } else { - elfwritedynentsym2(ctxt, dynamic, DT_PLTGOT, gotplt.Sym()) + elfwritedynentsym(ctxt, dynamic, DT_PLTGOT, gotplt.Sym()) } if ctxt.IsPPC64() { - Elfwritedynent2(ctxt.Arch, dynamic, DT_PPC64_OPT, 0) + Elfwritedynent(ctxt.Arch, dynamic, DT_PPC64_OPT, 0) } // Solaris dynamic linker can't handle an empty .rela.plt if // DT_JMPREL is emitted so we have to defer generation of DT_PLTREL, // DT_PLTRELSZ, and DT_JMPREL dynamic entries until after we know the // size of .rel(a).plt section. - Elfwritedynent2(ctxt.Arch, dynamic, DT_DEBUG, 0) + Elfwritedynent(ctxt.Arch, dynamic, DT_DEBUG, 0) } if ctxt.IsShared() { @@ -1730,7 +1730,7 @@ func (ctxt *Link) doelf() { } // Do not write DT_NULL. elfdynhash will finish it. -func shsym2(sh *ElfShdr, ldr *loader.Loader, s loader.Sym) { +func shsym(sh *ElfShdr, ldr *loader.Loader, s loader.Sym) { if s == 0 { panic("bad symbol in shsym2") } @@ -2010,13 +2010,13 @@ func Asmbelf(ctxt *Link, symo int64) { } } sh.info = i - shsym2(sh, ldr, s) + shsym(sh, ldr, s) sh = elfshname(".dynstr") sh.type_ = SHT_STRTAB sh.flags = SHF_ALLOC sh.addralign = 1 - shsym2(sh, ldr, ldr.Lookup(".dynstr", 0)) + shsym(sh, ldr, ldr.Lookup(".dynstr", 0)) if elfverneed != 0 { sh := elfshname(".gnu.version") @@ -2025,7 +2025,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.addralign = 2 sh.link = uint32(elfshname(".dynsym").shnum) sh.entsize = 2 - shsym2(sh, ldr, ldr.Lookup(".gnu.version", 0)) + shsym(sh, ldr, ldr.Lookup(".gnu.version", 0)) sh = elfshname(".gnu.version_r") sh.type_ = SHT_GNU_VERNEED @@ -2033,7 +2033,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.addralign = uint64(ctxt.Arch.RegSize) sh.info = uint32(elfverneed) sh.link = uint32(elfshname(".dynstr").shnum) - shsym2(sh, ldr, ldr.Lookup(".gnu.version_r", 0)) + shsym(sh, ldr, ldr.Lookup(".gnu.version_r", 0)) } if elfRelType == ".rela" { @@ -2044,7 +2044,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.addralign = uint64(ctxt.Arch.RegSize) sh.link = uint32(elfshname(".dynsym").shnum) sh.info = uint32(elfshname(".plt").shnum) - shsym2(sh, ldr, ldr.Lookup(".rela.plt", 0)) + shsym(sh, ldr, ldr.Lookup(".rela.plt", 0)) sh = elfshname(".rela") sh.type_ = SHT_RELA @@ -2052,7 +2052,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = ELF64RELASIZE sh.addralign = 8 sh.link = uint32(elfshname(".dynsym").shnum) - shsym2(sh, ldr, ldr.Lookup(".rela", 0)) + shsym(sh, ldr, ldr.Lookup(".rela", 0)) } else { sh := elfshname(".rel.plt") sh.type_ = SHT_REL @@ -2060,7 +2060,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = ELF32RELSIZE sh.addralign = 4 sh.link = uint32(elfshname(".dynsym").shnum) - shsym2(sh, ldr, ldr.Lookup(".rel.plt", 0)) + shsym(sh, ldr, ldr.Lookup(".rel.plt", 0)) sh = elfshname(".rel") sh.type_ = SHT_REL @@ -2068,7 +2068,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = ELF32RELSIZE sh.addralign = 4 sh.link = uint32(elfshname(".dynsym").shnum) - shsym2(sh, ldr, ldr.Lookup(".rel", 0)) + shsym(sh, ldr, ldr.Lookup(".rel", 0)) } if eh.machine == EM_PPC64 { @@ -2076,7 +2076,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.type_ = SHT_PROGBITS sh.flags = SHF_ALLOC + SHF_EXECINSTR sh.addralign = 4 - shsym2(sh, ldr, ldr.Lookup(".glink", 0)) + shsym(sh, ldr, ldr.Lookup(".glink", 0)) } sh = elfshname(".plt") @@ -2097,7 +2097,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = 4 } sh.addralign = sh.entsize - shsym2(sh, ldr, ldr.Lookup(".plt", 0)) + shsym(sh, ldr, ldr.Lookup(".plt", 0)) // On ppc64, .got comes from the input files, so don't // create it here, and .got.plt is not used. @@ -2107,14 +2107,14 @@ func Asmbelf(ctxt *Link, symo int64) { sh.flags = SHF_ALLOC + SHF_WRITE sh.entsize = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize) - shsym2(sh, ldr, ldr.Lookup(".got", 0)) + shsym(sh, ldr, ldr.Lookup(".got", 0)) sh = elfshname(".got.plt") sh.type_ = SHT_PROGBITS sh.flags = SHF_ALLOC + SHF_WRITE sh.entsize = uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize) - shsym2(sh, ldr, ldr.Lookup(".got.plt", 0)) + shsym(sh, ldr, ldr.Lookup(".got.plt", 0)) } sh = elfshname(".hash") @@ -2123,7 +2123,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = 4 sh.addralign = uint64(ctxt.Arch.RegSize) sh.link = uint32(elfshname(".dynsym").shnum) - shsym2(sh, ldr, ldr.Lookup(".hash", 0)) + shsym(sh, ldr, ldr.Lookup(".hash", 0)) /* sh and PT_DYNAMIC for .dynamic section */ sh = elfshname(".dynamic") @@ -2133,7 +2133,7 @@ func Asmbelf(ctxt *Link, symo int64) { sh.entsize = 2 * uint64(ctxt.Arch.RegSize) sh.addralign = uint64(ctxt.Arch.RegSize) sh.link = uint32(elfshname(".dynstr").shnum) - shsym2(sh, ldr, ldr.Lookup(".dynamic", 0)) + shsym(sh, ldr, ldr.Lookup(".dynamic", 0)) ph := newElfPhdr() ph.type_ = PT_DYNAMIC ph.flags = PF_R + PF_W @@ -2177,7 +2177,7 @@ elfobj: sh := elfshname(".shstrtab") sh.type_ = SHT_STRTAB sh.addralign = 1 - shsym2(sh, ldr, ldr.Lookup(".shstrtab", 0)) + shsym(sh, ldr, ldr.Lookup(".shstrtab", 0)) eh.shstrndx = uint16(sh.shnum) // put these sections early in the list @@ -2215,7 +2215,7 @@ elfobj: for _, sect := range Segdata.Sections { elfshreloc(ctxt.Arch, sect) } - for _, si := range dwarfp2 { + for _, si := range dwarfp { sect := ldr.SymSect(si.secSym()) elfshreloc(ctxt.Arch, sect) } @@ -2280,7 +2280,7 @@ elfobj: } if ctxt.LinkMode != LinkExternal { - eh.entry = uint64(Entryvalue2(ctxt)) + eh.entry = uint64(Entryvalue(ctxt)) } eh.version = EV_CURRENT @@ -2321,12 +2321,12 @@ elfobj: } } -func elfadddynsym2(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym) { +func elfadddynsym(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym) { ldr.SetSymDynid(s, int32(Nelfsym)) Nelfsym++ - d := ldr.MakeSymbolUpdater(syms.DynSym2) + d := ldr.MakeSymbolUpdater(syms.DynSym) name := ldr.SymExtname(s) - dstru := ldr.MakeSymbolUpdater(syms.DynStr2) + dstru := ldr.MakeSymbolUpdater(syms.DynStr) st := ldr.SymType(s) cgoeStatic := ldr.AttrCgoExportStatic(s) cgoeDynamic := ldr.AttrCgoExportDynamic(s) @@ -2369,8 +2369,8 @@ func elfadddynsym2(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader. dil := ldr.SymDynimplib(s) if target.Arch.Family == sys.AMD64 && !cgoeDynamic && dil != "" && !seenlib[dil] { - du := ldr.MakeSymbolUpdater(syms.Dynamic2) - Elfwritedynent2(target.Arch, du, DT_NEEDED, uint64(dstru.Addstring(dil))) + du := ldr.MakeSymbolUpdater(syms.Dynamic) + Elfwritedynent(target.Arch, du, DT_NEEDED, uint64(dstru.Addstring(dil))) } } else { diff --git a/src/cmd/link/internal/ld/go.go b/src/cmd/link/internal/ld/go.go index d9030f4a01..2131c039e5 100644 --- a/src/cmd/link/internal/ld/go.go +++ b/src/cmd/link/internal/ld/go.go @@ -309,24 +309,24 @@ func adddynlib(ctxt *Link, lib string) { seenlib[lib] = true if ctxt.IsELF { - dsu := ctxt.loader.MakeSymbolUpdater(ctxt.DynStr2) + dsu := ctxt.loader.MakeSymbolUpdater(ctxt.DynStr) if dsu.Size() == 0 { dsu.Addstring("") } - du := ctxt.loader.MakeSymbolUpdater(ctxt.Dynamic2) - Elfwritedynent2(ctxt.Arch, du, DT_NEEDED, uint64(dsu.Addstring(lib))) + du := ctxt.loader.MakeSymbolUpdater(ctxt.Dynamic) + Elfwritedynent(ctxt.Arch, du, DT_NEEDED, uint64(dsu.Addstring(lib))) } else { Errorf(nil, "adddynlib: unsupported binary format") } } -func Adddynsym2(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym) { +func Adddynsym(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym) { if ldr.SymDynid(s) >= 0 || target.LinkMode == LinkExternal { return } if target.IsELF { - elfadddynsym2(ldr, target, syms, s) + elfadddynsym(ldr, target, syms, s) } else if target.HeadType == objabi.Hdarwin { ldr.Errorf(s, "adddynsym: missed symbol (Extname=%s)", ldr.SymExtname(s)) } else if target.HeadType == objabi.Hwindows { @@ -368,7 +368,7 @@ func fieldtrack(arch *sys.Arch, l *loader.Loader) { func (ctxt *Link) addexport() { // Track undefined external symbols during external link. if ctxt.LinkMode == LinkExternal { - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { if ctxt.loader.AttrSpecial(s) || ctxt.loader.AttrSubSymbol(s) { continue } @@ -393,8 +393,8 @@ func (ctxt *Link) addexport() { return } - for _, exp := range ctxt.dynexp2 { - Adddynsym2(ctxt.loader, &ctxt.Target, &ctxt.ArchSyms, exp) + for _, exp := range ctxt.dynexp { + Adddynsym(ctxt.loader, &ctxt.Target, &ctxt.ArchSyms, exp) } for _, lib := range dynlib { adddynlib(ctxt, lib) diff --git a/src/cmd/link/internal/ld/ld.go b/src/cmd/link/internal/ld/ld.go index c913a519a1..9b8c219582 100644 --- a/src/cmd/link/internal/ld/ld.go +++ b/src/cmd/link/internal/ld/ld.go @@ -248,11 +248,11 @@ func PrepareAddmoduledata(ctxt *Link) (*loader.SymbolBuilder, loader.Sym) { ctxt.loader.SetAttrLocal(ifs, true) initfunc.SetType(sym.STEXT) - // Add the init func and/or addmoduledata to Textp2. + // Add the init func and/or addmoduledata to Textp. if ctxt.BuildMode == BuildModePlugin { - ctxt.Textp2 = append(ctxt.Textp2, amd) + ctxt.Textp = append(ctxt.Textp, amd) } - ctxt.Textp2 = append(ctxt.Textp2, initfunc.Sym()) + ctxt.Textp = append(ctxt.Textp, initfunc.Sym()) // Create an init array entry amdi := ctxt.loader.LookupOrCreateSym("go.link.addmoduledatainit", 0) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 2e8aefbd88..04c4adfb86 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -98,27 +98,27 @@ import ( // relocation. Rather than allowing them universal access to all symbols, // we keep a subset for relocation application. type ArchSyms struct { - Rel2 loader.Sym - Rela2 loader.Sym - RelPLT2 loader.Sym - RelaPLT2 loader.Sym + Rel loader.Sym + Rela loader.Sym + RelPLT loader.Sym + RelaPLT loader.Sym - LinkEditGOT2 loader.Sym - LinkEditPLT2 loader.Sym + LinkEditGOT loader.Sym + LinkEditPLT loader.Sym - TOC2 loader.Sym - DotTOC2 []loader.Sym // for each version + TOC loader.Sym + DotTOC []loader.Sym // for each version - GOT2 loader.Sym - PLT2 loader.Sym - GOTPLT2 loader.Sym + GOT loader.Sym + PLT loader.Sym + GOTPLT loader.Sym - Tlsg2 loader.Sym + Tlsg loader.Sym Tlsoffset int - Dynamic2 loader.Sym - DynSym2 loader.Sym - DynStr2 loader.Sym + Dynamic loader.Sym + DynSym loader.Sym + DynStr loader.Sym } // mkArchSym is a helper for setArchSyms, to set up a special symbol. @@ -135,15 +135,15 @@ func (ctxt *Link) mkArchSymVec(name string, ver int, ls []loader.Sym) { // setArchSyms sets up the ArchSyms structure, and must be called before // relocations are applied. func (ctxt *Link) setArchSyms() { - ctxt.mkArchSym(".got", 0, &ctxt.GOT2) - ctxt.mkArchSym(".plt", 0, &ctxt.PLT2) - ctxt.mkArchSym(".got.plt", 0, &ctxt.GOTPLT2) - ctxt.mkArchSym(".dynamic", 0, &ctxt.Dynamic2) - ctxt.mkArchSym(".dynsym", 0, &ctxt.DynSym2) - ctxt.mkArchSym(".dynstr", 0, &ctxt.DynStr2) + ctxt.mkArchSym(".got", 0, &ctxt.GOT) + ctxt.mkArchSym(".plt", 0, &ctxt.PLT) + ctxt.mkArchSym(".got.plt", 0, &ctxt.GOTPLT) + ctxt.mkArchSym(".dynamic", 0, &ctxt.Dynamic) + ctxt.mkArchSym(".dynsym", 0, &ctxt.DynSym) + ctxt.mkArchSym(".dynstr", 0, &ctxt.DynStr) if ctxt.IsPPC64() { - ctxt.mkArchSym("TOC", 0, &ctxt.TOC2) + ctxt.mkArchSym("TOC", 0, &ctxt.TOC) // NB: note the +2 below for DotTOC2 compared to the +1 for // DocTOC. This is because loadlibfull() creates an additional @@ -151,23 +151,23 @@ func (ctxt *Link) setArchSyms() { // *sym.Symbol symbols. Symbols that are assigned this final // version are not going to have TOC references, so it should // be ok for them to inherit an invalid .TOC. symbol. - ctxt.DotTOC2 = make([]loader.Sym, ctxt.Syms.MaxVersion()+2) + ctxt.DotTOC = make([]loader.Sym, ctxt.Syms.MaxVersion()+2) for i := 0; i <= ctxt.Syms.MaxVersion(); i++ { if i >= 2 && i < sym.SymVerStatic { // these versions are not used currently continue } - ctxt.mkArchSymVec(".TOC.", i, ctxt.DotTOC2) + ctxt.mkArchSymVec(".TOC.", i, ctxt.DotTOC) } } if ctxt.IsElf() { - ctxt.mkArchSym(".rel", 0, &ctxt.Rel2) - ctxt.mkArchSym(".rela", 0, &ctxt.Rela2) - ctxt.mkArchSym(".rel.plt", 0, &ctxt.RelPLT2) - ctxt.mkArchSym(".rela.plt", 0, &ctxt.RelaPLT2) + ctxt.mkArchSym(".rel", 0, &ctxt.Rel) + ctxt.mkArchSym(".rela", 0, &ctxt.Rela) + ctxt.mkArchSym(".rel.plt", 0, &ctxt.RelPLT) + ctxt.mkArchSym(".rela.plt", 0, &ctxt.RelaPLT) } if ctxt.IsDarwin() { - ctxt.mkArchSym(".linkedit.got", 0, &ctxt.LinkEditGOT2) - ctxt.mkArchSym(".linkedit.plt", 0, &ctxt.LinkEditPLT2) + ctxt.mkArchSym(".linkedit.got", 0, &ctxt.LinkEditGOT) + ctxt.mkArchSym(".linkedit.plt", 0, &ctxt.LinkEditPLT) } } @@ -219,10 +219,9 @@ type Arch struct { Asmb func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader) - Elfreloc2 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + Elfreloc1 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) - Gentext func(*Link) - Gentext2 func(*Link, *loader.Loader) + Gentext func(*Link, *loader.Loader) Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool @@ -618,7 +617,7 @@ func setupdynexp(ctxt *Link) { ctxt.loader.SetSymExtname(t, ctxt.loader.SymExtname(s)) d[i] = t } - ctxt.dynexp2 = d + ctxt.dynexp = d ctxt.cgo_export_static = nil ctxt.cgo_export_dynamic = nil @@ -717,7 +716,7 @@ func (ctxt *Link) linksetup() { Errorf(nil, "runtime declared tlsg variable %v", sb.Type()) } ctxt.loader.SetAttrReachable(tlsg, true) - ctxt.Tlsg2 = tlsg + ctxt.Tlsg = tlsg } var moduledata loader.Sym @@ -766,7 +765,7 @@ func (ctxt *Link) linksetup() { // the GC. mdsb.SetType(sym.SNOPTRDATA) ctxt.loader.SetAttrReachable(moduledata, true) - ctxt.Moduledata2 = moduledata + ctxt.Moduledata = moduledata // If package versioning is required, generate a hash of the // packages used in the link. @@ -787,7 +786,7 @@ func (ctxt *Link) linksetup() { } } - // DWARF-gen and other phases require that the unit Textp2 slices + // DWARF-gen and other phases require that the unit Textp slices // be populated, so that it can walk the functions in each unit. // Call into the loader to do this (requires that we collect the // set of internal libraries first). NB: might be simpler if we @@ -798,7 +797,7 @@ func (ctxt *Link) linksetup() { for _, lib := range ctxt.Library { intlibs = append(intlibs, isRuntimeDepPkg(lib.Pkg)) } - ctxt.Textp2 = ctxt.loader.AssignTextSymbolOrder(ctxt.Library, intlibs, ctxt.Textp2) + ctxt.Textp = ctxt.loader.AssignTextSymbolOrder(ctxt.Library, intlibs, ctxt.Textp) } // mangleTypeSym shortens the names of symbols that represent Go types @@ -1803,7 +1802,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, return } ehdr.flags = flags - ctxt.Textp2 = append(ctxt.Textp2, textp...) + ctxt.Textp = append(ctxt.Textp, textp...) } return ldhostobj(ldelf, ctxt.HeadType, f, pkg, length, pn, file) } @@ -1815,7 +1814,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, Errorf(nil, "%v", err) return } - ctxt.Textp2 = append(ctxt.Textp2, textp...) + ctxt.Textp = append(ctxt.Textp, textp...) } return ldhostobj(ldmacho, ctxt.HeadType, f, pkg, length, pn, file) } @@ -1830,7 +1829,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, if rsrc != 0 { setpersrc(ctxt, rsrc) } - ctxt.Textp2 = append(ctxt.Textp2, textp...) + ctxt.Textp = append(ctxt.Textp, textp...) } return ldhostobj(ldpe, ctxt.HeadType, f, pkg, length, pn, file) } @@ -1842,7 +1841,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, Errorf(nil, "%v", err) return } - ctxt.Textp2 = append(ctxt.Textp2, textp...) + ctxt.Textp = append(ctxt.Textp, textp...) } return ldhostobj(ldxcoff, ctxt.HeadType, f, pkg, length, pn, file) } @@ -2242,14 +2241,14 @@ func (ctxt *Link) dostkcheck() { // Check every function, but do the nosplit functions in a first pass, // to make the printed failure chains as short as possible. - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { if ldr.IsNoSplit(s) { ch.sym = s sc.check(&ch, 0) } } - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { if !ldr.IsNoSplit(s) { ch.sym = s sc.check(&ch, 0) @@ -2435,7 +2434,7 @@ const ( DeletedAutoSym = 'x' ) -func (ctxt *Link) xdefine2(p string, t sym.SymKind, v int64) { +func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) { ldr := ctxt.loader s := ldr.CreateSymForUpdate(p, 0) s.SetType(t) @@ -2456,7 +2455,7 @@ func datoff(ldr *loader.Loader, s loader.Sym, addr int64) int64 { return 0 } -func Entryvalue2(ctxt *Link) int64 { +func Entryvalue(ctxt *Link) int64 { a := *flagEntrySymbol if a[0] >= '0' && a[0] <= '9' { return atolwhex(a) @@ -2479,7 +2478,7 @@ func (ctxt *Link) callgraph() { } ldr := ctxt.loader - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { relocs := ldr.Relocs(s) for i := 0; i < relocs.Count(); i++ { r := relocs.At2(i) @@ -2549,7 +2548,7 @@ func dfs(lib *sym.Library, mark map[*sym.Library]markKind, order *[]*sym.Library *order = append(*order, lib) } -func ElfSymForReloc2(ctxt *Link, s loader.Sym) int32 { +func ElfSymForReloc(ctxt *Link, s loader.Sym) int32 { // If putelfsym created a local version of this symbol, use that in all // relocations. les := ctxt.loader.SymLocalElfSym(s) diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 8bb42e2ac6..bca87e1c1b 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -70,9 +70,9 @@ type Link struct { Library []*sym.Library LibraryByPkg map[string]*sym.Library Shlibs []Shlib - Textp2 []loader.Sym + Textp []loader.Sym NumFilesyms int - Moduledata2 loader.Sym + Moduledata loader.Sym PackageFile map[string]string PackageShlib map[string]string @@ -88,8 +88,8 @@ type Link struct { cgo_export_static map[string]bool cgo_export_dynamic map[string]bool - datap2 []loader.Sym - dynexp2 []loader.Sym + datap []loader.Sym + dynexp []loader.Sym // Elf symtab variables. numelfsym int // starts at 0, 1 is reserved diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 2f402f332f..ab8d82f61e 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -550,7 +550,7 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string) if sect.Name == ".got" { msect.name = "__nl_symbol_ptr" msect.flag = S_NON_LAZY_SYMBOL_POINTERS - msect.res1 = uint32(ctxt.loader.SymSize(ctxt.ArchSyms.LinkEditPLT2) / 4) /* offset into indirect symbol table */ + msect.res1 = uint32(ctxt.loader.SymSize(ctxt.ArchSyms.LinkEditPLT) / 4) /* offset into indirect symbol table */ } if sect.Name == ".init_array" { @@ -662,17 +662,17 @@ func Asmbmacho(ctxt *Link) { case sys.AMD64: ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 42+2) - ml.data[0] = 4 /* thread type */ - ml.data[1] = 42 /* word count */ - ml.data[2+32] = uint32(Entryvalue2(ctxt)) /* start pc */ - ml.data[2+32+1] = uint32(Entryvalue2(ctxt) >> 32) + ml.data[0] = 4 /* thread type */ + ml.data[1] = 42 /* word count */ + ml.data[2+32] = uint32(Entryvalue(ctxt)) /* start pc */ + ml.data[2+32+1] = uint32(Entryvalue(ctxt) >> 32) case sys.ARM64: ml := newMachoLoad(ctxt.Arch, LC_UNIXTHREAD, 68+2) - ml.data[0] = 6 /* thread type */ - ml.data[1] = 68 /* word count */ - ml.data[2+64] = uint32(Entryvalue2(ctxt)) /* start pc */ - ml.data[2+64+1] = uint32(Entryvalue2(ctxt) >> 32) + ml.data[0] = 6 /* thread type */ + ml.data[1] = 68 /* word count */ + ml.data[2+64] = uint32(Entryvalue(ctxt)) /* start pc */ + ml.data[2+64+1] = uint32(Entryvalue(ctxt) >> 32) } } @@ -681,8 +681,8 @@ func Asmbmacho(ctxt *Link) { // must match domacholink below s1 := ldr.SymSize(ldr.Lookup(".machosymtab", 0)) - s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT2) - s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT2) + s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT) + s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT) s4 := ldr.SymSize(ldr.Lookup(".machosymstr", 0)) if ctxt.LinkMode != LinkExternal { @@ -758,7 +758,7 @@ func collectmachosyms(ctxt *Link) { } // Add text symbols. - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { addsym(s) } @@ -826,7 +826,7 @@ func machosymorder(ctxt *Link) { // On Mac OS X Mountain Lion, we must sort exported symbols // So we sort them here and pre-allocate dynid for them // See https://golang.org/issue/4029 - for _, s := range ctxt.dynexp2 { + for _, s := range ctxt.dynexp { if !ldr.AttrReachable(s) { panic("dynexp symbol is not reachable") } @@ -953,8 +953,8 @@ func machodysymtab(ctxt *Link) { // must match domacholink below s1 := ldr.SymSize(ldr.Lookup(".machosymtab", 0)) - s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT2) - s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT2) + s2 := ldr.SymSize(ctxt.ArchSyms.LinkEditPLT) + s3 := ldr.SymSize(ctxt.ArchSyms.LinkEditGOT) ml.data[12] = uint32(linkoff + s1) /* indirectsymoff */ ml.data[13] = uint32((s2 + s3) / 4) /* nindirectsyms */ @@ -971,8 +971,8 @@ func Domacholink(ctxt *Link) int64 { // write data that will be linkedit section s1 := ldr.Lookup(".machosymtab", 0) - s2 := ctxt.ArchSyms.LinkEditPLT2 - s3 := ctxt.ArchSyms.LinkEditGOT2 + s2 := ctxt.ArchSyms.LinkEditPLT + s3 := ctxt.ArchSyms.LinkEditGOT s4 := ldr.Lookup(".machosymstr", 0) // Force the linkedit section to end on a 16-byte @@ -1062,17 +1062,17 @@ func Machoemitreloc(ctxt *Link) { } ldr := ctxt.loader - machorelocsect(ctxt, ldr, Segtext.Sections[0], ctxt.Textp2) + machorelocsect(ctxt, ldr, Segtext.Sections[0], ctxt.Textp) for _, sect := range Segtext.Sections[1:] { - machorelocsect(ctxt, ldr, sect, ctxt.datap2) + machorelocsect(ctxt, ldr, sect, ctxt.datap) } for _, sect := range Segdata.Sections { - machorelocsect(ctxt, ldr, sect, ctxt.datap2) + machorelocsect(ctxt, ldr, sect, ctxt.datap) } for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] - si := dwarfp2[i] - if si.secSym() != loader.Sym(sect.Sym2) || + si := dwarfp[i] + if si.secSym() != loader.Sym(sect.Sym) || ctxt.loader.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index f24dc732b4..6bb1ea7a56 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -275,7 +275,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.setArchSyms() ctxt.addexport() bench.Start("Gentext") - thearch.Gentext2(ctxt, ctxt.loader) // trampolines, call stubs, etc. + thearch.Gentext(ctxt, ctxt.loader) // trampolines, call stubs, etc. bench.Start("textaddress") ctxt.textaddress() @@ -292,7 +292,7 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("symtab") symGroupType := ctxt.symtab() bench.Start("dodata") - ctxt.dodata2(symGroupType) + ctxt.dodata(symGroupType) bench.Start("address") order := ctxt.address() bench.Start("dwarfcompress") diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 00c29c63e0..dc2fb70175 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -259,7 +259,7 @@ func (ctxt *Link) pclntab() loader.Bitmap { // offset to file table [4 bytes] // Find container symbols and mark them as such. - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { outer := ldr.OuterSym(s) if outer != 0 { state.container.Set(outer) @@ -268,8 +268,8 @@ func (ctxt *Link) pclntab() loader.Bitmap { // Gather some basic stats and info. var nfunc int32 - prevSect := ldr.SymSect(ctxt.Textp2[0]) - for _, s := range ctxt.Textp2 { + prevSect := ldr.SymSect(ctxt.Textp[0]) + for _, s := range ctxt.Textp { if !emitPcln(ctxt, s, state.container) { continue } @@ -297,7 +297,7 @@ func (ctxt *Link) pclntab() loader.Bitmap { ftab.SetUint(ctxt.Arch, 8, uint64(nfunc)) pclntabPclntabOffset = int32(8 + ctxt.Arch.PtrSize) - szHint := len(ctxt.Textp2) * 2 + szHint := len(ctxt.Textp) * 2 funcnameoff := make(map[string]int32, szHint) nameToOffset := func(name string) int32 { nameoff, ok := funcnameoff[name] @@ -350,8 +350,8 @@ func (ctxt *Link) pclntab() loader.Bitmap { funcdataoff := []int64{} nfunc = 0 // repurpose nfunc as a running index - prevFunc := ctxt.Textp2[0] - for _, s := range ctxt.Textp2 { + prevFunc := ctxt.Textp[0] + for _, s := range ctxt.Textp { if !emitPcln(ctxt, s, state.container) { continue } @@ -524,7 +524,7 @@ func (ctxt *Link) pclntab() loader.Bitmap { nfunc++ } - last := ctxt.Textp2[len(ctxt.Textp2)-1] + last := ctxt.Textp[len(ctxt.Textp)-1] pclntabLastFunc = last // Final entry of table is just end pc. setAddr(ftab, ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, ldr.SymSize(last)) @@ -592,8 +592,8 @@ func (ctxt *Link) findfunctab(container loader.Bitmap) { ldr.SetAttrLocal(tsym, true) // find min and max address - min := ldr.SymValue(ctxt.Textp2[0]) - lastp := ctxt.Textp2[len(ctxt.Textp2)-1] + min := ldr.SymValue(ctxt.Textp[0]) + lastp := ctxt.Textp[len(ctxt.Textp)-1] max := ldr.SymValue(lastp) + ldr.SymSize(lastp) // for each subbucket, compute the minimum of all symbol indexes @@ -605,18 +605,18 @@ func (ctxt *Link) findfunctab(container loader.Bitmap) { indexes[i] = NOIDX } idx := int32(0) - for i, s := range ctxt.Textp2 { + for i, s := range ctxt.Textp { if !emitPcln(ctxt, s, container) { continue } p := ldr.SymValue(s) var e loader.Sym i++ - if i < len(ctxt.Textp2) { - e = ctxt.Textp2[i] + if i < len(ctxt.Textp) { + e = ctxt.Textp[i] } - for e != 0 && !emitPcln(ctxt, e, container) && i < len(ctxt.Textp2) { - e = ctxt.Textp2[i] + for e != 0 && !emitPcln(ctxt, e, container) && i < len(ctxt.Textp) { + e = ctxt.Textp[i] i++ } q := max diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 5edba67a59..7e2c35674a 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -542,9 +542,9 @@ func (f *peFile) emitRelocations(ctxt *Link) { seg *sym.Segment syms []loader.Sym }{ - {f.textSect, &Segtext, ctxt.Textp2}, - {f.rdataSect, &Segrodata, ctxt.datap2}, - {f.dataSect, &Segdata, ctxt.datap2}, + {f.textSect, &Segtext, ctxt.Textp}, + {f.rdataSect, &Segrodata, ctxt.datap}, + {f.dataSect, &Segdata, ctxt.datap}, } for _, s := range sects { s.peSect.emitRelocations(ctxt.Out, func() int { @@ -559,8 +559,8 @@ func (f *peFile) emitRelocations(ctxt *Link) { dwarfLoop: for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] - si := dwarfp2[i] - if si.secSym() != loader.Sym(sect.Sym2) || + si := dwarfp[i] + if si.secSym() != loader.Sym(sect.Sym) || ldr.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } @@ -704,7 +704,7 @@ func (f *peFile) writeSymbols(ctxt *Link) { } // Add text symbols. - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { addsym(s) } @@ -841,8 +841,8 @@ func (f *peFile) writeOptionalHeader(ctxt *Link) { oh64.SizeOfUninitializedData = 0 oh.SizeOfUninitializedData = 0 if ctxt.LinkMode != LinkExternal { - oh64.AddressOfEntryPoint = uint32(Entryvalue2(ctxt) - PEBASE) - oh.AddressOfEntryPoint = uint32(Entryvalue2(ctxt) - PEBASE) + oh64.AddressOfEntryPoint = uint32(Entryvalue(ctxt) - PEBASE) + oh.AddressOfEntryPoint = uint32(Entryvalue(ctxt) - PEBASE) } oh64.BaseOfCode = f.textSect.virtualAddress oh.BaseOfCode = f.textSect.virtualAddress @@ -1477,10 +1477,10 @@ func addPEBaseReloc(ctxt *Link) { // Get relocation information ldr := ctxt.loader - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { addPEBaseRelocSym(ldr, s, &rt) } - for _, s := range ctxt.datap2 { + for _, s := range ctxt.datap { addPEBaseRelocSym(ldr, s, &rt) } diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index bc76210be3..de5b1cc0d0 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -183,7 +183,7 @@ func genelfsym(ctxt *Link, elfbind int) { // Text symbols. s := ldr.Lookup("runtime.text", 0) putelfsym(ctxt, s, STT_FUNC, elfbind) - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { putelfsym(ctxt, s, STT_FUNC, elfbind) } s = ldr.Lookup("runtime.etext", 0) @@ -288,7 +288,7 @@ func Asmplan9sym(ctxt *Link) { } // Add text symbols. - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { putplan9sym(ctxt, ldr, s, TextSym) } @@ -410,38 +410,38 @@ func (ctxt *Link) symtab() []sym.SymKind { // Define these so that they'll get put into the symbol table. // data.c:/^address will provide the actual values. - ctxt.xdefine2("runtime.text", sym.STEXT, 0) - ctxt.xdefine2("runtime.etext", sym.STEXT, 0) - ctxt.xdefine2("runtime.itablink", sym.SRODATA, 0) - ctxt.xdefine2("runtime.eitablink", sym.SRODATA, 0) - ctxt.xdefine2("runtime.rodata", sym.SRODATA, 0) - ctxt.xdefine2("runtime.erodata", sym.SRODATA, 0) - ctxt.xdefine2("runtime.types", sym.SRODATA, 0) - ctxt.xdefine2("runtime.etypes", sym.SRODATA, 0) - ctxt.xdefine2("runtime.noptrdata", sym.SNOPTRDATA, 0) - ctxt.xdefine2("runtime.enoptrdata", sym.SNOPTRDATA, 0) - ctxt.xdefine2("runtime.data", sym.SDATA, 0) - ctxt.xdefine2("runtime.edata", sym.SDATA, 0) - ctxt.xdefine2("runtime.bss", sym.SBSS, 0) - ctxt.xdefine2("runtime.ebss", sym.SBSS, 0) - ctxt.xdefine2("runtime.noptrbss", sym.SNOPTRBSS, 0) - ctxt.xdefine2("runtime.enoptrbss", sym.SNOPTRBSS, 0) - ctxt.xdefine2("runtime.end", sym.SBSS, 0) - ctxt.xdefine2("runtime.epclntab", sym.SRODATA, 0) - ctxt.xdefine2("runtime.esymtab", sym.SRODATA, 0) + ctxt.xdefine("runtime.text", sym.STEXT, 0) + ctxt.xdefine("runtime.etext", sym.STEXT, 0) + ctxt.xdefine("runtime.itablink", sym.SRODATA, 0) + ctxt.xdefine("runtime.eitablink", sym.SRODATA, 0) + ctxt.xdefine("runtime.rodata", sym.SRODATA, 0) + ctxt.xdefine("runtime.erodata", sym.SRODATA, 0) + ctxt.xdefine("runtime.types", sym.SRODATA, 0) + ctxt.xdefine("runtime.etypes", sym.SRODATA, 0) + ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, 0) + ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATA, 0) + ctxt.xdefine("runtime.data", sym.SDATA, 0) + ctxt.xdefine("runtime.edata", sym.SDATA, 0) + ctxt.xdefine("runtime.bss", sym.SBSS, 0) + ctxt.xdefine("runtime.ebss", sym.SBSS, 0) + ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, 0) + ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, 0) + ctxt.xdefine("runtime.end", sym.SBSS, 0) + ctxt.xdefine("runtime.epclntab", sym.SRODATA, 0) + ctxt.xdefine("runtime.esymtab", sym.SRODATA, 0) // garbage collection symbols s := ldr.CreateSymForUpdate("runtime.gcdata", 0) s.SetType(sym.SRODATA) s.SetSize(0) s.SetReachable(true) - ctxt.xdefine2("runtime.egcdata", sym.SRODATA, 0) + ctxt.xdefine("runtime.egcdata", sym.SRODATA, 0) s = ldr.CreateSymForUpdate("runtime.gcbss", 0) s.SetType(sym.SRODATA) s.SetSize(0) s.SetReachable(true) - ctxt.xdefine2("runtime.egcbss", sym.SRODATA, 0) + ctxt.xdefine("runtime.egcbss", sym.SRODATA, 0) // pseudo-symbols to mark locations of type, string, and go string data. var symtype, symtyperel loader.Sym @@ -607,7 +607,7 @@ func (ctxt *Link) symtab() []sym.SymKind { // runtime to use. Any changes here must be matched by changes to // 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.Moduledata2) + moduledata := ldr.MakeSymbolUpdater(ctxt.Moduledata) pclntab := ldr.Lookup("runtime.pclntab", 0) // The pclntab slice moduledata.AddAddr(ctxt.Arch, pclntab) diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 506dde232f..05c2aa48c8 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -360,7 +360,7 @@ type XcoffLdRel64 struct { // xcoffLoaderReloc holds information about a relocation made by the loader. type xcoffLoaderReloc struct { - sym2 loader.Sym + sym loader.Sym roff int32 rtype uint16 symndx int32 @@ -568,7 +568,7 @@ var ( // xcoffUpdateOuterSize stores the size of outer symbols in order to have it // in the symbol table. -func xcoffUpdateOuterSize2(ctxt *Link, size int64, stype sym.SymKind) { +func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) { if size == 0 { return } @@ -622,7 +622,7 @@ func xcoffAlign(ldr *loader.Loader, x loader.Sym, t SymbolType) uint8 { if t == TextSym { align = int32(Funcalign) } else { - align = symalign2(ldr, x) + align = symalign(ldr, x) } } return logBase2(int(align)) @@ -671,7 +671,7 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 dwsize = getDwsectCUSize(sect.Name, name) // .debug_abbrev is common to all packages and not found with the previous function if sect.Name == ".debug_abbrev" { - dwsize = uint64(ldr.SymSize(loader.Sym(sect.Sym2))) + dwsize = uint64(ldr.SymSize(loader.Sym(sect.Sym))) } } else { @@ -693,7 +693,7 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 // Dwarf relocations need the symbol number of .dw* symbols. // It doesn't need to know it for each package, one is enough. // currSymSrcFile.csectAux == nil means first package. - ldr.SetSymDynid(loader.Sym(sect.Sym2), int32(f.symbolCount)) + ldr.SetSymDynid(loader.Sym(sect.Sym), int32(f.symbolCount)) if sect.Name == ".debug_frame" && ctxt.LinkMode != LinkExternal { // CIE size must be added to the first package. @@ -1125,7 +1125,7 @@ func (f *xcoffFile) asmaixsym(ctxt *Link) { } } - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { putaixsym(ctxt, s, TextSym) } @@ -1220,7 +1220,7 @@ func Xcoffadddynrel(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader } xldr := &xcoffLoaderReloc{ - sym2: s, + sym: s, roff: r.Off(), } targ := ldr.ResolveABIAlias(r.Sym()) @@ -1410,7 +1410,7 @@ func (f *xcoffFile) writeLdrScn(ctxt *Link, globalOff uint64) { off += uint64(16 * len(f.loaderReloc)) for _, r := range f.loaderReloc { - symp := r.sym2 + symp := r.sym if symp == 0 { panic("unexpected 0 sym value") } @@ -1713,9 +1713,9 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { for _, seg := range s.segs { for _, sect := range seg.Sections { if sect.Name == ".text" { - n += relocsect(sect, ctxt.Textp2, 0) + n += relocsect(sect, ctxt.Textp, 0) } else { - n += relocsect(sect, ctxt.datap2, 0) + n += relocsect(sect, ctxt.datap, 0) } } } @@ -1725,8 +1725,8 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { dwarfLoop: for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] - si := dwarfp2[i] - if si.secSym() != loader.Sym(sect.Sym2) || + si := dwarfp[i] + if si.secSym() != loader.Sym(sect.Sym) || ldr.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index d500861272..5696c51100 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -2275,19 +2275,19 @@ func (l *Loader) UndefinedRelocTargets(limit int) []Sym { return result } -// AssignTextSymbolOrder populates the Textp2 slices within each +// AssignTextSymbolOrder populates the Textp slices within each // library and compilation unit, insuring that packages are laid down // in dependency order (internal first, then everything else). Return value // is a slice of all text syms. func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, extsyms []Sym) []Sym { - // Library Textp2 lists should be empty at this point. + // Library Textp lists should be empty at this point. for _, lib := range libs { - if len(lib.Textp2) != 0 { - panic("expected empty Textp2 slice for library") + if len(lib.Textp) != 0 { + panic("expected empty Textp slice for library") } - if len(lib.DupTextSyms2) != 0 { - panic("expected empty DupTextSyms2 slice for library") + if len(lib.DupTextSyms) != 0 { + panic("expected empty DupTextSyms slice for library") } } @@ -2298,17 +2298,17 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts // call the regular addToTextp. assignedToUnit := MakeBitmap(l.NSym() + 1) - // Start off textp2 with reachable external syms. - textp2 := []Sym{} + // Start off textp with reachable external syms. + textp := []Sym{} for _, sym := range extsyms { if !l.attrReachable.Has(sym) { continue } - textp2 = append(textp2, sym) + textp = append(textp, sym) } // Walk through all text symbols from Go object files and append - // them to their corresponding library's textp2 list. + // them to their corresponding library's textp list. for _, o := range l.objs[goObjStart:] { r := o.r lib := r.unit.Lib @@ -2328,15 +2328,15 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts // We still need to record its presence in the current // package, as the trampoline pass expects packages // are laid out in dependency order. - lib.DupTextSyms2 = append(lib.DupTextSyms2, sym.LoaderSym(gi)) + lib.DupTextSyms = append(lib.DupTextSyms, sym.LoaderSym(gi)) continue // symbol in different object } if dupok { - lib.DupTextSyms2 = append(lib.DupTextSyms2, sym.LoaderSym(gi)) + lib.DupTextSyms = append(lib.DupTextSyms, sym.LoaderSym(gi)) continue } - lib.Textp2 = append(lib.Textp2, sym.LoaderSym(gi)) + lib.Textp = append(lib.Textp, sym.LoaderSym(gi)) } } @@ -2346,15 +2346,15 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts if intlibs[idx] != doInternal { continue } - lists := [2][]sym.LoaderSym{lib.Textp2, lib.DupTextSyms2} + lists := [2][]sym.LoaderSym{lib.Textp, lib.DupTextSyms} for i, list := range lists { for _, s := range list { sym := Sym(s) if l.attrReachable.Has(sym) && !assignedToUnit.Has(sym) { - textp2 = append(textp2, sym) + textp = append(textp, sym) unit := l.SymUnit(sym) if unit != nil { - unit.Textp2 = append(unit.Textp2, s) + unit.Textp = append(unit.Textp, s) assignedToUnit.Set(sym) } // Dupok symbols may be defined in multiple packages; the @@ -2368,12 +2368,12 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts } } } - lib.Textp2 = nil - lib.DupTextSyms2 = nil + lib.Textp = nil + lib.DupTextSyms = nil } } - return textp2 + return textp } // ErrorReporter is a helper class for reporting errors. diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 81e1582c0a..fdcb79326d 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -41,14 +41,14 @@ import ( "sync" ) -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { return } -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write32(uint32(sectoff)) - elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) switch r.Type() { default: return false diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index 3594f4ac6c..5acbaddd41 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -54,9 +54,9 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Machoreloc1: machoreloc1, Linuxdynld: "/lib/ld.so.1", diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 044dcd6a71..d72f6d2496 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -41,9 +41,9 @@ import ( "sync" ) -func gentext2(ctxt *ld.Link, ldr *loader.Loader) {} +func gentext(ctxt *ld.Link, ldr *loader.Loader) {} -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { // mips64 ELF relocation (endian neutral) // offset uint64 @@ -56,7 +56,7 @@ func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) ctxt.Out.Write32(uint32(elfsym)) ctxt.Out.Write8(0) ctxt.Out.Write8(0) @@ -236,8 +236,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ + ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ ctxt.Out.Write32(0) ctxt.Out.Write32(uint32(ld.Lcsize)) diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index bf464c207b..55ca337e06 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -53,9 +53,9 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Machoreloc1: machoreloc1, Linuxdynld: "/lib64/ld64.so.1", diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 9e89b4b801..ee14601caa 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -44,7 +44,7 @@ import ( "sync" ) -func genplt2(ctxt *ld.Link, ldr *loader.Loader) { +func genplt(ctxt *ld.Link, ldr *loader.Loader) { // 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 @@ -94,7 +94,7 @@ func genplt2(ctxt *ld.Link, ldr *loader.Loader) { // This assumes "case 1" from the ABI, where the caller needs // us to save and restore the TOC pointer. var stubs []loader.Sym - for _, s := range ctxt.Textp2 { + for _, s := range ctxt.Textp { relocs := ldr.Relocs(s) for i := 0; i < relocs.Count(); i++ { r := relocs.At2(i) @@ -104,7 +104,7 @@ func genplt2(ctxt *ld.Link, ldr *loader.Loader) { // Reserve PLT entry and generate symbol // resolver - addpltsym2(ctxt, ldr, r.Sym()) + 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), @@ -116,7 +116,7 @@ func genplt2(ctxt *ld.Link, ldr *loader.Loader) { stub := ldr.CreateSymForUpdate(n, ldr.SymVersion(s)) if stub.Size() == 0 { stubs = append(stubs, stub.Sym()) - gencallstub2(ctxt, ldr, 1, stub, r.Sym()) + gencallstub(ctxt, ldr, 1, stub, r.Sym()) } // Update the relocation to use the call stub @@ -138,10 +138,10 @@ func genplt2(ctxt *ld.Link, ldr *loader.Loader) { // So when resolving the relocations to calls to the stubs, // the addresses are known and trampolines can be inserted // when necessary. - ctxt.Textp2 = append(stubs, ctxt.Textp2...) + ctxt.Textp = append(stubs, ctxt.Textp...) } -func genaddmoduledata2(ctxt *ld.Link, ldr *loader.Loader) { +func genaddmoduledata(ctxt *ld.Link, ldr *loader.Loader) { initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) if initfunc == nil { return @@ -152,7 +152,7 @@ func genaddmoduledata2(ctxt *ld.Link, ldr *loader.Loader) { } // addis r2, r12, .TOC.-func@ha - toc := ctxt.DotTOC2[0] + toc := ctxt.DotTOC[0] rel1 := loader.Reloc{ Off: 0, Size: 8, @@ -207,26 +207,26 @@ func genaddmoduledata2(ctxt *ld.Link, ldr *loader.Loader) { o(0x4e800020) } -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { if ctxt.DynlinkingGo() { - genaddmoduledata2(ctxt, ldr) + genaddmoduledata(ctxt, ldr) } if ctxt.LinkMode == ld.LinkInternal { - genplt2(ctxt, ldr) + genplt(ctxt, ldr) } } // Construct a call stub in stub that calls symbol targ via its PLT // entry. -func gencallstub2(ctxt *ld.Link, ldr *loader.Loader, abicase int, stub *loader.SymbolBuilder, targ loader.Sym) { +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") } - plt := ctxt.PLT2 + plt := ctxt.PLT stub.SetType(sym.STEXT) @@ -325,9 +325,9 @@ func addelfdynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s lo su.SetRelocType(rIdx, objabi.R_ADDR) if targType == sym.SDYNIMPORT { // These happen in .toc sections - ld.Adddynsym2(ldr, target, syms, targ) + ld.Adddynsym(ldr, target, syms, targ) - rela := ldr.MakeSymbolUpdater(syms.Rela2) + rela := ldr.MakeSymbolUpdater(syms.Rela) rela.AddAddrPlus(target.Arch, s, int64(r.Off())) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_PPC64_ADDR64))) rela.AddUint64(target.Arch, uint64(r.Add())) @@ -442,7 +442,7 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy } -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { // Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines. rt := r.Type() if rt == objabi.R_ADDR || rt == objabi.R_POWER_TLS || rt == objabi.R_CALLPOWER { @@ -453,7 +453,7 @@ func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo } ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) switch rt { default: return false @@ -539,7 +539,7 @@ func symtoc(ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) int64 { v = ldr.SymVersion(out) } - toc := syms.DotTOC2[v] + toc := syms.DotTOC[v] if toc == 0 { ldr.Errorf(s, "TOC-relative relocation in object without .TOC.") return 0 @@ -572,12 +572,12 @@ func archreloctoc(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r lo tarSym := ldr.ResolveABIAlias(relocs.At2(0).Sym()) if target.IsInternal() && tarSym != 0 && ldr.AttrReachable(tarSym) && ldr.SymSect(tarSym).Seg == &ld.Segdata { - t = ldr.SymValue(tarSym) + r.Add() - ldr.SymValue(syms.TOC2) + t = ldr.SymValue(tarSym) + r.Add() - ldr.SymValue(syms.TOC) // change ld to addi in the second instruction o2 = (o2 & 0x03FF0000) | 0xE<<26 useAddi = true } else { - t = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.TOC2) + t = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.TOC) } if t != int64(int32(t)) { @@ -976,22 +976,22 @@ overflow: return t } -func addpltsym2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) { +func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) { if ldr.SymPlt(s) >= 0 { return } - ld.Adddynsym2(ldr, &ctxt.Target, &ctxt.ArchSyms, s) + ld.Adddynsym(ldr, &ctxt.Target, &ctxt.ArchSyms, s) if ctxt.IsELF { - plt := ldr.MakeSymbolUpdater(ctxt.PLT2) - rela := ldr.MakeSymbolUpdater(ctxt.RelaPLT2) + plt := ldr.MakeSymbolUpdater(ctxt.PLT) + rela := ldr.MakeSymbolUpdater(ctxt.RelaPLT) if plt.Size() == 0 { panic("plt is not set up") } // Create the glink resolver if necessary - glink := ensureglinkresolver2(ctxt, ldr) + glink := ensureglinkresolver(ctxt, ldr) // Write symbol resolver stub (just a branch to the // glink resolver stub) @@ -1023,7 +1023,7 @@ func addpltsym2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) { } // Generate the glink resolver stub if necessary and return the .glink section -func ensureglinkresolver2(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilder { +func ensureglinkresolver(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilder { gs := ldr.LookupOrCreateSym(".glink", 0) glink := ldr.MakeSymbolUpdater(gs) if glink.Size() != 0 { @@ -1052,7 +1052,7 @@ func ensureglinkresolver2(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuild glink.AddUint32(ctxt.Arch, 0x7800f082) // srdi r0,r0,2 // r11 = address of the first byte of the PLT - glink.AddSymRef(ctxt.Arch, ctxt.PLT2, 0, objabi.R_ADDRPOWER, 8) + glink.AddSymRef(ctxt.Arch, ctxt.PLT, 0, objabi.R_ADDRPOWER, 8) glink.AddUint32(ctxt.Arch, 0x3d600000) // addis r11,0,.plt@ha glink.AddUint32(ctxt.Arch, 0x396b0000) // addi r11,r11,.plt@l @@ -1071,8 +1071,8 @@ func ensureglinkresolver2(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuild // Add DT_PPC64_GLINK .dynamic entry, which points to 32 bytes // before the first symbol resolver stub. - du := ldr.MakeSymbolUpdater(ctxt.Dynamic2) - ld.Elfwritedynentsymplus2(ctxt, du, ld.DT_PPC64_GLINK, glink.Sym(), glink.Size()-32) + du := ldr.MakeSymbolUpdater(ctxt.Dynamic) + ld.Elfwritedynentsymplus(ctxt, du, ld.DT_PPC64_GLINK, glink.Sym(), glink.Size()-32) return glink } @@ -1157,8 +1157,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ + ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ ctxt.Out.Write32(0) ctxt.Out.Write32(uint32(ld.Lcsize)) diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index 1589df4abc..49c7ec2103 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -55,9 +55,9 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Trampoline: trampoline, Machoreloc1: machoreloc1, Xcoffreloc1: xcoffreloc1, diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index c21f667da2..b9c5c68693 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -16,10 +16,10 @@ import ( "sync" ) -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { } -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { log.Fatalf("elfreloc2") return false } diff --git a/src/cmd/link/internal/riscv64/obj.go b/src/cmd/link/internal/riscv64/obj.go index 9e6cec2b35..9fe9822a32 100644 --- a/src/cmd/link/internal/riscv64/obj.go +++ b/src/cmd/link/internal/riscv64/obj.go @@ -25,9 +25,9 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Machoreloc1: machoreloc1, Linuxdynld: "/lib/ld.so.1", diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 63d397f887..ae2baaa05a 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -51,7 +51,7 @@ import ( // undef // // The job of appending the moduledata is delegated to runtime.addmoduledata. -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) if initfunc == nil { return @@ -60,7 +60,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { // larl %r2, initfunc.AddUint8(0xc0) initfunc.AddUint8(0x20) - initfunc.AddSymRef(ctxt.Arch, ctxt.Moduledata2, 6, objabi.R_PCREL, 4) + initfunc.AddSymRef(ctxt.Arch, ctxt.Moduledata, 6, objabi.R_PCREL, 4) r1 := initfunc.Relocs() ldr.SetRelocVariant(initfunc.Sym(), r1.Count()-1, sym.RV_390_DBL) @@ -136,8 +136,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL) su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz())) if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) - r.SetSym(syms.PLT2) + addpltsym(target, ldr, syms, targ) + r.SetSym(syms.PLT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) } return true @@ -148,8 +148,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz())) if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) - r.SetSym(syms.PLT2) + addpltsym(target, ldr, syms, targ) + r.SetSym(syms.PLT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) } return true @@ -181,7 +181,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTPC): su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) - r.SetSym(syms.GOT2) + r.SetSym(syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz())) return true @@ -200,16 +200,16 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL) - r.SetSym(syms.GOT2) + r.SetSym(syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(r.Siz())) return true case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTENT): - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL) - r.SetSym(syms.GOT2) + r.SetSym(syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))+int64(r.Siz())) return true } @@ -221,10 +221,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write64(uint64(sectoff)) - elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() xst := ldr.SymType(r.Xsym) switch r.Type() { @@ -391,17 +391,17 @@ func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv } } -func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymPlt(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) + ld.Adddynsym(ldr, target, syms, s) if target.IsElf() { - plt := ldr.MakeSymbolUpdater(syms.PLT2) - got := ldr.MakeSymbolUpdater(syms.GOT2) - rela := ldr.MakeSymbolUpdater(syms.RelaPLT2) + plt := ldr.MakeSymbolUpdater(syms.PLT) + got := ldr.MakeSymbolUpdater(syms.GOT) + rela := ldr.MakeSymbolUpdater(syms.RelaPLT) if plt.Size() == 0 { panic("plt is not set up") } @@ -457,18 +457,18 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load } } -func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymGot(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT2) + ld.Adddynsym(ldr, target, syms, s) + got := ldr.MakeSymbolUpdater(syms.GOT) ldr.SetGot(s, int32(got.Size())) got.AddUint64(target.Arch, 0) if target.IsElf() { - rela := ldr.MakeSymbolUpdater(syms.Rela2) + rela := ldr.MakeSymbolUpdater(syms.Rela) rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_390_GLOB_DAT))) rela.AddUint64(target.Arch, 0) diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 8d8dd76133..54d640731e 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -52,9 +52,9 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Machoreloc1: machoreloc1, Linuxdynld: "/lib64/ld64.so.1", diff --git a/src/cmd/link/internal/sym/compilation_unit.go b/src/cmd/link/internal/sym/compilation_unit.go index 79ab2a8015..d9bfc84936 100644 --- a/src/cmd/link/internal/sym/compilation_unit.go +++ b/src/cmd/link/internal/sym/compilation_unit.go @@ -20,9 +20,9 @@ type CompilationUnit struct { DWInfo *dwarf.DWDie // CU root DIE DWARFFileTable []string // The file table used to generate the .debug_lines - Consts2 LoaderSym // Package constants DIEs (loader) - FuncDIEs2 []LoaderSym // Function DIE subtrees (loader) - AbsFnDIEs2 []LoaderSym // Abstract function DIE subtrees (loader) - RangeSyms2 []LoaderSym // Symbols for debug_range (loader) - Textp2 []LoaderSym // Text symbols in this CU (loader) + Consts LoaderSym // Package constants DIEs + FuncDIEs []LoaderSym // Function DIE subtrees + AbsFnDIEs []LoaderSym // Abstract function DIE subtrees + RangeSyms []LoaderSym // Symbols for debug_range + Textp []LoaderSym // Text symbols in this CU } diff --git a/src/cmd/link/internal/sym/library.go b/src/cmd/link/internal/sym/library.go index c9be3abb27..915510fb04 100644 --- a/src/cmd/link/internal/sym/library.go +++ b/src/cmd/link/internal/sym/library.go @@ -20,8 +20,8 @@ type Library struct { Safe bool Units []*CompilationUnit - Textp2 []LoaderSym // text syms defined in this library - DupTextSyms2 []LoaderSym // dupok text syms defined in this library + Textp []LoaderSym // text syms defined in this library + DupTextSyms []LoaderSym // dupok text syms defined in this library } func (l Library) String() string { diff --git a/src/cmd/link/internal/sym/segment.go b/src/cmd/link/internal/sym/segment.go index 464952ac8a..743c75276b 100644 --- a/src/cmd/link/internal/sym/segment.go +++ b/src/cmd/link/internal/sym/segment.go @@ -55,6 +55,6 @@ type Section struct { Elfsect interface{} // an *ld.ElfShdr Reloff uint64 Rellen uint64 - Sym2 LoaderSym // symbol for the section, if any + Sym LoaderSym // symbol for the section, if any Index uint16 // each section has a unique index, used internally } diff --git a/src/cmd/link/internal/wasm/asm.go b/src/cmd/link/internal/wasm/asm.go index e52f44b94a..2be4adc5d3 100644 --- a/src/cmd/link/internal/wasm/asm.go +++ b/src/cmd/link/internal/wasm/asm.go @@ -39,7 +39,7 @@ const ( // funcValueOffset is the offset between the PC_F value of a function and the index of the function in WebAssembly const funcValueOffset = 0x1000 // TODO(neelance): make function addresses play nice with heap addresses -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { } type wasmFunc struct { @@ -136,7 +136,7 @@ func asmb2(ctxt *ld.Link, ldr *loader.Loader) { }, } hostImportMap := make(map[loader.Sym]int64) - for _, fn := range ctxt.Textp2 { + for _, fn := range ctxt.Textp { relocs := ldr.Relocs(fn) for ri := 0; ri < relocs.Count(); ri++ { r := relocs.At2(ri) @@ -152,8 +152,8 @@ func asmb2(ctxt *ld.Link, ldr *loader.Loader) { // collect functions with WebAssembly body var buildid []byte - fns := make([]*wasmFunc, len(ctxt.Textp2)) - for i, fn := range ctxt.Textp2 { + fns := make([]*wasmFunc, len(ctxt.Textp)) + for i, fn := range ctxt.Textp { wfn := new(bytes.Buffer) if ldr.SymName(fn) == "go.buildid" { writeUleb128(wfn, 0) // number of sets of locals diff --git a/src/cmd/link/internal/wasm/obj.go b/src/cmd/link/internal/wasm/obj.go index 9fc1a6cbe1..f8090a3551 100644 --- a/src/cmd/link/internal/wasm/obj.go +++ b/src/cmd/link/internal/wasm/obj.go @@ -19,7 +19,7 @@ func Init() (*sys.Arch, ld.Arch) { AssignAddress: assignAddress, Asmb: asmb, Asmb2: asmb2, - Gentext2: gentext2, + Gentext: gentext, } return sys.ArchWasm, theArch diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 39cca29239..296184e323 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -41,7 +41,7 @@ import ( "sync" ) -func gentext2(ctxt *ld.Link, ldr *loader.Loader) { +func gentext(ctxt *ld.Link, ldr *loader.Loader) { if ctxt.DynlinkingGo() { // We need get_pc_thunk. } else { @@ -58,7 +58,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { } // Generate little thunks that load the PC of the next instruction into a register. - thunks := make([]loader.Sym, 0, 7+len(ctxt.Textp2)) + thunks := make([]loader.Sym, 0, 7+len(ctxt.Textp)) for _, r := range [...]struct { name string num uint8 @@ -88,7 +88,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { thunks = append(thunks, thunkfunc.Sym()) } - ctxt.Textp2 = append(thunks, ctxt.Textp2...) // keep Textp2 in dependency order + ctxt.Textp = append(thunks, ctxt.Textp...) // keep Textp in dependency order initfunc, addmoduledata := ld.PrepareAddmoduledata(ctxt) if initfunc == nil { @@ -116,7 +116,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) { initfunc.AddSymRef(ctxt.Arch, ldr.Lookup("__x86.get_pc_thunk.cx", 0), 0, objabi.R_CALL, 4) o(0x8d, 0x81) - initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata2, 6) + initfunc.AddPCRelPlus(ctxt.Arch, ctxt.Moduledata, 6) o(0x8d, 0x99) gotsym := ldr.LookupOrCreateSym("_GLOBAL_OFFSET_TABLE_", 0) @@ -163,8 +163,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocAdd(rIdx, r.Add()+4) if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.PLT2) + addpltsym(target, ldr, syms, targ) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymPlt(targ))) } @@ -202,7 +202,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } - addgotsym2(target, ldr, syms, targ) + addgotsym(target, ldr, syms, targ) su.SetRelocType(rIdx, objabi.R_CONST) // write r->add during relocsym su.SetRelocSym(rIdx, 0) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) @@ -216,7 +216,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOTPC): su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) - su.SetRelocSym(rIdx, syms.GOT2) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+4) return true @@ -239,8 +239,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade case objabi.MachoRelocOffset + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1: su := ldr.MakeSymbolUpdater(s) if targType == sym.SDYNIMPORT { - addpltsym2(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.PLT2) + addpltsym(target, ldr, syms, targ) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) su.SetRelocType(rIdx, objabi.R_PCREL) return true @@ -267,8 +267,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return true } - addgotsym2(target, ldr, syms, targ) - su.SetRelocSym(rIdx, syms.GOT2) + addgotsym(target, ldr, syms, targ) + su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) su.SetRelocType(rIdx, objabi.R_PCREL) return true @@ -290,9 +290,9 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // External linker will do this relocation. return true } - addpltsym2(target, ldr, syms, targ) + addpltsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) - su.SetRelocSym(rIdx, syms.PLT2) + su.SetRelocSym(rIdx, syms.PLT) su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) return true @@ -301,8 +301,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade break } if target.IsElf() { - ld.Adddynsym2(ldr, target, syms, targ) - rel := ldr.MakeSymbolUpdater(syms.Rel2) + ld.Adddynsym(ldr, target, syms, targ) + rel := ldr.MakeSymbolUpdater(syms.Rel) rel.AddAddrPlus(target.Arch, s, int64(r.Off())) rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(targ)), uint32(elf.R_386_32))) su := ldr.MakeSymbolUpdater(s) @@ -322,15 +322,15 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // just in case the C code assigns to the variable, // and of course it only works for single pointers, // but we only need to support cgo and that's all it needs. - ld.Adddynsym2(ldr, target, syms, targ) + ld.Adddynsym(ldr, target, syms, targ) - got := ldr.MakeSymbolUpdater(syms.GOT2) + got := ldr.MakeSymbolUpdater(syms.GOT) su := ldr.MakeSymbolUpdater(s) su.SetType(got.Type()) got.PrependSub(s) su.SetValue(got.Size()) got.AddUint32(target.Arch, 0) - leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT2) + leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) leg.AddUint32(target.Arch, uint32(ldr.SymDynid(targ))) su.SetRelocType(rIdx, objabi.ElfRelocOffset) // ignore during relocsym return true @@ -340,10 +340,10 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc2(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { ctxt.Out.Write32(uint32(sectoff)) - elfsym := ld.ElfSymForReloc2(ctxt, r.Xsym) + elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() switch r.Type() { default: @@ -471,17 +471,17 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S } } -func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymPlt(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) + ld.Adddynsym(ldr, target, syms, s) if target.IsElf() { - plt := ldr.MakeSymbolUpdater(syms.PLT2) - got := ldr.MakeSymbolUpdater(syms.GOTPLT2) - rel := ldr.MakeSymbolUpdater(syms.RelPLT2) + plt := ldr.MakeSymbolUpdater(syms.PLT) + got := ldr.MakeSymbolUpdater(syms.GOTPLT) + rel := ldr.MakeSymbolUpdater(syms.RelPLT) if plt.Size() == 0 { panic("plt is not set up") } @@ -515,12 +515,12 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load } else if target.IsDarwin() { // Same laziness as in 6l. - plt := ldr.MakeSymbolUpdater(syms.PLT2) + plt := ldr.MakeSymbolUpdater(syms.PLT) - addgotsym2(target, ldr, syms, s) + addgotsym(target, ldr, syms, s) sDynid := ldr.SymDynid(s) - lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT2) + lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT) lep.AddUint32(target.Arch, uint32(sDynid)) // jmpq *got+size(IP) @@ -528,28 +528,28 @@ func addpltsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load plt.AddUint8(0xff) plt.AddUint8(0x25) - plt.AddAddrPlus(target.Arch, syms.GOT2, int64(ldr.SymGot(s))) + plt.AddAddrPlus(target.Arch, syms.GOT, int64(ldr.SymGot(s))) } else { ldr.Errorf(s, "addpltsym: unsupported binary format") } } -func addgotsym2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { +func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { if ldr.SymGot(s) >= 0 { return } - ld.Adddynsym2(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT2) + ld.Adddynsym(ldr, target, syms, s) + got := ldr.MakeSymbolUpdater(syms.GOT) ldr.SetGot(s, int32(got.Size())) got.AddUint32(target.Arch, 0) if target.IsElf() { - rel := ldr.MakeSymbolUpdater(syms.Rel2) + rel := ldr.MakeSymbolUpdater(syms.Rel) rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_386_GLOB_DAT))) } else if target.IsDarwin() { - leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT2) + leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s))) } else { ldr.Errorf(s, "addgotsym: unsupported binary format") @@ -653,10 +653,10 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32b(uint32(ld.Entryvalue2(ctxt))) /* va of entry */ - ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ - ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ + ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ + ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */ + ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ + ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ case objabi.Hdarwin: ld.Asmbmacho(ctxt) diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index 286d6a83dd..f53ecc8fc0 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -52,9 +52,9 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Asmb: asmb, Asmb2: asmb2, - Elfreloc2: elfreloc2, + Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, - Gentext2: gentext2, + Gentext: gentext, Machoreloc1: machoreloc1, PEreloc1: pereloc1, -- GitLab From b8c5d6871f7a0799749537daa4a27491a369a4f7 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 18 May 2020 11:34:18 -0400 Subject: [PATCH 0036/1792] [dev.link] cmd/link: delete SCONST symbol type After CL 233998, we don't produce SCONST symbols anywhere. Remove the type. Change-Id: I0f52de5242b8fd0ffec63370eef612511e1087ad Reviewed-on: https://go-review.googlesource.com/c/go/+/234437 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data.go | 6 ++--- src/cmd/link/internal/ld/macho.go | 2 +- src/cmd/link/internal/ld/pe.go | 2 +- src/cmd/link/internal/sym/symkind.go | 1 - src/cmd/link/internal/sym/symkind_string.go | 25 ++++++++++----------- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index e273841ddb..98242b16e4 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -334,7 +334,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { log.Fatalf("cannot handle R_TLS_IE (sym %s) when linking internally", ldr.SymName(s)) } case objabi.R_ADDR: - if target.IsExternal() && rst != sym.SCONST { + if target.IsExternal() { needExtReloc = true // set up addend for eventual relocation via outer symbol. @@ -441,7 +441,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // r.Sym() can be 0 when CALL $(constant) is transformed from absolute PC to relative PC call. case objabi.R_GOTPCREL: - if target.IsDynlinkingGo() && target.IsDarwin() && rs != 0 && rst != sym.SCONST { + if target.IsDynlinkingGo() && target.IsDarwin() && rs != 0 { needExtReloc = true rr.Xadd = r.Add() rr.Xadd -= int64(siz) // relative to address after the relocated chunk @@ -464,7 +464,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { o = 0 break } - if target.IsExternal() && rs != 0 && rst != sym.SCONST && (ldr.SymSect(rs) != ldr.SymSect(s) || rt == objabi.R_GOTPCREL) { + if target.IsExternal() && rs != 0 && (ldr.SymSect(rs) != ldr.SymSect(s) || rt == objabi.R_GOTPCREL) { needExtReloc = true // set up addend for eventual relocation via outer symbol. diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index ab8d82f61e..c66af8628a 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -779,7 +779,7 @@ func collectmachosyms(ctxt *Link) { continue } t := ldr.SymType(s) - if t >= sym.SELFRXSECT && t < sym.SXREF || t == sym.SCONST { // data sections handled in dodata + if t >= sym.SELFRXSECT && t < sym.SXREF { // data sections handled in dodata if t == sym.STLSBSS { // TLSBSS is not used on darwin. See data.go:allocateDataSections continue diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 7e2c35674a..29395c94e3 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -736,7 +736,7 @@ func (f *peFile) writeSymbols(ctxt *Link) { } switch t { - case sym.SDYNIMPORT, sym.SHOSTOBJ, sym.SUNDEFEXT, sym.SCONST: + case sym.SDYNIMPORT, sym.SHOSTOBJ, sym.SUNDEFEXT: addsym(s) } } diff --git a/src/cmd/link/internal/sym/symkind.go b/src/cmd/link/internal/sym/symkind.go index 1933dd7b21..75f72c3737 100644 --- a/src/cmd/link/internal/sym/symkind.go +++ b/src/cmd/link/internal/sym/symkind.go @@ -102,7 +102,6 @@ const ( SMACHOINDIRECTPLT SMACHOINDIRECTGOT SFILEPATH - SCONST SDYNIMPORT SHOSTOBJ SUNDEFEXT // Undefined symbol for resolution by external linker diff --git a/src/cmd/link/internal/sym/symkind_string.go b/src/cmd/link/internal/sym/symkind_string.go index 97af9925d5..5777047d0f 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 @@ -52,21 +52,20 @@ func _() { _ = x[SMACHOINDIRECTPLT-41] _ = x[SMACHOINDIRECTGOT-42] _ = x[SFILEPATH-43] - _ = x[SCONST-44] - _ = x[SDYNIMPORT-45] - _ = x[SHOSTOBJ-46] - _ = x[SUNDEFEXT-47] - _ = x[SDWARFSECT-48] - _ = x[SDWARFINFO-49] - _ = x[SDWARFRANGE-50] - _ = x[SDWARFLOC-51] - _ = x[SDWARFLINES-52] - _ = x[SABIALIAS-53] + _ = x[SDYNIMPORT-44] + _ = x[SHOSTOBJ-45] + _ = x[SUNDEFEXT-46] + _ = x[SDWARFSECT-47] + _ = x[SDWARFINFO-48] + _ = x[SDWARFRANGE-49] + _ = x[SDWARFLOC-50] + _ = x[SDWARFLINES-51] + _ = x[SABIALIAS-52] } -const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_EXTRA_COUNTERSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSCONSTSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFINFOSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS" +const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_EXTRA_COUNTERSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFINFOSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS" -var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 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, 337, 344, 349, 361, 373, 390, 407, 416, 422, 432, 440, 449, 459, 469, 480, 489, 500, 509} +var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 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, 337, 344, 349, 361, 373, 390, 407, 416, 426, 434, 443, 453, 463, 474, 483, 494, 503} func (i SymKind) String() string { if i >= SymKind(len(_SymKind_index)-1) { -- GitLab From 586d0755e2cd6a51f0837c6b7748e93d58b966f1 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 18 May 2020 18:20:18 -0400 Subject: [PATCH 0037/1792] [dev.link] cmd/link: only do name expansion when needed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most Go objects are compiled with known package path, so the symbol name is already fully expanded. Nevertheless, currently in the linker strings.Replace is called unconditionally, and most of the time it doesn't do anything. This CL records a per-object flag in the object file, and do the name expansion only when the name is not expanded at compile time. This gives small speedups for the linker. Linking cmd/compile: name old time/op new time/op delta Loadlib 35.1ms ± 2% 32.8ms ± 4% -6.43% (p=0.008 n=5+5) Symtab 15.8ms ± 2% 14.0ms ± 8% -11.45% (p=0.008 n=5+5) TotalTime 399ms ± 1% 385ms ± 2% -3.63% (p=0.008 n=5+5) Change-Id: I735084971a051cd9be4284ad294c284cd5b545f4 Reviewed-on: https://go-review.googlesource.com/c/go/+/234490 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/internal/goobj2/objfile.go | 6 +++++- src/cmd/internal/obj/objfile2.go | 3 +++ src/cmd/link/internal/loader/loader.go | 25 ++++++++++++++++++++----- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index fde482e079..dc5174f85e 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -228,7 +228,8 @@ const SymSize = stringRefSize + 2 + 1 + 1 + 4 + 4 const SymABIstatic = ^uint16(0) const ( - ObjFlagShared = 1 << iota + ObjFlagShared = 1 << iota // this object is built with -shared + ObjFlagNeedNameExpansion // the linker needs to expand `"".` to package path in symbol names ) const ( @@ -675,3 +676,6 @@ func (r *Reader) ReadOnly() bool { func (r *Reader) Flags() uint32 { return r.h.Flags } + +func (r *Reader) Shared() bool { return r.Flags()&ObjFlagShared != 0 } +func (r *Reader) NeedNameExpansion() bool { return r.Flags()&ObjFlagNeedNameExpansion != 0 } diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 0b3b2be41b..c28ae569d3 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -38,6 +38,9 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { if ctxt.Flag_shared { flags |= goobj2.ObjFlagShared } + if pkgpath == "" { + flags |= goobj2.ObjFlagNeedNameExpansion + } h := goobj2.Header{ Magic: goobj2.Magic, Fingerprint: ctxt.Fingerprint, diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 5696c51100..26b17ce007 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -661,7 +661,11 @@ func (l *Loader) SymName(i Sym) string { return pp.name } r, li := l.toLocal(i) - return strings.Replace(r.Sym(li).Name(r.Reader), "\"\".", r.pkgprefix, -1) + name := r.Sym(li).Name(r.Reader) + if !r.NeedNameExpansion() { + return name + } + return strings.Replace(name, "\"\".", r.pkgprefix, -1) } // Returns the version of the i-th symbol. @@ -843,7 +847,7 @@ func (l *Loader) AttrShared(i Sym) bool { // might make more sense to copy the flag value out of the // object into a larger bitmap during preload. r, _ := l.toLocal(i) - return (r.Flags() & goobj2.ObjFlagShared) != 0 + return r.Shared() } return l.attrShared.Has(l.extIndex(i)) } @@ -1948,9 +1952,13 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { panic("preloadSyms: bad kind") } l.growAttrBitmaps(len(l.objSyms) + int(end-start)) + needNameExpansion := r.NeedNameExpansion() for i := start; i < end; i++ { osym := r.Sym(i) - name := strings.Replace(osym.Name(r.Reader), "\"\".", r.pkgprefix, -1) + name := osym.Name(r.Reader) + if needNameExpansion { + name = strings.Replace(name, "\"\".", r.pkgprefix, -1) + } v := abiToVer(osym.ABI(), r.version) dupok := osym.Dupok() gi, added := l.AddSym(name, v, r, i, kind, dupok, sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type())]) @@ -1998,9 +2006,13 @@ func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { ndef := uint32(r.NSym() + r.NNonpkgdef()) + needNameExpansion := r.NeedNameExpansion() for i, n := uint32(0), uint32(r.NNonpkgref()); i < n; i++ { osym := r.Sym(ndef + i) - name := strings.Replace(osym.Name(r.Reader), "\"\".", r.pkgprefix, -1) + name := osym.Name(r.Reader) + if needNameExpansion { + name = strings.Replace(name, "\"\".", r.pkgprefix, -1) + } v := abiToVer(osym.ABI(), r.version) r.syms[ndef+i] = l.LookupOrCreateSym(name, v) gi := r.syms[ndef+i] @@ -2109,7 +2121,10 @@ func (l *Loader) cloneToExternal(symIdx Sym) { // Read the particulars from object. r, li := l.toLocal(symIdx) osym := r.Sym(li) - sname := strings.Replace(osym.Name(r.Reader), "\"\".", r.pkgprefix, -1) + sname := osym.Name(r.Reader) + if r.NeedNameExpansion() { + sname = strings.Replace(sname, "\"\".", r.pkgprefix, -1) + } sver := abiToVer(osym.ABI(), r.version) skind := sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type())] -- GitLab From 0f92cd75cf1edf712ab94f5cd7fb6e8267a0d53d Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 18 May 2020 18:27:10 -0400 Subject: [PATCH 0038/1792] [dev.link] cmd/asm: expand package path if known If the package path is known, pass it to the object file writer so the symbol names are pre-expanded. (We already expand the package path in debug info.) Change-Id: I2b2b71edbb98924cbf3c4f9142b7e109e5b7501a Reviewed-on: https://go-review.googlesource.com/c/go/+/234491 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/asm/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go index 71ee04128c..4a5dfecf6d 100644 --- a/src/cmd/asm/main.go +++ b/src/cmd/asm/main.go @@ -97,7 +97,7 @@ func main() { } if ok && !*flags.SymABIs { ctxt.NumberSyms(true) - obj.WriteObjFile(ctxt, buf, "") + obj.WriteObjFile(ctxt, buf, *flags.Importpath) } if !ok || diag { if failedFile != "" { -- GitLab From cf3bf9959ccec7bc2ccf1b685c006298234ef37c Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 18 May 2020 18:47:17 -0400 Subject: [PATCH 0039/1792] [dev.link] cmd/internal/obj: remove asm parameter of NumberSyms Now we have ctxt.IsAsm, use that, instead of passing in a parameter. Change-Id: I81dedbe6459424fa9a4c2bfbd9abd83d83f3a107 Reviewed-on: https://go-review.googlesource.com/c/go/+/234492 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/asm/main.go | 2 +- src/cmd/compile/internal/gc/main.go | 2 +- src/cmd/internal/obj/sym.go | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go index 4a5dfecf6d..31d8549d2d 100644 --- a/src/cmd/asm/main.go +++ b/src/cmd/asm/main.go @@ -96,7 +96,7 @@ func main() { } } if ok && !*flags.SymABIs { - ctxt.NumberSyms(true) + ctxt.NumberSyms() obj.WriteObjFile(ctxt, buf, *flags.Importpath) } if !ok || diag { diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index ba40582f4f..b258952457 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -789,7 +789,7 @@ func Main(archInit func(*Arch)) { // Write object data to disk. timings.Start("be", "dumpobj") dumpdata() - Ctxt.NumberSyms(false) + Ctxt.NumberSyms() dumpobj() if asmhdr != "" { dumpasmhdr() diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 61ef6ff2ce..4cbcb87b48 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -164,7 +164,7 @@ func (ctxt *Link) Int64Sym(i int64) *LSym { // Assign index to symbols. // asm is set to true if this is called by the assembler (i.e. not the compiler), // in which case all the symbols are non-package (for now). -func (ctxt *Link) NumberSyms(asm bool) { +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 @@ -181,7 +181,7 @@ func (ctxt *Link) NumberSyms(asm bool) { var idx, nonpkgidx int32 = 0, 0 ctxt.traverseSyms(traverseDefs, func(s *LSym) { - if isNonPkgSym(ctxt, asm, s) { + if isNonPkgSym(ctxt, s) { s.PkgIdx = goobj2.PkgIdxNone s.SymIdx = nonpkgidx if nonpkgidx != int32(len(ctxt.nonpkgdefs)) { @@ -240,7 +240,7 @@ func (ctxt *Link) NumberSyms(asm bool) { }) // Compute a fingerprint of the indices, for exporting. - if !asm { + if !ctxt.IsAsm { h := md5.New() for _, s := range ctxt.defs { h.Write([]byte(s.Name)) @@ -251,8 +251,8 @@ func (ctxt *Link) NumberSyms(asm bool) { // Returns whether s is a non-package symbol, which needs to be referenced // by name instead of by index. -func isNonPkgSym(ctxt *Link, asm bool, s *LSym) bool { - if asm && !s.Static() { +func isNonPkgSym(ctxt *Link, s *LSym) bool { + if ctxt.IsAsm && !s.Static() { // asm symbols are referenced by name only, except static symbols // which are file-local and can be referenced by index. return true -- GitLab From 76a459b361e9cb8aaea0bb4d7d16b88371b30bbb Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 18 May 2020 18:51:38 -0400 Subject: [PATCH 0040/1792] [dev.link] cmd/link: remove duplicate handling of some specially named symbols We do it on the symtab pass. Remove duplicate. Change-Id: I88cc8cd6e873749e0f6197f809aa812bca9dbbf9 Reviewed-on: https://go-review.googlesource.com/c/go/+/234493 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/loader/loader.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 26b17ce007..b9e063288a 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1981,11 +1981,6 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { l.builtinSyms[bi] = gi } } - if strings.HasPrefix(name, "go.string.") || - strings.HasPrefix(name, "gclocals·") || - strings.HasPrefix(name, "runtime.gcbits.") { - l.SetAttrNotInSymbolTable(gi, true) - } if a := osym.Align(); a != 0 { l.SetSymAlign(gi, int32(a)) } -- GitLab From 7214090180276603bbfdacaf736058f49b8c3041 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 19 May 2020 10:53:41 -0400 Subject: [PATCH 0041/1792] [dev.link] cmd/link: skip TestDWARFiOS if the iOS tools aren't installed Change-Id: I5bccb5935cdeb3a0ccf398a57eb4776f0e6aedca Reviewed-on: https://go-review.googlesource.com/c/go/+/234578 Run-TryBot: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/dwarf_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index 5926f09e4a..326f493e2d 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -191,6 +191,13 @@ func TestDWARFiOS(t *testing.T) { if err := exec.Command("xcrun", "--help").Run(); err != nil { t.Skipf("error running xcrun, required for iOS cross build: %v", err) } + // Check to see if the ios tools are installed. It's possible to have the command line tools + // installed without the iOS sdk. + if output, err := exec.Command("xcodebuild -showsdks").CombinedOutput(); err != nil { + t.Skipf("error running xcodebuild, required for iOS cross build: %v", err) + } else if !strings.Contains(string(output), "iOS SDK") { + t.Skipf("iOS SDK not detected.") + } cc := "CC=" + runtime.GOROOT() + "/misc/ios/clangwrap.sh" // iOS doesn't allow unmapped segments, so iOS executables don't have DWARF. testDWARF(t, "", false, cc, "CGO_ENABLED=1", "GOOS=darwin", "GOARCH=arm64") -- GitLab From 8e4ab9cb4c28649be36f82a02d04eb1cb31d02c9 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Wed, 20 May 2020 13:58:03 -0400 Subject: [PATCH 0042/1792] [dev.link] cmd/link: remove some x86/Darwin code Found while looking at common code between architectures. Recreation of CL 234680 which was accidentally on master. Change-Id: Ib8fac3168916e8e64b2bc65fd3830c5856d77c5e Reviewed-on: https://go-review.googlesource.com/c/go/+/234682 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/x86/asm.go | 45 -------------------------------- 1 file changed, 45 deletions(-) diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 296184e323..ecd5058f4c 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -310,31 +310,6 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade su.SetRelocSym(rIdx, 0) return true } - - if target.IsDarwin() && ldr.SymSize(s) == int64(target.Arch.PtrSize) && r.Off() == 0 { - // Mach-O relocations are a royal pain to lay out. - // They use a compact stateful bytecode representation - // that is too much bother to deal with. - // Instead, interpret the C declaration - // void *_Cvar_stderr = &stderr; - // as making _Cvar_stderr the name of a GOT entry - // for stderr. This is separate from the usual GOT entry, - // just in case the C code assigns to the variable, - // and of course it only works for single pointers, - // but we only need to support cgo and that's all it needs. - ld.Adddynsym(ldr, target, syms, targ) - - got := ldr.MakeSymbolUpdater(syms.GOT) - su := ldr.MakeSymbolUpdater(s) - su.SetType(got.Type()) - got.PrependSub(s) - su.SetValue(got.Size()) - got.AddUint32(target.Arch, 0) - leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) - leg.AddUint32(target.Arch, uint32(ldr.SymDynid(targ))) - su.SetRelocType(rIdx, objabi.ElfRelocOffset) // ignore during relocsym - return true - } } return false @@ -512,23 +487,6 @@ func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(sDynid), uint32(elf.R_386_JMP_SLOT))) ldr.SetPlt(s, int32(plt.Size()-16)) - } else if target.IsDarwin() { - // Same laziness as in 6l. - - plt := ldr.MakeSymbolUpdater(syms.PLT) - - addgotsym(target, ldr, syms, s) - - sDynid := ldr.SymDynid(s) - lep := ldr.MakeSymbolUpdater(syms.LinkEditPLT) - lep.AddUint32(target.Arch, uint32(sDynid)) - - // jmpq *got+size(IP) - ldr.SetPlt(s, int32(plt.Size())) - - plt.AddUint8(0xff) - plt.AddUint8(0x25) - plt.AddAddrPlus(target.Arch, syms.GOT, int64(ldr.SymGot(s))) } else { ldr.Errorf(s, "addpltsym: unsupported binary format") } @@ -548,9 +506,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade rel := ldr.MakeSymbolUpdater(syms.Rel) rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_386_GLOB_DAT))) - } else if target.IsDarwin() { - leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) - leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s))) } else { ldr.Errorf(s, "addgotsym: unsupported binary format") } -- GitLab From 49b12dcca975b043b70a9376413e64f47e94db36 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Wed, 20 May 2020 15:10:05 -0400 Subject: [PATCH 0043/1792] [dev.link] cmd/link: remove duplicate asmb code Lots of the architecture specific code for asmb() is very simimar. As such, move to a common function. Change-Id: Id1fd50ee7bfa1bc9978e3f42ad08914b04cd677b Reviewed-on: https://go-review.googlesource.com/c/go/+/234683 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 35 -------------- src/cmd/link/internal/amd64/obj.go | 3 +- src/cmd/link/internal/arm/asm.go | 30 ------------ src/cmd/link/internal/arm/obj.go | 1 - src/cmd/link/internal/arm64/asm.go | 30 ------------ src/cmd/link/internal/arm64/obj.go | 1 - src/cmd/link/internal/ld/asmb.go | 70 ++++++++++++++++++++++++++++ src/cmd/link/internal/ld/data.go | 10 ++-- src/cmd/link/internal/ld/lib.go | 25 +++++++--- src/cmd/link/internal/ld/main.go | 4 +- src/cmd/link/internal/mips/asm.go | 26 ----------- src/cmd/link/internal/mips/obj.go | 1 - src/cmd/link/internal/mips64/asm.go | 30 ------------ src/cmd/link/internal/mips64/obj.go | 1 - src/cmd/link/internal/ppc64/asm.go | 31 ------------ src/cmd/link/internal/ppc64/obj.go | 12 ++--- src/cmd/link/internal/riscv64/asm.go | 30 ------------ src/cmd/link/internal/riscv64/obj.go | 1 - src/cmd/link/internal/s390x/asm.go | 30 ------------ src/cmd/link/internal/s390x/obj.go | 1 - src/cmd/link/internal/x86/asm.go | 33 ------------- src/cmd/link/internal/x86/obj.go | 3 +- 22 files changed, 104 insertions(+), 304 deletions(-) create mode 100644 src/cmd/link/internal/ld/asmb.go diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 06c5f30983..6e784b59f4 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -38,7 +38,6 @@ import ( "cmd/link/internal/sym" "debug/elf" "log" - "sync" ) func PADDR(x uint32) uint32 { @@ -680,40 +679,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - sect := ld.Segtext.Sections[0] - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - f := func(ctxt *ld.Link, out *ld.OutBuf, start, length int64) { - // 0xCC is INT $3 - breakpoint instruction - ld.CodeblkPad(ctxt, out, start, length, []byte{0xCC}) - } - ld.WriteParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length) - - for _, sect := range ld.Segtext.Sections[1:] { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - if ld.Segrelrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { machlink := int64(0) if ctxt.HeadType == objabi.Hdarwin { diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index 3239c61864..90de67d086 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -50,12 +50,13 @@ func Init() (*sys.Arch, ld.Arch) { Minalign: minAlign, Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, + // 0xCC is INT $3 - breakpoint instruction + CodePad: []byte{0xCC}, Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 357a22b879..db2e2cf69a 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -39,7 +39,6 @@ import ( "debug/elf" "fmt" "log" - "sync" ) // This assembler: @@ -672,35 +671,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - sect := ld.Segtext.Sections[0] - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length) - - for _, sect := range ld.Segtext.Sections[1:] { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - if ld.Segrelrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index 003c80a508..c70b10e75d 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -51,7 +51,6 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Trampoline: trampoline, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index fae3aa5ac2..94c86e0b46 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -39,7 +39,6 @@ import ( "debug/elf" "fmt" "log" - "sync" ) func gentext(ctxt *ld.Link, ldr *loader.Loader) { @@ -797,35 +796,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - sect := ld.Segtext.Sections[0] - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length) - - for _, sect := range ld.Segtext.Sections[1:] { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - if ld.Segrelrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { machlink := uint32(0) if ctxt.HeadType == objabi.Hdarwin { diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 4ed05c087a..de6ab58329 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -50,7 +50,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go new file mode 100644 index 0000000000..ede4f91664 --- /dev/null +++ b/src/cmd/link/internal/ld/asmb.go @@ -0,0 +1,70 @@ +// 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 ld + +import ( + "cmd/link/internal/loader" + "sync" +) + +// Assembling the binary is broken into two steps: +// - writing out the code/data/dwarf Segments +// - writing out the architecture specific pieces. +// This function handles the first part. +func asmb(ctxt *Link, ldr *loader.Loader) { + // TODO(jfaller): delete me. + if thearch.Asmb != nil { + thearch.Asmb(ctxt, ldr) + return + } + + if ctxt.IsELF { + Asmbelfsetup() + } + + var wg sync.WaitGroup + sect := Segtext.Sections[0] + offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff + f := func(ctxt *Link, out *OutBuf, start, length int64) { + pad := thearch.CodePad + if pad == nil { + pad = zeros[:] + } + CodeblkPad(ctxt, out, start, length, pad) + } + + if !thearch.WriteTextBlocks { + writeParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length) + for _, sect := range Segtext.Sections[1:] { + offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff + writeParallel(&wg, Datblk, ctxt, offset, sect.Vaddr, sect.Length) + } + } else { + // TODO why can't we handle all sections this way? + for _, sect := range Segtext.Sections { + offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff + // Handle additional text sections with Codeblk + if sect.Name == ".text" { + writeParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length) + } else { + writeParallel(&wg, Datblk, ctxt, offset, sect.Vaddr, sect.Length) + } + } + } + + if Segrodata.Filelen > 0 { + writeParallel(&wg, Datblk, ctxt, Segrodata.Fileoff, Segrodata.Vaddr, Segrodata.Filelen) + } + + if Segrelrodata.Filelen > 0 { + writeParallel(&wg, Datblk, ctxt, Segrelrodata.Fileoff, Segrelrodata.Vaddr, Segrelrodata.Filelen) + } + + writeParallel(&wg, Datblk, ctxt, Segdata.Fileoff, Segdata.Vaddr, Segdata.Filelen) + + writeParallel(&wg, dwarfblk, ctxt, Segdwarf.Fileoff, Segdwarf.Vaddr, Segdwarf.Filelen) + + wg.Wait() +} diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 98242b16e4..26f443c56a 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -801,10 +801,6 @@ func (state *dodataState) dynreloc(ctxt *Link) { } } -func Codeblk(ctxt *Link, out *OutBuf, addr int64, size int64) { - CodeblkPad(ctxt, out, addr, size, zeros[:]) -} - func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte) { writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad) } @@ -951,8 +947,8 @@ func writeBlock(out *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size i type writeFn func(*Link, *OutBuf, int64, int64) -// WriteParallel handles scheduling parallel execution of data write functions. -func WriteParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, length uint64) { +// writeParallel handles scheduling parallel execution of data write functions. +func writeParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, length uint64) { if out, err := ctxt.Out.View(seek); err != nil { ctxt.Out.SeekSet(int64(seek)) fn(ctxt, ctxt.Out, int64(vaddr), int64(length)) @@ -981,7 +977,7 @@ func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) { writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap, addr, size, zeros[:]) } -func Dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) { +func dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) { // Concatenate the section symbol lists into a single list to pass // to writeBlocks. // diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 04c4adfb86..33cb9788c4 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -184,8 +184,18 @@ type Arch struct { Openbsddynld string Dragonflydynld string Solarisdynld string - Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool - Archinit func(*Link) + + // 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 + // are padded with zeros. + CodePad []byte + + // Set to true to write all text blocks in with CodeBlkWrite + WriteTextBlocks bool + + Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool + Archinit func(*Link) // Archreloc is an arch-specific hook that assists in relocation processing // (invoked by 'relocsym'); it handles target-specific relocation tasks. // Here "rel" is the current relocation being examined, "sym" is the symbol @@ -212,10 +222,13 @@ type Arch struct { // index of the relocation. Trampoline func(ctxt *Link, ldr *loader.Loader, ri int, rs, s loader.Sym) - // Asmb and Asmb2 are arch-specific routines that write the output - // file. Typically, Asmb writes most of the content (sections and - // segments), for which we have computed the size and offset. Asmb2 - // writes the rest. + // Assembling the binary breaks into two phases, writing the code/data/ + // dwarf information (which is rather generic), and some more architecture + // specific work like setting up the elf headers/dynamic relocations, etc. + // The phases are called "Asmb" and "Asmb2". Asmb2 needs to be defined for + // every architecture, but only if architecture has an Asmb function will + // it be used for assembly. Otherwise a generic assembly Asmb function is + // used. Asmb func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 6bb1ea7a56..ee5cc19bad 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -313,11 +313,11 @@ func Main(arch *sys.Arch, theArch Arch) { panic(err) } } - // Asmb will redirect symbols to the output file mmap, and relocations + // asmb will redirect symbols to the output file mmap, and relocations // will be applied directly there. bench.Start("Asmb") ctxt.loader.InitOutData() - thearch.Asmb(ctxt, ctxt.loader) + asmb(ctxt, ctxt.loader) bench.Start("reloc") ctxt.reloc() bench.Start("Asmb2") diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index fdcb79326d..c43b1e61ef 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -38,7 +38,6 @@ import ( "cmd/link/internal/sym" "debug/elf" "fmt" - "sync" ) func gentext(ctxt *ld.Link, ldr *loader.Loader) { @@ -153,31 +152,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian return -1 } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - sect := ld.Segtext.Sections[0] - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length) - - for _, sect = range ld.Segtext.Sections[1:] { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index 5acbaddd41..eb0dbe62be 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -52,7 +52,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index d72f6d2496..c10bbb4fec 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -38,7 +38,6 @@ import ( "cmd/link/internal/sym" "debug/elf" "fmt" - "sync" ) func gentext(ctxt *ld.Link, ldr *loader.Loader) {} @@ -159,35 +158,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian return -1 } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - sect := ld.Segtext.Sections[0] - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length) - - for _, sect := range ld.Segtext.Sections[1:] { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - if ld.Segrelrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index 55ca337e06..90919ee737 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -51,7 +51,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index aae42c0bbc..74c4c4d05d 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -41,7 +41,6 @@ import ( "fmt" "log" "strings" - "sync" ) func genplt(ctxt *ld.Link, ldr *loader.Loader) { @@ -1081,36 +1080,6 @@ func ensureglinkresolver(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilde return glink } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - for _, sect := range ld.Segtext.Sections { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - // Handle additional text sections with Codeblk - if sect.Name == ".text" { - ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length) - } else { - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - if ld.Segrelrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index 49c7ec2103..ae291f87fc 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -43,17 +43,17 @@ func Init() (*sys.Arch, ld.Arch) { } theArch := ld.Arch{ - Funcalign: funcAlign, - Maxalign: maxAlign, - Minalign: minAlign, - Dwarfregsp: dwarfRegSP, - Dwarfreglr: dwarfRegLR, + Funcalign: funcAlign, + Maxalign: maxAlign, + Minalign: minAlign, + Dwarfregsp: dwarfRegSP, + Dwarfreglr: dwarfRegLR, + WriteTextBlocks: true, Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index b9c5c68693..bc39c06309 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -13,7 +13,6 @@ import ( "cmd/link/internal/sym" "fmt" "log" - "sync" ) func gentext(ctxt *ld.Link, ldr *loader.Loader) { @@ -91,35 +90,6 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian return -1 } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - sect := ld.Segtext.Sections[0] - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length) - - for _, sect := range ld.Segtext.Sections[1:] { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - if ld.Segrelrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { ld.Symsize = 0 ld.Lcsize = 0 diff --git a/src/cmd/link/internal/riscv64/obj.go b/src/cmd/link/internal/riscv64/obj.go index 9fe9822a32..a0ff179d83 100644 --- a/src/cmd/link/internal/riscv64/obj.go +++ b/src/cmd/link/internal/riscv64/obj.go @@ -23,7 +23,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index ae2baaa05a..7465212b9d 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -38,7 +38,6 @@ import ( "cmd/link/internal/sym" "debug/elf" "fmt" - "sync" ) // gentext generates assembly to append the local moduledata to the global @@ -477,35 +476,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - sect := ld.Segtext.Sections[0] - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Codeblk, ctxt, offset, sect.Vaddr, sect.Length) - - for _, sect := range ld.Segtext.Sections[1:] { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - if ld.Segrelrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 54d640731e..28886804b7 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -50,7 +50,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index ecd5058f4c..967261a8cd 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -38,7 +38,6 @@ import ( "cmd/link/internal/sym" "debug/elf" "log" - "sync" ) func gentext(ctxt *ld.Link, ldr *loader.Loader) { @@ -511,38 +510,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } } -func asmb(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsELF { - ld.Asmbelfsetup() - } - - var wg sync.WaitGroup - sect := ld.Segtext.Sections[0] - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - f := func(ctxt *ld.Link, out *ld.OutBuf, start, length int64) { - ld.CodeblkPad(ctxt, out, start, length, []byte{0xCC}) - } - ld.WriteParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length) - - for _, sect := range ld.Segtext.Sections[1:] { - offset := sect.Vaddr - ld.Segtext.Vaddr + ld.Segtext.Fileoff - ld.WriteParallel(&wg, ld.Datblk, ctxt, offset, sect.Vaddr, sect.Length) - } - - if ld.Segrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrodata.Fileoff, ld.Segrodata.Vaddr, ld.Segrodata.Filelen) - } - - if ld.Segrelrodata.Filelen > 0 { - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segrelrodata.Fileoff, ld.Segrelrodata.Vaddr, ld.Segrelrodata.Filelen) - } - - ld.WriteParallel(&wg, ld.Datblk, ctxt, ld.Segdata.Fileoff, ld.Segdata.Vaddr, ld.Segdata.Filelen) - - ld.WriteParallel(&wg, ld.Dwarfblk, ctxt, ld.Segdwarf.Fileoff, ld.Segdwarf.Vaddr, ld.Segdwarf.Filelen) - wg.Wait() -} - func asmb2(ctxt *ld.Link, _ *loader.Loader) { machlink := uint32(0) if ctxt.HeadType == objabi.Hdarwin { diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index f53ecc8fc0..b604c1f8c2 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -45,12 +45,13 @@ func Init() (*sys.Arch, ld.Arch) { Minalign: minAlign, Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, + // 0xCC is INT $3 - breakpoint instruction + CodePad: []byte{0xCC}, Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, -- GitLab From de1f07d56d3a0c8a6ca5cf2553abcf536785e1eb Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 21 May 2020 16:35:24 -0400 Subject: [PATCH 0044/1792] [dev.link] cmd/link: delete sym.Symbols Now the only thing it does is to track versions. Move it to ctxt. And delete sym.Symbols. Change-Id: Ie6b974f9bf79c4f33ace02213dcb89463eadd26a Reviewed-on: https://go-review.googlesource.com/c/go/+/234884 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/lib.go | 15 ++++---- src/cmd/link/internal/ld/link.go | 13 ++++++- src/cmd/link/internal/ld/sym.go | 2 +- src/cmd/link/internal/loader/loader.go | 3 +- src/cmd/link/internal/sym/symbols.go | 53 -------------------------- 5 files changed, 22 insertions(+), 64 deletions(-) delete mode 100644 src/cmd/link/internal/sym/symbols.go diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 33cb9788c4..d8621c7db1 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -151,8 +151,9 @@ func (ctxt *Link) setArchSyms() { // *sym.Symbol symbols. Symbols that are assigned this final // version are not going to have TOC references, so it should // be ok for them to inherit an invalid .TOC. symbol. - ctxt.DotTOC = make([]loader.Sym, ctxt.Syms.MaxVersion()+2) - for i := 0; i <= ctxt.Syms.MaxVersion(); i++ { + // TODO: revisit the +2, now that loadlibfull is gone. + ctxt.DotTOC = make([]loader.Sym, ctxt.MaxVersion()+2) + for i := 0; i <= ctxt.MaxVersion(); i++ { if i >= 2 && i < sym.SymVerStatic { // these versions are not used currently continue } @@ -1809,7 +1810,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, magic := uint32(c1)<<24 | uint32(c2)<<16 | uint32(c3)<<8 | uint32(c4) if magic == 0x7f454c46 { // \x7F E L F ldelf := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, flags, err := loadelf.Load(ctxt.loader, ctxt.Arch, ctxt.Syms.IncVersion(), f, pkg, length, pn, ehdr.flags) + textp, flags, err := loadelf.Load(ctxt.loader, ctxt.Arch, ctxt.IncVersion(), f, pkg, length, pn, ehdr.flags) if err != nil { Errorf(nil, "%v", err) return @@ -1822,7 +1823,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, if magic&^1 == 0xfeedface || magic&^0x01000000 == 0xcefaedfe { ldmacho := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, err := loadmacho.Load(ctxt.loader, ctxt.Arch, ctxt.Syms.IncVersion(), f, pkg, length, pn) + textp, err := loadmacho.Load(ctxt.loader, ctxt.Arch, ctxt.IncVersion(), f, pkg, length, pn) if err != nil { Errorf(nil, "%v", err) return @@ -1834,7 +1835,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, if c1 == 0x4c && c2 == 0x01 || c1 == 0x64 && c2 == 0x86 { ldpe := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, rsrc, err := loadpe.Load(ctxt.loader, ctxt.Arch, ctxt.Syms.IncVersion(), f, pkg, length, pn) + textp, rsrc, err := loadpe.Load(ctxt.loader, ctxt.Arch, ctxt.IncVersion(), f, pkg, length, pn) if err != nil { Errorf(nil, "%v", err) return @@ -1849,7 +1850,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, if c1 == 0x01 && (c2 == 0xD7 || c2 == 0xF7) { ldxcoff := func(ctxt *Link, f *bio.Reader, pkg string, length int64, pn string) { - textp, err := loadxcoff.Load(ctxt.loader, ctxt.Arch, ctxt.Syms.IncVersion(), f, pkg, length, pn) + textp, err := loadxcoff.Load(ctxt.loader, ctxt.Arch, ctxt.IncVersion(), f, pkg, length, pn) if err != nil { Errorf(nil, "%v", err) return @@ -1941,7 +1942,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, ldpkg(ctxt, f, lib, import1-import0-2, pn) // -2 for !\n f.MustSeek(import1, 0) - fingerprint := ctxt.loader.Preload(ctxt.Syms, f, lib, unit, eof-f.Offset()) + fingerprint := ctxt.loader.Preload(ctxt.IncVersion(), f, lib, unit, eof-f.Offset()) if !fingerprint.IsZero() { // Assembly objects don't have fingerprints. Ignore them. // Check fingerprint, to ensure the importing and imported packages // have consistent view of symbol indices. diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index bca87e1c1b..babef8ce17 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -57,7 +57,7 @@ type Link struct { outSem chan int // limits the number of output writers Out *OutBuf - Syms *sym.Symbols + version int // current version number for static/file-local symbols Debugvlog int Bso *bufio.Writer @@ -133,3 +133,14 @@ func addImports(ctxt *Link, l *sym.Library, pn string) { } l.Autolib = nil } + +// Allocate a new version (i.e. symbol namespace). +func (ctxt *Link) IncVersion() int { + ctxt.version++ + return ctxt.version - 1 +} + +// returns the maximum version number +func (ctxt *Link) MaxVersion() int { + return ctxt.version +} diff --git a/src/cmd/link/internal/ld/sym.go b/src/cmd/link/internal/ld/sym.go index 7a6c4e43e9..7cf3a50992 100644 --- a/src/cmd/link/internal/ld/sym.go +++ b/src/cmd/link/internal/ld/sym.go @@ -44,7 +44,7 @@ func linknew(arch *sys.Arch) *Link { ler := loader.ErrorReporter{AfterErrorAction: afterErrorAction} ctxt := &Link{ Target: Target{Arch: arch}, - Syms: sym.NewSymbols(), + version: sym.SymVerStatic, outSem: make(chan int, 2*runtime.GOMAXPROCS(0)), Out: NewOutBuf(arch), LibraryByPkg: make(map[string]*sym.Library), diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index e340506978..38c4e6ecef 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1911,7 +1911,7 @@ func (l *Loader) FuncInfo(i Sym) FuncInfo { // Does not add non-package symbols yet, which will be done in LoadNonpkgSyms. // Does not read symbol data. // Returns the fingerprint of the object. -func (l *Loader) Preload(syms *sym.Symbols, f *bio.Reader, lib *sym.Library, unit *sym.CompilationUnit, length int64) goobj2.FingerprintType { +func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, unit *sym.CompilationUnit, length int64) goobj2.FingerprintType { roObject, readonly, err := f.Slice(uint64(length)) if err != nil { log.Fatal("cannot read object file:", err) @@ -1923,7 +1923,6 @@ func (l *Loader) Preload(syms *sym.Symbols, f *bio.Reader, lib *sym.Library, uni } panic("cannot read object file") } - localSymVersion := syms.IncVersion() pkgprefix := objabi.PathToPrefix(lib.Pkg) + "." ndef := r.NSym() nnonpkgdef := r.NNonpkgdef() diff --git a/src/cmd/link/internal/sym/symbols.go b/src/cmd/link/internal/sym/symbols.go deleted file mode 100644 index fbf32b0bca..0000000000 --- a/src/cmd/link/internal/sym/symbols.go +++ /dev/null @@ -1,53 +0,0 @@ -// Derived from Inferno utils/6l/l.h and related files. -// https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/l.h -// -// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. -// Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) -// Portions Copyright © 1997-1999 Vita Nuova Limited -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) -// Portions Copyright © 2004,2006 Bruce Ellis -// Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) -// Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package sym - -type Symbols struct { - // Symbol lookup based on name and indexed by version. - versions int -} - -func NewSymbols() *Symbols { - return &Symbols{ - versions: SymVerStatic, - } -} - -// Allocate a new version (i.e. symbol namespace). -func (syms *Symbols) IncVersion() int { - syms.versions++ - return syms.versions - 1 -} - -// returns the maximum version number -func (syms *Symbols) MaxVersion() int { - return syms.versions -} -- GitLab From 96ec09da4885f0c09f0b1bb94d0a1e2b483495ca Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 20 May 2020 13:51:59 -0400 Subject: [PATCH 0045/1792] [dev.link] cmd/{compile,link}: split SDWARFINFO symtype into sub-types This change splits the SDWARFINFO symbol type (a generic container of DWARF content) into separate sub-classes. The new symbol types are SDWARFCUINFO comp unit DIE, also CU info and CU packagename syms SDWARFCONST constant DIE SDWARFFCN subprogram DIE (default and concrete) SDWARFABSFCN abstract function DIE SDWARFTYPE type DIE SDWARFVAR global variable DIE Advantage of doing this: in the linker there are several places where we have to iterate over a symbol's relocations to pick out references to specific classes of DWARF sub-symbols (for example, looking for all abstract function DIEs referenced by a subprogram DIE, or looking at all the type DIEs used in a subprogram DIE). By splitting SDWARFINFO into parts clients can now look only at the relocation target's sym type as opposed to having to materialize the target sym name, or do a lookup. Change-Id: I4e0ee3216d3c8f1a78bec3d296c01e95b3d025b5 Reviewed-on: https://go-review.googlesource.com/c/go/+/234684 Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/compile/internal/gc/main.go | 4 +- src/cmd/internal/obj/objfile.go | 6 +- src/cmd/internal/obj/objfile2.go | 3 +- src/cmd/internal/objabi/symkind.go | 7 ++- src/cmd/internal/objabi/symkind_string.go | 21 ++++--- src/cmd/link/internal/ld/dwarf.go | 68 +++++++++++++-------- src/cmd/link/internal/loader/loader.go | 4 +- src/cmd/link/internal/sym/symkind.go | 15 ++++- src/cmd/link/internal/sym/symkind_string.go | 21 ++++--- 9 files changed, 95 insertions(+), 54 deletions(-) diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index b258952457..6e204f49bc 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -1488,7 +1488,7 @@ func recordFlags(flags ...string) { return } s := Ctxt.Lookup(dwarf.CUInfoPrefix + "producer." + myimportpath) - s.Type = objabi.SDWARFINFO + s.Type = objabi.SDWARFCUINFO // Sometimes (for example when building tests) we can link // together two package main archives. So allow dups. s.Set(obj.AttrDuplicateOK, true) @@ -1500,7 +1500,7 @@ func recordFlags(flags ...string) { // compiled, so that the linker can save it in the compile unit's DIE. func recordPackageName() { s := Ctxt.Lookup(dwarf.CUInfoPrefix + "packagename." + myimportpath) - s.Type = objabi.SDWARFINFO + s.Type = objabi.SDWARFCUINFO // Sometimes (for example when building tests) we can link // together two package main archives. So allow dups. s.Set(obj.AttrDuplicateOK, true) diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 5e7018eb6e..c0194c5a6d 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -205,7 +205,7 @@ func (ctxt *Link) dwarfSym(s *LSym) (dwarfInfoSym, dwarfLocSym, dwarfRangesSym, } if s.Func.dwarfInfoSym == nil { s.Func.dwarfInfoSym = &LSym{ - Type: objabi.SDWARFINFO, + Type: objabi.SDWARFFCN, } if ctxt.Flag_locationlists { s.Func.dwarfLocSym = &LSym{ @@ -296,7 +296,7 @@ func (ctxt *Link) DwarfIntConst(myimportpath, name, typename string, val int64) return } s := ctxt.LookupInit(dwarf.ConstInfoPrefix+myimportpath, func(s *LSym) { - s.Type = objabi.SDWARFINFO + s.Type = objabi.SDWARFCONST ctxt.Data = append(ctxt.Data, s) }) dwarf.PutIntConst(dwCtxt{ctxt}, s, ctxt.Lookup(dwarf.InfoPrefix+typename), myimportpath+"."+name, val) @@ -422,7 +422,7 @@ func (ft *DwarfFixupTable) SetPrecursorFunc(s *LSym, fn interface{}) { // the back end. absfn := ft.ctxt.LookupDerived(s, dwarf.InfoPrefix+s.Name+dwarf.AbstractFuncSuffix) absfn.Set(AttrDuplicateOK, true) - absfn.Type = objabi.SDWARFINFO + absfn.Type = objabi.SDWARFABSFCN ft.ctxt.Data = append(ft.ctxt.Data, absfn) // In the case of "late" inlining (inlines that happen during diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index c28ae569d3..4679bbb445 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -428,7 +428,8 @@ 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.SDWARFINFO && + aux.Type != objabi.SDWARFFCN && + aux.Type != objabi.SDWARFABSFCN && aux.Type != objabi.SDWARFLINES && aux.Type != objabi.SDWARFRANGE { return diff --git a/src/cmd/internal/objabi/symkind.go b/src/cmd/internal/objabi/symkind.go index 69f15286cd..89577e2b89 100644 --- a/src/cmd/internal/objabi/symkind.go +++ b/src/cmd/internal/objabi/symkind.go @@ -56,7 +56,12 @@ const ( // Thread-local data that is initially all 0s STLSBSS // Debugging data - SDWARFINFO + SDWARFCUINFO + SDWARFCONST + SDWARFFCN + SDWARFABSFCN + SDWARFTYPE + SDWARFVAR SDWARFRANGE SDWARFLOC SDWARFLINES diff --git a/src/cmd/internal/objabi/symkind_string.go b/src/cmd/internal/objabi/symkind_string.go index 919a666e7b..1b1c394038 100644 --- a/src/cmd/internal/objabi/symkind_string.go +++ b/src/cmd/internal/objabi/symkind_string.go @@ -16,17 +16,22 @@ func _() { _ = x[SBSS-5] _ = x[SNOPTRBSS-6] _ = x[STLSBSS-7] - _ = x[SDWARFINFO-8] - _ = x[SDWARFRANGE-9] - _ = x[SDWARFLOC-10] - _ = x[SDWARFLINES-11] - _ = x[SABIALIAS-12] - _ = x[SLIBFUZZER_EXTRA_COUNTER-13] + _ = x[SDWARFCUINFO-8] + _ = x[SDWARFCONST-9] + _ = x[SDWARFFCN-10] + _ = x[SDWARFABSFCN-11] + _ = x[SDWARFTYPE-12] + _ = x[SDWARFVAR-13] + _ = x[SDWARFRANGE-14] + _ = x[SDWARFLOC-15] + _ = x[SDWARFLINES-16] + _ = x[SABIALIAS-17] + _ = x[SLIBFUZZER_EXTRA_COUNTER-18] } -const _SymKind_name = "SxxxSTEXTSRODATASNOPTRDATASDATASBSSSNOPTRBSSSTLSBSSSDWARFINFOSDWARFRANGESDWARFLOCSDWARFLINESSABIALIASSLIBFUZZER_EXTRA_COUNTER" +const _SymKind_name = "SxxxSTEXTSRODATASNOPTRDATASDATASBSSSNOPTRBSSSTLSBSSSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSABIALIASSLIBFUZZER_EXTRA_COUNTER" -var _SymKind_index = [...]uint8{0, 4, 9, 16, 26, 31, 35, 44, 51, 61, 72, 81, 92, 101, 125} +var _SymKind_index = [...]uint8{0, 4, 9, 16, 26, 31, 35, 44, 51, 63, 74, 83, 95, 105, 114, 125, 134, 145, 154, 178} func (i SymKind) String() string { if i >= SymKind(len(_SymKind_index)-1) { diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 18fcdbd141..912494b1bb 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -277,24 +277,37 @@ func (d *dwctxt) newdie(parent *dwarf.DWDie, abbrev int, name string, version in newattr(die, dwarf.DW_AT_name, dwarf.DW_CLS_STRING, int64(len(name)), name) - if name != "" && (abbrev <= dwarf.DW_ABRV_VARIABLE || abbrev >= dwarf.DW_ABRV_NULLTYPE) { - // Q: do we need version here? My understanding is that all these - // symbols should be version 0. - if abbrev != dwarf.DW_ABRV_VARIABLE || version == 0 { - if abbrev == dwarf.DW_ABRV_COMPUNIT { - // Avoid collisions with "real" symbol names. - name = fmt.Sprintf(".pkg.%s.%d", name, len(d.linkctxt.compUnits)) - } - ds := d.ldr.LookupOrCreateSym(dwarf.InfoPrefix+name, version) - dsu := d.ldr.MakeSymbolUpdater(ds) - dsu.SetType(sym.SDWARFINFO) - d.ldr.SetAttrNotInSymbolTable(ds, true) - d.ldr.SetAttrReachable(ds, true) - die.Sym = dwSym(ds) - if abbrev >= dwarf.DW_ABRV_NULLTYPE && abbrev <= dwarf.DW_ABRV_TYPEDECL { - d.tmap[name] = ds - } - } + // Sanity check: all DIEs created in the linker should have a non-empty + // name and be version zero. + if name == "" || version != 0 { + panic("nameless or version non-zero DWARF DIE") + } + + var st sym.SymKind + switch abbrev { + case dwarf.DW_ABRV_FUNCTYPEPARAM, dwarf.DW_ABRV_DOTDOTDOT, dwarf.DW_ABRV_STRUCTFIELD, dwarf.DW_ABRV_ARRAYRANGE: + // There are no relocations against these dies, and their names + // are not unique, so don't create a symbol. + return die + case dwarf.DW_ABRV_COMPUNIT, dwarf.DW_ABRV_COMPUNIT_TEXTLESS: + // Avoid collisions with "real" symbol names. + name = fmt.Sprintf(".pkg.%s.%d", name, len(d.linkctxt.compUnits)) + st = sym.SDWARFCUINFO + case dwarf.DW_ABRV_VARIABLE: + st = sym.SDWARFVAR + default: + // Everything else is assigned a type of SDWARFTYPE. that + // this also includes loose ends such as STRUCT_FIELD. + st = sym.SDWARFTYPE + } + ds := d.ldr.LookupOrCreateSym(dwarf.InfoPrefix+name, version) + dsu := d.ldr.MakeSymbolUpdater(ds) + dsu.SetType(st) + d.ldr.SetAttrNotInSymbolTable(ds, true) + d.ldr.SetAttrReachable(ds, true) + die.Sym = dwSym(ds) + if abbrev >= dwarf.DW_ABRV_NULLTYPE && abbrev <= dwarf.DW_ABRV_TYPEDECL { + d.tmap[name] = ds } return die @@ -480,7 +493,7 @@ func (d *dwctxt) dotypedef(parent *dwarf.DWDie, gotype loader.Sym, name string, // to be an anonymous symbol (we want this for perf reasons). tds := d.ldr.CreateExtSym("", 0) tdsu := d.ldr.MakeSymbolUpdater(tds) - tdsu.SetType(sym.SDWARFINFO) + tdsu.SetType(sym.SDWARFTYPE) def.Sym = dwSym(tds) d.ldr.SetAttrNotInSymbolTable(tds, true) d.ldr.SetAttrReachable(tds, true) @@ -850,7 +863,7 @@ func (d *dwctxt) mkinternaltype(ctxt *Link, abbrev int, typename, keyname, valna name := mkinternaltypename(typename, keyname, valname) symname := dwarf.InfoPrefix + name s := d.ldr.Lookup(symname, 0) - if s != 0 && d.ldr.SymType(s) == sym.SDWARFINFO { + if s != 0 && d.ldr.SymType(s) == sym.SDWARFTYPE { return s } die := d.newdie(&dwtypes, abbrev, name, 0) @@ -1122,7 +1135,8 @@ func getCompilationDir() string { func (d *dwctxt) importInfoSymbol(ctxt *Link, dsym loader.Sym) { d.ldr.SetAttrReachable(dsym, true) d.ldr.SetAttrNotInSymbolTable(dsym, true) - if d.ldr.SymType(dsym) != sym.SDWARFINFO { + dst := d.ldr.SymType(dsym) + if dst != sym.SDWARFCONST && dst != sym.SDWARFABSFCN { log.Fatalf("error: DWARF info sym %d/%s with incorrect type %s", dsym, d.ldr.SymName(dsym), d.ldr.SymType(dsym).String()) } relocs := d.ldr.Relocs(dsym) @@ -1492,7 +1506,7 @@ func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, p infosec := d.ldr.LookupOrCreateSym(".debug_info", 0) disu := d.ldr.MakeSymbolUpdater(infosec) - disu.SetType(sym.SDWARFINFO) + disu.SetType(sym.SDWARFCUINFO) d.ldr.SetAttrReachable(infosec, true) syms := []loader.Sym{infosec} @@ -1814,7 +1828,11 @@ func dwarfGenerateDebugInfo(ctxt *Link) { ctxt.runtimeCU = unit } - unit.DWInfo = d.newdie(&dwroot, dwarf.DW_ABRV_COMPUNIT, unit.Lib.Pkg, 0) + cuabrv := dwarf.DW_ABRV_COMPUNIT + if len(unit.Textp) == 0 { + cuabrv = dwarf.DW_ABRV_COMPUNIT_TEXTLESS + } + unit.DWInfo = d.newdie(&dwroot, cuabrv, unit.Lib.Pkg, 0) newattr(unit.DWInfo, dwarf.DW_AT_language, dwarf.DW_CLS_CONSTANT, int64(dwarf.DW_LANG_Go), 0) // OS X linker requires compilation dir or absolute path in comp unit name to output debug info. compDir := getCompilationDir() @@ -1850,10 +1868,6 @@ func dwarfGenerateDebugInfo(ctxt *Link) { } newattr(unit.DWInfo, dwarf.DW_AT_go_package_name, dwarf.DW_CLS_STRING, int64(len(pkgname)), pkgname) - if len(unit.Textp) == 0 { - unit.DWInfo.Abbrev = dwarf.DW_ABRV_COMPUNIT_TEXTLESS - } - // Scan all functions in this compilation unit, create DIEs for all // referenced types, create the file table for debug_line, find all // referenced abstract functions. diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 38c4e6ecef..191787675a 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1539,7 +1539,7 @@ func (l *Loader) GetFuncDwarfAuxSyms(fnSymIdx Sym) (auxDwarfInfo, auxDwarfLoc, a switch a.Type() { case goobj2.AuxDwarfInfo: auxDwarfInfo = l.resolve(r, a.Sym()) - if l.SymType(auxDwarfInfo) != sym.SDWARFINFO { + if l.SymType(auxDwarfInfo) != sym.SDWARFFCN { panic("aux dwarf info sym with wrong type") } case goobj2.AuxDwarfLoc: @@ -2105,7 +2105,7 @@ func topLevelSym(sname string, skind sym.SymKind) bool { return true } switch skind { - case sym.SDWARFINFO, sym.SDWARFRANGE, sym.SDWARFLOC, sym.SDWARFLINES, sym.SGOFUNC: + case sym.SDWARFFCN, sym.SDWARFABSFCN, sym.SDWARFTYPE, sym.SDWARFCONST, sym.SDWARFCUINFO, sym.SDWARFRANGE, sym.SDWARFLOC, sym.SDWARFLINES, sym.SGOFUNC: return true default: return false diff --git a/src/cmd/link/internal/sym/symkind.go b/src/cmd/link/internal/sym/symkind.go index 75f72c3737..e4a8fe7846 100644 --- a/src/cmd/link/internal/sym/symkind.go +++ b/src/cmd/link/internal/sym/symkind.go @@ -108,7 +108,13 @@ const ( // Sections for debugging information SDWARFSECT - SDWARFINFO + // DWARF symbol types + SDWARFCUINFO + SDWARFCONST + SDWARFFCN + SDWARFABSFCN + SDWARFTYPE + SDWARFVAR SDWARFRANGE SDWARFLOC SDWARFLINES @@ -128,7 +134,12 @@ var AbiSymKindToSymKind = [...]SymKind{ SBSS, SNOPTRBSS, STLSBSS, - SDWARFINFO, + SDWARFCUINFO, + SDWARFCONST, + SDWARFFCN, + SDWARFABSFCN, + SDWARFTYPE, + SDWARFVAR, SDWARFRANGE, SDWARFLOC, SDWARFLINES, diff --git a/src/cmd/link/internal/sym/symkind_string.go b/src/cmd/link/internal/sym/symkind_string.go index 5777047d0f..47b2406e28 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"; DO NOT EDIT. +// Code generated by "stringer -type=SymKindstringer -type=SymKind"; DO NOT EDIT. package sym @@ -56,16 +56,21 @@ func _() { _ = x[SHOSTOBJ-45] _ = x[SUNDEFEXT-46] _ = x[SDWARFSECT-47] - _ = x[SDWARFINFO-48] - _ = x[SDWARFRANGE-49] - _ = x[SDWARFLOC-50] - _ = x[SDWARFLINES-51] - _ = x[SABIALIAS-52] + _ = x[SDWARFCUINFO-48] + _ = x[SDWARFCONST-49] + _ = x[SDWARFFCN-50] + _ = x[SDWARFABSFCN-51] + _ = x[SDWARFTYPE-52] + _ = x[SDWARFVAR-53] + _ = x[SDWARFRANGE-54] + _ = x[SDWARFLOC-55] + _ = x[SDWARFLINES-56] + _ = x[SABIALIAS-57] } -const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_EXTRA_COUNTERSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFINFOSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS" +const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_EXTRA_COUNTERSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS" -var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 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, 337, 344, 349, 361, 373, 390, 407, 416, 426, 434, 443, 453, 463, 474, 483, 494, 503} +var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 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, 337, 344, 349, 361, 373, 390, 407, 416, 426, 434, 443, 453, 465, 476, 485, 497, 507, 516, 527, 536, 547, 556} func (i SymKind) String() string { if i >= SymKind(len(_SymKind_index)-1) { -- GitLab From 8ca2eae206cbe063de68cec046f41a7c7b8c4d4f Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 20 May 2020 15:06:22 -0400 Subject: [PATCH 0046/1792] [dev.link] cmd/link: refactor DWARF fn die processing to remove name lookups Rework the code in the linker that visits DWARF subprorgam DIEs to reduce number of symbol name instantiations and name lookups, by making better use of relocation target symbol types. Change-Id: Ifb2a4e24874b8c891d7fdf17dd749c3f9139157a Reviewed-on: https://go-review.googlesource.com/c/go/+/234685 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/dwarf.go | 150 ++++++++++++++++-------------- 1 file changed, 78 insertions(+), 72 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 912494b1bb..2fff7a8ca0 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1132,7 +1132,7 @@ func getCompilationDir() string { return "." } -func (d *dwctxt) importInfoSymbol(ctxt *Link, dsym loader.Sym) { +func (d *dwctxt) importInfoSymbol(dsym loader.Sym) { d.ldr.SetAttrReachable(dsym, true) d.ldr.SetAttrNotInSymbolTable(dsym, true) dst := d.ldr.SymType(dsym) @@ -1744,6 +1744,76 @@ func (d *dwctxt) mkBuiltinType(ctxt *Link, abrv int, tname string) *dwarf.DWDie return die } +// dwarfVisitFunction takes a function (text) symbol and processes the +// subprogram DIE for the function and picks up any other DIEs +// (absfns, types) that it references. +func (d *dwctxt) dwarfVisitFunction(fnSym loader.Sym, unit *sym.CompilationUnit) { + // The DWARF subprogram DIE symbol is listed as an aux sym + // of the text (fcn) symbol, so ask the loader to retrieve it, + // as well as the associated range symbol. + infosym, _, rangesym, _ := d.ldr.GetFuncDwarfAuxSyms(fnSym) + if infosym == 0 { + return + } + d.ldr.SetAttrNotInSymbolTable(infosym, true) + d.ldr.SetAttrReachable(infosym, true) + unit.FuncDIEs = append(unit.FuncDIEs, sym.LoaderSym(infosym)) + if rangesym != 0 { + rs := len(d.ldr.Data(rangesym)) + d.ldr.SetAttrNotInSymbolTable(rangesym, true) + d.ldr.SetAttrReachable(rangesym, true) + if d.linkctxt.IsAIX() { + addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(rs)) + } + unit.RangeSyms = append(unit.RangeSyms, sym.LoaderSym(rangesym)) + } + + // Walk the relocations of the subprogram DIE symbol to discover + // references to abstract function DIEs, Go type DIES, and + // (via R_USETYPE relocs) types that were originally assigned to + // locals/params but were optimized away. + drelocs := d.ldr.Relocs(infosym) + for ri := 0; ri < drelocs.Count(); ri++ { + r := drelocs.At2(ri) + // Look for "use type" relocs. + if r.Type() == objabi.R_USETYPE { + d.defgotype(r.Sym()) + continue + } + if r.Type() != objabi.R_DWARFSECREF { + continue + } + + rsym := r.Sym() + rst := d.ldr.SymType(rsym) + + // Look for abstract function references. + if rst == sym.SDWARFABSFCN { + if !d.ldr.AttrOnList(rsym) { + // abstract function + d.ldr.SetAttrOnList(rsym, true) + unit.AbsFnDIEs = append(unit.AbsFnDIEs, sym.LoaderSym(rsym)) + d.importInfoSymbol(rsym) + } + continue + } + + // Look for type references. + if rst != sym.SDWARFTYPE && rst != sym.Sxxx { + continue + } + if _, ok := d.rtmap[rsym]; ok { + // type already generated + continue + } + + rsn := d.ldr.SymName(rsym) + tn := rsn[len(dwarf.InfoPrefix):] + ts := d.ldr.Lookup("type."+tn, 0) + d.defgotype(ts) + } +} + // dwarfGenerateDebugInfo generated debug info entries for all types, // variables and functions in the program. // Along with dwarfGenerateDebugSyms they are the two main entry points into @@ -1818,7 +1888,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { // We drop the constants into the first CU. if consts != 0 { unit.Consts = sym.LoaderSym(consts) - d.importInfoSymbol(ctxt, consts) + d.importInfoSymbol(consts) consts = 0 } ctxt.compUnits = append(ctxt.compUnits, unit) @@ -1868,56 +1938,12 @@ func dwarfGenerateDebugInfo(ctxt *Link) { } newattr(unit.DWInfo, dwarf.DW_AT_go_package_name, dwarf.DW_CLS_STRING, int64(len(pkgname)), pkgname) - // Scan all functions in this compilation unit, create DIEs for all - // referenced types, create the file table for debug_line, find all - // referenced abstract functions. - // Collect all debug_range symbols in unit.rangeSyms - for _, s := range unit.Textp { // Textp has been dead-code-eliminated already. - fnSym := loader.Sym(s) - infosym, _, rangesym, _ := d.ldr.GetFuncDwarfAuxSyms(fnSym) - if infosym == 0 { - continue - } - d.ldr.SetAttrNotInSymbolTable(infosym, true) - d.ldr.SetAttrReachable(infosym, true) - - unit.FuncDIEs = append(unit.FuncDIEs, sym.LoaderSym(infosym)) - if rangesym != 0 { - rs := len(d.ldr.Data(rangesym)) - d.ldr.SetAttrNotInSymbolTable(rangesym, true) - d.ldr.SetAttrReachable(rangesym, true) - if ctxt.HeadType == objabi.Haix { - addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(rs)) - } - unit.RangeSyms = append(unit.RangeSyms, sym.LoaderSym(rangesym)) - } - - drelocs := d.ldr.Relocs(infosym) - for ri := 0; ri < drelocs.Count(); ri++ { - r := drelocs.At2(ri) - if r.Type() == objabi.R_DWARFSECREF { - rsym := r.Sym() - rsn := d.ldr.SymName(rsym) - if len(rsn) == 0 { - continue - } - // NB: there should be a better way to do this that doesn't involve materializing the symbol name and doing string prefix+suffix checks. - if strings.HasPrefix(rsn, dwarf.InfoPrefix) && strings.HasSuffix(rsn, dwarf.AbstractFuncSuffix) && !d.ldr.AttrOnList(rsym) { - // abstract function - d.ldr.SetAttrOnList(rsym, true) - unit.AbsFnDIEs = append(unit.AbsFnDIEs, sym.LoaderSym(rsym)) - d.importInfoSymbol(ctxt, rsym) - continue - } - if _, ok := d.rtmap[rsym]; ok { - // type already generated - continue - } - tn := rsn[len(dwarf.InfoPrefix):] - ts := d.ldr.Lookup("type."+tn, 0) - d.defgotype(ts) - } - } + // Scan all functions in this compilation unit, create + // DIEs for all referenced types, find all referenced + // abstract functions, visit range symbols. Note that + // Textp has been dead-code-eliminated already. + for _, s := range unit.Textp { + d.dwarfVisitFunction(loader.Sym(s), unit) } } } @@ -1966,26 +1992,6 @@ func dwarfGenerateDebugInfo(ctxt *Link) { d.dwarfDefineGlobal(ctxt, idx, sn, sv, gt) } - // Create DIEs for variable types indirectly referenced by function - // autos (which may not appear directly as param/var DIEs). - for _, lib := range ctxt.Library { - for _, unit := range lib.Units { - lists := [][]sym.LoaderSym{unit.AbsFnDIEs, unit.FuncDIEs} - for _, list := range lists { - for _, s := range list { - symIdx := loader.Sym(s) - relocs := d.ldr.Relocs(symIdx) - for i := 0; i < relocs.Count(); i++ { - r := relocs.At2(i) - if r.Type() == objabi.R_USETYPE { - d.defgotype(r.Sym()) - } - } - } - } - } - } - d.synthesizestringtypes(ctxt, dwtypes.Child) d.synthesizeslicetypes(ctxt, dwtypes.Child) d.synthesizemaptypes(ctxt, dwtypes.Child) -- GitLab From 6265ed745241da6c04ac8b9463c6feaaf332087b Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 21 May 2020 07:16:29 -0400 Subject: [PATCH 0047/1792] [dev.link] cmd/compile: emit fewer R_USETYPE relocations Background: when compiling a function, it's possible that a local variable will be optimized away, which could potentially degrade the debugging experience if the compiler fails to emit DWARF information for the variable's type. To mitigate this situation, the compiler emits R_USETYPE relocations for the function's auto/param variables as a signal to the linker to generate DWARF for the types in question, even if the type is not specifically attached to a DWARF param or var. This patch change the logic in the compiler to avoid emitting a R_USETYPE relocation if the type in question is already referenced by a concrete DWARF param or auto record. This cuts down on the amount of work the linker has to do, also makes object files a bit smaller on average (about 1% for the runtime package). Change-Id: I4d24da458d0658edf90c5dca0bf21d5ddc3961d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/234837 TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller Run-TryBot: Cherry Zhang --- src/cmd/compile/internal/gc/pgen.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index 74654c86bc..f80d0c179d 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -428,9 +428,10 @@ func debuginfo(fnsym *obj.LSym, infosym *obj.LSym, curfn interface{}) ([]dwarf.S decls, dwarfVars := createDwarfVars(fnsym, fn.Func, apdecls) - // For each type referenced by the functions auto vars, attach a - // dummy relocation to the function symbol to insure that the type - // included in DWARF processing during linking. + // For each type referenced by the functions auto vars but not + // already referenced by a dwarf var, attach a dummy relocation to + // the function symbol to insure that the type included in DWARF + // processing during linking. typesyms := []*obj.LSym{} for t, _ := range fnsym.Func.Autot { typesyms = append(typesyms, t) @@ -480,7 +481,7 @@ func declPos(decl *Node) src.XPos { // createSimpleVars creates a DWARF entry for every variable declared in the // function, claiming that they are permanently on the stack. -func createSimpleVars(apDecls []*Node) ([]*Node, []*dwarf.Var, map[*Node]bool) { +func createSimpleVars(fnsym *obj.LSym, apDecls []*Node) ([]*Node, []*dwarf.Var, map[*Node]bool) { var vars []*dwarf.Var var decls []*Node selected := make(map[*Node]bool) @@ -490,13 +491,13 @@ func createSimpleVars(apDecls []*Node) ([]*Node, []*dwarf.Var, map[*Node]bool) { } decls = append(decls, n) - vars = append(vars, createSimpleVar(n)) + vars = append(vars, createSimpleVar(fnsym, n)) selected[n] = true } return decls, vars, selected } -func createSimpleVar(n *Node) *dwarf.Var { +func createSimpleVar(fnsym *obj.LSym, n *Node) *dwarf.Var { var abbrev int offs := n.Xoffset @@ -519,6 +520,7 @@ func createSimpleVar(n *Node) *dwarf.Var { } typename := dwarf.InfoPrefix + typesymname(n.Type) + delete(fnsym.Func.Autot, ngotype(n).Linksym()) inlIndex := 0 if genDwarfInline > 1 { if n.Name.InlFormal() || n.Name.InlLocal() { @@ -546,7 +548,7 @@ func createSimpleVar(n *Node) *dwarf.Var { // createComplexVars creates recomposed DWARF vars with location lists, // suitable for describing optimized code. -func createComplexVars(fn *Func) ([]*Node, []*dwarf.Var, map[*Node]bool) { +func createComplexVars(fnsym *obj.LSym, fn *Func) ([]*Node, []*dwarf.Var, map[*Node]bool) { debugInfo := fn.DebugInfo // Produce a DWARF variable entry for each user variable. @@ -561,7 +563,7 @@ func createComplexVars(fn *Func) ([]*Node, []*dwarf.Var, map[*Node]bool) { ssaVars[debugInfo.Slots[slot].N.(*Node)] = true } - if dvar := createComplexVar(fn, ssa.VarID(varID)); dvar != nil { + if dvar := createComplexVar(fnsym, fn, ssa.VarID(varID)); dvar != nil { decls = append(decls, n) vars = append(vars, dvar) } @@ -578,9 +580,9 @@ func createDwarfVars(fnsym *obj.LSym, fn *Func, apDecls []*Node) ([]*Node, []*dw var decls []*Node var selected map[*Node]bool if Ctxt.Flag_locationlists && Ctxt.Flag_optimize && fn.DebugInfo != nil { - decls, vars, selected = createComplexVars(fn) + decls, vars, selected = createComplexVars(fnsym, fn) } else { - decls, vars, selected = createSimpleVars(apDecls) + decls, vars, selected = createSimpleVars(fnsym, apDecls) } dcl := apDecls @@ -616,7 +618,7 @@ func createDwarfVars(fnsym *obj.LSym, fn *Func, apDecls []*Node) ([]*Node, []*dw // Args not of SSA-able type are treated here; they // are homed on the stack in a single place for the // entire call. - vars = append(vars, createSimpleVar(n)) + vars = append(vars, createSimpleVar(fnsym, n)) decls = append(decls, n) continue } @@ -712,7 +714,7 @@ func stackOffset(slot ssa.LocalSlot) int32 { } // createComplexVar builds a single DWARF variable entry and location list. -func createComplexVar(fn *Func, varID ssa.VarID) *dwarf.Var { +func createComplexVar(fnsym *obj.LSym, fn *Func, varID ssa.VarID) *dwarf.Var { debug := fn.DebugInfo n := debug.Vars[varID].(*Node) @@ -727,6 +729,7 @@ func createComplexVar(fn *Func, varID ssa.VarID) *dwarf.Var { } gotype := ngotype(n).Linksym() + delete(fnsym.Func.Autot, gotype) typename := dwarf.InfoPrefix + gotype.Name[len("type."):] inlIndex := 0 if genDwarfInline > 1 { -- GitLab From 25b283bf8cbc6cee9b5fffa57470a0bb2431575a Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 21 May 2020 13:13:20 -0400 Subject: [PATCH 0048/1792] [dev.link] cmd/link: move plan9 header out of architectures Change-Id: I7ccd14e8faa84085e976d23f83b822c05ee6a0ee Reviewed-on: https://go-review.googlesource.com/c/go/+/234877 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 15 ++------------- src/cmd/link/internal/arm/asm.go | 9 +-------- src/cmd/link/internal/arm64/asm.go | 16 ---------------- src/cmd/link/internal/ld/asmb.go | 23 +++++++++++++++++++++++ src/cmd/link/internal/mips64/asm.go | 20 -------------------- src/cmd/link/internal/ppc64/asm.go | 16 ---------------- src/cmd/link/internal/x86/asm.go | 12 ++---------- 7 files changed, 28 insertions(+), 83 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 6e784b59f4..43601563e1 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -766,19 +766,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { switch ctxt.HeadType { default: case objabi.Hplan9: /* plan9 */ - magic := int32(4*26*26 + 7) - - magic |= 0x00008000 /* fat header */ - ctxt.Out.Write32b(uint32(magic)) /* magic */ - ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - vl := ld.Entryvalue(ctxt) - ctxt.Out.Write32b(PADDR(uint32(vl))) /* va of entry */ - ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ - ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ - ctxt.Out.Write64b(uint64(vl)) /* va of entry */ + magic := uint32(4*26*26 + 7) + ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), true) case objabi.Hdarwin: ld.Asmbmacho(ctxt) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index db2e2cf69a..d9e0df5192 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -718,14 +718,7 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { switch ctxt.HeadType { default: case objabi.Hplan9: /* plan 9 */ - ctxt.Out.Write32b(0x647) /* magic */ - ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32b(0) - ctxt.Out.Write32b(uint32(ld.Lcsize)) + ld.WritePlan9Header(ctxt.Out, 0x647, ld.Entryvalue(ctxt), false) case objabi.Hlinux, objabi.Hfreebsd, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 94c86e0b46..1822d29f28 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -816,9 +816,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) } - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - case objabi.Hdarwin: symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink)) } @@ -835,9 +832,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { } } - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) - case objabi.Hdarwin: if ctxt.LinkMode == ld.LinkExternal { ld.Machoemitreloc(ctxt) @@ -848,16 +842,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.SeekSet(0) switch ctxt.HeadType { default: - case objabi.Hplan9: /* plan 9 */ - ctxt.Out.Write32(0x647) /* magic */ - ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(ld.Lcsize)) - case objabi.Hlinux, objabi.Hfreebsd, objabi.Hnetbsd, diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index ede4f91664..6d553e8ccb 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -68,3 +68,26 @@ func asmb(ctxt *Link, ldr *loader.Loader) { wg.Wait() } + +// WritePlan9Header writes out the plan9 header at the present position in the OutBuf. +func WritePlan9Header(buf *OutBuf, magic uint32, entry int64, is64Bit bool) { + if is64Bit { + magic |= 0x00008000 + } + buf.Write32b(magic) + buf.Write32b(uint32(Segtext.Filelen)) + buf.Write32b(uint32(Segdata.Filelen)) + buf.Write32b(uint32(Segdata.Length - Segdata.Filelen)) + buf.Write32b(uint32(Symsize)) + if is64Bit { + buf.Write32b(uint32(entry &^ 0x80000000)) + } else { + buf.Write32b(uint32(entry)) + } + buf.Write32b(uint32(Spsize)) + buf.Write32b(uint32(Lcsize)) + // amd64 includes the entry at the beginning of the symbol table. + if is64Bit { + buf.Write64b(uint64(entry)) + } +} diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index c10bbb4fec..7719377e2f 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -172,9 +172,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) } - - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) } ctxt.Out.SeekSet(int64(symo)) @@ -188,29 +185,12 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ld.Elfemitreloc(ctxt) } } - - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) } } ctxt.Out.SeekSet(0) switch ctxt.HeadType { default: - case objabi.Hplan9: /* plan 9 */ - magic := uint32(4*18*18 + 7) - if ctxt.Arch == sys.ArchMIPS64LE { - magic = uint32(4*26*26 + 7) - } - ctxt.Out.Write32(magic) /* magic */ - ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(ld.Lcsize)) - case objabi.Hlinux, objabi.Hfreebsd, objabi.Hnetbsd, diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 74c4c4d05d..dd1b2b463c 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -1095,9 +1095,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) } - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - case objabi.Haix: // Nothing to do } @@ -1114,9 +1111,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { } } - case objabi.Hplan9: - ld.Asmplan9sym(ctxt) - case objabi.Haix: // symtab must be added once sections have been created in ld.Asmbxcoff } @@ -1125,16 +1119,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ctxt.Out.SeekSet(0) switch ctxt.HeadType { default: - case objabi.Hplan9: /* plan 9 */ - ctxt.Out.Write32(0x647) /* magic */ - ctxt.Out.Write32(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(ld.Lcsize)) - case objabi.Hlinux, objabi.Hfreebsd, objabi.Hnetbsd, diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 967261a8cd..6e2d18f518 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -569,16 +569,8 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { switch ctxt.HeadType { default: case objabi.Hplan9: /* plan9 */ - magic := int32(4*11*11 + 7) - - ctxt.Out.Write32b(uint32(magic)) /* magic */ - ctxt.Out.Write32b(uint32(ld.Segtext.Filelen)) /* sizes */ - ctxt.Out.Write32b(uint32(ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Segdata.Length - ld.Segdata.Filelen)) - ctxt.Out.Write32b(uint32(ld.Symsize)) /* nsyms */ - ctxt.Out.Write32b(uint32(ld.Entryvalue(ctxt))) /* va of entry */ - ctxt.Out.Write32b(uint32(ld.Spsize)) /* sp offsets */ - ctxt.Out.Write32b(uint32(ld.Lcsize)) /* line offsets */ + magic := uint32(4*11*11 + 7) + ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), false) case objabi.Hdarwin: ld.Asmbmacho(ctxt) -- GitLab From c551318046115104ee4edddf2c5b0e459711bbb2 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 21 May 2020 16:12:44 -0400 Subject: [PATCH 0049/1792] [dev.link] cmd/link: move macho asmb2 support to generic functions Change-Id: Ic360af7c0e8de3446aa8d26d70f95f87690087ee Reviewed-on: https://go-review.googlesource.com/c/go/+/234883 Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 19 ++----------------- src/cmd/link/internal/arm64/asm.go | 15 ++------------- src/cmd/link/internal/ld/asmb.go | 22 ++++++++++++++++++++++ src/cmd/link/internal/ld/main.go | 4 +++- src/cmd/link/internal/x86/asm.go | 16 ++-------------- 5 files changed, 31 insertions(+), 45 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 43601563e1..f414b8d914 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -680,9 +680,8 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } func asmb2(ctxt *ld.Link, _ *loader.Loader) { - machlink := int64(0) - if ctxt.HeadType == objabi.Hdarwin { - machlink = ld.Domacholink(ctxt) + if ctxt.IsDarwin() { + panic("darwin should be generic") } switch ctxt.HeadType { @@ -693,9 +692,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: break - case objabi.Hdarwin: - ld.Flag8 = true /* 64-bit addresses */ - case objabi.Hlinux, objabi.Hfreebsd, objabi.Hnetbsd, @@ -719,9 +715,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { *ld.FlagS = true symo = int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) - case objabi.Hdarwin: - symo = int64(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink)) - case objabi.Hlinux, objabi.Hfreebsd, objabi.Hnetbsd, @@ -754,11 +747,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hwindows: // Do nothing - - case objabi.Hdarwin: - if ctxt.LinkMode == ld.LinkExternal { - ld.Machoemitreloc(ctxt) - } } } @@ -769,9 +757,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { magic := uint32(4*26*26 + 7) ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), true) - case objabi.Hdarwin: - ld.Asmbmacho(ctxt) - case objabi.Hlinux, objabi.Hfreebsd, objabi.Hnetbsd, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 1822d29f28..b919e5e88e 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -797,9 +797,8 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } func asmb2(ctxt *ld.Link, _ *loader.Loader) { - machlink := uint32(0) - if ctxt.HeadType == objabi.Hdarwin { - machlink = uint32(ld.Domacholink(ctxt)) + if ctxt.IsDarwin() { + panic("darwin should be generic") } /* output symbol table */ @@ -816,8 +815,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) } - case objabi.Hdarwin: - symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink)) } ctxt.Out.SeekSet(int64(symo)) @@ -831,11 +828,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ld.Elfemitreloc(ctxt) } } - - case objabi.Hdarwin: - if ctxt.LinkMode == ld.LinkExternal { - ld.Machoemitreloc(ctxt) - } } } @@ -847,9 +839,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { objabi.Hnetbsd, objabi.Hopenbsd: ld.Asmbelf(ctxt, int64(symo)) - - case objabi.Hdarwin: - ld.Asmbmacho(ctxt) } if *ld.FlagC { diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index 6d553e8ccb..888d453d7b 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -69,6 +69,28 @@ func asmb(ctxt *Link, ldr *loader.Loader) { wg.Wait() } +// Assembling the binary is broken into two steps: +// - writing out the code/data/dwarf Segments +// - writing out the architecture specific pieces. +// This function handles the second part. +func asmb2(ctxt *Link) bool { + if ctxt.IsDarwin() { + machlink := Domacholink(ctxt) + Symsize = 0 + Spsize = 0 + Lcsize = 0 + if !*FlagS && ctxt.IsExternal() { + symo := int64(Segdwarf.Fileoff + uint64(Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))) + uint64(machlink)) + ctxt.Out.SeekSet(symo) + Machoemitreloc(ctxt) + } + ctxt.Out.SeekSet(0) + Asmbmacho(ctxt) + return true + } + return false +} + // WritePlan9Header writes out the plan9 header at the present position in the OutBuf. func WritePlan9Header(buf *OutBuf, magic uint32, entry int64, is64Bit bool) { if is64Bit { diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index ee5cc19bad..17c7821d70 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -321,7 +321,9 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("reloc") ctxt.reloc() bench.Start("Asmb2") - thearch.Asmb2(ctxt, ctxt.loader) + if !asmb2(ctxt) { + thearch.Asmb2(ctxt, ctxt.loader) + } bench.Start("Munmap") ctxt.Out.Close() // Close handles Munmapping if necessary. diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 6e2d18f518..a3b40f5a06 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -511,9 +511,8 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } func asmb2(ctxt *ld.Link, _ *loader.Loader) { - machlink := uint32(0) - if ctxt.HeadType == objabi.Hdarwin { - machlink = uint32(ld.Domacholink(ctxt)) + if ctxt.IsDarwin() { + panic("darwin should be generic") } ld.Symsize = 0 @@ -532,9 +531,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - case objabi.Hdarwin: - symo = uint32(ld.Segdwarf.Fileoff + uint64(ld.Rnd(int64(ld.Segdwarf.Filelen), int64(*ld.FlagRound))) + uint64(machlink)) - case objabi.Hwindows: symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) symo = uint32(ld.Rnd(int64(symo), ld.PEFILEALIGN)) @@ -557,11 +553,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hwindows: // Do nothing - - case objabi.Hdarwin: - if ctxt.LinkMode == ld.LinkExternal { - ld.Machoemitreloc(ctxt) - } } } @@ -572,9 +563,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { magic := uint32(4*11*11 + 7) ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), false) - case objabi.Hdarwin: - ld.Asmbmacho(ctxt) - case objabi.Hlinux, objabi.Hfreebsd, objabi.Hnetbsd, -- GitLab From 0ca6098f707763a3e8b523d869def9fb64f8ebf0 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 21 May 2020 16:33:20 -0400 Subject: [PATCH 0050/1792] [dev.link] cmd/link: remove Flag8 from amd64 It's only ever checked for plan 9 and it was irrelevantly set. Change-Id: I225d4be645f573ceccde47ec2236bf3dbeb0ea70 Reviewed-on: https://go-review.googlesource.com/c/go/+/234886 Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 4 ---- src/cmd/link/internal/ld/main.go | 4 ++-- src/cmd/link/internal/ld/symtab.go | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index f414b8d914..dba91976a1 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -690,16 +690,12 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { fallthrough case objabi.Hplan9: - break - case objabi.Hlinux, objabi.Hfreebsd, objabi.Hnetbsd, objabi.Hopenbsd, objabi.Hdragonfly, objabi.Hsolaris: - ld.Flag8 = true /* 64-bit addresses */ - case objabi.Hwindows: break } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 17c7821d70..0c18d512d3 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -84,7 +84,7 @@ var ( FlagS = flag.Bool("s", false, "disable symbol table") flagU = flag.Bool("u", false, "reject unsafe packages") FlagW = flag.Bool("w", false, "disable DWARF generation") - Flag8 bool // use 64-bit addresses in symbol table + flag8 bool // use 64-bit addresses in symbol table flagInterpreter = flag.String("I", "", "use `linker` as ELF dynamic linker") FlagDebugTramp = flag.Int("debugtramp", 0, "debug trampolines") FlagStrictDups = flag.Int("strictdups", 0, "sanity check duplicate symbol contents during object file reading (1=warn 2=err).") @@ -121,7 +121,7 @@ func Main(arch *sys.Arch, theArch Arch) { // TODO(matloob): define these above and then check flag values here if ctxt.Arch.Family == sys.AMD64 && objabi.GOOS == "plan9" { - flag.BoolVar(&Flag8, "8", false, "use 64-bit addresses in symbol table") + flag.BoolVar(&flag8, "8", false, "use 64-bit addresses in symbol table") } flagHeadType := flag.String("H", "", "set header `type`") flag.BoolVar(&ctxt.linkShared, "linkshared", false, "link against installed Go shared libraries") diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index de5b1cc0d0..61072cb0cf 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -259,7 +259,7 @@ func putplan9sym(ctxt *Link, ldr *loader.Loader, s loader.Sym, char SymbolType) } l := 4 addr := ldr.SymValue(s) - if ctxt.IsAMD64() && !Flag8 { + if ctxt.IsAMD64() && !flag8 { ctxt.Out.Write32b(uint32(addr >> 32)) l = 8 } -- GitLab From 7260ad6f52d0397000701abf3e71e7aac1456dc5 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 21 May 2020 17:07:25 -0400 Subject: [PATCH 0051/1792] [dev.link] cmd/link: move asmb2 elf to generic handling Change-Id: Ic3e90793f0ce49909c4f76df1272b25a1d61ebdf Reviewed-on: https://go-review.googlesource.com/c/go/+/234887 Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 57 +++------------------------- src/cmd/link/internal/arm/asm.go | 45 +++------------------- src/cmd/link/internal/arm64/asm.go | 56 --------------------------- src/cmd/link/internal/arm64/obj.go | 1 - src/cmd/link/internal/ld/asmb.go | 20 ++++++++++ src/cmd/link/internal/mips/asm.go | 41 -------------------- src/cmd/link/internal/mips/obj.go | 1 - src/cmd/link/internal/mips64/asm.go | 51 ------------------------- src/cmd/link/internal/mips64/obj.go | 1 - src/cmd/link/internal/ppc64/asm.go | 41 ++------------------ src/cmd/link/internal/riscv64/asm.go | 40 ------------------- src/cmd/link/internal/riscv64/obj.go | 1 - src/cmd/link/internal/s390x/asm.go | 41 -------------------- src/cmd/link/internal/s390x/obj.go | 1 - src/cmd/link/internal/x86/asm.go | 45 +++------------------- 15 files changed, 42 insertions(+), 400 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index dba91976a1..514edad55c 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -683,6 +683,9 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { if ctxt.IsDarwin() { panic("darwin should be generic") } + if ctxt.IsElf() { + panic("elf should be generic") + } switch ctxt.HeadType { default: @@ -690,12 +693,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { fallthrough case objabi.Hplan9: - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd, - objabi.Hdragonfly, - objabi.Hsolaris: case objabi.Hwindows: break } @@ -703,46 +700,12 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ld.Symsize = 0 ld.Spsize = 0 ld.Lcsize = 0 - symo := int64(0) if !*ld.FlagS { - switch ctxt.HeadType { - default: - case objabi.Hplan9: + if ctxt.HeadType == objabi.Hplan9 { *ld.FlagS = true - symo = int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) - - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd, - objabi.Hdragonfly, - objabi.Hsolaris: - symo = int64(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = ld.Rnd(symo, int64(*ld.FlagRound)) - - case objabi.Hwindows: - symo = int64(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = ld.Rnd(symo, ld.PEFILEALIGN) - } - - ctxt.Out.SeekSet(symo) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ctxt.Out.SeekSet(symo) - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: + symo := int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) + ctxt.Out.SeekSet(symo) ld.Asmplan9sym(ctxt) - - case objabi.Hwindows: - // Do nothing } } @@ -753,14 +716,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { magic := uint32(4*26*26 + 7) ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), true) - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd, - objabi.Hdragonfly, - objabi.Hsolaris: - ld.Asmbelf(ctxt, symo) - case objabi.Hwindows: ld.Asmbpe(ctxt) } diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index d9e0df5192..8197fb9918 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -672,45 +672,18 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } func asmb2(ctxt *ld.Link, _ *loader.Loader) { + if ctxt.IsElf() { + panic("elf should be generic") + } /* output symbol table */ ld.Symsize = 0 ld.Lcsize = 0 - symo := uint32(0) if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - - case objabi.Hwindows: - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), ld.PEFILEALIGN)) - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: + if ctxt.IsPlan9() { + symo := uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) + ctxt.Out.SeekSet(int64(symo)) ld.Asmplan9sym(ctxt) - - case objabi.Hwindows: - // Do nothing } } @@ -720,12 +693,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { case objabi.Hplan9: /* plan 9 */ ld.WritePlan9Header(ctxt.Out, 0x647, ld.Entryvalue(ctxt), false) - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - case objabi.Hwindows: ld.Asmbpe(ctxt) } diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index b919e5e88e..9482a0a193 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -37,7 +37,6 @@ import ( "cmd/link/internal/loader" "cmd/link/internal/sym" "debug/elf" - "fmt" "log" ) @@ -795,58 +794,3 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.Errorf(s, "addgotsym: unsupported binary format") } } - -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsDarwin() { - panic("darwin should be generic") - } - - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - } - - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index de6ab58329..c092cf4826 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -50,7 +50,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index 888d453d7b..eccd3e56fb 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -74,6 +74,7 @@ func asmb(ctxt *Link, ldr *loader.Loader) { // - writing out the architecture specific pieces. // This function handles the second part. func asmb2(ctxt *Link) bool { + // TODO: Spsize is only used for plan9 if ctxt.IsDarwin() { machlink := Domacholink(ctxt) Symsize = 0 @@ -88,6 +89,25 @@ func asmb2(ctxt *Link) bool { Asmbmacho(ctxt) return true } + if ctxt.IsElf() { + Symsize = 0 + Spsize = 0 + Lcsize = 0 + var symo int64 + if !*FlagS { + symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen) + symo = Rnd(symo, int64(*FlagRound)) + ctxt.Out.SeekSet(symo) + Asmelfsym(ctxt) + ctxt.Out.Write(Elfstrdat) + if ctxt.IsExternal() { + Elfemitreloc(ctxt) + } + } + ctxt.Out.SeekSet(0) + Asmbelf(ctxt, symo) + return true + } return false } diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index c43b1e61ef..6f8d64df6d 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -37,7 +37,6 @@ import ( "cmd/link/internal/loader" "cmd/link/internal/sym" "debug/elf" - "fmt" ) func gentext(ctxt *ld.Link, ldr *loader.Loader) { @@ -151,43 +150,3 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { return -1 } - -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - if !ctxt.IsELF { - ld.Errorf(nil, "unsupported executable format") - } - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - - ctxt.Out.SeekSet(int64(symo)) - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - ld.Errorf(nil, "unsupported operating system") - case objabi.Hlinux: - ld.Asmbelf(ctxt, int64(symo)) - } - - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index eb0dbe62be..a80d4ed37b 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -52,7 +52,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 7719377e2f..b9d7c277f7 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -37,7 +37,6 @@ import ( "cmd/link/internal/loader" "cmd/link/internal/sym" "debug/elf" - "fmt" ) func gentext(ctxt *ld.Link, ldr *loader.Loader) {} @@ -157,53 +156,3 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { return -1 } - -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - } - - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index 90919ee737..bbc1e84b5f 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -51,7 +51,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index dd1b2b463c..317c3dd0fe 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -1081,49 +1081,16 @@ func ensureglinkresolver(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilde } func asmb2(ctxt *ld.Link, _ *loader.Loader) { + if ctxt.IsElf() { + panic("elf should be generic") + } + /* output symbol table */ ld.Symsize = 0 - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - case objabi.Haix: - // Nothing to do - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Haix: - // symtab must be added once sections have been created in ld.Asmbxcoff - } - } - ctxt.Out.SeekSet(0) switch ctxt.HeadType { default: - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) case objabi.Haix: fileoff := uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index bc39c06309..7bc511c374 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -89,43 +89,3 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian log.Fatalf("archrelocvariant") return -1 } - -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - ld.Symsize = 0 - ld.Lcsize = 0 - symo := uint32(0) - - if !*ld.FlagS { - if !ctxt.IsELF { - ld.Errorf(nil, "unsupported executable format") - } - - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - ctxt.Out.SeekSet(int64(symo)) - - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - case objabi.Hlinux: - ld.Asmbelf(ctxt, int64(symo)) - default: - ld.Errorf(nil, "unsupported operating system") - } - - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/link/internal/riscv64/obj.go b/src/cmd/link/internal/riscv64/obj.go index a0ff179d83..e66d3cd856 100644 --- a/src/cmd/link/internal/riscv64/obj.go +++ b/src/cmd/link/internal/riscv64/obj.go @@ -23,7 +23,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 7465212b9d..2185197460 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -37,7 +37,6 @@ import ( "cmd/link/internal/loader" "cmd/link/internal/sym" "debug/elf" - "fmt" ) // gentext generates assembly to append the local moduledata to the global @@ -475,43 +474,3 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.Errorf(s, "addgotsym: unsupported binary format") } } - -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - symo := uint32(0) - if !*ld.FlagS { - if !ctxt.IsELF { - ld.Errorf(nil, "unsupported executable format") - } - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - - ctxt.Out.SeekSet(int64(symo)) - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - ld.Errorf(nil, "unsupported operating system") - case objabi.Hlinux: - ld.Asmbelf(ctxt, int64(symo)) - } - - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 28886804b7..5e4c86371d 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -50,7 +50,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index a3b40f5a06..dc5b56a2b9 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -514,45 +514,18 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { if ctxt.IsDarwin() { panic("darwin should be generic") } + if ctxt.IsElf() { + panic("elf should be generic") + } ld.Symsize = 0 ld.Spsize = 0 ld.Lcsize = 0 - symo := uint32(0) if !*ld.FlagS { - // TODO: rationalize - switch ctxt.HeadType { - default: - if ctxt.IsELF { - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), int64(*ld.FlagRound))) - } - - case objabi.Hplan9: - symo = uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - - case objabi.Hwindows: - symo = uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - symo = uint32(ld.Rnd(int64(symo), ld.PEFILEALIGN)) - } - - ctxt.Out.SeekSet(int64(symo)) - switch ctxt.HeadType { - default: - if ctxt.IsELF { - ld.Asmelfsym(ctxt) - ctxt.Out.Write(ld.Elfstrdat) - - if ctxt.LinkMode == ld.LinkExternal { - ld.Elfemitreloc(ctxt) - } - } - - case objabi.Hplan9: + if ctxt.HeadType == objabi.Hplan9 { + symo := uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) + ctxt.Out.SeekSet(int64(symo)) ld.Asmplan9sym(ctxt) - - case objabi.Hwindows: - // Do nothing } } @@ -563,12 +536,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { magic := uint32(4*11*11 + 7) ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), false) - case objabi.Hlinux, - objabi.Hfreebsd, - objabi.Hnetbsd, - objabi.Hopenbsd: - ld.Asmbelf(ctxt, int64(symo)) - case objabi.Hwindows: ld.Asmbpe(ctxt) } -- GitLab From 13c1401b8ec709a7a64b321c953501475b4e6b5a Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 21 May 2020 17:32:59 -0400 Subject: [PATCH 0052/1792] [dev.link] cmd/link: port asmb2 pe generation over to generic functions Change-Id: I09ab68e1fa99bf0260b7e820b8747d5d418fd581 Reviewed-on: https://go-review.googlesource.com/c/go/+/234890 Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 25 +++++++++---------------- src/cmd/link/internal/arm/asm.go | 21 +++++++-------------- src/cmd/link/internal/ld/asmb.go | 7 +++++++ src/cmd/link/internal/x86/asm.go | 22 ++++++++-------------- 4 files changed, 31 insertions(+), 44 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 514edad55c..849095d07d 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -686,6 +686,9 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { if ctxt.IsElf() { panic("elf should be generic") } + if ctxt.IsWindows() { + panic("pe should be generic") + } switch ctxt.HeadType { default: @@ -693,7 +696,6 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { fallthrough case objabi.Hplan9: - case objabi.Hwindows: break } @@ -701,24 +703,15 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { ld.Spsize = 0 ld.Lcsize = 0 if !*ld.FlagS { - if ctxt.HeadType == objabi.Hplan9 { - *ld.FlagS = true - symo := int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) - ctxt.Out.SeekSet(symo) - ld.Asmplan9sym(ctxt) - } + *ld.FlagS = true + symo := int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) + ctxt.Out.SeekSet(symo) + ld.Asmplan9sym(ctxt) } ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan9 */ - magic := uint32(4*26*26 + 7) - ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), true) - - case objabi.Hwindows: - ld.Asmbpe(ctxt) - } + magic := uint32(4*26*26 + 7) + ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), true) } func tlsIEtoLE(P []byte, off, size int) { diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 8197fb9918..3515a60ea7 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -675,27 +675,20 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { if ctxt.IsElf() { panic("elf should be generic") } + if ctxt.IsWindows() { + panic("pe should be generic") + } /* output symbol table */ ld.Symsize = 0 ld.Lcsize = 0 if !*ld.FlagS { - if ctxt.IsPlan9() { - symo := uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - ctxt.Out.SeekSet(int64(symo)) - ld.Asmplan9sym(ctxt) - } + symo := uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) + ctxt.Out.SeekSet(int64(symo)) + ld.Asmplan9sym(ctxt) } - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan 9 */ - ld.WritePlan9Header(ctxt.Out, 0x647, ld.Entryvalue(ctxt), false) - - case objabi.Hwindows: - ld.Asmbpe(ctxt) - } + ld.WritePlan9Header(ctxt.Out, 0x647, ld.Entryvalue(ctxt), false) if *ld.FlagC { fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index eccd3e56fb..aebd1d2ceb 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -108,6 +108,13 @@ func asmb2(ctxt *Link) bool { Asmbelf(ctxt, symo) return true } + if ctxt.IsWindows() { + Symsize = 0 + Spsize = 0 + Lcsize = 0 + Asmbpe(ctxt) + return true + } return false } diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index dc5b56a2b9..746661a028 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -517,26 +517,20 @@ func asmb2(ctxt *ld.Link, _ *loader.Loader) { if ctxt.IsElf() { panic("elf should be generic") } + if ctxt.IsWindows() { + panic("pe should be generic") + } ld.Symsize = 0 ld.Spsize = 0 ld.Lcsize = 0 if !*ld.FlagS { - if ctxt.HeadType == objabi.Hplan9 { - symo := uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - ctxt.Out.SeekSet(int64(symo)) - ld.Asmplan9sym(ctxt) - } + symo := uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) + ctxt.Out.SeekSet(int64(symo)) + ld.Asmplan9sym(ctxt) } ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - case objabi.Hplan9: /* plan9 */ - magic := uint32(4*11*11 + 7) - ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), false) - - case objabi.Hwindows: - ld.Asmbpe(ctxt) - } + magic := uint32(4*11*11 + 7) + ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), false) } -- GitLab From ebdb15f7f8db391bfb8282e10f7759ca0aec5a4f Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 21 May 2020 20:20:26 -0400 Subject: [PATCH 0053/1792] [dev.link] cmd/link: move asmb2 plan 9 architecture code out of architectures Change-Id: I7a8f8edc4511e3ae0c44ec5017167f14d4c60755 Reviewed-on: https://go-review.googlesource.com/c/go/+/234891 Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/amd64/asm.go | 35 ---------------------- src/cmd/link/internal/amd64/obj.go | 4 ++- src/cmd/link/internal/arm/asm.go | 29 ------------------ src/cmd/link/internal/arm/obj.go | 3 +- src/cmd/link/internal/ld/asmb.go | 47 +++++++++++++++++++++--------- src/cmd/link/internal/ld/lib.go | 4 +++ src/cmd/link/internal/x86/asm.go | 25 ---------------- src/cmd/link/internal/x86/obj.go | 3 +- 8 files changed, 44 insertions(+), 106 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 849095d07d..e111c164a1 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -679,41 +679,6 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade } } -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsDarwin() { - panic("darwin should be generic") - } - if ctxt.IsElf() { - panic("elf should be generic") - } - if ctxt.IsWindows() { - panic("pe should be generic") - } - - switch ctxt.HeadType { - default: - ld.Errorf(nil, "unknown header type %v", ctxt.HeadType) - fallthrough - - case objabi.Hplan9: - break - } - - ld.Symsize = 0 - ld.Spsize = 0 - ld.Lcsize = 0 - if !*ld.FlagS { - *ld.FlagS = true - symo := int64(ld.Segdata.Fileoff + ld.Segdata.Filelen) - ctxt.Out.SeekSet(symo) - ld.Asmplan9sym(ctxt) - } - - ctxt.Out.SeekSet(0) - magic := uint32(4*26*26 + 7) - ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), true) -} - func tlsIEtoLE(P []byte, off, size int) { // Transform the PC-relative instruction into a constant load. // That is, diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index 90de67d086..924ce58aa3 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -53,11 +53,13 @@ func Init() (*sys.Arch, ld.Arch) { // 0xCC is INT $3 - breakpoint instruction CodePad: []byte{0xCC}, + Plan9Magic: uint32(4*26*26 + 7), + Plan9_64Bit: true, + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 3515a60ea7..3212268fab 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -670,32 +670,3 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.Errorf(s, "addgotsym: unsupported binary format") } } - -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsElf() { - panic("elf should be generic") - } - if ctxt.IsWindows() { - panic("pe should be generic") - } - /* output symbol table */ - ld.Symsize = 0 - - ld.Lcsize = 0 - if !*ld.FlagS { - symo := uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - ctxt.Out.SeekSet(int64(symo)) - ld.Asmplan9sym(ctxt) - } - - ld.WritePlan9Header(ctxt.Out, 0x647, ld.Entryvalue(ctxt), false) - - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index c70b10e75d..151445ecda 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -46,12 +46,13 @@ func Init() (*sys.Arch, ld.Arch) { Dwarfregsp: dwarfRegSP, Dwarfreglr: dwarfRegLR, + Plan9Magic: 0x647, + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, Trampoline: trampoline, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index aebd1d2ceb..b6237d35c3 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -6,6 +6,7 @@ package ld import ( "cmd/link/internal/loader" + "fmt" "sync" ) @@ -74,12 +75,16 @@ func asmb(ctxt *Link, ldr *loader.Loader) { // - writing out the architecture specific pieces. // This function handles the second part. func asmb2(ctxt *Link) bool { - // TODO: Spsize is only used for plan9 + if ctxt.IsAIX() || ctxt.IsWasm() { + return false + } + + Symsize = 0 + Spsize = 0 + Lcsize = 0 + if ctxt.IsDarwin() { machlink := Domacholink(ctxt) - Symsize = 0 - Spsize = 0 - Lcsize = 0 if !*FlagS && ctxt.IsExternal() { symo := int64(Segdwarf.Fileoff + uint64(Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))) + uint64(machlink)) ctxt.Out.SeekSet(symo) @@ -87,12 +92,9 @@ func asmb2(ctxt *Link) bool { } ctxt.Out.SeekSet(0) Asmbmacho(ctxt) - return true } + if ctxt.IsElf() { - Symsize = 0 - Spsize = 0 - Lcsize = 0 var symo int64 if !*FlagS { symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen) @@ -106,16 +108,33 @@ func asmb2(ctxt *Link) bool { } ctxt.Out.SeekSet(0) Asmbelf(ctxt, symo) - return true } + if ctxt.IsWindows() { - Symsize = 0 - Spsize = 0 - Lcsize = 0 Asmbpe(ctxt) - return true } - return false + + if ctxt.IsPlan9() { + if !*FlagS { + *FlagS = true + symo := int64(Segdata.Fileoff + Segdata.Filelen) + ctxt.Out.SeekSet(symo) + Asmplan9sym(ctxt) + } + ctxt.Out.SeekSet(0) + WritePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit) + } + + if *FlagC { + fmt.Printf("textsize=%d\n", Segtext.Filelen) + fmt.Printf("datsize=%d\n", Segdata.Filelen) + fmt.Printf("bsssize=%d\n", Segdata.Length-Segdata.Filelen) + fmt.Printf("symsize=%d\n", Symsize) + fmt.Printf("lcsize=%d\n", Lcsize) + fmt.Printf("total=%d\n", Segtext.Filelen+Segdata.Length+uint64(Symsize)+uint64(Lcsize)) + } + + return true } // WritePlan9Header writes out the plan9 header at the present position in the OutBuf. diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d8621c7db1..5c047c84ee 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -195,6 +195,10 @@ type Arch struct { // Set to true to write all text blocks in with CodeBlkWrite WriteTextBlocks bool + // Plan 9 variables. + Plan9Magic uint32 + Plan9_64Bit bool + Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool Archinit func(*Link) // Archreloc is an arch-specific hook that assists in relocation processing diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 746661a028..d5ac40c583 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -509,28 +509,3 @@ func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.Errorf(s, "addgotsym: unsupported binary format") } } - -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsDarwin() { - panic("darwin should be generic") - } - if ctxt.IsElf() { - panic("elf should be generic") - } - if ctxt.IsWindows() { - panic("pe should be generic") - } - - ld.Symsize = 0 - ld.Spsize = 0 - ld.Lcsize = 0 - if !*ld.FlagS { - symo := uint32(ld.Segdata.Fileoff + ld.Segdata.Filelen) - ctxt.Out.SeekSet(int64(symo)) - ld.Asmplan9sym(ctxt) - } - - ctxt.Out.SeekSet(0) - magic := uint32(4*11*11 + 7) - ld.WritePlan9Header(ctxt.Out, magic, ld.Entryvalue(ctxt), false) -} diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index b604c1f8c2..9239e71032 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -48,11 +48,12 @@ func Init() (*sys.Arch, ld.Arch) { // 0xCC is INT $3 - breakpoint instruction CodePad: []byte{0xCC}, + Plan9Magic: uint32(4*11*11 + 7), + Adddynrel: adddynrel, Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, -- GitLab From c7ade964baab645bf89e92eb797a958e877fafc2 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 21 May 2020 20:42:17 -0400 Subject: [PATCH 0054/1792] [dev.link] cmd/link: move asmb2 aix from ppc64 to generic code Removes last vestiges all but wasm's asmb2. Change-Id: Ia06efc3ded7bfc657b5dd20a9549fd48d1355e52 Reviewed-on: https://go-review.googlesource.com/c/go/+/234892 Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/asmb.go | 9 ++++++++- src/cmd/link/internal/ppc64/asm.go | 28 ---------------------------- src/cmd/link/internal/ppc64/obj.go | 1 - 3 files changed, 8 insertions(+), 30 deletions(-) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index b6237d35c3..1668dd11f6 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -75,7 +75,7 @@ func asmb(ctxt *Link, ldr *loader.Loader) { // - writing out the architecture specific pieces. // This function handles the second part. func asmb2(ctxt *Link) bool { - if ctxt.IsAIX() || ctxt.IsWasm() { + if ctxt.IsWasm() { return false } @@ -125,6 +125,13 @@ func asmb2(ctxt *Link) bool { WritePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit) } + if ctxt.IsAIX() { + ctxt.Out.SeekSet(0) + fileoff := uint32(Segdwarf.Fileoff + Segdwarf.Filelen) + fileoff = uint32(Rnd(int64(fileoff), int64(*FlagRound))) + Asmbxcoff(ctxt, int64(fileoff)) + } + if *FlagC { fmt.Printf("textsize=%d\n", Segtext.Filelen) fmt.Printf("datsize=%d\n", Segdata.Filelen) diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 317c3dd0fe..d26a501d4f 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -1079,31 +1079,3 @@ func ensureglinkresolver(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilde return glink } - -func asmb2(ctxt *ld.Link, _ *loader.Loader) { - if ctxt.IsElf() { - panic("elf should be generic") - } - - /* output symbol table */ - ld.Symsize = 0 - ld.Lcsize = 0 - ctxt.Out.SeekSet(0) - switch ctxt.HeadType { - default: - - case objabi.Haix: - fileoff := uint32(ld.Segdwarf.Fileoff + ld.Segdwarf.Filelen) - fileoff = uint32(ld.Rnd(int64(fileoff), int64(*ld.FlagRound))) - ld.Asmbxcoff(ctxt, int64(fileoff)) - } - - if *ld.FlagC { - fmt.Printf("textsize=%d\n", ld.Segtext.Filelen) - fmt.Printf("datsize=%d\n", ld.Segdata.Filelen) - fmt.Printf("bsssize=%d\n", ld.Segdata.Length-ld.Segdata.Filelen) - fmt.Printf("symsize=%d\n", ld.Symsize) - fmt.Printf("lcsize=%d\n", ld.Lcsize) - fmt.Printf("total=%d\n", ld.Segtext.Filelen+ld.Segdata.Length+uint64(ld.Symsize)+uint64(ld.Lcsize)) - } -} diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index ae291f87fc..2b04f25951 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -54,7 +54,6 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, -- GitLab From e1c0b751b521dd1962a1b8123b389ddda086f32d Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 21 May 2020 21:19:07 -0400 Subject: [PATCH 0055/1792] [dev.link] cmd/link: change asmb2 api and rescope some functions Change-Id: I49916b4740316a7042566e389759b70d7b1fa037 Reviewed-on: https://go-review.googlesource.com/c/go/+/234895 Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/asmb.go | 33 +++++++++++++++--------------- src/cmd/link/internal/ld/elf.go | 4 ++-- src/cmd/link/internal/ld/macho.go | 6 +++--- src/cmd/link/internal/ld/main.go | 4 +--- src/cmd/link/internal/ld/pe.go | 2 +- src/cmd/link/internal/ld/symtab.go | 4 ++-- src/cmd/link/internal/ld/xcoff.go | 2 +- 7 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index 1668dd11f6..825dd9a865 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -74,9 +74,10 @@ func asmb(ctxt *Link, ldr *loader.Loader) { // - writing out the code/data/dwarf Segments // - writing out the architecture specific pieces. // This function handles the second part. -func asmb2(ctxt *Link) bool { - if ctxt.IsWasm() { - return false +func asmb2(ctxt *Link) { + if thearch.Asmb2 != nil { + thearch.Asmb2(ctxt, ctxt.loader) + return } Symsize = 0 @@ -84,14 +85,14 @@ func asmb2(ctxt *Link) bool { Lcsize = 0 if ctxt.IsDarwin() { - machlink := Domacholink(ctxt) + machlink := doMachoLink(ctxt) if !*FlagS && ctxt.IsExternal() { symo := int64(Segdwarf.Fileoff + uint64(Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))) + uint64(machlink)) ctxt.Out.SeekSet(symo) - Machoemitreloc(ctxt) + machoEmitReloc(ctxt) } ctxt.Out.SeekSet(0) - Asmbmacho(ctxt) + asmbMacho(ctxt) } if ctxt.IsElf() { @@ -100,18 +101,18 @@ func asmb2(ctxt *Link) bool { symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen) symo = Rnd(symo, int64(*FlagRound)) ctxt.Out.SeekSet(symo) - Asmelfsym(ctxt) + asmElfSym(ctxt) ctxt.Out.Write(Elfstrdat) if ctxt.IsExternal() { - Elfemitreloc(ctxt) + elfEmitReloc(ctxt) } } ctxt.Out.SeekSet(0) - Asmbelf(ctxt, symo) + asmbElf(ctxt, symo) } if ctxt.IsWindows() { - Asmbpe(ctxt) + asmbPe(ctxt) } if ctxt.IsPlan9() { @@ -119,17 +120,17 @@ func asmb2(ctxt *Link) bool { *FlagS = true symo := int64(Segdata.Fileoff + Segdata.Filelen) ctxt.Out.SeekSet(symo) - Asmplan9sym(ctxt) + asmbPlan9Sym(ctxt) } ctxt.Out.SeekSet(0) - WritePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit) + writePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit) } if ctxt.IsAIX() { ctxt.Out.SeekSet(0) fileoff := uint32(Segdwarf.Fileoff + Segdwarf.Filelen) fileoff = uint32(Rnd(int64(fileoff), int64(*FlagRound))) - Asmbxcoff(ctxt, int64(fileoff)) + asmbXcoff(ctxt, int64(fileoff)) } if *FlagC { @@ -140,12 +141,10 @@ func asmb2(ctxt *Link) bool { fmt.Printf("lcsize=%d\n", Lcsize) fmt.Printf("total=%d\n", Segtext.Filelen+Segdata.Length+uint64(Symsize)+uint64(Lcsize)) } - - return true } -// WritePlan9Header writes out the plan9 header at the present position in the OutBuf. -func WritePlan9Header(buf *OutBuf, magic uint32, entry int64, is64Bit bool) { +// writePlan9Header writes out the plan9 header at the present position in the OutBuf. +func writePlan9Header(buf *OutBuf, magic uint32, entry int64, is64Bit bool) { if is64Bit { magic |= 0x00008000 } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 6e75e6ffaf..8bf1259cfc 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1398,7 +1398,7 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) { sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff } -func Elfemitreloc(ctxt *Link) { +func elfEmitReloc(ctxt *Link) { for ctxt.Out.Offset()&7 != 0 { ctxt.Out.Write8(0) @@ -1780,7 +1780,7 @@ func Asmbelfsetup() { } } -func Asmbelf(ctxt *Link, symo int64) { +func asmbElf(ctxt *Link, symo int64) { ldr := ctxt.loader eh := getElfEhdr() diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index c66af8628a..61a56f35b7 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -574,7 +574,7 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string) } } -func Asmbmacho(ctxt *Link) { +func asmbMacho(ctxt *Link) { /* apple MACH */ va := *FlagTextAddr - int64(HEADR) @@ -964,7 +964,7 @@ func machodysymtab(ctxt *Link) { ml.data[17] = 0 /* nlocrel */ } -func Domacholink(ctxt *Link) int64 { +func doMachoLink(ctxt *Link) int64 { machosymtab(ctxt) ldr := ctxt.loader @@ -1056,7 +1056,7 @@ func machorelocsect(ctxt *Link, ldr *loader.Loader, sect *sym.Section, syms []lo sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff } -func Machoemitreloc(ctxt *Link) { +func machoEmitReloc(ctxt *Link) { for ctxt.Out.Offset()&7 != 0 { ctxt.Out.Write8(0) } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 0c18d512d3..1c9f33d68f 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -321,9 +321,7 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("reloc") ctxt.reloc() bench.Start("Asmb2") - if !asmb2(ctxt) { - thearch.Asmb2(ctxt, ctxt.loader) - } + asmb2(ctxt) bench.Start("Munmap") ctxt.Out.Close() // Close handles Munmapping if necessary. diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 29395c94e3..f0211e12ac 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -1547,7 +1547,7 @@ func addpersrc(ctxt *Link) { pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = h.virtualSize } -func Asmbpe(ctxt *Link) { +func asmbPe(ctxt *Link) { switch ctxt.Arch.Family { default: Exitf("unknown PE architecture: %v", ctxt.Arch.Family) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 61072cb0cf..dd943733c7 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -229,7 +229,7 @@ func genelfsym(ctxt *Link, elfbind int) { } } -func Asmelfsym(ctxt *Link) { +func asmElfSym(ctxt *Link) { // the first symbol entry is reserved putelfsyment(ctxt.Out, 0, 0, 0, STB_LOCAL<<4|STT_NOTYPE, 0, 0) @@ -274,7 +274,7 @@ func putplan9sym(ctxt *Link, ldr *loader.Loader, s loader.Sym, char SymbolType) Symsize += int32(l) + 1 + int32(len(name)) + 1 } -func Asmplan9sym(ctxt *Link) { +func asmbPlan9Sym(ctxt *Link) { ldr := ctxt.loader // Add special runtime.text and runtime.etext symbols. diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 05c2aa48c8..a116a1f460 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1556,7 +1556,7 @@ func xcoffwrite(ctxt *Link) { } // Generate XCOFF assembly file -func Asmbxcoff(ctxt *Link, fileoff int64) { +func asmbXcoff(ctxt *Link, fileoff int64) { xfile.sectNameToScnum = make(map[string]int16) // Add sections -- GitLab From c5a9b3d63a78e356047e396ee39f588231d7d31e Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 26 May 2020 14:59:40 -0400 Subject: [PATCH 0056/1792] [dev.link] cmd/link: simplify asmb2 Move lots of the binary-file format specific pieces into their appropriate places. Similarly rescope some variables to just ld. Change-Id: I74bc6d8aba58f5ac86e6579be1fcb356c4636825 Reviewed-on: https://go-review.googlesource.com/c/go/+/235278 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/asmb.go | 94 ++++++++++++++---------------- src/cmd/link/internal/ld/elf.go | 18 +++++- src/cmd/link/internal/ld/lib.go | 6 +- src/cmd/link/internal/ld/macho.go | 8 +++ src/cmd/link/internal/ld/symtab.go | 6 +- src/cmd/link/internal/ld/xcoff.go | 8 ++- 6 files changed, 79 insertions(+), 61 deletions(-) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index 825dd9a865..a9987ba207 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -5,6 +5,7 @@ package ld import ( + "cmd/internal/objabi" "cmd/link/internal/loader" "fmt" "sync" @@ -80,66 +81,47 @@ func asmb2(ctxt *Link) { return } - Symsize = 0 - Spsize = 0 - Lcsize = 0 + symSize = 0 + spSize = 0 + lcSize = 0 - if ctxt.IsDarwin() { - machlink := doMachoLink(ctxt) - if !*FlagS && ctxt.IsExternal() { - symo := int64(Segdwarf.Fileoff + uint64(Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))) + uint64(machlink)) - ctxt.Out.SeekSet(symo) - machoEmitReloc(ctxt) - } - ctxt.Out.SeekSet(0) + switch ctxt.HeadType { + default: + panic("unknown platform") + + // Macho + case objabi.Hdarwin: asmbMacho(ctxt) - } - if ctxt.IsElf() { - var symo int64 - if !*FlagS { - symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen) - symo = Rnd(symo, int64(*FlagRound)) - ctxt.Out.SeekSet(symo) - asmElfSym(ctxt) - ctxt.Out.Write(Elfstrdat) - if ctxt.IsExternal() { - elfEmitReloc(ctxt) - } - } - ctxt.Out.SeekSet(0) - asmbElf(ctxt, symo) - } + // Plan9 + case objabi.Hplan9: + asmbPlan9(ctxt) - if ctxt.IsWindows() { + // PE + case objabi.Hwindows: asmbPe(ctxt) - } - if ctxt.IsPlan9() { - if !*FlagS { - *FlagS = true - symo := int64(Segdata.Fileoff + Segdata.Filelen) - ctxt.Out.SeekSet(symo) - asmbPlan9Sym(ctxt) - } - ctxt.Out.SeekSet(0) - writePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit) - } + // Xcoff + case objabi.Haix: + asmbXcoff(ctxt) - if ctxt.IsAIX() { - ctxt.Out.SeekSet(0) - fileoff := uint32(Segdwarf.Fileoff + Segdwarf.Filelen) - fileoff = uint32(Rnd(int64(fileoff), int64(*FlagRound))) - asmbXcoff(ctxt, int64(fileoff)) + // Elf + case objabi.Hdragonfly, + objabi.Hfreebsd, + objabi.Hlinux, + objabi.Hnetbsd, + objabi.Hopenbsd, + objabi.Hsolaris: + asmbElf(ctxt) } if *FlagC { fmt.Printf("textsize=%d\n", Segtext.Filelen) fmt.Printf("datsize=%d\n", Segdata.Filelen) fmt.Printf("bsssize=%d\n", Segdata.Length-Segdata.Filelen) - fmt.Printf("symsize=%d\n", Symsize) - fmt.Printf("lcsize=%d\n", Lcsize) - fmt.Printf("total=%d\n", Segtext.Filelen+Segdata.Length+uint64(Symsize)+uint64(Lcsize)) + fmt.Printf("symsize=%d\n", symSize) + fmt.Printf("lcsize=%d\n", lcSize) + fmt.Printf("total=%d\n", Segtext.Filelen+Segdata.Length+uint64(symSize)+uint64(lcSize)) } } @@ -152,16 +134,28 @@ func writePlan9Header(buf *OutBuf, magic uint32, entry int64, is64Bit bool) { buf.Write32b(uint32(Segtext.Filelen)) buf.Write32b(uint32(Segdata.Filelen)) buf.Write32b(uint32(Segdata.Length - Segdata.Filelen)) - buf.Write32b(uint32(Symsize)) + buf.Write32b(uint32(symSize)) if is64Bit { buf.Write32b(uint32(entry &^ 0x80000000)) } else { buf.Write32b(uint32(entry)) } - buf.Write32b(uint32(Spsize)) - buf.Write32b(uint32(Lcsize)) + buf.Write32b(uint32(spSize)) + buf.Write32b(uint32(lcSize)) // amd64 includes the entry at the beginning of the symbol table. if is64Bit { buf.Write64b(uint64(entry)) } } + +// asmbPlan9 assembles a plan 9 binary. +func asmbPlan9(ctxt *Link) { + if !*FlagS { + *FlagS = true + symo := int64(Segdata.Fileoff + Segdata.Filelen) + ctxt.Out.SeekSet(symo) + asmbPlan9Sym(ctxt) + } + ctxt.Out.SeekSet(0) + writePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit) +} diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 8bf1259cfc..eaa3ffddc4 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1780,7 +1780,19 @@ func Asmbelfsetup() { } } -func asmbElf(ctxt *Link, symo int64) { +func asmbElf(ctxt *Link) { + var symo int64 + if !*FlagS { + symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen) + symo = Rnd(symo, int64(*FlagRound)) + ctxt.Out.SeekSet(symo) + asmElfSym(ctxt) + ctxt.Out.Write(Elfstrdat) + if ctxt.IsExternal() { + elfEmitReloc(ctxt) + } + } + ctxt.Out.SeekSet(0) ldr := ctxt.loader eh := getElfEhdr() @@ -2231,7 +2243,7 @@ elfobj: sh := elfshname(".symtab") sh.type_ = SHT_SYMTAB sh.off = uint64(symo) - sh.size = uint64(Symsize) + sh.size = uint64(symSize) sh.addralign = uint64(ctxt.Arch.RegSize) sh.entsize = 8 + 2*uint64(ctxt.Arch.RegSize) sh.link = uint32(elfshname(".strtab").shnum) @@ -2239,7 +2251,7 @@ elfobj: sh = elfshname(".strtab") sh.type_ = SHT_STRTAB - sh.off = uint64(symo) + uint64(Symsize) + sh.off = uint64(symo) + uint64(symSize) sh.size = uint64(len(Elfstrdat)) sh.addralign = 1 } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 5c047c84ee..b0c8f91e2a 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -258,10 +258,10 @@ type Arch struct { var ( thearch Arch - Lcsize int32 + lcSize int32 rpath Rpath - Spsize int32 - Symsize int32 + spSize int32 + symSize int32 ) const ( diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 61a56f35b7..c8f02c4f0e 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -575,6 +575,14 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string) } func asmbMacho(ctxt *Link) { + machlink := doMachoLink(ctxt) + if !*FlagS && ctxt.IsExternal() { + symo := int64(Segdwarf.Fileoff + uint64(Rnd(int64(Segdwarf.Filelen), int64(*FlagRound))) + uint64(machlink)) + ctxt.Out.SeekSet(symo) + machoEmitReloc(ctxt) + } + ctxt.Out.SeekSet(0) + /* apple MACH */ va := *FlagTextAddr - int64(HEADR) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index dd943733c7..a448244370 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -61,7 +61,7 @@ func putelfsyment(out *OutBuf, off int, addr int64, size int64, info int, shndx out.Write16(uint16(shndx)) out.Write64(uint64(addr)) out.Write64(uint64(size)) - Symsize += ELF64SYMSIZE + symSize += ELF64SYMSIZE } else { out.Write32(uint32(off)) out.Write32(uint32(addr)) @@ -69,7 +69,7 @@ func putelfsyment(out *OutBuf, off int, addr int64, size int64, info int, shndx out.Write8(uint8(info)) out.Write8(uint8(other)) out.Write16(uint16(shndx)) - Symsize += ELF32SYMSIZE + symSize += ELF32SYMSIZE } } @@ -271,7 +271,7 @@ func putplan9sym(ctxt *Link, ldr *loader.Loader, s loader.Sym, char SymbolType) ctxt.Out.WriteString(name) ctxt.Out.Write8(0) - Symsize += int32(l) + 1 + int32(len(name)) + 1 + symSize += int32(l) + 1 + int32(len(name)) + 1 } func asmbPlan9Sym(ctxt *Link) { diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index a116a1f460..563fe49fc2 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1130,7 +1130,7 @@ func (f *xcoffFile) asmaixsym(ctxt *Link) { } if ctxt.Debugvlog != 0 || *flagN { - ctxt.Logf("symsize = %d\n", uint32(Symsize)) + ctxt.Logf("symsize = %d\n", uint32(symSize)) } xfile.updatePreviousFile(ctxt, true) } @@ -1556,7 +1556,11 @@ func xcoffwrite(ctxt *Link) { } // Generate XCOFF assembly file -func asmbXcoff(ctxt *Link, fileoff int64) { +func asmbXcoff(ctxt *Link) { + ctxt.Out.SeekSet(0) + fileoff := int64(Segdwarf.Fileoff + Segdwarf.Filelen) + fileoff = int64(Rnd(int64(fileoff), int64(*FlagRound))) + xfile.sectNameToScnum = make(map[string]int16) // Add sections -- GitLab From 086828ac552acee76a242e30f3e53de03fae4219 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 26 May 2020 13:40:12 -0400 Subject: [PATCH 0057/1792] [dev.link] cmd/link: make addgotsym architecture agnostic Change-Id: Icb64df32ef6599260a0cd3987a8afe98024da539 Reviewed-on: https://go-review.googlesource.com/c/go/+/235277 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/asm.go | 32 ++-------- src/cmd/link/internal/arm/asm.go | 23 +------ src/cmd/link/internal/arm64/asm.go | 24 +------ src/cmd/link/internal/ld/data_test.go | 92 +++++++++++++++++++++++++++ src/cmd/link/internal/ld/lib.go | 29 +++++++++ src/cmd/link/internal/s390x/asm.go | 22 +------ src/cmd/link/internal/x86/asm.go | 23 +------ 7 files changed, 132 insertions(+), 113 deletions(-) create mode 100644 src/cmd/link/internal/ld/data_test.go diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index e111c164a1..07354eb70a 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -142,7 +142,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // fall back to using GOT and hope for the best (CMOV*) // TODO: just needs relocation, no need to put in .dynsym - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_X86_64_GLOB_DAT)) su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocSym(rIdx, syms.GOT) @@ -223,7 +223,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade if targType != sym.SDYNIMPORT { ldr.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", ldr.SymName(targ)) } - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_X86_64_GLOB_DAT)) su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) su.SetRelocSym(rIdx, syms.GOT) @@ -266,7 +266,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // The code is asking for the address of an external // function. We provide it with the address of the // correspondent GOT symbol. - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_X86_64_GLOB_DAT)) su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) @@ -638,7 +638,7 @@ func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // https://networkpx.blogspot.com/2009/09/about-lcdyldinfoonly-command.html // has details about what we're avoiding. - addgotsym(target, ldr, syms, s) + ld.AddGotSym(target, ldr, syms, s, uint32(elf.R_X86_64_GLOB_DAT)) plt := ldr.MakeSymbolUpdater(syms.PLT) sDynid := ldr.SymDynid(s) @@ -655,30 +655,6 @@ func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.Errorf(s, "addpltsym: unsupported binary format") } } - -func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { - if ldr.SymGot(s) >= 0 { - return - } - - ld.Adddynsym(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT) - ldr.SetGot(s, int32(got.Size())) - got.AddUint64(target.Arch, 0) - - if target.IsElf() { - rela := ldr.MakeSymbolUpdater(syms.Rela) - rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) - rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_X86_64_GLOB_DAT))) - rela.AddUint64(target.Arch, 0) - } else if target.IsDarwin() { - leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) - leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s))) - } else { - ldr.Errorf(s, "addgotsym: unsupported binary format") - } -} - func tlsIEtoLE(P []byte, off, size int) { // Transform the PC-relative instruction into a constant load. // That is, diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 3212268fab..4c2dd80475 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -138,7 +138,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade if targType != sym.SDYNIMPORT { addgotsyminternal(target, ldr, syms, targ) } else { - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_ARM_GLOB_DAT)) } su := ldr.MakeSymbolUpdater(s) @@ -151,7 +151,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade if targType != sym.SDYNIMPORT { addgotsyminternal(target, ldr, syms, targ) } else { - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_ARM_GLOB_DAT)) } su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) @@ -651,22 +651,3 @@ func addgotsyminternal(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, ldr.Errorf(s, "addgotsyminternal: unsupported binary format") } } - -func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { - if ldr.SymGot(s) >= 0 { - return - } - - ld.Adddynsym(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT) - ldr.SetGot(s, int32(got.Size())) - got.AddUint64(target.Arch, 0) - - if target.IsElf() { - rel := ldr.MakeSymbolUpdater(syms.Rel) - rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) - rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_ARM_GLOB_DAT))) - } else { - ldr.Errorf(s, "addgotsym: unsupported binary format") - } -} diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 9482a0a193..a225314965 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -142,7 +142,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // fall back to using GOT // TODO: just needs relocation, no need to put in .dynsym - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_AARCH64_GLOB_DAT)) su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_ARM64_GOT) su.SetRelocSym(rIdx, syms.GOT) @@ -231,7 +231,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // The code is asking for the address of an external // function. We provide it with the address of the // correspondent GOT symbol. - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_AARCH64_GLOB_DAT)) su := ldr.MakeSymbolUpdater(s) su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) @@ -774,23 +774,3 @@ func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.Errorf(s, "addpltsym: unsupported binary format") } } - -func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { - if ldr.SymGot(s) >= 0 { - return - } - - ld.Adddynsym(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT) - ldr.SetGot(s, int32(got.Size())) - got.AddUint64(target.Arch, 0) - - if target.IsElf() { - rela := ldr.MakeSymbolUpdater(syms.Rela) - rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) - rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_AARCH64_GLOB_DAT))) - rela.AddUint64(target.Arch, 0) - } else { - ldr.Errorf(s, "addgotsym: unsupported binary format") - } -} diff --git a/src/cmd/link/internal/ld/data_test.go b/src/cmd/link/internal/ld/data_test.go new file mode 100644 index 0000000000..7c46307bd8 --- /dev/null +++ b/src/cmd/link/internal/ld/data_test.go @@ -0,0 +1,92 @@ +// 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 ld + +import ( + "cmd/internal/objabi" + "cmd/internal/sys" + "cmd/link/internal/loader" + "testing" +) + +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.BuildMode.Set(bm) + ctxt.LinkMode.Set(lm) + ctxt.IsELF = iself + ctxt.mustSetHeadType() + ctxt.setArchSyms() + return ctxt +} + +// Make sure the addgotsym properly increases the symbols. +func TestAddGotSym(t *testing.T) { + tests := []struct { + arch *sys.Arch + ht objabi.HeadType + bm, lm string + rel string + relsize int + gotsize int + }{ + { + arch: sys.Arch386, + ht: objabi.Hlinux, + bm: "pie", + lm: "internal", + rel: ".rel", + relsize: 2 * sys.Arch386.PtrSize, + gotsize: sys.Arch386.PtrSize, + }, + { + arch: sys.ArchAMD64, + ht: objabi.Hlinux, + bm: "pie", + lm: "internal", + rel: ".rela", + relsize: 3 * sys.ArchAMD64.PtrSize, + gotsize: sys.ArchAMD64.PtrSize, + }, + { + arch: sys.ArchAMD64, + ht: objabi.Hdarwin, + bm: "pie", + lm: "external", + gotsize: sys.ArchAMD64.PtrSize, + }, + } + + // Save the architecture as we're going to set it on each test run. + origArch := objabi.GOARCH + defer func() { + objabi.GOARCH = origArch + }() + + for i, test := range tests { + iself := len(test.rel) != 0 + objabi.GOARCH = test.arch.Name + ctxt := setUpContext(test.arch, iself, test.ht, test.bm, test.lm) + foo := ctxt.loader.CreateSymForUpdate("foo", 0) + ctxt.loader.CreateExtSym("bar", 0) + AddGotSym(&ctxt.Target, ctxt.loader, &ctxt.ArchSyms, foo.Sym(), 0) + + if iself { + rel := ctxt.loader.Lookup(test.rel, 0) + if rel == 0 { + t.Fatalf("[%d] could not find symbol: %q", i, test.rel) + } + if s := ctxt.loader.SymSize(rel); s != int64(test.relsize) { + t.Fatalf("[%d] expected ldr.Size(%q) == %v, got %v", i, test.rel, test.relsize, s) + } + } + if s := ctxt.loader.SymSize(ctxt.loader.Lookup(".got", 0)); s != int64(test.gotsize) { + t.Fatalf(`[%d] expected ldr.Size(".got") == %v, got %v`, i, test.gotsize, s) + } + } +} diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 429ea98347..c4f3e0aedb 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2587,3 +2587,32 @@ func ElfSymForReloc(ctxt *Link, s loader.Sym) int32 { return ctxt.loader.SymElfSym(s) } } + +func AddGotSym(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, elfRelocTyp uint32) { + if ldr.SymGot(s) >= 0 { + return + } + + Adddynsym(ldr, target, syms, s) + got := ldr.MakeSymbolUpdater(syms.GOT) + ldr.SetGot(s, int32(got.Size())) + got.AddUint(target.Arch, 0) + + if target.IsElf() { + if target.Arch.PtrSize == 8 { + rela := ldr.MakeSymbolUpdater(syms.Rela) + rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) + rela.AddUint64(target.Arch, ELF64_R_INFO(uint32(ldr.SymDynid(s)), elfRelocTyp)) + rela.AddUint64(target.Arch, 0) + } else { + rel := ldr.MakeSymbolUpdater(syms.Rel) + rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) + rel.AddUint32(target.Arch, ELF32_R_INFO(uint32(ldr.SymDynid(s)), elfRelocTyp)) + } + } else if target.IsDarwin() { + leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) + leg.AddUint32(target.Arch, uint32(ldr.SymDynid(s))) + } else { + ldr.Errorf(s, "addgotsym: unsupported binary format") + } +} diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 2185197460..6617575162 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -203,7 +203,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return true case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTENT): - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_390_GLOB_DAT)) su := ldr.MakeSymbolUpdater(s) su.SetRelocType(rIdx, objabi.R_PCREL) ldr.SetRelocVariant(s, rIdx, sym.RV_390_DBL) @@ -454,23 +454,3 @@ func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.Errorf(s, "addpltsym: unsupported binary format") } } - -func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { - if ldr.SymGot(s) >= 0 { - return - } - - ld.Adddynsym(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT) - ldr.SetGot(s, int32(got.Size())) - got.AddUint64(target.Arch, 0) - - if target.IsElf() { - rela := ldr.MakeSymbolUpdater(syms.Rela) - rela.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) - rela.AddUint64(target.Arch, ld.ELF64_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_390_GLOB_DAT))) - rela.AddUint64(target.Arch, 0) - } else { - ldr.Errorf(s, "addgotsym: unsupported binary format") - } -} diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index d5ac40c583..3fb67a9238 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -201,7 +201,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_386_GLOB_DAT)) su.SetRelocType(rIdx, objabi.R_CONST) // write r->add during relocsym su.SetRelocSym(rIdx, 0) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) @@ -266,7 +266,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return true } - addgotsym(target, ldr, syms, targ) + ld.AddGotSym(target, ldr, syms, targ, uint32(elf.R_386_GLOB_DAT)) su.SetRelocSym(rIdx, syms.GOT) su.SetRelocAdd(rIdx, r.Add()+int64(ldr.SymGot(targ))) su.SetRelocType(rIdx, objabi.R_PCREL) @@ -490,22 +490,3 @@ func addpltsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade ldr.Errorf(s, "addpltsym: unsupported binary format") } } - -func addgotsym(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) { - if ldr.SymGot(s) >= 0 { - return - } - - ld.Adddynsym(ldr, target, syms, s) - got := ldr.MakeSymbolUpdater(syms.GOT) - ldr.SetGot(s, int32(got.Size())) - got.AddUint32(target.Arch, 0) - - if target.IsElf() { - rel := ldr.MakeSymbolUpdater(syms.Rel) - rel.AddAddrPlus(target.Arch, got.Sym(), int64(ldr.SymGot(s))) - rel.AddUint32(target.Arch, ld.ELF32_R_INFO(uint32(ldr.SymDynid(s)), uint32(elf.R_386_GLOB_DAT))) - } else { - ldr.Errorf(s, "addgotsym: unsupported binary format") - } -} -- GitLab From 4cc043d883b08b067234e5bdc771bef2ef962112 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 1 Jun 2020 12:55:40 -0400 Subject: [PATCH 0058/1792] [dev.link] cmd/link: remove safe mode Safe mode in the compiler is removed in CL 142717 in Go 1.12. I think we can delete safe mode from the linker as well. Change-Id: I201e84fca3a566a1bb84434ab4d504516160ac4e Reviewed-on: https://go-review.googlesource.com/c/go/+/236117 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/go.go | 15 --------------- src/cmd/link/internal/ld/lib.go | 15 --------------- src/cmd/link/internal/ld/main.go | 1 - src/cmd/link/internal/sym/library.go | 1 - 4 files changed, 32 deletions(-) diff --git a/src/cmd/link/internal/ld/go.go b/src/cmd/link/internal/ld/go.go index 2131c039e5..6d05c59b81 100644 --- a/src/cmd/link/internal/ld/go.go +++ b/src/cmd/link/internal/ld/go.go @@ -39,18 +39,12 @@ func ldpkg(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, filename s if int64(int(length)) != length { fmt.Fprintf(os.Stderr, "%s: too much pkg data in %s\n", os.Args[0], filename) - if *flagU { - errorexit() - } return } bdata := make([]byte, length) if _, err := io.ReadFull(f, bdata); err != nil { fmt.Fprintf(os.Stderr, "%s: short pkg read %s\n", os.Args[0], filename) - if *flagU { - errorexit() - } return } data := string(bdata) @@ -63,9 +57,6 @@ func ldpkg(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, filename s } else { line, data = data, "" } - if line == "safe" { - lib.Safe = true - } if line == "main" { lib.Main = true } @@ -82,9 +73,6 @@ func ldpkg(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, filename s i := strings.IndexByte(data[p0+1:], '\n') if i < 0 { fmt.Fprintf(os.Stderr, "%s: found $$ // cgo but no newline in %s\n", os.Args[0], filename) - if *flagU { - errorexit() - } return } p0 += 1 + i @@ -95,9 +83,6 @@ func ldpkg(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, filename s } if p1 < 0 { fmt.Fprintf(os.Stderr, "%s: cannot find end of // cgo section in %s\n", os.Args[0], filename) - if *flagU { - errorexit() - } return } p1 += p0 diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index c4f3e0aedb..93524f0955 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -995,21 +995,6 @@ func loadobjfile(ctxt *Link, lib *sym.Library) { if pkg == "main" && !lib.Main { Exitf("%s: not package main", lib.File) } - - // Ideally, we'd check that *all* object files within - // the archive were marked safe, but here we settle - // for *any*. - // - // Historically, cmd/link only checked the __.PKGDEF - // file, which in turn came from the first object - // file, typically produced by cmd/compile. The - // remaining object files are normally produced by - // cmd/asm, which doesn't support marking files as - // safe anyway. So at least in practice, this matches - // how safe mode has always worked. - if *flagU && !lib.Safe { - Exitf("%s: load of unsafe package %s", lib.File, pkg) - } }() for i := 0; i < len(ARMAG); i++ { diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 1c9f33d68f..3404ba766a 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -82,7 +82,6 @@ var ( flagH = flag.Bool("h", false, "halt on error") flagN = flag.Bool("n", false, "dump symbol table") FlagS = flag.Bool("s", false, "disable symbol table") - flagU = flag.Bool("u", false, "reject unsafe packages") FlagW = flag.Bool("w", false, "disable DWARF generation") flag8 bool // use 64-bit addresses in symbol table flagInterpreter = flag.String("I", "", "use `linker` as ELF dynamic linker") diff --git a/src/cmd/link/internal/sym/library.go b/src/cmd/link/internal/sym/library.go index 915510fb04..18e1380a68 100644 --- a/src/cmd/link/internal/sym/library.go +++ b/src/cmd/link/internal/sym/library.go @@ -17,7 +17,6 @@ type Library struct { Autolib []goobj2.ImportedPkg Imports []*Library Main bool - Safe bool Units []*CompilationUnit Textp []LoaderSym // text syms defined in this library -- GitLab From 7795523910227cb6df3c91ebdb317037fc9ceb86 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 1 Jun 2020 18:53:58 -0400 Subject: [PATCH 0059/1792] [dev.link] cmd/compile: use hash of export data as fingerprint Currently, the compiler generates a fingerprint for each package, which is used by the linker for index consistency check. When building plugin or shared object, currently the linker also generates a hash, by hashing the export data. At run time, when a package is referenced by multiple DSOs, this hash is compared to ensure consistency. It would be good if we can unify this two hashes. This way, the linker doesn't need to read the export data (which is intended for the compiler only, and is not always available for the linker). The export data hash is sufficient for both purposes. It is consistent with the current hash geneated by the linker. And the export data includes indices for exported symbols, so its hash can be used to catch index mismatches. Updates #33820. Change-Id: I2bc0d74930746f54c683a10dfd695d50ea3f5a38 Reviewed-on: https://go-review.googlesource.com/c/go/+/236118 Run-TryBot: Cherry Zhang Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/compile/internal/gc/iexport.go | 10 +++++++--- src/cmd/internal/obj/sym.go | 10 ---------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/cmd/compile/internal/gc/iexport.go b/src/cmd/compile/internal/gc/iexport.go index 32cc50fda1..328260fc59 100644 --- a/src/cmd/compile/internal/gc/iexport.go +++ b/src/cmd/compile/internal/gc/iexport.go @@ -207,6 +207,7 @@ import ( "cmd/compile/internal/types" "cmd/internal/goobj2" "cmd/internal/src" + "crypto/md5" "encoding/binary" "fmt" "io" @@ -295,12 +296,15 @@ func iexport(out *bufio.Writer) { hdr.uint64(dataLen) // Flush output. - io.Copy(out, &hdr) - io.Copy(out, &p.strings) - io.Copy(out, &p.data0) + h := md5.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(Ctxt.Fingerprint[:], h.Sum(nil)[:]) out.Write(Ctxt.Fingerprint[:]) } diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 4cbcb87b48..72a314aae0 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -34,7 +34,6 @@ package obj import ( "cmd/internal/goobj2" "cmd/internal/objabi" - "crypto/md5" "fmt" "log" "math" @@ -238,15 +237,6 @@ func (ctxt *Link) NumberSyms() { ctxt.pkgIdx[pkg] = ipkg ipkg++ }) - - // Compute a fingerprint of the indices, for exporting. - if !ctxt.IsAsm { - h := md5.New() - for _, s := range ctxt.defs { - h.Write([]byte(s.Name)) - } - copy(ctxt.Fingerprint[:], h.Sum(nil)[:]) - } } // Returns whether s is a non-package symbol, which needs to be referenced -- GitLab From 7bc3b6e5e4b6061ebfa267fcb27731ac94ae7f4d Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 1 Jun 2020 19:36:16 -0400 Subject: [PATCH 0060/1792] [dev.link] cmd/link: use fingerprint as package hash Now the compiler-generated fingerprint is a hash of the export data. We don't need to hash it ourselves in the linker. And the linker doesn't need to read export data at all. Fixes #33820. Change-Id: I54bf3ebfd0f0c72aa43a352d7b2e0575dd62970d Reviewed-on: https://go-review.googlesource.com/c/go/+/236119 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/elf.go | 3 +- src/cmd/link/internal/ld/lib.go | 72 ---------------------------- src/cmd/link/internal/ld/symtab.go | 8 ++-- src/cmd/link/internal/sym/library.go | 1 - 4 files changed, 5 insertions(+), 79 deletions(-) diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index eaa3ffddc4..b100d07e6f 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -12,7 +12,6 @@ import ( "crypto/sha1" "encoding/binary" "encoding/hex" - "io" "path/filepath" "sort" "strings" @@ -1713,7 +1712,7 @@ func (ctxt *Link) doelf() { sort.Sort(byPkg(ctxt.Library)) h := sha1.New() for _, l := range ctxt.Library { - io.WriteString(h, l.Hash) + h.Write(l.Fingerprint[:]) } addgonote(ctxt, ".note.go.abihash", ELF_NOTE_GOABIHASH_TAG, h.Sum([]byte{})) addgonote(ctxt, ".note.go.pkg-list", ELF_NOTE_GOPKGLIST_TAG, pkglistfornote) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 93524f0955..dcb5f798c6 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -48,7 +48,6 @@ import ( "debug/macho" "encoding/base64" "encoding/binary" - "encoding/hex" "fmt" "io" "io/ioutil" @@ -785,16 +784,6 @@ func (ctxt *Link) linksetup() { ctxt.loader.SetAttrReachable(moduledata, true) ctxt.Moduledata = moduledata - // If package versioning is required, generate a hash of the - // packages used in the link. - if ctxt.BuildMode == BuildModeShared || ctxt.BuildMode == BuildModePlugin || ctxt.CanUsePlugins() { - for _, lib := range ctxt.Library { - if lib.Shlib == "" { - genhash(ctxt, lib) - } - } - } - if ctxt.Arch == sys.Arch386 && ctxt.HeadType != objabi.Hwindows { if (ctxt.BuildMode == BuildModeCArchive && ctxt.IsELF) || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE || ctxt.DynlinkingGo() { got := ctxt.loader.LookupOrCreateSym("_GLOBAL_OFFSET_TABLE_", 0) @@ -919,67 +908,6 @@ func nextar(bp *bio.Reader, off int64, a *ArHdr) int64 { return arsize + SAR_HDR } -func genhash(ctxt *Link, lib *sym.Library) { - f, err := bio.Open(lib.File) - if err != nil { - Errorf(nil, "cannot open file %s for hash generation: %v", lib.File, err) - return - } - defer f.Close() - - var magbuf [len(ARMAG)]byte - if _, err := io.ReadFull(f, magbuf[:]); err != nil { - Exitf("file %s too short", lib.File) - } - - if string(magbuf[:]) != ARMAG { - Exitf("%s is not an archive file", lib.File) - } - - var arhdr ArHdr - l := nextar(f, f.Offset(), &arhdr) - if l <= 0 { - Errorf(nil, "%s: short read on archive file symbol header", lib.File) - return - } - if arhdr.name != pkgdef { - Errorf(nil, "%s: missing package data entry", lib.File) - return - } - - h := sha1.New() - - // To compute the hash of a package, we hash the first line of - // __.PKGDEF (which contains the toolchain version and any - // GOEXPERIMENT flags) and the export data (which is between - // the first two occurrences of "\n$$"). - - pkgDefBytes := make([]byte, atolwhex(arhdr.size)) - _, err = io.ReadFull(f, pkgDefBytes) - if err != nil { - Errorf(nil, "%s: error reading package data: %v", lib.File, err) - return - } - firstEOL := bytes.IndexByte(pkgDefBytes, '\n') - if firstEOL < 0 { - Errorf(nil, "cannot parse package data of %s for hash generation, no newline found", lib.File) - return - } - firstDoubleDollar := bytes.Index(pkgDefBytes, []byte("\n$$")) - if firstDoubleDollar < 0 { - Errorf(nil, "cannot parse package data of %s for hash generation, no \\n$$ found", lib.File) - return - } - secondDoubleDollar := bytes.Index(pkgDefBytes[firstDoubleDollar+1:], []byte("\n$$")) - if secondDoubleDollar < 0 { - Errorf(nil, "cannot parse package data of %s for hash generation, only one \\n$$ found", lib.File) - return - } - h.Write(pkgDefBytes[0:firstEOL]) - h.Write(pkgDefBytes[firstDoubleDollar : firstDoubleDollar+secondDoubleDollar]) - lib.Hash = hex.EncodeToString(h.Sum(nil)) -} - func loadobjfile(ctxt *Link, lib *sym.Library) { pkg := objabi.PathToPrefix(lib.Pkg) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index a448244370..43639393d6 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -591,13 +591,13 @@ func (ctxt *Link) symtab() []sym.SymKind { s := ldr.CreateSymForUpdate("go.link.pkghashbytes."+l.Pkg, 0) s.SetReachable(true) s.SetType(sym.SRODATA) - s.SetSize(int64(len(l.Hash))) - s.SetData([]byte(l.Hash)) + s.SetSize(int64(len(l.Fingerprint))) + s.SetData(l.Fingerprint[:]) str := ldr.CreateSymForUpdate("go.link.pkghash."+l.Pkg, 0) str.SetReachable(true) str.SetType(sym.SRODATA) str.AddAddr(ctxt.Arch, s.Sym()) - str.AddUint(ctxt.Arch, uint64(len(l.Hash))) + str.AddUint(ctxt.Arch, uint64(len(l.Fingerprint))) } } @@ -698,7 +698,7 @@ func (ctxt *Link) symtab() []sym.SymKind { // pkghashes[i].name addgostring(ctxt, ldr, pkghashes, fmt.Sprintf("go.link.pkgname.%d", i), l.Pkg) // pkghashes[i].linktimehash - addgostring(ctxt, ldr, pkghashes, fmt.Sprintf("go.link.pkglinkhash.%d", i), l.Hash) + addgostring(ctxt, ldr, pkghashes, fmt.Sprintf("go.link.pkglinkhash.%d", i), string(l.Fingerprint[:])) // pkghashes[i].runtimehash hash := ldr.Lookup("go.link.pkghash."+l.Pkg, 0) pkghashes.AddAddr(ctxt.Arch, hash) diff --git a/src/cmd/link/internal/sym/library.go b/src/cmd/link/internal/sym/library.go index 18e1380a68..7f6e63c020 100644 --- a/src/cmd/link/internal/sym/library.go +++ b/src/cmd/link/internal/sym/library.go @@ -12,7 +12,6 @@ type Library struct { File string Pkg string Shlib string - Hash string Fingerprint goobj2.FingerprintType Autolib []goobj2.ImportedPkg Imports []*Library -- GitLab From e4d6bfdbdf6037326633a7826293c848dc0d4228 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 3 Jun 2020 13:28:18 -0400 Subject: [PATCH 0061/1792] [dev.link] cmd/link: compare type descriptors for interface satisfaction analysis Currently, in the deadcode pass, when checking whether a defined method satisfies an interface, it compares the string representation of the defined method and the interface method. In fact, it can simply compare the method name and the type descriptor (as we do in runtime). Make it so. Change-Id: Ideb2b2410e5eedcd20ac31e3af41f5499fc90225 Reviewed-on: https://go-review.googlesource.com/c/go/+/236564 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/deadcode.go | 50 ++++++++------------------- src/cmd/link/internal/ld/decodesym.go | 4 --- 2 files changed, 15 insertions(+), 39 deletions(-) diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 7c58a62975..2591b6f0db 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -5,7 +5,6 @@ package ld import ( - "bytes" "cmd/internal/goobj2" "cmd/internal/objabi" "cmd/internal/sys" @@ -123,7 +122,7 @@ func (d *deadcodePass) flood() { if len(p) != 0 && decodetypeKind(d.ctxt.Arch, p)&kindMask == kindInterface { for _, sig := range d.decodeIfaceMethods(d.ldr, d.ctxt.Arch, symIdx, &relocs) { if d.ctxt.Debugvlog > 1 { - d.ctxt.Logf("reached iface method: %s\n", sig) + d.ctxt.Logf("reached iface method: %v\n", sig) } d.ifaceMethod[sig] = true } @@ -191,6 +190,9 @@ func (d *deadcodePass) flood() { } for i, m := range methodsigs { methods[i].m = m + if d.ctxt.Debugvlog > 1 { + d.ctxt.Logf("markable method: %v of sym %v %s\n", m, symIdx, d.ldr.SymName(symIdx)) + } } d.markableMethods = append(d.markableMethods, methods...) } @@ -316,6 +318,12 @@ func deadcode(ctxt *Link) { } } +// methodsig is a typed method signature (name + type). +type methodsig struct { + name string + typ loader.Sym // type descriptor symbol of the function +} + // methodref holds the relocations from a receiver type symbol to its // method. There are three relocations, one for each of the fields in // the reflect.method struct: mtyp, ifn, and tfn. @@ -326,52 +334,24 @@ type methodref struct { } func (m methodref) isExported() bool { - for _, r := range m.m { + for _, r := range m.m.name { return unicode.IsUpper(r) } panic("methodref has no signature") } -// decodeMethodSig2 decodes an array of method signature information. +// decodeMethodSig decodes an array of method signature information. // Each element of the array is size bytes. The first 4 bytes is a // nameOff for the method name, and the next 4 bytes is a typeOff for // the function type. // // Conveniently this is the layout of both runtime.method and runtime.imethod. func (d *deadcodePass) decodeMethodSig(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, relocs *loader.Relocs, off, size, count int) []methodsig { - var buf bytes.Buffer - var methods []methodsig + var methods = make([]methodsig, count) for i := 0; i < count; i++ { - buf.WriteString(decodetypeName(ldr, symIdx, relocs, off)) - mtypSym := decodeRelocSym(ldr, symIdx, relocs, int32(off+4)) - // FIXME: add some sort of caching here, since we may see some of the - // same symbols over time for param types. - mrelocs := ldr.Relocs(mtypSym) - mp := ldr.Data(mtypSym) - - buf.WriteRune('(') - inCount := decodetypeFuncInCount(arch, mp) - for i := 0; i < inCount; i++ { - if i > 0 { - buf.WriteString(", ") - } - a := decodetypeFuncInType(ldr, arch, mtypSym, &mrelocs, i) - buf.WriteString(ldr.SymName(a)) - } - buf.WriteString(") (") - outCount := decodetypeFuncOutCount(arch, mp) - for i := 0; i < outCount; i++ { - if i > 0 { - buf.WriteString(", ") - } - a := decodetypeFuncOutType(ldr, arch, mtypSym, &mrelocs, i) - buf.WriteString(ldr.SymName(a)) - } - buf.WriteRune(')') - + methods[i].name = decodetypeName(ldr, symIdx, relocs, off) + methods[i].typ = decodeRelocSym(ldr, symIdx, relocs, int32(off+4)) off += size - methods = append(methods, methodsig(buf.String())) - buf.Reset() } return methods } diff --git a/src/cmd/link/internal/ld/decodesym.go b/src/cmd/link/internal/ld/decodesym.go index e9c87efe37..3211a4e907 100644 --- a/src/cmd/link/internal/ld/decodesym.go +++ b/src/cmd/link/internal/ld/decodesym.go @@ -90,10 +90,6 @@ func decodetypeIfaceMethodCount(arch *sys.Arch, p []byte) int64 { return int64(decodeInuxi(arch, p[commonsize(arch)+2*arch.PtrSize:], arch.PtrSize)) } -// methodsig is a fully qualified typed method signature, like -// "Visit(type.go/ast.Node) (type.go/ast.Visitor)". -type methodsig string - // Matches runtime/typekind.go and reflect.Kind. const ( kindArray = 17 -- GitLab From 7179e426e2710b56a7b862e089570baa6c7a1a5d Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 3 Jun 2020 19:34:29 -0400 Subject: [PATCH 0062/1792] [dev.link] cmd/link: rewrite heap algorithm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of using container/heap package, implement a simple specialized heap algorithm for the work queue in the deadcode pass, to avoid allocations and function pointer calls. Linking cmd/compile, name old time/op new time/op delta Deadcode_GC 59.8ms ± 4% 42.2ms ± 4% -29.45% (p=0.008 n=5+5) name old alloc/op new alloc/op delta Deadcode_GC 3.53MB ± 0% 2.10MB ± 0% -40.57% (p=0.008 n=5+5) name old allocs/op new allocs/op delta Deadcode_GC 187k ± 0% 8k ± 0% -95.48% (p=0.008 n=5+5) Change-Id: Ibb21801d5b8e4a7eaf429856702e02720cd1772f Reviewed-on: https://go-review.googlesource.com/c/go/+/236565 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/deadcode.go | 19 +----- src/cmd/link/internal/ld/heap.go | 54 ++++++++++++++++ src/cmd/link/internal/ld/heap_test.go | 90 +++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 18 deletions(-) create mode 100644 src/cmd/link/internal/ld/heap.go create mode 100644 src/cmd/link/internal/ld/heap_test.go diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 2591b6f0db..5aad7489f4 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -10,32 +10,16 @@ import ( "cmd/internal/sys" "cmd/link/internal/loader" "cmd/link/internal/sym" - "container/heap" "fmt" "unicode" ) var _ = fmt.Print -type workQueue []loader.Sym - -// Implement container/heap.Interface. -func (q *workQueue) Len() int { return len(*q) } -func (q *workQueue) Less(i, j int) bool { return (*q)[i] < (*q)[j] } -func (q *workQueue) Swap(i, j int) { (*q)[i], (*q)[j] = (*q)[j], (*q)[i] } -func (q *workQueue) Push(i interface{}) { *q = append(*q, i.(loader.Sym)) } -func (q *workQueue) Pop() interface{} { i := (*q)[len(*q)-1]; *q = (*q)[:len(*q)-1]; return i } - -// Functions for deadcode pass to use. -// Deadcode pass should call push/pop, not Push/Pop. -func (q *workQueue) push(i loader.Sym) { heap.Push(q, i) } -func (q *workQueue) pop() loader.Sym { return heap.Pop(q).(loader.Sym) } -func (q *workQueue) empty() bool { return len(*q) == 0 } - type deadcodePass struct { ctxt *Link ldr *loader.Loader - wq workQueue + wq heap // work queue, using min-heap for beter locality ifaceMethod map[methodsig]bool // methods declared in reached interfaces markableMethods []methodref // methods of reached types @@ -48,7 +32,6 @@ func (d *deadcodePass) init() { if objabi.Fieldtrack_enabled != 0 { d.ldr.Reachparent = make([]loader.Sym, d.ldr.NSym()) } - heap.Init(&d.wq) if d.ctxt.BuildMode == BuildModeShared { // Mark all symbols defined in this library as reachable when diff --git a/src/cmd/link/internal/ld/heap.go b/src/cmd/link/internal/ld/heap.go new file mode 100644 index 0000000000..ea2d772bee --- /dev/null +++ b/src/cmd/link/internal/ld/heap.go @@ -0,0 +1,54 @@ +// 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 ld + +import "cmd/link/internal/loader" + +// Min-heap implementation, for the deadcode pass. +// Specialized for loader.Sym elements. + +type heap []loader.Sym + +func (h *heap) push(s loader.Sym) { + *h = append(*h, s) + // sift up + n := len(*h) - 1 + for n > 0 { + p := (n - 1) / 2 // parent + if (*h)[p] <= (*h)[n] { + break + } + (*h)[n], (*h)[p] = (*h)[p], (*h)[n] + n = p + } +} + +func (h *heap) pop() 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 && (*h)[c1] < (*h)[c] { + c = c1 // right child + } + if (*h)[i] <= (*h)[c] { + break + } + (*h)[i], (*h)[c] = (*h)[c], (*h)[i] + i = c + } + + return r +} + +func (h *heap) empty() bool { return len(*h) == 0 } diff --git a/src/cmd/link/internal/ld/heap_test.go b/src/cmd/link/internal/ld/heap_test.go new file mode 100644 index 0000000000..08c90301e2 --- /dev/null +++ b/src/cmd/link/internal/ld/heap_test.go @@ -0,0 +1,90 @@ +// 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 ld + +import ( + "cmd/link/internal/loader" + "testing" +) + +func TestHeap(t *testing.T) { + tests := [][]loader.Sym{ + {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, + {100, 90, 80, 70, 60, 50, 40, 30, 20, 10}, + {30, 50, 80, 20, 60, 70, 10, 100, 90, 40}, + } + for _, s := range tests { + h := heap{} + for _, i := range s { + h.push(i) + if !verify(&h, 0) { + t.Errorf("heap invariant violated: %v", h) + } + } + for j := 0; j < len(s); j++ { + x := h.pop() + if !verify(&h, 0) { + t.Errorf("heap invariant violated: %v", h) + } + // pop should return elements in ascending order. + if want := loader.Sym((j + 1) * 10); x != want { + t.Errorf("pop returns wrong element: want %d, got %d", want, x) + } + } + if !h.empty() { + t.Errorf("heap is not empty after all pops") + } + } + + // Also check that mixed pushes and pops work correctly. + for _, s := range tests { + h := heap{} + for i := 0; i < len(s)/2; i++ { + // two pushes, one pop + h.push(s[2*i]) + if !verify(&h, 0) { + t.Errorf("heap invariant violated: %v", h) + } + h.push(s[2*i+1]) + if !verify(&h, 0) { + t.Errorf("heap invariant violated: %v", h) + } + h.pop() + if !verify(&h, 0) { + t.Errorf("heap invariant violated: %v", h) + } + } + for !h.empty() { // pop remaining elements + h.pop() + if !verify(&h, 0) { + t.Errorf("heap invariant violated: %v", h) + } + } + } +} + +// recursively verify heap-ness, starting at element i. +func verify(h *heap, i int) bool { + n := len(*h) + c1 := 2*i + 1 // left child + c2 := 2*i + 2 // right child + if c1 < n { + if (*h)[c1] < (*h)[i] { + return false + } + if !verify(h, c1) { + return false + } + } + if c2 < n { + if (*h)[c2] < (*h)[i] { + return false + } + if !verify(h, c2) { + return false + } + } + return true +} -- GitLab From 78b96db04ec9937de53c6bba0db3aeb9fff470db Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 4 Jun 2020 12:01:53 -0400 Subject: [PATCH 0063/1792] [dev.link] cmd/link: reuse slice memory in deadcode pass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reuse slice memory in the deadcode pass, reduce allocations. Linking cmd/compile, name old alloc/op new alloc/op delta Deadcode_GC 2.10MB ± 0% 1.41MB ± 0% -32.61% (p=0.008 n=5+5) name old allocs/op new allocs/op delta Deadcode_GC 8.46k ± 0% 5.55k ± 0% -34.45% (p=0.008 n=5+5) Change-Id: Ib9ba0928d68a65879007218697712b53acd3c5c5 Reviewed-on: https://go-review.googlesource.com/c/go/+/236566 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/deadcode.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 5aad7489f4..d59b1f2c65 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -24,6 +24,8 @@ type deadcodePass struct { ifaceMethod map[methodsig]bool // methods declared in reached interfaces markableMethods []methodref // methods of reached types reflectSeen bool // whether we have seen a reflect method call + + methodsigstmp []methodsig // scratch buffer for decoding method signatures } func (d *deadcodePass) init() { @@ -92,6 +94,7 @@ func (d *deadcodePass) init() { } func (d *deadcodePass) flood() { + var methods []methodref for !d.wq.empty() { symIdx := d.wq.pop() @@ -112,7 +115,7 @@ func (d *deadcodePass) flood() { } } - var methods []methodref + methods = methods[:0] for i := 0; i < relocs.Count(); i++ { r := relocs.At2(i) t := r.Type() @@ -330,7 +333,10 @@ func (m methodref) isExported() bool { // // Conveniently this is the layout of both runtime.method and runtime.imethod. func (d *deadcodePass) decodeMethodSig(ldr *loader.Loader, arch *sys.Arch, symIdx loader.Sym, relocs *loader.Relocs, off, size, count int) []methodsig { - var methods = make([]methodsig, count) + if cap(d.methodsigstmp) < count { + d.methodsigstmp = append(d.methodsigstmp[:0], make([]methodsig, count)...) + } + var methods = d.methodsigstmp[:count] for i := 0; i < count; i++ { methods[i].name = decodetypeName(ldr, symIdx, relocs, off) methods[i].typ = decodeRelocSym(ldr, symIdx, relocs, int32(off+4)) -- GitLab From 95848fc5c64cde2e0fc95348a861e3cab98feaa7 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 8 Jun 2020 18:38:59 -0400 Subject: [PATCH 0064/1792] [dev.link] cmd/compile, cmd/link: remove dead methods if type is not used in interface Currently, a method of a reachable type is live if it matches a method of a reachable interface. In fact, we only need to retain the method if the type is actually converted to an interface. If the type is never converted to an interface, there is no way to call the method through an interface method call (but the type descriptor could still be used, e.g. in calling runtime.newobject). A type can be used in an interface in two ways: - directly converted to interface. (Any interface counts, as it is possible to convert one interface to another.) - obtained by reflection from a related type (e.g. obtaining an interface of T from []T). For the former, we let the compiler emit a marker on the type descriptor symbol when it is converted to an interface. In the linker, we only need to check methods of marked types. For the latter, when the linker visits a marked type, it needs to visit all its "child" types as marked (i.e. potentially could be converted to interface). This reduces binary size: cmd/compile 18792016 18706096 (-0.5%) cmd/go 14120572 13398948 (-5.1%) Change-Id: I4465c7eeabf575f4dc84017214c610fa05ae31fd Reviewed-on: https://go-review.googlesource.com/c/go/+/237298 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- src/cmd/compile/internal/gc/sinit.go | 2 ++ src/cmd/compile/internal/gc/walk.go | 11 +++++++++ src/cmd/internal/goobj2/objfile.go | 20 ++++++++++++---- src/cmd/internal/obj/link.go | 7 ++++++ src/cmd/internal/obj/objfile2.go | 5 ++++ src/cmd/link/internal/ld/deadcode.go | 24 +++++++++++++++++-- src/cmd/link/internal/ld/deadcode_test.go | 17 ++++++++----- .../ld/testdata/deadcode/ifacemethod.go | 23 ++++++++++++++++++ .../ld/testdata/deadcode/ifacemethod2.go | 22 +++++++++++++++++ src/cmd/link/internal/loader/loader.go | 24 ++++++++++++++++++- src/net/http/http_test.go | 2 +- 11 files changed, 142 insertions(+), 15 deletions(-) create mode 100644 src/cmd/link/internal/ld/testdata/deadcode/ifacemethod.go create mode 100644 src/cmd/link/internal/ld/testdata/deadcode/ifacemethod2.go diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index f5d588e63b..3c7571819e 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -277,6 +277,8 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool { return Isconst(val, CTNIL) } + markTypeUsedInInterface(val.Type) + var itab *Node if l.Type.IsEmptyInterface() { itab = typename(val.Type) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 1e6d913ae6..19c185d735 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -6,6 +6,7 @@ package gc import ( "cmd/compile/internal/types" + "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/sys" "encoding/binary" @@ -797,6 +798,10 @@ opswitch: fromType := n.Left.Type toType := n.Type + if !fromType.IsInterface() { + markTypeUsedInInterface(fromType) + } + // typeword generates the type word of the interface value. typeword := func() *Node { if toType.IsEmptyInterface() { @@ -1605,6 +1610,12 @@ opswitch: return n } +// markTypeUsedInInterface marks that type t is converted to an interface. +// This information is used in the linker in dead method elimination. +func markTypeUsedInInterface(t *types.Type) { + typenamesym(t).Linksym().Set(obj.AttrUsedInIface, true) +} + // rtconvfn returns the parameter and result types that will be used by a // runtime function to convert from type src to type dst. The runtime function // name can be derived from the names of the returned types. diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index 3e6375b812..7354c219c4 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -228,12 +228,13 @@ func (p *ImportedPkg) Write(w *Writer) { // ABI uint16 // Type uint8 // Flag uint8 +// Flag2 uint8 // Siz uint32 // Align uint32 // } type Sym [SymSize]byte -const SymSize = stringRefSize + 2 + 1 + 1 + 4 + 4 +const SymSize = stringRefSize + 2 + 1 + 1 + 1 + 4 + 4 const SymABIstatic = ^uint16(0) @@ -242,6 +243,7 @@ const ( ObjFlagNeedNameExpansion // the linker needs to expand `"".` to package path in symbol names ) +// Sym.Flag const ( SymFlagDupok = 1 << iota SymFlagLocal @@ -253,6 +255,11 @@ const ( SymFlagTopFrame ) +// Sym.Flag2 +const ( + SymFlagUsedInIface = 1 << iota +) + func (s *Sym) Name(r *Reader) string { len := binary.LittleEndian.Uint32(s[:]) off := binary.LittleEndian.Uint32(s[4:]) @@ -262,8 +269,9 @@ func (s *Sym) Name(r *Reader) string { func (s *Sym) ABI() uint16 { return binary.LittleEndian.Uint16(s[8:]) } func (s *Sym) Type() uint8 { return s[10] } func (s *Sym) Flag() uint8 { return s[11] } -func (s *Sym) Siz() uint32 { return binary.LittleEndian.Uint32(s[12:]) } -func (s *Sym) Align() uint32 { return binary.LittleEndian.Uint32(s[16:]) } +func (s *Sym) Flag2() uint8 { return s[12] } +func (s *Sym) Siz() uint32 { return binary.LittleEndian.Uint32(s[13:]) } +func (s *Sym) Align() uint32 { return binary.LittleEndian.Uint32(s[17:]) } func (s *Sym) Dupok() bool { return s.Flag()&SymFlagDupok != 0 } func (s *Sym) Local() bool { return s.Flag()&SymFlagLocal != 0 } @@ -273,6 +281,7 @@ func (s *Sym) NoSplit() bool { return s.Flag()&SymFlagNoSplit != 0 } func (s *Sym) ReflectMethod() bool { return s.Flag()&SymFlagReflectMethod != 0 } func (s *Sym) IsGoType() bool { return s.Flag()&SymFlagGoType != 0 } func (s *Sym) TopFrame() bool { return s.Flag()&SymFlagTopFrame != 0 } +func (s *Sym) UsedInIface() bool { return s.Flag2()&SymFlagUsedInIface != 0 } func (s *Sym) SetName(x string, w *Writer) { binary.LittleEndian.PutUint32(s[:], uint32(len(x))) @@ -282,8 +291,9 @@ func (s *Sym) SetName(x string, w *Writer) { func (s *Sym) SetABI(x uint16) { binary.LittleEndian.PutUint16(s[8:], x) } func (s *Sym) SetType(x uint8) { s[10] = x } func (s *Sym) SetFlag(x uint8) { s[11] = x } -func (s *Sym) SetSiz(x uint32) { binary.LittleEndian.PutUint32(s[12:], x) } -func (s *Sym) SetAlign(x uint32) { binary.LittleEndian.PutUint32(s[16:], x) } +func (s *Sym) SetFlag2(x uint8) { s[12] = x } +func (s *Sym) SetSiz(x uint32) { binary.LittleEndian.PutUint32(s[13:], x) } +func (s *Sym) SetAlign(x uint32) { binary.LittleEndian.PutUint32(s[17:], x) } func (s *Sym) Write(w *Writer) { w.Bytes(s[:]) } diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index d9628bf3b9..20a9f552e7 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -514,6 +514,12 @@ const ( // new object file format). AttrIndexed + // Only applied on type descriptor symbols, UsedInIface indicates this type is + // converted to an interface. + // + // Used by the linker to determine what methods can be pruned. + AttrUsedInIface + // 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. @@ -538,6 +544,7 @@ func (a Attribute) Static() bool { return a&AttrStatic != 0 } func (a Attribute) WasInlined() bool { return a&AttrWasInlined != 0 } func (a Attribute) TopFrame() bool { return a&AttrTopFrame != 0 } func (a Attribute) Indexed() bool { return a&AttrIndexed != 0 } +func (a Attribute) UsedInIface() bool { return a&AttrUsedInIface != 0 } func (a *Attribute) Set(flag Attribute, value bool) { if value { diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 591df09015..898f0a113a 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -258,6 +258,10 @@ func (w *writer) Sym(s *LSym) { if strings.HasPrefix(s.Name, "type.") && s.Name[5] != '.' && s.Type == objabi.SRODATA { flag |= goobj2.SymFlagGoType } + flag2 := uint8(0) + if s.UsedInIface() { + flag2 |= goobj2.SymFlagUsedInIface + } name := s.Name if strings.HasPrefix(name, "gofile..") { name = filepath.ToSlash(name) @@ -271,6 +275,7 @@ func (w *writer) Sym(s *LSym) { o.SetABI(abi) o.SetType(uint8(s.Type)) o.SetFlag(flag) + o.SetFlag2(flag2) o.SetSiz(uint32(s.Size)) o.SetAlign(align) o.Write(w.Writer) diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index d59b1f2c65..1060bbca3b 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -102,8 +102,10 @@ func (d *deadcodePass) flood() { isgotype := d.ldr.IsGoType(symIdx) relocs := d.ldr.Relocs(symIdx) + var usedInIface bool if isgotype { + usedInIface = d.ldr.AttrUsedInIface(symIdx) p := d.ldr.Data(symIdx) if len(p) != 0 && decodetypeKind(d.ctxt.Arch, p)&kindMask == kindInterface { for _, sig := range d.decodeIfaceMethods(d.ldr, d.ctxt.Arch, symIdx, &relocs) { @@ -126,7 +128,9 @@ func (d *deadcodePass) flood() { if i+2 >= relocs.Count() { panic("expect three consecutive R_METHODOFF relocs") } - methods = append(methods, methodref{src: symIdx, r: i}) + if usedInIface { + methods = append(methods, methodref{src: symIdx, r: i}) + } i += 2 continue } @@ -136,7 +140,23 @@ func (d *deadcodePass) flood() { // do nothing for now as we still load all type symbols. continue } - d.mark(r.Sym(), symIdx) + rs := r.Sym() + if isgotype && usedInIface && d.ldr.IsGoType(rs) && !d.ldr.AttrUsedInIface(rs) { + // If a type is converted to an interface, it is possible to obtain an + // interface with a "child" type of it using reflection (e.g. obtain an + // interface of T from []chan T). We need to traverse its "child" types + // with UsedInIface attribute set. + // When visiting the child type (chan T in the example above), it will + // have UsedInIface set, so it in turn will mark and (re)visit its children + // (e.g. T above). + // We unset the reachable bit here, so if the child type is already visited, + // it will be visited again. + // Note that a type symbol can be visited at most twice, one without + // UsedInIface and one with. So termination is still guaranteed. + d.ldr.SetAttrUsedInIface(rs, true) + d.ldr.SetAttrReachable(rs, false) + } + d.mark(rs, symIdx) } naux := d.ldr.NAux(symIdx) for i := 0; i < naux; i++ { diff --git a/src/cmd/link/internal/ld/deadcode_test.go b/src/cmd/link/internal/ld/deadcode_test.go index 460bc16e56..59122e9603 100644 --- a/src/cmd/link/internal/ld/deadcode_test.go +++ b/src/cmd/link/internal/ld/deadcode_test.go @@ -25,11 +25,13 @@ func TestDeadcode(t *testing.T) { defer os.RemoveAll(tmpdir) tests := []struct { - src string - pattern string + src string + pos, neg string // positive and negative patterns }{ - {"reflectcall", "main.T.M"}, - {"typedesc", "type.main.T"}, + {"reflectcall", "", "main.T.M"}, + {"typedesc", "", "type.main.T"}, + {"ifacemethod", "", "main.T.M"}, + {"ifacemethod2", "main.T.M", ""}, } for _, test := range tests { test := test @@ -42,8 +44,11 @@ func TestDeadcode(t *testing.T) { if err != nil { t.Fatalf("%v: %v:\n%s", cmd.Args, err, out) } - if bytes.Contains(out, []byte(test.pattern)) { - t.Errorf("%s should not be reachable. Output:\n%s", test.pattern, out) + if test.pos != "" && !bytes.Contains(out, []byte(test.pos)) { + t.Errorf("%s should be reachable. Output:\n%s", test.pos, out) + } + if test.neg != "" && bytes.Contains(out, []byte(test.neg)) { + t.Errorf("%s should not be reachable. Output:\n%s", test.neg, out) } }) } diff --git a/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod.go b/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod.go new file mode 100644 index 0000000000..b62f18c342 --- /dev/null +++ b/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod.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. + +// Test that a method of a reachable type is not necessarily +// live even if it matches an interface method, as long as +// the type is never converted to an interface. + +package main + +type I interface{ M() } + +type T int + +func (T) M() { println("XXX") } + +var p *T +var e interface{} + +func main() { + p = new(T) // used T, but never converted to interface + e.(I).M() // used I and I.M +} diff --git a/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod2.go b/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod2.go new file mode 100644 index 0000000000..48ba55d35e --- /dev/null +++ b/src/cmd/link/internal/ld/testdata/deadcode/ifacemethod2.go @@ -0,0 +1,22 @@ +// 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. + +// Test that a method *is* live if it matches an interface +// method and the type is "indirectly" converted to an +// interface through reflection. + +package main + +import "reflect" + +type I interface{ M() } + +type T int + +func (T) M() { println("XXX") } + +func main() { + e := reflect.ValueOf([]T{1}).Index(0).Interface() + e.(I).M() +} diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index f87776ef12..7cebe23065 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -244,7 +244,8 @@ type Loader struct { attrReachable Bitmap // reachable symbols, indexed by global index attrOnList Bitmap // "on list" symbols, indexed by global index attrLocal Bitmap // "local" symbols, indexed by global index - attrNotInSymbolTable Bitmap // "not in symtab" symbols, indexed by glob idx + attrNotInSymbolTable Bitmap // "not in symtab" symbols, indexed by global idx + attrUsedInIface Bitmap // "used in interface" 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 @@ -768,6 +769,20 @@ func (l *Loader) SetAttrLocal(i Sym, v bool) { } } +// AttrUsedInIface returns true for a type symbol that is used in +// an interface. +func (l *Loader) AttrUsedInIface(i Sym) bool { + return l.attrUsedInIface.Has(i) +} + +func (l *Loader) SetAttrUsedInIface(i Sym, v bool) { + if v { + l.attrUsedInIface.Set(i) + } else { + l.attrUsedInIface.Unset(i) + } +} + // SymAddr checks that a symbol is reachable, and returns its value. func (l *Loader) SymAddr(i Sym) int64 { if !l.AttrReachable(i) { @@ -1665,6 +1680,7 @@ func (l *Loader) growAttrBitmaps(reqLen int) { l.attrOnList = growBitmap(reqLen, l.attrOnList) l.attrLocal = growBitmap(reqLen, l.attrLocal) l.attrNotInSymbolTable = growBitmap(reqLen, l.attrNotInSymbolTable) + l.attrUsedInIface = growBitmap(reqLen, l.attrUsedInIface) } l.growExtAttrBitmaps() } @@ -1983,6 +1999,9 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { if osym.Local() { l.SetAttrLocal(gi, true) } + if osym.UsedInIface() { + l.SetAttrUsedInIface(gi, true) + } if strings.HasPrefix(name, "go.itablink.") { l.itablink[gi] = struct{}{} } @@ -2025,6 +2044,9 @@ func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { if osym.Local() { l.SetAttrLocal(gi, true) } + if osym.UsedInIface() { + l.SetAttrUsedInIface(gi, true) + } l.preprocess(arch, gi, name) } } diff --git a/src/net/http/http_test.go b/src/net/http/http_test.go index f4ea52db3b..49c2b4196a 100644 --- a/src/net/http/http_test.go +++ b/src/net/http/http_test.go @@ -91,7 +91,7 @@ func TestCmdGoNoHTTPServer(t *testing.T) { } wantSym := map[string]bool{ // Verify these exist: (sanity checking this test) - "net/http.(*Client).Get": true, + "net/http.(*Client).do": true, "net/http.(*Transport).RoundTrip": true, // Verify these don't exist: -- GitLab From 96354f15167dd20c1d1cb4a4a55f8c3330ef3bd8 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 16 Jun 2020 16:58:28 -0400 Subject: [PATCH 0065/1792] [dev.link] cmd/internal/goobj2: fix comment Fix a stale comment. Change-Id: Ic14616310cd8e8703cfc7b1ce50c411be34488fa Reviewed-on: https://go-review.googlesource.com/c/go/+/238243 Reviewed-by: Cherry Zhang --- src/cmd/internal/goobj2/objfile.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index 7354c219c4..433eafa559 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -139,7 +139,7 @@ func (fp FingerprintType) IsZero() bool { return fp == FingerprintType{} } // Package Index. const ( PkgIdxNone = (1<<31 - 1) - iota // Non-package symbols - PkgIdxBuiltin // Predefined symbols // TODO: not used for now, we could use it for compiler-generated symbols like runtime.newobject + PkgIdxBuiltin // Predefined runtime symbols (ex: runtime.newobject) PkgIdxSelf // Symbols defined in the current package PkgIdxInvalid = 0 // The index of other referenced packages starts from 1. -- GitLab From ef9e8fbfbc904b2c49cdf4fc7524aaf0f059f2da Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 10 Jun 2020 09:57:10 -0400 Subject: [PATCH 0066/1792] [dev.link] cmd/link: remove dwarf2.go Relocate the last few functions in dwarf2.go to dwarf.go, and remove dwarf2.go. No change in functionality. Change-Id: Id1b5f0d1c496d5912b955b8ba942e33bc43aa93b Reviewed-on: https://go-review.googlesource.com/c/go/+/237425 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/dwarf.go | 160 ++++++++++++++++++++++++++--- src/cmd/link/internal/ld/dwarf2.go | 149 --------------------------- 2 files changed, 144 insertions(+), 165 deletions(-) delete mode 100644 src/cmd/link/internal/ld/dwarf2.go diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 617f96858c..78162515d3 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -175,6 +175,10 @@ func (c dwctxt) RecordChildDieOffsets(s dwarf.Sym, vars []*dwarf.Var, offsets [] panic("should be used only in the compiler") } +func isDwarf64(ctxt *Link) bool { + return ctxt.HeadType == objabi.Haix +} + var gdbscript string // dwarfSecInfo holds information about a DWARF output section, @@ -2130,6 +2134,146 @@ func (d *dwctxt) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo { return dwarfSecInfo{syms: append([]loader.Sym{locsym}, syms...)} } +/* + * Elf. + */ +func dwarfaddshstrings(ctxt *Link, shstrtab *loader.SymbolBuilder) { + if *FlagW { // disable dwarf + return + } + + secs := []string{"abbrev", "frame", "info", "loc", "line", "pubnames", "pubtypes", "gdb_scripts", "ranges"} + for _, sec := range secs { + shstrtab.Addstring(".debug_" + sec) + if ctxt.IsExternal() { + shstrtab.Addstring(elfRelType + ".debug_" + sec) + } else { + shstrtab.Addstring(".zdebug_" + sec) + } + } +} + +func dwarfaddelfsectionsyms(ctxt *Link) { + if *FlagW { // disable dwarf + return + } + if ctxt.LinkMode != LinkExternal { + return + } + + ldr := ctxt.loader + for _, si := range dwarfp { + s := si.secSym() + sect := ldr.SymSect(si.secSym()) + putelfsectionsym(ctxt, ctxt.Out, s, sect.Elfsect.(*ElfShdr).shnum) + } +} + +// dwarfcompress compresses the DWARF sections. Relocations are applied +// on the fly. After this, dwarfp will contain a different (new) set of +// symbols, and sections may have been replaced. +func dwarfcompress(ctxt *Link) { + // compressedSect is a helper type for parallelizing compression. + type compressedSect struct { + index int + compressed []byte + syms []loader.Sym + } + + supported := ctxt.IsELF || ctxt.IsWindows() || ctxt.IsDarwin() + if !ctxt.compressDWARF || !supported || ctxt.IsExternal() { + return + } + + var compressedCount int + resChannel := make(chan compressedSect) + for i := range dwarfp { + go func(resIndex int, syms []loader.Sym) { + resChannel <- compressedSect{resIndex, compressSyms(ctxt, syms), syms} + }(compressedCount, dwarfp[i].syms) + compressedCount++ + } + res := make([]compressedSect, compressedCount) + for ; compressedCount > 0; compressedCount-- { + r := <-resChannel + res[r.index] = r + } + + ldr := ctxt.loader + var newDwarfp []dwarfSecInfo + Segdwarf.Sections = Segdwarf.Sections[:0] + for _, z := range res { + s := z.syms[0] + if z.compressed == nil { + // Compression didn't help. + ds := dwarfSecInfo{syms: z.syms} + newDwarfp = append(newDwarfp, ds) + Segdwarf.Sections = append(Segdwarf.Sections, ldr.SymSect(s)) + } else { + compressedSegName := ".zdebug_" + ldr.SymSect(s).Name[len(".debug_"):] + sect := addsection(ctxt.loader, ctxt.Arch, &Segdwarf, compressedSegName, 04) + sect.Align = 1 + sect.Length = uint64(len(z.compressed)) + newSym := ldr.CreateSymForUpdate(compressedSegName, 0) + newSym.SetReachable(true) + newSym.SetData(z.compressed) + newSym.SetSize(int64(len(z.compressed))) + ldr.SetSymSect(newSym.Sym(), sect) + ds := dwarfSecInfo{syms: []loader.Sym{newSym.Sym()}} + newDwarfp = append(newDwarfp, ds) + + // compressed symbols are no longer needed. + for _, s := range z.syms { + ldr.SetAttrReachable(s, false) + ldr.FreeSym(s) + } + } + } + dwarfp = newDwarfp + + // Re-compute the locations of the compressed DWARF symbols + // and sections, since the layout of these within the file is + // based on Section.Vaddr and Symbol.Value. + pos := Segdwarf.Vaddr + var prevSect *sym.Section + for _, si := range dwarfp { + for _, s := range si.syms { + ldr.SetSymValue(s, int64(pos)) + sect := ldr.SymSect(s) + if sect != prevSect { + sect.Vaddr = uint64(pos) + prevSect = sect + } + if ldr.SubSym(s) != 0 { + log.Fatalf("%s: unexpected sub-symbols", ldr.SymName(s)) + } + pos += uint64(ldr.SymSize(s)) + if ctxt.IsWindows() { + pos = uint64(Rnd(int64(pos), PEFILEALIGN)) + } + } + } + Segdwarf.Length = pos - Segdwarf.Vaddr +} + +type compilationUnitByStartPC []*sym.CompilationUnit + +func (v compilationUnitByStartPC) Len() int { return len(v) } +func (v compilationUnitByStartPC) Swap(i, j int) { v[i], v[j] = v[j], v[i] } + +func (v compilationUnitByStartPC) Less(i, j int) bool { + switch { + case len(v[i].Textp) == 0 && len(v[j].Textp) == 0: + return v[i].Lib.Pkg < v[j].Lib.Pkg + case len(v[i].Textp) != 0 && len(v[j].Textp) == 0: + return true + case len(v[i].Textp) == 0 && len(v[j].Textp) != 0: + return false + default: + return v[i].PCs[0].Start < v[j].PCs[0].Start + } +} + // getPkgFromCUSym returns the package name for the compilation unit // represented by s. // The prefix dwarf.InfoPrefix+".pkg." needs to be removed in order to get @@ -2157,19 +2301,3 @@ func saveDwsectCUSize(sname string, pkgname string, size uint64) { func addDwsectCUSize(sname string, pkgname string, size uint64) { dwsectCUSize[sname+"."+pkgname] += size } - -func dwarfaddelfsectionsyms(ctxt *Link) { - if *FlagW { // disable dwarf - return - } - if ctxt.LinkMode != LinkExternal { - return - } - - ldr := ctxt.loader - for _, si := range dwarfp { - s := si.secSym() - sect := ldr.SymSect(si.secSym()) - putelfsectionsym(ctxt, ctxt.Out, s, sect.Elfsect.(*ElfShdr).shnum) - } -} diff --git a/src/cmd/link/internal/ld/dwarf2.go b/src/cmd/link/internal/ld/dwarf2.go deleted file mode 100644 index 0c1a0ca221..0000000000 --- a/src/cmd/link/internal/ld/dwarf2.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// TODO/NICETOHAVE: -// - eliminate DW_CLS_ if not used -// - package info in compilation units -// - assign types to their packages -// - gdb uses c syntax, meaning clumsy quoting is needed for go identifiers. eg -// ptype struct '[]uint8' and qualifiers need to be quoted away -// - file:line info for variables -// - make strings a typedef so prettyprinters can see the underlying string type - -package ld - -import ( - "cmd/internal/objabi" - "cmd/link/internal/loader" - "cmd/link/internal/sym" - "log" -) - -func isDwarf64(ctxt *Link) bool { - return ctxt.HeadType == objabi.Haix -} - -/* - * Elf. - */ -func dwarfaddshstrings(ctxt *Link, shstrtab *loader.SymbolBuilder) { - if *FlagW { // disable dwarf - return - } - - secs := []string{"abbrev", "frame", "info", "loc", "line", "pubnames", "pubtypes", "gdb_scripts", "ranges"} - for _, sec := range secs { - shstrtab.Addstring(".debug_" + sec) - if ctxt.IsExternal() { - shstrtab.Addstring(elfRelType + ".debug_" + sec) - } else { - shstrtab.Addstring(".zdebug_" + sec) - } - } -} - -// dwarfcompress compresses the DWARF sections. Relocations are applied -// on the fly. After this, dwarfp will contain a different (new) set of -// symbols, and sections may have been replaced. -func dwarfcompress(ctxt *Link) { - // compressedSect is a helper type for parallelizing compression. - type compressedSect struct { - index int - compressed []byte - syms []loader.Sym - } - - supported := ctxt.IsELF || ctxt.IsWindows() || ctxt.IsDarwin() - if !ctxt.compressDWARF || !supported || ctxt.IsExternal() { - return - } - - var compressedCount int - resChannel := make(chan compressedSect) - for i := range dwarfp { - go func(resIndex int, syms []loader.Sym) { - resChannel <- compressedSect{resIndex, compressSyms(ctxt, syms), syms} - }(compressedCount, dwarfp[i].syms) - compressedCount++ - } - res := make([]compressedSect, compressedCount) - for ; compressedCount > 0; compressedCount-- { - r := <-resChannel - res[r.index] = r - } - - ldr := ctxt.loader - var newDwarfp []dwarfSecInfo - Segdwarf.Sections = Segdwarf.Sections[:0] - for _, z := range res { - s := z.syms[0] - if z.compressed == nil { - // Compression didn't help. - ds := dwarfSecInfo{syms: z.syms} - newDwarfp = append(newDwarfp, ds) - Segdwarf.Sections = append(Segdwarf.Sections, ldr.SymSect(s)) - } else { - compressedSegName := ".zdebug_" + ldr.SymSect(s).Name[len(".debug_"):] - sect := addsection(ctxt.loader, ctxt.Arch, &Segdwarf, compressedSegName, 04) - sect.Align = 1 - sect.Length = uint64(len(z.compressed)) - newSym := ldr.CreateSymForUpdate(compressedSegName, 0) - newSym.SetReachable(true) - newSym.SetData(z.compressed) - newSym.SetSize(int64(len(z.compressed))) - ldr.SetSymSect(newSym.Sym(), sect) - ds := dwarfSecInfo{syms: []loader.Sym{newSym.Sym()}} - newDwarfp = append(newDwarfp, ds) - - // compressed symbols are no longer needed. - for _, s := range z.syms { - ldr.SetAttrReachable(s, false) - ldr.FreeSym(s) - } - } - } - dwarfp = newDwarfp - - // Re-compute the locations of the compressed DWARF symbols - // and sections, since the layout of these within the file is - // based on Section.Vaddr and Symbol.Value. - pos := Segdwarf.Vaddr - var prevSect *sym.Section - for _, si := range dwarfp { - for _, s := range si.syms { - ldr.SetSymValue(s, int64(pos)) - sect := ldr.SymSect(s) - if sect != prevSect { - sect.Vaddr = uint64(pos) - prevSect = sect - } - if ldr.SubSym(s) != 0 { - log.Fatalf("%s: unexpected sub-symbols", ldr.SymName(s)) - } - pos += uint64(ldr.SymSize(s)) - if ctxt.IsWindows() { - pos = uint64(Rnd(int64(pos), PEFILEALIGN)) - } - } - } - Segdwarf.Length = pos - Segdwarf.Vaddr -} - -type compilationUnitByStartPC []*sym.CompilationUnit - -func (v compilationUnitByStartPC) Len() int { return len(v) } -func (v compilationUnitByStartPC) Swap(i, j int) { v[i], v[j] = v[j], v[i] } - -func (v compilationUnitByStartPC) Less(i, j int) bool { - switch { - case len(v[i].Textp) == 0 && len(v[j].Textp) == 0: - return v[i].Lib.Pkg < v[j].Lib.Pkg - case len(v[i].Textp) != 0 && len(v[j].Textp) == 0: - return true - case len(v[i].Textp) == 0 && len(v[j].Textp) != 0: - return false - default: - return v[i].PCs[0].Start < v[j].PCs[0].Start - } -} -- GitLab From 188e995ae9de004322d3f822f70dc9d814e2c03b Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 15 Jun 2020 15:16:51 -0400 Subject: [PATCH 0067/1792] [dev.link] cmd/link: reduce alignment requirement for symtab/elfstr The linker's asmb phase for ELF has a chunk of code that decides where to place the .symtab and .strtab sections, which appear after after the DWARF data; this code currently tries to align the start of the .symtab section using the value of -R (stored in *FlagRound). This patch gets rid of this additional alignment and instead just aligns .symtab by pointer size. The -R value is needed for loadable segments/sections (such as text or data), not for non-loadable sections (e.g. symtab). On most architectures the *FlagRound value is 4k, however on ARM64 it is 64k, meaning that aligning symtab on this boundary can waste a good chunk of space. Change-Id: Ib51f3ad5611f5614768355eb8533084ba117a8e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/238019 Reviewed-by: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/elf.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index b100d07e6f..f5a57cb96e 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1783,7 +1783,7 @@ func asmbElf(ctxt *Link) { var symo int64 if !*FlagS { symo = int64(Segdwarf.Fileoff + Segdwarf.Filelen) - symo = Rnd(symo, int64(*FlagRound)) + symo = Rnd(symo, int64(ctxt.Arch.PtrSize)) ctxt.Out.SeekSet(symo) asmElfSym(ctxt) ctxt.Out.Write(Elfstrdat) -- GitLab From bc1dbe58cf35454b4f8f981707013fd868c6ce6f Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 10 Jun 2020 10:05:37 -0400 Subject: [PATCH 0068/1792] [dev.link] cmd/link: stop emitting .debug_pubnames/.debug_pubtypes Don't emit the .debug_pubnames/.debug_pubtypes sections. These sections are not used by either GDB or Delve, and C++ compilers [notably GCC and Clang] no longer emit the sections by default. Change-Id: Ic3309755e88c8e1aa28a29366bc7f0df1748fe64 Reviewed-on: https://go-review.googlesource.com/c/go/+/237426 Reviewed-by: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/dwarf.go | 101 ++---------------------------- 1 file changed, 6 insertions(+), 95 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 78162515d3..da05d1bd2e 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1518,7 +1518,7 @@ func appendSyms(syms []loader.Sym, src []sym.LoaderSym) []loader.Sym { return syms } -func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, pubNames, pubTypes *pubWriter) dwarfSecInfo { +func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym) dwarfSecInfo { infosec := d.ldr.LookupOrCreateSym(".debug_info", 0) disu := d.ldr.MakeSymbolUpdater(infosec) @@ -1535,9 +1535,6 @@ func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, p continue } - pubNames.beginCompUnit(compunit) - pubTypes.beginCompUnit(compunit) - // Write .debug_info Compilation Unit Header (sec 7.5.1) // Fields marked with (*) must be changed for 64-bit dwarf // This must match COMPUNITHEADERSIZE above. @@ -1568,12 +1565,6 @@ func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, p l := len(cu) lastSymSz := int64(len(d.ldr.Data(cu[l-1]))) cu = d.putdie(cu, die) - if ispubname(die) { - pubNames.add(die, cusize) - } - if ispubtype(die) { - pubTypes.add(die, cusize) - } if lastSymSz != int64(len(d.ldr.Data(cu[l-1]))) { // putdie will sometimes append directly to the last symbol of the list cusize = cusize - lastSymSz + int64(len(d.ldr.Data(cu[l-1]))) @@ -1598,87 +1589,12 @@ func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, p cusize -= 4 // exclude the length field. su.SetUint32(d.arch, 0, uint32(cusize)) } - pubNames.endCompUnit(compunit, uint32(cusize)+4) - pubTypes.endCompUnit(compunit, uint32(cusize)+4) syms = append(syms, cu...) } return dwarfSecInfo{syms: syms} } -/* - * Emit .debug_pubnames/_types. _info must have been written before, - * because we need die->offs and infoo/infosize; - */ - -type pubWriter struct { - d *dwctxt - s loader.Sym - su *loader.SymbolBuilder - sname string - - sectionstart int64 - culengthOff int64 -} - -func newPubWriter(d *dwctxt, sname string) *pubWriter { - s := d.ldr.LookupOrCreateSym(sname, 0) - u := d.ldr.MakeSymbolUpdater(s) - u.SetType(sym.SDWARFSECT) - return &pubWriter{d: d, s: s, su: u, sname: sname} -} - -func (pw *pubWriter) beginCompUnit(compunit *dwarf.DWDie) { - pw.sectionstart = pw.su.Size() - - // Write .debug_pubnames/types Header (sec 6.1.1) - pw.d.createUnitLength(pw.su, 0) // unit_length (*), will be filled in later. - pw.su.AddUint16(pw.d.arch, 2) // dwarf version (appendix F) - pw.d.addDwarfAddrRef(pw.su, pw.d.dtolsym(compunit.Sym)) // debug_info_offset (of the Comp unit Header) - pw.culengthOff = pw.su.Size() - pw.d.addDwarfAddrField(pw.su, uint64(0)) // debug_info_length, will be filled in later. -} - -func (pw *pubWriter) add(die *dwarf.DWDie, offset int64) { - dwa := getattr(die, dwarf.DW_AT_name) - name := dwa.Data.(string) - if pw.d.dtolsym(die.Sym) == 0 { - fmt.Println("Missing sym for ", name) - } - pw.d.addDwarfAddrField(pw.su, uint64(offset)) - pw.su.Addstring(name) -} - -func (pw *pubWriter) endCompUnit(compunit *dwarf.DWDie, culength uint32) { - pw.d.addDwarfAddrField(pw.su, 0) // Null offset - - // On AIX, save the current size of this compilation unit. - if pw.d.linkctxt.HeadType == objabi.Haix { - saveDwsectCUSize(pw.sname, pw.d.getPkgFromCUSym(pw.d.dtolsym(compunit.Sym)), uint64(pw.su.Size()-pw.sectionstart)) - } - if isDwarf64(pw.d.linkctxt) { - pw.su.SetUint(pw.d.arch, pw.sectionstart+4, uint64(pw.su.Size()-pw.sectionstart)-12) // exclude the length field. - pw.su.SetUint(pw.d.arch, pw.culengthOff, uint64(culength)) - } else { - pw.su.SetUint32(pw.d.arch, pw.sectionstart, uint32(pw.su.Size()-pw.sectionstart)-4) // exclude the length field. - pw.su.SetUint32(pw.d.arch, pw.culengthOff, culength) - } -} - -func ispubname(die *dwarf.DWDie) bool { - switch die.Abbrev { - case dwarf.DW_ABRV_FUNCTION, dwarf.DW_ABRV_VARIABLE: - a := getattr(die, dwarf.DW_AT_external) - return a != nil && a.Value != 0 - } - - return false -} - -func ispubtype(die *dwarf.DWDie) bool { - return die.Abbrev >= dwarf.DW_ABRV_NULLTYPE -} - func (d *dwctxt) writegdbscript() dwarfSecInfo { // TODO (aix): make it available if d.linkctxt.HeadType == objabi.Haix { @@ -2019,9 +1935,9 @@ func dwarfGenerateDebugInfo(ctxt *Link) { // every DIE constructed and convert the symbols. } -// dwarfGenerateDebugSyms constructs debug_line, debug_frame, debug_loc, -// debug_pubnames and debug_pubtypes. It also writes out the debug_info -// section using symbols generated in dwarfGenerateDebugInfo2. +// dwarfGenerateDebugSyms constructs debug_line, debug_frame, and +// debug_loc. It also writes out the debug_info section using symbols +// generated in dwarfGenerateDebugInfo2. func dwarfGenerateDebugSyms(ctxt *Link) { if !dwarfEnabled(ctxt) { return @@ -2070,15 +1986,10 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { reversetree(&dwtypes.Child) movetomodule(d.linkctxt, &dwtypes) - pubNames := newPubWriter(d, ".debug_pubnames") - pubTypes := newPubWriter(d, ".debug_pubtypes") - - infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym(), pubNames, pubTypes) + infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym()) framesSec := d.writeframes() dwarfp = append(dwarfp, framesSec) - dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{pubNames.s}}) - dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{pubTypes.s}}) gdbScriptSec := d.writegdbscript() if gdbScriptSec.secSym() != 0 { dwarfp = append(dwarfp, gdbScriptSec) @@ -2142,7 +2053,7 @@ func dwarfaddshstrings(ctxt *Link, shstrtab *loader.SymbolBuilder) { return } - secs := []string{"abbrev", "frame", "info", "loc", "line", "pubnames", "pubtypes", "gdb_scripts", "ranges"} + secs := []string{"abbrev", "frame", "info", "loc", "line", "gdb_scripts", "ranges"} for _, sec := range secs { shstrtab.Addstring(".debug_" + sec) if ctxt.IsExternal() { -- GitLab From d08bab99b74b6da2f10e16fdcd4fb4b410ae07cb Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 10 Jun 2020 13:14:15 -0400 Subject: [PATCH 0069/1792] [dev.link] cmd/link: rework line table generation to reduce heap mem Rework the way symbols are handled in DWARF line table generation to eliminate copying the data payload for all SWDWARFLINES syms (emitted by the compiler) into the payload of the ".debug_line" section symbol (generated by the linker). Instead, chain together the SWDWARFLINES symbols into a list, then append that list to the section sym list in dwarfp (this moves us from a single monolithic .debug_line to a .debug_line section sym followed by a list symbols (one per function and an epilog symbol per compilation unit). To enable this work, move the emission of the DW_LNE_set_address op (at the start of each function) from the linker to the compiler. Change-Id: Iec61b44a451f7a386c82a89bf944de482b018789 Reviewed-on: https://go-review.googlesource.com/c/go/+/237427 Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/internal/obj/dwarf.go | 7 +++ src/cmd/link/internal/ld/dwarf.go | 80 +++++++++++++++++-------------- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/src/cmd/internal/obj/dwarf.go b/src/cmd/internal/obj/dwarf.go index 4118c6442c..1811ac7881 100644 --- a/src/cmd/internal/obj/dwarf.go +++ b/src/cmd/internal/obj/dwarf.go @@ -44,6 +44,13 @@ func (ctxt *Link) generateDebugLinesSymbol(s, lines *LSym) { } } + // Emit a LNE_set_address extended opcode, so as to establish the + // starting text address of this function. + dctxt.AddUint8(lines, 0) + dwarf.Uleb128put(dctxt, lines, 1+int64(ctxt.Arch.PtrSize)) + dctxt.AddUint8(lines, dwarf.DW_LNE_set_address) + dctxt.AddAddress(lines, s, 0) + // Set up the debug_lines state machine. // NB: This state machine is reset to this state when we've finished // generating the line table. See below. diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index da05d1bd2e..89dd4b37f1 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1172,7 +1172,14 @@ func expandFile(fname string) string { return expandGoroot(fname) } -func (d *dwctxt) writelines(unit *sym.CompilationUnit, ls loader.Sym) { +// writelines collects up and chains together the symbols needed to +// form the DWARF line table for the specified compilation unit, +// appends them to the list 'syms' and returns the updated list. +// Additions will include an initial symbol containing the line table +// header and prolog (with file table), then a series of +// compiler-emitted line table symbols (one per live function), and +// finally an epilog symbol containing an end-of-sequence operator. +func (d *dwctxt) writelines(unit *sym.CompilationUnit, syms []loader.Sym) []loader.Sym { is_stmt := uint8(1) // initially = recommended default_is_stmt = 1, tracks is_stmt toggles. @@ -1180,17 +1187,18 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, ls loader.Sym) { headerstart := int64(-1) headerend := int64(-1) + ls := d.ldr.CreateExtSym("", 0) + syms = append(syms, ls) + d.ldr.SetAttrNotInSymbolTable(ls, true) + d.ldr.SetAttrReachable(ls, true) lsu := d.ldr.MakeSymbolUpdater(ls) - newattr(unit.DWInfo, dwarf.DW_AT_stmt_list, dwarf.DW_CLS_PTR, lsu.Size(), dwSym(ls)) - - internalExec := d.linkctxt.BuildMode == BuildModeExe && d.linkctxt.IsInternal() - addAddrPlus := loader.GenAddAddrPlusFunc(internalExec) + lsu.SetType(sym.SDWARFLINES) + newattr(unit.DWInfo, dwarf.DW_AT_stmt_list, dwarf.DW_CLS_PTR, 0, dwSym(ls)) // Write .debug_line Line Number Program Header (sec 6.2.4) // Fields marked with (*) must be changed for 64-bit dwarf unitLengthOffset := lsu.Size() d.createUnitLength(lsu, 0) // unit_length (*), filled in at end - unitstart = lsu.Size() lsu.AddUint16(d.arch, 2) // dwarf version (appendix F) -- version 3 is incompatible w/ XCode 9.0's dsymutil, latest supported on OSX 10.12 as of 2018-05 headerLengthOffset := lsu.Size() @@ -1245,36 +1253,31 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, ls loader.Sym) { lsu.AddUint8(0) // terminate file_names. headerend = lsu.Size() + unitlen := lsu.Size() - unitstart // Output the state machine for each function remaining. - var lastAddr int64 for _, s := range unit.Textp { fnSym := loader.Sym(s) - - // Set the PC. - lsu.AddUint8(0) - dwarf.Uleb128put(d, lsDwsym, 1+int64(d.arch.PtrSize)) - lsu.AddUint8(dwarf.DW_LNE_set_address) - addr := addAddrPlus(lsu, d.arch, fnSym, 0) - // Make sure the units are sorted. - if addr < lastAddr { - d.linkctxt.Errorf(fnSym, "address wasn't increasing %x < %x", - addr, lastAddr) - } - lastAddr = addr - - // Output the line table. - // TODO: Now that we have all the debug information in separate - // symbols, it would make sense to use a rope, and concatenate them all - // together rather then the append() below. This would allow us to have - // the compiler emit the DW_LNE_set_address and a rope data structure - // to concat them all together in the output. _, _, _, lines := d.ldr.GetFuncDwarfAuxSyms(fnSym) + + // Chain the line symbol onto the list. if lines != 0 { - lsu.AddBytes(d.ldr.Data(lines)) + syms = append(syms, lines) + unitlen += int64(len(d.ldr.Data(lines))) } } + // NB: at some point if we have an end sequence op + // after each function (to enable reordering) generated + // in the compiler, we can get rid of this. + epilogsym := d.ldr.CreateExtSym("", 0) + syms = append(syms, epilogsym) + d.ldr.SetAttrNotInSymbolTable(epilogsym, true) + d.ldr.SetAttrReachable(epilogsym, true) + elsu := d.ldr.MakeSymbolUpdater(epilogsym) + elsu.SetType(sym.SDWARFLINES) + elsDwsym := dwSym(epilogsym) + // Issue 38192: the DWARF standard specifies that when you issue // an end-sequence op, the PC value should be one past the last // text address in the translation unit, so apply a delta to the @@ -1283,24 +1286,28 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, ls loader.Sym) { // table, which we don't want. The 1 + ptrsize amount is somewhat // arbitrary, this is chosen to be consistent with the way LLVM // emits its end sequence ops. - lsu.AddUint8(dwarf.DW_LNS_advance_pc) - dwarf.Uleb128put(d, lsDwsym, int64(1+d.arch.PtrSize)) + elsu.AddUint8(dwarf.DW_LNS_advance_pc) + dwarf.Uleb128put(d, elsDwsym, int64(1+d.arch.PtrSize)) // Emit an end-sequence at the end of the unit. - lsu.AddUint8(0) // start extended opcode - dwarf.Uleb128put(d, lsDwsym, 1) - lsu.AddUint8(dwarf.DW_LNE_end_sequence) + elsu.AddUint8(0) // start extended opcode + dwarf.Uleb128put(d, elsDwsym, 1) + elsu.AddUint8(dwarf.DW_LNE_end_sequence) + unitlen += elsu.Size() if d.linkctxt.HeadType == objabi.Haix { - saveDwsectCUSize(".debug_line", unit.Lib.Pkg, uint64(lsu.Size()-unitLengthOffset)) + saveDwsectCUSize(".debug_line", unit.Lib.Pkg, uint64(unitlen)) } + if isDwarf64(d.linkctxt) { - lsu.SetUint(d.arch, unitLengthOffset+4, uint64(lsu.Size()-unitstart)) // +4 because of 0xFFFFFFFF + lsu.SetUint(d.arch, unitLengthOffset+4, uint64(unitlen)) // +4 because of 0xFFFFFFFF lsu.SetUint(d.arch, headerLengthOffset, uint64(headerend-headerstart)) } else { - lsu.SetUint32(d.arch, unitLengthOffset, uint32(lsu.Size()-unitstart)) + lsu.SetUint32(d.arch, unitLengthOffset, uint32(unitlen)) lsu.SetUint32(d.arch, headerLengthOffset, uint32(headerend-headerstart)) } + + return syms } // writepcranges generates the DW_AT_ranges table for compilation unit cu. @@ -1963,6 +1970,7 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { dlu.SetType(sym.SDWARFSECT) d.ldr.SetAttrReachable(debugLine, true) dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{debugLine}}) + linesec := &dwarfp[len(dwarfp)-1] debugRanges := d.ldr.LookupOrCreateSym(".debug_ranges", 0) dru := d.ldr.MakeSymbolUpdater(debugRanges) @@ -1975,7 +1983,7 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { if u.DWInfo.Abbrev == dwarf.DW_ABRV_COMPUNIT_TEXTLESS { continue } - d.writelines(u, debugLine) + linesec.syms = d.writelines(u, linesec.syms) base := loader.Sym(u.Textp[0]) d.writepcranges(u, base, u.PCs, debugRanges) } -- GitLab From 27144d166b25de731bc26ee5bce861e4574b81bb Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 11 Jun 2020 14:48:08 -0400 Subject: [PATCH 0070/1792] [dev.link] cmd/link: refactor dwarf gen methods to be comp-unit centric Refactor some of the linker's DWARF generation methods so as to have helper routines that do all the work for a given comp unit for a given section (range, loc, etc). No change in functionality, this is just a reorg in preparation for a later patch in this sequence. Change-Id: I86fc789220326a4e522904a5924c8971d6757189 Reviewed-on: https://go-review.googlesource.com/c/go/+/237677 Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/dwarf.go | 187 ++++++++++++++++-------------- 1 file changed, 99 insertions(+), 88 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 89dd4b37f1..d55148d9aa 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1356,8 +1356,7 @@ func appendPCDeltaCFA(arch *sys.Arch, b []byte, deltapc, cfa int64) []byte { return b } -func (d *dwctxt) writeframes() dwarfSecInfo { - fs := d.ldr.LookupOrCreateSym(".debug_frame", 0) +func (d *dwctxt) writeframes(fs loader.Sym) dwarfSecInfo { fsd := dwSym(fs) fsu := d.ldr.MakeSymbolUpdater(fs) fsu.SetType(sym.SDWARFSECT) @@ -1525,78 +1524,83 @@ func appendSyms(syms []loader.Sym, src []sym.LoaderSym) []loader.Sym { return syms } -func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym) dwarfSecInfo { - - infosec := d.ldr.LookupOrCreateSym(".debug_info", 0) - disu := d.ldr.MakeSymbolUpdater(infosec) - disu.SetType(sym.SDWARFCUINFO) - d.ldr.SetAttrReachable(infosec, true) - syms := []loader.Sym{infosec} +func (d *dwctxt) writeUnitInfo(u *sym.CompilationUnit, abbrevsym loader.Sym) []loader.Sym { + syms := []loader.Sym{} + if len(u.Textp) == 0 && u.DWInfo.Child == nil { + return syms + } - for _, u := range units { - compunit := u.DWInfo - s := d.dtolsym(compunit.Sym) - su := d.ldr.MakeSymbolUpdater(s) + compunit := u.DWInfo + s := d.dtolsym(compunit.Sym) + su := d.ldr.MakeSymbolUpdater(s) - if len(u.Textp) == 0 && u.DWInfo.Child == nil { - continue - } + // Write .debug_info Compilation Unit Header (sec 7.5.1) + // Fields marked with (*) must be changed for 64-bit dwarf + // This must match COMPUNITHEADERSIZE above. + d.createUnitLength(su, 0) // unit_length (*), will be filled in later. + su.AddUint16(d.arch, 4) // dwarf version (appendix F) - // Write .debug_info Compilation Unit Header (sec 7.5.1) - // Fields marked with (*) must be changed for 64-bit dwarf - // This must match COMPUNITHEADERSIZE above. - d.createUnitLength(su, 0) // unit_length (*), will be filled in later. - su.AddUint16(d.arch, 4) // dwarf version (appendix F) + // debug_abbrev_offset (*) + d.addDwarfAddrRef(su, abbrevsym) - // debug_abbrev_offset (*) - d.addDwarfAddrRef(su, abbrevsym) + su.AddUint8(uint8(d.arch.PtrSize)) // address_size - su.AddUint8(uint8(d.arch.PtrSize)) // address_size + ds := dwSym(s) + dwarf.Uleb128put(d, ds, int64(compunit.Abbrev)) + dwarf.PutAttrs(d, ds, compunit.Abbrev, compunit.Attr) - ds := dwSym(s) - dwarf.Uleb128put(d, ds, int64(compunit.Abbrev)) - dwarf.PutAttrs(d, ds, compunit.Abbrev, compunit.Attr) + cu := []loader.Sym{s} + cu = appendSyms(cu, u.AbsFnDIEs) + cu = appendSyms(cu, u.FuncDIEs) + if u.Consts != 0 { + cu = append(cu, loader.Sym(u.Consts)) + } + var cusize int64 + for _, child := range cu { + cusize += int64(len(d.ldr.Data(child))) + } - cu := []loader.Sym{s} - cu = appendSyms(cu, u.AbsFnDIEs) - cu = appendSyms(cu, u.FuncDIEs) - if u.Consts != 0 { - cu = append(cu, loader.Sym(u.Consts)) + for die := compunit.Child; die != nil; die = die.Link { + l := len(cu) + lastSymSz := int64(len(d.ldr.Data(cu[l-1]))) + cu = d.putdie(cu, die) + if lastSymSz != int64(len(d.ldr.Data(cu[l-1]))) { + // putdie will sometimes append directly to the last symbol of the list + cusize = cusize - lastSymSz + int64(len(d.ldr.Data(cu[l-1]))) } - var cusize int64 - for _, child := range cu { + for _, child := range cu[l:] { cusize += int64(len(d.ldr.Data(child))) } + } - for die := compunit.Child; die != nil; die = die.Link { - l := len(cu) - lastSymSz := int64(len(d.ldr.Data(cu[l-1]))) - cu = d.putdie(cu, die) - if lastSymSz != int64(len(d.ldr.Data(cu[l-1]))) { - // putdie will sometimes append directly to the last symbol of the list - cusize = cusize - lastSymSz + int64(len(d.ldr.Data(cu[l-1]))) - } - for _, child := range cu[l:] { - cusize += int64(len(d.ldr.Data(child))) - } - } + culu := d.ldr.MakeSymbolUpdater(cu[len(cu)-1]) + culu.AddUint8(0) // closes compilation unit DIE + cusize++ - culu := d.ldr.MakeSymbolUpdater(cu[len(cu)-1]) - culu.AddUint8(0) // closes compilation unit DIE - cusize++ + // Save size for AIX symbol table. + if d.linkctxt.HeadType == objabi.Haix { + saveDwsectCUSize(".debug_info", d.getPkgFromCUSym(s), uint64(cusize)) + } + if isDwarf64(d.linkctxt) { + cusize -= 12 // exclude the length field. + su.SetUint(d.arch, 4, uint64(cusize)) // 4 because of 0XFFFFFFFF + } else { + cusize -= 4 // exclude the length field. + su.SetUint32(d.arch, 0, uint32(cusize)) + } + return append(syms, cu...) +} - // Save size for AIX symbol table. - if d.linkctxt.HeadType == objabi.Haix { - saveDwsectCUSize(".debug_info", d.getPkgFromCUSym(s), uint64(cusize)) - } - if isDwarf64(d.linkctxt) { - cusize -= 12 // exclude the length field. - su.SetUint(d.arch, 4, uint64(cusize)) // 4 because of 0XFFFFFFFF - } else { - cusize -= 4 // exclude the length field. - su.SetUint32(d.arch, 0, uint32(cusize)) - } - syms = append(syms, cu...) +func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, infosym loader.Sym) dwarfSecInfo { + + disu := d.ldr.MakeSymbolUpdater(infosym) + disu.SetType(sym.SDWARFCUINFO) + d.ldr.SetAttrReachable(infosym, true) + syms := []loader.Sym{infosym} + + for _, u := range units { + usyms := d.writeUnitInfo(u, abbrevsym) + syms = append(syms, usyms...) } return dwarfSecInfo{syms: syms} @@ -1994,16 +1998,22 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { reversetree(&dwtypes.Child) movetomodule(d.linkctxt, &dwtypes) - infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym()) + infoSym := d.ldr.LookupOrCreateSym(".debug_info", 0) + + infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym(), infoSym) + + frameSym := d.ldr.LookupOrCreateSym(".debug_frame", 0) + frameSec := d.writeframes(frameSym) - framesSec := d.writeframes() - dwarfp = append(dwarfp, framesSec) + dwarfp = append(dwarfp, frameSec) gdbScriptSec := d.writegdbscript() if gdbScriptSec.secSym() != 0 { dwarfp = append(dwarfp, gdbScriptSec) } dwarfp = append(dwarfp, infoSec) - locSec := d.collectlocs(d.linkctxt.compUnits) + locSym := d.ldr.LookupOrCreateSym(".debug_loc", 0) + d.ldr.SetAttrReachable(locSym, true) + locSec := d.collectlocs(locSym) if locSec.secSym() != 0 { dwarfp = append(dwarfp, locSec) } @@ -2017,39 +2027,40 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { dwarfp = append(dwarfp, dwarfSecInfo{syms: rsyms}) } -func (d *dwctxt) collectlocs(units []*sym.CompilationUnit) dwarfSecInfo { - empty := true - syms := []loader.Sym{} - for _, u := range units { - for _, fn := range u.FuncDIEs { - relocs := d.ldr.Relocs(loader.Sym(fn)) - for i := 0; i < relocs.Count(); i++ { - reloc := relocs.At2(i) - if reloc.Type() != objabi.R_DWARFSECREF { - continue - } - rsym := reloc.Sym() - if d.ldr.SymType(rsym) == sym.SDWARFLOC { - d.ldr.SetAttrReachable(rsym, true) - d.ldr.SetAttrNotInSymbolTable(rsym, true) - syms = append(syms, rsym) - empty = false - // One location list entry per function, but many relocations to it. Don't duplicate. - break - } +func (d *dwctxt) collectUnitLocs(u *sym.CompilationUnit, syms []loader.Sym) []loader.Sym { + for _, fn := range u.FuncDIEs { + relocs := d.ldr.Relocs(loader.Sym(fn)) + for i := 0; i < relocs.Count(); i++ { + reloc := relocs.At2(i) + if reloc.Type() != objabi.R_DWARFSECREF { + continue + } + rsym := reloc.Sym() + if d.ldr.SymType(rsym) == sym.SDWARFLOC { + d.ldr.SetAttrReachable(rsym, true) + d.ldr.SetAttrNotInSymbolTable(rsym, true) + syms = append(syms, rsym) + // One location list entry per function, but many relocations to it. Don't duplicate. + break } } } + return syms +} + +func (d *dwctxt) collectlocs(locsym loader.Sym) dwarfSecInfo { + syms := []loader.Sym{} + for _, u := range d.linkctxt.compUnits { + syms = d.collectUnitLocs(u, syms) + } // Don't emit .debug_loc if it's empty -- it makes the ARM linker mad. - if empty { + if len(syms) == 0 { return dwarfSecInfo{} } - locsym := d.ldr.LookupOrCreateSym(".debug_loc", 0) u := d.ldr.MakeSymbolUpdater(locsym) u.SetType(sym.SDWARFLOC) - d.ldr.SetAttrReachable(locsym, true) return dwarfSecInfo{syms: append([]loader.Sym{locsym}, syms...)} } -- GitLab From 0fb1517b3f0b643570d554ea66d5e6884fb0343e Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 12 Jun 2020 09:35:42 -0400 Subject: [PATCH 0071/1792] [dev.link] cmd/link: remove implicit reachability setting from SymbolBuilder The loader's SymbolBuilder Add*/Set* methods include a call to mark the underlying symbol as reachable (as a convenience, so that callers would not have to set it explicitly). This code was carried over from the corresponding sym.Symbol methods; back in the sym.Symbol world unreachable symbols were never removed from the AllSyms slice, hence setting and checking reachability was a good deal more important. With the advent of the loader and the new deadcode implementation, there is less of a need for this sort of fallback, and in addition the implicit attr setting introduces data races in the the loader if there are SymbolBuilder Add*/Set* method calls in parallel threads, as well as adding overhead to the methods. This patch gets rid of the implicit reachability setting, and instead marks reachability in CreateSymForUpdate, as well as adding a few explicit SetAttrReachable calls where needed. Change-Id: I029a0c5a4a24237826a7831f9cbe5180d44cbc40 Reviewed-on: https://go-review.googlesource.com/c/go/+/237678 Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/link/internal/arm/asm.go | 1 + src/cmd/link/internal/ld/data.go | 22 +++----- src/cmd/link/internal/ld/dwarf.go | 52 ++++++++----------- src/cmd/link/internal/ld/elf.go | 15 ------ src/cmd/link/internal/ld/lib.go | 1 - src/cmd/link/internal/ld/pcln.go | 6 +-- src/cmd/link/internal/ld/pe.go | 10 ++-- src/cmd/link/internal/ld/symtab.go | 13 ----- src/cmd/link/internal/ld/typelink.go | 1 - src/cmd/link/internal/ld/xcoff.go | 4 +- src/cmd/link/internal/loader/loader_test.go | 8 --- src/cmd/link/internal/loader/symbolbuilder.go | 19 ++----- src/cmd/link/internal/ppc64/asm.go | 4 +- 13 files changed, 41 insertions(+), 115 deletions(-) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 1f78f76255..ea71d11356 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -387,6 +387,7 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) { oName := ldr.SymName(rs) name := oName + fmt.Sprintf("%+d-tramp%d", offset, i) tramp = ldr.LookupOrCreateSym(name, int(ldr.SymVersion(rs))) + ldr.SetAttrReachable(tramp, true) if ldr.SymType(tramp) == sym.SDYNIMPORT { // don't reuse trampoline defined in other module continue diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 8fec08bee5..73003179ab 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -740,15 +740,14 @@ func (ctxt *Link) windynrelocsyms() { return } - rel := ctxt.loader.LookupOrCreateSym(".rel", 0) - relu := ctxt.loader.MakeSymbolUpdater(rel) - relu.SetType(sym.STEXT) + rel := ctxt.loader.CreateSymForUpdate(".rel", 0) + rel.SetType(sym.STEXT) for _, s := range ctxt.Textp { - windynrelocsym(ctxt, relu, s) + windynrelocsym(ctxt, rel, s) } - ctxt.Textp = append(ctxt.Textp, rel) + ctxt.Textp = append(ctxt.Textp, rel.Sym()) } func dynrelocsym(ctxt *Link, s loader.Sym) { @@ -1042,9 +1041,7 @@ func addstrdata(arch *sys.Arch, l *loader.Loader, name, value string) { } p := fmt.Sprintf("%s.str", name) - sp := l.LookupOrCreateSym(p, 0) - sbld := l.MakeSymbolUpdater(sp) - + sbld := l.CreateSymForUpdate(p, 0) sbld.Addstring(value) sbld.SetType(sym.SRODATA) @@ -1052,7 +1049,7 @@ func addstrdata(arch *sys.Arch, l *loader.Loader, name, value string) { bld.SetData(make([]byte, 0, arch.PtrSize*2)) bld.SetReadOnly(false) bld.SetRelocs(nil) - bld.AddAddrPlus(arch, sp, 0) + bld.AddAddrPlus(arch, sbld.Sym(), 0) bld.AddUint(arch, uint64(len(value))) } @@ -1069,7 +1066,6 @@ func addgostring(ctxt *Link, ldr *loader.Loader, s *loader.SymbolBuilder, symnam if sdata.Type() != sym.Sxxx { ctxt.Errorf(s.Sym(), "duplicate symname in addgostring: %s", symname) } - sdata.SetReachable(true) sdata.SetLocal(true) sdata.SetType(sym.SRODATA) sdata.SetSize(int64(len(str))) @@ -1126,8 +1122,7 @@ type GCProg struct { func (p *GCProg) Init(ctxt *Link, name string) { p.ctxt = ctxt - symIdx := ctxt.loader.LookupOrCreateSym(name, 0) - p.sym = ctxt.loader.MakeSymbolUpdater(symIdx) + p.sym = ctxt.loader.CreateSymForUpdate(name, 0) p.w.Init(p.writeByte()) if debugGCProg { fmt.Fprintf(os.Stderr, "ld: start GCProg %s\n", name) @@ -2059,7 +2054,6 @@ func (ctxt *Link) textbuildid() { ldr := ctxt.loader s := ldr.CreateSymForUpdate("go.buildid", 0) - s.SetReachable(true) // The \xff is invalid UTF-8, meant to make it less likely // to find one of these accidentally. data := "\xff Go build ID: " + strconv.Quote(*flagBuildid) + "\n \xff" @@ -2083,7 +2077,6 @@ func (ctxt *Link) buildinfo() { ldr := ctxt.loader s := ldr.CreateSymForUpdate(".go.buildinfo", 0) - s.SetReachable(true) // On AIX, .go.buildinfo must be in the symbol table as // it has relocations. s.SetNotInSymbolTable(!ctxt.IsAIX()) @@ -2231,7 +2224,6 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s loader.Sym, va uint64 // Create a symbol for the start of the secondary text sections ntext := ldr.CreateSymForUpdate(fmt.Sprintf("runtime.text.%d", n), 0) - ntext.SetReachable(true) ntext.SetSect(sect) if ctxt.IsAIX() { // runtime.text.X must be a real symbol on AIX. diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index d55148d9aa..139a248253 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -216,11 +216,10 @@ func (dsi *dwarfSecInfo) subSyms() []loader.Sym { var dwarfp []dwarfSecInfo func (d *dwctxt) writeabbrev() dwarfSecInfo { - abrvs := d.ldr.LookupOrCreateSym(".debug_abbrev", 0) - u := d.ldr.MakeSymbolUpdater(abrvs) - u.SetType(sym.SDWARFSECT) - u.AddBytes(dwarf.GetAbbrev()) - return dwarfSecInfo{syms: []loader.Sym{abrvs}} + abrvs := d.ldr.CreateSymForUpdate(".debug_abbrev", 0) + abrvs.SetType(sym.SDWARFSECT) + abrvs.AddBytes(dwarf.GetAbbrev()) + return dwarfSecInfo{syms: []loader.Sym{abrvs.Sym()}} } var dwtypes dwarf.DWDie @@ -1624,13 +1623,12 @@ func (d *dwctxt) writegdbscript() dwarfSecInfo { return dwarfSecInfo{} } - gs := d.ldr.LookupOrCreateSym(".debug_gdb_scripts", 0) - u := d.ldr.MakeSymbolUpdater(gs) - u.SetType(sym.SDWARFSECT) + gs := d.ldr.CreateSymForUpdate(".debug_gdb_scripts", 0) + gs.SetType(sym.SDWARFSECT) - u.AddUint8(1) // magic 1 byte? - u.Addstring(gdbscript) - return dwarfSecInfo{syms: []loader.Sym{gs}} + gs.AddUint8(1) // magic 1 byte? + gs.Addstring(gdbscript) + return dwarfSecInfo{syms: []loader.Sym{gs.Sym()}} } // FIXME: might be worth looking replacing this map with a function @@ -1969,17 +1967,13 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { sort.Sort(compilationUnitByStartPC(d.linkctxt.compUnits)) // Create .debug_line and .debug_ranges section symbols - debugLine := d.ldr.LookupOrCreateSym(".debug_line", 0) - dlu := d.ldr.MakeSymbolUpdater(debugLine) - dlu.SetType(sym.SDWARFSECT) - d.ldr.SetAttrReachable(debugLine, true) - dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{debugLine}}) + debugLine := d.ldr.CreateSymForUpdate(".debug_line", 0) + debugLine.SetType(sym.SDWARFSECT) + dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{debugLine.Sym()}}) linesec := &dwarfp[len(dwarfp)-1] - debugRanges := d.ldr.LookupOrCreateSym(".debug_ranges", 0) - dru := d.ldr.MakeSymbolUpdater(debugRanges) - dru.SetType(sym.SDWARFRANGE) - d.ldr.SetAttrReachable(debugRanges, true) + debugRanges := d.ldr.CreateSymForUpdate(".debug_ranges", 0) + debugRanges.SetType(sym.SDWARFRANGE) // Write per-package line and range tables and start their CU DIEs. for _, u := range d.linkctxt.compUnits { @@ -1989,7 +1983,7 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { } linesec.syms = d.writelines(u, linesec.syms) base := loader.Sym(u.Textp[0]) - d.writepcranges(u, base, u.PCs, debugRanges) + d.writepcranges(u, base, u.PCs, debugRanges.Sym()) } // newdie adds DIEs to the *beginning* of the parent's DIE list. @@ -1998,12 +1992,12 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { reversetree(&dwtypes.Child) movetomodule(d.linkctxt, &dwtypes) - infoSym := d.ldr.LookupOrCreateSym(".debug_info", 0) + infoSym := d.ldr.CreateSymForUpdate(".debug_info", 0) - infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym(), infoSym) + infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym(), infoSym.Sym()) - frameSym := d.ldr.LookupOrCreateSym(".debug_frame", 0) - frameSec := d.writeframes(frameSym) + frameSym := d.ldr.CreateSymForUpdate(".debug_frame", 0) + frameSec := d.writeframes(frameSym.Sym()) dwarfp = append(dwarfp, frameSec) gdbScriptSec := d.writegdbscript() @@ -2011,14 +2005,13 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { dwarfp = append(dwarfp, gdbScriptSec) } dwarfp = append(dwarfp, infoSec) - locSym := d.ldr.LookupOrCreateSym(".debug_loc", 0) - d.ldr.SetAttrReachable(locSym, true) - locSec := d.collectlocs(locSym) + locSym := d.ldr.CreateSymForUpdate(".debug_loc", 0) + locSec := d.collectlocs(locSym.Sym()) if locSec.secSym() != 0 { dwarfp = append(dwarfp, locSec) } - rsyms := []loader.Sym{debugRanges} + rsyms := []loader.Sym{debugRanges.Sym()} for _, unit := range d.linkctxt.compUnits { for _, s := range unit.RangeSyms { rsyms = append(rsyms, loader.Sym(s)) @@ -2145,7 +2138,6 @@ func dwarfcompress(ctxt *Link) { sect.Align = 1 sect.Length = uint64(len(z.compressed)) newSym := ldr.CreateSymForUpdate(compressedSegName, 0) - newSym.SetReachable(true) newSym.SetData(z.compressed) newSym.SetSize(int64(len(z.compressed))) ldr.SetSymSect(newSym.Sym(), sect) diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index f5a57cb96e..80612c4684 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1036,7 +1036,6 @@ func elfdynhash(ctxt *Link) { ldr := ctxt.loader s := ldr.CreateSymForUpdate(".hash", 0) s.SetType(sym.SELFROSECT) - s.SetReachable(true) i := nsym nbucket := 1 @@ -1434,7 +1433,6 @@ func elfEmitReloc(ctxt *Link) { func addgonote(ctxt *Link, sectionName string, tag uint32, desc []byte) { ldr := ctxt.loader s := ldr.CreateSymForUpdate(sectionName, 0) - s.SetReachable(true) s.SetType(sym.SELFROSECT) // namesz s.AddUint32(ctxt.Arch, uint32(len(ELF_NOTE_GO_NAME))) @@ -1463,7 +1461,6 @@ func (ctxt *Link) doelf() { shstrtab := ldr.CreateSymForUpdate(".shstrtab", 0) shstrtab.SetType(sym.SELFROSECT) - shstrtab.SetReachable(true) shstrtab.Addstring("") shstrtab.Addstring(".text") @@ -1577,7 +1574,6 @@ func (ctxt *Link) doelf() { dynsym := ldr.CreateSymForUpdate(".dynsym", 0) dynsym.SetType(sym.SELFROSECT) - dynsym.SetReachable(true) if elf64 { dynsym.SetSize(dynsym.Size() + ELF64SYMSIZE) } else { @@ -1588,39 +1584,32 @@ func (ctxt *Link) doelf() { dynstr := ldr.CreateSymForUpdate(".dynstr", 0) dynstr.SetType(sym.SELFROSECT) - dynstr.SetReachable(true) if dynstr.Size() == 0 { dynstr.Addstring("") } /* relocation table */ s := ldr.CreateSymForUpdate(elfRelType, 0) - s.SetReachable(true) s.SetType(sym.SELFROSECT) /* global offset table */ got := ldr.CreateSymForUpdate(".got", 0) - got.SetReachable(true) got.SetType(sym.SELFGOT) // writable /* ppc64 glink resolver */ if ctxt.IsPPC64() { s := ldr.CreateSymForUpdate(".glink", 0) - s.SetReachable(true) s.SetType(sym.SELFRXSECT) } /* hash */ hash := ldr.CreateSymForUpdate(".hash", 0) - hash.SetReachable(true) hash.SetType(sym.SELFROSECT) gotplt := ldr.CreateSymForUpdate(".got.plt", 0) - gotplt.SetReachable(true) gotplt.SetType(sym.SELFSECT) // writable plt := ldr.CreateSymForUpdate(".plt", 0) - plt.SetReachable(true) if ctxt.IsPPC64() { // In the ppc64 ABI, .plt is a data section // written by the dynamic linker. @@ -1630,20 +1619,16 @@ func (ctxt *Link) doelf() { } s = ldr.CreateSymForUpdate(elfRelType+".plt", 0) - s.SetReachable(true) s.SetType(sym.SELFROSECT) s = ldr.CreateSymForUpdate(".gnu.version", 0) - s.SetReachable(true) s.SetType(sym.SELFROSECT) s = ldr.CreateSymForUpdate(".gnu.version_r", 0) - s.SetReachable(true) s.SetType(sym.SELFROSECT) /* define dynamic elf table */ dynamic := ldr.CreateSymForUpdate(".dynamic", 0) - dynamic.SetReachable(true) dynamic.SetType(sym.SELFSECT) // writable if ctxt.IsS390X() { diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index a747cde43f..ed59e6af27 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2381,7 +2381,6 @@ func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) { s := ldr.CreateSymForUpdate(p, 0) s.SetType(t) s.SetValue(v) - s.SetReachable(true) s.SetSpecial(true) s.SetLocal(true) } diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index a5f776ebff..81f1a2d40b 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -585,11 +585,9 @@ const ( // a given text symbols is a container (outer sym). func (ctxt *Link) findfunctab(container loader.Bitmap) { ldr := ctxt.loader - tsym := ldr.LookupOrCreateSym("runtime.findfunctab", 0) - t := ldr.MakeSymbolUpdater(tsym) + t := ldr.CreateSymForUpdate("runtime.findfunctab", 0) t.SetType(sym.SRODATA) - ldr.SetAttrReachable(tsym, true) - ldr.SetAttrLocal(tsym, true) + ldr.SetAttrLocal(t.Sym(), true) // find min and max address min := ldr.SymValue(ctxt.Textp[0]) diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index f0211e12ac..08849ff380 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -1006,13 +1006,11 @@ func Peinit(ctxt *Link) { if ctxt.LinkMode == LinkInternal { // some mingw libs depend on this symbol, for example, FindPESectionByName for _, name := range [2]string{"__image_base__", "_image_base__"} { - s := ctxt.loader.LookupOrCreateSym(name, 0) - sb := ctxt.loader.MakeSymbolUpdater(s) + sb := ctxt.loader.CreateSymForUpdate(name, 0) sb.SetType(sym.SDATA) sb.SetValue(PEBASE) - ctxt.loader.SetAttrReachable(s, true) - ctxt.loader.SetAttrSpecial(s, true) - ctxt.loader.SetAttrLocal(s, true) + ctxt.loader.SetAttrSpecial(sb.Sym(), true) + ctxt.loader.SetAttrLocal(sb.Sym(), true) } } @@ -1110,14 +1108,12 @@ func initdynimport(ctxt *Link) *Dll { dynName += fmt.Sprintf("@%d", m.argsize) } dynSym := ldr.CreateSymForUpdate(dynName, 0) - dynSym.SetReachable(true) dynSym.SetType(sym.SHOSTOBJ) sb.AddReloc(loader.Reloc{Sym: dynSym.Sym(), Type: objabi.R_ADDR, Off: 0, Size: uint8(ctxt.Arch.PtrSize)}) } } } else { dynamic := ldr.CreateSymForUpdate(".windynamic", 0) - dynamic.SetReachable(true) dynamic.SetType(sym.SWINDOWS) for d := dr; d != nil; d = d.next { for m = d.ms; m != nil; m = m.next { diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 577c24e432..1c70a94e1a 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -345,7 +345,6 @@ func textsectionmap(ctxt *Link) (loader.Sym, uint32) { ldr := ctxt.loader t := ldr.CreateSymForUpdate("runtime.textsectionmap", 0) t.SetType(sym.SRODATA) - t.SetReachable(true) nsections := int64(0) for _, sect := range Segtext.Sections { @@ -434,13 +433,11 @@ func (ctxt *Link) symtab() []sym.SymKind { s := ldr.CreateSymForUpdate("runtime.gcdata", 0) s.SetType(sym.SRODATA) s.SetSize(0) - s.SetReachable(true) ctxt.xdefine("runtime.egcdata", sym.SRODATA, 0) s = ldr.CreateSymForUpdate("runtime.gcbss", 0) s.SetType(sym.SRODATA) s.SetSize(0) - s.SetReachable(true) ctxt.xdefine("runtime.egcbss", sym.SRODATA, 0) // pseudo-symbols to mark locations of type, string, and go string data. @@ -450,19 +447,16 @@ func (ctxt *Link) symtab() []sym.SymKind { s = ldr.CreateSymForUpdate("type.*", 0) s.SetType(sym.STYPE) s.SetSize(0) - s.SetReachable(true) symtype = s.Sym() s = ldr.CreateSymForUpdate("typerel.*", 0) s.SetType(sym.STYPERELRO) s.SetSize(0) - s.SetReachable(true) symtyperel = s.Sym() } else { s = ldr.CreateSymForUpdate("type.*", 0) s.SetType(sym.STYPE) s.SetSize(0) - s.SetReachable(true) symtype = s.Sym() symtyperel = s.Sym() } @@ -473,7 +467,6 @@ func (ctxt *Link) symtab() []sym.SymKind { s.SetType(t) s.SetSize(0) s.SetLocal(true) - s.SetReachable(true) return s.Sym() } var ( @@ -497,7 +490,6 @@ func (ctxt *Link) symtab() []sym.SymKind { symt := ldr.CreateSymForUpdate("runtime.symtab", 0) symt.SetType(sym.SSYMTAB) symt.SetSize(0) - symt.SetReachable(true) symt.SetLocal(true) nitablinks := 0 @@ -580,7 +572,6 @@ func (ctxt *Link) symtab() []sym.SymKind { if ctxt.BuildMode == BuildModeShared { abihashgostr := ldr.CreateSymForUpdate("go.link.abihash."+filepath.Base(*flagOutfile), 0) - abihashgostr.SetReachable(true) abihashgostr.SetType(sym.SRODATA) hashsym := ldr.LookupOrCreateSym("go.link.abihashbytes", 0) abihashgostr.AddAddr(ctxt.Arch, hashsym) @@ -589,12 +580,10 @@ func (ctxt *Link) symtab() []sym.SymKind { if ctxt.BuildMode == BuildModePlugin || ctxt.CanUsePlugins() { for _, l := range ctxt.Library { s := ldr.CreateSymForUpdate("go.link.pkghashbytes."+l.Pkg, 0) - s.SetReachable(true) s.SetType(sym.SRODATA) s.SetSize(int64(len(l.Fingerprint))) s.SetData(l.Fingerprint[:]) str := ldr.CreateSymForUpdate("go.link.pkghash."+l.Pkg, 0) - str.SetReachable(true) str.SetType(sym.SRODATA) str.AddAddr(ctxt.Arch, s.Sym()) str.AddUint(ctxt.Arch, uint64(len(l.Fingerprint))) @@ -690,7 +679,6 @@ func (ctxt *Link) symtab() []sym.SymKind { addgostring(ctxt, ldr, moduledata, "go.link.thispluginpath", objabi.PathToPrefix(*flagPluginPath)) pkghashes := ldr.CreateSymForUpdate("go.link.pkghashes", 0) - pkghashes.SetReachable(true) pkghashes.SetLocal(true) pkghashes.SetType(sym.SRODATA) @@ -724,7 +712,6 @@ func (ctxt *Link) symtab() []sym.SymKind { addgostring(ctxt, ldr, moduledata, "go.link.thismodulename", thismodulename) modulehashes := ldr.CreateSymForUpdate("go.link.abihashes", 0) - modulehashes.SetReachable(true) modulehashes.SetLocal(true) modulehashes.SetType(sym.SRODATA) diff --git a/src/cmd/link/internal/ld/typelink.go b/src/cmd/link/internal/ld/typelink.go index 483a122fb5..4bb43c2fef 100644 --- a/src/cmd/link/internal/ld/typelink.go +++ b/src/cmd/link/internal/ld/typelink.go @@ -37,7 +37,6 @@ func (ctxt *Link) typelink() { tl := ldr.CreateSymForUpdate("runtime.typelink", 0) tl.SetType(sym.STYPELINK) - ldr.SetAttrReachable(tl.Sym(), true) ldr.SetAttrLocal(tl.Sym(), true) tl.SetSize(int64(4 * len(typelinks))) tl.Grow(tl.Size()) diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 563fe49fc2..e5ed847b54 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1173,12 +1173,12 @@ func (f *xcoffFile) adddynimpsym(ctxt *Link, s loader.Sym) { } sb := ldr.MakeSymbolUpdater(s) + sb.SetReachable(true) sb.SetType(sym.SXCOFFTOC) // Create new dynamic symbol extsym := ldr.CreateSymForUpdate(ldr.SymExtname(s), 0) extsym.SetType(sym.SDYNIMPORT) - extsym.SetReachable(true) extsym.SetDynimplib(ldr.SymDynimplib(s)) extsym.SetExtname(ldr.SymExtname(s)) extsym.SetDynimpvers(ldr.SymDynimpvers(s)) @@ -1279,7 +1279,6 @@ func (ctxt *Link) doxcoff() { // TOC toc := ldr.CreateSymForUpdate("TOC", 0) toc.SetType(sym.SXCOFFTOC) - toc.SetReachable(true) toc.SetVisibilityHidden(true) // Add entry point to .loader symbols. @@ -1330,6 +1329,7 @@ func (ctxt *Link) doxcoff() { ldr.SetSymExtname(s, "."+name) desc := ldr.MakeSymbolUpdater(ldr.CreateExtSym(name, 0)) + desc.SetReachable(true) desc.SetType(sym.SNOPTRDATA) desc.AddAddr(ctxt.Arch, s) desc.AddAddr(ctxt.Arch, toc.Sym()) diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 8805a1ee16..cf905492ed 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -210,11 +210,6 @@ func TestAddMaterializedSymbol(t *testing.T) { if 0 != es1val { t.Errorf("expected IsReflectMethod(es1) value of 0, got %v", irm) } - - // Writing data to a materialized symbol should mark it reachable. - if !sb1.Reachable() || !sb2.Reachable() { - t.Fatalf("written-to materialized symbols should be reachable") - } } func sameRelocSlice(s1 *Relocs, s2 []Reloc) bool { @@ -347,9 +342,6 @@ func TestAddDataMethods(t *testing.T) { t.Errorf("testing Loader.%s: expected data %v got %v", tp.which, tp.expData, ldr.Data(mi)) } - if !ldr.AttrReachable(mi) { - t.Fatalf("testing Loader.%s: sym updated should be reachable", tp.which) - } relocs := ldr.Relocs(mi) if !sameRelocSlice(&relocs, tp.expRel) { t.Fatalf("testing Loader.%s: got relocslice %+v wanted %+v", diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index b6e07dbe4a..9713a282b1 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -54,7 +54,9 @@ func (l *Loader) MakeSymbolUpdater(symIdx Sym) *SymbolBuilder { // returns a CreateSymForUpdate for update. If the symbol already // exists, it will update in-place. func (l *Loader) CreateSymForUpdate(name string, version int) *SymbolBuilder { - return l.MakeSymbolUpdater(l.LookupOrCreateSym(name, version)) + s := l.LookupOrCreateSym(name, version) + l.SetAttrReachable(s, true) + return l.MakeSymbolUpdater(s) } // Getters for properties of the symbol we're working on. @@ -105,7 +107,6 @@ func (sb *SymbolBuilder) SetNotInSymbolTable(value bool) { func (sb *SymbolBuilder) SetSect(sect *sym.Section) { sb.l.SetSymSect(sb.symIdx, sect) } func (sb *SymbolBuilder) AddBytes(data []byte) { - sb.setReachable() if sb.kind == 0 { sb.kind = sym.SDATA } @@ -248,7 +249,6 @@ func (sb *SymbolBuilder) AddUint8(v uint8) int64 { if sb.kind == 0 { sb.kind = sym.SDATA } - sb.setReachable() sb.size++ sb.data = append(sb.data, v) return off @@ -256,7 +256,6 @@ func (sb *SymbolBuilder) AddUint8(v uint8) int64 { func (sb *SymbolBuilder) AddUintXX(arch *sys.Arch, v uint64, wid int) int64 { off := sb.size - sb.setReachable() sb.setUintXX(arch, off, v, int64(wid)) return off } @@ -301,22 +300,18 @@ func (sb *SymbolBuilder) AddUint(arch *sys.Arch, v uint64) int64 { } func (sb *SymbolBuilder) SetUint8(arch *sys.Arch, r int64, v uint8) int64 { - sb.setReachable() return sb.setUintXX(arch, r, uint64(v), 1) } func (sb *SymbolBuilder) SetUint16(arch *sys.Arch, r int64, v uint16) int64 { - sb.setReachable() return sb.setUintXX(arch, r, uint64(v), 2) } func (sb *SymbolBuilder) SetUint32(arch *sys.Arch, r int64, v uint32) int64 { - sb.setReachable() return sb.setUintXX(arch, r, uint64(v), 4) } func (sb *SymbolBuilder) SetUint(arch *sys.Arch, r int64, v uint64) int64 { - sb.setReachable() return sb.setUintXX(arch, r, v, int64(arch.PtrSize)) } @@ -324,7 +319,6 @@ func (sb *SymbolBuilder) SetAddrPlus(arch *sys.Arch, off int64, tgt Sym, add int if sb.Type() == 0 { sb.SetType(sym.SDATA) } - sb.setReachable() if off+int64(arch.PtrSize) > sb.size { sb.size = off + int64(arch.PtrSize) sb.Grow(sb.size) @@ -344,7 +338,6 @@ func (sb *SymbolBuilder) SetAddr(arch *sys.Arch, off int64, tgt Sym) int64 { } func (sb *SymbolBuilder) Addstring(str string) int64 { - sb.setReachable() if sb.kind == 0 { sb.kind = sym.SNOPTRDATA } @@ -382,17 +375,14 @@ func (sb *SymbolBuilder) addSymRef(tgt Sym, add int64, typ objabi.RelocType, rsi // Add a symbol reference (relocation) with given type, addend, and size // (the most generic form). func (sb *SymbolBuilder) AddSymRef(arch *sys.Arch, tgt Sym, add int64, typ objabi.RelocType, rsize int) int64 { - sb.setReachable() return sb.addSymRef(tgt, add, typ, rsize) } func (sb *SymbolBuilder) AddAddrPlus(arch *sys.Arch, tgt Sym, add int64) int64 { - sb.setReachable() return sb.addSymRef(tgt, add, objabi.R_ADDR, arch.PtrSize) } func (sb *SymbolBuilder) AddAddrPlus4(arch *sys.Arch, tgt Sym, add int64) int64 { - sb.setReachable() return sb.addSymRef(tgt, add, objabi.R_ADDR, 4) } @@ -401,17 +391,14 @@ func (sb *SymbolBuilder) AddAddr(arch *sys.Arch, tgt Sym) int64 { } func (sb *SymbolBuilder) AddPCRelPlus(arch *sys.Arch, tgt Sym, add int64) int64 { - sb.setReachable() return sb.addSymRef(tgt, add, objabi.R_PCREL, 4) } func (sb *SymbolBuilder) AddCURelativeAddrPlus(arch *sys.Arch, tgt Sym, add int64) int64 { - sb.setReachable() return sb.addSymRef(tgt, add, objabi.R_ADDRCUOFF, arch.PtrSize) } func (sb *SymbolBuilder) AddSize(arch *sys.Arch, tgt Sym) int64 { - sb.setReachable() return sb.addSymRef(tgt, 0, objabi.R_SIZE, arch.PtrSize) } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index ed086f0e2f..6e2aac0d20 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -749,7 +749,6 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta toctramp := ldr.CreateSymForUpdate("TOC."+ldr.SymName(tramp.Sym()), 0) toctramp.SetType(sym.SXCOFFTOC) - toctramp.SetReachable(true) toctramp.AddAddrPlus(ctxt.Arch, target, offset) r := loader.Reloc{ @@ -1027,8 +1026,7 @@ func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) { // Generate the glink resolver stub if necessary and return the .glink section func ensureglinkresolver(ctxt *ld.Link, ldr *loader.Loader) *loader.SymbolBuilder { - gs := ldr.LookupOrCreateSym(".glink", 0) - glink := ldr.MakeSymbolUpdater(gs) + glink := ldr.CreateSymForUpdate(".glink", 0) if glink.Size() != 0 { return glink } -- GitLab From d1a186d29ce9d917dda7c66cfaee7788f88e7b9e Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 12 Jun 2020 09:04:28 -0400 Subject: [PATCH 0072/1792] [dev.link] cmd/link: parallelize second-stage DWARF generation This patch introduces parallelization of DWARF generation on a per compilation unit basis. Each compilation unit now operates on a separate set of symbols, so it's safe to send each compilation unit to a goroutine to be processed in parallel. Doing this requires some restructing to ensure that any new symbols needed are created up front, since we can't create any new syms during the parallel portion. Similarly, the parallel portion can't set any symbol attributes, so the check that verifies we haven't doubly listed any DIE syms had to be reworked, and setting of reachability has to be delayed until after the parallel phase is complete. Change-Id: I3042b76e9b597bb1a6a44dce19efba2d02bed76b Reviewed-on: https://go-review.googlesource.com/c/go/+/237679 Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/dwarf.go | 315 +++++++++++++++++++----------- 1 file changed, 197 insertions(+), 118 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 139a248253..39c273a7e5 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -23,8 +23,10 @@ import ( "cmd/link/internal/sym" "fmt" "log" + "runtime" "sort" "strings" + "sync" ) // dwctxt is a wrapper intended to satisfy the method set of @@ -57,6 +59,10 @@ type dwctxt struct { typeRuntimeEface loader.Sym typeRuntimeIface loader.Sym uintptrInfoSym loader.Sym + + // Used at various points in that parallel portion of DWARF gen to + // protect against conflicting updates to globals (such as "gdbscript") + dwmu *sync.Mutex } func newdwctxt(linkctxt *Link, forTypeGen bool) dwctxt { @@ -410,10 +416,6 @@ func (d *dwctxt) putdie(syms []loader.Sym, die *dwarf.DWDie) []loader.Sym { if s == 0 { s = syms[len(syms)-1] } else { - if d.ldr.AttrOnList(s) { - log.Fatalf("symbol %s listed multiple times", d.ldr.SymName(s)) - } - d.ldr.SetAttrOnList(s, true) syms = append(syms, s) } sDwsym := dwSym(s) @@ -1171,28 +1173,26 @@ func expandFile(fname string) string { return expandGoroot(fname) } -// writelines collects up and chains together the symbols needed to +// writelines collects up and chai,ns together the symbols needed to // form the DWARF line table for the specified compilation unit, -// appends them to the list 'syms' and returns the updated list. -// Additions will include an initial symbol containing the line table -// header and prolog (with file table), then a series of -// compiler-emitted line table symbols (one per live function), and -// finally an epilog symbol containing an end-of-sequence operator. -func (d *dwctxt) writelines(unit *sym.CompilationUnit, syms []loader.Sym) []loader.Sym { - +// returning a list of symbols. The returned list will include an +// initial symbol containing the line table header and prolog (with +// file table), then a series of compiler-emitted line table symbols +// (one per live function), and finally an epilog symbol containing an +// end-of-sequence operator. The prolog and epilog symbols are passed +// in (having been created earlier); here we add content to them. +func (d *dwctxt) writelines(unit *sym.CompilationUnit, lineProlog loader.Sym, lineEpilog loader.Sym) []loader.Sym { is_stmt := uint8(1) // initially = recommended default_is_stmt = 1, tracks is_stmt toggles. unitstart := int64(-1) headerstart := int64(-1) headerend := int64(-1) - ls := d.ldr.CreateExtSym("", 0) - syms = append(syms, ls) - d.ldr.SetAttrNotInSymbolTable(ls, true) - d.ldr.SetAttrReachable(ls, true) - lsu := d.ldr.MakeSymbolUpdater(ls) - lsu.SetType(sym.SDWARFLINES) - newattr(unit.DWInfo, dwarf.DW_AT_stmt_list, dwarf.DW_CLS_PTR, 0, dwSym(ls)) + syms := make([]loader.Sym, 0, len(unit.Textp)+2) + syms = append(syms, lineProlog) + lsu := d.ldr.MakeSymbolUpdater(lineProlog) + lsDwsym := dwSym(lineProlog) + newattr(unit.DWInfo, dwarf.DW_AT_stmt_list, dwarf.DW_CLS_PTR, 0, lsDwsym) // Write .debug_line Line Number Program Header (sec 6.2.4) // Fields marked with (*) must be changed for 64-bit dwarf @@ -1224,7 +1224,6 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, syms []loader.Sym) []load // Copy over the file table. fileNums := make(map[string]int) - lsDwsym := dwSym(ls) for i, name := range unit.DWARFFileTable { name := expandFile(name) if len(name) == 0 { @@ -1237,14 +1236,17 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, syms []loader.Sym) []load lsu.AddUint8(0) lsu.AddUint8(0) lsu.AddUint8(0) - if gdbscript == "" { - // We can't use something that may be dead-code - // eliminated from a binary here. proc.go contains - // main and the scheduler, so it's not going anywhere. - if i := strings.Index(name, "runtime/proc.go"); i >= 0 { + + // We can't use something that may be dead-code + // eliminated from a binary here. proc.go contains + // main and the scheduler, so it's not going anywhere. + if i := strings.Index(name, "runtime/proc.go"); i >= 0 { + d.dwmu.Lock() + if gdbscript == "" { k := strings.Index(name, "runtime/proc.go") gdbscript = name[:k] + "runtime/runtime-gdb.py" } + d.dwmu.Unlock() } } @@ -1269,13 +1271,9 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, syms []loader.Sym) []load // NB: at some point if we have an end sequence op // after each function (to enable reordering) generated // in the compiler, we can get rid of this. - epilogsym := d.ldr.CreateExtSym("", 0) - syms = append(syms, epilogsym) - d.ldr.SetAttrNotInSymbolTable(epilogsym, true) - d.ldr.SetAttrReachable(epilogsym, true) - elsu := d.ldr.MakeSymbolUpdater(epilogsym) - elsu.SetType(sym.SDWARFLINES) - elsDwsym := dwSym(epilogsym) + syms = append(syms, lineEpilog) + elsu := d.ldr.MakeSymbolUpdater(lineEpilog) + elsDwsym := dwSym(lineEpilog) // Issue 38192: the DWARF standard specifies that when you issue // an end-sequence op, the PC value should be one past the last @@ -1295,7 +1293,7 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, syms []loader.Sym) []load unitlen += elsu.Size() if d.linkctxt.HeadType == objabi.Haix { - saveDwsectCUSize(".debug_line", unit.Lib.Pkg, uint64(unitlen)) + addDwsectCUSize(".debug_line", unit.Lib.Pkg, uint64(unitlen)) } if isDwarf64(d.linkctxt) { @@ -1309,22 +1307,34 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, syms []loader.Sym) []load return syms } -// writepcranges generates the DW_AT_ranges table for compilation unit cu. -func (d *dwctxt) writepcranges(unit *sym.CompilationUnit, base loader.Sym, pcs []dwarf.Range, ranges loader.Sym) { - - rsu := d.ldr.MakeSymbolUpdater(ranges) - rDwSym := dwSym(ranges) +// writepcranges generates the DW_AT_ranges table for compilation unit +// "unit", and returns a collection of ranges symbols (one for the +// compilation unit DIE itself and the remainder from functions in the unit). +func (d *dwctxt) writepcranges(unit *sym.CompilationUnit, base loader.Sym, pcs []dwarf.Range, rangeProlog loader.Sym) []loader.Sym { - unitLengthOffset := rsu.Size() + syms := make([]loader.Sym, 0, len(unit.RangeSyms)+1) + syms = append(syms, rangeProlog) + rsu := d.ldr.MakeSymbolUpdater(rangeProlog) + rDwSym := dwSym(rangeProlog) - // Create PC ranges for this CU. + // Create PC ranges for the compilation unit DIE. newattr(unit.DWInfo, dwarf.DW_AT_ranges, dwarf.DW_CLS_PTR, rsu.Size(), rDwSym) newattr(unit.DWInfo, dwarf.DW_AT_low_pc, dwarf.DW_CLS_ADDRESS, 0, dwSym(base)) dwarf.PutBasedRanges(d, rDwSym, pcs) + // Collect up the ranges for functions in the unit. + rsize := uint64(rsu.Size()) + for _, ls := range unit.RangeSyms { + s := loader.Sym(ls) + syms = append(syms, s) + rsize += uint64(d.ldr.SymSize(s)) + } + if d.linkctxt.HeadType == objabi.Haix { - addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(rsu.Size()-unitLengthOffset)) + addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, rsize) } + + return syms } /* @@ -1523,7 +1533,7 @@ func appendSyms(syms []loader.Sym, src []sym.LoaderSym) []loader.Sym { return syms } -func (d *dwctxt) writeUnitInfo(u *sym.CompilationUnit, abbrevsym loader.Sym) []loader.Sym { +func (d *dwctxt) writeUnitInfo(u *sym.CompilationUnit, abbrevsym loader.Sym, infoEpilog loader.Sym) []loader.Sym { syms := []loader.Sym{} if len(u.Textp) == 0 && u.DWInfo.Child == nil { return syms @@ -1548,7 +1558,9 @@ func (d *dwctxt) writeUnitInfo(u *sym.CompilationUnit, abbrevsym loader.Sym) []l dwarf.Uleb128put(d, ds, int64(compunit.Abbrev)) dwarf.PutAttrs(d, ds, compunit.Abbrev, compunit.Attr) - cu := []loader.Sym{s} + // This is an under-estimate; more will be needed for type DIEs. + cu := make([]loader.Sym, 0, len(u.AbsFnDIEs)+len(u.FuncDIEs)) + cu = append(cu, s) cu = appendSyms(cu, u.AbsFnDIEs) cu = appendSyms(cu, u.FuncDIEs) if u.Consts != 0 { @@ -1572,13 +1584,14 @@ func (d *dwctxt) writeUnitInfo(u *sym.CompilationUnit, abbrevsym loader.Sym) []l } } - culu := d.ldr.MakeSymbolUpdater(cu[len(cu)-1]) + culu := d.ldr.MakeSymbolUpdater(infoEpilog) culu.AddUint8(0) // closes compilation unit DIE + cu = append(cu, infoEpilog) cusize++ // Save size for AIX symbol table. if d.linkctxt.HeadType == objabi.Haix { - saveDwsectCUSize(".debug_info", d.getPkgFromCUSym(s), uint64(cusize)) + addDwsectCUSize(".debug_info", d.getPkgFromCUSym(s), uint64(cusize)) } if isDwarf64(d.linkctxt) { cusize -= 12 // exclude the length field. @@ -1590,21 +1603,6 @@ func (d *dwctxt) writeUnitInfo(u *sym.CompilationUnit, abbrevsym loader.Sym) []l return append(syms, cu...) } -func (d *dwctxt) writeinfo(units []*sym.CompilationUnit, abbrevsym loader.Sym, infosym loader.Sym) dwarfSecInfo { - - disu := d.ldr.MakeSymbolUpdater(infosym) - disu.SetType(sym.SDWARFCUINFO) - d.ldr.SetAttrReachable(infosym, true) - syms := []loader.Sym{infosym} - - for _, u := range units { - usyms := d.writeUnitInfo(u, abbrevsym) - syms = append(syms, usyms...) - } - - return dwarfSecInfo{syms: syms} -} - func (d *dwctxt) writegdbscript() dwarfSecInfo { // TODO (aix): make it available if d.linkctxt.HeadType == objabi.Haix { @@ -1700,12 +1698,8 @@ func (d *dwctxt) dwarfVisitFunction(fnSym loader.Sym, unit *sym.CompilationUnit) d.ldr.SetAttrReachable(infosym, true) unit.FuncDIEs = append(unit.FuncDIEs, sym.LoaderSym(infosym)) if rangesym != 0 { - rs := len(d.ldr.Data(rangesym)) d.ldr.SetAttrNotInSymbolTable(rangesym, true) d.ldr.SetAttrReachable(rangesym, true) - if d.linkctxt.IsAIX() { - addDwsectCUSize(".debug_ranges", unit.Lib.Pkg, uint64(rs)) - } unit.RangeSyms = append(unit.RangeSyms, sym.LoaderSym(rangesym)) } @@ -1955,72 +1949,170 @@ func dwarfGenerateDebugSyms(ctxt *Link) { linkctxt: ctxt, ldr: ctxt.loader, arch: ctxt.Arch, + dwmu: new(sync.Mutex), } d.dwarfGenerateDebugSyms() } +// dwUnitSyms stores input and output symbols for DWARF generation +// for a given compilation unit. +type dwUnitSyms struct { + // Inputs for a given unit. + lineProlog loader.Sym + lineEpilog loader.Sym + rangeProlog loader.Sym + infoEpilog loader.Sym + + // Outputs for a given unit. + linesyms []loader.Sym + infosyms []loader.Sym + locsyms []loader.Sym + rangessyms []loader.Sym +} + +// 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 +// 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) { + if u.DWInfo.Abbrev != dwarf.DW_ABRV_COMPUNIT_TEXTLESS { + us.linesyms = d.writelines(u, us.lineProlog, us.lineEpilog) + base := loader.Sym(u.Textp[0]) + us.rangessyms = d.writepcranges(u, base, u.PCs, us.rangeProlog) + us.locsyms = d.collectUnitLocs(u) + } + us.infosyms = d.writeUnitInfo(u, abbrevsym, us.infoEpilog) +} + func (d *dwctxt) dwarfGenerateDebugSyms() { abbrevSec := d.writeabbrev() dwarfp = append(dwarfp, abbrevSec) - d.calcCompUnitRanges() sort.Sort(compilationUnitByStartPC(d.linkctxt.compUnits)) - // Create .debug_line and .debug_ranges section symbols - debugLine := d.ldr.CreateSymForUpdate(".debug_line", 0) - debugLine.SetType(sym.SDWARFSECT) - dwarfp = append(dwarfp, dwarfSecInfo{syms: []loader.Sym{debugLine.Sym()}}) - linesec := &dwarfp[len(dwarfp)-1] - - debugRanges := d.ldr.CreateSymForUpdate(".debug_ranges", 0) - debugRanges.SetType(sym.SDWARFRANGE) - - // Write per-package line and range tables and start their CU DIEs. - for _, u := range d.linkctxt.compUnits { - reversetree(&u.DWInfo.Child) - if u.DWInfo.Abbrev == dwarf.DW_ABRV_COMPUNIT_TEXTLESS { - continue - } - linesec.syms = d.writelines(u, linesec.syms) - base := loader.Sym(u.Textp[0]) - d.writepcranges(u, base, u.PCs, debugRanges.Sym()) - } - // newdie adds DIEs to the *beginning* of the parent's DIE list. // Now that we're done creating DIEs, reverse the trees so DIEs // appear in the order they were created. + for _, u := range d.linkctxt.compUnits { + reversetree(&u.DWInfo.Child) + } reversetree(&dwtypes.Child) movetomodule(d.linkctxt, &dwtypes) - infoSym := d.ldr.CreateSymForUpdate(".debug_info", 0) - - infoSec := d.writeinfo(d.linkctxt.compUnits, abbrevSec.secSym(), infoSym.Sym()) - - frameSym := d.ldr.CreateSymForUpdate(".debug_frame", 0) - frameSec := d.writeframes(frameSym.Sym()) + mkSecSym := func(name string) loader.Sym { + s := d.ldr.CreateSymForUpdate(name, 0) + s.SetType(sym.SDWARFSECT) + s.SetReachable(true) + return s.Sym() + } + mkAnonSym := func(kind sym.SymKind) loader.Sym { + s := d.ldr.MakeSymbolUpdater(d.ldr.CreateExtSym("", 0)) + s.SetType(kind) + s.SetReachable(true) + return s.Sym() + } + + // Create the section symbols. + frameSym := mkSecSym(".debug_frame") + locSym := mkSecSym(".debug_loc") + lineSym := mkSecSym(".debug_line") + rangesSym := mkSecSym(".debug_ranges") + infoSym := mkSecSym(".debug_info") + + // Create the section objects + lineSec := dwarfSecInfo{syms: []loader.Sym{lineSym}} + locSec := dwarfSecInfo{syms: []loader.Sym{locSym}} + rangesSec := dwarfSecInfo{syms: []loader.Sym{rangesSym}} + frameSec := dwarfSecInfo{syms: []loader.Sym{frameSym}} + infoSec := dwarfSecInfo{syms: []loader.Sym{infoSym}} + + // Create any new symbols that will be needed during the + // parallel portion below. + ncu := len(d.linkctxt.compUnits) + unitSyms := make([]dwUnitSyms, ncu) + for i := 0; i < ncu; i++ { + us := &unitSyms[i] + us.lineProlog = mkAnonSym(sym.SDWARFLINES) + us.lineEpilog = mkAnonSym(sym.SDWARFLINES) + us.rangeProlog = mkAnonSym(sym.SDWARFRANGE) + us.infoEpilog = mkAnonSym(sym.SDWARFFCN) + } + + var wg sync.WaitGroup + sema := make(chan struct{}, runtime.GOMAXPROCS(0)) + + // Kick off generation of .debug_frame, since it doesn't have + // any entanglements and can be started right away. + wg.Add(1) + go func() { + sema <- struct{}{} + defer func() { + <-sema + wg.Done() + }() + frameSec = d.writeframes(frameSym) + }() + + // Create a goroutine per comp unit to handle the generation that + // unit's portion of .debug_line, .debug_loc, .debug_ranges, and + // .debug_info. + wg.Add(len(d.linkctxt.compUnits)) + for i := 0; i < ncu; i++ { + go func(u *sym.CompilationUnit, us *dwUnitSyms) { + sema <- struct{}{} + defer func() { + <-sema + wg.Done() + }() + d.dwUnitPortion(u, abbrevSec.secSym(), us) + }(d.linkctxt.compUnits[i], &unitSyms[i]) + } + wg.Wait() + + markReachable := func(syms []loader.Sym) []loader.Sym { + for _, s := range syms { + d.ldr.SetAttrNotInSymbolTable(s, true) + d.ldr.SetAttrReachable(s, true) + } + return syms + } + // Stitch together the results. + for i := 0; i < ncu; i++ { + r := &unitSyms[i] + lineSec.syms = append(lineSec.syms, markReachable(r.linesyms)...) + infoSec.syms = append(infoSec.syms, markReachable(r.infosyms)...) + locSec.syms = append(locSec.syms, markReachable(r.locsyms)...) + rangesSec.syms = append(rangesSec.syms, markReachable(r.rangessyms)...) + } + dwarfp = append(dwarfp, lineSec) dwarfp = append(dwarfp, frameSec) gdbScriptSec := d.writegdbscript() if gdbScriptSec.secSym() != 0 { dwarfp = append(dwarfp, gdbScriptSec) } dwarfp = append(dwarfp, infoSec) - locSym := d.ldr.CreateSymForUpdate(".debug_loc", 0) - locSec := d.collectlocs(locSym.Sym()) - if locSec.secSym() != 0 { + if len(locSec.syms) > 1 { dwarfp = append(dwarfp, locSec) } + dwarfp = append(dwarfp, rangesSec) - rsyms := []loader.Sym{debugRanges.Sym()} - for _, unit := range d.linkctxt.compUnits { - for _, s := range unit.RangeSyms { - rsyms = append(rsyms, loader.Sym(s)) + // Check to make sure we haven't listed any symbols more than once + // in the info section. This used to be done by setting and + // checking the OnList attribute in "putdie", but that strategy + // was not friendly for concurrency. + seen := loader.MakeBitmap(d.ldr.NSym()) + for _, s := range infoSec.syms { + if seen.Has(s) { + log.Fatalf("symbol %s listed multiple times", d.ldr.SymName(s)) } + seen.Set(s) } - dwarfp = append(dwarfp, dwarfSecInfo{syms: rsyms}) } -func (d *dwctxt) collectUnitLocs(u *sym.CompilationUnit, syms []loader.Sym) []loader.Sym { +func (d *dwctxt) collectUnitLocs(u *sym.CompilationUnit) []loader.Sym { + syms := []loader.Sym{} for _, fn := range u.FuncDIEs { relocs := d.ldr.Relocs(loader.Sym(fn)) for i := 0; i < relocs.Count(); i++ { @@ -2030,8 +2122,6 @@ func (d *dwctxt) collectUnitLocs(u *sym.CompilationUnit, syms []loader.Sym) []lo } rsym := reloc.Sym() if d.ldr.SymType(rsym) == sym.SDWARFLOC { - d.ldr.SetAttrReachable(rsym, true) - d.ldr.SetAttrNotInSymbolTable(rsym, true) syms = append(syms, rsym) // One location list entry per function, but many relocations to it. Don't duplicate. break @@ -2041,22 +2131,6 @@ func (d *dwctxt) collectUnitLocs(u *sym.CompilationUnit, syms []loader.Sym) []lo return syms } -func (d *dwctxt) collectlocs(locsym loader.Sym) dwarfSecInfo { - syms := []loader.Sym{} - for _, u := range d.linkctxt.compUnits { - syms = d.collectUnitLocs(u, syms) - } - - // Don't emit .debug_loc if it's empty -- it makes the ARM linker mad. - if len(syms) == 0 { - return dwarfSecInfo{} - } - - u := d.ldr.MakeSymbolUpdater(locsym) - u.SetType(sym.SDWARFLOC) - return dwarfSecInfo{syms: append([]loader.Sym{locsym}, syms...)} -} - /* * Elf. */ @@ -2209,6 +2283,7 @@ func (d *dwctxt) getPkgFromCUSym(s loader.Sym) string { // dwsectCUSize map will save the size of a compilation unit for // the corresponding .dw section. // This size can later be retrieved with the index "sectionName.pkgName". +var dwsectCUSizeMu sync.Mutex var dwsectCUSize map[string]uint64 // getDwsectCUSize retrieves the corresponding package size inside the current section. @@ -2217,9 +2292,13 @@ func getDwsectCUSize(sname string, pkgname string) uint64 { } func saveDwsectCUSize(sname string, pkgname string, size uint64) { + dwsectCUSizeMu.Lock() + defer dwsectCUSizeMu.Unlock() dwsectCUSize[sname+"."+pkgname] = size } func addDwsectCUSize(sname string, pkgname string, size uint64) { + dwsectCUSizeMu.Lock() + defer dwsectCUSizeMu.Unlock() dwsectCUSize[sname+"."+pkgname] += size } -- GitLab From 37682f7a797a2f13dcc5496e506bfd662f6e51fd Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sat, 20 Jun 2020 14:38:38 -0400 Subject: [PATCH 0073/1792] [dev.link] cmd/link: apply relocations while writing symbols MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We can apply relocations of a symbol right after the symbol data is copied to output buffer. This should help locality and parallelism (parallelizing over blocks, instead of over segments). Linking cmd/compile, Asmb+Reloc 23.9ms ±18% 16.5ms ±11% -30.73% (p=0.008 n=5+5) Linking cmd/compile with external linking, Asmb+Reloc 74.0ms ± 3% 33.8ms ± 8% -54.32% (p=0.008 n=5+5) In external linking mode, allocation goes up slightly, as we do smaller batching now. It doesn't seem too bad. Asmb+Reloc 15.0MB ± 0% 16.7MB ± 0% +11.22% (p=0.008 n=5+5) Change-Id: Ide33d9ff86c39124c8f5cfc050d7badc753a1ced Reviewed-on: https://go-review.googlesource.com/c/go/+/239197 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/asmb.go | 12 +++++--- src/cmd/link/internal/ld/data.go | 52 ++++++-------------------------- src/cmd/link/internal/ld/main.go | 5 +-- 3 files changed, 19 insertions(+), 50 deletions(-) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index a9987ba207..d4e358cebc 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -6,19 +6,23 @@ package ld import ( "cmd/internal/objabi" - "cmd/link/internal/loader" "fmt" "sync" ) // Assembling the binary is broken into two steps: -// - writing out the code/data/dwarf Segments +// - writing out the code/data/dwarf Segments, applying relocations on the fly // - writing out the architecture specific pieces. // This function handles the first part. -func asmb(ctxt *Link, ldr *loader.Loader) { +func asmb(ctxt *Link) { + ctxt.loader.InitOutData() + if ctxt.IsExternal() { + ctxt.loader.InitExtRelocs() + } + // TODO(jfaller): delete me. if thearch.Asmb != nil { - thearch.Asmb(ctxt, ldr) + thearch.Asmb(ctxt, ctxt.loader) return } diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 73003179ab..ed7129a156 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -640,41 +640,6 @@ func (ctxt *Link) makeRelocSymState() *relocSymState { } } -func (ctxt *Link) reloc() { - var wg sync.WaitGroup - ldr := ctxt.loader - if ctxt.IsExternal() { - ldr.InitExtRelocs() - } - wg.Add(3) - go func() { - if !ctxt.IsWasm() { // On Wasm, text relocations are applied in Asmb2. - st := ctxt.makeRelocSymState() - for _, s := range ctxt.Textp { - st.relocsym(s, ldr.OutData(s)) - } - } - wg.Done() - }() - go func() { - st := ctxt.makeRelocSymState() - for _, s := range ctxt.datap { - st.relocsym(s, ldr.OutData(s)) - } - wg.Done() - }() - go func() { - st := ctxt.makeRelocSymState() - for _, si := range dwarfp { - for _, s := range si.syms { - st.relocsym(s, ldr.OutData(s)) - } - } - wg.Done() - }() - wg.Wait() -} - func windynrelocsym(ctxt *Link, rel *loader.SymbolBuilder, s loader.Sym) { var su *loader.SymbolBuilder relocs := ctxt.loader.Relocs(s) @@ -801,7 +766,7 @@ func (state *dodataState) dynreloc(ctxt *Link) { } func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte) { - writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad) + writeBlocks(ctxt, out, ctxt.outSem, ctxt.loader, ctxt.Textp, addr, size, pad) } const blockSize = 1 << 20 // 1MB chunks written at a time. @@ -811,7 +776,7 @@ const blockSize = 1 << 20 // 1MB chunks written at a time. // as many goroutines as necessary to accomplish this task. This call then // blocks, waiting on the writes to complete. Note that we use the sem parameter // to limit the number of concurrent writes taking place. -func writeBlocks(out *OutBuf, sem chan int, ldr *loader.Loader, syms []loader.Sym, addr, size int64, pad []byte) { +func writeBlocks(ctxt *Link, out *OutBuf, sem chan int, ldr *loader.Loader, syms []loader.Sym, addr, size int64, pad []byte) { for i, s := range syms { if ldr.SymValue(s) >= addr && !ldr.AttrSubSymbol(s) { syms = syms[i:] @@ -876,12 +841,12 @@ func writeBlocks(out *OutBuf, sem chan int, ldr *loader.Loader, syms []loader.Sy sem <- 1 wg.Add(1) go func(o *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size int64, pad []byte) { - writeBlock(o, ldr, syms, addr, size, pad) + writeBlock(ctxt, o, ldr, syms, addr, size, pad) wg.Done() <-sem }(o, ldr, syms, addr, length, pad) } else { // output not mmaped, don't parallelize. - writeBlock(out, ldr, syms, addr, length, pad) + writeBlock(ctxt, out, ldr, syms, addr, length, pad) } // Prepare for the next loop. @@ -894,7 +859,7 @@ func writeBlocks(out *OutBuf, sem chan int, ldr *loader.Loader, syms []loader.Sy wg.Wait() } -func writeBlock(out *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size int64, pad []byte) { +func writeBlock(ctxt *Link, out *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size int64, pad []byte) { for i, s := range syms { if ldr.SymValue(s) >= addr && !ldr.AttrSubSymbol(s) { syms = syms[i:] @@ -902,6 +867,8 @@ func writeBlock(out *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size i } } + st := ctxt.makeRelocSymState() + // This doesn't distinguish the memory size from the file // size, and it lays out the file based on Symbol.Value, which // is the virtual address. DWARF compression changes file sizes, @@ -924,6 +891,7 @@ func writeBlock(out *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size i addr = val } out.WriteSym(ldr, s) + st.relocsym(s, ldr.OutData(s)) addr += int64(len(ldr.Data(s))) siz := ldr.SymSize(s) if addr < val+siz { @@ -973,7 +941,7 @@ func DatblkBytes(ctxt *Link, addr int64, size int64) []byte { } func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) { - writeBlocks(out, ctxt.outSem, ctxt.loader, ctxt.datap, addr, size, zeros[:]) + writeBlocks(ctxt, out, ctxt.outSem, ctxt.loader, ctxt.datap, addr, size, zeros[:]) } func dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) { @@ -991,7 +959,7 @@ func dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) { for i := range dwarfp { syms = append(syms, dwarfp[i].syms...) } - writeBlocks(out, ctxt.outSem, ctxt.loader, syms, addr, size, zeros[:]) + writeBlocks(ctxt, out, ctxt.outSem, ctxt.loader, syms, addr, size, zeros[:]) } var zeros [512]byte diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index e68997f5a2..252c3c5530 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -315,10 +315,7 @@ func Main(arch *sys.Arch, theArch Arch) { // asmb will redirect symbols to the output file mmap, and relocations // will be applied directly there. bench.Start("Asmb") - ctxt.loader.InitOutData() - asmb(ctxt, ctxt.loader) - bench.Start("reloc") - ctxt.reloc() + asmb(ctxt) bench.Start("Asmb2") asmb2(ctxt) -- GitLab From f547046850010e726dc179340fcc8b7b5c470155 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Fri, 19 Jun 2020 15:19:59 -0400 Subject: [PATCH 0074/1792] [dev.link] cmd/link: rescope Datblk to datblk Change should be non-functional. Change-Id: I8ac835762a1aa6458d896b8815cd2d87333b55ab Reviewed-on: https://go-review.googlesource.com/c/go/+/239279 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/asmb.go | 10 +++++----- src/cmd/link/internal/ld/data.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index d4e358cebc..216e9b6cc4 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -45,7 +45,7 @@ func asmb(ctxt *Link) { writeParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length) for _, sect := range Segtext.Sections[1:] { offset := sect.Vaddr - Segtext.Vaddr + Segtext.Fileoff - writeParallel(&wg, Datblk, ctxt, offset, sect.Vaddr, sect.Length) + writeParallel(&wg, datblk, ctxt, offset, sect.Vaddr, sect.Length) } } else { // TODO why can't we handle all sections this way? @@ -55,20 +55,20 @@ func asmb(ctxt *Link) { if sect.Name == ".text" { writeParallel(&wg, f, ctxt, offset, sect.Vaddr, sect.Length) } else { - writeParallel(&wg, Datblk, ctxt, offset, sect.Vaddr, sect.Length) + writeParallel(&wg, datblk, ctxt, offset, sect.Vaddr, sect.Length) } } } if Segrodata.Filelen > 0 { - writeParallel(&wg, Datblk, ctxt, Segrodata.Fileoff, Segrodata.Vaddr, Segrodata.Filelen) + writeParallel(&wg, datblk, ctxt, Segrodata.Fileoff, Segrodata.Vaddr, Segrodata.Filelen) } if Segrelrodata.Filelen > 0 { - writeParallel(&wg, Datblk, ctxt, Segrelrodata.Fileoff, Segrelrodata.Vaddr, Segrelrodata.Filelen) + writeParallel(&wg, datblk, ctxt, Segrelrodata.Fileoff, Segrelrodata.Vaddr, Segrelrodata.Filelen) } - writeParallel(&wg, Datblk, ctxt, Segdata.Fileoff, Segdata.Vaddr, Segdata.Filelen) + writeParallel(&wg, datblk, ctxt, Segdata.Fileoff, Segdata.Vaddr, Segdata.Filelen) writeParallel(&wg, dwarfblk, ctxt, Segdwarf.Fileoff, Segdwarf.Vaddr, Segdwarf.Filelen) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index ed7129a156..5234a2406a 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -928,7 +928,7 @@ func writeParallel(wg *sync.WaitGroup, fn writeFn, ctxt *Link, seek, vaddr, leng } } -func Datblk(ctxt *Link, out *OutBuf, addr, size int64) { +func datblk(ctxt *Link, out *OutBuf, addr, size int64) { writeDatblkToOutBuf(ctxt, out, addr, size) } -- GitLab From f0cf4d4d7f60ed5ae806e6ed410b346bb2fd0b5a Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 22 Jun 2020 13:26:15 -0400 Subject: [PATCH 0075/1792] [dev.link] cmd/{compile,link}: fix file/line of last instruction in DWARF line table The code in the compiler's DWARF line table generation emits line table ops at the end of each function fragment to reset the state machine registers back to an initial state, so that when the line table fragments for each function are stitched together into a compilation unit, each fragment will have a clean starting point. The set-file/set-line ops emitted in this code were being applied to the last row of the line table, however, meaning that they were overwriting the existing values. To avoid this problem, add code to advance the PC past the end of the last instruction in the function, and switch to just using an end-of-sequence operator at the end of each function instead of explicit set-file/set-line ops. Updates #39757. Change-Id: Ieb30f83444fa86fb1f2cd53862d8cc8972bb8763 Reviewed-on: https://go-review.googlesource.com/c/go/+/239286 Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller Reviewed-by: David Chase --- src/cmd/internal/obj/dwarf.go | 46 +++---- src/cmd/link/internal/ld/dwarf.go | 30 +---- src/cmd/link/internal/ld/dwarf_test.go | 119 ++++++++++++++++++ .../ld/testdata/issue39757/issue39757main.go | 15 +++ 4 files changed, 159 insertions(+), 51 deletions(-) create mode 100644 src/cmd/link/internal/ld/testdata/issue39757/issue39757main.go diff --git a/src/cmd/internal/obj/dwarf.go b/src/cmd/internal/obj/dwarf.go index 1811ac7881..3fc93081fa 100644 --- a/src/cmd/internal/obj/dwarf.go +++ b/src/cmd/internal/obj/dwarf.go @@ -51,14 +51,12 @@ func (ctxt *Link) generateDebugLinesSymbol(s, lines *LSym) { dctxt.AddUint8(lines, dwarf.DW_LNE_set_address) dctxt.AddAddress(lines, s, 0) - // Set up the debug_lines state machine. - // NB: This state machine is reset to this state when we've finished - // generating the line table. See below. - // TODO: Once delve can support multiple DW_LNS_end_statements, we don't have - // to do this. + // Set up the debug_lines state machine to the default values + // we expect at the start of a new sequence. stmt := true line := int64(1) pc := s.Func.Text.Pc + var lastpc int64 // last PC written to line table, not last PC in func name := "" prologue, wrotePrologue := false, false // Walk the progs, generating the DWARF table. @@ -93,30 +91,32 @@ func (ctxt *Link) generateDebugLinesSymbol(s, lines *LSym) { if line != int64(newLine) || wrote { pcdelta := p.Pc - pc + lastpc = p.Pc putpclcdelta(ctxt, dctxt, lines, uint64(pcdelta), int64(newLine)-line) line, pc = int64(newLine), p.Pc } } - // Because these symbols will be concatenated together by the linker, we need - // to reset the state machine that controls the debug symbols. The fields in - // the state machine that need to be reset are: - // file = 1 - // line = 1 - // column = 0 - // stmt = set in header, we assume true - // basic_block = false - // Careful readers of the DWARF specification will note that we don't reset - // the address of the state machine -- but this will happen at the beginning - // of the NEXT block of opcodes. - dctxt.AddUint8(lines, dwarf.DW_LNS_set_file) + // Because these symbols will be concatenated together by the + // linker, we need to reset the state machine that controls the + // debug symbols. Do this using an end-of-sequence operator. + // + // Note: at one point in time, Delve did not support multiple end + // sequence ops within a compilation unit (bug for this: + // https://github.com/go-delve/delve/issues/1694), however the bug + // has since been fixed (Oct 2019). + // + // Issue 38192: the DWARF standard specifies that when you issue + // an end-sequence op, the PC value should be one past the last + // text address in the translation unit, so apply a delta to the + // text address before the end sequence op. If this isn't done, + // GDB will assign a line number of zero the last row in the line + // table, which we don't want. + lastlen := uint64(s.Size - (lastpc - s.Func.Text.Pc)) + putpclcdelta(ctxt, dctxt, lines, lastlen, 0) + dctxt.AddUint8(lines, 0) // start extended opcode dwarf.Uleb128put(dctxt, lines, 1) - dctxt.AddUint8(lines, dwarf.DW_LNS_advance_line) - dwarf.Sleb128put(dctxt, lines, int64(1-line)) - if !stmt { - dctxt.AddUint8(lines, dwarf.DW_LNS_negate_stmt) - } - dctxt.AddUint8(lines, dwarf.DW_LNS_copy) + dctxt.AddUint8(lines, dwarf.DW_LNE_end_sequence) } func putpclcdelta(linkctxt *Link, dctxt dwCtxt, s *LSym, deltaPC uint64, deltaLC int64) { diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 39c273a7e5..d15cde4e38 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1181,7 +1181,7 @@ func expandFile(fname string) string { // (one per live function), and finally an epilog symbol containing an // end-of-sequence operator. The prolog and epilog symbols are passed // in (having been created earlier); here we add content to them. -func (d *dwctxt) writelines(unit *sym.CompilationUnit, lineProlog loader.Sym, lineEpilog loader.Sym) []loader.Sym { +func (d *dwctxt) writelines(unit *sym.CompilationUnit, lineProlog loader.Sym) []loader.Sym { is_stmt := uint8(1) // initially = recommended default_is_stmt = 1, tracks is_stmt toggles. unitstart := int64(-1) @@ -1268,30 +1268,6 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, lineProlog loader.Sym, li } } - // NB: at some point if we have an end sequence op - // after each function (to enable reordering) generated - // in the compiler, we can get rid of this. - syms = append(syms, lineEpilog) - elsu := d.ldr.MakeSymbolUpdater(lineEpilog) - elsDwsym := dwSym(lineEpilog) - - // Issue 38192: the DWARF standard specifies that when you issue - // an end-sequence op, the PC value should be one past the last - // text address in the translation unit, so apply a delta to the - // text address before the end sequence op. If this isn't done, - // GDB will assign a line number of zero the last row in the line - // table, which we don't want. The 1 + ptrsize amount is somewhat - // arbitrary, this is chosen to be consistent with the way LLVM - // emits its end sequence ops. - elsu.AddUint8(dwarf.DW_LNS_advance_pc) - dwarf.Uleb128put(d, elsDwsym, int64(1+d.arch.PtrSize)) - - // Emit an end-sequence at the end of the unit. - elsu.AddUint8(0) // start extended opcode - dwarf.Uleb128put(d, elsDwsym, 1) - elsu.AddUint8(dwarf.DW_LNE_end_sequence) - unitlen += elsu.Size() - if d.linkctxt.HeadType == objabi.Haix { addDwsectCUSize(".debug_line", unit.Lib.Pkg, uint64(unitlen)) } @@ -1959,7 +1935,6 @@ func dwarfGenerateDebugSyms(ctxt *Link) { type dwUnitSyms struct { // Inputs for a given unit. lineProlog loader.Sym - lineEpilog loader.Sym rangeProlog loader.Sym infoEpilog loader.Sym @@ -1977,7 +1952,7 @@ type dwUnitSyms struct { // hence they have to happen before the call to writeUnitInfo. func (d *dwctxt) dwUnitPortion(u *sym.CompilationUnit, abbrevsym loader.Sym, us *dwUnitSyms) { if u.DWInfo.Abbrev != dwarf.DW_ABRV_COMPUNIT_TEXTLESS { - us.linesyms = d.writelines(u, us.lineProlog, us.lineEpilog) + us.linesyms = d.writelines(u, us.lineProlog) base := loader.Sym(u.Textp[0]) us.rangessyms = d.writepcranges(u, base, u.PCs, us.rangeProlog) us.locsyms = d.collectUnitLocs(u) @@ -2034,7 +2009,6 @@ func (d *dwctxt) dwarfGenerateDebugSyms() { for i := 0; i < ncu; i++ { us := &unitSyms[i] us.lineProlog = mkAnonSym(sym.SDWARFLINES) - us.lineEpilog = mkAnonSym(sym.SDWARFLINES) us.rangeProlog = mkAnonSym(sym.SDWARFRANGE) us.infoEpilog = mkAnonSym(sym.SDWARFFCN) } diff --git a/src/cmd/link/internal/ld/dwarf_test.go b/src/cmd/link/internal/ld/dwarf_test.go index fb9c45b07d..f3dd53792a 100644 --- a/src/cmd/link/internal/ld/dwarf_test.go +++ b/src/cmd/link/internal/ld/dwarf_test.go @@ -1479,3 +1479,122 @@ func TestIssue38192(t *testing.T) { t.Logf("row %d: A=%x F=%s L=%d\n", i, r.Address, r.File.Name, r.Line) } } + +func TestIssue39757(t *testing.T) { + testenv.MustHaveGoBuild(t) + + if runtime.GOOS == "plan9" { + t.Skip("skipping on plan9; no DWARF symbol table in executables") + } + + // In this bug the DWARF line table contents for the last couple of + // instructions in a function were incorrect (bad file/line). This + // test verifies that all of the line table rows for a function + // of interest have the same file (no "autogenerated"). + // + // Note: the function in this test was written with an eye towards + // ensuring that there are no inlined routines from other packages + // (which could introduce other source files into the DWARF); it's + // possible that at some point things could evolve in the + // compiler/runtime in ways that aren't happening now, so this + // might be something to check for if it does start failing. + + tmpdir, err := ioutil.TempDir("", "TestIssue38192") + if err != nil { + t.Fatalf("could not create directory: %v", err) + } + defer os.RemoveAll(tmpdir) + wd, err := os.Getwd() + if err != nil { + t.Fatalf("where am I? %v", err) + } + pdir := filepath.Join(wd, "testdata", "issue39757") + f := gobuildTestdata(t, tmpdir, pdir, DefaultOpt) + + syms, err := f.Symbols() + if err != nil { + t.Fatal(err) + } + + var addr uint64 + for _, sym := range syms { + if sym.Name == "main.main" { + addr = sym.Addr + break + } + } + if addr == 0 { + t.Fatal("cannot find main.main in symbols") + } + + // Open the resulting binary and examine the DWARF it contains. + // Look for the function of interest ("main.main") + // and verify that all line table entries show the same source + // file. + dw, err := f.DWARF() + if err != nil { + t.Fatalf("error parsing DWARF: %v", err) + } + rdr := dw.Reader() + ex := 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] + + // Collect the start/end PC for main.main + lowpc := maindie.Val(dwarf.AttrLowpc).(uint64) + highpc := maindie.Val(dwarf.AttrHighpc).(uint64) + + // Now read the line table for the 'main' compilation unit. + mainIdx := ex.idxFromOffset(maindie.Offset) + cuentry := ex.Parent(mainIdx) + if cuentry == nil { + t.Fatalf("main.main DIE appears orphaned") + } + lnrdr, lerr := dw.LineReader(cuentry) + if lerr != nil { + t.Fatalf("error creating DWARF line reader: %v", err) + } + if lnrdr == nil { + t.Fatalf("no line table for main.main compilation unit") + } + rows := []dwarf.LineEntry{} + mainrows := 0 + var lne dwarf.LineEntry + for { + err := lnrdr.Next(&lne) + if err == io.EOF { + break + } + rows = append(rows, lne) + if err != nil { + t.Fatalf("error reading next DWARF line: %v", err) + } + if lne.Address < lowpc || lne.Address > highpc { + continue + } + if !strings.HasSuffix(lne.File.Name, "issue39757main.go") { + t.Errorf("found row with file=%s (not issue39757main.go)", lne.File.Name) + } + mainrows++ + } + f.Close() + + // Make sure we saw a few rows. + if mainrows < 3 { + t.Errorf("not enough line table rows for main.main (got %d, wanted > 3", mainrows) + for i, r := range rows { + t.Logf("row %d: A=%x F=%s L=%d\n", i, r.Address, r.File.Name, r.Line) + } + } +} diff --git a/src/cmd/link/internal/ld/testdata/issue39757/issue39757main.go b/src/cmd/link/internal/ld/testdata/issue39757/issue39757main.go new file mode 100644 index 0000000000..76e0ea1b08 --- /dev/null +++ b/src/cmd/link/internal/ld/testdata/issue39757/issue39757main.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. + +package main + +var G int + +func main() { + if G != 101 { + println("not 101") + } else { + println("well now that's interesting") + } +} -- GitLab From a89fd32316954dea9fa87e45b266eb2e648f7f8e Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 23 Jun 2020 17:29:17 -0400 Subject: [PATCH 0076/1792] [dev.link] cmd/link: fix data race on AIX On AIX, in relocsym we call Xcoffadddynrel, which adds a relocation record to a global array. relocsym already runs in parallel. In the past we only parallelize over segments, and we call Xcoffadddynrel only for symbols in data segment, so it is effectively called sequentially. In CL 239197 we started to do more fine-grained parallelism, so we need to make sure it is safe to call Xcoffadddynrel in parallel. Fix AIX build. Change-Id: I3128193995a5a99d9fa04c8e728e590f17298da3 Reviewed-on: https://go-review.googlesource.com/c/go/+/239561 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/xcoff.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index e5ed847b54..9e3b8e2a0c 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -16,6 +16,7 @@ import ( "path/filepath" "sort" "strings" + "sync" ) // This file handles all algorithms related to XCOFF files generation. @@ -417,6 +418,7 @@ type xcoffFile struct { dynLibraries map[string]int // Dynamic libraries in .loader section. The integer represents its import file number (- 1) loaderSymbols []*xcoffLoaderSymbol // symbols inside .loader symbol table loaderReloc []*xcoffLoaderReloc // Reloc that must be made inside loader + sync.Mutex // currently protect loaderReloc } // Var used by XCOFF Generation algorithms @@ -1265,7 +1267,9 @@ func Xcoffadddynrel(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader xldr.rtype = 0x3F<<8 + XCOFF_R_POS } + xfile.Lock() xfile.loaderReloc = append(xfile.loaderReloc, xldr) + xfile.Unlock() return true } @@ -1398,6 +1402,21 @@ func (f *xcoffFile) writeLdrScn(ctxt *Link, globalOff uint64) { off := hdr.Lrldoff // current offset is the same of reloc offset /* Reloc */ + // Ensure deterministic order + sort.Slice(f.loaderReloc, func(i, j int) bool { + r1, r2 := f.loaderReloc[i], f.loaderReloc[j] + if r1.sym != r2.sym { + return r1.sym < r2.sym + } + if r1.roff != r2.roff { + return r1.roff < r2.roff + } + if r1.rtype != r2.rtype { + return r1.rtype < r2.rtype + } + return r1.symndx < r2.symndx + }) + ep := ldr.Lookup(*flagEntrySymbol, 0) xldr := &XcoffLdRel64{ Lvaddr: uint64(ldr.SymValue(ep)), -- GitLab From be38746eb49a479118c8e7833c106687a28676e2 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 17 Jun 2020 10:41:56 -0400 Subject: [PATCH 0077/1792] [dev.link] cmd/internal/obj: don't write builtin names in obj writer Change the object file writer to avoid adding entries to the object file string table for builtin functions. This helps save some very small amount of space in the object file. Change-Id: Ic3b94a154e00eb4c7378b57613580c7073b841bc Reviewed-on: https://go-review.googlesource.com/c/go/+/239657 Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/internal/obj/objfile2.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 898f0a113a..b12b6fe84c 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -208,6 +208,11 @@ func (w *writer) StringTable() { if w.pkgpath != "" { s.Name = strings.Replace(s.Name, "\"\".", w.pkgpath+".", -1) } + // Don't put names of builtins into the string table (to save + // space). + if s.PkgIdx == goobj2.PkgIdxBuiltin { + return + } w.AddString(s.Name) }) w.ctxt.traverseSyms(traverseDefs, func(s *LSym) { -- GitLab From cbfced7415f6b0ac0be0182cb929e336d5d33ea3 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 17 Jun 2020 11:42:47 -0400 Subject: [PATCH 0078/1792] [dev.link] cmd/internal: convert basic types to builtin symbols The Go compiler includes special treatment for a small set of very commonly used type symbols (26 to be exact); for these types it doesn't bother to emit type descriptors for "normal" compilations, and instead only generates them for the runtime package, so as to reduce object file bloat. This patch moves the set of type symbols in question from the PkgIdxNone index space (in the object file) to the PkgIdxBuiltin space, which saves some work in the compiler and loader (reduces each package's index space slightly). Change-Id: I039c805e05c1aef26f035e52760fd0a0af40f7a5 Reviewed-on: https://go-review.googlesource.com/c/go/+/239658 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/internal/goobj2/builtinlist.go | 38 ++++++++++++++++++++++++++ src/cmd/internal/goobj2/mkbuiltin.go | 36 +++++++++++++++++++++--- src/cmd/link/internal/loader/loader.go | 4 ++- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/cmd/internal/goobj2/builtinlist.go b/src/cmd/internal/goobj2/builtinlist.go index 8fbbe45261..171f57f15f 100644 --- a/src/cmd/internal/goobj2/builtinlist.go +++ b/src/cmd/internal/goobj2/builtinlist.go @@ -7,6 +7,7 @@ var builtins = [...]struct { abi int }{ {"runtime.newobject", 1}, + {"runtime.mallocgc", 1}, {"runtime.panicdivide", 1}, {"runtime.panicshift", 1}, {"runtime.panicmakeslicelen", 1}, @@ -127,6 +128,7 @@ var builtins = [...]struct { {"runtime.block", 1}, {"runtime.makeslice", 1}, {"runtime.makeslice64", 1}, + {"runtime.makeslicecopy", 1}, {"runtime.growslice", 1}, {"runtime.memmove", 1}, {"runtime.memclrNoHeapPointers", 1}, @@ -204,4 +206,40 @@ var builtins = [...]struct { {"runtime.morestack", 0}, {"runtime.morestackc", 0}, {"runtime.morestack_noctxt", 0}, + {"type.int8", 0}, + {"type.*int8", 0}, + {"type.uint8", 0}, + {"type.*uint8", 0}, + {"type.int16", 0}, + {"type.*int16", 0}, + {"type.uint16", 0}, + {"type.*uint16", 0}, + {"type.int32", 0}, + {"type.*int32", 0}, + {"type.uint32", 0}, + {"type.*uint32", 0}, + {"type.int64", 0}, + {"type.*int64", 0}, + {"type.uint64", 0}, + {"type.*uint64", 0}, + {"type.float32", 0}, + {"type.*float32", 0}, + {"type.float64", 0}, + {"type.*float64", 0}, + {"type.complex64", 0}, + {"type.*complex64", 0}, + {"type.complex128", 0}, + {"type.*complex128", 0}, + {"type.unsafe.Pointer", 0}, + {"type.*unsafe.Pointer", 0}, + {"type.uintptr", 0}, + {"type.*uintptr", 0}, + {"type.bool", 0}, + {"type.*bool", 0}, + {"type.string", 0}, + {"type.*string", 0}, + {"type.error", 0}, + {"type.*error", 0}, + {"type.func(error) string", 0}, + {"type.*func(error) string", 0}, } diff --git a/src/cmd/internal/goobj2/mkbuiltin.go b/src/cmd/internal/goobj2/mkbuiltin.go index d773e53e59..4838fa2a67 100644 --- a/src/cmd/internal/goobj2/mkbuiltin.go +++ b/src/cmd/internal/goobj2/mkbuiltin.go @@ -21,6 +21,7 @@ import ( "log" "os" "path/filepath" + "strings" ) var stdout = flag.Bool("stdout", false, "write to stdout instead of builtinlist.go") @@ -98,9 +99,15 @@ func mkbuiltin(w io.Writer) { // The list above only contains ones that are used by the frontend. // The backend may create more references of builtin functions. + // We also want to include predefined types. // Add them. - for _, b := range extra { - name := pkg + "." + b.name + extras := append(fextras[:], enumerateBasicTypes()...) + for _, b := range extras { + prefix := "" + if !strings.HasPrefix(b.name, "type.") { + prefix = pkg + "." + } + name := prefix + b.name if decls[name] { log.Fatalf("%q already added -- mkbuiltin.go out of sync?", name) } @@ -109,10 +116,31 @@ func mkbuiltin(w io.Writer) { fmt.Fprintln(w, "}") } -var extra = [...]struct { +// addBasicTypes returns the symbol names for basic types that are +// defined in the runtime and referenced in other packages. +// Needs to be kept in sync with reflect.go:dumpbasictypes() and +// reflect.go:dtypesym() in the compiler. +func enumerateBasicTypes() []extra { + names := [...]string{ + "int8", "uint8", "int16", "uint16", + "int32", "uint32", "int64", "uint64", + "float32", "float64", "complex64", "complex128", + "unsafe.Pointer", "uintptr", "bool", "string", "error", + "func(error) string"} + result := []extra{} + for _, n := range names { + result = append(result, extra{"type." + n, 0}) + result = append(result, extra{"type.*" + n, 0}) + } + return result +} + +type extra struct { name string abi int -}{ +} + +var fextras = [...]extra{ // compiler frontend inserted calls (sysfunc) {"deferproc", 1}, {"deferprocStack", 1}, diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 7cebe23065..8bc5fe21e4 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1980,6 +1980,7 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { } l.growAttrBitmaps(len(l.objSyms) + int(end-start)) needNameExpansion := r.NeedNameExpansion() + loadingRuntimePkg := r.unit.Lib.Pkg == "runtime" for i := start; i < end; i++ { osym := r.Sym(i) name := osym.Name(r.Reader) @@ -2005,7 +2006,8 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { if strings.HasPrefix(name, "go.itablink.") { l.itablink[gi] = struct{}{} } - if strings.HasPrefix(name, "runtime.") { + if strings.HasPrefix(name, "runtime.") || + (loadingRuntimePkg && strings.HasPrefix(name, "type.")) { if bi := goobj2.BuiltinIdx(name, v); bi != -1 { // This is a definition of a builtin symbol. Record where it is. l.builtinSyms[bi] = gi -- GitLab From f033e23414f82c37fe200a5de6e5eb9a0bccaf7c Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Fri, 19 Jun 2020 15:35:28 -0400 Subject: [PATCH 0079/1792] [dev.link] cmd/link: add generator symbols Create a new class of symbols internal to the linker. These symbols live in the Loader, and are real smybols, but have no data, only size. After symbols are allocated in the binary in asmb() a function is called that is responsible for filling in the data. This allows the linker to create large symbols, but not pay the price on the heap memory. Change-Id: Ib4291fc6e578478057ed2ec163d7b27426f1d5ff Reviewed-on: https://go-review.googlesource.com/c/go/+/239280 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/link.go | 31 ++++++++++++++++++++++++++ src/cmd/link/internal/ld/main.go | 4 ++++ src/cmd/link/internal/ld/outbuf.go | 20 ++++++++++++----- src/cmd/link/internal/ld/sym.go | 1 + src/cmd/link/internal/loader/loader.go | 24 ++++++++++++++++++++ 5 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 9ad477e047..51ea17243f 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -93,6 +93,12 @@ type Link struct { // Elf symtab variables. numelfsym int // starts at 0, 1 is reserved + + // These are symbols that created and written by the linker. + // Rather than creating a symbol, and writing all its data into the heap, + // you can create a symbol, and just a generation function will be called + // after the symbol's been created in the output mmap. + generatorSyms map[loader.Sym]generatorFunc } type cgodata struct { @@ -144,3 +150,28 @@ func (ctxt *Link) IncVersion() int { func (ctxt *Link) MaxVersion() int { return ctxt.version } + +// generatorFunc is a convenience type. +// Linker created symbols that are large, and shouldn't really live in the +// heap can define a generator function, and their bytes can be generated +// directly in the output mmap. +// +// Generator symbols shouldn't grow the symbol size, and might be called in +// parallel in the future. +// +// Generator Symbols have their Data and OutData set to the mmapped area when +// the generator is called. +type generatorFunc func(*Link, loader.Sym) + +// createGeneratorSymbol is a convenience method for creating a generator +// symbol. +func (ctxt *Link) createGeneratorSymbol(name string, version int, t sym.SymKind, size int64, gen generatorFunc) loader.Sym { + ldr := ctxt.loader + s := ldr.LookupOrCreateSym(name, version) + ldr.SetIsGeneratedSym(s, true) + sb := ldr.MakeSymbolUpdater(s) + sb.SetType(t) + sb.SetSize(size) + ctxt.generatorSyms[s] = gen + return s +} diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 252c3c5530..d9ff359b35 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -316,6 +316,10 @@ func Main(arch *sys.Arch, theArch Arch) { // will be applied directly there. bench.Start("Asmb") asmb(ctxt) + // Generate large symbols. + for s, f := range ctxt.generatorSyms { + f(ctxt, s) + } bench.Start("Asmb2") asmb2(ctxt) diff --git a/src/cmd/link/internal/ld/outbuf.go b/src/cmd/link/internal/ld/outbuf.go index 09162ae90f..b474067dd9 100644 --- a/src/cmd/link/internal/ld/outbuf.go +++ b/src/cmd/link/internal/ld/outbuf.go @@ -285,10 +285,18 @@ func (out *OutBuf) WriteStringPad(s string, n int, pad []byte) { // edit to the symbol content. // If the output file is not Mmap'd, just writes the content. func (out *OutBuf) WriteSym(ldr *loader.Loader, s loader.Sym) { - P := ldr.Data(s) - n := int64(len(P)) - pos, buf := out.writeLoc(n) - copy(buf[pos:], P) - out.off += n - ldr.SetOutData(s, buf[pos:pos+n]) + if !ldr.IsGeneratedSym(s) { + P := ldr.Data(s) + n := int64(len(P)) + pos, buf := out.writeLoc(n) + copy(buf[pos:], P) + out.off += n + ldr.SetOutData(s, buf[pos:pos+n]) + } else { + n := ldr.SymSize(s) + pos, buf := out.writeLoc(n) + out.off += n + ldr.SetOutData(s, buf[pos:pos+n]) + ldr.MakeSymbolUpdater(s).SetData(buf[pos : pos+n]) + } } diff --git a/src/cmd/link/internal/ld/sym.go b/src/cmd/link/internal/ld/sym.go index 3f269453c0..75489720cc 100644 --- a/src/cmd/link/internal/ld/sym.go +++ b/src/cmd/link/internal/ld/sym.go @@ -50,6 +50,7 @@ func linknew(arch *sys.Arch) *Link { LibraryByPkg: make(map[string]*sym.Library), numelfsym: 1, ErrorReporter: ErrorReporter{ErrorReporter: ler}, + generatorSyms: make(map[loader.Sym]generatorFunc), } if objabi.GOARCH != arch.Name { diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 8bc5fe21e4..4580bdc9de 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -256,6 +256,7 @@ type Loader struct { 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 @@ -355,6 +356,7 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor attrSpecial: make(map[Sym]struct{}), attrCgoExportDynamic: make(map[Sym]struct{}), attrCgoExportStatic: make(map[Sym]struct{}), + generatedSyms: make(map[Sym]struct{}), itablink: make(map[Sym]struct{}), deferReturnTramp: make(map[Sym]bool), extStaticSyms: make(map[nameVer]Sym), @@ -976,6 +978,28 @@ func (l *Loader) SetAttrCgoExportStatic(i Sym, v bool) { } } +// IsGeneratedSym returns true if a symbol's been previously marked as a +// 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 +} + +// SetIsGeneratedSym marks symbols as generated symbols. Data shouldn't be +// stored in generated symbols, and a function is registered and called for +// each of these symbols. +func (l *Loader) SetIsGeneratedSym(i Sym, v bool) { + if !l.IsExternal(i) { + panic("only external symbols can be generated") + } + if v { + l.generatedSyms[i] = struct{}{} + } else { + delete(l.generatedSyms, i) + } +} + func (l *Loader) AttrCgoExport(i Sym) bool { return l.AttrCgoExportDynamic(i) || l.AttrCgoExportStatic(i) } -- GitLab From 1fdf5ba50cf67d28dffb4a4f0e29fcb053d660ad Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Mon, 22 Jun 2020 11:11:12 -0400 Subject: [PATCH 0080/1792] [dev.link] cmd/link: move findfunctab to a generated symbol MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Basically removes all allocation from findfunctab: Findfunctab_GC 172kB ± 0% 0kB ± 0% ~ (p=1.000 n=1+1) Change-Id: I246f7d2751317886b658f7ef672fb30b3c519668 Reviewed-on: https://go-review.googlesource.com/c/go/+/239281 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/pcln.go | 110 ++++++++++++++++--------------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 81f1a2d40b..5bbfbb02c1 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -585,9 +585,6 @@ const ( // a given text symbols is a container (outer sym). func (ctxt *Link) findfunctab(container loader.Bitmap) { ldr := ctxt.loader - t := ldr.CreateSymForUpdate("runtime.findfunctab", 0) - t.SetType(sym.SRODATA) - ldr.SetAttrLocal(t.Sym(), true) // find min and max address min := ldr.SymValue(ctxt.Textp[0]) @@ -598,67 +595,74 @@ func (ctxt *Link) findfunctab(container loader.Bitmap) { // that map to that subbucket. n := int32((max - min + SUBBUCKETSIZE - 1) / SUBBUCKETSIZE) - indexes := make([]int32, n) - for i := int32(0); i < n; i++ { - indexes[i] = NOIDX - } - idx := int32(0) - for i, s := range ctxt.Textp { - if !emitPcln(ctxt, s, container) { - continue - } - p := ldr.SymValue(s) - var e loader.Sym - i++ - if i < len(ctxt.Textp) { - e = ctxt.Textp[i] + nbuckets := int32((max - min + BUCKETSIZE - 1) / BUCKETSIZE) + + size := 4*int64(nbuckets) + int64(n) + + writeFindFuncTab := func(_ *Link, s loader.Sym) { + t := ldr.MakeSymbolUpdater(s) + + indexes := make([]int32, n) + for i := int32(0); i < n; i++ { + indexes[i] = NOIDX } - for e != 0 && !emitPcln(ctxt, e, container) && i < len(ctxt.Textp) { - e = ctxt.Textp[i] + idx := int32(0) + for i, s := range ctxt.Textp { + if !emitPcln(ctxt, s, container) { + continue + } + p := ldr.SymValue(s) + var e loader.Sym i++ - } - q := max - if e != 0 { - q = ldr.SymValue(e) - } + if i < len(ctxt.Textp) { + e = ctxt.Textp[i] + } + for e != 0 && !emitPcln(ctxt, e, container) && i < len(ctxt.Textp) { + e = ctxt.Textp[i] + i++ + } + q := max + if e != 0 { + q = ldr.SymValue(e) + } + + //print("%d: [%lld %lld] %s\n", idx, p, q, s->name); + for ; p < q; p += SUBBUCKETSIZE { + i = int((p - min) / SUBBUCKETSIZE) + if indexes[i] > idx { + indexes[i] = idx + } + } - //print("%d: [%lld %lld] %s\n", idx, p, q, s->name); - for ; p < q; p += SUBBUCKETSIZE { - i = int((p - min) / SUBBUCKETSIZE) + i = int((q - 1 - min) / SUBBUCKETSIZE) if indexes[i] > idx { indexes[i] = idx } + idx++ } - i = int((q - 1 - min) / SUBBUCKETSIZE) - if indexes[i] > idx { - indexes[i] = idx - } - idx++ - } - - // allocate table - nbuckets := int32((max - min + BUCKETSIZE - 1) / BUCKETSIZE) - - t.Grow(4*int64(nbuckets) + int64(n)) - - // fill in table - for i := int32(0); i < nbuckets; i++ { - base := indexes[i*SUBBUCKETS] - if base == NOIDX { - Errorf(nil, "hole in findfunctab") - } - t.SetUint32(ctxt.Arch, int64(i)*(4+SUBBUCKETS), uint32(base)) - for j := int32(0); j < SUBBUCKETS && i*SUBBUCKETS+j < n; j++ { - idx = indexes[i*SUBBUCKETS+j] - if idx == NOIDX { + // fill in table + for i := int32(0); i < nbuckets; i++ { + base := indexes[i*SUBBUCKETS] + if base == NOIDX { Errorf(nil, "hole in findfunctab") } - if idx-base >= 256 { - Errorf(nil, "too many functions in a findfunc bucket! %d/%d %d %d", i, nbuckets, j, idx-base) - } + t.SetUint32(ctxt.Arch, int64(i)*(4+SUBBUCKETS), uint32(base)) + for j := int32(0); j < SUBBUCKETS && i*SUBBUCKETS+j < n; j++ { + idx = indexes[i*SUBBUCKETS+j] + if idx == NOIDX { + Errorf(nil, "hole in findfunctab") + } + if idx-base >= 256 { + Errorf(nil, "too many functions in a findfunc bucket! %d/%d %d %d", i, nbuckets, j, idx-base) + } - t.SetUint8(ctxt.Arch, int64(i)*(4+SUBBUCKETS)+4+int64(j), uint8(idx-base)) + t.SetUint8(ctxt.Arch, int64(i)*(4+SUBBUCKETS)+4+int64(j), uint8(idx-base)) + } } } + + s := ctxt.createGeneratorSymbol("runtime.findfunctab", 0, sym.SRODATA, size, writeFindFuncTab) + ldr.SetAttrReachable(s, true) + ldr.SetAttrLocal(s, true) } -- GitLab From a9a1217112aa8f5e01fe2f3e5f203ac880dbd566 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 25 Jun 2020 22:22:59 -0400 Subject: [PATCH 0081/1792] [dev.link] cmd/link: handle runtime.text/etext symbols more consistently Currently, on most platforms, the start/end symbols runtime.text and runtime.etext are defined in symtab pass and assigned values in address pass. In some cases (darwin+dynlink or AIX+external), however, they are defined and assigned values in textaddress pass (because they need non-zero sizes). Then their values get overwritten in address pass. This is bad. The linker expects their values to be consistent. In particular, in CL 239281, findfunctab is split to two parts. The two parts need to have a consistent view of the start/end symbols. If its value changes in between, bad things can happen. This CL fixes it by always defining runtime.text/etext symbols in the textaddress pass. Fix darwin and AIX builds. Change-Id: Ifdc1bcb69d99be1b7e5b4fd31d473650c03e3b9d Reviewed-on: https://go-review.googlesource.com/c/go/+/240065 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/data.go | 26 +++++++++----------------- src/cmd/link/internal/ld/lib.go | 3 ++- src/cmd/link/internal/ld/symtab.go | 2 -- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 5234a2406a..be1af4bcae 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2084,8 +2084,9 @@ func (ctxt *Link) textaddress() { sect.Align = int32(Funcalign) ldr := ctxt.loader - text := ldr.LookupOrCreateSym("runtime.text", 0) - ldr.SetAttrReachable(text, true) + + text := ctxt.xdefine("runtime.text", sym.STEXT, 0) + etext := ctxt.xdefine("runtime.etext", sym.STEXT, 0) ldr.SetSymSect(text, sect) if ctxt.IsAIX() && ctxt.IsExternal() { // Setting runtime.text has a real symbol prevents ld to @@ -2097,9 +2098,7 @@ func (ctxt *Link) textaddress() { } if (ctxt.DynlinkingGo() && ctxt.IsDarwin()) || (ctxt.IsAIX() && ctxt.IsExternal()) { - etext := ldr.LookupOrCreateSym("runtime.etext", 0) ldr.SetSymSect(etext, sect) - ctxt.Textp = append(ctxt.Textp, etext, 0) copy(ctxt.Textp[1:], ctxt.Textp) ctxt.Textp[0] = text @@ -2126,9 +2125,13 @@ func (ctxt *Link) textaddress() { } sect.Length = va - sect.Vaddr - etext := ldr.LookupOrCreateSym("runtime.etext", 0) - ldr.SetAttrReachable(etext, true) ldr.SetSymSect(etext, sect) + if ldr.SymValue(etext) == 0 { + // Set the address of the start/end symbols, if not already + // (i.e. not darwin+dynlink or AIX+external, see above). + ldr.SetSymValue(etext, int64(va)) + ldr.SetSymValue(text, *FlagTextAddr) + } // merge tramps into Textp, keeping Textp in address order if ntramps != 0 { @@ -2351,20 +2354,12 @@ func (ctxt *Link) address() []*sym.Segment { ldr := ctxt.loader var ( - text = Segtext.Sections[0] rodata = ldr.SymSect(ldr.LookupOrCreateSym("runtime.rodata", 0)) itablink = ldr.SymSect(ldr.LookupOrCreateSym("runtime.itablink", 0)) symtab = ldr.SymSect(ldr.LookupOrCreateSym("runtime.symtab", 0)) pclntab = ldr.SymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0)) types = ldr.SymSect(ldr.LookupOrCreateSym("runtime.types", 0)) ) - lasttext := text - // Could be multiple .text sections - for _, sect := range Segtext.Sections { - if sect.Name == ".text" { - lasttext = sect - } - } for _, s := range ctxt.datap { if sect := ldr.SymSect(s); sect != nil { @@ -2399,9 +2394,6 @@ func (ctxt *Link) address() []*sym.Segment { ldr.SetSymValue(s, int64(sect.Vaddr+16)) } - ctxt.xdefine("runtime.text", sym.STEXT, int64(text.Vaddr)) - ctxt.xdefine("runtime.etext", sym.STEXT, int64(lasttext.Vaddr+lasttext.Length)) - // If there are multiple text sections, create runtime.text.n for // their section Vaddr, using n for index n := 1 diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index ed59e6af27..fbf72f6715 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2376,13 +2376,14 @@ const ( DeletedAutoSym = 'x' ) -func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) { +func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) loader.Sym { ldr := ctxt.loader s := ldr.CreateSymForUpdate(p, 0) s.SetType(t) s.SetValue(v) s.SetSpecial(true) s.SetLocal(true) + return s.Sym() } func datoff(ldr *loader.Loader, s loader.Sym, addr int64) int64 { diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 1c70a94e1a..a2aabbb108 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -409,8 +409,6 @@ func (ctxt *Link) symtab() []sym.SymKind { // Define these so that they'll get put into the symbol table. // data.c:/^address will provide the actual values. - ctxt.xdefine("runtime.text", sym.STEXT, 0) - ctxt.xdefine("runtime.etext", sym.STEXT, 0) ctxt.xdefine("runtime.itablink", sym.SRODATA, 0) ctxt.xdefine("runtime.eitablink", sym.SRODATA, 0) ctxt.xdefine("runtime.rodata", sym.SRODATA, 0) -- GitLab From 7dbd40babff7998a16b8e71fb583a082be4bb547 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 25 Jun 2020 22:38:14 -0400 Subject: [PATCH 0082/1792] [dev.link] cmd/link: remove special dynlinkingGo case in pclntab pass Now that we removed the "weird thing" about runtime.etext symbol, we can remove this special case. Change-Id: I2e4558367758d37e898a802bcd30671c7dd6fe89 Reviewed-on: https://go-review.googlesource.com/c/go/+/240066 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/pcln.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 5bbfbb02c1..b23313d9e5 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -324,16 +324,12 @@ func (ctxt *Link) pclntab() loader.Bitmap { } setAddr := (*loader.SymbolBuilder).SetAddrPlus - if ctxt.IsExe() && ctxt.IsInternal() && !ctxt.DynlinkingGo() { + if ctxt.IsExe() && ctxt.IsInternal() { // Internal linking static executable. At this point the function // addresses are known, so we can just use them instead of emitting // relocations. // For other cases we are generating a relocatable binary so we // still need to emit relocations. - // - // Also not do this optimization when using plugins (DynlinkingGo), - // as on darwin it does weird things with runtime.etext symbol. - // TODO: remove the weird thing and remove this condition. setAddr = func(s *loader.SymbolBuilder, arch *sys.Arch, off int64, tgt loader.Sym, add int64) int64 { if v := ldr.SymValue(tgt); v != 0 { return s.SetUint(arch, off, uint64(v+add)) -- GitLab From b473a1f8da2998be9dee2b0e59a6854a4955dba1 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 26 Jun 2020 14:06:41 -0400 Subject: [PATCH 0083/1792] [dev.link] cmd/link: read symbol type only when necessary in elfreloc1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Slightly speeds up Asmb2. Linking cmd/compile with external linking: Asmb2 190ms ± 2% 182ms ± 2% -4.14% (p=0.000 n=10+9) Change-Id: I55511d0e7b0511b60f8d02390076f8566bc7d135 Reviewed-on: https://go-review.googlesource.com/c/go/+/240397 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/asm.go | 5 ++--- src/cmd/link/internal/s390x/asm.go | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 659c03e5dc..e07321f855 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -389,7 +389,6 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() - xst := ldr.SymType(r.Xsym) switch r.Type() { default: return false @@ -415,7 +414,7 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo } case objabi.R_CALL: if siz == 4 { - if xst == sym.SDYNIMPORT { + if ldr.SymType(r.Xsym) == sym.SDYNIMPORT { if ctxt.DynlinkingGo() { ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { @@ -429,7 +428,7 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo } case objabi.R_PCREL: if siz == 4 { - if xst == sym.SDYNIMPORT && ldr.SymElfType(r.Xsym) == elf.STT_FUNC { + if ldr.SymType(r.Xsym) == sym.SDYNIMPORT && ldr.SymElfType(r.Xsym) == elf.STT_FUNC { ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 11406ee51e..f9bb12bb19 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -224,7 +224,6 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() - xst := ldr.SymType(r.Xsym) switch r.Type() { default: return false @@ -271,7 +270,7 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo case objabi.R_PCRELDBL, objabi.R_CALL: isdbl = true } - if xst == sym.SDYNIMPORT && (ldr.SymElfType(r.Xsym) == elf.STT_FUNC || r.Type() == objabi.R_CALL) { + if ldr.SymType(r.Xsym) == sym.SDYNIMPORT && (ldr.SymElfType(r.Xsym) == elf.STT_FUNC || r.Type() == objabi.R_CALL) { if isdbl { switch siz { case 2: -- GitLab From 364d3205045b694a6c89a8d9ad932e7c105d0f6c Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 26 Jun 2020 19:54:00 -0400 Subject: [PATCH 0084/1792] [dev.link] cmd/link: stop Seek file in munmap If mmap is used, we don't do file I/O anymore, so no need to Seek in the file either. Change-Id: Ic8350eb66404398420df18560f6a7acbb3fcf7e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/240398 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/outbuf_mmap.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/cmd/link/internal/ld/outbuf_mmap.go b/src/cmd/link/internal/ld/outbuf_mmap.go index 41c436e9c9..7280027e92 100644 --- a/src/cmd/link/internal/ld/outbuf_mmap.go +++ b/src/cmd/link/internal/ld/outbuf_mmap.go @@ -38,8 +38,4 @@ func (out *OutBuf) munmap() { } syscall.Munmap(out.buf) out.buf = nil - _, err := out.f.Seek(out.off, 0) - if err != nil { - Exitf("seek output file failed: %v", err) - } } -- GitLab From 987ce938245566f8a8568cb3b7f43ff8442c2353 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 26 Jun 2020 16:35:49 -0400 Subject: [PATCH 0085/1792] [dev.link] cmd/link: emit ELF relocations in mmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, ELF relocations are generated sequentially in the heap and flushed to output file periodically. In fact, in some cases, the output size of the relocation records can be easily computed, as a relocation entry has fixed size. We only need to count the number of relocation records to compute the size. Once the size is computed, we can mmap the output with the proper size, and directly write relocation records in the mapped memory. It also opens the possibility of writing relocations in parallel (not done in this CL). Note: on some architectures, a Go relocation may turn into multiple ELF relocations, which makes size calculation harder. This CL does not handle those cases, and it still writes sequentially in the heap there. Linking cmd/compile with external linking, name old time/op new time/op delta Asmb2 190ms ± 2% 141ms ± 4% -25.74% (p=0.000 n=10+10) name old alloc/op new alloc/op delta Asmb2_GC 66.8MB ± 0% 8.2MB ± 0% -87.79% (p=0.008 n=5+5) name old live-B new live-B delta Asmb2_GC 66.9M ± 0% 55.2M ± 0% -17.58% (p=0.008 n=5+5) Change-Id: If7056bbe909dc90033eef6b9c4891fcca310602c Reviewed-on: https://go-review.googlesource.com/c/go/+/240399 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/obj.go | 1 + src/cmd/link/internal/arm/obj.go | 1 + src/cmd/link/internal/ld/data.go | 2 ++ src/cmd/link/internal/ld/elf.go | 25 +++++++++++++++++++++- src/cmd/link/internal/ld/lib.go | 15 +++++++------ src/cmd/link/internal/ld/outbuf.go | 5 +---- src/cmd/link/internal/ld/outbuf_mmap.go | 20 ++++++++++++++++- src/cmd/link/internal/ld/outbuf_nommap.go | 7 ++++++ src/cmd/link/internal/ld/outbuf_windows.go | 15 +++++++++++++ src/cmd/link/internal/mips/obj.go | 1 + src/cmd/link/internal/mips64/obj.go | 1 + src/cmd/link/internal/s390x/obj.go | 1 + src/cmd/link/internal/sym/segment.go | 10 +++++++-- 13 files changed, 90 insertions(+), 14 deletions(-) diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index 4c525743fe..fcc2499cb0 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -61,6 +61,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Elfreloc1: elfreloc1, + ElfrelocSize: 24, Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index 1a572985b6..f25f735b0b 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -54,6 +54,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Trampoline: trampoline, Elfreloc1: elfreloc1, + ElfrelocSize: 8, Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index be1af4bcae..7dc2c4662d 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -47,6 +47,7 @@ import ( "strconv" "strings" "sync" + "sync/atomic" ) // isRuntimeDepPkg reports whether pkg is the runtime package or its dependency @@ -581,6 +582,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { if len(extRelocs) != 0 { st.finalizeExtRelocSlice(extRelocs) ldr.SetExtRelocs(s, extRelocs) + atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(len(extRelocs))) } } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 80612c4684..bb4e1715f4 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1397,11 +1397,29 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) { } func elfEmitReloc(ctxt *Link) { - for ctxt.Out.Offset()&7 != 0 { ctxt.Out.Write8(0) } + // Precompute the size needed for the reloc records if we can + // Mmap the output buffer with the proper size. + // + // TODO: on some architectures, one Go relocation may turn to + // multiple ELF relocations, which makes the size not fixed. + // Handle this case better. Maybe increment the counter by the + // number of external reloc records in relocsym. + var sz, filesz int64 + if thearch.ElfrelocSize != 0 { + for _, seg := range Segments { + for _, sect := range seg.Sections { + sz += int64(thearch.ElfrelocSize * sect.Relcount) + } + } + filesz = ctxt.Out.Offset() + sz + ctxt.Out.Mmap(uint64(filesz)) + } + + // Now emits the records. for _, sect := range Segtext.Sections { if sect.Name == ".text" { elfrelocsect(ctxt, sect, ctxt.Textp) @@ -1428,6 +1446,11 @@ func elfEmitReloc(ctxt *Link) { } elfrelocsect(ctxt, sect, si.syms) } + + // sanity check + if thearch.ElfrelocSize != 0 && ctxt.Out.Offset() != filesz { + panic("elfEmitReloc: size mismatch") + } } func addgonote(ctxt *Link, sectionName string, tag uint32, desc []byte) { diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index fbf72f6715..d160139fd5 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -236,12 +236,13 @@ type Arch struct { Asmb func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader) - Elfreloc1 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) - Gentext func(*Link, *loader.Loader) - Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + Elfreloc1 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + ElfrelocSize uint32 // size of an ELF relocation record, must match Elfreloc1. Currently this can be 0, meaning that the size is not fixed (a Go reloc may turn into multiple ELF reloc). + Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) + Gentext func(*Link, *loader.Loader) + Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool // TLSIEtoLE converts a TLS Initial Executable relocation to // a TLS Local Executable relocation. @@ -310,6 +311,8 @@ var ( Segrelrodata sym.Segment Segdata sym.Segment Segdwarf sym.Segment + + Segments = []*sym.Segment{&Segtext, &Segrodata, &Segrelrodata, &Segdata, &Segdwarf} ) const pkgdef = "__.PKGDEF" diff --git a/src/cmd/link/internal/ld/outbuf.go b/src/cmd/link/internal/ld/outbuf.go index b474067dd9..f0178288a6 100644 --- a/src/cmd/link/internal/ld/outbuf.go +++ b/src/cmd/link/internal/ld/outbuf.go @@ -149,13 +149,10 @@ func (out *OutBuf) copyHeap() bool { bufLen := len(out.buf) heapLen := len(out.heap) total := uint64(bufLen + heapLen) - out.munmap() if heapLen != 0 { - if err := out.Mmap(total); err != nil { + if err := out.Mmap(total); err != nil { // Mmap will copy out.heap over to out.buf panic(err) } - copy(out.buf[bufLen:], out.heap[:heapLen]) - out.heap = out.heap[:0] } return true } diff --git a/src/cmd/link/internal/ld/outbuf_mmap.go b/src/cmd/link/internal/ld/outbuf_mmap.go index 7280027e92..53b14b09cc 100644 --- a/src/cmd/link/internal/ld/outbuf_mmap.go +++ b/src/cmd/link/internal/ld/outbuf_mmap.go @@ -10,7 +10,15 @@ import ( "syscall" ) +// Mmap maps the output file with the given size. It unmaps the old mapping +// if it is already mapped. It also flushes any in-heap data to the new +// mapping. func (out *OutBuf) Mmap(filesize uint64) (err error) { + oldlen := len(out.buf) + if oldlen != 0 { + out.munmap() + } + for { if err = out.fallocate(filesize); err != syscall.EINTR { break @@ -29,7 +37,17 @@ func (out *OutBuf) Mmap(filesize uint64) (err error) { Exitf("resize output file failed: %v", err) } out.buf, err = syscall.Mmap(int(out.f.Fd()), 0, int(filesize), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED|syscall.MAP_FILE) - return err + if err != nil { + return err + } + + // copy heap to new mapping + if uint64(oldlen+len(out.heap)) > filesize { + panic("mmap size too small") + } + copy(out.buf[oldlen:], out.heap) + out.heap = out.heap[:0] + return nil } func (out *OutBuf) munmap() { diff --git a/src/cmd/link/internal/ld/outbuf_nommap.go b/src/cmd/link/internal/ld/outbuf_nommap.go index bad01dc6d5..6b4025384b 100644 --- a/src/cmd/link/internal/ld/outbuf_nommap.go +++ b/src/cmd/link/internal/ld/outbuf_nommap.go @@ -6,9 +6,16 @@ package ld +// Mmap allocates an in-heap output buffer with the given size. It copies +// any old data (if any) to the new buffer. func (out *OutBuf) Mmap(filesize uint64) error { // We need space to put all the symbols before we apply relocations. + oldheap := out.heap + if filesize < uint64(len(oldheap)) { + panic("mmap size too small") + } out.heap = make([]byte, filesize) + copy(out.heap, oldheap) return nil } diff --git a/src/cmd/link/internal/ld/outbuf_windows.go b/src/cmd/link/internal/ld/outbuf_windows.go index 807c0e227d..60dc1ab92d 100644 --- a/src/cmd/link/internal/ld/outbuf_windows.go +++ b/src/cmd/link/internal/ld/outbuf_windows.go @@ -10,7 +10,15 @@ import ( "unsafe" ) +// Mmap maps the output file with the given size. It unmaps the old mapping +// if it is already mapped. It also flushes any in-heap data to the new +// mapping. func (out *OutBuf) Mmap(filesize uint64) error { + oldlen := len(out.buf) + if oldlen != 0 { + out.munmap() + } + err := out.f.Truncate(int64(filesize)) if err != nil { Exitf("resize output file failed: %v", err) @@ -28,6 +36,13 @@ func (out *OutBuf) Mmap(filesize uint64) error { return err } *(*reflect.SliceHeader)(unsafe.Pointer(&out.buf)) = reflect.SliceHeader{Data: ptr, Len: int(filesize), Cap: int(filesize)} + + // copy heap to new mapping + if uint64(oldlen+len(out.heap)) > filesize { + panic("mmap size too small") + } + copy(out.buf[oldlen:], out.heap) + out.heap = out.heap[:0] return nil } diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index cc3cc431b7..e59c382bfa 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -53,6 +53,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Elfreloc1: elfreloc1, + ElfrelocSize: 8, Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index 449a200928..6ef27cedb9 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -52,6 +52,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Elfreloc1: elfreloc1, + ElfrelocSize: 24, Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index bb62fe179f..8acc1d4917 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -51,6 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Elfreloc1: elfreloc1, + ElfrelocSize: 24, Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/sym/segment.go b/src/cmd/link/internal/sym/segment.go index 9b49c62dda..97853b9355 100644 --- a/src/cmd/link/internal/sym/segment.go +++ b/src/cmd/link/internal/sym/segment.go @@ -55,6 +55,12 @@ type Section struct { Elfsect interface{} // an *ld.ElfShdr Reloff uint64 Rellen uint64 - Sym LoaderSym // symbol for the section, if any - Index uint16 // each section has a unique index, used internally + // Relcount is the number of *host* relocations applied to this section + // (when external linking). + // Incremented atomically on multiple goroutines. + // Note: this may differ from number of Go relocations, as one Go relocation + // may turn into multiple host relocations. + Relcount uint32 + Sym LoaderSym // symbol for the section, if any + Index uint16 // each section has a unique index, used internally } -- GitLab From 36939aef772219e896e00e60b4ad83cd7bee2aa5 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 26 Jun 2020 19:17:33 -0400 Subject: [PATCH 0086/1792] [dev.link] cmd/link: parallelize ELF relocation writing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that we write ELF relocation records in mapped memory with known sizes and offsets, we can write them in parallel. Further speed up Asmb2 pass. Linking cmd/compile with external linking, Asmb2 141ms ± 4% 97ms ± 5% -30.98% (p=0.000 n=10+9) Change-Id: I52c2b9230e90ed4421c21d7ef13a4f1e996f6054 Reviewed-on: https://go-review.googlesource.com/c/go/+/240400 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/asm.go | 26 +++++----- src/cmd/link/internal/arm/asm.go | 18 +++---- src/cmd/link/internal/arm64/asm.go | 38 +++++++-------- src/cmd/link/internal/ld/elf.go | 63 +++++++++++++++++------- src/cmd/link/internal/ld/lib.go | 2 +- src/cmd/link/internal/mips/asm.go | 14 +++--- src/cmd/link/internal/mips64/asm.go | 26 +++++----- src/cmd/link/internal/ppc64/asm.go | 72 ++++++++++++++-------------- src/cmd/link/internal/riscv64/asm.go | 4 +- src/cmd/link/internal/s390x/asm.go | 20 ++++---- src/cmd/link/internal/x86/asm.go | 26 +++++----- 11 files changed, 169 insertions(+), 140 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index e07321f855..609daef078 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -384,8 +384,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { - ctxt.Out.Write64(uint64(sectoff)) +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() @@ -394,21 +394,21 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo return false case objabi.R_ADDR, objabi.R_DWARFSECREF: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_32) | uint64(elfsym)<<32) } else if siz == 8 { - ctxt.Out.Write64(uint64(elf.R_X86_64_64) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_64) | uint64(elfsym)<<32) } else { return false } case objabi.R_TLS_LE: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_TPOFF32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_TPOFF32) | uint64(elfsym)<<32) } else { return false } case objabi.R_TLS_IE: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTTPOFF) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_GOTTPOFF) | uint64(elfsym)<<32) } else { return false } @@ -416,12 +416,12 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo if siz == 4 { if ldr.SymType(r.Xsym) == sym.SDYNIMPORT { if ctxt.DynlinkingGo() { - ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) } } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) } } else { return false @@ -429,22 +429,22 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo case objabi.R_PCREL: if siz == 4 { if ldr.SymType(r.Xsym) == sym.SDYNIMPORT && ldr.SymElfType(r.Xsym) == elf.STT_FUNC { - ctxt.Out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { - ctxt.Out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) } } else { return false } case objabi.R_GOTPCREL: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) } else { return false } } - ctxt.Out.Write64(uint64(r.Xadd)) + out.Write64(uint64(r.Xadd)) return true } diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index ea71d11356..a75dc9525f 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -248,8 +248,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { - ctxt.Out.Write32(uint32(sectoff)) +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + out.Write32(uint32(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() @@ -258,33 +258,33 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo return false case objabi.R_ADDR, objabi.R_DWARFSECREF: if siz == 4 { - ctxt.Out.Write32(uint32(elf.R_ARM_ABS32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_ARM_ABS32) | uint32(elfsym)<<8) } else { return false } case objabi.R_PCREL: if siz == 4 { - ctxt.Out.Write32(uint32(elf.R_ARM_REL32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_ARM_REL32) | uint32(elfsym)<<8) } else { return false } case objabi.R_CALLARM: if siz == 4 { if r.Add()&0xff000000 == 0xeb000000 { // BL - ctxt.Out.Write32(uint32(elf.R_ARM_CALL) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_ARM_CALL) | uint32(elfsym)<<8) } else { - ctxt.Out.Write32(uint32(elf.R_ARM_JUMP24) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_ARM_JUMP24) | uint32(elfsym)<<8) } } else { return false } case objabi.R_TLS_LE: - ctxt.Out.Write32(uint32(elf.R_ARM_TLS_LE32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_ARM_TLS_LE32) | uint32(elfsym)<<8) case objabi.R_TLS_IE: - ctxt.Out.Write32(uint32(elf.R_ARM_TLS_IE32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_ARM_TLS_IE32) | uint32(elfsym)<<8) case objabi.R_GOTPCREL: if siz == 4 { - ctxt.Out.Write32(uint32(elf.R_ARM_GOT_PREL) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_ARM_GOT_PREL) | uint32(elfsym)<<8) } else { return false } diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index bb23071783..4928d3eb2a 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -323,8 +323,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { - ctxt.Out.Write64(uint64(sectoff)) +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() @@ -334,38 +334,38 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo case objabi.R_ADDR, objabi.R_DWARFSECREF: switch siz { case 4: - ctxt.Out.Write64(uint64(elf.R_AARCH64_ABS32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_AARCH64_ABS32) | uint64(elfsym)<<32) case 8: - ctxt.Out.Write64(uint64(elf.R_AARCH64_ABS64) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_AARCH64_ABS64) | uint64(elfsym)<<32) default: return false } case objabi.R_ADDRARM64: // two relocations: R_AARCH64_ADR_PREL_PG_HI21 and R_AARCH64_ADD_ABS_LO12_NC - ctxt.Out.Write64(uint64(elf.R_AARCH64_ADR_PREL_PG_HI21) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_AARCH64_ADD_ABS_LO12_NC) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_AARCH64_ADR_PREL_PG_HI21) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_AARCH64_ADD_ABS_LO12_NC) | uint64(elfsym)<<32) case objabi.R_ARM64_TLS_LE: - ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSLE_MOVW_TPREL_G0) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_AARCH64_TLSLE_MOVW_TPREL_G0) | uint64(elfsym)<<32) case objabi.R_ARM64_TLS_IE: - ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC) | uint64(elfsym)<<32) case objabi.R_ARM64_GOTPCREL: - ctxt.Out.Write64(uint64(elf.R_AARCH64_ADR_GOT_PAGE) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_AARCH64_LD64_GOT_LO12_NC) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_AARCH64_ADR_GOT_PAGE) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_AARCH64_LD64_GOT_LO12_NC) | uint64(elfsym)<<32) case objabi.R_CALLARM64: if siz != 4 { return false } - ctxt.Out.Write64(uint64(elf.R_AARCH64_CALL26) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_AARCH64_CALL26) | uint64(elfsym)<<32) } - ctxt.Out.Write64(uint64(r.Xadd)) + out.Write64(uint64(r.Xadd)) return true } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index bb4e1715f4..8e4b2a3fe4 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -13,8 +13,10 @@ import ( "encoding/binary" "encoding/hex" "path/filepath" + "runtime" "sort" "strings" + "sync" ) /* @@ -1342,7 +1344,7 @@ func elfshreloc(arch *sys.Arch, sect *sym.Section) *ElfShdr { return sh } -func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) { +func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) { // If main section is SHT_NOBITS, nothing to relocate. // Also nothing to relocate in .shstrtab. if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { @@ -1353,7 +1355,6 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) { } ldr := ctxt.loader - sect.Reloff = uint64(ctxt.Out.Offset()) for i, s := range syms { if !ldr.AttrReachable(s) { panic("should never happen") @@ -1387,13 +1388,11 @@ func elfrelocsect(ctxt *Link, sect *sym.Section, syms []loader.Sym) { if !ldr.AttrReachable(r.Xsym) { ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) } - if !thearch.Elfreloc1(ctxt, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) { + if !thearch.Elfreloc1(ctxt, out, ldr, s, r, 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())) } } } - - sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff } func elfEmitReloc(ctxt *Link) { @@ -1412,7 +1411,9 @@ func elfEmitReloc(ctxt *Link) { if thearch.ElfrelocSize != 0 { for _, seg := range Segments { for _, sect := range seg.Sections { - sz += int64(thearch.ElfrelocSize * sect.Relcount) + sect.Reloff = uint64(ctxt.Out.Offset() + sz) + sect.Rellen = uint64(thearch.ElfrelocSize * sect.Relcount) + sz += int64(sect.Rellen) } } filesz = ctxt.Out.Offset() + sz @@ -1420,22 +1421,54 @@ func elfEmitReloc(ctxt *Link) { } // Now emits the records. + var relocSect func(ctxt *Link, sect *sym.Section, syms []loader.Sym) + var wg sync.WaitGroup + var sem chan int + if thearch.ElfrelocSize != 0 && ctxt.Out.isMmapped() { + // Write sections in parallel. + sem = make(chan int, 2*runtime.GOMAXPROCS(0)) + relocSect = func(ctxt *Link, sect *sym.Section, syms []loader.Sym) { + wg.Add(1) + sem <- 1 + out, err := ctxt.Out.View(sect.Reloff) + if err != nil { + panic(err) + } + go func() { + elfrelocsect(ctxt, out, sect, syms) + // sanity check + if uint64(out.Offset()) != sect.Reloff+sect.Rellen { + panic("elfEmitReloc: size mismatch") + } + wg.Done() + <-sem + }() + } + } else { + // Sizes and offsets are not precomputed, or we cannot Mmap. + // We have to write sequentially. + relocSect = func(ctxt *Link, sect *sym.Section, syms []loader.Sym) { + sect.Reloff = uint64(ctxt.Out.Offset()) // offset is not precomputed, so fill it in now + elfrelocsect(ctxt, ctxt.Out, sect, syms) + sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff + } + } for _, sect := range Segtext.Sections { if sect.Name == ".text" { - elfrelocsect(ctxt, sect, ctxt.Textp) + relocSect(ctxt, sect, ctxt.Textp) } else { - elfrelocsect(ctxt, sect, ctxt.datap) + relocSect(ctxt, sect, ctxt.datap) } } for _, sect := range Segrodata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap) + relocSect(ctxt, sect, ctxt.datap) } for _, sect := range Segrelrodata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap) + relocSect(ctxt, sect, ctxt.datap) } for _, sect := range Segdata.Sections { - elfrelocsect(ctxt, sect, ctxt.datap) + relocSect(ctxt, sect, ctxt.datap) } for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] @@ -1444,13 +1477,9 @@ func elfEmitReloc(ctxt *Link) { ctxt.loader.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } - elfrelocsect(ctxt, sect, si.syms) - } - - // sanity check - if thearch.ElfrelocSize != 0 && ctxt.Out.Offset() != filesz { - panic("elfEmitReloc: size mismatch") + relocSect(ctxt, sect, si.syms) } + wg.Wait() } func addgonote(ctxt *Link, sectionName string, tag uint32, desc []byte) { diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d160139fd5..5d078d0e99 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -236,7 +236,7 @@ type Arch struct { Asmb func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader) - Elfreloc1 func(*Link, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + Elfreloc1 func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool ElfrelocSize uint32 // size of an ELF relocation record, must match Elfreloc1. Currently this can be 0, meaning that the size is not fixed (a Go reloc may turn into multiple ELF reloc). Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) Gentext func(*Link, *loader.Loader) diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index d0e0245a25..7e1b9b3730 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -43,8 +43,8 @@ func gentext(ctxt *ld.Link, ldr *loader.Loader) { return } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { - ctxt.Out.Write32(uint32(sectoff)) +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + out.Write32(uint32(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) switch r.Type() { @@ -54,15 +54,15 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo if r.Siz() != 4 { return false } - ctxt.Out.Write32(uint32(elf.R_MIPS_32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_MIPS_32) | uint32(elfsym)<<8) case objabi.R_ADDRMIPS: - ctxt.Out.Write32(uint32(elf.R_MIPS_LO16) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_MIPS_LO16) | uint32(elfsym)<<8) case objabi.R_ADDRMIPSU: - ctxt.Out.Write32(uint32(elf.R_MIPS_HI16) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_MIPS_HI16) | uint32(elfsym)<<8) case objabi.R_ADDRMIPSTLS: - ctxt.Out.Write32(uint32(elf.R_MIPS_TLS_TPREL_LO16) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_MIPS_TLS_TPREL_LO16) | uint32(elfsym)<<8) case objabi.R_CALLMIPS, objabi.R_JMPMIPS: - ctxt.Out.Write32(uint32(elf.R_MIPS_26) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_MIPS_26) | uint32(elfsym)<<8) } return true diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index dcca72c930..d8760b45f5 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -41,7 +41,7 @@ import ( func gentext(ctxt *ld.Link, ldr *loader.Loader) {} -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { // mips64 ELF relocation (endian neutral) // offset uint64 @@ -52,36 +52,36 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo // type uint8 // addend int64 - ctxt.Out.Write64(uint64(sectoff)) + out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - ctxt.Out.Write32(uint32(elfsym)) - ctxt.Out.Write8(0) - ctxt.Out.Write8(0) - ctxt.Out.Write8(0) + out.Write32(uint32(elfsym)) + out.Write8(0) + out.Write8(0) + out.Write8(0) switch r.Type() { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: switch r.Siz() { case 4: - ctxt.Out.Write8(uint8(elf.R_MIPS_32)) + out.Write8(uint8(elf.R_MIPS_32)) case 8: - ctxt.Out.Write8(uint8(elf.R_MIPS_64)) + out.Write8(uint8(elf.R_MIPS_64)) default: return false } case objabi.R_ADDRMIPS: - ctxt.Out.Write8(uint8(elf.R_MIPS_LO16)) + out.Write8(uint8(elf.R_MIPS_LO16)) case objabi.R_ADDRMIPSU: - ctxt.Out.Write8(uint8(elf.R_MIPS_HI16)) + out.Write8(uint8(elf.R_MIPS_HI16)) case objabi.R_ADDRMIPSTLS: - ctxt.Out.Write8(uint8(elf.R_MIPS_TLS_TPREL_LO16)) + out.Write8(uint8(elf.R_MIPS_TLS_TPREL_LO16)) case objabi.R_CALLMIPS, objabi.R_JMPMIPS: - ctxt.Out.Write8(uint8(elf.R_MIPS_26)) + out.Write8(uint8(elf.R_MIPS_26)) } - ctxt.Out.Write64(uint64(r.Xadd)) + out.Write64(uint64(r.Xadd)) return true } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 6e2aac0d20..b8cd1c7bd3 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -441,7 +441,7 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { // Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines. rt := r.Type() if rt == objabi.R_ADDR || rt == objabi.R_POWER_TLS || rt == objabi.R_CALLPOWER { @@ -450,7 +450,7 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo sectoff += 2 } } - ctxt.Out.Write64(uint64(sectoff)) + out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) switch rt { @@ -459,60 +459,60 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo case objabi.R_ADDR, objabi.R_DWARFSECREF: switch r.Siz() { case 4: - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_ADDR32) | uint64(elfsym)<<32) case 8: - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR64) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_ADDR64) | uint64(elfsym)<<32) default: return false } case objabi.R_POWER_TLS: - ctxt.Out.Write64(uint64(elf.R_PPC64_TLS) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_TLS) | uint64(elfsym)<<32) case objabi.R_POWER_TLS_LE: - ctxt.Out.Write64(uint64(elf.R_PPC64_TPREL16) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_TPREL16) | uint64(elfsym)<<32) case objabi.R_POWER_TLS_IE: - ctxt.Out.Write64(uint64(elf.R_PPC64_GOT_TPREL16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_GOT_TPREL16_LO_DS) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_GOT_TPREL16_HA) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_PPC64_GOT_TPREL16_LO_DS) | uint64(elfsym)<<32) case objabi.R_ADDRPOWER: - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_LO) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_ADDR16_HA) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_PPC64_ADDR16_LO) | uint64(elfsym)<<32) case objabi.R_ADDRPOWER_DS: - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_ADDR16_LO_DS) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_ADDR16_HA) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_PPC64_ADDR16_LO_DS) | uint64(elfsym)<<32) case objabi.R_ADDRPOWER_GOT: - ctxt.Out.Write64(uint64(elf.R_PPC64_GOT16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_GOT16_LO_DS) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_GOT16_HA) | uint64(elfsym)<<32) + 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_PCREL: - ctxt.Out.Write64(uint64(elf.R_PPC64_REL16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_REL16_LO) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_REL16_HA) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_PPC64_REL16_LO) | uint64(elfsym)<<32) r.Xadd += 4 case objabi.R_ADDRPOWER_TOCREL: - ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_LO) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_TOC16_HA) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_PPC64_TOC16_LO) | uint64(elfsym)<<32) case objabi.R_ADDRPOWER_TOCREL_DS: - ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_HA) | uint64(elfsym)<<32) - ctxt.Out.Write64(uint64(r.Xadd)) - ctxt.Out.Write64(uint64(sectoff + 4)) - ctxt.Out.Write64(uint64(elf.R_PPC64_TOC16_LO_DS) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_TOC16_HA) | uint64(elfsym)<<32) + out.Write64(uint64(r.Xadd)) + out.Write64(uint64(sectoff + 4)) + out.Write64(uint64(elf.R_PPC64_TOC16_LO_DS) | uint64(elfsym)<<32) case objabi.R_CALLPOWER: if r.Siz() != 4 { return false } - ctxt.Out.Write64(uint64(elf.R_PPC64_REL24) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_PPC64_REL24) | uint64(elfsym)<<32) } - ctxt.Out.Write64(uint64(r.Xadd)) + out.Write64(uint64(r.Xadd)) return true } diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index 7bc511c374..bf8ce0c51e 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -18,8 +18,8 @@ import ( func gentext(ctxt *ld.Link, ldr *loader.Loader) { } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { - log.Fatalf("elfreloc2") +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + log.Fatalf("elfreloc1") return false } diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index f9bb12bb19..c2d0dc2ea5 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -219,8 +219,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { - ctxt.Out.Write64(uint64(sectoff)) +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() @@ -233,30 +233,30 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo return false case 4: // WARNING - silently ignored by linker in ELF64 - ctxt.Out.Write64(uint64(elf.R_390_TLS_LE32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_390_TLS_LE32) | uint64(elfsym)<<32) case 8: // WARNING - silently ignored by linker in ELF32 - ctxt.Out.Write64(uint64(elf.R_390_TLS_LE64) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_390_TLS_LE64) | uint64(elfsym)<<32) } case objabi.R_TLS_IE: switch siz { default: return false case 4: - ctxt.Out.Write64(uint64(elf.R_390_TLS_IEENT) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_390_TLS_IEENT) | uint64(elfsym)<<32) } case objabi.R_ADDR, objabi.R_DWARFSECREF: switch siz { default: return false case 4: - ctxt.Out.Write64(uint64(elf.R_390_32) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_390_32) | uint64(elfsym)<<32) case 8: - ctxt.Out.Write64(uint64(elf.R_390_64) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_390_64) | uint64(elfsym)<<32) } case objabi.R_GOTPCREL: if siz == 4 { - ctxt.Out.Write64(uint64(elf.R_390_GOTENT) | uint64(elfsym)<<32) + out.Write64(uint64(elf.R_390_GOTENT) | uint64(elfsym)<<32) } else { return false } @@ -308,10 +308,10 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo if elfrel == elf.R_390_NONE { return false // unsupported size/dbl combination } - ctxt.Out.Write64(uint64(elfrel) | uint64(elfsym)<<32) + out.Write64(uint64(elfrel) | uint64(elfsym)<<32) } - ctxt.Out.Write64(uint64(r.Xadd)) + out.Write64(uint64(r.Xadd)) return true } diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 6683c790aa..5e3c452c3a 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -314,8 +314,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { - ctxt.Out.Write32(uint32(sectoff)) +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { + out.Write32(uint32(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) siz := r.Siz() @@ -324,16 +324,16 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo return false case objabi.R_ADDR, objabi.R_DWARFSECREF: if siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_386_32) | uint32(elfsym)<<8) } else { return false } case objabi.R_GOTPCREL: if siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_GOTPC)) + out.Write32(uint32(elf.R_386_GOTPC)) if ldr.SymName(r.Xsym) != "_GLOBAL_OFFSET_TABLE_" { - ctxt.Out.Write32(uint32(sectoff)) - ctxt.Out.Write32(uint32(elf.R_386_GOT32) | uint32(elfsym)<<8) + out.Write32(uint32(sectoff)) + out.Write32(uint32(elf.R_386_GOT32) | uint32(elfsym)<<8) } } else { return false @@ -341,30 +341,30 @@ func elfreloc1(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym, r loader.ExtRelo case objabi.R_CALL: if siz == 4 { if ldr.SymType(r.Xsym) == sym.SDYNIMPORT { - ctxt.Out.Write32(uint32(elf.R_386_PLT32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_386_PLT32) | uint32(elfsym)<<8) } else { - ctxt.Out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8) } } else { return false } case objabi.R_PCREL: if siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_386_PC32) | uint32(elfsym)<<8) } else { return false } case objabi.R_TLS_LE: if siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_TLS_LE) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_386_TLS_LE) | uint32(elfsym)<<8) } else { return false } case objabi.R_TLS_IE: if siz == 4 { - ctxt.Out.Write32(uint32(elf.R_386_GOTPC)) - ctxt.Out.Write32(uint32(sectoff)) - ctxt.Out.Write32(uint32(elf.R_386_TLS_GOTIE) | uint32(elfsym)<<8) + out.Write32(uint32(elf.R_386_GOTPC)) + out.Write32(uint32(sectoff)) + out.Write32(uint32(elf.R_386_TLS_GOTIE) | uint32(elfsym)<<8) } else { return false } -- GitLab From 8c46cb1bf534adb169a8789489e85bf777655066 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sat, 4 Jul 2020 18:14:08 -0400 Subject: [PATCH 0087/1792] [dev.link] cmd/link: write ELF relocations in mmap on all architectures In CL 240399 we changed to precompute the size for ELF relocation records and use mmap to write them, but we left architectures where elfreloc1 write non-fixed number of bytes. This CL handles those architectures. When a Go relocation will turn into multiple ELF relocations, in relocsym we account this difference and add it to the size calculation. So when emitting ELF relocations, we know the number of ELF relocations to be emitted. Change-Id: I6732ab674b442f4618405e5412a77f6e4a3315d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/241079 Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- src/cmd/link/internal/amd64/asm.go | 4 +-- src/cmd/link/internal/arm/asm.go | 10 +++--- src/cmd/link/internal/arm64/asm.go | 48 ++++++++++++++++------------ src/cmd/link/internal/arm64/obj.go | 1 + src/cmd/link/internal/ld/data.go | 28 ++++++++++++---- src/cmd/link/internal/ld/elf.go | 42 +++++++++++------------- src/cmd/link/internal/ld/lib.go | 11 ++++--- src/cmd/link/internal/mips/asm.go | 12 +++---- src/cmd/link/internal/mips64/asm.go | 12 +++---- src/cmd/link/internal/ppc64/asm.go | 34 ++++++++++---------- src/cmd/link/internal/ppc64/obj.go | 1 + src/cmd/link/internal/riscv64/asm.go | 8 ++--- src/cmd/link/internal/s390x/asm.go | 4 +-- src/cmd/link/internal/x86/asm.go | 4 +-- src/cmd/link/internal/x86/obj.go | 1 + 15 files changed, 121 insertions(+), 99 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 609daef078..f9474860c0 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -550,8 +550,8 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, bool, bool) { - return -1, false, false +func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, int, bool) { + return -1, 0, false } func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index a75dc9525f..64e06b33aa 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -528,7 +528,7 @@ func gentrampdyn(arch *sys.Arch, tramp *loader.SymbolBuilder, target loader.Sym, tramp.AddReloc(r) } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { @@ -549,14 +549,14 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade ldr.Errorf(s, "direct call too far %d", rr.Xadd/4) } - return int64(braddoff(int32(0xff000000&uint32(r.Add())), int32(0xffffff&uint32(rr.Xadd/4)))), true, true + return int64(braddoff(int32(0xff000000&uint32(r.Add())), int32(0xffffff&uint32(rr.Xadd/4)))), 1, true } - return -1, false, false + return -1, 0, false } const isOk = true - const noExtReloc = false + const noExtReloc = 0 switch r.Type() { // The following three arch specific relocations are only for generation of // Linux/ARM ELF's PLT entry (3 assembler instruction) @@ -579,7 +579,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return int64(braddoff(int32(0xff000000&uint32(r.Add())), int32(0xffffff&t))), noExtReloc, isOk } - return val, false, false + return val, 0, false } func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 4928d3eb2a..bbd53825b6 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -441,18 +441,20 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy return true } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (int64, bool, bool) { - const extRelocNeeded = true - const extRelocNotNeeded = false +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (int64, int, bool) { + const noExtReloc = 0 const isOk = true rs := ldr.ResolveABIAlias(r.Sym()) if target.IsExternal() { - switch r.Type() { + nExtReloc := 0 + switch rt := r.Type(); rt { default: case objabi.R_ARM64_GOTPCREL, objabi.R_ADDRARM64: + nExtReloc = 2 // need two ELF relocations. see elfreloc1 + // set up addend for eventual relocation via outer symbol. rs, off := ld.FoldSubSymbolOffset(ldr, rs) rr.Xadd = r.Add() + off @@ -494,13 +496,17 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade } } - return val, extRelocNeeded, isOk + return val, nExtReloc, isOk case objabi.R_CALLARM64, objabi.R_ARM64_TLS_LE, objabi.R_ARM64_TLS_IE: + nExtReloc = 1 + if rt == objabi.R_ARM64_TLS_IE { + nExtReloc = 2 // need two ELF relocations. see elfreloc1 + } rr.Xsym = rs rr.Xadd = r.Add() - return val, extRelocNeeded, isOk + return val, nExtReloc, isOk } } @@ -526,9 +532,9 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade // when laid out, the instruction order must always be o1, o2. if target.IsBigEndian() { - return int64(o0)<<32 | int64(o1), extRelocNotNeeded, true + return int64(o0)<<32 | int64(o1), noExtReloc, true } - return int64(o1)<<32 | int64(o0), extRelocNotNeeded, true + return int64(o1)<<32 | int64(o0), noExtReloc, true case objabi.R_ARM64_TLS_LE: if target.IsDarwin() { @@ -540,7 +546,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade if v < 0 || v >= 32678 { ldr.Errorf(s, "TLS offset out of range %d", v) } - return val | (v << 5), extRelocNeeded, true + return val | (v << 5), noExtReloc, true case objabi.R_ARM64_TLS_IE: if target.IsPIE() && target.IsElf() { @@ -579,9 +585,9 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade // when laid out, the instruction order must always be o0, o1. if target.IsBigEndian() { - return int64(o0)<<32 | int64(o1), extRelocNotNeeded, isOk + return int64(o0)<<32 | int64(o1), noExtReloc, isOk } - return int64(o1)<<32 | int64(o0), extRelocNotNeeded, isOk + return int64(o1)<<32 | int64(o0), noExtReloc, isOk } else { log.Fatalf("cannot handle R_ARM64_TLS_IE (sym %s) when linking internally", ldr.SymName(s)) } @@ -596,7 +602,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade if t >= 1<<27 || t < -1<<27 { ldr.Errorf(s, "program too large, call relocation distance = %d", t) } - return val | ((t >> 2) & 0x03ffffff), extRelocNotNeeded, true + return val | ((t >> 2) & 0x03ffffff), noExtReloc, true case objabi.R_ARM64_GOT: sData := ldr.Data(s) @@ -609,7 +615,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade } var o0 uint32 o0 |= (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) - return val | int64(o0), extRelocNotNeeded, isOk + return val | int64(o0), noExtReloc, isOk } else if sData[r.Off()+3] == 0xf9 { // R_AARCH64_LD64_GOT_LO12_NC // patch instruction: ldr @@ -619,7 +625,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade } var o1 uint32 o1 |= uint32(t&0xfff) << (10 - 3) - return val | int64(uint64(o1)), extRelocNotNeeded, isOk + return val | int64(uint64(o1)), noExtReloc, isOk } else { ldr.Errorf(s, "unsupported instruction for %v R_GOTARM64", sData[r.Off():r.Off()+4]) } @@ -634,13 +640,13 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade ldr.Errorf(s, "program too large, address relocation distance = %d", t) } o0 := (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) - return val | int64(o0), extRelocNotNeeded, isOk + return val | int64(o0), noExtReloc, isOk } else if sData[r.Off()+3]&0x91 == 0x91 { // R_AARCH64_ADD_ABS_LO12_NC // patch instruction: add t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) o1 := uint32(t&0xfff) << 10 - return val | int64(o1), extRelocNotNeeded, isOk + return val | int64(o1), noExtReloc, isOk } else { ldr.Errorf(s, "unsupported instruction for %v R_PCRELARM64", sData[r.Off():r.Off()+4]) } @@ -648,7 +654,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade case objabi.R_ARM64_LDST8: t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) o0 := uint32(t&0xfff) << 10 - return val | int64(o0), extRelocNotNeeded, true + return val | int64(o0), noExtReloc, true case objabi.R_ARM64_LDST32: t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) @@ -656,7 +662,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade ldr.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST32_ABS_LO12_NC", t) } o0 := (uint32(t&0xfff) >> 2) << 10 - return val | int64(o0), extRelocNotNeeded, true + return val | int64(o0), noExtReloc, true case objabi.R_ARM64_LDST64: t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) @@ -664,7 +670,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade ldr.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST64_ABS_LO12_NC", t) } o0 := (uint32(t&0xfff) >> 3) << 10 - return val | int64(o0), extRelocNotNeeded, true + return val | int64(o0), noExtReloc, true case objabi.R_ARM64_LDST128: t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) @@ -672,10 +678,10 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade ldr.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST128_ABS_LO12_NC", t) } o0 := (uint32(t&0xfff) >> 4) << 10 - return val | int64(o0), extRelocNotNeeded, true + return val | int64(o0), noExtReloc, true } - return val, false, false + return val, 0, false } func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 8eeba0d688..5d07746ad5 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -51,6 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Elfreloc1: elfreloc1, + ElfrelocSize: 24, Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 7dc2c4662d..a19a1451af 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -164,6 +164,11 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // relocs will require an external reloc extRelocs = st.preallocExtRelocSlice(relocs.Count()) } + // Extra external host relocations (e.g. ELF relocations). + // This is the difference between number of host relocations + // and number of Go relocations, as one Go relocation may turn + // into multiple host relocations. + extraExtReloc := 0 for ri := 0; ri < relocs.Count(); ri++ { r := relocs.At2(ri) off := r.Off() @@ -261,16 +266,21 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { var rp *loader.ExtReloc if target.IsExternal() { // Don't pass &rr directly to Archreloc, which will escape rr - // even if this case is not taken. Instead, as Archreloc2 will + // even if this case is not taken. Instead, as Archreloc will // likely return true, we speculatively add rr to extRelocs // and use that space to pass to Archreloc. extRelocs = append(extRelocs, rr) rp = &extRelocs[len(extRelocs)-1] } - out, needExtReloc1, ok := thearch.Archreloc(target, ldr, syms, r, rp, s, o) - if target.IsExternal() && !needExtReloc1 { - // Speculation failed. Undo the append. - extRelocs = extRelocs[:len(extRelocs)-1] + out, nExtReloc, ok := thearch.Archreloc(target, ldr, syms, r, rp, s, o) + if target.IsExternal() { + if nExtReloc == 0 { + // No external relocation needed. Speculation failed. Undo the append. + extRelocs = extRelocs[:len(extRelocs)-1] + } else { + // Account for the difference between host relocations and Go relocations. + extraExtReloc += nExtReloc - 1 + } } needExtReloc = false // already appended if ok { @@ -321,6 +331,9 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { if !target.IsAMD64() { o = r.Add() } + if target.Is386() { + extraExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1 + } break } if target.IsPIE() && target.IsElf() { @@ -452,6 +465,9 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { o += int64(siz) break } + if target.Is386() && target.IsExternal() && target.IsELF { + extraExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1 + } fallthrough case objabi.R_CALL, objabi.R_PCREL: if target.IsExternal() && rs != 0 && rst == sym.SUNDEFEXT { @@ -582,7 +598,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { if len(extRelocs) != 0 { st.finalizeExtRelocSlice(extRelocs) ldr.SetExtRelocs(s, extRelocs) - atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(len(extRelocs))) + atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(len(extRelocs)+extraExtReloc)) } } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 8e4b2a3fe4..5af6020ced 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1393,6 +1393,11 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) } } } + + // sanity check + if uint64(out.Offset()) != sect.Reloff+sect.Rellen { + panic("elfrelocsect: size mismatch") + } } func elfEmitReloc(ctxt *Link) { @@ -1402,29 +1407,25 @@ func elfEmitReloc(ctxt *Link) { // Precompute the size needed for the reloc records if we can // Mmap the output buffer with the proper size. - // - // TODO: on some architectures, one Go relocation may turn to - // multiple ELF relocations, which makes the size not fixed. - // Handle this case better. Maybe increment the counter by the - // number of external reloc records in relocsym. - var sz, filesz int64 - if thearch.ElfrelocSize != 0 { - for _, seg := range Segments { - for _, sect := range seg.Sections { - sect.Reloff = uint64(ctxt.Out.Offset() + sz) - sect.Rellen = uint64(thearch.ElfrelocSize * sect.Relcount) - sz += int64(sect.Rellen) - } + if thearch.ElfrelocSize == 0 { + panic("elfEmitReloc: ELF relocation size not set") + } + var sz int64 + for _, seg := range Segments { + for _, sect := range seg.Sections { + sect.Reloff = uint64(ctxt.Out.Offset() + sz) + sect.Rellen = uint64(thearch.ElfrelocSize * sect.Relcount) + sz += int64(sect.Rellen) } - filesz = ctxt.Out.Offset() + sz - ctxt.Out.Mmap(uint64(filesz)) } + filesz := ctxt.Out.Offset() + sz + ctxt.Out.Mmap(uint64(filesz)) // Now emits the records. var relocSect func(ctxt *Link, sect *sym.Section, syms []loader.Sym) var wg sync.WaitGroup var sem chan int - if thearch.ElfrelocSize != 0 && ctxt.Out.isMmapped() { + if ctxt.Out.isMmapped() { // Write sections in parallel. sem = make(chan int, 2*runtime.GOMAXPROCS(0)) relocSect = func(ctxt *Link, sect *sym.Section, syms []loader.Sym) { @@ -1436,21 +1437,14 @@ func elfEmitReloc(ctxt *Link) { } go func() { elfrelocsect(ctxt, out, sect, syms) - // sanity check - if uint64(out.Offset()) != sect.Reloff+sect.Rellen { - panic("elfEmitReloc: size mismatch") - } wg.Done() <-sem }() } } else { - // Sizes and offsets are not precomputed, or we cannot Mmap. - // We have to write sequentially. + // We cannot Mmap. Write sequentially. relocSect = func(ctxt *Link, sect *sym.Section, syms []loader.Sym) { - sect.Reloff = uint64(ctxt.Out.Offset()) // offset is not precomputed, so fill it in now elfrelocsect(ctxt, ctxt.Out, sect, syms) - sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff } } for _, sect := range Segtext.Sections { diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 5d078d0e99..a53bb45327 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -206,11 +206,12 @@ type Arch struct { // containing the chunk of data to which the relocation applies, and "off" // 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), a boolean indicating if the external relocations' - // been used, and a boolean indicating success/failure (a failing value - // indicates a fatal error). + // 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, + // etc.), and a boolean indicating success/failure (a failing value indicates + // a fatal error). Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc, - loader.Sym, int64) (relocatedOffset int64, needExtReloc bool, ok bool) + loader.Sym, int64) (relocatedOffset int64, nExtReloc int, ok bool) // Archrelocvariant is a second arch-specific hook used for // relocation processing; it handles relocations where r.Type is // insufficient to describe the relocation (r.Variant != @@ -237,7 +238,7 @@ type Arch struct { Asmb2 func(*Link, *loader.Loader) Elfreloc1 func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - ElfrelocSize uint32 // size of an ELF relocation record, must match Elfreloc1. Currently this can be 0, meaning that the size is not fixed (a Go reloc may turn into multiple ELF reloc). + 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) Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 7e1b9b3730..5344a72a31 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -90,13 +90,13 @@ func applyrel(arch *sys.Arch, ldr *loader.Loader, rt objabi.RelocType, off int32 } } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { switch r.Type() { default: - return val, false, false + return val, 0, false case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: // set up addend for eventual relocation via outer symbol. @@ -107,17 +107,17 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } rr.Xsym = rs - return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), true, true + return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), 1, true case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: rr.Xsym = rs rr.Xadd = r.Add() - return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), true, true + return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), 1, true } } const isOk = true - const noExtReloc = false + const noExtReloc = 0 switch rt := r.Type(); rt { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: t := ldr.SymValue(rs) + r.Add() @@ -144,7 +144,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return applyrel(target.Arch, ldr, rt, r.Off(), s, val, t), noExtReloc, isOk } - return val, false, false + return val, 0, false } func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index d8760b45f5..73b1542c84 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -94,13 +94,13 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { switch r.Type() { default: - return val, false, false + return val, 0, false case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: @@ -112,19 +112,19 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } rr.Xsym = rs - return val, true, true + return val, 1, true case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: rr.Xsym = rs rr.Xadd = r.Add() - return val, true, true + return val, 1, true } } const isOk = true - const noExtReloc = false + const noExtReloc = 0 switch r.Type() { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: @@ -150,7 +150,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return int64(o1&0xfc000000 | uint32(t>>2)&^0xfc000000), noExtReloc, isOk } - return val, false, false + return val, 0, false } func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index b8cd1c7bd3..7dca8703a8 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -797,30 +797,32 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta tramp.SetData(P) } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (relocatedOffset int64, needExtReloc bool, ok bool) { - needExternal := false +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (relocatedOffset int64, nExtReloc int, ok bool) { rs := ldr.ResolveABIAlias(r.Sym()) if target.IsExternal() { // On AIX, relocations (except TLS ones) must be also done to the // value with the current addresses. - switch r.Type() { + switch rt := r.Type(); rt { default: if target.IsAIX() { - return val, needExternal, false + return val, nExtReloc, false } case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE: // check Outer is nil, Type is TLSBSS? - needExternal = true + nExtReloc = 1 + if rt == objabi.R_POWER_TLS_IE { + nExtReloc = 2 // need two ELF relocations, see elfreloc1 + } rr.Xadd = r.Add() rr.Xsym = rs - return val, needExternal, true + return val, nExtReloc, true case objabi.R_ADDRPOWER, objabi.R_ADDRPOWER_DS, objabi.R_ADDRPOWER_TOCREL, objabi.R_ADDRPOWER_TOCREL_DS, objabi.R_ADDRPOWER_GOT, objabi.R_ADDRPOWER_PCREL: - needExternal = true + nExtReloc = 2 // need two ELF relocations, see elfreloc1 // set up addend for eventual relocation via outer symbol. rs, off := ld.FoldSubSymbolOffset(ldr, rs) @@ -832,23 +834,23 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade rr.Xsym = rs if !target.IsAIX() { - return val, needExternal, true + return val, nExtReloc, true } case objabi.R_CALLPOWER: - needExternal = true + nExtReloc = 1 rr.Xsym = rs rr.Xadd = r.Add() if !target.IsAIX() { - return val, needExternal, true + return val, nExtReloc, true } } } switch r.Type() { case objabi.R_ADDRPOWER_TOCREL, objabi.R_ADDRPOWER_TOCREL_DS: - return archreloctoc(ldr, target, syms, r, s, val), needExternal, true + return archreloctoc(ldr, target, syms, r, s, val), nExtReloc, true case objabi.R_ADDRPOWER, objabi.R_ADDRPOWER_DS: - return archrelocaddr(ldr, target, syms, r, s, val), needExternal, true + return archrelocaddr(ldr, target, syms, r, s, val), nExtReloc, true case objabi.R_CALLPOWER: // Bits 6 through 29 = (S + A - P) >> 2 @@ -862,9 +864,9 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade if int64(int32(t<<6)>>6) != t { ldr.Errorf(s, "direct call too far: %s %x", ldr.SymName(rs), t) } - return val | int64(uint32(t)&^0xfc000003), needExternal, true + return val | int64(uint32(t)&^0xfc000003), nExtReloc, true case objabi.R_POWER_TOC: // S + A - .TOC. - return ldr.SymValue(rs) + r.Add() - symtoc(ldr, syms, s), needExternal, true + return ldr.SymValue(rs) + r.Add() - symtoc(ldr, syms, s), nExtReloc, true case objabi.R_POWER_TLS_LE: // The thread pointer points 0x7000 bytes after the start of the @@ -880,10 +882,10 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade if int64(int16(v)) != v { ldr.Errorf(s, "TLS offset out of range %d", v) } - return (val &^ 0xffff) | (v & 0xffff), needExternal, true + return (val &^ 0xffff) | (v & 0xffff), nExtReloc, true } - return val, needExternal, false + return val, nExtReloc, false } func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) (relocatedOffset int64) { diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index 8a94f9aa23..31823444dd 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -55,6 +55,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Elfreloc1: elfreloc1, + ElfrelocSize: 24, Elfsetupplt: elfsetupplt, Gentext: gentext, Trampoline: trampoline, diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index bf8ce0c51e..991e0b9556 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -32,13 +32,13 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) switch r.Type() { case objabi.R_CALLRISCV: // Nothing to do. - return val, false, true + return val, 0, true case objabi.R_RISCV_PCREL_ITYPE, objabi.R_RISCV_PCREL_STYPE: pc := ldr.SymValue(s) + int64(r.Off()) @@ -79,10 +79,10 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade auipc = (auipc &^ riscv.UTypeImmMask) | int64(uint32(auipcImm)) second = (second &^ secondImmMask) | int64(uint32(secondImm)) - return second<<32 | auipc, false, true + return second<<32 | auipc, 0, true } - return val, false, false + return val, 0, false } func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index c2d0dc2ea5..00f946e704 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -367,8 +367,8 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, needExtReloc bool, ok bool) { - return val, false, false +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { + return val, 0, false } func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) int64 { diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 5e3c452c3a..4d59261db9 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -411,8 +411,8 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, bool, bool) { - return -1, false, false +func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, int, bool) { + return -1, 0, false } func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index e1c469ca85..a19437d8e6 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -55,6 +55,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Elfreloc1: elfreloc1, + ElfrelocSize: 8, Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, -- GitLab From 3c3cc195643d441c09ad102e8e6f7412d975102b Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 30 Jun 2020 11:30:28 -0400 Subject: [PATCH 0088/1792] [dev.link] cmd/link: better naming for Loader container/subsym methods, part 1 of 2 Introduce a new loader method "AddInteriorSym" to be used when establishing container/containee symbol relationships for host object sub-symbols and GOT/dynamic sub-symbols. Interior symbols are employed in situations where you have a "container" or "payload" symbol that has content, and then a series of "interior" sub-symbols that point into a portion of the container symbol's content. Each interior symbol will typically have a useful name / size / value, but no content of its own. From a symbol table perspective the container symbol is anonymous, but the interior symbols are added to the output symbol table. Change-Id: I919ed5dbbfe2ef2c9a76214f7ea9b384a1be6297 Reviewed-on: https://go-review.googlesource.com/c/go/+/240508 Reviewed-by: Austin Clements Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/link/internal/amd64/asm.go | 2 +- src/cmd/link/internal/ld/data.go | 2 +- src/cmd/link/internal/ld/pe.go | 2 +- src/cmd/link/internal/loadelf/ldelf.go | 2 +- src/cmd/link/internal/loader/loader.go | 60 +++++++++++++------ src/cmd/link/internal/loader/loader_test.go | 11 ++-- src/cmd/link/internal/loader/symbolbuilder.go | 4 +- src/cmd/link/internal/loadmacho/ldmacho.go | 2 +- src/cmd/link/internal/loadpe/ldpe.go | 2 +- 9 files changed, 57 insertions(+), 30 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index f9474860c0..a29e588f88 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -371,7 +371,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade got := ldr.MakeSymbolUpdater(syms.GOT) su := ldr.MakeSymbolUpdater(s) su.SetType(got.Type()) - got.PrependSub(s) + got.AddInteriorSym(s) su.SetValue(got.Size()) got.AddUint64(target.Arch, 0) leg := ldr.MakeSymbolUpdater(syms.LinkEditGOT) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index a19a1451af..e6ca977991 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1629,7 +1629,7 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { toc := ldr.Lookup(".TOC.", int(ldr.SymVersion(s))) if toc != 0 { ldr.SetSymSect(toc, sect) - ldr.PrependSub(s, toc) + ldr.AddInteriorSym(s, toc) ldr.SetSymValue(toc, 0x8000) } } diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 08849ff380..9a76b3a775 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -1119,9 +1119,9 @@ func initdynimport(ctxt *Link) *Dll { for m = d.ms; m != nil; m = m.next { sb := ldr.MakeSymbolUpdater(m.s) sb.SetType(sym.SWINDOWS) - dynamic.PrependSub(m.s) sb.SetValue(dynamic.Size()) dynamic.SetSize(dynamic.Size() + int64(ctxt.Arch.PtrSize)) + dynamic.AddInteriorSym(m.s) } dynamic.SetSize(dynamic.Size() + int64(ctxt.Arch.PtrSize)) diff --git a/src/cmd/link/internal/loadelf/ldelf.go b/src/cmd/link/internal/loadelf/ldelf.go index bb5b4ffc0a..5a39856a3b 100644 --- a/src/cmd/link/internal/loadelf/ldelf.go +++ b/src/cmd/link/internal/loadelf/ldelf.go @@ -610,7 +610,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, f *bio.Reader, sb := l.MakeSymbolUpdater(s) sb.SetType(sectsb.Type()) - sectsb.PrependSub(s) + sectsb.AddInteriorSym(s) if !l.AttrCgoExportDynamic(s) { sb.SetDynimplib("") // satisfy dynimport } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 4580bdc9de..918d381282 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1060,8 +1060,8 @@ func (l *Loader) AttrSubSymbol(i Sym) bool { } // Note that we don't have a 'SetAttrSubSymbol' method in the loader; -// clients should instead use the PrependSub method to establish -// outer/sub relationships for host object symbols. +// clients should instead use the AddInteriorSym method to establish +// containment relationships for host object symbols. // Returns whether the i-th symbol has ReflectMethod attribute set. func (l *Loader) IsReflectMethod(i Sym) bool { @@ -1560,8 +1560,6 @@ func (l *Loader) Aux2(i Sym, j int) Aux2 { // introduction of the loader, this was done purely using name // lookups, e.f. for function with name XYZ we would then look up // go.info.XYZ, etc. -// FIXME: once all of dwarfgen is converted over to the loader, -// it would save some space to make these aux symbols nameless. func (l *Loader) GetFuncDwarfAuxSyms(fnSymIdx Sym) (auxDwarfInfo, auxDwarfLoc, auxDwarfRanges, auxDwarfLines Sym) { if l.SymType(fnSymIdx) != sym.STEXT { log.Fatalf("error: non-function sym %d/%s t=%s passed to GetFuncDwarfAuxSyms", fnSymIdx, l.SymName(fnSymIdx), l.SymType(fnSymIdx).String()) @@ -1601,25 +1599,53 @@ func (l *Loader) GetFuncDwarfAuxSyms(fnSymIdx Sym) (auxDwarfInfo, auxDwarfLoc, a return } -// PrependSub prepends 'sub' onto the sub list for outer symbol 'outer'. -// Will panic if 'sub' already has an outer sym or sub sym. -// FIXME: should this be instead a method on SymbolBuilder? -func (l *Loader) PrependSub(outer Sym, sub Sym) { - // NB: this presupposes that an outer sym can't be a sub symbol of - // some other outer-outer sym (I'm assuming this is true, but I - // haven't tested exhaustively). - if l.OuterSym(outer) != 0 { +// 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 +// container symbol. The container itself may or may not have a name. +// This method is intended primarily for use in the host object +// loaders, to capture the semantics of symbols and sections in an +// object file. When reading a host object file, we'll typically +// encounter a static section symbol (ex: ".text") containing content +// for a collection of functions, then a series of ELF (or macho, etc) +// symbol table entries each of which points into a sub-section +// (offset and length) of its corresponding container symbol. Within +// the go linker we create a loader.Sym for the container (which is +// expected to have the actual content/payload) and then a set of +// interior loader.Sym's that point into a portion of the container. +func (l *Loader) AddInteriorSym(container Sym, interior Sym) { + // Container symbols are expected to have content/data. + // NB: this restriction may turn out to be too strict (it's possible + // to imagine a zero-sized container with an interior symbol pointing + // into it); it's ok to relax or remove it if we counter an + // oddball host object that triggers this. + if l.SymSize(container) == 0 && len(l.Data(container)) == 0 { + panic("unexpected empty container symbol") + } + // The interior symbols for a container are not expected to have + // content/data or relocations. + if len(l.Data(interior)) != 0 { + panic("unexpected non-empty interior symbol") + } + // Interior symbol is expected to be in the symbol table. + if l.AttrNotInSymbolTable(interior) { + panic("interior symbol must be in symtab") + } + // Only a single level of containment is allowed. + if l.OuterSym(container) != 0 { panic("outer has outer itself") } - if l.SubSym(sub) != 0 { + // Interior sym should not already have a sibling. + if l.SubSym(interior) != 0 { panic("sub set for subsym") } - if l.OuterSym(sub) != 0 { + // Interior sym should not already point at a container. + if l.OuterSym(interior) != 0 { panic("outer already set for subsym") } - l.sub[sub] = l.sub[outer] - l.sub[outer] = sub - l.outer[sub] = outer + l.sub[interior] = l.sub[container] + l.sub[container] = interior + l.outer[interior] = container } // OuterSym gets the outer symbol for host object loaded symbols. diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index cf905492ed..0367bc4536 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -359,6 +359,7 @@ func TestOuterSub(t *testing.T) { // Populate loader with some symbols. addDummyObjSym(t, ldr, or, "type.uint8") es1 := ldr.LookupOrCreateSym("outer", 0) + ldr.MakeSymbolUpdater(es1).SetSize(101) es2 := ldr.LookupOrCreateSym("sub1", 0) es3 := ldr.LookupOrCreateSym("sub2", 0) es4 := ldr.LookupOrCreateSym("sub3", 0) @@ -374,7 +375,7 @@ func TestOuterSub(t *testing.T) { } // Establish first outer/sub relationship - ldr.PrependSub(es1, es2) + ldr.AddInteriorSym(es1, es2) if ldr.OuterSym(es1) != 0 { t.Errorf("ldr.OuterSym(es1) got %d wanted %d", ldr.OuterSym(es1), 0) } @@ -389,7 +390,7 @@ func TestOuterSub(t *testing.T) { } // Establish second outer/sub relationship - ldr.PrependSub(es1, es3) + ldr.AddInteriorSym(es1, es3) if ldr.OuterSym(es1) != 0 { t.Errorf("ldr.OuterSym(es1) got %d wanted %d", ldr.OuterSym(es1), 0) } @@ -407,9 +408,9 @@ func TestOuterSub(t *testing.T) { } // Some more - ldr.PrependSub(es1, es4) - ldr.PrependSub(es1, es5) - ldr.PrependSub(es1, es6) + ldr.AddInteriorSym(es1, es4) + ldr.AddInteriorSym(es1, es5) + ldr.AddInteriorSym(es1, es6) // Set values. ldr.SetSymValue(es2, 7) diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index 9713a282b1..7c8115f0b9 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -240,8 +240,8 @@ func (sb *SymbolBuilder) SortSub() { sb.l.SortSub(sb.symIdx) } -func (sb *SymbolBuilder) PrependSub(sub Sym) { - sb.l.PrependSub(sb.symIdx, sub) +func (sb *SymbolBuilder) AddInteriorSym(sub Sym) { + sb.l.AddInteriorSym(sb.symIdx, sub) } func (sb *SymbolBuilder) AddUint8(v uint8) int64 { diff --git a/src/cmd/link/internal/loadmacho/ldmacho.go b/src/cmd/link/internal/loadmacho/ldmacho.go index dad65ea0fe..864d80835b 100644 --- a/src/cmd/link/internal/loadmacho/ldmacho.go +++ b/src/cmd/link/internal/loadmacho/ldmacho.go @@ -633,7 +633,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, f *bio.Reader, } bld.SetType(l.SymType(outer)) - l.PrependSub(outer, s) + l.AddInteriorSym(outer, s) bld.SetValue(int64(machsym.value - sect.addr)) if !l.AttrCgoExportDynamic(s) { diff --git a/src/cmd/link/internal/loadpe/ldpe.go b/src/cmd/link/internal/loadpe/ldpe.go index cf76741f43..7677278ec5 100644 --- a/src/cmd/link/internal/loadpe/ldpe.go +++ b/src/cmd/link/internal/loadpe/ldpe.go @@ -409,7 +409,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read bld = makeUpdater(l, bld, s) sectsym := sectsyms[sect] bld.SetType(l.SymType(sectsym)) - l.PrependSub(sectsym, s) + l.AddInteriorSym(sectsym, s) bld.SetValue(int64(pesym.Value)) bld.SetSize(4) if l.SymType(sectsym) == sym.STEXT { -- GitLab From 1e9381207ef6c8b12f84d8b33414d04847d6d893 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 1 Jul 2020 08:45:16 -0400 Subject: [PATCH 0089/1792] [dev.link] cmd/link: better naming for Loader container/subsym methods, part 2 of 2 Introduce a new loader method "SetCarrierSym", to be used when establishing container/containee symbol relationships for symbol bucketing in the symtab phase. This new method is intended to be employed in situations where you have a series of related symbols will be represented by a single carrier symbol as a combined entity. The pattern here is that the sub-symbols contain content but will be anonymous from a symbol table perspective; the carrier symbol has no content itself but will appear in the symbol table. Examples of carrier symbols that follow this model are "runtime.itablink" and "runtime.typelink". Change-Id: I1a3391a71062c7c740cb108b3fa210b7f69b81ed Reviewed-on: https://go-review.googlesource.com/c/go/+/240509 Reviewed-by: Cherry Zhang Reviewed-by: Austin Clements Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/symtab.go | 22 +++++++++----- src/cmd/link/internal/loader/loader.go | 41 ++++++++++++++++++-------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index a2aabbb108..b5f4288b6c 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -515,10 +515,14 @@ func (ctxt *Link) symtab() []sym.SymKind { } if ctxt.UseRelro() { symGroupType[s] = sym.STYPERELRO - ldr.SetOuterSym(s, symtyperel) + if symtyperel != 0 { + ldr.SetCarrierSym(s, symtyperel) + } } else { symGroupType[s] = sym.STYPE - ldr.SetOuterSym(s, symtype) + if symtyperel != 0 { + ldr.SetCarrierSym(s, symtype) + } } case strings.HasPrefix(name, "go.importpath.") && ctxt.UseRelro(): @@ -530,17 +534,17 @@ func (ctxt *Link) symtab() []sym.SymKind { nitablinks++ symGroupType[s] = sym.SITABLINK ldr.SetAttrNotInSymbolTable(s, true) - ldr.SetOuterSym(s, symitablink.Sym()) + ldr.SetCarrierSym(s, symitablink.Sym()) case strings.HasPrefix(name, "go.string."): symGroupType[s] = sym.SGOSTRING ldr.SetAttrNotInSymbolTable(s, true) - ldr.SetOuterSym(s, symgostring) + ldr.SetCarrierSym(s, symgostring) case strings.HasPrefix(name, "runtime.gcbits."): symGroupType[s] = sym.SGCBITS ldr.SetAttrNotInSymbolTable(s, true) - ldr.SetOuterSym(s, symgcbits) + ldr.SetCarrierSym(s, symgcbits) case strings.HasSuffix(name, "·f"): if !ctxt.DynlinkingGo() { @@ -548,10 +552,12 @@ func (ctxt *Link) symtab() []sym.SymKind { } if ctxt.UseRelro() { symGroupType[s] = sym.SGOFUNCRELRO - ldr.SetOuterSym(s, symgofuncrel) + if symgofuncrel != 0 { + ldr.SetCarrierSym(s, symgofuncrel) + } } else { symGroupType[s] = sym.SGOFUNC - ldr.SetOuterSym(s, symgofunc) + ldr.SetCarrierSym(s, symgofunc) } case strings.HasPrefix(name, "gcargs."), @@ -561,7 +567,7 @@ func (ctxt *Link) symtab() []sym.SymKind { strings.HasSuffix(name, ".opendefer"): symGroupType[s] = sym.SGOFUNC ldr.SetAttrNotInSymbolTable(s, true) - ldr.SetOuterSym(s, symgofunc) + ldr.SetCarrierSym(s, symgofunc) const align = 4 ldr.SetSymAlign(s, align) liveness += (ldr.SymSize(s) + int64(align) - 1) &^ (int64(align) - 1) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 918d381282..3de0ab34b4 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1661,18 +1661,35 @@ func (l *Loader) SubSym(i Sym) Sym { return l.sub[i] } -// SetOuterSym sets the outer symbol of i to o (without setting -// sub symbols). -func (l *Loader) SetOuterSym(i Sym, o Sym) { - if o != 0 { - l.outer[i] = o - // relocsym's foldSubSymbolOffset requires that we only - // have a single level of containment-- enforce here. - if l.outer[o] != 0 { - panic("multiply nested outer sym") - } - } else { - delete(l.outer, i) +// 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 +// sub-symbols is effectively concatenated to form the content of the +// carrier. The carrier is given a name in the output symbol table +// while the sub-symbol names are not. For example, the Go compiler +// emits named string symbols (type SGOSTRING) when compiling a +// package; after being deduplicated, these symbols are collected into +// a single unit by assigning them a new carrier symbol named +// "go.string.*" (which appears in the final symbol table for the +// output load module). +func (l *Loader) SetCarrierSym(s Sym, c Sym) { + if c == 0 { + panic("invalid carrier in SetCarrierSym") + } + if s == 0 { + panic("invalid sub-symbol in SetCarrierSym") + } + // Carrier symbols are not expected to have content/data. It is + // ok for them to have non-zero size (to allow for use of generator + // symbols). + if len(l.Data(c)) != 0 { + panic("unexpected non-empty carrier symbol") + } + l.outer[s] = c + // relocsym's foldSubSymbolOffset requires that we only + // have a single level of containment-- enforce here. + if l.outer[c] != 0 { + panic("invalid nested carrier sym") } } -- GitLab From 130ede0d9e01ef53e734371faea080f5301d9c55 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 6 Jul 2020 09:38:17 -0400 Subject: [PATCH 0090/1792] [dev.link] cmd/link: remove some unneeded code from writeBlock() The loader writeBlock() function has code that tries to skip the initial portion of the input symbols list depending on the address of the section being written-- this code is dead (skipping is never triggered) due to similar skipping in the callers; remove this preamble. Change-Id: I9769694a3194faf73ebebbbc10ceba4928c3087c Reviewed-on: https://go-review.googlesource.com/c/go/+/241067 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/data.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index e6ca977991..d9f9ff70d3 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -878,12 +878,6 @@ func writeBlocks(ctxt *Link, out *OutBuf, sem chan int, ldr *loader.Loader, syms } func writeBlock(ctxt *Link, out *OutBuf, ldr *loader.Loader, syms []loader.Sym, addr, size int64, pad []byte) { - for i, s := range syms { - if ldr.SymValue(s) >= addr && !ldr.AttrSubSymbol(s) { - syms = syms[i:] - break - } - } st := ctxt.makeRelocSymState() -- GitLab From 041d8850a15a4c4af23f8cb21cc47c0b4d85d7fa Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 6 Jul 2020 17:49:24 -0400 Subject: [PATCH 0091/1792] [dev.link] cmd/link: run more tests in parallel Change-Id: I4062fd89f234b4ca5386b74584e1363c05e82e84 Reviewed-on: https://go-review.googlesource.com/c/go/+/241177 Run-TryBot: Cherry Zhang Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh TryBot-Result: Gobot Gobot --- src/cmd/link/dwarf_test.go | 2 ++ src/cmd/link/elf_test.go | 2 ++ src/cmd/link/internal/ld/dwarf_test.go | 4 ++++ src/cmd/link/internal/ld/issue33808_test.go | 1 + src/cmd/link/link_test.go | 22 +++++++++++++++++++++ 5 files changed, 31 insertions(+) diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index ac6937ced0..88480064dd 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -28,6 +28,8 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) t.Skip("skipping on plan9; no DWARF symbol table in executables") } + t.Parallel() + out, err := exec.Command(testenv.GoToolPath(t), "list", "-f", "{{.Stale}}", "cmd/link").CombinedOutput() if err != nil { t.Fatalf("go list: %v\n%s", err, out) diff --git a/src/cmd/link/elf_test.go b/src/cmd/link/elf_test.go index 2fb4dd8aaf..334f050e88 100644 --- a/src/cmd/link/elf_test.go +++ b/src/cmd/link/elf_test.go @@ -230,6 +230,8 @@ func TestPIESize(t *testing.T) { t.Skip("-buildmode=pie not supported") } + t.Parallel() + tmpl := template.Must(template.New("pie").Parse(pieSourceTemplate)) writeGo := func(t *testing.T, dir string) { diff --git a/src/cmd/link/internal/ld/dwarf_test.go b/src/cmd/link/internal/ld/dwarf_test.go index f3dd53792a..22948521f5 100644 --- a/src/cmd/link/internal/ld/dwarf_test.go +++ b/src/cmd/link/internal/ld/dwarf_test.go @@ -1376,6 +1376,8 @@ func TestIssue38192(t *testing.T) { t.Skip("skipping on plan9; no DWARF symbol table in executables") } + t.Parallel() + // Build a test program that contains a translation unit whose // text (from am assembly source) contains only a single instruction. tmpdir, err := ioutil.TempDir("", "TestIssue38192") @@ -1487,6 +1489,8 @@ func TestIssue39757(t *testing.T) { t.Skip("skipping on plan9; no DWARF symbol table in executables") } + t.Parallel() + // In this bug the DWARF line table contents for the last couple of // instructions in a function were incorrect (bad file/line). This // test verifies that all of the line table rows for a function diff --git a/src/cmd/link/internal/ld/issue33808_test.go b/src/cmd/link/internal/ld/issue33808_test.go index 77eaeb4b31..92a47faa4a 100644 --- a/src/cmd/link/internal/ld/issue33808_test.go +++ b/src/cmd/link/internal/ld/issue33808_test.go @@ -29,6 +29,7 @@ func TestIssue33808(t *testing.T) { } testenv.MustHaveGoBuild(t) testenv.MustHaveCGO(t) + t.Parallel() dir, err := ioutil.TempDir("", "TestIssue33808") if err != nil { diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index aa1bb04302..6ed6688a23 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -119,6 +119,8 @@ func TestIssue28429(t *testing.T) { func TestUnresolved(t *testing.T) { testenv.MustHaveGoBuild(t) + t.Parallel() + tmpdir, err := ioutil.TempDir("", "unresolved-") if err != nil { t.Fatalf("failed to create temp dir: %v", err) @@ -185,6 +187,8 @@ func TestIssue33979(t *testing.T) { t.Skipf("Skipping on %s/%s", runtime.GOOS, runtime.GOARCH) } + t.Parallel() + tmpdir, err := ioutil.TempDir("", "unresolved-") if err != nil { t.Fatalf("failed to create temp dir: %v", err) @@ -274,6 +278,8 @@ func TestBuildForTvOS(t *testing.T) { t.Skipf("error running xcrun, required for iOS cross build: %v", err) } + t.Parallel() + sdkPath, err := exec.Command("xcrun", "--sdk", "appletvos", "--show-sdk-path").Output() if err != nil { t.Skip("failed to locate appletvos SDK, skipping") @@ -324,6 +330,8 @@ func main() { println(X) } func TestXFlag(t *testing.T) { testenv.MustHaveGoBuild(t) + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestXFlag") if err != nil { t.Fatal(err) @@ -350,6 +358,8 @@ func main() { } func TestMacOSVersion(t *testing.T) { testenv.MustHaveGoBuild(t) + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestMacOSVersion") if err != nil { t.Fatal(err) @@ -427,6 +437,8 @@ func TestIssue34788Android386TLSSequence(t *testing.T) { t.Skip("skipping on non-{linux,darwin}/amd64 platform") } + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestIssue34788Android386TLSSequence") if err != nil { t.Fatal(err) @@ -487,6 +499,8 @@ func TestStrictDup(t *testing.T) { // Check that -strictdups flag works. testenv.MustHaveGoBuild(t) + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestStrictDup") if err != nil { t.Fatal(err) @@ -571,6 +585,8 @@ func TestFuncAlign(t *testing.T) { } testenv.MustHaveGoBuild(t) + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestFuncAlign") if err != nil { t.Fatal(err) @@ -637,6 +653,8 @@ func TestTrampoline(t *testing.T) { testenv.MustHaveGoBuild(t) + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestTrampoline") if err != nil { t.Fatal(err) @@ -671,6 +689,8 @@ func TestIndexMismatch(t *testing.T) { // manually, and try to "trick" the linker with an inconsistent object file. testenv.MustHaveGoBuild(t) + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestIndexMismatch") if err != nil { t.Fatal(err) @@ -731,6 +751,8 @@ func TestPErsrc(t *testing.T) { t.Skipf("this is a windows/amd64-only test") } + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestPErsrc") if err != nil { t.Fatal(err) -- GitLab From 59a702aa6aca364eb75f40261fdafe4ae9be153e Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 6 Jul 2020 18:44:42 -0400 Subject: [PATCH 0092/1792] [dev.link] cmd/link: emit Mach-O relocations in mmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Following CL 240399 and CL 240400, do the same for Mach-O. Linking cmd/compile with external linking, name old time/op new time/op delta Asmb2_GC 32.7ms ± 2% 13.5ms ± 6% -58.56% (p=0.008 n=5+5) name old alloc/op new alloc/op delta Asmb2_GC 16.5MB ± 0% 6.4MB ± 0% -61.15% (p=0.008 n=5+5) Change-Id: I0fd7019d8713d1940e5fbbce4ee8eebd926451a1 Reviewed-on: https://go-review.googlesource.com/c/go/+/241178 Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/link/internal/amd64/obj.go | 1 + src/cmd/link/internal/arm64/asm.go | 6 +++- src/cmd/link/internal/arm64/obj.go | 1 + src/cmd/link/internal/ld/asmb.go | 54 ++++++++++++++++++++++++++++++ src/cmd/link/internal/ld/elf.go | 47 ++------------------------ src/cmd/link/internal/ld/lib.go | 15 +++++---- src/cmd/link/internal/ld/macho.go | 24 ++++++++----- 7 files changed, 87 insertions(+), 61 deletions(-) diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index fcc2499cb0..777f99dbe2 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -65,6 +65,7 @@ func Init() (*sys.Arch, ld.Arch) { Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, + MachorelocSize: 8, PEreloc1: pereloc1, TLSIEtoLE: tlsIEtoLE, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index bbd53825b6..2d964e9cb6 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -453,7 +453,6 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade default: case objabi.R_ARM64_GOTPCREL, objabi.R_ADDRARM64: - nExtReloc = 2 // need two ELF relocations. see elfreloc1 // set up addend for eventual relocation via outer symbol. rs, off := ld.FoldSubSymbolOffset(ldr, rs) @@ -464,6 +463,11 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade } rr.Xsym = rs + nExtReloc = 2 // need two ELF/Mach-O relocations. see elfreloc1/machoreloc1 + if target.IsDarwin() && rt == objabi.R_ADDRARM64 && rr.Xadd != 0 { + nExtReloc = 4 // need another two relocations for non-zero addend + } + // Note: ld64 currently has a bug that any non-zero addend for BR26 relocation // will make the linking fail because it thinks the code is not PIC even though // the BR26 relocation should be fully resolved at link time. diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 5d07746ad5..e7c23978a6 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -55,6 +55,7 @@ func Init() (*sys.Arch, ld.Arch) { Elfsetupplt: elfsetupplt, Gentext: gentext, Machoreloc1: machoreloc1, + MachorelocSize: 8, Androiddynld: "/system/bin/linker64", Linuxdynld: "/lib/ld-linux-aarch64.so.1", diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index 216e9b6cc4..dc8a96b568 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -6,7 +6,10 @@ package ld import ( "cmd/internal/objabi" + "cmd/link/internal/loader" + "cmd/link/internal/sym" "fmt" + "runtime" "sync" ) @@ -163,3 +166,54 @@ func asmbPlan9(ctxt *Link) { ctxt.Out.SeekSet(0) writePlan9Header(ctxt.Out, thearch.Plan9Magic, Entryvalue(ctxt), thearch.Plan9_64Bit) } + +// sizeExtRelocs precomputes the size needed for the reloc records, +// sets the size and offset for relocation records in each section, +// and mmap the output buffer with the proper size. +func sizeExtRelocs(ctxt *Link, relsize uint32) { + if relsize == 0 { + panic("sizeExtRelocs: relocation size not set") + } + var sz int64 + for _, seg := range Segments { + for _, sect := range seg.Sections { + sect.Reloff = uint64(ctxt.Out.Offset() + sz) + sect.Rellen = uint64(relsize * sect.Relcount) + sz += int64(sect.Rellen) + } + } + filesz := ctxt.Out.Offset() + sz + ctxt.Out.Mmap(uint64(filesz)) +} + +// relocSectFn wraps the function writing relocations of a section +// for parallel execution. Returns the wrapped function and a wait +// group for which the caller should wait. +func relocSectFn(ctxt *Link, relocSect func(*Link, *OutBuf, *sym.Section, []loader.Sym)) (func(*Link, *sym.Section, []loader.Sym), *sync.WaitGroup) { + var fn func(ctxt *Link, sect *sym.Section, syms []loader.Sym) + var wg sync.WaitGroup + var sem chan int + if ctxt.Out.isMmapped() { + // Write sections in parallel. + sem = make(chan int, 2*runtime.GOMAXPROCS(0)) + fn = func(ctxt *Link, sect *sym.Section, syms []loader.Sym) { + wg.Add(1) + sem <- 1 + out, err := ctxt.Out.View(sect.Reloff) + if err != nil { + panic(err) + } + go func() { + relocSect(ctxt, out, sect, syms) + wg.Done() + <-sem + }() + } + } else { + // We cannot Mmap. Write sequentially. + fn = func(ctxt *Link, sect *sym.Section, syms []loader.Sym) { + relocSect(ctxt, ctxt.Out, sect, syms) + } + } + return fn, &wg +} diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 5af6020ced..022da8aa19 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -13,10 +13,8 @@ import ( "encoding/binary" "encoding/hex" "path/filepath" - "runtime" "sort" "strings" - "sync" ) /* @@ -1405,48 +1403,9 @@ func elfEmitReloc(ctxt *Link) { ctxt.Out.Write8(0) } - // Precompute the size needed for the reloc records if we can - // Mmap the output buffer with the proper size. - if thearch.ElfrelocSize == 0 { - panic("elfEmitReloc: ELF relocation size not set") - } - var sz int64 - for _, seg := range Segments { - for _, sect := range seg.Sections { - sect.Reloff = uint64(ctxt.Out.Offset() + sz) - sect.Rellen = uint64(thearch.ElfrelocSize * sect.Relcount) - sz += int64(sect.Rellen) - } - } - filesz := ctxt.Out.Offset() + sz - ctxt.Out.Mmap(uint64(filesz)) - - // Now emits the records. - var relocSect func(ctxt *Link, sect *sym.Section, syms []loader.Sym) - var wg sync.WaitGroup - var sem chan int - if ctxt.Out.isMmapped() { - // Write sections in parallel. - sem = make(chan int, 2*runtime.GOMAXPROCS(0)) - relocSect = func(ctxt *Link, sect *sym.Section, syms []loader.Sym) { - wg.Add(1) - sem <- 1 - out, err := ctxt.Out.View(sect.Reloff) - if err != nil { - panic(err) - } - go func() { - elfrelocsect(ctxt, out, sect, syms) - wg.Done() - <-sem - }() - } - } else { - // We cannot Mmap. Write sequentially. - relocSect = func(ctxt *Link, sect *sym.Section, syms []loader.Sym) { - elfrelocsect(ctxt, ctxt.Out, sect, syms) - } - } + sizeExtRelocs(ctxt, thearch.ElfrelocSize) + relocSect, wg := relocSectFn(ctxt, elfrelocsect) + for _, sect := range Segtext.Sections { if sect.Name == ".text" { relocSect(ctxt, sect, ctxt.Textp) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index a53bb45327..02ae26ec8d 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -237,13 +237,14 @@ type Arch struct { Asmb func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader) - Elfreloc1 func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, 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) - Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + Elfreloc1 func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, 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) + Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + MachorelocSize uint32 // size of an Mach-O relocation record, must match Machoreloc1. + PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool // TLSIEtoLE converts a TLS Initial Executable relocation to // a TLS Local Executable relocation. diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index c8f02c4f0e..4a0bb5d381 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -1020,13 +1020,13 @@ func doMachoLink(ctxt *Link) int64 { return Rnd(int64(size), int64(*FlagRound)) } -func machorelocsect(ctxt *Link, ldr *loader.Loader, sect *sym.Section, syms []loader.Sym) { +func machorelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) { // If main section has no bits, nothing to relocate. if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { return } + ldr := ctxt.loader - sect.Reloff = uint64(ctxt.Out.Offset()) for i, s := range syms { if !ldr.AttrReachable(s) { continue @@ -1055,13 +1055,16 @@ func machorelocsect(ctxt *Link, ldr *loader.Loader, sect *sym.Section, syms []lo if !ldr.AttrReachable(r.Xsym) { ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) } - if !thearch.Machoreloc1(ctxt.Arch, ctxt.Out, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) { + if !thearch.Machoreloc1(ctxt.Arch, out, ldr, s, r, 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())) } } } - sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff + // sanity check + if uint64(out.Offset()) != sect.Reloff+sect.Rellen { + panic("machorelocsect: size mismatch") + } } func machoEmitReloc(ctxt *Link) { @@ -1069,13 +1072,15 @@ func machoEmitReloc(ctxt *Link) { ctxt.Out.Write8(0) } - ldr := ctxt.loader - machorelocsect(ctxt, ldr, Segtext.Sections[0], ctxt.Textp) + sizeExtRelocs(ctxt, thearch.MachorelocSize) + relocSect, wg := relocSectFn(ctxt, machorelocsect) + + relocSect(ctxt, Segtext.Sections[0], ctxt.Textp) for _, sect := range Segtext.Sections[1:] { - machorelocsect(ctxt, ldr, sect, ctxt.datap) + relocSect(ctxt, sect, ctxt.datap) } for _, sect := range Segdata.Sections { - machorelocsect(ctxt, ldr, sect, ctxt.datap) + relocSect(ctxt, sect, ctxt.datap) } for i := 0; i < len(Segdwarf.Sections); i++ { sect := Segdwarf.Sections[i] @@ -1084,8 +1089,9 @@ func machoEmitReloc(ctxt *Link) { ctxt.loader.SymSect(si.secSym()) != sect { panic("inconsistency between dwarfp and Segdwarf") } - machorelocsect(ctxt, ldr, sect, si.syms) + relocSect(ctxt, sect, si.syms) } + wg.Wait() } // hostobjMachoPlatform returns the first platform load command found -- GitLab From 0434d4093458d24db6af1e65fb257cee78512c25 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 30 Jun 2020 07:55:16 -0400 Subject: [PATCH 0093/1792] [dev.link] cmd/compile: mark stmp and stkobj symbols as static Mark compiler-generated ".stmp_%d" and ".stkobj" symbols as AttrStatic, so as to tell the linker that they do not need to be inserted into its name lookup tables. Change-Id: I59ffd11659b2c54c2d0ad41275d05c3f919e3b88 Reviewed-on: https://go-review.googlesource.com/c/go/+/240497 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/obj.go | 4 +--- src/cmd/compile/internal/gc/sinit.go | 3 ++- src/cmd/internal/obj/plist.go | 3 +++ src/cmd/internal/obj/sym.go | 5 +++++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 01126dc048..4f511f9c7b 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -291,10 +291,8 @@ func addGCLocals() { } if x := s.Func.StackObjects; x != nil { attr := int16(obj.RODATA) - if s.DuplicateOK() { - attr |= obj.DUPOK - } ggloblsym(x, int32(len(x.P)), attr) + x.Set(obj.AttrStatic, true) } if x := s.Func.OpenCodedDeferInfo; x != nil { ggloblsym(x, int32(len(x.P)), obj.RODATA|obj.DUPOK) diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 3c7571819e..83274bf6a3 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -6,6 +6,7 @@ package gc import ( "cmd/compile/internal/types" + "cmd/internal/obj" "fmt" ) @@ -360,7 +361,7 @@ var statuniqgen int // name generator for static temps // returned node for readonly nodes. func staticname(t *types.Type) *Node { // Don't use lookupN; it interns the resulting string, but these are all unique. - n := newname(lookup(fmt.Sprintf(".stmp_%d", statuniqgen))) + n := newname(lookup(fmt.Sprintf("%s%d", obj.StaticNamePref, statuniqgen))) statuniqgen++ addvar(n, t, PEXTERN) return n diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index d4f9089a2e..b27e6c163d 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -170,6 +170,9 @@ func (ctxt *Link) Globl(s *LSym, size int64, flag int) { } else if flag&TLSBSS != 0 { s.Type = objabi.STLSBSS } + if strings.HasPrefix(s.Name, "\"\"."+StaticNamePref) { + s.Set(AttrStatic, true) + } } // EmitEntryLiveness generates PCDATA Progs after p to switch to the diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index bfc405cffb..7f5d9ebeea 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -264,6 +264,11 @@ func isNonPkgSym(ctxt *Link, s *LSym) bool { return false } +// StaticNamePref is the prefix the front end applies to static temporary +// variables. When turned into LSyms, these can be tagged as static so +// as to avoid inserting them into the linker's name lookup tables. +const StaticNamePref = ".stmp_" + type traverseFlag uint32 const ( -- GitLab From 8aa036e9135f6f24ab6a5f250a4fba47a5d3a083 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 30 Jun 2020 10:22:13 -0400 Subject: [PATCH 0094/1792] [dev.link] cmd/link: skip symtab entries for selected file local symbols Don't emit symbol table entries for compiler-generated file-local symbols (this category includes .stmp_* temporaries and *.stkobj symbols). Note that user-written static symbols within assembler sources will still be added to the symbol table. Apply the same test when emitting DWARF for global variables. Change-Id: I4db77a2750a0b575e051dfea895c4742cf6709a6 Reviewed-on: https://go-review.googlesource.com/c/go/+/240539 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/internal/goobj2/objfile.go | 2 ++ src/cmd/internal/obj/objfile2.go | 3 +++ src/cmd/link/internal/ld/dwarf.go | 7 ++++--- src/cmd/link/internal/ld/symtab.go | 19 +++++++++---------- src/cmd/link/internal/loader/loader.go | 14 +++++++++++++- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index 433eafa559..938362901a 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -241,6 +241,7 @@ const SymABIstatic = ^uint16(0) const ( ObjFlagShared = 1 << iota // this object is built with -shared ObjFlagNeedNameExpansion // the linker needs to expand `"".` to package path in symbol names + ObjFlagFromAssembly // object is from asm src, not go ) // Sym.Flag @@ -742,3 +743,4 @@ func (r *Reader) Flags() uint32 { func (r *Reader) Shared() bool { return r.Flags()&ObjFlagShared != 0 } func (r *Reader) NeedNameExpansion() bool { return r.Flags()&ObjFlagNeedNameExpansion != 0 } +func (r *Reader) FromAssembly() bool { return r.Flags()&ObjFlagFromAssembly != 0 } diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index b12b6fe84c..fbd2395d1f 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -41,6 +41,9 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { if pkgpath == "" { flags |= goobj2.ObjFlagNeedNameExpansion } + if ctxt.IsAsm { + flags |= goobj2.ObjFlagFromAssembly + } h := goobj2.Header{ Magic: goobj2.Magic, Fingerprint: ctxt.Fingerprint, diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index d15cde4e38..a574472aa4 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1887,11 +1887,12 @@ func dwarfGenerateDebugInfo(ctxt *Link) { if d.ldr.SymGoType(idx) == 0 { continue } - - sn := d.ldr.SymName(idx) - if ctxt.LinkMode != LinkExternal && isStaticTemp(sn) { + // Skip file local symbols (this includes static tmps, stack + // object symbols, and local symbols in assembler src files). + if d.ldr.IsFileLocal(idx) { continue } + sn := d.ldr.SymName(idx) if sn == "" { // skip aux symbols continue diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index b5f4288b6c..fddf85f1c5 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -196,7 +196,14 @@ func genelfsym(ctxt *Link, elfbind int) { return false } // FIXME: avoid having to do name inspections here. + // NB: the restrictions below on file local symbols are a bit + // arbitrary -- if it turns out we need nameless static + // symbols they could be relaxed/removed. sn := ldr.SymName(s) + if (sn == "" || sn[0] == '.') && ldr.IsFileLocal(s) { + panic(fmt.Sprintf("unexpected file local symbol %d %s<%d>\n", + s, sn, ldr.SymVersion(s))) + } if (sn == "" || sn[0] == '.') && !ldr.IsFileLocal(s) { return false } @@ -499,15 +506,14 @@ func (ctxt *Link) symtab() []sym.SymKind { nsym := loader.Sym(ldr.NSym()) symGroupType := make([]sym.SymKind, nsym) for s := loader.Sym(1); s < nsym; s++ { - name := ldr.SymName(s) - if !ctxt.IsExternal() && isStaticTemp(name) { + if !ctxt.IsExternal() && ldr.IsFileLocal(s) && !ldr.IsFromAssembly(s) { ldr.SetAttrNotInSymbolTable(s, true) } - if !ldr.AttrReachable(s) || ldr.AttrSpecial(s) || (ldr.SymType(s) != sym.SRODATA && ldr.SymType(s) != sym.SGOFUNC) { continue } + name := ldr.SymName(s) switch { case strings.HasPrefix(name, "type."): if !ctxt.DynlinkingGo() { @@ -768,10 +774,3 @@ func (ctxt *Link) symtab() []sym.SymKind { } return symGroupType } - -func isStaticTemp(name string) bool { - if i := strings.LastIndex(name, "/"); i >= 0 { - name = name[i:] - } - return strings.Contains(name, "..stmp_") -} diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 3de0ab34b4..28847ad17a 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -683,7 +683,19 @@ func (l *Loader) SymVersion(i Sym) int { return int(abiToVer(r.Sym(li).ABI(), r.version)) } -func (l *Loader) IsFileLocal(i Sym) bool { return l.SymVersion(i) >= sym.SymVerStatic } +func (l *Loader) IsFileLocal(i Sym) bool { + return l.SymVersion(i) >= sym.SymVerStatic +} + +// IsFromAssembly returns true if this symbol is derived from an +// object file generated by the Go assembler. +func (l *Loader) IsFromAssembly(i Sym) bool { + if l.IsExternal(i) { + return false + } + r, _ := l.toLocal(i) + return r.FromAssembly() +} // Returns the type of the i-th symbol. func (l *Loader) SymType(i Sym) sym.SymKind { -- GitLab From 076dc2111bd15476e03ee39d153bdd5a1fb0a3e8 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 8 Jul 2020 18:32:36 -0400 Subject: [PATCH 0095/1792] [dev.link] cmd/compile: make compiler-generated ppc64 TOC symbols static Set the AttrStatic flag on compiler-emitted TOC symbols for ppc64; these symbols don't need to go into the final symbol table in Go binaries. This fixes a buglet introduced by CL 240539 that was causing failures on the aix builder. Change-Id: If8b63bcf6d2791f1ec5a0c371d2d11e806202fd2 Reviewed-on: https://go-review.googlesource.com/c/go/+/241637 Run-TryBot: Than McIntosh Reviewed-by: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/internal/obj/ppc64/obj9.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index 7135488f9d..16881c634b 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -142,6 +142,7 @@ func (c *ctxt9) rewriteToUseTOC(p *obj.Prog) { symtoc := c.ctxt.LookupInit("TOC."+sym.Name, func(s *obj.LSym) { s.Type = objabi.SDATA s.Set(obj.AttrDuplicateOK, true) + s.Set(obj.AttrStatic, true) c.ctxt.Data = append(c.ctxt.Data, s) s.WriteAddr(c.ctxt, 0, 8, sym, 0) }) @@ -223,6 +224,7 @@ func (c *ctxt9) rewriteToUseTOC(p *obj.Prog) { symtoc := c.ctxt.LookupInit("TOC."+source.Sym.Name, func(s *obj.LSym) { s.Type = objabi.SDATA s.Set(obj.AttrDuplicateOK, true) + s.Set(obj.AttrStatic, true) c.ctxt.Data = append(c.ctxt.Data, s) s.WriteAddr(c.ctxt, 0, 8, source.Sym, 0) }) -- GitLab From f3a29d3a34c498954c6d80059f3ba7d5ffbb46d9 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 10 Jul 2020 16:09:37 -0400 Subject: [PATCH 0096/1792] [dev.link] cmd/link: remove ARM64 special handling of GC data in shared libraries The special case is no longer needed, didn't actually work, and we no longer even save this map anywhere (see CL 240621 for more information). Change-Id: I19bcf32cace22decf50fd6414d4519cc51cbb0be Reviewed-on: https://go-review.googlesource.com/c/go/+/241982 Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/lib.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 4121124eb0..a489da02bc 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2038,7 +2038,6 @@ func ldshlibsyms(ctxt *Link, shlib string) { Errorf(nil, "cannot read symbols from shared library: %s", libpath) return } - gcdataLocations := make(map[uint64]loader.Sym) for _, elfsym := range syms { if elf.ST_TYPE(elfsym.Info) == elf.STT_NOTYPE || elf.ST_TYPE(elfsym.Info) == elf.STT_SECTION { continue @@ -2085,7 +2084,6 @@ func ldshlibsyms(ctxt *Link, shlib string) { sname := l.SymName(s) if strings.HasPrefix(sname, "type.") && !strings.HasPrefix(sname, "type..") { su.SetData(readelfsymboldata(ctxt, f, &elfsym)) - gcdataLocations[elfsym.Value+2*uint64(ctxt.Arch.PtrSize)+8+1*uint64(ctxt.Arch.PtrSize)] = s } } @@ -2106,28 +2104,6 @@ func ldshlibsyms(ctxt *Link, shlib string) { su.AddReloc(loader.Reloc{Sym: s}) } } - if ctxt.Arch.Family == sys.ARM64 { - for _, sect := range f.Sections { - if sect.Type == elf.SHT_RELA { - var rela elf.Rela64 - rdr := sect.Open() - for { - err := binary.Read(rdr, f.ByteOrder, &rela) - if err == io.EOF { - break - } else if err != nil { - Errorf(nil, "reading relocation failed %v", err) - return - } - t := elf.R_AARCH64(rela.Info & 0xffff) - if t != elf.R_AARCH64_RELATIVE { - continue - } - } - } - } - } - ctxt.Shlibs = append(ctxt.Shlibs, Shlib{Path: libpath, Hash: hash, Deps: deps, File: f}) } -- GitLab From 5698ec36a86afcba0f7fe06e97e4cd5deaabe3f9 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 10 Jul 2020 18:53:12 -0400 Subject: [PATCH 0097/1792] [dev.link] cmd/link: dump symbol info on crash under -v If the linker panics, it usually helps dumping all symbols' information for debugging. Do it under -v. Change-Id: I66f9e32a0133e763a631f17a218dcdc805c5df2f Reviewed-on: https://go-review.googlesource.com/c/go/+/242078 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index d9ff359b35..c40e932d8b 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -136,6 +136,11 @@ func Main(arch *sys.Arch, theArch Arch) { objabi.Flagparse(usage) + if ctxt.Debugvlog > 0 { + // dump symbol info on crash + defer func() { ctxt.loader.Dump() }() + } + switch *flagHeadType { case "": case "windowsgui": -- GitLab From 27342e5bd9694df2878534ec122058ccbcd291aa Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 10 Jul 2020 18:49:01 -0400 Subject: [PATCH 0098/1792] [dev.link] cmd/internal/goobj2, cmd/link: add content addressable symbols This CL introduces content-addressable symbols (a.k.a. hashed symbols) to object files. Content-addressable symbols are identified and referenced by their content hashes, instead of by names. In the object file, a new pseudo-package index PkgIdxHashed is introduced, for content-addressable symbols, and a new block is added to store their hashes. The hashes are used by the linker to identify and deduplicate the symbols. For now, we only support content-addressable symbols that are always locally defined (i.e. no cross-package references). As a proof of concept, make string constant symbols content- addressable. Change-Id: Iaf53efd74c0ffb54fa95f784628cc84e95844536 Reviewed-on: https://go-review.googlesource.com/c/go/+/242079 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/compile/internal/gc/obj.go | 1 + src/cmd/internal/goobj/readnew.go | 8 +- src/cmd/internal/goobj2/objfile.go | 43 +++++++-- src/cmd/internal/obj/link.go | 40 ++++---- src/cmd/internal/obj/objfile2.go | 26 +++++- src/cmd/internal/obj/sym.go | 17 +++- src/cmd/link/internal/ld/main.go | 2 +- src/cmd/link/internal/loader/loader.go | 123 ++++++++++++++++++------- 8 files changed, 197 insertions(+), 63 deletions(-) diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 4f511f9c7b..26ea775368 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -356,6 +356,7 @@ func stringsym(pos src.XPos, s string) (data *obj.LSym) { // string data off := dsname(symdata, 0, s, pos, "string") ggloblsym(symdata, int32(off), obj.DUPOK|obj.RODATA|obj.LOCAL) + symdata.Set(obj.AttrContentAddressable, true) } return symdata diff --git a/src/cmd/internal/goobj/readnew.go b/src/cmd/internal/goobj/readnew.go index cd1a9049d0..744fdcebdc 100644 --- a/src/cmd/internal/goobj/readnew.go +++ b/src/cmd/internal/goobj/readnew.go @@ -55,8 +55,10 @@ func (r *objReader) readNew() { panic("bad sym ref") } return SymID{} - case goobj2.PkgIdxNone: + case goobj2.PkgIdxHashed: i = s.SymIdx + uint32(rr.NSym()) + case goobj2.PkgIdxNone: + i = s.SymIdx + uint32(rr.NSym()+rr.NHasheddef()) case goobj2.PkgIdxBuiltin: name, abi := goobj2.BuiltinName(int(s.SymIdx)) return SymID{name, int64(abi)} @@ -73,8 +75,8 @@ func (r *objReader) readNew() { // Symbols pcdataBase := start + rr.PcdataBase() - n := uint32(rr.NSym() + rr.NNonpkgdef() + rr.NNonpkgref()) - ndef := uint32(rr.NSym() + rr.NNonpkgdef()) + ndef := uint32(rr.NSym() + rr.NHasheddef() + rr.NNonpkgdef()) + n := ndef + uint32(rr.NNonpkgref()) for i := uint32(0); i < n; i++ { osym := rr.Sym(i) if osym.Name(rr) == "" { diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index 938362901a..7f62eebd20 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -9,6 +9,7 @@ package goobj2 // TODO: replace the goobj package? import ( "bytes" "cmd/internal/bio" + "crypto/sha1" "encoding/binary" "errors" "fmt" @@ -46,6 +47,9 @@ import ( // Flag uint8 // Size uint32 // } +// HashedDefs [...]struct { // hashed (content-addressable) symbol definitions +// ... // same as SymbolDefs +// } // NonPkgDefs [...]struct { // non-pkg symbol definitions // ... // same as SymbolDefs // } @@ -53,6 +57,8 @@ import ( // ... // same as SymbolDefs // } // +// Hash [...][N]byte +// // RelocIndex [...]uint32 // index to Relocs // AuxIndex [...]uint32 // index to Aux // DataIndex [...]uint32 // offset to Data @@ -104,6 +110,8 @@ import ( // SymIdx is the index of the symbol in the given package. // - If PkgIdx is PkgIdxSelf, SymIdx is the index of the symbol in the // SymbolDefs array. +// - 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). // - Otherwise, SymIdx is the index of the symbol in some other package's @@ -111,12 +119,15 @@ import ( // // {0, 0} represents a nil symbol. Otherwise PkgIdx should not be 0. // +// Hash contains the content hashes of content-addressable symbols, of +// which PkgIdx is PkgIdxHashed, in the same order of HashedDefs array. +// // RelocIndex, AuxIndex, and DataIndex contains indices/offsets to // Relocs/Aux/Data blocks, one element per symbol, first for all the -// defined symbols, then all the defined non-package symbols, in the -// same order of SymbolDefs/NonPkgDefs arrays. For N total defined -// symbols, the array is of length N+1. The last element is the total -// number of relocations (aux symbols, data blocks, etc.). +// defined symbols, then all the defined hashed and non-package symbols, +// in the same order of SymbolDefs/HashedDefs/NonPkgDefs arrays. For N +// total defined symbols, the array is of length N+1. The last element is +// the total number of relocations (aux symbols, data blocks, etc.). // // They can be accessed by index. For the i-th symbol, its relocations // are the RelocIndex[i]-th (inclusive) to RelocIndex[i+1]-th (exclusive) @@ -127,8 +138,8 @@ import ( // // Each symbol may (or may not) be associated with a number of auxiliary // symbols. They are described in the Aux block. See Aux struct below. -// Currently a symbol's Gotype and FuncInfo are auxiliary symbols. We -// may make use of aux symbols in more cases, e.g. DWARF symbols. +// Currently a symbol's Gotype, FuncInfo, and associated DWARF symbols +// are auxiliary symbols. const stringRefSize = 8 // two uint32s @@ -139,6 +150,7 @@ func (fp FingerprintType) IsZero() bool { return fp == FingerprintType{} } // Package Index. const ( PkgIdxNone = (1<<31 - 1) - iota // Non-package symbols + PkgIdxHashed // Hashed (content-addressable) symbols // TODO: multiple pseudo-packages depending on hash length/algorithm PkgIdxBuiltin // Predefined runtime symbols (ex: runtime.newobject) PkgIdxSelf // Symbols defined in the current package PkgIdxInvalid = 0 @@ -151,8 +163,10 @@ const ( BlkPkgIdx BlkDwarfFile BlkSymdef + BlkHasheddef BlkNonpkgdef BlkNonpkgref + BlkHash BlkRelocIdx BlkAuxIdx BlkDataIdx @@ -307,6 +321,11 @@ type SymRef struct { SymIdx uint32 } +// Hash +type HashType [HashSize]byte + +const HashSize = sha1.Size + // Relocation. // // Serialized format: @@ -622,6 +641,10 @@ func (r *Reader) NSym() int { return int(r.h.Offsets[BlkSymdef+1]-r.h.Offsets[BlkSymdef]) / SymSize } +func (r *Reader) NHasheddef() int { + return int(r.h.Offsets[BlkHasheddef+1]-r.h.Offsets[BlkHasheddef]) / SymSize +} + func (r *Reader) NNonpkgdef() int { return int(r.h.Offsets[BlkNonpkgdef+1]-r.h.Offsets[BlkNonpkgdef]) / SymSize } @@ -641,6 +664,14 @@ func (r *Reader) Sym(i uint32) *Sym { return (*Sym)(unsafe.Pointer(&r.b[off])) } +// Hash returns a pointer to the i-th hashed symbol's hash. +// Note: here i is the index of hashed symbols, not all symbols +// (unlike other accessors). +func (r *Reader) Hash(i uint32) *HashType { + off := r.h.Offsets[BlkHash] + uint32(i*HashSize) + return (*HashType)(unsafe.Pointer(&r.b[off])) +} + // NReloc returns the number of relocations of the i-th symbol. func (r *Reader) NReloc(i uint32) int { relocIdxOff := r.h.Offsets[BlkRelocIdx] + uint32(i*4) diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 20a9f552e7..fd0bc26f32 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -520,6 +520,9 @@ const ( // Used by the linker to determine what methods can be pruned. AttrUsedInIface + // ContentAddressable indicates this is a content-addressable symbol. + AttrContentAddressable + // 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. @@ -528,23 +531,24 @@ const ( attrABIBase ) -func (a Attribute) DuplicateOK() bool { return a&AttrDuplicateOK != 0 } -func (a Attribute) MakeTypelink() bool { return a&AttrMakeTypelink != 0 } -func (a Attribute) CFunc() bool { return a&AttrCFunc != 0 } -func (a Attribute) NoSplit() bool { return a&AttrNoSplit != 0 } -func (a Attribute) Leaf() bool { return a&AttrLeaf != 0 } -func (a Attribute) SeenGlobl() bool { return a&AttrSeenGlobl != 0 } -func (a Attribute) OnList() bool { return a&AttrOnList != 0 } -func (a Attribute) ReflectMethod() bool { return a&AttrReflectMethod != 0 } -func (a Attribute) Local() bool { return a&AttrLocal != 0 } -func (a Attribute) Wrapper() bool { return a&AttrWrapper != 0 } -func (a Attribute) NeedCtxt() bool { return a&AttrNeedCtxt != 0 } -func (a Attribute) NoFrame() bool { return a&AttrNoFrame != 0 } -func (a Attribute) Static() bool { return a&AttrStatic != 0 } -func (a Attribute) WasInlined() bool { return a&AttrWasInlined != 0 } -func (a Attribute) TopFrame() bool { return a&AttrTopFrame != 0 } -func (a Attribute) Indexed() bool { return a&AttrIndexed != 0 } -func (a Attribute) UsedInIface() bool { return a&AttrUsedInIface != 0 } +func (a Attribute) DuplicateOK() bool { return a&AttrDuplicateOK != 0 } +func (a Attribute) MakeTypelink() bool { return a&AttrMakeTypelink != 0 } +func (a Attribute) CFunc() bool { return a&AttrCFunc != 0 } +func (a Attribute) NoSplit() bool { return a&AttrNoSplit != 0 } +func (a Attribute) Leaf() bool { return a&AttrLeaf != 0 } +func (a Attribute) SeenGlobl() bool { return a&AttrSeenGlobl != 0 } +func (a Attribute) OnList() bool { return a&AttrOnList != 0 } +func (a Attribute) ReflectMethod() bool { return a&AttrReflectMethod != 0 } +func (a Attribute) Local() bool { return a&AttrLocal != 0 } +func (a Attribute) Wrapper() bool { return a&AttrWrapper != 0 } +func (a Attribute) NeedCtxt() bool { return a&AttrNeedCtxt != 0 } +func (a Attribute) NoFrame() bool { return a&AttrNoFrame != 0 } +func (a Attribute) Static() bool { return a&AttrStatic != 0 } +func (a Attribute) WasInlined() bool { return a&AttrWasInlined != 0 } +func (a Attribute) TopFrame() bool { return a&AttrTopFrame != 0 } +func (a Attribute) Indexed() bool { return a&AttrIndexed != 0 } +func (a Attribute) UsedInIface() bool { return a&AttrUsedInIface != 0 } +func (a Attribute) ContentAddressable() bool { return a&AttrContentAddressable != 0 } func (a *Attribute) Set(flag Attribute, value bool) { if value { @@ -580,6 +584,7 @@ var textAttrStrings = [...]struct { {bit: AttrWasInlined, s: ""}, {bit: AttrTopFrame, s: "TOPFRAME"}, {bit: AttrIndexed, s: ""}, + {bit: AttrContentAddressable, s: ""}, } // TextAttrString formats a for printing in as part of a TEXT prog. @@ -704,6 +709,7 @@ type Link struct { pkgIdx map[string]int32 defs []*LSym // list of defined symbols in the current package + hasheddefs []*LSym // list of defined hashed (content-addressable) symbols nonpkgdefs []*LSym // list of defined non-package symbols nonpkgrefs []*LSym // list of referenced non-package symbols diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index fbd2395d1f..694ab98a98 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -11,6 +11,7 @@ import ( "cmd/internal/bio" "cmd/internal/goobj2" "cmd/internal/objabi" + "crypto/sha1" "fmt" "path/filepath" "strings" @@ -78,6 +79,12 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { w.Sym(s) } + // Hashed symbol definitions + h.Offsets[goobj2.BlkHasheddef] = w.Offset() + for _, s := range ctxt.hasheddefs { + w.Sym(s) + } + // Non-pkg symbol definitions h.Offsets[goobj2.BlkNonpkgdef] = w.Offset() for _, s := range ctxt.nonpkgdefs { @@ -90,10 +97,17 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { w.Sym(s) } + // Hashes + h.Offsets[goobj2.BlkHash] = w.Offset() + for _, s := range ctxt.hasheddefs { + w.Hash(s) + } + // TODO: hashedrefs unused/unsupported for now + // Reloc indexes h.Offsets[goobj2.BlkRelocIdx] = w.Offset() nreloc := uint32(0) - lists := [][]*LSym{ctxt.defs, ctxt.nonpkgdefs} + lists := [][]*LSym{ctxt.defs, ctxt.hasheddefs, ctxt.nonpkgdefs} for _, list := range lists { for _, s := range list { w.Uint32(nreloc) @@ -289,6 +303,14 @@ func (w *writer) Sym(s *LSym) { o.Write(w.Writer) } +func (w *writer) Hash(s *LSym) { + if !s.ContentAddressable() { + panic("Hash of non-content-addresable symbol") + } + b := goobj2.HashType(sha1.Sum(s.P)) + w.Bytes(b[:]) +} + func makeSymRef(s *LSym) goobj2.SymRef { if s == nil { return goobj2.SymRef{} @@ -349,7 +371,7 @@ func (w *writer) refNames() { seen := make(map[goobj2.SymRef]bool) w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs switch rs.PkgIdx { - case goobj2.PkgIdxNone, goobj2.PkgIdxBuiltin, goobj2.PkgIdxSelf: // not an external indexed reference + case goobj2.PkgIdxNone, goobj2.PkgIdxHashed, goobj2.PkgIdxBuiltin, goobj2.PkgIdxSelf: // not an external indexed reference return case goobj2.PkgIdxInvalid: panic("unindexed symbol reference") diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 7f5d9ebeea..7c9ee854ea 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -176,11 +176,20 @@ func (ctxt *Link) NumberSyms() { ctxt.pkgIdx = make(map[string]int32) ctxt.defs = []*LSym{} + ctxt.hasheddefs = []*LSym{} ctxt.nonpkgdefs = []*LSym{} - var idx, nonpkgidx int32 = 0, 0 + var idx, hashedidx, nonpkgidx int32 ctxt.traverseSyms(traverseDefs, func(s *LSym) { - if isNonPkgSym(ctxt, s) { + if s.ContentAddressable() { + s.PkgIdx = goobj2.PkgIdxHashed + s.SymIdx = hashedidx + if hashedidx != int32(len(ctxt.hasheddefs)) { + panic("bad index") + } + ctxt.hasheddefs = append(ctxt.hasheddefs, s) + hashedidx++ + } else if isNonPkgSym(ctxt, s) { s.PkgIdx = goobj2.PkgIdxNone s.SymIdx = nonpkgidx if nonpkgidx != int32(len(ctxt.nonpkgdefs)) { @@ -218,6 +227,10 @@ func (ctxt *Link) NumberSyms() { } } pkg := rs.Pkg + if rs.ContentAddressable() { + // for now, only support content-addressable symbols that are always locally defined. + panic("hashed refs unsupported for now") + } if pkg == "" || pkg == "\"\"" || pkg == "_" || !rs.Indexed() { rs.PkgIdx = goobj2.PkgIdxNone rs.SymIdx = nonpkgidx diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index c40e932d8b..c2532ac290 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -334,7 +334,7 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("hostlink") ctxt.hostlink() if ctxt.Debugvlog != 0 { - ctxt.Logf("%d symbols, %d reachable\n", ctxt.loader.NSym(), ctxt.loader.NReachableSym()) + ctxt.Logf("%s", ctxt.loader.Stat()) ctxt.Logf("%d liveness data\n", liveness) } bench.Start("Flush") diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 28847ad17a..0e7fbe1859 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -106,18 +106,22 @@ func (a Aux2) Sym() Sym { return a.l.resolve(a.r, a.Aux.Sym()) } // oReader is a wrapper type of obj.Reader, along with some // extra information. -// TODO: rename to objReader once the old one is gone? type oReader struct { *goobj2.Reader - unit *sym.CompilationUnit - version int // version of static symbol - flags uint32 // read from object file - pkgprefix string - syms []Sym // Sym's global index, indexed by local index - ndef int // cache goobj2.Reader.NSym() - objidx uint32 // index of this reader in the objs slice + unit *sym.CompilationUnit + version int // version of static symbol + flags uint32 // read from object file + pkgprefix string + syms []Sym // Sym's global index, indexed by local index + ndef int // cache goobj2.Reader.NSym() + nhasheddef int // cache goobj2.Reader.NHashedDef() + objidx uint32 // index of this reader in the objs slice } +// Total number of defined symbols (package symbols, hashed symbols, and +// non-package symbols). +func (r *oReader) NAlldef() int { return r.ndef + r.nhasheddef + r.NNonpkgdef() } + type objIdx struct { r *oReader i Sym // start index @@ -213,8 +217,9 @@ type Loader struct { objSyms []objSym // global index mapping to local index - symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal - extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name + hashedSyms map[goobj2.HashType]Sym // hashed (content-addressable) symbols, keyed by content hash + symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal + extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name extReader *oReader // a dummy oReader, for external symbols payloadBatch []extSymPayload @@ -292,10 +297,13 @@ type Loader struct { elfsetstring elfsetstringFunc errorReporter *ErrorReporter + + npkgsyms int // number of package symbols, for accounting } const ( pkgDef = iota + hashedDef nonPkgDef nonPkgRef ) @@ -336,7 +344,8 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor objs: []objIdx{{}, {extReader, 0}}, // reserve index 0 for nil symbol, 1 for external symbols objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol extReader: extReader, - symsByName: [2]map[string]Sym{make(map[string]Sym, 100000), make(map[string]Sym, 50000)}, // preallocate ~2MB for ABI0 and ~1MB for ABI1 symbols + hashedSyms: make(map[goobj2.HashType]Sym, 20000), // TODO: adjust preallocation sizes + 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]*oReader), outer: make(map[Sym]Sym), sub: make(map[Sym]Sym), @@ -395,7 +404,7 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li uint32, kind int, d addToGlobal := func() { l.objSyms = append(l.objSyms, objSym{r.objidx, li}) } - if name == "" { + if name == "" && kind != hashedDef { addToGlobal() return i, true // unnamed aux symbol } @@ -406,7 +415,8 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li uint32, kind int, d addToGlobal() return i, true } - if kind == pkgDef { + switch kind { + case pkgDef: // Defined package symbols cannot be dup to each other. // We load all the package symbols first, so we don't need // to check dup here. @@ -415,6 +425,22 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li uint32, kind int, d l.symsByName[ver][name] = i addToGlobal() return i, true + case hashedDef: + // Hashed (content-addressable) symbol. Check the hash + // but don't add to name lookup table, as they are not + // referenced by name. Also no need to do overwriting + // check, as same hash indicates same content. + hash := r.Hash(li - uint32(r.ndef)) + if oldi, existed := l.hashedSyms[*hash]; existed { + // TODO: check symbol size for extra safety against collision? + if l.flags&FlagStrictDups != 0 { + l.checkdup(name, r, li, oldi) + } + return oldi, false + } + l.hashedSyms[*hash] = i + addToGlobal() + return i, true } // Non-package (named) symbol. Check if it already exists. @@ -577,9 +603,12 @@ func (l *Loader) resolve(r *oReader, s goobj2.SymRef) Sym { panic("bad sym ref") } return 0 - case goobj2.PkgIdxNone: + case goobj2.PkgIdxHashed: i := int(s.SymIdx) + r.ndef return r.syms[i] + case goobj2.PkgIdxNone: + i := int(s.SymIdx) + r.ndef + r.nhasheddef + return r.syms[i] case goobj2.PkgIdxBuiltin: return l.builtinSyms[s.SymIdx] case goobj2.PkgIdxSelf: @@ -2020,8 +2049,18 @@ func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, u } pkgprefix := objabi.PathToPrefix(lib.Pkg) + "." ndef := r.NSym() - nnonpkgdef := r.NNonpkgdef() - or := &oReader{r, unit, localSymVersion, r.Flags(), pkgprefix, make([]Sym, ndef+nnonpkgdef+r.NNonpkgref()), ndef, uint32(len(l.objs))} + nhasheddef := r.NHasheddef() + or := &oReader{ + Reader: r, + unit: unit, + version: localSymVersion, + flags: r.Flags(), + pkgprefix: pkgprefix, + syms: make([]Sym, ndef+nhasheddef+r.NNonpkgdef()+r.NNonpkgref()), + ndef: ndef, + nhasheddef: nhasheddef, + objidx: uint32(len(l.objs)), + } // Autolib lib.Autolib = append(lib.Autolib, r.Autolib()...) @@ -2044,16 +2083,17 @@ func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, u // Preload symbols of given kind from an object. func (l *Loader) preloadSyms(r *oReader, kind int) { - ndef := uint32(r.NSym()) - nnonpkgdef := uint32(r.NNonpkgdef()) var start, end uint32 switch kind { case pkgDef: start = 0 - end = ndef + end = uint32(r.ndef) + case hashedDef: + start = uint32(r.ndef) + end = uint32(r.ndef + r.nhasheddef) case nonPkgDef: - start = ndef - end = ndef + nnonpkgdef + start = uint32(r.ndef + r.nhasheddef) + end = uint32(r.ndef + r.nhasheddef + r.NNonpkgdef()) default: panic("preloadSyms: bad kind") } @@ -2062,13 +2102,22 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { loadingRuntimePkg := r.unit.Lib.Pkg == "runtime" for i := start; i < end; i++ { osym := r.Sym(i) - name := osym.Name(r.Reader) - if needNameExpansion { - name = strings.Replace(name, "\"\".", r.pkgprefix, -1) + var name string + var v int + var dupok bool + var typ sym.SymKind + if kind != hashedDef { // we don't need the name, etc. for hashed symbols + name = osym.Name(r.Reader) + if needNameExpansion { + name = strings.Replace(name, "\"\".", r.pkgprefix, -1) + } + v = abiToVer(osym.ABI(), r.version) + if kind == nonPkgDef { + dupok = osym.Dupok() + typ = sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type())] + } } - v := abiToVer(osym.ABI(), r.version) - dupok := osym.Dupok() - gi, added := l.AddSym(name, v, r, i, kind, dupok, sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type())]) + gi, added := l.AddSym(name, v, r, i, kind, dupok, typ) r.syms[i] = gi if !added { continue @@ -2098,10 +2147,12 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { } } -// Add non-package symbols and references to external symbols (which are always -// named). +// Add hashed (content-addressable) symbols, non-package symbols, and +// references to external symbols (which are always named). func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { + l.npkgsyms = l.NSym() for _, o := range l.objs[goObjStart:] { + l.preloadSyms(o.r, hashedDef) l.preloadSyms(o.r, nonPkgDef) } for _, o := range l.objs[goObjStart:] { @@ -2111,7 +2162,7 @@ func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { } func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { - ndef := uint32(r.NSym() + r.NNonpkgdef()) + ndef := uint32(r.NAlldef()) needNameExpansion := r.NeedNameExpansion() for i, n := uint32(0), uint32(r.NNonpkgref()); i < n; i++ { osym := r.Sym(ndef + i) @@ -2247,7 +2298,7 @@ func (l *Loader) cloneToExternal(symIdx Sym) { // If this is a def, then copy the guts. We expect this case // to be very rare (one case it may come up is with -X). - if li < uint32(r.NSym()+r.NNonpkgdef()) { + if li < uint32(r.NAlldef()) { // Copy relocations relocs := l.Relocs(symIdx) @@ -2436,7 +2487,7 @@ func (l *Loader) AssignTextSymbolOrder(libs []*sym.Library, intlibs []bool, exts for _, o := range l.objs[goObjStart:] { r := o.r lib := r.unit.Lib - for i, n := uint32(0), uint32(r.NSym()+r.NNonpkgdef()); i < n; i++ { + for i, n := uint32(0), uint32(r.NAlldef()); i < n; i++ { gi := l.toGlobal(r, i) if !l.attrReachable.Has(gi) { continue @@ -2536,6 +2587,14 @@ func (l *Loader) Errorf(s Sym, format string, args ...interface{}) { l.errorReporter.Errorf(s, format, args...) } +// Symbol statistics. +func (l *Loader) Stat() string { + s := fmt.Sprintf("%d symbols, %d reachable\n", l.NSym(), l.NReachableSym()) + s += fmt.Sprintf("\t%d package symbols, %d hashed symbols, %d non-package symbols, %d external symbols\n", + l.npkgsyms, len(l.hashedSyms), int(l.extStart)-l.npkgsyms-len(l.hashedSyms), l.NSym()-int(l.extStart)) + return s +} + // For debugging. func (l *Loader) Dump() { fmt.Println("objs") -- GitLab From 17344d55d61b10f2145a95958ca2796846159dd0 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sun, 12 Jul 2020 17:15:35 -0400 Subject: [PATCH 0099/1792] [dev.link] cmd/compile: make GC map symbols content-addressable Change-Id: I20e5b580b3e0505473816fe7f277a74e13d33e64 Reviewed-on: https://go-review.googlesource.com/c/go/+/242080 Reviewed-by: Jeremy Faller --- src/cmd/compile/internal/gc/plive.go | 1 + src/cmd/compile/internal/gc/reflect.go | 1 + 2 files changed, 2 insertions(+) diff --git a/src/cmd/compile/internal/gc/plive.go b/src/cmd/compile/internal/gc/plive.go index 7e1c0c1a95..b366c8a4a0 100644 --- a/src/cmd/compile/internal/gc/plive.go +++ b/src/cmd/compile/internal/gc/plive.go @@ -1563,6 +1563,7 @@ func (lv *Liveness) emit() (argsSym, liveSym, regsSym *obj.LSym) { makeSym := func(tmpSym *obj.LSym) *obj.LSym { return Ctxt.LookupInit(fmt.Sprintf("gclocals·%x", md5.Sum(tmpSym.P)), func(lsym *obj.LSym) { lsym.P = tmpSym.P + lsym.Set(obj.AttrContentAddressable, true) }) } if !go115ReduceLiveness { diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index f614b60685..05e64a5a9a 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -1715,6 +1715,7 @@ func dgcptrmask(t *types.Type) *obj.LSym { duint8(lsym, i, x) } ggloblsym(lsym, int32(len(ptrmask)), obj.DUPOK|obj.RODATA|obj.LOCAL) + lsym.Set(obj.AttrContentAddressable, true) } return lsym } -- GitLab From 3c54069907de8470b7ffa1cba8eae48e446feced Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sun, 12 Jul 2020 17:57:11 -0400 Subject: [PATCH 0100/1792] [dev.link] cmd/internal/obj: make integer/float constant symbols content-addressable Fill in the data at compile time, and get rid of the preprocess function in the linker. We need to be careful with symbol alignment: data symbols are generally naturally aligned, except for string symbols which are not aligned. When deduplicating two symbols with same content but different alignments, we need to keep the biggest alignment. Change-Id: I4bd96adfdc5f704b5bf3a0e723457c9bfe16a684 Reviewed-on: https://go-review.googlesource.com/c/go/+/242081 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/internal/obj/link.go | 6 ++ src/cmd/internal/obj/objfile2.go | 19 ++++++ src/cmd/internal/obj/sym.go | 20 ++++++ src/cmd/link/internal/loader/loader.go | 75 ++++++++------------- src/cmd/link/internal/loader/loader_test.go | 3 +- 5 files changed, 74 insertions(+), 49 deletions(-) diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index fd0bc26f32..7575a29efa 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -704,6 +704,12 @@ type Link struct { // actually diverge. ABIAliases []*LSym + // Constant symbols (e.g. $i64.*) are data symbols created late + // in the concurrent phase. To ensure a deterministic order, we + // add them to a separate list, sort at the end, and append it + // to Data. + constSyms []*LSym + // pkgIdx maps package path to index. The index is used for // symbol reference in the object file. pkgIdx map[string]int32 diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 694ab98a98..5e7f36cbea 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -292,6 +292,25 @@ func (w *writer) Sym(s *LSym) { if s.Func != nil { align = uint32(s.Func.Align) } + if s.ContentAddressable() { + // We generally assume data symbols are natually aligned, + // except for strings. If we dedup a string symbol and a + // non-string symbol with the same content, we should keep + // the largest alignment. + // TODO: maybe the compiler could set the alignment for all + // data symbols more carefully. + if s.Size != 0 && !strings.HasPrefix(s.Name, "go.string.") { + switch { + case w.ctxt.Arch.PtrSize == 8 && s.Size%8 == 0: + align = 8 + case s.Size%4 == 0: + align = 4 + case s.Size%2 == 0: + align = 2 + } + // don't bother setting align to 1. + } + } var o goobj2.Sym o.SetName(name, w.Writer) o.SetABI(abi) diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 7c9ee854ea..4122d8478f 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -139,7 +139,11 @@ func (ctxt *Link) Float32Sym(f float32) *LSym { name := fmt.Sprintf("$f32.%08x", i) return ctxt.LookupInit(name, func(s *LSym) { s.Size = 4 + s.WriteFloat32(ctxt, 0, f) + s.Type = objabi.SRODATA s.Set(AttrLocal, true) + s.Set(AttrContentAddressable, true) + ctxt.constSyms = append(ctxt.constSyms, s) }) } @@ -148,7 +152,11 @@ func (ctxt *Link) Float64Sym(f float64) *LSym { name := fmt.Sprintf("$f64.%016x", i) return ctxt.LookupInit(name, func(s *LSym) { s.Size = 8 + s.WriteFloat64(ctxt, 0, f) + s.Type = objabi.SRODATA s.Set(AttrLocal, true) + s.Set(AttrContentAddressable, true) + ctxt.constSyms = append(ctxt.constSyms, s) }) } @@ -156,7 +164,11 @@ func (ctxt *Link) Int64Sym(i int64) *LSym { name := fmt.Sprintf("$i64.%016x", uint64(i)) return ctxt.LookupInit(name, func(s *LSym) { s.Size = 8 + s.WriteInt(ctxt, 0, 8, i) + s.Type = objabi.SRODATA s.Set(AttrLocal, true) + s.Set(AttrContentAddressable, true) + ctxt.constSyms = append(ctxt.constSyms, s) }) } @@ -174,6 +186,14 @@ func (ctxt *Link) NumberSyms() { }) } + // Constant symbols are created late in the concurrent phase. Sort them + // to ensure a deterministic order. + sort.Slice(ctxt.constSyms, func(i, j int) bool { + return ctxt.constSyms[i].Name < ctxt.constSyms[j].Name + }) + ctxt.Data = append(ctxt.Data, ctxt.constSyms...) + ctxt.constSyms = nil + ctxt.pkgIdx = make(map[string]int32) ctxt.defs = []*LSym{} ctxt.hasheddefs = []*LSym{} diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 0e7fbe1859..257ebd8be4 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -18,7 +18,6 @@ import ( "math/bits" "os" "sort" - "strconv" "strings" ) @@ -190,6 +189,12 @@ func growBitmap(reqLen int, b Bitmap) Bitmap { return b } +type symSizeAlign struct { + sym Sym + size uint32 + align uint32 +} + // A Loader loads new object files and resolves indexed symbol references. // // Notes on the layout of global symbol index space: @@ -217,9 +222,9 @@ type Loader struct { objSyms []objSym // global index mapping to local index - hashedSyms map[goobj2.HashType]Sym // hashed (content-addressable) symbols, keyed by content hash - symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal - extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name + hashedSyms map[goobj2.HashType]symSizeAlign // hashed (content-addressable) symbols, keyed by content hash + symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal + extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name extReader *oReader // a dummy oReader, for external symbols payloadBatch []extSymPayload @@ -344,7 +349,7 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor objs: []objIdx{{}, {extReader, 0}}, // reserve index 0 for nil symbol, 1 for external symbols objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol extReader: extReader, - hashedSyms: make(map[goobj2.HashType]Sym, 20000), // TODO: adjust preallocation sizes + hashedSyms: make(map[goobj2.HashType]symSizeAlign, 20000), // TODO: adjust preallocation sizes 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]*oReader), outer: make(map[Sym]Sym), @@ -396,9 +401,9 @@ func (l *Loader) addObj(pkg string, r *oReader) Sym { // Add a symbol from an object file, return the global index and whether it is added. // If the symbol already exist, it returns the index of that symbol. -func (l *Loader) AddSym(name string, ver int, r *oReader, li uint32, kind int, dupok bool, typ sym.SymKind) (Sym, bool) { +func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, osym *goobj2.Sym) (Sym, bool) { if l.extStart != 0 { - panic("AddSym called after external symbol is created") + panic("addSym called after external symbol is created") } i := Sym(len(l.objSyms)) addToGlobal := func() { @@ -431,14 +436,21 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li uint32, kind int, d // referenced by name. Also no need to do overwriting // check, as same hash indicates same content. hash := r.Hash(li - uint32(r.ndef)) - if oldi, existed := l.hashedSyms[*hash]; existed { - // TODO: check symbol size for extra safety against collision? + if s, existed := l.hashedSyms[*hash]; existed { + if s.size != osym.Siz() { + fmt.Printf("hash collision: %v (size %d) and %v (size %d), hash %x\n", l.SymName(s.sym), s.size, osym.Name(r.Reader), osym.Siz(), *hash) + panic("hash collision") + } if l.flags&FlagStrictDups != 0 { - l.checkdup(name, r, li, oldi) + l.checkdup(name, r, li, s.sym) } - return oldi, false + if a := osym.Align(); a > s.align { // we need to use the biggest alignment + l.SetSymAlign(s.sym, int32(a)) + l.hashedSyms[*hash] = symSizeAlign{s.sym, s.size, a} + } + return s.sym, false } - l.hashedSyms[*hash] = i + l.hashedSyms[*hash] = symSizeAlign{i, osym.Siz(), osym.Align()} addToGlobal() return i, true } @@ -451,7 +463,7 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li uint32, kind int, d return i, true } // symbol already exists - if dupok { + if osym.Dupok() { if l.flags&FlagStrictDups != 0 { l.checkdup(name, r, li, oldi) } @@ -472,6 +484,7 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li uint32, kind int, d l.objSyms[oldi] = objSym{r.objidx, li} } else { // old symbol overwrites new symbol. + typ := sym.AbiSymKindToSymKind[objabi.SymKind(oldsym.Type())] if !typ.IsData() { // only allow overwriting data symbol log.Fatalf("duplicated definition of symbol " + name) } @@ -2104,20 +2117,14 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { osym := r.Sym(i) var name string var v int - var dupok bool - var typ sym.SymKind if kind != hashedDef { // we don't need the name, etc. for hashed symbols name = osym.Name(r.Reader) if needNameExpansion { name = strings.Replace(name, "\"\".", r.pkgprefix, -1) } v = abiToVer(osym.ABI(), r.version) - if kind == nonPkgDef { - dupok = osym.Dupok() - typ = sym.AbiSymKindToSymKind[objabi.SymKind(osym.Type())] - } } - gi, added := l.AddSym(name, v, r, i, kind, dupok, typ) + gi, added := l.addSym(name, v, r, i, kind, osym) r.syms[i] = gi if !added { continue @@ -2179,7 +2186,6 @@ func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { if osym.UsedInIface() { l.SetAttrUsedInIface(gi, true) } - l.preprocess(arch, gi, name) } } @@ -2197,33 +2203,6 @@ func abiToVer(abi uint16, localSymVersion int) int { return v } -// preprocess looks for integer/floating point constant symbols whose -// content is encoded into the symbol name, and promotes them into -// real symbols with RODATA type and a payload that matches the -// encoded content. -func (l *Loader) preprocess(arch *sys.Arch, s Sym, name string) { - if name != "" && name[0] == '$' && len(name) > 5 && l.SymType(s) == 0 && len(l.Data(s)) == 0 { - x, err := strconv.ParseUint(name[5:], 16, 64) - if err != nil { - log.Panicf("failed to parse $-symbol %s: %v", name, err) - } - su := l.MakeSymbolUpdater(s) - su.SetType(sym.SRODATA) - su.SetLocal(true) - switch name[:5] { - case "$f32.": - if uint64(uint32(x)) != x { - log.Panicf("$-symbol %s too large: %d", name, x) - } - su.AddUint32(arch, uint32(x)) - case "$f64.", "$i64.": - su.AddUint64(arch, x) - default: - log.Panicf("unrecognized $-symbol: %s", name) - } - } -} - // ResolveABIAlias given a symbol returns the ABI alias target of that // symbol. If the sym in question is not an alias, the sym itself is // returned. diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 0367bc4536..82c46f6417 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -6,6 +6,7 @@ package loader import ( "bytes" + "cmd/internal/goobj2" "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/sym" @@ -20,7 +21,7 @@ import ( // data or relocations). func addDummyObjSym(t *testing.T, ldr *Loader, or *oReader, name string) Sym { idx := uint32(len(ldr.objSyms)) - s, ok := ldr.AddSym(name, 0, or, idx, nonPkgDef, false, sym.SRODATA) + s, ok := ldr.addSym(name, 0, or, idx, nonPkgDef, &goobj2.Sym{}) if !ok { t.Errorf("AddrSym failed for '" + name + "'") } -- GitLab From 4f217d5aaa88536f641910e2b97b24489132ee16 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 13 Jul 2020 15:05:09 -0400 Subject: [PATCH 0101/1792] [dev.link] cmd/internal/goobj2, cmd/link: use short hash function for short symbols For symbols of size 8 bytes or below, we can map them to 64-bit hash values using the identity function. There is no need to use longer and more expensive hash functions. For them, we introduce another pseudo-package, PkgIdxHashed64. It is like PkgIdxHashed except that the hash function is different. Note that the hash value is not affected with trailing zeros, e.g. "A" and "A\0\0\0" have the same hash value. This allows deduplicating a few more symbols. When deduplicating them, we need to keep the longer one. Change-Id: Iad0c2e9e569b6a59ca6a121fb8c8f0c018c6da03 Reviewed-on: https://go-review.googlesource.com/c/go/+/242362 Reviewed-by: Jeremy Faller --- src/cmd/internal/goobj/readnew.go | 8 +- src/cmd/internal/goobj2/objfile.go | 46 ++++++++--- src/cmd/internal/obj/link.go | 9 ++- src/cmd/internal/obj/objfile2.go | 23 +++++- src/cmd/internal/obj/sym.go | 25 ++++-- src/cmd/link/internal/loader/loader.go | 102 ++++++++++++++++++------- 6 files changed, 160 insertions(+), 53 deletions(-) diff --git a/src/cmd/internal/goobj/readnew.go b/src/cmd/internal/goobj/readnew.go index 744fdcebdc..ebac2b5ed1 100644 --- a/src/cmd/internal/goobj/readnew.go +++ b/src/cmd/internal/goobj/readnew.go @@ -55,10 +55,12 @@ func (r *objReader) readNew() { panic("bad sym ref") } return SymID{} - case goobj2.PkgIdxHashed: + case goobj2.PkgIdxHashed64: i = s.SymIdx + uint32(rr.NSym()) + case goobj2.PkgIdxHashed: + i = s.SymIdx + uint32(rr.NSym()+rr.NHashed64def()) case goobj2.PkgIdxNone: - i = s.SymIdx + uint32(rr.NSym()+rr.NHasheddef()) + i = s.SymIdx + uint32(rr.NSym()+rr.NHashed64def()+rr.NHasheddef()) case goobj2.PkgIdxBuiltin: name, abi := goobj2.BuiltinName(int(s.SymIdx)) return SymID{name, int64(abi)} @@ -75,7 +77,7 @@ func (r *objReader) readNew() { // Symbols pcdataBase := start + rr.PcdataBase() - ndef := uint32(rr.NSym() + rr.NHasheddef() + rr.NNonpkgdef()) + ndef := uint32(rr.NSym() + rr.NHashed64def() + rr.NHasheddef() + rr.NNonpkgdef()) n := ndef + uint32(rr.NNonpkgref()) for i := uint32(0); i < n; i++ { osym := rr.Sym(i) diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index 7f62eebd20..1075c9f382 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -47,6 +47,9 @@ import ( // Flag uint8 // Size uint32 // } +// Hashed64Defs [...]struct { // short hashed (content-addressable) symbol definitions +// ... // same as SymbolDefs +// } // HashedDefs [...]struct { // hashed (content-addressable) symbol definitions // ... // same as SymbolDefs // } @@ -57,7 +60,8 @@ import ( // ... // same as SymbolDefs // } // -// Hash [...][N]byte +// Hash64 [...][8]byte +// Hash [...][N]byte // // RelocIndex [...]uint32 // index to Relocs // AuxIndex [...]uint32 // index to Aux @@ -110,6 +114,8 @@ import ( // SymIdx is the index of the symbol in the given package. // - If PkgIdx is PkgIdxSelf, SymIdx is the index of the symbol in the // SymbolDefs array. +// - If PkgIdx is PkgIdxHashed64, SymIdx is the index of the symbol in the +// Hashed64Defs array. // - 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 @@ -121,13 +127,15 @@ import ( // // Hash contains the content hashes of content-addressable symbols, of // which PkgIdx is PkgIdxHashed, in the same order of HashedDefs array. +// Hash64 is similar, for PkgIdxHashed64 symbols. // // RelocIndex, AuxIndex, and DataIndex contains indices/offsets to // Relocs/Aux/Data blocks, one element per symbol, first for all the // defined symbols, then all the defined hashed and non-package symbols, -// in the same order of SymbolDefs/HashedDefs/NonPkgDefs arrays. For N -// total defined symbols, the array is of length N+1. The last element is -// the total number of relocations (aux symbols, data blocks, etc.). +// in the same order of SymbolDefs/Hashed64Defs/HashedDefs/NonPkgDefs +// arrays. For N total defined symbols, the array is of length N+1. The +// last element is the total number of relocations (aux symbols, data +// blocks, etc.). // // They can be accessed by index. For the i-th symbol, its relocations // are the RelocIndex[i]-th (inclusive) to RelocIndex[i+1]-th (exclusive) @@ -149,11 +157,12 @@ func (fp FingerprintType) IsZero() bool { return fp == FingerprintType{} } // Package Index. const ( - PkgIdxNone = (1<<31 - 1) - iota // Non-package symbols - PkgIdxHashed // Hashed (content-addressable) symbols // TODO: multiple pseudo-packages depending on hash length/algorithm - PkgIdxBuiltin // Predefined runtime symbols (ex: runtime.newobject) - PkgIdxSelf // Symbols defined in the current package - PkgIdxInvalid = 0 + PkgIdxNone = (1<<31 - 1) - iota // Non-package symbols + PkgIdxHashed64 // Short hashed (content-addressable) symbols + PkgIdxHashed // Hashed (content-addressable) symbols + PkgIdxBuiltin // Predefined runtime symbols (ex: runtime.newobject) + PkgIdxSelf // Symbols defined in the current package + PkgIdxInvalid = 0 // The index of other referenced packages starts from 1. ) @@ -163,9 +172,11 @@ const ( BlkPkgIdx BlkDwarfFile BlkSymdef + BlkHashed64def BlkHasheddef BlkNonpkgdef BlkNonpkgref + BlkHash64 BlkHash BlkRelocIdx BlkAuxIdx @@ -321,6 +332,11 @@ type SymRef struct { SymIdx uint32 } +// Hash64 +type Hash64Type [Hash64Size]byte + +const Hash64Size = 8 + // Hash type HashType [HashSize]byte @@ -641,6 +657,10 @@ func (r *Reader) NSym() int { return int(r.h.Offsets[BlkSymdef+1]-r.h.Offsets[BlkSymdef]) / SymSize } +func (r *Reader) NHashed64def() int { + return int(r.h.Offsets[BlkHashed64def+1]-r.h.Offsets[BlkHashed64def]) / SymSize +} + func (r *Reader) NHasheddef() int { return int(r.h.Offsets[BlkHasheddef+1]-r.h.Offsets[BlkHasheddef]) / SymSize } @@ -664,6 +684,14 @@ func (r *Reader) Sym(i uint32) *Sym { return (*Sym)(unsafe.Pointer(&r.b[off])) } +// Hash64 returns the i-th short hashed symbol's hash. +// Note: here i is the index of short hashed symbols, not all symbols +// (unlike other accessors). +func (r *Reader) Hash64(i uint32) uint64 { + off := r.h.Offsets[BlkHash64] + uint32(i*Hash64Size) + return r.uint64At(off) +} + // Hash returns a pointer to the i-th hashed symbol's hash. // Note: here i is the index of hashed symbols, not all symbols // (unlike other accessors). diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 7575a29efa..ffc3e99a20 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -714,10 +714,11 @@ type Link struct { // symbol reference in the object file. pkgIdx map[string]int32 - defs []*LSym // list of defined symbols in the current package - hasheddefs []*LSym // list of defined hashed (content-addressable) symbols - nonpkgdefs []*LSym // list of defined non-package symbols - nonpkgrefs []*LSym // list of referenced non-package symbols + defs []*LSym // list of defined symbols in the current package + hashed64defs []*LSym // list of defined short (64-bit or less) hashed (content-addressable) symbols + hasheddefs []*LSym // list of defined hashed (content-addressable) symbols + nonpkgdefs []*LSym // list of defined non-package symbols + nonpkgrefs []*LSym // list of referenced non-package symbols Fingerprint goobj2.FingerprintType // fingerprint of symbol indices, to catch index mismatch } diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 5e7f36cbea..858899f3a9 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -79,6 +79,12 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { w.Sym(s) } + // Short hashed symbol definitions + h.Offsets[goobj2.BlkHashed64def] = w.Offset() + for _, s := range ctxt.hashed64defs { + w.Sym(s) + } + // Hashed symbol definitions h.Offsets[goobj2.BlkHasheddef] = w.Offset() for _, s := range ctxt.hasheddefs { @@ -98,6 +104,10 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { } // Hashes + h.Offsets[goobj2.BlkHash64] = w.Offset() + for _, s := range ctxt.hashed64defs { + w.Hash64(s) + } h.Offsets[goobj2.BlkHash] = w.Offset() for _, s := range ctxt.hasheddefs { w.Hash(s) @@ -107,7 +117,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { // Reloc indexes h.Offsets[goobj2.BlkRelocIdx] = w.Offset() nreloc := uint32(0) - lists := [][]*LSym{ctxt.defs, ctxt.hasheddefs, ctxt.nonpkgdefs} + lists := [][]*LSym{ctxt.defs, ctxt.hashed64defs, ctxt.hasheddefs, ctxt.nonpkgdefs} for _, list := range lists { for _, s := range list { w.Uint32(nreloc) @@ -322,6 +332,15 @@ func (w *writer) Sym(s *LSym) { o.Write(w.Writer) } +func (w *writer) Hash64(s *LSym) { + if !s.ContentAddressable() { + panic("Hash of non-content-addresable symbol") + } + var b goobj2.Hash64Type + copy(b[:], s.P) + w.Bytes(b[:]) +} + func (w *writer) Hash(s *LSym) { if !s.ContentAddressable() { panic("Hash of non-content-addresable symbol") @@ -390,7 +409,7 @@ func (w *writer) refNames() { seen := make(map[goobj2.SymRef]bool) w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs switch rs.PkgIdx { - case goobj2.PkgIdxNone, goobj2.PkgIdxHashed, goobj2.PkgIdxBuiltin, goobj2.PkgIdxSelf: // not an external indexed reference + case goobj2.PkgIdxNone, goobj2.PkgIdxHashed64, goobj2.PkgIdxHashed, goobj2.PkgIdxBuiltin, goobj2.PkgIdxSelf: // not an external indexed reference return case goobj2.PkgIdxInvalid: panic("unindexed symbol reference") diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 4122d8478f..4f84fc7d98 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -196,19 +196,30 @@ func (ctxt *Link) NumberSyms() { ctxt.pkgIdx = make(map[string]int32) ctxt.defs = []*LSym{} + ctxt.hashed64defs = []*LSym{} ctxt.hasheddefs = []*LSym{} ctxt.nonpkgdefs = []*LSym{} - var idx, hashedidx, nonpkgidx int32 + var idx, hashedidx, hashed64idx, nonpkgidx int32 ctxt.traverseSyms(traverseDefs, func(s *LSym) { if s.ContentAddressable() { - s.PkgIdx = goobj2.PkgIdxHashed - s.SymIdx = hashedidx - if hashedidx != int32(len(ctxt.hasheddefs)) { - panic("bad index") + if len(s.P) <= 8 { + s.PkgIdx = goobj2.PkgIdxHashed64 + s.SymIdx = hashed64idx + if hashed64idx != int32(len(ctxt.hashed64defs)) { + panic("bad index") + } + ctxt.hashed64defs = append(ctxt.hashed64defs, s) + hashed64idx++ + } else { + s.PkgIdx = goobj2.PkgIdxHashed + s.SymIdx = hashedidx + if hashedidx != int32(len(ctxt.hasheddefs)) { + panic("bad index") + } + ctxt.hasheddefs = append(ctxt.hasheddefs, s) + hashedidx++ } - ctxt.hasheddefs = append(ctxt.hasheddefs, s) - hashedidx++ } else if isNonPkgSym(ctxt, s) { s.PkgIdx = goobj2.PkgIdxNone s.SymIdx = nonpkgidx diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 257ebd8be4..c8b29d7d9b 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -107,19 +107,20 @@ func (a Aux2) Sym() Sym { return a.l.resolve(a.r, a.Aux.Sym()) } // extra information. type oReader struct { *goobj2.Reader - unit *sym.CompilationUnit - version int // version of static symbol - flags uint32 // read from object file - pkgprefix string - syms []Sym // Sym's global index, indexed by local index - ndef int // cache goobj2.Reader.NSym() - nhasheddef int // cache goobj2.Reader.NHashedDef() - objidx uint32 // index of this reader in the objs slice + unit *sym.CompilationUnit + version int // version of static symbol + flags uint32 // read from object file + pkgprefix string + syms []Sym // Sym's global index, indexed by local index + ndef int // cache goobj2.Reader.NSym() + nhashed64def int // cache goobj2.Reader.NHashed64Def() + nhasheddef int // cache goobj2.Reader.NHashedDef() + objidx uint32 // index of this reader in the objs slice } // Total number of defined symbols (package symbols, hashed symbols, and // non-package symbols). -func (r *oReader) NAlldef() int { return r.ndef + r.nhasheddef + r.NNonpkgdef() } +func (r *oReader) NAlldef() int { return r.ndef + r.nhashed64def + r.nhasheddef + r.NNonpkgdef() } type objIdx struct { r *oReader @@ -222,6 +223,7 @@ type Loader struct { objSyms []objSym // global index mapping to local index + hashed64Syms map[uint64]symSizeAlign // short hashed (content-addressable) symbols, keyed by content hash hashedSyms map[goobj2.HashType]symSizeAlign // hashed (content-addressable) symbols, keyed by content hash symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name @@ -308,6 +310,7 @@ type Loader struct { const ( pkgDef = iota + hashed64Def hashedDef nonPkgDef nonPkgRef @@ -349,6 +352,7 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor objs: []objIdx{{}, {extReader, 0}}, // reserve index 0 for nil symbol, 1 for external symbols objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol extReader: extReader, + hashed64Syms: make(map[uint64]symSizeAlign, 10000), // TODO: adjust preallocation sizes hashedSyms: make(map[goobj2.HashType]symSizeAlign, 20000), // TODO: adjust preallocation sizes 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]*oReader), @@ -409,7 +413,7 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o addToGlobal := func() { l.objSyms = append(l.objSyms, objSym{r.objidx, li}) } - if name == "" && kind != hashedDef { + if name == "" && kind != hashed64Def && kind != hashedDef { addToGlobal() return i, true // unnamed aux symbol } @@ -430,12 +434,45 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o l.symsByName[ver][name] = i addToGlobal() return i, true + case hashed64Def: + // Hashed (content-addressable) symbol. Check the hash + // but don't add to name lookup table, as they are not + // referenced by name. Also no need to do overwriting + // check, as same hash indicates same content. + hash := r.Hash64(li - uint32(r.ndef)) + siz := osym.Siz() + align := osym.Align() + if s, existed := l.hashed64Syms[hash]; existed { + // For short symbols, the content hash is the identity function of the + // 8 bytes, and trailing zeros doesn't change the hash value, e.g. + // hash("A") == hash("A\0\0\0"). + // So when two symbols have the same hash, we need to use the one with + // larget size. + if siz <= s.size { + if align > s.align { // we need to use the biggest alignment + l.SetSymAlign(s.sym, int32(align)) + l.hashed64Syms[hash] = symSizeAlign{s.sym, s.size, align} + } + } else { + // New symbol has larger size, use the new one. Rewrite the index mapping. + l.objSyms[s.sym] = objSym{r.objidx, li} + if align < s.align { + align = s.align // keep the biggest alignment + l.SetSymAlign(s.sym, int32(align)) + } + l.hashed64Syms[hash] = symSizeAlign{s.sym, siz, align} + } + return s.sym, false + } + l.hashed64Syms[hash] = symSizeAlign{i, siz, align} + addToGlobal() + return i, true case hashedDef: // Hashed (content-addressable) symbol. Check the hash // but don't add to name lookup table, as they are not // referenced by name. Also no need to do overwriting // check, as same hash indicates same content. - hash := r.Hash(li - uint32(r.ndef)) + hash := r.Hash(li - uint32(r.ndef+r.nhashed64def)) if s, existed := l.hashedSyms[*hash]; existed { if s.size != osym.Siz() { fmt.Printf("hash collision: %v (size %d) and %v (size %d), hash %x\n", l.SymName(s.sym), s.size, osym.Name(r.Reader), osym.Siz(), *hash) @@ -616,11 +653,14 @@ func (l *Loader) resolve(r *oReader, s goobj2.SymRef) Sym { panic("bad sym ref") } return 0 - case goobj2.PkgIdxHashed: + case goobj2.PkgIdxHashed64: i := int(s.SymIdx) + r.ndef return r.syms[i] + case goobj2.PkgIdxHashed: + i := int(s.SymIdx) + r.ndef + r.nhashed64def + return r.syms[i] case goobj2.PkgIdxNone: - i := int(s.SymIdx) + r.ndef + r.nhasheddef + i := int(s.SymIdx) + r.ndef + r.nhashed64def + r.nhasheddef return r.syms[i] case goobj2.PkgIdxBuiltin: return l.builtinSyms[s.SymIdx] @@ -2062,17 +2102,19 @@ func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, u } pkgprefix := objabi.PathToPrefix(lib.Pkg) + "." ndef := r.NSym() + nhashed64def := r.NHashed64def() nhasheddef := r.NHasheddef() or := &oReader{ - Reader: r, - unit: unit, - version: localSymVersion, - flags: r.Flags(), - pkgprefix: pkgprefix, - syms: make([]Sym, ndef+nhasheddef+r.NNonpkgdef()+r.NNonpkgref()), - ndef: ndef, - nhasheddef: nhasheddef, - objidx: uint32(len(l.objs)), + Reader: r, + unit: unit, + version: localSymVersion, + flags: r.Flags(), + pkgprefix: pkgprefix, + syms: make([]Sym, ndef+nhashed64def+nhasheddef+r.NNonpkgdef()+r.NNonpkgref()), + ndef: ndef, + nhasheddef: nhasheddef, + nhashed64def: nhashed64def, + objidx: uint32(len(l.objs)), } // Autolib @@ -2101,12 +2143,15 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { case pkgDef: start = 0 end = uint32(r.ndef) - case hashedDef: + case hashed64Def: start = uint32(r.ndef) - end = uint32(r.ndef + r.nhasheddef) + end = uint32(r.ndef + r.nhashed64def) + case hashedDef: + start = uint32(r.ndef + r.nhashed64def) + end = uint32(r.ndef + r.nhashed64def + r.nhasheddef) case nonPkgDef: - start = uint32(r.ndef + r.nhasheddef) - end = uint32(r.ndef + r.nhasheddef + r.NNonpkgdef()) + start = uint32(r.ndef + r.nhashed64def + r.nhasheddef) + end = uint32(r.ndef + r.nhashed64def + r.nhasheddef + r.NNonpkgdef()) default: panic("preloadSyms: bad kind") } @@ -2117,7 +2162,7 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { osym := r.Sym(i) var name string var v int - if kind != hashedDef { // we don't need the name, etc. for hashed symbols + if kind != hashed64Def && kind != hashedDef { // we don't need the name, etc. for hashed symbols name = osym.Name(r.Reader) if needNameExpansion { name = strings.Replace(name, "\"\".", r.pkgprefix, -1) @@ -2159,6 +2204,7 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { l.npkgsyms = l.NSym() for _, o := range l.objs[goObjStart:] { + l.preloadSyms(o.r, hashed64Def) l.preloadSyms(o.r, hashedDef) l.preloadSyms(o.r, nonPkgDef) } @@ -2570,7 +2616,7 @@ func (l *Loader) Errorf(s Sym, format string, args ...interface{}) { func (l *Loader) Stat() string { s := fmt.Sprintf("%d symbols, %d reachable\n", l.NSym(), l.NReachableSym()) s += fmt.Sprintf("\t%d package symbols, %d hashed symbols, %d non-package symbols, %d external symbols\n", - l.npkgsyms, len(l.hashedSyms), int(l.extStart)-l.npkgsyms-len(l.hashedSyms), l.NSym()-int(l.extStart)) + l.npkgsyms, len(l.hashed64Syms)+len(l.hashedSyms), int(l.extStart)-l.npkgsyms-len(l.hashed64Syms)-len(l.hashedSyms), l.NSym()-int(l.extStart)) return s } -- GitLab From 88382a9f97c96a610df5974cdeb165a6e7237861 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 14 Jul 2020 14:46:59 -0400 Subject: [PATCH 0102/1792] [dev.link] cmd/link: stream out external relocations on AMD64 ELF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, when external linking, in relocsym (in asmb pass), we convert Go relocations to an in-memory representation of external relocations, and then in asmb2 pass we write them out to the output file. This is not memory efficient. This CL makes it not do the conversion but directly stream out the external relocations based on Go relocations. Currently only do this on AMD64 ELF systems. This reduces memory usage, but makes the asmb2 pass a little slower. Linking cmd/compile with external linking: name old time/op new time/op delta Asmb_GC 83.8ms ± 7% 70.4ms ± 4% -16.03% (p=0.008 n=5+5) Asmb2_GC 95.6ms ± 4% 118.2ms ± 5% +23.65% (p=0.008 n=5+5) TotalTime_GC 1.59s ± 2% 1.62s ± 1% ~ (p=0.151 n=5+5) name old alloc/op new alloc/op delta Asmb_GC 26.0MB ± 0% 4.1MB ± 0% -84.15% (p=0.008 n=5+5) Asmb2_GC 8.19MB ± 0% 8.18MB ± 0% ~ (p=0.222 n=5+5) name old live-B new live-B delta Asmb_GC 49.2M ± 0% 27.4M ± 0% -44.38% (p=0.008 n=5+5) Asmb2_GC 51.5M ± 0% 29.7M ± 0% -42.33% (p=0.008 n=5+5) TODO: figure out what is slow. Possible improvements: - Remove redundant work in relocsym. - Maybe there is a better representation for external relocations now. - Fine-grained parallelism in emitting external relocations. - The old elfrelocsect only iterates over external relocations, now we iterate over all relocations. Is it too many? Change-Id: Ib0a8ee8c88d65864c62b89a8d634614f7f2c813e Reviewed-on: https://go-review.googlesource.com/c/go/+/242603 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/asmb.go | 2 +- src/cmd/link/internal/ld/data.go | 127 ++++++++++++++++++++++++- src/cmd/link/internal/ld/elf.go | 58 ++++++++--- src/cmd/link/internal/loader/loader.go | 4 +- 4 files changed, 170 insertions(+), 21 deletions(-) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index dc8a96b568..a7b3237b3e 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -19,7 +19,7 @@ import ( // This function handles the first part. func asmb(ctxt *Link) { ctxt.loader.InitOutData() - if ctxt.IsExternal() { + if ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) { ctxt.loader.InitExtRelocs() } diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index d9f9ff70d3..8a21f55862 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -159,7 +159,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { target := st.target syms := st.syms var extRelocs []loader.ExtReloc - if target.IsExternal() { + if target.IsExternal() && !(target.IsAMD64() && target.IsELF) { // preallocate a slice conservatively assuming that all // relocs will require an external reloc extRelocs = st.preallocExtRelocSlice(relocs.Count()) @@ -592,16 +592,137 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { addExtReloc: if needExtReloc { - extRelocs = append(extRelocs, rr) + if target.IsAMD64() && target.IsELF { + extraExtReloc++ + } else { + extRelocs = append(extRelocs, rr) + } } } - if len(extRelocs) != 0 { + if target.IsExternal() && target.IsAMD64() && target.IsELF { + // On AMD64 ELF, we'll stream out the external relocations in elfrelocsect + // and we only need the count here. + // TODO: just count, but not compute the external relocations. For now it + // is still needed on other platforms, and this keeps the code simple. + atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(extraExtReloc)) + } else if len(extRelocs) != 0 { st.finalizeExtRelocSlice(extRelocs) ldr.SetExtRelocs(s, extRelocs) atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(len(extRelocs)+extraExtReloc)) } } +// Convert a Go relocation to an external relocation. +func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri int) (loader.ExtReloc, bool) { + var rr loader.ExtReloc + target := ctxt.Target + siz := int32(r.Siz()) + if siz == 0 { // informational relocation - no work to do + return rr, false + } + + rt := r.Type() + if rt >= objabi.ElfRelocOffset { + return rr, false + } + + rr.Idx = ri + + // TODO(mundaym): remove this special case - see issue 14218. + if target.IsS390X() { + switch rt { + case objabi.R_PCRELDBL: + rt = objabi.R_PCREL + } + } + + switch rt { + default: + // TODO: handle arch-specific relocations + panic("unsupported") + + case objabi.R_TLS_LE, objabi.R_TLS_IE: + if target.IsElf() { + rs := ldr.ResolveABIAlias(r.Sym()) + rr.Xsym = rs + if rr.Xsym == 0 { + rr.Xsym = ctxt.Tlsg + } + rr.Xadd = r.Add() + break + } + return rr, false + + case objabi.R_ADDR: + // set up addend for eventual relocation via outer symbol. + rs := ldr.ResolveABIAlias(r.Sym()) + rs, off := FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs)) + } + rr.Xsym = rs + + case objabi.R_DWARFSECREF: + // On most platforms, the external linker needs to adjust DWARF references + // as it combines DWARF sections. However, on Darwin, dsymutil does the + // DWARF linking, and it understands how to follow section offsets. + // Leaving in the relocation records confuses it (see + // https://golang.org/issue/22068) so drop them for Darwin. + if target.IsDarwin() { + return rr, false + } + rs := ldr.ResolveABIAlias(r.Sym()) + rr.Xsym = loader.Sym(ldr.SymSect(rs).Sym) + rr.Xadd = r.Add() + ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr) + + // r.Sym() can be 0 when CALL $(constant) is transformed from absolute PC to relative PC call. + case objabi.R_GOTPCREL, objabi.R_CALL, objabi.R_PCREL: + rs := ldr.ResolveABIAlias(r.Sym()) + if rt == objabi.R_GOTPCREL && target.IsDynlinkingGo() && target.IsDarwin() && rs != 0 { + rr.Xadd = r.Add() + rr.Xadd -= int64(siz) // relative to address after the relocated chunk + rr.Xsym = rs + break + } + if rs != 0 && ldr.SymType(rs) == sym.SUNDEFEXT { + // pass through to the external linker. + rr.Xadd = 0 + if target.IsElf() { + rr.Xadd -= int64(siz) + } + rr.Xsym = rs + break + } + if rs != 0 && (ldr.SymSect(rs) != ldr.SymSect(s) || rt == objabi.R_GOTPCREL) { + // set up addend for eventual relocation via outer symbol. + rs := rs + rs, off := FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rr.Xadd -= int64(siz) // relative to address after the relocated chunk + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs)) + } + rr.Xsym = rs + break + } + return rr, false + + case objabi.R_XCOFFREF: + rs := ldr.ResolveABIAlias(r.Sym()) + rr.Xsym = rs + rr.Xadd = r.Add() + + // These reloc types don't need external relocations. + case objabi.R_ADDROFF, objabi.R_WEAKADDROFF, objabi.R_METHODOFF, objabi.R_ADDRCUOFF, + objabi.R_SIZE, objabi.R_CONST, objabi.R_GOTOFF: + return rr, false + } + return rr, true +} + const extRelocSlabSize = 2048 // relocSymState hold state information needed when making a series of diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 022da8aa19..2ba618ed0b 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1372,22 +1372,50 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) break } - relocs := ldr.ExtRelocs(s) - for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At(ri) - if r.Xsym == 0 { - ldr.Errorf(s, "missing xsym in relocation") - continue - } - esr := ElfSymForReloc(ctxt, r.Xsym) - if esr == 0 { - ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) - } - if !ldr.AttrReachable(r.Xsym) { - ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) + if ctxt.IsAMD64() { + // Compute external relocations on the go, and pass to Elfreloc1 + // to stream out. + relocs := ldr.Relocs(s) + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At2(ri) + rr, ok := extreloc(ctxt, ldr, s, r, ri) + if !ok { + continue + } + if rr.Xsym == 0 { + ldr.Errorf(s, "missing xsym in relocation") + continue + } + esr := ElfSymForReloc(ctxt, rr.Xsym) + if esr == 0 { + ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(rr.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) + } + 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)) + } + rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} + if !thearch.Elfreloc1(ctxt, out, ldr, s, rv, 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())) + } } - if !thearch.Elfreloc1(ctxt, out, ldr, s, r, 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())) + } else { + relocs := ldr.ExtRelocs(s) + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At(ri) + if r.Xsym == 0 { + ldr.Errorf(s, "missing xsym in relocation") + continue + } + esr := ElfSymForReloc(ctxt, r.Xsym) + if esr == 0 { + ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) + } + if !ldr.AttrReachable(r.Xsym) { + ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) + } + if !thearch.Elfreloc1(ctxt, out, ldr, s, r, 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())) + } } } } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index c8b29d7d9b..6d541af950 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -60,7 +60,7 @@ type ExtReloc struct { // It is not the data structure used to store the payload internally. type ExtRelocView struct { Reloc2 - *ExtReloc + ExtReloc } // Reloc2 holds a "handle" to access a relocation record from an @@ -1909,7 +1909,7 @@ func (ers ExtRelocs) Count() int { return len(ers.es) } func (ers ExtRelocs) At(j int) ExtRelocView { i := ers.es[j].Idx - return ExtRelocView{ers.rs.At2(i), &ers.es[j]} + return ExtRelocView{ers.rs.At2(i), ers.es[j]} } // RelocByOff implements sort.Interface for sorting relocations by offset. -- GitLab From 289c238a339c59737b7f271b19bc9217e7d69851 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 15 Jul 2020 20:01:32 -0400 Subject: [PATCH 0103/1792] [dev.link] cmd/compile: make read-only static temps content-addressable For now, we only do this for symbols without relocations. Mark static temps "local", as they are not referenced across DSO boundaries. And deduplicating a local symbol and a non-local symbol can be problematic. Change-Id: I0a3dc4138aaeea7fd4f326998f32ab6305da8e4b Reviewed-on: https://go-review.googlesource.com/c/go/+/243141 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/compile/internal/gc/order.go | 3 +-- src/cmd/compile/internal/gc/sinit.go | 28 +++++++++++++++++----------- src/cmd/compile/internal/gc/walk.go | 3 +-- src/cmd/internal/obj/objfile2.go | 4 ++-- src/cmd/internal/obj/sym.go | 2 +- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 6b6107290a..50d1a2a1b0 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -206,8 +206,7 @@ func (o *Order) addrTemp(n *Node) *Node { // TODO: expand this to all static composite literal nodes? n = defaultlit(n, nil) dowidth(n.Type) - vstat := staticname(n.Type) - vstat.MarkReadonly() + vstat := readonlystaticname(n.Type) var s InitSchedule s.staticassign(vstat, n) if s.out != nil { diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 83274bf6a3..4a2edc7d21 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -356,14 +356,22 @@ func (c initContext) String() string { var statuniqgen int // name generator for static temps -// staticname returns a name backed by a static data symbol. -// Callers should call n.MarkReadonly on the -// returned node for readonly nodes. +// staticname returns a name backed by a (writable) static data symbol. +// Use readonlystaticname for read-only node. func staticname(t *types.Type) *Node { // Don't use lookupN; it interns the resulting string, but these are all unique. n := newname(lookup(fmt.Sprintf("%s%d", obj.StaticNamePref, statuniqgen))) statuniqgen++ addvar(n, t, PEXTERN) + n.Sym.Linksym().Set(obj.AttrLocal, true) + return n +} + +// readonlystaticname returns a name backed by a (writable) static data symbol. +func readonlystaticname(t *types.Type) *Node { + n := staticname(t) + n.MarkReadonly() + n.Sym.Linksym().Set(obj.AttrContentAddressable, true) return n } @@ -627,9 +635,10 @@ func slicelit(ctxt initContext, n *Node, var_ *Node, init *Nodes) { mode := getdyn(n, true) if mode&initConst != 0 && !isSmallSliceLit(n) { - vstat = staticname(t) if ctxt == inInitFunction { - vstat.MarkReadonly() + vstat = readonlystaticname(t) + } else { + vstat = staticname(t) } fixedlit(ctxt, initKindStatic, n, vstat, init) } @@ -773,10 +782,8 @@ func maplit(n *Node, m *Node, init *Nodes) { dowidth(te) // make and initialize static arrays - vstatk := staticname(tk) - vstatk.MarkReadonly() - vstate := staticname(te) - vstate.MarkReadonly() + vstatk := readonlystaticname(tk) + vstate := readonlystaticname(te) datak := nod(OARRAYLIT, nil, nil) datae := nod(OARRAYLIT, nil, nil) @@ -897,8 +904,7 @@ func anylit(n *Node, var_ *Node, init *Nodes) { if var_.isSimpleName() && n.List.Len() > 4 { // lay out static data - vstat := staticname(t) - vstat.MarkReadonly() + vstat := readonlystaticname(t) ctxt := inInitFunction if n.Op == OARRAYLIT { diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 19c185d735..8ae3d9a5c7 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -1556,8 +1556,7 @@ opswitch: if isStaticCompositeLiteral(n) && !canSSAType(n.Type) { // n can be directly represented in the read-only data section. // Make direct reference to the static data. See issue 12841. - vstat := staticname(n.Type) - vstat.MarkReadonly() + vstat := readonlystaticname(n.Type) fixedlit(inInitFunction, initKindStatic, n, vstat, init) n = vstat n = typecheck(n, ctxExpr) diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 858899f3a9..6ac23bc418 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -333,7 +333,7 @@ func (w *writer) Sym(s *LSym) { } func (w *writer) Hash64(s *LSym) { - if !s.ContentAddressable() { + if !s.ContentAddressable() || len(s.R) != 0 { panic("Hash of non-content-addresable symbol") } var b goobj2.Hash64Type @@ -342,7 +342,7 @@ func (w *writer) Hash64(s *LSym) { } func (w *writer) Hash(s *LSym) { - if !s.ContentAddressable() { + if !s.ContentAddressable() || len(s.R) != 0 { // TODO: currently we don't support content-addressable symbols with relocations panic("Hash of non-content-addresable symbol") } b := goobj2.HashType(sha1.Sum(s.P)) diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 4f84fc7d98..6285486c66 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -202,7 +202,7 @@ func (ctxt *Link) NumberSyms() { var idx, hashedidx, hashed64idx, nonpkgidx int32 ctxt.traverseSyms(traverseDefs, func(s *LSym) { - if s.ContentAddressable() { + if s.ContentAddressable() && len(s.R) == 0 { // TODO: currently we don't support content-addressable symbols with relocations if len(s.P) <= 8 { s.PkgIdx = goobj2.PkgIdxHashed64 s.SymIdx = hashed64idx -- GitLab From 526d99a49ae67bfde15134b96159680988615d2d Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 15 Jul 2020 23:14:50 -0400 Subject: [PATCH 0104/1792] [dev.link] cmd/internal/obj: handle content-addressable symbols with relocations For content-addressable symbols with relocations, we build a content hash based on its content and relocations. Depending on the category of the referenced symbol, we choose different hash algorithms such that the hash is globally consistent. For now, we only support content-addressable symbols with relocations when the current package's import path is known, so that the symbol names are fully expanded. Otherwise, if the referenced symbol is a named symbol whose name is not fully expanded, the hash won't be globally consistent, and can cause erroneous collisions. This is fine for now, as the deduplication is just an optimization, not a requirement for correctness (until we get to type descriptors). Change-Id: I639e4e03dd749b5d71f0a55c2525926575b1ac30 Reviewed-on: https://go-review.googlesource.com/c/go/+/243142 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/asm/main.go | 3 +- src/cmd/compile/internal/gc/main.go | 1 + src/cmd/compile/internal/gc/obj.go | 2 +- src/cmd/internal/obj/link.go | 1 + src/cmd/internal/obj/objfile2.go | 77 +++++++++++++++++++++--- src/cmd/internal/obj/objfile_test.go | 87 ++++++++++++++++++++++++++++ src/cmd/internal/obj/sym.go | 6 +- 7 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 src/cmd/internal/obj/objfile_test.go diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go index 31d8549d2d..a6eb44de73 100644 --- a/src/cmd/asm/main.go +++ b/src/cmd/asm/main.go @@ -41,6 +41,7 @@ func main() { ctxt.Flag_dynlink = *flags.Dynlink ctxt.Flag_shared = *flags.Shared || *flags.Dynlink ctxt.IsAsm = true + ctxt.Pkgpath = *flags.Importpath switch *flags.Spectre { default: log.Printf("unknown setting -spectre=%s", *flags.Spectre) @@ -97,7 +98,7 @@ func main() { } if ok && !*flags.SymABIs { ctxt.NumberSyms() - obj.WriteObjFile(ctxt, buf, *flags.Importpath) + obj.WriteObjFile(ctxt, buf) } if !ok || diag { if failedFile != "" { diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 6e204f49bc..bb28ef01a1 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -789,6 +789,7 @@ func Main(archInit func(*Arch)) { // Write object data to disk. timings.Start("be", "dumpobj") dumpdata() + Ctxt.Pkgpath = myimportpath Ctxt.NumberSyms() dumpobj() if asmhdr != "" { diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 26ea775368..0826b04e33 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -166,7 +166,7 @@ func dumpLinkerObj(bout *bio.Writer) { fmt.Fprintf(bout, "\n!\n") - obj.WriteObjFile(Ctxt, bout, myimportpath) + obj.WriteObjFile(Ctxt, bout) } func addptabs() { diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index ffc3e99a20..195af8494c 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -671,6 +671,7 @@ type Link struct { Retpoline bool // emit use of retpoline stubs for indirect jmp/call Bso *bufio.Writer Pathname string + Pkgpath string // the current package's import path, "" if unknown hashmu sync.Mutex // protects hash, funchash hash map[string]*LSym // name -> sym mapping funchash map[string]*LSym // name -> sym mapping for ABIInternal syms diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 6ac23bc418..6a5f3726f8 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -12,13 +12,15 @@ import ( "cmd/internal/goobj2" "cmd/internal/objabi" "crypto/sha1" + "encoding/binary" "fmt" + "io" "path/filepath" "strings" ) // Entry point of writing new object file. -func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { +func WriteObjFile(ctxt *Link, b *bio.Writer) { debugAsmEmit(ctxt) @@ -27,7 +29,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { w := writer{ Writer: goobj2.NewWriter(b), ctxt: ctxt, - pkgpath: objabi.PathToPrefix(pkgpath), + pkgpath: objabi.PathToPrefix(ctxt.Pkgpath), } start := b.Offset() @@ -39,7 +41,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer, pkgpath string) { if ctxt.Flag_shared { flags |= goobj2.ObjFlagShared } - if pkgpath == "" { + if w.pkgpath == "" { flags |= goobj2.ObjFlagNeedNameExpansion } if ctxt.IsAsm { @@ -336,19 +338,80 @@ func (w *writer) Hash64(s *LSym) { if !s.ContentAddressable() || len(s.R) != 0 { panic("Hash of non-content-addresable symbol") } - var b goobj2.Hash64Type - copy(b[:], s.P) + b := contentHash64(s) w.Bytes(b[:]) } func (w *writer) Hash(s *LSym) { - if !s.ContentAddressable() || len(s.R) != 0 { // TODO: currently we don't support content-addressable symbols with relocations + if !s.ContentAddressable() { panic("Hash of non-content-addresable symbol") } - b := goobj2.HashType(sha1.Sum(s.P)) + b := w.contentHash(s) w.Bytes(b[:]) } +func contentHash64(s *LSym) goobj2.Hash64Type { + var b goobj2.Hash64Type + copy(b[:], s.P) + return b +} + +// Compute the content hash for a content-addressable symbol. +// We build a content hash based on its content and relocations. +// Depending on the category of the referenced symbol, we choose +// different hash algorithms such that the hash is globally +// consistent. +// - For referenced content-addressable symbol, its content hash +// is globally consistent. +// - For package symbol, its local index is globally consistent. +// - For non-package symbol, its fully-expanded name is globally +// consistent. For now, we require we know the current package +// path so we can always expand symbol names. (Otherwise, +// symbols with relocations are not considered hashable.) +// +// For now, we assume there is no circular dependencies among +// hashed symbols. +func (w *writer) contentHash(s *LSym) goobj2.HashType { + h := sha1.New() + h.Write(s.P) + var tmp [14]byte + for i := range s.R { + r := &s.R[i] + binary.LittleEndian.PutUint32(tmp[:4], uint32(r.Off)) + tmp[4] = r.Siz + tmp[5] = uint8(r.Type) + binary.LittleEndian.PutUint64(tmp[6:14], uint64(r.Add)) + h.Write(tmp[:]) + rs := r.Sym + switch rs.PkgIdx { + case goobj2.PkgIdxHashed64: + h.Write([]byte{0}) + t := contentHash64(rs) + h.Write(t[:]) + case goobj2.PkgIdxHashed: + h.Write([]byte{1}) + t := w.contentHash(rs) + h.Write(t[:]) + case goobj2.PkgIdxBuiltin: + panic("unsupported") + case goobj2.PkgIdxNone: + h.Write([]byte{2}) + io.WriteString(h, rs.Name) // name is already expanded at this point + case goobj2.PkgIdxSelf: + io.WriteString(h, w.pkgpath) + binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) + h.Write(tmp[:4]) + default: + io.WriteString(h, rs.Pkg) + binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) + h.Write(tmp[:4]) + } + } + var b goobj2.HashType + copy(b[:], h.Sum(nil)) + return b +} + func makeSymRef(s *LSym) goobj2.SymRef { if s == nil { return goobj2.SymRef{} diff --git a/src/cmd/internal/obj/objfile_test.go b/src/cmd/internal/obj/objfile_test.go new file mode 100644 index 0000000000..ed3be20760 --- /dev/null +++ b/src/cmd/internal/obj/objfile_test.go @@ -0,0 +1,87 @@ +// 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 obj + +import ( + "cmd/internal/goobj2" + "cmd/internal/sys" + "testing" +) + +var dummyArch = LinkArch{Arch: sys.ArchAMD64} + +func TestContentHash64(t *testing.T) { + s1 := &LSym{P: []byte("A")} + s2 := &LSym{P: []byte("A\x00\x00\x00")} + s1.Set(AttrContentAddressable, true) + s2.Set(AttrContentAddressable, true) + h1 := contentHash64(s1) + h2 := contentHash64(s2) + if h1 != h2 { + t.Errorf("contentHash64(s1)=%x, contentHash64(s2)=%x, expect equal", h1, h2) + } + + ctxt := Linknew(&dummyArch) // little endian + s3 := ctxt.Int64Sym(int64('A')) + h3 := contentHash64(s3) + if h1 != h3 { + t.Errorf("contentHash64(s1)=%x, contentHash64(s3)=%x, expect equal", h1, h3) + } +} + +func TestContentHash(t *testing.T) { + syms := []*LSym{ + &LSym{P: []byte("TestSymbol")}, // 0 + &LSym{P: []byte("TestSymbol")}, // 1 + &LSym{P: []byte("TestSymbol2")}, // 2 + &LSym{P: []byte("")}, // 3 + &LSym{P: []byte("")}, // 4 + &LSym{P: []byte("")}, // 5 + &LSym{P: []byte("")}, // 6 + } + for _, s := range syms { + s.Set(AttrContentAddressable, true) + s.PkgIdx = goobj2.PkgIdxHashed + } + // s3 references s0 + r := Addrel(syms[3]) + r.Sym = syms[0] + // s4 references s0 + r = Addrel(syms[4]) + r.Sym = syms[0] + // s5 references s1 + r = Addrel(syms[5]) + r.Sym = syms[1] + // s6 references s2 + r = Addrel(syms[6]) + r.Sym = syms[2] + + // compute hashes + h := make([]goobj2.HashType, len(syms)) + w := &writer{} + for i := range h { + h[i] = w.contentHash(syms[i]) + } + + tests := []struct { + a, b int + equal bool + }{ + {0, 1, true}, // same contents, no relocs + {0, 2, false}, // different contents + {3, 4, true}, // same contents, same relocs + {3, 5, true}, // recursively same contents + {3, 6, false}, // same contents, different relocs + } + for _, test := range tests { + if (h[test.a] == h[test.b]) != test.equal { + eq := "equal" + if !test.equal { + eq = "not equal" + } + t.Errorf("h%d=%x, h%d=%x, expect %s", test.a, h[test.a], test.b, h[test.b], eq) + } + } +} diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 6285486c66..67e4081f74 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -202,8 +202,10 @@ func (ctxt *Link) NumberSyms() { var idx, hashedidx, hashed64idx, nonpkgidx int32 ctxt.traverseSyms(traverseDefs, func(s *LSym) { - if s.ContentAddressable() && len(s.R) == 0 { // TODO: currently we don't support content-addressable symbols with relocations - if len(s.P) <= 8 { + // if Pkgpath is unknown, cannot hash symbols with relocations, as it + // may reference named symbols whose names are not fully expanded. + if s.ContentAddressable() && (ctxt.Pkgpath != "" || len(s.R) == 0) { + if len(s.P) <= 8 && len(s.R) == 0 { // we can use short hash only for symbols without relocations s.PkgIdx = goobj2.PkgIdxHashed64 s.SymIdx = hashed64idx if hashed64idx != int32(len(ctxt.hashed64defs)) { -- GitLab From 0e3114871e221485d89bf94dc019fcfa3df9c21a Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 20 Jul 2020 18:07:00 -0400 Subject: [PATCH 0105/1792] [dev.link] cmd/link: fix hash collision check For content-addressable symbols, we build its content hash based on the symbol data and relocations. When the compiler builds the symbol data, it may not always include the trailing zeros, e.g. the data of [10]int64{1,2,3} is only the first 24 bytes. Therefore, we may end up with symbols with the same contents (thus same hash) but different sizes. This is not actually a hash collision. In this case, we can deduplicate them and keep the one with the larger size. Change-Id: If6834542d7914cc00f917d7db151955e5aee6f30 Reviewed-on: https://go-review.googlesource.com/c/go/+/243718 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/loader/loader.go | 63 +++++++++++------------ src/cmd/link/link_test.go | 20 +++++++ src/cmd/link/testdata/testHashedSyms/p.go | 33 ++++++++++++ 3 files changed, 84 insertions(+), 32 deletions(-) create mode 100644 src/cmd/link/testdata/testHashedSyms/p.go diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 6d541af950..86fdbeffd8 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -434,24 +434,46 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o l.symsByName[ver][name] = i addToGlobal() return i, true - case hashed64Def: + case hashed64Def, hashedDef: // Hashed (content-addressable) symbol. Check the hash // but don't add to name lookup table, as they are not // referenced by name. Also no need to do overwriting // check, as same hash indicates same content. - hash := r.Hash64(li - uint32(r.ndef)) + var checkHash func() (symSizeAlign, bool) + var addToHashMap func(symSizeAlign) + var h64 uint64 // only used for hashed64Def + var h *goobj2.HashType // only used for hashedDef + if kind == hashed64Def { + checkHash = func() (symSizeAlign, bool) { + h64 = r.Hash64(li - uint32(r.ndef)) + s, existed := l.hashed64Syms[h64] + return s, existed + } + addToHashMap = func(ss symSizeAlign) { l.hashed64Syms[h64] = ss } + } else { + checkHash = func() (symSizeAlign, bool) { + h = r.Hash(li - uint32(r.ndef+r.nhashed64def)) + s, existed := l.hashedSyms[*h] + return s, existed + } + addToHashMap = func(ss symSizeAlign) { l.hashedSyms[*h] = ss } + } siz := osym.Siz() align := osym.Align() - if s, existed := l.hashed64Syms[hash]; existed { - // For short symbols, the content hash is the identity function of the - // 8 bytes, and trailing zeros doesn't change the hash value, e.g. + if s, existed := checkHash(); existed { + // The content hash is built from symbol data and relocations. In the + // object file, the symbol data may not always contain trailing zeros, + // e.g. for [5]int{1,2,3} and [100]int{1,2,3}, the data is same + // (although the size is different). + // Also, for short symbols, the content hash is the identity function of + // the 8 bytes, and trailing zeros doesn't change the hash value, e.g. // hash("A") == hash("A\0\0\0"). // So when two symbols have the same hash, we need to use the one with - // larget size. + // larger size. if siz <= s.size { if align > s.align { // we need to use the biggest alignment l.SetSymAlign(s.sym, int32(align)) - l.hashed64Syms[hash] = symSizeAlign{s.sym, s.size, align} + addToHashMap(symSizeAlign{s.sym, s.size, align}) } } else { // New symbol has larger size, use the new one. Rewrite the index mapping. @@ -460,34 +482,11 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o align = s.align // keep the biggest alignment l.SetSymAlign(s.sym, int32(align)) } - l.hashed64Syms[hash] = symSizeAlign{s.sym, siz, align} - } - return s.sym, false - } - l.hashed64Syms[hash] = symSizeAlign{i, siz, align} - addToGlobal() - return i, true - case hashedDef: - // Hashed (content-addressable) symbol. Check the hash - // but don't add to name lookup table, as they are not - // referenced by name. Also no need to do overwriting - // check, as same hash indicates same content. - hash := r.Hash(li - uint32(r.ndef+r.nhashed64def)) - if s, existed := l.hashedSyms[*hash]; existed { - if s.size != osym.Siz() { - fmt.Printf("hash collision: %v (size %d) and %v (size %d), hash %x\n", l.SymName(s.sym), s.size, osym.Name(r.Reader), osym.Siz(), *hash) - panic("hash collision") - } - if l.flags&FlagStrictDups != 0 { - l.checkdup(name, r, li, s.sym) - } - if a := osym.Align(); a > s.align { // we need to use the biggest alignment - l.SetSymAlign(s.sym, int32(a)) - l.hashedSyms[*hash] = symSizeAlign{s.sym, s.size, a} + addToHashMap(symSizeAlign{s.sym, siz, align}) } return s.sym, false } - l.hashedSyms[*hash] = symSizeAlign{i, osym.Siz(), osym.Align()} + addToHashMap(symSizeAlign{i, siz, align}) addToGlobal() return i, true } diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 6ed6688a23..3b5efdf7a3 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -778,3 +778,23 @@ func TestPErsrc(t *testing.T) { t.Fatalf("binary does not contain expected content") } } + +func TestContentAddressableSymbols(t *testing.T) { + // Test that the linker handles content-addressable symbols correctly. + testenv.MustHaveGoBuild(t) + + t.Parallel() + + tmpdir, err := ioutil.TempDir("", "TestContentAddressableSymbols") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpdir) + + src := filepath.Join("testdata", "testHashedSyms", "p.go") + cmd := exec.Command(testenv.GoToolPath(t), "run", src) + out, err := cmd.CombinedOutput() + if err != nil { + t.Errorf("command %s failed: %v\n%s", cmd, err, out) + } +} diff --git a/src/cmd/link/testdata/testHashedSyms/p.go b/src/cmd/link/testdata/testHashedSyms/p.go new file mode 100644 index 0000000000..87dddcfcac --- /dev/null +++ b/src/cmd/link/testdata/testHashedSyms/p.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. + +// This test case contains two static temps (the array literals) +// with same contents but different sizes. The linker should not +// report a hash collision. The linker can (and actually does) +// dedup the two symbols, by keeping the larger symbol. The dedup +// is not a requirement for correctness and not checked in this test. +// We do check the emitted symbol contents are correct, though. + +package main + +func main() { + F([10]int{1, 2, 3, 4, 5, 6}, [20]int{1, 2, 3, 4, 5, 6}) +} + +//go:noinline +func F(x, y interface{}) { + x1 := x.([10]int) + y1 := y.([20]int) + for i := range y1 { + if i < 6 { + if x1[i] != i+1 || y1[i] != i+1 { + panic("FAIL") + } + } else { + if (i < len(x1) && x1[i] != 0) || y1[i] != 0 { + panic("FAIL") + } + } + } +} -- GitLab From 936a2d696674fb714a0b0ed3d2de5dd9c2ea0025 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 17 Jul 2020 17:05:22 -0400 Subject: [PATCH 0106/1792] [dev.link] cmd/link: stream external relocations on 386 ELF Change-Id: I17ff3ac82c8ac313f3a3c8e8129800ec9c05b991 Reviewed-on: https://go-review.googlesource.com/c/go/+/243643 Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/asmb.go | 2 +- src/cmd/link/internal/ld/data.go | 6 +++--- src/cmd/link/internal/ld/elf.go | 2 +- src/cmd/link/internal/ld/target.go | 5 +++++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index a7b3237b3e..f3e898bec5 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -19,7 +19,7 @@ import ( // This function handles the first part. func asmb(ctxt *Link) { ctxt.loader.InitOutData() - if ctxt.IsExternal() && !(ctxt.IsAMD64() && ctxt.IsELF) { + if ctxt.IsExternal() && !ctxt.StreamExtRelocs() { ctxt.loader.InitExtRelocs() } diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 8a21f55862..d5034ae01c 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -159,7 +159,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { target := st.target syms := st.syms var extRelocs []loader.ExtReloc - if target.IsExternal() && !(target.IsAMD64() && target.IsELF) { + if target.IsExternal() && !target.StreamExtRelocs() { // preallocate a slice conservatively assuming that all // relocs will require an external reloc extRelocs = st.preallocExtRelocSlice(relocs.Count()) @@ -592,14 +592,14 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { addExtReloc: if needExtReloc { - if target.IsAMD64() && target.IsELF { + if target.StreamExtRelocs() { extraExtReloc++ } else { extRelocs = append(extRelocs, rr) } } } - if target.IsExternal() && target.IsAMD64() && target.IsELF { + if target.IsExternal() && target.StreamExtRelocs() { // On AMD64 ELF, we'll stream out the external relocations in elfrelocsect // and we only need the count here. // TODO: just count, but not compute the external relocations. For now it diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 2ba618ed0b..6a531cb333 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1372,7 +1372,7 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) break } - if ctxt.IsAMD64() { + if ctxt.StreamExtRelocs() { // Compute external relocations on the go, and pass to Elfreloc1 // to stream out. relocs := ldr.Relocs(s) diff --git a/src/cmd/link/internal/ld/target.go b/src/cmd/link/internal/ld/target.go index 102b6c5436..8702db121e 100644 --- a/src/cmd/link/internal/ld/target.go +++ b/src/cmd/link/internal/ld/target.go @@ -181,3 +181,8 @@ func (t *Target) mustSetHeadType() { func (t *Target) IsBigEndian() bool { return t.Arch.ByteOrder == binary.BigEndian } + +// Temporary helper. +func (t *Target) StreamExtRelocs() bool { + return t.IsELF && (t.IsAMD64() || t.Is386()) +} -- GitLab From bf1816c7b7a2519176784f26639968ea47cdeb0b Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 17 Jul 2020 17:56:17 -0400 Subject: [PATCH 0107/1792] [dev.link] cmd/link: stream external relocations on ARM64 and on Darwin Support streaming external relocations on ARM64. Support architecture-specific relocations. Also support streaming external relocations on Darwin. Do it in the same CL so ARM64's archreloc doesn't need to support both streaming and non-streaming. Change-Id: Ia7fee9957892f98c065022c69a51f47402f4d6e2 Reviewed-on: https://go-review.googlesource.com/c/go/+/243644 Reviewed-by: Jeremy Faller --- src/cmd/link/internal/arm64/asm.go | 48 +++++++++++++++++++++++++----- src/cmd/link/internal/arm64/obj.go | 1 + src/cmd/link/internal/ld/data.go | 19 +++++++----- src/cmd/link/internal/ld/lib.go | 5 ++++ src/cmd/link/internal/ld/macho.go | 20 +++++++++---- src/cmd/link/internal/ld/target.go | 2 +- 6 files changed, 72 insertions(+), 23 deletions(-) diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 2d964e9cb6..093aadb343 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -456,15 +456,14 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade // set up addend for eventual relocation via outer symbol. rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off + xadd := r.Add() + off rst := ldr.SymType(rs) if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } - rr.Xsym = rs nExtReloc = 2 // need two ELF/Mach-O relocations. see elfreloc1/machoreloc1 - if target.IsDarwin() && rt == objabi.R_ADDRARM64 && rr.Xadd != 0 { + if target.IsDarwin() && rt == objabi.R_ADDRARM64 && xadd != 0 { nExtReloc = 4 // need another two relocations for non-zero addend } @@ -488,9 +487,8 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade // can only encode 24-bit of signed addend, but the instructions // supports 33-bit of signed addend, so we always encode the // addend in place. - o0 |= (uint32((rr.Xadd>>12)&3) << 29) | (uint32((rr.Xadd>>12>>2)&0x7ffff) << 5) - o1 |= uint32(rr.Xadd&0xfff) << 10 - rr.Xadd = 0 + o0 |= (uint32((xadd>>12)&3) << 29) | (uint32((xadd>>12>>2)&0x7ffff) << 5) + o1 |= uint32(xadd&0xfff) << 10 // when laid out, the instruction order must always be o1, o2. if target.IsBigEndian() { @@ -508,8 +506,6 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade if rt == objabi.R_ARM64_TLS_IE { nExtReloc = 2 // need two ELF relocations. see elfreloc1 } - rr.Xsym = rs - rr.Xadd = r.Add() return val, nExtReloc, isOk } } @@ -693,6 +689,42 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian return -1 } +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { + rs := ldr.ResolveABIAlias(r.Sym()) + var rr loader.ExtReloc + switch rt := r.Type(); rt { + case objabi.R_ARM64_GOTPCREL, + objabi.R_ADDRARM64: + + // set up addend for eventual relocation via outer symbol. + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rr.Xsym = rs + + // Note: ld64 currently has a bug that any non-zero addend for BR26 relocation + // will make the linking fail because it thinks the code is not PIC even though + // the BR26 relocation should be fully resolved at link time. + // That is the reason why the next if block is disabled. When the bug in ld64 + // is fixed, we can enable this block and also enable duff's device in cmd/7g. + if false && target.IsDarwin() { + // Mach-O wants the addend to be encoded in the instruction + // Note that although Mach-O supports ARM64_RELOC_ADDEND, it + // can only encode 24-bit of signed addend, but the instructions + // supports 33-bit of signed addend, so we always encode the + // addend in place. + rr.Xadd = 0 + } + return rr, true + case objabi.R_CALLARM64, + objabi.R_ARM64_TLS_LE, + objabi.R_ARM64_TLS_IE: + rr.Xsym = rs + rr.Xadd = r.Add() + return rr, true + } + return rr, false +} + func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) { if plt.Size() == 0 { // stp x16, x30, [sp, #-16]! diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index e7c23978a6..37b72b6c37 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -50,6 +50,7 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, + Extreloc: extreloc, Elfreloc1: elfreloc1, ElfrelocSize: 24, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index d5034ae01c..26bad1b891 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -264,7 +264,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { o = int64(target.Arch.ByteOrder.Uint64(P[off:])) } var rp *loader.ExtReloc - if target.IsExternal() { + if target.IsExternal() && !target.StreamExtRelocs() { // Don't pass &rr directly to Archreloc, which will escape rr // even if this case is not taken. Instead, as Archreloc will // likely return true, we speculatively add rr to extRelocs @@ -274,12 +274,16 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } out, nExtReloc, ok := thearch.Archreloc(target, ldr, syms, r, rp, s, o) if target.IsExternal() { - if nExtReloc == 0 { - // No external relocation needed. Speculation failed. Undo the append. - extRelocs = extRelocs[:len(extRelocs)-1] + if target.StreamExtRelocs() { + extraExtReloc += nExtReloc } else { - // Account for the difference between host relocations and Go relocations. - extraExtReloc += nExtReloc - 1 + if nExtReloc == 0 { + // No external relocation needed. Speculation failed. Undo the append. + extRelocs = extRelocs[:len(extRelocs)-1] + } else { + // Account for the difference between host relocations and Go relocations. + extraExtReloc += nExtReloc - 1 + } } } needExtReloc = false // already appended @@ -638,8 +642,7 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri switch rt { default: - // TODO: handle arch-specific relocations - panic("unsupported") + return thearch.Extreloc(&target, ldr, r, s) case objabi.R_TLS_LE, objabi.R_TLS_IE: if target.IsElf() { diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index a489da02bc..e45458d262 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -239,6 +239,11 @@ type Arch struct { Asmb func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader) + // Extreloc is an arch-specific hook that converts a Go relocation to an + // external relocation. Return the external relocation and whether it is + // needed. + Extreloc func(*Target, *loader.Loader, loader.Reloc2, loader.Sym) (loader.ExtReloc, bool) + Elfreloc1 func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool ElfrelocSize uint32 // size of an ELF relocation record, must match Elfreloc1. Elfsetupplt func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 4a0bb5d381..1089d309a1 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -1045,17 +1045,25 @@ func machorelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sy if ldr.SymValue(s) >= int64(eaddr) { break } - relocs := ldr.ExtRelocs(s) + + // Compute external relocations on the go, and pass to Machoreloc1 + // to stream out. + relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At(ri) - if r.Xsym == 0 { + r := relocs.At2(ri) + rr, ok := extreloc(ctxt, ldr, s, r, ri) + if !ok { + continue + } + if rr.Xsym == 0 { ldr.Errorf(s, "missing xsym in relocation") continue } - if !ldr.AttrReachable(r.Xsym) { - ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) + 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.Machoreloc1(ctxt.Arch, out, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) { + rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} + if !thearch.Machoreloc1(ctxt.Arch, out, ldr, s, rv, 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())) } } diff --git a/src/cmd/link/internal/ld/target.go b/src/cmd/link/internal/ld/target.go index 8702db121e..d075bce17f 100644 --- a/src/cmd/link/internal/ld/target.go +++ b/src/cmd/link/internal/ld/target.go @@ -184,5 +184,5 @@ func (t *Target) IsBigEndian() bool { // Temporary helper. func (t *Target) StreamExtRelocs() bool { - return t.IsELF && (t.IsAMD64() || t.Is386()) + return (t.IsELF || t.IsDarwin()) && (t.IsAMD64() || t.Is386() || t.IsARM64()) } -- GitLab From ee8541e5b83252fd025ce0ef3f02b3abd23b80f5 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 21 Jul 2020 14:32:09 -0400 Subject: [PATCH 0108/1792] [dev.link] cmd/link: remove OutData MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OutData was used for a symbol to point to its data in the output buffer, in order to apply relocations. Now we fold relocation application to Asmb next to symbol data writing. We can just pass the output data as a local variable. Linking cmd/compile, name old time/op new time/op delta Asmb_GC 19.0ms ±10% 16.6ms ± 9% -12.50% (p=0.032 n=5+5) name old alloc/op new alloc/op delta Asmb_GC 3.78MB ± 0% 0.14MB ± 1% -96.41% (p=0.008 n=5+5) name old live-B new live-B delta Asmb_GC 27.5M ± 0% 23.9M ± 0% -13.24% (p=0.008 n=5+5) Change-Id: Id870a10dce2a0a7447a05029c6d0ab39b47d0a12 Reviewed-on: https://go-review.googlesource.com/c/go/+/244017 Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/asmb.go | 1 - src/cmd/link/internal/ld/data.go | 8 ++++---- src/cmd/link/internal/ld/link.go | 4 ++-- src/cmd/link/internal/ld/outbuf.go | 15 ++++++++------- src/cmd/link/internal/loader/loader.go | 23 ++++------------------- src/cmd/link/internal/mips/asm.go | 2 +- src/cmd/link/internal/mips64/asm.go | 11 ++++------- 7 files changed, 23 insertions(+), 41 deletions(-) diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index f3e898bec5..9316f34c2a 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -18,7 +18,6 @@ import ( // - writing out the architecture specific pieces. // This function handles the first part. func asmb(ctxt *Link) { - ctxt.loader.InitOutData() if ctxt.IsExternal() && !ctxt.StreamExtRelocs() { ctxt.loader.InitExtRelocs() } diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 26bad1b891..0bf6f53a46 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1026,9 +1026,9 @@ func writeBlock(ctxt *Link, out *OutBuf, ldr *loader.Loader, syms []loader.Sym, out.WriteStringPad("", int(val-addr), pad) addr = val } - out.WriteSym(ldr, s) - st.relocsym(s, ldr.OutData(s)) - addr += int64(len(ldr.Data(s))) + P := out.WriteSym(ldr, s) + st.relocsym(s, P) + addr += int64(len(P)) siz := ldr.SymSize(s) if addr < val+siz { out.WriteStringPad("", int(val+siz-addr), pad) @@ -2677,8 +2677,8 @@ func compressSyms(ctxt *Link, syms []loader.Sym) []byte { if relocs.Count() != 0 { relocbuf = append(relocbuf[:0], P...) P = relocbuf + st.relocsym(s, P) } - st.relocsym(s, P) if _, err := z.Write(P); err != nil { log.Fatalf("compression failed: %s", err) } diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 51ea17243f..a2c8552e94 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -159,8 +159,8 @@ func (ctxt *Link) MaxVersion() int { // Generator symbols shouldn't grow the symbol size, and might be called in // parallel in the future. // -// Generator Symbols have their Data and OutData set to the mmapped area when -// the generator is called. +// Generator Symbols have their Data set to the mmapped area when the +// generator is called. type generatorFunc func(*Link, loader.Sym) // createGeneratorSymbol is a convenience method for creating a generator diff --git a/src/cmd/link/internal/ld/outbuf.go b/src/cmd/link/internal/ld/outbuf.go index f0178288a6..d696a68088 100644 --- a/src/cmd/link/internal/ld/outbuf.go +++ b/src/cmd/link/internal/ld/outbuf.go @@ -277,23 +277,24 @@ func (out *OutBuf) WriteStringPad(s string, n int, pad []byte) { } } -// WriteSym writes the content of a Symbol, then changes the Symbol's content -// to point to the output buffer that we just wrote, so we can apply further -// edit to the symbol content. -// If the output file is not Mmap'd, just writes the content. -func (out *OutBuf) WriteSym(ldr *loader.Loader, s loader.Sym) { +// WriteSym writes the content of a Symbol, and returns the output buffer +// that we just wrote, so we can apply further edit to the symbol content. +// For generator symbols, it also sets the symbol's Data to the output +// buffer. +func (out *OutBuf) WriteSym(ldr *loader.Loader, s loader.Sym) []byte { if !ldr.IsGeneratedSym(s) { P := ldr.Data(s) n := int64(len(P)) pos, buf := out.writeLoc(n) copy(buf[pos:], P) out.off += n - ldr.SetOutData(s, buf[pos:pos+n]) + ldr.FreeData(s) + return buf[pos : pos+n] } else { n := ldr.SymSize(s) pos, buf := out.writeLoc(n) out.off += n - ldr.SetOutData(s, buf[pos:pos+n]) ldr.MakeSymbolUpdater(s).SetData(buf[pos : pos+n]) + return buf[pos : pos+n] } } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 86fdbeffd8..0a09716447 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -238,7 +238,6 @@ type Loader struct { align []uint8 // symbol 2^N alignment, indexed by global index - outdata [][]byte // symbol's data in the output buffer extRelocs [][]ExtReloc // symbol's external relocations itablink map[Sym]struct{} // itablink[j] defined if j is go.itablink.* @@ -1230,30 +1229,16 @@ func (l *Loader) Data(i Sym) []byte { return r.Data(li) } -// Returns the data of the i-th symbol in the output buffer. -func (l *Loader) OutData(i Sym) []byte { - if int(i) < len(l.outdata) && l.outdata[i] != nil { - return l.outdata[i] - } - return l.Data(i) -} - -// SetOutData sets the position of the data of the i-th symbol in the output buffer. +// 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. -func (l *Loader) SetOutData(i Sym, data []byte) { +func (l *Loader) FreeData(i Sym) { if l.IsExternal(i) { pp := l.getPayload(i) if pp != nil { - pp.data = data - return + pp.data = nil } } - l.outdata[i] = data -} - -// InitOutData initializes the slice used to store symbol output data. -func (l *Loader) InitOutData() { - l.outdata = make([][]byte, l.extStart) } // SetExtRelocs sets the external relocations of the i-th symbol. i is global index. diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 5344a72a31..b8443da4ad 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -77,7 +77,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe } func applyrel(arch *sys.Arch, ldr *loader.Loader, rt objabi.RelocType, off int32, s loader.Sym, val int64, t int64) int64 { - o := arch.ByteOrder.Uint32(ldr.OutData(s)[off:]) + o := uint32(val) switch rt { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSTLS: return int64(o&0xffff0000 | uint32(t)&0xffff) diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 73b1542c84..f4fb13f2b5 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -129,25 +129,22 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: t := ldr.SymValue(rs) + r.Add() - o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) if r.Type() == objabi.R_ADDRMIPS { - return int64(o1&0xffff0000 | uint32(t)&0xffff), noExtReloc, isOk + return int64(val&0xffff0000 | t&0xffff), noExtReloc, isOk } - return int64(o1&0xffff0000 | uint32((t+1<<15)>>16)&0xffff), noExtReloc, isOk + return int64(val&0xffff0000 | ((t+1<<15)>>16)&0xffff), noExtReloc, isOk case objabi.R_ADDRMIPSTLS: // thread pointer is at 0x7000 offset from the start of TLS data area t := ldr.SymValue(rs) + r.Add() - 0x7000 if t < -32768 || t >= 32678 { ldr.Errorf(s, "TLS offset out of range %d", t) } - o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) - return int64(o1&0xffff0000 | uint32(t)&0xffff), noExtReloc, isOk + return int64(val&0xffff0000 | t&0xffff), noExtReloc, isOk case objabi.R_CALLMIPS, objabi.R_JMPMIPS: // Low 26 bits = (S + A) >> 2 t := ldr.SymValue(rs) + r.Add() - o1 := target.Arch.ByteOrder.Uint32(ldr.OutData(s)[r.Off():]) - return int64(o1&0xfc000000 | uint32(t>>2)&^0xfc000000), noExtReloc, isOk + return int64(val&0xfc000000 | (t>>2)&^0xfc000000), noExtReloc, isOk } return val, 0, false -- GitLab From ea708dc94cf35ce73f66de9c05fee66d30615c4d Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 21 Jul 2020 17:59:48 -0400 Subject: [PATCH 0109/1792] [dev.link] cmd/link: avoid reading symbol Data in archreloc on ARM64 The previous CL changed it to drop the Data when writing out a symbol. Don't read the data. Fix ARM64 build. Change-Id: I121e9b0ebef123dbbc4ddffc02bf1a42788532f4 Reviewed-on: https://go-review.googlesource.com/c/go/+/244038 Reviewed-by: Jeremy Faller Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/link/internal/arm64/asm.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 093aadb343..ef375a5db4 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -605,8 +605,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return val | ((t >> 2) & 0x03ffffff), noExtReloc, true case objabi.R_ARM64_GOT: - sData := ldr.Data(s) - if sData[r.Off()+3]&0x9f == 0x90 { + if (val>>24)&0x9f == 0x90 { // R_AARCH64_ADR_GOT_PAGE // patch instruction: adrp t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) @@ -616,7 +615,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade var o0 uint32 o0 |= (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) return val | int64(o0), noExtReloc, isOk - } else if sData[r.Off()+3] == 0xf9 { + } else if val>>24 == 0xf9 { // R_AARCH64_LD64_GOT_LO12_NC // patch instruction: ldr t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) @@ -627,12 +626,11 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade o1 |= uint32(t&0xfff) << (10 - 3) return val | int64(uint64(o1)), noExtReloc, isOk } else { - ldr.Errorf(s, "unsupported instruction for %v R_GOTARM64", sData[r.Off():r.Off()+4]) + ldr.Errorf(s, "unsupported instruction for %x R_GOTARM64", val) } case objabi.R_ARM64_PCREL: - sData := ldr.Data(s) - if sData[r.Off()+3]&0x9f == 0x90 { + if (val>>24)&0x9f == 0x90 { // R_AARCH64_ADR_PREL_PG_HI21 // patch instruction: adrp t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) @@ -641,14 +639,14 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade } o0 := (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5) return val | int64(o0), noExtReloc, isOk - } else if sData[r.Off()+3]&0x91 == 0x91 { + } else if (val>>24)&0x91 == 0x91 { // R_AARCH64_ADD_ABS_LO12_NC // patch instruction: add t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff) o1 := uint32(t&0xfff) << 10 return val | int64(o1), noExtReloc, isOk } else { - ldr.Errorf(s, "unsupported instruction for %v R_PCRELARM64", sData[r.Off():r.Off()+4]) + ldr.Errorf(s, "unsupported instruction for %x R_PCRELARM64", val) } case objabi.R_ARM64_LDST8: -- GitLab From ed6b8af50923cd4f13aed2c9aa5791699ef971fa Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 21 Jul 2020 19:14:18 -0400 Subject: [PATCH 0110/1792] [dev.link] cmd/link: stream external relocations on MIPS (32/64) Change-Id: I47fbeb3a49754395dceff51af371638fd43350ff Reviewed-on: https://go-review.googlesource.com/c/go/+/244097 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/target.go | 3 +- src/cmd/link/internal/mips/asm.go | 38 +++++++++++++++++------- src/cmd/link/internal/mips/obj.go | 1 + src/cmd/link/internal/mips64/asm.go | 46 +++++++++++++++++++---------- src/cmd/link/internal/mips64/obj.go | 1 + 5 files changed, 61 insertions(+), 28 deletions(-) diff --git a/src/cmd/link/internal/ld/target.go b/src/cmd/link/internal/ld/target.go index d075bce17f..9f0aab3d6c 100644 --- a/src/cmd/link/internal/ld/target.go +++ b/src/cmd/link/internal/ld/target.go @@ -184,5 +184,6 @@ func (t *Target) IsBigEndian() bool { // Temporary helper. func (t *Target) StreamExtRelocs() bool { - return (t.IsELF || t.IsDarwin()) && (t.IsAMD64() || t.Is386() || t.IsARM64()) + return (t.IsELF || t.IsDarwin()) && + (t.IsAMD64() || t.Is386() || t.IsARM64() || t.IsMIPS() || t.IsMIPS64()) } diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index b8443da4ad..558027d819 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -100,19 +100,12 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: // set up addend for eventual relocation via outer symbol. - rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) - } - rr.Xsym = rs - return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), 1, true + _, off := ld.FoldSubSymbolOffset(ldr, rs) + xadd := r.Add() + off + return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, xadd), 1, true case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - rr.Xsym = rs - rr.Xadd = r.Add() - return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, rr.Xadd), 1, true + return applyrel(target.Arch, ldr, r.Type(), r.Off(), s, val, r.Add()), 1, true } } @@ -150,3 +143,26 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { return -1 } + +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { + rs := ldr.ResolveABIAlias(r.Sym()) + var rr loader.ExtReloc + switch r.Type() { + case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: + // set up addend for eventual relocation via outer symbol. + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) + } + rr.Xsym = rs + return rr, true + + case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: + rr.Xsym = rs + rr.Xadd = r.Add() + return rr, true + } + return rr, false +} diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index e59c382bfa..f20597c0f5 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -52,6 +52,7 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, + Extreloc: extreloc, Elfreloc1: elfreloc1, ElfrelocSize: 8, Elfsetupplt: elfsetupplt, diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index f4fb13f2b5..8b7342d4f2 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -95,36 +95,24 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe } func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { - rs := r.Sym() - rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { switch r.Type() { default: return val, 0, false case objabi.R_ADDRMIPS, - objabi.R_ADDRMIPSU: - // set up addend for eventual relocation via outer symbol. - rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) - } - rr.Xsym = rs - return val, 1, true - - case objabi.R_ADDRMIPSTLS, + objabi.R_ADDRMIPSU, + objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - rr.Xsym = rs - rr.Xadd = r.Add() return val, 1, true } } const isOk = true const noExtReloc = 0 + rs := r.Sym() + rs = ldr.ResolveABIAlias(rs) switch r.Type() { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: @@ -153,3 +141,29 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { return -1 } + +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { + rs := ldr.ResolveABIAlias(r.Sym()) + var rr loader.ExtReloc + switch r.Type() { + case objabi.R_ADDRMIPS, + objabi.R_ADDRMIPSU: + // set up addend for eventual relocation via outer symbol. + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) + } + rr.Xsym = rs + return rr, true + + case objabi.R_ADDRMIPSTLS, + objabi.R_CALLMIPS, + objabi.R_JMPMIPS: + rr.Xsym = rs + rr.Xadd = r.Add() + return rr, true + } + return rr, false +} diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index 6ef27cedb9..d2dc20f5c1 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -51,6 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, + Extreloc: extreloc, Elfreloc1: elfreloc1, ElfrelocSize: 24, Elfsetupplt: elfsetupplt, -- GitLab From 71e2133304f634974ef00560a4e661bfc219f207 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 22 Jul 2020 11:42:13 -0400 Subject: [PATCH 0111/1792] [dev.link] cmd/link: stream external relocations on S390X All the bits are there. Just need to enable it. Change-Id: I12ee25317c6385838493dadc900fb57c3b49a416 Reviewed-on: https://go-review.googlesource.com/c/go/+/244277 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/target.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/target.go b/src/cmd/link/internal/ld/target.go index 9f0aab3d6c..40e53d4c9d 100644 --- a/src/cmd/link/internal/ld/target.go +++ b/src/cmd/link/internal/ld/target.go @@ -185,5 +185,5 @@ func (t *Target) IsBigEndian() bool { // Temporary helper. func (t *Target) StreamExtRelocs() bool { return (t.IsELF || t.IsDarwin()) && - (t.IsAMD64() || t.Is386() || t.IsARM64() || t.IsMIPS() || t.IsMIPS64()) + (t.IsAMD64() || t.Is386() || t.IsARM64() || t.IsMIPS() || t.IsMIPS64() || t.IsS390X()) } -- GitLab From e4a3e57f47b498bf81b56a6d2f1589e28dd122c9 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 22 Jul 2020 12:56:49 -0400 Subject: [PATCH 0112/1792] [dev.link] cmd/link: stream external relocations on ARM and on Windows Do them in the same CL so ARM's archreloc doesn't need to support both streaming and non-streaming. TODO: we haven't switched to using mmap to emit external relocations on Windows. Change-Id: Ica2ee89c03fc74839efd6b9e26c80585fcdce45c Reviewed-on: https://go-review.googlesource.com/c/go/+/244357 Run-TryBot: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/link/internal/arm/asm.go | 38 ++++++++++++++++++------------ src/cmd/link/internal/arm/obj.go | 1 + src/cmd/link/internal/ld/pe.go | 19 ++++++++++----- src/cmd/link/internal/ld/target.go | 4 ++-- 4 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 64e06b33aa..8aaeb38ced 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -535,23 +535,13 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade switch r.Type() { case objabi.R_CALLARM: // set up addend for eventual relocation via outer symbol. - rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = int64(signext24(r.Add() & 0xffffff)) - rr.Xadd *= 4 - rr.Xadd += off - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) + _, off := ld.FoldSubSymbolOffset(ldr, rs) + xadd := int64(signext24(r.Add()&0xffffff))*4 + off + if xadd/4 > 0x7fffff || xadd/4 < -0x800000 { + ldr.Errorf(s, "direct call too far %d", xadd/4) } - rr.Xsym = rs - - if rr.Xadd/4 > 0x7fffff || rr.Xadd/4 < -0x800000 { - ldr.Errorf(s, "direct call too far %d", rr.Xadd/4) - } - - return int64(braddoff(int32(0xff000000&uint32(r.Add())), int32(0xffffff&uint32(rr.Xadd/4)))), 1, true + return int64(braddoff(int32(0xff000000&uint32(r.Add())), int32(0xffffff&uint32(xadd/4)))), 1, true } - return -1, 0, false } @@ -587,6 +577,24 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian return -1 } +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { + rs := ldr.ResolveABIAlias(r.Sym()) + var rr loader.ExtReloc + switch r.Type() { + case objabi.R_CALLARM: + // set up addend for eventual relocation via outer symbol. + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = int64(signext24(r.Add()&0xffffff))*4 + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) + } + rr.Xsym = rs + return rr, true + } + return rr, false +} + func addpltreloc(ldr *loader.Loader, plt *loader.SymbolBuilder, got *loader.SymbolBuilder, s loader.Sym, typ objabi.RelocType) { r, _ := plt.AddRel(typ) r.SetSym(got.Sym()) diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index f25f735b0b..fed8dce4de 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -52,6 +52,7 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, + Extreloc: extreloc, Trampoline: trampoline, Elfreloc1: elfreloc1, ElfrelocSize: 8, diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 9a76b3a775..38b99fabbe 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -517,17 +517,24 @@ func (f *peFile) emitRelocations(ctxt *Link) { if ldr.SymValue(s) >= int64(eaddr) { break } - relocs := ldr.ExtRelocs(s) + // Compute external relocations on the go, and pass to PEreloc1 + // to stream out. + relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At(ri) - if r.Xsym == 0 { + r := relocs.At2(ri) + rr, ok := extreloc(ctxt, ldr, s, r, ri) + if !ok { + continue + } + if rr.Xsym == 0 { ctxt.Errorf(s, "missing xsym in relocation") continue } - if ldr.SymDynid(r.Xsym) < 0 { - ctxt.Errorf(s, "reloc %d to non-coff symbol %s (outer=%s) %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym())) + if ldr.SymDynid(rr.Xsym) < 0 { + ctxt.Errorf(s, "reloc %d to non-coff symbol %s (outer=%s) %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(rr.Xsym), ldr.SymType(r.Sym())) } - if !thearch.PEreloc1(ctxt.Arch, ctxt.Out, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { + rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} + if !thearch.PEreloc1(ctxt.Arch, ctxt.Out, ldr, s, rv, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { ctxt.Errorf(s, "unsupported obj reloc %d/%d to %s", r.Type(), r.Siz(), ldr.SymName(r.Sym())) } nrelocs++ diff --git a/src/cmd/link/internal/ld/target.go b/src/cmd/link/internal/ld/target.go index 40e53d4c9d..2dafe9bb1f 100644 --- a/src/cmd/link/internal/ld/target.go +++ b/src/cmd/link/internal/ld/target.go @@ -184,6 +184,6 @@ func (t *Target) IsBigEndian() bool { // Temporary helper. func (t *Target) StreamExtRelocs() bool { - return (t.IsELF || t.IsDarwin()) && - (t.IsAMD64() || t.Is386() || t.IsARM64() || t.IsMIPS() || t.IsMIPS64() || t.IsS390X()) + return (t.IsELF || t.IsDarwin() || t.IsWindows()) && + (t.IsAMD64() || t.Is386() || t.IsARM() || t.IsARM64() || t.IsMIPS() || t.IsMIPS64() || t.IsS390X()) } -- GitLab From 9d223256811d0f7e9d96f0530286249a161cdf28 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 22 Jul 2020 13:30:49 -0400 Subject: [PATCH 0113/1792] [dev.link] cmd/link: stream external relocations on PPC64 Both ELF and Xcoff. Now we support streaming on all platforms. Later CLs will clean up the old code. Change-Id: Ieeef7844a3e229429983a8bc108d7f3fabf618e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/244358 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/target.go | 3 +- src/cmd/link/internal/ld/xcoff.go | 21 ++++++++----- src/cmd/link/internal/ppc64/asm.go | 47 ++++++++++++++++++++---------- src/cmd/link/internal/ppc64/obj.go | 1 + 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/src/cmd/link/internal/ld/target.go b/src/cmd/link/internal/ld/target.go index 2dafe9bb1f..ffe7c52617 100644 --- a/src/cmd/link/internal/ld/target.go +++ b/src/cmd/link/internal/ld/target.go @@ -184,6 +184,5 @@ func (t *Target) IsBigEndian() bool { // Temporary helper. func (t *Target) StreamExtRelocs() bool { - return (t.IsELF || t.IsDarwin() || t.IsWindows()) && - (t.IsAMD64() || t.Is386() || t.IsARM() || t.IsARM64() || t.IsMIPS() || t.IsMIPS64() || t.IsS390X()) + return true } diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 9e3b8e2a0c..3d1677e278 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1695,27 +1695,32 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { break } + // Compute external relocations on the go, and pass to Xcoffreloc1 to stream out. // Relocation must be ordered by address, so create a list of sorted indices. - relocs := ldr.ExtRelocs(s) + relocs := ldr.Relocs(s) sorted := make([]int, relocs.Count()) for i := 0; i < relocs.Count(); i++ { sorted[i] = i } sort.Slice(sorted, func(i, j int) bool { - return relocs.At(sorted[i]).Off() < relocs.At(sorted[j]).Off() + return relocs.At2(sorted[i]).Off() < relocs.At2(sorted[j]).Off() }) for _, ri := range sorted { - r := relocs.At(ri) - - if r.Xsym == 0 { + r := relocs.At2(ri) + rr, ok := extreloc(ctxt, ldr, s, r, ri) + if !ok { + continue + } + if rr.Xsym == 0 { ldr.Errorf(s, "missing xsym in relocation") continue } - if ldr.SymDynid(r.Xsym) < 0 { - ldr.Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymDynid(r.Xsym)) + if ldr.SymDynid(rr.Xsym) < 0 { + ldr.Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(rr.Xsym), ldr.SymType(r.Sym()), ldr.SymDynid(rr.Xsym)) } - if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, ldr, s, r, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { + rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} + if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, ldr, s, rv, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { ldr.Errorf(s, "unsupported obj reloc %d(%s)/%d to %s", r.Type(), r.Type(), r.Siz(), ldr.SymName(r.Sym())) } } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 7dca8703a8..1daed8ac44 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -804,7 +804,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade // value with the current addresses. switch rt := r.Type(); rt { default: - if target.IsAIX() { + if !target.IsAIX() { return val, nExtReloc, false } case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE: @@ -813,8 +813,6 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade if rt == objabi.R_POWER_TLS_IE { nExtReloc = 2 // need two ELF relocations, see elfreloc1 } - rr.Xadd = r.Add() - rr.Xsym = rs return val, nExtReloc, true case objabi.R_ADDRPOWER, objabi.R_ADDRPOWER_DS, @@ -823,23 +821,11 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade objabi.R_ADDRPOWER_GOT, objabi.R_ADDRPOWER_PCREL: nExtReloc = 2 // need two ELF relocations, see elfreloc1 - - // set up addend for eventual relocation via outer symbol. - rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) - } - rr.Xsym = rs - if !target.IsAIX() { return val, nExtReloc, true } case objabi.R_CALLPOWER: nExtReloc = 1 - rr.Xsym = rs - rr.Xadd = r.Add() if !target.IsAIX() { return val, nExtReloc, true } @@ -980,6 +966,37 @@ overflow: return t } +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { + rs := ldr.ResolveABIAlias(r.Sym()) + var rr loader.ExtReloc + switch r.Type() { + case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE: + rr.Xadd = r.Add() + rr.Xsym = rs + return rr, true + case objabi.R_ADDRPOWER, + objabi.R_ADDRPOWER_DS, + objabi.R_ADDRPOWER_TOCREL, + objabi.R_ADDRPOWER_TOCREL_DS, + objabi.R_ADDRPOWER_GOT, + objabi.R_ADDRPOWER_PCREL: + // set up addend for eventual relocation via outer symbol. + rs, off := ld.FoldSubSymbolOffset(ldr, rs) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) + } + rr.Xsym = rs + return rr, true + case objabi.R_CALLPOWER: + rr.Xsym = rs + rr.Xadd = r.Add() + return rr, true + } + return rr, false +} + func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) { if ldr.SymPlt(s) >= 0 { return diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index 31823444dd..ef4393f489 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -54,6 +54,7 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, + Extreloc: extreloc, Elfreloc1: elfreloc1, ElfrelocSize: 24, Elfsetupplt: elfsetupplt, -- GitLab From 4b3cfcee5877b55049948c8e2c393d5a3ae39466 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 24 Jul 2020 01:33:15 -0400 Subject: [PATCH 0114/1792] [dev.link] cmd/link: remove non-streaming external relocation code Now we support streaming external relocations everywhere. Change-Id: I8d107c8239fe979bd5410e6a7f3fe471ac3e8b35 Reviewed-on: https://go-review.googlesource.com/c/go/+/244764 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/amd64/asm.go | 2 +- src/cmd/link/internal/arm/asm.go | 2 +- src/cmd/link/internal/arm64/asm.go | 2 +- src/cmd/link/internal/ld/asmb.go | 4 - src/cmd/link/internal/ld/data.go | 169 ++++--------------------- src/cmd/link/internal/ld/elf.go | 65 ++++------ src/cmd/link/internal/ld/lib.go | 4 +- src/cmd/link/internal/ld/target.go | 5 - src/cmd/link/internal/loader/loader.go | 30 ----- src/cmd/link/internal/mips/asm.go | 2 +- src/cmd/link/internal/mips64/asm.go | 2 +- src/cmd/link/internal/ppc64/asm.go | 2 +- src/cmd/link/internal/riscv64/asm.go | 2 +- src/cmd/link/internal/s390x/asm.go | 2 +- src/cmd/link/internal/x86/asm.go | 2 +- 15 files changed, 59 insertions(+), 236 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index a29e588f88..bd41e0f781 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -550,7 +550,7 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, int, bool) { +func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, loader.Sym, int64) (int64, int, bool) { return -1, 0, false } diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 8aaeb38ced..35b2c4ba33 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -528,7 +528,7 @@ func gentrampdyn(arch *sys.Arch, tramp *loader.SymbolBuilder, target loader.Sym, tramp.AddReloc(r) } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index ef375a5db4..e7be4e639d 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -441,7 +441,7 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy return true } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (int64, int, bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (int64, int, bool) { const noExtReloc = 0 const isOk = true diff --git a/src/cmd/link/internal/ld/asmb.go b/src/cmd/link/internal/ld/asmb.go index 9316f34c2a..fda0439455 100644 --- a/src/cmd/link/internal/ld/asmb.go +++ b/src/cmd/link/internal/ld/asmb.go @@ -18,10 +18,6 @@ import ( // - writing out the architecture specific pieces. // This function handles the first part. func asmb(ctxt *Link) { - if ctxt.IsExternal() && !ctxt.StreamExtRelocs() { - ctxt.loader.InitExtRelocs() - } - // TODO(jfaller): delete me. if thearch.Asmb != nil { thearch.Asmb(ctxt, ctxt.loader) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 0bf6f53a46..f06aa422d9 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -158,17 +158,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } target := st.target syms := st.syms - var extRelocs []loader.ExtReloc - if target.IsExternal() && !target.StreamExtRelocs() { - // preallocate a slice conservatively assuming that all - // relocs will require an external reloc - extRelocs = st.preallocExtRelocSlice(relocs.Count()) - } - // Extra external host relocations (e.g. ELF relocations). - // This is the difference between number of host relocations - // and number of Go relocations, as one Go relocation may turn - // into multiple host relocations. - extraExtReloc := 0 + nExtReloc := 0 // number of external relocations for ri := 0; ri < relocs.Count(); ri++ { r := relocs.At2(ri) off := r.Off() @@ -226,12 +216,6 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { st.err.Errorf(s, "unreachable sym in relocation: %s", ldr.SymName(rs)) } - var rr loader.ExtReloc - needExtReloc := false // will set to true below in case it is needed - if target.IsExternal() { - rr.Idx = ri - } - var rv sym.RelocVariant if target.IsPPC64() || target.IsS390X() { rv = ldr.RelocVariant(s, ri) @@ -263,30 +247,10 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { case 8: o = int64(target.Arch.ByteOrder.Uint64(P[off:])) } - var rp *loader.ExtReloc - if target.IsExternal() && !target.StreamExtRelocs() { - // Don't pass &rr directly to Archreloc, which will escape rr - // even if this case is not taken. Instead, as Archreloc will - // likely return true, we speculatively add rr to extRelocs - // and use that space to pass to Archreloc. - extRelocs = append(extRelocs, rr) - rp = &extRelocs[len(extRelocs)-1] - } - out, nExtReloc, ok := thearch.Archreloc(target, ldr, syms, r, rp, s, o) + out, n, ok := thearch.Archreloc(target, ldr, syms, r, s, o) if target.IsExternal() { - if target.StreamExtRelocs() { - extraExtReloc += nExtReloc - } else { - if nExtReloc == 0 { - // No external relocation needed. Speculation failed. Undo the append. - extRelocs = extRelocs[:len(extRelocs)-1] - } else { - // Account for the difference between host relocations and Go relocations. - extraExtReloc += nExtReloc - 1 - } - } + nExtReloc += n } - needExtReloc = false // already appended if ok { o = out } else { @@ -294,12 +258,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } case objabi.R_TLS_LE: if target.IsExternal() && target.IsElf() { - needExtReloc = true - rr.Xsym = rs - if rr.Xsym == 0 { - rr.Xsym = syms.Tlsg - } - rr.Xadd = r.Add() + nExtReloc++ o = 0 if !target.IsAMD64() { o = r.Add() @@ -325,18 +284,13 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } case objabi.R_TLS_IE: if target.IsExternal() && target.IsElf() { - needExtReloc = true - rr.Xsym = rs - if rr.Xsym == 0 { - rr.Xsym = syms.Tlsg - } - rr.Xadd = r.Add() + nExtReloc++ o = 0 if !target.IsAMD64() { o = r.Add() } if target.Is386() { - extraExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1 + nExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1 } break } @@ -353,19 +307,18 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } case objabi.R_ADDR: if target.IsExternal() { - needExtReloc = true + nExtReloc++ // set up addend for eventual relocation via outer symbol. rs := rs rs, off := FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off + xadd := r.Add() + off rst := ldr.SymType(rs) if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { st.err.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs)) } - rr.Xsym = rs - o = rr.Xadd + o = xadd if target.IsElf() { if target.IsAMD64() { o = 0 @@ -377,7 +330,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } else if target.IsWindows() { // nothing to do } else if target.IsAIX() { - o = ldr.SymValue(rs) + rr.Xadd + o = ldr.SymValue(rs) + xadd } else { st.err.Errorf(s, "unhandled pcrel relocation to %s on %v", ldr.SymName(rs), target.HeadType) } @@ -417,21 +370,18 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } if target.IsExternal() { - needExtReloc = true - // On most platforms, the external linker needs to adjust DWARF references // as it combines DWARF sections. However, on Darwin, dsymutil does the // DWARF linking, and it understands how to follow section offsets. // Leaving in the relocation records confuses it (see // https://golang.org/issue/22068) so drop them for Darwin. - if target.IsDarwin() { - needExtReloc = false + if !target.IsDarwin() { + nExtReloc++ } - rr.Xsym = loader.Sym(ldr.SymSect(rs).Sym) - rr.Xadd = r.Add() + ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr) + xadd := r.Add() + ldr.SymValue(rs) - int64(ldr.SymSect(rs).Vaddr) - o = rr.Xadd + o = xadd if target.IsElf() && target.IsAMD64() { o = 0 } @@ -460,46 +410,34 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // r.Sym() can be 0 when CALL $(constant) is transformed from absolute PC to relative PC call. case objabi.R_GOTPCREL: if target.IsDynlinkingGo() && target.IsDarwin() && rs != 0 { - needExtReloc = true - rr.Xadd = r.Add() - rr.Xadd -= int64(siz) // relative to address after the relocated chunk - rr.Xsym = rs - - o = rr.Xadd - o += int64(siz) + nExtReloc++ + o = r.Add() break } if target.Is386() && target.IsExternal() && target.IsELF { - extraExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1 + nExtReloc++ // need two ELF relocations on 386, see ../x86/asm.go:elfreloc1 } fallthrough case objabi.R_CALL, objabi.R_PCREL: if target.IsExternal() && rs != 0 && rst == sym.SUNDEFEXT { // pass through to the external linker. - needExtReloc = true - rr.Xadd = 0 - if target.IsElf() { - rr.Xadd -= int64(siz) - } - rr.Xsym = rs + nExtReloc++ o = 0 break } if target.IsExternal() && rs != 0 && (ldr.SymSect(rs) != ldr.SymSect(s) || rt == objabi.R_GOTPCREL) { - needExtReloc = true + nExtReloc++ // set up addend for eventual relocation via outer symbol. rs := rs rs, off := FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off - rr.Xadd -= int64(siz) // relative to address after the relocated chunk + xadd := r.Add() + off - int64(siz) // relative to address after the relocated chunk rst := ldr.SymType(rs) if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { st.err.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs)) } - rr.Xsym = rs - o = rr.Xadd + o = xadd if target.IsElf() { if target.IsAMD64() { o = 0 @@ -547,10 +485,8 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { if !target.IsExternal() { st.err.Errorf(s, "find XCOFF R_REF with internal linking") } - needExtReloc = true - rr.Xsym = rs - rr.Xadd = r.Add() - goto addExtReloc + nExtReloc++ + continue case objabi.R_DWARFFILEREF: // We don't renumber files in dwarf.go:writelines anymore. @@ -593,26 +529,11 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { case 8: target.Arch.ByteOrder.PutUint64(P[off:], uint64(o)) } - - addExtReloc: - if needExtReloc { - if target.StreamExtRelocs() { - extraExtReloc++ - } else { - extRelocs = append(extRelocs, rr) - } - } } - if target.IsExternal() && target.StreamExtRelocs() { - // On AMD64 ELF, we'll stream out the external relocations in elfrelocsect + if target.IsExternal() { + // We'll stream out the external relocations in asmb2 (e.g. elfrelocsect) // and we only need the count here. - // TODO: just count, but not compute the external relocations. For now it - // is still needed on other platforms, and this keeps the code simple. - atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(extraExtReloc)) - } else if len(extRelocs) != 0 { - st.finalizeExtRelocSlice(extRelocs) - ldr.SetExtRelocs(s, extRelocs) - atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(len(extRelocs)+extraExtReloc)) + atomic.AddUint32(&ldr.SymSect(s).Relcount, uint32(nExtReloc)) } } @@ -661,10 +582,6 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri rs := ldr.ResolveABIAlias(r.Sym()) rs, off := FoldSubSymbolOffset(ldr, rs) rr.Xadd = r.Add() + off - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs)) - } rr.Xsym = rs case objabi.R_DWARFSECREF: @@ -704,10 +621,6 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri rs, off := FoldSubSymbolOffset(ldr, rs) rr.Xadd = r.Add() + off rr.Xadd -= int64(siz) // relative to address after the relocated chunk - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for relocation target %s", ldr.SymName(rs)) - } rr.Xsym = rs break } @@ -726,8 +639,6 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri return rr, true } -const extRelocSlabSize = 2048 - // relocSymState hold state information needed when making a series of // successive calls to relocsym(). The items here are invariant // (meaning that they are set up once initially and then don't change @@ -740,34 +651,6 @@ type relocSymState struct { ldr *loader.Loader err *ErrorReporter syms *ArchSyms - batch []loader.ExtReloc -} - -// preallocExtRelocs returns a subslice from an internally allocated -// slab owned by the state object. Client requests a slice of size -// 'sz', however it may be that fewer relocs are needed; the -// assumption is that the final size is set in a [required] subsequent -// call to 'finalizeExtRelocSlice'. -func (st *relocSymState) preallocExtRelocSlice(sz int) []loader.ExtReloc { - if len(st.batch) < sz { - slabSize := extRelocSlabSize - if sz > extRelocSlabSize { - slabSize = sz - } - st.batch = make([]loader.ExtReloc, slabSize) - } - rval := st.batch[:sz:sz] - return rval[:0] -} - -// finalizeExtRelocSlice takes a slice returned from preallocExtRelocSlice, -// from which it determines how many of the pre-allocated relocs were -// actually needed; it then carves that number off the batch slice. -func (st *relocSymState) finalizeExtRelocSlice(finalsl []loader.ExtReloc) { - if &st.batch[0] != &finalsl[0] { - panic("preallocExtRelocSlice size invariant violation") - } - st.batch = st.batch[len(finalsl):] } // makeRelocSymState creates a relocSymState container object to diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 6a531cb333..5b5e01bf48 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1372,50 +1372,29 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) break } - if ctxt.StreamExtRelocs() { - // Compute external relocations on the go, and pass to Elfreloc1 - // to stream out. - relocs := ldr.Relocs(s) - for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) - rr, ok := extreloc(ctxt, ldr, s, r, ri) - if !ok { - continue - } - if rr.Xsym == 0 { - ldr.Errorf(s, "missing xsym in relocation") - continue - } - esr := ElfSymForReloc(ctxt, rr.Xsym) - if esr == 0 { - ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(rr.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) - } - 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)) - } - rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} - if !thearch.Elfreloc1(ctxt, out, ldr, s, rv, 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())) - } + // Compute external relocations on the go, and pass to Elfreloc1 + // to stream out. + relocs := ldr.Relocs(s) + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At2(ri) + rr, ok := extreloc(ctxt, ldr, s, r, ri) + if !ok { + continue } - } else { - relocs := ldr.ExtRelocs(s) - for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At(ri) - if r.Xsym == 0 { - ldr.Errorf(s, "missing xsym in relocation") - continue - } - esr := ElfSymForReloc(ctxt, r.Xsym) - if esr == 0 { - ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(r.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) - } - if !ldr.AttrReachable(r.Xsym) { - ldr.Errorf(s, "unreachable reloc %d (%s) target %v", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Xsym)) - } - if !thearch.Elfreloc1(ctxt, out, ldr, s, r, 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())) - } + if rr.Xsym == 0 { + ldr.Errorf(s, "missing xsym in relocation") + continue + } + esr := ElfSymForReloc(ctxt, rr.Xsym) + if esr == 0 { + ldr.Errorf(s, "reloc %d (%s) to non-elf symbol %s (outer=%s) %d (%s)", r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymName(r.Sym()), ldr.SymName(rr.Xsym), ldr.SymType(r.Sym()), ldr.SymType(r.Sym()).String()) + } + 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)) + } + rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} + if !thearch.Elfreloc1(ctxt, out, ldr, s, rv, 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())) } } } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index e45458d262..5c0f4eb0c4 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -212,8 +212,8 @@ type Arch struct { // ELF/Mach-O/etc. relocations, not Go relocations, this must match Elfreloc1, // etc.), and a boolean indicating success/failure (a failing value indicates // a fatal error). - Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, *loader.ExtReloc, - loader.Sym, int64) (relocatedOffset int64, nExtReloc int, ok bool) + Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, loader.Sym, + int64) (relocatedOffset int64, nExtReloc int, ok bool) // Archrelocvariant is a second arch-specific hook used for // relocation processing; it handles relocations where r.Type is // insufficient to describe the relocation (r.Variant != diff --git a/src/cmd/link/internal/ld/target.go b/src/cmd/link/internal/ld/target.go index ffe7c52617..102b6c5436 100644 --- a/src/cmd/link/internal/ld/target.go +++ b/src/cmd/link/internal/ld/target.go @@ -181,8 +181,3 @@ func (t *Target) mustSetHeadType() { func (t *Target) IsBigEndian() bool { return t.Arch.ByteOrder == binary.BigEndian } - -// Temporary helper. -func (t *Target) StreamExtRelocs() bool { - return true -} diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 0a09716447..2ecde037a3 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -238,8 +238,6 @@ type Loader struct { align []uint8 // symbol 2^N alignment, indexed by global index - extRelocs [][]ExtReloc // symbol's external relocations - itablink map[Sym]struct{} // itablink[j] defined if j is go.itablink.* deferReturnTramp map[Sym]bool // whether the symbol is a trampoline of a deferreturn call @@ -1241,16 +1239,6 @@ func (l *Loader) FreeData(i Sym) { } } -// SetExtRelocs sets the external relocations of the i-th symbol. i is global index. -func (l *Loader) SetExtRelocs(i Sym, relocs []ExtReloc) { - l.extRelocs[i] = relocs -} - -// InitExtRelocs initialize the slice used to store external relocations. -func (l *Loader) InitExtRelocs() { - l.extRelocs = make([][]ExtReloc, l.NSym()) -} - // SymAlign returns the alignment for a symbol. func (l *Loader) SymAlign(i Sym) int32 { if int(i) >= len(l.align) { @@ -1878,24 +1866,6 @@ func (l *Loader) relocs(r *oReader, li uint32) Relocs { } } -// ExtRelocs returns the external relocations of the i-th symbol. -func (l *Loader) ExtRelocs(i Sym) ExtRelocs { - return ExtRelocs{l.Relocs(i), l.extRelocs[i]} -} - -// ExtRelocs represents the set of external relocations of a symbol. -type ExtRelocs struct { - rs Relocs - es []ExtReloc -} - -func (ers ExtRelocs) Count() int { return len(ers.es) } - -func (ers ExtRelocs) At(j int) ExtRelocView { - i := ers.es[j].Idx - return ExtRelocView{ers.rs.At2(i), ers.es[j]} -} - // RelocByOff implements sort.Interface for sorting relocations by offset. type RelocByOff []Reloc diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 558027d819..71cd7681fb 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -90,7 +90,7 @@ func applyrel(arch *sys.Arch, ldr *loader.Loader, rt objabi.RelocType, off int32 } } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 8b7342d4f2..8b9a7e5c69 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -94,7 +94,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { if target.IsExternal() { switch r.Type() { default: diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 1daed8ac44..23cacb32ad 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -797,7 +797,7 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta tramp.SetData(P) } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (relocatedOffset int64, nExtReloc int, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (relocatedOffset int64, nExtReloc int, ok bool) { rs := ldr.ResolveABIAlias(r.Sym()) if target.IsExternal() { // On AIX, relocations (except TLS ones) must be also done to the diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index 991e0b9556..b72fa44e69 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -32,7 +32,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { rs := r.Sym() rs = ldr.ResolveABIAlias(rs) switch r.Type() { diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 00f946e704..8a89f9073e 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -367,7 +367,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, rr *loader.ExtReloc, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { return val, 0, false } diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 4d59261db9..89929a8024 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -411,7 +411,7 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, *loader.ExtReloc, loader.Sym, int64) (int64, int, bool) { +func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, loader.Sym, int64) (int64, int, bool) { return -1, 0, false } -- GitLab From 2369e01234d97e85e9919ef7d30bc0f8f4111f69 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 28 Jul 2020 13:33:47 -0400 Subject: [PATCH 0115/1792] [dev.link] cmd/link: fix accidental escape in extreloc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We accidentally passed the address of a local to a function pointer, where we should pass the address of a global. Linking cmd/compile with external linking: Asmb2_GC 32.5ms ± 5% 21.6ms ± 3% -33.57% (p=0.016 n=5+4) Asmb2_GC 29.2MB ± 0% 6.4MB ± 0% -78.20% (p=0.008 n=5+5) Asmb2_GC 1.43M ± 0% 0.00M ± 4% -99.98% (p=0.008 n=5+5) Change-Id: I4754189bcc20f824627d95858ba35285d53c614d Reviewed-on: https://go-review.googlesource.com/c/go/+/245337 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/data.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index f06aa422d9..2a3d6e7fe7 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -540,7 +540,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { // Convert a Go relocation to an external relocation. func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri int) (loader.ExtReloc, bool) { var rr loader.ExtReloc - target := ctxt.Target + target := &ctxt.Target siz := int32(r.Siz()) if siz == 0 { // informational relocation - no work to do return rr, false @@ -563,7 +563,7 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri switch rt { default: - return thearch.Extreloc(&target, ldr, r, s) + return thearch.Extreloc(target, ldr, r, s) case objabi.R_TLS_LE, objabi.R_TLS_IE: if target.IsElf() { -- GitLab From 880f43c87f1ed20dbd021fc7cbd946b3f3a5b6e5 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 28 Jul 2020 20:23:16 -0400 Subject: [PATCH 0116/1792] [dev.link] cmd/link: move arch-specific extreloc to common code Change-Id: Ia833818862b277ac83266919f39e5c25faac895e Reviewed-on: https://go-review.googlesource.com/c/go/+/245478 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/arm64/asm.go | 14 +++----------- src/cmd/link/internal/ld/data.go | 29 ++++++++++++++++++++++++++--- src/cmd/link/internal/mips/asm.go | 18 +++--------------- src/cmd/link/internal/mips64/asm.go | 18 +++--------------- src/cmd/link/internal/ppc64/asm.go | 24 ++++-------------------- 5 files changed, 39 insertions(+), 64 deletions(-) diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index e7be4e639d..fb9f175f06 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -688,16 +688,10 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian } func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { - rs := ldr.ResolveABIAlias(r.Sym()) - var rr loader.ExtReloc switch rt := r.Type(); rt { case objabi.R_ARM64_GOTPCREL, objabi.R_ADDRARM64: - - // set up addend for eventual relocation via outer symbol. - rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off - rr.Xsym = rs + rr := ld.ExtrelocViaOuterSym(ldr, r, s) // Note: ld64 currently has a bug that any non-zero addend for BR26 relocation // will make the linking fail because it thinks the code is not PIC even though @@ -716,11 +710,9 @@ func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.S case objabi.R_CALLARM64, objabi.R_ARM64_TLS_LE, objabi.R_ARM64_TLS_IE: - rr.Xsym = rs - rr.Xadd = r.Add() - return rr, true + return ld.ExtrelocSimple(ldr, r), true } - return rr, false + return loader.ExtReloc{}, false } func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) { diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 2a3d6e7fe7..f09734fab4 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -627,9 +627,7 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri return rr, false case objabi.R_XCOFFREF: - rs := ldr.ResolveABIAlias(r.Sym()) - rr.Xsym = rs - rr.Xadd = r.Add() + return ExtrelocSimple(ldr, r), true // These reloc types don't need external relocations. case objabi.R_ADDROFF, objabi.R_WEAKADDROFF, objabi.R_METHODOFF, objabi.R_ADDRCUOFF, @@ -639,6 +637,31 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri return rr, true } +// ExtrelocSimple creates a simple external relocation from r, with the same +// symbol and addend. +func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc2) loader.ExtReloc { + var rr loader.ExtReloc + rs := ldr.ResolveABIAlias(r.Sym()) + rr.Xsym = rs + rr.Xadd = r.Add() + return rr +} + +// ExtrelocViaOuterSym creates an external relocation from r targeting the +// outer symbol and folding the subsymbol's offset into the addend. +func ExtrelocViaOuterSym(ldr *loader.Loader, r loader.Reloc2, s loader.Sym) loader.ExtReloc { + // set up addend for eventual relocation via outer symbol. + var rr loader.ExtReloc + rs, off := FoldSubSymbolOffset(ldr, r.Sym()) + rr.Xadd = r.Add() + off + rst := ldr.SymType(rs) + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { + ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) + } + rr.Xsym = rs + return rr +} + // relocSymState hold state information needed when making a series of // successive calls to relocsym(). The items here are invariant // (meaning that they are set up once initially and then don't change diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 71cd7681fb..1e5b3781f1 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -145,24 +145,12 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian } func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { - rs := ldr.ResolveABIAlias(r.Sym()) - var rr loader.ExtReloc switch r.Type() { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - // set up addend for eventual relocation via outer symbol. - rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) - } - rr.Xsym = rs - return rr, true + return ld.ExtrelocViaOuterSym(ldr, r, s), true case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - rr.Xsym = rs - rr.Xadd = r.Add() - return rr, true + return ld.ExtrelocSimple(ldr, r), true } - return rr, false + return loader.ExtReloc{}, false } diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 8b9a7e5c69..6310a7095d 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -143,27 +143,15 @@ func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVarian } func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { - rs := ldr.ResolveABIAlias(r.Sym()) - var rr loader.ExtReloc switch r.Type() { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: - // set up addend for eventual relocation via outer symbol. - rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) - } - rr.Xsym = rs - return rr, true + return ld.ExtrelocViaOuterSym(ldr, r, s), true case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS: - rr.Xsym = rs - rr.Xadd = r.Add() - return rr, true + return ld.ExtrelocSimple(ldr, r), true } - return rr, false + return loader.ExtReloc{}, false } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 23cacb32ad..371e911ca6 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -967,34 +967,18 @@ overflow: } func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { - rs := ldr.ResolveABIAlias(r.Sym()) - var rr loader.ExtReloc switch r.Type() { - case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE: - rr.Xadd = r.Add() - rr.Xsym = rs - return rr, true + case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE, objabi.R_CALLPOWER: + return ld.ExtrelocSimple(ldr, r), true case objabi.R_ADDRPOWER, objabi.R_ADDRPOWER_DS, objabi.R_ADDRPOWER_TOCREL, objabi.R_ADDRPOWER_TOCREL_DS, objabi.R_ADDRPOWER_GOT, objabi.R_ADDRPOWER_PCREL: - // set up addend for eventual relocation via outer symbol. - rs, off := ld.FoldSubSymbolOffset(ldr, rs) - rr.Xadd = r.Add() + off - rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { - ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) - } - rr.Xsym = rs - return rr, true - case objabi.R_CALLPOWER: - rr.Xsym = rs - rr.Xadd = r.Add() - return rr, true + return ld.ExtrelocViaOuterSym(ldr, r, s), true } - return rr, false + return loader.ExtReloc{}, false } func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) { -- GitLab From 317c1ca9f2bc8b52807171020eb47e988699cf6a Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 28 Jul 2020 21:35:53 -0400 Subject: [PATCH 0117/1792] [dev.link] cmd/link: refactor ExtReloc data structures We used to generate all external relocations in memory, then emit the relocation records at a later pass. The data structures were chosen so that it takes as little memory as possible. Now we just stream out external relocations, and ExtReloc is just a local variable. Change the data structure to avoid repeated read of some fields. Also get rid of ExtRelocView, as it is no longer necessary. Change-Id: I40209bbe4387af231b29788125c3b4ebb0ff4a33 Reviewed-on: https://go-review.googlesource.com/c/go/+/245479 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/amd64/asm.go | 18 +++++++++--------- src/cmd/link/internal/arm/asm.go | 18 +++++++++++------- src/cmd/link/internal/arm64/asm.go | 12 ++++++------ src/cmd/link/internal/ld/data.go | 13 +++++++++---- src/cmd/link/internal/ld/elf.go | 5 ++--- src/cmd/link/internal/ld/lib.go | 8 ++++---- src/cmd/link/internal/ld/macho.go | 5 ++--- src/cmd/link/internal/ld/pe.go | 5 ++--- src/cmd/link/internal/ld/xcoff.go | 5 ++--- src/cmd/link/internal/loader/loader.go | 11 ++--------- src/cmd/link/internal/mips/asm.go | 8 ++++---- src/cmd/link/internal/mips64/asm.go | 8 ++++---- src/cmd/link/internal/ppc64/asm.go | 18 +++++++++--------- src/cmd/link/internal/riscv64/asm.go | 4 ++-- src/cmd/link/internal/s390x/asm.go | 14 +++++++------- src/cmd/link/internal/x86/asm.go | 12 ++++++------ 16 files changed, 81 insertions(+), 83 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index bd41e0f781..4661aff424 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -384,12 +384,12 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool { out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - siz := r.Siz() - switch r.Type() { + siz := r.Size + switch r.Type { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: @@ -448,11 +448,11 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, sectoff int64) bool { var v uint32 rs := r.Xsym - rt := r.Type() + rt := r.Type if ldr.SymType(rs) == sym.SHOSTOBJ || rt == objabi.R_PCREL || rt == objabi.R_GOTPCREL || rt == objabi.R_CALL { if ldr.SymDynid(rs) < 0 { @@ -490,7 +490,7 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy v |= ld.MACHO_X86_64_RELOC_GOT_LOAD << 28 } - switch r.Siz() { + switch r.Size { default: return false @@ -512,11 +512,11 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy return true } -func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, sectoff int64) bool { var v uint32 rs := r.Xsym - rt := r.Type() + rt := r.Type if ldr.SymDynid(rs) < 0 { ldr.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs)) @@ -534,7 +534,7 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, v = ld.IMAGE_REL_AMD64_SECREL case objabi.R_ADDR: - if r.Siz() == 8 { + if r.Size == 8 { v = ld.IMAGE_REL_AMD64_ADDR64 } else { v = ld.IMAGE_REL_AMD64_ADDR32 diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 35b2c4ba33..2a21a51b2f 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -248,12 +248,12 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool { out.Write32(uint32(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - siz := r.Siz() - switch r.Type() { + siz := r.Size + switch r.Type { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: @@ -270,7 +270,9 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, } case objabi.R_CALLARM: if siz == 4 { - if r.Add()&0xff000000 == 0xeb000000 { // BL + relocs := ldr.Relocs(s) + r := relocs.At2(ri) + if r.Add()&0xff000000 == 0xeb000000 { // BL // TODO: using r.Add here is bad (issue 19811) out.Write32(uint32(elf.R_ARM_CALL) | uint32(elfsym)<<8) } else { out.Write32(uint32(elf.R_ARM_JUMP24) | uint32(elfsym)<<8) @@ -318,13 +320,13 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S } } -func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool { return false } -func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, sectoff int64) bool { rs := r.Xsym - rt := r.Type() + rt := r.Type if ldr.SymDynid(rs) < 0 { ldr.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs)) @@ -590,6 +592,8 @@ func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.S ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } rr.Xsym = rs + rr.Type = r.Type() + rr.Size = r.Siz() return rr, true } return rr, false diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index fb9f175f06..d8eed89eef 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -323,12 +323,12 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool { out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - siz := r.Siz() - switch r.Type() { + siz := r.Size + switch r.Type { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: @@ -370,12 +370,12 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, sectoff int64) bool { var v uint32 rs := r.Xsym - rt := r.Type() - siz := r.Siz() + rt := r.Type + siz := r.Size if ldr.SymType(rs) == sym.SHOSTOBJ || rt == objabi.R_CALLARM64 || rt == objabi.R_ADDRARM64 { if ldr.SymDynid(rs) < 0 { diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index f09734fab4..4aab2c547a 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -538,7 +538,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } // Convert a Go relocation to an external relocation. -func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri int) (loader.ExtReloc, bool) { +func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2) (loader.ExtReloc, bool) { var rr loader.ExtReloc target := &ctxt.Target siz := int32(r.Siz()) @@ -550,8 +550,8 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2, ri if rt >= objabi.ElfRelocOffset { return rr, false } - - rr.Idx = ri + rr.Type = rt + rr.Size = uint8(siz) // TODO(mundaym): remove this special case - see issue 14218. if target.IsS390X() { @@ -644,6 +644,8 @@ func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc2) loader.ExtReloc { rs := ldr.ResolveABIAlias(r.Sym()) rr.Xsym = rs rr.Xadd = r.Add() + rr.Type = r.Type() + rr.Size = r.Siz() return rr } @@ -652,13 +654,16 @@ func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc2) loader.ExtReloc { func ExtrelocViaOuterSym(ldr *loader.Loader, r loader.Reloc2, s loader.Sym) loader.ExtReloc { // set up addend for eventual relocation via outer symbol. var rr loader.ExtReloc - rs, off := FoldSubSymbolOffset(ldr, r.Sym()) + rs := ldr.ResolveABIAlias(r.Sym()) + rs, off := FoldSubSymbolOffset(ldr, rs) rr.Xadd = r.Add() + off rst := ldr.SymType(rs) if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } rr.Xsym = rs + rr.Type = r.Type() + rr.Size = r.Siz() return rr } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 5b5e01bf48..b937c15873 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1377,7 +1377,7 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { r := relocs.At2(ri) - rr, ok := extreloc(ctxt, ldr, s, r, ri) + rr, ok := extreloc(ctxt, ldr, s, r) if !ok { continue } @@ -1392,8 +1392,7 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) 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)) } - rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} - if !thearch.Elfreloc1(ctxt, out, ldr, s, rv, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) { + if !thearch.Elfreloc1(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())) } } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 5c0f4eb0c4..fd6bab8af4 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -244,14 +244,14 @@ type Arch struct { // needed. Extreloc func(*Target, *loader.Loader, loader.Reloc2, loader.Sym) (loader.ExtReloc, bool) - Elfreloc1 func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) 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) - Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + 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. - PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool - Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool + PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool + Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool // TLSIEtoLE converts a TLS Initial Executable relocation to // a TLS Local Executable relocation. diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 1089d309a1..8663f02f41 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -1051,7 +1051,7 @@ func machorelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sy relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { r := relocs.At2(ri) - rr, ok := extreloc(ctxt, ldr, s, r, ri) + rr, ok := extreloc(ctxt, ldr, s, r) if !ok { continue } @@ -1062,8 +1062,7 @@ func machorelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sy 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)) } - rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} - if !thearch.Machoreloc1(ctxt.Arch, out, ldr, s, rv, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-sect.Vaddr)) { + if !thearch.Machoreloc1(ctxt.Arch, out, ldr, s, rr, 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())) } } diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 38b99fabbe..72031a2041 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -522,7 +522,7 @@ func (f *peFile) emitRelocations(ctxt *Link) { relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { r := relocs.At2(ri) - rr, ok := extreloc(ctxt, ldr, s, r, ri) + rr, ok := extreloc(ctxt, ldr, s, r) if !ok { continue } @@ -533,8 +533,7 @@ func (f *peFile) emitRelocations(ctxt *Link) { if ldr.SymDynid(rr.Xsym) < 0 { ctxt.Errorf(s, "reloc %d to non-coff symbol %s (outer=%s) %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(rr.Xsym), ldr.SymType(r.Sym())) } - rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} - if !thearch.PEreloc1(ctxt.Arch, ctxt.Out, ldr, s, rv, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { + if !thearch.PEreloc1(ctxt.Arch, ctxt.Out, ldr, s, rr, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { ctxt.Errorf(s, "unsupported obj reloc %d/%d to %s", r.Type(), r.Siz(), ldr.SymName(r.Sym())) } nrelocs++ diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 3d1677e278..e4ab0263ec 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1708,7 +1708,7 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { for _, ri := range sorted { r := relocs.At2(ri) - rr, ok := extreloc(ctxt, ldr, s, r, ri) + rr, ok := extreloc(ctxt, ldr, s, r) if !ok { continue } @@ -1719,8 +1719,7 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { if ldr.SymDynid(rr.Xsym) < 0 { ldr.Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type(), ldr.SymName(r.Sym()), ldr.SymName(rr.Xsym), ldr.SymType(r.Sym()), ldr.SymDynid(rr.Xsym)) } - rv := loader.ExtRelocView{Reloc2: r, ExtReloc: rr} - if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, ldr, s, rv, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { + if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, ldr, s, rr, int64(uint64(ldr.SymValue(s)+int64(r.Off()))-base)) { ldr.Errorf(s, "unsupported obj reloc %d(%s)/%d to %s", r.Type(), r.Type(), r.Siz(), ldr.SymName(r.Sym())) } } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 2ecde037a3..a2a09c828e 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -50,17 +50,10 @@ type Reloc struct { // ExtReloc contains the payload for an external relocation. type ExtReloc struct { - Idx int // index of the original relocation Xsym Sym Xadd int64 -} - -// ExtRelocView is a view of an external relocation. -// It is intended to be constructed on the fly, such as ExtRelocs.At. -// It is not the data structure used to store the payload internally. -type ExtRelocView struct { - Reloc2 - ExtReloc + Type objabi.RelocType + Size uint8 } // Reloc2 holds a "handle" to access a relocation record from an diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 1e5b3781f1..b245e82c3d 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -43,15 +43,15 @@ func gentext(ctxt *ld.Link, ldr *loader.Loader) { return } -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool { out.Write32(uint32(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - switch r.Type() { + switch r.Type { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - if r.Siz() != 4 { + if r.Size != 4 { return false } out.Write32(uint32(elf.R_MIPS_32) | uint32(elfsym)<<8) @@ -72,7 +72,7 @@ func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loade return } -func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool { return false } diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 6310a7095d..05eee56340 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -41,7 +41,7 @@ import ( func gentext(ctxt *ld.Link, ldr *loader.Loader) {} -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool { // mips64 ELF relocation (endian neutral) // offset uint64 @@ -59,11 +59,11 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, out.Write8(0) out.Write8(0) out.Write8(0) - switch r.Type() { + switch r.Type { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - switch r.Siz() { + switch r.Size { case 4: out.Write8(uint8(elf.R_MIPS_32)) case 8: @@ -90,7 +90,7 @@ func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loade return } -func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool { return false } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 371e911ca6..b559d566e6 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -402,7 +402,7 @@ func addelfdynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s lo return false } -func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, sectoff int64) bool { rs := r.Xsym emitReloc := func(v uint16, off uint64) { @@ -412,12 +412,12 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy } var v uint16 - switch r.Type() { + switch r.Type { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: v = ld.XCOFF_R_POS - if r.Siz() == 4 { + if r.Size == 4 { v |= 0x1F << 8 } else { v |= 0x3F << 8 @@ -430,7 +430,7 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy case objabi.R_POWER_TLS_LE: emitReloc(ld.XCOFF_R_TLS_LE|0x0F<<8, 2) case objabi.R_CALLPOWER: - if r.Siz() != 4 { + if r.Size != 4 { return false } emitReloc(ld.XCOFF_R_RBR|0x19<<8, 0) @@ -441,9 +441,9 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy } -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +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. - rt := r.Type() + rt := r.Type if rt == objabi.R_ADDR || rt == objabi.R_POWER_TLS || rt == objabi.R_CALLPOWER { } else { if ctxt.Arch.ByteOrder == binary.BigEndian { @@ -457,7 +457,7 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: - switch r.Siz() { + switch r.Size { case 4: out.Write64(uint64(elf.R_PPC64_ADDR32) | uint64(elfsym)<<32) case 8: @@ -506,7 +506,7 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, out.Write64(uint64(sectoff + 4)) out.Write64(uint64(elf.R_PPC64_TOC16_LO_DS) | uint64(elfsym)<<32) case objabi.R_CALLPOWER: - if r.Siz() != 4 { + if r.Size != 4 { return false } out.Write64(uint64(elf.R_PPC64_REL24) | uint64(elfsym)<<32) @@ -527,7 +527,7 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S } } -func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool { return false } diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index b72fa44e69..36e4f3d827 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -18,7 +18,7 @@ import ( func gentext(ctxt *ld.Link, ldr *loader.Loader) { } -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool { log.Fatalf("elfreloc1") return false } @@ -27,7 +27,7 @@ func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loade log.Fatalf("elfsetuplt") } -func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool { log.Fatalf("machoreloc1 not implemented") return false } diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 8a89f9073e..b9dfc61b11 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -219,12 +219,12 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool { out.Write64(uint64(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - siz := r.Siz() - switch r.Type() { + siz := r.Size + switch r.Type { default: return false case objabi.R_TLS_LE: @@ -262,15 +262,15 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, } case objabi.R_PCREL, objabi.R_PCRELDBL, objabi.R_CALL: elfrel := elf.R_390_NONE - rVariant := ldr.RelocVariant(s, r.Idx) + rVariant := ldr.RelocVariant(s, ri) isdbl := rVariant&sym.RV_TYPE_MASK == sym.RV_390_DBL // TODO(mundaym): all DBL style relocations should be // signalled using the variant - see issue 14218. - switch r.Type() { + switch r.Type { case objabi.R_PCRELDBL, objabi.R_CALL: isdbl = true } - if ldr.SymType(r.Xsym) == sym.SDYNIMPORT && (ldr.SymElfType(r.Xsym) == elf.STT_FUNC || r.Type() == objabi.R_CALL) { + if ldr.SymType(r.Xsym) == sym.SDYNIMPORT && (ldr.SymElfType(r.Xsym) == elf.STT_FUNC || r.Type == objabi.R_CALL) { if isdbl { switch siz { case 2: @@ -363,7 +363,7 @@ func elfsetupplt(ctxt *ld.Link, plt, got *loader.SymbolBuilder, dynamic loader.S } } -func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool { return false } diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 89929a8024..38c3b946a9 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -314,12 +314,12 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, ri int, sectoff int64) bool { out.Write32(uint32(sectoff)) elfsym := ld.ElfSymForReloc(ctxt, r.Xsym) - siz := r.Siz() - switch r.Type() { + siz := r.Size + switch r.Type { default: return false case objabi.R_ADDR, objabi.R_DWARFSECREF: @@ -373,15 +373,15 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRelocView, int64) bool { +func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool { return false } -func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtRelocView, sectoff int64) bool { +func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, r loader.ExtReloc, sectoff int64) bool { var v uint32 rs := r.Xsym - rt := r.Type() + rt := r.Type if ldr.SymDynid(rs) < 0 { ldr.Errorf(s, "reloc %d (%s) to non-coff symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs)) -- GitLab From 80b287fd282b03135f14591691abd2c0bccafa97 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Jul 2020 13:20:56 -0400 Subject: [PATCH 0118/1792] [dev.link] cmd/link: remove loader.Reloc We have Reloc and Reloc2. Reloc2 is the better approach and most code uses Reloc2. There are still uses of Reloc. This CL migrates them to Reloc2, and removes Reloc. Change-Id: Id5f6a6019e1e044add682d05e70ebb1548ec58d9 Reviewed-on: https://go-review.googlesource.com/c/go/+/245577 Reviewed-by: Jeremy Faller --- src/cmd/link/internal/arm/asm.go | 69 +++++-------- src/cmd/link/internal/arm64/asm.go | 22 ++--- src/cmd/link/internal/ld/data.go | 2 +- src/cmd/link/internal/ld/lib.go | 3 +- src/cmd/link/internal/ld/pe.go | 4 +- src/cmd/link/internal/ld/xcoff.go | 4 +- src/cmd/link/internal/loader/loader.go | 19 ---- src/cmd/link/internal/loader/loader_test.go | 49 ++++++---- src/cmd/link/internal/loader/symbolbuilder.go | 64 +++--------- src/cmd/link/internal/ppc64/asm.go | 98 +++++++------------ 10 files changed, 129 insertions(+), 205 deletions(-) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 2a21a51b2f..1019fa4b7d 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -75,25 +75,19 @@ func gentext(ctxt *ld.Link, ldr *loader.Loader) { o(0xe08f0000) o(0xeafffffe) - rel := loader.Reloc{ - Off: 8, - Size: 4, - Type: objabi.R_CALLARM, - Sym: addmoduledata, - Add: 0xeafffffe, // vomit - } - initfunc.AddReloc(rel) + rel, _ := initfunc.AddRel(objabi.R_CALLARM) + rel.SetOff(8) + rel.SetSiz(4) + rel.SetSym(addmoduledata) + rel.SetAdd(0xeafffffe) // vomit o(0x00000000) - rel2 := loader.Reloc{ - Off: 12, - Size: 4, - Type: objabi.R_PCREL, - Sym: ctxt.Moduledata, - Add: 4, - } - initfunc.AddReloc(rel2) + rel2, _ := initfunc.AddRel(objabi.R_PCREL) + rel2.SetOff(12) + rel2.SetSiz(4) + rel2.SetSym(ctxt.Moduledata) + rel2.SetAdd(4) } // Preserve highest 8 bits of a, and do addition to lower 24-bit @@ -452,14 +446,11 @@ func gentramp(arch *sys.Arch, linkmode ld.LinkMode, ldr *loader.Loader, tramp *l tramp.SetData(P) if linkmode == ld.LinkExternal { - r := loader.Reloc{ - Off: 8, - Type: objabi.R_ADDR, - Size: 4, - Sym: target, - Add: offset, - } - tramp.AddReloc(r) + r, _ := tramp.AddRel(objabi.R_ADDR) + r.SetOff(8) + r.SetSiz(4) + r.SetSym(target) + r.SetAdd(offset) } } @@ -477,14 +468,11 @@ func gentramppic(arch *sys.Arch, tramp *loader.SymbolBuilder, target loader.Sym, arch.ByteOrder.PutUint32(P[12:], o4) tramp.SetData(P) - r := loader.Reloc{ - Off: 12, - Type: objabi.R_PCREL, - Size: 4, - Sym: target, - Add: offset + 4, - } - tramp.AddReloc(r) + r, _ := tramp.AddRel(objabi.R_PCREL) + r.SetOff(12) + r.SetSiz(4) + r.SetSym(target) + r.SetAdd(offset + 4) } // generate a trampoline to target+offset in dynlink mode (using GOT) @@ -515,19 +503,16 @@ func gentrampdyn(arch *sys.Arch, tramp *loader.SymbolBuilder, target loader.Sym, } tramp.SetData(P) - r := loader.Reloc{ - Off: 16, - Type: objabi.R_GOTPCREL, - Size: 4, - Sym: target, - Add: 8, - } + r, _ := tramp.AddRel(objabi.R_GOTPCREL) + r.SetOff(16) + r.SetSiz(4) + r.SetSym(target) + r.SetAdd(8) if offset != 0 { // increase reloc offset by 4 as we inserted an ADD instruction - r.Off = 20 - r.Add = 12 + r.SetOff(20) + r.SetAdd(12) } - tramp.AddReloc(r) } func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index d8eed89eef..ef307886f7 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -56,24 +56,18 @@ func gentext(ctxt *ld.Link, ldr *loader.Loader) { // 4: R_AARCH64_ADD_ABS_LO12_NC local.moduledata o(0x90000000) o(0x91000000) - rel := loader.Reloc{ - Off: 0, - Size: 8, - Type: objabi.R_ADDRARM64, - Sym: ctxt.Moduledata, - } - initfunc.AddReloc(rel) + rel, _ := initfunc.AddRel(objabi.R_ADDRARM64) + rel.SetOff(0) + rel.SetSiz(8) + rel.SetSym(ctxt.Moduledata) // 8: 14000000 b 0 // 8: R_AARCH64_CALL26 runtime.addmoduledata o(0x14000000) - rel2 := loader.Reloc{ - Off: 8, - Size: 4, - Type: objabi.R_CALLARM64, // Really should be R_AARCH64_JUMP26 but doesn't seem to make any difference - Sym: addmoduledata, - } - initfunc.AddReloc(rel2) + rel2, _ := initfunc.AddRel(objabi.R_CALLARM64) + rel2.SetOff(8) + rel2.SetSiz(4) + rel2.SetSym(addmoduledata) } func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 4aab2c547a..ee652e27fd 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1063,7 +1063,7 @@ func addstrdata(arch *sys.Arch, l *loader.Loader, name, value string) { bld.SetSize(0) bld.SetData(make([]byte, 0, arch.PtrSize*2)) bld.SetReadOnly(false) - bld.SetRelocs(nil) + bld.ResetRelocs() bld.AddAddrPlus(arch, sbld.Sym(), 0) bld.AddUint(arch, uint64(len(value))) } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index fd6bab8af4..bc88778b06 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2106,7 +2106,8 @@ func ldshlibsyms(ctxt *Link, shlib string) { } su := l.MakeSymbolUpdater(alias) su.SetType(sym.SABIALIAS) - su.AddReloc(loader.Reloc{Sym: s}) + r, _ := su.AddRel(0) // type doesn't matter + r.SetSym(s) } } ctxt.Shlibs = append(ctxt.Shlibs, Shlib{Path: libpath, Hash: hash, Deps: deps, File: f}) diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 72031a2041..96d3aac6c4 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -1115,7 +1115,9 @@ func initdynimport(ctxt *Link) *Dll { } dynSym := ldr.CreateSymForUpdate(dynName, 0) dynSym.SetType(sym.SHOSTOBJ) - sb.AddReloc(loader.Reloc{Sym: dynSym.Sym(), Type: objabi.R_ADDR, Off: 0, Size: uint8(ctxt.Arch.PtrSize)}) + r, _ := sb.AddRel(objabi.R_ADDR) + r.SetSym(dynSym.Sym()) + r.SetSiz(uint8(ctxt.Arch.PtrSize)) } } } else { diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index e4ab0263ec..4ae98a0a2e 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1201,7 +1201,9 @@ func (f *xcoffFile) adddynimpsym(ctxt *Link, s loader.Sym) { // Relocation to retrieve the external address sb.AddBytes(make([]byte, 8)) - sb.AddReloc(loader.Reloc{Off: 0, Size: uint8(ctxt.Arch.PtrSize), Type: objabi.R_ADDR, Sym: extsym.Sym()}) + r, _ := sb.AddRel(objabi.R_ADDR) + r.SetSym(extsym.Sym()) + r.SetSiz(uint8(ctxt.Arch.PtrSize)) // TODO: maybe this could be // sb.SetSize(0) // sb.SetData(nil) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index a2a09c828e..0b74f189ee 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -37,17 +37,6 @@ type Relocs struct { l *Loader // loader } -// Reloc contains the payload for a specific relocation. -// TODO: replace this with sym.Reloc, once we change the -// relocation target from "*sym.Symbol" to "loader.Sym" in sym.Reloc. -type Reloc struct { - Off int32 // offset to rewrite - Size uint8 // number of bytes to rewrite: 0, 1, 2, or 4 - Type objabi.RelocType // the relocation type - Add int64 // addend - Sym Sym // global index of symbol the reloc addresses -} - // ExtReloc contains the payload for an external relocation. type ExtReloc struct { Xsym Sym @@ -1859,14 +1848,6 @@ func (l *Loader) relocs(r *oReader, li uint32) Relocs { } } -// RelocByOff implements sort.Interface for sorting relocations by offset. - -type RelocByOff []Reloc - -func (x RelocByOff) Len() int { return len(x) } -func (x RelocByOff) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x RelocByOff) Less(i, j int) bool { return x[i].Off < x[j].Off } - // FuncInfo provides hooks to access goobj2.FuncInfo in the objects. type FuncInfo struct { l *Loader diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 82c46f6417..6a56348659 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -163,12 +163,18 @@ func TestAddMaterializedSymbol(t *testing.T) { } // Add some relocations to the new symbols. - r1 := Reloc{0, 1, objabi.R_ADDR, 0, ts1} - r2 := Reloc{3, 8, objabi.R_CALL, 0, ts2} - r3 := Reloc{7, 1, objabi.R_USETYPE, 0, ts3} - sb1.AddReloc(r1) - sb1.AddReloc(r2) - sb2.AddReloc(r3) + r1, _ := sb1.AddRel(objabi.R_ADDR) + r1.SetOff(0) + r1.SetSiz(1) + r1.SetSym(ts1) + r2, _ := sb1.AddRel(objabi.R_CALL) + r2.SetOff(3) + r2.SetSiz(8) + r2.SetSym(ts2) + r3, _ := sb2.AddRel(objabi.R_USETYPE) + r3.SetOff(7) + r3.SetSiz(1) + r3.SetSym(ts3) // Add some data to the symbols. d1 := []byte{1, 2, 3} @@ -179,7 +185,7 @@ func TestAddMaterializedSymbol(t *testing.T) { // Now invoke the usual loader interfaces to make sure // we're getting the right things back for these symbols. // First relocations... - expRel := [][]Reloc{[]Reloc{r1, r2}, []Reloc{r3}} + expRel := [][]Reloc2{{r1, r2}, {r3}} for k, sb := range []*SymbolBuilder{sb1, sb2} { rsl := sb.Relocs() exp := expRel[k] @@ -213,18 +219,18 @@ func TestAddMaterializedSymbol(t *testing.T) { } } -func sameRelocSlice(s1 *Relocs, s2 []Reloc) bool { +func sameRelocSlice(s1 *Relocs, s2 []Reloc2) bool { if s1.Count() != len(s2) { return false } for i := 0; i < s1.Count(); i++ { r1 := s1.At2(i) r2 := &s2[i] - if r1.Sym() != r2.Sym || - r1.Type() != r2.Type || - r1.Off() != r2.Off || - r1.Add() != r2.Add || - r1.Siz() != r2.Size { + if r1.Sym() != r2.Sym() || + r1.Type() != r2.Type() || + r1.Off() != r2.Off() || + r1.Add() != r2.Add() || + r1.Siz() != r2.Siz() { return false } } @@ -233,6 +239,15 @@ func sameRelocSlice(s1 *Relocs, s2 []Reloc) bool { type addFunc func(l *Loader, s Sym, s2 Sym) Sym +func mkReloc(l *Loader, typ objabi.RelocType, off int32, siz uint8, add int64, sym Sym) Reloc2 { + r := Reloc2{&goobj2.Reloc{}, l.extReader, l, typ} + r.SetOff(off) + r.SetSiz(siz) + r.SetAdd(add) + r.SetSym(sym) + return r +} + func TestAddDataMethods(t *testing.T) { ldr := mkLoader() dummyOreader := oReader{version: -1, syms: make([]Sym, 100)} @@ -248,7 +263,7 @@ func TestAddDataMethods(t *testing.T) { addDataFunc addFunc expData []byte expKind sym.SymKind - expRel []Reloc + expRel []Reloc2 }{ { which: "AddUint8", @@ -301,7 +316,7 @@ func TestAddDataMethods(t *testing.T) { }, expData: []byte{0, 0, 0, 0, 0, 0, 0, 0}, expKind: sym.SDATA, - expRel: []Reloc{Reloc{Type: objabi.R_ADDR, Size: 8, Add: 3, Sym: 6}}, + expRel: []Reloc2{mkReloc(ldr, objabi.R_ADDR, 0, 8, 3, 6)}, }, { which: "AddAddrPlus4", @@ -312,7 +327,7 @@ func TestAddDataMethods(t *testing.T) { }, expData: []byte{0, 0, 0, 0}, expKind: sym.SDATA, - expRel: []Reloc{Reloc{Type: objabi.R_ADDR, Size: 4, Add: 3, Sym: 7}}, + expRel: []Reloc2{mkReloc(ldr, objabi.R_ADDR, 0, 4, 3, 7)}, }, { which: "AddCURelativeAddrPlus", @@ -323,7 +338,7 @@ func TestAddDataMethods(t *testing.T) { }, expData: []byte{0, 0, 0, 0, 0, 0, 0, 0}, expKind: sym.SDATA, - expRel: []Reloc{Reloc{Type: objabi.R_ADDRCUOFF, Size: 8, Add: 7, Sym: 8}}, + expRel: []Reloc2{mkReloc(ldr, objabi.R_ADDRCUOFF, 0, 8, 7, 8)}, }, } diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index 7c8115f0b9..7b71f4e625 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -118,18 +118,10 @@ func (sb *SymbolBuilder) Relocs() Relocs { return sb.l.Relocs(sb.symIdx) } -func (sb *SymbolBuilder) SetRelocs(rslice []Reloc) { - n := len(rslice) - if cap(sb.relocs) < n { - sb.relocs = make([]goobj2.Reloc, n) - sb.reltypes = make([]objabi.RelocType, n) - } else { - sb.relocs = sb.relocs[:n] - sb.reltypes = sb.reltypes[:n] - } - for i := range rslice { - sb.SetReloc(i, rslice[i]) - } +// ResetRelocs removes all relocations on this symbol. +func (sb *SymbolBuilder) ResetRelocs() { + sb.relocs = sb.relocs[:0] + sb.reltypes = sb.reltypes[:0] } // SetRelocType sets the type of the 'i'-th relocation on this sym to 't' @@ -180,26 +172,6 @@ func (p *relocsByOff) Swap(i, j int) { p.reltypes[i], p.reltypes[j] = p.reltypes[j], p.reltypes[i] } -// AddReloc appends the specified reloc to the symbols list of -// relocations. Return value is the index of the newly created -// reloc. -func (sb *SymbolBuilder) AddReloc(r Reloc) uint32 { - // Populate a goobj2.Reloc from external reloc record. - rval := uint32(len(sb.relocs)) - var b goobj2.Reloc - b.Set(r.Off, r.Size, 0, r.Add, goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(r.Sym)}) - sb.relocs = append(sb.relocs, b) - sb.reltypes = append(sb.reltypes, r.Type) - return rval -} - -// Update the j-th relocation in place. -func (sb *SymbolBuilder) SetReloc(j int, r Reloc) { - // Populate a goobj2.Reloc from external reloc record. - sb.relocs[j].Set(r.Off, r.Size, 0, r.Add, goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(r.Sym)}) - sb.reltypes[j] = r.Type -} - func (sb *SymbolBuilder) Reachable() bool { return sb.l.AttrReachable(sb.symIdx) } @@ -323,14 +295,12 @@ func (sb *SymbolBuilder) SetAddrPlus(arch *sys.Arch, off int64, tgt Sym, add int sb.size = off + int64(arch.PtrSize) sb.Grow(sb.size) } - var r Reloc - r.Sym = tgt - r.Off = int32(off) - r.Size = uint8(arch.PtrSize) - r.Type = objabi.R_ADDR - r.Add = add - sb.AddReloc(r) - return off + int64(r.Size) + r, _ := sb.AddRel(objabi.R_ADDR) + r.SetSym(tgt) + r.SetOff(int32(off)) + r.SetSiz(uint8(arch.PtrSize)) + r.SetAdd(add) + return off + int64(r.Siz()) } func (sb *SymbolBuilder) SetAddr(arch *sys.Arch, off int64, tgt Sym) int64 { @@ -361,15 +331,13 @@ func (sb *SymbolBuilder) addSymRef(tgt Sym, add int64, typ objabi.RelocType, rsi sb.size += int64(rsize) sb.Grow(sb.size) - var r Reloc - r.Sym = tgt - r.Off = int32(i) - r.Size = uint8(rsize) - r.Type = typ - r.Add = add - sb.AddReloc(r) + r, _ := sb.AddRel(typ) + r.SetSym(tgt) + r.SetOff(int32(i)) + r.SetSiz(uint8(rsize)) + r.SetAdd(add) - return i + int64(r.Size) + return i + int64(rsize) } // Add a symbol reference (relocation) with given type, addend, and size diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index b559d566e6..ba46596cbd 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -152,13 +152,10 @@ func genaddmoduledata(ctxt *ld.Link, ldr *loader.Loader) { // addis r2, r12, .TOC.-func@ha toc := ctxt.DotTOC[0] - rel1 := loader.Reloc{ - Off: 0, - Size: 8, - Type: objabi.R_ADDRPOWER_PCREL, - Sym: toc, - } - initfunc.AddReloc(rel1) + 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) @@ -175,24 +172,18 @@ func genaddmoduledata(ctxt *ld.Link, ldr *loader.Loader) { } else { tgt = ldr.LookupOrCreateSym("runtime.firstmoduledata", 0) } - rel2 := loader.Reloc{ - Off: int32(initfunc.Size()), - Size: 8, - Type: objabi.R_ADDRPOWER_GOT, - Sym: tgt, - } - initfunc.AddReloc(rel2) + 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 := loader.Reloc{ - Off: int32(initfunc.Size()), - Size: 4, - Type: objabi.R_CALLPOWER, - Sym: addmoduledata, - } - initfunc.AddReloc(rel3) + rel3, _ := initfunc.AddRel(objabi.R_CALLPOWER) + rel3.SetOff(int32(initfunc.Size())) + rel3.SetSiz(4) + rel3.SetSym(addmoduledata) o(0x48000001) // nop o(0x60000000) @@ -233,31 +224,25 @@ func gencallstub(ctxt *ld.Link, ldr *loader.Loader, abicase int, stub *loader.Sy stub.AddUint32(ctxt.Arch, 0xf8410018) // std r2,24(r1) // Load the function pointer from the PLT. - rel := loader.Reloc{ - Off: int32(stub.Size()), - Size: 2, - Add: int64(ldr.SymPlt(targ)), - Type: objabi.R_POWER_TOC, - Sym: 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.Off += int32(rel.Size) + rel.SetOff(rel.Off() + int32(rel.Siz())) } - ri1 := stub.AddReloc(rel) ldr.SetRelocVariant(stub.Sym(), int(ri1), sym.RV_POWER_HA) stub.AddUint32(ctxt.Arch, 0x3d820000) // addis r12,r2,targ@plt@toc@ha - rel2 := loader.Reloc{ - Off: int32(stub.Size()), - Size: 2, - Add: int64(ldr.SymPlt(targ)), - Type: objabi.R_POWER_TOC, - Sym: plt, - } + 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.Off += int32(rel.Size) + rel2.SetOff(rel2.Off() + int32(rel2.Siz())) } - ri2 := stub.AddReloc(rel2) ldr.SetRelocVariant(stub.Sym(), int(ri2), sym.RV_POWER_LO) stub.AddUint32(ctxt.Arch, 0xe98c0000) // ld r12,targ@plt@toc@l(r12) @@ -751,13 +736,10 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta toctramp.SetType(sym.SXCOFFTOC) toctramp.AddAddrPlus(ctxt.Arch, target, offset) - r := loader.Reloc{ - Off: 0, - Type: objabi.R_ADDRPOWER_TOCREL_DS, - Size: 8, // generates 2 relocations: HA + LO - Sym: toctramp.Sym(), - } - tramp.AddReloc(r) + r, _ := tramp.AddRel(objabi.R_ADDRPOWER_TOCREL_DS) + r.SetOff(0) + r.SetSiz(8) // generates 2 relocations: HA + LO + r.SetSym(toctramp.Sym()) } else { // Used for default build mode for an executable // Address of the call target is generated using @@ -768,14 +750,11 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta // With external linking, the target address must be // relocated using LO and HA if ctxt.IsExternal() { - r := loader.Reloc{ - Off: 0, - Type: objabi.R_ADDRPOWER, - Size: 8, // generates 2 relocations: HA + LO - Sym: target, - Add: offset, - } - tramp.AddReloc(r) + r, _ := tramp.AddRel(objabi.R_ADDRPOWER) + r.SetOff(0) + r.SetSiz(8) // generates 2 relocations: HA + LO + r.SetSym(target) + r.SetAdd(offset) } else { // adjustment needed if lo has sign bit set // when using addi to compute address @@ -1000,13 +979,10 @@ func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) { // Write symbol resolver stub (just a branch to the // glink resolver stub) - rel := loader.Reloc{ - Off: int32(glink.Size()), - Size: 4, - Type: objabi.R_CALLPOWER, - Sym: glink.Sym(), - } - glink.AddReloc(rel) + rel, _ := glink.AddRel(objabi.R_CALLPOWER) + rel.SetOff(int32(glink.Size())) + rel.SetSiz(4) + rel.SetSym(glink.Sym()) glink.AddUint32(ctxt.Arch, 0x48000000) // b .glink // In the ppc64 ABI, the dynamic linker is responsible -- GitLab From 4a9237129198d2082f8346d162a011a341b757a6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Jul 2020 13:26:50 -0400 Subject: [PATCH 0119/1792] [dev.link] cmd/link: remove "2", another round Rename Reloc2 to Reloc, At2 to At, Aux2 to Aux. Change-Id: Ic98d83c080e8cd80fbe1837c8f0aa134033508ce Reviewed-on: https://go-review.googlesource.com/c/go/+/245578 Reviewed-by: Jeremy Faller --- src/cmd/link/internal/amd64/asm.go | 8 ++-- src/cmd/link/internal/arm/asm.go | 16 +++---- src/cmd/link/internal/arm64/asm.go | 10 ++-- src/cmd/link/internal/ld/data.go | 16 +++---- src/cmd/link/internal/ld/deadcode.go | 14 +++--- src/cmd/link/internal/ld/decodesym.go | 6 +-- src/cmd/link/internal/ld/dwarf.go | 6 +-- src/cmd/link/internal/ld/elf.go | 2 +- src/cmd/link/internal/ld/go.go | 2 +- src/cmd/link/internal/ld/lib.go | 12 ++--- src/cmd/link/internal/ld/macho.go | 2 +- src/cmd/link/internal/ld/pcln.go | 2 +- src/cmd/link/internal/ld/pe.go | 8 ++-- src/cmd/link/internal/ld/typelink.go | 2 +- src/cmd/link/internal/ld/xcoff.go | 6 +-- src/cmd/link/internal/loader/loader.go | 46 +++++++++---------- src/cmd/link/internal/loader/loader_test.go | 18 ++++---- src/cmd/link/internal/loader/symbolbuilder.go | 4 +- src/cmd/link/internal/mips/asm.go | 6 +-- src/cmd/link/internal/mips64/asm.go | 6 +-- src/cmd/link/internal/ppc64/asm.go | 22 ++++----- src/cmd/link/internal/riscv64/asm.go | 4 +- src/cmd/link/internal/s390x/asm.go | 6 +-- src/cmd/link/internal/wasm/asm.go | 4 +- src/cmd/link/internal/x86/asm.go | 8 ++-- 25 files changed, 118 insertions(+), 118 deletions(-) diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 4661aff424..e5a6ef51b0 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -69,7 +69,7 @@ func gentext(ctxt *ld.Link, ldr *loader.Loader) { o(0xc3) } -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +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 { @@ -233,7 +233,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // Reread the reloc to incorporate any changes in type above. relocs := ldr.Relocs(s) - r = relocs.At2(rIdx) + r = relocs.At(rIdx) switch r.Type() { case objabi.R_CALL, @@ -550,11 +550,11 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, loader.Sym, int64) (int64, int, bool) { +func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc, loader.Sym, int64) (int64, int, bool) { return -1, 0, false } -func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("unexpected relocation variant") return -1 } diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 1019fa4b7d..22bcb518df 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -96,7 +96,7 @@ func braddoff(a int32, b int32) int32 { return int32((uint32(a))&0xff000000 | 0x00ffffff&uint32(a+b)) } -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +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 @@ -209,7 +209,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // Reread the reloc to incorporate any changes in type above. relocs := ldr.Relocs(s) - r = relocs.At2(rIdx) + r = relocs.At(rIdx) switch r.Type() { case objabi.R_CALLARM: @@ -265,7 +265,7 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, case objabi.R_CALLARM: if siz == 4 { relocs := ldr.Relocs(s) - r := relocs.At2(ri) + r := relocs.At(ri) if r.Add()&0xff000000 == 0xeb000000 { // BL // TODO: using r.Add here is bad (issue 19811) out.Write32(uint32(elf.R_ARM_CALL) | uint32(elfsym)<<8) } else { @@ -367,7 +367,7 @@ func immrot(v uint32) uint32 { // Convert the direct jump relocation r to refer to a trampoline if the target is too far func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) { relocs := ldr.Relocs(s) - r := relocs.At2(ri) + r := relocs.At(ri) switch r.Type() { case objabi.R_CALLARM: // r.Add is the instruction @@ -423,7 +423,7 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) { // modify reloc to point to tramp, which will be resolved later sb := ldr.MakeSymbolUpdater(s) relocs := sb.Relocs() - r := relocs.At2(ri) + r := relocs.At(ri) r.SetSym(tramp) r.SetAdd(r.Add()&0xff000000 | 0xfffffe) // clear the offset embedded in the instruction } @@ -515,7 +515,7 @@ func gentrampdyn(arch *sys.Arch, tramp *loader.SymbolBuilder, target loader.Sym, } } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +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() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { @@ -559,12 +559,12 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return val, 0, false } -func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("unexpected relocation variant") return -1 } -func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sym) (loader.ExtReloc, bool) { rs := ldr.ResolveABIAlias(r.Sym()) var rr loader.ExtReloc switch r.Type() { diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index ef307886f7..945b83822c 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -70,7 +70,7 @@ func gentext(ctxt *ld.Link, ldr *loader.Loader) { rel2.SetSym(addmoduledata) } -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +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 @@ -205,7 +205,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // Reread the reloc to incorporate any changes in type above. relocs := ldr.Relocs(s) - r = relocs.At2(rIdx) + r = relocs.At(rIdx) switch r.Type() { case objabi.R_CALL, @@ -435,7 +435,7 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sy return true } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (int64, int, bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc, s loader.Sym, val int64) (int64, int, bool) { const noExtReloc = 0 const isOk = true @@ -676,12 +676,12 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return val, 0, false } -func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("unexpected relocation variant") return -1 } -func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sym) (loader.ExtReloc, bool) { switch rt := r.Type(); rt { case objabi.R_ARM64_GOTPCREL, objabi.R_ADDRARM64: diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index ee652e27fd..9329e32e8c 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -75,7 +75,7 @@ func maxSizeTrampolinesPPC64(ldr *loader.Loader, s loader.Sym, isTramp bool) uin n := uint64(0) relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) if r.Type().IsDirectCallOrJump() { n++ } @@ -96,7 +96,7 @@ func trampoline(ctxt *Link, s loader.Sym) { ldr := ctxt.loader relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) if !r.Type().IsDirectCallOrJump() { continue } @@ -160,7 +160,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { syms := st.syms nExtReloc := 0 // number of external relocations for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) off := r.Off() siz := int32(r.Siz()) rs := r.Sym() @@ -538,7 +538,7 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } // Convert a Go relocation to an external relocation. -func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2) (loader.ExtReloc, bool) { +func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc) (loader.ExtReloc, bool) { var rr loader.ExtReloc target := &ctxt.Target siz := int32(r.Siz()) @@ -639,7 +639,7 @@ func extreloc(ctxt *Link, ldr *loader.Loader, s loader.Sym, r loader.Reloc2) (lo // ExtrelocSimple creates a simple external relocation from r, with the same // symbol and addend. -func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc2) loader.ExtReloc { +func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc) loader.ExtReloc { var rr loader.ExtReloc rs := ldr.ResolveABIAlias(r.Sym()) rr.Xsym = rs @@ -651,7 +651,7 @@ func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc2) loader.ExtReloc { // ExtrelocViaOuterSym creates an external relocation from r targeting the // outer symbol and folding the subsymbol's offset into the addend. -func ExtrelocViaOuterSym(ldr *loader.Loader, r loader.Reloc2, s loader.Sym) loader.ExtReloc { +func ExtrelocViaOuterSym(ldr *loader.Loader, r loader.Reloc, s loader.Sym) loader.ExtReloc { // set up addend for eventual relocation via outer symbol. var rr loader.ExtReloc rs := ldr.ResolveABIAlias(r.Sym()) @@ -697,7 +697,7 @@ func windynrelocsym(ctxt *Link, rel *loader.SymbolBuilder, s loader.Sym) { var su *loader.SymbolBuilder relocs := ctxt.loader.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) targ := r.Sym() if targ == 0 { continue @@ -774,7 +774,7 @@ func dynrelocsym(ctxt *Link, s loader.Sym) { syms := &ctxt.ArchSyms relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) if ctxt.BuildMode == BuildModePIE && ctxt.LinkMode == LinkInternal { // It's expected that some relocations will be done // later by relocsym (R_TLS_LE, R_ADDROFF), so diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 1060bbca3b..53ab0db9d0 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -71,7 +71,7 @@ func (d *deadcodePass) init() { if exportsIdx != 0 { relocs := d.ldr.Relocs(exportsIdx) for i := 0; i < relocs.Count(); i++ { - d.mark(relocs.At2(i).Sym(), 0) + d.mark(relocs.At(i).Sym(), 0) } } } @@ -119,7 +119,7 @@ func (d *deadcodePass) flood() { methods = methods[:0] for i := 0; i < relocs.Count(); i++ { - r := relocs.At2(i) + r := relocs.At(i) t := r.Type() if t == objabi.R_WEAKADDROFF { continue @@ -160,7 +160,7 @@ func (d *deadcodePass) flood() { } naux := d.ldr.NAux(symIdx) for i := 0; i < naux; i++ { - a := d.ldr.Aux2(symIdx, i) + a := d.ldr.Aux(symIdx, i) if a.Type() == goobj2.AuxGotype && !d.ctxt.linkShared { // A symbol being reachable doesn't imply we need its // type descriptor. Don't mark it. @@ -227,9 +227,9 @@ func (d *deadcodePass) mark(symIdx, parent loader.Sym) { func (d *deadcodePass) markMethod(m methodref) { relocs := d.ldr.Relocs(m.src) - d.mark(relocs.At2(m.r).Sym(), m.src) - d.mark(relocs.At2(m.r+1).Sym(), m.src) - d.mark(relocs.At2(m.r+2).Sym(), m.src) + d.mark(relocs.At(m.r).Sym(), m.src) + d.mark(relocs.At(m.r+1).Sym(), m.src) + d.mark(relocs.At(m.r+2).Sym(), m.src) } // deadcode marks all reachable symbols. @@ -316,7 +316,7 @@ func deadcode(ctxt *Link) { s := loader.Sym(i) if ldr.IsItabLink(s) { relocs := ldr.Relocs(s) - if relocs.Count() > 0 && ldr.AttrReachable(relocs.At2(0).Sym()) { + if relocs.Count() > 0 && ldr.AttrReachable(relocs.At(0).Sym()) { ldr.SetAttrReachable(s, true) } } diff --git a/src/cmd/link/internal/ld/decodesym.go b/src/cmd/link/internal/ld/decodesym.go index 4245d39e48..c6e2d8ca7f 100644 --- a/src/cmd/link/internal/ld/decodesym.go +++ b/src/cmd/link/internal/ld/decodesym.go @@ -104,14 +104,14 @@ const ( kindMask = (1 << 5) - 1 ) -func decodeReloc(ldr *loader.Loader, symIdx loader.Sym, relocs *loader.Relocs, off int32) loader.Reloc2 { +func decodeReloc(ldr *loader.Loader, symIdx loader.Sym, relocs *loader.Relocs, off int32) loader.Reloc { for j := 0; j < relocs.Count(); j++ { - rel := relocs.At2(j) + rel := relocs.At(j) if rel.Off() == off { return rel } } - return loader.Reloc2{} + return loader.Reloc{} } func decodeRelocSym(ldr *loader.Loader, symIdx loader.Sym, relocs *loader.Relocs, off int32) loader.Sym { diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index a574472aa4..50eebea47a 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1146,7 +1146,7 @@ func (d *dwctxt) importInfoSymbol(dsym loader.Sym) { } relocs := d.ldr.Relocs(dsym) for i := 0; i < relocs.Count(); i++ { - r := relocs.At2(i) + r := relocs.At(i) if r.Type() != objabi.R_DWARFSECREF { continue } @@ -1685,7 +1685,7 @@ func (d *dwctxt) dwarfVisitFunction(fnSym loader.Sym, unit *sym.CompilationUnit) // locals/params but were optimized away. drelocs := d.ldr.Relocs(infosym) for ri := 0; ri < drelocs.Count(); ri++ { - r := drelocs.At2(ri) + r := drelocs.At(ri) // Look for "use type" relocs. if r.Type() == objabi.R_USETYPE { d.defgotype(r.Sym()) @@ -2091,7 +2091,7 @@ func (d *dwctxt) collectUnitLocs(u *sym.CompilationUnit) []loader.Sym { for _, fn := range u.FuncDIEs { relocs := d.ldr.Relocs(loader.Sym(fn)) for i := 0; i < relocs.Count(); i++ { - reloc := relocs.At2(i) + reloc := relocs.At(i) if reloc.Type() != objabi.R_DWARFSECREF { continue } diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index b937c15873..957f5081f6 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1376,7 +1376,7 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) // to stream out. relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) rr, ok := extreloc(ctxt, ldr, s, r) if !ok { continue diff --git a/src/cmd/link/internal/ld/go.go b/src/cmd/link/internal/ld/go.go index 6d05c59b81..bf5c9ca1ba 100644 --- a/src/cmd/link/internal/ld/go.go +++ b/src/cmd/link/internal/ld/go.go @@ -359,7 +359,7 @@ func (ctxt *Link) addexport() { } relocs := ctxt.loader.Relocs(s) for i := 0; i < relocs.Count(); i++ { - if rs := relocs.At2(i).Sym(); rs != 0 { + if rs := relocs.At(i).Sym(); rs != 0 { if ctxt.loader.SymType(rs) == sym.Sxxx && !ctxt.loader.AttrLocal(rs) { // sanity check if len(ctxt.loader.Data(rs)) != 0 { diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index bc88778b06..7f5227de6d 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -200,7 +200,7 @@ type Arch struct { Plan9Magic uint32 Plan9_64Bit bool - Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool + Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc, int) bool Archinit func(*Link) // Archreloc is an arch-specific hook that assists in relocation processing // (invoked by 'relocsym'); it handles target-specific relocation tasks. @@ -212,7 +212,7 @@ type Arch struct { // ELF/Mach-O/etc. relocations, not Go relocations, this must match Elfreloc1, // etc.), and a boolean indicating success/failure (a failing value indicates // a fatal error). - Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc2, loader.Sym, + Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc, loader.Sym, int64) (relocatedOffset int64, nExtReloc int, ok bool) // Archrelocvariant is a second arch-specific hook used for // relocation processing; it handles relocations where r.Type is @@ -222,7 +222,7 @@ type Arch struct { // relocation applies, and "off" is the contents of the // to-be-relocated data item (from sym.P). Return is an updated // offset value. - Archrelocvariant func(target *Target, ldr *loader.Loader, rel loader.Reloc2, + Archrelocvariant func(target *Target, ldr *loader.Loader, rel loader.Reloc, rv sym.RelocVariant, sym loader.Sym, offset int64) (relocatedOffset int64) // Generate a trampoline for a call from s to rs if necessary. ri is @@ -242,7 +242,7 @@ type Arch struct { // Extreloc is an arch-specific hook that converts a Go relocation to an // external relocation. Return the external relocation and whether it is // needed. - Extreloc func(*Target, *loader.Loader, loader.Reloc2, loader.Sym) (loader.ExtReloc, bool) + 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. @@ -2274,7 +2274,7 @@ func (sc *stkChk) check(up *chain, depth int) int { // Process calls in this span. for ; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) if uint32(r.Off()) >= pcsp.NextPC { break } @@ -2414,7 +2414,7 @@ func (ctxt *Link) callgraph() { for _, s := range ctxt.Textp { relocs := ldr.Relocs(s) for i := 0; i < relocs.Count(); i++ { - r := relocs.At2(i) + r := relocs.At(i) rs := r.Sym() if rs == 0 { continue diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 8663f02f41..f6356729a6 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -1050,7 +1050,7 @@ func machorelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sy // to stream out. relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) rr, ok := extreloc(ctxt, ldr, s, r) if !ok { continue diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index b23313d9e5..71eaed1a54 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -152,7 +152,7 @@ func (state *pclnState) computeDeferReturn(target *Target, s loader.Sym) uint32 relocs := state.ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) if target.IsWasm() && r.Type() == objabi.R_ADDR { // Wasm does not have a live variable set at the deferreturn // call itself. Instead it has one identified by the diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 96d3aac6c4..d60aa55c36 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -521,7 +521,7 @@ func (f *peFile) emitRelocations(ctxt *Link) { // to stream out. relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) rr, ok := extreloc(ctxt, ldr, s, r) if !ok { continue @@ -1381,7 +1381,7 @@ func (rt *peBaseRelocTable) init(ctxt *Link) { rt.blocks = make(map[uint32]peBaseRelocBlock) } -func (rt *peBaseRelocTable) addentry(ldr *loader.Loader, s loader.Sym, r *loader.Reloc2) { +func (rt *peBaseRelocTable) addentry(ldr *loader.Loader, s loader.Sym, r *loader.Reloc) { // pageSize is the size in bytes of a page // described by a base relocation block. const pageSize = 0x1000 @@ -1436,7 +1436,7 @@ func (rt *peBaseRelocTable) write(ctxt *Link) { func addPEBaseRelocSym(ldr *loader.Loader, s loader.Sym, rt *peBaseRelocTable) { relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) if r.Type() >= objabi.ElfRelocOffset { continue } @@ -1530,7 +1530,7 @@ func addpersrc(ctxt *Link) { // relocation relocs := ctxt.loader.Relocs(rsrcsym) for i := 0; i < relocs.Count(); i++ { - r := relocs.At2(i) + r := relocs.At(i) p := data[r.Off():] val := uint32(int64(h.virtualAddress) + r.Add()) diff --git a/src/cmd/link/internal/ld/typelink.go b/src/cmd/link/internal/ld/typelink.go index 4bb43c2fef..2476efe75c 100644 --- a/src/cmd/link/internal/ld/typelink.go +++ b/src/cmd/link/internal/ld/typelink.go @@ -42,7 +42,7 @@ func (ctxt *Link) typelink() { tl.Grow(tl.Size()) relocs := tl.AddRelocs(len(typelinks)) for i, s := range typelinks { - r := relocs.At2(i) + r := relocs.At(i) r.SetSym(s.Type) r.SetOff(int32(i * 4)) r.SetSiz(4) diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 4ae98a0a2e..cc299cfb6b 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1214,7 +1214,7 @@ func (f *xcoffFile) adddynimpsym(ctxt *Link, s loader.Sym) { // Xcoffadddynrel adds a dynamic relocation in a XCOFF file. // This relocation will be made by the loader. -func Xcoffadddynrel(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func Xcoffadddynrel(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, r loader.Reloc, rIdx int) bool { if target.IsExternal() { return true } @@ -1705,11 +1705,11 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { sorted[i] = i } sort.Slice(sorted, func(i, j int) bool { - return relocs.At2(sorted[i]).Off() < relocs.At2(sorted[j]).Off() + return relocs.At(sorted[i]).Off() < relocs.At(sorted[j]).Off() }) for _, ri := range sorted { - r := relocs.At2(ri) + r := relocs.At(ri) rr, ok := extreloc(ctxt, ldr, s, r) if !ok { continue diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 0b74f189ee..89dce53ce5 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -45,28 +45,28 @@ type ExtReloc struct { Size uint8 } -// Reloc2 holds a "handle" to access a relocation record from an +// Reloc holds a "handle" to access a relocation record from an // object file. -type Reloc2 struct { +type Reloc struct { *goobj2.Reloc r *oReader l *Loader // External reloc types may not fit into a uint8 which the Go object file uses. - // Store it here, instead of in the byte of goobj2.Reloc2. + // Store it here, instead of in the byte of goobj2.Reloc. // For Go symbols this will always be zero. - // goobj2.Reloc2.Type() + typ is always the right type, for both Go and external + // goobj2.Reloc.Type() + typ is always the right type, for both Go and external // symbols. typ objabi.RelocType } -func (rel Reloc2) Type() objabi.RelocType { return objabi.RelocType(rel.Reloc.Type()) + rel.typ } -func (rel Reloc2) Sym() Sym { return rel.l.resolve(rel.r, rel.Reloc.Sym()) } -func (rel Reloc2) SetSym(s Sym) { rel.Reloc.SetSym(goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(s)}) } +func (rel Reloc) Type() objabi.RelocType { return objabi.RelocType(rel.Reloc.Type()) + rel.typ } +func (rel Reloc) Sym() Sym { return rel.l.resolve(rel.r, rel.Reloc.Sym()) } +func (rel Reloc) SetSym(s Sym) { rel.Reloc.SetSym(goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(s)}) } -func (rel Reloc2) SetType(t objabi.RelocType) { +func (rel Reloc) SetType(t objabi.RelocType) { if t != objabi.RelocType(uint8(t)) { - panic("SetType: type doesn't fit into Reloc2") + panic("SetType: type doesn't fit into Reloc") } rel.Reloc.SetType(uint8(t)) if rel.typ != 0 { @@ -75,15 +75,15 @@ func (rel Reloc2) SetType(t objabi.RelocType) { } } -// Aux2 holds a "handle" to access an aux symbol record from an +// Aux holds a "handle" to access an aux symbol record from an // object file. -type Aux2 struct { +type Aux struct { *goobj2.Aux r *oReader l *Loader } -func (a Aux2) Sym() Sym { return a.l.resolve(a.r, a.Aux.Sym()) } +func (a Aux) Sym() Sym { return a.l.resolve(a.r, a.Aux.Sym()) } // oReader is a wrapper type of obj.Reader, along with some // extra information. @@ -1592,15 +1592,15 @@ func (l *Loader) NAux(i Sym) int { } // Returns the "handle" to the j-th aux symbol of the i-th symbol. -func (l *Loader) Aux2(i Sym, j int) Aux2 { +func (l *Loader) Aux(i Sym, j int) Aux { if l.IsExternal(i) { - return Aux2{} + return Aux{} } r, li := l.toLocal(i) if j >= r.NAux(li) { - return Aux2{} + return Aux{} } - return Aux2{r.Aux(li, j), r, l} + return Aux{r.Aux(li, j), r, l} } // GetFuncDwarfAuxSyms collects and returns the auxiliary DWARF @@ -1813,13 +1813,13 @@ func (l *Loader) growExtAttrBitmaps() { func (relocs *Relocs) Count() int { return len(relocs.rs) } -// At2 returns the j-th reloc for a global symbol. -func (relocs *Relocs) At2(j int) Reloc2 { +// At returns the j-th reloc for a global symbol. +func (relocs *Relocs) At(j int) Reloc { if relocs.l.isExtReader(relocs.r) { pp := relocs.l.payloads[relocs.li] - return Reloc2{&relocs.rs[j], relocs.r, relocs.l, pp.reltypes[j]} + return Reloc{&relocs.rs[j], relocs.r, relocs.l, pp.reltypes[j]} } - return Reloc2{&relocs.rs[j], relocs.r, relocs.l, 0} + return Reloc{&relocs.rs[j], relocs.r, relocs.l, 0} } // Relocs returns a Relocs object for the given global sym. @@ -2188,7 +2188,7 @@ func (l *Loader) ResolveABIAlias(s Sym) Sym { return s } relocs := l.Relocs(s) - target := relocs.At2(0).Sym() + target := relocs.At(0).Sym() if l.SymType(target) == sym.SABIALIAS { panic(fmt.Sprintf("ABI alias %s references another ABI alias %s", l.SymName(s), l.SymName(target))) } @@ -2260,7 +2260,7 @@ func (l *Loader) cloneToExternal(symIdx Sym) { for i := range pp.relocs { // Copy the relocs slice. // Convert local reference to global reference. - rel := relocs.At2(i) + rel := relocs.At(i) pp.relocs[i].Set(rel.Off(), rel.Siz(), 0, rel.Add(), goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(rel.Sym())}) pp.reltypes[i] = rel.Type() } @@ -2390,7 +2390,7 @@ func (l *Loader) UndefinedRelocTargets(limit int) []Sym { for si := Sym(1); si < Sym(len(l.objSyms)); si++ { relocs := l.Relocs(si) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) rs := r.Sym() if rs != 0 && l.SymType(rs) == sym.SXREF && l.RawSymName(rs) != ".got" { result = append(result, rs) diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 6a56348659..95f1a36b1a 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -185,7 +185,7 @@ func TestAddMaterializedSymbol(t *testing.T) { // Now invoke the usual loader interfaces to make sure // we're getting the right things back for these symbols. // First relocations... - expRel := [][]Reloc2{{r1, r2}, {r3}} + expRel := [][]Reloc{{r1, r2}, {r3}} for k, sb := range []*SymbolBuilder{sb1, sb2} { rsl := sb.Relocs() exp := expRel[k] @@ -219,12 +219,12 @@ func TestAddMaterializedSymbol(t *testing.T) { } } -func sameRelocSlice(s1 *Relocs, s2 []Reloc2) bool { +func sameRelocSlice(s1 *Relocs, s2 []Reloc) bool { if s1.Count() != len(s2) { return false } for i := 0; i < s1.Count(); i++ { - r1 := s1.At2(i) + r1 := s1.At(i) r2 := &s2[i] if r1.Sym() != r2.Sym() || r1.Type() != r2.Type() || @@ -239,8 +239,8 @@ func sameRelocSlice(s1 *Relocs, s2 []Reloc2) bool { type addFunc func(l *Loader, s Sym, s2 Sym) Sym -func mkReloc(l *Loader, typ objabi.RelocType, off int32, siz uint8, add int64, sym Sym) Reloc2 { - r := Reloc2{&goobj2.Reloc{}, l.extReader, l, typ} +func mkReloc(l *Loader, typ objabi.RelocType, off int32, siz uint8, add int64, sym Sym) Reloc { + r := Reloc{&goobj2.Reloc{}, l.extReader, l, typ} r.SetOff(off) r.SetSiz(siz) r.SetAdd(add) @@ -263,7 +263,7 @@ func TestAddDataMethods(t *testing.T) { addDataFunc addFunc expData []byte expKind sym.SymKind - expRel []Reloc2 + expRel []Reloc }{ { which: "AddUint8", @@ -316,7 +316,7 @@ func TestAddDataMethods(t *testing.T) { }, expData: []byte{0, 0, 0, 0, 0, 0, 0, 0}, expKind: sym.SDATA, - expRel: []Reloc2{mkReloc(ldr, objabi.R_ADDR, 0, 8, 3, 6)}, + expRel: []Reloc{mkReloc(ldr, objabi.R_ADDR, 0, 8, 3, 6)}, }, { which: "AddAddrPlus4", @@ -327,7 +327,7 @@ func TestAddDataMethods(t *testing.T) { }, expData: []byte{0, 0, 0, 0}, expKind: sym.SDATA, - expRel: []Reloc2{mkReloc(ldr, objabi.R_ADDR, 0, 4, 3, 7)}, + expRel: []Reloc{mkReloc(ldr, objabi.R_ADDR, 0, 4, 3, 7)}, }, { which: "AddCURelativeAddrPlus", @@ -338,7 +338,7 @@ func TestAddDataMethods(t *testing.T) { }, expData: []byte{0, 0, 0, 0, 0, 0, 0, 0}, expKind: sym.SDATA, - expRel: []Reloc2{mkReloc(ldr, objabi.R_ADDRCUOFF, 0, 8, 7, 8)}, + expRel: []Reloc{mkReloc(ldr, objabi.R_ADDRCUOFF, 0, 8, 7, 8)}, }, } diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index 7b71f4e625..5b07d6e884 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -149,12 +149,12 @@ func (sb *SymbolBuilder) AddRelocs(n int) Relocs { // Add a relocation with given type, return its handle and index // (to set other fields). -func (sb *SymbolBuilder) AddRel(typ objabi.RelocType) (Reloc2, int) { +func (sb *SymbolBuilder) AddRel(typ objabi.RelocType) (Reloc, int) { j := len(sb.relocs) sb.relocs = append(sb.relocs, goobj2.Reloc{}) sb.reltypes = append(sb.reltypes, typ) relocs := sb.Relocs() - return relocs.At2(j), j + return relocs.At(j), j } // Sort relocations by offset. diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index b245e82c3d..17b1b20aff 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -90,7 +90,7 @@ func applyrel(arch *sys.Arch, ldr *loader.Loader, rt objabi.RelocType, off int32 } } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +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() rs = ldr.ResolveABIAlias(rs) if target.IsExternal() { @@ -140,11 +140,11 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return val, 0, false } -func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 { return -1 } -func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sym) (loader.ExtReloc, bool) { switch r.Type() { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: return ld.ExtrelocViaOuterSym(ldr, r, s), true diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 05eee56340..4789b411eb 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -94,7 +94,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +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) { if target.IsExternal() { switch r.Type() { default: @@ -138,11 +138,11 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return val, 0, false } -func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 { return -1 } -func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sym) (loader.ExtReloc, bool) { switch r.Type() { case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU: diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index ba46596cbd..dc522e6a38 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -96,7 +96,7 @@ func genplt(ctxt *ld.Link, ldr *loader.Loader) { for _, s := range ctxt.Textp { relocs := ldr.Relocs(s) for i := 0; i < relocs.Count(); i++ { - r := relocs.At2(i) + r := relocs.At(i) if r.Type() != objabi.ElfRelocOffset+objabi.RelocType(elf.R_PPC64_REL24) || ldr.SymType(r.Sym()) != sym.SDYNIMPORT { continue } @@ -251,7 +251,7 @@ func gencallstub(ctxt *ld.Link, ldr *loader.Loader, abicase int, stub *loader.Sy stub.AddUint32(ctxt.Arch, 0x4e800420) // bctr } -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc, rIdx int) bool { if target.IsElf() { return addelfdynrel(target, ldr, syms, s, r, rIdx) } else if target.IsAIX() { @@ -260,7 +260,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return false } -func addelfdynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +func addelfdynrel(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 { @@ -537,7 +537,7 @@ func symtoc(ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym) int64 { // default load instruction can be changed to an addi instruction and the // symbol address can be used directly. // This code is for AIX only. -func archreloctoc(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) int64 { +func archreloctoc(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r loader.Reloc, s loader.Sym, val int64) int64 { rs := ldr.ResolveABIAlias(r.Sym()) if target.IsLinux() { ldr.Errorf(s, "archrelocaddr called for %s relocation\n", ldr.SymName(rs)) @@ -553,7 +553,7 @@ func archreloctoc(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r lo var t int64 useAddi := false relocs := ldr.Relocs(rs) - tarSym := ldr.ResolveABIAlias(relocs.At2(0).Sym()) + tarSym := ldr.ResolveABIAlias(relocs.At(0).Sym()) if target.IsInternal() && tarSym != 0 && ldr.AttrReachable(tarSym) && ldr.SymSect(tarSym).Seg == &ld.Segdata { t = ldr.SymValue(tarSym) + r.Add() - ldr.SymValue(syms.TOC) @@ -593,7 +593,7 @@ func archreloctoc(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r lo // archrelocaddr relocates a symbol address. // This code is for AIX only. -func archrelocaddr(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) int64 { +func archrelocaddr(ldr *loader.Loader, target *ld.Target, syms *ld.ArchSyms, r loader.Reloc, s loader.Sym, val int64) int64 { rs := ldr.ResolveABIAlias(r.Sym()) if target.IsAIX() { ldr.Errorf(s, "archrelocaddr called for %s relocation\n", ldr.SymName(rs)) @@ -655,7 +655,7 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) { } relocs := ldr.Relocs(s) - r := relocs.At2(ri) + r := relocs.At(ri) t := ldr.SymValue(rs) + r.Add() - (ldr.SymValue(s) + int64(r.Off())) switch r.Type() { case objabi.R_CALLPOWER: @@ -708,7 +708,7 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) { } sb := ldr.MakeSymbolUpdater(s) relocs := sb.Relocs() - r := relocs.At2(ri) + r := relocs.At(ri) r.SetSym(tramp) r.SetAdd(0) // This was folded into the trampoline target address } @@ -776,7 +776,7 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta tramp.SetData(P) } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (relocatedOffset int64, nExtReloc int, ok bool) { +func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc, s loader.Sym, val int64) (relocatedOffset int64, nExtReloc int, ok bool) { rs := ldr.ResolveABIAlias(r.Sym()) if target.IsExternal() { // On AIX, relocations (except TLS ones) must be also done to the @@ -853,7 +853,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return val, nExtReloc, false } -func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) (relocatedOffset int64) { +func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv sym.RelocVariant, s loader.Sym, t int64) (relocatedOffset int64) { rs := ldr.ResolveABIAlias(r.Sym()) switch rv & sym.RV_TYPE_MASK { default: @@ -945,7 +945,7 @@ overflow: return t } -func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) { +func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc, s loader.Sym) (loader.ExtReloc, bool) { switch r.Type() { case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE, objabi.R_CALLPOWER: return ld.ExtrelocSimple(ldr, r), true diff --git a/src/cmd/link/internal/riscv64/asm.go b/src/cmd/link/internal/riscv64/asm.go index 36e4f3d827..1236145fb1 100644 --- a/src/cmd/link/internal/riscv64/asm.go +++ b/src/cmd/link/internal/riscv64/asm.go @@ -32,7 +32,7 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +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() rs = ldr.ResolveABIAlias(rs) switch r.Type() { @@ -85,7 +85,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade return val, 0, false } -func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("archrelocvariant") return -1 } diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index b9dfc61b11..645b7d4e28 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -73,7 +73,7 @@ func gentext(ctxt *ld.Link, ldr *loader.Loader) { initfunc.AddUint32(ctxt.Arch, 0) } -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +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 { @@ -367,11 +367,11 @@ func machoreloc1(*sys.Arch, *ld.OutBuf, *loader.Loader, loader.Sym, loader.ExtRe return false } -func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loader.Reloc2, s loader.Sym, val int64) (o int64, nExtReloc int, ok bool) { +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) { return val, 0, false } -func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, rv sym.RelocVariant, s loader.Sym, t int64) int64 { +func archrelocvariant(target *ld.Target, ldr *loader.Loader, r loader.Reloc, rv sym.RelocVariant, s loader.Sym, t int64) int64 { switch rv & sym.RV_TYPE_MASK { default: ldr.Errorf(s, "unexpected relocation variant %d", rv) diff --git a/src/cmd/link/internal/wasm/asm.go b/src/cmd/link/internal/wasm/asm.go index 2be4adc5d3..3bd56a6e3a 100644 --- a/src/cmd/link/internal/wasm/asm.go +++ b/src/cmd/link/internal/wasm/asm.go @@ -139,7 +139,7 @@ func asmb2(ctxt *ld.Link, ldr *loader.Loader) { for _, fn := range ctxt.Textp { relocs := ldr.Relocs(fn) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) if r.Type() == objabi.R_WASMIMPORT { hostImportMap[r.Sym()] = int64(len(hostImports)) hostImports = append(hostImports, &wasmFunc{ @@ -166,7 +166,7 @@ func asmb2(ctxt *ld.Link, ldr *loader.Loader) { P := ldr.Data(fn) off := int32(0) for ri := 0; ri < relocs.Count(); ri++ { - r := relocs.At2(ri) + r := relocs.At(ri) wfn.Write(P[off:r.Off()]) off = r.Off() rs := ldr.ResolveABIAlias(r.Sym()) diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 38c3b946a9..9b949ebbf8 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -128,7 +128,7 @@ func gentext(ctxt *ld.Link, ldr *loader.Loader) { o(0xc3) } -func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool { +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 { @@ -280,7 +280,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade // Reread the reloc to incorporate any changes in type above. relocs := ldr.Relocs(s) - r = relocs.At2(rIdx) + r = relocs.At(rIdx) switch r.Type() { case objabi.R_CALL, @@ -411,11 +411,11 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, return true } -func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc2, loader.Sym, int64) (int64, int, bool) { +func archreloc(*ld.Target, *loader.Loader, *ld.ArchSyms, loader.Reloc, loader.Sym, int64) (int64, int, bool) { return -1, 0, false } -func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc2, sym.RelocVariant, loader.Sym, int64) int64 { +func archrelocvariant(*ld.Target, *loader.Loader, loader.Reloc, sym.RelocVariant, loader.Sym, int64) int64 { log.Fatalf("unexpected relocation variant") return -1 } -- GitLab From b3e3c339ff02ccd1cf76eb07513e4f9051a55333 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 20 Jul 2020 19:03:33 -0400 Subject: [PATCH 0120/1792] [dev.link] cmd/internal/obj: trim trailing zeros for content hashing The symbol's data in the object file (sym.P) may already not contain trailing zeros (e,g, for [10]int{1}), but sometimes it does (e.g. for [10]int{1,0}). The linker can already handle this case. We just always trim the trailing zeros for content hashing, so it can deduplicate [10]int{1} and [10]int{1,0}. Note: in theory we could just trim the zeros in the symbol data as well. But currently the linker depends on reading symbol data for certain symbols (e.g. type symbol decoding), and trimming will complicates things in the linker. Change-Id: I9e90e41e6ac808b36855b0713a85e61c33bf093a Reviewed-on: https://go-review.googlesource.com/c/go/+/245717 Run-TryBot: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/internal/obj/objfile2.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 6a5f3726f8..6cf82779e4 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -373,7 +373,9 @@ func contentHash64(s *LSym) goobj2.Hash64Type { // hashed symbols. func (w *writer) contentHash(s *LSym) goobj2.HashType { h := sha1.New() - h.Write(s.P) + // The compiler trims trailing zeros _sometimes_. We just do + // it always. + h.Write(bytes.TrimRight(s.P, "\x00")) var tmp [14]byte for i := range s.R { r := &s.R[i] -- GitLab From ba9c639470cb962a799116fea55c91638752fe87 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Wed, 24 Jun 2020 14:30:16 -0400 Subject: [PATCH 0121/1792] [dev.link] cmd/link: add runtime.pcheader As of July 2020, a fair amount of the new linker's live memory, and runtime is spent generating pclntab. In an effort to streamline that code, this change starts breaking up the generation of runtime.pclntab into smaller chunks that can run later in a link. These changes are described in an (as yet not widely distributed) document that lays out an improved format. Largely the work consists of breaking up runtime.pclntab into smaller pieces, stopping much of the data rewriting, and getting runtime.pclntab into a form where we can reason about its size and look to shrink it. This change is the first part of that work -- just pulling out the header, and demonstrating where a majority of that work will be. Change-Id: I65618d0d0c780f7e5977c9df4abdbd1696fedfcb Reviewed-on: https://go-review.googlesource.com/c/go/+/241598 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/data.go | 4 + src/cmd/link/internal/ld/pcln.go | 95 +++++++++++---- src/cmd/link/internal/ld/symtab.go | 6 +- src/cmd/link/internal/loader/symbolbuilder.go | 4 + src/debug/gosym/pclntab.go | 112 ++++++++++++------ src/debug/gosym/pclntab_test.go | 50 ++++++++ src/debug/gosym/testdata/pcln115.gz | Bin 0 -> 124875 bytes src/runtime/symtab.go | 22 ++-- 8 files changed, 227 insertions(+), 66 deletions(-) create mode 100644 src/debug/gosym/testdata/pcln115.gz diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 9329e32e8c..05ed022a74 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1921,6 +1921,8 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { /* gopclntab */ sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".gopclntab"), sym.SPCLNTAB, sym.SRODATA, relroSecPerm) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0), sect) + ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pcheader", 0), sect) + ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab_old", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.epclntab", 0), sect) // 6g uses 4-byte relocation offsets, so the entire segment must fit in 32 bits. @@ -2477,6 +2479,8 @@ func (ctxt *Link) address() []*sym.Segment { ctxt.xdefine("runtime.symtab", sym.SRODATA, int64(symtab.Vaddr)) ctxt.xdefine("runtime.esymtab", sym.SRODATA, int64(symtab.Vaddr+symtab.Length)) ctxt.xdefine("runtime.pclntab", sym.SRODATA, int64(pclntab.Vaddr)) + pcvar := ctxt.xdefine("runtime.pcheader", sym.SRODATA, int64(pclntab.Vaddr)) + ctxt.xdefine("runtime.pclntab_old", sym.SRODATA, int64(pclntab.Vaddr)+ldr.SymSize(pcvar)) ctxt.xdefine("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length)) ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr)) ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr+noptr.Length)) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 71eaed1a54..5ea210c139 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -227,13 +227,41 @@ func (state *pclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch) loader return its } +// generatePCHeader creates the runtime.pcheader symbol, setting it up as a +// generator to fill in its data later. +func generatePCHeader(ctxt *Link, carrier *loader.SymbolBuilder, pclntabSym loader.Sym) { + ldr := ctxt.loader + writeHeader := func(ctxt *Link, s loader.Sym) { + ldr := ctxt.loader + header := ctxt.loader.MakeSymbolUpdater(s) + + // Check symbol order. + diff := ldr.SymValue(pclntabSym) - ldr.SymValue(s) + if diff <= 0 { + panic(fmt.Sprintf("expected runtime.pcheader(%x) to be placed before runtime.pclntab(%x)", ldr.SymValue(s), ldr.SymValue(pclntabSym))) + } + + // Write header. + // Keep in sync with runtime/symtab.go:pcHeader. + header.SetUint32(ctxt.Arch, 0, 0xfffffffa) + header.SetUint8(ctxt.Arch, 6, uint8(ctxt.Arch.MinLC)) + header.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize)) + off := header.SetUint(ctxt.Arch, 8, uint64(pclntabNfunc)) + header.SetUintptr(ctxt.Arch, off, uintptr(diff)) + } + + size := int64(8 + 2*ctxt.Arch.PtrSize) + s := ctxt.createGeneratorSymbol("runtime.pcheader", 0, sym.SPCLNTAB, size, writeHeader) + ldr.SetAttrReachable(s, true) + ldr.SetCarrierSym(s, carrier.Sym()) +} + // pclntab initializes the pclntab symbol with // runtime function and file name information. // These variables are used to initialize runtime.firstmoduledata, see symtab.go:symtab. var pclntabNfunc int32 var pclntabFiletabOffset int32 -var pclntabPclntabOffset int32 var pclntabFirstFunc loader.Sym var pclntabLastFunc loader.Sym @@ -242,22 +270,46 @@ var pclntabLastFunc loader.Sym // symbols, e.g. the set of all symbols X such that Outer(S) = X for // some other text symbol S. func (ctxt *Link) pclntab() loader.Bitmap { - funcdataBytes := int64(0) + // Go 1.2's symtab layout is documented in golang.org/s/go12symtab, but the + // layout and data has changed since that time. + // + // As of July 2020, here's the layout of pclntab: + // + // .gopclntab/__gopclntab [elf/macho section] + // runtime.pclntab + // Carrier symbol for the entire pclntab section. + // + // runtime.pcheader (see: runtime/symtab.go:pcHeader) + // 8-byte magic + // nfunc [thearch.ptrsize bytes] + // offset to runtime.pclntab_old from beginning of runtime.pcheader + // + // runtime.pclntab_old + // function table, alternating PC and offset to func struct [each entry thearch.ptrsize bytes] + // end PC [thearch.ptrsize bytes] + // offset to file table [4 bytes] + // func structures, function names, pcdata tables. + // filetable + ldr := ctxt.loader - ftabsym := ldr.LookupOrCreateSym("runtime.pclntab", 0) - ftab := ldr.MakeSymbolUpdater(ftabsym) + carrier := ldr.CreateSymForUpdate("runtime.pclntab", 0) + carrier.SetType(sym.SPCLNTAB) + carrier.SetReachable(true) + + // runtime.pclntab_old is just a placeholder,and will eventually be deleted. + // It contains the pieces of runtime.pclntab that haven't moved to a more + // ration form. + pclntabSym := ldr.LookupOrCreateSym("runtime.pclntab_old", 0) + generatePCHeader(ctxt, carrier, pclntabSym) + + funcdataBytes := int64(0) + ldr.SetCarrierSym(pclntabSym, carrier.Sym()) + ftab := ldr.MakeSymbolUpdater(pclntabSym) ftab.SetType(sym.SPCLNTAB) - ldr.SetAttrReachable(ftabsym, true) + ftab.SetReachable(true) state := makepclnState(ctxt) - // See golang.org/s/go12symtab for the format. Briefly: - // 8-byte header - // nfunc [thearch.ptrsize bytes] - // function table, alternating PC and offset to func struct [each entry thearch.ptrsize bytes] - // end PC [thearch.ptrsize bytes] - // offset to file table [4 bytes] - // Find container symbols and mark them as such. for _, s := range ctxt.Textp { outer := ldr.OuterSym(s) @@ -290,12 +342,7 @@ func (ctxt *Link) pclntab() loader.Bitmap { } pclntabNfunc = nfunc - ftab.Grow(8 + int64(ctxt.Arch.PtrSize) + int64(nfunc)*2*int64(ctxt.Arch.PtrSize) + int64(ctxt.Arch.PtrSize) + 4) - ftab.SetUint32(ctxt.Arch, 0, 0xfffffffb) - ftab.SetUint8(ctxt.Arch, 6, uint8(ctxt.Arch.MinLC)) - ftab.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize)) - ftab.SetUint(ctxt.Arch, 8, uint64(nfunc)) - pclntabPclntabOffset = int32(8 + ctxt.Arch.PtrSize) + ftab.Grow(int64(nfunc)*2*int64(ctxt.Arch.PtrSize) + int64(ctxt.Arch.PtrSize) + 4) szHint := len(ctxt.Textp) * 2 funcnameoff := make(map[string]int32, szHint) @@ -360,8 +407,8 @@ func (ctxt *Link) pclntab() loader.Bitmap { // invalid funcoff value to mark the hole. See also // runtime/symtab.go:findfunc prevFuncSize := int64(ldr.SymSize(prevFunc)) - setAddr(ftab, ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), prevFunc, prevFuncSize) - ftab.SetUint(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), ^uint64(0)) + setAddr(ftab, ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize), prevFunc, prevFuncSize) + ftab.SetUint(ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), ^uint64(0)) nfunc++ } prevFunc = s @@ -410,8 +457,8 @@ func (ctxt *Link) pclntab() loader.Bitmap { funcstart := int32(dSize) funcstart += int32(-dSize) & (int32(ctxt.Arch.PtrSize) - 1) // align to ptrsize - setAddr(ftab, ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), s, 0) - ftab.SetUint(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint64(funcstart)) + setAddr(ftab, ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize), s, 0) + ftab.SetUint(ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint64(funcstart)) // Write runtime._func. Keep in sync with ../../../../runtime/runtime2.go:/_func // and package debug/gosym. @@ -523,14 +570,14 @@ func (ctxt *Link) pclntab() loader.Bitmap { last := ctxt.Textp[len(ctxt.Textp)-1] pclntabLastFunc = last // Final entry of table is just end pc. - setAddr(ftab, ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, ldr.SymSize(last)) + setAddr(ftab, ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, ldr.SymSize(last)) // Start file table. dSize := len(ftab.Data()) start := int32(dSize) start += int32(-dSize) & (int32(ctxt.Arch.PtrSize) - 1) pclntabFiletabOffset = start - ftab.SetUint32(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint32(start)) + ftab.SetUint32(ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint32(start)) nf := len(state.numberedFiles) ftab.Grow(int64(start) + int64((nf+1)*4)) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index fddf85f1c5..15fa162c60 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -607,13 +607,15 @@ func (ctxt *Link) symtab() []sym.SymKind { // 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) - pclntab := ldr.Lookup("runtime.pclntab", 0) + // The pcHeader + moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.pcheader", 0)) // The pclntab slice + pclntab := ldr.Lookup("runtime.pclntab_old", 0) moduledata.AddAddr(ctxt.Arch, pclntab) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pclntab))) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pclntab))) // The ftab slice - moduledata.AddAddrPlus(ctxt.Arch, pclntab, int64(pclntabPclntabOffset)) + moduledata.AddAddr(ctxt.Arch, pclntab) moduledata.AddUint(ctxt.Arch, uint64(pclntabNfunc+1)) moduledata.AddUint(ctxt.Arch, uint64(pclntabNfunc+1)) // The filetab slice diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index 5b07d6e884..314111d5ea 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -287,6 +287,10 @@ func (sb *SymbolBuilder) SetUint(arch *sys.Arch, r int64, v uint64) int64 { return sb.setUintXX(arch, r, v, int64(arch.PtrSize)) } +func (sb *SymbolBuilder) SetUintptr(arch *sys.Arch, r int64, v uintptr) int64 { + return sb.setUintXX(arch, r, uint64(v), int64(arch.PtrSize)) +} + func (sb *SymbolBuilder) SetAddrPlus(arch *sys.Arch, off int64, tgt Sym, add int64) int64 { if sb.Type() == 0 { sb.SetType(sym.SDATA) diff --git a/src/debug/gosym/pclntab.go b/src/debug/gosym/pclntab.go index 7e54a94351..8c7ace17cd 100644 --- a/src/debug/gosym/pclntab.go +++ b/src/debug/gosym/pclntab.go @@ -14,6 +14,16 @@ import ( "sync" ) +// version of the pclntab +type version int + +const ( + verUnknown version = iota + ver11 + ver12 + ver116 +) + // A LineTable is a data structure mapping program counters to line numbers. // // In Go 1.1 and earlier, each function (represented by a Func) had its own LineTable, @@ -32,12 +42,17 @@ type LineTable struct { PC uint64 Line int - // Go 1.2 state - mu sync.Mutex - go12 int // is this in Go 1.2 format? -1 no, 0 unknown, 1 yes + // This mutex is used to keep parsing of pclntab synchronous. + mu sync.Mutex + + // Contains the version of the pclntab section. + version version + + // Go 1.2/1.16 state binary binary.ByteOrder quantum uint32 ptrsize uint32 + funcdata []byte functab []byte nfunctab uint32 filetab []byte @@ -140,11 +155,12 @@ func NewLineTable(data []byte, text uint64) *LineTable { // isGo12 reports whether this is a Go 1.2 (or later) symbol table. func (t *LineTable) isGo12() bool { - t.go12Init() - return t.go12 == 1 + t.parsePclnTab() + return t.version >= ver12 } const go12magic = 0xfffffffb +const go116magic = 0xfffffffa // uintptr returns the pointer-sized value encoded at b. // The pointer size is dictated by the table being read. @@ -155,49 +171,79 @@ func (t *LineTable) uintptr(b []byte) uint64 { return t.binary.Uint64(b) } -// go12init initializes the Go 1.2 metadata if t is a Go 1.2 symbol table. -func (t *LineTable) go12Init() { +// parsePclnTab parses the pclntab, setting the version. +func (t *LineTable) parsePclnTab() { t.mu.Lock() defer t.mu.Unlock() - if t.go12 != 0 { + if t.version != verUnknown { return } + // Note that during this function, setting the version is the last thing we do. + // If we set the version too early, and parsing failed (likely as a panic on + // slice lookups), we'd have a mistaken version. + // + // Error paths through this code will default the version to 1.1. + t.version = ver11 + defer func() { - // If we panic parsing, assume it's not a Go 1.2 symbol table. + // If we panic parsing, assume it's a Go 1.1 pclntab. recover() }() // Check header: 4-byte magic, two zeros, pc quantum, pointer size. - t.go12 = -1 // not Go 1.2 until proven otherwise if len(t.Data) < 16 || t.Data[4] != 0 || t.Data[5] != 0 || (t.Data[6] != 1 && t.Data[6] != 2 && t.Data[6] != 4) || // pc quantum (t.Data[7] != 4 && t.Data[7] != 8) { // pointer size return } - switch uint32(go12magic) { - case binary.LittleEndian.Uint32(t.Data): - t.binary = binary.LittleEndian - case binary.BigEndian.Uint32(t.Data): - t.binary = binary.BigEndian + var possibleVersion version + leMagic := binary.LittleEndian.Uint32(t.Data) + beMagic := binary.BigEndian.Uint32(t.Data) + switch { + case leMagic == go12magic: + t.binary, possibleVersion = binary.LittleEndian, ver12 + case beMagic == go12magic: + t.binary, possibleVersion = binary.BigEndian, ver12 + case leMagic == go116magic: + t.binary, possibleVersion = binary.LittleEndian, ver116 + case beMagic == go116magic: + t.binary, possibleVersion = binary.BigEndian, ver116 default: return } + // quantum and ptrSize are the same between 1.2 and 1.16 t.quantum = uint32(t.Data[6]) t.ptrsize = uint32(t.Data[7]) - t.nfunctab = uint32(t.uintptr(t.Data[8:])) - t.functab = t.Data[8+t.ptrsize:] - functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize - fileoff := t.binary.Uint32(t.functab[functabsize:]) - t.functab = t.functab[:functabsize] - t.filetab = t.Data[fileoff:] - t.nfiletab = t.binary.Uint32(t.filetab) - t.filetab = t.filetab[:t.nfiletab*4] - - t.go12 = 1 // so far so good + switch possibleVersion { + case ver116: + t.nfunctab = uint32(t.uintptr(t.Data[8:])) + offset := t.uintptr(t.Data[8+t.ptrsize:]) + t.funcdata = t.Data[offset:] + t.functab = t.Data[offset:] + functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize + fileoff := t.binary.Uint32(t.functab[functabsize:]) + t.filetab = t.functab[fileoff:] + t.functab = t.functab[:functabsize] + t.nfiletab = t.binary.Uint32(t.filetab) + t.filetab = t.filetab[:t.nfiletab*4] + case ver12: + t.nfunctab = uint32(t.uintptr(t.Data[8:])) + t.funcdata = t.Data + t.functab = t.Data[8+t.ptrsize:] + functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize + fileoff := t.binary.Uint32(t.functab[functabsize:]) + t.functab = t.functab[:functabsize] + t.filetab = t.Data[fileoff:] + t.nfiletab = t.binary.Uint32(t.filetab) + t.filetab = t.filetab[:t.nfiletab*4] + default: + panic("unreachable") + } + t.version = possibleVersion } // go12Funcs returns a slice of Funcs derived from the Go 1.2 pcln table. @@ -213,7 +259,7 @@ func (t *LineTable) go12Funcs() []Func { f := &funcs[i] f.Entry = t.uintptr(t.functab[2*i*int(t.ptrsize):]) f.End = t.uintptr(t.functab[(2*i+2)*int(t.ptrsize):]) - info := t.Data[t.uintptr(t.functab[(2*i+1)*int(t.ptrsize):]):] + info := t.funcdata[t.uintptr(t.functab[(2*i+1)*int(t.ptrsize):]):] f.LineTable = t f.FrameSize = int(t.binary.Uint32(info[t.ptrsize+2*4:])) f.Sym = &Sym{ @@ -241,7 +287,7 @@ func (t *LineTable) findFunc(pc uint64) []byte { m := nf / 2 fm := f[2*t.ptrsize*m:] if t.uintptr(fm) <= pc && pc < t.uintptr(fm[2*t.ptrsize:]) { - return t.Data[t.uintptr(fm[t.ptrsize:]):] + return t.funcdata[t.uintptr(fm[t.ptrsize:]):] } else if pc < t.uintptr(fm) { nf = m } else { @@ -273,8 +319,8 @@ func (t *LineTable) string(off uint32) string { if s, ok := t.strings[off]; ok { return s } - i := bytes.IndexByte(t.Data[off:], 0) - s := string(t.Data[off : off+uint32(i)]) + i := bytes.IndexByte(t.funcdata[off:], 0) + s := string(t.funcdata[off : off+uint32(i)]) t.strings[off] = s return s } @@ -301,7 +347,7 @@ func (t *LineTable) step(p *[]byte, pc *uint64, val *int32, first bool) bool { // off is the offset to the beginning of the pc-value table, // and entry is the start PC for the corresponding function. func (t *LineTable) pcvalue(off uint32, entry, targetpc uint64) int32 { - p := t.Data[off:] + p := t.funcdata[off:] val := int32(-1) pc := entry @@ -324,8 +370,8 @@ func (t *LineTable) findFileLine(entry uint64, filetab, linetab uint32, filenum, return 0 } - fp := t.Data[filetab:] - fl := t.Data[linetab:] + fp := t.funcdata[filetab:] + fl := t.funcdata[linetab:] fileVal := int32(-1) filePC := entry lineVal := int32(-1) @@ -412,7 +458,7 @@ func (t *LineTable) go12LineToPC(file string, line int) (pc uint64) { // If this turns out to be a bottleneck, we could build a map[int32][]int32 // mapping file number to a list of functions with code from that file. for i := uint32(0); i < t.nfunctab; i++ { - f := t.Data[t.uintptr(t.functab[2*t.ptrsize*i+t.ptrsize:]):] + f := t.funcdata[t.uintptr(t.functab[2*t.ptrsize*i+t.ptrsize:]):] entry := t.uintptr(f) filetab := t.binary.Uint32(f[t.ptrsize+4*4:]) linetab := t.binary.Uint32(f[t.ptrsize+5*4:]) diff --git a/src/debug/gosym/pclntab_test.go b/src/debug/gosym/pclntab_test.go index 6baa53defd..33772c7813 100644 --- a/src/debug/gosym/pclntab_test.go +++ b/src/debug/gosym/pclntab_test.go @@ -5,6 +5,8 @@ package gosym import ( + "bytes" + "compress/gzip" "debug/elf" "internal/testenv" "io/ioutil" @@ -264,3 +266,51 @@ func TestPCLine(t *testing.T) { off = pc + 1 - text.Addr } } + +// Test that we can parse a pclntab from 1.15. +// The file was compiled in /tmp/hello.go: +// [BEGIN] +// package main +// +// func main() { +// println("hello") +// } +// [END] +func Test115PclnParsing(t *testing.T) { + zippedDat, err := ioutil.ReadFile("testdata/pcln115.gz") + if err != nil { + t.Fatal(err) + } + var gzReader *gzip.Reader + gzReader, err = gzip.NewReader(bytes.NewBuffer(zippedDat)) + if err != nil { + t.Fatal(err) + } + var dat []byte + dat, err = ioutil.ReadAll(gzReader) + if err != nil { + t.Fatal(err) + } + const textStart = 0x1001000 + pcln := NewLineTable(dat, textStart) + var tab *Table + tab, err = NewTable(nil, pcln) + if err != nil { + t.Fatal(err) + } + var f *Func + var pc uint64 + pc, f, err = tab.LineToPC("/tmp/hello.go", 3) + if err != nil { + t.Fatal(err) + } + if pcln.version != ver12 { + t.Fatal("Expected pcln to parse as an older version") + } + if pc != 0x105c280 { + t.Fatalf("expect pc = 0x105c280, got 0x%x", pc) + } + if f.Name != "main.main" { + t.Fatalf("expected to parse name as main.main, got %v", f.Name) + } +} diff --git a/src/debug/gosym/testdata/pcln115.gz b/src/debug/gosym/testdata/pcln115.gz new file mode 100644 index 0000000000000000000000000000000000000000..db5c3d48ad10189661237a1ca5b55b346b80eee6 GIT binary patch literal 124875 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 literal 0 HcmV?d00001 diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index 1e86662adc..95f01c555b 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -334,12 +334,23 @@ const ( funcID_wrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.) ) +// PCHeader holds data used by the pclntab lookups. +type pcHeader struct { + magic uint32 // 0xFFFFFFFA + pad1, pad2 uint8 // 0,0 + minLC uint8 // min instruction size + ptrSize uint8 // size of a ptr in bytes + nfunc int // number of functions in the module + pclnOffset uintptr // offset to the pclntab variable from pcHeader +} + // moduledata records information about the layout of the executable // image. It is written by the linker. Any changes here must be // matched changes to the code in cmd/internal/ld/symtab.go:symtab. // moduledata is stored in statically allocated non-pointer memory; // none of the pointers here are visible to the garbage collector. type moduledata struct { + pcHeader *pcHeader pclntable []byte ftab []functab filetab []uint32 @@ -514,13 +525,10 @@ func moduledataverify() { const debugPcln = false func moduledataverify1(datap *moduledata) { - // See golang.org/s/go12symtab for header: 0xfffffffb, - // two zero bytes, a byte giving the PC quantum, - // and a byte giving the pointer width in bytes. - pcln := *(**[8]byte)(unsafe.Pointer(&datap.pclntable)) - pcln32 := *(**[2]uint32)(unsafe.Pointer(&datap.pclntable)) - if pcln32[0] != 0xfffffffb || pcln[4] != 0 || pcln[5] != 0 || pcln[6] != sys.PCQuantum || pcln[7] != sys.PtrSize { - println("runtime: function symbol table header:", hex(pcln32[0]), hex(pcln[4]), hex(pcln[5]), hex(pcln[6]), hex(pcln[7])) + // Check that the pclntab's format is valid. + hdr := datap.pcHeader + if hdr.magic != 0xfffffffa || hdr.pad1 != 0 || hdr.pad2 != 0 || hdr.minLC != sys.PCQuantum || hdr.ptrSize != sys.PtrSize { + println("runtime: function symbol table header:", hex(hdr.magic), hex(hdr.pad1), hex(hdr.pad2), hex(hdr.minLC), hex(hdr.ptrSize)) throw("invalid function symbol table\n") } -- GitLab From 365059e1d13c30c26ef0725becea2329f47cc16f Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 30 Jul 2020 14:35:51 -0400 Subject: [PATCH 0122/1792] [dev.link] cmd/link: add back SUNDEFEXT case The SUNDEFEXT case was lost during the refactoring. Add it back. Fix ppc64le build. Change-Id: I14594ee2c3e0a794c93839247fb3e6206c2e657a Reviewed-on: https://go-review.googlesource.com/c/go/+/245919 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/data.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 05ed022a74..ef49c2e0a2 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -658,7 +658,7 @@ func ExtrelocViaOuterSym(ldr *loader.Loader, r loader.Reloc, s loader.Sym) loade rs, off := FoldSubSymbolOffset(ldr, rs) rr.Xadd = r.Add() + off rst := ldr.SymType(rs) - if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil { + if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil { ldr.Errorf(s, "missing section for %s", ldr.SymName(rs)) } rr.Xsym = rs -- GitLab From 3067a8dc02f62c287a8ccd3fcf16bfdf4f687f5f Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 14 Jul 2020 13:12:58 -0400 Subject: [PATCH 0123/1792] [dev.link] cmd/link: use pclntabState and eliminate globals Non functional change. As runtime.pclntab breaks up, it'll be easier if we can just pass around the pclntab state. Also, eliminate the globals in pclntab. Change-Id: I2a5849e8f5f422a336a881e53a261e3997d11c44 Reviewed-on: https://go-review.googlesource.com/c/go/+/242599 Reviewed-by: Austin Clements Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/main.go | 7 +- src/cmd/link/internal/ld/pcln.go | 233 ++++++++++++++++------------- src/cmd/link/internal/ld/symtab.go | 25 ++-- 3 files changed, 146 insertions(+), 119 deletions(-) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index c2532ac290..3702f28dd8 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -288,13 +288,14 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("buildinfo") ctxt.buildinfo() bench.Start("pclntab") - container := ctxt.pclntab() + containers := ctxt.findContainerSyms() + pclnState := ctxt.pclntab(containers) bench.Start("findfunctab") - ctxt.findfunctab(container) + ctxt.findfunctab(pclnState, containers) bench.Start("dwarfGenerateDebugSyms") dwarfGenerateDebugSyms(ctxt) bench.Start("symtab") - symGroupType := ctxt.symtab() + symGroupType := ctxt.symtab(pclnState) bench.Start("dodata") ctxt.dodata(symGroupType) bench.Start("address") diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 5ea210c139..3759decbeb 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -19,28 +19,51 @@ import ( "strings" ) -// pclnState holds state information used during pclntab generation. -// Here 'ldr' is just a pointer to the context's loader, 'container' -// is a bitmap holding whether a given symbol index is an outer or -// container symbol, 'deferReturnSym' is the index for the symbol -// "runtime.deferreturn", 'nameToOffset' is a helper function for -// capturing function names, 'numberedFiles' records the file number -// assigned to a given file symbol, 'filepaths' is a slice of -// expanded paths (indexed by file number). -type pclnState struct { +// oldPclnState holds state information used during pclntab generation. Here +// 'ldr' is just a pointer to the context's loader, 'deferReturnSym' is the +// index for the symbol "runtime.deferreturn", 'nameToOffset' is a helper +// function for capturing function names, 'numberedFiles' records the file +// number assigned to a given file symbol, 'filepaths' is a slice of expanded +// paths (indexed by file number). +// +// NB: This is deprecated, and will be eliminated when pclntab_old is +// eliminated. +type oldPclnState struct { ldr *loader.Loader - container loader.Bitmap deferReturnSym loader.Sym nameToOffset func(name string) int32 numberedFiles map[loader.Sym]int64 filepaths []string } -func makepclnState(ctxt *Link) pclnState { +// pclntab holds the state needed for pclntab generation. +type pclntab struct { + // The first and last functions found. + firstFunc, lastFunc loader.Sym + + // The offset to the filetab. + filetabOffset int32 + + // runtime.pclntab's symbols + carrier loader.Sym + pclntab loader.Sym + pcheader loader.Sym + findfunctab loader.Sym + + // The number of functions + number of TEXT sections - 1. This is such an + // unexpected value because platforms that have more than one TEXT section + // get a dummy function inserted between because the external linker can place + // functions in those areas. We mark those areas as not covered by the Go + // runtime. + // + // On most platforms this is the number of reachable functions. + nfunc int32 +} + +func makeOldPclnState(ctxt *Link) *oldPclnState { ldr := ctxt.loader drs := ldr.Lookup("runtime.deferreturn", sym.SymVerABIInternal) - return pclnState{ - container: loader.MakeBitmap(ldr.NSym()), + state := &oldPclnState{ ldr: ldr, deferReturnSym: drs, numberedFiles: make(map[loader.Sym]int64), @@ -49,9 +72,42 @@ func makepclnState(ctxt *Link) pclnState { // return a value slot in filepaths. filepaths: []string{""}, } + + return state +} + +// makePclntab makes a pclnState object. +func makePclntab(ctxt *Link, container loader.Bitmap) *pclntab { + ldr := ctxt.loader + + state := &pclntab{} + + // Gather some basic stats and info. + prevSect := ldr.SymSect(ctxt.Textp[0]) + for _, s := range ctxt.Textp { + if !emitPcln(ctxt, s, container) { + continue + } + state.nfunc++ + if state.firstFunc == 0 { + state.firstFunc = s + } + state.lastFunc = s + ss := ldr.SymSect(s) + if ss != prevSect { + // With multiple text sections, the external linker may + // insert functions between the sections, which are not + // known by Go. This leaves holes in the PC range covered + // by the func table. We need to generate an entry to mark + // the hole. + state.nfunc++ + prevSect = ss + } + } + return state } -func (state *pclnState) ftabaddstring(ftab *loader.SymbolBuilder, s string) int32 { +func ftabaddstring(ftab *loader.SymbolBuilder, s string) int32 { start := len(ftab.Data()) ftab.Grow(int64(start + len(s) + 1)) // make room for s plus trailing NUL ftd := ftab.Data() @@ -60,7 +116,7 @@ func (state *pclnState) ftabaddstring(ftab *loader.SymbolBuilder, s string) int3 } // numberfile assigns a file number to the file if it hasn't been assigned already. -func (state *pclnState) numberfile(file loader.Sym) int64 { +func (state *oldPclnState) numberfile(file loader.Sym) int64 { if val, ok := state.numberedFiles[file]; ok { return val } @@ -72,14 +128,14 @@ func (state *pclnState) numberfile(file loader.Sym) int64 { return val } -func (state *pclnState) fileVal(file loader.Sym) int64 { +func (state *oldPclnState) fileVal(file loader.Sym) int64 { if val, ok := state.numberedFiles[file]; ok { return val } panic("should have been numbered first") } -func (state *pclnState) renumberfiles(ctxt *Link, fi loader.FuncInfo, d *sym.Pcdata) { +func (state *oldPclnState) renumberfiles(ctxt *Link, fi loader.FuncInfo, d *sym.Pcdata) { // Give files numbers. nf := fi.NumFile() for i := uint32(0); i < nf; i++ { @@ -146,7 +202,7 @@ func emitPcln(ctxt *Link, s loader.Sym, container loader.Bitmap) bool { return !container.Has(s) } -func (state *pclnState) computeDeferReturn(target *Target, s loader.Sym) uint32 { +func (state *oldPclnState) computeDeferReturn(target *Target, s loader.Sym) uint32 { deferreturn := uint32(0) lastWasmAddr := uint32(0) @@ -194,7 +250,7 @@ func (state *pclnState) computeDeferReturn(target *Target, s loader.Sym) uint32 // genInlTreeSym generates the InlTree sym for a function with the // specified FuncInfo. -func (state *pclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch) loader.Sym { +func (state *oldPclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch) loader.Sym { ldr := state.ldr its := ldr.CreateExtSym("", 0) inlTreeSym := ldr.MakeSymbolUpdater(its) @@ -229,16 +285,16 @@ func (state *pclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch) loader // generatePCHeader creates the runtime.pcheader symbol, setting it up as a // generator to fill in its data later. -func generatePCHeader(ctxt *Link, carrier *loader.SymbolBuilder, pclntabSym loader.Sym) { +func (state *pclntab) generatePCHeader(ctxt *Link) { ldr := ctxt.loader writeHeader := func(ctxt *Link, s loader.Sym) { ldr := ctxt.loader header := ctxt.loader.MakeSymbolUpdater(s) // Check symbol order. - diff := ldr.SymValue(pclntabSym) - ldr.SymValue(s) + diff := ldr.SymValue(state.pclntab) - ldr.SymValue(s) if diff <= 0 { - panic(fmt.Sprintf("expected runtime.pcheader(%x) to be placed before runtime.pclntab(%x)", ldr.SymValue(s), ldr.SymValue(pclntabSym))) + panic(fmt.Sprintf("expected runtime.pcheader(%x) to be placed before runtime.pclntab(%x)", ldr.SymValue(s), ldr.SymValue(state.pclntab))) } // Write header. @@ -246,30 +302,21 @@ func generatePCHeader(ctxt *Link, carrier *loader.SymbolBuilder, pclntabSym load header.SetUint32(ctxt.Arch, 0, 0xfffffffa) header.SetUint8(ctxt.Arch, 6, uint8(ctxt.Arch.MinLC)) header.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize)) - off := header.SetUint(ctxt.Arch, 8, uint64(pclntabNfunc)) + off := header.SetUint(ctxt.Arch, 8, uint64(state.nfunc)) header.SetUintptr(ctxt.Arch, off, uintptr(diff)) } size := int64(8 + 2*ctxt.Arch.PtrSize) - s := ctxt.createGeneratorSymbol("runtime.pcheader", 0, sym.SPCLNTAB, size, writeHeader) - ldr.SetAttrReachable(s, true) - ldr.SetCarrierSym(s, carrier.Sym()) + state.pcheader = ctxt.createGeneratorSymbol("runtime.pcheader", 0, sym.SPCLNTAB, size, writeHeader) + ldr.SetAttrReachable(state.pcheader, true) + ldr.SetCarrierSym(state.pcheader, state.carrier) } // pclntab initializes the pclntab symbol with // runtime function and file name information. -// These variables are used to initialize runtime.firstmoduledata, see symtab.go:symtab. -var pclntabNfunc int32 -var pclntabFiletabOffset int32 -var pclntabFirstFunc loader.Sym -var pclntabLastFunc loader.Sym - -// pclntab generates the pcln table for the link output. Return value -// is a bitmap indexed by global symbol that marks 'container' text -// symbols, e.g. the set of all symbols X such that Outer(S) = X for -// some other text symbol S. -func (ctxt *Link) pclntab() loader.Bitmap { +// pclntab generates the pcln table for the link output. +func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // Go 1.2's symtab layout is documented in golang.org/s/go12symtab, but the // layout and data has changed since that time. // @@ -291,70 +338,39 @@ func (ctxt *Link) pclntab() loader.Bitmap { // func structures, function names, pcdata tables. // filetable + oldState := makeOldPclnState(ctxt) + state := makePclntab(ctxt, container) + ldr := ctxt.loader - carrier := ldr.CreateSymForUpdate("runtime.pclntab", 0) - carrier.SetType(sym.SPCLNTAB) - carrier.SetReachable(true) + state.carrier = ldr.LookupOrCreateSym("runtime.pclntab", 0) + ldr.MakeSymbolUpdater(state.carrier).SetType(sym.SPCLNTAB) + ldr.SetAttrReachable(state.carrier, true) // runtime.pclntab_old is just a placeholder,and will eventually be deleted. // It contains the pieces of runtime.pclntab that haven't moved to a more // ration form. - pclntabSym := ldr.LookupOrCreateSym("runtime.pclntab_old", 0) - generatePCHeader(ctxt, carrier, pclntabSym) + state.pclntab = ldr.LookupOrCreateSym("runtime.pclntab_old", 0) + state.generatePCHeader(ctxt) funcdataBytes := int64(0) - ldr.SetCarrierSym(pclntabSym, carrier.Sym()) - ftab := ldr.MakeSymbolUpdater(pclntabSym) + ldr.SetCarrierSym(state.pclntab, state.carrier) + ftab := ldr.MakeSymbolUpdater(state.pclntab) ftab.SetType(sym.SPCLNTAB) ftab.SetReachable(true) - state := makepclnState(ctxt) - - // Find container symbols and mark them as such. - for _, s := range ctxt.Textp { - outer := ldr.OuterSym(s) - if outer != 0 { - state.container.Set(outer) - } - } - - // Gather some basic stats and info. - var nfunc int32 - prevSect := ldr.SymSect(ctxt.Textp[0]) - for _, s := range ctxt.Textp { - if !emitPcln(ctxt, s, state.container) { - continue - } - nfunc++ - if pclntabFirstFunc == 0 { - pclntabFirstFunc = s - } - ss := ldr.SymSect(s) - if ss != prevSect { - // With multiple text sections, the external linker may - // insert functions between the sections, which are not - // known by Go. This leaves holes in the PC range covered - // by the func table. We need to generate an entry to mark - // the hole. - nfunc++ - prevSect = ss - } - } - - pclntabNfunc = nfunc - ftab.Grow(int64(nfunc)*2*int64(ctxt.Arch.PtrSize) + int64(ctxt.Arch.PtrSize) + 4) + ftab.Grow(int64(state.nfunc)*2*int64(ctxt.Arch.PtrSize) + int64(ctxt.Arch.PtrSize) + 4) szHint := len(ctxt.Textp) * 2 funcnameoff := make(map[string]int32, szHint) nameToOffset := func(name string) int32 { nameoff, ok := funcnameoff[name] if !ok { - nameoff = state.ftabaddstring(ftab, name) + nameoff = ftabaddstring(ftab, name) funcnameoff[name] = nameoff } return nameoff } - state.nameToOffset = nameToOffset + oldState.nameToOffset = nameToOffset pctaboff := make(map[string]uint32, szHint) writepctab := func(off int32, p []byte) int32 { @@ -392,10 +408,10 @@ func (ctxt *Link) pclntab() loader.Bitmap { funcdata := []loader.Sym{} funcdataoff := []int64{} - nfunc = 0 // repurpose nfunc as a running index + var nfunc int32 prevFunc := ctxt.Textp[0] for _, s := range ctxt.Textp { - if !emitPcln(ctxt, s, state.container) { + if !emitPcln(ctxt, s, container) { continue } @@ -489,20 +505,20 @@ func (ctxt *Link) pclntab() loader.Bitmap { off = int32(ftab.SetUint32(ctxt.Arch, int64(off), args)) // deferreturn - deferreturn := state.computeDeferReturn(&ctxt.Target, s) + deferreturn := oldState.computeDeferReturn(&ctxt.Target, s) off = int32(ftab.SetUint32(ctxt.Arch, int64(off), deferreturn)) if fi.Valid() { pcsp = sym.Pcdata{P: fi.Pcsp()} pcfile = sym.Pcdata{P: fi.Pcfile()} pcline = sym.Pcdata{P: fi.Pcline()} - state.renumberfiles(ctxt, fi, &pcfile) + oldState.renumberfiles(ctxt, fi, &pcfile) if false { // Sanity check the new numbering it := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) for it.Init(pcfile.P); !it.Done; it.Next() { - if it.Value < 1 || it.Value > int32(len(state.numberedFiles)) { - ctxt.Errorf(s, "bad file number in pcfile: %d not in range [1, %d]\n", it.Value, len(state.numberedFiles)) + if it.Value < 1 || it.Value > int32(len(oldState.numberedFiles)) { + ctxt.Errorf(s, "bad file number in pcfile: %d not in range [1, %d]\n", it.Value, len(oldState.numberedFiles)) errorexit() } } @@ -510,7 +526,7 @@ func (ctxt *Link) pclntab() loader.Bitmap { } if fi.Valid() && fi.NumInlTree() > 0 { - its := state.genInlTreeSym(fi, ctxt.Arch) + its := oldState.genInlTreeSym(fi, ctxt.Arch) funcdata[objabi.FUNCDATA_InlTree] = its pcdata[objabi.PCDATA_InlTreeIndex] = sym.Pcdata{P: fi.Pcinline()} } @@ -567,36 +583,34 @@ func (ctxt *Link) pclntab() loader.Bitmap { nfunc++ } - last := ctxt.Textp[len(ctxt.Textp)-1] - pclntabLastFunc = last // Final entry of table is just end pc. - setAddr(ftab, ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, ldr.SymSize(last)) + setAddr(ftab, ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize), state.lastFunc, ldr.SymSize(state.lastFunc)) // Start file table. dSize := len(ftab.Data()) start := int32(dSize) start += int32(-dSize) & (int32(ctxt.Arch.PtrSize) - 1) - pclntabFiletabOffset = start + state.filetabOffset = start ftab.SetUint32(ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint32(start)) - nf := len(state.numberedFiles) + nf := len(oldState.numberedFiles) ftab.Grow(int64(start) + int64((nf+1)*4)) ftab.SetUint32(ctxt.Arch, int64(start), uint32(nf+1)) for i := nf; i > 0; i-- { - path := state.filepaths[i] + path := oldState.filepaths[i] val := int64(i) - ftab.SetUint32(ctxt.Arch, int64(start)+val*4, uint32(state.ftabaddstring(ftab, path))) + ftab.SetUint32(ctxt.Arch, int64(start)+val*4, uint32(ftabaddstring(ftab, path))) } ftab.SetSize(int64(len(ftab.Data()))) - ctxt.NumFilesyms = len(state.numberedFiles) + ctxt.NumFilesyms = len(oldState.numberedFiles) if ctxt.Debugvlog != 0 { ctxt.Logf("pclntab=%d bytes, funcdata total %d bytes\n", ftab.Size(), funcdataBytes) } - return state.container + return state } func gorootFinal() string { @@ -624,9 +638,7 @@ const ( // findfunctab generates a lookup table to quickly find the containing // function for a pc. See src/runtime/symtab.go:findfunc for details. -// 'container' is a bitmap indexed by global symbol holding whether -// a given text symbols is a container (outer sym). -func (ctxt *Link) findfunctab(container loader.Bitmap) { +func (ctxt *Link) findfunctab(state *pclntab, container loader.Bitmap) { ldr := ctxt.loader // find min and max address @@ -705,7 +717,22 @@ func (ctxt *Link) findfunctab(container loader.Bitmap) { } } - s := ctxt.createGeneratorSymbol("runtime.findfunctab", 0, sym.SRODATA, size, writeFindFuncTab) - ldr.SetAttrReachable(s, true) - ldr.SetAttrLocal(s, true) + state.findfunctab = ctxt.createGeneratorSymbol("runtime.findfunctab", 0, sym.SRODATA, size, writeFindFuncTab) + ldr.SetAttrReachable(state.findfunctab, true) + ldr.SetAttrLocal(state.findfunctab, true) +} + +// findContainerSyms returns a bitmap, indexed by symbol number, where there's +// a 1 for every container symbol. +func (ctxt *Link) findContainerSyms() loader.Bitmap { + ldr := ctxt.loader + container := loader.MakeBitmap(ldr.NSym()) + // Find container symbols and mark them as such. + for _, s := range ctxt.Textp { + outer := ldr.OuterSym(s) + if outer != 0 { + container.Set(outer) + } + } + return container } diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 15fa162c60..bf8ead3d0c 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -401,7 +401,7 @@ func textsectionmap(ctxt *Link) (loader.Sym, uint32) { return t.Sym(), uint32(n) } -func (ctxt *Link) symtab() []sym.SymKind { +func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { ldr := ctxt.loader if !ctxt.IsAIX() { @@ -608,25 +608,24 @@ func (ctxt *Link) symtab() []sym.SymKind { // This code uses several global variables that are set by pcln.go:pclntab. moduledata := ldr.MakeSymbolUpdater(ctxt.Moduledata) // The pcHeader - moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.pcheader", 0)) + moduledata.AddAddr(ctxt.Arch, pcln.pcheader) // The pclntab slice - pclntab := ldr.Lookup("runtime.pclntab_old", 0) - moduledata.AddAddr(ctxt.Arch, pclntab) - moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pclntab))) - moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pclntab))) + moduledata.AddAddr(ctxt.Arch, pcln.pclntab) + moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pclntab))) + moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pclntab))) // The ftab slice - moduledata.AddAddr(ctxt.Arch, pclntab) - moduledata.AddUint(ctxt.Arch, uint64(pclntabNfunc+1)) - moduledata.AddUint(ctxt.Arch, uint64(pclntabNfunc+1)) + moduledata.AddAddr(ctxt.Arch, pcln.pclntab) + moduledata.AddUint(ctxt.Arch, uint64(pcln.nfunc+1)) + moduledata.AddUint(ctxt.Arch, uint64(pcln.nfunc+1)) // The filetab slice - moduledata.AddAddrPlus(ctxt.Arch, pclntab, int64(pclntabFiletabOffset)) + moduledata.AddAddrPlus(ctxt.Arch, pcln.pclntab, int64(pcln.filetabOffset)) moduledata.AddUint(ctxt.Arch, uint64(ctxt.NumFilesyms)+1) moduledata.AddUint(ctxt.Arch, uint64(ctxt.NumFilesyms)+1) // findfunctab - moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.findfunctab", 0)) + moduledata.AddAddr(ctxt.Arch, pcln.findfunctab) // minpc, maxpc - moduledata.AddAddr(ctxt.Arch, pclntabFirstFunc) - moduledata.AddAddrPlus(ctxt.Arch, pclntabLastFunc, ldr.SymSize(pclntabLastFunc)) + moduledata.AddAddr(ctxt.Arch, pcln.firstFunc) + moduledata.AddAddrPlus(ctxt.Arch, pcln.lastFunc, ldr.SymSize(pcln.lastFunc)) // pointers to specific parts of the module moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.text", 0)) moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.etext", 0)) -- GitLab From 6ac9914383bc88d014cbc681dae758372e6ca823 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 16 Jul 2020 16:18:49 -0400 Subject: [PATCH 0124/1792] [dev.link] create runtime.funcnametab Move the function names out of runtime.pclntab_old, creating runtime.funcnametab. There is an unfortunate artifact in this change in that calculating the funcID still requires loading the name. Future work will likely pull this out and put it into the object file Funcs. ls -l cmd/compile (darwin): before: 18524016 after: 18519952 The difference in size can be attributed to alignment in pclntab_old. Change-Id: Ibcbb230d4632178f8fcd0667165f5335786381f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/243223 Reviewed-by: Austin Clements --- src/cmd/internal/goobj2/objfile.go | 5 + src/cmd/link/internal/ld/data.go | 56 ++++--- src/cmd/link/internal/ld/lib.go | 13 +- src/cmd/link/internal/ld/pcln.go | 138 +++++++++++++----- src/cmd/link/internal/ld/symtab.go | 4 + src/cmd/link/internal/loader/loader.go | 16 ++ src/cmd/link/internal/loader/symbolbuilder.go | 10 ++ src/debug/gosym/pclntab.go | 40 +++-- src/runtime/symtab.go | 18 ++- 9 files changed, 221 insertions(+), 79 deletions(-) diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index 1075c9f382..4465cfd5af 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -286,6 +286,11 @@ const ( SymFlagUsedInIface = 1 << iota ) +// Returns the length of the name of the symbol. +func (s *Sym) NameLen(r *Reader) int { + return int(binary.LittleEndian.Uint32(s[:])) +} + func (s *Sym) Name(r *Reader) string { len := binary.LittleEndian.Uint32(s[:]) off := binary.LittleEndian.Uint32(s[4:]) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index ef49c2e0a2..9bc0f021b1 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1922,6 +1922,7 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".gopclntab"), sym.SPCLNTAB, sym.SRODATA, relroSecPerm) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pcheader", 0), sect) + ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.funcnametab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab_old", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.epclntab", 0), sect) @@ -1978,6 +1979,7 @@ func (state *dodataState) allocateDwarfSections(ctxt *Link) { type symNameSize struct { name string sz int64 + val int64 sym loader.Sym } @@ -2020,28 +2022,37 @@ func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader checkSize := symn != sym.SELFGOT // Perform the sort. - sort.Slice(sl, func(i, j int) bool { - si, sj := sl[i].sym, sl[j].sym - switch { - case si == head, sj == tail: - return true - case sj == head, si == tail: - return false - } - if checkSize { - isz := sl[i].sz - jsz := sl[j].sz - if isz != jsz { - return isz < jsz + if symn != sym.SPCLNTAB { + sort.Slice(sl, func(i, j int) bool { + si, sj := sl[i].sym, sl[j].sym + switch { + case si == head, sj == tail: + return true + case sj == head, si == tail: + return false + } + 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 + } + return si < sj + }) + } else { + // PCLNTAB was built internally, and has the proper order based on value. + // Sort the symbols as such. + for k, s := range syms { + sl[k].val = ldr.SymValue(s) } - iname := sl[i].name - jname := sl[j].name - if iname != jname { - return iname < jname - } - return si < sj - }) + sort.Slice(sl, func(i, j int) bool { return sl[i].val < sl[j].val }) + } // Set alignment, construct result syms = syms[:0] @@ -2479,8 +2490,9 @@ func (ctxt *Link) address() []*sym.Segment { ctxt.xdefine("runtime.symtab", sym.SRODATA, int64(symtab.Vaddr)) ctxt.xdefine("runtime.esymtab", sym.SRODATA, int64(symtab.Vaddr+symtab.Length)) ctxt.xdefine("runtime.pclntab", sym.SRODATA, int64(pclntab.Vaddr)) - pcvar := ctxt.xdefine("runtime.pcheader", sym.SRODATA, int64(pclntab.Vaddr)) - ctxt.xdefine("runtime.pclntab_old", sym.SRODATA, int64(pclntab.Vaddr)+ldr.SymSize(pcvar)) + ctxt.defineInternal("runtime.pcheader", sym.SRODATA) + ctxt.defineInternal("runtime.funcnametab", sym.SRODATA) + ctxt.defineInternal("runtime.pclntab_old", sym.SRODATA) ctxt.xdefine("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length)) ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr)) ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr+noptr.Length)) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 7f5227de6d..ef4c86719e 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2367,16 +2367,21 @@ const ( DeletedAutoSym = 'x' ) -func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) loader.Sym { - ldr := ctxt.loader - s := ldr.CreateSymForUpdate(p, 0) +// defineInternal defines a symbol used internally by the go runtime. +func (ctxt *Link) defineInternal(p string, t sym.SymKind) loader.Sym { + s := ctxt.loader.CreateSymForUpdate(p, 0) s.SetType(t) - s.SetValue(v) s.SetSpecial(true) s.SetLocal(true) return s.Sym() } +func (ctxt *Link) xdefine(p string, t sym.SymKind, v int64) loader.Sym { + s := ctxt.defineInternal(p, t) + ctxt.loader.SetSymValue(s, v) + return s +} + func datoff(ldr *loader.Loader, s loader.Sym, addr int64) int64 { if uint64(addr) >= Segdata.Vaddr { return int64(uint64(addr) - Segdata.Vaddr + Segdata.Fileoff) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 3759decbeb..1b59b80e26 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -31,7 +31,6 @@ import ( type oldPclnState struct { ldr *loader.Loader deferReturnSym loader.Sym - nameToOffset func(name string) int32 numberedFiles map[loader.Sym]int64 filepaths []string } @@ -44,10 +43,14 @@ type pclntab struct { // The offset to the filetab. filetabOffset int32 + // Running total size of pclntab. + size int64 + // runtime.pclntab's symbols carrier loader.Sym pclntab loader.Sym pcheader loader.Sym + funcnametab loader.Sym findfunctab loader.Sym // The number of functions + number of TEXT sections - 1. This is such an @@ -58,6 +61,23 @@ type pclntab struct { // // On most platforms this is the number of reachable functions. nfunc int32 + + // maps the function symbol to offset in runtime.funcnametab + // This doesn't need to reside in the state once pclntab_old's been + // deleted -- it can live in generateFuncnametab. + // TODO(jfaller): Delete me! + funcNameOffset map[loader.Sym]int32 +} + +// addGeneratedSym adds a generator symbol to pclntab, returning the new Sym. +// It is the caller's responsibilty to save they symbol in state. +func (state *pclntab) addGeneratedSym(ctxt *Link, name string, size int64, f generatorFunc) loader.Sym { + size = Rnd(size, int64(ctxt.Arch.PtrSize)) + state.size += size + s := ctxt.createGeneratorSymbol(name, 0, sym.SPCLNTAB, size, f) + ctxt.loader.SetAttrReachable(s, true) + ctxt.loader.SetCarrierSym(s, state.carrier) + return s } func makeOldPclnState(ctxt *Link) *oldPclnState { @@ -76,11 +96,13 @@ func makeOldPclnState(ctxt *Link) *oldPclnState { return state } -// makePclntab makes a pclnState object. +// makePclntab makes a pclntab object. func makePclntab(ctxt *Link, container loader.Bitmap) *pclntab { ldr := ctxt.loader - state := &pclntab{} + state := &pclntab{ + funcNameOffset: make(map[loader.Sym]int32, ldr.NSym()), + } // Gather some basic stats and info. prevSect := ldr.SymSect(ctxt.Textp[0]) @@ -250,7 +272,7 @@ func (state *oldPclnState) computeDeferReturn(target *Target, s loader.Sym) uint // genInlTreeSym generates the InlTree sym for a function with the // specified FuncInfo. -func (state *oldPclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch) loader.Sym { +func (state *oldPclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch, newState *pclntab) loader.Sym { ldr := state.ldr its := ldr.CreateExtSym("", 0) inlTreeSym := ldr.MakeSymbolUpdater(its) @@ -269,11 +291,13 @@ func (state *oldPclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch) loa // appears in the Pcfile table. In that case, this assigns // the outer file a number. val := state.numberfile(call.File) - fn := ldr.SymName(call.Func) - nameoff := state.nameToOffset(fn) + nameoff, ok := newState.funcNameOffset[call.Func] + if !ok { + panic("couldn't find function name offset") + } inlTreeSym.SetUint16(arch, int64(i*20+0), uint16(call.Parent)) - inlTreeSym.SetUint8(arch, int64(i*20+2), uint8(objabi.GetFuncID(fn, ""))) + inlTreeSym.SetUint8(arch, int64(i*20+2), uint8(objabi.GetFuncID(ldr.SymName(call.Func), ""))) // byte 3 is unused inlTreeSym.SetUint32(arch, int64(i*20+4), uint32(val)) inlTreeSym.SetUint32(arch, int64(i*20+8), uint32(call.Line)) @@ -286,15 +310,17 @@ func (state *oldPclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch) loa // generatePCHeader creates the runtime.pcheader symbol, setting it up as a // generator to fill in its data later. func (state *pclntab) generatePCHeader(ctxt *Link) { - ldr := ctxt.loader writeHeader := func(ctxt *Link, s loader.Sym) { ldr := ctxt.loader header := ctxt.loader.MakeSymbolUpdater(s) - // Check symbol order. - diff := ldr.SymValue(state.pclntab) - ldr.SymValue(s) - if diff <= 0 { - panic(fmt.Sprintf("expected runtime.pcheader(%x) to be placed before runtime.pclntab(%x)", ldr.SymValue(s), ldr.SymValue(state.pclntab))) + writeSymOffset := func(off int64, ws loader.Sym) int64 { + diff := ldr.SymValue(ws) - ldr.SymValue(s) + if diff <= 0 { + name := ldr.SymName(ws) + panic(fmt.Sprintf("expected runtime.pcheader(%x) to be placed before %s(%x)", ldr.SymValue(s), name, ldr.SymValue(ws))) + } + return header.SetUintptr(ctxt.Arch, off, uintptr(diff)) } // Write header. @@ -303,13 +329,62 @@ func (state *pclntab) generatePCHeader(ctxt *Link) { header.SetUint8(ctxt.Arch, 6, uint8(ctxt.Arch.MinLC)) header.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize)) off := header.SetUint(ctxt.Arch, 8, uint64(state.nfunc)) - header.SetUintptr(ctxt.Arch, off, uintptr(diff)) + off = writeSymOffset(off, state.funcnametab) + off = writeSymOffset(off, state.pclntab) } - size := int64(8 + 2*ctxt.Arch.PtrSize) - state.pcheader = ctxt.createGeneratorSymbol("runtime.pcheader", 0, sym.SPCLNTAB, size, writeHeader) - ldr.SetAttrReachable(state.pcheader, true) - ldr.SetCarrierSym(state.pcheader, state.carrier) + size := int64(8 + 3*ctxt.Arch.PtrSize) + state.pcheader = state.addGeneratedSym(ctxt, "runtime.pcheader", size, writeHeader) +} + +// walkFuncs iterates over the Textp, calling a function for each unique +// function and inlined function. +func (state *pclntab) walkFuncs(ctxt *Link, container loader.Bitmap, f func(loader.Sym)) { + ldr := ctxt.loader + seen := make(map[loader.Sym]struct{}) + for _, ls := range ctxt.Textp { + s := loader.Sym(ls) + if !emitPcln(ctxt, s, container) { + continue + } + if _, ok := seen[s]; !ok { + f(s) + seen[s] = struct{}{} + } + + fi := ldr.FuncInfo(s) + if !fi.Valid() { + continue + } + fi.Preload() + for i, ni := 0, fi.NumInlTree(); i < int(ni); i++ { + call := fi.InlTree(i).Func + if _, ok := seen[call]; !ok { + f(call) + seen[call] = struct{}{} + } + } + } +} + +// generateFuncnametab creates the function name table. +func (state *pclntab) generateFuncnametab(ctxt *Link, container loader.Bitmap) { + // Write the null terminated strings. + writeFuncNameTab := func(ctxt *Link, s loader.Sym) { + symtab := ctxt.loader.MakeSymbolUpdater(s) + for s, off := range state.funcNameOffset { + symtab.AddStringAt(int64(off), ctxt.loader.SymName(s)) + } + } + + // Loop through the CUs, and calculate the size needed. + var size int64 + state.walkFuncs(ctxt, container, func(s loader.Sym) { + state.funcNameOffset[s] = int32(size) + size += int64(ctxt.loader.SymNameLen(s)) + 1 // NULL terminate + }) + + state.funcnametab = state.addGeneratedSym(ctxt, "runtime.funcnametab", size, writeFuncNameTab) } // pclntab initializes the pclntab symbol with @@ -329,13 +404,17 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // runtime.pcheader (see: runtime/symtab.go:pcHeader) // 8-byte magic // nfunc [thearch.ptrsize bytes] + // offset to runtime.funcnametab from the beginning of runtime.pcheader // offset to runtime.pclntab_old from beginning of runtime.pcheader // + // runtime.funcnametab + // []list of null terminated function names + // // runtime.pclntab_old // function table, alternating PC and offset to func struct [each entry thearch.ptrsize bytes] // end PC [thearch.ptrsize bytes] // offset to file table [4 bytes] - // func structures, function names, pcdata tables. + // func structures, pcdata tables. // filetable oldState := makeOldPclnState(ctxt) @@ -351,27 +430,18 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // ration form. state.pclntab = ldr.LookupOrCreateSym("runtime.pclntab_old", 0) state.generatePCHeader(ctxt) + state.generateFuncnametab(ctxt, container) funcdataBytes := int64(0) ldr.SetCarrierSym(state.pclntab, state.carrier) ftab := ldr.MakeSymbolUpdater(state.pclntab) + ftab.SetValue(state.size) ftab.SetType(sym.SPCLNTAB) ftab.SetReachable(true) ftab.Grow(int64(state.nfunc)*2*int64(ctxt.Arch.PtrSize) + int64(ctxt.Arch.PtrSize) + 4) szHint := len(ctxt.Textp) * 2 - funcnameoff := make(map[string]int32, szHint) - nameToOffset := func(name string) int32 { - nameoff, ok := funcnameoff[name] - if !ok { - nameoff = ftabaddstring(ftab, name) - funcnameoff[name] = nameoff - } - return nameoff - } - oldState.nameToOffset = nameToOffset - pctaboff := make(map[string]uint32, szHint) writepctab := func(off int32, p []byte) int32 { start, ok := pctaboff[string(p)] @@ -492,8 +562,10 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { off = int32(setAddr(ftab, ctxt.Arch, int64(off), s, 0)) // name int32 - sn := ldr.SymName(s) - nameoff := nameToOffset(sn) + nameoff, ok := state.funcNameOffset[s] + if !ok { + panic("couldn't find function name offset") + } off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(nameoff))) // args int32 @@ -526,7 +598,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { } if fi.Valid() && fi.NumInlTree() > 0 { - its := oldState.genInlTreeSym(fi, ctxt.Arch) + its := oldState.genInlTreeSym(fi, ctxt.Arch, state) funcdata[objabi.FUNCDATA_InlTree] = its pcdata[objabi.PCDATA_InlTreeIndex] = sym.Pcdata{P: fi.Pcinline()} } @@ -543,7 +615,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { filesymname := ldr.SymName(fi.File(0)) file = filesymname[len(src.FileSymPrefix):] } - funcID := objabi.GetFuncID(sn, file) + funcID := objabi.GetFuncID(ldr.SymName(s), file) off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(funcID))) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index bf8ead3d0c..8d2cbd8133 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -609,6 +609,10 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { moduledata := ldr.MakeSymbolUpdater(ctxt.Moduledata) // 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))) // The pclntab slice moduledata.AddAddr(ctxt.Arch, pcln.pclntab) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pclntab))) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 89dce53ce5..251bfa018b 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -709,6 +709,22 @@ func (l *Loader) NReachableSym() int { return l.attrReachable.Count() } +// SymNameLen returns the length of the symbol name, trying hard not to load +// the name. +func (l *Loader) SymNameLen(i Sym) int { + // Not much we can do about external symbols. + if l.IsExternal(i) { + return len(l.SymName(i)) + } + r, li := l.toLocal(i) + le := r.Sym(li).NameLen(r.Reader) + if !r.NeedNameExpansion() { + return le + } + // Just load the symbol name. We don't know how expanded it'll be. + return len(l.SymName(i)) +} + // Returns the raw (unpatched) name of the i-th symbol. func (l *Loader) RawSymName(i Sym) string { if l.IsExternal(i) { diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index 314111d5ea..d8b800f375 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -311,6 +311,16 @@ func (sb *SymbolBuilder) SetAddr(arch *sys.Arch, off int64, tgt Sym) int64 { return sb.SetAddrPlus(arch, off, tgt, 0) } +func (sb *SymbolBuilder) AddStringAt(off int64, str string) int64 { + strLen := int64(len(str)) + if off+strLen+1 > int64(len(sb.data)) { + panic("attempt to write past end of buffer") + } + copy(sb.data[off:off+strLen], str) + sb.data[off+strLen] = 0 + return off + strLen + 1 +} + func (sb *SymbolBuilder) Addstring(str string) int64 { if sb.kind == 0 { sb.kind = sym.SNOPTRDATA diff --git a/src/debug/gosym/pclntab.go b/src/debug/gosym/pclntab.go index 8c7ace17cd..e5c50520fc 100644 --- a/src/debug/gosym/pclntab.go +++ b/src/debug/gosym/pclntab.go @@ -49,16 +49,18 @@ type LineTable struct { version version // Go 1.2/1.16 state - binary binary.ByteOrder - quantum uint32 - ptrsize uint32 - funcdata []byte - functab []byte - nfunctab uint32 - filetab []byte - nfiletab uint32 - fileMap map[string]uint32 - strings map[uint32]string // interned substrings of Data, keyed by offset + binary binary.ByteOrder + quantum uint32 + ptrsize uint32 + funcnametab []byte + funcdata []byte + functab []byte + nfunctab uint32 + filetab []byte + nfiletab uint32 + fileMap map[string]uint32 + funcNames map[uint32]string // cache the function names + strings map[uint32]string // interned substrings of Data, keyed by offset } // NOTE(rsc): This is wrong for GOARCH=arm, which uses a quantum of 4, @@ -139,7 +141,7 @@ func (t *LineTable) LineToPC(line int, maxpc uint64) uint64 { // Text must be the start address of the // corresponding text segment. func NewLineTable(data []byte, text uint64) *LineTable { - return &LineTable{Data: data, PC: text, Line: 0, strings: make(map[uint32]string)} + return &LineTable{Data: data, PC: text, Line: 0, funcNames: make(map[uint32]string), strings: make(map[uint32]string)} } // Go 1.2 symbol table format. @@ -222,6 +224,8 @@ func (t *LineTable) parsePclnTab() { case ver116: t.nfunctab = uint32(t.uintptr(t.Data[8:])) offset := t.uintptr(t.Data[8+t.ptrsize:]) + t.funcnametab = t.Data[offset:] + offset = t.uintptr(t.Data[8+2*t.ptrsize:]) t.funcdata = t.Data[offset:] t.functab = t.Data[offset:] functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize @@ -233,6 +237,7 @@ func (t *LineTable) parsePclnTab() { case ver12: t.nfunctab = uint32(t.uintptr(t.Data[8:])) t.funcdata = t.Data + t.funcnametab = t.Data t.functab = t.Data[8+t.ptrsize:] functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize fileoff := t.binary.Uint32(t.functab[functabsize:]) @@ -265,7 +270,7 @@ func (t *LineTable) go12Funcs() []Func { f.Sym = &Sym{ Value: f.Entry, Type: 'T', - Name: t.string(t.binary.Uint32(info[t.ptrsize:])), + Name: t.funcName(t.binary.Uint32(info[t.ptrsize:])), GoType: 0, Func: f, } @@ -314,6 +319,17 @@ func (t *LineTable) readvarint(pp *[]byte) uint32 { return v } +// funcName returns the name of the function found at off. +func (t *LineTable) funcName(off uint32) string { + if s, ok := t.funcNames[off]; ok { + return s + } + i := bytes.IndexByte(t.funcnametab[off:], 0) + s := string(t.funcnametab[off : off+uint32(i)]) + t.funcNames[off] = s + return s +} + // string returns a Go string found at off. func (t *LineTable) string(off uint32) string { if s, ok := t.strings[off]; ok { diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index 95f01c555b..ddb5ea82b4 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -336,12 +336,13 @@ const ( // PCHeader holds data used by the pclntab lookups. type pcHeader struct { - magic uint32 // 0xFFFFFFFA - pad1, pad2 uint8 // 0,0 - minLC uint8 // min instruction size - ptrSize uint8 // size of a ptr in bytes - nfunc int // number of functions in the module - pclnOffset uintptr // offset to the pclntab variable from pcHeader + magic uint32 // 0xFFFFFFFA + pad1, pad2 uint8 // 0,0 + minLC uint8 // min instruction size + ptrSize uint8 // size of a ptr in bytes + nfunc int // number of functions in the module + funcnameOffset uintptr // offset to the funcnametab variable from pcHeader + pclnOffset uintptr // offset to the pclntab variable from pcHeader } // moduledata records information about the layout of the executable @@ -351,6 +352,7 @@ type pcHeader struct { // none of the pointers here are visible to the garbage collector. type moduledata struct { pcHeader *pcHeader + funcnametab []byte pclntable []byte ftab []functab filetab []uint32 @@ -826,7 +828,7 @@ func cfuncname(f funcInfo) *byte { if !f.valid() || f.nameoff == 0 { return nil } - return &f.datap.pclntable[f.nameoff] + return &f.datap.funcnametab[f.nameoff] } func funcname(f funcInfo) string { @@ -837,7 +839,7 @@ func cfuncnameFromNameoff(f funcInfo, nameoff int32) *byte { if !f.valid() { return nil } - return &f.datap.pclntable[nameoff] + return &f.datap.funcnametab[nameoff] } func funcnameFromNameoff(f funcInfo, nameoff int32) string { -- GitLab From 128f4e51f2d60c984f9bcb68ac141eff6e47875e Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 28 Jul 2020 13:49:13 -0400 Subject: [PATCH 0125/1792] [dev.link] ensure package path is set when TEXT symbols are created We're reworking pclntab generation in the linker, and with that we're moving FuncID generation in to the compiler. Determining the FuncID is done by a lookup on the package.function name; therefore, we need the package whenever we make the TEXT symbols. Change-Id: I805445ffbf2f895f06ce3a91fb09126d012bf86e Reviewed-on: https://go-review.googlesource.com/c/go/+/245318 Reviewed-by: Austin Clements Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/main.go | 3 ++- src/cmd/dist/build.go | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index bb28ef01a1..4417e70616 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -285,6 +285,8 @@ func Main(archInit func(*Arch)) { objabi.Flagparse(usage) + Ctxt.Pkgpath = myimportpath + for _, f := range strings.Split(spectre, ",") { f = strings.TrimSpace(f) switch f { @@ -789,7 +791,6 @@ func Main(archInit func(*Arch)) { // Write object data to disk. timings.Start("be", "dumpobj") dumpdata() - Ctxt.Pkgpath = myimportpath Ctxt.NumberSyms() dumpobj() if asmhdr != "" { diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 9e2b4f33b8..a817e6fcd7 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -824,6 +824,7 @@ func runInstall(pkg string, ch chan struct{}) { "-D", "GOOS_" + goos, "-D", "GOARCH_" + goarch, "-D", "GOOS_GOARCH_" + goos + "_" + goarch, + "-p", pkg, } if goarch == "mips" || goarch == "mipsle" { // Define GOMIPS_value from gomips. -- GitLab From 847b9be3f62c7c93d3faf34577675e97176f6f7d Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Jul 2020 19:32:31 -0400 Subject: [PATCH 0126/1792] [dev.link] cmd/link: make symbol attribute setting more reliable For dupOK symbols, their attributes should be OR'd. Most of the attributes are expected to be set consistently across multiple definitions, but UsedInIface must be OR'd, and for alignment we need to pick the largest one. Currently the attributes are not always OR'd, depending on addSym returning true or false. This doesn't cause any real problem, but it would be a problem if we make type descriptor symbols content-addressable. This CL removes the second result of addSym, and lets preloadSyms always set the attributes. Also removes the alignment handling on addSym, handles it in preloadSyms only. Change-Id: I06b3f0adb733f6681956ea9ef54736baa86ae7bc Reviewed-on: https://go-review.googlesource.com/c/go/+/245720 Reviewed-by: Jeremy Faller --- src/cmd/link/internal/loader/loader.go | 78 +++++++++------------ src/cmd/link/internal/loader/loader_test.go | 6 +- 2 files changed, 33 insertions(+), 51 deletions(-) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 251bfa018b..16331e0825 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -172,10 +172,9 @@ func growBitmap(reqLen int, b Bitmap) Bitmap { return b } -type symSizeAlign struct { - sym Sym - size uint32 - align uint32 +type symAndSize struct { + sym Sym + size uint32 } // A Loader loads new object files and resolves indexed symbol references. @@ -205,10 +204,10 @@ type Loader struct { objSyms []objSym // global index mapping to local index - hashed64Syms map[uint64]symSizeAlign // short hashed (content-addressable) symbols, keyed by content hash - hashedSyms map[goobj2.HashType]symSizeAlign // hashed (content-addressable) symbols, keyed by content hash - symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal - extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name + hashed64Syms map[uint64]symAndSize // short hashed (content-addressable) symbols, keyed by content hash + hashedSyms map[goobj2.HashType]symAndSize // hashed (content-addressable) symbols, keyed by content hash + symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal + extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name extReader *oReader // a dummy oReader, for external symbols payloadBatch []extSymPayload @@ -331,8 +330,8 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor objs: []objIdx{{}, {extReader, 0}}, // reserve index 0 for nil symbol, 1 for external symbols objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol extReader: extReader, - hashed64Syms: make(map[uint64]symSizeAlign, 10000), // TODO: adjust preallocation sizes - hashedSyms: make(map[goobj2.HashType]symSizeAlign, 20000), // TODO: adjust preallocation sizes + hashed64Syms: make(map[uint64]symAndSize, 10000), // TODO: adjust preallocation sizes + hashedSyms: make(map[goobj2.HashType]symAndSize, 20000), // TODO: adjust preallocation sizes 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]*oReader), outer: make(map[Sym]Sym), @@ -382,9 +381,9 @@ func (l *Loader) addObj(pkg string, r *oReader) Sym { return i } -// Add a symbol from an object file, return the global index and whether it is added. +// Add a symbol from an object file, return the global index. // If the symbol already exist, it returns the index of that symbol. -func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, osym *goobj2.Sym) (Sym, bool) { +func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, osym *goobj2.Sym) Sym { if l.extStart != 0 { panic("addSym called after external symbol is created") } @@ -394,14 +393,14 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o } if name == "" && kind != hashed64Def && kind != hashedDef { addToGlobal() - return i, true // unnamed aux symbol + return i // unnamed aux symbol } if ver == r.version { // Static symbol. Add its global index but don't // add to name lookup table, as it cannot be // referenced by name. addToGlobal() - return i, true + return i } switch kind { case pkgDef: @@ -412,33 +411,32 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o // referenced by name (e.g. through linkname). l.symsByName[ver][name] = i addToGlobal() - return i, true + return i case hashed64Def, hashedDef: // Hashed (content-addressable) symbol. Check the hash // but don't add to name lookup table, as they are not // referenced by name. Also no need to do overwriting // check, as same hash indicates same content. - var checkHash func() (symSizeAlign, bool) - var addToHashMap func(symSizeAlign) + var checkHash func() (symAndSize, bool) + var addToHashMap func(symAndSize) var h64 uint64 // only used for hashed64Def var h *goobj2.HashType // only used for hashedDef if kind == hashed64Def { - checkHash = func() (symSizeAlign, bool) { + checkHash = func() (symAndSize, bool) { h64 = r.Hash64(li - uint32(r.ndef)) s, existed := l.hashed64Syms[h64] return s, existed } - addToHashMap = func(ss symSizeAlign) { l.hashed64Syms[h64] = ss } + addToHashMap = func(ss symAndSize) { l.hashed64Syms[h64] = ss } } else { - checkHash = func() (symSizeAlign, bool) { + checkHash = func() (symAndSize, bool) { h = r.Hash(li - uint32(r.ndef+r.nhashed64def)) s, existed := l.hashedSyms[*h] return s, existed } - addToHashMap = func(ss symSizeAlign) { l.hashedSyms[*h] = ss } + addToHashMap = func(ss symAndSize) { l.hashedSyms[*h] = ss } } siz := osym.Siz() - align := osym.Align() if s, existed := checkHash(); existed { // The content hash is built from symbol data and relocations. In the // object file, the symbol data may not always contain trailing zeros, @@ -449,25 +447,16 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o // hash("A") == hash("A\0\0\0"). // So when two symbols have the same hash, we need to use the one with // larger size. - if siz <= s.size { - if align > s.align { // we need to use the biggest alignment - l.SetSymAlign(s.sym, int32(align)) - addToHashMap(symSizeAlign{s.sym, s.size, align}) - } - } else { + if siz > s.size { // New symbol has larger size, use the new one. Rewrite the index mapping. l.objSyms[s.sym] = objSym{r.objidx, li} - if align < s.align { - align = s.align // keep the biggest alignment - l.SetSymAlign(s.sym, int32(align)) - } - addToHashMap(symSizeAlign{s.sym, siz, align}) + addToHashMap(symAndSize{s.sym, siz}) } - return s.sym, false + return s.sym } - addToHashMap(symSizeAlign{i, siz, align}) + addToHashMap(symAndSize{i, siz}) addToGlobal() - return i, true + return i } // Non-package (named) symbol. Check if it already exists. @@ -475,19 +464,19 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o if !existed { l.symsByName[ver][name] = i addToGlobal() - return i, true + return i } // symbol already exists if osym.Dupok() { if l.flags&FlagStrictDups != 0 { l.checkdup(name, r, li, oldi) } - return oldi, false + return oldi } oldr, oldli := l.toLocal(oldi) oldsym := oldr.Sym(oldli) if oldsym.Dupok() { - return oldi, false + return oldi } overwrite := r.DataSize(li) != 0 if overwrite { @@ -504,7 +493,7 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o log.Fatalf("duplicated definition of symbol " + name) } } - return oldi, true + return oldi } // newExtSym creates a new external sym with the specified @@ -2113,11 +2102,8 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { } v = abiToVer(osym.ABI(), r.version) } - gi, added := l.addSym(name, v, r, i, kind, osym) + gi := l.addSym(name, v, r, i, kind, osym) r.syms[i] = gi - if !added { - continue - } if osym.TopFrame() { l.SetAttrTopFrame(gi, true) } @@ -2137,8 +2123,8 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { l.builtinSyms[bi] = gi } } - if a := osym.Align(); a != 0 { - l.SetSymAlign(gi, int32(a)) + if a := int32(osym.Align()); a != 0 && a > l.SymAlign(gi) { + l.SetSymAlign(gi, a) } } } diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 95f1a36b1a..70e0986ac7 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -21,11 +21,7 @@ import ( // data or relocations). func addDummyObjSym(t *testing.T, ldr *Loader, or *oReader, name string) Sym { idx := uint32(len(ldr.objSyms)) - s, ok := ldr.addSym(name, 0, or, idx, nonPkgDef, &goobj2.Sym{}) - if !ok { - t.Errorf("AddrSym failed for '" + name + "'") - } - return s + return ldr.addSym(name, 0, or, idx, nonPkgDef, &goobj2.Sym{}) } func mkLoader() *Loader { -- GitLab From 89cf569a45f035bae45553f399880b92ede65f38 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 21 Jul 2020 15:53:30 -0400 Subject: [PATCH 0127/1792] [dev.link] move FuncID creation into the compiler/assembler Leaving creation of the funcID till the linker requires the linker to load the function and file names into memory. Moving these into the compiler/assembler prevents this. This work is a step towards moving all func metadata into the compiler. Change-Id: Iebffdc5a909adbd03ac263fde3f4c3d492fb1eac Reviewed-on: https://go-review.googlesource.com/c/go/+/244024 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Austin Clements --- src/cmd/compile/internal/gc/closure.go | 1 + src/cmd/internal/goobj2/funcinfo.go | 16 +++++++++++----- src/cmd/internal/goobj2/objfile.go | 4 ++-- src/cmd/internal/obj/link.go | 1 + src/cmd/internal/obj/objfile.go | 2 +- src/cmd/internal/obj/objfile2.go | 1 + src/cmd/internal/obj/plist.go | 2 ++ src/cmd/internal/objabi/funcid.go | 22 ++++------------------ src/cmd/link/internal/ld/pcln.go | 18 +++++++++++------- src/cmd/link/internal/loader/loader.go | 4 ++++ 10 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index 9d71c1e2ef..3bb7bb9834 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -429,6 +429,7 @@ func typecheckpartialcall(fn *Node, sym *types.Sym) { // Create top-level function. xfunc := makepartialcall(fn, fn.Type, sym) fn.Func = xfunc.Func + fn.Func.SetWrapper(true) fn.Right = newname(sym) fn.Op = OCALLPART fn.Type = xfunc.Type diff --git a/src/cmd/internal/goobj2/funcinfo.go b/src/cmd/internal/goobj2/funcinfo.go index 36b2de20cd..b525c88b13 100644 --- a/src/cmd/internal/goobj2/funcinfo.go +++ b/src/cmd/internal/goobj2/funcinfo.go @@ -6,6 +6,7 @@ package goobj2 import ( "bytes" + "cmd/internal/objabi" "encoding/binary" ) @@ -16,6 +17,7 @@ import ( type FuncInfo struct { Args uint32 Locals uint32 + FuncID objabi.FuncID Pcsp uint32 Pcfile uint32 @@ -38,6 +40,7 @@ func (a *FuncInfo) Write(w *bytes.Buffer) { writeUint32(a.Args) writeUint32(a.Locals) + writeUint32(uint32(a.FuncID)) writeUint32(a.Pcsp) writeUint32(a.Pcfile) @@ -72,6 +75,7 @@ func (a *FuncInfo) Read(b []byte) { a.Args = readUint32() a.Locals = readUint32() + a.FuncID = objabi.FuncID(readUint32()) a.Pcsp = readUint32() a.Pcfile = readUint32() @@ -120,7 +124,7 @@ type FuncInfoLengths struct { func (*FuncInfo) ReadFuncInfoLengths(b []byte) FuncInfoLengths { var result FuncInfoLengths - const numpcdataOff = 24 + const numpcdataOff = 28 result.NumPcdata = binary.LittleEndian.Uint32(b[numpcdataOff:]) result.PcdataOff = numpcdataOff + 4 @@ -146,24 +150,26 @@ func (*FuncInfo) ReadArgs(b []byte) uint32 { return binary.LittleEndian.Uint32(b func (*FuncInfo) ReadLocals(b []byte) uint32 { return binary.LittleEndian.Uint32(b[4:]) } +func (*FuncInfo) ReadFuncID(b []byte) uint32 { return binary.LittleEndian.Uint32(b[8:]) } + // return start and end offsets. func (*FuncInfo) ReadPcsp(b []byte) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[8:]), binary.LittleEndian.Uint32(b[12:]) + return binary.LittleEndian.Uint32(b[12:]), binary.LittleEndian.Uint32(b[16:]) } // return start and end offsets. func (*FuncInfo) ReadPcfile(b []byte) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[12:]), binary.LittleEndian.Uint32(b[16:]) + return binary.LittleEndian.Uint32(b[16:]), binary.LittleEndian.Uint32(b[20:]) } // return start and end offsets. func (*FuncInfo) ReadPcline(b []byte) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[16:]), binary.LittleEndian.Uint32(b[20:]) + return binary.LittleEndian.Uint32(b[20:]), binary.LittleEndian.Uint32(b[24:]) } // return start and end offsets. func (*FuncInfo) ReadPcinline(b []byte, pcdataoffset uint32) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[20:]), binary.LittleEndian.Uint32(b[pcdataoffset:]) + return binary.LittleEndian.Uint32(b[24:]), binary.LittleEndian.Uint32(b[pcdataoffset:]) } // return start and end offsets. diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index 4465cfd5af..eae9b5587c 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -21,7 +21,7 @@ import ( // New object file format. // // Header struct { -// Magic [...]byte // "\x00go115ld" +// Magic [...]byte // "\x00go116ld" // Fingerprint [8]byte // Flags uint32 // Offsets [...]uint32 // byte offset of each block below @@ -199,7 +199,7 @@ type Header struct { Offsets [NBlk]uint32 } -const Magic = "\x00go115ld" +const Magic = "\x00go116ld" func (h *Header) Write(w *Writer) { w.RawString(h.Magic) diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 195af8494c..8d189b71f9 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -400,6 +400,7 @@ type FuncInfo struct { Args int32 Locals int32 Align int32 + FuncID objabi.FuncID Text *Prog Autot map[*LSym]struct{} Pcln Pcln diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index c0194c5a6d..2f28b6eeec 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -40,7 +40,7 @@ func (ctxt *Link) writeSymDebugNamed(s *LSym, name string) { } fmt.Fprintf(ctxt.Bso, "size=%d", s.Size) if s.Type == objabi.STEXT { - fmt.Fprintf(ctxt.Bso, " args=%#x locals=%#x", uint64(s.Func.Args), uint64(s.Func.Locals)) + fmt.Fprintf(ctxt.Bso, " args=%#x locals=%#x funcid=%#x", uint64(s.Func.Args), uint64(s.Func.Locals), uint64(s.Func.FuncID)) if s.Leaf() { fmt.Fprintf(ctxt.Bso, " leaf") } diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 6cf82779e4..988ecdf543 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -534,6 +534,7 @@ func genFuncInfoSyms(ctxt *Link) { o := goobj2.FuncInfo{ Args: uint32(s.Func.Args), Locals: uint32(s.Func.Locals), + FuncID: objabi.FuncID(s.Func.FuncID), } pc := &s.Func.Pcln o.Pcsp = pcdataoff diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index b27e6c163d..afe0ee4ee0 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -127,6 +127,8 @@ func (ctxt *Link) InitTextSym(s *LSym, flag int) { if s.OnList() { ctxt.Diag("symbol %s listed multiple times", s.Name) } + name := strings.Replace(s.Name, "\"\"", ctxt.Pkgpath, -1) + s.Func.FuncID = objabi.GetFuncID(name, flag&WRAPPER != 0) s.Set(AttrOnList, true) s.Set(AttrDuplicateOK, flag&DUPOK != 0) s.Set(AttrNoSplit, flag&NOSPLIT != 0) diff --git a/src/cmd/internal/objabi/funcid.go b/src/cmd/internal/objabi/funcid.go index 0fda1db178..6c9336f31c 100644 --- a/src/cmd/internal/objabi/funcid.go +++ b/src/cmd/internal/objabi/funcid.go @@ -4,11 +4,6 @@ package objabi -import ( - "strconv" - "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 @@ -44,7 +39,10 @@ const ( // Get the function ID for the named function in the named file. // The function should be package-qualified. -func GetFuncID(name, file string) FuncID { +func GetFuncID(name string, isWrapper bool) FuncID { + if isWrapper { + return FuncID_wrapper + } switch name { case "runtime.main": return FuncID_runtime_main @@ -98,17 +96,5 @@ func GetFuncID(name, file string) FuncID { // Don't show in the call stack (used when invoking defer functions) return FuncID_wrapper } - if file == "" { - return FuncID_wrapper - } - if strings.HasPrefix(name, "runtime.call") { - if _, err := strconv.Atoi(name[12:]); err == nil { - // runtime.callXX reflect call wrappers. - return FuncID_wrapper - } - } - if strings.HasSuffix(name, "-fm") { - return FuncID_wrapper - } return FuncID_normal } diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 1b59b80e26..c6174e378c 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -297,7 +297,14 @@ func (state *oldPclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch, new } inlTreeSym.SetUint16(arch, int64(i*20+0), uint16(call.Parent)) - inlTreeSym.SetUint8(arch, int64(i*20+2), uint8(objabi.GetFuncID(ldr.SymName(call.Func), ""))) + inlFunc := ldr.FuncInfo(call.Func) + + var funcID objabi.FuncID + if inlFunc.Valid() { + funcID = inlFunc.FuncID() + } + inlTreeSym.SetUint8(arch, int64(i*20+2), uint8(funcID)) + // byte 3 is unused inlTreeSym.SetUint32(arch, int64(i*20+4), uint32(val)) inlTreeSym.SetUint32(arch, int64(i*20+8), uint32(call.Line)) @@ -610,13 +617,10 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(len(pcdata)))) // funcID uint8 - var file string - if fi.Valid() && fi.NumFile() > 0 { - filesymname := ldr.SymName(fi.File(0)) - file = filesymname[len(src.FileSymPrefix):] + var funcID objabi.FuncID + if fi.Valid() { + funcID = fi.FuncID() } - funcID := objabi.GetFuncID(ldr.SymName(s), file) - off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(funcID))) // unused diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 16331e0825..45085f56c1 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1872,6 +1872,10 @@ func (fi *FuncInfo) Locals() int { return int((*goobj2.FuncInfo)(nil).ReadLocals(fi.data)) } +func (fi *FuncInfo) FuncID() objabi.FuncID { + return objabi.FuncID((*goobj2.FuncInfo)(nil).ReadFuncID(fi.data)) +} + func (fi *FuncInfo) Pcsp() []byte { pcsp, end := (*goobj2.FuncInfo)(nil).ReadPcsp(fi.data) return fi.r.BytesAt(fi.r.PcdataBase()+pcsp, int(end-pcsp)) -- GitLab From e4e1c6a7aff04a61a202ed1b331ffdfdff5a77cf Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 23 Jul 2020 15:15:26 -0400 Subject: [PATCH 0128/1792] [dev.link] add compilation unit index to func Not used yet, but add the compilation unit for a function to func. Change-Id: I7c43fa9f1da044ca63bab030062519771b9f4418 Reviewed-on: https://go-review.googlesource.com/c/go/+/244547 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/pcln.go | 37 +++++++++++++++---- src/cmd/link/internal/sym/compilation_unit.go | 13 +++++-- src/runtime/runtime2.go | 6 +-- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index c6174e378c..3b6f9d4bff 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -14,6 +14,7 @@ import ( "encoding/binary" "fmt" "log" + "math" "os" "path/filepath" "strings" @@ -96,8 +97,9 @@ func makeOldPclnState(ctxt *Link) *oldPclnState { return state } -// makePclntab makes a pclntab object. -func makePclntab(ctxt *Link, container loader.Bitmap) *pclntab { +// makePclntab makes a pclntab object, and assembles all the compilation units +// we'll need to write pclntab. +func makePclntab(ctxt *Link, container loader.Bitmap) (*pclntab, []*sym.CompilationUnit) { ldr := ctxt.loader state := &pclntab{ @@ -105,7 +107,10 @@ func makePclntab(ctxt *Link, container loader.Bitmap) *pclntab { } // Gather some basic stats and info. + seenCUs := make(map[*sym.CompilationUnit]struct{}) prevSect := ldr.SymSect(ctxt.Textp[0]) + compUnits := []*sym.CompilationUnit{} + for _, s := range ctxt.Textp { if !emitPcln(ctxt, s, container) { continue @@ -125,8 +130,17 @@ func makePclntab(ctxt *Link, container loader.Bitmap) *pclntab { state.nfunc++ prevSect = ss } + + // We need to keep track of all compilation units we see. Some symbols + // (eg, go.buildid, _cgoexp_, etc) won't have a compilation unit. + cu := ldr.SymUnit(s) + if _, ok := seenCUs[cu]; cu != nil && !ok { + seenCUs[cu] = struct{}{} + cu.PclnIndex = len(compUnits) + compUnits = append(compUnits, cu) + } } - return state + return state, compUnits } func ftabaddstring(ftab *loader.SymbolBuilder, s string) int32 { @@ -425,7 +439,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // filetable oldState := makeOldPclnState(ctxt) - state := makePclntab(ctxt, container) + state, _ := makePclntab(ctxt, container) ldr := ctxt.loader state.carrier = ldr.LookupOrCreateSym("runtime.pclntab", 0) @@ -434,7 +448,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // runtime.pclntab_old is just a placeholder,and will eventually be deleted. // It contains the pieces of runtime.pclntab that haven't moved to a more - // ration form. + // rational form. state.pclntab = ldr.LookupOrCreateSym("runtime.pclntab_old", 0) state.generatePCHeader(ctxt) state.generateFuncnametab(ctxt, container) @@ -616,6 +630,16 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { off = writepctab(off, pcline.P) off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(len(pcdata)))) + // Store the compilation unit index. + cuIdx := ^uint16(0) + if cu := ldr.SymUnit(s); cu != nil { + if cu.PclnIndex > math.MaxUint16 { + panic("cu limit reached.") + } + cuIdx = uint16(cu.PclnIndex) + } + off = int32(ftab.SetUint16(ctxt.Arch, int64(off), cuIdx)) + // funcID uint8 var funcID objabi.FuncID if fi.Valid() { @@ -623,9 +647,6 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { } off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(funcID))) - // unused - off += 2 - // nfuncdata must be the final entry. off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(len(funcdata)))) for i := range pcdata { diff --git a/src/cmd/link/internal/sym/compilation_unit.go b/src/cmd/link/internal/sym/compilation_unit.go index d9bfc84936..dc37a36cba 100644 --- a/src/cmd/link/internal/sym/compilation_unit.go +++ b/src/cmd/link/internal/sym/compilation_unit.go @@ -10,12 +10,19 @@ import "cmd/internal/dwarf" // type from the sym package since loader imports sym. type LoaderSym int -// CompilationUnit is an abstraction used by DWARF to represent a chunk of -// debug-related data. We create a CompilationUnit per Object file in a -// library (so, one for all the Go code, one for each assembly file, etc.). +// A CompilationUnit represents a set of source files that are compiled +// together. Since all Go sources in a Go package are compiled together, +// there's one CompilationUnit per package that represents all Go sources in +// that package, plus one for each assembly file. +// +// Equivalently, there's one CompilationUnit per object file in each Library +// loaded by the linker. +// +// These are used for both DWARF and pclntab generation. type CompilationUnit struct { Pkg string // The package name, eg ("fmt", or "runtime") Lib *Library // Our library + PclnIndex int // Index of this CU in pclntab PCs []dwarf.Range // PC ranges, relative to Textp[0] DWInfo *dwarf.DWDie // CU root DIE DWARFFileTable []string // The file table used to generate the .debug_lines diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index cffdb0bf27..0bddcaa789 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -804,9 +804,9 @@ type _func struct { pcfile int32 pcln int32 npcdata int32 - funcID funcID // set for certain special runtime functions - _ [2]int8 // unused - nfuncdata uint8 // must be last + cuIndex uint16 // TODO(jfaller): 16 bits is never enough, make this larger. + funcID funcID // set for certain special runtime functions + nfuncdata uint8 // must be last } // Pseudo-Func that is returned for PCs that occur in inlined code. -- GitLab From 69748f0ce4faf850a2e25641aed23e646556d616 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 27 Jul 2020 14:46:16 -0400 Subject: [PATCH 0129/1792] [dev.link] cmd/compile, cmd/link: reference type symbol of defined type by index The type descriptor symbol of a defined (named) type (and pointer to it) is defined only in the package that defines the type. It is not dupOK, unlike other type descriptors. So it can be referenced by index. Currently it is referenced by name for cross-package references, because the index is not exported and so not known to the referencing package. This CL passes the index through the export data, so the symbol can be referenced by index, and does not need to be looked up by name. This also makes such symbol references consistent: it is referenced by index within the defining package and also cross- package, which makes it easier for content hashing (in later CLs). One complication is that we need to set flags on referenced symbols (specifically, the UsedInIface flag). Before, they are non-package refs, which naturally carry flags in the object file. For indexed refs, we currently don't put their flags in the object file. Introduce a new block for this. Change-Id: I8126f8e318ac4e6609eb2ac136201fd6c264c256 Reviewed-on: https://go-review.googlesource.com/c/go/+/245718 Reviewed-by: Jeremy Faller --- src/cmd/compile/internal/gc/iexport.go | 13 ++++++ src/cmd/compile/internal/gc/iimport.go | 13 ++++++ src/cmd/compile/internal/gc/reflect.go | 9 ++++ src/cmd/internal/goobj2/objfile.go | 57 +++++++++++++++++++++++--- src/cmd/internal/obj/objfile2.go | 41 ++++++++++++++++-- src/cmd/link/internal/loader/loader.go | 10 +++++ 6 files changed, 134 insertions(+), 9 deletions(-) diff --git a/src/cmd/compile/internal/gc/iexport.go b/src/cmd/compile/internal/gc/iexport.go index 328260fc59..7a7dbdeac1 100644 --- a/src/cmd/compile/internal/gc/iexport.go +++ b/src/cmd/compile/internal/gc/iexport.go @@ -484,6 +484,7 @@ func (p *iexporter) doDecl(n *Node) { t := n.Type if t.IsInterface() { + w.typeExt(t) break } @@ -496,6 +497,7 @@ func (p *iexporter) doDecl(n *Node) { w.signature(m.Type) } + w.typeExt(t) for _, m := range ms.Slice() { w.methExt(m) } @@ -1014,6 +1016,17 @@ func (w *exportWriter) symIdx(s *types.Sym) { } } +func (w *exportWriter) typeExt(t *types.Type) { + // 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(typesym(t)) + w.symIdx(typesym(t.PtrTo())) +} + // Inline bodies. func (w *exportWriter) stmtList(list Nodes) { diff --git a/src/cmd/compile/internal/gc/iimport.go b/src/cmd/compile/internal/gc/iimport.go index 15a660cf55..29bb1e57a4 100644 --- a/src/cmd/compile/internal/gc/iimport.go +++ b/src/cmd/compile/internal/gc/iimport.go @@ -316,6 +316,7 @@ func (r *importReader) doDecl(n *Node) { resumecheckwidth() if underlying.IsInterface() { + r.typeExt(t) break } @@ -346,6 +347,7 @@ func (r *importReader) doDecl(n *Node) { } t.Methods().Set(ms) + r.typeExt(t) for _, m := range ms { r.methExt(m) } @@ -708,6 +710,17 @@ func (r *importReader) symIdx(s *types.Sym) { } } +func (r *importReader) typeExt(t *types.Type) { + i, pi := r.int64(), r.int64() + if i != -1 && pi != -1 { + typeSymIdx[t] = [2]int64{i, pi} + } +} + +// Map imported type T to the index of type descriptor symbols of T and *T, +// so we can use index to reference the symbol. +var typeSymIdx = make(map[*types.Type][2]int64) + func (r *importReader) doInline(n *Node) { if len(n.Func.Inl.Body) != 0 { Fatalf("%v already has inline body", n) diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 05e64a5a9a..7758097db8 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -1168,6 +1168,15 @@ func dtypesym(t *types.Type) *obj.LSym { if myimportpath != "runtime" || (tbase != types.Types[tbase.Etype] && tbase != types.Bytetype && tbase != types.Runetype && tbase != types.Errortype) { // int, float, etc // named types from other files are defined only by those files if tbase.Sym != nil && tbase.Sym.Pkg != localpkg { + if i, ok := typeSymIdx[tbase]; ok { + lsym.Pkg = tbase.Sym.Pkg.Prefix + if t != tbase { + lsym.SymIdx = int32(i[1]) + } else { + lsym.SymIdx = int32(i[0]) + } + lsym.Set(obj.AttrIndexed, true) + } return lsym } // TODO(mdempsky): Investigate whether this can happen. diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index eae9b5587c..c3d00122e7 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -41,11 +41,12 @@ import ( // DwarfFiles [...]string // // SymbolDefs [...]struct { -// Name string -// ABI uint16 -// Type uint8 -// Flag uint8 -// Size uint32 +// Name string +// ABI uint16 +// Type uint8 +// Flag uint8 +// Flag2 uint8 +// Size uint32 // } // Hashed64Defs [...]struct { // short hashed (content-addressable) symbol definitions // ... // same as SymbolDefs @@ -60,6 +61,12 @@ import ( // ... // same as SymbolDefs // } // +// RefFlags [...]struct { // referenced symbol flags +// Sym symRef +// Flag uint8 +// Flag2 uint8 +// } +// // Hash64 [...][8]byte // Hash [...][N]byte // @@ -176,6 +183,7 @@ const ( BlkHasheddef BlkNonpkgdef BlkNonpkgref + BlkRefFlags BlkHash64 BlkHash BlkRelocIdx @@ -431,6 +439,33 @@ func (a *Aux) Write(w *Writer) { w.Bytes(a[:]) } // for testing func (a *Aux) fromBytes(b []byte) { copy(a[:], b) } +// Referenced symbol flags. +// +// Serialized format: +// RefFlags struct { +// Sym symRef +// Flag uint8 +// Flag2 uint8 +// } +type RefFlags [RefFlagsSize]byte + +const RefFlagsSize = 8 + 1 + 1 + +func (r *RefFlags) Sym() SymRef { + return SymRef{binary.LittleEndian.Uint32(r[:]), binary.LittleEndian.Uint32(r[4:])} +} +func (r *RefFlags) Flag() uint8 { return r[8] } +func (r *RefFlags) Flag2() uint8 { return r[9] } + +func (r *RefFlags) SetSym(x SymRef) { + binary.LittleEndian.PutUint32(r[:], x.PkgIdx) + binary.LittleEndian.PutUint32(r[4:], x.SymIdx) +} +func (r *RefFlags) SetFlag(x uint8) { r[8] = x } +func (r *RefFlags) SetFlag2(x uint8) { r[9] = x } + +func (r *RefFlags) Write(w *Writer) { w.Bytes(r[:]) } + // Referenced symbol name. // // Serialized format: @@ -689,6 +724,18 @@ func (r *Reader) Sym(i uint32) *Sym { return (*Sym)(unsafe.Pointer(&r.b[off])) } +// NRefFlags returns the number of referenced symbol flags. +func (r *Reader) NRefFlags() int { + return int(r.h.Offsets[BlkRefFlags+1]-r.h.Offsets[BlkRefFlags]) / RefFlagsSize +} + +// RefFlags returns a pointer to the i-th referenced symbol flags. +// Note: here i is not a local symbol index, just a counter. +func (r *Reader) RefFlags(i int) *RefFlags { + off := r.h.Offsets[BlkRefFlags] + uint32(i*RefFlagsSize) + return (*RefFlags)(unsafe.Pointer(&r.b[off])) +} + // Hash64 returns the i-th short hashed symbol's hash. // Note: here i is the index of short hashed symbols, not all symbols // (unlike other accessors). diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 988ecdf543..6740f42220 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -105,6 +105,10 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { w.Sym(s) } + // Referenced package symbol flags + h.Offsets[goobj2.BlkRefFlags] = w.Offset() + w.refFlags() + // Hashes h.Offsets[goobj2.BlkHash64] = w.Offset() for _, s := range ctxt.hashed64defs { @@ -468,10 +472,39 @@ func (w *writer) Aux(s *LSym) { } } +// Emits flags of referenced indexed symbols. +func (w *writer) refFlags() { + seen := make(map[*LSym]bool) + w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs + switch rs.PkgIdx { + case goobj2.PkgIdxNone, goobj2.PkgIdxHashed64, goobj2.PkgIdxHashed, goobj2.PkgIdxBuiltin, goobj2.PkgIdxSelf: // not an external indexed reference + return + case goobj2.PkgIdxInvalid: + panic("unindexed symbol reference") + } + if seen[rs] { + return + } + seen[rs] = true + symref := makeSymRef(rs) + flag2 := uint8(0) + if rs.UsedInIface() { + flag2 |= goobj2.SymFlagUsedInIface + } + if flag2 == 0 { + return // no need to write zero flags + } + var o goobj2.RefFlags + o.SetSym(symref) + o.SetFlag2(flag2) + o.Write(w.Writer) + }) +} + // Emits names of referenced indexed symbols, used by tools (objdump, nm) // only. func (w *writer) refNames() { - seen := make(map[goobj2.SymRef]bool) + seen := make(map[*LSym]bool) w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs switch rs.PkgIdx { case goobj2.PkgIdxNone, goobj2.PkgIdxHashed64, goobj2.PkgIdxHashed, goobj2.PkgIdxBuiltin, goobj2.PkgIdxSelf: // not an external indexed reference @@ -479,11 +512,11 @@ func (w *writer) refNames() { case goobj2.PkgIdxInvalid: panic("unindexed symbol reference") } - symref := makeSymRef(rs) - if seen[symref] { + if seen[rs] { return } - seen[symref] = true + seen[rs] = true + symref := makeSymRef(rs) var o goobj2.RefName o.SetSym(symref) o.SetName(rs.Name, w.Writer) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 45085f56c1..d34e6fdf6b 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -2149,6 +2149,7 @@ func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { } func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { + // load non-package refs ndef := uint32(r.NAlldef()) needNameExpansion := r.NeedNameExpansion() for i, n := uint32(0), uint32(r.NNonpkgref()); i < n; i++ { @@ -2167,6 +2168,15 @@ func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { l.SetAttrUsedInIface(gi, true) } } + + // load flags of package refs + for i, n := 0, r.NRefFlags(); i < n; i++ { + rf := r.RefFlags(i) + gi := l.resolve(r, rf.Sym()) + if rf.Flag2()&goobj2.SymFlagUsedInIface != 0 { + l.SetAttrUsedInIface(gi, true) + } + } } func abiToVer(abi uint16, localSymVersion int) int { -- GitLab From cecb7a1cf31e8d8991669208e584269db32066c9 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Jul 2020 18:10:15 -0400 Subject: [PATCH 0130/1792] [dev.link] cmd/compile, cmd/link: make itab symbols content-addressable Extend the content-addressable symbol mechanism to itab symbols. Itab symbols require global uniqueness (as at run time we compare pointers), so it needs to be reliably deduplicated. Currently the content hash depends on symbol name expansion, so we can only do this when all Go packages are built with know package paths. Fall back to checking names if any Go package is built with unknown package path. Change-Id: Icf5e8873755050c20e5fc6549f6de1c883254c89 Reviewed-on: https://go-review.googlesource.com/c/go/+/245719 Reviewed-by: Jeremy Faller --- src/cmd/compile/internal/gc/reflect.go | 1 + src/cmd/internal/obj/objfile2.go | 9 ++++++--- src/cmd/link/internal/loader/loader.go | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 7758097db8..ce4838ce80 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -1559,6 +1559,7 @@ func dumptabs() { } // Nothing writes static itabs, so they are read only. ggloblsym(i.lsym, int32(o), int16(obj.DUPOK|obj.RODATA)) + i.lsym.Set(obj.AttrContentAddressable, true) ilink := itablinkpkg.Lookup(i.t.ShortString() + "," + i.itype.ShortString()).Linksym() dsymptr(ilink, 0, i.lsym, 0) ggloblsym(ilink, int32(Widthptr), int16(obj.DUPOK|obj.RODATA)) diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 6740f42220..74f4fc63ba 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -367,7 +367,8 @@ func contentHash64(s *LSym) goobj2.Hash64Type { // consistent. // - For referenced content-addressable symbol, its content hash // is globally consistent. -// - For package symbol, its local index is globally consistent. +// - For package symbol and builtin symbol, its local index is +// globally consistent. // - For non-package symbol, its fully-expanded name is globally // consistent. For now, we require we know the current package // path so we can always expand symbol names. (Otherwise, @@ -398,11 +399,13 @@ func (w *writer) contentHash(s *LSym) goobj2.HashType { h.Write([]byte{1}) t := w.contentHash(rs) h.Write(t[:]) - case goobj2.PkgIdxBuiltin: - panic("unsupported") case goobj2.PkgIdxNone: h.Write([]byte{2}) io.WriteString(h, rs.Name) // name is already expanded at this point + case goobj2.PkgIdxBuiltin: + h.Write([]byte{3}) + binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) + h.Write(tmp[:4]) case goobj2.PkgIdxSelf: io.WriteString(h, w.pkgpath) binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index d34e6fdf6b..2f4a0efbf4 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -277,6 +277,8 @@ type Loader struct { flags uint32 + hasUnknownPkgPath bool // if any Go object has unknown package path + strictDupMsgs int // number of strict-dup warning/errors, when FlagStrictDups is enabled elfsetstring elfsetstringFunc @@ -378,6 +380,9 @@ func (l *Loader) addObj(pkg string, r *oReader) Sym { i := Sym(len(l.objSyms)) l.start[r] = i l.objs = append(l.objs, objIdx{r, i}) + if r.NeedNameExpansion() && !r.FromAssembly() { + l.hasUnknownPkgPath = true + } return i } @@ -2086,6 +2091,16 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { case hashedDef: start = uint32(r.ndef + r.nhashed64def) end = uint32(r.ndef + r.nhashed64def + r.nhasheddef) + if l.hasUnknownPkgPath { + // The content hash depends on symbol name expansion. If any package is + // built without fully expanded names, the content hash is unreliable. + // Treat them as named symbols. + // This is rare. + // (We don't need to do this for hashed64Def case, as there the hash + // function is simply the identity function, which doesn't depend on + // name expansion.) + kind = nonPkgDef + } case nonPkgDef: start = uint32(r.ndef + r.nhashed64def + r.nhasheddef) end = uint32(r.ndef + r.nhashed64def + r.nhasheddef + r.NNonpkgdef()) -- GitLab From f204ca305128ad1b500d3ba77aebf5509509a8fc Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 29 Jul 2020 19:44:49 -0400 Subject: [PATCH 0131/1792] [dev.link] cmd/link: drop hash maps after loading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The hash maps are used to deduplicate hashed symbols. Once we loaded all the symbols, we no longer need the hash maps. Drop them. Linking cmd/compile, name old live-B new live-B delta Loadlib_GC 13.1M ± 0% 11.3M ± 0% -13.62% (p=0.008 n=5+5) Change-Id: I4bb1f84e1111a56d9e777cd6a68f7d974b60e321 Reviewed-on: https://go-review.googlesource.com/c/go/+/245721 Reviewed-by: Jeremy Faller --- src/cmd/link/internal/loader/loader.go | 54 +++++++++++++-------- src/cmd/link/internal/loader/loader_test.go | 3 +- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 2f4a0efbf4..4da77c6d32 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -204,10 +204,8 @@ type Loader struct { objSyms []objSym // global index mapping to local index - hashed64Syms map[uint64]symAndSize // short hashed (content-addressable) symbols, keyed by content hash - hashedSyms map[goobj2.HashType]symAndSize // hashed (content-addressable) symbols, keyed by content hash - symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal - extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name + symsByName [2]map[string]Sym // map symbol name to index, two maps are for ABI0 and ABIInternal + extStaticSyms map[nameVer]Sym // externally defined static symbols, keyed by name extReader *oReader // a dummy oReader, for external symbols payloadBatch []extSymPayload @@ -285,7 +283,8 @@ type Loader struct { errorReporter *ErrorReporter - npkgsyms int // number of package symbols, for accounting + npkgsyms int // number of package symbols, for accounting + nhashedsyms int // number of hashed symbols, for accounting } const ( @@ -332,8 +331,6 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor objs: []objIdx{{}, {extReader, 0}}, // reserve index 0 for nil symbol, 1 for external symbols objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol extReader: extReader, - hashed64Syms: make(map[uint64]symAndSize, 10000), // TODO: adjust preallocation sizes - hashedSyms: make(map[goobj2.HashType]symAndSize, 20000), // TODO: adjust preallocation sizes 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]*oReader), outer: make(map[Sym]Sym), @@ -388,7 +385,8 @@ func (l *Loader) addObj(pkg string, r *oReader) Sym { // Add a symbol from an object file, return the global index. // If the symbol already exist, it returns the index of that symbol. -func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, osym *goobj2.Sym) Sym { +func (st *loadState) addSym(name string, ver int, r *oReader, li uint32, kind int, osym *goobj2.Sym) Sym { + l := st.l if l.extStart != 0 { panic("addSym called after external symbol is created") } @@ -429,17 +427,17 @@ func (l *Loader) addSym(name string, ver int, r *oReader, li uint32, kind int, o if kind == hashed64Def { checkHash = func() (symAndSize, bool) { h64 = r.Hash64(li - uint32(r.ndef)) - s, existed := l.hashed64Syms[h64] + s, existed := st.hashed64Syms[h64] return s, existed } - addToHashMap = func(ss symAndSize) { l.hashed64Syms[h64] = ss } + addToHashMap = func(ss symAndSize) { st.hashed64Syms[h64] = ss } } else { checkHash = func() (symAndSize, bool) { h = r.Hash(li - uint32(r.ndef+r.nhashed64def)) - s, existed := l.hashedSyms[*h] + s, existed := st.hashedSyms[*h] return s, existed } - addToHashMap = func(ss symAndSize) { l.hashedSyms[*h] = ss } + addToHashMap = func(ss symAndSize) { st.hashedSyms[*h] = ss } } siz := osym.Siz() if s, existed := checkHash(); existed { @@ -2070,7 +2068,8 @@ func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, u } l.addObj(lib.Pkg, or) - l.preloadSyms(or, pkgDef) + st := loadState{l: l} + st.preloadSyms(or, pkgDef) // The caller expects us consuming all the data f.MustSeek(length, os.SEEK_CUR) @@ -2078,8 +2077,16 @@ func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, u return r.Fingerprint() } +// Holds the loader along with temporary states for loading symbols. +type loadState struct { + l *Loader + hashed64Syms map[uint64]symAndSize // short hashed (content-addressable) symbols, keyed by content hash + hashedSyms map[goobj2.HashType]symAndSize // hashed (content-addressable) symbols, keyed by content hash +} + // Preload symbols of given kind from an object. -func (l *Loader) preloadSyms(r *oReader, kind int) { +func (st *loadState) preloadSyms(r *oReader, kind int) { + l := st.l var start, end uint32 switch kind { case pkgDef: @@ -2121,7 +2128,7 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { } v = abiToVer(osym.ABI(), r.version) } - gi := l.addSym(name, v, r, i, kind, osym) + gi := st.addSym(name, v, r, i, kind, osym) r.syms[i] = gi if osym.TopFrame() { l.SetAttrTopFrame(gi, true) @@ -2152,11 +2159,20 @@ func (l *Loader) preloadSyms(r *oReader, kind int) { // references to external symbols (which are always named). func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { l.npkgsyms = l.NSym() + // Preallocate some space (a few hundreds KB) for some symbols. + // As of Go 1.15, linking cmd/compile has ~8000 hashed64 symbols and + // ~13000 hashed symbols. + st := loadState{ + l: l, + hashed64Syms: make(map[uint64]symAndSize, 10000), + hashedSyms: make(map[goobj2.HashType]symAndSize, 15000), + } for _, o := range l.objs[goObjStart:] { - l.preloadSyms(o.r, hashed64Def) - l.preloadSyms(o.r, hashedDef) - l.preloadSyms(o.r, nonPkgDef) + st.preloadSyms(o.r, hashed64Def) + st.preloadSyms(o.r, hashedDef) + st.preloadSyms(o.r, nonPkgDef) } + l.nhashedsyms = len(st.hashed64Syms) + len(st.hashedSyms) for _, o := range l.objs[goObjStart:] { loadObjRefs(l, o.r, arch) } @@ -2575,7 +2591,7 @@ func (l *Loader) Errorf(s Sym, format string, args ...interface{}) { func (l *Loader) Stat() string { s := fmt.Sprintf("%d symbols, %d reachable\n", l.NSym(), l.NReachableSym()) s += fmt.Sprintf("\t%d package symbols, %d hashed symbols, %d non-package symbols, %d external symbols\n", - l.npkgsyms, len(l.hashed64Syms)+len(l.hashedSyms), int(l.extStart)-l.npkgsyms-len(l.hashed64Syms)-len(l.hashedSyms), l.NSym()-int(l.extStart)) + l.npkgsyms, l.nhashedsyms, int(l.extStart)-l.npkgsyms-l.nhashedsyms, l.NSym()-int(l.extStart)) return s } diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index 70e0986ac7..af66752f5c 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -21,7 +21,8 @@ import ( // data or relocations). func addDummyObjSym(t *testing.T, ldr *Loader, or *oReader, name string) Sym { idx := uint32(len(ldr.objSyms)) - return ldr.addSym(name, 0, or, idx, nonPkgDef, &goobj2.Sym{}) + st := loadState{l: ldr} + return st.addSym(name, 0, or, idx, nonPkgDef, &goobj2.Sym{}) } func mkLoader() *Loader { -- GitLab From db924fd99e85e483def6dec1847d9527a93aaafb Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 30 Jul 2020 17:19:13 -0400 Subject: [PATCH 0132/1792] [dev.link] cmd/compile, cmd/link: generate itablink at link time Currently, at compile time, for each itab symbol, we create an "itablink" symbol which holds solely the address of the itab symbol. At link time, all the itablink symbols are grouped together to form the itablinks slice. This CL removes the itablink symbols, and directly generate the itablinks slice in the linker. This removes a number of symbols, which are dupOK and generally have long names. And also removes a special handling of itablink symbols in the deadcode pass which iterates through all symbols. Change-Id: I475c3c8899e9fbeec9abc7647b1e4a69aa5c3c5a Reviewed-on: https://go-review.googlesource.com/c/go/+/245901 Reviewed-by: Jeremy Faller --- src/cmd/compile/internal/gc/reflect.go | 3 --- src/cmd/internal/goobj2/objfile.go | 2 ++ src/cmd/internal/obj/objfile2.go | 3 +++ src/cmd/link/internal/ld/data.go | 27 ++++++++++++-------------- src/cmd/link/internal/ld/deadcode.go | 16 --------------- src/cmd/link/internal/ld/symtab.go | 17 +++------------- src/cmd/link/internal/ld/typelink.go | 23 +++++++++++++++++++++- src/cmd/link/internal/ld/xcoff.go | 3 --- src/cmd/link/internal/loader/loader.go | 18 +++++++---------- 9 files changed, 49 insertions(+), 63 deletions(-) diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index ce4838ce80..59b00168e0 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -1560,9 +1560,6 @@ func dumptabs() { // Nothing writes static itabs, so they are read only. ggloblsym(i.lsym, int32(o), int16(obj.DUPOK|obj.RODATA)) i.lsym.Set(obj.AttrContentAddressable, true) - ilink := itablinkpkg.Lookup(i.t.ShortString() + "," + i.itype.ShortString()).Linksym() - dsymptr(ilink, 0, i.lsym, 0) - ggloblsym(ilink, int32(Widthptr), int16(obj.DUPOK|obj.RODATA)) } // process ptabs diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index c3d00122e7..6f0df86b06 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -292,6 +292,7 @@ const ( // Sym.Flag2 const ( SymFlagUsedInIface = 1 << iota + SymFlagItab ) // Returns the length of the name of the symbol. @@ -321,6 +322,7 @@ func (s *Sym) ReflectMethod() bool { return s.Flag()&SymFlagReflectMethod != 0 } func (s *Sym) IsGoType() bool { return s.Flag()&SymFlagGoType != 0 } func (s *Sym) TopFrame() bool { return s.Flag()&SymFlagTopFrame != 0 } func (s *Sym) UsedInIface() bool { return s.Flag2()&SymFlagUsedInIface != 0 } +func (s *Sym) IsItab() bool { return s.Flag2()&SymFlagItab != 0 } func (s *Sym) SetName(x string, w *Writer) { binary.LittleEndian.PutUint32(s[:], uint32(len(x))) diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 74f4fc63ba..17021d9294 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -300,6 +300,9 @@ func (w *writer) Sym(s *LSym) { if s.UsedInIface() { flag2 |= goobj2.SymFlagUsedInIface } + if strings.HasPrefix(s.Name, "go.itab.") && s.Type == objabi.SRODATA { + flag2 |= goobj2.SymFlagItab + } name := s.Name if strings.HasPrefix(name, "gofile..") { name = filepath.ToSlash(name) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 9bc0f021b1..39f65364b7 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1904,14 +1904,14 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { sect.Length = uint64(state.datsize) - sect.Vaddr /* itablink */ - sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".itablink"), sym.SITABLINK, sym.Sxxx, relroSecPerm) - ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.itablink", 0), sect) - ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.eitablink", 0), sect) - if ctxt.HeadType == objabi.Haix { - // Store .itablink size because its symbols are wrapped - // under an outer symbol: runtime.itablink. - xcoffUpdateOuterSize(ctxt, int64(sect.Length), sym.SITABLINK) - } + sect = state.allocateNamedDataSection(seg, genrelrosecname(".itablink"), []sym.SymKind{sym.SITABLINK}, relroSecPerm) + + itablink := ldr.CreateSymForUpdate("runtime.itablink", 0) + ldr.SetSymSect(itablink.Sym(), sect) + itablink.SetType(sym.SRODATA) + state.datsize += itablink.Size() + state.checkdatsize(sym.SITABLINK) + sect.Length = uint64(state.datsize) - sect.Vaddr /* gosymtab */ sect = state.allocateNamedSectionAndAssignSyms(seg, genrelrosecname(".gosymtab"), sym.SSYMTAB, sym.SRODATA, relroSecPerm) @@ -2414,11 +2414,10 @@ func (ctxt *Link) address() []*sym.Segment { ldr := ctxt.loader var ( - rodata = ldr.SymSect(ldr.LookupOrCreateSym("runtime.rodata", 0)) - itablink = ldr.SymSect(ldr.LookupOrCreateSym("runtime.itablink", 0)) - symtab = ldr.SymSect(ldr.LookupOrCreateSym("runtime.symtab", 0)) - pclntab = ldr.SymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0)) - types = ldr.SymSect(ldr.LookupOrCreateSym("runtime.types", 0)) + rodata = ldr.SymSect(ldr.LookupOrCreateSym("runtime.rodata", 0)) + symtab = ldr.SymSect(ldr.LookupOrCreateSym("runtime.symtab", 0)) + pclntab = ldr.SymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0)) + types = ldr.SymSect(ldr.LookupOrCreateSym("runtime.types", 0)) ) for _, s := range ctxt.datap { @@ -2474,8 +2473,6 @@ func (ctxt *Link) address() []*sym.Segment { ctxt.xdefine("runtime.erodata", sym.SRODATA, int64(rodata.Vaddr+rodata.Length)) ctxt.xdefine("runtime.types", sym.SRODATA, int64(types.Vaddr)) ctxt.xdefine("runtime.etypes", sym.SRODATA, int64(types.Vaddr+types.Length)) - ctxt.xdefine("runtime.itablink", sym.SRODATA, int64(itablink.Vaddr)) - ctxt.xdefine("runtime.eitablink", sym.SRODATA, int64(itablink.Vaddr+itablink.Length)) s := ldr.Lookup("runtime.gcdata", 0) ldr.SetAttrLocal(s, true) diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 53ab0db9d0..a169772dde 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -306,22 +306,6 @@ func deadcode(ctxt *Link) { } d.flood() } - - n := ldr.NSym() - - if ctxt.BuildMode != BuildModeShared { - // Keep a itablink if the symbol it points at is being kept. - // (When BuildModeShared, always keep itablinks.) - for i := 1; i < n; i++ { - s := loader.Sym(i) - if ldr.IsItabLink(s) { - relocs := ldr.Relocs(s) - if relocs.Count() > 0 && ldr.AttrReachable(relocs.At(0).Sym()) { - ldr.SetAttrReachable(s, true) - } - } - } - } } // methodsig is a typed method signature (name + type). diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 8d2cbd8133..97d7a22537 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -416,8 +416,6 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { // Define these so that they'll get put into the symbol table. // data.c:/^address will provide the actual values. - ctxt.xdefine("runtime.itablink", sym.SRODATA, 0) - ctxt.xdefine("runtime.eitablink", sym.SRODATA, 0) ctxt.xdefine("runtime.rodata", sym.SRODATA, 0) ctxt.xdefine("runtime.erodata", sym.SRODATA, 0) ctxt.xdefine("runtime.types", sym.SRODATA, 0) @@ -489,16 +487,11 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { } } - symitablink := ldr.CreateSymForUpdate("runtime.itablink", 0) - symitablink.SetType(sym.SITABLINK) - symt := ldr.CreateSymForUpdate("runtime.symtab", 0) symt.SetType(sym.SSYMTAB) symt.SetSize(0) symt.SetLocal(true) - nitablinks := 0 - // assign specific types so that they sort together. // within a type they sort by size, so the .* symbols // just defined above will be first. @@ -536,12 +529,6 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { // names, as they can be referred to by a section offset. symGroupType[s] = sym.STYPERELRO - case strings.HasPrefix(name, "go.itablink."): - nitablinks++ - symGroupType[s] = sym.SITABLINK - ldr.SetAttrNotInSymbolTable(s, true) - ldr.SetCarrierSym(s, symitablink.Sym()) - case strings.HasPrefix(name, "go.string."): symGroupType[s] = sym.SGOSTRING ldr.SetAttrNotInSymbolTable(s, true) @@ -672,7 +659,9 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { moduledata.AddUint(ctxt.Arch, ntypelinks) moduledata.AddUint(ctxt.Arch, ntypelinks) // The itablinks slice - moduledata.AddAddr(ctxt.Arch, symitablink.Sym()) + itablinkSym := ldr.Lookup("runtime.itablink", 0) + nitablinks := uint64(ldr.SymSize(itablinkSym)) / uint64(ctxt.Arch.PtrSize) + moduledata.AddAddr(ctxt.Arch, itablinkSym) moduledata.AddUint(ctxt.Arch, uint64(nitablinks)) moduledata.AddUint(ctxt.Arch, uint64(nitablinks)) // The ptab slice diff --git a/src/cmd/link/internal/ld/typelink.go b/src/cmd/link/internal/ld/typelink.go index 2476efe75c..5eca6e0181 100644 --- a/src/cmd/link/internal/ld/typelink.go +++ b/src/cmd/link/internal/ld/typelink.go @@ -28,9 +28,15 @@ func (s byTypeStr) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (ctxt *Link) typelink() { ldr := ctxt.loader typelinks := byTypeStr{} + var itabs []loader.Sym for s := loader.Sym(1); s < loader.Sym(ldr.NSym()); s++ { - if ldr.AttrReachable(s) && ldr.IsTypelink(s) { + if !ldr.AttrReachable(s) { + continue + } + if ldr.IsTypelink(s) { typelinks = append(typelinks, typelinkSortKey{decodetypeStr(ldr, ctxt.Arch, s), s}) + } else if ldr.IsItab(s) { + itabs = append(itabs, s) } } sort.Sort(typelinks) @@ -48,4 +54,19 @@ func (ctxt *Link) typelink() { r.SetSiz(4) r.SetType(objabi.R_ADDROFF) } + + ptrsize := ctxt.Arch.PtrSize + il := ldr.CreateSymForUpdate("runtime.itablink", 0) + il.SetType(sym.SITABLINK) + ldr.SetAttrLocal(il.Sym(), true) + il.SetSize(int64(ptrsize * len(itabs))) + il.Grow(il.Size()) + relocs = il.AddRelocs(len(itabs)) + for i, s := range itabs { + r := relocs.At(i) + r.SetSym(s) + r.SetOff(int32(i * ptrsize)) + r.SetSiz(uint8(ptrsize)) + r.SetType(objabi.R_ADDR) + } } diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index cc299cfb6b..7eb7f94ca4 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -605,9 +605,6 @@ func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) { outerSymSize["go.funcrel.*"] = size case sym.SGCBITS: outerSymSize["runtime.gcbits.*"] = size - case sym.SITABLINK: - outerSymSize["runtime.itablink"] = size - } } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 4da77c6d32..d56c748f9c 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -217,8 +217,7 @@ type Loader struct { align []uint8 // symbol 2^N alignment, indexed by global index - itablink map[Sym]struct{} // itablink[j] defined if j is go.itablink.* - deferReturnTramp map[Sym]bool // whether the symbol is a trampoline of a deferreturn call + deferReturnTramp map[Sym]bool // whether the symbol is a trampoline of a deferreturn call objByPkg map[string]*oReader // map package path to its Go object reader @@ -352,7 +351,6 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor attrCgoExportDynamic: make(map[Sym]struct{}), attrCgoExportStatic: make(map[Sym]struct{}), generatedSyms: make(map[Sym]struct{}), - itablink: make(map[Sym]struct{}), deferReturnTramp: make(map[Sym]bool), extStaticSyms: make(map[nameVer]Sym), builtinSyms: make([]Sym, nbuiltin), @@ -1163,12 +1161,13 @@ func (l *Loader) IsTypelink(i Sym) bool { return l.SymAttr(i)&goobj2.SymFlagTypelink != 0 } -// Returns whether this is a "go.itablink.*" symbol. -func (l *Loader) IsItabLink(i Sym) bool { - if _, ok := l.itablink[i]; ok { - return true +// Returns whether this symbol is an itab symbol. +func (l *Loader) IsItab(i Sym) bool { + if l.IsExternal(i) { + return false } - return false + r, li := l.toLocal(i) + return r.Sym(li).IsItab() } // Return whether this is a trampoline of a deferreturn call. @@ -2139,9 +2138,6 @@ func (st *loadState) preloadSyms(r *oReader, kind int) { if osym.UsedInIface() { l.SetAttrUsedInIface(gi, true) } - if strings.HasPrefix(name, "go.itablink.") { - l.itablink[gi] = struct{}{} - } if strings.HasPrefix(name, "runtime.") || (loadingRuntimePkg && strings.HasPrefix(name, "type.")) { if bi := goobj2.BuiltinIdx(name, v); bi != -1 { -- GitLab From 5c9b540378ed81fd45cc13f0a610bb29140e28ff Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 30 Jul 2020 18:00:56 -0400 Subject: [PATCH 0133/1792] [dev.link] cmd/internal/goobj: delete old object file reader Change-Id: Ieebab205e2cea2b4665c830b7424d543812787ff Reviewed-on: https://go-review.googlesource.com/c/go/+/246441 Reviewed-by: Austin Clements Reviewed-by: Jeremy Faller --- src/cmd/internal/goobj/read.go | 205 +-------------------------------- 1 file changed, 2 insertions(+), 203 deletions(-) diff --git a/src/cmd/internal/goobj/read.go b/src/cmd/internal/goobj/read.go index 44e619cabb..2bbc35d345 100644 --- a/src/cmd/internal/goobj/read.go +++ b/src/cmd/internal/goobj/read.go @@ -259,78 +259,6 @@ func (r *objReader) readFull(b []byte) error { return nil } -// readInt reads a zigzag varint from the input file. -func (r *objReader) readInt() int64 { - var u uint64 - - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - r.error(errCorruptObject) - return 0 - } - c := r.readByte() - u |= uint64(c&0x7F) << shift - if c&0x80 == 0 { - break - } - } - - return int64(u>>1) ^ (int64(u) << 63 >> 63) -} - -// readString reads a length-delimited string from the input file. -func (r *objReader) readString() string { - n := r.readInt() - buf := make([]byte, n) - r.readFull(buf) - return string(buf) -} - -// readSymID reads a SymID from the input file. -func (r *objReader) readSymID() SymID { - i := r.readInt() - return r.p.SymRefs[i] -} - -func (r *objReader) readRef() { - name, abiOrStatic := r.readString(), r.readInt() - - // In a symbol name in an object file, "". denotes the - // prefix for the package in which the object file has been found. - // Expand it. - name = strings.ReplaceAll(name, `"".`, r.pkgprefix) - - // The ABI field records either the ABI or -1 for static symbols. - // - // To distinguish different static symbols with the same name, - // we use the symbol "version". Version 0 corresponds to - // global symbols, and each file has a unique version > 0 for - // all of its static symbols. The version is incremented on - // each call to parseObject. - // - // For global symbols, we currently ignore the ABI. - // - // TODO(austin): Record the ABI in SymID. Since this is a - // public API, we'll have to keep Version as 0 and record the - // ABI in a new field (which differs from how the linker does - // this, but that's okay). Show the ABI in things like - // objdump. - var vers int64 - if abiOrStatic == -1 { - // Static symbol - vers = r.p.MaxVersion - } - r.p.SymRefs = append(r.p.SymRefs, SymID{name, vers}) -} - -// readData reads a data reference from the input file. -func (r *objReader) readData() Data { - n := r.readInt() - d := Data{Offset: r.dataOffset, Size: n} - r.dataOffset += n - return d -} - // skip skips n bytes in the input. func (r *objReader) skip(n int64) { if n < 0 { @@ -508,139 +436,10 @@ func (r *objReader) parseObject(prefix []byte) error { if err != nil { return err } - if bytes.Equal(p, []byte(goobj2.Magic)) { - r.readNew() - return nil - } - r.readFull(r.tmp[:8]) - if !bytes.Equal(r.tmp[:8], []byte("\x00go114ld")) { + if !bytes.Equal(p, []byte(goobj2.Magic)) { return r.error(errCorruptObject) } - - b := r.readByte() - if b != 1 { - return r.error(errCorruptObject) - } - - // Direct package dependencies. - for { - s := r.readString() - if s == "" { - break - } - r.p.Imports = append(r.p.Imports, s) - } - - // Read filenames for dwarf info. - count := r.readInt() - for i := int64(0); i < count; i++ { - r.p.DWARFFileList = append(r.p.DWARFFileList, r.readString()) - } - - r.p.SymRefs = []SymID{{"", 0}} - for { - if b := r.readByte(); b != 0xfe { - if b != 0xff { - return r.error(errCorruptObject) - } - break - } - - r.readRef() - } - - dataLength := r.readInt() - r.readInt() // n relocations - ignore - r.readInt() // n pcdata - ignore - r.readInt() // n autom - ignore - r.readInt() // n funcdata - ignore - r.readInt() // n files - ignore - - r.dataOffset = r.offset - r.skip(dataLength) - - // Symbols. - for { - if b := r.readByte(); b != 0xfe { - if b != 0xff { - return r.error(errCorruptObject) - } - break - } - - typ := r.readByte() - s := &Sym{SymID: r.readSymID()} - r.p.Syms = append(r.p.Syms, s) - s.Kind = objabi.SymKind(typ) - flags := r.readInt() - s.DupOK = flags&1 != 0 - s.Size = r.readInt() - s.Type = r.readSymID() - s.Data = r.readData() - s.Reloc = make([]Reloc, r.readInt()) - for i := range s.Reloc { - rel := &s.Reloc[i] - rel.Offset = r.readInt() - rel.Size = r.readInt() - rel.Type = objabi.RelocType(r.readInt()) - rel.Add = r.readInt() - rel.Sym = r.readSymID() - } - - if s.Kind == objabi.STEXT { - f := new(Func) - s.Func = f - f.Args = r.readInt() - f.Frame = r.readInt() - f.Align = uint32(r.readInt()) - flags := r.readInt() - f.Leaf = flags&(1<<0) != 0 - f.TopFrame = flags&(1<<4) != 0 - f.NoSplit = r.readInt() != 0 - f.Var = make([]Var, r.readInt()) - for i := range f.Var { - v := &f.Var[i] - v.Name = r.readSymID().Name - v.Offset = r.readInt() - v.Kind = r.readInt() - v.Type = r.readSymID() - } - - f.PCSP = r.readData() - f.PCFile = r.readData() - f.PCLine = r.readData() - f.PCInline = r.readData() - f.PCData = make([]Data, r.readInt()) - for i := range f.PCData { - f.PCData[i] = r.readData() - } - f.FuncData = make([]FuncData, r.readInt()) - for i := range f.FuncData { - f.FuncData[i].Sym = r.readSymID() - } - for i := range f.FuncData { - f.FuncData[i].Offset = r.readInt() // TODO - } - f.File = make([]string, r.readInt()) - for i := range f.File { - f.File[i] = r.readSymID().Name - } - f.InlTree = make([]InlinedCall, r.readInt()) - for i := range f.InlTree { - f.InlTree[i].Parent = r.readInt() - f.InlTree[i].File = r.readSymID().Name - f.InlTree[i].Line = r.readInt() - f.InlTree[i].Func = r.readSymID() - f.InlTree[i].ParentPC = r.readInt() - } - } - } - - r.readFull(r.tmp[:7]) - if !bytes.Equal(r.tmp[:7], []byte("go114ld")) { - return r.error(errCorruptObject) - } - + r.readNew() return nil } -- GitLab From b85033d153835c45cd4ee51046a34c1dac52f0e0 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 3 Aug 2020 17:59:41 -0400 Subject: [PATCH 0134/1792] [dev.link] cmd/link: fix pclntab symbol handling on AIX On AIX, container symbols are handled in a weird way (unlike other platforms): the outer symbol needs to have size (but still no data), and the inner symbols must not be in the symbol table (otherwise it overlaps with the outer symbol, which the system linker doesn't like). As of CL 241598, pclntab becomes a container symbol. We need to follow the rule above for AIX. Fix AIX build. Change-Id: Ie2515a4cabbd8cf3f6d3868643a28f64ca3365a2 Reviewed-on: https://go-review.googlesource.com/c/go/+/246479 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/data.go | 3 +++ src/cmd/link/internal/ld/pcln.go | 2 ++ src/cmd/link/internal/ld/xcoff.go | 2 ++ 3 files changed, 7 insertions(+) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 39f65364b7..b9e2408942 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1925,6 +1925,9 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.funcnametab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab_old", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.epclntab", 0), sect) + if ctxt.HeadType == objabi.Haix { + xcoffUpdateOuterSize(ctxt, int64(sect.Length), sym.SPCLNTAB) + } // 6g uses 4-byte relocation offsets, so the entire segment must fit in 32 bits. if state.datsize != int64(uint32(state.datsize)) { diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 3b6f9d4bff..936cfe2868 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -78,6 +78,7 @@ func (state *pclntab) addGeneratedSym(ctxt *Link, name string, size int64, f gen s := ctxt.createGeneratorSymbol(name, 0, sym.SPCLNTAB, size, f) ctxt.loader.SetAttrReachable(s, true) ctxt.loader.SetCarrierSym(s, state.carrier) + ctxt.loader.SetAttrNotInSymbolTable(s, true) return s } @@ -455,6 +456,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { funcdataBytes := int64(0) ldr.SetCarrierSym(state.pclntab, state.carrier) + ldr.SetAttrNotInSymbolTable(state.pclntab, true) ftab := ldr.MakeSymbolUpdater(state.pclntab) ftab.SetValue(state.size) ftab.SetType(sym.SPCLNTAB) diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 7eb7f94ca4..7bf06eaa46 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -605,6 +605,8 @@ func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) { outerSymSize["go.funcrel.*"] = size case sym.SGCBITS: outerSymSize["runtime.gcbits.*"] = size + case sym.SPCLNTAB: + outerSymSize["runtime.pclntab"] = size } } -- GitLab From 64fdc8b47a77d090def16d76ddf3522fac035a1e Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 6 Aug 2020 09:54:54 -0400 Subject: [PATCH 0135/1792] [dev.link] cmd/link: fix preallocation for function names This preallocation is way too large, and showed up in the metrics. Just remove it all together. Change-Id: Ib4646b63cd0a903656ada244f15e977cde2a2c4c Reviewed-on: https://go-review.googlesource.com/c/go/+/247177 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/pcln.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 936cfe2868..606736e271 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -104,7 +104,7 @@ func makePclntab(ctxt *Link, container loader.Bitmap) (*pclntab, []*sym.Compilat ldr := ctxt.loader state := &pclntab{ - funcNameOffset: make(map[loader.Sym]int32, ldr.NSym()), + funcNameOffset: make(map[loader.Sym]int32), } // Gather some basic stats and info. -- GitLab From 18ee3498805f81ef7f3435800bc5581599c61872 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 8 Jul 2020 10:43:42 -0400 Subject: [PATCH 0136/1792] [dev.link] cmd/link: fix ppc64-specific bug in genelfsym The code in the the linker's genelfsym() routine was not properly including runtime.text.%d marker symbols that are emitted on PPC64 when a very large text section is split into chunks. This bug was introduced in CL 233338 when portions of asmb2() were converted from sym.Symbol to loader.Sym usage. Change-Id: Idfed944c41e1805f78f35be67bcdd18bdefd7819 Reviewed-on: https://go-review.googlesource.com/c/go/+/241498 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/symtab.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 97d7a22537..bc880955b8 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -180,12 +180,31 @@ func putelfsectionsym(ctxt *Link, out *OutBuf, s loader.Sym, shndx int) { func genelfsym(ctxt *Link, elfbind int) { ldr := ctxt.loader - // Text symbols. + // runtime.text marker symbol(s). s := ldr.Lookup("runtime.text", 0) putelfsym(ctxt, s, STT_FUNC, elfbind) + for k, sect := range Segtext.Sections[1:] { + n := k + 1 + if sect.Name != ".text" || (ctxt.IsAIX() && ctxt.IsExternal()) { + // On AIX, runtime.text.X are symbols already in the symtab. + break + } + s = ldr.Lookup(fmt.Sprintf("runtime.text.%d", n), 0) + if s == 0 { + break + } + if ldr.SymType(s) != sym.STEXT { + panic("unexpected type for runtime.text symbol") + } + putelfsym(ctxt, s, STT_FUNC, elfbind) + } + + // Text symbols. for _, s := range ctxt.Textp { putelfsym(ctxt, s, STT_FUNC, elfbind) } + + // runtime.etext marker symbol. s = ldr.Lookup("runtime.etext", 0) if ldr.SymType(s) == sym.STEXT { putelfsym(ctxt, s, STT_FUNC, elfbind) -- GitLab From d41b9066dad9091c55e2b6e6c48ceaee7dff1cf6 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 7 Jul 2020 12:54:46 -0400 Subject: [PATCH 0137/1792] [dev.link] cmd/link: add PPC64 debugging option to encourage text section splits Add a new debugging command line option (-debugppc64textsize=N) that forces the start of a new text section after ".text" hits N bytes as opposed to the architected limit of 2^26. This is intended to enable testing of the linker code paths that handle multiple .text sections on PPC64 without resorting to building giant applications. Updates #20492. Change-Id: I74ab7fd1e412e9124de5bd0d8d248c5e73225ae3 Reviewed-on: https://go-review.googlesource.com/c/go/+/241073 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller --- src/cmd/link/internal/ld/data.go | 73 +++++++++++++++++++------------- src/cmd/link/internal/ld/main.go | 33 ++++++++------- 2 files changed, 61 insertions(+), 45 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index b9e2408942..dc7096ea8c 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2247,37 +2247,52 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s loader.Sym, va uint64 // Only break at outermost syms. - if ctxt.Arch.InFamily(sys.PPC64) && ldr.OuterSym(s) == 0 && ctxt.IsExternal() && va-sect.Vaddr+funcsize+maxSizeTrampolinesPPC64(ldr, s, isTramp) > 0x1c00000 { - // Set the length for the previous text section - sect.Length = va - sect.Vaddr - - // Create new section, set the starting Vaddr - sect = addsection(ctxt.loader, ctxt.Arch, &Segtext, ".text", 05) - sect.Vaddr = va - ldr.SetSymSect(s, sect) - - // Create a symbol for the start of the secondary text sections - ntext := ldr.CreateSymForUpdate(fmt.Sprintf("runtime.text.%d", n), 0) - ntext.SetSect(sect) - if ctxt.IsAIX() { - // runtime.text.X must be a real symbol on AIX. - // Assign its address directly in order to be the - // first symbol of this new section. - ntext.SetType(sym.STEXT) - ntext.SetSize(int64(MINFUNC)) - ntext.SetOnList(true) - ctxt.tramps = append(ctxt.tramps, ntext.Sym()) - - ntext.SetValue(int64(va)) - va += uint64(ntext.Size()) - - if align := ldr.SymAlign(s); align != 0 { - va = uint64(Rnd(int64(va), int64(align))) - } else { - va = uint64(Rnd(int64(va), int64(Funcalign))) + // For debugging purposes, allow text size limit to be cranked down, + // so as to stress test the code that handles multiple text sections. + var textSizelimit uint64 = 0x1c00000 + if *FlagDebugTextSize != 0 { + textSizelimit = uint64(*FlagDebugTextSize) + } + + if ctxt.Arch.InFamily(sys.PPC64) && ldr.OuterSym(s) == 0 && ctxt.IsExternal() { + // Sanity check: make sure the limit is larger than any + // individual text symbol. + if funcsize > textSizelimit { + panic(fmt.Sprintf("error: ppc64 text size limit %d less than text symbol %s size of %d", textSizelimit, ldr.SymName(s), funcsize)) + } + + if va-sect.Vaddr+funcsize+maxSizeTrampolinesPPC64(ldr, s, isTramp) > textSizelimit { + // Set the length for the previous text section + sect.Length = va - sect.Vaddr + + // Create new section, set the starting Vaddr + sect = addsection(ctxt.loader, ctxt.Arch, &Segtext, ".text", 05) + sect.Vaddr = va + ldr.SetSymSect(s, sect) + + // Create a symbol for the start of the secondary text sections + ntext := ldr.CreateSymForUpdate(fmt.Sprintf("runtime.text.%d", n), 0) + ntext.SetSect(sect) + if ctxt.IsAIX() { + // runtime.text.X must be a real symbol on AIX. + // Assign its address directly in order to be the + // first symbol of this new section. + ntext.SetType(sym.STEXT) + ntext.SetSize(int64(MINFUNC)) + ntext.SetOnList(true) + ctxt.tramps = append(ctxt.tramps, ntext.Sym()) + + ntext.SetValue(int64(va)) + va += uint64(ntext.Size()) + + if align := ldr.SymAlign(s); align != 0 { + va = uint64(Rnd(int64(va), int64(align))) + } else { + va = uint64(Rnd(int64(va), int64(Funcalign))) + } } + n++ } - n++ } ldr.SetSymValue(s, 0) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 3702f28dd8..4885c4f57e 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -74,22 +74,23 @@ var ( flagExtldflags = flag.String("extldflags", "", "pass `flags` to external linker") flagExtar = flag.String("extar", "", "archive program for buildmode=c-archive") - flagA = flag.Bool("a", false, "no-op (deprecated)") - FlagC = flag.Bool("c", false, "dump call graph") - FlagD = flag.Bool("d", false, "disable dynamic executable") - flagF = flag.Bool("f", false, "ignore version mismatch") - flagG = flag.Bool("g", false, "disable go package data checks") - flagH = flag.Bool("h", false, "halt on error") - flagN = flag.Bool("n", false, "dump symbol table") - FlagS = flag.Bool("s", false, "disable symbol table") - FlagW = flag.Bool("w", false, "disable DWARF generation") - flag8 bool // use 64-bit addresses in symbol table - flagInterpreter = flag.String("I", "", "use `linker` as ELF dynamic linker") - FlagDebugTramp = flag.Int("debugtramp", 0, "debug trampolines") - 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`") - flagEntrySymbol = flag.String("E", "", "set `entry` symbol name") + flagA = flag.Bool("a", false, "no-op (deprecated)") + FlagC = flag.Bool("c", false, "dump call graph") + FlagD = flag.Bool("d", false, "disable dynamic executable") + flagF = flag.Bool("f", false, "ignore version mismatch") + flagG = flag.Bool("g", false, "disable go package data checks") + flagH = flag.Bool("h", false, "halt on error") + flagN = flag.Bool("n", false, "dump symbol table") + FlagS = flag.Bool("s", false, "disable symbol table") + FlagW = flag.Bool("w", false, "disable DWARF generation") + flag8 bool // use 64-bit addresses in symbol table + flagInterpreter = flag.String("I", "", "use `linker` as ELF dynamic linker") + FlagDebugTramp = flag.Int("debugtramp", 0, "debug trampolines") + FlagDebugTextSize = flag.Int("debugppc64textsize", 0, "debug PPC64 text section max") + 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`") + flagEntrySymbol = flag.String("E", "", "set `entry` symbol name") cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`") memprofile = flag.String("memprofile", "", "write memory profile to `file`") -- GitLab From 8370cbe64de345d4635e53202a04712ee6f777e5 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 8 Jul 2020 11:02:51 -0400 Subject: [PATCH 0138/1792] [dev.link] cmd/link: add PPC64 section splitting test Add a new PPC64-only linker test that does a build with the -debugppc64textsize debugging option (selecting a lower the threshold for text section splitting) to verify that no bugs have been introduced in the linker code that manages this process. Change-Id: Iea3f16a04c894d528eab2cb52f1ec1d75a2770cc Reviewed-on: https://go-review.googlesource.com/c/go/+/241499 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/ld_test.go | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/cmd/link/internal/ld/ld_test.go b/src/cmd/link/internal/ld/ld_test.go index 4dbe09d586..db339b484d 100644 --- a/src/cmd/link/internal/ld/ld_test.go +++ b/src/cmd/link/internal/ld/ld_test.go @@ -134,3 +134,36 @@ func TestArchiveBuildInvokeWithExec(t *testing.T) { t.Errorf("expected '%s' in -v output, got:\n%s\n", want, string(out)) } } + +func TestPPC64LargeTextSectionSplitting(t *testing.T) { + // The behavior we're checking for is of interest only on ppc64. + if !strings.HasPrefix(runtime.GOARCH, "ppc64") { + t.Skip("test useful only for ppc64") + } + + testenv.MustHaveGoBuild(t) + testenv.MustHaveCGO(t) + t.Parallel() + dir, err := ioutil.TempDir("", "go-build") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + // NB: the use of -ldflags=-debugppc64textsize=1048576 tells the linker to + // split text sections at a size threshold of 1M instead of the + // architected limit of 67M. The choice of building cmd/go is + // arbitrary; we just need something sufficiently large that uses + // external linking. + exe := filepath.Join(dir, "go.exe") + out, eerr := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, "-ldflags=-linkmode=external -debugppc64textsize=1048576", "cmd/go").CombinedOutput() + if eerr != nil { + t.Fatalf("build failure: %s\n%s\n", eerr, string(out)) + } + + // Result should be runnable. + _, err = exec.Command(exe, "version").CombinedOutput() + if err != nil { + t.Fatal(err) + } +} -- GitLab From 9bdaf99966e4bacb0dd268d773a617a3a3b93f3a Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Wed, 29 Jul 2020 11:06:02 -0400 Subject: [PATCH 0139/1792] [dev.link] use per package filenames to build pclntab In order to prevent renumbering of filenames in pclntab generation, use the per-package file list (previously only used for DWARF generation) as file-indices. This is the largest step to eliminate renumbering of filenames in pclntab. Note, this is probably not the final state of the file table within the object file. In this form, the linker loads all filenames for all objects. I'll move to storing the filenames as regular string symbols,and defaulting all string symbols to using the larger hash value to make generation of pcln simplest, and most memory friendly. Change-Id: I23daafa3f4b4535076e23100200ae0e7163aafe0 Reviewed-on: https://go-review.googlesource.com/c/go/+/245485 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/internal/goobj/read.go | 46 +++++++++---------- src/cmd/internal/goobj/readnew.go | 15 ++++-- src/cmd/internal/goobj2/funcinfo.go | 31 ++++++------- src/cmd/internal/goobj2/objfile.go | 12 ++--- src/cmd/internal/obj/dwarf.go | 12 ----- src/cmd/internal/obj/line.go | 6 +++ src/cmd/internal/obj/link.go | 6 +-- src/cmd/internal/obj/objfile2.go | 39 ++++++---------- src/cmd/internal/obj/pcln.go | 23 ++-------- src/cmd/internal/obj/sym.go | 5 +- src/cmd/internal/objfile/goobj.go | 2 +- src/cmd/internal/src/xpos.go | 4 +- src/cmd/link/internal/ld/dwarf.go | 2 +- src/cmd/link/internal/ld/pcln.go | 37 +++++++++------ src/cmd/link/internal/loader/loader.go | 17 ++++--- src/cmd/link/internal/sym/compilation_unit.go | 12 ++--- 16 files changed, 126 insertions(+), 143 deletions(-) diff --git a/src/cmd/internal/goobj/read.go b/src/cmd/internal/goobj/read.go index 2bbc35d345..cb388a84cd 100644 --- a/src/cmd/internal/goobj/read.go +++ b/src/cmd/internal/goobj/read.go @@ -94,20 +94,20 @@ type Var struct { // Func contains additional per-symbol information specific to functions. type Func struct { - Args int64 // size in bytes of argument frame: inputs and outputs - Frame int64 // size in bytes of local variable frame - Align uint32 // alignment requirement in bytes for the address of the function - Leaf bool // function omits save of link register (ARM) - NoSplit bool // function omits stack split prologue - TopFrame bool // function is the top of the call stack - Var []Var // detail about local variables - PCSP Data // PC → SP offset map - PCFile Data // PC → file number map (index into File) - PCLine Data // PC → line number map - PCInline Data // PC → inline tree index map - PCData []Data // PC → runtime support data map - FuncData []FuncData // non-PC-specific runtime support data - File []string // paths indexed by PCFile + Args int64 // size in bytes of argument frame: inputs and outputs + Frame int64 // size in bytes of local variable frame + Align uint32 // alignment requirement in bytes for the address of the function + Leaf bool // function omits save of link register (ARM) + NoSplit bool // function omits stack split prologue + TopFrame bool // function is the top of the call stack + Var []Var // detail about local variables + PCSP Data // PC → SP offset map + PCFile Data // PC → file number map (index into File) + PCLine Data // PC → line number map + PCInline Data // PC → inline tree index map + PCData []Data // PC → runtime support data map + FuncData []FuncData // non-PC-specific runtime support data + File map[goobj2.CUFileIndex]struct{} // set of files used in this function InlTree []InlinedCall } @@ -123,7 +123,7 @@ type FuncData struct { // See cmd/internal/obj.InlTree for details. type InlinedCall struct { Parent int64 - File string + File goobj2.CUFileIndex Line int64 Func SymID ParentPC int64 @@ -131,14 +131,14 @@ type InlinedCall struct { // A Package is a parsed Go object file or archive defining a Go package. type Package struct { - ImportPath string // import path denoting this package - Imports []string // packages imported by this package - SymRefs []SymID // list of symbol names and versions referred to by this pack - Syms []*Sym // symbols defined by this package - MaxVersion int64 // maximum Version in any SymID in Syms - Arch string // architecture - Native []*NativeReader // native object data (e.g. ELF) - DWARFFileList []string // List of files for the DWARF .debug_lines section + ImportPath string // import path denoting this package + Imports []string // packages imported by this package + SymRefs []SymID // list of symbol names and versions referred to by this pack + Syms []*Sym // symbols defined by this package + MaxVersion int64 // maximum Version in any SymID in Syms + Arch string // architecture + Native []*NativeReader // native object data (e.g. ELF) + FileList []string // List of files for this package. } type NativeReader struct { diff --git a/src/cmd/internal/goobj/readnew.go b/src/cmd/internal/goobj/readnew.go index ebac2b5ed1..11847942e8 100644 --- a/src/cmd/internal/goobj/readnew.go +++ b/src/cmd/internal/goobj/readnew.go @@ -75,6 +75,12 @@ func (r *objReader) readNew() { // Read things for the current goobj API for now. + // File names + r.p.FileList = make([]string, rr.NFile()) + for i := range r.p.FileList { + r.p.FileList[i] = rr.File(i) + } + // Symbols pcdataBase := start + rr.PcdataBase() ndef := uint32(rr.NSym() + rr.NHashed64def() + rr.NHasheddef() + rr.NNonpkgdef()) @@ -166,7 +172,7 @@ func (r *objReader) readNew() { PCInline: Data{int64(pcdataBase + info.Pcinline), int64(info.Pcdata[0] - info.Pcinline)}, PCData: make([]Data, len(info.Pcdata)-1), // -1 as we appended one above FuncData: make([]FuncData, len(info.Funcdataoff)), - File: make([]string, len(info.File)), + File: make(map[goobj2.CUFileIndex]struct{}, len(info.File)), InlTree: make([]InlinedCall, len(info.InlTree)), } sym.Func = f @@ -177,15 +183,14 @@ func (r *objReader) readNew() { symID := resolveSymRef(funcdata[k]) f.FuncData[k] = FuncData{symID, int64(info.Funcdataoff[k])} } - for k := range f.File { - symID := resolveSymRef(info.File[k]) - f.File[k] = symID.Name + for _, k := range info.File { + f.File[k] = struct{}{} } for k := range f.InlTree { inl := &info.InlTree[k] f.InlTree[k] = InlinedCall{ Parent: int64(inl.Parent), - File: resolveSymRef(inl.File).Name, + File: inl.File, Line: int64(inl.Line), Func: resolveSymRef(inl.Func), ParentPC: int64(inl.ParentPC), diff --git a/src/cmd/internal/goobj2/funcinfo.go b/src/cmd/internal/goobj2/funcinfo.go index b525c88b13..9d2522d3c2 100644 --- a/src/cmd/internal/goobj2/funcinfo.go +++ b/src/cmd/internal/goobj2/funcinfo.go @@ -10,6 +10,10 @@ import ( "encoding/binary" ) +// CUFileIndex is used to index the filenames that are stored in the +// per-package/per-CU FileList. +type CUFileIndex uint32 + // FuncInfo is serialized as a symbol (aux symbol). The symbol data is // the binary encoding of the struct below. // @@ -26,7 +30,7 @@ type FuncInfo struct { Pcdata []uint32 PcdataEnd uint32 Funcdataoff []uint32 - File []SymRef // TODO: just use string? + File []CUFileIndex InlTree []InlTreeNode } @@ -57,8 +61,7 @@ func (a *FuncInfo) Write(w *bytes.Buffer) { } writeUint32(uint32(len(a.File))) for _, f := range a.File { - writeUint32(f.PkgIdx) - writeUint32(f.SymIdx) + writeUint32(uint32(f)) } writeUint32(uint32(len(a.InlTree))) for i := range a.InlTree { @@ -93,9 +96,9 @@ func (a *FuncInfo) Read(b []byte) { a.Funcdataoff[i] = readUint32() } filelen := readUint32() - a.File = make([]SymRef, filelen) + a.File = make([]CUFileIndex, filelen) for i := range a.File { - a.File[i] = SymRef{readUint32(), readUint32()} + a.File[i] = CUFileIndex(readUint32()) } inltreelen := readUint32() a.InlTree = make([]InlTreeNode, inltreelen) @@ -136,8 +139,7 @@ func (*FuncInfo) ReadFuncInfoLengths(b []byte) FuncInfoLengths { result.NumFile = binary.LittleEndian.Uint32(b[numfileOff:]) result.FileOff = numfileOff + 4 - const symRefSize = 4 + 4 - numinltreeOff := result.FileOff + symRefSize*result.NumFile + numinltreeOff := result.FileOff + 4*result.NumFile result.NumInlTree = binary.LittleEndian.Uint32(b[numinltreeOff:]) result.InlTreeOff = numinltreeOff + 4 @@ -181,14 +183,12 @@ func (*FuncInfo) ReadFuncdataoff(b []byte, funcdataofffoff uint32, k uint32) int return int64(binary.LittleEndian.Uint32(b[funcdataofffoff+4*k:])) } -func (*FuncInfo) ReadFile(b []byte, filesoff uint32, k uint32) SymRef { - p := binary.LittleEndian.Uint32(b[filesoff+8*k:]) - s := binary.LittleEndian.Uint32(b[filesoff+4+8*k:]) - return SymRef{p, s} +func (*FuncInfo) ReadFile(b []byte, filesoff uint32, k uint32) CUFileIndex { + return CUFileIndex(binary.LittleEndian.Uint32(b[filesoff+4*k:])) } func (*FuncInfo) ReadInlTree(b []byte, inltreeoff uint32, k uint32) InlTreeNode { - const inlTreeNodeSize = 4 * 7 + const inlTreeNodeSize = 4 * 6 var result InlTreeNode result.Read(b[inltreeoff+k*inlTreeNodeSize:]) return result @@ -197,7 +197,7 @@ func (*FuncInfo) ReadInlTree(b []byte, inltreeoff uint32, k uint32) InlTreeNode // InlTreeNode is the serialized form of FileInfo.InlTree. type InlTreeNode struct { Parent int32 - File SymRef + File CUFileIndex Line int32 Func SymRef ParentPC int32 @@ -210,8 +210,7 @@ func (inl *InlTreeNode) Write(w *bytes.Buffer) { w.Write(b[:]) } writeUint32(uint32(inl.Parent)) - writeUint32(inl.File.PkgIdx) - writeUint32(inl.File.SymIdx) + writeUint32(uint32(inl.File)) writeUint32(uint32(inl.Line)) writeUint32(inl.Func.PkgIdx) writeUint32(inl.Func.SymIdx) @@ -226,7 +225,7 @@ func (inl *InlTreeNode) Read(b []byte) []byte { return x } inl.Parent = int32(readUint32()) - inl.File = SymRef{readUint32(), readUint32()} + inl.File = CUFileIndex(readUint32()) inl.Line = int32(readUint32()) inl.Func = SymRef{readUint32(), readUint32()} inl.ParentPC = int32(readUint32()) diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj2/objfile.go index 6f0df86b06..49f45a7736 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj2/objfile.go @@ -38,7 +38,7 @@ import ( // // PkgIndex [...]string // referenced packages by index // -// DwarfFiles [...]string +// Files [...]string // // SymbolDefs [...]struct { // Name string @@ -177,7 +177,7 @@ const ( const ( BlkAutolib = iota BlkPkgIdx - BlkDwarfFile + BlkFile BlkSymdef BlkHashed64def BlkHasheddef @@ -686,12 +686,12 @@ func (r *Reader) Pkg(i int) string { return r.StringRef(off) } -func (r *Reader) NDwarfFile() int { - return int(r.h.Offsets[BlkDwarfFile+1]-r.h.Offsets[BlkDwarfFile]) / stringRefSize +func (r *Reader) NFile() int { + return int(r.h.Offsets[BlkFile+1]-r.h.Offsets[BlkFile]) / stringRefSize } -func (r *Reader) DwarfFile(i int) string { - off := r.h.Offsets[BlkDwarfFile] + uint32(i)*stringRefSize +func (r *Reader) File(i int) string { + off := r.h.Offsets[BlkFile] + uint32(i)*stringRefSize return r.StringRef(off) } diff --git a/src/cmd/internal/obj/dwarf.go b/src/cmd/internal/obj/dwarf.go index 3fc93081fa..724aea2f8f 100644 --- a/src/cmd/internal/obj/dwarf.go +++ b/src/cmd/internal/obj/dwarf.go @@ -32,18 +32,6 @@ const ( func (ctxt *Link) generateDebugLinesSymbol(s, lines *LSym) { dctxt := dwCtxt{ctxt} - // The Pcfile table is used to generate the debug_lines section, and the file - // indices for that data could differ from the files we write out for the - // debug_lines section. Here we generate a LUT between those two indices. - fileNums := make(map[int32]int64) - for i, filename := range s.Func.Pcln.File { - if symbolIndex := ctxt.PosTable.FileIndex(filename); symbolIndex >= 0 { - fileNums[int32(i)] = int64(symbolIndex) + 1 - } else { - panic(fmt.Sprintf("First time we've seen filename: %q", filename)) - } - } - // Emit a LNE_set_address extended opcode, so as to establish the // starting text address of this function. dctxt.AddUint8(lines, 0) diff --git a/src/cmd/internal/obj/line.go b/src/cmd/internal/obj/line.go index 79ecb0068f..54b9c4748c 100644 --- a/src/cmd/internal/obj/line.go +++ b/src/cmd/internal/obj/line.go @@ -22,3 +22,9 @@ func linkgetlineFromPos(ctxt *Link, xpos src.XPos) (f string, l int32) { // TODO(gri) Should this use relative or absolute line number? return pos.SymFilename(), int32(pos.RelLine()) } + +// getFileIndexAndLine returns the file index (local to the CU), and the line number for a position. +func getFileIndexAndLine(ctxt *Link, xpos src.XPos) (int, int32) { + f, l := linkgetlineFromPos(ctxt, xpos) + return ctxt.PosTable.FileIndex(f), l +} diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 8d189b71f9..62943a7cb3 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -631,10 +631,8 @@ type Pcln struct { Pcdata []Pcdata Funcdata []*LSym Funcdataoff []int64 - File []string - Lastfile string - Lastindex int - InlTree InlTree // per-function inlining tree extracted from the global tree + UsedFiles map[goobj2.CUFileIndex]struct{} // file indices used while generating pcfile + InlTree InlTree // per-function inlining tree extracted from the global tree } type Reloc struct { diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index 17021d9294..ae1a3646b1 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -16,6 +16,7 @@ import ( "fmt" "io" "path/filepath" + "sort" "strings" ) @@ -69,9 +70,9 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { w.StringRef(pkg) } - // DWARF file table - h.Offsets[goobj2.BlkDwarfFile] = w.Offset() - for _, f := range ctxt.PosTable.DebugLinesFileTable() { + // File table (for DWARF and pcln generation). + h.Offsets[goobj2.BlkFile] = w.Offset() + for _, f := range ctxt.PosTable.FileTable() { w.StringRef(filepath.ToSlash(f)) } @@ -248,20 +249,9 @@ func (w *writer) StringTable() { } w.AddString(s.Name) }) - w.ctxt.traverseSyms(traverseDefs, func(s *LSym) { - if s.Type != objabi.STEXT { - return - } - pc := &s.Func.Pcln - for _, f := range pc.File { - w.AddString(filepath.ToSlash(f)) - } - for _, call := range pc.InlTree.nodes { - f, _ := linkgetlineFromPos(w.ctxt, call.Pos) - w.AddString(filepath.ToSlash(f)) - } - }) - for _, f := range w.ctxt.PosTable.DebugLinesFileTable() { + + // All filenames are in the postable. + for _, f := range w.ctxt.PosTable.FileTable() { w.AddString(filepath.ToSlash(f)) } } @@ -594,18 +584,19 @@ func genFuncInfoSyms(ctxt *Link) { for i, x := range pc.Funcdataoff { o.Funcdataoff[i] = uint32(x) } - o.File = make([]goobj2.SymRef, len(pc.File)) - for i, f := range pc.File { - fsym := ctxt.Lookup(f) - o.File[i] = makeSymRef(fsym) + i := 0 + o.File = make([]goobj2.CUFileIndex, len(pc.UsedFiles)) + for f := range pc.UsedFiles { + o.File[i] = f + i++ } + sort.Slice(o.File, func(i, j int) bool { return o.File[i] < o.File[j] }) o.InlTree = make([]goobj2.InlTreeNode, len(pc.InlTree.nodes)) for i, inl := range pc.InlTree.nodes { - f, l := linkgetlineFromPos(ctxt, inl.Pos) - fsym := ctxt.Lookup(f) + f, l := getFileIndexAndLine(ctxt, inl.Pos) o.InlTree[i] = goobj2.InlTreeNode{ Parent: int32(inl.Parent), - File: makeSymRef(fsym), + File: goobj2.CUFileIndex(f), Line: l, Func: makeSymRef(inl.Func), ParentPC: inl.ParentPC, diff --git a/src/cmd/internal/obj/pcln.go b/src/cmd/internal/obj/pcln.go index 58552b9299..b9d58e7ca3 100644 --- a/src/cmd/internal/obj/pcln.go +++ b/src/cmd/internal/obj/pcln.go @@ -5,6 +5,7 @@ package obj import ( + "cmd/internal/goobj2" "encoding/binary" "log" ) @@ -130,28 +131,13 @@ func pctofileline(ctxt *Link, sym *LSym, oldval int32, p *Prog, phase int32, arg if p.As == ATEXT || p.As == ANOP || p.Pos.Line() == 0 || phase == 1 { return oldval } - f, l := linkgetlineFromPos(ctxt, p.Pos) + f, l := getFileIndexAndLine(ctxt, p.Pos) if arg == nil { return l } pcln := arg.(*Pcln) - - if f == pcln.Lastfile { - return int32(pcln.Lastindex) - } - - for i, file := range pcln.File { - if file == f { - pcln.Lastfile = f - pcln.Lastindex = i - return int32(i) - } - } - i := len(pcln.File) - pcln.File = append(pcln.File, f) - pcln.Lastfile = f - pcln.Lastindex = i - return int32(i) + pcln.UsedFiles[goobj2.CUFileIndex(f)] = struct{}{} + return int32(f) } // pcinlineState holds the state used to create a function's inlining @@ -263,6 +249,7 @@ func pctopcdata(ctxt *Link, sym *LSym, oldval int32, p *Prog, phase int32, arg i func linkpcln(ctxt *Link, cursym *LSym) { pcln := &cursym.Func.Pcln + pcln.UsedFiles = make(map[goobj2.CUFileIndex]struct{}) npcdata := 0 nfuncdata := 0 diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 67e4081f74..f62e1f5e58 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -367,8 +367,9 @@ func (ctxt *Link) traverseFuncAux(flag traverseFlag, fsym *LSym, fn func(parent fn(fsym, d) } } - for _, f := range pc.File { - if filesym := ctxt.Lookup(f); filesym != nil { + files := ctxt.PosTable.FileTable() + for f := range pc.UsedFiles { + if filesym := ctxt.Lookup(files[f]); filesym != nil { fn(fsym, filesym) } } diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go index 7c04b6d5ce..e1c2fd5d5c 100644 --- a/src/cmd/internal/objfile/goobj.go +++ b/src/cmd/internal/objfile/goobj.go @@ -135,7 +135,7 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { return "", 0, nil } fileID := int(pcValue(pcfile, pc-uint64(s.Data.Offset), arch)) - fileName := s.Func.File[fileID] + fileName := f.goobj.FileList[fileID] pcline := make([]byte, s.Func.PCLine.Size) _, err = f.f.ReadAt(pcline, s.Func.PCLine.Offset) if err != nil { diff --git a/src/cmd/internal/src/xpos.go b/src/cmd/internal/src/xpos.go index 23c8346757..867d0ab069 100644 --- a/src/cmd/internal/src/xpos.go +++ b/src/cmd/internal/src/xpos.go @@ -163,8 +163,8 @@ func (t *PosTable) FileIndex(filename string) int { return -1 } -// DebugLinesFiles returns the file table for the debug_lines DWARF section. -func (t *PosTable) DebugLinesFileTable() []string { +// FileTable returns a slice of all files used to build this package. +func (t *PosTable) FileTable() []string { // Create a LUT of the global package level file indices. This table is what // is written in the debug_lines header, the file[N] will be referenced as // N+1 in the debug_lines table. diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 50eebea47a..dc237e7278 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1224,7 +1224,7 @@ func (d *dwctxt) writelines(unit *sym.CompilationUnit, lineProlog loader.Sym) [] // Copy over the file table. fileNums := make(map[string]int) - for i, name := range unit.DWARFFileTable { + for i, name := range unit.FileTable { name := expandFile(name) if len(name) == 0 { // Can't have empty filenames, and having a unique diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 606736e271..e5dfa837ba 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -5,6 +5,7 @@ package ld import ( + "cmd/internal/goobj2" "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/src" @@ -32,7 +33,7 @@ import ( type oldPclnState struct { ldr *loader.Loader deferReturnSym loader.Sym - numberedFiles map[loader.Sym]int64 + numberedFiles map[string]int64 filepaths []string } @@ -88,7 +89,7 @@ func makeOldPclnState(ctxt *Link) *oldPclnState { state := &oldPclnState{ ldr: ldr, deferReturnSym: drs, - numberedFiles: make(map[loader.Sym]int64), + numberedFiles: make(map[string]int64), // NB: initial entry in filepaths below is to reserve the zero value, // so that when we do a map lookup in numberedFiles fails, it will not // return a value slot in filepaths. @@ -153,30 +154,37 @@ func ftabaddstring(ftab *loader.SymbolBuilder, s string) int32 { } // numberfile assigns a file number to the file if it hasn't been assigned already. -func (state *oldPclnState) numberfile(file loader.Sym) int64 { +// This funciton looks at a CU's file at index [i], and if it's a new filename, +// stores that filename in the global file table, and adds it to the map lookup +// for renumbering pcfile. +func (state *oldPclnState) numberfile(cu *sym.CompilationUnit, i goobj2.CUFileIndex) int64 { + file := cu.FileTable[i] if val, ok := state.numberedFiles[file]; ok { return val } - sn := state.ldr.SymName(file) - path := sn[len(src.FileSymPrefix):] + path := file + if strings.HasPrefix(path, src.FileSymPrefix) { + path = file[len(src.FileSymPrefix):] + } val := int64(len(state.filepaths)) state.numberedFiles[file] = val state.filepaths = append(state.filepaths, expandGoroot(path)) return val } -func (state *oldPclnState) fileVal(file loader.Sym) int64 { +func (state *oldPclnState) fileVal(cu *sym.CompilationUnit, i int32) int64 { + file := cu.FileTable[i] if val, ok := state.numberedFiles[file]; ok { return val } panic("should have been numbered first") } -func (state *oldPclnState) renumberfiles(ctxt *Link, fi loader.FuncInfo, d *sym.Pcdata) { +func (state *oldPclnState) renumberfiles(ctxt *Link, cu *sym.CompilationUnit, fi loader.FuncInfo, d *sym.Pcdata) { // Give files numbers. nf := fi.NumFile() for i := uint32(0); i < nf; i++ { - state.numberfile(fi.File(int(i))) + state.numberfile(cu, fi.File(int(i))) } buf := make([]byte, binary.MaxVarintLen32) @@ -191,10 +199,10 @@ func (state *oldPclnState) renumberfiles(ctxt *Link, fi loader.FuncInfo, d *sym. if oldval == -1 { val = -1 } else { - if oldval < 0 || oldval >= int32(nf) { + if oldval < 0 || oldval >= int32(len(cu.FileTable)) { log.Fatalf("bad pcdata %d", oldval) } - val = int32(state.fileVal(fi.File(int(oldval)))) + val = int32(state.fileVal(cu, oldval)) } dv := val - newval @@ -287,7 +295,7 @@ func (state *oldPclnState) computeDeferReturn(target *Target, s loader.Sym) uint // genInlTreeSym generates the InlTree sym for a function with the // specified FuncInfo. -func (state *oldPclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch, newState *pclntab) loader.Sym { +func (state *oldPclnState) genInlTreeSym(cu *sym.CompilationUnit, fi loader.FuncInfo, arch *sys.Arch, newState *pclntab) loader.Sym { ldr := state.ldr its := ldr.CreateExtSym("", 0) inlTreeSym := ldr.MakeSymbolUpdater(its) @@ -305,7 +313,7 @@ func (state *oldPclnState) genInlTreeSym(fi loader.FuncInfo, arch *sys.Arch, new // might overlap exactly so that only the innermost file // appears in the Pcfile table. In that case, this assigns // the outer file a number. - val := state.numberfile(call.File) + val := state.numberfile(cu, call.File) nameoff, ok := newState.funcNameOffset[call.Func] if !ok { panic("couldn't find function name offset") @@ -603,11 +611,12 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { deferreturn := oldState.computeDeferReturn(&ctxt.Target, s) off = int32(ftab.SetUint32(ctxt.Arch, int64(off), deferreturn)) + cu := ldr.SymUnit(s) if fi.Valid() { pcsp = sym.Pcdata{P: fi.Pcsp()} pcfile = sym.Pcdata{P: fi.Pcfile()} pcline = sym.Pcdata{P: fi.Pcline()} - oldState.renumberfiles(ctxt, fi, &pcfile) + oldState.renumberfiles(ctxt, cu, fi, &pcfile) if false { // Sanity check the new numbering it := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) @@ -621,7 +630,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { } if fi.Valid() && fi.NumInlTree() > 0 { - its := oldState.genInlTreeSym(fi, ctxt.Arch, state) + its := oldState.genInlTreeSym(cu, fi, ctxt.Arch, state) funcdata[objabi.FUNCDATA_InlTree] = its pcdata[objabi.PCDATA_InlTreeIndex] = sym.Pcdata{P: fi.Pcinline()} } diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index d56c748f9c..882799e123 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1961,17 +1961,16 @@ func (fi *FuncInfo) NumFile() uint32 { return fi.lengths.NumFile } -func (fi *FuncInfo) File(k int) Sym { +func (fi *FuncInfo) File(k int) goobj2.CUFileIndex { if !fi.lengths.Initialized { panic("need to call Preload first") } - sr := (*goobj2.FuncInfo)(nil).ReadFile(fi.data, fi.lengths.FileOff, uint32(k)) - return fi.l.resolve(fi.r, sr) + return (*goobj2.FuncInfo)(nil).ReadFile(fi.data, fi.lengths.FileOff, uint32(k)) } type InlTreeNode struct { Parent int32 - File Sym + File goobj2.CUFileIndex Line int32 Func Sym ParentPC int32 @@ -1991,7 +1990,7 @@ func (fi *FuncInfo) InlTree(k int) InlTreeNode { node := (*goobj2.FuncInfo)(nil).ReadInlTree(fi.data, fi.lengths.InlTreeOff, uint32(k)) return InlTreeNode{ Parent: node.Parent, - File: fi.l.resolve(fi.r, node.File), + File: node.File, Line: node.Line, Func: fi.l.resolve(fi.r, node.Func), ParentPC: node.ParentPC, @@ -2060,10 +2059,10 @@ func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, u lib.Autolib = append(lib.Autolib, r.Autolib()...) // DWARF file table - nfile := r.NDwarfFile() - unit.DWARFFileTable = make([]string, nfile) - for i := range unit.DWARFFileTable { - unit.DWARFFileTable[i] = r.DwarfFile(i) + nfile := r.NFile() + unit.FileTable = make([]string, nfile) + for i := range unit.FileTable { + unit.FileTable[i] = r.File(i) } l.addObj(lib.Pkg, or) diff --git a/src/cmd/link/internal/sym/compilation_unit.go b/src/cmd/link/internal/sym/compilation_unit.go index dc37a36cba..5d7206db66 100644 --- a/src/cmd/link/internal/sym/compilation_unit.go +++ b/src/cmd/link/internal/sym/compilation_unit.go @@ -20,12 +20,12 @@ type LoaderSym int // // These are used for both DWARF and pclntab generation. type CompilationUnit struct { - Pkg string // The package name, eg ("fmt", or "runtime") - Lib *Library // Our library - PclnIndex int // Index of this CU in pclntab - PCs []dwarf.Range // PC ranges, relative to Textp[0] - DWInfo *dwarf.DWDie // CU root DIE - DWARFFileTable []string // The file table used to generate the .debug_lines + Pkg string // The package name, eg ("fmt", or "runtime") + Lib *Library // Our library + PclnIndex int // Index of this CU in pclntab + PCs []dwarf.Range // PC ranges, relative to Textp[0] + DWInfo *dwarf.DWDie // CU root DIE + FileTable []string // The file table used in this compilation unit. Consts LoaderSym // Package constants DIEs FuncDIEs []LoaderSym // Function DIE subtrees -- GitLab From a93a4c178025b52be85c9eb4b9f2815716a62d11 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 4 Aug 2020 20:25:10 -0400 Subject: [PATCH 0140/1792] runtime: make nanotime1 reentrant Currently, nanotime1 (and walltime1) is not reentrant, in that it sets m.vdsoSP at entry and clears it at exit. If a signal lands in between, and nanotime1 is called from the signal handler, it will clear m.vdsoSP while we are still in nanotime1. If (in the unlikely event) it is signaled again, m.vdsoSP will be wrong, which may cause the stack unwinding code to crash. This CL makes it reentrant, by saving/restoring the previous vdsoPC and vdsoSP, instead of setting it to 0 at exit. TODO: have some way to test? Change-Id: I9ee53b251f1d8a5a489c71d4b4c0df1dee70c3e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/246763 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/sys_linux_386.s | 38 +++++++++++++++++++--- src/runtime/sys_linux_amd64.s | 56 ++++++++++++++++++++++----------- src/runtime/sys_linux_arm.s | 36 ++++++++++++++++++--- src/runtime/sys_linux_arm64.s | 34 ++++++++++++++++++-- src/runtime/sys_linux_mips64x.s | 38 +++++++++++++++++++--- src/runtime/sys_linux_ppc64x.s | 40 ++++++++++++++++++++--- 6 files changed, 206 insertions(+), 36 deletions(-) diff --git a/src/runtime/sys_linux_386.s b/src/runtime/sys_linux_386.s index 1b28098ad9..5b9b638ad7 100644 --- a/src/runtime/sys_linux_386.s +++ b/src/runtime/sys_linux_386.s @@ -222,7 +222,7 @@ TEXT runtime·mincore(SB),NOSPLIT,$0-16 RET // func walltime1() (sec int64, nsec int32) -TEXT runtime·walltime1(SB), NOSPLIT, $0-12 +TEXT runtime·walltime1(SB), NOSPLIT, $8-12 // We don't know how much stack space the VDSO code will need, // so switch to g0. @@ -233,6 +233,13 @@ TEXT runtime·walltime1(SB), NOSPLIT, $0-12 MOVL g_m(AX), SI // SI unchanged by C code. // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVL m_vdsoPC(SI), CX + MOVL m_vdsoSP(SI), DX + MOVL CX, 0(SP) + MOVL DX, 4(SP) + LEAL sec+0(FP), DX MOVL -4(DX), CX MOVL CX, m_vdsoPC(SI) @@ -276,7 +283,15 @@ finish: MOVL 12(SP), BX // nsec MOVL BP, SP // Restore real SP - MOVL $0, m_vdsoSP(SI) + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVL 4(SP), CX + MOVL CX, m_vdsoSP(SI) + MOVL 0(SP), CX + MOVL CX, m_vdsoPC(SI) // sec is in AX, nsec in BX MOVL AX, sec_lo+0(FP) @@ -286,7 +301,7 @@ finish: // int64 nanotime(void) so really // void nanotime(int64 *nsec) -TEXT runtime·nanotime1(SB), NOSPLIT, $0-8 +TEXT runtime·nanotime1(SB), NOSPLIT, $8-8 // Switch to g0 stack. See comment above in runtime·walltime. MOVL SP, BP // Save old SP; BP unchanged by C code. @@ -296,6 +311,13 @@ TEXT runtime·nanotime1(SB), NOSPLIT, $0-8 MOVL g_m(AX), SI // SI unchanged by C code. // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVL m_vdsoPC(SI), CX + MOVL m_vdsoSP(SI), DX + MOVL CX, 0(SP) + MOVL DX, 4(SP) + LEAL ret+0(FP), DX MOVL -4(DX), CX MOVL CX, m_vdsoPC(SI) @@ -332,7 +354,15 @@ finish: MOVL 12(SP), BX // nsec MOVL BP, SP // Restore real SP - MOVL $0, m_vdsoSP(SI) + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVL 4(SP), CX + MOVL CX, m_vdsoSP(SI) + MOVL 0(SP), CX + MOVL CX, m_vdsoPC(SI) // sec is in AX, nsec in BX // convert to DX:AX nsec diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s index 58d3bc54b4..fe9c6bce85 100644 --- a/src/runtime/sys_linux_amd64.s +++ b/src/runtime/sys_linux_amd64.s @@ -206,7 +206,7 @@ TEXT runtime·mincore(SB),NOSPLIT,$0-28 // func walltime1() (sec int64, nsec int32) // non-zero frame-size means bp is saved and restored -TEXT runtime·walltime1(SB),NOSPLIT,$8-12 +TEXT runtime·walltime1(SB),NOSPLIT,$16-12 // We don't know how much stack space the VDSO code will need, // so switch to g0. // In particular, a kernel configured with CONFIG_OPTIMIZE_INLINING=n @@ -221,6 +221,13 @@ TEXT runtime·walltime1(SB),NOSPLIT,$8-12 MOVQ g_m(AX), BX // BX unchanged by C code. // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVQ m_vdsoPC(BX), CX + MOVQ m_vdsoSP(BX), DX + MOVQ CX, 0(SP) + MOVQ DX, 8(SP) + LEAQ sec+0(FP), DX MOVQ -8(DX), CX MOVQ CX, m_vdsoPC(BX) @@ -244,8 +251,17 @@ noswitch: CALL AX MOVQ 0(SP), AX // sec MOVQ 8(SP), DX // nsec +ret: MOVQ BP, SP // Restore real SP - MOVQ $0, m_vdsoSP(BX) + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVQ 8(SP), CX + MOVQ CX, m_vdsoSP(BX) + MOVQ 0(SP), CX + MOVQ CX, m_vdsoPC(BX) MOVQ AX, sec+0(FP) MOVL DX, nsec+8(FP) RET @@ -257,15 +273,10 @@ fallback: MOVQ 0(SP), AX // sec MOVL 8(SP), DX // usec IMULQ $1000, DX - MOVQ BP, SP // Restore real SP - MOVQ $0, m_vdsoSP(BX) - MOVQ AX, sec+0(FP) - MOVL DX, nsec+8(FP) - RET + JMP ret // func nanotime1() int64 -// non-zero frame-size means bp is saved and restored -TEXT runtime·nanotime1(SB),NOSPLIT,$8-8 +TEXT runtime·nanotime1(SB),NOSPLIT,$16-8 // Switch to g0 stack. See comment above in runtime·walltime. MOVQ SP, BP // Save old SP; BP unchanged by C code. @@ -275,6 +286,13 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$8-8 MOVQ g_m(AX), BX // BX unchanged by C code. // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVQ m_vdsoPC(BX), CX + MOVQ m_vdsoSP(BX), DX + MOVQ CX, 0(SP) + MOVQ DX, 8(SP) + LEAQ ret+0(FP), DX MOVQ -8(DX), CX MOVQ CX, m_vdsoPC(BX) @@ -298,8 +316,17 @@ noswitch: CALL AX MOVQ 0(SP), AX // sec MOVQ 8(SP), DX // nsec +ret: MOVQ BP, SP // Restore real SP - MOVQ $0, m_vdsoSP(BX) + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVQ 8(SP), CX + MOVQ CX, m_vdsoSP(BX) + MOVQ 0(SP), CX + MOVQ CX, m_vdsoPC(BX) // sec is in AX, nsec in DX // return nsec in AX IMULQ $1000000000, AX @@ -313,15 +340,8 @@ fallback: CALL AX MOVQ 0(SP), AX // sec MOVL 8(SP), DX // usec - MOVQ BP, SP // Restore real SP - MOVQ $0, m_vdsoSP(BX) IMULQ $1000, DX - // sec is in AX, nsec in DX - // return nsec in AX - IMULQ $1000000000, AX - ADDQ DX, AX - MOVQ AX, ret+0(FP) - RET + JMP ret TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0-28 MOVL how+0(FP), DI diff --git a/src/runtime/sys_linux_arm.s b/src/runtime/sys_linux_arm.s index e103da56dc..475f52344c 100644 --- a/src/runtime/sys_linux_arm.s +++ b/src/runtime/sys_linux_arm.s @@ -242,7 +242,7 @@ TEXT runtime·mincore(SB),NOSPLIT,$0 MOVW R0, ret+12(FP) RET -TEXT runtime·walltime1(SB),NOSPLIT,$0-12 +TEXT runtime·walltime1(SB),NOSPLIT,$8-12 // We don't know how much stack space the VDSO code will need, // so switch to g0. @@ -252,6 +252,13 @@ TEXT runtime·walltime1(SB),NOSPLIT,$0-12 MOVW g_m(g), R5 // R5 is unchanged by C code. // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVW m_vdsoPC(R5), R1 + MOVW m_vdsoSP(R5), R2 + MOVW R1, 4(R13) + MOVW R2, 8(R13) + MOVW LR, m_vdsoPC(R5) MOVW R13, m_vdsoSP(R5) @@ -312,8 +319,15 @@ finish: MOVW 12(R13), R2 // nsec MOVW R4, R13 // Restore real SP - MOVW $0, R1 + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVW 8(R13), R1 MOVW R1, m_vdsoSP(R5) + MOVW 4(R13), R1 + MOVW R1, m_vdsoPC(R5) MOVW R0, sec_lo+0(FP) MOVW R1, sec_hi+4(FP) @@ -321,7 +335,7 @@ finish: RET // int64 nanotime1(void) -TEXT runtime·nanotime1(SB),NOSPLIT,$0-8 +TEXT runtime·nanotime1(SB),NOSPLIT,$8-8 // Switch to g0 stack. See comment above in runtime·walltime. // Save old SP. Use R13 instead of SP to avoid linker rewriting the offsets. @@ -330,6 +344,13 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$0-8 MOVW g_m(g), R5 // R5 is unchanged by C code. // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVW m_vdsoPC(R5), R1 + MOVW m_vdsoSP(R5), R2 + MOVW R1, 4(R13) + MOVW R2, 8(R13) + MOVW LR, m_vdsoPC(R5) MOVW R13, m_vdsoSP(R5) @@ -390,8 +411,15 @@ finish: MOVW 12(R13), R2 // nsec MOVW R4, R13 // Restore real SP - MOVW $0, R4 + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVW 8(R13), R4 MOVW R4, m_vdsoSP(R5) + MOVW 4(R13), R4 + MOVW R4, m_vdsoPC(R5) MOVW $1000000000, R3 MULLU R0, R3, (R1, R0) diff --git a/src/runtime/sys_linux_arm64.s b/src/runtime/sys_linux_arm64.s index b23e3b9a11..198a5bacef 100644 --- a/src/runtime/sys_linux_arm64.s +++ b/src/runtime/sys_linux_arm64.s @@ -214,6 +214,13 @@ TEXT runtime·walltime1(SB),NOSPLIT,$24-12 MOVD g_m(g), R21 // R21 = m // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVD m_vdsoPC(R21), R2 + MOVD m_vdsoSP(R21), R3 + MOVD R2, 8(RSP) + MOVD R3, 16(RSP) + MOVD LR, m_vdsoPC(R21) MOVD R20, m_vdsoSP(R21) @@ -269,7 +276,15 @@ finish: MOVD 8(RSP), R5 // nsec MOVD R20, RSP // restore SP - MOVD $0, m_vdsoSP(R21) // clear vdsoSP + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVD 16(RSP), R1 + MOVD R1, m_vdsoSP(R21) + MOVD 8(RSP), R1 + MOVD R1, m_vdsoPC(R21) MOVD R3, sec+0(FP) MOVW R5, nsec+8(FP) @@ -282,6 +297,13 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$24-8 MOVD g_m(g), R21 // R21 = m // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVD m_vdsoPC(R21), R2 + MOVD m_vdsoSP(R21), R3 + MOVD R2, 8(RSP) + MOVD R3, 16(RSP) + MOVD LR, m_vdsoPC(R21) MOVD R20, m_vdsoSP(R21) @@ -337,7 +359,15 @@ finish: MOVD 8(RSP), R5 // nsec MOVD R20, RSP // restore SP - MOVD $0, m_vdsoSP(R21) // clear vdsoSP + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVD 16(RSP), R1 + MOVD R1, m_vdsoSP(R21) + MOVD 8(RSP), R1 + MOVD R1, m_vdsoPC(R21) // sec is in R3, nsec in R5 // return nsec in R3 diff --git a/src/runtime/sys_linux_mips64x.s b/src/runtime/sys_linux_mips64x.s index 6668a0fd86..afad056d06 100644 --- a/src/runtime/sys_linux_mips64x.s +++ b/src/runtime/sys_linux_mips64x.s @@ -214,13 +214,20 @@ TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28 RET // func walltime1() (sec int64, nsec int32) -TEXT runtime·walltime1(SB),NOSPLIT,$16 +TEXT runtime·walltime1(SB),NOSPLIT,$16-12 MOVV R29, R16 // R16 is unchanged by C code MOVV R29, R1 MOVV g_m(g), R17 // R17 = m // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVV m_vdsoPC(R17), R2 + MOVV m_vdsoSP(R17), R3 + MOVV R2, 8(R29) + MOVV R3, 16(R29) + MOVV R31, m_vdsoPC(R17) MOVV R29, m_vdsoSP(R17) @@ -249,7 +256,15 @@ finish: MOVV 8(R29), R5 // nsec MOVV R16, R29 // restore SP - MOVV R0, m_vdsoSP(R17) // clear vdsoSP + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVV 16(R29), R1 + MOVV R1, m_vdsoSP(R17) + MOVV 8(R29), R1 + MOVV R1, m_vdsoPC(R17) MOVV R3, sec+0(FP) MOVW R5, nsec+8(FP) @@ -260,13 +275,20 @@ fallback: SYSCALL JMP finish -TEXT runtime·nanotime1(SB),NOSPLIT,$16 +TEXT runtime·nanotime1(SB),NOSPLIT,$16-8 MOVV R29, R16 // R16 is unchanged by C code MOVV R29, R1 MOVV g_m(g), R17 // R17 = m // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVV m_vdsoPC(R17), R2 + MOVV m_vdsoSP(R17), R3 + MOVV R2, 8(R29) + MOVV R3, 16(R29) + MOVV R31, m_vdsoPC(R17) MOVV R29, m_vdsoSP(R17) @@ -295,7 +317,15 @@ finish: MOVV 8(R29), R5 // nsec MOVV R16, R29 // restore SP - MOVV R0, m_vdsoSP(R17) // clear vdsoSP + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVV 16(R29), R1 + MOVV R1, m_vdsoSP(R17) + MOVV 8(R29), R1 + MOVV R1, m_vdsoPC(R17) // sec is in R3, nsec in R5 // return nsec in R3 diff --git a/src/runtime/sys_linux_ppc64x.s b/src/runtime/sys_linux_ppc64x.s index 8629fe3233..fd69ee70a5 100644 --- a/src/runtime/sys_linux_ppc64x.s +++ b/src/runtime/sys_linux_ppc64x.s @@ -185,7 +185,7 @@ TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28 RET // func walltime1() (sec int64, nsec int32) -TEXT runtime·walltime1(SB),NOSPLIT,$16 +TEXT runtime·walltime1(SB),NOSPLIT,$16-12 MOVD R1, R15 // R15 is unchanged by C code MOVD g_m(g), R21 // R21 = m @@ -196,6 +196,13 @@ TEXT runtime·walltime1(SB),NOSPLIT,$16 BEQ fallback // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVD m_vdsoPC(R21), R4 + MOVD m_vdsoSP(R21), R5 + MOVD R4, 32(R1) + MOVD R5, 40(R1) + MOVD LR, R14 MOVD R14, m_vdsoPC(R21) MOVD R15, m_vdsoSP(R21) @@ -214,11 +221,20 @@ noswitch: MOVD R1, R4 BL (CTR) // Call from VDSO MOVD $0, R0 // Restore R0 - MOVD R0, m_vdsoSP(R21) // Clear vdsoSP MOVD 0(R1), R3 // sec MOVD 8(R1), R5 // nsec MOVD R15, R1 // Restore SP + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVD 40(R1), R6 + MOVD R6, m_vdsoSP(R21) + MOVD 32(R1), R6 + MOVD R6, m_vdsoPC(R21) + finish: MOVD R3, sec+0(FP) MOVW R5, nsec+8(FP) @@ -232,7 +248,7 @@ fallback: MOVD 40(R1), R5 JMP finish -TEXT runtime·nanotime1(SB),NOSPLIT,$16 +TEXT runtime·nanotime1(SB),NOSPLIT,$16-8 MOVD $1, R3 // CLOCK_MONOTONIC MOVD R1, R15 // R15 is unchanged by C code @@ -243,6 +259,13 @@ TEXT runtime·nanotime1(SB),NOSPLIT,$16 BEQ fallback // Set vdsoPC and vdsoSP for SIGPROF traceback. + // Save the old values on stack and restore them on exit, + // so this function is reentrant. + MOVD m_vdsoPC(R21), R4 + MOVD m_vdsoSP(R21), R5 + MOVD R4, 32(R1) + MOVD R5, 40(R1) + MOVD LR, R14 // R14 is unchanged by C code MOVD R14, m_vdsoPC(R21) MOVD R15, m_vdsoSP(R21) @@ -261,11 +284,20 @@ noswitch: MOVD R1, R4 BL (CTR) // Call from VDSO MOVD $0, R0 // Restore R0 - MOVD $0, m_vdsoSP(R21) // Clear vdsoSP MOVD 0(R1), R3 // sec MOVD 8(R1), R5 // nsec MOVD R15, R1 // Restore SP + // Restore vdsoPC, vdsoSP + // We don't worry about being signaled between the two stores. + // If we are not in a signal handler, we'll restore vdsoSP to 0, + // and no one will care about vdsoPC. If we are in a signal handler, + // we cannot receive another signal. + MOVD 40(R1), R6 + MOVD R6, m_vdsoSP(R21) + MOVD 32(R1), R6 + MOVD R6, m_vdsoPC(R21) + finish: // sec is in R3, nsec in R5 // return nsec in R3 -- GitLab From 7ad776dda531ebd406e03d26b7eeed3a89321cc1 Mon Sep 17 00:00:00 2001 From: Katie Hockman Date: Mon, 10 Aug 2020 11:31:22 -0400 Subject: [PATCH 0141/1792] doc/go1.15: document crypto/tls permanent error Fixes #40554 Change-Id: Icc71cb9bab3d1efaa8e586c71cc38bc1d0d1e676 Reviewed-on: https://go-review.googlesource.com/c/go/+/247698 Run-TryBot: Katie Hockman TryBot-Result: Gobot Gobot Reviewed-by: Filippo Valsorda --- doc/go1.15.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/go1.15.html b/doc/go1.15.html index 17e442d4c6..80f8828e9b 100644 --- a/doc/go1.15.html +++ b/doc/go1.15.html @@ -524,6 +524,17 @@ Do not send CLs removing the interior tags from such phrases. fields OCSPResponse and SignedCertificateTimestamps are now repopulated on client-side resumed connections.

+ +
-- GitLab From 5ae1d62ee3832e7326efbb466168b8cc3e0c83b0 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Mon, 10 Aug 2020 15:19:08 -0400 Subject: [PATCH 0142/1792] CONTRIBUTORS: update for the Go 1.15 release This update was created using the updatecontrib command: go get golang.org/x/build/cmd/updatecontrib cd gotip updatecontrib With manual changes based on publicly available information to canonicalize letter case and formatting for a few names. For #12042. Change-Id: I66dc5ee28d9a64bc9d150e72d136d8f71e50373b Reviewed-on: https://go-review.googlesource.com/c/go/+/247767 Reviewed-by: Carlos Amedee Reviewed-by: Andrew Bonventre --- CONTRIBUTORS | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 798002cfb5..cebc92f53f 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -31,6 +31,7 @@ Aaron Cannon Aaron France Aaron Jacobs Aaron Kemp +Aaron Patterson Aaron Stein Aaron Torres Aaron Zinman @@ -58,6 +59,7 @@ Adrian Hesketh Adrian Nos Adrian O'Grady Adrien Bustany +Adrien Delorme Adrien Petel Aécio Júnior Aeneas Rekkas (arekkas) @@ -114,6 +116,7 @@ Alex Zhirov Alexander Demakin Alexander Döring Alexander F Rødseth +Alexander Greim Alexander Guz Alexander Kauer Alexander Kucherenko @@ -122,6 +125,7 @@ Alexander Lourier Alexander Menzhinsky Alexander Morozov Alexander Neumann +Alexander Nohe Alexander Orlov Alexander Pantyukhin Alexander Polcyn @@ -149,6 +153,7 @@ Alexey Semenyuk Alexis Hildebrandt Alexis Hunt Alexis Imperial-Legrand +Ali Farooq Ali Rizvi-Santiago Aliaksandr Valialkin Alif Rachmawadi @@ -156,14 +161,17 @@ Allan Simon Allen Li Alok Menghrajani Aman Gupta +Amarjeet Anand Amir Mohammad Saied Amr Mohammed Amrut Joshi +An Long An Xiao Anand K. Mistry Anders Pearson Anderson Queiroz André Carvalho +André Martins Andre Nathan Andrea Nodari Andrea Spadaccini @@ -187,9 +195,11 @@ Andrew Braunstein Andrew Bursavich Andrew Ekstedt Andrew Etter +Andrew G. Morgan Andrew Gerrand Andrew Harding Andrew Jackura +Andrew Louis Andrew Lutomirski Andrew Medvedev Andrew Pilloud @@ -219,6 +229,7 @@ Andy Lindeman Andy Maloney Andy Pan Andy Walker +Andy Wang Andzej Maciusovic Anfernee Yongkun Gui Angelo Bulfone @@ -226,6 +237,7 @@ Anh Hai Trinh Anit Gandhi Ankit Goyal Anmol Sethi +Annirudh Prasad Anschel Schaffer-Cohen Anthony Alves Anthony Canino @@ -239,15 +251,18 @@ Anthony Woods Antoine GIRARD Antoine Martin Anton Gyllenberg +Anton Kuklin Antonin Amand Antonio Antelo Antonio Bibiano Antonio Huete Jimenez Antonio Murdaca Antonio Troina +Anze Kolar Aofei Sheng Apisak Darakananda Aram Hăvărneanu +Araragi Hokuto Arash Bina Arda Güçlü Areski Belaid @@ -273,6 +288,7 @@ Audrius Butkevicius Augusto Roman Aulus Egnatius Varialus Aurélien Rainone +Aurélio A. Heckert Austin Clements Avi Flax awaw fumin @@ -315,6 +331,7 @@ Benoit Sigoure Berengar Lehr Berkant Ipek <41230766+0xbkt@users.noreply.github.com> Bharath Thiruveedula +Bhavin Gandhi Bill Neubauer Bill O'Farrell Bill Prin @@ -322,6 +339,7 @@ Bill Thiede Bill Zissimopoulos Billie Harold Cleek Billy Lynch +Billy Zaelani Malik Bjørn Erik Pedersen Bjorn Tillenius Bjorn Tipling @@ -331,12 +349,15 @@ Blake Mesdag Blake Mizerany Blixt Bob Briski +Bob McNaughton Bob Potter Bobby DeSimone Bobby Powers +Boqin Qin Boris Nagaev Borja Clemente Brad Burch +Brad Erickson Brad Fitzpatrick Brad Garcia Brad Jones @@ -351,6 +372,7 @@ Brandon Bennett Brandon Gilmore Brandon Philips Brandon Ryan +Brayden Cloud Brendan Daniel Tracey Brendan O'Dea Brett Cannon @@ -390,6 +412,7 @@ Carlos Castillo Carlos Cirello Carlos Eduardo Carlos Eduardo Seo +Carlos Iriarte Carlos Souza Carolyn Van Slyck Carrie Bynon @@ -405,6 +428,7 @@ Chad Rosier ChaiShushan Changkun Ou Channing Kimble-Brown +Chao Xu Charles Fenwick Elliott Charles Kenney Charles L. Dorian @@ -426,6 +450,7 @@ Chris Howey Chris Hundt Chris Jones Chris Kastorff +Chris Le Roy Chris Lennert Chris Liles Chris Manghane @@ -475,6 +500,7 @@ Conrad Meyer Conrado Gouvea Constantin Konstantinidis Corey Thomasson +Corne van der Plas Cosmos Nicolaou Costin Chirvasuta Craig Citro @@ -506,9 +532,11 @@ Daniel Ingram Daniel Johansson Daniel Kerwin Daniel Krech +Daniel Kumor Daniel Langner Daniel Lidén Daniel Lublin +Daniel Mangum Daniel Martí Daniel Morsing Daniel Nadasi @@ -519,6 +547,8 @@ Daniel Speichert Daniel Theophanes Daniel Upton Daniela Petruzalek +Danish Dua +Danish Prakash Danny Rosseau Daria Kolistratova Darien Raymond @@ -542,6 +572,7 @@ David Brophy David Bürgin <676c7473@gmail.com> David Calavera David Carlier +David Carter David Chase David Covert David Crawshaw @@ -550,6 +581,7 @@ David Finkel David Forsythe David G. Andersen David Glasser +David Golden David Heuschmann David Howden David Hubbard @@ -574,6 +606,7 @@ David Volquartz Lebech David Wimmer Davies Liu Davor Kapsa +Dean Eigenmann <7621705+decanus@users.noreply.github.com> Dean Prichard Deepak Jois Denis Bernard @@ -619,6 +652,7 @@ Dmitry Mottl Dmitry Neverov Dmitry Savintsev Dmitry Yakunin +Doga Fincan Domas Tamašauskas Domen Ipavec Dominic Green @@ -642,6 +676,7 @@ Dustin Sallings Dustin Shields-Cloues Dvir Volk Dylan Waits +Ed Schouten Edan Bedrik <3d4nb3@gmail.com> Eddie Scholtz Eden Li @@ -659,11 +694,13 @@ Elena Grahovac Eli Bendersky Elias Naur Elliot Morrison-Reed +Ellison Leão Emerson Lin Emil Hessman Emil Mursalimov Emilien Kenler Emmanuel Odeke +Emrecan Bati Eno Compton Eoghan Sherry Eric Biggers @@ -682,6 +719,7 @@ Eric Rescorla Eric Roshan-Eisner Eric Rutherford Eric Rykwalder +Erick Tryzelaar Erik Aigner Erik Dubbelboer Erik St. Martin @@ -694,6 +732,7 @@ Esko Luontola Ethan Burns Ethan Miller Euan Kemp +Eugene Formanenko Eugene Kalinin Evan Broder Evan Brown @@ -705,6 +744,7 @@ Evan Kroske Evan Martin Evan Phoenix Evan Shaw +Evgeniy Kulikov Evgeniy Polyakov Ewan Chou Ewan Valentine @@ -725,8 +765,10 @@ Fedor Indutny Fedor Korotkiy Felipe Oliveira Felix Bünemann +Felix Cornelius <9767036+fcornelius@users.noreply.github.com> Felix Geisendörfer Felix Kollmann +Ferenc Szabo Filip Gruszczyński Filip Haglund Filip Stanis @@ -774,6 +816,7 @@ Gary Elliott Gaurish Sharma Gautham Thambidorai Gauthier Jolly +Gawen Arab Geert-Johan Riemer Genevieve Luyt Gengliang Wang @@ -795,6 +838,7 @@ Gianguido Sora` Gideon Jan-Wessel Redelinghuys Giles Lean Giovanni Bajo +GitHub User @aca (50316549) GitHub User @ajnirp (1688456) GitHub User @ajz01 (4744634) GitHub User @alkesh26 (1019076) @@ -805,12 +849,18 @@ GitHub User @bakape (7851952) GitHub User @bgadrian (830001) GitHub User @bontequero (2674999) GitHub User @cch123 (384546) +GitHub User @chainhelen (7046329) GitHub User @chanxuehong (3416908) +GitHub User @cncal (23520240) GitHub User @DQNEO (188741) +GitHub User @Dreamacro (8615343) GitHub User @dupoxy (1143957) GitHub User @erifan (31343225) GitHub User @esell (9735165) +GitHub User @fatedier (7346661) GitHub User @frennkie (6499251) +GitHub User @geedchin (11672310) +GitHub User @GrigoriyMikhalkin (3637857) GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com> GitHub User @itchyny (375258) GitHub User @jinmiaoluo (39730824) @@ -820,11 +870,13 @@ GitHub User @kc1212 (1093806) GitHub User @Kropekk (13366453) GitHub User @linguohua (3434367) GitHub User @LotusFenn (13775899) +GitHub User @ly303550688 (11519839) GitHub User @madiganz (18340029) GitHub User @maltalex (10195391) GitHub User @Matts966 (28551465) GitHub User @micnncim (21333876) GitHub User @mkishere (224617) <224617+mkishere@users.noreply.github.com> +GitHub User @nu50218 (40682920) GitHub User @OlgaVlPetrova (44112727) GitHub User @pityonline (438222) GitHub User @po3rin (29445112) @@ -836,6 +888,7 @@ GitHub User @shogo-ma (9860598) GitHub User @skanehira (7888591) GitHub User @tatsumack (4510569) GitHub User @tell-k (26263) +GitHub User @tennashi (10219626) GitHub User @uhei (2116845) GitHub User @uropek (39370426) GitHub User @utkarsh-extc (53217283) @@ -861,6 +914,7 @@ Greg Thelen Greg Ward Grégoire Delattre Gregory Man +Gregory Petrosyan Guilherme Caruso Guilherme Garnier Guilherme Goncalves @@ -917,6 +971,7 @@ Hitoshi Mitake Holden Huang Hong Ruiqi Hongfei Tan +Horacio Duran Horst Rutter Hossein Sheikh Attar Howard Zhang @@ -927,6 +982,7 @@ Huan Du Hugues Bruant Huy Le Hyang-Ah Hana Kim +Hyoyoung Chang Ian Cottrell Ian Davis Ian Gudger @@ -986,6 +1042,7 @@ Jake B Jakob Borg Jakob Weisblat Jakub Čajka +Jakub Kaczmarzyk Jakub Ryszard Czarnowicz Jamal Carvalho James Aguilar @@ -1032,6 +1089,7 @@ Jan Steinke Jan Ziak <0xe2.0x9a.0x9b@gmail.com> Jani Monoses Jannis Andrija Schnitzer +Jared Allard Jared Culp Jaroslavas Počepko Jason A. Donenfeld @@ -1086,8 +1144,11 @@ Jerrin Shaji George Jess Frazelle Jesse Szwedko Jesús Espino +Jia Zhan +Jiacai Liu Jianing Yu Jianqiao Li +Jie Ma Jihyun Yu Jim Cote Jim Kingdon @@ -1135,6 +1196,7 @@ John Howard Palevich John Jeffery John Jenkins John Leidegren +John McCabe John Moore John Newlin John Papandriopoulos @@ -1146,6 +1208,7 @@ John Tuley John Weldon Johnny Luo Jon Chen +Jon Johnson Jonas Bernoulli Jonathan Allie Jonathan Amsterdam @@ -1165,6 +1228,7 @@ Jonathon Lacher Jongmin Kim Joonas Kuorilehto Joop Kiefte +Jordan Christiansen Jordan Krage Jordan Lewis Jordan Liggitt @@ -1177,6 +1241,7 @@ Josa Gesell Jose Luis Vázquez González Joseph Bonneau Joseph Holsten +Josh Baum Josh Bleecher Snyder Josh Chorlton Josh Deprez @@ -1185,8 +1250,10 @@ Josh Hoak Josh Holland Josh Roppo Josh Varga +Joshua Bezaleel Abednego Joshua Boelter Joshua Chase +Joshua Crowgey Joshua M. Clulow Joshua Rubin Josselin Costanzi @@ -1265,6 +1332,7 @@ Kenji Yano Kenneth Shaw Kenny Grant Kenta Mori +Kerollos Magdy Ketan Parmar Kevan Swanberg Kevin Ballard @@ -1277,10 +1345,14 @@ Kevin Malachowski Kevin Ruffin Kevin Vu Kevin Zita +Keyan Pishdadian +Kezhu Wang +Khosrow Moossavi Kieran Colford Kim Shrier Kim Yongbin Kir Kolyshkin +Kirill Korotaev Kirill Motkov Kirill Smelkov Kirill Tatchihin @@ -1308,6 +1380,7 @@ Kyle Consalus Kyle Isom Kyle Jones Kyle Lemons +Kyle Nusbaum Kyle Shannon Kyle Spiers Kyle Wood @@ -1339,6 +1412,8 @@ Leonardo Comelli Leonel Quinteros Lev Shamardin Lewin Bormann +Liam Haworth +Lily Chung Lion Yang Liz Rice Lloyd Dewolf @@ -1396,6 +1471,7 @@ Marcel van Lohuizen Marcelo Cantos Marcelo E. Magallon Marco Hennings +Marcus Weiner Marcus Willock Marga Manterola Mariano Cano @@ -1426,6 +1502,7 @@ Markus Duft Markus Sonderegger Markus Zimmermann Marten Seemann +Martin Asquino Martin Bertschler Martin Garton Martin Habbecke @@ -1449,6 +1526,7 @@ Maryan Hratson Masahiro Furudate Masahiro Wakame Masaki Yoshida +Masaya Watanabe Mat Byczkowski Mat Ryer Máté Gulyás @@ -1495,6 +1573,7 @@ Max Ushakov Maxim Eryomenko Maxim Khitrov Maxim Pimenov +Maxim Pugachev Maxim Ushakov Maxime de Roucy Máximo Cuadros Ortiz @@ -1549,6 +1628,7 @@ Michal Bohuslávek Michal Cierniak Michał Derkacz Michal Franc +Michał Łowicki Michal Pristas Michal Rostecki Michalis Kargakis @@ -1556,6 +1636,7 @@ Michel Lespinasse Mickael Kerjean Mickey Reiss Miek Gieben +Miguel Acero Miguel Mendez Miguel Molina Mihai Borobocea @@ -1582,6 +1663,7 @@ Mikio Hara Mikkel Krautz Mikołaj Baranowski Milan Knezevic +Milan Patel Milutin Jovanović MinJae Kwon Miquel Sabaté Solà @@ -1603,8 +1685,10 @@ Mrunal Patel Muhammad Falak R Wani Muhammed Uluyol Muir Manders +Mukesh Sharma Mura Li Mykhailo Lesyk +Naman Aggarwal Nan Deng Nao Yonashiro Naoki Kanatani @@ -1612,6 +1696,7 @@ Nate Wilkinson Nathan Cantelmo Nathan Caza Nathan Dias +Nathan Fiscaletti Nathan Humphreys Nathan John Youngman Nathan Otterness @@ -1621,6 +1706,7 @@ Nathan Youngman Nathan(yinian) Hu Nathaniel Cook Naveen Kumar Sangi +Neeilan Selvalingam Neelesh Chandola Neil Lyons Neuman Vong @@ -1661,17 +1747,20 @@ Nikita Vanyasin Niklas Schnelle Niko Dziemba Nikolay Turpitko +Nikson Kanti Paul Nils Larsgård Nir Soffer Niranjan Godbole Nishanth Shanmugham Noah Campbell +Noah Goldman Noble Johnson Nodir Turakulov Noel Georgi Norberto Lopes Norman B. Lancaster Nuno Cruces +Obeyda Djeffal Odin Ugedal Oleg Bulatov Oleg Vakheta @@ -1689,6 +1778,7 @@ Omar Jarjur Oryan Moshe Osamu TONOMORI Özgür Kesim +Pablo Caderno Pablo Lalloni Pablo Rozas Larraondo Pablo Santiago Blum de Aguiar @@ -1702,6 +1792,8 @@ Parker Moore Parminder Singh Pascal Dierich Pascal S. de Kloe +Paschalis Tsilias +Pasi Tähkäpää Pat Moroney Patrick Barker Patrick Crosby @@ -1718,6 +1810,7 @@ Paul A Querna Paul Borman Paul Boyd Paul Chang +Paul D. Weber Paul Hammond Paul Hankin Paul Jolly @@ -1743,8 +1836,10 @@ Pavel Zinovkin Pavlo Sumkin Pawel Knap Pawel Szczur +Pei Xian Chee Percy Wegmann Perry Abbott +Petar Dambovaliev Petar Maymounkov Peter Armitage Peter Bourgon @@ -1781,6 +1876,7 @@ Philip Hofer Philip K. Warren Philip Nelson Philipp Stephani +Pierre Carru Pierre Durand Pierre Prinetti Pierre Roullon @@ -1789,11 +1885,14 @@ Pieter Droogendijk Pietro Gagliardi Piyush Mishra Plekhanov Maxim +Polina Osadcha Pontus Leitzler +Povilas Versockas Prasanga Siripala Prasanna Swaminathan Prashant Agrawal Prashant Varanasi +Praveen Kumar Pravendra Singh Preetam Jinka Pure White @@ -1804,6 +1903,7 @@ Quan Yong Zhai Quentin Perez Quentin Renard Quentin Smith +Quey-Liang Kao Quinn Slack Quinten Yearsley Quoc-Viet Nguyen @@ -1831,6 +1931,7 @@ Reilly Watson Reinaldo de Souza Jr Remi Gillig Rémy Oudompheng +Ren Ogaki Rens Rikkerink Rhys Hiltner Ricardo Padilha @@ -1842,6 +1943,8 @@ Richard Eric Gavaletz Richard Gibson Richard Miller Richard Musiol +Richard Ulmer +Richard Wilkes Rick Arnold Rick Hudson Rick Sayre @@ -1860,6 +1963,7 @@ Robert Figueiredo Robert Griesemer Robert Hencke Robert Iannucci +Robert Kuska Robert Obryk Robert Sesek Robert Snedegar @@ -1878,6 +1982,7 @@ Roger Pau Monné Roger Peppe Rohan Challa Rohan Verma +Rohith Ravi Roland Illig Roland Shoemaker Romain Baugue @@ -1887,6 +1992,7 @@ Roman Shchekin Ron Hashimoto Ron Minnich Ross Chater +Ross Kinsey Ross Light Ross Smith II Rowan Marshall @@ -1921,6 +2027,8 @@ Sakeven Jiang Salmān Aljammāz Sam Arnold Sam Boyer +Sam Chen +Sam Cross Sam Ding Sam Hug Sam Thorogood @@ -1972,6 +2080,7 @@ Sergey 'SnakE' Gromov Sergey Arseev Sergey Dobrodey Sergey Frolov +Sergey Glushchenko Sergey Ivanov Sergey Lukjanov Sergey Mishin @@ -1987,7 +2096,9 @@ Seth Vargo Shahar Kohanim Shamil Garatuev Shane Hansen +Shang Jian Ding Shaozhen Ding +Shaquille Wyan Que Shaun Dunning Shawn Elliott Shawn Ledbetter @@ -2008,6 +2119,7 @@ Shubham Sharma Shun Fan Silvan Jegen Simarpreet Singh +Simon Drake Simon Ferquel Simon Jefford Simon Rawet @@ -2018,6 +2130,8 @@ Sina Siadat Sjoerd Siebinga Sokolov Yura Song Gao +Soojin Nam +Søren L. Hansen Spencer Kocot Spencer Nelson Spencer Tung @@ -2074,6 +2188,7 @@ Taavi Kivisik Tad Fisher Tad Glines Tadas Valiukas +Tadeo Kondrak Taesu Pyo Tai Le Taj Khattra @@ -2083,6 +2198,7 @@ Takeshi YAMANASHI <9.nashi@gmail.com> Takuto Ikuta Takuya Ueda Tal Shprecher +Tamás Gulácsi Tamir Duberstein Tao Qingyun Tao Shen @@ -2102,6 +2218,7 @@ Tetsuo Kiso Than McIntosh Thanabodee Charoenpiriyakij Thanatat Tamtan +The Hatsune Daishi Thiago Avelino Thiago Fransosi Farina Thomas Alan Copeland @@ -2128,9 +2245,11 @@ Tim Ebringer Tim Heckman Tim Henderson Tim Hockin +Tim Möhlmann Tim Swast Tim Wright Tim Xu +Timmy Douglas Timo Savola Timo Truyts Timothy Studd @@ -2149,6 +2268,7 @@ Tom Lanyon Tom Levy Tom Limoncelli Tom Linford +Tom Parkin Tom Payne Tom Szymanski Tom Thorogood @@ -2162,6 +2282,7 @@ Tony Reix Tony Walker Tooru Takahashi Tor Andersson +Torben Schinke Tormod Erevik Lea Toshihiro Shiino Toshiki Shima @@ -2178,12 +2299,15 @@ Tristan Ooohry Tristan Rice Troels Thomsen Trung Nguyen +Tsuji Daishiro Tudor Golubenco Tugdual Saunier Tuo Shan Tyler Bui-Palsulich Tyler Bunnell Tyler Treat +Tyson Andre +Tzach Shabtay Tzu-Jung Lee Udalov Max Ugorji Nwoke @@ -2217,6 +2341,7 @@ Visweswara R Vitaly Zdanevich Vitor De Mario Vivek Sekhar +Vivian Liang Vlad Krasnov Vladimir Evgrafov Vladimir Kovpak @@ -2231,6 +2356,7 @@ Volodymyr Paprotski W. Trevor King Wade Simmons Wagner Riffel +Walt Della Walter Poupore Wander Lairson Costa Wang Xuerui @@ -2274,12 +2400,15 @@ Xudong Zheng <7pkvm5aw@slicealias.com> Xuyang Kang Yamagishi Kazutoshi Yan Zou +Yang Hau Yang Tian Yann Hodique Yann Kerhervé Yann Salaün +Yannic Bonenberger Yao Zhang Yaron de Leeuw +Yaroslav Vorobiov Yasha Bubnov Yasser Abdolmaleki Yasuharu Goto @@ -2298,6 +2427,7 @@ Yoshiyuki Mineo Yosuke Akatsuka Yu Heng Zhang Yu Xuan Zhang +Yuichi Kishimoto Yuichi Nishiwaki Yuji Yaginuma Yuki OKUSHI @@ -2318,6 +2448,7 @@ Zak Zakatell Kanda Zellyn Hunter Zev Goldstein +Zhang Boyang Zheng Dayu Zheng Xu Zhengyu He -- GitLab From a8463c32823d451800aae14226c1e36481d692bc Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 30 Jul 2020 19:17:48 -0400 Subject: [PATCH 0143/1792] [dev.link] cmd/internal/archive: rename from goobj Rename cmd/internal/goobj package to cmd/internal/archive. This is in preparation of a refactoring of object and archive file reading packages. With this CL, the cmd/internal/archive contains logic about reading Go object files. This will be moved to other places in later CLs. Change-Id: Ided7287492a4766183d6e49be840a7f361504d1d Reviewed-on: https://go-review.googlesource.com/c/go/+/246442 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements Reviewed-by: Jeremy Faller --- src/cmd/internal/{goobj => archive}/goobj_test.go | 0 src/cmd/internal/{goobj => archive}/read.go | 0 src/cmd/internal/{goobj => archive}/readnew.go | 0 src/cmd/internal/{goobj => archive}/testdata/go1.go | 0 src/cmd/internal/{goobj => archive}/testdata/go2.go | 0 src/cmd/internal/{goobj => archive}/testdata/mycgo/c1.c | 0 src/cmd/internal/{goobj => archive}/testdata/mycgo/c2.c | 0 src/cmd/internal/{goobj => archive}/testdata/mycgo/go.go | 0 src/cmd/internal/{goobj => archive}/testdata/mycgo/go1.go | 0 src/cmd/internal/{goobj => archive}/testdata/mycgo/go2.go | 0 src/cmd/internal/objfile/goobj.go | 2 +- 11 files changed, 1 insertion(+), 1 deletion(-) rename src/cmd/internal/{goobj => archive}/goobj_test.go (100%) rename src/cmd/internal/{goobj => archive}/read.go (100%) rename src/cmd/internal/{goobj => archive}/readnew.go (100%) rename src/cmd/internal/{goobj => archive}/testdata/go1.go (100%) rename src/cmd/internal/{goobj => archive}/testdata/go2.go (100%) rename src/cmd/internal/{goobj => archive}/testdata/mycgo/c1.c (100%) rename src/cmd/internal/{goobj => archive}/testdata/mycgo/c2.c (100%) rename src/cmd/internal/{goobj => archive}/testdata/mycgo/go.go (100%) rename src/cmd/internal/{goobj => archive}/testdata/mycgo/go1.go (100%) rename src/cmd/internal/{goobj => archive}/testdata/mycgo/go2.go (100%) diff --git a/src/cmd/internal/goobj/goobj_test.go b/src/cmd/internal/archive/goobj_test.go similarity index 100% rename from src/cmd/internal/goobj/goobj_test.go rename to src/cmd/internal/archive/goobj_test.go diff --git a/src/cmd/internal/goobj/read.go b/src/cmd/internal/archive/read.go similarity index 100% rename from src/cmd/internal/goobj/read.go rename to src/cmd/internal/archive/read.go diff --git a/src/cmd/internal/goobj/readnew.go b/src/cmd/internal/archive/readnew.go similarity index 100% rename from src/cmd/internal/goobj/readnew.go rename to src/cmd/internal/archive/readnew.go diff --git a/src/cmd/internal/goobj/testdata/go1.go b/src/cmd/internal/archive/testdata/go1.go similarity index 100% rename from src/cmd/internal/goobj/testdata/go1.go rename to src/cmd/internal/archive/testdata/go1.go diff --git a/src/cmd/internal/goobj/testdata/go2.go b/src/cmd/internal/archive/testdata/go2.go similarity index 100% rename from src/cmd/internal/goobj/testdata/go2.go rename to src/cmd/internal/archive/testdata/go2.go diff --git a/src/cmd/internal/goobj/testdata/mycgo/c1.c b/src/cmd/internal/archive/testdata/mycgo/c1.c similarity index 100% rename from src/cmd/internal/goobj/testdata/mycgo/c1.c rename to src/cmd/internal/archive/testdata/mycgo/c1.c diff --git a/src/cmd/internal/goobj/testdata/mycgo/c2.c b/src/cmd/internal/archive/testdata/mycgo/c2.c similarity index 100% rename from src/cmd/internal/goobj/testdata/mycgo/c2.c rename to src/cmd/internal/archive/testdata/mycgo/c2.c diff --git a/src/cmd/internal/goobj/testdata/mycgo/go.go b/src/cmd/internal/archive/testdata/mycgo/go.go similarity index 100% rename from src/cmd/internal/goobj/testdata/mycgo/go.go rename to src/cmd/internal/archive/testdata/mycgo/go.go diff --git a/src/cmd/internal/goobj/testdata/mycgo/go1.go b/src/cmd/internal/archive/testdata/mycgo/go1.go similarity index 100% rename from src/cmd/internal/goobj/testdata/mycgo/go1.go rename to src/cmd/internal/archive/testdata/mycgo/go1.go diff --git a/src/cmd/internal/goobj/testdata/mycgo/go2.go b/src/cmd/internal/archive/testdata/mycgo/go2.go similarity index 100% rename from src/cmd/internal/goobj/testdata/mycgo/go2.go rename to src/cmd/internal/archive/testdata/mycgo/go2.go diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go index e1c2fd5d5c..a7e45b9ecb 100644 --- a/src/cmd/internal/objfile/goobj.go +++ b/src/cmd/internal/objfile/goobj.go @@ -7,7 +7,7 @@ package objfile import ( - "cmd/internal/goobj" + goobj "cmd/internal/archive" "cmd/internal/objabi" "cmd/internal/sys" "debug/dwarf" -- GitLab From 5ff5b3c5575afaa5f90c6a831dfadf3fabec516e Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 10 Aug 2020 19:29:58 -0400 Subject: [PATCH 0144/1792] doc/go1.15: remove draft notice Updates #37419 Change-Id: I945fd1f8d87b15cf3143808dc68021b38531297d Reviewed-on: https://go-review.googlesource.com/c/go/+/247772 Run-TryBot: Andrew Bonventre Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- doc/go1.15.html | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/doc/go1.15.html b/doc/go1.15.html index 80f8828e9b..fdc29238f8 100644 --- a/doc/go1.15.html +++ b/doc/go1.15.html @@ -14,13 +14,21 @@ Do not send CLs removing the interior tags from such phrases. main ul li { margin: 0.5em 0; } -

DRAFT RELEASE NOTES — Introduction to Go 1.15

+

Introduction to Go 1.15

- - Go 1.15 is not yet released. These are work-in-progress - release notes. Go 1.15 is expected to be released in August 2020. - + The latest Go release, version 1.15, arrives six months after Go 1.14. + Most of its changes are in the implementation of the toolchain, runtime, and libraries. + As always, the release maintains the Go 1 promise of compatibility. + We expect almost all Go programs to continue to compile and run as before. +

+ +

+ Go 1.15 includes substantial improvements to the linker, + improves allocation for small objects at high core counts, and + deprecates X.509 CommonName. + GOPROXY now supports skipping proxies that return errors and + a new embedded tzdata package has been added.

Changes to the language

-- GitLab From 5c7748dc9de9c9e0a6844bf72faaf5b484004ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Mon, 10 Aug 2020 19:04:56 +0200 Subject: [PATCH 0145/1792] doc/go1.15: encoding/json's CL 191783 was reverted See golang.org/cl/240657, which reverted the original change to fix the regression reported in golang.org/issue/39427. Updates #37419. Change-Id: I39fbaa0b028ee00856cffea38879a631f540f057 Reviewed-on: https://go-review.googlesource.com/c/go/+/247718 Reviewed-by: Andrew Bonventre Reviewed-by: Dmitri Shuralyov Run-TryBot: Andrew Bonventre TryBot-Result: Gobot Gobot --- doc/go1.15.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/doc/go1.15.html b/doc/go1.15.html index fdc29238f8..8872d71138 100644 --- a/doc/go1.15.html +++ b/doc/go1.15.html @@ -657,11 +657,6 @@ Do not send CLs removing the interior tags from such phrases.
encoding/json
-

- Decoding a JSON array into a slice no longer reuses any existing slice elements, - following the rules that the package documentation already stated. -

-

The package now has an internal limit to the maximum depth of nesting when decoding. This reduces the possibility that a -- GitLab From 9559877543976f8e7b15ae02a7196c4f930fc371 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 30 Jul 2020 20:49:29 -0400 Subject: [PATCH 0146/1792] [dev.link] cmd/internal/objfile: read Go object file using goobj2 package Read Go object files using cmd/internal/goobj2 package directly, instead of using cmd/internal/goobj as an intermediate layer. Now cmd/internal/archive is only about reading archives. Change-Id: Ifecb217fb26c16c26fc1bbc3fba0ed44710020ed Reviewed-on: https://go-review.googlesource.com/c/go/+/246443 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- .../{goobj_test.go => archive_test.go} | 133 ++++---- src/cmd/internal/archive/read.go | 253 ++++------------ src/cmd/internal/archive/readnew.go | 200 ------------- src/cmd/internal/bio/buf.go | 7 +- src/cmd/internal/objfile/goobj.go | 283 +++++++++++++----- 5 files changed, 341 insertions(+), 535 deletions(-) rename src/cmd/internal/archive/{goobj_test.go => archive_test.go} (75%) delete mode 100644 src/cmd/internal/archive/readnew.go diff --git a/src/cmd/internal/archive/goobj_test.go b/src/cmd/internal/archive/archive_test.go similarity index 75% rename from src/cmd/internal/archive/goobj_test.go rename to src/cmd/internal/archive/archive_test.go index 4a4d35a413..6ef0b68daa 100644 --- a/src/cmd/internal/archive/goobj_test.go +++ b/src/cmd/internal/archive/archive_test.go @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package goobj +package archive import ( + "bytes" "debug/elf" "debug/macho" "debug/pe" @@ -159,22 +160,23 @@ func TestParseGoobj(t *testing.T) { } defer f.Close() - p, err := Parse(f, "mypkg") + a, err := Parse(f) if err != nil { t.Fatal(err) } - if p.Arch != runtime.GOARCH { - t.Errorf("%s: got %v, want %v", path, p.Arch, runtime.GOARCH) + if len(a.Entries) != 2 { + t.Errorf("expect 2 entry, found %d", len(a.Entries)) } - var found bool - for _, s := range p.Syms { - if s.Name == "mypkg.go1" { - found = true - break + for _, e := range a.Entries { + if e.Type == EntryPkgDef { + continue + } + if e.Type != EntryGoObj { + t.Errorf("wrong type of object: wnat EntryGoObj, got %v", e.Type) + } + if !bytes.Contains(e.Obj.TextHeader, []byte(runtime.GOARCH)) { + t.Errorf("text header does not contain GOARCH %s: %q", runtime.GOARCH, e.Obj.TextHeader) } - } - if !found { - t.Errorf(`%s: symbol "mypkg.go1" not found`, path) } } @@ -187,28 +189,37 @@ func TestParseArchive(t *testing.T) { } defer f.Close() - p, err := Parse(f, "mypkg") + a, err := Parse(f) if err != nil { t.Fatal(err) } - if p.Arch != runtime.GOARCH { - t.Errorf("%s: got %v, want %v", path, p.Arch, runtime.GOARCH) + if len(a.Entries) != 3 { + t.Errorf("expect 3 entry, found %d", len(a.Entries)) } var found1 bool var found2 bool - for _, s := range p.Syms { - if s.Name == "mypkg.go1" { + for _, e := range a.Entries { + if e.Type == EntryPkgDef { + continue + } + if e.Type != EntryGoObj { + t.Errorf("wrong type of object: wnat EntryGoObj, got %v", e.Type) + } + if !bytes.Contains(e.Obj.TextHeader, []byte(runtime.GOARCH)) { + t.Errorf("text header does not contain GOARCH %s: %q", runtime.GOARCH, e.Obj.TextHeader) + } + if e.Name == "go1.o" { found1 = true } - if s.Name == "mypkg.go2" { + if e.Name == "go2.o" { found2 = true } } if !found1 { - t.Errorf(`%s: symbol "mypkg.go1" not found`, path) + t.Errorf(`object "go1.o" not found`) } if !found2 { - t.Errorf(`%s: symbol "mypkg.go2" not found`, path) + t.Errorf(`object "go2.o" not found`) } } @@ -223,41 +234,47 @@ func TestParseCGOArchive(t *testing.T) { } defer f.Close() - p, err := Parse(f, "mycgo") + a, err := Parse(f) if err != nil { t.Fatal(err) } - if p.Arch != runtime.GOARCH { - t.Errorf("%s: got %v, want %v", path, p.Arch, runtime.GOARCH) - } - var found1 bool - var found2 bool - for _, s := range p.Syms { - if s.Name == "mycgo.go1" { - found1 = true - } - if s.Name == "mycgo.go2" { - found2 = true - } - } - if !found1 { - t.Errorf(`%s: symbol "mycgo.go1" not found`, path) - } - if !found2 { - t.Errorf(`%s: symbol "mycgo.go2" not found`, path) - } c1 := "c1" c2 := "c2" - - found1 = false - found2 = false - switch runtime.GOOS { case "darwin": c1 = "_" + c1 c2 = "_" + c2 - for _, obj := range p.Native { + case "windows": + if runtime.GOARCH == "386" { + c1 = "_" + c1 + c2 = "_" + c2 + } + case "aix": + c1 = "." + c1 + c2 = "." + c2 + } + + var foundgo, found1, found2 bool + + for _, e := range a.Entries { + switch e.Type { + default: + t.Errorf("unknown object type") + case EntryPkgDef: + continue + case EntryGoObj: + foundgo = true + if !bytes.Contains(e.Obj.TextHeader, []byte(runtime.GOARCH)) { + t.Errorf("text header does not contain GOARCH %s: %q", runtime.GOARCH, e.Obj.TextHeader) + } + continue + case EntryNativeObj: + } + + obj := io.NewSectionReader(f, e.Offset, e.Size) + switch runtime.GOOS { + case "darwin": mf, err := macho.NewFile(obj) if err != nil { t.Fatal(err) @@ -273,13 +290,7 @@ func TestParseCGOArchive(t *testing.T) { found2 = true } } - } - case "windows": - if runtime.GOARCH == "386" { - c1 = "_" + c1 - c2 = "_" + c2 - } - for _, obj := range p.Native { + case "windows": pf, err := pe.NewFile(obj) if err != nil { t.Fatal(err) @@ -292,11 +303,7 @@ func TestParseCGOArchive(t *testing.T) { found2 = true } } - } - case "aix": - c1 = "." + c1 - c2 = "." + c2 - for _, obj := range p.Native { + case "aix": xf, err := xcoff.NewFile(obj) if err != nil { t.Fatal(err) @@ -309,10 +316,7 @@ func TestParseCGOArchive(t *testing.T) { found2 = true } } - } - - default: - for _, obj := range p.Native { + default: // ELF ef, err := elf.NewFile(obj) if err != nil { t.Fatal(err) @@ -332,10 +336,13 @@ func TestParseCGOArchive(t *testing.T) { } } + if !foundgo { + t.Errorf(`go object not found`) + } if !found1 { - t.Errorf(`%s: symbol %q not found`, path, c1) + t.Errorf(`symbol %q not found`, c1) } if !found2 { - t.Errorf(`%s: symbol %q not found`, path, c2) + t.Errorf(`symbol %q not found`, c2) } } diff --git a/src/cmd/internal/archive/read.go b/src/cmd/internal/archive/read.go index cb388a84cd..6875dbce75 100644 --- a/src/cmd/internal/archive/read.go +++ b/src/cmd/internal/archive/read.go @@ -2,58 +2,22 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package goobj implements reading of Go object files and archives. -// -// TODO(rsc): Decide where this package should live. (golang.org/issue/6932) -// TODO(rsc): Decide the appropriate integer types for various fields. -package goobj +// Package archive implements reading of archive files generated by the Go +// toolchain. +package archive import ( "bufio" "bytes" + "cmd/internal/bio" "cmd/internal/goobj2" - "cmd/internal/objabi" "errors" "fmt" "io" "os" "strconv" - "strings" ) -// A Sym is a named symbol in an object file. -type Sym struct { - SymID // symbol identifier (name and version) - Kind objabi.SymKind // kind of symbol - DupOK bool // are duplicate definitions okay? - Size int64 // size of corresponding data - Type SymID // symbol for Go type information - Data Data // memory image of symbol - Reloc []Reloc // relocations to apply to Data - Func *Func // additional data for functions -} - -// A SymID - the combination of Name and Version - uniquely identifies -// a symbol within a package. -type SymID struct { - // Name is the name of a symbol. - Name string - - // Version is zero for symbols with global visibility. - // Symbols with only file visibility (such as file-level static - // declarations in C) have a non-zero version distinguishing - // a symbol in one file from a symbol of the same name - // in another file - Version int64 -} - -func (s SymID) String() string { - if s.Version == 0 { - return s.Name - } - return fmt.Sprintf("%s<%d>", s.Name, s.Version) -} - // A Data is a reference to data stored in an object file. // It records the offset and size of the data, so that a client can // read the data only if necessary. @@ -62,88 +26,29 @@ type Data struct { Size int64 } -// A Reloc describes a relocation applied to a memory image to refer -// to an address within a particular symbol. -type Reloc struct { - // The bytes at [Offset, Offset+Size) within the containing Sym - // should be updated to refer to the address Add bytes after the start - // of the symbol Sym. - Offset int64 - Size int64 - Sym SymID - Add int64 - - // The Type records the form of address expected in the bytes - // described by the previous fields: absolute, PC-relative, and so on. - // TODO(rsc): The interpretation of Type is not exposed by this package. - Type objabi.RelocType -} - -// A Var describes a variable in a function stack frame: a declared -// local variable, an input argument, or an output result. -type Var struct { - // The combination of Name, Kind, and Offset uniquely - // identifies a variable in a function stack frame. - // Using fewer of these - in particular, using only Name - does not. - Name string // Name of variable. - Kind int64 // TODO(rsc): Define meaning. - Offset int64 // Frame offset. TODO(rsc): Define meaning. - - Type SymID // Go type for variable. +type Archive struct { + f *os.File + Entries []Entry } -// Func contains additional per-symbol information specific to functions. -type Func struct { - Args int64 // size in bytes of argument frame: inputs and outputs - Frame int64 // size in bytes of local variable frame - Align uint32 // alignment requirement in bytes for the address of the function - Leaf bool // function omits save of link register (ARM) - NoSplit bool // function omits stack split prologue - TopFrame bool // function is the top of the call stack - Var []Var // detail about local variables - PCSP Data // PC → SP offset map - PCFile Data // PC → file number map (index into File) - PCLine Data // PC → line number map - PCInline Data // PC → inline tree index map - PCData []Data // PC → runtime support data map - FuncData []FuncData // non-PC-specific runtime support data - File map[goobj2.CUFileIndex]struct{} // set of files used in this function - InlTree []InlinedCall +type Entry struct { + Name string + Type EntryType + Data + Obj *GoObj // nil if this entry is not a Go object file } -// TODO: Add PCData []byte and PCDataIter (similar to liblink). - -// A FuncData is a single function-specific data value. -type FuncData struct { - Sym SymID // symbol holding data - Offset int64 // offset into symbol for funcdata pointer -} +type EntryType int -// An InlinedCall is a node in an InlTree. -// See cmd/internal/obj.InlTree for details. -type InlinedCall struct { - Parent int64 - File goobj2.CUFileIndex - Line int64 - Func SymID - ParentPC int64 -} +const ( + EntryPkgDef EntryType = iota + EntryGoObj + EntryNativeObj +) -// A Package is a parsed Go object file or archive defining a Go package. -type Package struct { - ImportPath string // import path denoting this package - Imports []string // packages imported by this package - SymRefs []SymID // list of symbol names and versions referred to by this pack - Syms []*Sym // symbols defined by this package - MaxVersion int64 // maximum Version in any SymID in Syms - Arch string // architecture - Native []*NativeReader // native object data (e.g. ELF) - FileList []string // List of files for this package. -} - -type NativeReader struct { - Name string - io.ReaderAt +type GoObj struct { + TextHeader []byte + Data } var ( @@ -159,26 +64,20 @@ var ( // An objReader is an object file reader. type objReader struct { - p *Package - b *bufio.Reader - f *os.File - err error - offset int64 - dataOffset int64 - limit int64 - tmp [256]byte - pkgprefix string + a *Archive + b *bio.Reader + err error + offset int64 + limit int64 + tmp [256]byte } -// init initializes r to read package p from f. -func (r *objReader) init(f *os.File, p *Package) { - r.f = f - r.p = p +func (r *objReader) init(f *os.File) { + r.a = &Archive{f, nil} r.offset, _ = f.Seek(0, io.SeekCurrent) r.limit, _ = f.Seek(0, io.SeekEnd) f.Seek(r.offset, io.SeekStart) - r.b = bufio.NewReader(f) - r.pkgprefix = objabi.PathToPrefix(p.ImportPath) + "." + r.b = bio.NewReader(f) } // error records that an error occurred. @@ -278,27 +177,16 @@ func (r *objReader) skip(n int64) { r.readFull(r.tmp[:n]) } else { // Seek, giving up buffered data. - _, err := r.f.Seek(r.offset+n, io.SeekStart) - if err != nil { - r.error(err) - } + r.b.MustSeek(r.offset+n, io.SeekStart) r.offset += n - r.b.Reset(r.f) } } -// Parse parses an object file or archive from f, -// assuming that its import path is pkgpath. -func Parse(f *os.File, pkgpath string) (*Package, error) { - if pkgpath == "" { - pkgpath = `""` - } - p := new(Package) - p.ImportPath = pkgpath - - var rd objReader - rd.init(f, p) - err := rd.readFull(rd.tmp[:8]) +// Parse parses an object file or archive from f. +func Parse(f *os.File) (*Archive, error) { + var r objReader + r.init(f) + t, err := r.peek(8) if err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF @@ -310,17 +198,20 @@ func Parse(f *os.File, pkgpath string) (*Package, error) { default: return nil, errNotObject - case bytes.Equal(rd.tmp[:8], archiveHeader): - if err := rd.parseArchive(); err != nil { + case bytes.Equal(t, archiveHeader): + if err := r.parseArchive(); err != nil { return nil, err } - case bytes.Equal(rd.tmp[:8], goobjHeader): - if err := rd.parseObject(goobjHeader); err != nil { + case bytes.Equal(t, goobjHeader): + off := r.offset + o := &GoObj{} + if err := r.parseObject(o, r.limit-off); err != nil { return nil, err } + r.a.Entries = []Entry{{f.Name(), EntryGoObj, Data{off, r.limit - off}, o}} } - return p, nil + return r.a, nil } // trimSpace removes trailing spaces from b and returns the corresponding string. @@ -331,6 +222,7 @@ func trimSpace(b []byte) string { // parseArchive parses a Unix archive of Go object files. func (r *objReader) parseArchive() error { + r.readFull(r.tmp[:8]) // consume header (already checked) for r.offset < r.limit { if err := r.readFull(r.tmp[:60]); err != nil { return err @@ -371,28 +263,25 @@ func (r *objReader) parseArchive() error { } switch name { case "__.PKGDEF": + r.a.Entries = append(r.a.Entries, Entry{name, EntryPkgDef, Data{r.offset, size}, nil}) r.skip(size) default: - oldLimit := r.limit - r.limit = r.offset + size - + var typ EntryType + var o *GoObj + offset := r.offset p, err := r.peek(8) if err != nil { return err } if bytes.Equal(p, goobjHeader) { - if err := r.parseObject(nil); err != nil { - return fmt.Errorf("parsing archive member %q: %v", name, err) - } + typ = EntryGoObj + o = &GoObj{} + r.parseObject(o, size) } else { - r.p.Native = append(r.p.Native, &NativeReader{ - Name: name, - ReaderAt: io.NewSectionReader(r.f, r.offset, size), - }) + typ = EntryNativeObj + r.skip(size) } - - r.skip(r.limit - r.offset) - r.limit = oldLimit + r.a.Entries = append(r.a.Entries, Entry{name, typ, Data{offset, size}, o}) } if size&1 != 0 { r.skip(1) @@ -402,16 +291,12 @@ func (r *objReader) parseArchive() error { } // parseObject parses a single Go object file. -// The prefix is the bytes already read from the file, -// typically in order to detect that this is an object file. // The object file consists of a textual header ending in "\n!\n" // and then the part we want to parse begins. // The format of that part is defined in a comment at the top // of src/liblink/objfile.c. -func (r *objReader) parseObject(prefix []byte) error { - r.p.MaxVersion++ +func (r *objReader) parseObject(o *GoObj, size int64) error { h := make([]byte, 0, 256) - h = append(h, prefix...) var c1, c2, c3 byte for { c1, c2, c3 = c2, c3, r.readByte() @@ -425,12 +310,9 @@ func (r *objReader) parseObject(prefix []byte) error { break } } - - hs := strings.Fields(string(h)) - if len(hs) >= 4 { - r.p.Arch = hs[3] - } - // TODO: extract OS + build ID if/when we need it + o.TextHeader = h + o.Offset = r.offset + o.Size = size - int64(len(h)) p, err := r.peek(8) if err != nil { @@ -439,21 +321,6 @@ func (r *objReader) parseObject(prefix []byte) error { if !bytes.Equal(p, []byte(goobj2.Magic)) { return r.error(errCorruptObject) } - r.readNew() + r.skip(o.Size) return nil } - -func (r *Reloc) String(insnOffset uint64) string { - delta := r.Offset - int64(insnOffset) - s := fmt.Sprintf("[%d:%d]%s", delta, delta+r.Size, r.Type) - if r.Sym.Name != "" { - if r.Add != 0 { - return fmt.Sprintf("%s:%s+%d", s, r.Sym.Name, r.Add) - } - return fmt.Sprintf("%s:%s", s, r.Sym.Name) - } - if r.Add != 0 { - return fmt.Sprintf("%s:%d", s, r.Add) - } - return s -} diff --git a/src/cmd/internal/archive/readnew.go b/src/cmd/internal/archive/readnew.go deleted file mode 100644 index 11847942e8..0000000000 --- a/src/cmd/internal/archive/readnew.go +++ /dev/null @@ -1,200 +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 goobj - -import ( - "cmd/internal/goobj2" - "cmd/internal/objabi" - "strings" -) - -// Read object file in new format. For now we still fill -// the data to the current goobj API. -func (r *objReader) readNew() { - start := uint32(r.offset) - - length := r.limit - r.offset - objbytes := make([]byte, length) - r.readFull(objbytes) - rr := goobj2.NewReaderFromBytes(objbytes, false) - if rr == nil { - panic("cannot read object file") - } - - // Imports - autolib := rr.Autolib() - for _, p := range autolib { - r.p.Imports = append(r.p.Imports, p.Pkg) - // Ignore fingerprint (for tools like objdump which only reads one object). - } - - // Name of referenced indexed symbols. - nrefName := rr.NRefName() - refNames := make(map[goobj2.SymRef]string, nrefName) - for i := 0; i < nrefName; i++ { - rn := rr.RefName(i) - refNames[rn.Sym()] = rn.Name(rr) - } - - abiToVer := func(abi uint16) int64 { - var vers int64 - if abi == goobj2.SymABIstatic { - // Static symbol - vers = r.p.MaxVersion - } - return vers - } - - resolveSymRef := func(s goobj2.SymRef) SymID { - var i uint32 - switch p := s.PkgIdx; p { - case goobj2.PkgIdxInvalid: - if s.SymIdx != 0 { - panic("bad sym ref") - } - return SymID{} - case goobj2.PkgIdxHashed64: - i = s.SymIdx + uint32(rr.NSym()) - case goobj2.PkgIdxHashed: - i = s.SymIdx + uint32(rr.NSym()+rr.NHashed64def()) - case goobj2.PkgIdxNone: - i = s.SymIdx + uint32(rr.NSym()+rr.NHashed64def()+rr.NHasheddef()) - case goobj2.PkgIdxBuiltin: - name, abi := goobj2.BuiltinName(int(s.SymIdx)) - return SymID{name, int64(abi)} - case goobj2.PkgIdxSelf: - i = s.SymIdx - default: - return SymID{refNames[s], 0} - } - sym := rr.Sym(i) - return SymID{sym.Name(rr), abiToVer(sym.ABI())} - } - - // Read things for the current goobj API for now. - - // File names - r.p.FileList = make([]string, rr.NFile()) - for i := range r.p.FileList { - r.p.FileList[i] = rr.File(i) - } - - // Symbols - pcdataBase := start + rr.PcdataBase() - ndef := uint32(rr.NSym() + rr.NHashed64def() + rr.NHasheddef() + rr.NNonpkgdef()) - n := ndef + uint32(rr.NNonpkgref()) - for i := uint32(0); i < n; i++ { - osym := rr.Sym(i) - if osym.Name(rr) == "" { - continue // not a real symbol - } - // In a symbol name in an object file, "". denotes the - // prefix for the package in which the object file has been found. - // Expand it. - name := strings.ReplaceAll(osym.Name(rr), `"".`, r.pkgprefix) - symID := SymID{Name: name, Version: abiToVer(osym.ABI())} - r.p.SymRefs = append(r.p.SymRefs, symID) - - if i >= ndef { - continue // not a defined symbol from here - } - - // Symbol data - dataOff := rr.DataOff(i) - siz := int64(rr.DataSize(i)) - - sym := Sym{ - SymID: symID, - Kind: objabi.SymKind(osym.Type()), - DupOK: osym.Dupok(), - Size: int64(osym.Siz()), - Data: Data{int64(start + dataOff), siz}, - } - r.p.Syms = append(r.p.Syms, &sym) - - // Reloc - relocs := rr.Relocs(i) - sym.Reloc = make([]Reloc, len(relocs)) - for j := range relocs { - rel := &relocs[j] - sym.Reloc[j] = Reloc{ - Offset: int64(rel.Off()), - Size: int64(rel.Siz()), - Type: objabi.RelocType(rel.Type()), - Add: rel.Add(), - Sym: resolveSymRef(rel.Sym()), - } - } - - // Aux symbol info - isym := ^uint32(0) - funcdata := make([]goobj2.SymRef, 0, 4) - auxs := rr.Auxs(i) - for j := range auxs { - a := &auxs[j] - switch a.Type() { - case goobj2.AuxGotype: - sym.Type = resolveSymRef(a.Sym()) - case goobj2.AuxFuncInfo: - if a.Sym().PkgIdx != goobj2.PkgIdxSelf { - panic("funcinfo symbol not defined in current package") - } - isym = a.Sym().SymIdx - case goobj2.AuxFuncdata: - funcdata = append(funcdata, a.Sym()) - case goobj2.AuxDwarfInfo, goobj2.AuxDwarfLoc, goobj2.AuxDwarfRanges, goobj2.AuxDwarfLines: - // nothing to do - default: - panic("unknown aux type") - } - } - - // Symbol Info - if isym == ^uint32(0) { - continue - } - b := rr.BytesAt(rr.DataOff(isym), rr.DataSize(isym)) - info := goobj2.FuncInfo{} - info.Read(b) - - info.Pcdata = append(info.Pcdata, info.PcdataEnd) // for the ease of knowing where it ends - f := &Func{ - Args: int64(info.Args), - Frame: int64(info.Locals), - NoSplit: osym.NoSplit(), - Leaf: osym.Leaf(), - TopFrame: osym.TopFrame(), - PCSP: Data{int64(pcdataBase + info.Pcsp), int64(info.Pcfile - info.Pcsp)}, - PCFile: Data{int64(pcdataBase + info.Pcfile), int64(info.Pcline - info.Pcfile)}, - PCLine: Data{int64(pcdataBase + info.Pcline), int64(info.Pcinline - info.Pcline)}, - PCInline: Data{int64(pcdataBase + info.Pcinline), int64(info.Pcdata[0] - info.Pcinline)}, - PCData: make([]Data, len(info.Pcdata)-1), // -1 as we appended one above - FuncData: make([]FuncData, len(info.Funcdataoff)), - File: make(map[goobj2.CUFileIndex]struct{}, len(info.File)), - InlTree: make([]InlinedCall, len(info.InlTree)), - } - sym.Func = f - for k := range f.PCData { - f.PCData[k] = Data{int64(pcdataBase + info.Pcdata[k]), int64(info.Pcdata[k+1] - info.Pcdata[k])} - } - for k := range f.FuncData { - symID := resolveSymRef(funcdata[k]) - f.FuncData[k] = FuncData{symID, int64(info.Funcdataoff[k])} - } - for _, k := range info.File { - f.File[k] = struct{}{} - } - for k := range f.InlTree { - inl := &info.InlTree[k] - f.InlTree[k] = InlinedCall{ - Parent: int64(inl.Parent), - File: inl.File, - Line: int64(inl.Line), - Func: resolveSymRef(inl.Func), - ParentPC: int64(inl.ParentPC), - } - } - } -} diff --git a/src/cmd/internal/bio/buf.go b/src/cmd/internal/bio/buf.go index 470c9797b2..c4c251490d 100644 --- a/src/cmd/internal/bio/buf.go +++ b/src/cmd/internal/bio/buf.go @@ -40,7 +40,12 @@ func Open(name string) (*Reader, error) { if err != nil { return nil, err } - return &Reader{f: f, Reader: bufio.NewReader(f)}, nil + return NewReader(f), nil +} + +// NewReader returns a Reader from an open file. +func NewReader(f *os.File) *Reader { + return &Reader{f: f, Reader: bufio.NewReader(f)} } func (r *Reader) MustSeek(offset int64, whence int) int64 { diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go index a7e45b9ecb..6bf9d3bf21 100644 --- a/src/cmd/internal/objfile/goobj.go +++ b/src/cmd/internal/objfile/goobj.go @@ -7,95 +7,207 @@ package objfile import ( - goobj "cmd/internal/archive" + "cmd/internal/archive" + "cmd/internal/goobj2" "cmd/internal/objabi" "cmd/internal/sys" "debug/dwarf" "debug/gosym" "errors" "fmt" + "io" "os" + "strings" ) type goobjFile struct { - goobj *goobj.Package - f *os.File // the underlying .o or .a file + goobj *archive.GoObj + r *goobj2.Reader + f *os.File } -func openGoFile(r *os.File) (*File, error) { - f, err := goobj.Parse(r, `""`) +func openGoFile(f *os.File) (*File, error) { + a, err := archive.Parse(f) if err != nil { return nil, err } - rf := &goobjFile{goobj: f, f: r} - if len(f.Native) == 0 { - return &File{r, []*Entry{{raw: rf}}}, nil - } - entries := make([]*Entry, len(f.Native)+1) - entries[0] = &Entry{ - raw: rf, - } + entries := make([]*Entry, 0, len(a.Entries)) L: - for i, nr := range f.Native { - for _, try := range openers { - if raw, err := try(nr); err == nil { - entries[i+1] = &Entry{ - name: nr.Name, - raw: raw, + for _, e := range a.Entries { + switch e.Type { + case archive.EntryPkgDef: + continue + case archive.EntryGoObj: + o := e.Obj + b := make([]byte, o.Size) + _, err := f.ReadAt(b, o.Offset) + if err != nil { + return nil, err + } + r := goobj2.NewReaderFromBytes(b, false) + entries = append(entries, &Entry{ + name: e.Name, + raw: &goobjFile{e.Obj, r, f}, + }) + continue + case archive.EntryNativeObj: + nr := io.NewSectionReader(f, e.Offset, e.Size) + for _, try := range openers { + if raw, err := try(nr); err == nil { + entries = append(entries, &Entry{ + name: e.Name, + raw: raw, + }) + continue L } - continue L } } - return nil, fmt.Errorf("open %s: unrecognized archive member %s", r.Name(), nr.Name) + return nil, fmt.Errorf("open %s: unrecognized archive member %s", f.Name(), e.Name) } - return &File{r, entries}, nil + return &File{f, entries}, nil } -func goobjName(id goobj.SymID) string { - if id.Version == 0 { - return id.Name +func goobjName(name string, ver int) string { + if ver == 0 { + return name } - return fmt.Sprintf("%s<%d>", id.Name, id.Version) + return fmt.Sprintf("%s<%d>", name, ver) } -func (f *goobjFile) symbols() ([]Sym, error) { - seen := make(map[goobj.SymID]bool) +type goobjReloc struct { + Off int32 + Size uint8 + Type objabi.RelocType + Add int64 + Sym string +} +func (r goobjReloc) String(insnOffset uint64) string { + delta := int64(r.Off) - int64(insnOffset) + s := fmt.Sprintf("[%d:%d]%s", delta, delta+int64(r.Size), r.Type) + if r.Sym != "" { + if r.Add != 0 { + return fmt.Sprintf("%s:%s+%d", s, r.Sym, r.Add) + } + return fmt.Sprintf("%s:%s", s, r.Sym) + } + if r.Add != 0 { + return fmt.Sprintf("%s:%d", s, r.Add) + } + return s +} + +func (f *goobjFile) symbols() ([]Sym, error) { + r := f.r var syms []Sym - for _, s := range f.goobj.Syms { - seen[s.SymID] = true - sym := Sym{Addr: uint64(s.Data.Offset), Name: goobjName(s.SymID), Size: s.Size, Type: s.Type.Name, Code: '?'} - switch s.Kind { + + // Name of referenced indexed symbols. + nrefName := r.NRefName() + refNames := make(map[goobj2.SymRef]string, nrefName) + for i := 0; i < nrefName; i++ { + rn := r.RefName(i) + refNames[rn.Sym()] = rn.Name(r) + } + + abiToVer := func(abi uint16) int { + var ver int + if abi == goobj2.SymABIstatic { + // Static symbol + ver = 1 + } + return ver + } + + resolveSymRef := func(s goobj2.SymRef) string { + var i uint32 + switch p := s.PkgIdx; p { + case goobj2.PkgIdxInvalid: + if s.SymIdx != 0 { + panic("bad sym ref") + } + return "" + case goobj2.PkgIdxHashed64: + i = s.SymIdx + uint32(r.NSym()) + case goobj2.PkgIdxHashed: + i = s.SymIdx + uint32(r.NSym()+r.NHashed64def()) + case goobj2.PkgIdxNone: + i = s.SymIdx + uint32(r.NSym()+r.NHashed64def()+r.NHasheddef()) + case goobj2.PkgIdxBuiltin: + name, abi := goobj2.BuiltinName(int(s.SymIdx)) + return goobjName(name, abi) + case goobj2.PkgIdxSelf: + i = s.SymIdx + default: + return refNames[s] + } + sym := r.Sym(i) + return goobjName(sym.Name(r), abiToVer(sym.ABI())) + } + + // Defined symbols + ndef := uint32(r.NSym() + r.NHashed64def() + r.NHasheddef() + r.NNonpkgdef()) + for i := uint32(0); i < ndef; i++ { + osym := r.Sym(i) + if osym.Name(r) == "" { + continue // not a real symbol + } + name := osym.Name(r) + ver := osym.ABI() + name = goobjName(name, abiToVer(ver)) + typ := objabi.SymKind(osym.Type()) + var code rune = '?' + switch typ { case objabi.STEXT: - sym.Code = 'T' + code = 'T' case objabi.SRODATA: - sym.Code = 'R' + code = 'R' case objabi.SDATA: - sym.Code = 'D' + code = 'D' case objabi.SBSS, objabi.SNOPTRBSS, objabi.STLSBSS: - sym.Code = 'B' + code = 'B' } - if s.Version != 0 { - sym.Code += 'a' - 'A' + if ver >= goobj2.SymABIstatic { + code += 'a' - 'A' } - for i, r := range s.Reloc { - sym.Relocs = append(sym.Relocs, Reloc{Addr: uint64(s.Data.Offset) + uint64(r.Offset), Size: uint64(r.Size), Stringer: &s.Reloc[i]}) + + sym := Sym{ + Name: name, + Addr: uint64(r.DataOff(i)), + Size: int64(osym.Siz()), + Code: code, } - syms = append(syms, sym) - } - for _, s := range f.goobj.Syms { - for _, r := range s.Reloc { - if !seen[r.Sym] { - seen[r.Sym] = true - sym := Sym{Name: goobjName(r.Sym), Code: 'U'} - if s.Version != 0 { - // should not happen but handle anyway - sym.Code = 'u' - } - syms = append(syms, sym) + relocs := r.Relocs(i) + sym.Relocs = make([]Reloc, len(relocs)) + for j := range relocs { + rel := &relocs[j] + sym.Relocs[j] = Reloc{ + Addr: uint64(r.DataOff(i)) + uint64(rel.Off()), + Size: uint64(rel.Siz()), + Stringer: goobjReloc{ + Off: rel.Off(), + Size: rel.Siz(), + Type: objabi.RelocType(rel.Type()), + Add: rel.Add(), + Sym: resolveSymRef(rel.Sym()), + }, } } + + syms = append(syms, sym) + } + + // Referenced symbols + n := ndef + uint32(r.NNonpkgref()) + for i := ndef; i < n; i++ { + osym := r.Sym(i) + sym := Sym{Name: osym.Name(r), Code: 'U'} + syms = append(syms, sym) + } + for i := 0; i < nrefName; i++ { + rn := r.RefName(i) + sym := Sym{Name: rn.Name(r), Code: 'U'} + syms = append(syms, sym) } return syms, nil @@ -112,9 +224,11 @@ func (f *goobjFile) pcln() (textStart uint64, symtab, pclntab []byte, err error) // This function implements the Liner interface in preference to pcln() above. func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { // TODO: this is really inefficient. Binary search? Memoize last result? + r := f.r var arch *sys.Arch + archname := f.goarch() for _, a := range sys.Archs { - if a.Name == f.goobj.Arch { + if a.Name == archname { arch = a break } @@ -122,29 +236,43 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { if arch == nil { return "", 0, nil } - for _, s := range f.goobj.Syms { - if pc < uint64(s.Data.Offset) || pc >= uint64(s.Data.Offset+s.Data.Size) { + pcdataBase := r.PcdataBase() + ndef := uint32(r.NSym() + r.NHashed64def() + r.NHasheddef() + r.NNonpkgdef()) + for i := uint32(0); i < ndef; i++ { + osym := r.Sym(i) + addr := uint64(r.DataOff(i)) + if pc < addr || pc >= addr+uint64(osym.Siz()) { continue } - if s.Func == nil { - return "", 0, nil - } - pcfile := make([]byte, s.Func.PCFile.Size) - _, err := f.f.ReadAt(pcfile, s.Func.PCFile.Offset) - if err != nil { - return "", 0, nil + isym := ^uint32(0) + auxs := r.Auxs(i) + for j := range auxs { + a := &auxs[j] + if a.Type() != goobj2.AuxFuncInfo { + continue + } + if a.Sym().PkgIdx != goobj2.PkgIdxSelf { + panic("funcinfo symbol not defined in current package") + } + isym = a.Sym().SymIdx } - fileID := int(pcValue(pcfile, pc-uint64(s.Data.Offset), arch)) - fileName := f.goobj.FileList[fileID] - pcline := make([]byte, s.Func.PCLine.Size) - _, err = f.f.ReadAt(pcline, s.Func.PCLine.Offset) - if err != nil { - return "", 0, nil + if isym == ^uint32(0) { + continue } - line := int(pcValue(pcline, pc-uint64(s.Data.Offset), arch)) + b := r.BytesAt(r.DataOff(isym), r.DataSize(isym)) + var info *goobj2.FuncInfo + lengths := info.ReadFuncInfoLengths(b) + off, end := info.ReadPcline(b) + pcline := r.BytesAt(pcdataBase+off, int(end-off)) + line := int(pcValue(pcline, pc-addr, arch)) + off, end = info.ReadPcfile(b) + pcfile := r.BytesAt(pcdataBase+off, int(end-off)) + fileID := pcValue(pcfile, pc-addr, arch) + globalFileID := info.ReadFile(b, lengths.FileOff, uint32(fileID)) + fileName := r.File(int(globalFileID)) // Note: we provide only the name in the Func structure. // We could provide more if needed. - return fileName, line, &gosym.Func{Sym: &gosym.Sym{Name: s.Name}} + return fileName, line, &gosym.Func{Sym: &gosym.Sym{Name: osym.Name(r)}} } return "", 0, nil } @@ -198,18 +326,17 @@ func readvarint(p *[]byte) uint32 { // We treat the whole object file as the text section. func (f *goobjFile) text() (textStart uint64, text []byte, err error) { - var info os.FileInfo - info, err = f.f.Stat() - if err != nil { - return - } - text = make([]byte, info.Size()) - _, err = f.f.ReadAt(text, 0) + text = make([]byte, f.goobj.Size) + _, err = f.f.ReadAt(text, int64(f.goobj.Offset)) return } func (f *goobjFile) goarch() string { - return f.goobj.Arch + hs := strings.Fields(string(f.goobj.TextHeader)) + if len(hs) >= 4 { + return hs[3] + } + return "" } func (f *goobjFile) loadAddress() (uint64, error) { -- GitLab From 27e3778793c4ae4e54d27185f6955bc5c180151b Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sun, 2 Aug 2020 19:36:28 -0400 Subject: [PATCH 0147/1792] [dev.link] cmd: remove "2", another round Rename the goobj2 package to goobj. Change-Id: Iff97b5575cbac45ac44de96b6bd9d555b9a4a12a Reviewed-on: https://go-review.googlesource.com/c/go/+/246444 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/compile/internal/gc/iexport.go | 4 +- src/cmd/compile/internal/gc/iimport.go | 4 +- src/cmd/compile/internal/gc/main.go | 4 +- src/cmd/dist/buildtool.go | 2 +- src/cmd/internal/archive/read.go | 4 +- src/cmd/internal/{goobj2 => goobj}/builtin.go | 2 +- .../internal/{goobj2 => goobj}/builtinlist.go | 2 +- .../internal/{goobj2 => goobj}/funcinfo.go | 2 +- .../internal/{goobj2 => goobj}/mkbuiltin.go | 2 +- src/cmd/internal/{goobj2 => goobj}/objfile.go | 2 +- .../{goobj2 => goobj}/objfile_test.go | 2 +- src/cmd/internal/obj/line.go | 6 +- src/cmd/internal/obj/link.go | 10 +- src/cmd/internal/obj/objfile2.go | 152 +++++++++--------- src/cmd/internal/obj/objfile_test.go | 6 +- src/cmd/internal/obj/pcln.go | 6 +- src/cmd/internal/obj/sym.go | 18 +-- src/cmd/internal/objfile/goobj.go | 34 ++-- src/cmd/link/internal/ld/deadcode.go | 4 +- src/cmd/link/internal/ld/ld.go | 6 +- src/cmd/link/internal/ld/lib.go | 6 +- src/cmd/link/internal/ld/main.go | 4 +- src/cmd/link/internal/ld/pcln.go | 4 +- src/cmd/link/internal/loader/loader.go | 132 +++++++-------- src/cmd/link/internal/loader/loader_test.go | 6 +- src/cmd/link/internal/loader/symbolbuilder.go | 8 +- src/cmd/link/internal/sym/library.go | 6 +- 27 files changed, 219 insertions(+), 219 deletions(-) rename src/cmd/internal/{goobj2 => goobj}/builtin.go (98%) rename src/cmd/internal/{goobj2 => goobj}/builtinlist.go (99%) rename src/cmd/internal/{goobj2 => goobj}/funcinfo.go (99%) rename src/cmd/internal/{goobj2 => goobj}/mkbuiltin.go (99%) rename src/cmd/internal/{goobj2 => goobj}/objfile.go (99%) rename src/cmd/internal/{goobj2 => goobj}/objfile_test.go (99%) diff --git a/src/cmd/compile/internal/gc/iexport.go b/src/cmd/compile/internal/gc/iexport.go index 7a7dbdeac1..b3f50b63af 100644 --- a/src/cmd/compile/internal/gc/iexport.go +++ b/src/cmd/compile/internal/gc/iexport.go @@ -205,7 +205,7 @@ import ( "bufio" "bytes" "cmd/compile/internal/types" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/src" "crypto/md5" "encoding/binary" @@ -1004,7 +1004,7 @@ func (w *exportWriter) linkname(s *types.Sym) { func (w *exportWriter) symIdx(s *types.Sym) { lsym := s.Linksym() - if lsym.PkgIdx > goobj2.PkgIdxSelf || (lsym.PkgIdx == goobj2.PkgIdxInvalid && !lsym.Indexed()) || s.Linkname != "" { + 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. diff --git a/src/cmd/compile/internal/gc/iimport.go b/src/cmd/compile/internal/gc/iimport.go index 29bb1e57a4..0eeb047c06 100644 --- a/src/cmd/compile/internal/gc/iimport.go +++ b/src/cmd/compile/internal/gc/iimport.go @@ -10,7 +10,7 @@ package gc import ( "cmd/compile/internal/types" "cmd/internal/bio" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/obj" "cmd/internal/src" "encoding/binary" @@ -97,7 +97,7 @@ func (r *intReader) uint64() uint64 { return i } -func iimport(pkg *types.Pkg, in *bio.Reader) (fingerprint goobj2.FingerprintType) { +func iimport(pkg *types.Pkg, in *bio.Reader) (fingerprint goobj.FingerprintType) { ir := &intReader{in, pkg} version := ir.uint64() diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 4417e70616..eedfc4bb25 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -14,7 +14,7 @@ import ( "cmd/compile/internal/types" "cmd/internal/bio" "cmd/internal/dwarf" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/src" @@ -1280,7 +1280,7 @@ func importfile(f *Val) *types.Pkg { c, _ = imp.ReadByte() } - var fingerprint goobj2.FingerprintType + var fingerprint goobj.FingerprintType switch c { case '\n': yyerror("cannot import %s: old export format no longer supported (recompile library)", path_) diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go index 9502dac4eb..40d28b535b 100644 --- a/src/cmd/dist/buildtool.go +++ b/src/cmd/dist/buildtool.go @@ -56,7 +56,7 @@ var bootstrapDirs = []string{ "cmd/internal/gcprog", "cmd/internal/dwarf", "cmd/internal/edit", - "cmd/internal/goobj2", + "cmd/internal/goobj", "cmd/internal/objabi", "cmd/internal/obj", "cmd/internal/obj/arm", diff --git a/src/cmd/internal/archive/read.go b/src/cmd/internal/archive/read.go index 6875dbce75..e67f06d69b 100644 --- a/src/cmd/internal/archive/read.go +++ b/src/cmd/internal/archive/read.go @@ -10,7 +10,7 @@ import ( "bufio" "bytes" "cmd/internal/bio" - "cmd/internal/goobj2" + "cmd/internal/goobj" "errors" "fmt" "io" @@ -318,7 +318,7 @@ func (r *objReader) parseObject(o *GoObj, size int64) error { if err != nil { return err } - if !bytes.Equal(p, []byte(goobj2.Magic)) { + if !bytes.Equal(p, []byte(goobj.Magic)) { return r.error(errCorruptObject) } r.skip(o.Size) diff --git a/src/cmd/internal/goobj2/builtin.go b/src/cmd/internal/goobj/builtin.go similarity index 98% rename from src/cmd/internal/goobj2/builtin.go rename to src/cmd/internal/goobj/builtin.go index 65f9dd5d95..e7d612aeb7 100644 --- a/src/cmd/internal/goobj2/builtin.go +++ b/src/cmd/internal/goobj/builtin.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 goobj2 +package goobj // Builtin (compiler-generated) function references appear // frequently. We assign special indices for them, so they diff --git a/src/cmd/internal/goobj2/builtinlist.go b/src/cmd/internal/goobj/builtinlist.go similarity index 99% rename from src/cmd/internal/goobj2/builtinlist.go rename to src/cmd/internal/goobj/builtinlist.go index 171f57f15f..0cca752332 100644 --- a/src/cmd/internal/goobj2/builtinlist.go +++ b/src/cmd/internal/goobj/builtinlist.go @@ -1,6 +1,6 @@ // Code generated by mkbuiltin.go. DO NOT EDIT. -package goobj2 +package goobj var builtins = [...]struct { name string diff --git a/src/cmd/internal/goobj2/funcinfo.go b/src/cmd/internal/goobj/funcinfo.go similarity index 99% rename from src/cmd/internal/goobj2/funcinfo.go rename to src/cmd/internal/goobj/funcinfo.go index 9d2522d3c2..e0e6068b4b 100644 --- a/src/cmd/internal/goobj2/funcinfo.go +++ b/src/cmd/internal/goobj/funcinfo.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 goobj2 +package goobj import ( "bytes" diff --git a/src/cmd/internal/goobj2/mkbuiltin.go b/src/cmd/internal/goobj/mkbuiltin.go similarity index 99% rename from src/cmd/internal/goobj2/mkbuiltin.go rename to src/cmd/internal/goobj/mkbuiltin.go index 4838fa2a67..07c3406681 100644 --- a/src/cmd/internal/goobj2/mkbuiltin.go +++ b/src/cmd/internal/goobj/mkbuiltin.go @@ -32,7 +32,7 @@ func main() { var b bytes.Buffer fmt.Fprintln(&b, "// Code generated by mkbuiltin.go. DO NOT EDIT.") fmt.Fprintln(&b) - fmt.Fprintln(&b, "package goobj2") + fmt.Fprintln(&b, "package goobj") mkbuiltin(&b) diff --git a/src/cmd/internal/goobj2/objfile.go b/src/cmd/internal/goobj/objfile.go similarity index 99% rename from src/cmd/internal/goobj2/objfile.go rename to src/cmd/internal/goobj/objfile.go index 49f45a7736..5d4a253024 100644 --- a/src/cmd/internal/goobj2/objfile.go +++ b/src/cmd/internal/goobj/objfile.go @@ -4,7 +4,7 @@ // Go new object file format, reading and writing. -package goobj2 // TODO: replace the goobj package? +package goobj import ( "bytes" diff --git a/src/cmd/internal/goobj2/objfile_test.go b/src/cmd/internal/goobj/objfile_test.go similarity index 99% rename from src/cmd/internal/goobj2/objfile_test.go rename to src/cmd/internal/goobj/objfile_test.go index 9fd121f9e6..c6fd427c15 100644 --- a/src/cmd/internal/goobj2/objfile_test.go +++ b/src/cmd/internal/goobj/objfile_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 goobj2 +package goobj import ( "bufio" diff --git a/src/cmd/internal/obj/line.go b/src/cmd/internal/obj/line.go index 54b9c4748c..87cd32ba7e 100644 --- a/src/cmd/internal/obj/line.go +++ b/src/cmd/internal/obj/line.go @@ -5,13 +5,13 @@ package obj import ( - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/src" ) // AddImport adds a package to the list of imported packages. -func (ctxt *Link) AddImport(pkg string, fingerprint goobj2.FingerprintType) { - ctxt.Imports = append(ctxt.Imports, goobj2.ImportedPkg{Pkg: pkg, Fingerprint: fingerprint}) +func (ctxt *Link) AddImport(pkg string, fingerprint goobj.FingerprintType) { + ctxt.Imports = append(ctxt.Imports, goobj.ImportedPkg{Pkg: pkg, Fingerprint: fingerprint}) } func linkgetlineFromPos(ctxt *Link, xpos src.XPos) (f string, l int32) { diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 62943a7cb3..dc47e51be9 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -33,7 +33,7 @@ package obj import ( "bufio" "cmd/internal/dwarf" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/objabi" "cmd/internal/src" "cmd/internal/sys" @@ -631,8 +631,8 @@ type Pcln struct { Pcdata []Pcdata Funcdata []*LSym Funcdataoff []int64 - UsedFiles map[goobj2.CUFileIndex]struct{} // file indices used while generating pcfile - InlTree InlTree // per-function inlining tree extracted from the global tree + UsedFiles map[goobj.CUFileIndex]struct{} // file indices used while generating pcfile + InlTree InlTree // per-function inlining tree extracted from the global tree } type Reloc struct { @@ -678,7 +678,7 @@ type Link struct { PosTable src.PosTable InlTree InlTree // global inlining tree used by gc/inl.go DwFixups *DwarfFixupTable - Imports []goobj2.ImportedPkg + 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 @@ -720,7 +720,7 @@ type Link struct { nonpkgdefs []*LSym // list of defined non-package symbols nonpkgrefs []*LSym // list of referenced non-package symbols - Fingerprint goobj2.FingerprintType // fingerprint of symbol indices, to catch index mismatch + Fingerprint goobj.FingerprintType // fingerprint of symbol indices, to catch index mismatch } func (ctxt *Link) Diag(format string, args ...interface{}) { diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go index ae1a3646b1..f9720f0e57 100644 --- a/src/cmd/internal/obj/objfile2.go +++ b/src/cmd/internal/obj/objfile2.go @@ -9,7 +9,7 @@ package obj import ( "bytes" "cmd/internal/bio" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/objabi" "crypto/sha1" "encoding/binary" @@ -28,7 +28,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { genFuncInfoSyms(ctxt) w := writer{ - Writer: goobj2.NewWriter(b), + Writer: goobj.NewWriter(b), ctxt: ctxt, pkgpath: objabi.PathToPrefix(ctxt.Pkgpath), } @@ -40,16 +40,16 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { // We just reserve the space. We'll fill in the offsets later. flags := uint32(0) if ctxt.Flag_shared { - flags |= goobj2.ObjFlagShared + flags |= goobj.ObjFlagShared } if w.pkgpath == "" { - flags |= goobj2.ObjFlagNeedNameExpansion + flags |= goobj.ObjFlagNeedNameExpansion } if ctxt.IsAsm { - flags |= goobj2.ObjFlagFromAssembly + flags |= goobj.ObjFlagFromAssembly } - h := goobj2.Header{ - Magic: goobj2.Magic, + h := goobj.Header{ + Magic: goobj.Magic, Fingerprint: ctxt.Fingerprint, Flags: flags, } @@ -59,70 +59,70 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { w.StringTable() // Autolib - h.Offsets[goobj2.BlkAutolib] = w.Offset() + h.Offsets[goobj.BlkAutolib] = w.Offset() for i := range ctxt.Imports { ctxt.Imports[i].Write(w.Writer) } // Package references - h.Offsets[goobj2.BlkPkgIdx] = w.Offset() + h.Offsets[goobj.BlkPkgIdx] = w.Offset() for _, pkg := range w.pkglist { w.StringRef(pkg) } // File table (for DWARF and pcln generation). - h.Offsets[goobj2.BlkFile] = w.Offset() + h.Offsets[goobj.BlkFile] = w.Offset() for _, f := range ctxt.PosTable.FileTable() { w.StringRef(filepath.ToSlash(f)) } // Symbol definitions - h.Offsets[goobj2.BlkSymdef] = w.Offset() + h.Offsets[goobj.BlkSymdef] = w.Offset() for _, s := range ctxt.defs { w.Sym(s) } // Short hashed symbol definitions - h.Offsets[goobj2.BlkHashed64def] = w.Offset() + h.Offsets[goobj.BlkHashed64def] = w.Offset() for _, s := range ctxt.hashed64defs { w.Sym(s) } // Hashed symbol definitions - h.Offsets[goobj2.BlkHasheddef] = w.Offset() + h.Offsets[goobj.BlkHasheddef] = w.Offset() for _, s := range ctxt.hasheddefs { w.Sym(s) } // Non-pkg symbol definitions - h.Offsets[goobj2.BlkNonpkgdef] = w.Offset() + h.Offsets[goobj.BlkNonpkgdef] = w.Offset() for _, s := range ctxt.nonpkgdefs { w.Sym(s) } // Non-pkg symbol references - h.Offsets[goobj2.BlkNonpkgref] = w.Offset() + h.Offsets[goobj.BlkNonpkgref] = w.Offset() for _, s := range ctxt.nonpkgrefs { w.Sym(s) } // Referenced package symbol flags - h.Offsets[goobj2.BlkRefFlags] = w.Offset() + h.Offsets[goobj.BlkRefFlags] = w.Offset() w.refFlags() // Hashes - h.Offsets[goobj2.BlkHash64] = w.Offset() + h.Offsets[goobj.BlkHash64] = w.Offset() for _, s := range ctxt.hashed64defs { w.Hash64(s) } - h.Offsets[goobj2.BlkHash] = w.Offset() + h.Offsets[goobj.BlkHash] = w.Offset() for _, s := range ctxt.hasheddefs { w.Hash(s) } // TODO: hashedrefs unused/unsupported for now // Reloc indexes - h.Offsets[goobj2.BlkRelocIdx] = w.Offset() + h.Offsets[goobj.BlkRelocIdx] = w.Offset() nreloc := uint32(0) lists := [][]*LSym{ctxt.defs, ctxt.hashed64defs, ctxt.hasheddefs, ctxt.nonpkgdefs} for _, list := range lists { @@ -134,7 +134,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { w.Uint32(nreloc) // Symbol Info indexes - h.Offsets[goobj2.BlkAuxIdx] = w.Offset() + h.Offsets[goobj.BlkAuxIdx] = w.Offset() naux := uint32(0) for _, list := range lists { for _, s := range list { @@ -145,7 +145,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { w.Uint32(naux) // Data indexes - h.Offsets[goobj2.BlkDataIdx] = w.Offset() + h.Offsets[goobj.BlkDataIdx] = w.Offset() dataOff := uint32(0) for _, list := range lists { for _, s := range list { @@ -156,7 +156,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { w.Uint32(dataOff) // Relocs - h.Offsets[goobj2.BlkReloc] = w.Offset() + h.Offsets[goobj.BlkReloc] = w.Offset() for _, list := range lists { for _, s := range list { for i := range s.R { @@ -166,7 +166,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { } // Aux symbol info - h.Offsets[goobj2.BlkAux] = w.Offset() + h.Offsets[goobj.BlkAux] = w.Offset() for _, list := range lists { for _, s := range list { w.Aux(s) @@ -174,7 +174,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { } // Data - h.Offsets[goobj2.BlkData] = w.Offset() + h.Offsets[goobj.BlkData] = w.Offset() for _, list := range lists { for _, s := range list { w.Bytes(s.P) @@ -182,7 +182,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { } // Pcdata - h.Offsets[goobj2.BlkPcdata] = w.Offset() + h.Offsets[goobj.BlkPcdata] = w.Offset() for _, s := range ctxt.Text { // iteration order must match genFuncInfoSyms if s.Func != nil { pc := &s.Func.Pcln @@ -199,10 +199,10 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { // Blocks used only by tools (objdump, nm). // Referenced symbol names from other packages - h.Offsets[goobj2.BlkRefName] = w.Offset() + h.Offsets[goobj.BlkRefName] = w.Offset() w.refNames() - h.Offsets[goobj2.BlkEnd] = w.Offset() + h.Offsets[goobj.BlkEnd] = w.Offset() // Fix up block offsets in the header end := start + int64(w.Offset()) @@ -212,7 +212,7 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { } type writer struct { - *goobj2.Writer + *goobj.Writer ctxt *Link pkgpath string // the package import path (escaped), "" if unknown pkglist []string // list of packages referenced, indexed by ctxt.pkgIdx @@ -244,7 +244,7 @@ func (w *writer) StringTable() { } // Don't put names of builtins into the string table (to save // space). - if s.PkgIdx == goobj2.PkgIdxBuiltin { + if s.PkgIdx == goobj.PkgIdxBuiltin { return } w.AddString(s.Name) @@ -259,39 +259,39 @@ func (w *writer) StringTable() { func (w *writer) Sym(s *LSym) { abi := uint16(s.ABI()) if s.Static() { - abi = goobj2.SymABIstatic + abi = goobj.SymABIstatic } flag := uint8(0) if s.DuplicateOK() { - flag |= goobj2.SymFlagDupok + flag |= goobj.SymFlagDupok } if s.Local() { - flag |= goobj2.SymFlagLocal + flag |= goobj.SymFlagLocal } if s.MakeTypelink() { - flag |= goobj2.SymFlagTypelink + flag |= goobj.SymFlagTypelink } if s.Leaf() { - flag |= goobj2.SymFlagLeaf + flag |= goobj.SymFlagLeaf } if s.NoSplit() { - flag |= goobj2.SymFlagNoSplit + flag |= goobj.SymFlagNoSplit } if s.ReflectMethod() { - flag |= goobj2.SymFlagReflectMethod + flag |= goobj.SymFlagReflectMethod } if s.TopFrame() { - flag |= goobj2.SymFlagTopFrame + flag |= goobj.SymFlagTopFrame } if strings.HasPrefix(s.Name, "type.") && s.Name[5] != '.' && s.Type == objabi.SRODATA { - flag |= goobj2.SymFlagGoType + flag |= goobj.SymFlagGoType } flag2 := uint8(0) if s.UsedInIface() { - flag2 |= goobj2.SymFlagUsedInIface + flag2 |= goobj.SymFlagUsedInIface } if strings.HasPrefix(s.Name, "go.itab.") && s.Type == objabi.SRODATA { - flag2 |= goobj2.SymFlagItab + flag2 |= goobj.SymFlagItab } name := s.Name if strings.HasPrefix(name, "gofile..") { @@ -320,7 +320,7 @@ func (w *writer) Sym(s *LSym) { // don't bother setting align to 1. } } - var o goobj2.Sym + var o goobj.Sym o.SetName(name, w.Writer) o.SetABI(abi) o.SetType(uint8(s.Type)) @@ -347,8 +347,8 @@ func (w *writer) Hash(s *LSym) { w.Bytes(b[:]) } -func contentHash64(s *LSym) goobj2.Hash64Type { - var b goobj2.Hash64Type +func contentHash64(s *LSym) goobj.Hash64Type { + var b goobj.Hash64Type copy(b[:], s.P) return b } @@ -369,7 +369,7 @@ func contentHash64(s *LSym) goobj2.Hash64Type { // // For now, we assume there is no circular dependencies among // hashed symbols. -func (w *writer) contentHash(s *LSym) goobj2.HashType { +func (w *writer) contentHash(s *LSym) goobj.HashType { h := sha1.New() // The compiler trims trailing zeros _sometimes_. We just do // it always. @@ -384,22 +384,22 @@ func (w *writer) contentHash(s *LSym) goobj2.HashType { h.Write(tmp[:]) rs := r.Sym switch rs.PkgIdx { - case goobj2.PkgIdxHashed64: + case goobj.PkgIdxHashed64: h.Write([]byte{0}) t := contentHash64(rs) h.Write(t[:]) - case goobj2.PkgIdxHashed: + case goobj.PkgIdxHashed: h.Write([]byte{1}) t := w.contentHash(rs) h.Write(t[:]) - case goobj2.PkgIdxNone: + case goobj.PkgIdxNone: h.Write([]byte{2}) io.WriteString(h, rs.Name) // name is already expanded at this point - case goobj2.PkgIdxBuiltin: + case goobj.PkgIdxBuiltin: h.Write([]byte{3}) binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) h.Write(tmp[:4]) - case goobj2.PkgIdxSelf: + case goobj.PkgIdxSelf: io.WriteString(h, w.pkgpath) binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) h.Write(tmp[:4]) @@ -409,24 +409,24 @@ func (w *writer) contentHash(s *LSym) goobj2.HashType { h.Write(tmp[:4]) } } - var b goobj2.HashType + var b goobj.HashType copy(b[:], h.Sum(nil)) return b } -func makeSymRef(s *LSym) goobj2.SymRef { +func makeSymRef(s *LSym) goobj.SymRef { if s == nil { - return goobj2.SymRef{} + return goobj.SymRef{} } if s.PkgIdx == 0 || !s.Indexed() { fmt.Printf("unindexed symbol reference: %v\n", s) panic("unindexed symbol reference") } - return goobj2.SymRef{PkgIdx: uint32(s.PkgIdx), SymIdx: uint32(s.SymIdx)} + return goobj.SymRef{PkgIdx: uint32(s.PkgIdx), SymIdx: uint32(s.SymIdx)} } func (w *writer) Reloc(r *Reloc) { - var o goobj2.Reloc + var o goobj.Reloc o.SetOff(r.Off) o.SetSiz(r.Siz) o.SetType(uint8(r.Type)) @@ -436,7 +436,7 @@ func (w *writer) Reloc(r *Reloc) { } func (w *writer) aux1(typ uint8, rs *LSym) { - var o goobj2.Aux + var o goobj.Aux o.SetType(typ) o.SetSym(makeSymRef(rs)) o.Write(w.Writer) @@ -444,26 +444,26 @@ func (w *writer) aux1(typ uint8, rs *LSym) { func (w *writer) Aux(s *LSym) { if s.Gotype != nil { - w.aux1(goobj2.AuxGotype, s.Gotype) + w.aux1(goobj.AuxGotype, s.Gotype) } if s.Func != nil { - w.aux1(goobj2.AuxFuncInfo, s.Func.FuncInfoSym) + w.aux1(goobj.AuxFuncInfo, s.Func.FuncInfoSym) for _, d := range s.Func.Pcln.Funcdata { - w.aux1(goobj2.AuxFuncdata, d) + w.aux1(goobj.AuxFuncdata, d) } if s.Func.dwarfInfoSym != nil && s.Func.dwarfInfoSym.Size != 0 { - w.aux1(goobj2.AuxDwarfInfo, s.Func.dwarfInfoSym) + w.aux1(goobj.AuxDwarfInfo, s.Func.dwarfInfoSym) } if s.Func.dwarfLocSym != nil && s.Func.dwarfLocSym.Size != 0 { - w.aux1(goobj2.AuxDwarfLoc, s.Func.dwarfLocSym) + w.aux1(goobj.AuxDwarfLoc, s.Func.dwarfLocSym) } if s.Func.dwarfRangesSym != nil && s.Func.dwarfRangesSym.Size != 0 { - w.aux1(goobj2.AuxDwarfRanges, s.Func.dwarfRangesSym) + w.aux1(goobj.AuxDwarfRanges, s.Func.dwarfRangesSym) } if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 { - w.aux1(goobj2.AuxDwarfLines, s.Func.dwarfDebugLinesSym) + w.aux1(goobj.AuxDwarfLines, s.Func.dwarfDebugLinesSym) } } } @@ -473,9 +473,9 @@ func (w *writer) refFlags() { seen := make(map[*LSym]bool) w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs switch rs.PkgIdx { - case goobj2.PkgIdxNone, goobj2.PkgIdxHashed64, goobj2.PkgIdxHashed, goobj2.PkgIdxBuiltin, goobj2.PkgIdxSelf: // not an external indexed reference + case goobj.PkgIdxNone, goobj.PkgIdxHashed64, goobj.PkgIdxHashed, goobj.PkgIdxBuiltin, goobj.PkgIdxSelf: // not an external indexed reference return - case goobj2.PkgIdxInvalid: + case goobj.PkgIdxInvalid: panic("unindexed symbol reference") } if seen[rs] { @@ -485,12 +485,12 @@ func (w *writer) refFlags() { symref := makeSymRef(rs) flag2 := uint8(0) if rs.UsedInIface() { - flag2 |= goobj2.SymFlagUsedInIface + flag2 |= goobj.SymFlagUsedInIface } if flag2 == 0 { return // no need to write zero flags } - var o goobj2.RefFlags + var o goobj.RefFlags o.SetSym(symref) o.SetFlag2(flag2) o.Write(w.Writer) @@ -503,9 +503,9 @@ func (w *writer) refNames() { seen := make(map[*LSym]bool) w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs switch rs.PkgIdx { - case goobj2.PkgIdxNone, goobj2.PkgIdxHashed64, goobj2.PkgIdxHashed, goobj2.PkgIdxBuiltin, goobj2.PkgIdxSelf: // not an external indexed reference + case goobj.PkgIdxNone, goobj.PkgIdxHashed64, goobj.PkgIdxHashed, goobj.PkgIdxBuiltin, goobj.PkgIdxSelf: // not an external indexed reference return - case goobj2.PkgIdxInvalid: + case goobj.PkgIdxInvalid: panic("unindexed symbol reference") } if seen[rs] { @@ -513,7 +513,7 @@ func (w *writer) refNames() { } seen[rs] = true symref := makeSymRef(rs) - var o goobj2.RefName + var o goobj.RefName o.SetSym(symref) o.SetName(rs.Name, w.Writer) o.Write(w.Writer) @@ -560,7 +560,7 @@ func genFuncInfoSyms(ctxt *Link) { if s.Func == nil { continue } - o := goobj2.FuncInfo{ + o := goobj.FuncInfo{ Args: uint32(s.Func.Args), Locals: uint32(s.Func.Locals), FuncID: objabi.FuncID(s.Func.FuncID), @@ -585,18 +585,18 @@ func genFuncInfoSyms(ctxt *Link) { o.Funcdataoff[i] = uint32(x) } i := 0 - o.File = make([]goobj2.CUFileIndex, len(pc.UsedFiles)) + o.File = make([]goobj.CUFileIndex, len(pc.UsedFiles)) for f := range pc.UsedFiles { o.File[i] = f i++ } sort.Slice(o.File, func(i, j int) bool { return o.File[i] < o.File[j] }) - o.InlTree = make([]goobj2.InlTreeNode, len(pc.InlTree.nodes)) + o.InlTree = make([]goobj.InlTreeNode, len(pc.InlTree.nodes)) for i, inl := range pc.InlTree.nodes { f, l := getFileIndexAndLine(ctxt, inl.Pos) - o.InlTree[i] = goobj2.InlTreeNode{ + o.InlTree[i] = goobj.InlTreeNode{ Parent: int32(inl.Parent), - File: goobj2.CUFileIndex(f), + File: goobj.CUFileIndex(f), Line: l, Func: makeSymRef(inl.Func), ParentPC: inl.ParentPC, @@ -606,7 +606,7 @@ func genFuncInfoSyms(ctxt *Link) { o.Write(&b) isym := &LSym{ Type: objabi.SDATA, // for now, I don't think it matters - PkgIdx: goobj2.PkgIdxSelf, + PkgIdx: goobj.PkgIdxSelf, SymIdx: symidx, P: append([]byte(nil), b.Bytes()...), } @@ -621,7 +621,7 @@ func genFuncInfoSyms(ctxt *Link) { if s == nil || s.Size == 0 { continue } - s.PkgIdx = goobj2.PkgIdxSelf + s.PkgIdx = goobj.PkgIdxSelf s.SymIdx = symidx s.Set(AttrIndexed, true) symidx++ diff --git a/src/cmd/internal/obj/objfile_test.go b/src/cmd/internal/obj/objfile_test.go index ed3be20760..155701fa4e 100644 --- a/src/cmd/internal/obj/objfile_test.go +++ b/src/cmd/internal/obj/objfile_test.go @@ -5,7 +5,7 @@ package obj import ( - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/sys" "testing" ) @@ -43,7 +43,7 @@ func TestContentHash(t *testing.T) { } for _, s := range syms { s.Set(AttrContentAddressable, true) - s.PkgIdx = goobj2.PkgIdxHashed + s.PkgIdx = goobj.PkgIdxHashed } // s3 references s0 r := Addrel(syms[3]) @@ -59,7 +59,7 @@ func TestContentHash(t *testing.T) { r.Sym = syms[2] // compute hashes - h := make([]goobj2.HashType, len(syms)) + h := make([]goobj.HashType, len(syms)) w := &writer{} for i := range h { h[i] = w.contentHash(syms[i]) diff --git a/src/cmd/internal/obj/pcln.go b/src/cmd/internal/obj/pcln.go index b9d58e7ca3..1f7ccf47ef 100644 --- a/src/cmd/internal/obj/pcln.go +++ b/src/cmd/internal/obj/pcln.go @@ -5,7 +5,7 @@ package obj import ( - "cmd/internal/goobj2" + "cmd/internal/goobj" "encoding/binary" "log" ) @@ -136,7 +136,7 @@ func pctofileline(ctxt *Link, sym *LSym, oldval int32, p *Prog, phase int32, arg return l } pcln := arg.(*Pcln) - pcln.UsedFiles[goobj2.CUFileIndex(f)] = struct{}{} + pcln.UsedFiles[goobj.CUFileIndex(f)] = struct{}{} return int32(f) } @@ -249,7 +249,7 @@ func pctopcdata(ctxt *Link, sym *LSym, oldval int32, p *Prog, phase int32, arg i func linkpcln(ctxt *Link, cursym *LSym) { pcln := &cursym.Func.Pcln - pcln.UsedFiles = make(map[goobj2.CUFileIndex]struct{}) + pcln.UsedFiles = make(map[goobj.CUFileIndex]struct{}) npcdata := 0 nfuncdata := 0 diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index f62e1f5e58..cf78849cda 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -32,7 +32,7 @@ package obj import ( - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/objabi" "fmt" "log" @@ -206,7 +206,7 @@ func (ctxt *Link) NumberSyms() { // may reference named symbols whose names are not fully expanded. if s.ContentAddressable() && (ctxt.Pkgpath != "" || len(s.R) == 0) { if len(s.P) <= 8 && len(s.R) == 0 { // we can use short hash only for symbols without relocations - s.PkgIdx = goobj2.PkgIdxHashed64 + s.PkgIdx = goobj.PkgIdxHashed64 s.SymIdx = hashed64idx if hashed64idx != int32(len(ctxt.hashed64defs)) { panic("bad index") @@ -214,7 +214,7 @@ func (ctxt *Link) NumberSyms() { ctxt.hashed64defs = append(ctxt.hashed64defs, s) hashed64idx++ } else { - s.PkgIdx = goobj2.PkgIdxHashed + s.PkgIdx = goobj.PkgIdxHashed s.SymIdx = hashedidx if hashedidx != int32(len(ctxt.hasheddefs)) { panic("bad index") @@ -223,7 +223,7 @@ func (ctxt *Link) NumberSyms() { hashedidx++ } } else if isNonPkgSym(ctxt, s) { - s.PkgIdx = goobj2.PkgIdxNone + s.PkgIdx = goobj.PkgIdxNone s.SymIdx = nonpkgidx if nonpkgidx != int32(len(ctxt.nonpkgdefs)) { panic("bad index") @@ -231,7 +231,7 @@ func (ctxt *Link) NumberSyms() { ctxt.nonpkgdefs = append(ctxt.nonpkgdefs, s) nonpkgidx++ } else { - s.PkgIdx = goobj2.PkgIdxSelf + s.PkgIdx = goobj.PkgIdxSelf s.SymIdx = idx if idx != int32(len(ctxt.defs)) { panic("bad index") @@ -245,15 +245,15 @@ func (ctxt *Link) NumberSyms() { ipkg := int32(1) // 0 is invalid index nonpkgdef := nonpkgidx ctxt.traverseSyms(traverseRefs|traverseAux, func(rs *LSym) { - if rs.PkgIdx != goobj2.PkgIdxInvalid { + if rs.PkgIdx != goobj.PkgIdxInvalid { return } if !ctxt.Flag_linkshared { // Assign special index for builtin symbols. // Don't do it when linking against shared libraries, as the runtime // may be in a different library. - if i := goobj2.BuiltinIdx(rs.Name, int(rs.ABI())); i != -1 { - rs.PkgIdx = goobj2.PkgIdxBuiltin + if i := goobj.BuiltinIdx(rs.Name, int(rs.ABI())); i != -1 { + rs.PkgIdx = goobj.PkgIdxBuiltin rs.SymIdx = int32(i) rs.Set(AttrIndexed, true) return @@ -265,7 +265,7 @@ func (ctxt *Link) NumberSyms() { panic("hashed refs unsupported for now") } if pkg == "" || pkg == "\"\"" || pkg == "_" || !rs.Indexed() { - rs.PkgIdx = goobj2.PkgIdxNone + rs.PkgIdx = goobj.PkgIdxNone rs.SymIdx = nonpkgidx rs.Set(AttrIndexed, true) if nonpkgidx != nonpkgdef+int32(len(ctxt.nonpkgrefs)) { diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go index 6bf9d3bf21..5708f5ee18 100644 --- a/src/cmd/internal/objfile/goobj.go +++ b/src/cmd/internal/objfile/goobj.go @@ -8,7 +8,7 @@ package objfile import ( "cmd/internal/archive" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/objabi" "cmd/internal/sys" "debug/dwarf" @@ -22,7 +22,7 @@ import ( type goobjFile struct { goobj *archive.GoObj - r *goobj2.Reader + r *goobj.Reader f *os.File } @@ -44,7 +44,7 @@ L: if err != nil { return nil, err } - r := goobj2.NewReaderFromBytes(b, false) + r := goobj.NewReaderFromBytes(b, false) entries = append(entries, &Entry{ name: e.Name, raw: &goobjFile{e.Obj, r, f}, @@ -103,7 +103,7 @@ func (f *goobjFile) symbols() ([]Sym, error) { // Name of referenced indexed symbols. nrefName := r.NRefName() - refNames := make(map[goobj2.SymRef]string, nrefName) + refNames := make(map[goobj.SymRef]string, nrefName) for i := 0; i < nrefName; i++ { rn := r.RefName(i) refNames[rn.Sym()] = rn.Name(r) @@ -111,31 +111,31 @@ func (f *goobjFile) symbols() ([]Sym, error) { abiToVer := func(abi uint16) int { var ver int - if abi == goobj2.SymABIstatic { + if abi == goobj.SymABIstatic { // Static symbol ver = 1 } return ver } - resolveSymRef := func(s goobj2.SymRef) string { + resolveSymRef := func(s goobj.SymRef) string { var i uint32 switch p := s.PkgIdx; p { - case goobj2.PkgIdxInvalid: + case goobj.PkgIdxInvalid: if s.SymIdx != 0 { panic("bad sym ref") } return "" - case goobj2.PkgIdxHashed64: + case goobj.PkgIdxHashed64: i = s.SymIdx + uint32(r.NSym()) - case goobj2.PkgIdxHashed: + case goobj.PkgIdxHashed: i = s.SymIdx + uint32(r.NSym()+r.NHashed64def()) - case goobj2.PkgIdxNone: + case goobj.PkgIdxNone: i = s.SymIdx + uint32(r.NSym()+r.NHashed64def()+r.NHasheddef()) - case goobj2.PkgIdxBuiltin: - name, abi := goobj2.BuiltinName(int(s.SymIdx)) + case goobj.PkgIdxBuiltin: + name, abi := goobj.BuiltinName(int(s.SymIdx)) return goobjName(name, abi) - case goobj2.PkgIdxSelf: + case goobj.PkgIdxSelf: i = s.SymIdx default: return refNames[s] @@ -166,7 +166,7 @@ func (f *goobjFile) symbols() ([]Sym, error) { case objabi.SBSS, objabi.SNOPTRBSS, objabi.STLSBSS: code = 'B' } - if ver >= goobj2.SymABIstatic { + if ver >= goobj.SymABIstatic { code += 'a' - 'A' } @@ -248,10 +248,10 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { auxs := r.Auxs(i) for j := range auxs { a := &auxs[j] - if a.Type() != goobj2.AuxFuncInfo { + if a.Type() != goobj.AuxFuncInfo { continue } - if a.Sym().PkgIdx != goobj2.PkgIdxSelf { + if a.Sym().PkgIdx != goobj.PkgIdxSelf { panic("funcinfo symbol not defined in current package") } isym = a.Sym().SymIdx @@ -260,7 +260,7 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { continue } b := r.BytesAt(r.DataOff(isym), r.DataSize(isym)) - var info *goobj2.FuncInfo + var info *goobj.FuncInfo lengths := info.ReadFuncInfoLengths(b) off, end := info.ReadPcline(b) pcline := r.BytesAt(pcdataBase+off, int(end-off)) diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index a169772dde..0269429723 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -5,7 +5,7 @@ package ld import ( - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/loader" @@ -161,7 +161,7 @@ func (d *deadcodePass) flood() { naux := d.ldr.NAux(symIdx) for i := 0; i < naux; i++ { a := d.ldr.Aux(symIdx, i) - if a.Type() == goobj2.AuxGotype && !d.ctxt.linkShared { + if a.Type() == goobj.AuxGotype && !d.ctxt.linkShared { // A symbol being reachable doesn't imply we need its // type descriptor. Don't mark it. // TODO: when -linkshared, the GCProg generation code diff --git a/src/cmd/link/internal/ld/ld.go b/src/cmd/link/internal/ld/ld.go index 71e1ccdd96..7ff9c41f96 100644 --- a/src/cmd/link/internal/ld/ld.go +++ b/src/cmd/link/internal/ld/ld.go @@ -32,7 +32,7 @@ package ld import ( - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/link/internal/loader" "cmd/link/internal/sym" "io/ioutil" @@ -156,7 +156,7 @@ func findlib(ctxt *Link, lib string) (string, bool) { return pname, isshlib } -func addlib(ctxt *Link, src, obj, lib string, fingerprint goobj2.FingerprintType) *sym.Library { +func addlib(ctxt *Link, src, obj, lib string, fingerprint goobj.FingerprintType) *sym.Library { pkg := pkgname(ctxt, lib) // already loaded? @@ -192,7 +192,7 @@ func addlib(ctxt *Link, src, obj, lib string, fingerprint goobj2.FingerprintType * fingerprint: if not 0, expected fingerprint for import from srcref * fingerprint is 0 if the library is not imported (e.g. main) */ -func addlibpath(ctxt *Link, srcref, objref, file, pkg, shlib string, fingerprint goobj2.FingerprintType) *sym.Library { +func addlibpath(ctxt *Link, srcref, objref, file, pkg, shlib string, fingerprint goobj.FingerprintType) *sym.Library { if l := ctxt.LibraryByPkg[pkg]; l != nil { return l } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 5271b8f348..09c7bbfb53 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -33,7 +33,7 @@ package ld import ( "bytes" "cmd/internal/bio" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/sys" @@ -404,7 +404,7 @@ func errorexit() { } func loadinternal(ctxt *Link, name string) *sym.Library { - zerofp := goobj2.FingerprintType{} + zerofp := goobj.FingerprintType{} if ctxt.linkShared && ctxt.PackageShlib != nil { if shlib := ctxt.PackageShlib[name]; shlib != "" { return addlibpath(ctxt, "internal", "internal", "", name, shlib, zerofp) @@ -1899,7 +1899,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, return nil } -func checkFingerprint(lib *sym.Library, libfp goobj2.FingerprintType, src string, srcfp goobj2.FingerprintType) { +func checkFingerprint(lib *sym.Library, libfp goobj.FingerprintType, src string, srcfp goobj.FingerprintType) { if libfp != srcfp { Exitf("fingerprint mismatch: %s has %x, import from %s expecting %x", lib, libfp, src, srcfp) } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 4885c4f57e..6f4ccbfb7a 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -32,7 +32,7 @@ package ld import ( "bufio" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/benchmark" @@ -205,7 +205,7 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.Logf("HEADER = -H%d -T0x%x -R0x%x\n", ctxt.HeadType, uint64(*FlagTextAddr), uint32(*FlagRound)) } - zerofp := goobj2.FingerprintType{} + zerofp := goobj.FingerprintType{} switch ctxt.BuildMode { case BuildModeShared: for i := 0; i < flag.NArg(); i++ { diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index e5dfa837ba..30e0bdc839 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -5,7 +5,7 @@ package ld import ( - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/src" @@ -157,7 +157,7 @@ func ftabaddstring(ftab *loader.SymbolBuilder, s string) int32 { // This funciton looks at a CU's file at index [i], and if it's a new filename, // stores that filename in the global file table, and adds it to the map lookup // for renumbering pcfile. -func (state *oldPclnState) numberfile(cu *sym.CompilationUnit, i goobj2.CUFileIndex) int64 { +func (state *oldPclnState) numberfile(cu *sym.CompilationUnit, i goobj.CUFileIndex) int64 { file := cu.FileTable[i] if val, ok := state.numberedFiles[file]; ok { return val diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 882799e123..8fd10b0848 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -7,7 +7,7 @@ package loader import ( "bytes" "cmd/internal/bio" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/sys" @@ -30,7 +30,7 @@ type Sym int // Relocs encapsulates the set of relocations on a given symbol; an // instance of this type is returned by the Loader Relocs() method. type Relocs struct { - rs []goobj2.Reloc + rs []goobj.Reloc li uint32 // local index of symbol whose relocs we're examining r *oReader // object reader for containing package @@ -48,21 +48,21 @@ type ExtReloc struct { // Reloc holds a "handle" to access a relocation record from an // object file. type Reloc struct { - *goobj2.Reloc + *goobj.Reloc r *oReader l *Loader // External reloc types may not fit into a uint8 which the Go object file uses. - // Store it here, instead of in the byte of goobj2.Reloc. + // Store it here, instead of in the byte of goobj.Reloc. // For Go symbols this will always be zero. - // goobj2.Reloc.Type() + typ is always the right type, for both Go and external + // goobj.Reloc.Type() + typ is always the right type, for both Go and external // symbols. typ objabi.RelocType } func (rel Reloc) Type() objabi.RelocType { return objabi.RelocType(rel.Reloc.Type()) + rel.typ } func (rel Reloc) Sym() Sym { return rel.l.resolve(rel.r, rel.Reloc.Sym()) } -func (rel Reloc) SetSym(s Sym) { rel.Reloc.SetSym(goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(s)}) } +func (rel Reloc) SetSym(s Sym) { rel.Reloc.SetSym(goobj.SymRef{PkgIdx: 0, SymIdx: uint32(s)}) } func (rel Reloc) SetType(t objabi.RelocType) { if t != objabi.RelocType(uint8(t)) { @@ -78,7 +78,7 @@ func (rel Reloc) SetType(t objabi.RelocType) { // Aux holds a "handle" to access an aux symbol record from an // object file. type Aux struct { - *goobj2.Aux + *goobj.Aux r *oReader l *Loader } @@ -88,15 +88,15 @@ func (a Aux) Sym() Sym { return a.l.resolve(a.r, a.Aux.Sym()) } // oReader is a wrapper type of obj.Reader, along with some // extra information. type oReader struct { - *goobj2.Reader + *goobj.Reader unit *sym.CompilationUnit version int // version of static symbol flags uint32 // read from object file pkgprefix string syms []Sym // Sym's global index, indexed by local index - ndef int // cache goobj2.Reader.NSym() - nhashed64def int // cache goobj2.Reader.NHashed64Def() - nhasheddef int // cache goobj2.Reader.NHashedDef() + ndef int // cache goobj.Reader.NSym() + nhashed64def int // cache goobj.Reader.NHashed64Def() + nhasheddef int // cache goobj.Reader.NHashedDef() objidx uint32 // index of this reader in the objs slice } @@ -311,10 +311,10 @@ type extSymPayload struct { ver int kind sym.SymKind objidx uint32 // index of original object if sym made by cloneToExternal - relocs []goobj2.Reloc + relocs []goobj.Reloc reltypes []objabi.RelocType // relocation types data []byte - auxs []goobj2.Aux + auxs []goobj.Aux } const ( @@ -323,7 +323,7 @@ const ( ) func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorReporter) *Loader { - nbuiltin := goobj2.NBuiltin() + nbuiltin := goobj.NBuiltin() extReader := &oReader{objidx: extObj} ldr := &Loader{ start: make(map[*oReader]Sym), @@ -383,7 +383,7 @@ func (l *Loader) addObj(pkg string, r *oReader) Sym { // Add a symbol from an object file, return the global index. // If the symbol already exist, it returns the index of that symbol. -func (st *loadState) addSym(name string, ver int, r *oReader, li uint32, kind int, osym *goobj2.Sym) Sym { +func (st *loadState) addSym(name string, ver int, r *oReader, li uint32, kind int, osym *goobj.Sym) Sym { l := st.l if l.extStart != 0 { panic("addSym called after external symbol is created") @@ -420,8 +420,8 @@ func (st *loadState) addSym(name string, ver int, r *oReader, li uint32, kind in // check, as same hash indicates same content. var checkHash func() (symAndSize, bool) var addToHashMap func(symAndSize) - var h64 uint64 // only used for hashed64Def - var h *goobj2.HashType // only used for hashedDef + var h64 uint64 // only used for hashed64Def + var h *goobj.HashType // only used for hashedDef if kind == hashed64Def { checkHash = func() (symAndSize, bool) { h64 = r.Hash64(li - uint32(r.ndef)) @@ -607,10 +607,10 @@ func (l *Loader) toLocal(i Sym) (*oReader, uint32) { } // Resolve a local symbol reference. Return global index. -func (l *Loader) resolve(r *oReader, s goobj2.SymRef) Sym { +func (l *Loader) resolve(r *oReader, s goobj.SymRef) Sym { var rr *oReader switch p := s.PkgIdx; p { - case goobj2.PkgIdxInvalid: + case goobj.PkgIdxInvalid: // {0, X} with non-zero X is never a valid sym reference from a Go object. // We steal this space for symbol references from external objects. // In this case, X is just the global index. @@ -621,18 +621,18 @@ func (l *Loader) resolve(r *oReader, s goobj2.SymRef) Sym { panic("bad sym ref") } return 0 - case goobj2.PkgIdxHashed64: + case goobj.PkgIdxHashed64: i := int(s.SymIdx) + r.ndef return r.syms[i] - case goobj2.PkgIdxHashed: + case goobj.PkgIdxHashed: i := int(s.SymIdx) + r.ndef + r.nhashed64def return r.syms[i] - case goobj2.PkgIdxNone: + case goobj.PkgIdxNone: i := int(s.SymIdx) + r.ndef + r.nhashed64def + r.nhasheddef return r.syms[i] - case goobj2.PkgIdxBuiltin: + case goobj.PkgIdxBuiltin: return l.builtinSyms[s.SymIdx] - case goobj2.PkgIdxSelf: + case goobj.PkgIdxSelf: rr = r default: pkg := r.Pkg(int(p)) @@ -1143,22 +1143,22 @@ func (l *Loader) AttrSubSymbol(i Sym) bool { // Returns whether the i-th symbol has ReflectMethod attribute set. func (l *Loader) IsReflectMethod(i Sym) bool { - return l.SymAttr(i)&goobj2.SymFlagReflectMethod != 0 + return l.SymAttr(i)&goobj.SymFlagReflectMethod != 0 } // Returns whether the i-th symbol is nosplit. func (l *Loader) IsNoSplit(i Sym) bool { - return l.SymAttr(i)&goobj2.SymFlagNoSplit != 0 + return l.SymAttr(i)&goobj.SymFlagNoSplit != 0 } // Returns whether this is a Go type symbol. func (l *Loader) IsGoType(i Sym) bool { - return l.SymAttr(i)&goobj2.SymFlagGoType != 0 + return l.SymAttr(i)&goobj.SymFlagGoType != 0 } // Returns whether this symbol should be included in typelink. func (l *Loader) IsTypelink(i Sym) bool { - return l.SymAttr(i)&goobj2.SymFlagTypelink != 0 + return l.SymAttr(i)&goobj.SymFlagTypelink != 0 } // Returns whether this symbol is an itab symbol. @@ -1503,7 +1503,7 @@ func (l *Loader) DynidSyms() []Sym { // if it helps speed things up). func (l *Loader) SymGoType(i Sym) Sym { var r *oReader - var auxs []goobj2.Aux + var auxs []goobj.Aux if l.IsExternal(i) { pp := l.getPayload(i) r = l.objs[pp.objidx].r @@ -1516,7 +1516,7 @@ func (l *Loader) SymGoType(i Sym) Sym { for j := range auxs { a := &auxs[j] switch a.Type() { - case goobj2.AuxGotype: + case goobj.AuxGotype: return l.resolve(r, a.Sym()) } } @@ -1629,22 +1629,22 @@ func (l *Loader) GetFuncDwarfAuxSyms(fnSymIdx Sym) (auxDwarfInfo, auxDwarfLoc, a for i := range auxs { a := &auxs[i] switch a.Type() { - case goobj2.AuxDwarfInfo: + case goobj.AuxDwarfInfo: auxDwarfInfo = l.resolve(r, a.Sym()) if l.SymType(auxDwarfInfo) != sym.SDWARFFCN { panic("aux dwarf info sym with wrong type") } - case goobj2.AuxDwarfLoc: + case goobj.AuxDwarfLoc: auxDwarfLoc = l.resolve(r, a.Sym()) if l.SymType(auxDwarfLoc) != sym.SDWARFLOC { panic("aux dwarf loc sym with wrong type") } - case goobj2.AuxDwarfRanges: + case goobj.AuxDwarfRanges: auxDwarfRanges = l.resolve(r, a.Sym()) if l.SymType(auxDwarfRanges) != sym.SDWARFRANGE { panic("aux dwarf ranges sym with wrong type") } - case goobj2.AuxDwarfLines: + case goobj.AuxDwarfLines: auxDwarfLines = l.resolve(r, a.Sym()) if l.SymType(auxDwarfLines) != sym.SDWARFLINES { panic("aux dwarf lines sym with wrong type") @@ -1840,7 +1840,7 @@ func (l *Loader) Relocs(i Sym) Relocs { // Relocs returns a Relocs object given a local sym index and reader. func (l *Loader) relocs(r *oReader, li uint32) Relocs { - var rs []goobj2.Reloc + var rs []goobj.Reloc if l.isExtReader(r) { pp := l.payloads[li] rs = pp.relocs @@ -1855,55 +1855,55 @@ func (l *Loader) relocs(r *oReader, li uint32) Relocs { } } -// FuncInfo provides hooks to access goobj2.FuncInfo in the objects. +// FuncInfo provides hooks to access goobj.FuncInfo in the objects. type FuncInfo struct { l *Loader r *oReader data []byte - auxs []goobj2.Aux - lengths goobj2.FuncInfoLengths + auxs []goobj.Aux + lengths goobj.FuncInfoLengths } func (fi *FuncInfo) Valid() bool { return fi.r != nil } func (fi *FuncInfo) Args() int { - return int((*goobj2.FuncInfo)(nil).ReadArgs(fi.data)) + return int((*goobj.FuncInfo)(nil).ReadArgs(fi.data)) } func (fi *FuncInfo) Locals() int { - return int((*goobj2.FuncInfo)(nil).ReadLocals(fi.data)) + return int((*goobj.FuncInfo)(nil).ReadLocals(fi.data)) } func (fi *FuncInfo) FuncID() objabi.FuncID { - return objabi.FuncID((*goobj2.FuncInfo)(nil).ReadFuncID(fi.data)) + return objabi.FuncID((*goobj.FuncInfo)(nil).ReadFuncID(fi.data)) } func (fi *FuncInfo) Pcsp() []byte { - pcsp, end := (*goobj2.FuncInfo)(nil).ReadPcsp(fi.data) + pcsp, end := (*goobj.FuncInfo)(nil).ReadPcsp(fi.data) return fi.r.BytesAt(fi.r.PcdataBase()+pcsp, int(end-pcsp)) } func (fi *FuncInfo) Pcfile() []byte { - pcf, end := (*goobj2.FuncInfo)(nil).ReadPcfile(fi.data) + pcf, end := (*goobj.FuncInfo)(nil).ReadPcfile(fi.data) return fi.r.BytesAt(fi.r.PcdataBase()+pcf, int(end-pcf)) } func (fi *FuncInfo) Pcline() []byte { - pcln, end := (*goobj2.FuncInfo)(nil).ReadPcline(fi.data) + pcln, end := (*goobj.FuncInfo)(nil).ReadPcline(fi.data) return fi.r.BytesAt(fi.r.PcdataBase()+pcln, int(end-pcln)) } // Preload has to be called prior to invoking the various methods // below related to pcdata, funcdataoff, files, and inltree nodes. func (fi *FuncInfo) Preload() { - fi.lengths = (*goobj2.FuncInfo)(nil).ReadFuncInfoLengths(fi.data) + fi.lengths = (*goobj.FuncInfo)(nil).ReadFuncInfoLengths(fi.data) } func (fi *FuncInfo) Pcinline() []byte { if !fi.lengths.Initialized { panic("need to call Preload first") } - pcinl, end := (*goobj2.FuncInfo)(nil).ReadPcinline(fi.data, fi.lengths.PcdataOff) + pcinl, end := (*goobj.FuncInfo)(nil).ReadPcinline(fi.data, fi.lengths.PcdataOff) return fi.r.BytesAt(fi.r.PcdataBase()+pcinl, int(end-pcinl)) } @@ -1918,7 +1918,7 @@ func (fi *FuncInfo) Pcdata(k int) []byte { if !fi.lengths.Initialized { panic("need to call Preload first") } - pcdat, end := (*goobj2.FuncInfo)(nil).ReadPcdata(fi.data, fi.lengths.PcdataOff, uint32(k)) + pcdat, end := (*goobj.FuncInfo)(nil).ReadPcdata(fi.data, fi.lengths.PcdataOff, uint32(k)) return fi.r.BytesAt(fi.r.PcdataBase()+pcdat, int(end-pcdat)) } @@ -1933,7 +1933,7 @@ func (fi *FuncInfo) Funcdataoff(k int) int64 { if !fi.lengths.Initialized { panic("need to call Preload first") } - return (*goobj2.FuncInfo)(nil).ReadFuncdataoff(fi.data, fi.lengths.FuncdataoffOff, uint32(k)) + return (*goobj.FuncInfo)(nil).ReadFuncdataoff(fi.data, fi.lengths.FuncdataoffOff, uint32(k)) } func (fi *FuncInfo) Funcdata(syms []Sym) []Sym { @@ -1947,7 +1947,7 @@ func (fi *FuncInfo) Funcdata(syms []Sym) []Sym { } for j := range fi.auxs { a := &fi.auxs[j] - if a.Type() == goobj2.AuxFuncdata { + if a.Type() == goobj.AuxFuncdata { syms = append(syms, fi.l.resolve(fi.r, a.Sym())) } } @@ -1961,16 +1961,16 @@ func (fi *FuncInfo) NumFile() uint32 { return fi.lengths.NumFile } -func (fi *FuncInfo) File(k int) goobj2.CUFileIndex { +func (fi *FuncInfo) File(k int) goobj.CUFileIndex { if !fi.lengths.Initialized { panic("need to call Preload first") } - return (*goobj2.FuncInfo)(nil).ReadFile(fi.data, fi.lengths.FileOff, uint32(k)) + return (*goobj.FuncInfo)(nil).ReadFile(fi.data, fi.lengths.FileOff, uint32(k)) } type InlTreeNode struct { Parent int32 - File goobj2.CUFileIndex + File goobj.CUFileIndex Line int32 Func Sym ParentPC int32 @@ -1987,7 +1987,7 @@ func (fi *FuncInfo) InlTree(k int) InlTreeNode { if !fi.lengths.Initialized { panic("need to call Preload first") } - node := (*goobj2.FuncInfo)(nil).ReadInlTree(fi.data, fi.lengths.InlTreeOff, uint32(k)) + node := (*goobj.FuncInfo)(nil).ReadInlTree(fi.data, fi.lengths.InlTreeOff, uint32(k)) return InlTreeNode{ Parent: node.Parent, File: node.File, @@ -1999,7 +1999,7 @@ func (fi *FuncInfo) InlTree(k int) InlTreeNode { func (l *Loader) FuncInfo(i Sym) FuncInfo { var r *oReader - var auxs []goobj2.Aux + var auxs []goobj.Aux if l.IsExternal(i) { pp := l.getPayload(i) if pp.objidx == 0 { @@ -2014,9 +2014,9 @@ func (l *Loader) FuncInfo(i Sym) FuncInfo { } for j := range auxs { a := &auxs[j] - if a.Type() == goobj2.AuxFuncInfo { + if a.Type() == goobj.AuxFuncInfo { b := r.Data(a.Sym().SymIdx) - return FuncInfo{l, r, b, auxs, goobj2.FuncInfoLengths{}} + return FuncInfo{l, r, b, auxs, goobj.FuncInfoLengths{}} } } return FuncInfo{} @@ -2026,12 +2026,12 @@ func (l *Loader) FuncInfo(i Sym) FuncInfo { // Does not add non-package symbols yet, which will be done in LoadNonpkgSyms. // Does not read symbol data. // Returns the fingerprint of the object. -func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, unit *sym.CompilationUnit, length int64) goobj2.FingerprintType { +func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, unit *sym.CompilationUnit, length int64) goobj.FingerprintType { roObject, readonly, err := f.Slice(uint64(length)) // TODO: no need to map blocks that are for tools only (e.g. RefName) if err != nil { log.Fatal("cannot read object file:", err) } - r := goobj2.NewReaderFromBytes(roObject, readonly) + r := goobj.NewReaderFromBytes(roObject, readonly) if r == nil { if len(roObject) >= 8 && bytes.Equal(roObject[:8], []byte("\x00go114ld")) { log.Fatalf("found object file %s in old format", f.File().Name()) @@ -2078,8 +2078,8 @@ func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, u // Holds the loader along with temporary states for loading symbols. type loadState struct { l *Loader - hashed64Syms map[uint64]symAndSize // short hashed (content-addressable) symbols, keyed by content hash - hashedSyms map[goobj2.HashType]symAndSize // hashed (content-addressable) symbols, keyed by content hash + hashed64Syms map[uint64]symAndSize // short hashed (content-addressable) symbols, keyed by content hash + hashedSyms map[goobj.HashType]symAndSize // hashed (content-addressable) symbols, keyed by content hash } // Preload symbols of given kind from an object. @@ -2139,7 +2139,7 @@ func (st *loadState) preloadSyms(r *oReader, kind int) { } if strings.HasPrefix(name, "runtime.") || (loadingRuntimePkg && strings.HasPrefix(name, "type.")) { - if bi := goobj2.BuiltinIdx(name, v); bi != -1 { + if bi := goobj.BuiltinIdx(name, v); bi != -1 { // This is a definition of a builtin symbol. Record where it is. l.builtinSyms[bi] = gi } @@ -2160,7 +2160,7 @@ func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { st := loadState{ l: l, hashed64Syms: make(map[uint64]symAndSize, 10000), - hashedSyms: make(map[goobj2.HashType]symAndSize, 15000), + hashedSyms: make(map[goobj.HashType]symAndSize, 15000), } for _, o := range l.objs[goObjStart:] { st.preloadSyms(o.r, hashed64Def) @@ -2199,7 +2199,7 @@ func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { for i, n := 0, r.NRefFlags(); i < n; i++ { rf := r.RefFlags(i) gi := l.resolve(r, rf.Sym()) - if rf.Flag2()&goobj2.SymFlagUsedInIface != 0 { + if rf.Flag2()&goobj.SymFlagUsedInIface != 0 { l.SetAttrUsedInIface(gi, true) } } @@ -2207,7 +2207,7 @@ func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { func abiToVer(abi uint16, localSymVersion int) int { var v int - if abi == goobj2.SymABIstatic { + if abi == goobj.SymABIstatic { // Static v = localSymVersion } else if abiver := sym.ABIToVersion(obj.ABI(abi)); abiver != -1 { @@ -2297,13 +2297,13 @@ func (l *Loader) cloneToExternal(symIdx Sym) { // Copy relocations relocs := l.Relocs(symIdx) - pp.relocs = make([]goobj2.Reloc, relocs.Count()) + pp.relocs = make([]goobj.Reloc, relocs.Count()) pp.reltypes = make([]objabi.RelocType, relocs.Count()) for i := range pp.relocs { // Copy the relocs slice. // Convert local reference to global reference. rel := relocs.At(i) - pp.relocs[i].Set(rel.Off(), rel.Siz(), 0, rel.Add(), goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(rel.Sym())}) + pp.relocs[i].Set(rel.Off(), rel.Siz(), 0, rel.Add(), goobj.SymRef{PkgIdx: 0, SymIdx: uint32(rel.Sym())}) pp.reltypes[i] = rel.Type() } diff --git a/src/cmd/link/internal/loader/loader_test.go b/src/cmd/link/internal/loader/loader_test.go index af66752f5c..1371c2a541 100644 --- a/src/cmd/link/internal/loader/loader_test.go +++ b/src/cmd/link/internal/loader/loader_test.go @@ -6,7 +6,7 @@ package loader import ( "bytes" - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/sym" @@ -22,7 +22,7 @@ import ( func addDummyObjSym(t *testing.T, ldr *Loader, or *oReader, name string) Sym { idx := uint32(len(ldr.objSyms)) st := loadState{l: ldr} - return st.addSym(name, 0, or, idx, nonPkgDef, &goobj2.Sym{}) + return st.addSym(name, 0, or, idx, nonPkgDef, &goobj.Sym{}) } func mkLoader() *Loader { @@ -237,7 +237,7 @@ func sameRelocSlice(s1 *Relocs, s2 []Reloc) bool { type addFunc func(l *Loader, s Sym, s2 Sym) Sym func mkReloc(l *Loader, typ objabi.RelocType, off int32, siz uint8, add int64, sym Sym) Reloc { - r := Reloc{&goobj2.Reloc{}, l.extReader, l, typ} + r := Reloc{&goobj.Reloc{}, l.extReader, l, typ} r.SetOff(off) r.SetSiz(siz) r.SetAdd(add) diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index d8b800f375..e14d89a927 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -5,7 +5,7 @@ package loader import ( - "cmd/internal/goobj2" + "cmd/internal/goobj" "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/sym" @@ -132,7 +132,7 @@ func (sb *SymbolBuilder) SetRelocType(i int, t objabi.RelocType) { // SetRelocSym sets the target sym of the 'i'-th relocation on this sym to 's' func (sb *SymbolBuilder) SetRelocSym(i int, tgt Sym) { - sb.relocs[i].SetSym(goobj2.SymRef{PkgIdx: 0, SymIdx: uint32(tgt)}) + sb.relocs[i].SetSym(goobj.SymRef{PkgIdx: 0, SymIdx: uint32(tgt)}) } // SetRelocAdd sets the addend of the 'i'-th relocation on this sym to 'a' @@ -142,7 +142,7 @@ func (sb *SymbolBuilder) SetRelocAdd(i int, a int64) { // Add n relocations, return a handle to the relocations. func (sb *SymbolBuilder) AddRelocs(n int) Relocs { - sb.relocs = append(sb.relocs, make([]goobj2.Reloc, n)...) + sb.relocs = append(sb.relocs, make([]goobj.Reloc, n)...) sb.reltypes = append(sb.reltypes, make([]objabi.RelocType, n)...) return sb.l.Relocs(sb.symIdx) } @@ -151,7 +151,7 @@ func (sb *SymbolBuilder) AddRelocs(n int) Relocs { // (to set other fields). func (sb *SymbolBuilder) AddRel(typ objabi.RelocType) (Reloc, int) { j := len(sb.relocs) - sb.relocs = append(sb.relocs, goobj2.Reloc{}) + sb.relocs = append(sb.relocs, goobj.Reloc{}) sb.reltypes = append(sb.reltypes, typ) relocs := sb.Relocs() return relocs.At(j), j diff --git a/src/cmd/link/internal/sym/library.go b/src/cmd/link/internal/sym/library.go index 7f6e63c020..876b5ff153 100644 --- a/src/cmd/link/internal/sym/library.go +++ b/src/cmd/link/internal/sym/library.go @@ -4,7 +4,7 @@ package sym -import "cmd/internal/goobj2" +import "cmd/internal/goobj" type Library struct { Objref string @@ -12,8 +12,8 @@ type Library struct { File string Pkg string Shlib string - Fingerprint goobj2.FingerprintType - Autolib []goobj2.ImportedPkg + Fingerprint goobj.FingerprintType + Autolib []goobj.ImportedPkg Imports []*Library Main bool Units []*CompilationUnit -- GitLab From 991adcd21b57b9d906021f972eb01534176ad493 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 11 Aug 2020 14:58:03 -0400 Subject: [PATCH 0148/1792] [dev.link] cmd/internal/obj: traverse files in deterministic order CL 245485 introduced a map for used files in a function. When numbering symbols, make sure we traverse the files in deterministic order. Should fix longtest builders. Change-Id: I1006bc5425116ab40e33a61e8f5acd1bdb4abad9 Reviewed-on: https://go-review.googlesource.com/c/go/+/247997 Run-TryBot: Cherry Zhang Reviewed-by: Than McIntosh TryBot-Result: Gobot Gobot --- src/cmd/internal/obj/sym.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index cf78849cda..34f61b7f62 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -368,7 +368,12 @@ func (ctxt *Link) traverseFuncAux(flag traverseFlag, fsym *LSym, fn func(parent } } files := ctxt.PosTable.FileTable() + usedFiles := make([]goobj.CUFileIndex, 0, len(pc.UsedFiles)) for f := range pc.UsedFiles { + usedFiles = append(usedFiles, f) + } + sort.Slice(usedFiles, func(i, j int) bool { return usedFiles[i] < usedFiles[j] }) + for _, f := range usedFiles { if filesym := ctxt.Lookup(files[f]); filesym != nil { fn(fsym, filesym) } -- GitLab From 3fc2e6b0ce77a94504b5e83c0ef4adb6d6fabbbc Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 11 Aug 2020 07:24:52 -0400 Subject: [PATCH 0149/1792] [dev.link] cmd/internal/obj: combine objfile.go and objfile2.go Combine objfile2.go into objfile.go. objfile.go has a lot of code for DWARF generation. Move them to dwarf.go. Change-Id: I2a27c672e9e9b8eea35d5e0a71433dcc80b7afa4 Reviewed-on: https://go-review.googlesource.com/c/go/+/247918 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/internal/obj/dwarf.go | 492 +++++++++++++ src/cmd/internal/obj/objfile.go | 1123 +++++++++++++++++------------- src/cmd/internal/obj/objfile2.go | 658 ----------------- 3 files changed, 1131 insertions(+), 1142 deletions(-) delete mode 100644 src/cmd/internal/obj/objfile2.go diff --git a/src/cmd/internal/obj/dwarf.go b/src/cmd/internal/obj/dwarf.go index 724aea2f8f..9abb31b558 100644 --- a/src/cmd/internal/obj/dwarf.go +++ b/src/cmd/internal/obj/dwarf.go @@ -8,8 +8,11 @@ package obj import ( "cmd/internal/dwarf" + "cmd/internal/objabi" "cmd/internal/src" "fmt" + "sort" + "sync" ) // Generate a sequence of opcodes that is as short as possible. @@ -196,3 +199,492 @@ func putpclcdelta(linkctxt *Link, dctxt dwCtxt, s *LSym, deltaPC uint64, deltaLC // Output the special opcode. dctxt.AddUint8(s, uint8(opcode)) } + +// implement dwarf.Context +type dwCtxt struct{ *Link } + +func (c dwCtxt) PtrSize() int { + return c.Arch.PtrSize +} +func (c dwCtxt) AddInt(s dwarf.Sym, size int, i int64) { + ls := s.(*LSym) + ls.WriteInt(c.Link, ls.Size, size, i) +} +func (c dwCtxt) AddUint16(s dwarf.Sym, i uint16) { + c.AddInt(s, 2, int64(i)) +} +func (c dwCtxt) AddUint8(s dwarf.Sym, i uint8) { + b := []byte{byte(i)} + c.AddBytes(s, b) +} +func (c dwCtxt) AddBytes(s dwarf.Sym, b []byte) { + ls := s.(*LSym) + ls.WriteBytes(c.Link, ls.Size, b) +} +func (c dwCtxt) AddString(s dwarf.Sym, v string) { + ls := s.(*LSym) + ls.WriteString(c.Link, ls.Size, len(v), v) + ls.WriteInt(c.Link, ls.Size, 1, 0) +} +func (c dwCtxt) AddAddress(s dwarf.Sym, data interface{}, value int64) { + ls := s.(*LSym) + size := c.PtrSize() + if data != nil { + rsym := data.(*LSym) + ls.WriteAddr(c.Link, ls.Size, size, rsym, value) + } else { + ls.WriteInt(c.Link, ls.Size, size, value) + } +} +func (c dwCtxt) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64) { + ls := s.(*LSym) + rsym := data.(*LSym) + ls.WriteCURelativeAddr(c.Link, ls.Size, rsym, value) +} +func (c dwCtxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64) { + panic("should be used only in the linker") +} +func (c dwCtxt) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64) { + size := 4 + if isDwarf64(c.Link) { + size = 8 + } + + ls := s.(*LSym) + rsym := t.(*LSym) + ls.WriteAddr(c.Link, ls.Size, size, rsym, ofs) + r := &ls.R[len(ls.R)-1] + r.Type = objabi.R_DWARFSECREF +} + +func (c dwCtxt) AddFileRef(s dwarf.Sym, f interface{}) { + ls := s.(*LSym) + rsym := f.(*LSym) + fidx := c.Link.PosTable.FileIndex(rsym.Name) + // Note the +1 here -- the value we're writing is going to be an + // index into the DWARF line table file section, whose entries + // are numbered starting at 1, not 0. + ls.WriteInt(c.Link, ls.Size, 4, int64(fidx+1)) +} + +func (c dwCtxt) CurrentOffset(s dwarf.Sym) int64 { + ls := s.(*LSym) + return ls.Size +} + +// Here "from" is a symbol corresponding to an inlined or concrete +// function, "to" is the symbol for the corresponding abstract +// function, and "dclIdx" is the index of the symbol of interest with +// respect to the Dcl slice of the original pre-optimization version +// of the inlined function. +func (c dwCtxt) RecordDclReference(from dwarf.Sym, to dwarf.Sym, dclIdx int, inlIndex int) { + ls := from.(*LSym) + tls := to.(*LSym) + ridx := len(ls.R) - 1 + c.Link.DwFixups.ReferenceChildDIE(ls, ridx, tls, dclIdx, inlIndex) +} + +func (c dwCtxt) RecordChildDieOffsets(s dwarf.Sym, vars []*dwarf.Var, offsets []int32) { + ls := s.(*LSym) + c.Link.DwFixups.RegisterChildDIEOffsets(ls, vars, offsets) +} + +func (c dwCtxt) Logf(format string, args ...interface{}) { + c.Link.Logf(format, args...) +} + +func isDwarf64(ctxt *Link) bool { + return ctxt.Headtype == objabi.Haix +} + +func (ctxt *Link) dwarfSym(s *LSym) (dwarfInfoSym, dwarfLocSym, dwarfRangesSym, dwarfAbsFnSym, dwarfDebugLines *LSym) { + if s.Type != objabi.STEXT { + ctxt.Diag("dwarfSym of non-TEXT %v", s) + } + if s.Func.dwarfInfoSym == nil { + s.Func.dwarfInfoSym = &LSym{ + Type: objabi.SDWARFFCN, + } + if ctxt.Flag_locationlists { + s.Func.dwarfLocSym = &LSym{ + Type: objabi.SDWARFLOC, + } + } + s.Func.dwarfRangesSym = &LSym{ + Type: objabi.SDWARFRANGE, + } + s.Func.dwarfDebugLinesSym = &LSym{ + Type: objabi.SDWARFLINES, + } + if s.WasInlined() { + s.Func.dwarfAbsFnSym = ctxt.DwFixups.AbsFuncDwarfSym(s) + } + } + return s.Func.dwarfInfoSym, s.Func.dwarfLocSym, s.Func.dwarfRangesSym, s.Func.dwarfAbsFnSym, s.Func.dwarfDebugLinesSym +} + +func (s *LSym) Length(dwarfContext interface{}) int64 { + return s.Size +} + +// fileSymbol returns a symbol corresponding to the source file of the +// first instruction (prog) of the specified function. This will +// presumably be the file in which the function is defined. +func (ctxt *Link) fileSymbol(fn *LSym) *LSym { + p := fn.Func.Text + if p != nil { + f, _ := linkgetlineFromPos(ctxt, p.Pos) + fsym := ctxt.Lookup(f) + return fsym + } + return nil +} + +// populateDWARF fills in the DWARF Debugging Information Entries for +// TEXT symbol 's'. The various DWARF symbols must already have been +// initialized in InitTextSym. +func (ctxt *Link) populateDWARF(curfn interface{}, s *LSym, myimportpath string) { + info, loc, ranges, absfunc, lines := ctxt.dwarfSym(s) + if info.Size != 0 { + ctxt.Diag("makeFuncDebugEntry double process %v", s) + } + var scopes []dwarf.Scope + var inlcalls dwarf.InlCalls + if ctxt.DebugInfo != nil { + scopes, inlcalls = ctxt.DebugInfo(s, info, curfn) + } + var err error + dwctxt := dwCtxt{ctxt} + filesym := ctxt.fileSymbol(s) + fnstate := &dwarf.FnState{ + Name: s.Name, + Importpath: myimportpath, + Info: info, + Filesym: filesym, + Loc: loc, + Ranges: ranges, + Absfn: absfunc, + StartPC: s, + Size: s.Size, + External: !s.Static(), + Scopes: scopes, + InlCalls: inlcalls, + UseBASEntries: ctxt.UseBASEntries, + } + if absfunc != nil { + err = dwarf.PutAbstractFunc(dwctxt, fnstate) + if err != nil { + ctxt.Diag("emitting DWARF for %s failed: %v", s.Name, err) + } + err = dwarf.PutConcreteFunc(dwctxt, fnstate) + } else { + err = dwarf.PutDefaultFunc(dwctxt, fnstate) + } + if err != nil { + ctxt.Diag("emitting DWARF for %s failed: %v", s.Name, err) + } + // Fill in the debug lines symbol. + ctxt.generateDebugLinesSymbol(s, lines) +} + +// DwarfIntConst creates a link symbol for an integer constant with the +// given name, type and value. +func (ctxt *Link) DwarfIntConst(myimportpath, name, typename string, val int64) { + if myimportpath == "" { + return + } + s := ctxt.LookupInit(dwarf.ConstInfoPrefix+myimportpath, func(s *LSym) { + s.Type = objabi.SDWARFCONST + ctxt.Data = append(ctxt.Data, s) + }) + dwarf.PutIntConst(dwCtxt{ctxt}, s, ctxt.Lookup(dwarf.InfoPrefix+typename), myimportpath+"."+name, val) +} + +func (ctxt *Link) DwarfAbstractFunc(curfn interface{}, s *LSym, myimportpath string) { + absfn := ctxt.DwFixups.AbsFuncDwarfSym(s) + if absfn.Size != 0 { + ctxt.Diag("internal error: DwarfAbstractFunc double process %v", s) + } + if s.Func == nil { + s.Func = new(FuncInfo) + } + scopes, _ := ctxt.DebugInfo(s, absfn, curfn) + dwctxt := dwCtxt{ctxt} + filesym := ctxt.fileSymbol(s) + fnstate := dwarf.FnState{ + Name: s.Name, + Importpath: myimportpath, + Info: absfn, + Filesym: filesym, + Absfn: absfn, + External: !s.Static(), + Scopes: scopes, + UseBASEntries: ctxt.UseBASEntries, + } + if err := dwarf.PutAbstractFunc(dwctxt, &fnstate); err != nil { + ctxt.Diag("emitting DWARF for %s failed: %v", s.Name, err) + } +} + +// This table is designed to aid in the creation of references between +// DWARF subprogram DIEs. +// +// In most cases when one DWARF DIE has to refer to another DWARF DIE, +// the target of the reference has an LSym, which makes it easy to use +// the existing relocation mechanism. For DWARF inlined routine DIEs, +// however, the subprogram DIE has to refer to a child +// parameter/variable DIE of the abstract subprogram. This child DIE +// doesn't have an LSym, and also of interest is the fact that when +// DWARF generation is happening for inlined function F within caller +// G, it's possible that DWARF generation hasn't happened yet for F, +// so there is no way to know the offset of a child DIE within F's +// abstract function. Making matters more complex, each inlined +// instance of F may refer to a subset of the original F's variables +// (depending on what happens with optimization, some vars may be +// eliminated). +// +// The fixup table below helps overcome this hurdle. At the point +// where a parameter/variable reference is made (via a call to +// "ReferenceChildDIE"), a fixup record is generate that records +// the relocation that is targeting that child variable. At a later +// point when the abstract function DIE is emitted, there will be +// a call to "RegisterChildDIEOffsets", at which point the offsets +// needed to apply fixups are captured. Finally, once the parallel +// portion of the compilation is done, fixups can actually be applied +// during the "Finalize" method (this can't be done during the +// parallel portion of the compile due to the possibility of data +// races). +// +// This table is also used to record the "precursor" function node for +// each function that is the target of an inline -- child DIE references +// have to be made with respect to the original pre-optimization +// version of the function (to allow for the fact that each inlined +// body may be optimized differently). +type DwarfFixupTable struct { + ctxt *Link + mu sync.Mutex + symtab map[*LSym]int // maps abstract fn LSYM to index in svec + svec []symFixups + precursor map[*LSym]fnState // maps fn Lsym to precursor Node, absfn sym +} + +type symFixups struct { + fixups []relFixup + doffsets []declOffset + inlIndex int32 + defseen bool +} + +type declOffset struct { + // Index of variable within DCL list of pre-optimization function + dclIdx int32 + // Offset of var's child DIE with respect to containing subprogram DIE + offset int32 +} + +type relFixup struct { + refsym *LSym + relidx int32 + dclidx int32 +} + +type fnState struct { + // precursor function (really *gc.Node) + precursor interface{} + // abstract function symbol + absfn *LSym +} + +func NewDwarfFixupTable(ctxt *Link) *DwarfFixupTable { + return &DwarfFixupTable{ + ctxt: ctxt, + symtab: make(map[*LSym]int), + precursor: make(map[*LSym]fnState), + } +} + +func (ft *DwarfFixupTable) GetPrecursorFunc(s *LSym) interface{} { + if fnstate, found := ft.precursor[s]; found { + return fnstate.precursor + } + return nil +} + +func (ft *DwarfFixupTable) SetPrecursorFunc(s *LSym, fn interface{}) { + if _, found := ft.precursor[s]; found { + ft.ctxt.Diag("internal error: DwarfFixupTable.SetPrecursorFunc double call on %v", s) + } + + // initialize abstract function symbol now. This is done here so + // as to avoid data races later on during the parallel portion of + // the back end. + absfn := ft.ctxt.LookupDerived(s, dwarf.InfoPrefix+s.Name+dwarf.AbstractFuncSuffix) + absfn.Set(AttrDuplicateOK, true) + absfn.Type = objabi.SDWARFABSFCN + ft.ctxt.Data = append(ft.ctxt.Data, absfn) + + // In the case of "late" inlining (inlines that happen during + // wrapper generation as opposed to the main inlining phase) it's + // possible that we didn't cache the abstract function sym for the + // text symbol -- do so now if needed. See issue 38068. + if s.Func != nil && s.Func.dwarfAbsFnSym == nil { + s.Func.dwarfAbsFnSym = absfn + } + + ft.precursor[s] = fnState{precursor: fn, absfn: absfn} +} + +// Make a note of a child DIE reference: relocation 'ridx' within symbol 's' +// is targeting child 'c' of DIE with symbol 'tgt'. +func (ft *DwarfFixupTable) ReferenceChildDIE(s *LSym, ridx int, tgt *LSym, dclidx int, inlIndex int) { + // Protect against concurrent access if multiple backend workers + ft.mu.Lock() + defer ft.mu.Unlock() + + // Create entry for symbol if not already present. + idx, found := ft.symtab[tgt] + if !found { + ft.svec = append(ft.svec, symFixups{inlIndex: int32(inlIndex)}) + idx = len(ft.svec) - 1 + ft.symtab[tgt] = idx + } + + // Do we have child DIE offsets available? If so, then apply them, + // otherwise create a fixup record. + sf := &ft.svec[idx] + if len(sf.doffsets) > 0 { + found := false + for _, do := range sf.doffsets { + if do.dclIdx == int32(dclidx) { + off := do.offset + s.R[ridx].Add += int64(off) + found = true + break + } + } + if !found { + ft.ctxt.Diag("internal error: DwarfFixupTable.ReferenceChildDIE unable to locate child DIE offset for dclIdx=%d src=%v tgt=%v", dclidx, s, tgt) + } + } else { + sf.fixups = append(sf.fixups, relFixup{s, int32(ridx), int32(dclidx)}) + } +} + +// Called once DWARF generation is complete for a given abstract function, +// whose children might have been referenced via a call above. Stores +// the offsets for any child DIEs (vars, params) so that they can be +// consumed later in on DwarfFixupTable.Finalize, which applies any +// outstanding fixups. +func (ft *DwarfFixupTable) RegisterChildDIEOffsets(s *LSym, vars []*dwarf.Var, coffsets []int32) { + // Length of these two slices should agree + if len(vars) != len(coffsets) { + ft.ctxt.Diag("internal error: RegisterChildDIEOffsets vars/offsets length mismatch") + return + } + + // Generate the slice of declOffset's based in vars/coffsets + doffsets := make([]declOffset, len(coffsets)) + for i := range coffsets { + doffsets[i].dclIdx = vars[i].ChildIndex + doffsets[i].offset = coffsets[i] + } + + ft.mu.Lock() + defer ft.mu.Unlock() + + // Store offsets for this symbol. + idx, found := ft.symtab[s] + if !found { + sf := symFixups{inlIndex: -1, defseen: true, doffsets: doffsets} + ft.svec = append(ft.svec, sf) + ft.symtab[s] = len(ft.svec) - 1 + } else { + sf := &ft.svec[idx] + sf.doffsets = doffsets + sf.defseen = true + } +} + +func (ft *DwarfFixupTable) processFixups(slot int, s *LSym) { + sf := &ft.svec[slot] + for _, f := range sf.fixups { + dfound := false + for _, doffset := range sf.doffsets { + if doffset.dclIdx == f.dclidx { + f.refsym.R[f.relidx].Add += int64(doffset.offset) + dfound = true + break + } + } + if !dfound { + ft.ctxt.Diag("internal error: DwarfFixupTable has orphaned fixup on %v targeting %v relidx=%d dclidx=%d", f.refsym, s, f.relidx, f.dclidx) + } + } +} + +// return the LSym corresponding to the 'abstract subprogram' DWARF +// info entry for a function. +func (ft *DwarfFixupTable) AbsFuncDwarfSym(fnsym *LSym) *LSym { + // Protect against concurrent access if multiple backend workers + ft.mu.Lock() + defer ft.mu.Unlock() + + if fnstate, found := ft.precursor[fnsym]; found { + return fnstate.absfn + } + ft.ctxt.Diag("internal error: AbsFuncDwarfSym requested for %v, not seen during inlining", fnsym) + return nil +} + +// Called after all functions have been compiled; the main job of this +// function is to identify cases where there are outstanding fixups. +// This scenario crops up when we have references to variables of an +// inlined routine, but that routine is defined in some other package. +// This helper walks through and locate these fixups, then invokes a +// helper to create an abstract subprogram DIE for each one. +func (ft *DwarfFixupTable) Finalize(myimportpath string, trace bool) { + if trace { + ft.ctxt.Logf("DwarfFixupTable.Finalize invoked for %s\n", myimportpath) + } + + // Collect up the keys from the precursor map, then sort the + // resulting list (don't want to rely on map ordering here). + fns := make([]*LSym, len(ft.precursor)) + idx := 0 + for fn := range ft.precursor { + fns[idx] = fn + idx++ + } + sort.Sort(BySymName(fns)) + + // Should not be called during parallel portion of compilation. + if ft.ctxt.InParallel { + ft.ctxt.Diag("internal error: DwarfFixupTable.Finalize call during parallel backend") + } + + // Generate any missing abstract functions. + for _, s := range fns { + absfn := ft.AbsFuncDwarfSym(s) + slot, found := ft.symtab[absfn] + if !found || !ft.svec[slot].defseen { + ft.ctxt.GenAbstractFunc(s) + } + } + + // Apply fixups. + for _, s := range fns { + absfn := ft.AbsFuncDwarfSym(s) + slot, found := ft.symtab[absfn] + if !found { + ft.ctxt.Diag("internal error: DwarfFixupTable.Finalize orphan abstract function for %v", s) + } else { + ft.processFixups(slot, s) + } + } +} + +type BySymName []*LSym + +func (s BySymName) Len() int { return len(s) } +func (s BySymName) Less(i, j int) bool { return s[i].Name < s[j].Name } +func (s BySymName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 2f28b6eeec..7bc4f4992e 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -2,591 +2,746 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Writing Go object files. + package obj import ( - "cmd/internal/dwarf" + "bytes" + "cmd/internal/bio" + "cmd/internal/goobj" "cmd/internal/objabi" "cmd/internal/sys" + "crypto/sha1" + "encoding/binary" "fmt" "io" + "path/filepath" "sort" - "sync" + "strings" ) -func (ctxt *Link) writeSymDebug(s *LSym) { - ctxt.writeSymDebugNamed(s, s.Name) -} +// Entry point of writing new object file. +func WriteObjFile(ctxt *Link, b *bio.Writer) { -func (ctxt *Link) writeSymDebugNamed(s *LSym, name string) { - fmt.Fprintf(ctxt.Bso, "%s ", name) - if s.Type != 0 { - fmt.Fprintf(ctxt.Bso, "%v ", s.Type) - } - if s.Static() { - fmt.Fprint(ctxt.Bso, "static ") - } - if s.DuplicateOK() { - fmt.Fprintf(ctxt.Bso, "dupok ") + debugAsmEmit(ctxt) + + genFuncInfoSyms(ctxt) + + w := writer{ + Writer: goobj.NewWriter(b), + ctxt: ctxt, + pkgpath: objabi.PathToPrefix(ctxt.Pkgpath), } - if s.CFunc() { - fmt.Fprintf(ctxt.Bso, "cfunc ") + + start := b.Offset() + w.init() + + // Header + // We just reserve the space. We'll fill in the offsets later. + flags := uint32(0) + if ctxt.Flag_shared { + flags |= goobj.ObjFlagShared } - if s.NoSplit() { - fmt.Fprintf(ctxt.Bso, "nosplit ") + if w.pkgpath == "" { + flags |= goobj.ObjFlagNeedNameExpansion } - if s.TopFrame() { - fmt.Fprintf(ctxt.Bso, "topframe ") + if ctxt.IsAsm { + flags |= goobj.ObjFlagFromAssembly } - fmt.Fprintf(ctxt.Bso, "size=%d", s.Size) - if s.Type == objabi.STEXT { - fmt.Fprintf(ctxt.Bso, " args=%#x locals=%#x funcid=%#x", uint64(s.Func.Args), uint64(s.Func.Locals), uint64(s.Func.FuncID)) - if s.Leaf() { - fmt.Fprintf(ctxt.Bso, " leaf") - } + h := goobj.Header{ + Magic: goobj.Magic, + Fingerprint: ctxt.Fingerprint, + Flags: flags, } - fmt.Fprintf(ctxt.Bso, "\n") - if s.Type == objabi.STEXT { - for p := s.Func.Text; p != nil; p = p.Link { - fmt.Fprintf(ctxt.Bso, "\t%#04x ", uint(int(p.Pc))) - if ctxt.Debugasm > 1 { - io.WriteString(ctxt.Bso, p.String()) - } else { - p.InnermostString(ctxt.Bso) - } - fmt.Fprintln(ctxt.Bso) - } - } - for i := 0; i < len(s.P); i += 16 { - fmt.Fprintf(ctxt.Bso, "\t%#04x", uint(i)) - j := i - for ; j < i+16 && j < len(s.P); j++ { - fmt.Fprintf(ctxt.Bso, " %02x", s.P[j]) - } - for ; j < i+16; j++ { - fmt.Fprintf(ctxt.Bso, " ") - } - fmt.Fprintf(ctxt.Bso, " ") - for j = i; j < i+16 && j < len(s.P); j++ { - c := int(s.P[j]) - b := byte('.') - if ' ' <= c && c <= 0x7e { - b = byte(c) - } - ctxt.Bso.WriteByte(b) - } + h.Write(w.Writer) - fmt.Fprintf(ctxt.Bso, "\n") - } + // String table + w.StringTable() - sort.Sort(relocByOff(s.R)) // generate stable output - for _, r := range s.R { - name := "" - if r.Sym != nil { - name = r.Sym.Name - } else if r.Type == objabi.R_TLS_LE { - name = "TLS" - } - if ctxt.Arch.InFamily(sys.ARM, sys.PPC64) { - fmt.Fprintf(ctxt.Bso, "\trel %d+%d t=%d %s+%x\n", int(r.Off), r.Siz, r.Type, name, uint64(r.Add)) - } else { - fmt.Fprintf(ctxt.Bso, "\trel %d+%d t=%d %s+%d\n", int(r.Off), r.Siz, r.Type, name, r.Add) - } + // Autolib + h.Offsets[goobj.BlkAutolib] = w.Offset() + for i := range ctxt.Imports { + ctxt.Imports[i].Write(w.Writer) } -} -// relocByOff sorts relocations by their offsets. -type relocByOff []Reloc - -func (x relocByOff) Len() int { return len(x) } -func (x relocByOff) Less(i, j int) bool { return x[i].Off < x[j].Off } -func (x relocByOff) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -// implement dwarf.Context -type dwCtxt struct{ *Link } + // Package references + h.Offsets[goobj.BlkPkgIdx] = w.Offset() + for _, pkg := range w.pkglist { + w.StringRef(pkg) + } -func (c dwCtxt) PtrSize() int { - return c.Arch.PtrSize -} -func (c dwCtxt) AddInt(s dwarf.Sym, size int, i int64) { - ls := s.(*LSym) - ls.WriteInt(c.Link, ls.Size, size, i) -} -func (c dwCtxt) AddUint16(s dwarf.Sym, i uint16) { - c.AddInt(s, 2, int64(i)) -} -func (c dwCtxt) AddUint8(s dwarf.Sym, i uint8) { - b := []byte{byte(i)} - c.AddBytes(s, b) -} -func (c dwCtxt) AddBytes(s dwarf.Sym, b []byte) { - ls := s.(*LSym) - ls.WriteBytes(c.Link, ls.Size, b) -} -func (c dwCtxt) AddString(s dwarf.Sym, v string) { - ls := s.(*LSym) - ls.WriteString(c.Link, ls.Size, len(v), v) - ls.WriteInt(c.Link, ls.Size, 1, 0) -} -func (c dwCtxt) AddAddress(s dwarf.Sym, data interface{}, value int64) { - ls := s.(*LSym) - size := c.PtrSize() - if data != nil { - rsym := data.(*LSym) - ls.WriteAddr(c.Link, ls.Size, size, rsym, value) - } else { - ls.WriteInt(c.Link, ls.Size, size, value) + // File table (for DWARF and pcln generation). + h.Offsets[goobj.BlkFile] = w.Offset() + for _, f := range ctxt.PosTable.FileTable() { + w.StringRef(filepath.ToSlash(f)) } -} -func (c dwCtxt) AddCURelativeAddress(s dwarf.Sym, data interface{}, value int64) { - ls := s.(*LSym) - rsym := data.(*LSym) - ls.WriteCURelativeAddr(c.Link, ls.Size, rsym, value) -} -func (c dwCtxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64) { - panic("should be used only in the linker") -} -func (c dwCtxt) AddDWARFAddrSectionOffset(s dwarf.Sym, t interface{}, ofs int64) { - size := 4 - if isDwarf64(c.Link) { - size = 8 + + // Symbol definitions + h.Offsets[goobj.BlkSymdef] = w.Offset() + for _, s := range ctxt.defs { + w.Sym(s) } - ls := s.(*LSym) - rsym := t.(*LSym) - ls.WriteAddr(c.Link, ls.Size, size, rsym, ofs) - r := &ls.R[len(ls.R)-1] - r.Type = objabi.R_DWARFSECREF -} + // Short hashed symbol definitions + h.Offsets[goobj.BlkHashed64def] = w.Offset() + for _, s := range ctxt.hashed64defs { + w.Sym(s) + } -func (c dwCtxt) AddFileRef(s dwarf.Sym, f interface{}) { - ls := s.(*LSym) - rsym := f.(*LSym) - fidx := c.Link.PosTable.FileIndex(rsym.Name) - // Note the +1 here -- the value we're writing is going to be an - // index into the DWARF line table file section, whose entries - // are numbered starting at 1, not 0. - ls.WriteInt(c.Link, ls.Size, 4, int64(fidx+1)) -} + // Hashed symbol definitions + h.Offsets[goobj.BlkHasheddef] = w.Offset() + for _, s := range ctxt.hasheddefs { + w.Sym(s) + } -func (c dwCtxt) CurrentOffset(s dwarf.Sym) int64 { - ls := s.(*LSym) - return ls.Size -} + // Non-pkg symbol definitions + h.Offsets[goobj.BlkNonpkgdef] = w.Offset() + for _, s := range ctxt.nonpkgdefs { + w.Sym(s) + } -// Here "from" is a symbol corresponding to an inlined or concrete -// function, "to" is the symbol for the corresponding abstract -// function, and "dclIdx" is the index of the symbol of interest with -// respect to the Dcl slice of the original pre-optimization version -// of the inlined function. -func (c dwCtxt) RecordDclReference(from dwarf.Sym, to dwarf.Sym, dclIdx int, inlIndex int) { - ls := from.(*LSym) - tls := to.(*LSym) - ridx := len(ls.R) - 1 - c.Link.DwFixups.ReferenceChildDIE(ls, ridx, tls, dclIdx, inlIndex) -} + // Non-pkg symbol references + h.Offsets[goobj.BlkNonpkgref] = w.Offset() + for _, s := range ctxt.nonpkgrefs { + w.Sym(s) + } -func (c dwCtxt) RecordChildDieOffsets(s dwarf.Sym, vars []*dwarf.Var, offsets []int32) { - ls := s.(*LSym) - c.Link.DwFixups.RegisterChildDIEOffsets(ls, vars, offsets) -} + // Referenced package symbol flags + h.Offsets[goobj.BlkRefFlags] = w.Offset() + w.refFlags() -func (c dwCtxt) Logf(format string, args ...interface{}) { - c.Link.Logf(format, args...) -} + // Hashes + h.Offsets[goobj.BlkHash64] = w.Offset() + for _, s := range ctxt.hashed64defs { + w.Hash64(s) + } + h.Offsets[goobj.BlkHash] = w.Offset() + for _, s := range ctxt.hasheddefs { + w.Hash(s) + } + // TODO: hashedrefs unused/unsupported for now -func isDwarf64(ctxt *Link) bool { - return ctxt.Headtype == objabi.Haix -} + // Reloc indexes + h.Offsets[goobj.BlkRelocIdx] = w.Offset() + nreloc := uint32(0) + lists := [][]*LSym{ctxt.defs, ctxt.hashed64defs, ctxt.hasheddefs, ctxt.nonpkgdefs} + for _, list := range lists { + for _, s := range list { + w.Uint32(nreloc) + nreloc += uint32(len(s.R)) + } + } + w.Uint32(nreloc) -func (ctxt *Link) dwarfSym(s *LSym) (dwarfInfoSym, dwarfLocSym, dwarfRangesSym, dwarfAbsFnSym, dwarfDebugLines *LSym) { - if s.Type != objabi.STEXT { - ctxt.Diag("dwarfSym of non-TEXT %v", s) + // Symbol Info indexes + h.Offsets[goobj.BlkAuxIdx] = w.Offset() + naux := uint32(0) + for _, list := range lists { + for _, s := range list { + w.Uint32(naux) + naux += uint32(nAuxSym(s)) + } } - if s.Func.dwarfInfoSym == nil { - s.Func.dwarfInfoSym = &LSym{ - Type: objabi.SDWARFFCN, + w.Uint32(naux) + + // Data indexes + h.Offsets[goobj.BlkDataIdx] = w.Offset() + dataOff := uint32(0) + for _, list := range lists { + for _, s := range list { + w.Uint32(dataOff) + dataOff += uint32(len(s.P)) } - if ctxt.Flag_locationlists { - s.Func.dwarfLocSym = &LSym{ - Type: objabi.SDWARFLOC, + } + w.Uint32(dataOff) + + // Relocs + h.Offsets[goobj.BlkReloc] = w.Offset() + for _, list := range lists { + for _, s := range list { + for i := range s.R { + w.Reloc(&s.R[i]) } } - s.Func.dwarfRangesSym = &LSym{ - Type: objabi.SDWARFRANGE, + } + + // Aux symbol info + h.Offsets[goobj.BlkAux] = w.Offset() + for _, list := range lists { + for _, s := range list { + w.Aux(s) } - s.Func.dwarfDebugLinesSym = &LSym{ - Type: objabi.SDWARFLINES, + } + + // Data + h.Offsets[goobj.BlkData] = w.Offset() + for _, list := range lists { + for _, s := range list { + w.Bytes(s.P) } - if s.WasInlined() { - s.Func.dwarfAbsFnSym = ctxt.DwFixups.AbsFuncDwarfSym(s) + } + + // Pcdata + h.Offsets[goobj.BlkPcdata] = w.Offset() + for _, s := range ctxt.Text { // iteration order must match genFuncInfoSyms + if s.Func != nil { + pc := &s.Func.Pcln + w.Bytes(pc.Pcsp.P) + w.Bytes(pc.Pcfile.P) + w.Bytes(pc.Pcline.P) + w.Bytes(pc.Pcinline.P) + for i := range pc.Pcdata { + w.Bytes(pc.Pcdata[i].P) + } } } - return s.Func.dwarfInfoSym, s.Func.dwarfLocSym, s.Func.dwarfRangesSym, s.Func.dwarfAbsFnSym, s.Func.dwarfDebugLinesSym -} -func (s *LSym) Length(dwarfContext interface{}) int64 { - return s.Size + // Blocks used only by tools (objdump, nm). + + // Referenced symbol names from other packages + h.Offsets[goobj.BlkRefName] = w.Offset() + w.refNames() + + h.Offsets[goobj.BlkEnd] = w.Offset() + + // Fix up block offsets in the header + end := start + int64(w.Offset()) + b.MustSeek(start, 0) + h.Write(w.Writer) + b.MustSeek(end, 0) } -// fileSymbol returns a symbol corresponding to the source file of the -// first instruction (prog) of the specified function. This will -// presumably be the file in which the function is defined. -func (ctxt *Link) fileSymbol(fn *LSym) *LSym { - p := fn.Func.Text - if p != nil { - f, _ := linkgetlineFromPos(ctxt, p.Pos) - fsym := ctxt.Lookup(f) - return fsym - } - return nil +type writer struct { + *goobj.Writer + ctxt *Link + pkgpath string // the package import path (escaped), "" if unknown + pkglist []string // list of packages referenced, indexed by ctxt.pkgIdx } -// populateDWARF fills in the DWARF Debugging Information Entries for -// TEXT symbol 's'. The various DWARF symbols must already have been -// initialized in InitTextSym. -func (ctxt *Link) populateDWARF(curfn interface{}, s *LSym, myimportpath string) { - info, loc, ranges, absfunc, lines := ctxt.dwarfSym(s) - if info.Size != 0 { - ctxt.Diag("makeFuncDebugEntry double process %v", s) - } - var scopes []dwarf.Scope - var inlcalls dwarf.InlCalls - if ctxt.DebugInfo != nil { - scopes, inlcalls = ctxt.DebugInfo(s, info, curfn) - } - var err error - dwctxt := dwCtxt{ctxt} - filesym := ctxt.fileSymbol(s) - fnstate := &dwarf.FnState{ - Name: s.Name, - Importpath: myimportpath, - Info: info, - Filesym: filesym, - Loc: loc, - Ranges: ranges, - Absfn: absfunc, - StartPC: s, - Size: s.Size, - External: !s.Static(), - Scopes: scopes, - InlCalls: inlcalls, - UseBASEntries: ctxt.UseBASEntries, - } - if absfunc != nil { - err = dwarf.PutAbstractFunc(dwctxt, fnstate) - if err != nil { - ctxt.Diag("emitting DWARF for %s failed: %v", s.Name, err) - } - err = dwarf.PutConcreteFunc(dwctxt, fnstate) - } else { - err = dwarf.PutDefaultFunc(dwctxt, fnstate) - } - if err != nil { - ctxt.Diag("emitting DWARF for %s failed: %v", s.Name, err) - } - // Fill in the debug lines symbol. - ctxt.generateDebugLinesSymbol(s, lines) +// prepare package index list +func (w *writer) init() { + w.pkglist = make([]string, len(w.ctxt.pkgIdx)+1) + w.pkglist[0] = "" // dummy invalid package for index 0 + for pkg, i := range w.ctxt.pkgIdx { + w.pkglist[i] = pkg + } } -// DwarfIntConst creates a link symbol for an integer constant with the -// given name, type and value. -func (ctxt *Link) DwarfIntConst(myimportpath, name, typename string, val int64) { - if myimportpath == "" { - return +func (w *writer) StringTable() { + w.AddString("") + for _, p := range w.ctxt.Imports { + w.AddString(p.Pkg) } - s := ctxt.LookupInit(dwarf.ConstInfoPrefix+myimportpath, func(s *LSym) { - s.Type = objabi.SDWARFCONST - ctxt.Data = append(ctxt.Data, s) + for _, pkg := range w.pkglist { + w.AddString(pkg) + } + w.ctxt.traverseSyms(traverseAll, func(s *LSym) { + // TODO: this includes references of indexed symbols from other packages, + // for which the linker doesn't need the name. Consider moving them to + // a separate block (for tools only). + if w.pkgpath != "" { + s.Name = strings.Replace(s.Name, "\"\".", w.pkgpath+".", -1) + } + // Don't put names of builtins into the string table (to save + // space). + if s.PkgIdx == goobj.PkgIdxBuiltin { + return + } + w.AddString(s.Name) }) - dwarf.PutIntConst(dwCtxt{ctxt}, s, ctxt.Lookup(dwarf.InfoPrefix+typename), myimportpath+"."+name, val) -} -func (ctxt *Link) DwarfAbstractFunc(curfn interface{}, s *LSym, myimportpath string) { - absfn := ctxt.DwFixups.AbsFuncDwarfSym(s) - if absfn.Size != 0 { - ctxt.Diag("internal error: DwarfAbstractFunc double process %v", s) - } - if s.Func == nil { - s.Func = new(FuncInfo) - } - scopes, _ := ctxt.DebugInfo(s, absfn, curfn) - dwctxt := dwCtxt{ctxt} - filesym := ctxt.fileSymbol(s) - fnstate := dwarf.FnState{ - Name: s.Name, - Importpath: myimportpath, - Info: absfn, - Filesym: filesym, - Absfn: absfn, - External: !s.Static(), - Scopes: scopes, - UseBASEntries: ctxt.UseBASEntries, - } - if err := dwarf.PutAbstractFunc(dwctxt, &fnstate); err != nil { - ctxt.Diag("emitting DWARF for %s failed: %v", s.Name, err) + // All filenames are in the postable. + for _, f := range w.ctxt.PosTable.FileTable() { + w.AddString(filepath.ToSlash(f)) } } -// This table is designed to aid in the creation of references between -// DWARF subprogram DIEs. -// -// In most cases when one DWARF DIE has to refer to another DWARF DIE, -// the target of the reference has an LSym, which makes it easy to use -// the existing relocation mechanism. For DWARF inlined routine DIEs, -// however, the subprogram DIE has to refer to a child -// parameter/variable DIE of the abstract subprogram. This child DIE -// doesn't have an LSym, and also of interest is the fact that when -// DWARF generation is happening for inlined function F within caller -// G, it's possible that DWARF generation hasn't happened yet for F, -// so there is no way to know the offset of a child DIE within F's -// abstract function. Making matters more complex, each inlined -// instance of F may refer to a subset of the original F's variables -// (depending on what happens with optimization, some vars may be -// eliminated). -// -// The fixup table below helps overcome this hurdle. At the point -// where a parameter/variable reference is made (via a call to -// "ReferenceChildDIE"), a fixup record is generate that records -// the relocation that is targeting that child variable. At a later -// point when the abstract function DIE is emitted, there will be -// a call to "RegisterChildDIEOffsets", at which point the offsets -// needed to apply fixups are captured. Finally, once the parallel -// portion of the compilation is done, fixups can actually be applied -// during the "Finalize" method (this can't be done during the -// parallel portion of the compile due to the possibility of data -// races). -// -// This table is also used to record the "precursor" function node for -// each function that is the target of an inline -- child DIE references -// have to be made with respect to the original pre-optimization -// version of the function (to allow for the fact that each inlined -// body may be optimized differently). -type DwarfFixupTable struct { - ctxt *Link - mu sync.Mutex - symtab map[*LSym]int // maps abstract fn LSYM to index in svec - svec []symFixups - precursor map[*LSym]fnState // maps fn Lsym to precursor Node, absfn sym +func (w *writer) Sym(s *LSym) { + abi := uint16(s.ABI()) + if s.Static() { + abi = goobj.SymABIstatic + } + flag := uint8(0) + if s.DuplicateOK() { + flag |= goobj.SymFlagDupok + } + if s.Local() { + flag |= goobj.SymFlagLocal + } + if s.MakeTypelink() { + flag |= goobj.SymFlagTypelink + } + if s.Leaf() { + flag |= goobj.SymFlagLeaf + } + if s.NoSplit() { + flag |= goobj.SymFlagNoSplit + } + if s.ReflectMethod() { + flag |= goobj.SymFlagReflectMethod + } + if s.TopFrame() { + flag |= goobj.SymFlagTopFrame + } + if strings.HasPrefix(s.Name, "type.") && s.Name[5] != '.' && s.Type == objabi.SRODATA { + flag |= goobj.SymFlagGoType + } + flag2 := uint8(0) + if s.UsedInIface() { + flag2 |= goobj.SymFlagUsedInIface + } + if strings.HasPrefix(s.Name, "go.itab.") && s.Type == objabi.SRODATA { + flag2 |= goobj.SymFlagItab + } + name := s.Name + if strings.HasPrefix(name, "gofile..") { + name = filepath.ToSlash(name) + } + var align uint32 + if s.Func != nil { + align = uint32(s.Func.Align) + } + if s.ContentAddressable() { + // We generally assume data symbols are natually aligned, + // except for strings. If we dedup a string symbol and a + // non-string symbol with the same content, we should keep + // the largest alignment. + // TODO: maybe the compiler could set the alignment for all + // data symbols more carefully. + if s.Size != 0 && !strings.HasPrefix(s.Name, "go.string.") { + switch { + case w.ctxt.Arch.PtrSize == 8 && s.Size%8 == 0: + align = 8 + case s.Size%4 == 0: + align = 4 + case s.Size%2 == 0: + align = 2 + } + // don't bother setting align to 1. + } + } + var o goobj.Sym + o.SetName(name, w.Writer) + o.SetABI(abi) + o.SetType(uint8(s.Type)) + o.SetFlag(flag) + o.SetFlag2(flag2) + o.SetSiz(uint32(s.Size)) + o.SetAlign(align) + o.Write(w.Writer) } -type symFixups struct { - fixups []relFixup - doffsets []declOffset - inlIndex int32 - defseen bool +func (w *writer) Hash64(s *LSym) { + if !s.ContentAddressable() || len(s.R) != 0 { + panic("Hash of non-content-addresable symbol") + } + b := contentHash64(s) + w.Bytes(b[:]) } -type declOffset struct { - // Index of variable within DCL list of pre-optimization function - dclIdx int32 - // Offset of var's child DIE with respect to containing subprogram DIE - offset int32 +func (w *writer) Hash(s *LSym) { + if !s.ContentAddressable() { + panic("Hash of non-content-addresable symbol") + } + b := w.contentHash(s) + w.Bytes(b[:]) } -type relFixup struct { - refsym *LSym - relidx int32 - dclidx int32 +func contentHash64(s *LSym) goobj.Hash64Type { + var b goobj.Hash64Type + copy(b[:], s.P) + return b } -type fnState struct { - // precursor function (really *gc.Node) - precursor interface{} - // abstract function symbol - absfn *LSym +// Compute the content hash for a content-addressable symbol. +// We build a content hash based on its content and relocations. +// Depending on the category of the referenced symbol, we choose +// different hash algorithms such that the hash is globally +// consistent. +// - For referenced content-addressable symbol, its content hash +// is globally consistent. +// - For package symbol and builtin symbol, its local index is +// globally consistent. +// - For non-package symbol, its fully-expanded name is globally +// consistent. For now, we require we know the current package +// path so we can always expand symbol names. (Otherwise, +// symbols with relocations are not considered hashable.) +// +// For now, we assume there is no circular dependencies among +// hashed symbols. +func (w *writer) contentHash(s *LSym) goobj.HashType { + h := sha1.New() + // The compiler trims trailing zeros _sometimes_. We just do + // it always. + h.Write(bytes.TrimRight(s.P, "\x00")) + var tmp [14]byte + for i := range s.R { + r := &s.R[i] + binary.LittleEndian.PutUint32(tmp[:4], uint32(r.Off)) + tmp[4] = r.Siz + tmp[5] = uint8(r.Type) + binary.LittleEndian.PutUint64(tmp[6:14], uint64(r.Add)) + h.Write(tmp[:]) + rs := r.Sym + switch rs.PkgIdx { + case goobj.PkgIdxHashed64: + h.Write([]byte{0}) + t := contentHash64(rs) + h.Write(t[:]) + case goobj.PkgIdxHashed: + h.Write([]byte{1}) + t := w.contentHash(rs) + h.Write(t[:]) + case goobj.PkgIdxNone: + h.Write([]byte{2}) + io.WriteString(h, rs.Name) // name is already expanded at this point + case goobj.PkgIdxBuiltin: + h.Write([]byte{3}) + binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) + h.Write(tmp[:4]) + case goobj.PkgIdxSelf: + io.WriteString(h, w.pkgpath) + binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) + h.Write(tmp[:4]) + default: + io.WriteString(h, rs.Pkg) + binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) + h.Write(tmp[:4]) + } + } + var b goobj.HashType + copy(b[:], h.Sum(nil)) + return b } -func NewDwarfFixupTable(ctxt *Link) *DwarfFixupTable { - return &DwarfFixupTable{ - ctxt: ctxt, - symtab: make(map[*LSym]int), - precursor: make(map[*LSym]fnState), +func makeSymRef(s *LSym) goobj.SymRef { + if s == nil { + return goobj.SymRef{} + } + if s.PkgIdx == 0 || !s.Indexed() { + fmt.Printf("unindexed symbol reference: %v\n", s) + panic("unindexed symbol reference") } + return goobj.SymRef{PkgIdx: uint32(s.PkgIdx), SymIdx: uint32(s.SymIdx)} } -func (ft *DwarfFixupTable) GetPrecursorFunc(s *LSym) interface{} { - if fnstate, found := ft.precursor[s]; found { - return fnstate.precursor - } - return nil +func (w *writer) Reloc(r *Reloc) { + var o goobj.Reloc + o.SetOff(r.Off) + o.SetSiz(r.Siz) + o.SetType(uint8(r.Type)) + o.SetAdd(r.Add) + o.SetSym(makeSymRef(r.Sym)) + o.Write(w.Writer) +} + +func (w *writer) aux1(typ uint8, rs *LSym) { + var o goobj.Aux + o.SetType(typ) + o.SetSym(makeSymRef(rs)) + o.Write(w.Writer) } -func (ft *DwarfFixupTable) SetPrecursorFunc(s *LSym, fn interface{}) { - if _, found := ft.precursor[s]; found { - ft.ctxt.Diag("internal error: DwarfFixupTable.SetPrecursorFunc double call on %v", s) +func (w *writer) Aux(s *LSym) { + if s.Gotype != nil { + w.aux1(goobj.AuxGotype, s.Gotype) } + if s.Func != nil { + w.aux1(goobj.AuxFuncInfo, s.Func.FuncInfoSym) - // initialize abstract function symbol now. This is done here so - // as to avoid data races later on during the parallel portion of - // the back end. - absfn := ft.ctxt.LookupDerived(s, dwarf.InfoPrefix+s.Name+dwarf.AbstractFuncSuffix) - absfn.Set(AttrDuplicateOK, true) - absfn.Type = objabi.SDWARFABSFCN - ft.ctxt.Data = append(ft.ctxt.Data, absfn) + for _, d := range s.Func.Pcln.Funcdata { + w.aux1(goobj.AuxFuncdata, d) + } - // In the case of "late" inlining (inlines that happen during - // wrapper generation as opposed to the main inlining phase) it's - // possible that we didn't cache the abstract function sym for the - // text symbol -- do so now if needed. See issue 38068. - if s.Func != nil && s.Func.dwarfAbsFnSym == nil { - s.Func.dwarfAbsFnSym = absfn + if s.Func.dwarfInfoSym != nil && s.Func.dwarfInfoSym.Size != 0 { + w.aux1(goobj.AuxDwarfInfo, s.Func.dwarfInfoSym) + } + if s.Func.dwarfLocSym != nil && s.Func.dwarfLocSym.Size != 0 { + w.aux1(goobj.AuxDwarfLoc, s.Func.dwarfLocSym) + } + if s.Func.dwarfRangesSym != nil && s.Func.dwarfRangesSym.Size != 0 { + w.aux1(goobj.AuxDwarfRanges, s.Func.dwarfRangesSym) + } + if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 { + w.aux1(goobj.AuxDwarfLines, s.Func.dwarfDebugLinesSym) + } } +} - ft.precursor[s] = fnState{precursor: fn, absfn: absfn} +// Emits flags of referenced indexed symbols. +func (w *writer) refFlags() { + seen := make(map[*LSym]bool) + w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs + switch rs.PkgIdx { + case goobj.PkgIdxNone, goobj.PkgIdxHashed64, goobj.PkgIdxHashed, goobj.PkgIdxBuiltin, goobj.PkgIdxSelf: // not an external indexed reference + return + case goobj.PkgIdxInvalid: + panic("unindexed symbol reference") + } + if seen[rs] { + return + } + seen[rs] = true + symref := makeSymRef(rs) + flag2 := uint8(0) + if rs.UsedInIface() { + flag2 |= goobj.SymFlagUsedInIface + } + if flag2 == 0 { + return // no need to write zero flags + } + var o goobj.RefFlags + o.SetSym(symref) + o.SetFlag2(flag2) + o.Write(w.Writer) + }) } -// Make a note of a child DIE reference: relocation 'ridx' within symbol 's' -// is targeting child 'c' of DIE with symbol 'tgt'. -func (ft *DwarfFixupTable) ReferenceChildDIE(s *LSym, ridx int, tgt *LSym, dclidx int, inlIndex int) { - // Protect against concurrent access if multiple backend workers - ft.mu.Lock() - defer ft.mu.Unlock() - - // Create entry for symbol if not already present. - idx, found := ft.symtab[tgt] - if !found { - ft.svec = append(ft.svec, symFixups{inlIndex: int32(inlIndex)}) - idx = len(ft.svec) - 1 - ft.symtab[tgt] = idx - } - - // Do we have child DIE offsets available? If so, then apply them, - // otherwise create a fixup record. - sf := &ft.svec[idx] - if len(sf.doffsets) > 0 { - found := false - for _, do := range sf.doffsets { - if do.dclIdx == int32(dclidx) { - off := do.offset - s.R[ridx].Add += int64(off) - found = true - break - } +// Emits names of referenced indexed symbols, used by tools (objdump, nm) +// only. +func (w *writer) refNames() { + seen := make(map[*LSym]bool) + w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs + switch rs.PkgIdx { + case goobj.PkgIdxNone, goobj.PkgIdxHashed64, goobj.PkgIdxHashed, goobj.PkgIdxBuiltin, goobj.PkgIdxSelf: // not an external indexed reference + return + case goobj.PkgIdxInvalid: + panic("unindexed symbol reference") } - if !found { - ft.ctxt.Diag("internal error: DwarfFixupTable.ReferenceChildDIE unable to locate child DIE offset for dclIdx=%d src=%v tgt=%v", dclidx, s, tgt) + if seen[rs] { + return + } + seen[rs] = true + symref := makeSymRef(rs) + var o goobj.RefName + o.SetSym(symref) + o.SetName(rs.Name, w.Writer) + o.Write(w.Writer) + }) + // TODO: output in sorted order? + // Currently tools (cmd/internal/goobj package) doesn't use mmap, + // and it just read it into a map in memory upfront. If it uses + // mmap, if the output is sorted, it probably could avoid reading + // into memory and just do lookups in the mmap'd object file. +} + +// return the number of aux symbols s have. +func nAuxSym(s *LSym) int { + n := 0 + if s.Gotype != nil { + n++ + } + if s.Func != nil { + // FuncInfo is an aux symbol, each Funcdata is an aux symbol + n += 1 + len(s.Func.Pcln.Funcdata) + if s.Func.dwarfInfoSym != nil && s.Func.dwarfInfoSym.Size != 0 { + n++ + } + if s.Func.dwarfLocSym != nil && s.Func.dwarfLocSym.Size != 0 { + n++ + } + if s.Func.dwarfRangesSym != nil && s.Func.dwarfRangesSym.Size != 0 { + n++ + } + if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 { + n++ } - } else { - sf.fixups = append(sf.fixups, relFixup{s, int32(ridx), int32(dclidx)}) } + return n } -// Called once DWARF generation is complete for a given abstract function, -// whose children might have been referenced via a call above. Stores -// the offsets for any child DIEs (vars, params) so that they can be -// consumed later in on DwarfFixupTable.Finalize, which applies any -// outstanding fixups. -func (ft *DwarfFixupTable) RegisterChildDIEOffsets(s *LSym, vars []*dwarf.Var, coffsets []int32) { - // Length of these two slices should agree - if len(vars) != len(coffsets) { - ft.ctxt.Diag("internal error: RegisterChildDIEOffsets vars/offsets length mismatch") - return - } +// generate symbols for FuncInfo. +func genFuncInfoSyms(ctxt *Link) { + infosyms := make([]*LSym, 0, len(ctxt.Text)) + var pcdataoff uint32 + var b bytes.Buffer + symidx := int32(len(ctxt.defs)) + for _, s := range ctxt.Text { + if s.Func == nil { + continue + } + o := goobj.FuncInfo{ + Args: uint32(s.Func.Args), + Locals: uint32(s.Func.Locals), + FuncID: objabi.FuncID(s.Func.FuncID), + } + pc := &s.Func.Pcln + o.Pcsp = pcdataoff + pcdataoff += uint32(len(pc.Pcsp.P)) + o.Pcfile = pcdataoff + pcdataoff += uint32(len(pc.Pcfile.P)) + o.Pcline = pcdataoff + pcdataoff += uint32(len(pc.Pcline.P)) + o.Pcinline = pcdataoff + pcdataoff += uint32(len(pc.Pcinline.P)) + o.Pcdata = make([]uint32, len(pc.Pcdata)) + for i, pcd := range pc.Pcdata { + o.Pcdata[i] = pcdataoff + pcdataoff += uint32(len(pcd.P)) + } + o.PcdataEnd = pcdataoff + o.Funcdataoff = make([]uint32, len(pc.Funcdataoff)) + for i, x := range pc.Funcdataoff { + o.Funcdataoff[i] = uint32(x) + } + i := 0 + o.File = make([]goobj.CUFileIndex, len(pc.UsedFiles)) + for f := range pc.UsedFiles { + o.File[i] = f + i++ + } + sort.Slice(o.File, func(i, j int) bool { return o.File[i] < o.File[j] }) + o.InlTree = make([]goobj.InlTreeNode, len(pc.InlTree.nodes)) + for i, inl := range pc.InlTree.nodes { + f, l := getFileIndexAndLine(ctxt, inl.Pos) + o.InlTree[i] = goobj.InlTreeNode{ + Parent: int32(inl.Parent), + File: goobj.CUFileIndex(f), + Line: l, + Func: makeSymRef(inl.Func), + ParentPC: inl.ParentPC, + } + } - // Generate the slice of declOffset's based in vars/coffsets - doffsets := make([]declOffset, len(coffsets)) - for i := range coffsets { - doffsets[i].dclIdx = vars[i].ChildIndex - doffsets[i].offset = coffsets[i] + o.Write(&b) + isym := &LSym{ + Type: objabi.SDATA, // for now, I don't think it matters + PkgIdx: goobj.PkgIdxSelf, + SymIdx: symidx, + P: append([]byte(nil), b.Bytes()...), + } + isym.Set(AttrIndexed, true) + symidx++ + infosyms = append(infosyms, isym) + s.Func.FuncInfoSym = isym + b.Reset() + + dwsyms := []*LSym{s.Func.dwarfRangesSym, s.Func.dwarfLocSym, s.Func.dwarfDebugLinesSym, s.Func.dwarfInfoSym} + for _, s := range dwsyms { + if s == nil || s.Size == 0 { + continue + } + s.PkgIdx = goobj.PkgIdxSelf + s.SymIdx = symidx + s.Set(AttrIndexed, true) + symidx++ + infosyms = append(infosyms, s) + } } + ctxt.defs = append(ctxt.defs, infosyms...) +} - ft.mu.Lock() - defer ft.mu.Unlock() - - // Store offsets for this symbol. - idx, found := ft.symtab[s] - if !found { - sf := symFixups{inlIndex: -1, defseen: true, doffsets: doffsets} - ft.svec = append(ft.svec, sf) - ft.symtab[s] = len(ft.svec) - 1 - } else { - sf := &ft.svec[idx] - sf.doffsets = doffsets - sf.defseen = true +// debugDumpAux is a dumper for selected aux symbols. +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 { + return } + ctxt.writeSymDebugNamed(aux, "aux for "+par.Name) } -func (ft *DwarfFixupTable) processFixups(slot int, s *LSym) { - sf := &ft.svec[slot] - for _, f := range sf.fixups { - dfound := false - for _, doffset := range sf.doffsets { - if doffset.dclIdx == f.dclidx { - f.refsym.R[f.relidx].Add += int64(doffset.offset) - dfound = true - break +func debugAsmEmit(ctxt *Link) { + if ctxt.Debugasm > 0 { + ctxt.traverseSyms(traverseDefs, ctxt.writeSymDebug) + if ctxt.Debugasm > 1 { + fn := func(par *LSym, aux *LSym) { + writeAuxSymDebug(ctxt, par, aux) } - } - if !dfound { - ft.ctxt.Diag("internal error: DwarfFixupTable has orphaned fixup on %v targeting %v relidx=%d dclidx=%d", f.refsym, s, f.relidx, f.dclidx) + ctxt.traverseAuxSyms(traverseAux, fn) } } } -// return the LSym corresponding to the 'abstract subprogram' DWARF -// info entry for a function. -func (ft *DwarfFixupTable) AbsFuncDwarfSym(fnsym *LSym) *LSym { - // Protect against concurrent access if multiple backend workers - ft.mu.Lock() - defer ft.mu.Unlock() - - if fnstate, found := ft.precursor[fnsym]; found { - return fnstate.absfn - } - ft.ctxt.Diag("internal error: AbsFuncDwarfSym requested for %v, not seen during inlining", fnsym) - return nil +func (ctxt *Link) writeSymDebug(s *LSym) { + ctxt.writeSymDebugNamed(s, s.Name) } -// Called after all functions have been compiled; the main job of this -// function is to identify cases where there are outstanding fixups. -// This scenario crops up when we have references to variables of an -// inlined routine, but that routine is defined in some other package. -// This helper walks through and locate these fixups, then invokes a -// helper to create an abstract subprogram DIE for each one. -func (ft *DwarfFixupTable) Finalize(myimportpath string, trace bool) { - if trace { - ft.ctxt.Logf("DwarfFixupTable.Finalize invoked for %s\n", myimportpath) +func (ctxt *Link) writeSymDebugNamed(s *LSym, name string) { + fmt.Fprintf(ctxt.Bso, "%s ", name) + if s.Type != 0 { + fmt.Fprintf(ctxt.Bso, "%v ", s.Type) } - - // Collect up the keys from the precursor map, then sort the - // resulting list (don't want to rely on map ordering here). - fns := make([]*LSym, len(ft.precursor)) - idx := 0 - for fn := range ft.precursor { - fns[idx] = fn - idx++ + if s.Static() { + fmt.Fprint(ctxt.Bso, "static ") } - sort.Sort(BySymName(fns)) - - // Should not be called during parallel portion of compilation. - if ft.ctxt.InParallel { - ft.ctxt.Diag("internal error: DwarfFixupTable.Finalize call during parallel backend") + if s.DuplicateOK() { + fmt.Fprintf(ctxt.Bso, "dupok ") } - - // Generate any missing abstract functions. - for _, s := range fns { - absfn := ft.AbsFuncDwarfSym(s) - slot, found := ft.symtab[absfn] - if !found || !ft.svec[slot].defseen { - ft.ctxt.GenAbstractFunc(s) + if s.CFunc() { + fmt.Fprintf(ctxt.Bso, "cfunc ") + } + if s.NoSplit() { + fmt.Fprintf(ctxt.Bso, "nosplit ") + } + if s.TopFrame() { + fmt.Fprintf(ctxt.Bso, "topframe ") + } + fmt.Fprintf(ctxt.Bso, "size=%d", s.Size) + if s.Type == objabi.STEXT { + fmt.Fprintf(ctxt.Bso, " args=%#x locals=%#x funcid=%#x", uint64(s.Func.Args), uint64(s.Func.Locals), uint64(s.Func.FuncID)) + if s.Leaf() { + fmt.Fprintf(ctxt.Bso, " leaf") + } + } + fmt.Fprintf(ctxt.Bso, "\n") + if s.Type == objabi.STEXT { + for p := s.Func.Text; p != nil; p = p.Link { + fmt.Fprintf(ctxt.Bso, "\t%#04x ", uint(int(p.Pc))) + if ctxt.Debugasm > 1 { + io.WriteString(ctxt.Bso, p.String()) + } else { + p.InnermostString(ctxt.Bso) + } + fmt.Fprintln(ctxt.Bso) + } + } + for i := 0; i < len(s.P); i += 16 { + fmt.Fprintf(ctxt.Bso, "\t%#04x", uint(i)) + j := i + for ; j < i+16 && j < len(s.P); j++ { + fmt.Fprintf(ctxt.Bso, " %02x", s.P[j]) } + for ; j < i+16; j++ { + fmt.Fprintf(ctxt.Bso, " ") + } + fmt.Fprintf(ctxt.Bso, " ") + for j = i; j < i+16 && j < len(s.P); j++ { + c := int(s.P[j]) + b := byte('.') + if ' ' <= c && c <= 0x7e { + b = byte(c) + } + ctxt.Bso.WriteByte(b) + } + + fmt.Fprintf(ctxt.Bso, "\n") } - // Apply fixups. - for _, s := range fns { - absfn := ft.AbsFuncDwarfSym(s) - slot, found := ft.symtab[absfn] - if !found { - ft.ctxt.Diag("internal error: DwarfFixupTable.Finalize orphan abstract function for %v", s) + sort.Sort(relocByOff(s.R)) // generate stable output + for _, r := range s.R { + name := "" + if r.Sym != nil { + name = r.Sym.Name + } else if r.Type == objabi.R_TLS_LE { + name = "TLS" + } + if ctxt.Arch.InFamily(sys.ARM, sys.PPC64) { + fmt.Fprintf(ctxt.Bso, "\trel %d+%d t=%d %s+%x\n", int(r.Off), r.Siz, r.Type, name, uint64(r.Add)) } else { - ft.processFixups(slot, s) + fmt.Fprintf(ctxt.Bso, "\trel %d+%d t=%d %s+%d\n", int(r.Off), r.Siz, r.Type, name, r.Add) } } } -type BySymName []*LSym +// relocByOff sorts relocations by their offsets. +type relocByOff []Reloc -func (s BySymName) Len() int { return len(s) } -func (s BySymName) Less(i, j int) bool { return s[i].Name < s[j].Name } -func (s BySymName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (x relocByOff) Len() int { return len(x) } +func (x relocByOff) Less(i, j int) bool { return x[i].Off < x[j].Off } +func (x relocByOff) Swap(i, j int) { x[i], x[j] = x[j], x[i] } diff --git a/src/cmd/internal/obj/objfile2.go b/src/cmd/internal/obj/objfile2.go deleted file mode 100644 index f9720f0e57..0000000000 --- a/src/cmd/internal/obj/objfile2.go +++ /dev/null @@ -1,658 +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. - -// Writing Go object files. - -package obj - -import ( - "bytes" - "cmd/internal/bio" - "cmd/internal/goobj" - "cmd/internal/objabi" - "crypto/sha1" - "encoding/binary" - "fmt" - "io" - "path/filepath" - "sort" - "strings" -) - -// Entry point of writing new object file. -func WriteObjFile(ctxt *Link, b *bio.Writer) { - - debugAsmEmit(ctxt) - - genFuncInfoSyms(ctxt) - - w := writer{ - Writer: goobj.NewWriter(b), - ctxt: ctxt, - pkgpath: objabi.PathToPrefix(ctxt.Pkgpath), - } - - start := b.Offset() - w.init() - - // Header - // We just reserve the space. We'll fill in the offsets later. - flags := uint32(0) - if ctxt.Flag_shared { - flags |= goobj.ObjFlagShared - } - if w.pkgpath == "" { - flags |= goobj.ObjFlagNeedNameExpansion - } - if ctxt.IsAsm { - flags |= goobj.ObjFlagFromAssembly - } - h := goobj.Header{ - Magic: goobj.Magic, - Fingerprint: ctxt.Fingerprint, - Flags: flags, - } - h.Write(w.Writer) - - // String table - w.StringTable() - - // Autolib - h.Offsets[goobj.BlkAutolib] = w.Offset() - for i := range ctxt.Imports { - ctxt.Imports[i].Write(w.Writer) - } - - // Package references - h.Offsets[goobj.BlkPkgIdx] = w.Offset() - for _, pkg := range w.pkglist { - w.StringRef(pkg) - } - - // File table (for DWARF and pcln generation). - h.Offsets[goobj.BlkFile] = w.Offset() - for _, f := range ctxt.PosTable.FileTable() { - w.StringRef(filepath.ToSlash(f)) - } - - // Symbol definitions - h.Offsets[goobj.BlkSymdef] = w.Offset() - for _, s := range ctxt.defs { - w.Sym(s) - } - - // Short hashed symbol definitions - h.Offsets[goobj.BlkHashed64def] = w.Offset() - for _, s := range ctxt.hashed64defs { - w.Sym(s) - } - - // Hashed symbol definitions - h.Offsets[goobj.BlkHasheddef] = w.Offset() - for _, s := range ctxt.hasheddefs { - w.Sym(s) - } - - // Non-pkg symbol definitions - h.Offsets[goobj.BlkNonpkgdef] = w.Offset() - for _, s := range ctxt.nonpkgdefs { - w.Sym(s) - } - - // Non-pkg symbol references - h.Offsets[goobj.BlkNonpkgref] = w.Offset() - for _, s := range ctxt.nonpkgrefs { - w.Sym(s) - } - - // Referenced package symbol flags - h.Offsets[goobj.BlkRefFlags] = w.Offset() - w.refFlags() - - // Hashes - h.Offsets[goobj.BlkHash64] = w.Offset() - for _, s := range ctxt.hashed64defs { - w.Hash64(s) - } - h.Offsets[goobj.BlkHash] = w.Offset() - for _, s := range ctxt.hasheddefs { - w.Hash(s) - } - // TODO: hashedrefs unused/unsupported for now - - // Reloc indexes - h.Offsets[goobj.BlkRelocIdx] = w.Offset() - nreloc := uint32(0) - lists := [][]*LSym{ctxt.defs, ctxt.hashed64defs, ctxt.hasheddefs, ctxt.nonpkgdefs} - for _, list := range lists { - for _, s := range list { - w.Uint32(nreloc) - nreloc += uint32(len(s.R)) - } - } - w.Uint32(nreloc) - - // Symbol Info indexes - h.Offsets[goobj.BlkAuxIdx] = w.Offset() - naux := uint32(0) - for _, list := range lists { - for _, s := range list { - w.Uint32(naux) - naux += uint32(nAuxSym(s)) - } - } - w.Uint32(naux) - - // Data indexes - h.Offsets[goobj.BlkDataIdx] = w.Offset() - dataOff := uint32(0) - for _, list := range lists { - for _, s := range list { - w.Uint32(dataOff) - dataOff += uint32(len(s.P)) - } - } - w.Uint32(dataOff) - - // Relocs - h.Offsets[goobj.BlkReloc] = w.Offset() - for _, list := range lists { - for _, s := range list { - for i := range s.R { - w.Reloc(&s.R[i]) - } - } - } - - // Aux symbol info - h.Offsets[goobj.BlkAux] = w.Offset() - for _, list := range lists { - for _, s := range list { - w.Aux(s) - } - } - - // Data - h.Offsets[goobj.BlkData] = w.Offset() - for _, list := range lists { - for _, s := range list { - w.Bytes(s.P) - } - } - - // Pcdata - h.Offsets[goobj.BlkPcdata] = w.Offset() - for _, s := range ctxt.Text { // iteration order must match genFuncInfoSyms - if s.Func != nil { - pc := &s.Func.Pcln - w.Bytes(pc.Pcsp.P) - w.Bytes(pc.Pcfile.P) - w.Bytes(pc.Pcline.P) - w.Bytes(pc.Pcinline.P) - for i := range pc.Pcdata { - w.Bytes(pc.Pcdata[i].P) - } - } - } - - // Blocks used only by tools (objdump, nm). - - // Referenced symbol names from other packages - h.Offsets[goobj.BlkRefName] = w.Offset() - w.refNames() - - h.Offsets[goobj.BlkEnd] = w.Offset() - - // Fix up block offsets in the header - end := start + int64(w.Offset()) - b.MustSeek(start, 0) - h.Write(w.Writer) - b.MustSeek(end, 0) -} - -type writer struct { - *goobj.Writer - ctxt *Link - pkgpath string // the package import path (escaped), "" if unknown - pkglist []string // list of packages referenced, indexed by ctxt.pkgIdx -} - -// prepare package index list -func (w *writer) init() { - w.pkglist = make([]string, len(w.ctxt.pkgIdx)+1) - w.pkglist[0] = "" // dummy invalid package for index 0 - for pkg, i := range w.ctxt.pkgIdx { - w.pkglist[i] = pkg - } -} - -func (w *writer) StringTable() { - w.AddString("") - for _, p := range w.ctxt.Imports { - w.AddString(p.Pkg) - } - for _, pkg := range w.pkglist { - w.AddString(pkg) - } - w.ctxt.traverseSyms(traverseAll, func(s *LSym) { - // TODO: this includes references of indexed symbols from other packages, - // for which the linker doesn't need the name. Consider moving them to - // a separate block (for tools only). - if w.pkgpath != "" { - s.Name = strings.Replace(s.Name, "\"\".", w.pkgpath+".", -1) - } - // Don't put names of builtins into the string table (to save - // space). - if s.PkgIdx == goobj.PkgIdxBuiltin { - return - } - w.AddString(s.Name) - }) - - // All filenames are in the postable. - for _, f := range w.ctxt.PosTable.FileTable() { - w.AddString(filepath.ToSlash(f)) - } -} - -func (w *writer) Sym(s *LSym) { - abi := uint16(s.ABI()) - if s.Static() { - abi = goobj.SymABIstatic - } - flag := uint8(0) - if s.DuplicateOK() { - flag |= goobj.SymFlagDupok - } - if s.Local() { - flag |= goobj.SymFlagLocal - } - if s.MakeTypelink() { - flag |= goobj.SymFlagTypelink - } - if s.Leaf() { - flag |= goobj.SymFlagLeaf - } - if s.NoSplit() { - flag |= goobj.SymFlagNoSplit - } - if s.ReflectMethod() { - flag |= goobj.SymFlagReflectMethod - } - if s.TopFrame() { - flag |= goobj.SymFlagTopFrame - } - if strings.HasPrefix(s.Name, "type.") && s.Name[5] != '.' && s.Type == objabi.SRODATA { - flag |= goobj.SymFlagGoType - } - flag2 := uint8(0) - if s.UsedInIface() { - flag2 |= goobj.SymFlagUsedInIface - } - if strings.HasPrefix(s.Name, "go.itab.") && s.Type == objabi.SRODATA { - flag2 |= goobj.SymFlagItab - } - name := s.Name - if strings.HasPrefix(name, "gofile..") { - name = filepath.ToSlash(name) - } - var align uint32 - if s.Func != nil { - align = uint32(s.Func.Align) - } - if s.ContentAddressable() { - // We generally assume data symbols are natually aligned, - // except for strings. If we dedup a string symbol and a - // non-string symbol with the same content, we should keep - // the largest alignment. - // TODO: maybe the compiler could set the alignment for all - // data symbols more carefully. - if s.Size != 0 && !strings.HasPrefix(s.Name, "go.string.") { - switch { - case w.ctxt.Arch.PtrSize == 8 && s.Size%8 == 0: - align = 8 - case s.Size%4 == 0: - align = 4 - case s.Size%2 == 0: - align = 2 - } - // don't bother setting align to 1. - } - } - var o goobj.Sym - o.SetName(name, w.Writer) - o.SetABI(abi) - o.SetType(uint8(s.Type)) - o.SetFlag(flag) - o.SetFlag2(flag2) - o.SetSiz(uint32(s.Size)) - o.SetAlign(align) - o.Write(w.Writer) -} - -func (w *writer) Hash64(s *LSym) { - if !s.ContentAddressable() || len(s.R) != 0 { - panic("Hash of non-content-addresable symbol") - } - b := contentHash64(s) - w.Bytes(b[:]) -} - -func (w *writer) Hash(s *LSym) { - if !s.ContentAddressable() { - panic("Hash of non-content-addresable symbol") - } - b := w.contentHash(s) - w.Bytes(b[:]) -} - -func contentHash64(s *LSym) goobj.Hash64Type { - var b goobj.Hash64Type - copy(b[:], s.P) - return b -} - -// Compute the content hash for a content-addressable symbol. -// We build a content hash based on its content and relocations. -// Depending on the category of the referenced symbol, we choose -// different hash algorithms such that the hash is globally -// consistent. -// - For referenced content-addressable symbol, its content hash -// is globally consistent. -// - For package symbol and builtin symbol, its local index is -// globally consistent. -// - For non-package symbol, its fully-expanded name is globally -// consistent. For now, we require we know the current package -// path so we can always expand symbol names. (Otherwise, -// symbols with relocations are not considered hashable.) -// -// For now, we assume there is no circular dependencies among -// hashed symbols. -func (w *writer) contentHash(s *LSym) goobj.HashType { - h := sha1.New() - // The compiler trims trailing zeros _sometimes_. We just do - // it always. - h.Write(bytes.TrimRight(s.P, "\x00")) - var tmp [14]byte - for i := range s.R { - r := &s.R[i] - binary.LittleEndian.PutUint32(tmp[:4], uint32(r.Off)) - tmp[4] = r.Siz - tmp[5] = uint8(r.Type) - binary.LittleEndian.PutUint64(tmp[6:14], uint64(r.Add)) - h.Write(tmp[:]) - rs := r.Sym - switch rs.PkgIdx { - case goobj.PkgIdxHashed64: - h.Write([]byte{0}) - t := contentHash64(rs) - h.Write(t[:]) - case goobj.PkgIdxHashed: - h.Write([]byte{1}) - t := w.contentHash(rs) - h.Write(t[:]) - case goobj.PkgIdxNone: - h.Write([]byte{2}) - io.WriteString(h, rs.Name) // name is already expanded at this point - case goobj.PkgIdxBuiltin: - h.Write([]byte{3}) - binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) - h.Write(tmp[:4]) - case goobj.PkgIdxSelf: - io.WriteString(h, w.pkgpath) - binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) - h.Write(tmp[:4]) - default: - io.WriteString(h, rs.Pkg) - binary.LittleEndian.PutUint32(tmp[:4], uint32(rs.SymIdx)) - h.Write(tmp[:4]) - } - } - var b goobj.HashType - copy(b[:], h.Sum(nil)) - return b -} - -func makeSymRef(s *LSym) goobj.SymRef { - if s == nil { - return goobj.SymRef{} - } - if s.PkgIdx == 0 || !s.Indexed() { - fmt.Printf("unindexed symbol reference: %v\n", s) - panic("unindexed symbol reference") - } - return goobj.SymRef{PkgIdx: uint32(s.PkgIdx), SymIdx: uint32(s.SymIdx)} -} - -func (w *writer) Reloc(r *Reloc) { - var o goobj.Reloc - o.SetOff(r.Off) - o.SetSiz(r.Siz) - o.SetType(uint8(r.Type)) - o.SetAdd(r.Add) - o.SetSym(makeSymRef(r.Sym)) - o.Write(w.Writer) -} - -func (w *writer) aux1(typ uint8, rs *LSym) { - var o goobj.Aux - o.SetType(typ) - o.SetSym(makeSymRef(rs)) - o.Write(w.Writer) -} - -func (w *writer) Aux(s *LSym) { - if s.Gotype != nil { - w.aux1(goobj.AuxGotype, s.Gotype) - } - if s.Func != nil { - w.aux1(goobj.AuxFuncInfo, s.Func.FuncInfoSym) - - for _, d := range s.Func.Pcln.Funcdata { - w.aux1(goobj.AuxFuncdata, d) - } - - if s.Func.dwarfInfoSym != nil && s.Func.dwarfInfoSym.Size != 0 { - w.aux1(goobj.AuxDwarfInfo, s.Func.dwarfInfoSym) - } - if s.Func.dwarfLocSym != nil && s.Func.dwarfLocSym.Size != 0 { - w.aux1(goobj.AuxDwarfLoc, s.Func.dwarfLocSym) - } - if s.Func.dwarfRangesSym != nil && s.Func.dwarfRangesSym.Size != 0 { - w.aux1(goobj.AuxDwarfRanges, s.Func.dwarfRangesSym) - } - if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 { - w.aux1(goobj.AuxDwarfLines, s.Func.dwarfDebugLinesSym) - } - } -} - -// Emits flags of referenced indexed symbols. -func (w *writer) refFlags() { - seen := make(map[*LSym]bool) - w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs - switch rs.PkgIdx { - case goobj.PkgIdxNone, goobj.PkgIdxHashed64, goobj.PkgIdxHashed, goobj.PkgIdxBuiltin, goobj.PkgIdxSelf: // not an external indexed reference - return - case goobj.PkgIdxInvalid: - panic("unindexed symbol reference") - } - if seen[rs] { - return - } - seen[rs] = true - symref := makeSymRef(rs) - flag2 := uint8(0) - if rs.UsedInIface() { - flag2 |= goobj.SymFlagUsedInIface - } - if flag2 == 0 { - return // no need to write zero flags - } - var o goobj.RefFlags - o.SetSym(symref) - o.SetFlag2(flag2) - o.Write(w.Writer) - }) -} - -// Emits names of referenced indexed symbols, used by tools (objdump, nm) -// only. -func (w *writer) refNames() { - seen := make(map[*LSym]bool) - w.ctxt.traverseSyms(traverseRefs, func(rs *LSym) { // only traverse refs, not auxs, as tools don't need auxs - switch rs.PkgIdx { - case goobj.PkgIdxNone, goobj.PkgIdxHashed64, goobj.PkgIdxHashed, goobj.PkgIdxBuiltin, goobj.PkgIdxSelf: // not an external indexed reference - return - case goobj.PkgIdxInvalid: - panic("unindexed symbol reference") - } - if seen[rs] { - return - } - seen[rs] = true - symref := makeSymRef(rs) - var o goobj.RefName - o.SetSym(symref) - o.SetName(rs.Name, w.Writer) - o.Write(w.Writer) - }) - // TODO: output in sorted order? - // Currently tools (cmd/internal/goobj package) doesn't use mmap, - // and it just read it into a map in memory upfront. If it uses - // mmap, if the output is sorted, it probably could avoid reading - // into memory and just do lookups in the mmap'd object file. -} - -// return the number of aux symbols s have. -func nAuxSym(s *LSym) int { - n := 0 - if s.Gotype != nil { - n++ - } - if s.Func != nil { - // FuncInfo is an aux symbol, each Funcdata is an aux symbol - n += 1 + len(s.Func.Pcln.Funcdata) - if s.Func.dwarfInfoSym != nil && s.Func.dwarfInfoSym.Size != 0 { - n++ - } - if s.Func.dwarfLocSym != nil && s.Func.dwarfLocSym.Size != 0 { - n++ - } - if s.Func.dwarfRangesSym != nil && s.Func.dwarfRangesSym.Size != 0 { - n++ - } - if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 { - n++ - } - } - return n -} - -// generate symbols for FuncInfo. -func genFuncInfoSyms(ctxt *Link) { - infosyms := make([]*LSym, 0, len(ctxt.Text)) - var pcdataoff uint32 - var b bytes.Buffer - symidx := int32(len(ctxt.defs)) - for _, s := range ctxt.Text { - if s.Func == nil { - continue - } - o := goobj.FuncInfo{ - Args: uint32(s.Func.Args), - Locals: uint32(s.Func.Locals), - FuncID: objabi.FuncID(s.Func.FuncID), - } - pc := &s.Func.Pcln - o.Pcsp = pcdataoff - pcdataoff += uint32(len(pc.Pcsp.P)) - o.Pcfile = pcdataoff - pcdataoff += uint32(len(pc.Pcfile.P)) - o.Pcline = pcdataoff - pcdataoff += uint32(len(pc.Pcline.P)) - o.Pcinline = pcdataoff - pcdataoff += uint32(len(pc.Pcinline.P)) - o.Pcdata = make([]uint32, len(pc.Pcdata)) - for i, pcd := range pc.Pcdata { - o.Pcdata[i] = pcdataoff - pcdataoff += uint32(len(pcd.P)) - } - o.PcdataEnd = pcdataoff - o.Funcdataoff = make([]uint32, len(pc.Funcdataoff)) - for i, x := range pc.Funcdataoff { - o.Funcdataoff[i] = uint32(x) - } - i := 0 - o.File = make([]goobj.CUFileIndex, len(pc.UsedFiles)) - for f := range pc.UsedFiles { - o.File[i] = f - i++ - } - sort.Slice(o.File, func(i, j int) bool { return o.File[i] < o.File[j] }) - o.InlTree = make([]goobj.InlTreeNode, len(pc.InlTree.nodes)) - for i, inl := range pc.InlTree.nodes { - f, l := getFileIndexAndLine(ctxt, inl.Pos) - o.InlTree[i] = goobj.InlTreeNode{ - Parent: int32(inl.Parent), - File: goobj.CUFileIndex(f), - Line: l, - Func: makeSymRef(inl.Func), - ParentPC: inl.ParentPC, - } - } - - o.Write(&b) - isym := &LSym{ - Type: objabi.SDATA, // for now, I don't think it matters - PkgIdx: goobj.PkgIdxSelf, - SymIdx: symidx, - P: append([]byte(nil), b.Bytes()...), - } - isym.Set(AttrIndexed, true) - symidx++ - infosyms = append(infosyms, isym) - s.Func.FuncInfoSym = isym - b.Reset() - - dwsyms := []*LSym{s.Func.dwarfRangesSym, s.Func.dwarfLocSym, s.Func.dwarfDebugLinesSym, s.Func.dwarfInfoSym} - for _, s := range dwsyms { - if s == nil || s.Size == 0 { - continue - } - s.PkgIdx = goobj.PkgIdxSelf - s.SymIdx = symidx - s.Set(AttrIndexed, true) - symidx++ - infosyms = append(infosyms, s) - } - } - ctxt.defs = append(ctxt.defs, infosyms...) -} - -// debugDumpAux is a dumper for selected aux symbols. -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 { - return - } - ctxt.writeSymDebugNamed(aux, "aux for "+par.Name) -} - -func debugAsmEmit(ctxt *Link) { - if ctxt.Debugasm > 0 { - ctxt.traverseSyms(traverseDefs, ctxt.writeSymDebug) - if ctxt.Debugasm > 1 { - fn := func(par *LSym, aux *LSym) { - writeAuxSymDebug(ctxt, par, aux) - } - ctxt.traverseAuxSyms(traverseAux, fn) - } - } -} -- GitLab From f900d6014ea785cba31c83a99258c6004ba5efe6 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Tue, 11 Aug 2020 08:55:16 -0400 Subject: [PATCH 0150/1792] [dev.link] cmd/link: remove a stale comment Change-Id: Ie1e259977459e72b83f880f35e5fea2a3c7c0af9 Reviewed-on: https://go-review.googlesource.com/c/go/+/247937 Reviewed-by: Cherry Zhang Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/dwarf.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index dc237e7278..d1f2ac583d 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1908,11 +1908,6 @@ func dwarfGenerateDebugInfo(ctxt *Link) { d.synthesizeslicetypes(ctxt, dwtypes.Child) d.synthesizemaptypes(ctxt, dwtypes.Child) d.synthesizechantypes(ctxt, dwtypes.Child) - - // NB: at this stage we have all the DIE objects constructed, but - // they have loader.Sym attributes and not sym.Symbol attributes. - // At the point when loadlibfull runs we will need to visit - // every DIE constructed and convert the symbols. } // dwarfGenerateDebugSyms constructs debug_line, debug_frame, and -- GitLab From 3a185d746886db02468c62c7b80154115fba3b9f Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 5 Aug 2020 21:16:52 -0400 Subject: [PATCH 0151/1792] [dev.link] cmd/pack: use cmd/internal/archive package Rewrite part of cmd/pack to use the cmd/internal/archive package. Change-Id: Ia7688810d3ea4d0277056870091f59cf09cffcad Reviewed-on: https://go-review.googlesource.com/c/go/+/247917 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- .../internal/archive/{read.go => archive.go} | 154 ++++++- src/cmd/internal/archive/archive_test.go | 34 +- src/cmd/internal/objfile/goobj.go | 2 +- src/cmd/pack/pack.go | 418 ++++-------------- src/cmd/pack/pack_test.go | 77 ++-- 5 files changed, 296 insertions(+), 389 deletions(-) rename src/cmd/internal/archive/{read.go => archive.go} (66%) diff --git a/src/cmd/internal/archive/read.go b/src/cmd/internal/archive/archive.go similarity index 66% rename from src/cmd/internal/archive/read.go rename to src/cmd/internal/archive/archive.go index e67f06d69b..db67ce424b 100644 --- a/src/cmd/internal/archive/read.go +++ b/src/cmd/internal/archive/archive.go @@ -14,10 +14,29 @@ import ( "errors" "fmt" "io" + "log" "os" "strconv" + "time" + "unicode/utf8" ) +/* +The archive format is: + +First, on a line by itself + ! + +Then zero or more file records. Each file record has a fixed-size one-line header +followed by data bytes followed by an optional padding byte. The header is: + + %-16s%-12d%-6d%-6d%-8o%-10d` + name mtime uid gid mode size + +(note the trailing backquote). The %-16s here means at most 16 *bytes* of +the name, and if shorter, space padded on the right. +*/ + // A Data is a reference to data stored in an object file. // It records the offset and size of the data, so that a client can // read the data only if necessary. @@ -31,9 +50,15 @@ type Archive struct { Entries []Entry } +func (a *Archive) File() *os.File { return a.f } + type Entry struct { - Name string - Type EntryType + Name string + Type EntryType + Mtime int64 + Uid int + Gid int + Mode os.FileMode Data Obj *GoObj // nil if this entry is not a Go object file } @@ -46,11 +71,28 @@ const ( EntryNativeObj ) +func (e *Entry) String() string { + return fmt.Sprintf("%s %6d/%-6d %12d %s %s", + (e.Mode & 0777).String(), + e.Uid, + e.Gid, + e.Size, + time.Unix(e.Mtime, 0).Format(timeFormat), + e.Name) +} + type GoObj struct { TextHeader []byte Data } +const ( + entryHeader = "%s%-12d%-6d%-6d%-8o%-10d`\n" + // In entryHeader the first entry, the name, is always printed as 16 bytes right-padded. + entryLen = 16 + 12 + 6 + 6 + 8 + 10 + 1 + 1 + timeFormat = "Jan _2 15:04 2006" +) + var ( archiveHeader = []byte("!\n") archiveMagic = []byte("`\n") @@ -182,8 +224,17 @@ func (r *objReader) skip(n int64) { } } +// New writes to f to make a new archive. +func New(f *os.File) (*Archive, error) { + _, err := f.Write(archiveHeader) + if err != nil { + return nil, err + } + return &Archive{f: f}, nil +} + // Parse parses an object file or archive from f. -func Parse(f *os.File) (*Archive, error) { +func Parse(f *os.File, verbose bool) (*Archive, error) { var r objReader r.init(f) t, err := r.peek(8) @@ -199,7 +250,7 @@ func Parse(f *os.File) (*Archive, error) { return nil, errNotObject case bytes.Equal(t, archiveHeader): - if err := r.parseArchive(); err != nil { + if err := r.parseArchive(verbose); err != nil { return nil, err } case bytes.Equal(t, goobjHeader): @@ -208,7 +259,12 @@ func Parse(f *os.File) (*Archive, error) { if err := r.parseObject(o, r.limit-off); err != nil { return nil, err } - r.a.Entries = []Entry{{f.Name(), EntryGoObj, Data{off, r.limit - off}, o}} + r.a.Entries = []Entry{{ + Name: f.Name(), + Type: EntryGoObj, + Data: Data{off, r.limit - off}, + Obj: o, + }} } return r.a, nil @@ -221,7 +277,7 @@ func trimSpace(b []byte) string { } // parseArchive parses a Unix archive of Go object files. -func (r *objReader) parseArchive() error { +func (r *objReader) parseArchive(verbose bool) error { r.readFull(r.tmp[:8]) // consume header (already checked) for r.offset < r.limit { if err := r.readFull(r.tmp[:60]); err != nil { @@ -237,7 +293,7 @@ func (r *objReader) parseArchive() error { // 40:48 mode // 48:58 size // 58:60 magic - `\n - // We only care about name, size, and magic. + // We only care about name, size, and magic, unless in verbose mode. // The fields are space-padded on the right. // The size is in decimal. // The file data - size bytes - follows the header. @@ -252,7 +308,27 @@ func (r *objReader) parseArchive() error { return errCorruptArchive } name := trimSpace(data[0:16]) - size, err := strconv.ParseInt(trimSpace(data[48:58]), 10, 64) + var err error + get := func(start, end, base, bitsize int) int64 { + if err != nil { + return 0 + } + var v int64 + v, err = strconv.ParseInt(trimSpace(data[start:end]), base, bitsize) + return v + } + size := get(48, 58, 10, 64) + var ( + mtime int64 + uid, gid int + mode os.FileMode + ) + if verbose { + mtime = get(16, 28, 10, 64) + uid = int(get(28, 34, 10, 32)) + gid = int(get(34, 40, 10, 32)) + mode = os.FileMode(get(40, 48, 8, 32)) + } if err != nil { return errCorruptArchive } @@ -263,7 +339,15 @@ func (r *objReader) parseArchive() error { } switch name { case "__.PKGDEF": - r.a.Entries = append(r.a.Entries, Entry{name, EntryPkgDef, Data{r.offset, size}, nil}) + r.a.Entries = append(r.a.Entries, Entry{ + Name: name, + Type: EntryPkgDef, + Mtime: mtime, + Uid: uid, + Gid: gid, + Mode: mode, + Data: Data{r.offset, size}, + }) r.skip(size) default: var typ EntryType @@ -281,7 +365,16 @@ func (r *objReader) parseArchive() error { typ = EntryNativeObj r.skip(size) } - r.a.Entries = append(r.a.Entries, Entry{name, typ, Data{offset, size}, o}) + r.a.Entries = append(r.a.Entries, Entry{ + Name: name, + Type: typ, + Mtime: mtime, + Uid: uid, + Gid: gid, + Mode: mode, + Data: Data{offset, size}, + Obj: o, + }) } if size&1 != 0 { r.skip(1) @@ -324,3 +417,44 @@ func (r *objReader) parseObject(o *GoObj, size int64) error { r.skip(o.Size) return nil } + +// AddEntry adds an entry to the end of a, with the content from r. +func (a *Archive) AddEntry(typ EntryType, name string, mtime int64, uid, gid int, mode os.FileMode, size int64, r io.Reader) { + off, err := a.f.Seek(0, io.SeekEnd) + if err != nil { + log.Fatal(err) + } + n, err := fmt.Fprintf(a.f, entryHeader, exactly16Bytes(name), mtime, uid, gid, mode, size) + if err != nil || n != entryLen { + log.Fatal("writing entry header: ", err) + } + n1, _ := io.CopyN(a.f, r, size) + if n1 != size { + log.Fatal(err) + } + if (off+size)&1 != 0 { + a.f.Write([]byte{0}) // pad to even byte + } + a.Entries = append(a.Entries, Entry{ + Name: name, + Type: typ, + Mtime: mtime, + Uid: uid, + Gid: gid, + Mode: mode, + Data: Data{off + entryLen, size}, + }) +} + +// exactly16Bytes truncates the string if necessary so it is at most 16 bytes long, +// then pads the result with spaces to be exactly 16 bytes. +// Fmt uses runes for its width calculation, but we need bytes in the entry header. +func exactly16Bytes(s string) string { + for len(s) > 16 { + _, wid := utf8.DecodeLastRuneInString(s) + s = s[:len(s)-wid] + } + const sixteenSpaces = " " + s += sixteenSpaces[:16-len(s)] + return s +} diff --git a/src/cmd/internal/archive/archive_test.go b/src/cmd/internal/archive/archive_test.go index 6ef0b68daa..1468a58210 100644 --- a/src/cmd/internal/archive/archive_test.go +++ b/src/cmd/internal/archive/archive_test.go @@ -19,6 +19,7 @@ import ( "path/filepath" "runtime" "testing" + "unicode/utf8" ) var ( @@ -160,7 +161,7 @@ func TestParseGoobj(t *testing.T) { } defer f.Close() - a, err := Parse(f) + a, err := Parse(f, false) if err != nil { t.Fatal(err) } @@ -189,7 +190,7 @@ func TestParseArchive(t *testing.T) { } defer f.Close() - a, err := Parse(f) + a, err := Parse(f, false) if err != nil { t.Fatal(err) } @@ -234,7 +235,7 @@ func TestParseCGOArchive(t *testing.T) { } defer f.Close() - a, err := Parse(f) + a, err := Parse(f, false) if err != nil { t.Fatal(err) } @@ -346,3 +347,30 @@ func TestParseCGOArchive(t *testing.T) { t.Errorf(`symbol %q not found`, c2) } } + +func TestExactly16Bytes(t *testing.T) { + var tests = []string{ + "", + "a", + "日本語", + "1234567890123456", + "12345678901234567890", + "1234567890123本語4567890", + "12345678901234日本語567890", + "123456789012345日本語67890", + "1234567890123456日本語7890", + "1234567890123456日本語7日本語890", + } + for _, str := range tests { + got := exactly16Bytes(str) + if len(got) != 16 { + t.Errorf("exactly16Bytes(%q) is %q, length %d", str, got, len(got)) + } + // Make sure it is full runes. + for _, c := range got { + if c == utf8.RuneError { + t.Errorf("exactly16Bytes(%q) is %q, has partial rune", str, got) + } + } + } +} diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go index 5708f5ee18..e838f58aed 100644 --- a/src/cmd/internal/objfile/goobj.go +++ b/src/cmd/internal/objfile/goobj.go @@ -27,7 +27,7 @@ type goobjFile struct { } func openGoFile(f *os.File) (*File, error) { - a, err := archive.Parse(f) + a, err := archive.Parse(f, false) if err != nil { return nil, err } diff --git a/src/cmd/pack/pack.go b/src/cmd/pack/pack.go index 95ecad01a1..c4e116becd 100644 --- a/src/cmd/pack/pack.go +++ b/src/cmd/pack/pack.go @@ -5,33 +5,14 @@ package main import ( + "cmd/internal/archive" "fmt" "io" "log" "os" "path/filepath" - "strconv" - "strings" - "time" - "unicode/utf8" ) -/* -The archive format is: - -First, on a line by itself - ! - -Then zero or more file records. Each file record has a fixed-size one-line header -followed by data bytes followed by an optional padding byte. The header is: - - %-16s%-12d%-6d%-6d%-8o%-10d` - name mtime uid gid mode size - -(note the trailing backquote). The %-16s here means at most 16 *bytes* of -the name, and if shorter, space padded on the right. -*/ - const usageMessage = `Usage: pack op file.a [name....] Where op is one of cprtx optionally followed by v for verbose output. For compatibility with old Go build environments the op string grc is @@ -58,21 +39,20 @@ func main() { var ar *Archive switch op { case 'p': - ar = archive(os.Args[2], os.O_RDONLY, os.Args[3:]) + ar = openArchive(os.Args[2], os.O_RDONLY, os.Args[3:]) ar.scan(ar.printContents) case 'r': - ar = archive(os.Args[2], os.O_RDWR, os.Args[3:]) - ar.scan(ar.skipContents) + ar = openArchive(os.Args[2], os.O_RDWR, os.Args[3:]) ar.addFiles() case 'c': - ar = archive(os.Args[2], os.O_RDWR|os.O_TRUNC, os.Args[3:]) + ar = openArchive(os.Args[2], os.O_RDWR|os.O_TRUNC|os.O_CREATE, os.Args[3:]) ar.addPkgdef() ar.addFiles() case 't': - ar = archive(os.Args[2], os.O_RDONLY, os.Args[3:]) + ar = openArchive(os.Args[2], os.O_RDONLY, os.Args[3:]) ar.scan(ar.tableOfContents) case 'x': - ar = archive(os.Args[2], os.O_RDONLY, os.Args[3:]) + ar = openArchive(os.Args[2], os.O_RDONLY, os.Args[3:]) ar.scan(ar.extractContents) default: log.Printf("invalid operation %q", os.Args[1]) @@ -124,193 +104,77 @@ func setOp(arg string) { } const ( - arHeader = "!\n" - entryHeader = "%s%-12d%-6d%-6d%-8o%-10d`\n" - // In entryHeader the first entry, the name, is always printed as 16 bytes right-padded. - entryLen = 16 + 12 + 6 + 6 + 8 + 10 + 1 + 1 - timeFormat = "Jan _2 15:04 2006" + arHeader = "!\n" ) // An Archive represents an open archive file. It is always scanned sequentially // from start to end, without backing up. type Archive struct { - fd *os.File // Open file descriptor. + a *archive.Archive files []string // Explicit list of files to be processed. pad int // Padding bytes required at end of current archive file matchAll bool // match all files in archive } // archive opens (and if necessary creates) the named archive. -func archive(name string, mode int, files []string) *Archive { - // If the file exists, it must be an archive. If it doesn't exist, or if - // we're doing the c command, indicated by O_TRUNC, truncate the archive. - if !existingArchive(name) || mode&os.O_TRUNC != 0 { - create(name) - mode &^= os.O_TRUNC - } - fd, err := os.OpenFile(name, mode, 0) +func openArchive(name string, mode int, files []string) *Archive { + f, err := os.OpenFile(name, mode, 0666) if err != nil { log.Fatal(err) } - checkHeader(fd) - return &Archive{ - fd: fd, - files: files, - matchAll: len(files) == 0, - } -} - -// create creates and initializes an archive that does not exist. -func create(name string) { - fd, err := os.Create(name) - if err != nil { - log.Fatal(err) + var a *archive.Archive + if mode&os.O_CREATE != 0 { // the c command + a, err = archive.New(f) + } else { + a, err = archive.Parse(f, verbose) } - _, err = fmt.Fprint(fd, arHeader) if err != nil { log.Fatal(err) } - fd.Close() -} - -// existingArchive reports whether the file exists and is a valid archive. -// If it exists but is not an archive, existingArchive will exit. -func existingArchive(name string) bool { - fd, err := os.Open(name) - if err != nil { - if os.IsNotExist(err) { - return false - } - log.Fatalf("cannot open file: %s", err) - } - checkHeader(fd) - fd.Close() - return true -} - -// checkHeader verifies the header of the file. It assumes the file -// is positioned at 0 and leaves it positioned at the end of the header. -func checkHeader(fd *os.File) { - buf := make([]byte, len(arHeader)) - _, err := io.ReadFull(fd, buf) - if err != nil || string(buf) != arHeader { - log.Fatalf("%s is not an archive: bad header", fd.Name()) - } -} - -// An Entry is the internal representation of the per-file header information of one entry in the archive. -type Entry struct { - name string - mtime int64 - uid int - gid int - mode os.FileMode - size int64 -} - -func (e *Entry) String() string { - return fmt.Sprintf("%s %6d/%-6d %12d %s %s", - (e.mode & 0777).String(), - e.uid, - e.gid, - e.size, - time.Unix(e.mtime, 0).Format(timeFormat), - e.name) -} - -// readMetadata reads and parses the metadata for the next entry in the archive. -func (ar *Archive) readMetadata() *Entry { - buf := make([]byte, entryLen) - _, err := io.ReadFull(ar.fd, buf) - if err == io.EOF { - // No entries left. - return nil - } - if err != nil || buf[entryLen-2] != '`' || buf[entryLen-1] != '\n' { - log.Fatal("file is not an archive: bad entry") - } - entry := new(Entry) - entry.name = strings.TrimRight(string(buf[:16]), " ") - if len(entry.name) == 0 { - log.Fatal("file is not an archive: bad name") - } - buf = buf[16:] - str := string(buf) - get := func(width, base, bitsize int) int64 { - v, err := strconv.ParseInt(strings.TrimRight(str[:width], " "), base, bitsize) - if err != nil { - log.Fatal("file is not an archive: bad number in entry: ", err) - } - str = str[width:] - return v + return &Archive{ + a: a, + files: files, + matchAll: len(files) == 0, } - // %-16s%-12d%-6d%-6d%-8o%-10d` - entry.mtime = get(12, 10, 64) - entry.uid = int(get(6, 10, 32)) - entry.gid = int(get(6, 10, 32)) - entry.mode = os.FileMode(get(8, 8, 32)) - entry.size = get(10, 10, 64) - return entry } // scan scans the archive and executes the specified action on each entry. -// When action returns, the file offset is at the start of the next entry. -func (ar *Archive) scan(action func(*Entry)) { - for { - entry := ar.readMetadata() - if entry == nil { - break - } - action(entry) +func (ar *Archive) scan(action func(*archive.Entry)) { + for i := range ar.a.Entries { + e := &ar.a.Entries[i] + action(e) } } // listEntry prints to standard output a line describing the entry. -func listEntry(entry *Entry, verbose bool) { +func listEntry(e *archive.Entry, verbose bool) { if verbose { - fmt.Fprintf(stdout, "%s\n", entry) + fmt.Fprintf(stdout, "%s\n", e.String()) } else { - fmt.Fprintf(stdout, "%s\n", entry.name) + fmt.Fprintf(stdout, "%s\n", e.Name) } } // output copies the entry to the specified writer. -func (ar *Archive) output(entry *Entry, w io.Writer) { - n, err := io.Copy(w, io.LimitReader(ar.fd, entry.size)) +func (ar *Archive) output(e *archive.Entry, w io.Writer) { + r := io.NewSectionReader(ar.a.File(), e.Offset, e.Size) + n, err := io.Copy(w, r) if err != nil { log.Fatal(err) } - if n != entry.size { + if n != e.Size { log.Fatal("short file") } - if entry.size&1 == 1 { - _, err := ar.fd.Seek(1, io.SeekCurrent) - if err != nil { - log.Fatal(err) - } - } -} - -// skip skips the entry without reading it. -func (ar *Archive) skip(entry *Entry) { - size := entry.size - if size&1 == 1 { - size++ - } - _, err := ar.fd.Seek(size, io.SeekCurrent) - if err != nil { - log.Fatal(err) - } } // match reports whether the entry matches the argument list. // If it does, it also drops the file from the to-be-processed list. -func (ar *Archive) match(entry *Entry) bool { +func (ar *Archive) match(e *archive.Entry) bool { if ar.matchAll { return true } for i, name := range ar.files { - if entry.name == name { + if e.Name == name { copy(ar.files[i:], ar.files[i+1:]) ar.files = ar.files[:len(ar.files)-1] return true @@ -331,25 +195,25 @@ func (ar *Archive) addFiles() { fmt.Printf("%s\n", file) } - if !isGoCompilerObjFile(file) { - fd, err := os.Open(file) - if err != nil { - log.Fatal(err) - } - ar.addFile(fd) - continue + f, err := os.Open(file) + if err != nil { + log.Fatal(err) + } + aro, err := archive.Parse(f, false) + if err != nil || !isGoCompilerObjFile(aro) { + f.Seek(0, io.SeekStart) + ar.addFile(f) + goto close } - aro := archive(file, os.O_RDONLY, nil) - aro.scan(func(entry *Entry) { - if entry.name != "_go_.o" { - aro.skip(entry) - return + for _, e := range aro.Entries { + if e.Type != archive.EntryGoObj || e.Name != "_go_.o" { + continue } - ar.startFile(filepath.Base(file), 0, 0, 0, 0644, entry.size) - aro.output(entry, ar.fd) - ar.endFile() - }) + ar.a.AddEntry(archive.EntryGoObj, filepath.Base(file), 0, 0, 0, 0644, e.Size, io.NewSectionReader(f, e.Offset, e.Size)) + } + close: + f.Close() } ar.files = nil } @@ -364,7 +228,6 @@ type FileLike interface { // addFile adds a single file to the archive func (ar *Archive) addFile(fd FileLike) { - defer fd.Close() // Format the entry. // First, get its info. info, err := fd.Stat() @@ -375,35 +238,7 @@ func (ar *Archive) addFile(fd FileLike) { mtime := int64(0) uid := 0 gid := 0 - ar.startFile(info.Name(), mtime, uid, gid, info.Mode(), info.Size()) - n64, err := io.Copy(ar.fd, fd) - if err != nil { - log.Fatal("writing file: ", err) - } - if n64 != info.Size() { - log.Fatalf("writing file: wrote %d bytes; file is size %d", n64, info.Size()) - } - ar.endFile() -} - -// startFile writes the archive entry header. -func (ar *Archive) startFile(name string, mtime int64, uid, gid int, mode os.FileMode, size int64) { - n, err := fmt.Fprintf(ar.fd, entryHeader, exactly16Bytes(name), mtime, uid, gid, mode, size) - if err != nil || n != entryLen { - log.Fatal("writing entry header: ", err) - } - ar.pad = int(size & 1) -} - -// endFile writes the archive entry tail (a single byte of padding, if the file size was odd). -func (ar *Archive) endFile() { - if ar.pad != 0 { - _, err := ar.fd.Write([]byte{0}) - if err != nil { - log.Fatal("writing archive: ", err) - } - ar.pad = 0 - } + ar.a.AddEntry(archive.EntryNativeObj, info.Name(), mtime, uid, gid, info.Mode(), info.Size(), fd) } // addPkgdef adds the __.PKGDEF file to the archive, copied @@ -412,150 +247,87 @@ func (ar *Archive) endFile() { func (ar *Archive) addPkgdef() { done := false for _, file := range ar.files { - if !isGoCompilerObjFile(file) { - continue + f, err := os.Open(file) + if err != nil { + log.Fatal(err) + } + aro, err := archive.Parse(f, false) + if err != nil || !isGoCompilerObjFile(aro) { + goto close } - aro := archive(file, os.O_RDONLY, nil) - aro.scan(func(entry *Entry) { - if entry.name != "__.PKGDEF" { - aro.skip(entry) - return + + for _, e := range aro.Entries { + if e.Type != archive.EntryPkgDef { + continue } if verbose { fmt.Printf("__.PKGDEF # %s\n", file) } - ar.startFile("__.PKGDEF", 0, 0, 0, 0644, entry.size) - aro.output(entry, ar.fd) - ar.endFile() + ar.a.AddEntry(archive.EntryPkgDef, "__.PKGDEF", 0, 0, 0, 0644, e.Size, io.NewSectionReader(f, e.Offset, e.Size)) done = true - }) + } + close: + f.Close() if done { break } } } -// exactly16Bytes truncates the string if necessary so it is at most 16 bytes long, -// then pads the result with spaces to be exactly 16 bytes. -// Fmt uses runes for its width calculation, but we need bytes in the entry header. -func exactly16Bytes(s string) string { - for len(s) > 16 { - _, wid := utf8.DecodeLastRuneInString(s) - s = s[:len(s)-wid] - } - const sixteenSpaces = " " - s += sixteenSpaces[:16-len(s)] - return s -} - // Finally, the actual commands. Each is an action. // can be modified for testing. var stdout io.Writer = os.Stdout // printContents implements the 'p' command. -func (ar *Archive) printContents(entry *Entry) { - if ar.match(entry) { - if verbose { - listEntry(entry, false) - } - ar.output(entry, stdout) - } else { - ar.skip(entry) - } -} - -// skipContents implements the first part of the 'r' command. -// It just scans the archive to make sure it's intact. -func (ar *Archive) skipContents(entry *Entry) { - ar.skip(entry) +func (ar *Archive) printContents(e *archive.Entry) { + ar.extractContents1(e, stdout) } // tableOfContents implements the 't' command. -func (ar *Archive) tableOfContents(entry *Entry) { - if ar.match(entry) { - listEntry(entry, verbose) +func (ar *Archive) tableOfContents(e *archive.Entry) { + if ar.match(e) { + listEntry(e, verbose) } - ar.skip(entry) } // extractContents implements the 'x' command. -func (ar *Archive) extractContents(entry *Entry) { - if ar.match(entry) { +func (ar *Archive) extractContents(e *archive.Entry) { + ar.extractContents1(e, nil) +} + +func (ar *Archive) extractContents1(e *archive.Entry, out io.Writer) { + if ar.match(e) { if verbose { - listEntry(entry, false) + listEntry(e, false) } - fd, err := os.OpenFile(entry.name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, entry.mode) - if err != nil { - log.Fatal(err) + if out == nil { + f, err := os.OpenFile(e.Name, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0444 /*e.Mode*/) + if err != nil { + log.Fatal(err) + } + defer f.Close() + out = f } - ar.output(entry, fd) - fd.Close() - } else { - ar.skip(entry) + ar.output(e, out) } } // isGoCompilerObjFile reports whether file is an object file created -// by the Go compiler. -func isGoCompilerObjFile(file string) bool { - fd, err := os.Open(file) - if err != nil { - log.Fatal(err) - } - - // Check for "!\n" header. - buf := make([]byte, len(arHeader)) - _, err = io.ReadFull(fd, buf) - if err != nil { - if err == io.EOF { - return false - } - log.Fatal(err) - } - if string(buf) != arHeader { +// by the Go compiler, which is an archive file with exactly two entries: +// __.PKGDEF and _go_.o. +func isGoCompilerObjFile(a *archive.Archive) bool { + if len(a.Entries) != 2 { return false } - - // Check for exactly two entries: "__.PKGDEF" and "_go_.o". - match := []string{"__.PKGDEF", "_go_.o"} - buf = make([]byte, entryLen) - for { - _, err := io.ReadFull(fd, buf) - if err != nil { - if err == io.EOF { - // No entries left. - return true - } - log.Fatal(err) - } - if buf[entryLen-2] != '`' || buf[entryLen-1] != '\n' { - return false - } - - name := strings.TrimRight(string(buf[:16]), " ") - for { - if len(match) == 0 { - return false - } - var next string - next, match = match[0], match[1:] - if name == next { - break - } + var foundPkgDef, foundGo bool + for _, e := range a.Entries { + if e.Type == archive.EntryPkgDef && e.Name == "__.PKGDEF" { + foundPkgDef = true } - - size, err := strconv.ParseInt(strings.TrimRight(string(buf[48:58]), " "), 10, 64) - if err != nil { - return false - } - if size&1 != 0 { - size++ - } - - _, err = fd.Seek(size, io.SeekCurrent) - if err != nil { - log.Fatal(err) + if e.Type == archive.EntryGoObj && e.Name == "_go_.o" { + foundGo = true } } + return foundPkgDef && foundGo } diff --git a/src/cmd/pack/pack_test.go b/src/cmd/pack/pack_test.go index 6121bf08c0..2108330742 100644 --- a/src/cmd/pack/pack_test.go +++ b/src/cmd/pack/pack_test.go @@ -7,6 +7,7 @@ package main import ( "bufio" "bytes" + "cmd/internal/archive" "fmt" "internal/testenv" "io" @@ -16,36 +17,8 @@ import ( "path/filepath" "testing" "time" - "unicode/utf8" ) -func TestExactly16Bytes(t *testing.T) { - var tests = []string{ - "", - "a", - "日本語", - "1234567890123456", - "12345678901234567890", - "1234567890123本語4567890", - "12345678901234日本語567890", - "123456789012345日本語67890", - "1234567890123456日本語7890", - "1234567890123456日本語7日本語890", - } - for _, str := range tests { - got := exactly16Bytes(str) - if len(got) != 16 { - t.Errorf("exactly16Bytes(%q) is %q, length %d", str, got, len(got)) - } - // Make sure it is full runes. - for _, c := range got { - if c == utf8.RuneError { - t.Errorf("exactly16Bytes(%q) is %q, has partial rune", str, got) - } - } - } -} - // tmpDir creates a temporary directory and returns its name. func tmpDir(t *testing.T) string { name, err := ioutil.TempDir("", "pack") @@ -58,12 +31,12 @@ func tmpDir(t *testing.T) string { // testCreate creates an archive in the specified directory. func testCreate(t *testing.T, dir string) { name := filepath.Join(dir, "pack.a") - ar := archive(name, os.O_RDWR, nil) + ar := openArchive(name, os.O_RDWR|os.O_CREATE, nil) // Add an entry by hand. ar.addFile(helloFile.Reset()) - ar.fd.Close() + ar.a.File().Close() // Now check it. - ar = archive(name, os.O_RDONLY, []string{helloFile.name}) + ar = openArchive(name, os.O_RDONLY, []string{helloFile.name}) var buf bytes.Buffer stdout = &buf verbose = true @@ -72,7 +45,7 @@ func testCreate(t *testing.T, dir string) { verbose = false }() ar.scan(ar.printContents) - ar.fd.Close() + ar.a.File().Close() result := buf.String() // Expect verbose output plus file contents. expect := fmt.Sprintf("%s\n%s", helloFile.name, helloFile.contents) @@ -103,15 +76,14 @@ func TestTableOfContents(t *testing.T) { dir := tmpDir(t) defer os.RemoveAll(dir) name := filepath.Join(dir, "pack.a") - ar := archive(name, os.O_RDWR, nil) + ar := openArchive(name, os.O_RDWR|os.O_CREATE, nil) // Add some entries by hand. ar.addFile(helloFile.Reset()) ar.addFile(goodbyeFile.Reset()) - ar.fd.Close() + ar.a.File().Close() // Now print it. - ar = archive(name, os.O_RDONLY, nil) var buf bytes.Buffer stdout = &buf verbose = true @@ -119,8 +91,9 @@ func TestTableOfContents(t *testing.T) { stdout = os.Stdout verbose = false }() + ar = openArchive(name, os.O_RDONLY, nil) ar.scan(ar.tableOfContents) - ar.fd.Close() + ar.a.File().Close() result := buf.String() // Expect verbose listing. expect := fmt.Sprintf("%s\n%s\n", helloFile.Entry(), goodbyeFile.Entry()) @@ -131,9 +104,9 @@ func TestTableOfContents(t *testing.T) { // Do it again without verbose. verbose = false buf.Reset() - ar = archive(name, os.O_RDONLY, nil) + ar = openArchive(name, os.O_RDONLY, nil) ar.scan(ar.tableOfContents) - ar.fd.Close() + ar.a.File().Close() result = buf.String() // Expect non-verbose listing. expect = fmt.Sprintf("%s\n%s\n", helloFile.name, goodbyeFile.name) @@ -144,9 +117,9 @@ func TestTableOfContents(t *testing.T) { // Do it again with file list arguments. verbose = false buf.Reset() - ar = archive(name, os.O_RDONLY, []string{helloFile.name}) + ar = openArchive(name, os.O_RDONLY, []string{helloFile.name}) ar.scan(ar.tableOfContents) - ar.fd.Close() + ar.a.File().Close() result = buf.String() // Expect only helloFile. expect = fmt.Sprintf("%s\n", helloFile.name) @@ -161,11 +134,11 @@ func TestExtract(t *testing.T) { dir := tmpDir(t) defer os.RemoveAll(dir) name := filepath.Join(dir, "pack.a") - ar := archive(name, os.O_RDWR, nil) + ar := openArchive(name, os.O_RDWR|os.O_CREATE, nil) // Add some entries by hand. ar.addFile(helloFile.Reset()) ar.addFile(goodbyeFile.Reset()) - ar.fd.Close() + ar.a.File().Close() // Now extract one file. We chdir to the directory of the archive for simplicity. pwd, err := os.Getwd() if err != nil { @@ -181,9 +154,9 @@ func TestExtract(t *testing.T) { t.Fatal("os.Chdir: ", err) } }() - ar = archive(name, os.O_RDONLY, []string{goodbyeFile.name}) + ar = openArchive(name, os.O_RDONLY, []string{goodbyeFile.name}) ar.scan(ar.extractContents) - ar.fd.Close() + ar.a.File().Close() data, err := ioutil.ReadFile(goodbyeFile.name) if err != nil { t.Fatal(err) @@ -416,13 +389,13 @@ func (f *FakeFile) Sys() interface{} { // Special helpers. -func (f *FakeFile) Entry() *Entry { - return &Entry{ - name: f.name, - mtime: 0, // Defined to be zero. - uid: 0, // Ditto. - gid: 0, // Ditto. - mode: f.mode, - size: int64(len(f.contents)), +func (f *FakeFile) Entry() *archive.Entry { + return &archive.Entry{ + Name: f.name, + Mtime: 0, // Defined to be zero. + Uid: 0, // Ditto. + Gid: 0, // Ditto. + Mode: f.mode, + Data: archive.Data{Size: int64(len(f.contents))}, } } -- GitLab From 813b6bbaf9e24e6e11accca0cb4e7b7e8fb8db8d Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Tue, 11 Aug 2020 18:37:44 -0400 Subject: [PATCH 0152/1792] internal/goversion: update Version to 1.16 This is the start of the Go 1.16 development cycle, so update the Version value accordingly. It represents the Go 1.x version that will soon open up for development (and eventually become released). Historically, we used to bump this at an arbitrary time throughout the development cycle, but it's better to be more predictable about updating it. The start of a development cycle should be the most appropriate time: it clearly marks the boundary between 1.15 and 1.16 development, and doing it early can help catch issues in other tooling. See issue #38704 for more background. There is no longer a need to update the list of Go versions in src/go/build/doc.go because it does not exist as of CL 232981. For #40705. Updates #38704. Updates #37018. Change-Id: Id8ee733b5e79c53b6cd03509c6560614d8743833 Reviewed-on: https://go-review.googlesource.com/c/go/+/248038 Reviewed-by: Carlos Amedee --- src/internal/goversion/goversion.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/internal/goversion/goversion.go b/src/internal/goversion/goversion.go index 4ffd34c1a2..513be456bd 100644 --- a/src/internal/goversion/goversion.go +++ b/src/internal/goversion/goversion.go @@ -4,10 +4,9 @@ package goversion -// Version is the current Go 1.x version. During development cycles on -// the master branch it changes to be the version of the next Go 1.x -// release. +// Version is the Go 1.x version which is currently +// in development and will eventually get released. // -// When incrementing this, also add to the list at src/go/build/doc.go -// (search for "onward"). -const Version = 15 +// 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 = 16 -- GitLab From b3de3e52c28b87b7849ef5c030cb280763b549ef Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Wed, 12 Aug 2020 10:34:15 -0400 Subject: [PATCH 0153/1792] doc/go1.16: start draft release notes This template is based on CL 220278 and previous ones like it. Include Compiler and Linker sections proactively, they can be removed if they don't end up being needed for Go 1.16. Use two spaces of indentation for TODOs to set a better precedent for the final text that will take its place. 'relnote -html' does not report any changes at this time. For #40700. Change-Id: I096b0ce0d33aaaa6fae9c91c0d2dfb89b9c5e94c Reviewed-on: https://go-review.googlesource.com/c/go/+/248198 Reviewed-by: Carlos Amedee --- doc/go1.16.html | 84 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 doc/go1.16.html diff --git a/doc/go1.16.html b/doc/go1.16.html new file mode 100644 index 0000000000..f0e26a1033 --- /dev/null +++ b/doc/go1.16.html @@ -0,0 +1,84 @@ + + + + + + +

DRAFT RELEASE NOTES — Introduction to Go 1.16

+ +

+ + Go 1.16 is not yet released. These are work-in-progress + release notes. Go 1.16 is expected to be released in February 2021. + +

+ +

Changes to the language

+ +

+ TODO +

+ +

Ports

+ +

+ TODO +

+ +

Tools

+ +

+ TODO +

+ +

Go command

+ +

+ TODO +

+ +

Runtime

+ +

+ TODO +

+ +

Compiler

+ +

+ TODO +

+ +

Linker

+ +

+ TODO +

+ +

Core library

+ +

+ TODO +

+ +

Minor changes to the library

+ +

+ As always, there are various minor changes and updates to the library, + made with the Go 1 promise of compatibility + in mind. +

+ +

+ TODO +

-- GitLab From 9ae8f71c9431d287893443fa2b7fbdb72a9b56a2 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Mon, 3 Aug 2020 13:19:46 -0400 Subject: [PATCH 0154/1792] [dev.link] cmd/link: stop renumbering files for pclntab generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Creates two new symbols: runtime.cutab, and runtime.filetab, and strips the filenames out of runtime.pclntab_old. All stats are for cmd/compile. Time: Pclntab_GC 48.2ms ± 3% 45.5ms ± 9% -5.47% (p=0.004 n=9+9) Alloc/op: Pclntab_GC 30.0MB ± 0% 29.5MB ± 0% -1.88% (p=0.000 n=10+10) Allocs/op: Pclntab_GC 90.4k ± 0% 73.1k ± 0% -19.11% (p=0.000 n=10+10) live-B: Pclntab_GC 29.1M ± 0% 29.2M ± 0% +0.10% (p=0.000 n=10+10) binary sizes: NEW: 18565600 OLD: 18532768 The size differences in the binary are caused by the increased size of the Func objects, and (less likely) some extra alignment padding needed as a result. This is probably the maximum increase in size we'll size from the pclntab reworking. Change-Id: Idd95a9b159fea46f7701cfe6506813b88257fbea Reviewed-on: https://go-review.googlesource.com/c/go/+/246497 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/data.go | 4 + src/cmd/link/internal/ld/link.go | 1 - src/cmd/link/internal/ld/pcln.go | 303 ++++++++++++++++------------- src/cmd/link/internal/ld/symtab.go | 12 +- src/debug/gosym/pclntab.go | 52 +++-- src/runtime/runtime2.go | 7 +- src/runtime/symtab.go | 19 +- 7 files changed, 231 insertions(+), 167 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index dc7096ea8c..a551d46403 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1923,6 +1923,8 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pcheader", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.funcnametab", 0), sect) + ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.cutab", 0), sect) + ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.filetab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab_old", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.epclntab", 0), sect) if ctxt.HeadType == objabi.Haix { @@ -2507,6 +2509,8 @@ func (ctxt *Link) address() []*sym.Segment { ctxt.xdefine("runtime.pclntab", sym.SRODATA, int64(pclntab.Vaddr)) ctxt.defineInternal("runtime.pcheader", sym.SRODATA) ctxt.defineInternal("runtime.funcnametab", sym.SRODATA) + ctxt.defineInternal("runtime.cutab", sym.SRODATA) + ctxt.defineInternal("runtime.filetab", sym.SRODATA) ctxt.defineInternal("runtime.pclntab_old", sym.SRODATA) ctxt.xdefine("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length)) ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr)) diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index a2c8552e94..f26d051a49 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -71,7 +71,6 @@ type Link struct { LibraryByPkg map[string]*sym.Library Shlibs []Shlib Textp []loader.Sym - NumFilesyms int Moduledata loader.Sym PackageFile map[string]string diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 30e0bdc839..c7535f6a61 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -6,16 +6,11 @@ package ld import ( "cmd/internal/goobj" - "cmd/internal/obj" "cmd/internal/objabi" - "cmd/internal/src" "cmd/internal/sys" "cmd/link/internal/loader" "cmd/link/internal/sym" - "encoding/binary" "fmt" - "log" - "math" "os" "path/filepath" "strings" @@ -23,18 +18,13 @@ import ( // oldPclnState holds state information used during pclntab generation. Here // 'ldr' is just a pointer to the context's loader, 'deferReturnSym' is the -// index for the symbol "runtime.deferreturn", 'nameToOffset' is a helper -// function for capturing function names, 'numberedFiles' records the file -// number assigned to a given file symbol, 'filepaths' is a slice of expanded -// paths (indexed by file number). +// index for the symbol "runtime.deferreturn", // // NB: This is deprecated, and will be eliminated when pclntab_old is // eliminated. type oldPclnState struct { ldr *loader.Loader deferReturnSym loader.Sym - numberedFiles map[string]int64 - filepaths []string } // pclntab holds the state needed for pclntab generation. @@ -42,9 +32,6 @@ type pclntab struct { // The first and last functions found. firstFunc, lastFunc loader.Sym - // The offset to the filetab. - filetabOffset int32 - // Running total size of pclntab. size int64 @@ -54,6 +41,8 @@ type pclntab struct { pcheader loader.Sym funcnametab loader.Sym findfunctab loader.Sym + cutab loader.Sym + filetab loader.Sym // The number of functions + number of TEXT sections - 1. This is such an // unexpected value because platforms that have more than one TEXT section @@ -64,6 +53,9 @@ type pclntab struct { // On most platforms this is the number of reachable functions. nfunc int32 + // The number of filenames in runtime.filetab. + nfiles uint32 + // maps the function symbol to offset in runtime.funcnametab // This doesn't need to reside in the state once pclntab_old's been // deleted -- it can live in generateFuncnametab. @@ -89,11 +81,6 @@ func makeOldPclnState(ctxt *Link) *oldPclnState { state := &oldPclnState{ ldr: ldr, deferReturnSym: drs, - numberedFiles: make(map[string]int64), - // NB: initial entry in filepaths below is to reserve the zero value, - // so that when we do a map lookup in numberedFiles fails, it will not - // return a value slot in filepaths. - filepaths: []string{""}, } return state @@ -153,78 +140,6 @@ func ftabaddstring(ftab *loader.SymbolBuilder, s string) int32 { return int32(start) } -// numberfile assigns a file number to the file if it hasn't been assigned already. -// This funciton looks at a CU's file at index [i], and if it's a new filename, -// stores that filename in the global file table, and adds it to the map lookup -// for renumbering pcfile. -func (state *oldPclnState) numberfile(cu *sym.CompilationUnit, i goobj.CUFileIndex) int64 { - file := cu.FileTable[i] - if val, ok := state.numberedFiles[file]; ok { - return val - } - path := file - if strings.HasPrefix(path, src.FileSymPrefix) { - path = file[len(src.FileSymPrefix):] - } - val := int64(len(state.filepaths)) - state.numberedFiles[file] = val - state.filepaths = append(state.filepaths, expandGoroot(path)) - return val -} - -func (state *oldPclnState) fileVal(cu *sym.CompilationUnit, i int32) int64 { - file := cu.FileTable[i] - if val, ok := state.numberedFiles[file]; ok { - return val - } - panic("should have been numbered first") -} - -func (state *oldPclnState) renumberfiles(ctxt *Link, cu *sym.CompilationUnit, fi loader.FuncInfo, d *sym.Pcdata) { - // Give files numbers. - nf := fi.NumFile() - for i := uint32(0); i < nf; i++ { - state.numberfile(cu, fi.File(int(i))) - } - - buf := make([]byte, binary.MaxVarintLen32) - newval := int32(-1) - var out sym.Pcdata - it := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) - for it.Init(d.P); !it.Done; it.Next() { - // value delta - oldval := it.Value - - var val int32 - if oldval == -1 { - val = -1 - } else { - if oldval < 0 || oldval >= int32(len(cu.FileTable)) { - log.Fatalf("bad pcdata %d", oldval) - } - val = int32(state.fileVal(cu, oldval)) - } - - dv := val - newval - newval = val - - // value - n := binary.PutVarint(buf, int64(dv)) - out.P = append(out.P, buf[:n]...) - - // pc delta - pc := (it.NextPC - it.PC) / it.PCScale - n = binary.PutUvarint(buf, uint64(pc)) - out.P = append(out.P, buf[:n]...) - } - - // terminating value delta - // we want to write varint-encoded 0, which is just 0 - out.P = append(out.P, 0) - - *d = out -} - // onlycsymbol looks at a symbol's name to report whether this is a // symbol that is referenced by C code func onlycsymbol(sname string) bool { @@ -308,12 +223,7 @@ func (state *oldPclnState) genInlTreeSym(cu *sym.CompilationUnit, fi loader.Func ninl := fi.NumInlTree() for i := 0; i < int(ninl); i++ { call := fi.InlTree(i) - // Usually, call.File is already numbered since the file - // shows up in the Pcfile table. However, two inlined calls - // might overlap exactly so that only the innermost file - // appears in the Pcfile table. In that case, this assigns - // the outer file a number. - val := state.numberfile(cu, call.File) + val := call.File nameoff, ok := newState.funcNameOffset[call.Func] if !ok { panic("couldn't find function name offset") @@ -359,11 +269,14 @@ func (state *pclntab) generatePCHeader(ctxt *Link) { header.SetUint8(ctxt.Arch, 6, uint8(ctxt.Arch.MinLC)) header.SetUint8(ctxt.Arch, 7, uint8(ctxt.Arch.PtrSize)) off := header.SetUint(ctxt.Arch, 8, uint64(state.nfunc)) + off = header.SetUint(ctxt.Arch, off, uint64(state.nfiles)) off = writeSymOffset(off, state.funcnametab) + off = writeSymOffset(off, state.cutab) + off = writeSymOffset(off, state.filetab) off = writeSymOffset(off, state.pclntab) } - size := int64(8 + 3*ctxt.Arch.PtrSize) + size := int64(8 + 6*ctxt.Arch.PtrSize) state.pcheader = state.addGeneratedSym(ctxt, "runtime.pcheader", size, writeHeader) } @@ -417,6 +330,139 @@ func (state *pclntab) generateFuncnametab(ctxt *Link, container loader.Bitmap) { state.funcnametab = state.addGeneratedSym(ctxt, "runtime.funcnametab", size, writeFuncNameTab) } +// walkFilenames walks the filenames in the all reachable functions. +func walkFilenames(ctxt *Link, container loader.Bitmap, f func(*sym.CompilationUnit, goobj.CUFileIndex)) { + ldr := ctxt.loader + + // Loop through all functions, finding the filenames we need. + for _, ls := range ctxt.Textp { + s := loader.Sym(ls) + if !emitPcln(ctxt, s, container) { + continue + } + + fi := ldr.FuncInfo(s) + if !fi.Valid() { + continue + } + fi.Preload() + + cu := ldr.SymUnit(s) + for i, nf := 0, int(fi.NumFile()); i < nf; i++ { + f(cu, fi.File(i)) + } + for i, ninl := 0, int(fi.NumInlTree()); i < ninl; i++ { + call := fi.InlTree(i) + f(cu, call.File) + } + } +} + +// generateFilenameTabs creates LUTs needed for filename lookup. Returns a slice +// of the index at which each CU begins in runtime.cutab. +// +// Function objects keep track of the files they reference to print the stack. +// This function creates a per-CU list of filenames if CU[M] references +// files[1-N], the following is generated: +// +// runtime.cutab: +// CU[M] +// offsetToFilename[0] +// offsetToFilename[1] +// .. +// +// runtime.filetab +// filename[0] +// filename[1] +// +// Looking up a filename then becomes: +// 0) Given a func, and filename index [K] +// 1) Get Func.CUIndex: M := func.cuOffset +// 2) Find filename offset: fileOffset := runtime.cutab[M+K] +// 3) Get the filename: getcstring(runtime.filetab[fileOffset]) +func (state *pclntab) generateFilenameTabs(ctxt *Link, compUnits []*sym.CompilationUnit, container loader.Bitmap) []uint32 { + // On a per-CU basis, keep track of all the filenames we need. + // + // Note, that we store the filenames in a separate section in the object + // files, and deduplicate based on the actual value. It would be better to + // store the filenames as symbols, using content addressable symbols (and + // then not loading extra filenames), and just use the hash value of the + // symbol name to do this cataloging. + // + // TOOD: Store filenames as symbols. (Note this would be easiest if you + // also move strings to ALWAYS using the larger content addressable hash + // function, and use that hash value for uniqueness testing.) + cuEntries := make([]goobj.CUFileIndex, len(compUnits)) + fileOffsets := make(map[string]uint32) + + // Walk the filenames. + // We store the total filename string length we need to load, and the max + // file index we've seen per CU so we can calculate how large the + // CU->global table needs to be. + var fileSize int64 + walkFilenames(ctxt, container, func(cu *sym.CompilationUnit, i goobj.CUFileIndex) { + // Note we use the raw filename for lookup, but use the expanded filename + // when we save the size. + filename := cu.FileTable[i] + if _, ok := fileOffsets[filename]; !ok { + fileOffsets[filename] = uint32(fileSize) + fileSize += int64(len(expandFile(filename)) + 1) // NULL terminate + } + + // Find the maximum file index we've seen. + if cuEntries[cu.PclnIndex] < i+1 { + cuEntries[cu.PclnIndex] = i + 1 // Store max + 1 + } + }) + + // Calculate the size of the runtime.cutab variable. + var totalEntries uint32 + cuOffsets := make([]uint32, len(cuEntries)) + for i, entries := range cuEntries { + // Note, cutab is a slice of uint32, so an offset to a cu's entry is just the + // running total of all cu indices we've needed to store so far, not the + // number of bytes we've stored so far. + cuOffsets[i] = totalEntries + totalEntries += uint32(entries) + } + + // Write cutab. + writeCutab := func(ctxt *Link, s loader.Sym) { + sb := ctxt.loader.MakeSymbolUpdater(s) + + var off int64 + for i, max := range cuEntries { + // Write the per CU LUT. + cu := compUnits[i] + for j := goobj.CUFileIndex(0); j < max; j++ { + fileOffset, ok := fileOffsets[cu.FileTable[j]] + if !ok { + // We're looping through all possible file indices. It's possible a file's + // been deadcode eliminated, and although it's a valid file in the CU, it's + // not needed in this binary. When that happens, use an invalid offset. + fileOffset = ^uint32(0) + } + off = sb.SetUint32(ctxt.Arch, off, fileOffset) + } + } + } + state.cutab = state.addGeneratedSym(ctxt, "runtime.cutab", int64(totalEntries*4), writeCutab) + + // Write filetab. + writeFiletab := func(ctxt *Link, s loader.Sym) { + sb := ctxt.loader.MakeSymbolUpdater(s) + + // Write the strings. + for filename, loc := range fileOffsets { + sb.AddStringAt(int64(loc), expandFile(filename)) + } + } + state.nfiles = uint32(len(fileOffsets)) + state.filetab = state.addGeneratedSym(ctxt, "runtime.filetab", fileSize, writeFiletab) + + return cuOffsets +} + // pclntab initializes the pclntab symbol with // runtime function and file name information. @@ -425,7 +471,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // Go 1.2's symtab layout is documented in golang.org/s/go12symtab, but the // layout and data has changed since that time. // - // As of July 2020, here's the layout of pclntab: + // As of August 2020, here's the layout of pclntab: // // .gopclntab/__gopclntab [elf/macho section] // runtime.pclntab @@ -438,17 +484,23 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // offset to runtime.pclntab_old from beginning of runtime.pcheader // // runtime.funcnametab - // []list of null terminated function names + // []list of null terminated function names + // + // runtime.cutab + // for i=0..#CUs + // for j=0..#max used file index in CU[i] + // uint32 offset into runtime.filetab for the filename[j] + // + // runtime.filetab + // []null terminated filename strings // // runtime.pclntab_old // function table, alternating PC and offset to func struct [each entry thearch.ptrsize bytes] // end PC [thearch.ptrsize bytes] - // offset to file table [4 bytes] // func structures, pcdata tables. - // filetable oldState := makeOldPclnState(ctxt) - state, _ := makePclntab(ctxt, container) + state, compUnits := makePclntab(ctxt, container) ldr := ctxt.loader state.carrier = ldr.LookupOrCreateSym("runtime.pclntab", 0) @@ -461,6 +513,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { state.pclntab = ldr.LookupOrCreateSym("runtime.pclntab_old", 0) state.generatePCHeader(ctxt) state.generateFuncnametab(ctxt, container) + cuOffsets := state.generateFilenameTabs(ctxt, compUnits, container) funcdataBytes := int64(0) ldr.SetCarrierSym(state.pclntab, state.carrier) @@ -583,7 +636,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // fixed size of struct, checked below off := funcstart - end := funcstart + int32(ctxt.Arch.PtrSize) + 3*4 + 5*4 + int32(len(pcdata))*4 + int32(len(funcdata))*int32(ctxt.Arch.PtrSize) + end := funcstart + int32(ctxt.Arch.PtrSize) + 3*4 + 6*4 + int32(len(pcdata))*4 + int32(len(funcdata))*int32(ctxt.Arch.PtrSize) if len(funcdata) > 0 && (end&int32(ctxt.Arch.PtrSize-1) != 0) { end += 4 } @@ -616,17 +669,6 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { pcsp = sym.Pcdata{P: fi.Pcsp()} pcfile = sym.Pcdata{P: fi.Pcfile()} pcline = sym.Pcdata{P: fi.Pcline()} - oldState.renumberfiles(ctxt, cu, fi, &pcfile) - if false { - // Sanity check the new numbering - it := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) - for it.Init(pcfile.P); !it.Done; it.Next() { - if it.Value < 1 || it.Value > int32(len(oldState.numberedFiles)) { - ctxt.Errorf(s, "bad file number in pcfile: %d not in range [1, %d]\n", it.Value, len(oldState.numberedFiles)) - errorexit() - } - } - } } if fi.Valid() && fi.NumInlTree() > 0 { @@ -641,15 +683,12 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { off = writepctab(off, pcline.P) off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(len(pcdata)))) - // Store the compilation unit index. - cuIdx := ^uint16(0) + // Store the offset to compilation unit's file table. + cuIdx := ^uint32(0) if cu := ldr.SymUnit(s); cu != nil { - if cu.PclnIndex > math.MaxUint16 { - panic("cu limit reached.") - } - cuIdx = uint16(cu.PclnIndex) + cuIdx = cuOffsets[cu.PclnIndex] } - off = int32(ftab.SetUint16(ctxt.Arch, int64(off), cuIdx)) + off = int32(ftab.SetUint32(ctxt.Arch, int64(off), cuIdx)) // funcID uint8 var funcID objabi.FuncID @@ -658,6 +697,8 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { } off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(funcID))) + off += 2 // pad + // nfuncdata must be the final entry. off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(len(funcdata)))) for i := range pcdata { @@ -694,26 +735,8 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // Final entry of table is just end pc. setAddr(ftab, ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize), state.lastFunc, ldr.SymSize(state.lastFunc)) - // Start file table. - dSize := len(ftab.Data()) - start := int32(dSize) - start += int32(-dSize) & (int32(ctxt.Arch.PtrSize) - 1) - state.filetabOffset = start - ftab.SetUint32(ctxt.Arch, int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint32(start)) - - nf := len(oldState.numberedFiles) - ftab.Grow(int64(start) + int64((nf+1)*4)) - ftab.SetUint32(ctxt.Arch, int64(start), uint32(nf+1)) - for i := nf; i > 0; i-- { - path := oldState.filepaths[i] - val := int64(i) - ftab.SetUint32(ctxt.Arch, int64(start)+val*4, uint32(ftabaddstring(ftab, path))) - } - ftab.SetSize(int64(len(ftab.Data()))) - ctxt.NumFilesyms = len(oldState.numberedFiles) - if ctxt.Debugvlog != 0 { ctxt.Logf("pclntab=%d bytes, funcdata total %d bytes\n", ftab.Size(), funcdataBytes) } diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index bc880955b8..d05b98f04a 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -619,6 +619,14 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { moduledata.AddAddr(ctxt.Arch, pcln.funcnametab) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.funcnametab))) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(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))) + // 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))) // The pclntab slice moduledata.AddAddr(ctxt.Arch, pcln.pclntab) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pclntab))) @@ -627,10 +635,6 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { moduledata.AddAddr(ctxt.Arch, pcln.pclntab) moduledata.AddUint(ctxt.Arch, uint64(pcln.nfunc+1)) moduledata.AddUint(ctxt.Arch, uint64(pcln.nfunc+1)) - // The filetab slice - moduledata.AddAddrPlus(ctxt.Arch, pcln.pclntab, int64(pcln.filetabOffset)) - moduledata.AddUint(ctxt.Arch, uint64(ctxt.NumFilesyms)+1) - moduledata.AddUint(ctxt.Arch, uint64(ctxt.NumFilesyms)+1) // findfunctab moduledata.AddAddr(ctxt.Arch, pcln.findfunctab) // minpc, maxpc diff --git a/src/debug/gosym/pclntab.go b/src/debug/gosym/pclntab.go index e5c50520fc..e383ea460a 100644 --- a/src/debug/gosym/pclntab.go +++ b/src/debug/gosym/pclntab.go @@ -53,6 +53,7 @@ type LineTable struct { quantum uint32 ptrsize uint32 funcnametab []byte + cutab []byte funcdata []byte functab []byte nfunctab uint32 @@ -223,17 +224,18 @@ func (t *LineTable) parsePclnTab() { switch possibleVersion { case ver116: t.nfunctab = uint32(t.uintptr(t.Data[8:])) - offset := t.uintptr(t.Data[8+t.ptrsize:]) + t.nfiletab = uint32(t.uintptr(t.Data[8+t.ptrsize:])) + offset := t.uintptr(t.Data[8+2*t.ptrsize:]) t.funcnametab = t.Data[offset:] - offset = t.uintptr(t.Data[8+2*t.ptrsize:]) + offset = t.uintptr(t.Data[8+3*t.ptrsize:]) + t.cutab = t.Data[offset:] + offset = t.uintptr(t.Data[8+4*t.ptrsize:]) + t.filetab = t.Data[offset:] + offset = t.uintptr(t.Data[8+5*t.ptrsize:]) t.funcdata = t.Data[offset:] t.functab = t.Data[offset:] functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize - fileoff := t.binary.Uint32(t.functab[functabsize:]) - t.filetab = t.functab[fileoff:] t.functab = t.functab[:functabsize] - t.nfiletab = t.binary.Uint32(t.filetab) - t.filetab = t.filetab[:t.nfiletab*4] case ver12: t.nfunctab = uint32(t.uintptr(t.Data[8:])) t.funcdata = t.Data @@ -330,17 +332,22 @@ func (t *LineTable) funcName(off uint32) string { return s } -// string returns a Go string found at off. -func (t *LineTable) string(off uint32) string { +// stringFrom returns a Go string found at off from a position. +func (t *LineTable) stringFrom(arr []byte, off uint32) string { if s, ok := t.strings[off]; ok { return s } - i := bytes.IndexByte(t.funcdata[off:], 0) - s := string(t.funcdata[off : off+uint32(i)]) + i := bytes.IndexByte(arr[off:], 0) + s := string(arr[off : off+uint32(i)]) t.strings[off] = s return s } +// string returns a Go string found at off. +func (t *LineTable) string(off uint32) string { + return t.stringFrom(t.funcdata, off) +} + // step advances to the next pc, value pair in the encoded table. func (t *LineTable) step(p *[]byte, pc *uint64, val *int32, first bool) bool { uvdelta := t.readvarint(p) @@ -453,7 +460,15 @@ func (t *LineTable) go12PCToFile(pc uint64) (file string) { if fno <= 0 { return "" } - return t.string(t.binary.Uint32(t.filetab[4*fno:])) + if t.version == ver12 { + return t.string(t.binary.Uint32(t.filetab[4*fno:])) + } + // Go ≥ 1.16 + cuoff := t.binary.Uint32(f[t.ptrsize+7*4:]) + if fnoff := t.binary.Uint32(t.cutab[(cuoff+uint32(fno))*4:]); fnoff != ^uint32(0) { + return t.stringFrom(t.filetab, fnoff) + } + return "" } // go12LineToPC maps a (file, line) pair to a program counter for the Go 1.2 pcln table. @@ -496,9 +511,18 @@ func (t *LineTable) initFileMap() { } m := make(map[string]uint32) - for i := uint32(1); i < t.nfiletab; i++ { - s := t.string(t.binary.Uint32(t.filetab[4*i:])) - m[s] = i + if t.version == ver12 { + for i := uint32(1); i < t.nfiletab; i++ { + s := t.string(t.binary.Uint32(t.filetab[4*i:])) + m[s] = i + } + } else { + var pos uint32 + for i := uint32(1); i < t.nfiletab; i++ { + s := t.stringFrom(t.filetab, pos) + pos += uint32(len(s) + 1) + m[s] = i + } } t.fileMap = m } diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 0bddcaa789..5a79c7e6ec 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -804,9 +804,10 @@ type _func struct { pcfile int32 pcln int32 npcdata int32 - cuIndex uint16 // TODO(jfaller): 16 bits is never enough, make this larger. - funcID funcID // set for certain special runtime functions - nfuncdata uint8 // must be last + cuOffset uint32 // runtime.cutab offset of this function's CU + funcID funcID // set for certain special runtime functions + _ [2]byte // pad + nfuncdata uint8 // must be last } // Pseudo-Func that is returned for PCs that occur in inlined code. diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index ddb5ea82b4..fbd9315522 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -334,14 +334,17 @@ const ( funcID_wrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.) ) -// PCHeader holds data used by the pclntab lookups. +// pcHeader holds data used by the pclntab lookups. type pcHeader struct { magic uint32 // 0xFFFFFFFA pad1, pad2 uint8 // 0,0 minLC uint8 // min instruction size ptrSize uint8 // size of a ptr in bytes nfunc int // number of functions in the module + nfiles uint // number of entries in the file tab. funcnameOffset uintptr // offset to the funcnametab variable from pcHeader + cuOffset uintptr // offset to the cutab variable from pcHeader + filetabOffset uintptr // offset to the filetab variable from pcHeader pclnOffset uintptr // offset to the pclntab variable from pcHeader } @@ -353,9 +356,10 @@ type pcHeader struct { type moduledata struct { pcHeader *pcHeader funcnametab []byte + cutab []uint32 + filetab []byte pclntable []byte ftab []functab - filetab []uint32 findfunctab uintptr minpc, maxpc uintptr @@ -851,7 +855,12 @@ func funcfile(f funcInfo, fileno int32) string { if !f.valid() { return "?" } - return gostringnocopy(&datap.pclntable[datap.filetab[fileno]]) + // Make sure the cu index and file offset are valid + if fileoff := datap.cutab[f.cuOffset+uint32(fileno)]; fileoff != ^uint32(0) { + return gostringnocopy(&datap.filetab[fileoff]) + } + // pcln section is corrupt. + return "?" } func funcline1(f funcInfo, targetpc uintptr, strict bool) (file string, line int32) { @@ -865,7 +874,7 @@ func funcline1(f funcInfo, targetpc uintptr, strict bool) (file string, line int // print("looking for ", hex(targetpc), " in ", funcname(f), " got file=", fileno, " line=", lineno, "\n") return "?", 0 } - file = gostringnocopy(&datap.pclntable[datap.filetab[fileno]]) + file = funcfile(f, fileno) return } @@ -1005,7 +1014,7 @@ type inlinedCall struct { parent int16 // index of parent in the inltree, or < 0 funcID funcID // type of the called function _ byte - file int32 // fileno index into filetab + file int32 // perCU file index for inlined call. See cmd/link:pcln.go line int32 // line number of the call site func_ 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) -- GitLab From b249703e3c53cd7f1e5f808fb2f03714fec44b43 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Wed, 12 Aug 2020 12:54:03 -0400 Subject: [PATCH 0155/1792] [dev.link] cmd/compile, cmd/asm: add length to hashed symbols While working on deduplicating pcdata, I found that the following hashed symbols would result in the same: [] == [0,0,0,0....] This makes using content addressable symbols untenable for pcdata. Adding the length to the hash keeps the dream alive. No difference in binary size (darwin, cmd/compile), spurious improvements in DWARF phase memory. Change-Id: I21101f7754a3d870922b0dea39c947cc8509432f Reviewed-on: https://go-review.googlesource.com/c/go/+/247903 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh Reviewed-by: Austin Clements Reviewed-by: Cherry Zhang --- src/cmd/internal/obj/objfile.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 7bc4f4992e..8234697d72 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -372,10 +372,22 @@ func contentHash64(s *LSym) goobj.Hash64Type { // hashed symbols. func (w *writer) contentHash(s *LSym) goobj.HashType { h := sha1.New() + var tmp [14]byte + + // Include the size of the symbol in the hash. + // This preserves the length of symbols, preventing the following two symbols + // from hashing the same: + // + // [2]int{1,2} ≠ [10]int{1,2,0,0,0...} + // + // In this case, if the smaller symbol is alive, the larger is not kept unless + // needed. + binary.LittleEndian.PutUint64(tmp[:8], uint64(s.Size)) + h.Write(tmp[:8]) + // The compiler trims trailing zeros _sometimes_. We just do // it always. h.Write(bytes.TrimRight(s.P, "\x00")) - var tmp [14]byte for i := range s.R { r := &s.R[i] binary.LittleEndian.PutUint32(tmp[:4], uint32(r.Off)) -- GitLab From cc700bdc269edc5fd29b14c1866c7f57f6f9b526 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Fri, 19 Jun 2020 17:59:16 -0400 Subject: [PATCH 0156/1792] cmd/trace: move viewer data structs into cmd/internal/traceviewer The ViewerEvent, ViewerData and ViewerFrame structs are moved into cmd/internal/traceviewer, and renamed Event, Data, and Frame. The structs are the same, except for the following: A definition for the JSON "bp" field that's defined in the trace format, but missing in the structs has been added. Also, the Tid and Pid fields on Event have been renamed TID and PID to better match Go style. Finally, the footer field on ViewerData, which hasn't been used for a while, has been removed. This CL is in preparation for the usage of these structs by cmd/go's tracing functionality. Updates #38714 Change-Id: I345f23617b96d4629b876ae717f89d56a67e05a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/239098 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/internal/traceviewer/format.go | 38 ++++++++ src/cmd/trace/trace.go | 125 ++++++++++--------------- src/cmd/trace/trace_test.go | 7 +- src/cmd/trace/trace_unix_test.go | 3 +- 4 files changed, 92 insertions(+), 81 deletions(-) create mode 100644 src/cmd/internal/traceviewer/format.go diff --git a/src/cmd/internal/traceviewer/format.go b/src/cmd/internal/traceviewer/format.go new file mode 100644 index 0000000000..871477447f --- /dev/null +++ b/src/cmd/internal/traceviewer/format.go @@ -0,0 +1,38 @@ +// 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 traceviewer provides definitions of the JSON data structures +// used by the Chrome trace viewer. +// +// The official description of the format is in this file: +// https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview +package traceviewer + +type Data struct { + Events []*Event `json:"traceEvents"` + Frames map[string]Frame `json:"stackFrames"` + TimeUnit string `json:"displayTimeUnit"` +} + +type Event struct { + Name string `json:"name,omitempty"` + Phase string `json:"ph"` + Scope string `json:"s,omitempty"` + Time float64 `json:"ts"` + Dur float64 `json:"dur,omitempty"` + PID uint64 `json:"pid"` + TID uint64 `json:"tid"` + ID uint64 `json:"id,omitempty"` + BindPoint string `json:"bp,omitempty"` + Stack int `json:"sf,omitempty"` + EndStack int `json:"esf,omitempty"` + Arg interface{} `json:"args,omitempty"` + Cname string `json:"cname,omitempty"` + Category string `json:"cat,omitempty"` +} + +type Frame struct { + Name string `json:"name"` + Parent int `json:"parent,omitempty"` +} diff --git a/src/cmd/trace/trace.go b/src/cmd/trace/trace.go index b452376627..30c80f0e04 100644 --- a/src/cmd/trace/trace.go +++ b/src/cmd/trace/trace.go @@ -5,6 +5,7 @@ package main import ( + "cmd/internal/traceviewer" "encoding/json" "fmt" "internal/trace" @@ -325,7 +326,7 @@ func splittingTraceConsumer(max int) (*splitter, traceConsumer) { } var ( - data = ViewerData{Frames: make(map[string]ViewerFrame)} + data = traceviewer.Data{Frames: make(map[string]traceviewer.Frame)} sizes []eventSz cw countingWriter @@ -337,7 +338,7 @@ func splittingTraceConsumer(max int) (*splitter, traceConsumer) { consumeTimeUnit: func(unit string) { data.TimeUnit = unit }, - consumeViewerEvent: func(v *ViewerEvent, required bool) { + consumeViewerEvent: func(v *traceviewer.Event, required bool) { if required { // Store required events inside data // so flush can include them in the required @@ -350,7 +351,7 @@ func splittingTraceConsumer(max int) (*splitter, traceConsumer) { sizes = append(sizes, eventSz{v.Time, cw.size + 1}) // +1 for ",". cw.size = 0 }, - consumeViewerFrame: func(k string, v ViewerFrame) { + consumeViewerFrame: func(k string, v traceviewer.Frame) { data.Frames[k] = v }, flush: func() { @@ -478,36 +479,6 @@ type gInfo struct { markAssist *trace.Event // if non-nil, the mark assist currently running. } -type ViewerData struct { - Events []*ViewerEvent `json:"traceEvents"` - Frames map[string]ViewerFrame `json:"stackFrames"` - TimeUnit string `json:"displayTimeUnit"` - - // This is where mandatory part of the trace starts (e.g. thread names) - footer int -} - -type ViewerEvent struct { - Name string `json:"name,omitempty"` - Phase string `json:"ph"` - Scope string `json:"s,omitempty"` - Time float64 `json:"ts"` - Dur float64 `json:"dur,omitempty"` - Pid uint64 `json:"pid"` - Tid uint64 `json:"tid"` - ID uint64 `json:"id,omitempty"` - Stack int `json:"sf,omitempty"` - EndStack int `json:"esf,omitempty"` - Arg interface{} `json:"args,omitempty"` - Cname string `json:"cname,omitempty"` - Category string `json:"cat,omitempty"` -} - -type ViewerFrame struct { - Name string `json:"name"` - Parent int `json:"parent,omitempty"` -} - type NameArg struct { Name string `json:"name"` } @@ -528,8 +499,8 @@ type SortIndexArg struct { type traceConsumer struct { consumeTimeUnit func(unit string) - consumeViewerEvent func(v *ViewerEvent, required bool) - consumeViewerFrame func(key string, f ViewerFrame) + consumeViewerEvent func(v *traceviewer.Event, required bool) + consumeViewerFrame func(key string, f traceviewer.Frame) flush func() } @@ -775,23 +746,23 @@ func generateTrace(params *traceParams, consumer traceConsumer) error { ctx.emitSectionFooter(procsSection, "PROCS", 2) } - ctx.emitFooter(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: procsSection, Tid: trace.GCP, Arg: &NameArg{"GC"}}) - ctx.emitFooter(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: procsSection, Tid: trace.GCP, Arg: &SortIndexArg{-6}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_name", Phase: "M", PID: procsSection, TID: trace.GCP, Arg: &NameArg{"GC"}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_sort_index", Phase: "M", PID: procsSection, TID: trace.GCP, Arg: &SortIndexArg{-6}}) - ctx.emitFooter(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: procsSection, Tid: trace.NetpollP, Arg: &NameArg{"Network"}}) - ctx.emitFooter(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: procsSection, Tid: trace.NetpollP, Arg: &SortIndexArg{-5}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_name", Phase: "M", PID: procsSection, TID: trace.NetpollP, Arg: &NameArg{"Network"}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_sort_index", Phase: "M", PID: procsSection, TID: trace.NetpollP, Arg: &SortIndexArg{-5}}) - ctx.emitFooter(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: procsSection, Tid: trace.TimerP, Arg: &NameArg{"Timers"}}) - ctx.emitFooter(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: procsSection, Tid: trace.TimerP, Arg: &SortIndexArg{-4}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_name", Phase: "M", PID: procsSection, TID: trace.TimerP, Arg: &NameArg{"Timers"}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_sort_index", Phase: "M", PID: procsSection, TID: trace.TimerP, Arg: &SortIndexArg{-4}}) - ctx.emitFooter(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: procsSection, Tid: trace.SyscallP, Arg: &NameArg{"Syscalls"}}) - ctx.emitFooter(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: procsSection, Tid: trace.SyscallP, Arg: &SortIndexArg{-3}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_name", Phase: "M", PID: procsSection, TID: trace.SyscallP, Arg: &NameArg{"Syscalls"}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_sort_index", Phase: "M", PID: procsSection, TID: trace.SyscallP, Arg: &SortIndexArg{-3}}) // Display rows for Ps if we are in the default trace view mode (not goroutine-oriented presentation) if ctx.mode&modeGoroutineOriented == 0 { for i := 0; i <= maxProc; i++ { - ctx.emitFooter(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: procsSection, Tid: uint64(i), Arg: &NameArg{fmt.Sprintf("Proc %v", i)}}) - ctx.emitFooter(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: procsSection, Tid: uint64(i), Arg: &SortIndexArg{i}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_name", Phase: "M", PID: procsSection, TID: uint64(i), Arg: &NameArg{fmt.Sprintf("Proc %v", i)}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_sort_index", Phase: "M", PID: procsSection, TID: uint64(i), Arg: &SortIndexArg{i}}) } } @@ -829,27 +800,27 @@ func generateTrace(params *traceParams, consumer traceConsumer) error { if !ctx.gs[k] { continue } - ctx.emitFooter(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: procsSection, Tid: k, Arg: &NameArg{v.name}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_name", Phase: "M", PID: procsSection, TID: k, Arg: &NameArg{v.name}}) } // Row for the main goroutine (maing) - ctx.emitFooter(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: procsSection, Tid: ctx.maing, Arg: &SortIndexArg{-2}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_sort_index", Phase: "M", PID: procsSection, TID: ctx.maing, Arg: &SortIndexArg{-2}}) // Row for GC or global state (specified with G=0) - ctx.emitFooter(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: procsSection, Tid: 0, Arg: &SortIndexArg{-1}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_sort_index", Phase: "M", PID: procsSection, TID: 0, Arg: &SortIndexArg{-1}}) } return nil } -func (ctx *traceContext) emit(e *ViewerEvent) { +func (ctx *traceContext) emit(e *traceviewer.Event) { ctx.consumer.consumeViewerEvent(e, false) } -func (ctx *traceContext) emitFooter(e *ViewerEvent) { +func (ctx *traceContext) emitFooter(e *traceviewer.Event) { ctx.consumer.consumeViewerEvent(e, true) } func (ctx *traceContext) emitSectionFooter(sectionID uint64, name string, priority int) { - ctx.emitFooter(&ViewerEvent{Name: "process_name", Phase: "M", Pid: sectionID, Arg: &NameArg{name}}) - ctx.emitFooter(&ViewerEvent{Name: "process_sort_index", Phase: "M", Pid: sectionID, Arg: &SortIndexArg{priority}}) + ctx.emitFooter(&traceviewer.Event{Name: "process_name", Phase: "M", PID: sectionID, Arg: &NameArg{name}}) + ctx.emitFooter(&traceviewer.Event{Name: "process_sort_index", Phase: "M", PID: sectionID, Arg: &SortIndexArg{priority}}) } func (ctx *traceContext) time(ev *trace.Event) float64 { @@ -880,7 +851,7 @@ func (ctx *traceContext) emitSlice(ev *trace.Event, name string) { ctx.emit(ctx.makeSlice(ev, name)) } -func (ctx *traceContext) makeSlice(ev *trace.Event, name string) *ViewerEvent { +func (ctx *traceContext) makeSlice(ev *trace.Event, name string) *traceviewer.Event { // If ViewerEvent.Dur is not a positive value, // trace viewer handles it as a non-terminating time interval. // Avoid it by setting the field with a small value. @@ -888,12 +859,12 @@ func (ctx *traceContext) makeSlice(ev *trace.Event, name string) *ViewerEvent { if ev.Link.Ts-ev.Ts <= 0 { durationUsec = 0.0001 // 0.1 nanoseconds } - sl := &ViewerEvent{ + sl := &traceviewer.Event{ Name: name, Phase: "X", Time: ctx.time(ev), Dur: durationUsec, - Tid: ctx.proc(ev), + TID: ctx.proc(ev), Stack: ctx.stack(ev.Stk), EndStack: ctx.stack(ev.Link.Stk), } @@ -927,16 +898,16 @@ func (ctx *traceContext) emitTask(task *taskDesc, sortIndex int) { taskName := task.name durationUsec := float64(task.lastTimestamp()-task.firstTimestamp()) / 1e3 - ctx.emitFooter(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: tasksSection, Tid: taskRow, Arg: &NameArg{fmt.Sprintf("T%d %s", task.id, taskName)}}) - ctx.emit(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: tasksSection, Tid: taskRow, Arg: &SortIndexArg{sortIndex}}) + ctx.emitFooter(&traceviewer.Event{Name: "thread_name", Phase: "M", PID: tasksSection, TID: taskRow, Arg: &NameArg{fmt.Sprintf("T%d %s", task.id, taskName)}}) + ctx.emit(&traceviewer.Event{Name: "thread_sort_index", Phase: "M", PID: tasksSection, TID: taskRow, Arg: &SortIndexArg{sortIndex}}) ts := float64(task.firstTimestamp()) / 1e3 - sl := &ViewerEvent{ + sl := &traceviewer.Event{ Name: taskName, Phase: "X", Time: ts, Dur: durationUsec, - Pid: tasksSection, - Tid: taskRow, + PID: tasksSection, + TID: taskRow, Cname: pickTaskColor(task.id), } targ := TaskArg{ID: task.id} @@ -953,8 +924,8 @@ func (ctx *traceContext) emitTask(task *taskDesc, sortIndex int) { if task.create != nil && task.create.Type == trace.EvUserTaskCreate && task.create.Args[1] != 0 { ctx.arrowSeq++ - ctx.emit(&ViewerEvent{Name: "newTask", Phase: "s", Tid: task.create.Args[1], ID: ctx.arrowSeq, Time: ts, Pid: tasksSection}) - ctx.emit(&ViewerEvent{Name: "newTask", Phase: "t", Tid: taskRow, ID: ctx.arrowSeq, Time: ts, Pid: tasksSection}) + ctx.emit(&traceviewer.Event{Name: "newTask", Phase: "s", TID: task.create.Args[1], ID: ctx.arrowSeq, Time: ts, PID: tasksSection}) + ctx.emit(&traceviewer.Event{Name: "newTask", Phase: "t", TID: taskRow, ID: ctx.arrowSeq, Time: ts, PID: tasksSection}) } } @@ -975,12 +946,12 @@ func (ctx *traceContext) emitRegion(s regionDesc) { scopeID := fmt.Sprintf("%x", id) name := s.Name - sl0 := &ViewerEvent{ + sl0 := &traceviewer.Event{ Category: "Region", Name: name, Phase: "b", Time: float64(s.firstTimestamp()) / 1e3, - Tid: s.G, // only in goroutine-oriented view + TID: s.G, // only in goroutine-oriented view ID: uint64(regionID), Scope: scopeID, Cname: pickTaskColor(s.TaskID), @@ -990,12 +961,12 @@ func (ctx *traceContext) emitRegion(s regionDesc) { } ctx.emit(sl0) - sl1 := &ViewerEvent{ + sl1 := &traceviewer.Event{ Category: "Region", Name: name, Phase: "e", Time: float64(s.lastTimestamp()) / 1e3, - Tid: s.G, + TID: s.G, ID: uint64(regionID), Scope: scopeID, Cname: pickTaskColor(s.TaskID), @@ -1021,7 +992,7 @@ func (ctx *traceContext) emitHeapCounters(ev *trace.Event) { diff = ctx.heapStats.nextGC - ctx.heapStats.heapAlloc } if tsWithinRange(ev.Ts, ctx.startTime, ctx.endTime) { - ctx.emit(&ViewerEvent{Name: "Heap", Phase: "C", Time: ctx.time(ev), Pid: 1, Arg: &heapCountersArg{ctx.heapStats.heapAlloc, diff}}) + ctx.emit(&traceviewer.Event{Name: "Heap", Phase: "C", Time: ctx.time(ev), PID: 1, Arg: &heapCountersArg{ctx.heapStats.heapAlloc, diff}}) } ctx.prevHeapStats = ctx.heapStats } @@ -1037,7 +1008,7 @@ func (ctx *traceContext) emitGoroutineCounters(ev *trace.Event) { return } if tsWithinRange(ev.Ts, ctx.startTime, ctx.endTime) { - ctx.emit(&ViewerEvent{Name: "Goroutines", Phase: "C", Time: ctx.time(ev), Pid: 1, Arg: &goroutineCountersArg{uint64(ctx.gstates[gRunning]), uint64(ctx.gstates[gRunnable]), uint64(ctx.gstates[gWaitingGC])}}) + ctx.emit(&traceviewer.Event{Name: "Goroutines", Phase: "C", Time: ctx.time(ev), PID: 1, Arg: &goroutineCountersArg{uint64(ctx.gstates[gRunning]), uint64(ctx.gstates[gRunnable]), uint64(ctx.gstates[gWaitingGC])}}) } ctx.prevGstates = ctx.gstates } @@ -1052,7 +1023,7 @@ func (ctx *traceContext) emitThreadCounters(ev *trace.Event) { return } if tsWithinRange(ev.Ts, ctx.startTime, ctx.endTime) { - ctx.emit(&ViewerEvent{Name: "Threads", Phase: "C", Time: ctx.time(ev), Pid: 1, Arg: &threadCountersArg{ + ctx.emit(&traceviewer.Event{Name: "Threads", Phase: "C", Time: ctx.time(ev), PID: 1, Arg: &threadCountersArg{ Running: ctx.threadStats.prunning, InSyscall: ctx.threadStats.insyscall}}) } @@ -1090,13 +1061,13 @@ func (ctx *traceContext) emitInstant(ev *trace.Event, name, category string) { } arg = &Arg{ev.Args[0]} } - ctx.emit(&ViewerEvent{ + ctx.emit(&traceviewer.Event{ Name: name, Category: category, Phase: "I", Scope: "t", Time: ctx.time(ev), - Tid: ctx.proc(ev), + TID: ctx.proc(ev), Stack: ctx.stack(ev.Stk), Cname: cname, Arg: arg}) @@ -1134,8 +1105,8 @@ func (ctx *traceContext) emitArrow(ev *trace.Event, name string) { } ctx.arrowSeq++ - ctx.emit(&ViewerEvent{Name: name, Phase: "s", Tid: ctx.proc(ev), ID: ctx.arrowSeq, Time: ctx.time(ev), Stack: ctx.stack(ev.Stk), Cname: color}) - ctx.emit(&ViewerEvent{Name: name, Phase: "t", Tid: ctx.proc(ev.Link), ID: ctx.arrowSeq, Time: ctx.time(ev.Link), Cname: color}) + ctx.emit(&traceviewer.Event{Name: name, Phase: "s", TID: ctx.proc(ev), ID: ctx.arrowSeq, Time: ctx.time(ev), Stack: ctx.stack(ev.Stk), Cname: color}) + ctx.emit(&traceviewer.Event{Name: name, Phase: "t", TID: ctx.proc(ev.Link), ID: ctx.arrowSeq, Time: ctx.time(ev.Link), Cname: color}) } func (ctx *traceContext) stack(stk []*trace.Frame) int { @@ -1157,7 +1128,7 @@ func (ctx *traceContext) buildBranch(parent frameNode, stk []*trace.Frame) int { node.id = ctx.frameSeq node.children = make(map[uint64]frameNode) parent.children[frame.PC] = node - ctx.consumer.consumeViewerFrame(strconv.Itoa(node.id), ViewerFrame{fmt.Sprintf("%v:%v", frame.Fn, frame.Line), parent.id}) + ctx.consumer.consumeViewerFrame(strconv.Itoa(node.id), traceviewer.Frame{Name: fmt.Sprintf("%v:%v", frame.Fn, frame.Line), Parent: parent.id}) } return ctx.buildBranch(node, stk) } @@ -1192,7 +1163,7 @@ type jsonWriter struct { } func viewerDataTraceConsumer(w io.Writer, start, end int64) traceConsumer { - frames := make(map[string]ViewerFrame) + frames := make(map[string]traceviewer.Frame) enc := json.NewEncoder(w) written := 0 index := int64(-1) @@ -1204,7 +1175,7 @@ func viewerDataTraceConsumer(w io.Writer, start, end int64) traceConsumer { enc.Encode(unit) io.WriteString(w, ",") }, - consumeViewerEvent: func(v *ViewerEvent, required bool) { + consumeViewerEvent: func(v *traceviewer.Event, required bool) { index++ if !required && (index < start || index > end) { // not in the range. Skip! @@ -1221,7 +1192,7 @@ func viewerDataTraceConsumer(w io.Writer, start, end int64) traceConsumer { // Same should be applied to splittingTraceConsumer. written++ }, - consumeViewerFrame: func(k string, v ViewerFrame) { + consumeViewerFrame: func(k string, v traceviewer.Frame) { frames[k] = v }, flush: func() { diff --git a/src/cmd/trace/trace_test.go b/src/cmd/trace/trace_test.go index ef2d06c961..dd12e8cd20 100644 --- a/src/cmd/trace/trace_test.go +++ b/src/cmd/trace/trace_test.go @@ -7,6 +7,7 @@ package main import ( + "cmd/internal/traceviewer" "context" "internal/trace" "io/ioutil" @@ -78,7 +79,7 @@ func TestGoroutineCount(t *testing.T) { // Use the default viewerDataTraceConsumer but replace // consumeViewerEvent to intercept the ViewerEvents for testing. c := viewerDataTraceConsumer(ioutil.Discard, 0, 1<<63-1) - c.consumeViewerEvent = func(ev *ViewerEvent, _ bool) { + c.consumeViewerEvent = func(ev *traceviewer.Event, _ bool) { if ev.Name == "Goroutines" { cnt := ev.Arg.(*goroutineCountersArg) if cnt.Runnable+cnt.Running > 2 { @@ -165,7 +166,7 @@ func TestPreemptedMarkAssist(t *testing.T) { c := viewerDataTraceConsumer(ioutil.Discard, 0, 1<<63-1) marks := 0 - c.consumeViewerEvent = func(ev *ViewerEvent, _ bool) { + c.consumeViewerEvent = func(ev *traceviewer.Event, _ bool) { if strings.Contains(ev.Name, "MARK ASSIST") { marks++ } @@ -216,7 +217,7 @@ func TestFoo(t *testing.T) { c := viewerDataTraceConsumer(ioutil.Discard, 0, 1<<63-1) var logBeforeTaskEnd, logAfterTaskEnd bool - c.consumeViewerEvent = func(ev *ViewerEvent, _ bool) { + c.consumeViewerEvent = func(ev *traceviewer.Event, _ bool) { if ev.Name == "log before task ends" { logBeforeTaskEnd = true } diff --git a/src/cmd/trace/trace_unix_test.go b/src/cmd/trace/trace_unix_test.go index fec060e121..645978e0f8 100644 --- a/src/cmd/trace/trace_unix_test.go +++ b/src/cmd/trace/trace_unix_test.go @@ -8,6 +8,7 @@ package main import ( "bytes" + "cmd/internal/traceviewer" traceparser "internal/trace" "io/ioutil" "runtime" @@ -83,7 +84,7 @@ func TestGoroutineInSyscall(t *testing.T) { // Check only one thread for the pipe read goroutine is // considered in-syscall. c := viewerDataTraceConsumer(ioutil.Discard, 0, 1<<63-1) - c.consumeViewerEvent = func(ev *ViewerEvent, _ bool) { + c.consumeViewerEvent = func(ev *traceviewer.Event, _ bool) { if ev.Name == "Threads" { arg := ev.Arg.(*threadCountersArg) if arg.InSyscall > 1 { -- GitLab From 20254c02b38055c1bb6d5ac8aba70bb7b8d638ef Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Tue, 14 Apr 2020 17:29:27 -0400 Subject: [PATCH 0157/1792] cmd/go: add rudimentary tracing support. Updates #38714 Change-Id: I14da982d405074d65ccf5521d431df1bf1734f9a Reviewed-on: https://go-review.googlesource.com/c/go/+/230378 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/trace/trace.go | 139 +++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/cmd/go/internal/trace/trace.go diff --git a/src/cmd/go/internal/trace/trace.go b/src/cmd/go/internal/trace/trace.go new file mode 100644 index 0000000000..7cb7636a34 --- /dev/null +++ b/src/cmd/go/internal/trace/trace.go @@ -0,0 +1,139 @@ +// 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 trace + +import ( + "cmd/internal/traceviewer" + "context" + "encoding/json" + "errors" + "os" + "strings" + "sync/atomic" + "time" +) + +var traceStarted int32 + +func getTraceContext(ctx context.Context) (traceContext, bool) { + if atomic.LoadInt32(&traceStarted) == 0 { + return traceContext{}, false + } + v := ctx.Value(traceKey{}) + if v == nil { + return traceContext{}, false + } + return v.(traceContext), true +} + +// StartSpan starts a trace event with the given name. The Span ends when its Done method is called. +func StartSpan(ctx context.Context, name string) (context.Context, *Span) { + tc, ok := getTraceContext(ctx) + if !ok { + return ctx, nil + } + childSpan := &Span{t: tc.t, name: name, start: time.Now()} + tc.t.writeEvent(&traceviewer.Event{ + Name: childSpan.name, + Time: float64(childSpan.start.UnixNano()) / float64(time.Microsecond), + Phase: "B", + }) + ctx = context.WithValue(ctx, traceKey{}, traceContext{tc.t}) + return ctx, childSpan +} + +type Span struct { + t *tracer + + name string + start time.Time + end time.Time +} + +func (s *Span) Done() { + if s == nil { + return + } + s.end = time.Now() + s.t.writeEvent(&traceviewer.Event{ + Name: s.name, + Time: float64(s.end.UnixNano()) / float64(time.Microsecond), + Phase: "E", + }) +} + +type tracer struct { + file chan traceFile // 1-buffered +} + +func (t *tracer) writeEvent(ev *traceviewer.Event) error { + f := <-t.file + defer func() { t.file <- f }() + var err error + if f.entries == 0 { + _, err = f.sb.WriteString("[\n") + } else { + _, err = f.sb.WriteString(",") + } + f.entries++ + if err != nil { + return nil + } + + if err := f.enc.Encode(ev); err != nil { + return err + } + + // Write event string to output file. + _, err = f.f.WriteString(f.sb.String()) + f.sb.Reset() + return err +} + +func (t *tracer) Close() error { + f := <-t.file + defer func() { t.file <- f }() + + _, firstErr := f.f.WriteString("]") + if err := f.f.Close(); firstErr == nil { + firstErr = err + } + return firstErr +} + +// traceKey is the context key for tracing information. It is unexported to prevent collisions with context keys defined in +// other packages. +type traceKey struct{} + +type traceContext struct { + t *tracer +} + +// Start starts a trace which writes to the given file. +func Start(ctx context.Context, file string) (context.Context, func() error, error) { + atomic.StoreInt32(&traceStarted, 1) + if file == "" { + return nil, nil, errors.New("no trace file supplied") + } + f, err := os.Create(file) + if err != nil { + return nil, nil, err + } + t := &tracer{file: make(chan traceFile, 1)} + sb := new(strings.Builder) + t.file <- traceFile{ + f: f, + sb: sb, + enc: json.NewEncoder(sb), + } + ctx = context.WithValue(ctx, traceKey{}, traceContext{t: t}) + return ctx, t.Close, nil +} + +type traceFile struct { + f *os.File + sb *strings.Builder + enc *json.Encoder + entries int64 +} -- GitLab From 52b0ea20ff10fdcfe570ef407bd462d23e13d782 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Tue, 14 Apr 2020 17:29:27 -0400 Subject: [PATCH 0158/1792] cmd/go: add a debug-trace flag to generate traces If cmd/go is provided with a -debug-trace= option, cmd/go will write an execution trace to that file. Updates #38714 Change-Id: I3e6521343902c08266a0292f4280298a3bf8b725 Reviewed-on: https://go-review.googlesource.com/c/go/+/237683 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/cfg/cfg.go | 1 + src/cmd/go/internal/work/build.go | 1 + src/cmd/go/main.go | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go index 7f8f8e92be..f9bbcd9180 100644 --- a/src/cmd/go/internal/cfg/cfg.go +++ b/src/cmd/go/internal/cfg/cfg.go @@ -51,6 +51,7 @@ var ( CmdName string // "build", "install", "list", "mod tidy", etc. DebugActiongraph string // -debug-actiongraph flag (undocumented, unstable) + DebugTrace string // -debug-trace flag ) func defaultContext() build.Context { diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 7146c9ce00..fbd49b457b 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -270,6 +270,7 @@ func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) { // Undocumented, unstable debugging flags. cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "") + cmd.Flag.StringVar(&cfg.DebugTrace, "debug-trace", "", "") } // AddModCommonFlags adds the module-related flags common to build commands diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index fdf49b7380..3512866e4a 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -7,6 +7,7 @@ package main import ( + "context" "flag" "fmt" "log" @@ -34,6 +35,7 @@ import ( "cmd/go/internal/run" "cmd/go/internal/test" "cmd/go/internal/tool" + "cmd/go/internal/trace" "cmd/go/internal/version" "cmd/go/internal/vet" "cmd/go/internal/work" @@ -187,7 +189,11 @@ BigCmdLoop: cmd.Flag.Parse(args[1:]) args = cmd.Flag.Args() } + ctx := maybeStartTrace(context.Background()) + ctx, span := trace.StartSpan(ctx, fmt.Sprint("Running ", cmd.Name(), " command")) + _ = ctx cmd.Run(cmd, args) + span.Done() base.Exit() return } @@ -209,3 +215,21 @@ func mainUsage() { help.PrintUsage(os.Stderr, base.Go) os.Exit(2) } + +func maybeStartTrace(pctx context.Context) context.Context { + if cfg.DebugTrace == "" { + return pctx + } + + ctx, close, err := trace.Start(pctx, cfg.DebugTrace) + if err != nil { + base.Fatalf("failed to start trace: %v", err) + } + base.AtExit(func() { + if err := close(); err != nil { + base.Fatalf("failed to stop trace: %v", err) + } + }) + + return ctx +} -- GitLab From 14715b24793176b30b3c41adf4ac4e676c2a56f0 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Fri, 12 Jun 2020 14:33:23 -0400 Subject: [PATCH 0159/1792] cmd/go: add Context parameter to base.command.Run One small step to start propagating the context in cmd/go for tracing purposes. Updates #38714 Change-Id: Ibb6debeb9233f84d55f0e81244487355cbe7b82c Reviewed-on: https://go-review.googlesource.com/c/go/+/237684 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/base/base.go | 3 ++- src/cmd/go/internal/bug/bug.go | 3 ++- src/cmd/go/internal/clean/clean.go | 3 ++- src/cmd/go/internal/doc/doc.go | 3 ++- src/cmd/go/internal/envcmd/env.go | 3 ++- src/cmd/go/internal/fix/fix.go | 3 ++- src/cmd/go/internal/fmtcmd/fmt.go | 3 ++- src/cmd/go/internal/generate/generate.go | 3 ++- src/cmd/go/internal/get/get.go | 3 ++- src/cmd/go/internal/list/list.go | 3 ++- src/cmd/go/internal/modcmd/download.go | 3 ++- src/cmd/go/internal/modcmd/edit.go | 3 ++- src/cmd/go/internal/modcmd/graph.go | 3 ++- src/cmd/go/internal/modcmd/init.go | 3 ++- src/cmd/go/internal/modcmd/tidy.go | 3 ++- src/cmd/go/internal/modcmd/vendor.go | 3 ++- src/cmd/go/internal/modcmd/verify.go | 3 ++- src/cmd/go/internal/modcmd/why.go | 3 ++- src/cmd/go/internal/modget/get.go | 3 ++- src/cmd/go/internal/run/run.go | 3 ++- src/cmd/go/internal/test/test.go | 3 ++- src/cmd/go/internal/tool/tool.go | 3 ++- src/cmd/go/internal/version/version.go | 3 ++- src/cmd/go/internal/vet/vet.go | 3 ++- src/cmd/go/internal/work/build.go | 5 +++-- src/cmd/go/main.go | 3 +-- 26 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/cmd/go/internal/base/base.go b/src/cmd/go/internal/base/base.go index ab2f1bb4e2..db3ebef933 100644 --- a/src/cmd/go/internal/base/base.go +++ b/src/cmd/go/internal/base/base.go @@ -7,6 +7,7 @@ package base import ( + "context" "flag" "fmt" "log" @@ -24,7 +25,7 @@ import ( type Command struct { // Run runs the command. // The args are the arguments after the command name. - Run func(cmd *Command, args []string) + Run func(ctx context.Context, cmd *Command, args []string) // UsageLine is the one-line usage message. // The words between "go" and the first flag or argument in the line are taken to be the command name. diff --git a/src/cmd/go/internal/bug/bug.go b/src/cmd/go/internal/bug/bug.go index fe71281ef0..52bd40f2fb 100644 --- a/src/cmd/go/internal/bug/bug.go +++ b/src/cmd/go/internal/bug/bug.go @@ -7,6 +7,7 @@ package bug import ( "bytes" + "context" "fmt" "io" "io/ioutil" @@ -37,7 +38,7 @@ func init() { CmdBug.Flag.BoolVar(&cfg.BuildV, "v", false, "") } -func runBug(cmd *base.Command, args []string) { +func runBug(ctx context.Context, cmd *base.Command, args []string) { if len(args) > 0 { base.Fatalf("go bug: bug takes no arguments") } diff --git a/src/cmd/go/internal/clean/clean.go b/src/cmd/go/internal/clean/clean.go index 99704cb2b1..8af3e3df9c 100644 --- a/src/cmd/go/internal/clean/clean.go +++ b/src/cmd/go/internal/clean/clean.go @@ -6,6 +6,7 @@ package clean import ( + "context" "fmt" "io/ioutil" "os" @@ -105,7 +106,7 @@ func init() { work.AddBuildFlags(CmdClean, work.DefaultBuildFlags) } -func runClean(cmd *base.Command, args []string) { +func runClean(ctx context.Context, cmd *base.Command, args []string) { // golang.org/issue/29925: only load packages before cleaning if // either the flags and arguments explicitly imply a package, // or no other target (such as a cache) was requested to be cleaned. diff --git a/src/cmd/go/internal/doc/doc.go b/src/cmd/go/internal/doc/doc.go index 4ff08bb928..67f76e2256 100644 --- a/src/cmd/go/internal/doc/doc.go +++ b/src/cmd/go/internal/doc/doc.go @@ -8,6 +8,7 @@ package doc import ( "cmd/go/internal/base" "cmd/go/internal/cfg" + "context" ) var CmdDoc = &base.Command{ @@ -129,6 +130,6 @@ Flags: `, } -func runDoc(cmd *base.Command, args []string) { +func runDoc(ctx context.Context, cmd *base.Command, args []string) { base.Run(cfg.BuildToolexec, base.Tool("doc"), args) } diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go index 252025dc25..403e0f4a7b 100644 --- a/src/cmd/go/internal/envcmd/env.go +++ b/src/cmd/go/internal/envcmd/env.go @@ -6,6 +6,7 @@ package envcmd import ( + "context" "encoding/json" "fmt" "go/build" @@ -186,7 +187,7 @@ func argKey(arg string) string { return arg[:i] } -func runEnv(cmd *base.Command, args []string) { +func runEnv(ctx context.Context, cmd *base.Command, args []string) { if *envJson && *envU { base.Fatalf("go env: cannot use -json with -u") } diff --git a/src/cmd/go/internal/fix/fix.go b/src/cmd/go/internal/fix/fix.go index 4d741df2b4..f16af05fc8 100644 --- a/src/cmd/go/internal/fix/fix.go +++ b/src/cmd/go/internal/fix/fix.go @@ -11,6 +11,7 @@ import ( "cmd/go/internal/load" "cmd/go/internal/modload" "cmd/go/internal/str" + "context" "fmt" "os" ) @@ -31,7 +32,7 @@ See also: go fmt, go vet. `, } -func runFix(cmd *base.Command, args []string) { +func runFix(ctx context.Context, cmd *base.Command, args []string) { printed := false for _, pkg := range load.Packages(args) { if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main { diff --git a/src/cmd/go/internal/fmtcmd/fmt.go b/src/cmd/go/internal/fmtcmd/fmt.go index d6894edc9f..9868efc7ef 100644 --- a/src/cmd/go/internal/fmtcmd/fmt.go +++ b/src/cmd/go/internal/fmtcmd/fmt.go @@ -6,6 +6,7 @@ package fmtcmd import ( + "context" "errors" "fmt" "os" @@ -48,7 +49,7 @@ See also: go fix, go vet. `, } -func runFmt(cmd *base.Command, args []string) { +func runFmt(ctx context.Context, cmd *base.Command, args []string) { printed := false gofmt := gofmtPath() procs := runtime.GOMAXPROCS(0) diff --git a/src/cmd/go/internal/generate/generate.go b/src/cmd/go/internal/generate/generate.go index 093b19817b..fb26f77f95 100644 --- a/src/cmd/go/internal/generate/generate.go +++ b/src/cmd/go/internal/generate/generate.go @@ -8,6 +8,7 @@ package generate import ( "bufio" "bytes" + "context" "fmt" "go/parser" "go/token" @@ -160,7 +161,7 @@ func init() { CmdGenerate.Flag.StringVar(&generateRunFlag, "run", "", "") } -func runGenerate(cmd *base.Command, args []string) { +func runGenerate(ctx context.Context, cmd *base.Command, args []string) { load.IgnoreImports = true if generateRunFlag != "" { diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index d38350c2a8..f7da5270b0 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -6,6 +6,7 @@ package get import ( + "context" "fmt" "os" "path/filepath" @@ -112,7 +113,7 @@ func init() { CmdGet.Flag.BoolVar(&Insecure, "insecure", Insecure, "") } -func runGet(cmd *base.Command, args []string) { +func runGet(ctx context.Context, cmd *base.Command, args []string) { if cfg.ModulesEnabled { // Should not happen: main.go should install the separate module-enabled get code. base.Fatalf("go get: modules not implemented") diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 6ca1561121..ef0a5a2f2d 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -8,6 +8,7 @@ package list import ( "bufio" "bytes" + "context" "encoding/json" "io" "os" @@ -309,7 +310,7 @@ var ( var nl = []byte{'\n'} -func runList(cmd *base.Command, args []string) { +func runList(ctx context.Context, cmd *base.Command, args []string) { modload.LoadTests = *listTest work.BuildInit() out := newTrackingWriter(os.Stdout) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 584434935b..b43c32be5a 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -5,6 +5,7 @@ package modcmd import ( + "context" "encoding/json" "os" @@ -78,7 +79,7 @@ type moduleJSON struct { GoModSum string `json:",omitempty"` } -func runDownload(cmd *base.Command, args []string) { +func runDownload(ctx context.Context, cmd *base.Command, args []string) { // Check whether modules are enabled and whether we're in a module. if cfg.Getenv("GO111MODULE") == "off" { base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") diff --git a/src/cmd/go/internal/modcmd/edit.go b/src/cmd/go/internal/modcmd/edit.go index dbbfb96e42..a81c25270f 100644 --- a/src/cmd/go/internal/modcmd/edit.go +++ b/src/cmd/go/internal/modcmd/edit.go @@ -8,6 +8,7 @@ package modcmd import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -141,7 +142,7 @@ func init() { base.AddBuildFlagsNX(&cmdEdit.Flag) } -func runEdit(cmd *base.Command, args []string) { +func runEdit(ctx context.Context, cmd *base.Command, args []string) { anyFlags := *editModule != "" || *editGo != "" || diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index 27ae9354f3..fff5b02626 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -8,6 +8,7 @@ package modcmd import ( "bufio" + "context" "os" "sort" @@ -36,7 +37,7 @@ func init() { work.AddModCommonFlags(cmdGraph) } -func runGraph(cmd *base.Command, args []string) { +func runGraph(ctx context.Context, cmd *base.Command, args []string) { if len(args) > 0 { base.Fatalf("go mod graph: graph takes no arguments") } diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index 714ff2e205..ddb9aeebe9 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -10,6 +10,7 @@ import ( "cmd/go/internal/base" "cmd/go/internal/modload" "cmd/go/internal/work" + "context" "os" "strings" ) @@ -32,7 +33,7 @@ func init() { work.AddModCommonFlags(cmdInit) } -func runInit(cmd *base.Command, args []string) { +func runInit(ctx context.Context, cmd *base.Command, args []string) { modload.CmdModInit = true if len(args) > 1 { base.Fatalf("go mod init: too many arguments") diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index af2b04c0c2..feb41a83b0 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -12,6 +12,7 @@ import ( "cmd/go/internal/modfetch" "cmd/go/internal/modload" "cmd/go/internal/work" + "context" "golang.org/x/mod/module" ) @@ -37,7 +38,7 @@ func init() { work.AddModCommonFlags(cmdTidy) } -func runTidy(cmd *base.Command, args []string) { +func runTidy(ctx context.Context, cmd *base.Command, args []string) { if len(args) > 0 { base.Fatalf("go mod tidy: no arguments allowed") } diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index 8509ceb7a8..257d1cd0ef 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -6,6 +6,7 @@ package modcmd import ( "bytes" + "context" "fmt" "io" "io/ioutil" @@ -43,7 +44,7 @@ func init() { work.AddModCommonFlags(cmdVendor) } -func runVendor(cmd *base.Command, args []string) { +func runVendor(ctx context.Context, cmd *base.Command, args []string) { if len(args) != 0 { base.Fatalf("go mod vendor: vendor takes no arguments") } diff --git a/src/cmd/go/internal/modcmd/verify.go b/src/cmd/go/internal/modcmd/verify.go index b7fd7fa8e0..570e571049 100644 --- a/src/cmd/go/internal/modcmd/verify.go +++ b/src/cmd/go/internal/modcmd/verify.go @@ -6,6 +6,7 @@ package modcmd import ( "bytes" + "context" "errors" "fmt" "io/ioutil" @@ -40,7 +41,7 @@ func init() { work.AddModCommonFlags(cmdVerify) } -func runVerify(cmd *base.Command, args []string) { +func runVerify(ctx context.Context, cmd *base.Command, args []string) { if len(args) != 0 { // NOTE(rsc): Could take a module pattern. base.Fatalf("go mod verify: verify takes no arguments") diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index 40d238519b..3f9cf0f120 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -5,6 +5,7 @@ package modcmd import ( + "context" "fmt" "strings" @@ -60,7 +61,7 @@ func init() { work.AddModCommonFlags(cmdWhy) } -func runWhy(cmd *base.Command, args []string) { +func runWhy(ctx context.Context, cmd *base.Command, args []string) { loadALL := modload.LoadALL if *whyVendor { loadALL = modload.LoadVendor diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 4c6982426f..9836a3e2cc 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -6,6 +6,7 @@ package modget import ( + "context" "errors" "fmt" "os" @@ -259,7 +260,7 @@ type query struct { m module.Version } -func runGet(cmd *base.Command, args []string) { +func runGet(ctx context.Context, cmd *base.Command, args []string) { switch getU { case "", "upgrade", "patch": // ok diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index 2edae38cca..ca2c3db92c 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -6,6 +6,7 @@ package run import ( + "context" "fmt" "os" "path" @@ -57,7 +58,7 @@ func printStderr(args ...interface{}) (int, error) { return fmt.Fprint(os.Stderr, args...) } -func runRun(cmd *base.Command, args []string) { +func runRun(ctx context.Context, cmd *base.Command, args []string) { work.BuildInit() var b work.Builder b.Init() diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 873a76aa38..6648d4eab4 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -6,6 +6,7 @@ package test import ( "bytes" + "context" "crypto/sha256" "errors" "fmt" @@ -565,7 +566,7 @@ var defaultVetFlags = []string{ // "-unusedresult", } -func runTest(cmd *base.Command, args []string) { +func runTest(ctx context.Context, cmd *base.Command, args []string) { modload.LoadTests = true pkgArgs, testArgs = testFlags(args) diff --git a/src/cmd/go/internal/tool/tool.go b/src/cmd/go/internal/tool/tool.go index 930eecb63f..7f4dc86802 100644 --- a/src/cmd/go/internal/tool/tool.go +++ b/src/cmd/go/internal/tool/tool.go @@ -6,6 +6,7 @@ package tool import ( + "context" "fmt" "os" "os/exec" @@ -48,7 +49,7 @@ func init() { CmdTool.Flag.BoolVar(&toolN, "n", false, "") } -func runTool(cmd *base.Command, args []string) { +func runTool(ctx context.Context, cmd *base.Command, args []string) { if len(args) == 0 { listTools() return diff --git a/src/cmd/go/internal/version/version.go b/src/cmd/go/internal/version/version.go index ac2ae50155..056db7bf9e 100644 --- a/src/cmd/go/internal/version/version.go +++ b/src/cmd/go/internal/version/version.go @@ -7,6 +7,7 @@ package version import ( "bytes" + "context" "encoding/binary" "fmt" "os" @@ -51,7 +52,7 @@ var ( versionV = CmdVersion.Flag.Bool("v", false, "") ) -func runVersion(cmd *base.Command, args []string) { +func runVersion(ctx context.Context, cmd *base.Command, args []string) { if len(args) == 0 { if *versionM || *versionV { fmt.Fprintf(os.Stderr, "go version: flags can only be used with arguments\n") diff --git a/src/cmd/go/internal/vet/vet.go b/src/cmd/go/internal/vet/vet.go index 4ec58de785..717ff2d0aa 100644 --- a/src/cmd/go/internal/vet/vet.go +++ b/src/cmd/go/internal/vet/vet.go @@ -10,6 +10,7 @@ import ( "cmd/go/internal/load" "cmd/go/internal/modload" "cmd/go/internal/work" + "context" "path/filepath" ) @@ -48,7 +49,7 @@ See also: go fmt, go fix. `, } -func runVet(cmd *base.Command, args []string) { +func runVet(ctx context.Context, cmd *base.Command, args []string) { modload.LoadTests = true vetFlags, pkgArgs := vetFlags(args) diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index fbd49b457b..2bbee43ab4 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -5,6 +5,7 @@ package work import ( + "context" "errors" "fmt" "go/build" @@ -344,7 +345,7 @@ var pkgsFilter = func(pkgs []*load.Package) []*load.Package { return pkgs } var runtimeVersion = runtime.Version() -func runBuild(cmd *base.Command, args []string) { +func runBuild(ctx context.Context, cmd *base.Command, args []string) { BuildInit() var b Builder b.Init() @@ -515,7 +516,7 @@ func libname(args []string, pkgs []*load.Package) (string, error) { return "lib" + libname + ".so", nil } -func runInstall(cmd *base.Command, args []string) { +func runInstall(ctx context.Context, cmd *base.Command, args []string) { BuildInit() InstallPackages(args, load.PackagesForBuild(args)) } diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index 3512866e4a..37bb7d6d27 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -191,8 +191,7 @@ BigCmdLoop: } ctx := maybeStartTrace(context.Background()) ctx, span := trace.StartSpan(ctx, fmt.Sprint("Running ", cmd.Name(), " command")) - _ = ctx - cmd.Run(cmd, args) + cmd.Run(ctx, cmd, args) span.Done() base.Exit() return -- GitLab From 2bfa45cfa994512c47da2d98f3baca5bb474ec9b Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 17 Jun 2020 15:50:14 -0400 Subject: [PATCH 0160/1792] cmd/go: propagate context into PackagesForBuild and Do for tracing This change propagates context into PackagesForErrors and Do for the purpose of tracing, and calls trace.StartSpan on PackagesForErrors and Do, so that the trace now shows the broad outline of where the "Loading" and "Execution" phases are in the build. Updates #38714 Change-Id: Ib9a7cf7030210f68f76663d1c8a7461e0a226611 Reviewed-on: https://go-review.googlesource.com/c/go/+/238541 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/clean/clean.go | 2 +- src/cmd/go/internal/fix/fix.go | 2 +- src/cmd/go/internal/fmtcmd/fmt.go | 2 +- src/cmd/go/internal/generate/generate.go | 2 +- src/cmd/go/internal/get/get.go | 4 ++-- src/cmd/go/internal/list/list.go | 6 +++--- src/cmd/go/internal/load/pkg.go | 15 ++++++++++----- src/cmd/go/internal/modget/get.go | 4 ++-- src/cmd/go/internal/run/run.go | 4 ++-- src/cmd/go/internal/test/test.go | 8 ++++---- src/cmd/go/internal/vet/vet.go | 4 ++-- src/cmd/go/internal/work/build.go | 20 ++++++++++++-------- src/cmd/go/internal/work/exec.go | 7 ++++++- 13 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/cmd/go/internal/clean/clean.go b/src/cmd/go/internal/clean/clean.go index 8af3e3df9c..6bfd7ae21e 100644 --- a/src/cmd/go/internal/clean/clean.go +++ b/src/cmd/go/internal/clean/clean.go @@ -117,7 +117,7 @@ func runClean(ctx context.Context, cmd *base.Command, args []string) { } if cleanPkg { - for _, pkg := range load.PackagesAndErrors(args) { + for _, pkg := range load.PackagesAndErrors(ctx, args) { clean(pkg) } } diff --git a/src/cmd/go/internal/fix/fix.go b/src/cmd/go/internal/fix/fix.go index f16af05fc8..825624fcbb 100644 --- a/src/cmd/go/internal/fix/fix.go +++ b/src/cmd/go/internal/fix/fix.go @@ -34,7 +34,7 @@ See also: go fmt, go vet. func runFix(ctx context.Context, cmd *base.Command, args []string) { printed := false - for _, pkg := range load.Packages(args) { + for _, pkg := range load.Packages(ctx, args) { if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main { if !printed { fmt.Fprintf(os.Stderr, "go: not fixing packages in dependency modules\n") diff --git a/src/cmd/go/internal/fmtcmd/fmt.go b/src/cmd/go/internal/fmtcmd/fmt.go index 9868efc7ef..f96cff429c 100644 --- a/src/cmd/go/internal/fmtcmd/fmt.go +++ b/src/cmd/go/internal/fmtcmd/fmt.go @@ -64,7 +64,7 @@ func runFmt(ctx context.Context, cmd *base.Command, args []string) { } }() } - for _, pkg := range load.PackagesAndErrors(args) { + for _, pkg := range load.PackagesAndErrors(ctx, args) { if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main { if !printed { fmt.Fprintf(os.Stderr, "go: not formatting packages in dependency modules\n") diff --git a/src/cmd/go/internal/generate/generate.go b/src/cmd/go/internal/generate/generate.go index fb26f77f95..98c17bba8c 100644 --- a/src/cmd/go/internal/generate/generate.go +++ b/src/cmd/go/internal/generate/generate.go @@ -176,7 +176,7 @@ func runGenerate(ctx context.Context, cmd *base.Command, args []string) { // Even if the arguments are .go files, this loop suffices. printed := false - for _, pkg := range load.PackagesAndErrors(args) { + for _, pkg := range load.PackagesAndErrors(ctx, args) { if modload.Enabled() && pkg.Module != nil && !pkg.Module.Main { if !printed { fmt.Fprintf(os.Stderr, "go: not generating in packages in dependency modules\n") diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index f7da5270b0..ef43602aca 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -172,7 +172,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // everything. load.ClearPackageCache() - pkgs := load.PackagesForBuild(args) + pkgs := load.PackagesForBuild(ctx, args) // Phase 3. Install. if *getD { @@ -182,7 +182,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { return } - work.InstallPackages(args, pkgs) + work.InstallPackages(ctx, args, pkgs) } // downloadPaths prepares the list of paths to pass to download. diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index ef0a5a2f2d..3ec243a759 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -449,9 +449,9 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { load.IgnoreImports = *listFind var pkgs []*load.Package if *listE { - pkgs = load.PackagesAndErrors(args) + pkgs = load.PackagesAndErrors(ctx, args) } else { - pkgs = load.Packages(args) + pkgs = load.Packages(ctx, args) base.ExitIfErrors() } @@ -539,7 +539,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { a.Deps = append(a.Deps, b.AutoAction(work.ModeInstall, work.ModeInstall, p)) } } - b.Do(a) + b.Do(ctx, a) } for _, p := range pkgs { diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 2b5fbb1c5b..32c2ba7912 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -7,6 +7,7 @@ package load import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -30,6 +31,7 @@ import ( "cmd/go/internal/par" "cmd/go/internal/search" "cmd/go/internal/str" + "cmd/go/internal/trace" ) var ( @@ -2123,9 +2125,9 @@ func LoadImportWithFlags(path, srcDir string, parent *Package, stk *ImportStack, // to load dependencies of a named package, the named // package is still returned, with p.Incomplete = true // and details in p.DepsErrors. -func Packages(args []string) []*Package { +func Packages(ctx context.Context, args []string) []*Package { var pkgs []*Package - for _, pkg := range PackagesAndErrors(args) { + for _, pkg := range PackagesAndErrors(ctx, args) { if pkg.Error != nil { base.Errorf("%v", pkg.Error) continue @@ -2139,7 +2141,10 @@ func Packages(args []string) []*Package { // *Package for every argument, even the ones that // cannot be loaded at all. // The packages that fail to load will have p.Error != nil. -func PackagesAndErrors(patterns []string) []*Package { +func PackagesAndErrors(ctx context.Context, patterns []string) []*Package { + ctx, span := trace.StartSpan(ctx, "load.PackagesAndErrors") + defer span.Done() + for _, p := range patterns { // Listing is only supported with all patterns referring to either: // - Files that are part of the same directory. @@ -2233,8 +2238,8 @@ func ImportPaths(args []string) []*search.Match { // PackagesForBuild is like Packages but exits // if any of the packages or their dependencies have errors // (cannot be built). -func PackagesForBuild(args []string) []*Package { - pkgs := PackagesAndErrors(args) +func PackagesForBuild(ctx context.Context, args []string) []*Package { + pkgs := PackagesAndErrors(ctx, args) printed := map[*PackageError]bool{} for _, pkg := range pkgs { if pkg.Error != nil { diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 9836a3e2cc..b217196931 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -715,8 +715,8 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { return } work.BuildInit() - pkgs := load.PackagesForBuild(pkgPatterns) - work.InstallPackages(pkgPatterns, pkgs) + pkgs := load.PackagesForBuild(ctx, pkgPatterns) + work.InstallPackages(ctx, pkgPatterns, pkgs) } // runQueries looks up modules at target versions in parallel. Results will be diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index ca2c3db92c..3630f68c54 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -79,7 +79,7 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) { } p = load.GoFilesPackage(files) } else if len(args) > 0 && !strings.HasPrefix(args[0], "-") { - pkgs := load.PackagesAndErrors(args[:1]) + pkgs := load.PackagesAndErrors(ctx, args[:1]) if len(pkgs) == 0 { base.Fatalf("go run: no packages loaded from %s", args[0]) } @@ -141,7 +141,7 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) { } a1 := b.LinkAction(work.ModeBuild, work.ModeBuild, p) a := &work.Action{Mode: "go run", Func: buildRunProgram, Args: cmdArgs, Deps: []*work.Action{a1}} - b.Do(a) + b.Do(ctx, a) } // buildRunProgram is the action for running a binary that has already diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 6648d4eab4..d71d339828 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -577,7 +577,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { work.VetFlags = testVet.flags work.VetExplicit = testVet.explicit - pkgs = load.PackagesForBuild(pkgArgs) + pkgs = load.PackagesForBuild(ctx, pkgArgs) if len(pkgs) == 0 { base.Fatalf("no packages to test") } @@ -659,7 +659,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { sort.Strings(all) a := &work.Action{Mode: "go test -i"} - for _, p := range load.PackagesForBuild(all) { + for _, p := range load.PackagesForBuild(ctx, all) { if cfg.BuildToolchainName == "gccgo" && p.Standard { // gccgo's standard library packages // can not be reinstalled. @@ -667,7 +667,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { } a.Deps = append(a.Deps, b.CompileAction(work.ModeInstall, work.ModeInstall, p)) } - b.Do(a) + b.Do(ctx, a) if !testC || a.Failed { return } @@ -787,7 +787,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { } } - b.Do(root) + b.Do(ctx, root) } // ensures that package p imports the named package diff --git a/src/cmd/go/internal/vet/vet.go b/src/cmd/go/internal/vet/vet.go index 717ff2d0aa..58f392eb96 100644 --- a/src/cmd/go/internal/vet/vet.go +++ b/src/cmd/go/internal/vet/vet.go @@ -67,7 +67,7 @@ func runVet(ctx context.Context, cmd *base.Command, args []string) { } } - pkgs := load.PackagesForBuild(pkgArgs) + pkgs := load.PackagesForBuild(ctx, pkgArgs) if len(pkgs) == 0 { base.Fatalf("no packages to vet") } @@ -93,5 +93,5 @@ func runVet(ctx context.Context, cmd *base.Command, args []string) { root.Deps = append(root.Deps, b.VetAction(work.ModeBuild, work.ModeBuild, pxtest)) } } - b.Do(root) + b.Do(ctx, root) } diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 2bbee43ab4..d020aa6e9f 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -19,6 +19,7 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/load" "cmd/go/internal/search" + "cmd/go/internal/trace" ) var CmdBuild = &base.Command{ @@ -350,7 +351,7 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) { var b Builder b.Init() - pkgs := load.PackagesForBuild(args) + pkgs := load.PackagesForBuild(ctx, args) explicitO := len(cfg.BuildO) > 0 @@ -379,7 +380,7 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) { depMode = ModeInstall } - pkgs = omitTestOnly(pkgsFilter(load.Packages(args))) + pkgs = omitTestOnly(pkgsFilter(load.Packages(ctx, args))) // Special case -o /dev/null by not writing at all. if cfg.BuildO == os.DevNull { @@ -409,7 +410,7 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) { if len(a.Deps) == 0 { base.Fatalf("go build: no main packages to build") } - b.Do(a) + b.Do(ctx, a) return } if len(pkgs) > 1 { @@ -422,7 +423,7 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) { p.Stale = true // must build - not up to date p.StaleReason = "build -o flag in use" a := b.AutoAction(ModeInstall, depMode, p) - b.Do(a) + b.Do(ctx, a) return } @@ -433,7 +434,7 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) { if cfg.BuildBuildmode == "shared" { a = b.buildmodeShared(ModeBuild, depMode, args, pkgs, a) } - b.Do(a) + b.Do(ctx, a) } var CmdInstall = &base.Command{ @@ -518,7 +519,7 @@ func libname(args []string, pkgs []*load.Package) (string, error) { func runInstall(ctx context.Context, cmd *base.Command, args []string) { BuildInit() - InstallPackages(args, load.PackagesForBuild(args)) + InstallPackages(ctx, args, load.PackagesForBuild(ctx, args)) } // omitTestOnly returns pkgs with test-only packages removed. @@ -538,7 +539,10 @@ func omitTestOnly(pkgs []*load.Package) []*load.Package { return list } -func InstallPackages(patterns []string, pkgs []*load.Package) { +func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Package) { + ctx, span := trace.StartSpan(ctx, "InstallPackages "+strings.Join(patterns, " ")) + defer span.Done() + if cfg.GOBIN != "" && !filepath.IsAbs(cfg.GOBIN) { base.Fatalf("cannot install, GOBIN must be an absolute path") } @@ -607,7 +611,7 @@ func InstallPackages(patterns []string, pkgs []*load.Package) { a = b.buildmodeShared(ModeInstall, ModeInstall, patterns, pkgs, a) } - b.Do(a) + b.Do(ctx, a) base.ExitIfErrors() // Success. If this command is 'go install' with no arguments diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 071c9d2db9..3ea3293ae1 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -8,6 +8,7 @@ package work import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -31,6 +32,7 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/load" "cmd/go/internal/str" + "cmd/go/internal/trace" ) // actionList returns the list of actions in the dag rooted at root @@ -54,7 +56,10 @@ func actionList(root *Action) []*Action { } // do runs the action graph rooted at root. -func (b *Builder) Do(root *Action) { +func (b *Builder) Do(ctx context.Context, root *Action) { + ctx, span := trace.StartSpan(ctx, "exec.Builder.Do ("+root.Mode+" "+root.Target+")") + defer span.Done() + if !b.IsCmdList { // If we're doing real work, take time at the end to trim the cache. c := cache.Default() -- GitLab From 50f63a7ae4b7f951fa894b96633b1716adca55fa Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 12 Aug 2020 13:30:43 -0400 Subject: [PATCH 0161/1792] doc/go1.15: clarify external linking can still be used for building PIE In Go 1.15 we switched the default linking mode for PIE on Linux/AMD64 and Linux/ARM64 to internal linking. Clarify that the previous behavior (external linking) can still be used with a flag. Fixes #40719. Change-Id: Ib7042622bc91e1b1aa31f520990d03b5eb6c56bb Reviewed-on: https://go-review.googlesource.com/c/go/+/248199 Reviewed-by: Ian Lance Taylor --- doc/go1.15.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/go1.15.html b/doc/go1.15.html index 8872d71138..3a12ecfa11 100644 --- a/doc/go1.15.html +++ b/doc/go1.15.html @@ -357,7 +357,10 @@ Do not send CLs removing the interior tags from such phrases. The linker now defaults to internal linking mode for -buildmode=pie on linux/amd64 and linux/arm64, so these - configurations no longer require a C linker. + configurations no longer require a C linker. External linking + mode (which was the default in Go 1.14 for + -buildmode=pie) can still be requested with + -ldflags=-linkmode=external flag.

Objdump

-- GitLab From b2353174db1349f15113416b4df2a833db6058a6 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 12 Aug 2020 17:45:48 -0400 Subject: [PATCH 0162/1792] doc/go1.15: include behavior updates to the context package Fixes #40737 Change-Id: I8e2c1e1653d427af1ded6d61df1aa450e3c4d35c Reviewed-on: https://go-review.googlesource.com/c/go/+/248329 Run-TryBot: Andrew Bonventre TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- doc/go1.15.html | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/go1.15.html b/doc/go1.15.html index 3a12ecfa11..c691bf3bd5 100644 --- a/doc/go1.15.html +++ b/doc/go1.15.html @@ -436,6 +436,19 @@ Do not send CLs removing the interior tags from such phrases.
+
context
+
+

+ Creating a derived Context using a nil parent is now explicitly + disallowed. Any attempt to do so with the + WithValue, + WithDeadline, or + WithCancel functions + will cause a panic. +

+
+
+
crypto

-- GitLab From 92bda33d2771a9b12868d9025f113538fa7a84de Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 31 Jul 2020 15:58:00 -0400 Subject: [PATCH 0163/1792] runtime: revert signal stack mlocking Go 1.14 included a (rather awful) workaround for a Linux kernel bug that corrupted vector registers on x86 CPUs during signal delivery (https://bugzilla.kernel.org/show_bug.cgi?id=205663). This bug was introduced in Linux 5.2 and fixed in 5.3.15, 5.4.2 and all 5.5 and later kernels. The fix was also back-ported by major distros. This workaround was necessary, but had unfortunate downsides, including causing Go programs to exceed the mlock ulimit in many configurations (#37436). We're reasonably confident that by the Go 1.16 release, the number of systems running affected kernels will be vanishingly small. Hence, this CL removes this workaround. This effectively reverts CLs 209597 (version parser), 209899 (mlock top of signal stack), 210299 (better failure message), 223121 (soft mlock failure handling), and 244059 (special-case patched Ubuntu kernels). The one thing we keep is the osArchInit function. It's empty everywhere now, but is a reasonable hook to have. Updates #35326, #35777 (the original register corruption bugs). Updates #40184 (request to revert in 1.15). Fixes #35979. Change-Id: Ie213270837095576f1f3ef46bf3de187dc486c50 Reviewed-on: https://go-review.googlesource.com/c/go/+/246200 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/defs_linux_386.go | 11 --- src/runtime/defs_linux_amd64.go | 11 --- src/runtime/export_test.go | 2 - src/runtime/os_linux.go | 9 --- src/runtime/os_linux_x86.go | 118 +------------------------------- src/runtime/panic.go | 10 --- src/runtime/string.go | 34 --------- src/runtime/string_test.go | 31 --------- src/runtime/sys_linux_386.s | 19 ----- src/runtime/sys_linux_amd64.s | 19 ----- 10 files changed, 1 insertion(+), 263 deletions(-) diff --git a/src/runtime/defs_linux_386.go b/src/runtime/defs_linux_386.go index f4db8cf927..64a0fbcaaa 100644 --- a/src/runtime/defs_linux_386.go +++ b/src/runtime/defs_linux_386.go @@ -226,14 +226,3 @@ type sockaddr_un struct { family uint16 path [108]byte } - -const __NEW_UTS_LEN = 64 - -type new_utsname struct { - sysname [__NEW_UTS_LEN + 1]byte - nodename [__NEW_UTS_LEN + 1]byte - release [__NEW_UTS_LEN + 1]byte - version [__NEW_UTS_LEN + 1]byte - machine [__NEW_UTS_LEN + 1]byte - domainname [__NEW_UTS_LEN + 1]byte -} diff --git a/src/runtime/defs_linux_amd64.go b/src/runtime/defs_linux_amd64.go index 8480d85219..1ae18a309b 100644 --- a/src/runtime/defs_linux_amd64.go +++ b/src/runtime/defs_linux_amd64.go @@ -262,14 +262,3 @@ type sockaddr_un struct { family uint16 path [108]byte } - -const __NEW_UTS_LEN = 64 - -type new_utsname struct { - sysname [__NEW_UTS_LEN + 1]byte - nodename [__NEW_UTS_LEN + 1]byte - release [__NEW_UTS_LEN + 1]byte - version [__NEW_UTS_LEN + 1]byte - machine [__NEW_UTS_LEN + 1]byte - domainname [__NEW_UTS_LEN + 1]byte -} diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 5ab03f3f99..d591fdc4e9 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -43,8 +43,6 @@ var PhysHugePageSize = physHugePageSize var NetpollGenericInit = netpollGenericInit -var ParseRelease = parseRelease - var Memmove = memmove var MemclrNoHeapPointers = memclrNoHeapPointers diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index 7b95ff2428..22931b4d5c 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -328,20 +328,11 @@ func libpreinit() { initsig(true) } -// gsignalInitQuirk, if non-nil, is called for every allocated gsignal G. -// -// TODO(austin): Remove this after Go 1.15 when we remove the -// mlockGsignal workaround. -var gsignalInitQuirk func(gsignal *g) - // 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) // Linux wants >= 2K mp.gsignal.m = mp - if gsignalInitQuirk != nil { - gsignalInitQuirk(mp.gsignal) - } } func gettid() uint32 diff --git a/src/runtime/os_linux_x86.go b/src/runtime/os_linux_x86.go index 97f870707d..d91fa1a0d1 100644 --- a/src/runtime/os_linux_x86.go +++ b/src/runtime/os_linux_x86.go @@ -7,120 +7,4 @@ package runtime -import ( - "runtime/internal/atomic" - "unsafe" -) - -//go:noescape -func uname(utsname *new_utsname) int - -func mlock(addr, len uintptr) int - -func osArchInit() { - // Linux 5.2 introduced a bug that can corrupt vector - // registers on return from a signal if the signal stack isn't - // faulted in: - // https://bugzilla.kernel.org/show_bug.cgi?id=205663 - // - // It was fixed in 5.3.15, 5.4.2, and all 5.5 and later - // kernels. - // - // If we're on an affected kernel, work around this issue by - // mlocking the top page of every signal stack. This doesn't - // help for signal stacks created in C, but there's not much - // we can do about that. - // - // TODO(austin): Remove this in Go 1.15, at which point it - // will be unlikely to encounter any of the affected kernels - // in the wild. - - var uts new_utsname - if uname(&uts) < 0 { - throw("uname failed") - } - // Check for null terminator to ensure gostringnocopy doesn't - // walk off the end of the release string. - found := false - for _, b := range uts.release { - if b == 0 { - found = true - break - } - } - if !found { - return - } - rel := gostringnocopy(&uts.release[0]) - - major, minor, patch, ok := parseRelease(rel) - if !ok { - return - } - - if major == 5 && minor == 4 && patch < 2 { - // All 5.4 versions of Ubuntu are patched. - procVersion := []byte("/proc/version\000") - f := open(&procVersion[0], _O_RDONLY, 0) - if f >= 0 { - var buf [512]byte - p := noescape(unsafe.Pointer(&buf[0])) - n := read(f, p, int32(len(buf))) - closefd(f) - - needle := []byte("Ubuntu") - contains: - for i, c := range buf[:n] { - if c != needle[0] { - continue - } - if int(n)-i < len(needle) { - break - } - for j, c2 := range needle { - if c2 != buf[i+j] { - continue contains - } - } - // This is an Ubuntu system. - return - } - } - } - - if major == 5 && (minor == 2 || minor == 3 && patch < 15 || minor == 4 && patch < 2) { - gsignalInitQuirk = mlockGsignal - if m0.gsignal != nil { - throw("gsignal quirk too late") - } - throwReportQuirk = throwBadKernel - } -} - -func mlockGsignal(gsignal *g) { - if atomic.Load(&touchStackBeforeSignal) != 0 { - // mlock has already failed, don't try again. - return - } - - // This mlock call may fail, but we don't report the failure. - // Instead, if something goes badly wrong, we rely on prepareSignalM - // and throwBadKernel to do further mitigation and to report a problem - // to the user if mitigation fails. This is because many - // systems have a limit on the total mlock size, and many kernels - // that appear to have bad versions are actually patched to avoid the - // bug described above. We want Go 1.14 to run on those systems. - // See #37436. - if errno := mlock(gsignal.stack.hi-physPageSize, physPageSize); errno < 0 { - atomic.Store(&touchStackBeforeSignal, uint32(-errno)) - } -} - -// throwBadKernel is called, via throwReportQuirk, by throw. -func throwBadKernel() { - if errno := atomic.Load(&touchStackBeforeSignal); errno != 0 { - println("runtime: note: your Linux kernel may be buggy") - println("runtime: note: see https://golang.org/wiki/LinuxKernelSignalVectorBug") - println("runtime: note: mlock workaround for kernel bug failed with errno", errno) - } -} +func osArchInit() {} diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 615249f33c..127843b081 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -1283,12 +1283,6 @@ func startpanic_m() bool { } } -// throwReportQuirk, if non-nil, is called by throw after dumping the stacks. -// -// TODO(austin): Remove this after Go 1.15 when we remove the -// mlockGsignal workaround. -var throwReportQuirk func() - var didothers bool var deadlock mutex @@ -1335,10 +1329,6 @@ func dopanic_m(gp *g, pc, sp uintptr) bool { printDebugLog() - if throwReportQuirk != nil { - throwReportQuirk() - } - return docrash } diff --git a/src/runtime/string.go b/src/runtime/string.go index 0515b56573..251044231e 100644 --- a/src/runtime/string.go +++ b/src/runtime/string.go @@ -499,37 +499,3 @@ func gostringw(strw *uint16) string { b[n2] = 0 // for luck return s[:n2] } - -// parseRelease parses a dot-separated version number. It follows the -// semver syntax, but allows the minor and patch versions to be -// elided. -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, ok := atoi(rel[:i]) - rel = rel[i+1:] - return ver, ok - } - } - ver, ok := atoi(rel) - rel = "" - return ver, ok - } - if major, ok = next(); !ok || rel == "" { - return - } - if minor, ok = next(); !ok || rel == "" { - return - } - patch, ok = next() - return -} diff --git a/src/runtime/string_test.go b/src/runtime/string_test.go index b9ac667533..4eda12c35d 100644 --- a/src/runtime/string_test.go +++ b/src/runtime/string_test.go @@ -454,34 +454,3 @@ func TestAtoi32(t *testing.T) { } } } - -type parseReleaseTest struct { - in string - major, minor, patch int -} - -var parseReleaseTests = []parseReleaseTest{ - {"", -1, -1, -1}, - {"x", -1, -1, -1}, - {"5", 5, 0, 0}, - {"5.12", 5, 12, 0}, - {"5.12-x", 5, 12, 0}, - {"5.12.1", 5, 12, 1}, - {"5.12.1-x", 5, 12, 1}, - {"5.12.1.0", 5, 12, 1}, - {"5.20496382327982653440", -1, -1, -1}, -} - -func TestParseRelease(t *testing.T) { - for _, test := range parseReleaseTests { - major, minor, patch, ok := runtime.ParseRelease(test.in) - if !ok { - major, minor, patch = -1, -1, -1 - } - if test.major != major || test.minor != minor || test.patch != patch { - t.Errorf("parseRelease(%q) = (%v, %v, %v) want (%v, %v, %v)", - test.in, major, minor, patch, - test.major, test.minor, test.patch) - } - } -} diff --git a/src/runtime/sys_linux_386.s b/src/runtime/sys_linux_386.s index 5b9b638ad7..1e3a834812 100644 --- a/src/runtime/sys_linux_386.s +++ b/src/runtime/sys_linux_386.s @@ -39,8 +39,6 @@ #define SYS_socketcall 102 #define SYS_setittimer 104 #define SYS_clone 120 -#define SYS_uname 122 -#define SYS_mlock 150 #define SYS_sched_yield 158 #define SYS_nanosleep 162 #define SYS_rt_sigreturn 173 @@ -808,20 +806,3 @@ TEXT runtime·sbrk0(SB),NOSPLIT,$0-4 INVOKE_SYSCALL MOVL AX, ret+0(FP) RET - -// func uname(utsname *new_utsname) int -TEXT ·uname(SB),NOSPLIT,$0-8 - MOVL $SYS_uname, AX - MOVL utsname+0(FP), BX - INVOKE_SYSCALL - MOVL AX, ret+4(FP) - RET - -// func mlock(addr, len uintptr) int -TEXT ·mlock(SB),NOSPLIT,$0-12 - MOVL $SYS_mlock, AX - MOVL addr+0(FP), BX - MOVL len+4(FP), CX - INVOKE_SYSCALL - MOVL AX, ret+8(FP) - RET diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s index fe9c6bce85..b60057ce83 100644 --- a/src/runtime/sys_linux_amd64.s +++ b/src/runtime/sys_linux_amd64.s @@ -33,10 +33,8 @@ #define SYS_clone 56 #define SYS_exit 60 #define SYS_kill 62 -#define SYS_uname 63 #define SYS_fcntl 72 #define SYS_sigaltstack 131 -#define SYS_mlock 149 #define SYS_arch_prctl 158 #define SYS_gettid 186 #define SYS_futex 202 @@ -789,20 +787,3 @@ TEXT runtime·sbrk0(SB),NOSPLIT,$0-8 SYSCALL MOVQ AX, ret+0(FP) RET - -// func uname(utsname *new_utsname) int -TEXT ·uname(SB),NOSPLIT,$0-16 - MOVQ utsname+0(FP), DI - MOVL $SYS_uname, AX - SYSCALL - MOVQ AX, ret+8(FP) - RET - -// func mlock(addr, len uintptr) int -TEXT ·mlock(SB),NOSPLIT,$0-24 - MOVQ addr+0(FP), DI - MOVQ len+8(FP), SI - MOVL $SYS_mlock, AX - SYSCALL - MOVQ AX, ret+16(FP) - RET -- GitLab From 933ca0cfdc5b16a28661707b95485ce6d739bb97 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 12 Aug 2020 12:59:55 -0400 Subject: [PATCH 0164/1792] doc: add a release notes blurb on 1.16 linker improvements Add a draft version of a blurb on improvements to the linker. This will need to be finalized later in the release since there are still some additional changes to be made to the linker in 1.16. Updates #40703. Change-Id: Id85c7e129071cc2faacb09c53a2968bd52b0a7b4 Reviewed-on: https://go-review.googlesource.com/c/go/+/248238 Reviewed-by: Cherry Zhang Reviewed-by: Austin Clements --- doc/go1.16.html | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index f0e26a1033..1fea359436 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -62,7 +62,26 @@ Do not send CLs removing the interior tags from such phrases.

Linker

- TODO + This release includes additional improvements to the Go linker, + reducing linker resource usage (both time and memory) and improving + code robustness/maintainability. These changes form the second half + of a two-release project to + modernize the Go + linker. +

+ +

+ The linker changes in 1.16 extend the 1.15 improvements to all + supported architecture/OS combinations (the 1.15 performance improvements + were primarily focused on ELF-based OSes and + amd64 architectures). For a representative set of + large Go programs, linking is 20-35% faster than 1.15 and requires + 5-15% less memory on average for linux/amd64, with larger + improvements for other architectures and OSes. +

+ +

+ TODO: update with final numbers later in the release.

Core library

-- GitLab From c2e73fb446bffd02c651e51c6641cc90fd065b70 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 23 Jun 2020 08:46:36 -0400 Subject: [PATCH 0165/1792] cmd/compile: remove AttrSeenGlobl (use AttrOnList instead) Minor cleanup: remove the symbol attribute AttrSeenGlobal, since it is redundant with the existing attribute AttrOnList (no need to have what amounts to a separate flag for checking the same property). Change-Id: Ia269b64de37c2bb4a2314bbecf3d2091c6d57424 Reviewed-on: https://go-review.googlesource.com/c/go/+/239477 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/obj.go | 2 +- src/cmd/internal/obj/link.go | 3 --- src/cmd/internal/obj/plist.go | 4 ---- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 0826b04e33..af5037c5a8 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -352,7 +352,7 @@ func stringsym(pos src.XPos, s string) (data *obj.LSym) { symdata := Ctxt.Lookup(symdataname) - if !symdata.SeenGlobl() { + if !symdata.OnList() { // string data off := dsname(symdata, 0, s, pos, "string") ggloblsym(symdata, int32(off), obj.DUPOK|obj.RODATA|obj.LOCAL) diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index dc47e51be9..311e5ae2e8 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -480,7 +480,6 @@ const ( AttrWrapper AttrNeedCtxt AttrNoFrame - AttrSeenGlobl AttrOnList AttrStatic @@ -537,7 +536,6 @@ func (a Attribute) MakeTypelink() bool { return a&AttrMakeTypelink != 0 } func (a Attribute) CFunc() bool { return a&AttrCFunc != 0 } func (a Attribute) NoSplit() bool { return a&AttrNoSplit != 0 } func (a Attribute) Leaf() bool { return a&AttrLeaf != 0 } -func (a Attribute) SeenGlobl() bool { return a&AttrSeenGlobl != 0 } func (a Attribute) OnList() bool { return a&AttrOnList != 0 } func (a Attribute) ReflectMethod() bool { return a&AttrReflectMethod != 0 } func (a Attribute) Local() bool { return a&AttrLocal != 0 } @@ -574,7 +572,6 @@ var textAttrStrings = [...]struct { {bit: AttrCFunc, s: "CFUNC"}, {bit: AttrNoSplit, s: "NOSPLIT"}, {bit: AttrLeaf, s: "LEAF"}, - {bit: AttrSeenGlobl, s: ""}, {bit: AttrOnList, s: ""}, {bit: AttrReflectMethod, s: "REFLECTMETHOD"}, {bit: AttrLocal, s: "LOCAL"}, diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index afe0ee4ee0..6e33f29959 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -145,10 +145,6 @@ func (ctxt *Link) InitTextSym(s *LSym, flag int) { } func (ctxt *Link) Globl(s *LSym, size int64, flag int) { - if s.SeenGlobl() { - fmt.Printf("duplicate %v\n", s) - } - s.Set(AttrSeenGlobl, true) if s.OnList() { ctxt.Diag("symbol %s listed multiple times", s.Name) } -- GitLab From 7d7bd5abc7f7ac901830b79496f63ce86895e262 Mon Sep 17 00:00:00 2001 From: Lynn Boger Date: Tue, 11 Aug 2020 12:04:25 -0400 Subject: [PATCH 0166/1792] cmd/internal/obj/ppc64: don't remove NOP in assembler Previously, the assembler removed NOPs from the Prog list in obj9.go. NOPs shouldn't be removed if they were added as an inline mark, as described in the issue below. Fixes #40689 Once the NOPs were left in the Prog list, some instructions were flagged as invalid because they had an operand which was not represented in optab. In order to preserve the previous assembler behavior, entries were added to optab for those operand cases. They were not flagged as errors before because the NOP instructions were removed before the code to check the valid opcode/operand combinations. Change-Id: Iae5145f94459027cf458e914d7c5d6089807ccf8 Reviewed-on: https://go-review.googlesource.com/c/go/+/247842 Run-TryBot: Lynn Boger TryBot-Result: Gobot Gobot Reviewed-by: Paul Murphy Reviewed-by: Michael Munday Reviewed-by: Keith Randall --- src/cmd/internal/obj/ppc64/asm9.go | 3 +++ src/cmd/internal/obj/ppc64/obj9.go | 11 +++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 0fd0744a42..238ca8f0b7 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -613,6 +613,9 @@ var optab = []Optab{ {obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0, 0, 0}, {obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0}, {obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0}, + {obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // NOP operand variations added for #40689 + {obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // to preserve previous behavior + {obj.ANOP, C_FREG, C_NONE, C_NONE, C_NONE, 0, 0, 0}, {obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL {obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL {obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // align code diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index 16881c634b..749f7066de 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -429,7 +429,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { /* * find leaf subroutines - * strip NOPs * expand RET * expand BECOME pseudo */ @@ -559,10 +558,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = p q1 = p.Pcond if q1 != nil { - for q1.As == obj.ANOP { - q1 = q1.Link - p.Pcond = q1 - } + // NOPs are not removed due to #40689. if q1.Mark&LEAF == 0 { q1.Mark |= LABEL @@ -589,9 +585,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { continue case obj.ANOP: - q1 = p.Link - q.Link = q1 /* q is non-nop */ - q1.Mark |= p.Mark + // NOPs are not removed due to + // #40689 continue default: -- GitLab From 954db9fe51154e5d4663c0c1a62c82a99eef1ed4 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Wed, 12 Aug 2020 16:37:42 -0400 Subject: [PATCH 0167/1792] [dev.link] debug/gosym: fix file mappings CL 246497 introduced bugs in gosym that the long tests caught. These two bugs were: 1) In 1.16, 0 is now a valid file number from pcfile tables. 2) Also, in 1.16, when we scan all functions looking for a pc/file pair, the values returned from pcfile are no longer the direct offset into the file table. Rather, the values from pcfile are the offset into the cu->file look-up table. This CL fixes those two issues. Change-Id: I0cd280bdcaeda89faaf9fac41809abdb87734499 Reviewed-on: https://go-review.googlesource.com/c/go/+/248317 Reviewed-by: Cherry Zhang Reviewed-by: Austin Clements Reviewed-by: Than McIntosh --- src/debug/gosym/pclntab.go | 41 ++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/debug/gosym/pclntab.go b/src/debug/gosym/pclntab.go index e383ea460a..21edddda20 100644 --- a/src/debug/gosym/pclntab.go +++ b/src/debug/gosym/pclntab.go @@ -59,9 +59,12 @@ type LineTable struct { nfunctab uint32 filetab []byte nfiletab uint32 - fileMap map[string]uint32 funcNames map[uint32]string // cache the function names strings map[uint32]string // interned substrings of Data, keyed by offset + // fileMap varies depending on the version of the object file. + // For ver12, it maps the name to the index in the file table. + // For ver116, it maps the name to the offset in filetab. + fileMap map[string]uint32 } // NOTE(rsc): This is wrong for GOARCH=arm, which uses a quantum of 4, @@ -388,7 +391,7 @@ func (t *LineTable) pcvalue(off uint32, entry, targetpc uint64) int32 { // to file number. Since most functions come from a single file, these // are usually short and quick to scan. If a file match is found, then the // code goes to the expense of looking for a simultaneous line number match. -func (t *LineTable) findFileLine(entry uint64, filetab, linetab uint32, filenum, line int32) uint64 { +func (t *LineTable) findFileLine(entry uint64, filetab, linetab uint32, filenum, line int32, cutab []byte) uint64 { if filetab == 0 || linetab == 0 { return 0 } @@ -401,8 +404,12 @@ func (t *LineTable) findFileLine(entry uint64, filetab, linetab uint32, filenum, linePC := entry fileStartPC := filePC for t.step(&fp, &filePC, &fileVal, filePC == entry) { - if fileVal == filenum && fileStartPC < filePC { - // fileVal is in effect starting at fileStartPC up to + fileIndex := fileVal + if t.version == ver116 { + fileIndex = int32(t.binary.Uint32(cutab[fileVal*4:])) + } + if fileIndex == filenum && fileStartPC < filePC { + // fileIndex is in effect starting at fileStartPC up to // but not including filePC, and it's the file we want. // Run the PC table looking for a matching line number // or until we reach filePC. @@ -457,13 +464,16 @@ func (t *LineTable) go12PCToFile(pc uint64) (file string) { entry := t.uintptr(f) filetab := t.binary.Uint32(f[t.ptrsize+4*4:]) fno := t.pcvalue(filetab, entry, pc) - if fno <= 0 { - return "" - } if t.version == ver12 { + if fno <= 0 { + return "" + } return t.string(t.binary.Uint32(t.filetab[4*fno:])) } // Go ≥ 1.16 + if fno < 0 { // 0 is valid for ≥ 1.16 + return "" + } cuoff := t.binary.Uint32(f[t.ptrsize+7*4:]) if fnoff := t.binary.Uint32(t.cutab[(cuoff+uint32(fno))*4:]); fnoff != ^uint32(0) { return t.stringFrom(t.filetab, fnoff) @@ -471,7 +481,7 @@ func (t *LineTable) go12PCToFile(pc uint64) (file string) { return "" } -// go12LineToPC maps a (file, line) pair to a program counter for the Go 1.2 pcln table. +// go12LineToPC maps a (file, line) pair to a program counter for the Go 1.2/1.16 pcln table. func (t *LineTable) go12LineToPC(file string, line int) (pc uint64) { defer func() { if recover() != nil { @@ -480,20 +490,25 @@ func (t *LineTable) go12LineToPC(file string, line int) (pc uint64) { }() t.initFileMap() - filenum := t.fileMap[file] - if filenum == 0 { + filenum, ok := t.fileMap[file] + if !ok { return 0 } // Scan all functions. // If this turns out to be a bottleneck, we could build a map[int32][]int32 // mapping file number to a list of functions with code from that file. + var cutab []byte for i := uint32(0); i < t.nfunctab; i++ { f := t.funcdata[t.uintptr(t.functab[2*t.ptrsize*i+t.ptrsize:]):] entry := t.uintptr(f) filetab := t.binary.Uint32(f[t.ptrsize+4*4:]) linetab := t.binary.Uint32(f[t.ptrsize+5*4:]) - pc := t.findFileLine(entry, filetab, linetab, int32(filenum), int32(line)) + if t.version == ver116 { + cuoff := t.binary.Uint32(f[t.ptrsize+7*4:]) * 4 + cutab = t.cutab[cuoff:] + } + pc := t.findFileLine(entry, filetab, linetab, int32(filenum), int32(line), cutab) if pc != 0 { return pc } @@ -518,10 +533,10 @@ func (t *LineTable) initFileMap() { } } else { var pos uint32 - for i := uint32(1); i < t.nfiletab; i++ { + for i := uint32(0); i < t.nfiletab; i++ { s := t.stringFrom(t.filetab, pos) + m[s] = pos pos += uint32(len(s) + 1) - m[s] = i } } t.fileMap = m -- GitLab From 5387cdcb24a07f5d0d49d5105ced2b69e6aafde9 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Fri, 7 Aug 2020 11:31:20 -0400 Subject: [PATCH 0168/1792] [dev.link] cmd/link, cmd/compile: create content addressable pcdata syms Switch pcdata over to content addressable symbols. This is the last step before removing these from pclntab_old. No meaningful benchmarks changes come from this work. Change-Id: I3f74f3d6026a278babe437c8010e22992c92bd89 Reviewed-on: https://go-review.googlesource.com/c/go/+/247399 Reviewed-by: Austin Clements Reviewed-by: Than McIntosh --- src/cmd/internal/goobj/funcinfo.go | 82 ++++++++++++++------------ src/cmd/internal/goobj/objfile.go | 12 ++-- src/cmd/internal/obj/link.go | 15 ++--- src/cmd/internal/obj/objfile.go | 71 ++++++++++++++++------ src/cmd/internal/obj/pcln.go | 55 ++++++++++------- src/cmd/internal/objfile/goobj.go | 16 +++-- src/cmd/link/internal/ld/dwarf.go | 2 +- src/cmd/link/internal/ld/lib.go | 2 +- src/cmd/link/internal/ld/pcln.go | 13 ++-- src/cmd/link/internal/loader/loader.go | 46 +++++++-------- 10 files changed, 182 insertions(+), 132 deletions(-) diff --git a/src/cmd/internal/goobj/funcinfo.go b/src/cmd/internal/goobj/funcinfo.go index e0e6068b4b..2cca8f6c4e 100644 --- a/src/cmd/internal/goobj/funcinfo.go +++ b/src/cmd/internal/goobj/funcinfo.go @@ -23,12 +23,11 @@ type FuncInfo struct { Locals uint32 FuncID objabi.FuncID - Pcsp uint32 - Pcfile uint32 - Pcline uint32 - Pcinline uint32 - Pcdata []uint32 - PcdataEnd uint32 + Pcsp SymRef + Pcfile SymRef + Pcline SymRef + Pcinline SymRef + Pcdata []SymRef Funcdataoff []uint32 File []CUFileIndex @@ -41,20 +40,24 @@ func (a *FuncInfo) Write(w *bytes.Buffer) { binary.LittleEndian.PutUint32(b[:], x) w.Write(b[:]) } + writeSymRef := func(s SymRef) { + writeUint32(s.PkgIdx) + writeUint32(s.SymIdx) + } writeUint32(a.Args) writeUint32(a.Locals) writeUint32(uint32(a.FuncID)) - writeUint32(a.Pcsp) - writeUint32(a.Pcfile) - writeUint32(a.Pcline) - writeUint32(a.Pcinline) + writeSymRef(a.Pcsp) + writeSymRef(a.Pcfile) + writeSymRef(a.Pcline) + writeSymRef(a.Pcinline) writeUint32(uint32(len(a.Pcdata))) - for _, x := range a.Pcdata { - writeUint32(x) + for _, sym := range a.Pcdata { + writeSymRef(sym) } - writeUint32(a.PcdataEnd) + writeUint32(uint32(len(a.Funcdataoff))) for _, x := range a.Funcdataoff { writeUint32(x) @@ -75,21 +78,23 @@ func (a *FuncInfo) Read(b []byte) { b = b[4:] return x } + readSymIdx := func() SymRef { + return SymRef{readUint32(), readUint32()} + } a.Args = readUint32() a.Locals = readUint32() a.FuncID = objabi.FuncID(readUint32()) - a.Pcsp = readUint32() - a.Pcfile = readUint32() - a.Pcline = readUint32() - a.Pcinline = readUint32() - pcdatalen := readUint32() - a.Pcdata = make([]uint32, pcdatalen) + a.Pcsp = readSymIdx() + a.Pcfile = readSymIdx() + a.Pcline = readSymIdx() + a.Pcinline = readSymIdx() + a.Pcdata = make([]SymRef, readUint32()) for i := range a.Pcdata { - a.Pcdata[i] = readUint32() + a.Pcdata[i] = readSymIdx() } - a.PcdataEnd = readUint32() + funcdataofflen := readUint32() a.Funcdataoff = make([]uint32, funcdataofflen) for i := range a.Funcdataoff { @@ -127,11 +132,13 @@ type FuncInfoLengths struct { func (*FuncInfo) ReadFuncInfoLengths(b []byte) FuncInfoLengths { var result FuncInfoLengths - const numpcdataOff = 28 + // Offset to the number of pcdata values. This value is determined by counting + // the number of bytes until we write pcdata to the file. + const numpcdataOff = 44 result.NumPcdata = binary.LittleEndian.Uint32(b[numpcdataOff:]) result.PcdataOff = numpcdataOff + 4 - numfuncdataoffOff := result.PcdataOff + 4*(result.NumPcdata+1) + numfuncdataoffOff := result.PcdataOff + 8*result.NumPcdata result.NumFuncdataoff = binary.LittleEndian.Uint32(b[numfuncdataoffOff:]) result.FuncdataoffOff = numfuncdataoffOff + 4 @@ -154,29 +161,28 @@ func (*FuncInfo) ReadLocals(b []byte) uint32 { return binary.LittleEndian.Uint32 func (*FuncInfo) ReadFuncID(b []byte) uint32 { return binary.LittleEndian.Uint32(b[8:]) } -// return start and end offsets. -func (*FuncInfo) ReadPcsp(b []byte) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[12:]), binary.LittleEndian.Uint32(b[16:]) +func (*FuncInfo) ReadPcsp(b []byte) SymRef { + return SymRef{binary.LittleEndian.Uint32(b[12:]), binary.LittleEndian.Uint32(b[16:])} } -// return start and end offsets. -func (*FuncInfo) ReadPcfile(b []byte) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[16:]), binary.LittleEndian.Uint32(b[20:]) +func (*FuncInfo) ReadPcfile(b []byte) SymRef { + return SymRef{binary.LittleEndian.Uint32(b[20:]), binary.LittleEndian.Uint32(b[24:])} } -// return start and end offsets. -func (*FuncInfo) ReadPcline(b []byte) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[20:]), binary.LittleEndian.Uint32(b[24:]) +func (*FuncInfo) ReadPcline(b []byte) SymRef { + return SymRef{binary.LittleEndian.Uint32(b[28:]), binary.LittleEndian.Uint32(b[32:])} } -// return start and end offsets. -func (*FuncInfo) ReadPcinline(b []byte, pcdataoffset uint32) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[24:]), binary.LittleEndian.Uint32(b[pcdataoffset:]) +func (*FuncInfo) ReadPcinline(b []byte) SymRef { + return SymRef{binary.LittleEndian.Uint32(b[36:]), binary.LittleEndian.Uint32(b[40:])} } -// return start and end offsets. -func (*FuncInfo) ReadPcdata(b []byte, pcdataoffset uint32, k uint32) (uint32, uint32) { - return binary.LittleEndian.Uint32(b[pcdataoffset+4*k:]), binary.LittleEndian.Uint32(b[pcdataoffset+4+4*k:]) +func (*FuncInfo) ReadPcdata(b []byte) []SymRef { + syms := make([]SymRef, binary.LittleEndian.Uint32(b[44:])) + for i := range syms { + syms[i] = SymRef{binary.LittleEndian.Uint32(b[48+i*8:]), binary.LittleEndian.Uint32(b[52+i*8:])} + } + return syms } func (*FuncInfo) ReadFuncdataoff(b []byte, funcdataofffoff uint32, k uint32) int64 { diff --git a/src/cmd/internal/goobj/objfile.go b/src/cmd/internal/goobj/objfile.go index 5d4a253024..9a64f96cd6 100644 --- a/src/cmd/internal/goobj/objfile.go +++ b/src/cmd/internal/goobj/objfile.go @@ -421,8 +421,11 @@ const ( AuxDwarfLoc AuxDwarfRanges AuxDwarfLines - - // TODO: more. Pcdata? + AuxPcsp + AuxPcfile + AuxPcline + AuxPcinline + AuxPcdata ) func (a *Aux) Type() uint8 { return a[0] } @@ -827,11 +830,6 @@ func (r *Reader) Data(i uint32) []byte { return r.BytesAt(base+off, int(end-off)) } -// AuxDataBase returns the base offset of the aux data block. -func (r *Reader) PcdataBase() uint32 { - return r.h.Offsets[BlkPcdata] -} - // 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/obj/link.go b/src/cmd/internal/obj/link.go index dc47e51be9..11fab63065 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -624,11 +624,12 @@ func (s *LSym) CanBeAnSSASym() { } type Pcln struct { - Pcsp Pcdata - Pcfile Pcdata - Pcline Pcdata - Pcinline Pcdata - Pcdata []Pcdata + // Aux symbols for pcln + Pcsp *LSym + Pcfile *LSym + Pcline *LSym + Pcinline *LSym + Pcdata []*LSym Funcdata []*LSym Funcdataoff []int64 UsedFiles map[goobj.CUFileIndex]struct{} // file indices used while generating pcfile @@ -650,10 +651,6 @@ type Auto struct { Gotype *LSym } -type Pcdata struct { - P []byte -} - // Link holds the context for writing object code from a compiler // to be linker input or for reading that input into the linker. type Link struct { diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 8234697d72..a2bbdff24e 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -185,7 +185,11 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) { // Pcdata h.Offsets[goobj.BlkPcdata] = w.Offset() for _, s := range ctxt.Text { // iteration order must match genFuncInfoSyms - if s.Func != nil { + // Because of the phase order, it's possible that we try to write an invalid + // object file, and the Pcln variables haven't been filled in. As such, we + // need to check that Pcsp exists, and assume the other pcln variables exist + // as well. Tests like test/fixedbugs/issue22200.go demonstrate this issue. + if s.Func != nil && s.Func.Pcln.Pcsp != nil { pc := &s.Func.Pcln w.Bytes(pc.Pcsp.P) w.Bytes(pc.Pcfile.P) @@ -478,6 +482,22 @@ func (w *writer) Aux(s *LSym) { if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 { w.aux1(goobj.AuxDwarfLines, s.Func.dwarfDebugLinesSym) } + if s.Func.Pcln.Pcsp != nil && s.Func.Pcln.Pcsp.Size != 0 { + w.aux1(goobj.AuxPcsp, s.Func.Pcln.Pcsp) + } + if s.Func.Pcln.Pcfile != nil && s.Func.Pcln.Pcfile.Size != 0 { + w.aux1(goobj.AuxPcfile, s.Func.Pcln.Pcfile) + } + if s.Func.Pcln.Pcline != nil && s.Func.Pcln.Pcline.Size != 0 { + w.aux1(goobj.AuxPcline, s.Func.Pcln.Pcline) + } + if s.Func.Pcln.Pcinline != nil && s.Func.Pcln.Pcinline.Size != 0 { + w.aux1(goobj.AuxPcinline, s.Func.Pcln.Pcinline) + } + for _, pcSym := range s.Func.Pcln.Pcdata { + w.aux1(goobj.AuxPcdata, pcSym) + } + } } @@ -559,6 +579,19 @@ func nAuxSym(s *LSym) int { if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 { n++ } + if s.Func.Pcln.Pcsp != nil && s.Func.Pcln.Pcsp.Size != 0 { + n++ + } + if s.Func.Pcln.Pcfile != nil && s.Func.Pcln.Pcfile.Size != 0 { + n++ + } + if s.Func.Pcln.Pcline != nil && s.Func.Pcln.Pcline.Size != 0 { + n++ + } + if s.Func.Pcln.Pcinline != nil && s.Func.Pcln.Pcinline.Size != 0 { + n++ + } + n += len(s.Func.Pcln.Pcdata) } return n } @@ -566,7 +599,17 @@ func nAuxSym(s *LSym) int { // generate symbols for FuncInfo. func genFuncInfoSyms(ctxt *Link) { infosyms := make([]*LSym, 0, len(ctxt.Text)) - var pcdataoff uint32 + hashedsyms := make([]*LSym, 0, 4*len(ctxt.Text)) + preparePcSym := func(s *LSym) *LSym { + if s == nil { + return s + } + s.PkgIdx = goobj.PkgIdxHashed + s.SymIdx = int32(len(hashedsyms) + len(ctxt.hasheddefs)) + s.Set(AttrIndexed, true) + hashedsyms = append(hashedsyms, s) + return s + } var b bytes.Buffer symidx := int32(len(ctxt.defs)) for _, s := range ctxt.Text { @@ -579,20 +622,14 @@ func genFuncInfoSyms(ctxt *Link) { FuncID: objabi.FuncID(s.Func.FuncID), } pc := &s.Func.Pcln - o.Pcsp = pcdataoff - pcdataoff += uint32(len(pc.Pcsp.P)) - o.Pcfile = pcdataoff - pcdataoff += uint32(len(pc.Pcfile.P)) - o.Pcline = pcdataoff - pcdataoff += uint32(len(pc.Pcline.P)) - o.Pcinline = pcdataoff - pcdataoff += uint32(len(pc.Pcinline.P)) - o.Pcdata = make([]uint32, len(pc.Pcdata)) - for i, pcd := range pc.Pcdata { - o.Pcdata[i] = pcdataoff - pcdataoff += uint32(len(pcd.P)) - } - o.PcdataEnd = pcdataoff + o.Pcsp = makeSymRef(preparePcSym(pc.Pcsp)) + o.Pcfile = makeSymRef(preparePcSym(pc.Pcfile)) + o.Pcline = makeSymRef(preparePcSym(pc.Pcline)) + o.Pcinline = makeSymRef(preparePcSym(pc.Pcinline)) + o.Pcdata = make([]goobj.SymRef, len(pc.Pcdata)) + for i, pcSym := range pc.Pcdata { + o.Pcdata[i] = makeSymRef(preparePcSym(pcSym)) + } o.Funcdataoff = make([]uint32, len(pc.Funcdataoff)) for i, x := range pc.Funcdataoff { o.Funcdataoff[i] = uint32(x) @@ -642,9 +679,9 @@ func genFuncInfoSyms(ctxt *Link) { } } ctxt.defs = append(ctxt.defs, infosyms...) + ctxt.hasheddefs = append(ctxt.hasheddefs, hashedsyms...) } -// debugDumpAux is a dumper for selected aux symbols. func writeAuxSymDebug(ctxt *Link, par *LSym, aux *LSym) { // Most aux symbols (ex: funcdata) are not interesting-- // pick out just the DWARF ones for now. diff --git a/src/cmd/internal/obj/pcln.go b/src/cmd/internal/obj/pcln.go index 1f7ccf47ef..7750637796 100644 --- a/src/cmd/internal/obj/pcln.go +++ b/src/cmd/internal/obj/pcln.go @@ -6,6 +6,7 @@ package obj import ( "cmd/internal/goobj" + "cmd/internal/objabi" "encoding/binary" "log" ) @@ -14,16 +15,19 @@ import ( // returned by valfunc parameterized by arg. The invocation of valfunc to update the // current value is, for each p, // -// val = valfunc(func, val, p, 0, arg); -// record val as value at p->pc; -// val = valfunc(func, val, p, 1, arg); +// sym = valfunc(func, p, 0, arg); +// record sym.P as value at p->pc; +// sym = valfunc(func, p, 1, arg); // // where func is the function, val is the current value, p is the instruction being // considered, and arg can be used to further parameterize valfunc. -func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(*Link, *LSym, int32, *Prog, int32, interface{}) int32, arg interface{}) { +func funcpctab(ctxt *Link, func_ *LSym, desc string, valfunc func(*Link, *LSym, int32, *Prog, int32, interface{}) int32, arg interface{}) *LSym { dbg := desc == ctxt.Debugpcln - - dst.P = dst.P[:0] + dst := []byte{} + sym := &LSym{ + Type: objabi.SRODATA, + Attribute: AttrContentAddressable, + } if dbg { ctxt.Logf("funcpctab %s [valfunc=%s]\n", func_.Name, desc) @@ -32,7 +36,8 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(* val := int32(-1) oldval := val if func_.Func.Text == nil { - return + // Return the emtpy symbol we've built so far. + return sym } pc := func_.Func.Text.Pc @@ -88,13 +93,13 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(* if started { pcdelta := (p.Pc - pc) / int64(ctxt.Arch.MinLC) n := binary.PutUvarint(buf, uint64(pcdelta)) - dst.P = append(dst.P, buf[:n]...) + dst = append(dst, buf[:n]...) pc = p.Pc } delta := val - oldval n := binary.PutVarint(buf, int64(delta)) - dst.P = append(dst.P, buf[:n]...) + dst = append(dst, buf[:n]...) oldval = val started = true val = valfunc(ctxt, func_, val, p, 1, arg) @@ -109,18 +114,22 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(* ctxt.Diag("negative pc offset: %v", v) } n := binary.PutUvarint(buf, uint64(v)) - dst.P = append(dst.P, buf[:n]...) + dst = append(dst, buf[:n]...) // add terminating varint-encoded 0, which is just 0 - dst.P = append(dst.P, 0) + dst = append(dst, 0) } if dbg { - ctxt.Logf("wrote %d bytes to %p\n", len(dst.P), dst) - for _, p := range dst.P { + ctxt.Logf("wrote %d bytes to %p\n", len(dst), dst) + for _, p := range dst { ctxt.Logf(" %02x", p) } ctxt.Logf("\n") } + + sym.Size = int64(len(dst)) + sym.P = dst + return sym } // pctofileline computes either the file number (arg == 0) @@ -268,18 +277,17 @@ func linkpcln(ctxt *Link, cursym *LSym) { } } - pcln.Pcdata = make([]Pcdata, npcdata) - pcln.Pcdata = pcln.Pcdata[:npcdata] + pcln.Pcdata = make([]*LSym, npcdata) pcln.Funcdata = make([]*LSym, nfuncdata) pcln.Funcdataoff = make([]int64, nfuncdata) pcln.Funcdataoff = pcln.Funcdataoff[:nfuncdata] - funcpctab(ctxt, &pcln.Pcsp, cursym, "pctospadj", pctospadj, nil) - funcpctab(ctxt, &pcln.Pcfile, cursym, "pctofile", pctofileline, pcln) - funcpctab(ctxt, &pcln.Pcline, cursym, "pctoline", pctofileline, nil) + pcln.Pcsp = funcpctab(ctxt, cursym, "pctospadj", pctospadj, nil) + pcln.Pcfile = funcpctab(ctxt, cursym, "pctofile", pctofileline, pcln) + pcln.Pcline = funcpctab(ctxt, cursym, "pctoline", pctofileline, nil) pcinlineState := new(pcinlineState) - funcpctab(ctxt, &pcln.Pcinline, cursym, "pctoinline", pcinlineState.pctoinline, nil) + pcln.Pcinline = funcpctab(ctxt, cursym, "pctoinline", pcinlineState.pctoinline, nil) for _, inlMark := range cursym.Func.InlMarks { pcinlineState.setParentPC(ctxt, int(inlMark.id), int32(inlMark.p.Pc)) } @@ -309,9 +317,14 @@ func linkpcln(ctxt *Link, cursym *LSym) { // pcdata. for i := 0; i < npcdata; i++ { if (havepc[i/32]>>uint(i%32))&1 == 0 { - continue + // use an empty symbol. + pcln.Pcdata[i] = &LSym{ + Type: objabi.SRODATA, + Attribute: AttrContentAddressable, + } + } else { + pcln.Pcdata[i] = funcpctab(ctxt, cursym, "pctopcdata", pctopcdata, interface{}(uint32(i))) } - funcpctab(ctxt, &pcln.Pcdata[i], cursym, "pctopcdata", pctopcdata, interface{}(uint32(i))) } // funcdata diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go index e838f58aed..8eecebb1df 100644 --- a/src/cmd/internal/objfile/goobj.go +++ b/src/cmd/internal/objfile/goobj.go @@ -236,7 +236,15 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { if arch == nil { return "", 0, nil } - pcdataBase := r.PcdataBase() + getSymData := func(s goobj.SymRef) []byte { + if s.PkgIdx != goobj.PkgIdxHashed { + // We don't need the data for non-hashed symbols, yet. + panic("not supported") + } + i := uint32(s.SymIdx + uint32(r.NSym()+r.NHashed64def())) + return r.BytesAt(r.DataOff(i), r.DataSize(i)) + } + ndef := uint32(r.NSym() + r.NHashed64def() + r.NHasheddef() + r.NNonpkgdef()) for i := uint32(0); i < ndef; i++ { osym := r.Sym(i) @@ -262,11 +270,9 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { b := r.BytesAt(r.DataOff(isym), r.DataSize(isym)) var info *goobj.FuncInfo lengths := info.ReadFuncInfoLengths(b) - off, end := info.ReadPcline(b) - pcline := r.BytesAt(pcdataBase+off, int(end-off)) + pcline := getSymData(info.ReadPcline(b)) line := int(pcValue(pcline, pc-addr, arch)) - off, end = info.ReadPcfile(b) - pcfile := r.BytesAt(pcdataBase+off, int(end-off)) + pcfile := getSymData(info.ReadPcfile(b)) fileID := pcValue(pcfile, pc-addr, arch) globalFileID := info.ReadFile(b, lengths.FileOff, uint32(fileID)) fileName := r.File(int(globalFileID)) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index d1f2ac583d..2b95ad5a67 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1421,7 +1421,7 @@ func (d *dwctxt) writeframes(fs loader.Sym) dwarfSecInfo { deltaBuf = dwarf.AppendUleb128(deltaBuf, uint64(thearch.Dwarfreglr)) } - for pcsp.Init(fpcsp); !pcsp.Done; pcsp.Next() { + for pcsp.Init(d.linkctxt.loader.Data(fpcsp)); !pcsp.Done; pcsp.Next() { nextpc := pcsp.NextPC // pciterinit goes up to the end of the function, diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 09c7bbfb53..caa4566190 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2252,7 +2252,7 @@ func (sc *stkChk) check(up *chain, depth int) int { var ch1 chain pcsp := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) ri := 0 - for pcsp.Init(info.Pcsp()); !pcsp.Done; pcsp.Next() { + for pcsp.Init(ldr.Data(info.Pcsp())); !pcsp.Done; pcsp.Next() { // pcsp.value is in effect for [pcsp.pc, pcsp.nextpc). // Check stack size in effect for this span. diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index c7535f6a61..e9fd5937e7 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -592,9 +592,8 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { fi := ldr.FuncInfo(s) if fi.Valid() { fi.Preload() - npc := fi.NumPcdata() - for i := uint32(0); i < npc; i++ { - pcdata = append(pcdata, sym.Pcdata{P: fi.Pcdata(int(i))}) + for _, dataSym := range fi.Pcdata() { + pcdata = append(pcdata, sym.Pcdata{P: ldr.Data(dataSym)}) } nfd := fi.NumFuncdataoff() for i := uint32(0); i < nfd; i++ { @@ -666,15 +665,15 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { cu := ldr.SymUnit(s) if fi.Valid() { - pcsp = sym.Pcdata{P: fi.Pcsp()} - pcfile = sym.Pcdata{P: fi.Pcfile()} - pcline = sym.Pcdata{P: fi.Pcline()} + pcsp = sym.Pcdata{P: ldr.Data(fi.Pcsp())} + pcfile = sym.Pcdata{P: ldr.Data(fi.Pcfile())} + pcline = sym.Pcdata{P: ldr.Data(fi.Pcline())} } if fi.Valid() && fi.NumInlTree() > 0 { its := oldState.genInlTreeSym(cu, fi, ctxt.Arch, state) funcdata[objabi.FUNCDATA_InlTree] = its - pcdata[objabi.PCDATA_InlTreeIndex] = sym.Pcdata{P: fi.Pcinline()} + pcdata[objabi.PCDATA_InlTreeIndex] = sym.Pcdata{P: ldr.Data(fi.Pcinline())} } // pcdata diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 8fd10b0848..f149e3c831 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -1878,19 +1878,24 @@ func (fi *FuncInfo) FuncID() objabi.FuncID { return objabi.FuncID((*goobj.FuncInfo)(nil).ReadFuncID(fi.data)) } -func (fi *FuncInfo) Pcsp() []byte { - pcsp, end := (*goobj.FuncInfo)(nil).ReadPcsp(fi.data) - return fi.r.BytesAt(fi.r.PcdataBase()+pcsp, int(end-pcsp)) +func (fi *FuncInfo) Pcsp() Sym { + sym := (*goobj.FuncInfo)(nil).ReadPcsp(fi.data) + return fi.l.resolve(fi.r, sym) } -func (fi *FuncInfo) Pcfile() []byte { - pcf, end := (*goobj.FuncInfo)(nil).ReadPcfile(fi.data) - return fi.r.BytesAt(fi.r.PcdataBase()+pcf, int(end-pcf)) +func (fi *FuncInfo) Pcfile() Sym { + sym := (*goobj.FuncInfo)(nil).ReadPcfile(fi.data) + return fi.l.resolve(fi.r, sym) } -func (fi *FuncInfo) Pcline() []byte { - pcln, end := (*goobj.FuncInfo)(nil).ReadPcline(fi.data) - return fi.r.BytesAt(fi.r.PcdataBase()+pcln, int(end-pcln)) +func (fi *FuncInfo) Pcline() Sym { + sym := (*goobj.FuncInfo)(nil).ReadPcline(fi.data) + return fi.l.resolve(fi.r, sym) +} + +func (fi *FuncInfo) Pcinline() Sym { + sym := (*goobj.FuncInfo)(nil).ReadPcinline(fi.data) + return fi.l.resolve(fi.r, sym) } // Preload has to be called prior to invoking the various methods @@ -1899,27 +1904,16 @@ func (fi *FuncInfo) Preload() { fi.lengths = (*goobj.FuncInfo)(nil).ReadFuncInfoLengths(fi.data) } -func (fi *FuncInfo) Pcinline() []byte { +func (fi *FuncInfo) Pcdata() []Sym { if !fi.lengths.Initialized { panic("need to call Preload first") } - pcinl, end := (*goobj.FuncInfo)(nil).ReadPcinline(fi.data, fi.lengths.PcdataOff) - return fi.r.BytesAt(fi.r.PcdataBase()+pcinl, int(end-pcinl)) -} - -func (fi *FuncInfo) NumPcdata() uint32 { - if !fi.lengths.Initialized { - panic("need to call Preload first") - } - return fi.lengths.NumPcdata -} - -func (fi *FuncInfo) Pcdata(k int) []byte { - if !fi.lengths.Initialized { - panic("need to call Preload first") + syms := (*goobj.FuncInfo)(nil).ReadPcdata(fi.data) + ret := make([]Sym, len(syms)) + for i := range ret { + ret[i] = fi.l.resolve(fi.r, syms[i]) } - pcdat, end := (*goobj.FuncInfo)(nil).ReadPcdata(fi.data, fi.lengths.PcdataOff, uint32(k)) - return fi.r.BytesAt(fi.r.PcdataBase()+pcdat, int(end-pcdat)) + return ret } func (fi *FuncInfo) NumFuncdataoff() uint32 { -- GitLab From cde5fd1c0f8c40804bfd942eec1e2d69bccf4e13 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 13 Aug 2020 12:39:04 -0700 Subject: [PATCH 0169/1792] cmd/compile: correct type of CvtBoolToUint8 values Fixes #40746 Change-Id: I539f07d1f958dacee87d846171a8889d03182d25 Reviewed-on: https://go-review.googlesource.com/c/go/+/248397 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/phiopt.go | 2 +- src/cmd/compile/internal/ssa/prove.go | 2 +- test/fixedbugs/issue40746.go | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue40746.go diff --git a/src/cmd/compile/internal/ssa/phiopt.go b/src/cmd/compile/internal/ssa/phiopt.go index 8643fa584c..db7b02275c 100644 --- a/src/cmd/compile/internal/ssa/phiopt.go +++ b/src/cmd/compile/internal/ssa/phiopt.go @@ -154,7 +154,7 @@ func phioptint(v *Value, b0 *Block, reverse int) { } v.AddArg(a) - cvt := v.Block.NewValue1(v.Pos, OpCvtBoolToUint8, a.Type, a) + cvt := v.Block.NewValue1(v.Pos, OpCvtBoolToUint8, v.Block.Func.Config.Types.UInt8, a) switch v.Type.Size() { case 1: v.reset(OpCopy) diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go index 6c6be39d34..ce7d689f93 100644 --- a/src/cmd/compile/internal/ssa/prove.go +++ b/src/cmd/compile/internal/ssa/prove.go @@ -1334,7 +1334,7 @@ func removeBranch(b *Block, branch branch) { // isNonNegative reports whether v is known to be greater or equal to zero. func isNonNegative(v *Value) bool { if !v.Type.IsInteger() { - panic("isNonNegative bad type") + v.Fatalf("isNonNegative bad type: %v", v.Type) } // TODO: return true if !v.Type.IsSigned() // SSA isn't type-safe enough to do that now (issue 37753). diff --git a/test/fixedbugs/issue40746.go b/test/fixedbugs/issue40746.go new file mode 100644 index 0000000000..235282fd90 --- /dev/null +++ b/test/fixedbugs/issue40746.go @@ -0,0 +1,19 @@ +// compile + +// 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 p + +func f(x byte, b bool) byte { + var c byte + if b { + c = 1 + } + + if int8(c) < 0 { + x++ + } + return x +} -- GitLab From d0d6593d1d4e81acd073244f42b6893fa65c99d8 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Mon, 10 Aug 2020 08:01:21 -0700 Subject: [PATCH 0170/1792] cmd/internal/obj: fix inline marker issue on s390x The optimization that replaces inline markers with pre-existing instructions assumes that 'Prog' values produced by the compiler are still reachable after the assembler has run. This was not true on s390x where the assembler was removing NOP instructions from the linked list of 'Prog' values. This led to broken inlining data which in turn caused an infinite loop in the runtime traceback code. Fix this by stopping the s390x assembler backend removing NOP values. It does not make any difference to the output of the assembler because NOP instructions are 0 bytes long anyway. Fixes #40473. Change-Id: Ib4fabadd1de8adb80421f75950ee9aad2111147a Reviewed-on: https://go-review.googlesource.com/c/go/+/247697 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/internal/obj/pcln.go | 15 +++++++++++++++ src/cmd/internal/obj/s390x/objz.go | 11 ----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/cmd/internal/obj/pcln.go b/src/cmd/internal/obj/pcln.go index 1f7ccf47ef..bffeda041d 100644 --- a/src/cmd/internal/obj/pcln.go +++ b/src/cmd/internal/obj/pcln.go @@ -278,6 +278,21 @@ func linkpcln(ctxt *Link, cursym *LSym) { funcpctab(ctxt, &pcln.Pcfile, cursym, "pctofile", pctofileline, pcln) funcpctab(ctxt, &pcln.Pcline, cursym, "pctoline", pctofileline, nil) + // Check that all the Progs used as inline markers are still reachable. + // See issue #40473. + inlMarkProgs := make(map[*Prog]struct{}, len(cursym.Func.InlMarks)) + for _, inlMark := range cursym.Func.InlMarks { + inlMarkProgs[inlMark.p] = struct{}{} + } + for p := cursym.Func.Text; p != nil; p = p.Link { + if _, ok := inlMarkProgs[p]; ok { + delete(inlMarkProgs, p) + } + } + if len(inlMarkProgs) > 0 { + ctxt.Diag("one or more instructions used as inline markers are no longer reachable") + } + pcinlineState := new(pcinlineState) funcpctab(ctxt, &pcln.Pcinline, cursym, "pctoinline", pcinlineState.pctoinline, nil) for _, inlMark := range cursym.Func.InlMarks { diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go index b14dc810fa..ef6335d849 100644 --- a/src/cmd/internal/obj/s390x/objz.go +++ b/src/cmd/internal/obj/s390x/objz.go @@ -283,17 +283,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ACMPUBNE: q = p p.Mark |= BRANCH - if p.Pcond != nil { - q := p.Pcond - for q.As == obj.ANOP { - q = q.Link - p.Pcond = q - } - } - - case obj.ANOP: - q.Link = p.Link /* q is non-nop */ - p.Link.Mark |= p.Mark default: q = p -- GitLab From a20cb4ca5c14ff27bdf16989d450c83b22f156d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20M=C3=B6hlmann?= Date: Thu, 13 Aug 2020 11:56:31 +0300 Subject: [PATCH 0171/1792] database/sql: make Rows.Scan properly wrap underlying errors The prior implementation used the format verb %v which unfortunately improperly wrapped any underlying scanner errors, and we couldn't use errors.Is nor errors.As. This change fixes that by using the %w verb. Added a unit to ensure that both error sub string matching works, but also that errors.Is works as expected. Fixes #38099 Change-Id: Iea667041dd8081d961246f77f2542330417292dc Reviewed-on: https://go-review.googlesource.com/c/go/+/248337 Reviewed-by: Emmanuel Odeke Reviewed-by: Daniel Theophanes Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/database/sql/sql.go | 5 ++++- src/database/sql/sql_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go index b3d0653f5c..0b85db66b9 100644 --- a/src/database/sql/sql.go +++ b/src/database/sql/sql.go @@ -3110,6 +3110,9 @@ func rowsColumnInfoSetupConnLocked(rowsi driver.Rows) []*ColumnType { // "select cursor(select * from my_table) from dual", into a // *Rows value that can itself be scanned from. The parent // select query will close any cursor *Rows if the parent *Rows is closed. +// +// 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 ...interface{}) error { rs.closemu.RLock() @@ -3133,7 +3136,7 @@ func (rs *Rows) Scan(dest ...interface{}) error { for i, sv := range rs.lastcols { err := convertAssignRows(dest[i], sv, rs) if err != nil { - return fmt.Errorf(`sql: Scan error on column index %d, name %q: %v`, i, rs.rowsi.Columns()[i], err) + return fmt.Errorf(`sql: Scan error on column index %d, name %q: %w`, i, rs.rowsi.Columns()[i], err) } } return nil diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go index 5727f0d8aa..762d42f54b 100644 --- a/src/database/sql/sql_test.go +++ b/src/database/sql/sql_test.go @@ -4149,6 +4149,41 @@ func TestQueryExecContextOnly(t *testing.T) { } } +type alwaysErrScanner struct{} + +var errTestScanWrap = errors.New("errTestScanWrap") + +func (alwaysErrScanner) Scan(interface{}) error { + return errTestScanWrap +} + +// Issue 38099: Ensure that Rows.Scan properly wraps underlying errors. +func TestRowsScanProperlyWrapsErrors(t *testing.T) { + db := newTestDB(t, "people") + defer closeDB(t, db) + + rows, err := db.Query("SELECT|people|age|") + if err != nil { + t.Fatalf("Query: %v", err) + } + + var res alwaysErrScanner + + for rows.Next() { + err = rows.Scan(&res) + if err == nil { + t.Fatal("expecting back an error") + } + if !errors.Is(err, errTestScanWrap) { + t.Fatalf("errors.Is mismatch\n%v\nWant: %v", err, errTestScanWrap) + } + // Ensure that error substring matching still correctly works. + if !strings.Contains(err.Error(), errTestScanWrap.Error()) { + t.Fatalf("Error %v does not contain %v", err, errTestScanWrap) + } + } +} + // badConn implements a bad driver.Conn, for TestBadDriver. // The Exec method panics. type badConn struct{} -- GitLab From 5ae198087bd07e88009885ac96c864381f8d8272 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 4 Jun 2020 11:41:43 -0400 Subject: [PATCH 0172/1792] cmd/go: don't initialize Builder in envcmd.MkEnv The Builder isn't needed by MkEnv, and Builder.Init doesn't have side effects that change the environment. Builder.Init does currently call CheckGOOSARCHPair, but that's being moved out in CL 234658. Builder.Init creates the temporary work directory used by the builder. For the builder created in MkEnv, this directory is never used. Creating this directory can cause unnecessary errors for commands that don't use a builder like 'go clean' and 'go list'. Fixes #38395 Updates #24398 Change-Id: Ib93ae55afdf958000470657f4c4ff5bd92700e46 Reviewed-on: https://go-review.googlesource.com/c/go/+/236563 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/envcmd/env.go | 3 -- src/cmd/go/testdata/script/build_GOTMPDIR.txt | 49 ++++++++++++++++--- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go index 403e0f4a7b..7bd75f7305 100644 --- a/src/cmd/go/internal/envcmd/env.go +++ b/src/cmd/go/internal/envcmd/env.go @@ -63,9 +63,6 @@ var ( ) func MkEnv() []cfg.EnvVar { - var b work.Builder - b.Init() - envFile, _ := cfg.EnvFile() env := []cfg.EnvVar{ {Name: "GO111MODULE", Value: cfg.Getenv("GO111MODULE")}, diff --git a/src/cmd/go/testdata/script/build_GOTMPDIR.txt b/src/cmd/go/testdata/script/build_GOTMPDIR.txt index c93ca932ca..1073517c29 100644 --- a/src/cmd/go/testdata/script/build_GOTMPDIR.txt +++ b/src/cmd/go/testdata/script/build_GOTMPDIR.txt @@ -1,15 +1,50 @@ -env GO111MODULE=off -[short] skip - # Set GOCACHE to a clean directory to ensure that 'go build' has work to report. -env GOCACHE=$WORK/gocache +[!windows] env GOCACHE=$WORK/gocache +[windows] env GOCACHE=$WORK\gocache -# Build should use GOTMPDIR if set. -env GOTMPDIR=$WORK/my-favorite-tmpdir +# 'go build' should use GOTMPDIR if set. +[!windows] env GOTMPDIR=$WORK/my-favorite-tmpdir +[windows] env GOTMPDIR=$WORK\my-favorite-tmpdir mkdir $GOTMPDIR -go build -work hello.go +go build -x hello.go stderr ^WORK=.*my-favorite-tmpdir +# Make GOTMPDIR a regular file. This prevents the creation of work directories, +# so we can check that certain commands don't create them. +# This simulates running on a full disk or a read-only volume. +rm $GOTMPDIR +cp hello.go $GOTMPDIR # any file will do + +# 'go build' should fail if GOTMPDIR is read-only. +! go build -x . +stderr '^go: creating work dir: \w+ '$GOTMPDIR + +# 'go list' should only fail if it needs to build something. +go list -x . +! stderr 'creating work dir' +stdout m +go list -m all +stdout m +! go list -x -export . +stderr '^go: creating work dir: \w+ '$GOTMPDIR + +# 'go clean -cache' and 'go clean -modcache' should not fail. +go clean -x -cache +! stderr 'creating work dir' +go clean -x -modcache +! stderr 'creating work dir' + +# 'go env' should not fail for specific variables. +# Without arguments, it needs to initialize a builder to load cgo flags, and +# that uses a temporary directory. +! go env +stderr '^go: creating work dir: \w+ '$GOTMPDIR +go env GOROOT + +-- go.mod -- +module m + +go 1.15 -- hello.go -- package main func main() { println("hello") } -- GitLab From 016e13df7475329c65524b2eabbc5207ceb4ee74 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 29 Jun 2020 16:28:18 -0400 Subject: [PATCH 0173/1792] cmd/go/internal/modfetch: stop migrating go.modverify to go.sum go.modverify was renamed to go.sum before vgo was merged into cmd/go. It's been long enough that we can safely drop support for it. For #25525 Change-Id: If8da66280a0fb6a4d4db0b170700775523c18571 Reviewed-on: https://go-review.googlesource.com/c/go/+/240458 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modfetch/fetch.go | 31 +++-------------------- src/cmd/go/testdata/script/mod_verify.txt | 8 +++--- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index fd7a5cef83..8df2289097 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -374,12 +374,11 @@ type modSum struct { var goSum struct { mu sync.Mutex - m map[module.Version][]string // content of go.sum file (+ go.modverify if present) + m map[module.Version][]string // content of go.sum file checked map[modSum]bool // sums actually checked during execution dirty bool // whether we added any new sums to m overwrite bool // if true, overwrite go.sum without incorporating its contents enabled bool // whether to use go.sum at all - modverify string // path to go.modverify, to be deleted } // initGoSum initializes the go.sum data. @@ -403,19 +402,6 @@ func initGoSum() (bool, error) { goSum.enabled = true readGoSum(goSum.m, GoSumFile, data) - // Add old go.modverify file. - // We'll delete go.modverify in WriteGoSum. - alt := strings.TrimSuffix(GoSumFile, ".sum") + ".modverify" - if data, err := renameio.ReadFile(alt); err == nil { - migrate := make(map[module.Version][]string) - readGoSum(migrate, alt, data) - for mod, sums := range migrate { - for _, sum := range sums { - addModSumLocked(mod, sum) - } - } - goSum.modverify = alt - } return true, nil } @@ -616,14 +602,9 @@ func WriteGoSum() { goSum.mu.Lock() defer goSum.mu.Unlock() - if !goSum.enabled { - // If we haven't read the go.sum file yet, don't bother writing it: at best, - // we could rename the go.modverify file if it isn't empty, but we haven't - // needed to touch it so far — how important could it be? - return - } - if !goSum.dirty { - // Don't bother opening the go.sum file if we don't have anything to add. + if !goSum.enabled || !goSum.dirty { + // If we haven't read go.sum yet or if we don't have anything to add, + // don't bother opening it. return } if cfg.BuildMod == "readonly" { @@ -674,10 +655,6 @@ func WriteGoSum() { goSum.checked = make(map[modSum]bool) goSum.dirty = false goSum.overwrite = false - - if goSum.modverify != "" { - os.Remove(goSum.modverify) // best effort - } } // TrimGoSum trims go.sum to contain only the modules for which keep[m] is true. diff --git a/src/cmd/go/testdata/script/mod_verify.txt b/src/cmd/go/testdata/script/mod_verify.txt index 646bc62bb7..3918400435 100644 --- a/src/cmd/go/testdata/script/mod_verify.txt +++ b/src/cmd/go/testdata/script/mod_verify.txt @@ -12,20 +12,18 @@ go mod verify ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.1.0.zip # With bad go.sum, sync (which must download) fails. -# Even if the bad sum is in the old legacy go.modverify file. rm go.sum -cp go.sum.bad go.modverify +cp go.sum.bad go.sum ! go mod tidy stderr 'checksum mismatch' ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.1.0.zip -# With good go.sum, sync works (and moves go.modverify to go.sum). +# With good go.sum, sync works. rm go.sum -cp go.sum.good go.modverify +cp go.sum.good go.sum go mod tidy exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.1.0.zip exists $GOPATH/pkg/mod/rsc.io/quote@v1.1.0/quote.go -! exists go.modverify # go.sum should have the new checksum for go.mod grep '^rsc.io/quote v1.1.0/go.mod ' go.sum -- GitLab From 9a759593d7a71b4c061fd9bd053bd79584c632dc Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 8 Jun 2020 18:06:11 -0400 Subject: [PATCH 0174/1792] cmd/go: don't save sums for modules loaded for import resolution modfetch.WriteGoSum now accepts a map[module.Version]bool parameter. This is used to prevent some new sums from being saved to go.sum when they would be removed by the next 'go mod tidy'. Previusly, sums were saved for modules looked up during import resolution. A new function, modload.TrimGoSum, is also introduced, which marks sums for deletion. 'go mod tidy' now uses this. The new logic distinguishes between go.mod sums and content sums, which lets 'go mod tidy' delete sums for modules in the build graph but not the build list. Fixes #31580 Fixes #36260 Fixes #33008 Change-Id: I06c4125704a8bbc9969de05265967ec1d2e6d3e8 Reviewed-on: https://go-review.googlesource.com/c/go/+/237017 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modcmd/init.go | 1 + src/cmd/go/internal/modcmd/tidy.go | 38 +-------- src/cmd/go/internal/modfetch/fetch.go | 83 ++++++++++++++----- src/cmd/go/internal/modload/init.go | 69 +++++++++++++-- src/cmd/go/testdata/script/mod_sum_lookup.txt | 33 ++++++++ src/cmd/go/testdata/script/mod_tidy_old.txt | 46 ++++++++++ 6 files changed, 204 insertions(+), 66 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_sum_lookup.txt create mode 100644 src/cmd/go/testdata/script/mod_tidy_old.txt diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index ddb9aeebe9..95063e62f4 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -52,4 +52,5 @@ func runInit(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go mod init: module path must not contain '@'") } modload.InitMod() // does all the hard work + modload.WriteGoMod() } diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index feb41a83b0..769cd11fe8 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -9,12 +9,9 @@ package modcmd import ( "cmd/go/internal/base" "cmd/go/internal/cfg" - "cmd/go/internal/modfetch" "cmd/go/internal/modload" "cmd/go/internal/work" "context" - - "golang.org/x/mod/module" ) var cmdTidy = &base.Command{ @@ -45,39 +42,6 @@ func runTidy(ctx context.Context, cmd *base.Command, args []string) { modload.LoadALL() modload.TidyBuildList() - modTidyGoSum() // updates memory copy; WriteGoMod on next line flushes it out + modload.TrimGoSum() modload.WriteGoMod() } - -// modTidyGoSum resets the go.sum file content -// to be exactly what's needed for the current go.mod. -func modTidyGoSum() { - // Assuming go.sum already has at least enough from the successful load, - // we only have to tell modfetch what needs keeping. - reqs := modload.Reqs() - keep := make(map[module.Version]bool) - replaced := make(map[module.Version]bool) - var walk func(module.Version) - walk = func(m module.Version) { - // If we build using a replacement module, keep the sum for the replacement, - // since that's the code we'll actually use during a build. - // - // TODO(golang.org/issue/29182): Perhaps we should keep both sums, and the - // sums for both sets of transitive requirements. - r := modload.Replacement(m) - if r.Path == "" { - keep[m] = true - } else { - keep[r] = true - replaced[m] = true - } - list, _ := reqs.Required(m) - for _, r := range list { - if !keep[r] && !replaced[r] { - walk(r) - } - } - } - walk(modload.Target) - modfetch.TrimGoSum(keep) -} diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index 8df2289097..e40158b535 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -375,12 +375,15 @@ type modSum struct { var goSum struct { mu sync.Mutex m map[module.Version][]string // content of go.sum file - checked map[modSum]bool // sums actually checked during execution - dirty bool // whether we added any new sums to m + status map[modSum]modSumStatus // state of sums in m overwrite bool // if true, overwrite go.sum without incorporating its contents enabled bool // whether to use go.sum at all } +type modSumStatus struct { + used, dirty bool +} + // initGoSum initializes the go.sum data. // The boolean it returns reports whether the // use of go.sum is now enabled. @@ -394,7 +397,7 @@ func initGoSum() (bool, error) { } goSum.m = make(map[module.Version][]string) - goSum.checked = make(map[modSum]bool) + goSum.status = make(map[modSum]modSumStatus) data, err := lockedfile.Read(GoSumFile) if err != nil && !os.IsNotExist(err) { return false, err @@ -504,6 +507,11 @@ func checkModSum(mod module.Version, h string) error { return err } done := inited && haveModSumLocked(mod, h) + if inited { + st := goSum.status[modSum{mod, h}] + st.used = true + goSum.status[modSum{mod, h}] = st + } goSum.mu.Unlock() if done { @@ -523,6 +531,9 @@ func checkModSum(mod module.Version, h string) error { if inited { goSum.mu.Lock() addModSumLocked(mod, h) + st := goSum.status[modSum{mod, h}] + st.dirty = true + goSum.status[modSum{mod, h}] = st goSum.mu.Unlock() } return nil @@ -532,7 +543,6 @@ func checkModSum(mod module.Version, h string) error { // If it finds a conflicting pair instead, it calls base.Fatalf. // goSum.mu must be locked. func haveModSumLocked(mod module.Version, h string) bool { - goSum.checked[modSum{mod, h}] = true for _, vh := range goSum.m[mod] { if h == vh { return true @@ -554,7 +564,6 @@ func addModSumLocked(mod module.Version, h string) { fmt.Fprintf(os.Stderr, "warning: verifying %s@%s: unknown hashes in go.sum: %v; adding %v"+hashVersionMismatch, mod.Path, mod.Version, strings.Join(goSum.m[mod], ", "), h) } goSum.m[mod] = append(goSum.m[mod], h) - goSum.dirty = true } // checkSumDB checks the mod, h pair against the Go checksum database. @@ -598,13 +607,35 @@ func Sum(mod module.Version) string { } // WriteGoSum writes the go.sum file if it needs to be updated. -func WriteGoSum() { +// +// keep is used to check whether a newly added sum should be saved in go.sum. +// 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) { goSum.mu.Lock() defer goSum.mu.Unlock() - if !goSum.enabled || !goSum.dirty { - // If we haven't read go.sum yet or if we don't have anything to add, - // don't bother opening it. + // If we haven't read the go.sum file yet, don't bother writing it. + if !goSum.enabled { + return + } + + // Check whether we need to add sums for which keep[m] is true or remove + // unused sums marked with TrimGoSum. If there are no changes to make, + // just return without opening go.sum. + dirty := false +Outer: + for m, hs := range goSum.m { + for _, h := range hs { + st := goSum.status[modSum{m, h}] + if st.dirty && (!st.used || keep[m]) { + dirty = true + break Outer + } + } + } + if !dirty { return } if cfg.BuildMod == "readonly" { @@ -625,9 +656,10 @@ func WriteGoSum() { // them without good reason. goSum.m = make(map[module.Version][]string, len(goSum.m)) readGoSum(goSum.m, GoSumFile, data) - for ms := range goSum.checked { - addModSumLocked(ms.mod, ms.sum) - goSum.dirty = true + for ms, st := range goSum.status { + if st.used { + addModSumLocked(ms.mod, ms.sum) + } } } @@ -642,7 +674,10 @@ func WriteGoSum() { list := goSum.m[m] sort.Strings(list) for _, h := range list { - fmt.Fprintf(&buf, "%s %s %s\n", m.Path, m.Version, h) + st := goSum.status[modSum{m, h}] + if !st.dirty || (st.used && keep[m]) { + fmt.Fprintf(&buf, "%s %s %s\n", m.Path, m.Version, h) + } } } return buf.Bytes(), nil @@ -652,12 +687,16 @@ func WriteGoSum() { base.Fatalf("go: updating go.sum: %v", err) } - goSum.checked = make(map[modSum]bool) - goSum.dirty = false + goSum.status = make(map[modSum]modSumStatus) goSum.overwrite = false } -// TrimGoSum trims go.sum to contain only the modules for which keep[m] is true. +// TrimGoSum trims go.sum to contain only the modules needed for reproducible +// builds. +// +// keep is used to check whether a sum should be retained in go.mod. It should +// have entries for both module content sums and go.mod sums (version ends +// with "/go.mod"). func TrimGoSum(keep map[module.Version]bool) { goSum.mu.Lock() defer goSum.mu.Unlock() @@ -669,13 +708,11 @@ func TrimGoSum(keep map[module.Version]bool) { return } - for m := range goSum.m { - // If we're keeping x@v we also keep x@v/go.mod. - // Map x@v/go.mod back to x@v for the keep lookup. - noGoMod := module.Version{Path: m.Path, Version: strings.TrimSuffix(m.Version, "/go.mod")} - if !keep[m] && !keep[noGoMod] { - delete(goSum.m, m) - goSum.dirty = true + for m, hs := range goSum.m { + if !keep[m] { + for _, h := range hs { + goSum.status[modSum{m, h}] = modSumStatus{used: false, dirty: true} + } goSum.overwrite = true } } diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 664a2a1594..95334211ef 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -331,7 +331,11 @@ func die() { } // InitMod sets Target and, if there is a main module, parses the initial build -// list from its go.mod file, creating and populating that file if needed. +// list from its go.mod file. If InitMod is called by 'go mod init', InitMod +// will populate go.mod in memory, possibly importing dependencies from a +// legacy configuration file. For other commands, InitMod may make other +// adjustments in memory, like adding a go directive. WriteGoMod should be +// called later to write changes out to disk. // // As a side-effect, InitMod sets a default for cfg.BuildMod if it does not // already have an explicit value. @@ -352,7 +356,6 @@ func InitMod() { // Running go mod init: do legacy module conversion legacyModInit() modFileToBuildList() - WriteGoMod() return } @@ -391,9 +394,6 @@ func InitMod() { if cfg.BuildMod == "vendor" { readVendorList() checkVendorConsistency() - } else { - // TODO(golang.org/issue/33326): if cfg.BuildMod != "readonly"? - WriteGoMod() } } @@ -797,9 +797,10 @@ func WriteGoMod() { base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly") } } + // Always update go.sum, even if we didn't change go.mod: we may have // downloaded modules that we didn't have before. - modfetch.WriteGoSum() + modfetch.WriteGoSum(keepSums()) if !dirty && cfg.CmdName != "mod tidy" { // The go.mod file has the same semantic content that it had before @@ -849,3 +850,59 @@ func WriteGoMod() { base.Fatalf("go: updating go.mod: %v", err) } } + +// keepSums returns a set of module sums to preserve in go.sum. The set +// includes entries for all modules used to load packages (according to +// the last load function like ImportPaths, LoadALL, etc.). It also contains +// entries for go.mod files needed for MVS (the version of these entries +// ends with "/go.mod"). +func keepSums() map[module.Version]bool { + // Walk the module graph and keep sums needed by MVS. + modkey := func(m module.Version) module.Version { + return module.Version{Path: m.Path, Version: m.Version + "/go.mod"} + } + keep := make(map[module.Version]bool) + replaced := make(map[module.Version]bool) + reqs := Reqs() + var walk func(module.Version) + walk = func(m module.Version) { + // If we build using a replacement module, keep the sum for the replacement, + // since that's the code we'll actually use during a build. + // + // TODO(golang.org/issue/29182): Perhaps we should keep both sums, and the + // sums for both sets of transitive requirements. + r := Replacement(m) + if r.Path == "" { + keep[modkey(m)] = true + } else { + replaced[m] = true + keep[modkey(r)] = true + } + list, _ := reqs.Required(m) + for _, r := range list { + if !keep[modkey(r)] && !replaced[r] { + walk(r) + } + } + } + walk(Target) + + // Add entries for modules that provided packages loaded with ImportPaths, + // LoadALL, or similar functions. + if loaded != nil { + for _, pkg := range loaded.pkgs { + m := pkg.mod + if r := Replacement(m); r.Path != "" { + keep[r] = true + } else { + keep[m] = true + } + } + } + + return keep +} + +func TrimGoSum() { + modfetch.TrimGoSum(keepSums()) +} diff --git a/src/cmd/go/testdata/script/mod_sum_lookup.txt b/src/cmd/go/testdata/script/mod_sum_lookup.txt new file mode 100644 index 0000000000..ed80a44984 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_sum_lookup.txt @@ -0,0 +1,33 @@ +# When we attempt to resolve an import that doesn't exist, we should not save +# hashes for downloaded modules. +# Verifies golang.org/issue/36260. +go list -e -tags=ignore ./noexist +! exists go.sum + +# When an import is resolved successfully, we should only save hashes for +# the module that provides the package, not for other modules looked up. +# Verifies golang.org/issue/31580. +go list ./exist +grep '^example.com/join v1.1.0 h1:' go.sum +! grep '^example.com/join/subpkg' go.sum +cp go.sum go.list.sum +go mod tidy +cmp go.sum go.list.sum + +-- go.mod -- +module m + +go 1.15 + +-- noexist/use.go -- +// ignore tags prevents errors in 'go mod tidy' +// +build ignore + +package use + +import _ "example.com/join/subpkg/noexist" + +-- exist/use.go -- +package use + +import _ "example.com/join/subpkg" diff --git a/src/cmd/go/testdata/script/mod_tidy_old.txt b/src/cmd/go/testdata/script/mod_tidy_old.txt new file mode 100644 index 0000000000..7428f0ce8a --- /dev/null +++ b/src/cmd/go/testdata/script/mod_tidy_old.txt @@ -0,0 +1,46 @@ +# 'go mod tidy' should remove content sums for module versions that aren't +# in the build list. It should preserve go.mod sums for module versions that +# are in the module graph though. +# Verifies golang.org/issue/33008. +go mod tidy +! grep '^rsc.io/quote v1.5.0 h1:' go.sum +grep '^rsc.io/quote v1.5.0/go.mod h1:' go.sum + +-- go.mod -- +module m + +go 1.15 + +require ( + rsc.io/quote v1.5.2 + example.com/r v0.0.0 +) + +replace example.com/r => ./r + +-- go.sum -- +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:pvCbr/wm8HzDD3fVywevekufpn6tCGPY3spdHeZJEsw= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +rsc.io/quote v1.5.0 h1:6fJa6E+wGadANKkUMlZ0DhXFpoKlslOQDCo259XtdIE= +rsc.io/quote v1.5.0/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= +rsc.io/quote v1.5.2 h1:3fEykkD9k7lYzXqCYrwGAf7iNhbk4yCjHmKBN9td4L0= +rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= +rsc.io/sampler v1.3.0 h1:HLGR/BgEtI3r0uymSP/nl2uPLsUnNJX8toRyhfpBTII= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/testonly v1.0.0 h1:K/VWHdO+Jv7woUXG0GzVNx1czBXUt3Ib1deaMn+xk64= +rsc.io/testonly v1.0.0/go.mod h1:OqmGbIFOcF+XrFReLOGZ6BhMM7uMBiQwZsyNmh74SzY= + +-- r/go.mod -- +module example.com/r + +require rsc.io/quote v1.5.0 + +-- use.go -- +package use + +import _ "example.com/r" + +-- r/use.go -- +package use + +import _ "rsc.io/quote" -- GitLab From 8766f96dd72b5d124bf76bf5f88e260a88072683 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 25 Jun 2020 17:50:38 -0400 Subject: [PATCH 0175/1792] cmd/go: migrate to module.MatchPrefixPatterns In CL 239797, str.GlobsMatchPath was copied to golang.org/x/mod/module as MatchPrefixPatterns. This CL updates x/mod, switches calls to use the new function, and deletes the old function. For #38725 Change-Id: I7241032228b574aa539426a92d2f5aad9ee001e2 Reviewed-on: https://go-review.googlesource.com/c/go/+/240061 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- src/cmd/go/internal/modfetch/insecure.go | 5 +- src/cmd/go/internal/modfetch/repo.go | 4 +- src/cmd/go/internal/modfetch/sumdb.go | 3 +- src/cmd/go/internal/str/path.go | 45 ------------------ .../vendor/golang.org/x/mod/module/module.go | 47 +++++++++++++++++++ src/cmd/vendor/modules.txt | 2 +- 8 files changed, 57 insertions(+), 55 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 6d57ceee79..21670b9996 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -7,7 +7,7 @@ require ( github.com/ianlancetaylor/demangle v0.0.0-20200414190113-039b1ae3a340 // indirect golang.org/x/arch v0.0.0-20200511175325-f7c78586839d golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 - golang.org/x/mod v0.3.0 + golang.org/x/mod v0.3.1-0.20200625141748-0b26df4a2231 golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 // indirect golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316 // indirect diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 3fc693e3bf..1b5ef515c2 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -14,8 +14,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200625141748-0b26df4a2231 h1:R11LxkoUvECaAHdM5/ZOevSR7n+016EgTw8nbE1l+XM= +golang.org/x/mod v0.3.1-0.20200625141748-0b26df4a2231/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= diff --git a/src/cmd/go/internal/modfetch/insecure.go b/src/cmd/go/internal/modfetch/insecure.go index 8420432d6c..b692669cba 100644 --- a/src/cmd/go/internal/modfetch/insecure.go +++ b/src/cmd/go/internal/modfetch/insecure.go @@ -7,10 +7,11 @@ package modfetch import ( "cmd/go/internal/cfg" "cmd/go/internal/get" - "cmd/go/internal/str" + + "golang.org/x/mod/module" ) // allowInsecure reports whether we are allowed to fetch this path in an insecure manner. func allowInsecure(path string) bool { - return get.Insecure || str.GlobsMatchPath(cfg.GOINSECURE, path) + return get.Insecure || module.MatchPrefixPatterns(cfg.GOINSECURE, path) } diff --git a/src/cmd/go/internal/modfetch/repo.go b/src/cmd/go/internal/modfetch/repo.go index f03bdd8d03..34f805d58a 100644 --- a/src/cmd/go/internal/modfetch/repo.go +++ b/src/cmd/go/internal/modfetch/repo.go @@ -16,9 +16,9 @@ import ( "cmd/go/internal/get" "cmd/go/internal/modfetch/codehost" "cmd/go/internal/par" - "cmd/go/internal/str" web "cmd/go/internal/web" + "golang.org/x/mod/module" "golang.org/x/mod/semver" ) @@ -217,7 +217,7 @@ func lookup(proxy, path string) (r Repo, err error) { return nil, errLookupDisabled } - if str.GlobsMatchPath(cfg.GONOPROXY, path) { + if module.MatchPrefixPatterns(cfg.GONOPROXY, path) { switch proxy { case "noproxy", "direct": return lookupDirect(path) diff --git a/src/cmd/go/internal/modfetch/sumdb.go b/src/cmd/go/internal/modfetch/sumdb.go index 7973f47426..783c4a433b 100644 --- a/src/cmd/go/internal/modfetch/sumdb.go +++ b/src/cmd/go/internal/modfetch/sumdb.go @@ -24,7 +24,6 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/get" "cmd/go/internal/lockedfile" - "cmd/go/internal/str" "cmd/go/internal/web" "golang.org/x/mod/module" @@ -34,7 +33,7 @@ import ( // useSumDB reports whether to use the Go checksum database for the given module. func useSumDB(mod module.Version) bool { - return cfg.GOSUMDB != "off" && !get.Insecure && !str.GlobsMatchPath(cfg.GONOSUMDB, mod.Path) + return cfg.GOSUMDB != "off" && !get.Insecure && !module.MatchPrefixPatterns(cfg.GONOSUMDB, mod.Path) } // lookupSumDB returns the Go checksum database's go.sum lines for the given module, diff --git a/src/cmd/go/internal/str/path.go b/src/cmd/go/internal/str/path.go index 95d91a3332..51ab2af82b 100644 --- a/src/cmd/go/internal/str/path.go +++ b/src/cmd/go/internal/str/path.go @@ -5,7 +5,6 @@ package str import ( - "path" "path/filepath" "strings" ) @@ -50,47 +49,3 @@ func HasFilePathPrefix(s, prefix string) bool { return s[len(prefix)] == filepath.Separator && s[:len(prefix)] == prefix } } - -// GlobsMatchPath reports whether any path prefix of target -// matches one of the glob patterns (as defined by path.Match) -// in the comma-separated globs list. -// It ignores any empty or malformed patterns in the list. -func GlobsMatchPath(globs, target string) bool { - for globs != "" { - // Extract next non-empty glob in comma-separated list. - var glob string - if i := strings.Index(globs, ","); i >= 0 { - glob, globs = globs[:i], globs[i+1:] - } else { - glob, globs = globs, "" - } - if glob == "" { - continue - } - - // A glob with N+1 path elements (N slashes) needs to be matched - // against the first N+1 path elements of target, - // which end just before the N+1'th slash. - n := strings.Count(glob, "/") - prefix := target - // Walk target, counting slashes, truncating at the N+1'th slash. - for i := 0; i < len(target); i++ { - if target[i] == '/' { - if n == 0 { - prefix = target[:i] - break - } - n-- - } - } - if n > 0 { - // Not enough prefix elements. - continue - } - matched, _ := path.Match(glob, prefix) - if matched { - return true - } - } - return false -} 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 6cd37280a8..3a8b080c7b 100644 --- a/src/cmd/vendor/golang.org/x/mod/module/module.go +++ b/src/cmd/vendor/golang.org/x/mod/module/module.go @@ -97,6 +97,7 @@ package module import ( "fmt" + "path" "sort" "strings" "unicode" @@ -716,3 +717,49 @@ func unescapeString(escaped string) (string, bool) { } return string(buf), true } + +// MatchPrefixPatterns reports whether any path prefix of target matches one of +// 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'. +// +// It ignores any empty or malformed patterns in the list. +func MatchPrefixPatterns(globs, target string) bool { + for globs != "" { + // Extract next non-empty glob in comma-separated list. + var glob string + if i := strings.Index(globs, ","); i >= 0 { + glob, globs = globs[:i], globs[i+1:] + } else { + glob, globs = globs, "" + } + if glob == "" { + continue + } + + // A glob with N+1 path elements (N slashes) needs to be matched + // against the first N+1 path elements of target, + // which end just before the N+1'th slash. + n := strings.Count(glob, "/") + prefix := target + // Walk target, counting slashes, truncating at the N+1'th slash. + for i := 0; i < len(target); i++ { + if target[i] == '/' { + if n == 0 { + prefix = target[:i] + break + } + n-- + } + } + if n > 0 { + // Not enough prefix elements. + continue + } + matched, _ := path.Match(glob, prefix) + if matched { + return true + } + } + return false +} diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 21fc78c237..7272f04ff3 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -29,7 +29,7 @@ golang.org/x/arch/x86/x86asm golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ssh/terminal -# golang.org/x/mod v0.3.0 +# golang.org/x/mod v0.3.1-0.20200625141748-0b26df4a2231 ## explicit golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile -- GitLab From 02a7b4b4a70d0574f82776309feaf28f109f5399 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 30 Jun 2020 13:48:15 -0400 Subject: [PATCH 0176/1792] cmd/go/internal/modload: don't initialize build cache modload.Init initialized the build cache with the intent of providing a better error message in Go 1.12, when the build cache became mandatory (in module mode, packages aren't installed outside the build cache). Unfortunately, this didn't provide a more descriptive error (the cache calls base.Fatalf with its own message), and it caused errors for commands that don't use the cache (like 'go mod edit'). This CL removes the cache initialization from modload.Init. The builder will initialize it when it's needed. For #39882 Change-Id: Ibc01ae4e59358dcd08a07ffc97bf556514d0366f Reviewed-on: https://go-review.googlesource.com/c/go/+/240548 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/init.go | 7 --- .../testdata/script/build_cache_disabled.txt | 46 +++++++++++++++++++ 2 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 src/cmd/go/testdata/script/build_cache_disabled.txt diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 95334211ef..fff060e665 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -20,7 +20,6 @@ import ( "strings" "cmd/go/internal/base" - "cmd/go/internal/cache" "cmd/go/internal/cfg" "cmd/go/internal/load" "cmd/go/internal/lockedfile" @@ -162,12 +161,6 @@ func Init() { // We're in module mode. Install the hooks to make it work. - if c := cache.Default(); c == nil { - // With modules, there are no install locations for packages - // other than the build cache. - base.Fatalf("go: cannot use modules with build cache disabled") - } - list := filepath.SplitList(cfg.BuildContext.GOPATH) if len(list) == 0 || list[0] == "" { base.Fatalf("missing $GOPATH") diff --git a/src/cmd/go/testdata/script/build_cache_disabled.txt b/src/cmd/go/testdata/script/build_cache_disabled.txt new file mode 100644 index 0000000000..2e1327880b --- /dev/null +++ b/src/cmd/go/testdata/script/build_cache_disabled.txt @@ -0,0 +1,46 @@ +# The build cache is required to build anything. It also may be needed to +# initialize the build system, which is needed for commands like 'go env'. +# However, there are lots of commands the cache is not needed for, and we +# shouldn't require it when it won't be used. +# +# TODO(golang.org/issue/39882): commands below should work, too. +# * go clean -modcache +# * go env +# * go fix +# * go fmt +# * go generate +# * go get -d +# * go list (without -export or -compiled) + +env GOCACHE=off + +# Commands that don't completely load packages should work. +go doc fmt +stdout Printf + +go fmt . + +! go tool compile -h +stderr usage: + +go version +stdout '^go version' + + +# Module commands that don't load packages should work. +go mod init m +exists go.mod + +go mod edit -require rsc.io/quote@v1.5.2 + +go mod download rsc.io/quote + +go mod graph +stdout rsc.io/quote + +go mod verify + +-- main.go -- +package main + +func main() {} -- GitLab From 32a84c99e136ed5af0686dbedd31fd7dff40fb38 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Sat, 8 Aug 2020 07:58:04 -0700 Subject: [PATCH 0177/1792] cmd/compile: fix live variable computation for deferreturn Taking the live variable set from the last return point is problematic. See #40629 for details, but there may not be a return point, or it may be before the final defer. Additionally, keeping track of the last call as a *Value doesn't quite work. If it is dead-code eliminated, the storage for the Value is reused for some other random instruction. Its live variable information, if it is available at all, is wrong. Instead, just mark all the open-defer argument slots as live throughout the function. (They are already zero-initialized.) Fixes #40629 Change-Id: Ie456c7db3082d0de57eaa5234a0f32525a1cce13 Reviewed-on: https://go-review.googlesource.com/c/go/+/247522 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Dan Scales --- src/cmd/compile/internal/gc/plive.go | 118 ++++++--------------------- src/cmd/compile/internal/gc/ssa.go | 19 +---- src/cmd/compile/internal/ssa/func.go | 11 +-- test/fixedbugs/issue40629.go | 69 ++++++++++++++++ 4 files changed, 99 insertions(+), 118 deletions(-) create mode 100644 test/fixedbugs/issue40629.go diff --git a/src/cmd/compile/internal/gc/plive.go b/src/cmd/compile/internal/gc/plive.go index b366c8a4a0..0cb2661997 100644 --- a/src/cmd/compile/internal/gc/plive.go +++ b/src/cmd/compile/internal/gc/plive.go @@ -140,24 +140,14 @@ type Liveness struct { regMaps []liveRegMask cache progeffectscache - - // These are only populated if open-coded defers are being used. - // List of vars/stack slots storing defer args - openDeferVars []openDeferVarInfo - // Map from defer arg OpVarDef to the block where the OpVarDef occurs. - openDeferVardefToBlockMap map[*Node]*ssa.Block - // Map of blocks that cannot reach a return or exit (panic) - nonReturnBlocks map[*ssa.Block]bool -} - -type openDeferVarInfo struct { - n *Node // Var/stack slot storing a defer arg - varsIndex int // Index of variable in lv.vars } // LivenessMap maps from *ssa.Value to LivenessIndex. type LivenessMap struct { vals map[ssa.ID]LivenessIndex + // The set of live, pointer-containing variables at the deferreturn + // call (only set when open-coded defers are used). + deferreturn LivenessIndex } func (m *LivenessMap) reset() { @@ -168,6 +158,7 @@ func (m *LivenessMap) reset() { delete(m.vals, k) } } + m.deferreturn = LivenessInvalid } func (m *LivenessMap) set(v *ssa.Value, i LivenessIndex) { @@ -542,7 +533,7 @@ func newliveness(fn *Node, f *ssa.Func, vars []*Node, idx map[*Node]int32, stkpt if cap(lc.be) >= f.NumBlocks() { lv.be = lc.be[:f.NumBlocks()] } - lv.livenessMap = LivenessMap{lc.livenessMap.vals} + lv.livenessMap = LivenessMap{vals: lc.livenessMap.vals, deferreturn: LivenessInvalid} lc.livenessMap.vals = nil } if lv.be == nil { @@ -893,58 +884,12 @@ func (lv *Liveness) hasStackMap(v *ssa.Value) bool { func (lv *Liveness) prologue() { lv.initcache() - if lv.fn.Func.HasDefer() && !lv.fn.Func.OpenCodedDeferDisallowed() { - lv.openDeferVardefToBlockMap = make(map[*Node]*ssa.Block) - for i, n := range lv.vars { - if n.Name.OpenDeferSlot() { - lv.openDeferVars = append(lv.openDeferVars, openDeferVarInfo{n: n, varsIndex: i}) - } - } - - // Find any blocks that cannot reach a return or a BlockExit - // (panic) -- these must be because of an infinite loop. - reachesRet := make(map[ssa.ID]bool) - blockList := make([]*ssa.Block, 0, 256) - - for _, b := range lv.f.Blocks { - if b.Kind == ssa.BlockRet || b.Kind == ssa.BlockRetJmp || b.Kind == ssa.BlockExit { - blockList = append(blockList, b) - } - } - - for len(blockList) > 0 { - b := blockList[0] - blockList = blockList[1:] - if reachesRet[b.ID] { - continue - } - reachesRet[b.ID] = true - for _, e := range b.Preds { - blockList = append(blockList, e.Block()) - } - } - - lv.nonReturnBlocks = make(map[*ssa.Block]bool) - for _, b := range lv.f.Blocks { - if !reachesRet[b.ID] { - lv.nonReturnBlocks[b] = true - //fmt.Println("No reach ret", lv.f.Name, b.ID, b.Kind) - } - } - } - for _, b := range lv.f.Blocks { be := lv.blockEffects(b) // Walk the block instructions backward and update the block // effects with the each prog effects. for j := len(b.Values) - 1; j >= 0; j-- { - if b.Values[j].Op == ssa.OpVarDef { - n := b.Values[j].Aux.(*Node) - if n.Name.OpenDeferSlot() { - lv.openDeferVardefToBlockMap[n] = b - } - } pos, e := lv.valueEffects(b.Values[j]) regUevar, regKill := lv.regEffects(b.Values[j]) if e&varkill != 0 { @@ -961,20 +906,6 @@ func (lv *Liveness) prologue() { } } -// markDeferVarsLive marks each variable storing an open-coded defer arg as -// specially live in block b if the variable definition dominates block b. -func (lv *Liveness) markDeferVarsLive(b *ssa.Block, newliveout *varRegVec) { - // Only force computation of dominators if we have a block where we need - // to specially mark defer args live. - sdom := lv.f.Sdom() - for _, info := range lv.openDeferVars { - defB := lv.openDeferVardefToBlockMap[info.n] - if sdom.IsAncestorEq(defB, b) { - newliveout.vars.Set(int32(info.varsIndex)) - } - } -} - // Solve the liveness dataflow equations. func (lv *Liveness) solve() { // These temporary bitvectors exist to avoid successive allocations and @@ -1018,23 +949,6 @@ func (lv *Liveness) solve() { } } - if lv.fn.Func.HasDefer() && !lv.fn.Func.OpenCodedDeferDisallowed() && - (b.Kind == ssa.BlockExit || lv.nonReturnBlocks[b]) { - // Open-coded defer args slots must be live - // everywhere in a function, since a panic can - // occur (almost) anywhere. Force all appropriate - // defer arg slots to be live in BlockExit (panic) - // blocks and in blocks that do not reach a return - // (because of infinite loop). - // - // We are assuming that the defer exit code at - // BlockReturn/BlockReturnJmp accesses all of the - // defer args (with pointers), and so keeps them - // live. This analysis may have to be adjusted if - // that changes (because of optimizations). - lv.markDeferVarsLive(b, &newliveout) - } - if !be.liveout.Eq(newliveout) { change = true be.liveout.Copy(newliveout) @@ -1087,6 +1001,17 @@ func (lv *Liveness) epilogue() { n.Name.SetNeedzero(true) livedefer.Set(int32(i)) } + if n.Name.OpenDeferSlot() { + // Open-coded defer args slots must be live + // everywhere in a function, since a panic can + // occur (almost) anywhere. Because it is live + // everywhere, it must be zeroed on entry. + livedefer.Set(int32(i)) + // It was already marked as Needzero when created. + if !n.Name.Needzero() { + Fatalf("all pointer-containing defer arg slots should have Needzero set") + } + } } } @@ -1188,6 +1113,17 @@ func (lv *Liveness) epilogue() { lv.compact(b) } + // If we have an open-coded deferreturn call, make a liveness map for it. + if lv.fn.Func.OpenCodedDeferDisallowed() { + lv.livenessMap.deferreturn = LivenessInvalid + } else { + lv.livenessMap.deferreturn = LivenessIndex{ + stackMapIndex: lv.stackMapSet.add(livedefer), + regMapIndex: 0, // entry regMap, containing no live registers + isUnsafePoint: false, + } + } + // Done compacting. Throw out the stack map set. lv.stackMaps = lv.stackMapSet.extractUniqe() lv.stackMapSet = bvecSet{} diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index d4d23a2956..5d0098b4e6 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -4318,12 +4318,6 @@ func (s *state) openDeferExit() { } } - if i == len(s.openDefers)-1 { - // Record the call of the first defer. This will be used - // to set liveness info for the deferreturn (which is also - // used for any location that causes a runtime panic) - s.f.LastDeferExit = call - } s.endBlock() s.startBlock(bEnd) } @@ -5807,11 +5801,6 @@ type SSAGenState struct { // wasm: The number of values on the WebAssembly stack. This is only used as a safeguard. OnWasmStackSkipped int - - // Liveness index for the first function call in the final defer exit code - // path that we generated. All defer functions and args should be live at - // this point. This will be used to set the liveness for the deferreturn. - lastDeferLiveness LivenessIndex } // Prog appends a new Prog. @@ -6056,12 +6045,6 @@ func genssa(f *ssa.Func, pp *Progs) { // instruction. s.pp.nextLive = s.livenessMap.Get(v) - // Remember the liveness index of the first defer call of - // the last defer exit - if v.Block.Func.LastDeferExit != nil && v == v.Block.Func.LastDeferExit { - s.lastDeferLiveness = s.pp.nextLive - } - // Special case for first line in function; move it to the start. if firstPos != src.NoXPos { s.SetPos(firstPos) @@ -6122,7 +6105,7 @@ func genssa(f *ssa.Func, pp *Progs) { // When doing open-coded defers, generate a disconnected call to // deferreturn and a return. This will be used to during panic // recovery to unwind the stack and return back to the runtime. - s.pp.nextLive = s.lastDeferLiveness + s.pp.nextLive = s.livenessMap.deferreturn gencallret(pp, Deferreturn) } diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go index 7cf72a8e37..4b9189fb3e 100644 --- a/src/cmd/compile/internal/ssa/func.go +++ b/src/cmd/compile/internal/ssa/func.go @@ -33,15 +33,8 @@ type Func struct { Blocks []*Block // unordered set of all basic blocks (note: not indexable by ID) Entry *Block // the entry basic block - // If we are using open-coded defers, this is the first call to a deferred - // function in the final defer exit sequence that we generated. This call - // should be after all defer statements, and will have all args, etc. of - // all defer calls as live. The liveness info of this call will be used - // for the deferreturn/ret segment generated for functions with open-coded - // defers. - LastDeferExit *Value - bid idAlloc // block ID allocator - vid idAlloc // value ID allocator + bid idAlloc // block ID allocator + vid idAlloc // value ID allocator // Given an environment variable used for debug hash match, // what file (if any) receives the yes/no logging? diff --git a/test/fixedbugs/issue40629.go b/test/fixedbugs/issue40629.go new file mode 100644 index 0000000000..c6ef408f49 --- /dev/null +++ b/test/fixedbugs/issue40629.go @@ -0,0 +1,69 @@ +// run + +// 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 main + +import "fmt" + +const N = 40 + +func main() { + var x [N]int // stack-allocated memory + for i := range x { + x[i] = 0x999 + } + + // This defer checks to see if x is uncorrupted. + defer func(p *[N]int) { + recover() + for i := range p { + if p[i] != 0x999 { + for j := range p { + fmt.Printf("p[%d]=0x%x\n", j, p[j]) + } + panic("corrupted stack variable") + } + } + }(&x) + + // This defer starts a new goroutine, which will (hopefully) + // overwrite x on the garbage stack. + defer func() { + c := make(chan bool) + go func() { + useStack(1000) + c <- true + }() + <-c + + }() + + // This defer causes a stack copy. + // The old stack is now garbage. + defer func() { + useStack(1000) + }() + + // Trigger a segfault. + *g = 0 + + // Make the return statement unreachable. + // That makes the stack map at the deferreturn call empty. + // In particular, the argument to the first defer is not + // marked as a pointer, so it doesn't get adjusted + // during the stack copy. + for { + } +} + +var g *int64 + +func useStack(n int) { + if n == 0 { + return + } + useStack(n - 1) +} -- GitLab From 407bf0ca67200463cdd451937623078e0240335e Mon Sep 17 00:00:00 2001 From: Alexander Klauer Date: Mon, 29 Jun 2020 16:02:07 +0000 Subject: [PATCH 0178/1792] =?UTF-8?q?reflect:=20add=20parentheses=20to=20p?= =?UTF-8?q?roperly=20bind=20<-=20in=20ChanOf=E2=80=99s=20string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds parentheses so as to properly bind <- to the right most channel. This meant that previously given: ChanOf(<-chan T) it would mistakenly try to look up the type as chan <-chan T instead of chan (<-chan T) Fixes #39897 Change-Id: I8564916055f5fadde3382e41fe8820a1071e5f13 GitHub-Last-Rev: f8f2abe8d4c9e3d1414c89cadca8a16ce5cdeab9 GitHub-Pull-Request: golang/go#39898 Reviewed-on: https://go-review.googlesource.com/c/go/+/240280 Reviewed-by: Emmanuel Odeke Reviewed-by: Keith Randall Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/reflect/all_test.go | 16 ++++++++++++++++ src/reflect/type.go | 12 ++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 63f6a92157..6b31568bb9 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -74,6 +74,10 @@ var typeTests = []pair{ {struct{ x ([]int8) }{}, "[]int8"}, {struct{ x (map[string]int32) }{}, "map[string]int32"}, {struct{ x (chan<- string) }{}, "chan<- string"}, + {struct{ x (chan<- chan string) }{}, "chan<- chan string"}, + {struct{ x (chan<- <-chan string) }{}, "chan<- <-chan string"}, + {struct{ x (<-chan <-chan string) }{}, "<-chan <-chan string"}, + {struct{ x (chan (<-chan string)) }{}, "chan (<-chan string)"}, {struct { x struct { c chan *int32 @@ -5491,6 +5495,18 @@ func TestChanOf(t *testing.T) { // check that type already in binary is found type T1 int checkSameType(t, ChanOf(BothDir, TypeOf(T1(1))), (chan T1)(nil)) + + // Check arrow token association in undefined chan types. + var left chan<- chan T + var right chan (<-chan T) + tLeft := ChanOf(SendDir, ChanOf(BothDir, TypeOf(T("")))) + tRight := ChanOf(BothDir, ChanOf(RecvDir, TypeOf(T("")))) + if tLeft != TypeOf(left) { + t.Errorf("chan<-chan: have %s, want %T", tLeft, left) + } + if tRight != TypeOf(right) { + t.Errorf("chan<-chan: have %s, want %T", tRight, right) + } } func TestChanOfDir(t *testing.T) { diff --git a/src/reflect/type.go b/src/reflect/type.go index 38b1283d42..44c96fea82 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -1789,7 +1789,6 @@ func ChanOf(dir ChanDir, t Type) Type { } // Look in known types. - // TODO: Precedence when constructing string. var s string switch dir { default: @@ -1799,7 +1798,16 @@ func ChanOf(dir ChanDir, t Type) Type { case RecvDir: s = "<-chan " + typ.String() case BothDir: - s = "chan " + typ.String() + typeStr := typ.String() + if typeStr[0] == '<' { + // typ is recv chan, need parentheses as "<-" associates with leftmost + // chan possible, see: + // * https://golang.org/ref/spec#Channel_types + // * https://github.com/golang/go/issues/39897 + s = "chan (" + typeStr + ")" + } else { + s = "chan " + typeStr + } } for _, tt := range typesByString(s) { ch := (*chanType)(unsafe.Pointer(tt)) -- GitLab From 24ff2af65e27eed1e8c7f09c21a5ca68fc2e07ab Mon Sep 17 00:00:00 2001 From: lufia Date: Sun, 26 Jul 2020 19:04:37 +0900 Subject: [PATCH 0179/1792] cmd/dist: fix typo Change-Id: Ib5d7f3eadff03070043d52659af4312ee293c586 Reviewed-on: https://go-review.googlesource.com/c/go/+/244817 Reviewed-by: Alberto Donizetti Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/cmd/dist/build.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index a817e6fcd7..397b3bb88f 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -1209,7 +1209,7 @@ func timelog(op, name string) { } i := strings.Index(s, " start") if i < 0 { - log.Fatalf("time log %s does not begin with start line", os.Getenv("GOBULDTIMELOGFILE")) + log.Fatalf("time log %s does not begin with start line", os.Getenv("GOBUILDTIMELOGFILE")) } t, err := time.Parse(time.UnixDate, s[:i]) if err != nil { -- GitLab From 5a18e0b58ca2d08f3988018a8759207cb64e651a Mon Sep 17 00:00:00 2001 From: Gaurav Singh Date: Thu, 23 Jul 2020 23:27:05 +0000 Subject: [PATCH 0180/1792] sync: fix goroutine leak for when TestMutexFairness times out MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the timeout triggers before writing to the done channel, the goroutine will be blocked waiting for a corresponding read that’s no longer existent, thus a goroutine leak. This change fixes that by using a buffered channel instead. Change-Id: I9cf4067a58bc5a729ab31e4426edd78bd359e8e0 GitHub-Last-Rev: a7d811a7be6d875175a894e53d474aa0034e7d2c GitHub-Pull-Request: golang/go#40236 Reviewed-on: https://go-review.googlesource.com/c/go/+/242902 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/sync/mutex_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sync/mutex_test.go b/src/sync/mutex_test.go index e61a853642..98c1bf2a5f 100644 --- a/src/sync/mutex_test.go +++ b/src/sync/mutex_test.go @@ -194,7 +194,7 @@ func TestMutexFairness(t *testing.T) { } } }() - done := make(chan bool) + done := make(chan bool, 1) go func() { for i := 0; i < 10; i++ { time.Sleep(100 * time.Microsecond) -- GitLab From f71444955a4c0962abb334a8f39438466c57a4db Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 14 Aug 2020 14:39:19 -0700 Subject: [PATCH 0181/1792] test: add test case that caused gccgo undefined symbol reference For #40252 Change-Id: Ie23d2789ca9b4b9081adb39ab64c80c412ad58ce Reviewed-on: https://go-review.googlesource.com/c/go/+/248637 Run-TryBot: Ian Lance Taylor Reviewed-by: Cherry Zhang TryBot-Result: Gobot Gobot --- test/fixedbugs/issue40252.dir/a.go | 14 ++++++++++++++ test/fixedbugs/issue40252.dir/main.go | 16 ++++++++++++++++ test/fixedbugs/issue40252.go | 8 ++++++++ 3 files changed, 38 insertions(+) create mode 100644 test/fixedbugs/issue40252.dir/a.go create mode 100644 test/fixedbugs/issue40252.dir/main.go create mode 100644 test/fixedbugs/issue40252.go diff --git a/test/fixedbugs/issue40252.dir/a.go b/test/fixedbugs/issue40252.dir/a.go new file mode 100644 index 0000000000..5519e9331a --- /dev/null +++ b/test/fixedbugs/issue40252.dir/a.go @@ -0,0 +1,14 @@ +// 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 a + +type I interface { + Func() +} + +func Call() { + f := I.Func + f(nil) +} diff --git a/test/fixedbugs/issue40252.dir/main.go b/test/fixedbugs/issue40252.dir/main.go new file mode 100644 index 0000000000..93f5b70624 --- /dev/null +++ b/test/fixedbugs/issue40252.dir/main.go @@ -0,0 +1,16 @@ +// 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 main + +import "./a" + +func main() { + defer func() { + if recover() == nil { + panic("expected nil pointer dereference") + } + }() + a.Call() +} diff --git a/test/fixedbugs/issue40252.go b/test/fixedbugs/issue40252.go new file mode 100644 index 0000000000..9be4e665d2 --- /dev/null +++ b/test/fixedbugs/issue40252.go @@ -0,0 +1,8 @@ +// rundir + +// 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. + +// gccgo got an undefined symbol reference when inlining a method expression. +package ignored -- GitLab From 6072d6ee3e173bb46370dabc158e2cb25a6f4877 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 10 Jul 2020 09:56:00 -0700 Subject: [PATCH 0182/1792] test: add a test case that gccgo fails to compile Change-Id: If36394e059cdae49834d26ad4ffdd3092a72a0b8 Reviewed-on: https://go-review.googlesource.com/c/go/+/241997 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- test/fixedbugs/bug509.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 test/fixedbugs/bug509.go diff --git a/test/fixedbugs/bug509.go b/test/fixedbugs/bug509.go new file mode 100644 index 0000000000..df6ed61f89 --- /dev/null +++ b/test/fixedbugs/bug509.go @@ -0,0 +1,30 @@ +// compile + +// 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. + +// Gccgo mishandles a couple of alias cases. + +package p + +type S struct{} + +func (*S) M() {} + +type I interface { + M() +} + +type A = *S + +var V1 I +var _ = V1.(*S) +var _ = V1.(A) + +func F() { + var v I + v = (*S)(nil) + v = A(nil) + _ = v +} -- GitLab From 12d40adac46b5c771247a789205f7893bfd808b2 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 10 Jul 2020 12:21:41 -0700 Subject: [PATCH 0183/1792] test: add test for conversion of untyped bool to interface gccgo miscompiled this case. Updates #40152 Change-Id: I8448c155e802e39d8fc7cda4930ce62cb6363ce5 Reviewed-on: https://go-review.googlesource.com/c/go/+/242000 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke Reviewed-by: Cherry Zhang --- test/fixedbugs/issue40152.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 test/fixedbugs/issue40152.go diff --git a/test/fixedbugs/issue40152.go b/test/fixedbugs/issue40152.go new file mode 100644 index 0000000000..1cb68e9914 --- /dev/null +++ b/test/fixedbugs/issue40152.go @@ -0,0 +1,21 @@ +// run + +// 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. + +// Gccgo mishandles converting an untyped boolean to an interface type. + +package main + +func t(args ...interface{}) bool { + x := true + return x == args[0] +} + +func main() { + r := t("x" == "x" && "y" == "y") + if !r { + panic(r) + } +} -- GitLab From 441b52f5660ccde7848f034ba345d2f0088ea383 Mon Sep 17 00:00:00 2001 From: kakulisen Date: Thu, 14 May 2020 16:20:58 +0800 Subject: [PATCH 0184/1792] math: simplify the code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplifying some code without compromising performance. My CPU is Intel Xeon Gold 6161, 2.20GHz, 64-bit operating system. The memory is 8GB. This is my test environment, I hope to help you judge. Benchmark: name old time/op new time/op delta Log1p-4 21.8ns ± 5% 21.8ns ± 4% ~ (p=0.973 n=20+20) Change-Id: Icd8f96f1325b00007602d114300b92d4c57de409 Reviewed-on: https://go-review.googlesource.com/c/go/+/233940 Reviewed-by: Robert Griesemer --- src/math/log1p.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/math/log1p.go b/src/math/log1p.go index c4ec61b225..e34e1ff4f2 100644 --- a/src/math/log1p.go +++ b/src/math/log1p.go @@ -122,10 +122,7 @@ func log1p(x float64) float64 { return Inf(1) } - absx := x - if absx < 0 { - absx = -absx - } + absx := Abs(x) var f float64 var iu uint64 -- GitLab From 0031fa80a3c6685e44e84533edbae0dad0eb0395 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 7 May 2020 00:35:28 +0700 Subject: [PATCH 0185/1792] cmd/compile: another fix initializing blank fields in struct literal CL 230121 fixed the bug that struct literal blank fields type array/struct can not be initialized. But it still misses some cases when an expression causes "candiscard(value)" return false. When these happen, we recursively call fixedlit with "var_" set to "_", and hit the bug again. To fix it, just making splitnode return "nblank" whenever "var_" is "nblank". Fixes #38905 Change-Id: I281941b388acbd551a4d8ca1a235477f8d26fb6e Reviewed-on: https://go-review.googlesource.com/c/go/+/232617 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/sinit.go | 6 +++++- test/fixedbugs/issue38905.go | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue38905.go diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 4a2edc7d21..71ed558461 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -506,6 +506,7 @@ const ( // fixedlit handles struct, array, and slice literals. // TODO: expand documentation. func fixedlit(ctxt initContext, kind initKind, n *Node, var_ *Node, init *Nodes) { + isBlank := var_ == nblank var splitnode func(*Node) (a *Node, value *Node) switch n.Op { case OARRAYLIT, OSLICELIT: @@ -520,6 +521,9 @@ func fixedlit(ctxt initContext, kind initKind, n *Node, var_ *Node, init *Nodes) } a := nod(OINDEX, var_, nodintconst(k)) k++ + if isBlank { + a = nblank + } return a, r } case OSTRUCTLIT: @@ -527,7 +531,7 @@ func fixedlit(ctxt initContext, kind initKind, n *Node, var_ *Node, init *Nodes) if r.Op != OSTRUCTKEY { Fatalf("fixedlit: rhs not OSTRUCTKEY: %v", r) } - if r.Sym.IsBlank() { + if r.Sym.IsBlank() || isBlank { return nblank, r.Left } setlineno(r) diff --git a/test/fixedbugs/issue38905.go b/test/fixedbugs/issue38905.go new file mode 100644 index 0000000000..6f411b8605 --- /dev/null +++ b/test/fixedbugs/issue38905.go @@ -0,0 +1,18 @@ +// compile + +// 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. + +// Make sure that literal value can be passed to struct +// blank field with expressions where candiscard(value) +// returns false, see #38905. + +package p + +type t struct{ _ u } +type u [10]struct{ f int } + +func f(x int) t { return t{u{{1 / x}, {1 % x}}} } +func g(p *int) t { return t{u{{*p}}} } +func h(s []int) t { return t{u{{s[0]}}} } -- GitLab From 82c45eb68187d7827bca392d528dbfa06607e3f0 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Mon, 27 Jul 2020 12:08:56 +0700 Subject: [PATCH 0186/1792] cmd/compile: handle OCLOSURE/OCALLPART in mustHeapAlloc check Currently, generated struct wrapper for closure is not handled in mustHeapAlloc. That causes compiler crashes when the wrapper struct is too large for stack, and must be heap allocated instead. Fixes #39292 Change-Id: I14c1e591681d9d92317bb2396d6cf5207aa93e08 Reviewed-on: https://go-review.googlesource.com/c/go/+/244917 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/closure.go | 2 +- src/cmd/compile/internal/gc/esc.go | 7 +++++++ test/fixedbugs/issue39292.go | 29 ++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue39292.go diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index 3bb7bb9834..04fb7d5495 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -526,7 +526,7 @@ func walkpartialcall(n *Node, init *Nodes) *Node { // Create closure in the form of a composite literal. // For x.M with receiver (x) type T, the generated code looks like: // - // clos = &struct{F uintptr; R T}{M.T·f, x} + // clos = &struct{F uintptr; R T}{T.M·f, x} // // Like walkclosure above. diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index f3e9ab78ef..628953741a 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -187,6 +187,13 @@ func mustHeapAlloc(n *Node) bool { return true } + if n.Op == OCLOSURE && closureType(n).Size() >= maxImplicitStackVarSize { + return true + } + if n.Op == OCALLPART && partialCallType(n).Size() >= maxImplicitStackVarSize { + return true + } + if n.Op == OMAKESLICE && !isSmallMakeSlice(n) { return true } diff --git a/test/fixedbugs/issue39292.go b/test/fixedbugs/issue39292.go new file mode 100644 index 0000000000..5d6595c234 --- /dev/null +++ b/test/fixedbugs/issue39292.go @@ -0,0 +1,29 @@ +// errorcheck -0 -m -l + +// 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 p + +type t [10000]*int + +func (t) f() { +} + +func x() { + x := t{}.f // ERROR "t literal.f escapes to heap" + x() +} + +func y() { + var i int // ERROR "moved to heap: i" + y := (&t{&i}).f // ERROR "\(&t literal\).f escapes to heap" "&t literal escapes to heap" + y() +} + +func z() { + var i int // ERROR "moved to heap: i" + z := t{&i}.f // ERROR "t literal.f escapes to heap" + z() +} -- GitLab From 948d324f7d8641a042da46c25417ebabd84e5e78 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 12 Aug 2020 23:12:57 +0700 Subject: [PATCH 0187/1792] cmd/compile: add failing test case for #24305 Updates #24305 Change-Id: Ib0b093e33004a978467cdd1e77186798392d4eca Reviewed-on: https://go-review.googlesource.com/c/go/+/248217 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- test/escape5.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/escape5.go b/test/escape5.go index 061e57a069..2ed2023cd2 100644 --- a/test/escape5.go +++ b/test/escape5.go @@ -179,6 +179,13 @@ func _() { u.N() } +func fbad24305() { + // BAD u should not be heap allocated + var u U // ERROR "moved to heap: u" + (*U).M(&u) + (*U).N(&u) +} + // Issue 24730: taking address in a loop causes unnecessary escape type T24730 struct { x [64]byte -- GitLab From 69d34e2c6965f70fe1ead3e7e8ab45ada3267ebc Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Fri, 14 Aug 2020 21:30:04 -0700 Subject: [PATCH 0188/1792] test: bump array size in fixedbugs/issue39292.go The previous array length was large enough to exceed maxImplicitStackSize on 64-bit architectures, but not on 32-bit architectures. Fixes #40808. Change-Id: I69e9abb447454b2e7875ba503a0cb772e965ae31 Reviewed-on: https://go-review.googlesource.com/c/go/+/248680 Run-TryBot: Matthew Dempsky Reviewed-by: Cuong Manh Le TryBot-Result: Gobot Gobot --- test/fixedbugs/issue39292.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixedbugs/issue39292.go b/test/fixedbugs/issue39292.go index 5d6595c234..1be88653e9 100644 --- a/test/fixedbugs/issue39292.go +++ b/test/fixedbugs/issue39292.go @@ -6,7 +6,7 @@ package p -type t [10000]*int +type t [20000]*int func (t) f() { } -- GitLab From c0dded04f7ded5048b44200078a1f723f5e1bcc1 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 14 Jul 2020 01:41:03 -0600 Subject: [PATCH 0189/1792] runtime: do not explicitly exit on ctrl handler The default ctrl+c handler should process exits in situations where it makes sense, like console apps, but not in situations where it doesn't, like libraries or services. Therefore, we should remove the exit(2) so that the default handler is used for this. This also uses the more proper windows exit code of STATUS_CONTROL_C_EXIT, with the base case handler installed by KernelBase.dll. In particular, this helps in the case of services, which previously would terminate when receiving shutdown signals, instead of passing them onward to the service program. In this CL, contrary to CL 244959, we do not need to special case services with expensive detection algorithms, or rely on hard-coded library/archive flags. Fixes #40167. Fixes #40074. Change-Id: I9bf6ed6f65cefeff754d270aa33fa4df8d0b451f Reviewed-on: https://go-review.googlesource.com/c/go/+/243597 Run-TryBot: Jason A. Donenfeld TryBot-Result: Gobot Gobot Reviewed-by: Alex Brainman Reviewed-by: Jason A. Donenfeld --- src/runtime/os_windows.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index a584ada702..a62e941229 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -1010,11 +1010,6 @@ func ctrlhandler1(_type uint32) uint32 { if sigsend(s) { return 1 } - if !islibrary && !isarchive { - // Only exit the program if we don't have a DLL. - // See https://golang.org/issues/35965. - exit(2) // SIGINT, SIGTERM, etc - } return 0 } -- GitLab From ccc951637be806e6e7a3c2c922bf4746b60e7395 Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Thu, 13 Aug 2020 12:56:57 +0200 Subject: [PATCH 0190/1792] cmd/link: move comma outside quotes Change-Id: I2ecf8976a6289924ac7bfe7ace129a462537e11d Reviewed-on: https://go-review.googlesource.com/c/go/+/248339 Reviewed-by: Emmanuel Odeke Reviewed-by: Than McIntosh --- src/cmd/link/doc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/doc.go b/src/cmd/link/doc.go index 219499be0a..604675caec 100644 --- a/src/cmd/link/doc.go +++ b/src/cmd/link/doc.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. /* -Link, typically invoked as ``go tool link,'' reads the Go archive or object +Link, typically invoked as ``go tool link'', reads the Go archive or object for a package main, along with its dependencies, and combines them into an executable binary. -- GitLab From b6ad2880323191713a5525bae5eb27d62c1d1c35 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Sat, 13 Jun 2020 10:37:22 +0530 Subject: [PATCH 0191/1792] net/http: avoid setting body when NoBody is set for js/wasm When http.NoBody is set, it is equivalent to Body being zero bytes. We therefore set the body only if it is of length greater than 0. Manually verified with wasmbrowsertest. Fixes #36339 Change-Id: I9c108c38f99409f72ea101819af572429505a8ad Reviewed-on: https://go-review.googlesource.com/c/go/+/237758 Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Johan Brandhorst Reviewed-by: Emmanuel Odeke --- src/net/http/roundtrip_js.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/net/http/roundtrip_js.go b/src/net/http/roundtrip_js.go index 509d229aad..b09923c386 100644 --- a/src/net/http/roundtrip_js.go +++ b/src/net/http/roundtrip_js.go @@ -98,9 +98,11 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) { return nil, err } req.Body.Close() - buf := uint8Array.New(len(body)) - js.CopyBytesToJS(buf, body) - opt.Set("body", buf) + if len(body) != 0 { + buf := uint8Array.New(len(body)) + js.CopyBytesToJS(buf, body) + opt.Set("body", buf) + } } fetchPromise := js.Global().Call("fetch", req.URL.String(), opt) -- GitLab From cf9b4f63a57b4360be700831781885fc6cf5a0b1 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Tue, 5 May 2020 03:15:58 +1000 Subject: [PATCH 0192/1792] runtime: use riscv64 RDTIME instruction Use the actual RDTIME instruction, rather than a WORD. Generated code is the same. Change-Id: I6f6f5a1836eae2d05af34d4a22db2ede4fdcb458 Reviewed-on: https://go-review.googlesource.com/c/go/+/231997 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/runtime/asm_riscv64.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/asm_riscv64.s b/src/runtime/asm_riscv64.s index d7c45a183d..8f6c8773eb 100644 --- a/src/runtime/asm_riscv64.s +++ b/src/runtime/asm_riscv64.s @@ -79,7 +79,7 @@ TEXT setg_gcc<>(SB),NOSPLIT,$0-0 // func cputicks() int64 TEXT runtime·cputicks(SB),NOSPLIT,$0-8 - WORD $0xc0102573 // rdtime a0 + RDTIME A0 MOV A0, ret+0(FP) RET -- GitLab From d30363062283dcdca4392ef61f13f9b332ca8bc3 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Mon, 25 May 2020 03:23:30 +1000 Subject: [PATCH 0193/1792] syscall: support rawVforkSyscall on linux/riscv64 Updates #31936 Change-Id: I7dcb8987d4c306ccc97704b9c1b12313ba8bf242 Reviewed-on: https://go-review.googlesource.com/c/go/+/234960 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/syscall/asm_linux_riscv64.s | 22 ++++++++++++++++++++++ src/syscall/exec_linux.go | 6 +++++- src/syscall/syscall_linux_riscv64.go | 4 +--- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/syscall/asm_linux_riscv64.s b/src/syscall/asm_linux_riscv64.s index ad0b6b17d9..f172dd3d9b 100644 --- a/src/syscall/asm_linux_riscv64.s +++ b/src/syscall/asm_linux_riscv64.s @@ -104,6 +104,28 @@ err: MOV A0, err+72(FP) // errno RET +// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr) +TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32 + MOV a1+8(FP), A0 + MOV ZERO, A1 + MOV ZERO, A2 + MOV ZERO, A3 + MOV ZERO, A4 + MOV ZERO, A5 + MOV trap+0(FP), A7 // syscall entry + ECALL + MOV $-4096, T0 + BLTU T0, A0, err + MOV A0, r1+16(FP) // r1 + MOV ZERO, err+24(FP) // errno + RET +err: + MOV $-1, T0 + MOV T0, r1+16(FP) // r1 + SUB A0, ZERO, A0 + MOV A0, err+24(FP) // errno + RET + TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48 MOV a1+8(FP), A0 MOV a2+16(FP), A1 diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index b7351cda82..b6acad96ea 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -207,7 +207,11 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att } } - hasRawVforkSyscall := runtime.GOARCH == "amd64" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "s390x" || runtime.GOARCH == "arm64" + var hasRawVforkSyscall bool + switch runtime.GOARCH { + case "amd64", "arm64", "ppc64", "riscv64", "s390x": + hasRawVforkSyscall = true + } // About to call fork. // No more allocation or calls of non-assembly functions. diff --git a/src/syscall/syscall_linux_riscv64.go b/src/syscall/syscall_linux_riscv64.go index d54bd38510..088e23439f 100644 --- a/src/syscall/syscall_linux_riscv64.go +++ b/src/syscall/syscall_linux_riscv64.go @@ -199,6 +199,4 @@ func Pause() error { return err } -func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno) { - panic("not implemented") -} +func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno) -- GitLab From c6a11f0dd279f374602794af60c7cde4585a1e6f Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 11 Aug 2020 13:04:48 -0700 Subject: [PATCH 0194/1792] crypto,internal/bytealg: fix assembly that clobbers BP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BP should be callee-save. It will be saved automatically if there is a nonzero frame size. Otherwise, we need to avoid this register. Change-Id: If3f551efa42d830c8793d9f0183cb8daad7a2ab5 Reviewed-on: https://go-review.googlesource.com/c/go/+/248260 Run-TryBot: Keith Randall Reviewed-by: Michael Knyszek Reviewed-by: Martin Möhrmann TryBot-Result: Gobot Gobot --- src/crypto/elliptic/p256_asm_amd64.s | 5 ++- src/crypto/md5/md5block_amd64.s | 2 +- src/internal/bytealg/index_amd64.s | 52 ++++++++++++++-------------- src/runtime/sys_linux_amd64.s | 8 ++--- 4 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/crypto/elliptic/p256_asm_amd64.s b/src/crypto/elliptic/p256_asm_amd64.s index 7afa54a58c..c77b11bcf2 100644 --- a/src/crypto/elliptic/p256_asm_amd64.s +++ b/src/crypto/elliptic/p256_asm_amd64.s @@ -1336,7 +1336,7 @@ TEXT p256SubInternal(SB),NOSPLIT,$0 RET /* ---------------------------------------*/ -TEXT p256MulInternal(SB),NOSPLIT,$0 +TEXT p256MulInternal(SB),NOSPLIT,$8 MOVQ acc4, mul0 MULQ t0 MOVQ mul0, acc0 @@ -1519,7 +1519,7 @@ TEXT p256MulInternal(SB),NOSPLIT,$0 RET /* ---------------------------------------*/ -TEXT p256SqrInternal(SB),NOSPLIT,$0 +TEXT p256SqrInternal(SB),NOSPLIT,$8 MOVQ acc4, mul0 MULQ acc5 @@ -2345,4 +2345,3 @@ TEXT ·p256PointDoubleAsm(SB),NOSPLIT,$256-48 RET /* ---------------------------------------*/ - diff --git a/src/crypto/md5/md5block_amd64.s b/src/crypto/md5/md5block_amd64.s index 90d932b146..7c7d92d7e8 100644 --- a/src/crypto/md5/md5block_amd64.s +++ b/src/crypto/md5/md5block_amd64.s @@ -13,7 +13,7 @@ // Licence: I hereby disclaim the copyright on this code and place it // in the public domain. -TEXT ·block(SB),NOSPLIT,$0-32 +TEXT ·block(SB),NOSPLIT,$8-32 MOVQ dig+0(FP), BP MOVQ p+8(FP), SI MOVQ p_len+16(FP), DX diff --git a/src/internal/bytealg/index_amd64.s b/src/internal/bytealg/index_amd64.s index 4459820801..6193b57239 100644 --- a/src/internal/bytealg/index_amd64.s +++ b/src/internal/bytealg/index_amd64.s @@ -8,7 +8,7 @@ TEXT ·Index(SB),NOSPLIT,$0-56 MOVQ a_base+0(FP), DI MOVQ a_len+8(FP), DX - MOVQ b_base+24(FP), BP + MOVQ b_base+24(FP), R8 MOVQ b_len+32(FP), AX MOVQ DI, R10 LEAQ ret+48(FP), R11 @@ -17,7 +17,7 @@ TEXT ·Index(SB),NOSPLIT,$0-56 TEXT ·IndexString(SB),NOSPLIT,$0-40 MOVQ a_base+0(FP), DI MOVQ a_len+8(FP), DX - MOVQ b_base+16(FP), BP + MOVQ b_base+16(FP), R8 MOVQ b_len+24(FP), AX MOVQ DI, R10 LEAQ ret+32(FP), R11 @@ -26,7 +26,7 @@ TEXT ·IndexString(SB),NOSPLIT,$0-40 // AX: length of string, that we are searching for // DX: length of string, in which we are searching // DI: pointer to string, in which we are searching -// BP: pointer to string, that we are searching for +// R8: pointer to string, that we are searching for // R11: address, where to put return value // Note: We want len in DX and AX, because PCMPESTRI implicitly consumes them TEXT indexbody<>(SB),NOSPLIT,$0 @@ -37,11 +37,11 @@ TEXT indexbody<>(SB),NOSPLIT,$0 no_sse42: CMPQ AX, $2 JA _3_or_more - MOVW (BP), BP + MOVW (R8), R8 LEAQ -1(DI)(DX*1), DX loop2: MOVW (DI), SI - CMPW SI,BP + CMPW SI,R8 JZ success ADDQ $1,DI CMPQ DI,DX @@ -50,12 +50,12 @@ loop2: _3_or_more: CMPQ AX, $3 JA _4_or_more - MOVW 1(BP), BX - MOVW (BP), BP + MOVW 1(R8), BX + MOVW (R8), R8 LEAQ -2(DI)(DX*1), DX loop3: MOVW (DI), SI - CMPW SI,BP + CMPW SI,R8 JZ partial_success3 ADDQ $1,DI CMPQ DI,DX @@ -72,11 +72,11 @@ partial_success3: _4_or_more: CMPQ AX, $4 JA _5_or_more - MOVL (BP), BP + MOVL (R8), R8 LEAQ -3(DI)(DX*1), DX loop4: MOVL (DI), SI - CMPL SI,BP + CMPL SI,R8 JZ success ADDQ $1,DI CMPQ DI,DX @@ -87,11 +87,11 @@ _5_or_more: JA _8_or_more LEAQ 1(DI)(DX*1), DX SUBQ AX, DX - MOVL -4(BP)(AX*1), BX - MOVL (BP), BP + MOVL -4(R8)(AX*1), BX + MOVL (R8), R8 loop5to7: MOVL (DI), SI - CMPL SI,BP + CMPL SI,R8 JZ partial_success5to7 ADDQ $1,DI CMPQ DI,DX @@ -108,11 +108,11 @@ partial_success5to7: _8_or_more: CMPQ AX, $8 JA _9_or_more - MOVQ (BP), BP + MOVQ (R8), R8 LEAQ -7(DI)(DX*1), DX loop8: MOVQ (DI), SI - CMPQ SI,BP + CMPQ SI,R8 JZ success ADDQ $1,DI CMPQ DI,DX @@ -123,11 +123,11 @@ _9_or_more: JA _16_or_more LEAQ 1(DI)(DX*1), DX SUBQ AX, DX - MOVQ -8(BP)(AX*1), BX - MOVQ (BP), BP + MOVQ -8(R8)(AX*1), BX + MOVQ (R8), R8 loop9to15: MOVQ (DI), SI - CMPQ SI,BP + CMPQ SI,R8 JZ partial_success9to15 ADDQ $1,DI CMPQ DI,DX @@ -144,7 +144,7 @@ partial_success9to15: _16_or_more: CMPQ AX, $16 JA _17_or_more - MOVOU (BP), X1 + MOVOU (R8), X1 LEAQ -15(DI)(DX*1), DX loop16: MOVOU (DI), X2 @@ -161,8 +161,8 @@ _17_or_more: JA _32_or_more LEAQ 1(DI)(DX*1), DX SUBQ AX, DX - MOVOU -16(BP)(AX*1), X0 - MOVOU (BP), X1 + MOVOU -16(R8)(AX*1), X0 + MOVOU (R8), X1 loop17to31: MOVOU (DI), X2 PCMPEQB X1,X2 @@ -188,7 +188,7 @@ partial_success17to31: _32_or_more: CMPQ AX, $32 JA _33_to_63 - VMOVDQU (BP), Y1 + VMOVDQU (R8), Y1 LEAQ -31(DI)(DX*1), DX loop32: VMOVDQU (DI), Y2 @@ -203,8 +203,8 @@ loop32: _33_to_63: LEAQ 1(DI)(DX*1), DX SUBQ AX, DX - VMOVDQU -32(BP)(AX*1), Y0 - VMOVDQU (BP), Y1 + VMOVDQU -32(R8)(AX*1), Y0 + VMOVDQU (R8), Y1 loop33to63: VMOVDQU (DI), Y2 VPCMPEQB Y1, Y2, Y3 @@ -241,10 +241,10 @@ sse42: // This value was determined experimentally and is the ~same // on Nehalem (first with SSE42) and Haswell. JAE _9_or_more - LEAQ 16(BP), SI + LEAQ 16(R8), SI TESTW $0xff0, SI JEQ no_sse42 - MOVOU (BP), X1 + MOVOU (R8), X1 LEAQ -15(DI)(DX*1), SI MOVQ $16, R9 SUBQ AX, R9 // We advance by 16-len(sep) each iteration, so precalculate it into R9 diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s index b60057ce83..621c01b365 100644 --- a/src/runtime/sys_linux_amd64.s +++ b/src/runtime/sys_linux_amd64.s @@ -212,7 +212,7 @@ TEXT runtime·walltime1(SB),NOSPLIT,$16-12 // due to stack probes inserted to avoid stack/heap collisions. // See issue #20427. - MOVQ SP, BP // Save old SP; BP unchanged by C code. + MOVQ SP, R12 // Save old SP; R12 unchanged by C code. get_tls(CX) MOVQ g(CX), AX @@ -250,7 +250,7 @@ noswitch: MOVQ 0(SP), AX // sec MOVQ 8(SP), DX // nsec ret: - MOVQ BP, SP // Restore real SP + MOVQ R12, SP // Restore real SP // Restore vdsoPC, vdsoSP // We don't worry about being signaled between the two stores. // If we are not in a signal handler, we'll restore vdsoSP to 0, @@ -277,7 +277,7 @@ fallback: TEXT runtime·nanotime1(SB),NOSPLIT,$16-8 // Switch to g0 stack. See comment above in runtime·walltime. - MOVQ SP, BP // Save old SP; BP unchanged by C code. + MOVQ SP, R12 // Save old SP; R12 unchanged by C code. get_tls(CX) MOVQ g(CX), AX @@ -315,7 +315,7 @@ noswitch: MOVQ 0(SP), AX // sec MOVQ 8(SP), DX // nsec ret: - MOVQ BP, SP // Restore real SP + MOVQ R12, SP // Restore real SP // Restore vdsoPC, vdsoSP // We don't worry about being signaled between the two stores. // If we are not in a signal handler, we'll restore vdsoSP to 0, -- GitLab From 01f99b4e9540f34b44e13b25f6dd04b82ac952d9 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 11 Aug 2020 13:07:35 -0700 Subject: [PATCH 0195/1792] cmd/compile: mark DUFFZERO/DUFFCOPY as async unsafe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These operations are async unsafe on architectures that use frame pointers. The reason is they rely on data being safe when stored below the stack pointer. They do: 45da69: 48 89 6c 24 f0 mov %rbp,-0x10(%rsp) 45da6e: 48 8d 6c 24 f0 lea -0x10(%rsp),%rbp 45da73: e8 7d d0 ff ff callq 45aaf5 45da78: 48 8b 6d 00 mov 0x0(%rbp),%rbp This dance ensures that inside duffzero, it looks like there is a proper frame pointer set up, so that stack walkbacks work correctly if the kernel samples during duffzero. However, this instruction sequence depends on data not being clobbered even though it is below the stack pointer. If there is an async interrupt at any of those last 3 instructions, and the interrupt decides to insert a call to asyncPreempt, then the saved frame pointer on the stack gets clobbered. The last instruction above then restores junk to the frame pointer. To prevent this, mark these instructions as async unsafe. (The body of duffzero is already async unsafe, as it is in package runtime.) Change-Id: I5562e82f9f5bd2fb543dcf2b6b9133d87ff83032 Reviewed-on: https://go-review.googlesource.com/c/go/+/248261 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Martin Möhrmann Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssa/gen/AMD64Ops.go | 2 ++ src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 2 ++ src/cmd/compile/internal/ssa/opGen.go | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go index a3b29049df..e6d66957dd 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go @@ -748,6 +748,7 @@ func init() { clobbers: buildReg("DI"), }, faultOnNilArg0: true, + unsafePoint: true, // FP maintenance around DUFFCOPY can be clobbered by interrupts }, {name: "MOVOconst", reg: regInfo{nil, 0, []regMask{fp}}, typ: "Int128", aux: "Int128", rematerializeable: true}, @@ -786,6 +787,7 @@ func init() { clobberFlags: true, faultOnNilArg0: true, faultOnNilArg1: true, + unsafePoint: true, // FP maintenance around DUFFCOPY can be clobbered by interrupts }, // arg0 = destination pointer diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index b402e35ea6..2424e67e20 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -507,6 +507,7 @@ func init() { clobbers: buildReg("R20 R30"), }, faultOnNilArg0: true, + unsafePoint: true, // FP maintenance around DUFFZERO can be clobbered by interrupts }, // large zeroing @@ -547,6 +548,7 @@ func init() { }, faultOnNilArg0: true, faultOnNilArg1: true, + unsafePoint: true, // FP maintenance around DUFFCOPY can be clobbered by interrupts }, // large move diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 9efa1bfcc4..408c855dbd 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -13119,6 +13119,7 @@ var opcodeTable = [...]opInfo{ auxType: auxInt64, argLen: 3, faultOnNilArg0: true, + unsafePoint: true, reg: regInfo{ inputs: []inputInfo{ {0, 128}, // DI @@ -13196,6 +13197,7 @@ var opcodeTable = [...]opInfo{ clobberFlags: true, faultOnNilArg0: true, faultOnNilArg1: true, + unsafePoint: true, reg: regInfo{ inputs: []inputInfo{ {0, 128}, // DI @@ -20734,6 +20736,7 @@ var opcodeTable = [...]opInfo{ auxType: auxInt64, argLen: 2, faultOnNilArg0: true, + unsafePoint: true, reg: regInfo{ inputs: []inputInfo{ {0, 1048576}, // R20 @@ -20760,6 +20763,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, faultOnNilArg0: true, faultOnNilArg1: true, + unsafePoint: true, reg: regInfo{ inputs: []inputInfo{ {0, 2097152}, // R21 -- GitLab From 8c39bbf9c93f773ab351bbddb4c3dd93e4fddc76 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 11 Aug 2020 13:19:57 -0700 Subject: [PATCH 0196/1792] cmd/compile: stop race instrumentation from clobbering frame pointer There is an optimization rule that removes calls to racefuncenter and racefuncexit, if there are no other race calls in the function. The rule removes the call to racefuncenter, but it does *not* remove the store of its argument to the outargs section of the frame. If the outargs section is now size 0 (because the calls to racefuncenter/exit were the only calls), then that argument store clobbers the frame pointer instead. The fix is to remove the argument store when removing the call to racefuncenter. (Racefuncexit doesn't have an argument.) Change-Id: I183ec4d92bbb4920200e1be27b7b8f66b89a2a0a Reviewed-on: https://go-review.googlesource.com/c/go/+/248262 Reviewed-by: Robert Griesemer Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/racewalk.go | 2 +- src/cmd/compile/internal/ssa/rewrite.go | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/racewalk.go b/src/cmd/compile/internal/gc/racewalk.go index 6f251377c9..3552617401 100644 --- a/src/cmd/compile/internal/gc/racewalk.go +++ b/src/cmd/compile/internal/gc/racewalk.go @@ -42,7 +42,7 @@ var omit_pkgs = []string{ "internal/cpu", } -// Only insert racefuncenterfp/racefuncexit into the following packages. +// Don't insert racefuncenterfp/racefuncexit into the following packages. // Memory accesses in the packages are either uninteresting or will cause false positives. var norace_inst_pkgs = []string{"sync", "sync/atomic"} diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 2152b1675a..e082bb1dfa 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -1379,6 +1379,15 @@ func needRaceCleanup(sym Sym, v *Value) bool { } } } + if symNamed(sym, "runtime.racefuncenter") { + // If we're removing racefuncenter, remove its argument as well. + if v.Args[0].Op != OpStore { + return false + } + mem := v.Args[0].Args[2] + v.Args[0].reset(OpCopy) + v.Args[0].AddArg(mem) + } return true } -- GitLab From c810c6db101b53154b06f9ef1ff7455aaff16c36 Mon Sep 17 00:00:00 2001 From: Chirag Sukhala Date: Sun, 16 Aug 2020 21:49:53 +0000 Subject: [PATCH 0197/1792] doc/articles/wiki: add missing log import to net/http tutorial The log package is used with the net/http but was not in the import clause. Change-Id: Ic45b987633adf0ee15defd4d136b5d37027e22b0 GitHub-Last-Rev: e74aff53370569864b7ec8c18617a5d992d34bf2 GitHub-Pull-Request: golang/go#36674 Reviewed-on: https://go-review.googlesource.com/c/go/+/215618 Reviewed-by: Emmanuel Odeke --- doc/articles/wiki/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/articles/wiki/index.html b/doc/articles/wiki/index.html index 4e3a5deab5..a74a58e317 100644 --- a/doc/articles/wiki/index.html +++ b/doc/articles/wiki/index.html @@ -257,6 +257,7 @@ To use the net/http package, it must be imported: import ( "fmt" "io/ioutil" + "log" "net/http" ) -- GitLab From f7fc25ed5a16ee7678680ffd0bcc3078cc249e0a Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Fri, 14 Aug 2020 00:04:05 +1000 Subject: [PATCH 0198/1792] image/gif: add more writer benchmarks The two existing benchmarks encode randomized pixels, which isn't very representative. The two new benchmarks encode a PNG photo as a GIF. Also rename the benchmarks for consistency. Also fix the bytes-per-op measure for paletted images, which are 1 (not 4) bytes per pixel. Also simplify BenchmarkEncodeRandomPaletted (formerly just called BenchmarkEncode). It doesn't need to generate a random palette (and the GIF encoder largely doesn't care about the palette's RGBA values). Use palette.Plan9 instead, a pre-existing 256-element color palette. Change-Id: I10a6ea4e9590bb0d9f76e8cc0f4a88d43b1d650d Reviewed-on: https://go-review.googlesource.com/c/go/+/248218 Reviewed-by: David Symonds --- src/image/gif/writer_test.go | 53 ++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src/image/gif/writer_test.go b/src/image/gif/writer_test.go index 9b15c8d99d..5d1b2c439e 100644 --- a/src/image/gif/writer_test.go +++ b/src/image/gif/writer_test.go @@ -9,6 +9,7 @@ import ( "image" "image/color" "image/color/palette" + "image/draw" _ "image/png" "io/ioutil" "math/rand" @@ -656,25 +657,14 @@ func TestEncodeWrappedImage(t *testing.T) { } } -func BenchmarkEncode(b *testing.B) { +func BenchmarkEncodeRandomPaletted(b *testing.B) { + img := image.NewPaletted(image.Rect(0, 0, 640, 480), palette.Plan9) rnd := rand.New(rand.NewSource(123)) - - // Restrict to a 256-color paletted image to avoid quantization path. - palette := make(color.Palette, 256) - for i := range palette { - palette[i] = color.RGBA{ - uint8(rnd.Intn(256)), - uint8(rnd.Intn(256)), - uint8(rnd.Intn(256)), - 255, - } - } - img := image.NewPaletted(image.Rect(0, 0, 640, 480), palette) for i := range img.Pix { img.Pix[i] = uint8(rnd.Intn(256)) } - b.SetBytes(640 * 480 * 4) + b.SetBytes(640 * 480 * 1) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { @@ -682,7 +672,7 @@ func BenchmarkEncode(b *testing.B) { } } -func BenchmarkQuantizedEncode(b *testing.B) { +func BenchmarkEncodeRandomRGBA(b *testing.B) { img := image.NewRGBA(image.Rect(0, 0, 640, 480)) bo := img.Bounds() rnd := rand.New(rand.NewSource(123)) @@ -696,6 +686,7 @@ func BenchmarkQuantizedEncode(b *testing.B) { }) } } + b.SetBytes(640 * 480 * 4) b.ReportAllocs() b.ResetTimer() @@ -703,3 +694,35 @@ func BenchmarkQuantizedEncode(b *testing.B) { Encode(ioutil.Discard, img, nil) } } + +func BenchmarkEncodeRealisticPaletted(b *testing.B) { + rgba, err := readImg("../testdata/video-001.png") + if err != nil { + b.Fatalf("readImg: %v", err) + } + bo := rgba.Bounds() + img := image.NewPaletted(bo, palette.Plan9) + draw.Draw(img, bo, rgba, bo.Min, draw.Src) + + b.SetBytes(int64(bo.Dx() * bo.Dy() * 1)) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + Encode(ioutil.Discard, img, nil) + } +} + +func BenchmarkEncodeRealisticRGBA(b *testing.B) { + img, err := readImg("../testdata/video-001.png") + if err != nil { + b.Fatalf("readImg: %v", err) + } + bo := img.Bounds() + + b.SetBytes(int64(bo.Dx() * bo.Dy() * 4)) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + Encode(ioutil.Discard, img, nil) + } +} -- GitLab From 6f99b33c18266a8858af96163de97173bdf6f081 Mon Sep 17 00:00:00 2001 From: Polina Osadcha Date: Thu, 18 Jun 2020 16:17:13 +0300 Subject: [PATCH 0199/1792] all: replace Replace(..., -1) with ReplaceAll(...) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I8f7cff7a83a9c50bfa3331e8b40e4a6c2e1c0eee Reviewed-on: https://go-review.googlesource.com/c/go/+/245198 Run-TryBot: Martin Möhrmann TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- doc/progs/run.go | 2 +- src/cmd/cover/cover_test.go | 2 +- src/cmd/go/internal/version/version.go | 2 +- src/runtime/mkpreempt.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/progs/run.go b/doc/progs/run.go index baef3f79f9..8ac75cdcff 100644 --- a/doc/progs/run.go +++ b/doc/progs/run.go @@ -105,7 +105,7 @@ func test(tmpdir, file, want string) error { // Canonicalize output. out = bytes.TrimRight(out, "\n") - out = bytes.Replace(out, []byte{'\n'}, []byte{' '}, -1) + out = bytes.ReplaceAll(out, []byte{'\n'}, []byte{' '}) // Check the result. match, err := regexp.Match(want, out) diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index 8a56e39011..1c252e6e45 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -179,7 +179,7 @@ func TestCover(t *testing.T) { } lines := bytes.Split(file, []byte("\n")) for i, line := range lines { - lines[i] = bytes.Replace(line, []byte("LINE"), []byte(fmt.Sprint(i+1)), -1) + lines[i] = bytes.ReplaceAll(line, []byte("LINE"), []byte(fmt.Sprint(i+1))) } // Add a function that is not gofmt'ed. This used to cause a crash. diff --git a/src/cmd/go/internal/version/version.go b/src/cmd/go/internal/version/version.go index 056db7bf9e..c2de8d326d 100644 --- a/src/cmd/go/internal/version/version.go +++ b/src/cmd/go/internal/version/version.go @@ -138,7 +138,7 @@ func scanFile(file string, info os.FileInfo, mustPrint bool) { fmt.Printf("%s: %s\n", file, vers) if *versionM && mod != "" { - fmt.Printf("\t%s\n", strings.Replace(mod[:len(mod)-1], "\n", "\n\t", -1)) + fmt.Printf("\t%s\n", strings.ReplaceAll(mod[:len(mod)-1], "\n", "\n\t")) } } diff --git a/src/runtime/mkpreempt.go b/src/runtime/mkpreempt.go index 1fe77663b9..44dea22ef3 100644 --- a/src/runtime/mkpreempt.go +++ b/src/runtime/mkpreempt.go @@ -131,7 +131,7 @@ func header(arch string) { func p(f string, args ...interface{}) { fmted := fmt.Sprintf(f, args...) - fmt.Fprintf(out, "\t%s\n", strings.Replace(fmted, "\n", "\n\t", -1)) + fmt.Fprintf(out, "\t%s\n", strings.ReplaceAll(fmted, "\n", "\n\t")) } func label(l string) { -- GitLab From 51ac0f0f4cb432204dee3d434335fd1e61ca8446 Mon Sep 17 00:00:00 2001 From: Polina Osadcha Date: Thu, 18 Jun 2020 16:17:13 +0300 Subject: [PATCH 0200/1792] strings: optimize Replace by using a strings.Builder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit name old time/op new time/op delta ReplaceAll 162ns ±26% 134ns ±26% -17.44% (p=0.014 n=10+10) name old alloc/op new alloc/op delta ReplaceAll 32.0B ± 0% 16.0B ± 0% -50.00% (p=0.000 n=10+10) name old allocs/op new allocs/op delta ReplaceAll 2.00 ± 0% 1.00 ± 0% -50.00% (p=0.000 n=10+10) Change-Id: Ia8377141d3adb84c7bd94e511ac8f739915aeb40 Reviewed-on: https://go-review.googlesource.com/c/go/+/245197 Run-TryBot: Martin Möhrmann TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/strings/strings.go | 12 ++++++------ src/strings/strings_test.go | 9 +++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/strings/strings.go b/src/strings/strings.go index d6f5cea6e6..b429735fea 100644 --- a/src/strings/strings.go +++ b/src/strings/strings.go @@ -934,8 +934,8 @@ func Replace(s, old, new string, n int) string { } // Apply replacements to buffer. - t := make([]byte, len(s)+n*(len(new)-len(old))) - w := 0 + var b Builder + b.Grow(len(s) + n*(len(new)-len(old))) start := 0 for i := 0; i < n; i++ { j := start @@ -947,12 +947,12 @@ func Replace(s, old, new string, n int) string { } else { j += Index(s[start:], old) } - w += copy(t[w:], s[start:j]) - w += copy(t[w:], new) + b.WriteString(s[start:j]) + b.WriteString(new) start = j + len(old) } - w += copy(t[w:], s[start:]) - return string(t[0:w]) + b.WriteString(s[start:]) + return b.String() } // ReplaceAll returns a copy of the string s with all diff --git a/src/strings/strings_test.go b/src/strings/strings_test.go index c01c4dabc5..09e5b27cc3 100644 --- a/src/strings/strings_test.go +++ b/src/strings/strings_test.go @@ -1900,3 +1900,12 @@ func BenchmarkTrimSpace(b *testing.B) { }) } } + +var stringSink string + +func BenchmarkReplaceAll(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + stringSink = ReplaceAll("banana", "a", "<>") + } +} -- GitLab From 99f179f55a66f35dc7861fa411b42ed61bd0df31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20M=C3=B6hrmann?= Date: Mon, 20 Jul 2020 07:57:06 +0200 Subject: [PATCH 0201/1792] fmt: avoid badverb formatting for %q when used with integers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of returning a bad verb error format for runes above utf8.Maxrune return a quoted utf8.RuneError rune (\ufffd). This makes the behaviour consistent with the "c" verb and aligns behaviour to not return bad verb error format when a verb is applied to the correct argument type. Fixes #14569 Change-Id: I679485f6bb90ebe408423ab68af16cce38816cd0 Reviewed-on: https://go-review.googlesource.com/c/go/+/248759 Run-TryBot: Martin Möhrmann TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/fmt/fmt_test.go | 8 ++++---- src/fmt/print.go | 6 +----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 6004061020..87fb323809 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -290,11 +290,11 @@ var fmtTests = []struct { {"%q", '\U00000e00', `'\u0e00'`}, {"%q", '\U0010ffff', `'\U0010ffff'`}, // Runes that are not valid. - {"%q", int32(-1), "%!q(int32=-1)"}, + {"%q", int32(-1), `'�'`}, {"%q", 0xDC80, `'�'`}, - {"%q", rune(0x110000), "%!q(int32=1114112)"}, - {"%q", int64(0xFFFFFFFFF), "%!q(int64=68719476735)"}, - {"%q", uint64(0xFFFFFFFFF), "%!q(uint64=68719476735)"}, + {"%q", rune(0x110000), `'�'`}, + {"%q", int64(0xFFFFFFFFF), `'�'`}, + {"%q", uint64(0xFFFFFFFFF), `'�'`}, // width {"%5s", "abc", " abc"}, diff --git a/src/fmt/print.go b/src/fmt/print.go index 595869140a..778b5b0938 100644 --- a/src/fmt/print.go +++ b/src/fmt/print.go @@ -388,11 +388,7 @@ func (p *pp) fmtInteger(v uint64, isSigned bool, verb rune) { case 'c': p.fmt.fmtC(v) case 'q': - if v <= utf8.MaxRune { - p.fmt.fmtQc(v) - } else { - p.badVerb(verb) - } + p.fmt.fmtQc(v) case 'U': p.fmt.fmtUnicode(v) default: -- GitLab From f979d072d339a24e4938d46588c153587d61af19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20M=C3=B6hrmann?= Date: Sun, 3 May 2020 16:26:05 +0200 Subject: [PATCH 0202/1792] runtime: avoid memclr call for keys in mapdelete_fast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace memclrHasPointers calls for keys in mapdelete_fast* functions with direct writes since the key sizes are known at compile time. name old time/op new time/op delta MapDelete/Pointer/100 33.7ns ± 1% 23.7ns ± 2% -29.68% (p=0.000 n=7+9) MapDelete/Pointer/1000 41.6ns ± 5% 34.9ns ± 4% -16.01% (p=0.000 n=9+10) MapDelete/Pointer/10000 45.6ns ± 1% 38.2ns ± 2% -16.34% (p=0.000 n=8+10) Change-Id: Icaac43b520b93c2cf9fd192b822fae7203a7bbf7 Reviewed-on: https://go-review.googlesource.com/c/go/+/231737 Run-TryBot: Martin Möhrmann TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/map_fast32.go | 8 ++++++-- src/runtime/map_fast64.go | 8 +++++++- src/runtime/map_test.go | 22 ++++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/runtime/map_fast32.go b/src/runtime/map_fast32.go index 534454f3ad..d035ed0386 100644 --- a/src/runtime/map_fast32.go +++ b/src/runtime/map_fast32.go @@ -299,8 +299,12 @@ search: continue } // Only clear key if there are pointers in it. - if t.key.ptrdata != 0 { - memclrHasPointers(k, t.key.size) + // This can only happen if pointers are 32 bit + // wide as 64 bit pointers do not fit into a 32 bit key. + if sys.PtrSize == 4 && t.key.ptrdata != 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 { diff --git a/src/runtime/map_fast64.go b/src/runtime/map_fast64.go index 1669c7cfe9..f1f3927598 100644 --- a/src/runtime/map_fast64.go +++ b/src/runtime/map_fast64.go @@ -300,7 +300,13 @@ search: } // Only clear key if there are pointers in it. if t.key.ptrdata != 0 { - memclrHasPointers(k, t.key.size) + if sys.PtrSize == 8 { + *(*unsafe.Pointer)(k) = nil + } else { + // There are three ways to squeeze at one ore 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 { diff --git a/src/runtime/map_test.go b/src/runtime/map_test.go index 1b7ccad6ed..302b3c23c1 100644 --- a/src/runtime/map_test.go +++ b/src/runtime/map_test.go @@ -993,6 +993,27 @@ func benchmarkMapDeleteStr(b *testing.B, n int) { } } +func benchmarkMapDeletePointer(b *testing.B, n int) { + i2p := make([]*int, n) + for i := 0; i < n; i++ { + i2p[i] = new(int) + } + a := make(map[*int]int, n) + b.ResetTimer() + k := 0 + for i := 0; i < b.N; i++ { + if len(a) == 0 { + b.StopTimer() + for j := 0; j < n; j++ { + a[i2p[j]] = j + } + k = i + b.StartTimer() + } + delete(a, i2p[i-k]) + } +} + func runWith(f func(*testing.B, int), v ...int) func(*testing.B) { return func(b *testing.B) { for _, n := range v { @@ -1023,6 +1044,7 @@ func BenchmarkMapDelete(b *testing.B) { b.Run("Int32", runWith(benchmarkMapDeleteInt32, 100, 1000, 10000)) b.Run("Int64", runWith(benchmarkMapDeleteInt64, 100, 1000, 10000)) b.Run("Str", runWith(benchmarkMapDeleteStr, 100, 1000, 10000)) + b.Run("Pointer", runWith(benchmarkMapDeletePointer, 100, 1000, 10000)) } func TestDeferDeleteSlow(t *testing.T) { -- GitLab From 681559e1f10f83a053b4ebab101de3d77ede8353 Mon Sep 17 00:00:00 2001 From: "zero.xu" Date: Mon, 17 Aug 2020 07:06:32 +0000 Subject: [PATCH 0203/1792] runtime: update comment: modTimer is called by Timer.Reset Change-Id: I97d0d1343d41b603a68388e496411fb040dc6d66 GitHub-Last-Rev: d11177ad249bd844dd9e7e355eea28596d0b1fa8 GitHub-Pull-Request: golang/go#38625 Reviewed-on: https://go-review.googlesource.com/c/go/+/229767 Reviewed-by: Emmanuel Odeke --- src/runtime/time.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/time.go b/src/runtime/time.go index fdb5066b24..f895bf8443 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -403,7 +403,7 @@ func dodeltimer0(pp *p) { } // modtimer modifies an existing timer. -// This is called by the netpoll code or time.Ticker.Reset. +// This is called by the netpoll code or time.Ticker.Reset or time.Timer.Reset. // Reports whether the timer was modified before it was run. func modtimer(t *timer, when, period int64, f func(interface{}, uintptr), arg interface{}, seq uintptr) bool { if when < 0 { -- GitLab From 9138a2a67f7f29948f6f608bf904b3605f1b45d0 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Tue, 26 May 2020 14:40:44 +1000 Subject: [PATCH 0204/1792] cmd/link: avoid duplicate DT_NEEDED entries When adding a new library entry, ensure we record it as seen to avoid adding duplicates of it. Fixes #39256 Change-Id: Id309adf80c533d78fd485517c18bc9ab5f1d29fb Reviewed-on: https://go-review.googlesource.com/c/go/+/235257 Run-TryBot: Joel Sing TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/elf.go | 1 + src/cmd/link/internal/ld/elf_test.go | 55 +++++++++++++++++++ .../link/internal/ld/testdata/issue39256/x.go | 20 +++++++ .../link/internal/ld/testdata/issue39256/x.s | 10 ++++ 4 files changed, 86 insertions(+) create mode 100644 src/cmd/link/internal/ld/testdata/issue39256/x.go create mode 100644 src/cmd/link/internal/ld/testdata/issue39256/x.s diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 957f5081f6..2862f65f9f 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -2378,6 +2378,7 @@ func elfadddynsym(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.S if target.Arch.Family == sys.AMD64 && !cgoeDynamic && dil != "" && !seenlib[dil] { du := ldr.MakeSymbolUpdater(syms.Dynamic) Elfwritedynent(target.Arch, du, DT_NEEDED, uint64(dstru.Addstring(dil))) + seenlib[dil] = true } } else { diff --git a/src/cmd/link/internal/ld/elf_test.go b/src/cmd/link/internal/ld/elf_test.go index 8e86beb1ec..37f0e77336 100644 --- a/src/cmd/link/internal/ld/elf_test.go +++ b/src/cmd/link/internal/ld/elf_test.go @@ -13,6 +13,7 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "testing" ) @@ -77,3 +78,57 @@ func main() { t.Fatalf("Unexpected sh info, want greater than 0, got: %d", section.Info) } } + +func TestNoDuplicateNeededEntries(t *testing.T) { + testenv.MustHaveGoBuild(t) + testenv.MustHaveCGO(t) + + // run this test on just a small set of platforms (no need to test it + // across the board given the nature of the test). + pair := runtime.GOOS + "-" + runtime.GOARCH + switch pair { + case "linux-amd64", "freebsd-amd64", "openbsd-amd64": + default: + t.Skip("no need for test on " + pair) + } + + t.Parallel() + + dir, err := ioutil.TempDir("", "no-dup-needed") + if err != nil { + t.Fatalf("Failed to create temp dir: %v", err) + } + defer os.RemoveAll(dir) + + wd, err := os.Getwd() + if err != nil { + t.Fatalf("Failed to get working directory: %v", err) + } + + path := filepath.Join(dir, "x") + argv := []string{"build", "-o", path, filepath.Join(wd, "testdata", "issue39256")} + out, err := exec.Command(testenv.GoToolPath(t), argv...).CombinedOutput() + if err != nil { + t.Fatalf("Build failure: %s\n%s\n", err, string(out)) + } + + f, err := elf.Open(path) + if err != nil { + t.Fatalf("Failed to open ELF file: %v", err) + } + libs, err := f.ImportedLibraries() + if err != nil { + t.Fatalf("Failed to read imported libraries: %v", err) + } + + var count int + for _, lib := range libs { + if lib == "libc.so" { + count++ + } + } + + if got, want := count, 1; got != want { + t.Errorf("Got %d entries for `libc.so`, want %d", got, want) + } +} diff --git a/src/cmd/link/internal/ld/testdata/issue39256/x.go b/src/cmd/link/internal/ld/testdata/issue39256/x.go new file mode 100644 index 0000000000..d8562ad172 --- /dev/null +++ b/src/cmd/link/internal/ld/testdata/issue39256/x.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 main + +import ( + _ "unsafe" +) + +//go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_kill kill "libc.so" +//go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_open open "libc.so" + +func trampoline() + +func main() { + trampoline() +} diff --git a/src/cmd/link/internal/ld/testdata/issue39256/x.s b/src/cmd/link/internal/ld/testdata/issue39256/x.s new file mode 100644 index 0000000000..41a54b2e04 --- /dev/null +++ b/src/cmd/link/internal/ld/testdata/issue39256/x.s @@ -0,0 +1,10 @@ +// 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. + +TEXT ·trampoline(SB),0,$0 + CALL libc_getpid(SB) + CALL libc_kill(SB) + CALL libc_open(SB) + CALL libc_close(SB) + RET -- GitLab From d79350bac73670c04a91b6761d334b810201f6ee Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 4 May 2020 18:36:31 +0200 Subject: [PATCH 0205/1792] runtime: use hw.ncpuonline sysctl in getncpu on netbsd Since NetBSD 7, hw.ncpuonline reports the number of CPUs online, while hw.cpu reports the number of CPUs configured. Try hw.cpuonline first and fall back to hw.ncpu in case it fails (which is the case on NetBSD before 7.0). This follows the behavior on OpenBSD (see CL 161757). Also, Go in pkgsrc is patched to use hw.cpuonline, so this CL would allow said patch to be dropped. Updates #30824 Change-Id: Id1c19dff2c1e4401e6074179fae7c708ba0e3098 Reviewed-on: https://go-review.googlesource.com/c/go/+/231957 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Benny Siegert --- src/runtime/os_netbsd.go | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index 97106c7b9d..f7f90cedc1 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -95,18 +95,28 @@ var sigset_all = sigset{[4]uint32{^uint32(0), ^uint32(0), ^uint32(0), ^uint32(0) // From NetBSD's const ( - _CTL_HW = 6 - _HW_NCPU = 3 - _HW_PAGESIZE = 7 + _CTL_HW = 6 + _HW_NCPU = 3 + _HW_PAGESIZE = 7 + _HW_NCPUONLINE = 16 ) -func getncpu() int32 { - mib := [2]uint32{_CTL_HW, _HW_NCPU} - out := uint32(0) +func sysctlInt(mib []uint32) (int32, bool) { + var out int32 nout := unsafe.Sizeof(out) - ret := sysctl(&mib[0], 2, (*byte)(unsafe.Pointer(&out)), &nout, nil, 0) - if ret >= 0 { - return int32(out) + ret := sysctl(&mib[0], uint32(len(mib)), (*byte)(unsafe.Pointer(&out)), &nout, nil, 0) + if ret < 0 { + return 0, false + } + return out, true +} + +func getncpu() int32 { + if n, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPUONLINE}); ok { + return int32(n) + } + if n, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPU}); ok { + return int32(n) } return 1 } -- GitLab From bf512685fee6282f1a50069ef444412bdf59611b Mon Sep 17 00:00:00 2001 From: Cholerae Hu Date: Wed, 5 Aug 2020 13:52:32 +0800 Subject: [PATCH 0206/1792] syscall: cap RLIMIT_NOFILE soft limit in TestRlimit on darwin On some machines, kern.maxfilesperproc is 4096. If Rlimit.Cur is larger than that, Setrlimit will get an errEINVAL. Fixes #40564. Change-Id: Ib94303c790a489ff0559c88d41a021e514d18f8d Reviewed-on: https://go-review.googlesource.com/c/go/+/246658 Reviewed-by: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot --- src/syscall/syscall_unix_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/syscall/syscall_unix_test.go b/src/syscall/syscall_unix_test.go index 13b79ca8d8..3c7982eefe 100644 --- a/src/syscall/syscall_unix_test.go +++ b/src/syscall/syscall_unix_test.go @@ -336,11 +336,11 @@ func TestRlimit(t *testing.T) { } set := rlimit set.Cur = set.Max - 1 - if runtime.GOOS == "darwin" && set.Cur > 10240 { - // The max file limit is 10240, even though - // the max returned by Getrlimit is 1<<63-1. - // This is OPEN_MAX in sys/syslimits.h. - set.Cur = 10240 + if runtime.GOOS == "darwin" && set.Cur > 4096 { + // rlim_min for RLIMIT_NOFILE should be equal to + // or lower than kern.maxfilesperproc, which on + // some machines are 4096. See #40564. + set.Cur = 4096 } err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &set) if err != nil { @@ -353,8 +353,8 @@ func TestRlimit(t *testing.T) { } set = rlimit set.Cur = set.Max - 1 - if runtime.GOOS == "darwin" && set.Cur > 10240 { - set.Cur = 10240 + if runtime.GOOS == "darwin" && set.Cur > 4096 { + set.Cur = 4096 } if set != get { t.Fatalf("Rlimit: change failed: wanted %#v got %#v", set, get) -- GitLab From dc12d5b0f5e9c1cfec2a8eb6dd7ff3473c36d45c Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 17 Aug 2020 11:28:26 +0200 Subject: [PATCH 0207/1792] all: add empty line between copyright header and package clause Makes sure the copyright notice is not interpreted as the package level godoc. Change-Id: I2afce7c9d620f19d51ec1438b1d0db1774b57146 Reviewed-on: https://go-review.googlesource.com/c/go/+/248760 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Dave Cheney --- src/cmd/compile/internal/ssa/debug.go | 1 + src/cmd/compile/internal/ssa/passbm_test.go | 1 + src/cmd/go/internal/trace/trace.go | 1 + src/cmd/link/internal/benchmark/bench_test.go | 1 + src/cmd/link/internal/ld/errors.go | 1 + src/runtime/closure_test.go | 1 + src/runtime/map_benchmark_test.go | 1 + src/runtime/slice_test.go | 1 + src/sync/cond_test.go | 1 + test/fixedbugs/issue15281.go | 1 + 10 files changed, 10 insertions(+) diff --git a/src/cmd/compile/internal/ssa/debug.go b/src/cmd/compile/internal/ssa/debug.go index 13fe67cbca..6353f72897 100644 --- a/src/cmd/compile/internal/ssa/debug.go +++ b/src/cmd/compile/internal/ssa/debug.go @@ -1,6 +1,7 @@ // 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 ssa import ( diff --git a/src/cmd/compile/internal/ssa/passbm_test.go b/src/cmd/compile/internal/ssa/passbm_test.go index eefdbb8722..3fd3eb579b 100644 --- a/src/cmd/compile/internal/ssa/passbm_test.go +++ b/src/cmd/compile/internal/ssa/passbm_test.go @@ -1,6 +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. + package ssa import ( diff --git a/src/cmd/go/internal/trace/trace.go b/src/cmd/go/internal/trace/trace.go index 7cb7636a34..c8fac92c9f 100644 --- a/src/cmd/go/internal/trace/trace.go +++ b/src/cmd/go/internal/trace/trace.go @@ -1,6 +1,7 @@ // 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 trace import ( diff --git a/src/cmd/link/internal/benchmark/bench_test.go b/src/cmd/link/internal/benchmark/bench_test.go index d8ec717c7c..419dc55724 100644 --- a/src/cmd/link/internal/benchmark/bench_test.go +++ b/src/cmd/link/internal/benchmark/bench_test.go @@ -1,6 +1,7 @@ // 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 benchmark import ( diff --git a/src/cmd/link/internal/ld/errors.go b/src/cmd/link/internal/ld/errors.go index c5ce097fde..d6e8ff236d 100644 --- a/src/cmd/link/internal/ld/errors.go +++ b/src/cmd/link/internal/ld/errors.go @@ -1,6 +1,7 @@ // 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 ld import ( diff --git a/src/runtime/closure_test.go b/src/runtime/closure_test.go index ea65fbd5f5..741c932eab 100644 --- a/src/runtime/closure_test.go +++ b/src/runtime/closure_test.go @@ -1,6 +1,7 @@ // Copyright 2011 The Go Authors. 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" diff --git a/src/runtime/map_benchmark_test.go b/src/runtime/map_benchmark_test.go index 893cb6c5b6..d0becc9ddb 100644 --- a/src/runtime/map_benchmark_test.go +++ b/src/runtime/map_benchmark_test.go @@ -1,6 +1,7 @@ // Copyright 2013 The Go Authors. 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 ( diff --git a/src/runtime/slice_test.go b/src/runtime/slice_test.go index e963a43dd3..cd2bc26d1e 100644 --- a/src/runtime/slice_test.go +++ b/src/runtime/slice_test.go @@ -1,6 +1,7 @@ // Copyright 2011 The Go Authors. 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 ( diff --git a/src/sync/cond_test.go b/src/sync/cond_test.go index 9d0d9adc74..859cae59bc 100644 --- a/src/sync/cond_test.go +++ b/src/sync/cond_test.go @@ -1,6 +1,7 @@ // Copyright 2011 The Go Authors. 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 ( diff --git a/test/fixedbugs/issue15281.go b/test/fixedbugs/issue15281.go index 187c96f218..390867c848 100644 --- a/test/fixedbugs/issue15281.go +++ b/test/fixedbugs/issue15281.go @@ -3,6 +3,7 @@ // 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 main import "runtime" -- GitLab From 7bbd5ca5a6a94f58d33de6b1244248a32dc8cd9c Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 22 Jul 2020 11:21:36 -0400 Subject: [PATCH 0208/1792] runtime: replace index and contains with bytealg calls The runtime has its own implementation of string indexing. To reduce code duplication and cognitive load, replace this with calls to the internal/bytealg package. We can't do this on Plan 9 because it needs string indexing in a note handler (which isn't allowed to use the optimized bytealg version because it uses SSE), so we can't just eliminate the index function, but this CL does down-scope it so make it clear it's only for note handlers on Plan 9. Change-Id: Ie1a142678262048515c481e8c26313b80c5875df Reviewed-on: https://go-review.googlesource.com/c/go/+/244537 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek Reviewed-by: Michael Pratt --- src/runtime/os_plan9.go | 18 ++++++++++++++++-- src/runtime/proc.go | 3 ++- src/runtime/runtime1.go | 5 +++-- src/runtime/string.go | 16 ---------------- src/runtime/traceback.go | 3 ++- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/runtime/os_plan9.go b/src/runtime/os_plan9.go index 9e187d2220..128c30adeb 100644 --- a/src/runtime/os_plan9.go +++ b/src/runtime/os_plan9.go @@ -82,10 +82,10 @@ func sigpanic() { note := gostringnocopy((*byte)(unsafe.Pointer(g.m.notesig))) switch g.sig { case _SIGRFAULT, _SIGWFAULT: - i := index(note, "addr=") + i := indexNoFloat(note, "addr=") if i >= 0 { i += 5 - } else if i = index(note, "va="); i >= 0 { + } else if i = indexNoFloat(note, "va="); i >= 0 { i += 3 } else { panicmem() @@ -111,6 +111,20 @@ func sigpanic() { } } +// indexNoFloat is bytealg.IndexString but safe to use in a note +// handler. +func indexNoFloat(s, t string) int { + if len(t) == 0 { + return 0 + } + for i := 0; i < len(s); i++ { + if s[i] == t[0] && hasPrefix(s[i:], t) { + return i + } + } + return -1 +} + func atolwhex(p string) int64 { for hasPrefix(p, " ") || hasPrefix(p, "\t") { p = p[1:] diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 035822216d..ed7e2128ae 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -5,6 +5,7 @@ package runtime import ( + "internal/bytealg" "internal/cpu" "runtime/internal/atomic" "runtime/internal/sys" @@ -5460,7 +5461,7 @@ func haveexperiment(name string) bool { x := sys.Goexperiment for x != "" { xname := "" - i := index(x, ",") + i := bytealg.IndexByteString(x, ',') if i < 0 { xname, x = x, "" } else { diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go index c65a534ef6..7c893aa25c 100644 --- a/src/runtime/runtime1.go +++ b/src/runtime/runtime1.go @@ -5,6 +5,7 @@ package runtime import ( + "internal/bytealg" "runtime/internal/atomic" "runtime/internal/sys" "unsafe" @@ -347,13 +348,13 @@ func parsedebugvars() { for p := gogetenv("GODEBUG"); p != ""; { field := "" - i := index(p, ",") + i := bytealg.IndexByteString(p, ',') if i < 0 { field, p = p, "" } else { field, p = p[:i], p[i+1:] } - i = index(field, "=") + i = bytealg.IndexByteString(field, '=') if i < 0 { continue } diff --git a/src/runtime/string.go b/src/runtime/string.go index 251044231e..9a601f0094 100644 --- a/src/runtime/string.go +++ b/src/runtime/string.go @@ -335,22 +335,6 @@ func gostringn(p *byte, l int) string { return s } -func index(s, t string) int { - if len(t) == 0 { - return 0 - } - for i := 0; i < len(s); i++ { - if s[i] == t[0] && hasPrefix(s[i:], t) { - return i - } - } - return -1 -} - -func contains(s, t string) bool { - return index(s, t) >= 0 -} - func hasPrefix(s, prefix string) bool { return len(s) >= len(prefix) && s[:len(prefix)] == prefix } diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index 944c8473d2..96e552524e 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -5,6 +5,7 @@ package runtime import ( + "internal/bytealg" "runtime/internal/atomic" "runtime/internal/sys" "unsafe" @@ -848,7 +849,7 @@ func showfuncinfo(f funcInfo, firstFrame bool, funcID, childID funcID) bool { return true } - return contains(name, ".") && (!hasPrefix(name, "runtime.") || isExportedRuntime(name)) + return bytealg.IndexByteString(name, '.') >= 0 && (!hasPrefix(name, "runtime.") || isExportedRuntime(name)) } // isExportedRuntime reports whether name is an exported runtime function. -- GitLab From 7148abc1b900555199998aac25af11783a9eb41c Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 5 Jun 2020 16:44:29 -0400 Subject: [PATCH 0209/1792] runtime: simplify heapBitsSetType doubleCheck The heapBitsSetType function has a slow doubleCheck debugging mode that checks the bitmap written out by the rest of the function using far more obvious logic. But even this has some surprisingly complex logic in it. Simplify it a bit. This also happens to fix the logic on 32-bit. Fixes #40335. Change-Id: I5cee482ad8adbd01cf5b98e35a270fe941ba4940 Reviewed-on: https://go-review.googlesource.com/c/go/+/244538 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek --- src/runtime/mbitmap.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/runtime/mbitmap.go b/src/runtime/mbitmap.go index 35332c91c4..cad6f56404 100644 --- a/src/runtime/mbitmap.go +++ b/src/runtime/mbitmap.go @@ -1403,17 +1403,20 @@ Phase4: // Double check the whole bitmap. if doubleCheck { // x+size may not point to the heap, so back up one - // word and then call next(). - end := heapBitsForAddr(x + size - sys.PtrSize).next() - endAI := arenaIdx(end.arena) - if !outOfPlace && (end.bitp == nil || (end.shift == 0 && end.bitp == &mheap_.arenas[endAI.l1()][endAI.l2()].bitmap[0])) { - // The unrolling code above walks hbitp just - // past the bitmap without moving to the next - // arena. Synthesize this for end.bitp. - end.arena-- - endAI = arenaIdx(end.arena) - end.bitp = addb(&mheap_.arenas[endAI.l1()][endAI.l2()].bitmap[0], heapArenaBitmapBytes) - end.last = nil + // word and then advance it the way we do above. + end := heapBitsForAddr(x + size - sys.PtrSize) + if outOfPlace { + // In out-of-place copying, we just advance + // using next. + end = end.next() + } else { + // Don't use next because that may advance to + // the next arena and the in-place logic + // doesn't do that. + end.shift += heapBitsShift + if end.shift == 4*heapBitsShift { + end.bitp, end.shift = add1(end.bitp), 0 + } } if typ.kind&kindGCProg == 0 && (hbitp != end.bitp || (w == nw+2) != (end.shift == 2)) { println("ended at wrong bitmap byte for", typ.string(), "x", dataSize/typ.size) @@ -1437,8 +1440,9 @@ Phase4: var have, want uint8 have = (*h.bitp >> h.shift) & (bitPointer | bitScan) if i >= totalptr { - want = 0 // deadmarker if typ.kind&kindGCProg != 0 && i < (totalptr+3)/4*4 { + // heapBitsSetTypeGCProg always fills + // in full nibbles of bitScan. want = bitScan } } else { -- GitLab From d19fedd180fceb6a60961e19387893ddb047e4e6 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 5 Jun 2020 16:48:03 -0400 Subject: [PATCH 0210/1792] runtime: move checkmarks to a separate bitmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, the GC stores the object marks for checkmarks mode in the heap bitmap using a rather complex encoding: for one word objects, the checkmark is stored in the pointer/scalar bit since one word objects must be pointers; for larger objects, the checkmark is stored in what would be the scan/dead bit for the second word of the object. This encoding made more sense when the runtime used the first scan/dead bit as the regular mark bit, but we moved away from that long ago. This encoding and overloading of the heap bitmap bits causes a great deal of complexity in many parts of the allocator and garbage collector and leads to some subtle bugs like #15903. This CL moves the checkmarks mark bits into their own per-arena bitmap and reclaims the second scan/dead bit as a regular scan/dead bit. I tested this by enabling doubleCheck mode in heapBitsSetType and running in both regular and GODEBUG=gccheckmark=1 mode. Fixes #15903. No performance degradation. (Very slight improvement on a few benchmarks, but it's probably just noise.) name old time/op new time/op delta BiogoIgor 16.6s ± 1% 16.4s ± 1% -0.94% (p=0.000 n=25+24) BiogoKrishna 19.2s ± 3% 19.2s ± 3% ~ (p=0.638 n=23+25) BleveIndexBatch100 6.12s ± 5% 6.17s ± 4% ~ (p=0.170 n=25+25) CompileTemplate 206ms ± 1% 205ms ± 1% -0.43% (p=0.005 n=24+24) CompileUnicode 82.2ms ± 2% 81.5ms ± 2% -0.95% (p=0.001 n=22+22) CompileGoTypes 755ms ± 3% 754ms ± 4% ~ (p=0.715 n=25+25) CompileCompiler 3.73s ± 1% 3.73s ± 1% ~ (p=0.445 n=25+24) CompileSSA 8.67s ± 1% 8.66s ± 1% ~ (p=0.836 n=24+22) CompileFlate 134ms ± 2% 133ms ± 1% -0.66% (p=0.001 n=24+23) CompileGoParser 164ms ± 1% 163ms ± 1% -0.85% (p=0.000 n=24+24) CompileReflect 466ms ± 5% 466ms ± 3% ~ (p=0.863 n=25+25) CompileTar 182ms ± 1% 182ms ± 1% -0.31% (p=0.048 n=24+24) CompileXML 249ms ± 1% 248ms ± 1% -0.32% (p=0.031 n=21+25) CompileStdCmd 10.3s ± 1% 10.3s ± 1% ~ (p=0.459 n=23+23) FoglemanFauxGLRenderRotateBoat 8.66s ± 1% 8.62s ± 1% -0.47% (p=0.000 n=23+24) FoglemanPathTraceRenderGopherIter1 20.3s ± 3% 20.2s ± 2% ~ (p=0.893 n=25+25) GopherLuaKNucleotide 29.7s ± 1% 29.8s ± 2% ~ (p=0.421 n=24+25) MarkdownRenderXHTML 246ms ± 1% 247ms ± 1% ~ (p=0.558 n=25+24) Tile38WithinCircle100kmRequest 779µs ± 4% 779µs ± 3% ~ (p=0.954 n=25+25) Tile38IntersectsCircle100kmRequest 1.02ms ± 3% 1.01ms ± 4% ~ (p=0.658 n=25+25) Tile38KNearestLimit100Request 984µs ± 4% 986µs ± 4% ~ (p=0.627 n=24+25) [Geo mean] 552ms 551ms -0.19% https://perf.golang.org/search?q=upload:20200723.6 Change-Id: Ic703f26a83fb034941dc6f4788fc997d56890dec Reviewed-on: https://go-review.googlesource.com/c/go/+/244539 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek Reviewed-by: Martin Möhrmann --- src/reflect/all_test.go | 5 +- src/runtime/cgocall.go | 2 +- src/runtime/gcinfo_test.go | 19 +--- src/runtime/heapdump.go | 2 +- src/runtime/mbitmap.go | 173 ++++++++----------------------------- src/runtime/mcheckmark.go | 100 +++++++++++++++++++++ src/runtime/mgc.go | 4 +- src/runtime/mgcmark.go | 70 +-------------- src/runtime/mheap.go | 4 + 9 files changed, 148 insertions(+), 231 deletions(-) create mode 100644 src/runtime/mcheckmark.go diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 6b31568bb9..ed2f225077 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -6467,12 +6467,9 @@ func verifyGCBitsSlice(t *testing.T, typ Type, cap int, bits []byte) { // Repeat the bitmap for the slice size, trimming scalars in // the last element. bits = rep(cap, bits) - for len(bits) > 2 && bits[len(bits)-1] == 0 { + for len(bits) > 0 && bits[len(bits)-1] == 0 { bits = bits[:len(bits)-1] } - if len(bits) == 2 && bits[0] == 0 && bits[1] == 0 { - bits = bits[:0] - } if !bytes.Equal(heapBits, bits) { t.Errorf("heapBits incorrect for make(%v, 0, %v)\nhave %v\nwant %v", typ, cap, heapBits, bits) } diff --git a/src/runtime/cgocall.go b/src/runtime/cgocall.go index a4e64b00cc..099aa540e0 100644 --- a/src/runtime/cgocall.go +++ b/src/runtime/cgocall.go @@ -605,7 +605,7 @@ func cgoCheckUnknownPointer(p unsafe.Pointer, msg string) (base, i uintptr) { hbits := heapBitsForAddr(base) n := span.elemsize for i = uintptr(0); i < n; i += sys.PtrSize { - if i != 1*sys.PtrSize && !hbits.morePointers() { + if !hbits.morePointers() { // No more possible pointers. break } diff --git a/src/runtime/gcinfo_test.go b/src/runtime/gcinfo_test.go index ec1ba90c2e..0808b416f0 100644 --- a/src/runtime/gcinfo_test.go +++ b/src/runtime/gcinfo_test.go @@ -77,7 +77,7 @@ func TestGCInfo(t *testing.T) { } for i := 0; i < 10; i++ { - verifyGCInfo(t, "heap Ptr", escape(new(Ptr)), trimDead(padDead(infoPtr))) + verifyGCInfo(t, "heap Ptr", escape(new(Ptr)), trimDead(infoPtr)) verifyGCInfo(t, "heap PtrSlice", escape(&make([]*byte, 10)[0]), trimDead(infoPtr10)) verifyGCInfo(t, "heap ScalarPtr", escape(new(ScalarPtr)), trimDead(infoScalarPtr)) verifyGCInfo(t, "heap ScalarPtrSlice", escape(&make([]ScalarPtr, 4)[0]), trimDead(infoScalarPtr4)) @@ -97,25 +97,10 @@ func verifyGCInfo(t *testing.T, name string, p interface{}, mask0 []byte) { } } -func padDead(mask []byte) []byte { - // Because the dead bit isn't encoded in the second word, - // and because on 32-bit systems a one-word allocation - // uses a two-word block, the pointer info for a one-word - // object needs to be expanded to include an extra scalar - // on 32-bit systems to match the heap bitmap. - if runtime.PtrSize == 4 && len(mask) == 1 { - return []byte{mask[0], 0} - } - return mask -} - func trimDead(mask []byte) []byte { - for len(mask) > 2 && mask[len(mask)-1] == typeScalar { + for len(mask) > 0 && mask[len(mask)-1] == typeScalar { mask = mask[:len(mask)-1] } - if len(mask) == 2 && mask[0] == typeScalar && mask[1] == typeScalar { - mask = mask[:0] - } return mask } diff --git a/src/runtime/heapdump.go b/src/runtime/heapdump.go index cfd5c251b4..4c35309211 100644 --- a/src/runtime/heapdump.go +++ b/src/runtime/heapdump.go @@ -713,7 +713,7 @@ func makeheapobjbv(p uintptr, size uintptr) bitvector { i := uintptr(0) hbits := heapBitsForAddr(p) for ; i < nptr; i++ { - if i != 1 && !hbits.morePointers() { + if !hbits.morePointers() { break // end of object } if hbits.isPointer() { diff --git a/src/runtime/mbitmap.go b/src/runtime/mbitmap.go index cad6f56404..8de44c14b9 100644 --- a/src/runtime/mbitmap.go +++ b/src/runtime/mbitmap.go @@ -6,10 +6,11 @@ // // Stack, data, and bss bitmaps // -// Stack frames and global variables in the data and bss sections are described -// by 1-bit bitmaps in which 0 means uninteresting and 1 means live pointer -// to be visited during GC. The bits in each byte are consumed starting with -// the low bit: 1<<0, 1<<1, and so on. +// Stack frames and global variables in the data and bss sections are +// described by bitmaps with 1 bit per pointer-sized word. A "1" bit +// means the word is a live pointer to be visited by the GC (referred to +// as "pointer"). A "0" bit means the word should be ignored by GC +// (referred to as "scalar", though it could be a dead pointer value). // // Heap bitmap // @@ -20,18 +21,13 @@ // through start+3*ptrSize, ha.bitmap[1] holds the entries for // start+4*ptrSize through start+7*ptrSize, and so on. // -// In each 2-bit entry, the lower bit holds the same information as in the 1-bit -// bitmaps: 0 means uninteresting and 1 means live pointer to be visited during GC. -// The meaning of the high bit depends on the position of the word being described -// in its allocated object. In all words *except* the second word, the -// high bit indicates that the object is still being described. In -// these words, if a bit pair with a high bit 0 is encountered, the -// low bit can also be assumed to be 0, and the object description is -// over. This 00 is called the ``dead'' encoding: it signals that the -// rest of the words in the object are uninteresting to the garbage -// collector. -// -// In the second word, the high bit is the GC ``checkmarked'' bit (see below). +// In each 2-bit entry, the lower bit is a pointer/scalar bit, just +// like in the stack/data bitmaps described above. The upper bit +// indicates scan/dead: a "1" value ("scan") indicates that there may +// be pointers in later words of the allocation, and a "0" value +// ("dead") indicates there are no more pointers in the allocation. If +// the upper bit is 0, the lower bit must also be 0, and this +// indicates scanning can ignore the rest of the allocation. // // The 2-bit entries are split when written into the byte, so that the top half // of the byte contains 4 high bits and the bottom half contains 4 low (pointer) @@ -39,38 +35,14 @@ // This form allows a copy from the 1-bit to the 4-bit form to keep the // pointer bits contiguous, instead of having to space them out. // -// The code makes use of the fact that the zero value for a heap bitmap -// has no live pointer bit set and is (depending on position), not used, -// not checkmarked, and is the dead encoding. -// These properties must be preserved when modifying the encoding. +// The code makes use of the fact that the zero value for a heap +// bitmap means scalar/dead. This property must be preserved when +// modifying the encoding. // // The bitmap for noscan spans is not maintained. Code must ensure // that an object is scannable before consulting its bitmap by // checking either the noscan bit in the span or by consulting its // type's information. -// -// Checkmarks -// -// In a concurrent garbage collector, one worries about failing to mark -// a live object due to mutations without write barriers or bugs in the -// collector implementation. As a sanity check, the GC has a 'checkmark' -// mode that retraverses the object graph with the world stopped, to make -// sure that everything that should be marked is marked. -// In checkmark mode, in the heap bitmap, the high bit of the 2-bit entry -// for the second word of the object holds the checkmark bit. -// When not in checkmark mode, this bit is set to 1. -// -// The smallest possible allocation is 8 bytes. On a 32-bit machine, that -// means every allocated object has two words, so there is room for the -// checkmark bit. On a 64-bit machine, however, the 8-byte allocation is -// just one word, so the second bit pair is not available for encoding the -// checkmark. However, because non-pointer allocations are combined -// into larger 16-byte (maxTinySize) allocations, a plain 8-byte allocation -// must be a pointer, so the type bit in the first word is not actually needed. -// It is still used in general, except in checkmark the type bit is repurposed -// as the checkmark bit and then reinitialized (to 1) as the type bit when -// finished. -// package runtime @@ -551,33 +523,6 @@ func (h heapBits) isPointer() bool { return h.bits()&bitPointer != 0 } -// isCheckmarked reports whether the heap bits have the checkmarked bit set. -// It must be told how large the object at h is, because the encoding of the -// checkmark bit varies by size. -// h must describe the initial word of the object. -func (h heapBits) isCheckmarked(size uintptr) bool { - if size == sys.PtrSize { - return (*h.bitp>>h.shift)&bitPointer != 0 - } - // All multiword objects are 2-word aligned, - // so we know that the initial word's 2-bit pair - // and the second word's 2-bit pair are in the - // same heap bitmap byte, *h.bitp. - return (*h.bitp>>(heapBitsShift+h.shift))&bitScan != 0 -} - -// setCheckmarked sets the checkmarked bit. -// It must be told how large the object at h is, because the encoding of the -// checkmark bit varies by size. -// h must describe the initial word of the object. -func (h heapBits) setCheckmarked(size uintptr) { - if size == sys.PtrSize { - atomic.Or8(h.bitp, bitPointer<= nw { goto Phase3 } @@ -1203,14 +1103,13 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) { // We took care of 1-word and 2-word objects above, // so this is at least a 6-word object. hb = (b & (bitPointer | bitPointer< 1 { + hb |= bitScan << (3 * heapBitsShift) + } b >>= 2 nb -= 2 - // Note: no bitScan for second word because that's - // the checkmark. - *hbitp &^= uint8((bitPointer | bitScan | (bitPointer << heapBitsShift)) << (2 * heapBitsShift)) + *hbitp &^= uint8((bitPointer | bitScan | ((bitPointer | bitScan) << heapBitsShift)) << (2 * heapBitsShift)) *hbitp |= uint8(hb) hbitp = add1(hbitp) if w += 2; w >= nw { @@ -1449,11 +1348,7 @@ Phase4: if j < nptr && (*addb(ptrmask, j/8)>>(j%8))&1 != 0 { want |= bitPointer } - if i != 1 { - want |= bitScan - } else { - have &^= bitScan - } + want |= bitScan } if have != want { println("mismatch writing bits for", typ.string(), "x", dataSize/typ.size) @@ -2013,7 +1908,7 @@ func getgcmask(ep interface{}) (mask []byte) { if hbits.isPointer() { mask[i/sys.PtrSize] = 1 } - if i != 1*sys.PtrSize && !hbits.morePointers() { + if !hbits.morePointers() { mask = mask[:i/sys.PtrSize] break } diff --git a/src/runtime/mcheckmark.go b/src/runtime/mcheckmark.go new file mode 100644 index 0000000000..1fd8e4e78f --- /dev/null +++ b/src/runtime/mcheckmark.go @@ -0,0 +1,100 @@ +// 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. + +// GC checkmarks +// +// In a concurrent garbage collector, one worries about failing to mark +// a live object due to mutations without write barriers or bugs in the +// collector implementation. As a sanity check, the GC has a 'checkmark' +// mode that retraverses the object graph with the world stopped, to make +// sure that everything that should be marked is marked. + +package runtime + +import ( + "runtime/internal/atomic" + "runtime/internal/sys" + "unsafe" +) + +// A checkmarksMap stores the GC marks in "checkmarks" mode. It is a +// per-arena bitmap with a bit for every word in the arena. The mark +// is stored on the bit corresponding to the first word of the marked +// allocation. +// +//go:notinheap +type checkmarksMap [heapArenaBytes / sys.PtrSize / 8]uint8 + +// If useCheckmark is true, marking of an object uses the checkmark +// bits instead of the standard mark bits. +var useCheckmark = false + +// startCheckmarks prepares for the checkmarks phase. +// +// The world must be stopped. +func startCheckmarks() { + // Clear all checkmarks. + for _, ai := range mheap_.allArenas { + arena := mheap_.arenas[ai.l1()][ai.l2()] + bitmap := arena.checkmarks + + if bitmap == nil { + // Allocate bitmap on first use. + bitmap = (*checkmarksMap)(persistentalloc(unsafe.Sizeof(*bitmap), 0, &memstats.gc_sys)) + if bitmap == nil { + throw("out of memory allocating checkmarks bitmap") + } + arena.checkmarks = bitmap + } else { + // Otherwise clear the existing bitmap. + for i := range bitmap { + bitmap[i] = 0 + } + } + } + // Enable checkmarking. + useCheckmark = true +} + +// endCheckmarks ends the checkmarks phase. +func endCheckmarks() { + if gcMarkWorkAvailable(nil) { + throw("GC work not flushed") + } + useCheckmark = false +} + +// setCheckmark throws if marking object is a checkmarks violation, +// and otherwise sets obj's checkmark. It returns true if obj was +// already checkmarked. +func setCheckmark(obj, base, off uintptr, mbits markBits) bool { + if !mbits.isMarked() { + printlock() + print("runtime: checkmarks found unexpected unmarked object obj=", hex(obj), "\n") + print("runtime: found obj at *(", hex(base), "+", hex(off), ")\n") + + // Dump the source (base) object + gcDumpObject("base", base, off) + + // Dump the object + gcDumpObject("obj", obj, ^uintptr(0)) + + getg().m.traceback = 2 + throw("checkmark found unmarked object") + } + + ai := arenaIndex(obj) + arena := mheap_.arenas[ai.l1()][ai.l2()] + arenaWord := (obj / heapArenaBytes / 8) % uintptr(len(arena.checkmarks)) + mask := byte(1 << ((obj / heapArenaBytes) % 8)) + bytep := &arena.checkmarks[arenaWord] + + if atomic.Load8(bytep)&mask != 0 { + // Already checkmarked. + return true + } + + atomic.Or8(bytep, mask) + return false +} diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index b3499516f6..c8c4a4c758 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -1670,13 +1670,13 @@ func gcMarkTermination(nextTriggerRatio float64) { // mark using checkmark bits, to check that we // didn't forget to mark anything during the // concurrent mark process. + startCheckmarks() gcResetMarkState() - initCheckmarks() gcw := &getg().m.p.ptr().gcw gcDrain(gcw, 0) wbBufFlush1(getg().m.p.ptr()) gcw.dispose() - clearCheckmarks() + endCheckmarks() } // marking is complete so we can turn the write barrier off diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index fe988c46d9..96910ff729 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -1354,11 +1354,7 @@ func scanobject(b uintptr, gcw *gcWork) { } // Load bits once. See CL 22712 and issue 16973 for discussion. bits := hbits.bits() - // During checkmarking, 1-word objects store the checkmark - // in the type bit for the one word. The only one-word objects - // are pointers, or else they'd be merged with other non-pointer - // data into larger allocations. - if i != 1*sys.PtrSize && bits&bitScan == 0 { + if bits&bitScan == 0 { break // no more pointers in this object } if bits&bitPointer == 0 { @@ -1511,28 +1507,10 @@ func greyobject(obj, base, off uintptr, span *mspan, gcw *gcWork, objIndex uintp mbits := span.markBitsForIndex(objIndex) if useCheckmark { - if !mbits.isMarked() { - printlock() - print("runtime:greyobject: checkmarks finds unexpected unmarked object obj=", hex(obj), "\n") - print("runtime: found obj at *(", hex(base), "+", hex(off), ")\n") - - // Dump the source (base) object - gcDumpObject("base", base, off) - - // Dump the object - gcDumpObject("obj", obj, ^uintptr(0)) - - getg().m.traceback = 2 - throw("checkmark found unmarked object") - } - hbits := heapBitsForAddr(obj) - if hbits.isCheckmarked(span.elemsize) { + if setCheckmark(obj, base, off, mbits) { + // Already marked. return } - hbits.setCheckmarked(span.elemsize) - if !hbits.isCheckmarked(span.elemsize) { - throw("setCheckmarked and isCheckmarked disagree") - } } else { if debug.gccheckmark > 0 && span.isFree(objIndex) { print("runtime: marking free object ", hex(obj), " found at *(", hex(base), "+", hex(off), ")\n") @@ -1661,45 +1639,3 @@ func gcMarkTinyAllocs() { greyobject(c.tiny, 0, 0, span, gcw, objIndex) } } - -// Checkmarking - -// To help debug the concurrent GC we remark with the world -// stopped ensuring that any object encountered has their normal -// mark bit set. To do this we use an orthogonal bit -// pattern to indicate the object is marked. The following pattern -// uses the upper two bits in the object's boundary nibble. -// 01: scalar not marked -// 10: pointer not marked -// 11: pointer marked -// 00: scalar marked -// Xoring with 01 will flip the pattern from marked to unmarked and vica versa. -// The higher bit is 1 for pointers and 0 for scalars, whether the object -// is marked or not. -// The first nibble no longer holds the typeDead pattern indicating that the -// there are no more pointers in the object. This information is held -// in the second nibble. - -// If useCheckmark is true, marking of an object uses the -// checkmark bits (encoding above) instead of the standard -// mark bits. -var useCheckmark = false - -//go:nowritebarrier -func initCheckmarks() { - useCheckmark = true - for _, s := range mheap_.allspans { - if s.state.get() == mSpanInUse { - heapBitsForAddr(s.base()).initCheckmarkSpan(s.layout()) - } - } -} - -func clearCheckmarks() { - useCheckmark = false - for _, s := range mheap_.allspans { - if s.state.get() == mSpanInUse { - heapBitsForAddr(s.base()).clearCheckmarkSpan(s.layout()) - } - } -} diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 2c7bfd8a59..6341375160 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -300,6 +300,10 @@ type heapArena struct { // during marking. pageSpecials [pagesPerArena / 8]uint8 + // checkmarks stores the debug.gccheckmark state. It is only + // used if debug.gccheckmark > 0. + checkmarks *checkmarksMap + // zeroedBase marks the first byte of the first page in this // arena which hasn't been used yet and is therefore already // zero. zeroedBase is relative to the arena base. -- GitLab From a22ec6e650669f5101c7e0955d82e29d644eef4e Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 17 Aug 2020 13:17:26 +0000 Subject: [PATCH 0211/1792] Revert "cmd/internal/obj: fix inline marker issue on s390x" This reverts CL 247697. Reason for revert: This change broke the linux-arm builder. Change-Id: I8ca0d5b3b2ea0109ffbfadeab1406a1b60e7d18d Reviewed-on: https://go-review.googlesource.com/c/go/+/248718 Reviewed-by: Michael Munday Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot --- src/cmd/internal/obj/pcln.go | 15 --------------- src/cmd/internal/obj/s390x/objz.go | 11 +++++++++++ 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/cmd/internal/obj/pcln.go b/src/cmd/internal/obj/pcln.go index bffeda041d..1f7ccf47ef 100644 --- a/src/cmd/internal/obj/pcln.go +++ b/src/cmd/internal/obj/pcln.go @@ -278,21 +278,6 @@ func linkpcln(ctxt *Link, cursym *LSym) { funcpctab(ctxt, &pcln.Pcfile, cursym, "pctofile", pctofileline, pcln) funcpctab(ctxt, &pcln.Pcline, cursym, "pctoline", pctofileline, nil) - // Check that all the Progs used as inline markers are still reachable. - // See issue #40473. - inlMarkProgs := make(map[*Prog]struct{}, len(cursym.Func.InlMarks)) - for _, inlMark := range cursym.Func.InlMarks { - inlMarkProgs[inlMark.p] = struct{}{} - } - for p := cursym.Func.Text; p != nil; p = p.Link { - if _, ok := inlMarkProgs[p]; ok { - delete(inlMarkProgs, p) - } - } - if len(inlMarkProgs) > 0 { - ctxt.Diag("one or more instructions used as inline markers are no longer reachable") - } - pcinlineState := new(pcinlineState) funcpctab(ctxt, &pcln.Pcinline, cursym, "pctoinline", pcinlineState.pctoinline, nil) for _, inlMark := range cursym.Func.InlMarks { diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go index ef6335d849..b14dc810fa 100644 --- a/src/cmd/internal/obj/s390x/objz.go +++ b/src/cmd/internal/obj/s390x/objz.go @@ -283,6 +283,17 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ACMPUBNE: q = p p.Mark |= BRANCH + if p.Pcond != nil { + q := p.Pcond + for q.As == obj.ANOP { + q = q.Link + p.Pcond = q + } + } + + case obj.ANOP: + q.Link = p.Link /* q is non-nop */ + p.Link.Mark |= p.Mark default: q = p -- GitLab From 7ee26224436d80dca3f7e98c8fcf21185522d8e6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 12 Aug 2020 20:27:57 -0400 Subject: [PATCH 0212/1792] cmd/link: link dynamic library automatically cgo_import_dynamic pragma indicates a symbol is imported from a dynamic library. Currently, the linker does not actually link against the dynamic library, so we have to "force" it by using //go:cgo_import_dynamic _ _ "dylib" syntax, which links in the library unconditionally. This CL changes it to link in the library automatically when a symbol is imported from the library, without using the "force" syntax. (The "force" syntax is still supported.) Remove the unconditional imports in the runtime. Now, Security.framework and CoreFoundation.framework are only linked when the x509 package is imported (or otherwise specified). Fixes #40727. Change-Id: Ied36b1f621cdcc5dc4a8f497cdf1c554a182d0e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/248333 Run-TryBot: Cherry Zhang Reviewed-by: Filippo Valsorda Reviewed-by: Than McIntosh Reviewed-by: Keith Randall TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/go.go | 3 +++ src/runtime/sys_darwin.go | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/cmd/link/internal/ld/go.go b/src/cmd/link/internal/ld/go.go index bf5c9ca1ba..b3541c46c0 100644 --- a/src/cmd/link/internal/ld/go.go +++ b/src/cmd/link/internal/ld/go.go @@ -183,6 +183,9 @@ func setCgoAttr(ctxt *Link, lookup func(string, int) loader.Sym, file string, pk hostObjSyms[s] = struct{}{} } havedynamic = 1 + if lib != "" && ctxt.IsDarwin() { + machoadddynlib(lib, ctxt.LinkMode) + } } continue diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go index 06474434c9..e4f19bbf41 100644 --- a/src/runtime/sys_darwin.go +++ b/src/runtime/sys_darwin.go @@ -489,9 +489,3 @@ func setNonblock(fd int32) { //go:cgo_import_dynamic libc_pthread_cond_wait pthread_cond_wait "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_pthread_cond_timedwait_relative_np pthread_cond_timedwait_relative_np "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_pthread_cond_signal pthread_cond_signal "/usr/lib/libSystem.B.dylib" - -// Magic incantation to get libSystem and friends actually dynamically linked. -// TODO: Why does the code require this? See cmd/link/internal/ld/go.go -//go:cgo_import_dynamic _ _ "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic _ _ "/System/Library/Frameworks/Security.framework/Versions/A/Security" -//go:cgo_import_dynamic _ _ "/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation" -- GitLab From a2a2237ae02016dd9ce16388963cfceece6744f3 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 13 Aug 2020 16:59:52 -0400 Subject: [PATCH 0213/1792] cmd/link: emit correct jump instruction on ARM for DYNIMPORT On ARM, for a JMP/CALL relocation, the instruction bytes is encoded in Reloc.Add (issue #19811). I really hate it, but before it is fixed we have to follow the rule and emit the right bits from r.Add. Fixes #40769. Change-Id: I862e105408d344c5cc58ca9140d2e552e4364453 Reviewed-on: https://go-review.googlesource.com/c/go/+/248399 Reviewed-by: Jeremy Faller Reviewed-by: Joel Sing Reviewed-by: Than McIntosh --- src/cmd/link/internal/arm/asm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 22bcb518df..611c96ce35 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -220,7 +220,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade addpltsym(target, ldr, syms, targ) su := ldr.MakeSymbolUpdater(s) su.SetRelocSym(rIdx, syms.PLT) - su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) + su.SetRelocAdd(rIdx, int64(braddoff(int32(r.Add()), ldr.SymPlt(targ)/4))) // TODO: don't use r.Add for instruction bytes (issue 19811) return true case objabi.R_ADDR: -- GitLab From abfeec5eb0356d1ac91a097d2124a6b7c8cfccd4 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Sun, 16 Aug 2020 21:58:40 +0000 Subject: [PATCH 0214/1792] testing/iotest: add ErrReader Adds an io.Reader that always returns 0 and a non-nil error. Fixes #38781 Change-Id: I56bd124de07bc8809e77c6cfaab33a1e32cfe2ee GitHub-Last-Rev: 4e232b17e9120405d4ea4743350ee361a3505043 GitHub-Pull-Request: golang/go#34741 Reviewed-on: https://go-review.googlesource.com/c/go/+/199501 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/testing/iotest/logger_test.go | 12 ++---------- src/testing/iotest/reader.go | 15 +++++++++++++++ src/testing/iotest/reader_test.go | 10 ++++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/testing/iotest/logger_test.go b/src/testing/iotest/logger_test.go index c121bf48f7..575f37e05c 100644 --- a/src/testing/iotest/logger_test.go +++ b/src/testing/iotest/logger_test.go @@ -81,14 +81,6 @@ func TestWriteLogger_errorOnWrite(t *testing.T) { } } -type errReader struct { - err error -} - -func (r errReader) Read([]byte) (int, error) { - return 0, r.err -} - func TestReadLogger(t *testing.T) { olw := log.Writer() olf := log.Flags() @@ -146,14 +138,14 @@ func TestReadLogger_errorOnRead(t *testing.T) { data := []byte("Hello, World!") p := make([]byte, len(data)) - lr := errReader{err: errors.New("Read Error!")} + lr := ErrReader() rl := NewReadLogger("read", lr) n, err := rl.Read(p) if err == nil { t.Fatalf("Unexpectedly succeeded to read: %v", err) } - wantLogWithHex := fmt.Sprintf("lr: read %x: %v\n", p[:n], "Read Error!") + wantLogWithHex := fmt.Sprintf("lr: read %x: %v\n", p[:n], "io") if g, w := lOut.String(), wantLogWithHex; g != w { t.Errorf("ReadLogger mismatch\n\tgot: %q\n\twant: %q", g, w) } diff --git a/src/testing/iotest/reader.go b/src/testing/iotest/reader.go index 8d82018fd6..b18e912f27 100644 --- a/src/testing/iotest/reader.go +++ b/src/testing/iotest/reader.go @@ -68,6 +68,7 @@ func (r *dataErrReader) Read(p []byte) (n int, err error) { return } +// ErrTimeout is a fake timeout error. var ErrTimeout = errors.New("timeout") // TimeoutReader returns ErrTimeout on the second read @@ -86,3 +87,17 @@ func (r *timeoutReader) Read(p []byte) (int, error) { } return r.r.Read(p) } + +// ErrIO is a fake IO error. +var ErrIO = errors.New("io") + +// ErrReader returns a fake error every time it is read from. +func ErrReader() io.Reader { + return errReader(0) +} + +type errReader int + +func (r errReader) Read(p []byte) (int, error) { + return 0, ErrIO +} diff --git a/src/testing/iotest/reader_test.go b/src/testing/iotest/reader_test.go index 9397837e08..ccba22ee29 100644 --- a/src/testing/iotest/reader_test.go +++ b/src/testing/iotest/reader_test.go @@ -224,3 +224,13 @@ func TestDataErrReader_emptyReader(t *testing.T) { t.Errorf("Unexpectedly read %d bytes, wanted %d", g, w) } } + +func TestErrReader(t *testing.T) { + n, err := ErrReader().Read([]byte{}) + if err != ErrIO { + t.Errorf("ErrReader.Read(any) should have returned ErrIO, returned %v", err) + } + if n != 0 { + t.Errorf("ErrReader.Read(any) should have read 0 bytes, read %v", n) + } +} -- GitLab From 49003da6d437ef1a4e1e55cf86240480f17dc8ab Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 17 Jun 2020 17:40:35 -0400 Subject: [PATCH 0215/1792] cmd/go/internal/trace: add function to distinguish goroutines trace.StartGoroutine will associate the trace information on the context with a new chrome profiler thread id. The chrome profiler doesn't expect multiple trace events to have the same thread id, so this will allow us to display concurrent events on the trace. Updates #38714 Change-Id: I888b0cce15a5a01db66366716fdd85bf86c832cd Reviewed-on: https://go-review.googlesource.com/c/go/+/248319 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/trace/trace.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/cmd/go/internal/trace/trace.go b/src/cmd/go/internal/trace/trace.go index c8fac92c9f..32ce0408f5 100644 --- a/src/cmd/go/internal/trace/trace.go +++ b/src/cmd/go/internal/trace/trace.go @@ -34,20 +34,33 @@ func StartSpan(ctx context.Context, name string) (context.Context, *Span) { if !ok { return ctx, nil } - childSpan := &Span{t: tc.t, name: name, start: time.Now()} + childSpan := &Span{t: tc.t, name: name, tid: tc.tid, start: time.Now()} tc.t.writeEvent(&traceviewer.Event{ Name: childSpan.name, Time: float64(childSpan.start.UnixNano()) / float64(time.Microsecond), + TID: childSpan.tid, Phase: "B", }) - ctx = context.WithValue(ctx, traceKey{}, traceContext{tc.t}) + ctx = context.WithValue(ctx, traceKey{}, traceContext{tc.t, tc.tid}) return ctx, childSpan } +// Goroutine associates the context with a new Thread ID. The Chrome trace viewer associates each +// trace event with a thread, and doesn't expect events with the same thread id to happen at the +// same time. +func Goroutine(ctx context.Context) context.Context { + tc, ok := getTraceContext(ctx) + if !ok { + return ctx + } + return context.WithValue(ctx, traceKey{}, traceContext{tc.t, tc.t.getNextTID()}) +} + type Span struct { t *tracer name string + tid uint64 start time.Time end time.Time } @@ -60,12 +73,15 @@ func (s *Span) Done() { s.t.writeEvent(&traceviewer.Event{ Name: s.name, Time: float64(s.end.UnixNano()) / float64(time.Microsecond), + TID: s.tid, Phase: "E", }) } type tracer struct { file chan traceFile // 1-buffered + + nextTID uint64 } func (t *tracer) writeEvent(ev *traceviewer.Event) error { @@ -103,12 +119,17 @@ func (t *tracer) Close() error { return firstErr } +func (t *tracer) getNextTID() uint64 { + return atomic.AddUint64(&t.nextTID, 1) +} + // traceKey is the context key for tracing information. It is unexported to prevent collisions with context keys defined in // other packages. type traceKey struct{} type traceContext struct { - t *tracer + t *tracer + tid uint64 } // Start starts a trace which writes to the given file. -- GitLab From 023d4973851a25e2a47b1ebaf96833c9209efd7c Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 17 Jun 2020 18:05:16 -0400 Subject: [PATCH 0216/1792] cmd/go: add trace events for each action This change adds a trace event for each action and also annotates each of the action execution goroutines with trace.Goroutine so that the actions eaxecuted by each goroutine appear on different threads in the chrome trace viewer. Updates #38714 Change-Id: I2e58dc5606b2e3f7f87076a61e1cc6a2014255c5 Reviewed-on: https://go-review.googlesource.com/c/go/+/248320 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/trace/trace.go | 4 ++-- src/cmd/go/internal/work/exec.go | 13 +++++++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/cmd/go/internal/trace/trace.go b/src/cmd/go/internal/trace/trace.go index 32ce0408f5..24130d9d72 100644 --- a/src/cmd/go/internal/trace/trace.go +++ b/src/cmd/go/internal/trace/trace.go @@ -45,10 +45,10 @@ func StartSpan(ctx context.Context, name string) (context.Context, *Span) { return ctx, childSpan } -// Goroutine associates the context with a new Thread ID. The Chrome trace viewer associates each +// StartGoroutine associates the context with a new Thread ID. The Chrome trace viewer associates each // trace event with a thread, and doesn't expect events with the same thread id to happen at the // same time. -func Goroutine(ctx context.Context) context.Context { +func StartGoroutine(ctx context.Context) context.Context { tc, ok := getTraceContext(ctx) if !ok { return ctx diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 3ea3293ae1..56a127f36f 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -115,13 +115,21 @@ func (b *Builder) Do(ctx context.Context, root *Action) { // Handle runs a single action and takes care of triggering // any actions that are runnable as a result. - handle := func(a *Action) { + handle := func(ctx context.Context, a *Action) { if a.json != nil { a.json.TimeStart = time.Now() } var err error if a.Func != nil && (!a.Failed || a.IgnoreFail) { + // TODO(matloob): Better action descriptions + desc := "Executing action " + if a.Package != nil { + desc += "(" + a.Mode + " " + a.Package.Desc() + ")" + } + ctx, span := trace.StartSpan(ctx, desc) + _ = ctx err = a.Func(b, a) + span.Done() } if a.json != nil { a.json.TimeDone = time.Now() @@ -169,6 +177,7 @@ func (b *Builder) Do(ctx context.Context, root *Action) { for i := 0; i < par; i++ { wg.Add(1) go func() { + ctx := trace.StartGoroutine(ctx) defer wg.Done() for { select { @@ -181,7 +190,7 @@ func (b *Builder) Do(ctx context.Context, root *Action) { b.exec.Lock() a := b.ready.pop() b.exec.Unlock() - handle(a) + handle(ctx, a) case <-base.Interrupted: base.SetExitStatus(1) return -- GitLab From a26d687ebb23fa14b777ef5bf69b56556124ff3b Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 17 Jun 2020 18:18:23 -0400 Subject: [PATCH 0217/1792] cmd/go: propagate context into Action.Func calls Action.Func is now a func(*Builder, context.Context, *Action), so that contexts can be propagated into the action funcs. While context is traditionally the first parameter of a function, it's the second parameter of Action.Func's type to continue to allow for methods on Builder to be used as functions taking a *Builder as the first parameter. context.Context is instead the first parameter on those functions. Change-Id: I5f058d6a99a1e96fe2025f2e8ce30a033d12e935 Reviewed-on: https://go-review.googlesource.com/c/go/+/248321 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/run/run.go | 2 +- src/cmd/go/internal/test/test.go | 10 +++++----- src/cmd/go/internal/work/action.go | 15 ++++++++------- src/cmd/go/internal/work/exec.go | 17 ++++++++--------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index 3630f68c54..deec5106ff 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -146,7 +146,7 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) { // buildRunProgram is the action for running a binary that has already // been compiled. We ignore exit status. -func buildRunProgram(b *work.Builder, a *work.Action) error { +func buildRunProgram(b *work.Builder, ctx context.Context, a *work.Action) error { cmdline := str.StringList(work.FindExecCmd(), a.Deps[0].Target, a.Args) if cfg.BuildN || cfg.BuildX { b.Showcmd("", "%s", strings.Join(cmdline, " ")) diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index d71d339828..9788590938 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -1069,7 +1069,7 @@ func (lockedStdout) Write(b []byte) (int, error) { } // builderRunTest is the action for running a test binary. -func (c *runCache) builderRunTest(b *work.Builder, a *work.Action) error { +func (c *runCache) builderRunTest(b *work.Builder, ctx context.Context, a *work.Action) error { if a.Failed { // We were unable to build the binary. a.Failed = false @@ -1642,7 +1642,7 @@ func coveragePercentage(out []byte) string { } // builderCleanTest is the action for cleaning up after a test. -func builderCleanTest(b *work.Builder, a *work.Action) error { +func builderCleanTest(b *work.Builder, ctx context.Context, a *work.Action) error { if cfg.BuildWork { return nil } @@ -1654,7 +1654,7 @@ func builderCleanTest(b *work.Builder, a *work.Action) error { } // builderPrintTest is the action for printing a test result. -func builderPrintTest(b *work.Builder, a *work.Action) error { +func builderPrintTest(b *work.Builder, ctx context.Context, a *work.Action) error { clean := a.Deps[0] run := clean.Deps[0] if run.TestOutput != nil { @@ -1665,7 +1665,7 @@ func builderPrintTest(b *work.Builder, a *work.Action) error { } // builderNoTest is the action for testing a package with no test files. -func builderNoTest(b *work.Builder, a *work.Action) error { +func builderNoTest(b *work.Builder, ctx context.Context, a *work.Action) error { var stdout io.Writer = os.Stdout if testJSON { json := test2json.NewConverter(lockedStdout{}, a.Package.ImportPath, test2json.Timestamp) @@ -1677,7 +1677,7 @@ func builderNoTest(b *work.Builder, a *work.Action) error { } // printExitStatus is the action for printing the exit status -func printExitStatus(b *work.Builder, a *work.Action) error { +func printExitStatus(b *work.Builder, ctx context.Context, a *work.Action) error { if !testJSON && len(pkgArgs) != 0 { if base.GetExitStatus() != 0 { fmt.Println("FAIL") diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index 6b5f9e4807..a37a5e618d 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -10,6 +10,7 @@ import ( "bufio" "bytes" "container/heap" + "context" "debug/elf" "encoding/json" "fmt" @@ -63,13 +64,13 @@ type Builder struct { // An Action represents a single action in the action graph. type Action struct { - Mode string // description of action operation - Package *load.Package // the package this action works on - Deps []*Action // actions that must happen before this one - Func func(*Builder, *Action) error // the action itself (nil = no-op) - IgnoreFail bool // whether to run f even if dependencies fail - TestOutput *bytes.Buffer // test output buffer - Args []string // additional args for runProgram + Mode string // description of action operation + Package *load.Package // the package this action works on + Deps []*Action // actions that must happen before this one + Func func(*Builder, context.Context, *Action) error // the action itself (nil = no-op) + IgnoreFail bool // whether to run f even if dependencies fail + TestOutput *bytes.Buffer // test output buffer + Args []string // additional args for runProgram triggers []*Action // inverse of deps diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 56a127f36f..3903502a67 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -127,8 +127,7 @@ func (b *Builder) Do(ctx context.Context, root *Action) { desc += "(" + a.Mode + " " + a.Package.Desc() + ")" } ctx, span := trace.StartSpan(ctx, desc) - _ = ctx - err = a.Func(b, a) + err = a.Func(b, ctx, a) span.Done() } if a.json != nil { @@ -400,7 +399,7 @@ const ( // build is the action for building a single package. // Note that any new influence on this logic must be reported in b.buildActionID above as well. -func (b *Builder) build(a *Action) (err error) { +func (b *Builder) build(ctx context.Context, a *Action) (err error) { p := a.Package bit := func(x uint32, b bool) uint32 { @@ -1005,7 +1004,7 @@ var VetFlags []string // VetExplicit records whether the vet flags were set explicitly on the command line. var VetExplicit bool -func (b *Builder) vet(a *Action) error { +func (b *Builder) vet(ctx context.Context, a *Action) error { // a.Deps[0] is the build of the package being vetted. // a.Deps[1] is the build of the "fmt" package. @@ -1196,7 +1195,7 @@ func (b *Builder) printLinkerConfig(h io.Writer, p *load.Package) { // link is the action for linking a single command. // Note that any new influence on this logic must be reported in b.linkActionID above as well. -func (b *Builder) link(a *Action) (err error) { +func (b *Builder) link(ctx context.Context, a *Action) (err error) { if b.useCache(a, b.linkActionID(a), a.Package.Target) || b.IsCmdList { return nil } @@ -1388,7 +1387,7 @@ func (b *Builder) getPkgConfigFlags(p *load.Package) (cflags, ldflags []string, return } -func (b *Builder) installShlibname(a *Action) error { +func (b *Builder) installShlibname(ctx context.Context, a *Action) error { if err := allowInstall(a); err != nil { return err } @@ -1437,7 +1436,7 @@ func (b *Builder) linkSharedActionID(a *Action) cache.ActionID { return h.Sum() } -func (b *Builder) linkShared(a *Action) (err error) { +func (b *Builder) linkShared(ctx context.Context, a *Action) (err error) { if b.useCache(a, b.linkSharedActionID(a), a.Target) || b.IsCmdList { return nil } @@ -1463,7 +1462,7 @@ func (b *Builder) linkShared(a *Action) (err error) { } // BuildInstallFunc is the action for installing a single package or executable. -func BuildInstallFunc(b *Builder, a *Action) (err error) { +func BuildInstallFunc(b *Builder, ctx context.Context, a *Action) (err error) { defer func() { if err != nil && err != errPrintedOutput { // a.Package == nil is possible for the go install -buildmode=shared @@ -1716,7 +1715,7 @@ func (b *Builder) writeFile(file string, text []byte) error { } // Install the cgo export header file, if there is one. -func (b *Builder) installHeader(a *Action) error { +func (b *Builder) installHeader(ctx context.Context, a *Action) error { src := a.Objdir + "_cgo_install.h" if _, err := os.Stat(src); os.IsNotExist(err) { // If the file does not exist, there are no exported -- GitLab From 15b98e55d195bd876203506d5f513546dd4e3b36 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Thu, 18 Jun 2020 11:58:46 -0400 Subject: [PATCH 0218/1792] cmd/go: mark trace flows between actions This could help make it easier to identify blocking dependencies when examining traces. Flows can be turned off when viewing traces to remove potential distractions. Updates #38714 Change-Id: Ibfd3f1a1861e3cac31addb053a2fca7ee796c4d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/248322 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/trace/trace.go | 51 ++++++++++++++++++++++++++++-- src/cmd/go/internal/work/action.go | 10 +++--- src/cmd/go/internal/work/exec.go | 4 +++ 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/cmd/go/internal/trace/trace.go b/src/cmd/go/internal/trace/trace.go index 24130d9d72..f108a2b6ca 100644 --- a/src/cmd/go/internal/trace/trace.go +++ b/src/cmd/go/internal/trace/trace.go @@ -15,6 +15,18 @@ import ( "time" ) +// Constants used in event fields. +// See https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU +// for more details. +const ( + phaseDurationBegin = "B" + phaseDurationEnd = "E" + phaseFlowStart = "s" + phaseFlowEnd = "f" + + bindEnclosingSlice = "e" +) + var traceStarted int32 func getTraceContext(ctx context.Context) (traceContext, bool) { @@ -39,7 +51,7 @@ func StartSpan(ctx context.Context, name string) (context.Context, *Span) { Name: childSpan.name, Time: float64(childSpan.start.UnixNano()) / float64(time.Microsecond), TID: childSpan.tid, - Phase: "B", + Phase: phaseDurationBegin, }) ctx = context.WithValue(ctx, traceKey{}, traceContext{tc.t, tc.tid}) return ctx, childSpan @@ -56,6 +68,34 @@ func StartGoroutine(ctx context.Context) context.Context { return context.WithValue(ctx, traceKey{}, traceContext{tc.t, tc.t.getNextTID()}) } +// Flow marks a flow indicating that the 'to' span depends on the 'from' span. +// Flow should be called while the 'to' span is in progress. +func Flow(ctx context.Context, from *Span, to *Span) { + tc, ok := getTraceContext(ctx) + if !ok || from == nil || to == nil { + return + } + + id := tc.t.getNextFlowID() + tc.t.writeEvent(&traceviewer.Event{ + Name: from.name + " -> " + to.name, + Category: "flow", + ID: id, + Time: float64(from.end.UnixNano()) / float64(time.Microsecond), + Phase: phaseFlowStart, + TID: from.tid, + }) + tc.t.writeEvent(&traceviewer.Event{ + Name: from.name + " -> " + to.name, + Category: "flow", // TODO(matloob): Add Category to Flow? + ID: id, + Time: float64(to.start.UnixNano()) / float64(time.Microsecond), + Phase: phaseFlowEnd, + TID: to.tid, + BindPoint: bindEnclosingSlice, + }) +} + type Span struct { t *tracer @@ -74,14 +114,15 @@ func (s *Span) Done() { Name: s.name, Time: float64(s.end.UnixNano()) / float64(time.Microsecond), TID: s.tid, - Phase: "E", + Phase: phaseDurationEnd, }) } type tracer struct { file chan traceFile // 1-buffered - nextTID uint64 + nextTID uint64 + nextFlowID uint64 } func (t *tracer) writeEvent(ev *traceviewer.Event) error { @@ -123,6 +164,10 @@ func (t *tracer) getNextTID() uint64 { return atomic.AddUint64(&t.nextTID, 1) } +func (t *tracer) getNextFlowID() uint64 { + return atomic.AddUint64(&t.nextFlowID, 1) +} + // traceKey is the context key for tracing information. It is unexported to prevent collisions with context keys defined in // other packages. type traceKey struct{} diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index a37a5e618d..825e763c03 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -26,6 +26,7 @@ import ( "cmd/go/internal/cache" "cmd/go/internal/cfg" "cmd/go/internal/load" + "cmd/go/internal/trace" "cmd/internal/buildid" ) @@ -92,10 +93,11 @@ type Action struct { output []byte // output redirect buffer (nil means use b.Print) // Execution state. - pending int // number of deps yet to complete - priority int // relative execution priority - Failed bool // whether the action failed - json *actionJSON // action graph information + pending int // number of deps yet to complete + priority int // relative execution priority + Failed bool // whether the action failed + json *actionJSON // action graph information + traceSpan *trace.Span } // BuildActionID returns the action ID section of a's build ID. diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 3903502a67..681ecd7646 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -127,6 +127,10 @@ func (b *Builder) Do(ctx context.Context, root *Action) { desc += "(" + a.Mode + " " + a.Package.Desc() + ")" } ctx, span := trace.StartSpan(ctx, desc) + a.traceSpan = span + for _, d := range a.Deps { + trace.Flow(ctx, d.traceSpan, a.traceSpan) + } err = a.Func(b, ctx, a) span.Done() } -- GitLab From 38fea3a4ec97fbcfad1f2d329f3a12c53cc36301 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Mon, 22 Jun 2020 18:39:10 -0400 Subject: [PATCH 0219/1792] cmd/go: add tracing instrumentation to load.TestPackagesFor This change adds tracing instrumentation into load.TestPackagesFor, propagating context through its callers. Updates #38714 Change-Id: I80fefaf3116ccccffaa8bb7613a656bda867394c Reviewed-on: https://go-review.googlesource.com/c/go/+/248323 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/list/list.go | 4 ++-- src/cmd/go/internal/load/test.go | 14 ++++++++++---- src/cmd/go/internal/test/test.go | 6 +++--- src/cmd/go/internal/vet/vet.go | 2 +- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 3ec243a759..7747e730ae 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -477,9 +477,9 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { var pmain, ptest, pxtest *load.Package var err error if *listE { - pmain, ptest, pxtest = load.TestPackagesAndErrors(p, nil) + pmain, ptest, pxtest = load.TestPackagesAndErrors(ctx, p, nil) } else { - pmain, ptest, pxtest, err = load.TestPackagesFor(p, nil) + pmain, ptest, pxtest, err = load.TestPackagesFor(ctx, p, nil) if err != nil { base.Errorf("can't load test package: %s", err) } diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index 6d251e8358..6db8a00245 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -6,7 +6,7 @@ package load import ( "bytes" - "cmd/go/internal/str" + "context" "errors" "fmt" "go/ast" @@ -20,6 +20,9 @@ import ( "strings" "unicode" "unicode/utf8" + + "cmd/go/internal/str" + "cmd/go/internal/trace" ) var TestMainDeps = []string{ @@ -42,8 +45,8 @@ type TestCover struct { // TestPackagesFor is like TestPackagesAndErrors but it returns // an error if the test packages or their dependencies have errors. // Only test packages without errors are returned. -func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) { - pmain, ptest, pxtest = TestPackagesAndErrors(p, cover) +func TestPackagesFor(ctx context.Context, p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) { + pmain, ptest, pxtest = TestPackagesAndErrors(ctx, p, cover) for _, p1 := range []*Package{ptest, pxtest, pmain} { if p1 == nil { // pxtest may be nil @@ -89,7 +92,10 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag // // 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(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package) { +func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (pmain, ptest, pxtest *Package) { + ctx, span := trace.StartSpan(ctx, "load.TestPackagesAndErrors") + defer span.Done() + pre := newPreload() defer pre.flush() allImports := append([]string{}, p.TestImports...) diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 9788590938..cda51053fb 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -746,7 +746,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { ensureImport(p, "sync/atomic") } - buildTest, runTest, printTest, err := builderTest(&b, p) + buildTest, runTest, printTest, err := builderTest(&b, ctx, p) if err != nil { str := err.Error() str = strings.TrimPrefix(str, "\n") @@ -813,7 +813,7 @@ var windowsBadWords = []string{ "update", } -func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, printAction *work.Action, err error) { +func builderTest(b *work.Builder, ctx context.Context, p *load.Package) (buildAction, runAction, printAction *work.Action, err error) { if len(p.TestGoFiles)+len(p.XTestGoFiles) == 0 { build := b.CompileAction(work.ModeBuild, work.ModeBuild, p) run := &work.Action{Mode: "test run", Package: p, Deps: []*work.Action{build}} @@ -836,7 +836,7 @@ func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, prin DeclVars: declareCoverVars, } } - pmain, ptest, pxtest, err := load.TestPackagesFor(p, cover) + pmain, ptest, pxtest, err := load.TestPackagesFor(ctx, p, cover) if err != nil { return nil, nil, nil, err } diff --git a/src/cmd/go/internal/vet/vet.go b/src/cmd/go/internal/vet/vet.go index 58f392eb96..b306572281 100644 --- a/src/cmd/go/internal/vet/vet.go +++ b/src/cmd/go/internal/vet/vet.go @@ -77,7 +77,7 @@ func runVet(ctx context.Context, cmd *base.Command, args []string) { root := &work.Action{Mode: "go vet"} for _, p := range pkgs { - _, ptest, pxtest, err := load.TestPackagesFor(p, nil) + _, ptest, pxtest, err := load.TestPackagesFor(ctx, p, nil) if err != nil { base.Errorf("%v", err) continue -- GitLab From ebccba7954fe9507df993dda7ba78fa34e030390 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Mon, 22 Jun 2020 19:02:00 -0400 Subject: [PATCH 0220/1792] cmd/go: process -debug-trace flag for cmd/test and cmd/vet These commands are build-like commands that do their own flag processing, so the value of debug-trace isn't available until the command starts running. Start tracing in the cmd's run function. Updates #38714 Change-Id: I4d633e6ee907bf09feac52c2aff3daceb9b20e12 Reviewed-on: https://go-review.googlesource.com/c/go/+/248324 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/test/test.go | 18 ++++++++++++++++++ src/cmd/go/internal/vet/vet.go | 25 +++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index cda51053fb..9c120e08dc 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -31,6 +31,7 @@ import ( "cmd/go/internal/lockedfile" "cmd/go/internal/modload" "cmd/go/internal/str" + "cmd/go/internal/trace" "cmd/go/internal/work" "cmd/internal/test2json" ) @@ -571,6 +572,23 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { pkgArgs, testArgs = testFlags(args) + if cfg.DebugTrace != "" { + var close func() error + var err error + ctx, close, err = trace.Start(ctx, cfg.DebugTrace) + if err != nil { + base.Fatalf("failed to start trace: %v", err) + } + defer func() { + if err := close(); err != nil { + base.Fatalf("failed to stop trace: %v", err) + } + }() + } + + ctx, span := trace.StartSpan(ctx, fmt.Sprint("Running ", cmd.Name(), " command")) + defer span.Done() + work.FindExecCmd() // initialize cached result work.BuildInit() diff --git a/src/cmd/go/internal/vet/vet.go b/src/cmd/go/internal/vet/vet.go index b306572281..cf2c8d59e8 100644 --- a/src/cmd/go/internal/vet/vet.go +++ b/src/cmd/go/internal/vet/vet.go @@ -6,12 +6,16 @@ package vet import ( + "context" + "fmt" + "path/filepath" + "cmd/go/internal/base" + "cmd/go/internal/cfg" "cmd/go/internal/load" "cmd/go/internal/modload" + "cmd/go/internal/trace" "cmd/go/internal/work" - "context" - "path/filepath" ) // Break init loop. @@ -54,6 +58,23 @@ func runVet(ctx context.Context, cmd *base.Command, args []string) { vetFlags, pkgArgs := vetFlags(args) + if cfg.DebugTrace != "" { + var close func() error + var err error + ctx, close, err = trace.Start(ctx, cfg.DebugTrace) + if err != nil { + base.Fatalf("failed to start trace: %v", err) + } + defer func() { + if err := close(); err != nil { + base.Fatalf("failed to stop trace: %v", err) + } + }() + } + + ctx, span := trace.StartSpan(ctx, fmt.Sprint("Running ", cmd.Name(), " command")) + defer span.Done() + work.BuildInit() work.VetFlags = vetFlags if len(vetFlags) > 0 { -- GitLab From 2ac4bf3802f0786a0afb09488173507f40d5d885 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 24 Jun 2020 15:58:47 -0400 Subject: [PATCH 0221/1792] cmd/go: add span for modload.LoadBuildList This change adds context, and a span to modload.LoadBuildList and propagates context into modload.BuildList. It's the start of a run of CLs to add trace spans for module operations. Updates #38714 Change-Id: I0d58dd394051526338092dc9a5ec29a9e087e4e4 Reviewed-on: https://go-review.googlesource.com/c/go/+/248325 Run-TryBot: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/list/list.go | 4 ++-- src/cmd/go/internal/modcmd/download.go | 2 +- src/cmd/go/internal/modcmd/graph.go | 2 +- src/cmd/go/internal/modcmd/verify.go | 2 +- src/cmd/go/internal/modcmd/why.go | 2 +- src/cmd/go/internal/modget/get.go | 8 ++++---- src/cmd/go/internal/modload/list.go | 9 +++++---- src/cmd/go/internal/modload/load.go | 23 ++++++++++++++--------- 8 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 7747e730ae..7303e6c866 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -413,9 +413,9 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { } } - modload.LoadBuildList() + modload.LoadBuildList(ctx) - mods := modload.ListModules(args, *listU, *listVersions) + mods := modload.ListModules(ctx, args, *listU, *listVersions) if !*listE { for _, m := range mods { if m.Error != nil { diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index b43c32be5a..946e8ed3cf 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -106,7 +106,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { var work par.Work listU := false listVersions := false - for _, info := range modload.ListModules(args, listU, listVersions) { + for _, info := range modload.ListModules(ctx, args, listU, listVersions) { if info.Replace != nil { info = info.Replace } diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index fff5b02626..4853503fd4 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -49,7 +49,7 @@ func runGraph(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go: cannot find main module; see 'go help modules'") } } - modload.LoadBuildList() + modload.LoadBuildList(ctx) reqs := modload.MinReqs() format := func(m module.Version) string { diff --git a/src/cmd/go/internal/modcmd/verify.go b/src/cmd/go/internal/modcmd/verify.go index 570e571049..73ab714d10 100644 --- a/src/cmd/go/internal/modcmd/verify.go +++ b/src/cmd/go/internal/modcmd/verify.go @@ -60,7 +60,7 @@ func runVerify(ctx context.Context, cmd *base.Command, args []string) { sem := make(chan token, runtime.GOMAXPROCS(0)) // Use a slice of result channels, so that the output is deterministic. - mods := modload.LoadBuildList()[1:] + mods := modload.LoadBuildList(ctx)[1:] errsChans := make([]<-chan []error, len(mods)) for i, mod := range mods { diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index 3f9cf0f120..f400339b25 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -74,7 +74,7 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go mod why: module query not allowed") } } - mods := modload.ListModules(args, listU, listVersions) + mods := modload.ListModules(ctx, args, listU, listVersions) byModule := make(map[module.Version][]string) for _, path := range loadALL() { m := modload.PackageModule(path) diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index b217196931..93a6bb54d5 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -278,7 +278,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { } modload.LoadTests = *getT - buildList := modload.LoadBuildList() + buildList := modload.LoadBuildList(ctx) buildList = buildList[:len(buildList):len(buildList)] // copy on append versionByPath := make(map[string]string) for _, m := range buildList { @@ -444,7 +444,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // packages in unknown modules can't be expanded. This also avoids looking // up new modules while loading packages, only to downgrade later. queryCache := make(map[querySpec]*query) - byPath := runQueries(queryCache, queries, nil) + byPath := runQueries(ctx, queryCache, queries, nil) // Add missing modules to the build list. // We call SetBuildList here and elsewhere, since newUpgrader, @@ -586,7 +586,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // Query target versions for modules providing packages matched by // command line arguments. - byPath = runQueries(queryCache, queries, modOnly) + byPath = runQueries(ctx, queryCache, queries, modOnly) // Handle upgrades. This is needed for arguments that didn't match // modules or matched different modules from a previous iteration. It @@ -724,7 +724,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // versions (including earlier queries in the modOnly map), an error will be // reported. A map from module paths to queries is returned, which includes // queries and modOnly. -func runQueries(cache map[querySpec]*query, queries []*query, modOnly map[string]*query) map[string]*query { +func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*query, modOnly map[string]*query) map[string]*query { var lookup par.Work for _, q := range queries { if cached := cache[q.querySpec]; cached != nil { diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 9400793bcb..4768516e90 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -5,6 +5,7 @@ package modload import ( + "context" "errors" "fmt" "os" @@ -19,8 +20,8 @@ import ( "golang.org/x/mod/module" ) -func ListModules(args []string, listU, listVersions bool) []*modinfo.ModulePublic { - mods := listModules(args, listVersions) +func ListModules(ctx context.Context, args []string, listU, listVersions bool) []*modinfo.ModulePublic { + mods := listModules(ctx, args, listVersions) if listU || listVersions { var work par.Work for _, m := range mods { @@ -42,8 +43,8 @@ func ListModules(args []string, listU, listVersions bool) []*modinfo.ModulePubli return mods } -func listModules(args []string, listVersions bool) []*modinfo.ModulePublic { - LoadBuildList() +func listModules(ctx context.Context, args []string, listVersions bool) []*modinfo.ModulePublic { + LoadBuildList(ctx) if len(args) == 0 { return []*modinfo.ModulePublic{moduleInfo(buildList[0], true)} } diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 30992e0cc2..8190009b23 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -6,14 +6,7 @@ package modload import ( "bytes" - "cmd/go/internal/base" - "cmd/go/internal/cfg" - "cmd/go/internal/imports" - "cmd/go/internal/modfetch" - "cmd/go/internal/mvs" - "cmd/go/internal/par" - "cmd/go/internal/search" - "cmd/go/internal/str" + "context" "errors" "fmt" "go/build" @@ -24,6 +17,16 @@ import ( "sort" "strings" + "cmd/go/internal/base" + "cmd/go/internal/cfg" + "cmd/go/internal/imports" + "cmd/go/internal/modfetch" + "cmd/go/internal/mvs" + "cmd/go/internal/par" + "cmd/go/internal/search" + "cmd/go/internal/str" + "cmd/go/internal/trace" + "golang.org/x/mod/module" ) @@ -385,7 +388,9 @@ func DirImportPath(dir string) string { // LoadBuildList need only be called if ImportPaths is not // (typically in commands that care about the module but // no particular package). -func LoadBuildList() []module.Version { +func LoadBuildList(ctx context.Context) []module.Version { + ctx, span := trace.StartSpan(ctx, "LoadBuildList") + defer span.Done() InitMod() ReloadBuildList() WriteGoMod() -- GitLab From f30044a03bc7cf107dbec03c02fb6d0072878252 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Thu, 25 Jun 2020 19:11:28 -0400 Subject: [PATCH 0222/1792] cmd/go/internal: remove some users of par.Work par.Work is used in a number of places as a parallel work queue. This change replaces it with goroutines and channels in a number of simpler places where it's used. Change-Id: I0620eda46ec7b2c0599a8b9361639af7bb73a05a Reviewed-on: https://go-review.googlesource.com/c/go/+/248326 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modcmd/download.go | 69 +++++++++++++++----------- src/cmd/go/internal/modcmd/graph.go | 19 +++---- src/cmd/go/internal/modconv/convert.go | 59 ++++++++++++---------- src/cmd/go/internal/modget/get.go | 41 ++++++++++----- src/cmd/go/internal/modload/list.go | 37 +++++++++----- 5 files changed, 133 insertions(+), 92 deletions(-) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 946e8ed3cf..857362a72e 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -5,15 +5,15 @@ package modcmd import ( + "cmd/go/internal/modfetch" "context" "encoding/json" "os" + "runtime" "cmd/go/internal/base" "cmd/go/internal/cfg" - "cmd/go/internal/modfetch" "cmd/go/internal/modload" - "cmd/go/internal/par" "cmd/go/internal/work" "golang.org/x/mod/module" @@ -102,33 +102,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { } } - var mods []*moduleJSON - var work par.Work - listU := false - listVersions := false - for _, info := range modload.ListModules(ctx, args, listU, listVersions) { - if info.Replace != nil { - info = info.Replace - } - if info.Version == "" && info.Error == nil { - // main module or module replaced with file path. - // Nothing to download. - continue - } - m := &moduleJSON{ - Path: info.Path, - Version: info.Version, - } - mods = append(mods, m) - if info.Error != nil { - m.Error = info.Error.Err - continue - } - work.Add(m) - } - - work.Do(10, func(item interface{}) { - m := item.(*moduleJSON) + downloadModule := func(m *moduleJSON) { var err error m.Info, err = modfetch.InfoFile(m.Path, m.Version) if err != nil { @@ -157,7 +131,42 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { m.Error = err.Error() return } - }) + } + + var mods []*moduleJSON + listU := false + listVersions := false + type token struct{} + sem := make(chan token, runtime.GOMAXPROCS(0)) + for _, info := range modload.ListModules(ctx, args, listU, listVersions) { + if info.Replace != nil { + info = info.Replace + } + if info.Version == "" && info.Error == nil { + // main module or module replaced with file path. + // Nothing to download. + continue + } + m := &moduleJSON{ + Path: info.Path, + Version: info.Version, + } + mods = append(mods, m) + if info.Error != nil { + m.Error = info.Error.Err + continue + } + sem <- token{} + go func() { + downloadModule(m) + <-sem + }() + } + + // Fill semaphore channel to wait for goroutines to finish. + for n := cap(sem); n > 0; n-- { + sem <- token{} + } if *downloadJSON { for _, m := range mods { diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index 4853503fd4..6da12b9cab 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -15,7 +15,6 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modload" - "cmd/go/internal/par" "cmd/go/internal/work" "golang.org/x/mod/module" @@ -59,23 +58,25 @@ func runGraph(ctx context.Context, cmd *base.Command, args []string) { return m.Path + "@" + m.Version } - // Note: using par.Work only to manage work queue. - // No parallelism here, so no locking. var out []string var deps int // index in out where deps start - var work par.Work - work.Add(modload.Target) - work.Do(1, func(item interface{}) { - m := item.(module.Version) + seen := map[module.Version]bool{modload.Target: true} + queue := []module.Version{modload.Target} + for len(queue) > 0 { + var m module.Version + m, queue = queue[0], queue[1:] list, _ := reqs.Required(m) for _, r := range list { - work.Add(r) + if !seen[r] { + queue = append(queue, r) + seen[r] = true + } out = append(out, format(m)+" "+format(r)+"\n") } if m == modload.Target { deps = len(out) } - }) + } sort.Slice(out[deps:], func(i, j int) bool { return out[deps+i][0] < out[deps+j][0] diff --git a/src/cmd/go/internal/modconv/convert.go b/src/cmd/go/internal/modconv/convert.go index f465a9f395..d5a0bc21e9 100644 --- a/src/cmd/go/internal/modconv/convert.go +++ b/src/cmd/go/internal/modconv/convert.go @@ -7,13 +7,12 @@ package modconv import ( "fmt" "os" + "runtime" "sort" "strings" - "sync" "cmd/go/internal/base" "cmd/go/internal/modfetch" - "cmd/go/internal/par" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -42,46 +41,52 @@ func ConvertLegacyConfig(f *modfile.File, file string, data []byte) error { // Convert requirements block, which may use raw SHA1 hashes as versions, // to valid semver requirement list, respecting major versions. - var ( - work par.Work - mu sync.Mutex - need = make(map[string]string) - replace = make(map[string]*modfile.Replace) - ) + versions := make([]*module.Version, len(mf.Require)) + replace := make(map[string]*modfile.Replace) for _, r := range mf.Replace { replace[r.New.Path] = r replace[r.Old.Path] = r } - for _, r := range mf.Require { + + type token struct{} + sem := make(chan token, runtime.GOMAXPROCS(0)) + for i, r := range mf.Require { m := r.Mod if m.Path == "" { continue } if re, ok := replace[m.Path]; ok { - work.Add(re.New) - continue + m = re.New } - work.Add(r.Mod) + sem <- token{} + go func(i int, m module.Version) { + repo, info, err := modfetch.ImportRepoRev(m.Path, m.Version) + if err != nil { + fmt.Fprintf(os.Stderr, "go: converting %s: stat %s@%s: %v\n", base.ShortPath(file), m.Path, m.Version, err) + return + } + + path := repo.ModulePath() + versions[i].Path = path + versions[i].Version = info.Version + + <-sem + }(i, m) + } + // Fill semaphore channel to wait for all tasks to finish. + for n := cap(sem); n > 0; n-- { + sem <- token{} } - work.Do(10, func(item interface{}) { - r := item.(module.Version) - repo, info, err := modfetch.ImportRepoRev(r.Path, r.Version) - if err != nil { - fmt.Fprintf(os.Stderr, "go: converting %s: stat %s@%s: %v\n", base.ShortPath(file), r.Path, r.Version, err) - return - } - mu.Lock() - path := repo.ModulePath() + need := map[string]string{} + for _, v := range versions { // Don't use semver.Max here; need to preserve +incompatible suffix. - if v, ok := need[path]; !ok || semver.Compare(v, info.Version) < 0 { - need[path] = info.Version + if needv, ok := need[v.Path]; !ok || semver.Compare(needv, v.Version) < 0 { + need[v.Path] = v.Version } - mu.Unlock() - }) - - var paths []string + } + paths := make([]string, 0, len(need)) for path := range need { paths = append(paths, path) } diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 93a6bb54d5..d02c9a8da5 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -11,6 +11,7 @@ import ( "fmt" "os" "path/filepath" + "runtime" "sort" "strings" "sync" @@ -21,7 +22,6 @@ import ( "cmd/go/internal/load" "cmd/go/internal/modload" "cmd/go/internal/mvs" - "cmd/go/internal/par" "cmd/go/internal/search" "cmd/go/internal/work" @@ -725,18 +725,8 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // reported. A map from module paths to queries is returned, which includes // queries and modOnly. func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*query, modOnly map[string]*query) map[string]*query { - var lookup par.Work - for _, q := range queries { - if cached := cache[q.querySpec]; cached != nil { - *q = *cached - } else { - cache[q.querySpec] = q - lookup.Add(q) - } - } - lookup.Do(10, func(item interface{}) { - q := item.(*query) + runQuery := func(q *query) { if q.vers == "none" { // Wait for downgrade step. q.m = module.Version{Path: q.path, Version: "none"} @@ -747,7 +737,32 @@ func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*quer base.Errorf("go get %s: %v", q.arg, err) } q.m = m - }) + } + + type token struct{} + sem := make(chan token, runtime.GOMAXPROCS(0)) + for _, q := range queries { + if cached := cache[q.querySpec]; cached != nil { + *q = *cached + } else { + sem <- token{} + go func(q *query) { + runQuery(q) + <-sem + }(q) + } + } + + // Fill semaphore channel to wait for goroutines to finish. + for n := cap(sem); n > 0; n-- { + sem <- token{} + } + + // Add to cache after concurrent section to avoid races... + for _, q := range queries { + cache[q.querySpec] = q + } + base.ExitIfErrors() byPath := make(map[string]*query) diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 4768516e90..8db4d64706 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -9,12 +9,12 @@ import ( "errors" "fmt" "os" + "runtime" "strings" "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modinfo" - "cmd/go/internal/par" "cmd/go/internal/search" "golang.org/x/mod/module" @@ -22,24 +22,35 @@ import ( func ListModules(ctx context.Context, args []string, listU, listVersions bool) []*modinfo.ModulePublic { mods := listModules(ctx, args, listVersions) + + type token struct{} + sem := make(chan token, runtime.GOMAXPROCS(0)) if listU || listVersions { - var work par.Work for _, m := range mods { - work.Add(m) + add := func(m *modinfo.ModulePublic) { + sem <- token{} + go func() { + if listU { + addUpdate(m) + } + if listVersions { + addVersions(m) + } + <-sem + }() + } + + add(m) if m.Replace != nil { - work.Add(m.Replace) + add(m.Replace) } } - work.Do(10, func(item interface{}) { - m := item.(*modinfo.ModulePublic) - if listU { - addUpdate(m) - } - if listVersions { - addVersions(m) - } - }) } + // Fill semaphore channel to wait for all tasks to finish. + for n := cap(sem); n > 0; n-- { + sem <- token{} + } + return mods } -- GitLab From 1b86bdbdc3991c13c6ed156100a5f4918fdd9c6b Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 14 Aug 2020 17:44:22 -0400 Subject: [PATCH 0223/1792] cmd/test2json: do not emit a final Action if the result is not known MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If we are parsing a test output, and the test does not end in the usual PASS or FAIL line (say, because it panicked), then we need the exit status of the test binary in order to determine whether the test passed or failed. If we don't have that status available, we shouldn't guess arbitrarily — instead, we should omit the final "pass" or "fail" action entirely. (In practice, we nearly always DO have the final status, such as when running 'go test' or 'go tool test2json some.exe'.) Fixes #40132 Change-Id: Iae482577361a6033395fe4a05d746b980e18c3de Reviewed-on: https://go-review.googlesource.com/c/go/+/248624 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/test/test.go | 8 +- src/cmd/go/testdata/script/test_json_exit.txt | 102 ++++++++++++++++++ src/cmd/internal/test2json/test2json.go | 44 ++++---- .../test2json/testdata/benchshort.json | 1 - .../internal/test2json/testdata/empty.json | 1 - src/cmd/test2json/main.go | 6 +- 6 files changed, 139 insertions(+), 23 deletions(-) create mode 100644 src/cmd/go/testdata/script/test_json_exit.txt diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 9c120e08dc..9cef8cf89c 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -1098,9 +1098,13 @@ func (c *runCache) builderRunTest(b *work.Builder, ctx context.Context, a *work. } var stdout io.Writer = os.Stdout + var err error if testJSON { json := test2json.NewConverter(lockedStdout{}, a.Package.ImportPath, test2json.Timestamp) - defer json.Close() + defer func() { + json.Exited(err) + json.Close() + }() stdout = json } @@ -1204,7 +1208,7 @@ func (c *runCache) builderRunTest(b *work.Builder, ctx context.Context, a *work. } t0 := time.Now() - err := cmd.Start() + err = cmd.Start() // This is a last-ditch deadline to detect and // stop wedged test binaries, to keep the builders diff --git a/src/cmd/go/testdata/script/test_json_exit.txt b/src/cmd/go/testdata/script/test_json_exit.txt new file mode 100644 index 0000000000..dc7ffb06cf --- /dev/null +++ b/src/cmd/go/testdata/script/test_json_exit.txt @@ -0,0 +1,102 @@ +[short] skip + +go test -c -o mainpanic.exe ./mainpanic & +go test -c -o mainexit0.exe ./mainexit0 & +go test -c -o testpanic.exe ./testpanic & +go test -c -o testbgpanic.exe ./testbgpanic & +wait + +# Test binaries that panic in TestMain should be marked as failing. + +! go test -json ./mainpanic +stdout '"Action":"fail"' +! stdout '"Action":"pass"' + +! go tool test2json ./mainpanic.exe +stdout '"Action":"fail"' +! stdout '"Action":"pass"' + +# Test binaries that exit with status 0 should be marked as passing. + +go test -json ./mainexit0 +stdout '"Action":"pass"' +! stdout '"Action":"fail"' + +go tool test2json ./mainexit0.exe +stdout '"Action":"pass"' +! stdout '"Action":"fail"' + +# Test functions that panic should never be marked as passing +# (https://golang.org/issue/40132). + +! go test -json ./testpanic +stdout '"Action":"fail"' +! stdout '"Action":"pass"' + +! go tool test2json ./testpanic.exe -test.v +stdout '"Action":"fail"' +! stdout '"Action":"pass"' + +! go tool test2json ./testpanic.exe +stdout '"Action":"fail"' +! stdout '"Action":"pass"' + +# Tests that panic in a background goroutine should be marked as failing. + +! go test -json ./testbgpanic +stdout '"Action":"fail"' +! stdout '"Action":"pass"' + +! go tool test2json ./testbgpanic.exe -test.v +stdout '"Action":"fail"' +! stdout '"Action":"pass"' + +! go tool test2json ./testbgpanic.exe +stdout '"Action":"fail"' +! stdout '"Action":"pass"' + +-- go.mod -- +module m +go 1.14 +-- mainpanic/mainpanic_test.go -- +package mainpanic_test + +import "testing" + +func TestMain(m *testing.M) { + panic("haha no") +} +-- mainexit0/mainexit0_test.go -- +package mainexit0_test + +import ( + "fmt" + "os" + "testing" +) + +func TestMain(m *testing.M) { + fmt.Println("nothing to do") + os.Exit(0) +} +-- testpanic/testpanic_test.go -- +package testpanic_test + +import "testing" + +func TestPanic(*testing.T) { + panic("haha no") +} +-- testbgpanic/testbgpanic_test.go -- +package testbgpanic_test + +import "testing" + +func TestPanicInBackground(*testing.T) { + c := make(chan struct{}) + go func() { + panic("haha no") + close(c) + }() + <-c +} diff --git a/src/cmd/internal/test2json/test2json.go b/src/cmd/internal/test2json/test2json.go index a01a8900e8..4eb6dd4838 100644 --- a/src/cmd/internal/test2json/test2json.go +++ b/src/cmd/internal/test2json/test2json.go @@ -45,10 +45,10 @@ type textBytes []byte func (b textBytes) MarshalText() ([]byte, error) { return b, nil } -// A converter holds the state of a test-to-JSON conversion. +// A Converter holds the state of a test-to-JSON conversion. // It implements io.WriteCloser; the caller writes test output in, // and the converter writes JSON output to w. -type converter struct { +type Converter struct { w io.Writer // JSON output stream pkg string // package to name in events mode Mode // mode bits @@ -100,9 +100,9 @@ var ( // // The pkg string, if present, specifies the import path to // report in the JSON stream. -func NewConverter(w io.Writer, pkg string, mode Mode) io.WriteCloser { - c := new(converter) - *c = converter{ +func NewConverter(w io.Writer, pkg string, mode Mode) *Converter { + c := new(Converter) + *c = Converter{ w: w, pkg: pkg, mode: mode, @@ -122,11 +122,20 @@ func NewConverter(w io.Writer, pkg string, mode Mode) io.WriteCloser { } // Write writes the test input to the converter. -func (c *converter) Write(b []byte) (int, error) { +func (c *Converter) Write(b []byte) (int, error) { c.input.write(b) return len(b), nil } +// Exited marks the test process as having exited with the given error. +func (c *Converter) Exited(err error) { + if err == nil { + c.result = "pass" + } else { + c.result = "fail" + } +} + var ( // printed by test on successful run. bigPass = []byte("PASS\n") @@ -160,7 +169,7 @@ var ( // handleInputLine handles a single whole test output line. // It must write the line to c.output but may choose to do so // before or after emitting other events. -func (c *converter) handleInputLine(line []byte) { +func (c *Converter) handleInputLine(line []byte) { // Final PASS or FAIL. if bytes.Equal(line, bigPass) || bytes.Equal(line, bigFail) || bytes.HasPrefix(line, bigFailErrorPrefix) { c.flushReport(0) @@ -286,7 +295,7 @@ func (c *converter) handleInputLine(line []byte) { } // flushReport flushes all pending PASS/FAIL reports at levels >= depth. -func (c *converter) flushReport(depth int) { +func (c *Converter) flushReport(depth int) { c.testName = "" for len(c.report) > depth { e := c.report[len(c.report)-1] @@ -298,23 +307,22 @@ func (c *converter) flushReport(depth int) { // Close marks the end of the go test output. // It flushes any pending input and then output (only partial lines at this point) // and then emits the final overall package-level pass/fail event. -func (c *converter) Close() error { +func (c *Converter) Close() error { c.input.flush() c.output.flush() - e := &event{Action: "pass"} if c.result != "" { - e.Action = c.result - } - if c.mode&Timestamp != 0 { - dt := time.Since(c.start).Round(1 * time.Millisecond).Seconds() - e.Elapsed = &dt + e := &event{Action: c.result} + if c.mode&Timestamp != 0 { + dt := time.Since(c.start).Round(1 * time.Millisecond).Seconds() + e.Elapsed = &dt + } + c.writeEvent(e) } - c.writeEvent(e) return nil } // writeOutputEvent writes a single output event with the given bytes. -func (c *converter) writeOutputEvent(out []byte) { +func (c *Converter) writeOutputEvent(out []byte) { c.writeEvent(&event{ Action: "output", Output: (*textBytes)(&out), @@ -323,7 +331,7 @@ func (c *converter) writeOutputEvent(out []byte) { // writeEvent writes a single event. // It adds the package, time (if requested), and test name (if needed). -func (c *converter) writeEvent(e *event) { +func (c *Converter) writeEvent(e *event) { e.Package = c.pkg if c.mode&Timestamp != 0 { t := time.Now() diff --git a/src/cmd/internal/test2json/testdata/benchshort.json b/src/cmd/internal/test2json/testdata/benchshort.json index 28e287c848..34b03b9362 100644 --- a/src/cmd/internal/test2json/testdata/benchshort.json +++ b/src/cmd/internal/test2json/testdata/benchshort.json @@ -4,4 +4,3 @@ {"Action":"output","Output":"# but to avoid questions of timing, we just use a file with no \\n at all.\n"} {"Action":"output","Output":"BenchmarkFoo \t"} {"Action":"output","Output":"10000 early EOF"} -{"Action":"pass"} diff --git a/src/cmd/internal/test2json/testdata/empty.json b/src/cmd/internal/test2json/testdata/empty.json index 80b5217501..e69de29bb2 100644 --- a/src/cmd/internal/test2json/testdata/empty.json +++ b/src/cmd/internal/test2json/testdata/empty.json @@ -1 +0,0 @@ -{"Action":"pass"} diff --git a/src/cmd/test2json/main.go b/src/cmd/test2json/main.go index 0385d8f246..57a874193e 100644 --- a/src/cmd/test2json/main.go +++ b/src/cmd/test2json/main.go @@ -118,12 +118,16 @@ func main() { w := &countWriter{0, c} cmd.Stdout = w cmd.Stderr = w - if err := cmd.Run(); err != nil { + err := cmd.Run() + if err != nil { if w.n > 0 { // Assume command printed why it failed. } else { fmt.Fprintf(c, "test2json: %v\n", err) } + } + c.Exited(err) + if err != nil { c.Close() os.Exit(1) } -- GitLab From 797124f5ff4bb80957007adbf3115287a4e90870 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 14 Aug 2020 15:47:49 -0400 Subject: [PATCH 0224/1792] cmd/go/internal/test: keep looking for go command flags after ambiguous test flag Fixes #40763 Change-Id: I275970d1f8561414571a5b93e368d68fa052c60f Reviewed-on: https://go-review.googlesource.com/c/go/+/248618 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/test/testflag.go | 29 ++++++++++++++++--- src/cmd/go/testdata/script/test_flags.txt | 35 +++++++++++++++++++---- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/cmd/go/internal/test/testflag.go b/src/cmd/go/internal/test/testflag.go index 1ff34f7445..4f0a8924f1 100644 --- a/src/cmd/go/internal/test/testflag.go +++ b/src/cmd/go/internal/test/testflag.go @@ -214,9 +214,13 @@ func testFlags(args []string) (packageNames, passToTest []string) { explicitArgs := make([]string, 0, len(args)) inPkgList := false + afterFlagWithoutValue := false for len(args) > 0 { f, remainingArgs, err := cmdflag.ParseOne(&CmdTest.Flag, args) + wasAfterFlagWithoutValue := afterFlagWithoutValue + afterFlagWithoutValue = false // provisionally + if errors.Is(err, flag.ErrHelp) { exitWithUsage() } @@ -233,10 +237,24 @@ func testFlags(args []string) (packageNames, passToTest []string) { if nf := (cmdflag.NonFlagError{}); errors.As(err, &nf) { if !inPkgList && packageNames != nil { // We already saw the package list previously, and this argument is not - // a flag, so it — and everything after it — must be a literal argument - // to the test binary. - explicitArgs = append(explicitArgs, args...) - break + // a flag, so it — and everything after it — must be either a value for + // a preceding flag or a literal argument to the test binary. + if wasAfterFlagWithoutValue { + // This argument could syntactically be a flag value, so + // optimistically assume that it is and keep looking for go command + // flags after it. + // + // (If we're wrong, we'll at least be consistent with historical + // behavior; see https://golang.org/issue/40763.) + explicitArgs = append(explicitArgs, nf.RawArg) + args = remainingArgs + continue + } else { + // This argument syntactically cannot be a flag value, so it must be a + // positional argument, and so must everything after it. + explicitArgs = append(explicitArgs, args...) + break + } } inPkgList = true @@ -272,6 +290,9 @@ func testFlags(args []string) (packageNames, passToTest []string) { explicitArgs = append(explicitArgs, nd.RawArg) args = remainingArgs + if !nd.HasValue { + afterFlagWithoutValue = true + } continue } diff --git a/src/cmd/go/testdata/script/test_flags.txt b/src/cmd/go/testdata/script/test_flags.txt index d38e37f238..63385e6997 100644 --- a/src/cmd/go/testdata/script/test_flags.txt +++ b/src/cmd/go/testdata/script/test_flags.txt @@ -10,7 +10,7 @@ stdout '\Aok\s+example.com/x\s+[0-9.s]+\n\z' ! stderr . # For backward-compatibility with previous releases of the 'go' command, -# arguments that appear after unrecognized flags should not be treated +# arguments that appear after unrecognized flags should not be treated # as packages, even if they are unambiguously not arguments to flags. # Even though ./x looks like a package path, the real package should be # the implicit '.'. @@ -18,6 +18,22 @@ stdout '\Aok\s+example.com/x\s+[0-9.s]+\n\z' stderr '^no Go files in .+$' ! stderr '/x' +# However, *flags* that appear after unrecognized flags should still be +# interpreted as flags, under the (possibly-erroneous) assumption that +# unrecognized flags are non-boolean. + +go test -v -x ./x -timeout 24h -boolflag=true foo -timeout 25h +stdout 'args: foo -timeout 25h' +stdout 'timeout: 24h0m0s$' # -timeout is unambiguously not a flag, so the real flag wins. + +go test -v -x ./x -timeout 24h -boolflag foo -timeout 25h +stdout 'args: foo -test\.timeout=25h0m0s' # For legacy reasons, '-timeout ' is erroneously rewritten to -test.timeout; see https://golang.org/issue/40763. +stdout 'timeout: 24h0m0s$' # Actual flag wins. + +go test -v -x ./x -timeout 24h -stringflag foo -timeout 25h +stdout 'args: $' +stdout 'timeout: 25h0m0s$' # Later flag wins. + # An explicit '-outputdir=' argument should set test.outputdir # to the 'go' command's working directory, not zero it out # for the test binary. @@ -30,23 +46,23 @@ exists ./cover.out # with the 'test.' prefix in the GOFLAGS entry... env GOFLAGS='-test.timeout=24h0m0s -count=1' go test -v -x ./x -stdout '.*: 24h0m0s$' +stdout 'timeout: 24h0m0s$' stderr '-test.count=1' # ...or without. env GOFLAGS='-timeout=24h0m0s -count=1' go test -v -x ./x -stdout '.*: 24h0m0s$' +stdout 'timeout: 24h0m0s$' stderr '-test.count=1' # Arguments from the command line should override GOFLAGS... go test -v -x -timeout=25h0m0s ./x -stdout '.*: 25h0m0s$' +stdout 'timeout: 25h0m0s$' stderr '-test.count=1' # ...even if they use a different flag name. go test -v -x -test.timeout=26h0m0s ./x -stdout '.*: 26h0m0s$' +stdout 'timeout: 26h0m0s$' stderr '-test\.timeout=26h0m0s' ! stderr 'timeout=24h0m0s' stderr '-test.count=1' @@ -99,11 +115,18 @@ package x import ( "flag" + "strings" "testing" ) var _ = flag.String("usage_message", "", "dummy flag to check usage message") +var boolflag = flag.Bool("boolflag", false, "ignored boolean flag") +var stringflag = flag.String("stringflag", "", "ignored string flag") func TestLogTimeout(t *testing.T) { - t.Log(flag.Lookup("test.timeout").Value) + t.Logf("timeout: %v", flag.Lookup("test.timeout").Value) +} + +func TestLogArgs(t *testing.T) { + t.Logf("args: %s", strings.Join(flag.Args(), " ")) } -- GitLab From c0cf190d226cc3defb71d17c01d0b45bf49a8a85 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Tue, 30 Jun 2020 17:51:52 -0400 Subject: [PATCH 0225/1792] cmd/go: do context propagation for tracing downloads This change does context propagation (and only context propagation) necessary to add context to modfetch.Download and pkg.LoadImport. This was done by adding context to their callers, and then adding context to all call-sites, and then repeating adding context to callers of those enclosing functions and their callers until none were left. In some cases the call graph expansion was pruned by using context.TODOs. The next CL will add a span to Download. I kept it out of this change to avoid making it any larger (and harder to review) than it needs to be. Updates #38714 Change-Id: I5bf2d599aafef67334c384dfccd5e255198c85b4 Reviewed-on: https://go-review.googlesource.com/c/go/+/248327 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/get/get.go | 4 +-- src/cmd/go/internal/list/list.go | 5 +-- src/cmd/go/internal/load/pkg.go | 40 ++++++++++----------- src/cmd/go/internal/load/test.go | 6 ++-- src/cmd/go/internal/modcmd/download.go | 4 +-- src/cmd/go/internal/modcmd/init.go | 2 +- src/cmd/go/internal/modcmd/tidy.go | 2 +- src/cmd/go/internal/modcmd/vendor.go | 2 +- src/cmd/go/internal/modcmd/why.go | 6 ++-- src/cmd/go/internal/modconv/convert_test.go | 5 ++- src/cmd/go/internal/modfetch/fetch.go | 3 +- src/cmd/go/internal/modget/get.go | 18 +++++----- src/cmd/go/internal/modload/build.go | 17 ++++----- src/cmd/go/internal/modload/import.go | 9 ++--- src/cmd/go/internal/modload/import_test.go | 5 ++- src/cmd/go/internal/modload/init.go | 9 ++--- src/cmd/go/internal/modload/list.go | 14 ++++---- src/cmd/go/internal/modload/load.go | 39 ++++++++++---------- src/cmd/go/internal/modload/mvs.go | 5 +-- src/cmd/go/internal/modload/query.go | 33 ++++++++--------- src/cmd/go/internal/modload/query_test.go | 5 ++- src/cmd/go/internal/modload/search.go | 5 +-- src/cmd/go/internal/run/run.go | 2 +- src/cmd/go/internal/test/test.go | 2 +- src/cmd/go/internal/work/exec.go | 2 +- 25 files changed, 131 insertions(+), 113 deletions(-) diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index ef43602aca..e5bacadaa3 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -246,9 +246,9 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int) load1 := func(path string, mode int) *load.Package { if parent == nil { mode := 0 // don't do module or vendor resolution - return load.LoadImport(path, base.Cwd, nil, stk, nil, mode) + return load.LoadImport(context.TODO(), path, base.Cwd, nil, stk, nil, mode) } - return load.LoadImport(path, parent.Dir, parent, stk, nil, mode|load.ResolveModule) + return load.LoadImport(context.TODO(), path, parent.Dir, parent, stk, nil, mode|load.ResolveModule) } p := load1(arg, mode) diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 7303e6c866..e68c39f392 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -20,6 +20,7 @@ import ( "cmd/go/internal/cache" "cmd/go/internal/cfg" "cmd/go/internal/load" + "cmd/go/internal/modinfo" "cmd/go/internal/modload" "cmd/go/internal/str" "cmd/go/internal/work" @@ -349,7 +350,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { fm := template.FuncMap{ "join": strings.Join, "context": context, - "module": modload.ModuleInfo, + "module": func(path string) *modinfo.ModulePublic { return modload.ModuleInfo(ctx, path) }, } tmpl, err := template.New("main").Funcs(fm).Parse(*listFmt) if err != nil { @@ -389,7 +390,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go list -m: not using modules") } - modload.InitMod() // Parses go.mod and sets cfg.BuildMod. + modload.InitMod(ctx) // Parses go.mod and sets cfg.BuildMod. if cfg.BuildMod == "vendor" { const actionDisabledFormat = "go list -m: can't %s using the vendor directory\n\t(Use -mod=mod or -mod=readonly to bypass.)" diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 32c2ba7912..71fd9b5538 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -42,10 +42,10 @@ var ( ModBinDir func() string // return effective bin directory ModLookup func(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) // lookup effective meaning of import ModPackageModuleInfo func(path string) *modinfo.ModulePublic // return module info for Package struct - ModImportPaths func(args []string) []*search.Match // expand import paths + ModImportPaths func(ctx context.Context, args []string) []*search.Match // expand import paths ModPackageBuildInfo func(main string, deps []string) string // return module info to embed in binary ModInfoProg func(info string, isgccgo bool) []byte // wrap module info in .go code for binary - ModImportFromFiles func([]string) // update go.mod to add modules for imports in these files + ModImportFromFiles func(context.Context, []string) // update go.mod to add modules for imports in these files ModDirImportPath func(string) string // return effective import path for directory ) @@ -553,7 +553,7 @@ func ReloadPackageNoFlags(arg string, stk *ImportStack) *Package { }) packageDataCache.Delete(p.ImportPath) } - return LoadImport(arg, base.Cwd, nil, stk, nil, 0) + return LoadImport(context.TODO(), arg, base.Cwd, nil, stk, nil, 0) } // dirToImportPath returns the pseudo-import path we use for a package @@ -605,11 +605,11 @@ const ( // 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(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { - return loadImport(nil, path, srcDir, parent, stk, importPos, mode) +func LoadImport(ctx context.Context, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { + return loadImport(ctx, nil, path, srcDir, parent, stk, importPos, mode) } -func loadImport(pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { +func loadImport(ctx context.Context, pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { if path == "" { panic("LoadImport called with empty package path") } @@ -657,7 +657,7 @@ func loadImport(pre *preload, path, srcDir string, parent *Package, stk *ImportS // Load package. // loadPackageData may return bp != nil even if an error occurs, // in order to return partial information. - p.load(path, stk, importPos, bp, err) + p.load(ctx, path, stk, importPos, bp, err) if !cfg.ModulesEnabled && path != cleanImport(path) { p.Error = &PackageError{ @@ -1591,7 +1591,7 @@ func (p *Package) DefaultExecName() string { // load populates p using information from bp, err, which should // be the result of calling build.Context.Import. // stk contains the import stack, not including path itself. -func (p *Package) load(path string, stk *ImportStack, importPos []token.Position, bp *build.Package, err error) { +func (p *Package) load(ctx context.Context, path string, stk *ImportStack, importPos []token.Position, bp *build.Package, err error) { p.copyBuild(bp) // The localPrefix is the path we interpret ./ imports relative to. @@ -1800,7 +1800,7 @@ func (p *Package) load(path string, stk *ImportStack, importPos []token.Position if path == "C" { continue } - p1 := LoadImport(path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport) + p1 := LoadImport(ctx, path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport) path = p1.ImportPath importPaths[i] = path @@ -2073,7 +2073,7 @@ func PackageList(roots []*Package) []*Package { // TestPackageList returns the list of packages in the dag rooted at roots // as visited in a depth-first post-order traversal, including the test // imports of the roots. This ignores errors in test packages. -func TestPackageList(roots []*Package) []*Package { +func TestPackageList(ctx context.Context, roots []*Package) []*Package { seen := map[*Package]bool{} all := []*Package{} var walk func(*Package) @@ -2089,7 +2089,7 @@ func TestPackageList(roots []*Package) []*Package { } walkTest := func(root *Package, path string) { var stk ImportStack - p1 := LoadImport(path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport) + p1 := LoadImport(ctx, path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport) if p1.Error == nil { walk(p1) } @@ -2112,7 +2112,7 @@ func TestPackageList(roots []*Package) []*Package { // 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(path, srcDir, parent, stk, importPos, mode) + p := LoadImport(context.TODO(), path, srcDir, parent, stk, importPos, mode) setToolFlags(p) return p } @@ -2153,12 +2153,12 @@ func PackagesAndErrors(ctx context.Context, patterns []string) []*Package { // We need to test whether the path is an actual Go file and not a // package path or pattern ending in '.go' (see golang.org/issue/34653). if fi, err := os.Stat(p); err == nil && !fi.IsDir() { - return []*Package{GoFilesPackage(patterns)} + return []*Package{GoFilesPackage(ctx, patterns)} } } } - matches := ImportPaths(patterns) + matches := ImportPaths(ctx, patterns) var ( pkgs []*Package stk ImportStack @@ -2174,7 +2174,7 @@ func PackagesAndErrors(ctx context.Context, patterns []string) []*Package { if pkg == "" { panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern())) } - p := loadImport(pre, pkg, base.Cwd, nil, &stk, nil, 0) + p := loadImport(ctx, pre, pkg, base.Cwd, nil, &stk, nil, 0) p.Match = append(p.Match, m.Pattern()) p.Internal.CmdlinePkg = true if m.IsLiteral() { @@ -2228,9 +2228,9 @@ func setToolFlags(pkgs ...*Package) { } } -func ImportPaths(args []string) []*search.Match { +func ImportPaths(ctx context.Context, args []string) []*search.Match { if ModInit(); cfg.ModulesEnabled { - return ModImportPaths(args) + return ModImportPaths(ctx, args) } return search.ImportPaths(args) } @@ -2281,7 +2281,7 @@ func PackagesForBuild(ctx context.Context, args []string) []*Package { // GoFilesPackage creates a package for building a collection of Go files // (typically named on the command line). The target is named p.a for // package p or named after the first Go file for package main. -func GoFilesPackage(gofiles []string) *Package { +func GoFilesPackage(ctx context.Context, gofiles []string) *Package { ModInit() for _, f := range gofiles { @@ -2329,7 +2329,7 @@ func GoFilesPackage(gofiles []string) *Package { ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil } if cfg.ModulesEnabled { - ModImportFromFiles(gofiles) + ModImportFromFiles(ctx, gofiles) } var err error @@ -2345,7 +2345,7 @@ func GoFilesPackage(gofiles []string) *Package { pkg := new(Package) pkg.Internal.Local = true pkg.Internal.CmdlineFiles = true - pkg.load("command-line-arguments", &stk, nil, bp, err) + pkg.load(ctx, "command-line-arguments", &stk, nil, bp, err) pkg.Internal.LocalPrefix = dirToImportPath(dir) pkg.ImportPath = "command-line-arguments" pkg.Target = "" diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index 6db8a00245..a0e275095b 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -108,7 +108,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p stk.Push(p.ImportPath + " (test)") rawTestImports := str.StringList(p.TestImports) for i, path := range p.TestImports { - p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport) + p1 := loadImport(ctx, 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 @@ -127,7 +127,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p pxtestNeedsPtest := false rawXTestImports := str.StringList(p.XTestImports) for i, path := range p.XTestImports { - p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) + p1 := loadImport(ctx, pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) if p1.ImportPath == p.ImportPath { pxtestNeedsPtest = true } else { @@ -244,7 +244,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p if dep == ptest.ImportPath { pmain.Internal.Imports = append(pmain.Internal.Imports, ptest) } else { - p1 := loadImport(pre, dep, "", nil, &stk, nil, 0) + p1 := loadImport(ctx, pre, dep, "", nil, &stk, nil, 0) pmain.Internal.Imports = append(pmain.Internal.Imports, p1) } } diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 857362a72e..75785c2c48 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -90,7 +90,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { if len(args) == 0 { args = []string{"all"} } else if modload.HasModRoot() { - modload.InitMod() // to fill Target + modload.InitMod(ctx) // to fill Target targetAtLatest := modload.Target.Path + "@latest" targetAtUpgrade := modload.Target.Path + "@upgrade" targetAtPatch := modload.Target.Path + "@patch" @@ -126,7 +126,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { return } m.Sum = modfetch.Sum(mod) - m.Dir, err = modfetch.Download(mod) + m.Dir, err = modfetch.Download(ctx, mod) if err != nil { m.Error = err.Error() return diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index 95063e62f4..b6cffd332d 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -51,6 +51,6 @@ func runInit(ctx context.Context, cmd *base.Command, args []string) { if strings.Contains(modload.CmdModModule, "@") { base.Fatalf("go mod init: module path must not contain '@'") } - modload.InitMod() // does all the hard work + modload.InitMod(ctx) // does all the hard work modload.WriteGoMod() } diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index 769cd11fe8..c7c53d7c0c 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -40,7 +40,7 @@ func runTidy(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go mod tidy: no arguments allowed") } - modload.LoadALL() + modload.LoadALL(ctx) modload.TidyBuildList() modload.TrimGoSum() modload.WriteGoMod() diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index 257d1cd0ef..e5353b5c7f 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -48,7 +48,7 @@ func runVendor(ctx context.Context, cmd *base.Command, args []string) { if len(args) != 0 { base.Fatalf("go mod vendor: vendor takes no arguments") } - pkgs := modload.LoadVendor() + pkgs := modload.LoadVendor(ctx) vdir := filepath.Join(modload.ModRoot(), "vendor") if err := os.RemoveAll(vdir); err != nil { diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index f400339b25..da33fff89e 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -76,7 +76,7 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { } mods := modload.ListModules(ctx, args, listU, listVersions) byModule := make(map[module.Version][]string) - for _, path := range loadALL() { + for _, path := range loadALL(ctx) { m := modload.PackageModule(path) if m.Path != "" { byModule[m] = append(byModule[m], path) @@ -105,8 +105,8 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { sep = "\n" } } else { - matches := modload.ImportPaths(args) // resolve to packages - loadALL() // rebuild graph, from main module (not from named packages) + matches := modload.ImportPaths(ctx, args) // resolve to packages + loadALL(ctx) // rebuild graph, from main module (not from named packages) sep := "" for _, m := range matches { for _, path := range m.Pkgs { diff --git a/src/cmd/go/internal/modconv/convert_test.go b/src/cmd/go/internal/modconv/convert_test.go index a04a13b14f..faa2b4c606 100644 --- a/src/cmd/go/internal/modconv/convert_test.go +++ b/src/cmd/go/internal/modconv/convert_test.go @@ -6,6 +6,7 @@ package modconv import ( "bytes" + "context" "fmt" "internal/testenv" "io/ioutil" @@ -146,6 +147,8 @@ func TestConvertLegacyConfig(t *testing.T) { }, } + ctx := context.Background() + for _, tt := range tests { t.Run(strings.ReplaceAll(tt.path, "/", "_")+"_"+tt.vers, func(t *testing.T) { f, err := modfile.Parse("golden", []byte(tt.gomod), nil) @@ -157,7 +160,7 @@ func TestConvertLegacyConfig(t *testing.T) { t.Fatal(err) } - dir, err := modfetch.Download(module.Version{Path: tt.path, Version: tt.vers}) + dir, err := modfetch.Download(ctx, module.Version{Path: tt.path, Version: tt.vers}) 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 e40158b535..6606612658 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -7,6 +7,7 @@ package modfetch import ( "archive/zip" "bytes" + "context" "errors" "fmt" "io" @@ -34,7 +35,7 @@ var downloadCache par.Cache // 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(mod module.Version) (dir string, err error) { +func Download(ctx context.Context, mod module.Version) (dir string, err 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/modget/get.go b/src/cmd/go/internal/modget/get.go index d02c9a8da5..ee9757912b 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -353,7 +353,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { if !strings.Contains(path, "...") { m := search.NewMatch(path) if pkgPath := modload.DirImportPath(path); pkgPath != "." { - m = modload.TargetPackages(pkgPath) + m = modload.TargetPackages(ctx, pkgPath) } if len(m.Pkgs) == 0 { for _, err := range m.Errs { @@ -399,7 +399,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { default: // The argument is a package or module path. if modload.HasModRoot() { - if m := modload.TargetPackages(path); len(m.Pkgs) != 0 { + if m := modload.TargetPackages(ctx, path); len(m.Pkgs) != 0 { // The path is in the main module. Nothing to query. if vers != "upgrade" && vers != "patch" { base.Errorf("go get %s: can't request explicit version of path in main module", arg) @@ -491,7 +491,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { if q.path == q.m.Path { wg.Add(1) go func(q *query) { - if hasPkg, err := modload.ModuleHasRootPackage(q.m); err != nil { + if hasPkg, err := modload.ModuleHasRootPackage(ctx, q.m); err != nil { base.Errorf("go get: %v", err) } else if !hasPkg { modOnlyMu.Lock() @@ -536,7 +536,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // Don't load packages if pkgPatterns is empty. Both // modload.ImportPathsQuiet and ModulePackages convert an empty list // of patterns to []string{"."}, which is not what we want. - matches = modload.ImportPathsQuiet(pkgPatterns, imports.AnyTags()) + matches = modload.ImportPathsQuiet(ctx, pkgPatterns, imports.AnyTags()) seenPkgs = make(map[string]bool) for i, match := range matches { arg := pkgGets[i] @@ -732,7 +732,7 @@ func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*quer q.m = module.Version{Path: q.path, Version: "none"} return } - m, err := getQuery(q.path, q.vers, q.prevM, q.forceModulePath) + m, err := getQuery(ctx, q.path, q.vers, q.prevM, q.forceModulePath) if err != nil { base.Errorf("go get %s: %v", q.arg, err) } @@ -790,7 +790,7 @@ func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*quer // to determine the underlying module version being requested. // If forceModulePath is set, getQuery must interpret path // as a module path. -func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (module.Version, error) { +func getQuery(ctx context.Context, path, vers string, prevM module.Version, forceModulePath bool) (module.Version, error) { if (prevM.Version != "") != forceModulePath { // We resolve package patterns by calling QueryPattern, which does not // accept a previous version and therefore cannot take it into account for @@ -812,7 +812,7 @@ func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (mo } } - info, err := modload.Query(path, vers, prevM.Version, modload.Allowed) + info, err := modload.Query(ctx, path, vers, prevM.Version, modload.Allowed) if err == nil { if info.Version != vers && info.Version != prevM.Version { logOncef("go: %s %s => %s", path, vers, info.Version) @@ -838,7 +838,7 @@ func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (mo // If it turns out to only exist as a module, we can detect the resulting // PackageNotInModuleError and avoid a second round-trip through (potentially) // all of the configured proxies. - results, err := modload.QueryPattern(path, vers, modload.Allowed) + results, err := modload.QueryPattern(ctx, path, vers, modload.Allowed) if err != nil { // If the path doesn't contain a wildcard, check whether it was actually a // module path instead. If so, return that. @@ -994,7 +994,7 @@ func (u *upgrader) Upgrade(m module.Version) (module.Version, error) { // If we're querying "upgrade" or "patch", Query will compare the current // version against the chosen version and will return the current version // if it is newer. - info, err := modload.Query(m.Path, string(getU), m.Version, modload.Allowed) + info, err := modload.Query(context.TODO(), m.Path, string(getU), m.Version, modload.Allowed) if err != nil { // Report error but return m, to let version selection continue. // (Reporting the error will fail the command at the next base.ExitIfErrors.) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 5f8a2e7e05..a101681a1f 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -6,6 +6,7 @@ package modload import ( "bytes" + "context" "encoding/hex" "fmt" "internal/goroot" @@ -57,21 +58,21 @@ func PackageModuleInfo(pkgpath string) *modinfo.ModulePublic { if !ok { return nil } - return moduleInfo(m, true) + return moduleInfo(context.TODO(), m, true) } -func ModuleInfo(path string) *modinfo.ModulePublic { +func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { if !Enabled() { return nil } if i := strings.Index(path, "@"); i >= 0 { - return moduleInfo(module.Version{Path: path[:i], Version: path[i+1:]}, false) + return moduleInfo(ctx, module.Version{Path: path[:i], Version: path[i+1:]}, false) } for _, m := range BuildList() { if m.Path == path { - return moduleInfo(m, true) + return moduleInfo(ctx, m, true) } } @@ -84,12 +85,12 @@ func ModuleInfo(path string) *modinfo.ModulePublic { } // addUpdate fills in m.Update if an updated version is available. -func addUpdate(m *modinfo.ModulePublic) { +func addUpdate(ctx context.Context, m *modinfo.ModulePublic) { if m.Version == "" { return } - if info, err := Query(m.Path, "upgrade", m.Version, Allowed); err == nil && semver.Compare(info.Version, m.Version) > 0 { + if info, err := Query(ctx, m.Path, "upgrade", m.Version, Allowed); err == nil && semver.Compare(info.Version, m.Version) > 0 { m.Update = &modinfo.ModulePublic{ Path: m.Path, Version: info.Version, @@ -103,7 +104,7 @@ func addVersions(m *modinfo.ModulePublic) { m.Versions, _ = versions(m.Path) } -func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic { +func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modinfo.ModulePublic { if m == Target { info := &modinfo.ModulePublic{ Path: m.Path, @@ -132,7 +133,7 @@ func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic { // completeFromModCache fills in the extra fields in m using the module cache. completeFromModCache := func(m *modinfo.ModulePublic) { if m.Version != "" { - if q, err := Query(m.Path, m.Version, "", nil); err != nil { + if q, err := Query(ctx, m.Path, m.Version, "", nil); err != nil { m.Error = &modinfo.ModuleError{Err: err.Error()} } else { m.Version = q.Version diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 4d2bc805e2..5c51a79124 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -5,6 +5,7 @@ package modload import ( + "context" "errors" "fmt" "go/build" @@ -110,7 +111,7 @@ var _ load.ImportPathError = &AmbiguousImportError{} // Import returns an ImportMissingError as the error. // If Import can identify a module that could be added to supply the package, // the ImportMissingError records that module. -func Import(path string) (m module.Version, dir string, err error) { +func Import(ctx context.Context, path string) (m module.Version, dir string, err error) { if strings.Contains(path, "@") { return module.Version{}, "", fmt.Errorf("import path should not have @version") } @@ -165,7 +166,7 @@ func Import(path string) (m module.Version, dir string, err error) { // Avoid possibly downloading irrelevant modules. continue } - root, isLocal, err := fetch(m) + root, isLocal, err := fetch(ctx, m) if err != nil { // Report fetch error. // Note that we don't know for sure this module is necessary, @@ -248,7 +249,7 @@ func Import(path string) (m module.Version, dir string, err error) { return len(mods[i].Path) > len(mods[j].Path) }) for _, m := range mods { - root, isLocal, err := fetch(m) + root, isLocal, err := fetch(ctx, m) if err != nil { // Report fetch error as above. return module.Version{}, "", err @@ -285,7 +286,7 @@ func Import(path string) (m module.Version, dir string, err error) { fmt.Fprintf(os.Stderr, "go: finding module for package %s\n", path) - candidates, err := QueryPackage(path, "latest", Allowed) + candidates, err := QueryPackage(ctx, path, "latest", Allowed) if err != nil { if errors.Is(err, os.ErrNotExist) { // Return "cannot find module providing package […]" instead of whatever diff --git a/src/cmd/go/internal/modload/import_test.go b/src/cmd/go/internal/modload/import_test.go index accc60eecd..47ce89a084 100644 --- a/src/cmd/go/internal/modload/import_test.go +++ b/src/cmd/go/internal/modload/import_test.go @@ -5,6 +5,7 @@ package modload import ( + "context" "internal/testenv" "regexp" "strings" @@ -49,10 +50,12 @@ func TestImport(t *testing.T) { }(allowMissingModuleImports) AllowMissingModuleImports() + ctx := context.Background() + for _, tt := range importTests { t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) { // Note that there is no build list, so Import should always fail. - m, dir, err := Import(tt.path) + m, dir, err := Import(ctx, tt.path) if err == nil { t.Fatalf("Import(%q) = %v, %v, nil; expected error", tt.path, m, dir) } diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index fff060e665..93027c44c4 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -6,6 +6,7 @@ package modload import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -332,7 +333,7 @@ func die() { // // As a side-effect, InitMod sets a default for cfg.BuildMod if it does not // already have an explicit value. -func InitMod() { +func InitMod(ctx context.Context) { if len(buildList) > 0 { return } @@ -359,7 +360,7 @@ func InitMod() { } var fixed bool - f, err := modfile.Parse(gomod, data, fixVersion(&fixed)) + f, err := modfile.Parse(gomod, data, fixVersion(ctx, &fixed)) if err != nil { // Errors returned by modfile.Parse begin with file:line. base.Fatalf("go: errors parsing go.mod:\n%s\n", err) @@ -397,7 +398,7 @@ func InitMod() { // and does nothing for versions that already appear to be canonical. // // The VersionFixer sets 'fixed' if it ever returns a non-canonical version. -func fixVersion(fixed *bool) modfile.VersionFixer { +func fixVersion(ctx context.Context, fixed *bool) modfile.VersionFixer { return func(path, vers string) (resolved string, err error) { defer func() { if err == nil && resolved != vers { @@ -429,7 +430,7 @@ func fixVersion(fixed *bool) modfile.VersionFixer { } } - info, err := Query(path, vers, "", nil) + info, err := Query(ctx, path, vers, "", nil) if err != nil { return "", err } diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 8db4d64706..7bf4e86c8d 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -31,7 +31,7 @@ func ListModules(ctx context.Context, args []string, listU, listVersions bool) [ sem <- token{} go func() { if listU { - addUpdate(m) + addUpdate(ctx, m) } if listVersions { addVersions(m) @@ -57,7 +57,7 @@ func ListModules(ctx context.Context, args []string, listU, listVersions bool) [ func listModules(ctx context.Context, args []string, listVersions bool) []*modinfo.ModulePublic { LoadBuildList(ctx) if len(args) == 0 { - return []*modinfo.ModulePublic{moduleInfo(buildList[0], true)} + return []*modinfo.ModulePublic{moduleInfo(ctx, buildList[0], true)} } var mods []*modinfo.ModulePublic @@ -83,7 +83,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin } } - info, err := Query(path, vers, current, nil) + info, err := Query(ctx, path, vers, current, nil) if err != nil { mods = append(mods, &modinfo.ModulePublic{ Path: path, @@ -92,7 +92,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin }) continue } - mods = append(mods, moduleInfo(module.Version{Path: path, Version: info.Version}, false)) + mods = append(mods, moduleInfo(ctx, module.Version{Path: path, Version: info.Version}, false)) continue } @@ -117,7 +117,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin matched = true if !matchedBuildList[i] { matchedBuildList[i] = true - mods = append(mods, moduleInfo(m, true)) + mods = append(mods, moduleInfo(ctx, m, true)) } } } @@ -127,9 +127,9 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin // Don't make the user provide an explicit '@latest' when they're // explicitly asking what the available versions are. // Instead, resolve the module, even if it isn't an existing dependency. - info, err := Query(arg, "latest", "", nil) + info, err := Query(ctx, arg, "latest", "", nil) if err == nil { - mods = append(mods, moduleInfo(module.Version{Path: arg, Version: info.Version}, false)) + mods = append(mods, moduleInfo(ctx, module.Version{Path: arg, Version: info.Version}, false)) } else { mods = append(mods, &modinfo.ModulePublic{ Path: arg, diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 8190009b23..686d491219 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -52,8 +52,8 @@ var loaded *loader // ImportPaths returns the set of packages matching the args (patterns), // on the target platform. Modules may be added to the build list // to satisfy new imports. -func ImportPaths(patterns []string) []*search.Match { - matches := ImportPathsQuiet(patterns, imports.Tags()) +func ImportPaths(ctx context.Context, patterns []string) []*search.Match { + matches := ImportPathsQuiet(ctx, patterns, imports.Tags()) search.WarnUnmatched(matches) return matches } @@ -62,7 +62,7 @@ func ImportPaths(patterns []string) []*search.Match { // no matches. It also lets the caller specify a set of build tags to match // packages. The build tags should typically be imports.Tags() or // imports.AnyTags(); a nil map has no special meaning. -func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { +func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bool) []*search.Match { updateMatches := func(matches []*search.Match, iterating bool) { for _, m := range matches { switch { @@ -103,7 +103,7 @@ func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { case strings.Contains(m.Pattern(), "..."): m.Errs = m.Errs[:0] - matchPackages(m, loaded.tags, includeStd, buildList) + matchPackages(ctx, m, loaded.tags, includeStd, buildList) case m.Pattern() == "all": loaded.testAll = true @@ -111,7 +111,7 @@ func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { // Enumerate the packages in the main module. // We'll load the dependencies as we find them. m.Errs = m.Errs[:0] - matchPackages(m, loaded.tags, omitStd, []module.Version{Target}) + matchPackages(ctx, m, loaded.tags, omitStd, []module.Version{Target}) } else { // Starting with the packages in the main module, // enumerate the full list of "all". @@ -129,7 +129,7 @@ func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { } } - InitMod() + InitMod(ctx) var matches []*search.Match for _, pattern := range search.CleanPatterns(patterns) { @@ -338,8 +338,8 @@ func pathInModuleCache(dir string) string { // ImportFromFiles adds modules to the build list as needed // to satisfy the imports in the named Go source files. -func ImportFromFiles(gofiles []string) { - InitMod() +func ImportFromFiles(ctx context.Context, gofiles []string) { + InitMod(ctx) tags := imports.Tags() imports, testImports, err := imports.ScanFiles(gofiles, tags) @@ -391,7 +391,7 @@ func DirImportPath(dir string) string { func LoadBuildList(ctx context.Context) []module.Version { ctx, span := trace.StartSpan(ctx, "LoadBuildList") defer span.Done() - InitMod() + InitMod(ctx) ReloadBuildList() WriteGoMod() return buildList @@ -409,20 +409,20 @@ func ReloadBuildList() []module.Version { // It adds modules to the build list as needed to satisfy new imports. // This set is useful for deciding whether a particular import is needed // anywhere in a module. -func LoadALL() []string { - return loadAll(true) +func LoadALL(ctx context.Context) []string { + return loadAll(ctx, true) } // LoadVendor is like LoadALL but only follows test dependencies // for tests in the main module. Tests in dependency modules are // ignored completely. // This set is useful for identifying the which packages to include in a vendor directory. -func LoadVendor() []string { - return loadAll(false) +func LoadVendor(ctx context.Context) []string { + return loadAll(ctx, false) } -func loadAll(testAll bool) []string { - InitMod() +func loadAll(ctx context.Context, testAll bool) []string { + InitMod(ctx) loaded = newLoader(imports.AnyTags()) loaded.isALL = true @@ -430,7 +430,7 @@ func loadAll(testAll bool) []string { if !testAll { loaded.testRoots = true } - all := TargetPackages("...") + all := TargetPackages(ctx, "...") loaded.load(func() []string { return all.Pkgs }) checkMultiplePaths() WriteGoMod() @@ -453,13 +453,13 @@ func loadAll(testAll bool) []string { // TargetPackages returns the list of packages in the target (top-level) module // matching pattern, which may be relative to the working directory, under all // build tag settings. -func TargetPackages(pattern string) *search.Match { +func TargetPackages(ctx context.Context, pattern string) *search.Match { // TargetPackages is relative to the main module, so ensure that the main // module is a thing that can contain packages. ModRoot() m := search.NewMatch(pattern) - matchPackages(m, imports.AnyTags(), omitStd, []module.Version{Target}) + matchPackages(ctx, m, imports.AnyTags(), omitStd, []module.Version{Target}) return m } @@ -817,7 +817,8 @@ func (ld *loader) doPkg(item interface{}) { return } - pkg.mod, pkg.dir, pkg.err = Import(pkg.path) + // TODO(matloob): Handle TODO context. This needs to be threaded through Do. + pkg.mod, pkg.dir, pkg.err = Import(context.TODO(), pkg.path) if pkg.dir == "" { return } diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 5dd009d31d..67eb2c2e19 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -5,6 +5,7 @@ package modload import ( + "context" "errors" "fmt" "os" @@ -224,7 +225,7 @@ func (*mvsReqs) next(m module.Version) (module.Version, error) { // // The isLocal return value reports whether the replacement, // if any, is local to the filesystem. -func fetch(mod module.Version) (dir string, isLocal bool, err error) { +func fetch(ctx context.Context, mod module.Version) (dir string, isLocal bool, err error) { if mod == Target { return ModRoot(), true, nil } @@ -254,6 +255,6 @@ func fetch(mod module.Version) (dir string, isLocal bool, err error) { mod = r } - dir, err = modfetch.Download(mod) + dir, err = modfetch.Download(ctx, mod) return dir, false, err } diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index acc886bf21..39a813447c 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -5,6 +5,7 @@ package modload import ( + "context" "errors" "fmt" "os" @@ -55,10 +56,10 @@ import ( // // If path is the path of the main module and the query is "latest", // Query returns Target.Version as the version. -func Query(path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { +func Query(ctx context.Context, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { var info *modfetch.RevInfo err := modfetch.TryProxies(func(proxy string) (err error) { - info, err = queryProxy(proxy, path, query, current, allowed) + info, err = queryProxy(ctx, proxy, path, query, current, allowed) return err }) return info, err @@ -75,7 +76,7 @@ func (queryDisabledError) Error() string { return fmt.Sprintf("cannot query module due to -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason) } -func queryProxy(proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { +func queryProxy(ctx context.Context, proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { if current != "" && !semver.IsValid(current) { return nil, fmt.Errorf("invalid previous version %q", current) } @@ -243,7 +244,7 @@ func queryProxy(proxy, path, query, current string, allowed func(module.Version) if err != nil { return nil, err } - releases, prereleases, err := filterVersions(path, versions, ok, preferIncompatible) + releases, prereleases, err := filterVersions(ctx, path, versions, ok, preferIncompatible) if err != nil { return nil, err } @@ -327,7 +328,7 @@ func matchSemverPrefix(p, v string) bool { // 1. versions that do not satisfy the 'ok' predicate, and // 2. "+incompatible" versions, if a compatible one satisfies the predicate // and the incompatible version is not preferred. -func filterVersions(path string, versions []string, ok func(module.Version) bool, preferIncompatible bool) (releases, prereleases []string, err error) { +func filterVersions(ctx context.Context, path string, versions []string, ok func(module.Version) bool, preferIncompatible bool) (releases, prereleases []string, err error) { var lastCompatible string for _, v := range versions { if !ok(module.Version{Path: path, Version: v}) { @@ -343,7 +344,7 @@ func filterVersions(path string, versions []string, ok func(module.Version) bool // https://golang.org/issue/34165.) Note that we even prefer a // compatible pre-release over an incompatible release. - ok, err := versionHasGoMod(module.Version{Path: path, Version: lastCompatible}) + ok, err := versionHasGoMod(ctx, module.Version{Path: path, Version: lastCompatible}) if err != nil { return nil, nil, err } @@ -380,12 +381,12 @@ type QueryResult struct { // If the package is in the main module, QueryPackage considers only the main // module and only the version "latest", without checking for other possible // modules. -func QueryPackage(path, query string, allowed func(module.Version) bool) ([]QueryResult, error) { +func QueryPackage(ctx context.Context, path, query string, allowed func(module.Version) bool) ([]QueryResult, error) { m := search.NewMatch(path) if m.IsLocal() || !m.IsLiteral() { return nil, fmt.Errorf("pattern %s is not an importable package", path) } - return QueryPattern(path, query, allowed) + return QueryPattern(ctx, path, query, allowed) } // QueryPattern looks up the module(s) containing at least one package matching @@ -401,7 +402,7 @@ func QueryPackage(path, query string, allowed func(module.Version) bool) ([]Quer // If any matching package is in the main module, QueryPattern considers only // the main module and only the version "latest", without checking for other // possible modules. -func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { +func QueryPattern(ctx context.Context, pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { base := pattern firstError := func(m *search.Match) error { @@ -417,7 +418,7 @@ func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]Q base = pathpkg.Dir(pattern[:i+3]) match = func(mod module.Version, root string, isLocal bool) *search.Match { m := search.NewMatch(pattern) - matchPackages(m, imports.AnyTags(), omitStd, []module.Version{mod}) + matchPackages(ctx, m, imports.AnyTags(), omitStd, []module.Version{mod}) return m } } else { @@ -472,12 +473,12 @@ func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]Q queryModule := func(path string) (r QueryResult, err error) { current := findCurrentVersion(path) r.Mod.Path = path - r.Rev, err = queryProxy(proxy, path, query, current, allowed) + r.Rev, err = queryProxy(ctx, proxy, path, query, current, allowed) if err != nil { return r, err } r.Mod.Version = r.Rev.Version - root, isLocal, err := fetch(r.Mod) + root, isLocal, err := fetch(ctx, r.Mod) if err != nil { return r, err } @@ -698,8 +699,8 @@ func (e *PackageNotInModuleError) ImportPath() string { } // ModuleHasRootPackage returns whether module m contains a package m.Path. -func ModuleHasRootPackage(m module.Version) (bool, error) { - root, isLocal, err := fetch(m) +func ModuleHasRootPackage(ctx context.Context, m module.Version) (bool, error) { + root, isLocal, err := fetch(ctx, m) if err != nil { return false, err } @@ -707,8 +708,8 @@ func ModuleHasRootPackage(m module.Version) (bool, error) { return ok, err } -func versionHasGoMod(m module.Version) (bool, error) { - root, _, err := fetch(m) +func versionHasGoMod(ctx context.Context, m module.Version) (bool, error) { + root, _, err := fetch(ctx, m) if err != nil { return false, err } diff --git a/src/cmd/go/internal/modload/query_test.go b/src/cmd/go/internal/modload/query_test.go index 247e4c40d2..77080e9b5b 100644 --- a/src/cmd/go/internal/modload/query_test.go +++ b/src/cmd/go/internal/modload/query_test.go @@ -5,6 +5,7 @@ package modload import ( + "context" "internal/testenv" "io/ioutil" "log" @@ -179,6 +180,8 @@ func TestQuery(t *testing.T) { testenv.MustHaveExternalNetwork(t) testenv.MustHaveExecPath(t, "git") + ctx := context.Background() + for _, tt := range queryTests { allow := tt.allow if allow == "" { @@ -192,7 +195,7 @@ func TestQuery(t *testing.T) { t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.query+"/"+tt.current+"/"+allow, func(t *testing.T) { t.Parallel() - info, err := Query(tt.path, tt.query, tt.current, allowed) + info, err := Query(ctx, tt.path, tt.query, tt.current, allowed) if tt.err != "" { if err == nil { t.Errorf("Query(%q, %q, %v) = %v, want error %q", tt.path, tt.query, allow, info.Version, tt.err) diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index c28e7c0c1e..a9bee0af4e 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -5,6 +5,7 @@ package modload import ( + "context" "fmt" "os" "path/filepath" @@ -27,7 +28,7 @@ const ( // matchPackages is like m.MatchPackages, but uses a local variable (rather than // a global) for tags, can include or exclude packages in the standard library, // and is restricted to the given list of modules. -func matchPackages(m *search.Match, tags map[string]bool, filter stdFilter, modules []module.Version) { +func matchPackages(ctx context.Context, m *search.Match, tags map[string]bool, filter stdFilter, modules []module.Version) { m.Pkgs = []string{} isMatch := func(string) bool { return true } @@ -153,7 +154,7 @@ func matchPackages(m *search.Match, tags map[string]bool, filter stdFilter, modu isLocal = true } else { var err error - root, isLocal, err = fetch(mod) + root, isLocal, err = fetch(ctx, mod) if err != nil { m.AddError(err) continue diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index deec5106ff..99578b244c 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -77,7 +77,7 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go run: cannot run *_test.go files (%s)", file) } } - p = load.GoFilesPackage(files) + p = load.GoFilesPackage(ctx, files) } else if len(args) > 0 && !strings.HasPrefix(args[0], "-") { pkgs := load.PackagesAndErrors(ctx, args[:1]) if len(pkgs) == 0 { diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 9cef8cf89c..3aee6939d2 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -702,7 +702,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { } // Select for coverage all dependencies matching the testCoverPaths patterns. - for _, p := range load.TestPackageList(pkgs) { + for _, p := range load.TestPackageList(ctx, pkgs) { haveMatch := false for i := range testCoverPaths { if match[i](p) { diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 681ecd7646..d975c36306 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2900,7 +2900,7 @@ func (b *Builder) swigDoIntSize(objdir string) (intsize string, err error) { } srcs := []string{src} - p := load.GoFilesPackage(srcs) + p := load.GoFilesPackage(context.TODO(), srcs) if _, _, e := BuildToolchain.gc(b, &Action{Mode: "swigDoIntSize", Package: p, Objdir: objdir}, "", nil, "", false, srcs); e != nil { return "32", nil -- GitLab From 1a3558341860357c2400e37773e5076bb3a51628 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 15 Jul 2020 17:38:36 -0400 Subject: [PATCH 0226/1792] cmd/go: add tracing for querying and downloading from the proxy This CL adds tracing spans for modload.queryPattern, modload.queryProxy, modload.QueryPattern, modload.QueryPattern.queryModule, modload.queryPrefixModules and modfetch.Download. Updates #38714 Change-Id: I537c7fa4f466c691c1b60ec73ef8a2277af49cd7 Reviewed-on: https://go-review.googlesource.com/c/go/+/242786 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/go/internal/modcmd/download.go | 2 +- src/cmd/go/internal/modfetch/fetch.go | 21 +++++++++++++----- .../modfetch/zip_sum_test/zip_sum_test.go | 3 ++- src/cmd/go/internal/modload/query.go | 22 +++++++++++++++---- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 75785c2c48..13e5cb066b 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -120,7 +120,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { return } mod := module.Version{Path: m.Path, Version: m.Version} - m.Zip, err = modfetch.DownloadZip(mod) + m.Zip, err = modfetch.DownloadZip(ctx, mod) if err != nil { m.Error = err.Error() return diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index 6606612658..e29eb0a942 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -24,6 +24,7 @@ import ( "cmd/go/internal/par" "cmd/go/internal/renameio" "cmd/go/internal/robustio" + "cmd/go/internal/trace" "golang.org/x/mod/module" "golang.org/x/mod/sumdb/dirhash" @@ -48,7 +49,7 @@ func Download(ctx context.Context, mod module.Version) (dir string, err error) { err error } c := downloadCache.Do(mod, func() interface{} { - dir, err := download(mod) + dir, err := download(ctx, mod) if err != nil { return cached{"", err} } @@ -58,7 +59,10 @@ func Download(ctx context.Context, mod module.Version) (dir string, err error) { return c.dir, c.err } -func download(mod module.Version) (dir string, err error) { +func download(ctx context.Context, mod module.Version) (dir string, err error) { + ctx, span := trace.StartSpan(ctx, "modfetch.download "+mod.String()) + defer span.Done() + // If the directory exists, and no .partial file exists, the module has // already been completely extracted. .partial files may be created when a // module zip directory is extracted in place instead of being extracted to a @@ -73,7 +77,7 @@ func download(mod module.Version) (dir string, err error) { // To avoid cluttering the cache with extraneous files, // DownloadZip uses the same lockfile as Download. // Invoke DownloadZip before locking the file. - zipfile, err := DownloadZip(mod) + zipfile, err := DownloadZip(ctx, mod) if err != nil { return "", err } @@ -143,6 +147,7 @@ func download(mod module.Version) (dir string, err error) { return "", err } + ctx, span = trace.StartSpan(ctx, "unzip "+zipfile) if unzipInPlace { if err := ioutil.WriteFile(partialPath, nil, 0666); err != nil { return "", err @@ -172,6 +177,7 @@ func download(mod module.Version) (dir string, err error) { return "", err } } + defer span.Done() if !cfg.ModCacheRW { // Make dir read-only only *after* renaming it. @@ -196,7 +202,7 @@ var downloadZipCache par.Cache // DownloadZip downloads the specific module version to the // local zip cache and returns the name of the zip file. -func DownloadZip(mod module.Version) (zipfile string, err error) { +func DownloadZip(ctx context.Context, mod module.Version) (zipfile string, err error) { // The par.Cache here avoids duplicate work. type cached struct { zipfile string @@ -231,7 +237,7 @@ func DownloadZip(mod module.Version) (zipfile string, err error) { if err := os.MkdirAll(filepath.Dir(zipfile), 0777); err != nil { return cached{"", err} } - if err := downloadZip(mod, zipfile); err != nil { + if err := downloadZip(ctx, mod, zipfile); err != nil { return cached{"", err} } return cached{zipfile, nil} @@ -239,7 +245,10 @@ func DownloadZip(mod module.Version) (zipfile string, err error) { return c.zipfile, c.err } -func downloadZip(mod module.Version, zipfile string) (err error) { +func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err error) { + ctx, span := trace.StartSpan(ctx, "modfetch.downloadZip "+zipfile) + defer span.Done() + // Clean up any remaining tempfiles from previous runs. // This is only safe to do because the lock file ensures that their // writers are no longer active. 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 eac9b32fa8..82398ebfed 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 @@ -16,6 +16,7 @@ package zip_sum_test import ( + "context" "crypto/sha256" "encoding/csv" "encoding/hex" @@ -119,7 +120,7 @@ func TestZipSums(t *testing.T) { 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(test.m) + zipPath, err := modfetch.DownloadZip(context.Background(), test.m) if err != nil { if *updateTestData { t.Logf("%s: could not download module: %s (will remove from testdata)", test.m, err) diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 39a813447c..e82eb1506f 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -19,6 +19,7 @@ import ( "cmd/go/internal/modfetch" "cmd/go/internal/search" "cmd/go/internal/str" + "cmd/go/internal/trace" "golang.org/x/mod/module" "golang.org/x/mod/semver" @@ -77,6 +78,9 @@ func (queryDisabledError) Error() string { } func queryProxy(ctx context.Context, proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { + ctx, span := trace.StartSpan(ctx, "modload.queryProxy "+path+" "+query) + defer span.Done() + if current != "" && !semver.IsValid(current) { return nil, fmt.Errorf("invalid previous version %q", current) } @@ -403,6 +407,9 @@ func QueryPackage(ctx context.Context, path, query string, allowed func(module.V // the main module and only the version "latest", without checking for other // possible modules. func QueryPattern(ctx context.Context, pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { + ctx, span := trace.StartSpan(ctx, "modload.QueryPattern "+pattern+" "+query) + defer span.Done() + base := pattern firstError := func(m *search.Match) error { @@ -470,7 +477,10 @@ func QueryPattern(ctx context.Context, pattern, query string, allowed func(modul } err := modfetch.TryProxies(func(proxy string) error { - queryModule := func(path string) (r QueryResult, err error) { + queryModule := func(ctx context.Context, path string) (r QueryResult, err error) { + ctx, span := trace.StartSpan(ctx, "modload.QueryPattern.queryModule ["+proxy+"] "+path) + defer span.Done() + current := findCurrentVersion(path) r.Mod.Path = path r.Rev, err = queryProxy(ctx, proxy, path, query, current, allowed) @@ -499,7 +509,7 @@ func QueryPattern(ctx context.Context, pattern, query string, allowed func(modul } var err error - results, err = queryPrefixModules(candidateModules, queryModule) + results, err = queryPrefixModules(ctx, candidateModules, queryModule) return err }) @@ -543,7 +553,10 @@ type prefixResult struct { err error } -func queryPrefixModules(candidateModules []string, queryModule func(path string) (QueryResult, error)) (found []QueryResult, err error) { +func queryPrefixModules(ctx context.Context, candidateModules []string, queryModule func(ctx context.Context, path string) (QueryResult, error)) (found []QueryResult, err error) { + ctx, span := trace.StartSpan(ctx, "modload.queryPrefixModules") + defer span.Done() + // If the path we're attempting is not in the module cache and we don't have a // fetch result cached either, we'll end up making a (potentially slow) // request to the proxy or (often even slower) the origin server. @@ -556,8 +569,9 @@ func queryPrefixModules(candidateModules []string, queryModule func(path string) var wg sync.WaitGroup wg.Add(len(candidateModules)) for i, p := range candidateModules { + ctx := trace.StartGoroutine(ctx) go func(p string, r *result) { - r.QueryResult, r.err = queryModule(p) + r.QueryResult, r.err = queryModule(ctx, p) wg.Done() }(p, &results[i]) } -- GitLab From e30fbe3757d09a22988835835c41233df7c6cd00 Mon Sep 17 00:00:00 2001 From: Junchen Li Date: Fri, 10 Jul 2020 11:39:23 +0800 Subject: [PATCH 0227/1792] cmd/compile: optimize unsigned comparisons to 0 There are some architecture-independent rules in #21439, since an unsigned integer >= 0 is always true and < 0 is always false. This CL adds these optimizations to generic rules. Updates #21439 Change-Id: Iec7e3040b761ecb1e60908f764815fdd9bc62495 Reviewed-on: https://go-review.googlesource.com/c/go/+/246617 Reviewed-by: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot --- .../compile/internal/ssa/gen/generic.rules | 4 + .../compile/internal/ssa/rewritegeneric.go | 80 +++++++++++++++++++ test/codegen/comparisons.go | 17 ++++ 3 files changed, 101 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index ed5bfc81fd..2d39d27226 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -545,6 +545,10 @@ (Or(64|32|16|8) x (Or(64|32|16|8) x y)) => (Or(64|32|16|8) x y) (Xor(64|32|16|8) x (Xor(64|32|16|8) x y)) => y +// Unsigned comparisons to zero. +(Less(64U|32U|16U|8U) _ (Const(64|32|16|8) [0])) => (ConstBool [false]) +(Leq(64U|32U|16U|8U) (Const(64|32|16|8) [0]) _) => (ConstBool [true]) + // Ands clear bits. Ors set bits. // If a subsequent Or will set all the bits // that an And cleared, we can skip the And. diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 9f4e1b95bd..68e49f46f3 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -9701,6 +9701,16 @@ func rewriteValuegeneric_OpLeq16U(v *Value) bool { v.AuxInt = boolToAuxInt(uint16(c) <= uint16(d)) return true } + // match: (Leq16U (Const16 [0]) _) + // result: (ConstBool [true]) + for { + if v_0.Op != OpConst16 || auxIntToInt16(v_0.AuxInt) != 0 { + break + } + v.reset(OpConstBool) + v.AuxInt = boolToAuxInt(true) + return true + } return false } func rewriteValuegeneric_OpLeq32(v *Value) bool { @@ -9805,6 +9815,16 @@ func rewriteValuegeneric_OpLeq32U(v *Value) bool { v.AuxInt = boolToAuxInt(uint32(c) <= uint32(d)) return true } + // match: (Leq32U (Const32 [0]) _) + // result: (ConstBool [true]) + for { + if v_0.Op != OpConst32 || auxIntToInt32(v_0.AuxInt) != 0 { + break + } + v.reset(OpConstBool) + v.AuxInt = boolToAuxInt(true) + return true + } return false } func rewriteValuegeneric_OpLeq64(v *Value) bool { @@ -9909,6 +9929,16 @@ func rewriteValuegeneric_OpLeq64U(v *Value) bool { v.AuxInt = boolToAuxInt(uint64(c) <= uint64(d)) return true } + // match: (Leq64U (Const64 [0]) _) + // result: (ConstBool [true]) + for { + if v_0.Op != OpConst64 || auxIntToInt64(v_0.AuxInt) != 0 { + break + } + v.reset(OpConstBool) + v.AuxInt = boolToAuxInt(true) + return true + } return false } func rewriteValuegeneric_OpLeq8(v *Value) bool { @@ -9993,6 +10023,16 @@ func rewriteValuegeneric_OpLeq8U(v *Value) bool { v.AuxInt = boolToAuxInt(uint8(c) <= uint8(d)) return true } + // match: (Leq8U (Const8 [0]) _) + // result: (ConstBool [true]) + for { + if v_0.Op != OpConst8 || auxIntToInt8(v_0.AuxInt) != 0 { + break + } + v.reset(OpConstBool) + v.AuxInt = boolToAuxInt(true) + return true + } return false } func rewriteValuegeneric_OpLess16(v *Value) bool { @@ -10033,6 +10073,16 @@ func rewriteValuegeneric_OpLess16U(v *Value) bool { v.AuxInt = boolToAuxInt(uint16(c) < uint16(d)) return true } + // match: (Less16U _ (Const16 [0])) + // result: (ConstBool [false]) + for { + if v_1.Op != OpConst16 || auxIntToInt16(v_1.AuxInt) != 0 { + break + } + v.reset(OpConstBool) + v.AuxInt = boolToAuxInt(false) + return true + } return false } func rewriteValuegeneric_OpLess32(v *Value) bool { @@ -10093,6 +10143,16 @@ func rewriteValuegeneric_OpLess32U(v *Value) bool { v.AuxInt = boolToAuxInt(uint32(c) < uint32(d)) return true } + // match: (Less32U _ (Const32 [0])) + // result: (ConstBool [false]) + for { + if v_1.Op != OpConst32 || auxIntToInt32(v_1.AuxInt) != 0 { + break + } + v.reset(OpConstBool) + v.AuxInt = boolToAuxInt(false) + return true + } return false } func rewriteValuegeneric_OpLess64(v *Value) bool { @@ -10153,6 +10213,16 @@ func rewriteValuegeneric_OpLess64U(v *Value) bool { v.AuxInt = boolToAuxInt(uint64(c) < uint64(d)) return true } + // match: (Less64U _ (Const64 [0])) + // result: (ConstBool [false]) + for { + if v_1.Op != OpConst64 || auxIntToInt64(v_1.AuxInt) != 0 { + break + } + v.reset(OpConstBool) + v.AuxInt = boolToAuxInt(false) + return true + } return false } func rewriteValuegeneric_OpLess8(v *Value) bool { @@ -10193,6 +10263,16 @@ func rewriteValuegeneric_OpLess8U(v *Value) bool { v.AuxInt = boolToAuxInt(uint8(c) < uint8(d)) return true } + // match: (Less8U _ (Const8 [0])) + // result: (ConstBool [false]) + for { + if v_1.Op != OpConst8 || auxIntToInt8(v_1.AuxInt) != 0 { + break + } + v.reset(OpConstBool) + v.AuxInt = boolToAuxInt(false) + return true + } return false } func rewriteValuegeneric_OpLoad(v *Value) bool { diff --git a/test/codegen/comparisons.go b/test/codegen/comparisons.go index 90808573c2..f3c15538a8 100644 --- a/test/codegen/comparisons.go +++ b/test/codegen/comparisons.go @@ -407,3 +407,20 @@ func CmpToZero_ex5(e, f int32, u uint32) int { } 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)` + if a < 0 || b < 0 || c < 0 || d < 0 { + return 1 + } + return 0 +} + +func UintGeqZero(a uint8, b uint16, c uint32, d uint64) int { + // amd64: -`(TESTB|TESTW|TESTL|TESTQ|JCS|JCC)` + // arm64: -`(CMPW|CMP|BLO|BHS)` + if a >= 0 || b >= 0 || c >= 0 || d >= 0 { + return 1 + } + return 0 +} -- GitLab From 260dff3ca3b06385dc298523791a2079162f546e Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 19 Feb 2020 19:45:57 +0000 Subject: [PATCH 0228/1792] runtime: clean up old markrootSpans This change removes the old markrootSpans implementation and deletes the feature flag. Updates #37487. Change-Id: Idb5a2559abcc3be5a7da6f2ccce1a86e1d7634e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/221183 Run-TryBot: Michael Knyszek TryBot-Result: Gobot Gobot Reviewed-by: Michael Pratt Reviewed-by: Austin Clements --- src/runtime/mgcmark.go | 120 ++++--------------------------------- src/runtime/mgcsweep.go | 2 +- src/runtime/mgcsweepbuf.go | 38 ------------ src/runtime/mheap.go | 8 +-- 4 files changed, 14 insertions(+), 154 deletions(-) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 96910ff729..2b84945471 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -47,10 +47,6 @@ const ( // Must be a multiple of the pageInUse bitmap element size and // must also evenly divide pagesPerArena. pagesPerSpanRoot = 512 - - // go115NewMarkrootSpans is a feature flag that indicates whether - // to use the new bitmap-based markrootSpans implementation. - go115NewMarkrootSpans = true ) // gcMarkRootPrepare queues root scanning jobs (stacks, globals, and @@ -87,24 +83,16 @@ func gcMarkRootPrepare() { // // We depend on addfinalizer to mark objects that get // finalizers after root marking. - if go115NewMarkrootSpans { - // We're going to scan the whole heap (that was available at the time the - // mark phase started, i.e. markArenas) for in-use spans which have specials. - // - // Break up the work into arenas, and further into chunks. - // - // Snapshot allArenas as markArenas. This snapshot is safe because allArenas - // is append-only. - mheap_.markArenas = mheap_.allArenas[:len(mheap_.allArenas):len(mheap_.allArenas)] - work.nSpanRoots = len(mheap_.markArenas) * (pagesPerArena / pagesPerSpanRoot) - } else { - // We're only interested in scanning the in-use spans, - // which will all be swept at this point. More spans - // may be added to this list during concurrent GC, but - // we only care about spans that were allocated before - // this mark phase. - work.nSpanRoots = mheap_.sweepSpans[mheap_.sweepgen/2%2].numBlocks() - } + // + // We're going to scan the whole heap (that was available at the time the + // mark phase started, i.e. markArenas) for in-use spans which have specials. + // + // Break up the work into arenas, and further into chunks. + // + // Snapshot allArenas as markArenas. This snapshot is safe because allArenas + // is append-only. + mheap_.markArenas = mheap_.allArenas[:len(mheap_.allArenas):len(mheap_.allArenas)] + work.nSpanRoots = len(mheap_.markArenas) * (pagesPerArena / pagesPerSpanRoot) // Scan stacks. // @@ -316,10 +304,6 @@ func markrootFreeGStacks() { // //go:nowritebarrier func markrootSpans(gcw *gcWork, shard int) { - if !go115NewMarkrootSpans { - oldMarkrootSpans(gcw, shard) - return - } // Objects with finalizers have two GC-related invariants: // // 1) Everything reachable from the object must be marked. @@ -396,90 +380,6 @@ func markrootSpans(gcw *gcWork, shard int) { } } -// oldMarkrootSpans marks roots for one shard of work.spans. -// -// For go115NewMarkrootSpans = false. -// -//go:nowritebarrier -func oldMarkrootSpans(gcw *gcWork, shard int) { - // Objects with finalizers have two GC-related invariants: - // - // 1) Everything reachable from the object must be marked. - // This ensures that when we pass the object to its finalizer, - // everything the finalizer can reach will be retained. - // - // 2) Finalizer specials (which are not in the garbage - // collected heap) are roots. In practice, this means the fn - // field must be scanned. - // - // TODO(austin): There are several ideas for making this more - // efficient in issue #11485. - - sg := mheap_.sweepgen - spans := mheap_.sweepSpans[mheap_.sweepgen/2%2].block(shard) - // Note that work.spans may not include spans that were - // allocated between entering the scan phase and now. We may - // also race with spans being added into sweepSpans when they're - // just created, and as a result we may see nil pointers in the - // spans slice. This is okay because any objects with finalizers - // in those spans must have been allocated and given finalizers - // after we entered the scan phase, so addfinalizer will have - // ensured the above invariants for them. - for i := 0; i < len(spans); i++ { - // sweepBuf.block requires that we read pointers from the block atomically. - // It also requires that we ignore nil pointers. - s := (*mspan)(atomic.Loadp(unsafe.Pointer(&spans[i]))) - - // This is racing with spans being initialized, so - // check the state carefully. - if s == nil || s.state.get() != mSpanInUse { - continue - } - // Check that this span was swept (it may be cached or uncached). - if !useCheckmark && !(s.sweepgen == sg || s.sweepgen == sg+3) { - // sweepgen was updated (+2) during non-checkmark GC pass - print("sweep ", s.sweepgen, " ", sg, "\n") - throw("gc: unswept span") - } - - // Speculatively check if there are any specials - // without acquiring the span lock. This may race with - // adding the first special to a span, but in that - // case addfinalizer will observe that the GC is - // active (which is globally synchronized) and ensure - // the above invariants. We may also ensure the - // invariants, but it's okay to scan an object twice. - if s.specials == nil { - continue - } - - // Lock the specials to prevent a special from being - // removed from the list while we're traversing it. - lock(&s.speciallock) - - for sp := s.specials; sp != nil; sp = sp.next { - if sp.kind != _KindSpecialFinalizer { - continue - } - // don't mark finalized object, but scan it so we - // retain everything it points to. - spf := (*specialfinalizer)(unsafe.Pointer(sp)) - // A finalizer can be set for an inner byte of an object, find object beginning. - p := s.base() + uintptr(spf.special.offset)/s.elemsize*s.elemsize - - // Mark everything that can be reached from - // the object (but *not* the object itself or - // we'll never collect it). - scanobject(p, gcw) - - // The special itself is a root. - scanblock(uintptr(unsafe.Pointer(&spf.fn)), sys.PtrSize, &oneptrmask[0], gcw, nil) - } - - unlock(&s.speciallock) - } -} - // gcAssistAlloc performs GC work to make gp's assist debt positive. // gp must be the calling user gorountine. // diff --git a/src/runtime/mgcsweep.go b/src/runtime/mgcsweep.go index 3aa3afc028..9244174403 100644 --- a/src/runtime/mgcsweep.go +++ b/src/runtime/mgcsweep.go @@ -662,7 +662,7 @@ func (s *mspan) oldSweep(preserve bool) bool { special = *specialp } } - if go115NewMarkrootSpans && hadSpecials && s.specials == nil { + if hadSpecials && s.specials == nil { spanHasNoSpecials(s) } diff --git a/src/runtime/mgcsweepbuf.go b/src/runtime/mgcsweepbuf.go index 1f722c3d58..5e5ca3dd2f 100644 --- a/src/runtime/mgcsweepbuf.go +++ b/src/runtime/mgcsweepbuf.go @@ -136,41 +136,3 @@ func (b *gcSweepBuf) pop() *mspan { block.spans[bottom] = nil return s } - -// numBlocks returns the number of blocks in buffer b. numBlocks is -// safe to call concurrently with any other operation. Spans that have -// been pushed prior to the call to numBlocks are guaranteed to appear -// in some block in the range [0, numBlocks()), assuming there are no -// intervening pops. Spans that are pushed after the call may also -// appear in these blocks. -func (b *gcSweepBuf) numBlocks() int { - return int(divRoundUp(uintptr(atomic.Load(&b.index)), gcSweepBlockEntries)) -} - -// block returns the spans in the i'th block of buffer b. block is -// safe to call concurrently with push. The block may contain nil -// pointers that must be ignored, and each entry in the block must be -// loaded atomically. -func (b *gcSweepBuf) block(i int) []*mspan { - // Perform bounds check before loading spine address since - // push ensures the allocated length is at least spineLen. - if i < 0 || uintptr(i) >= atomic.Loaduintptr(&b.spineLen) { - throw("block index out of range") - } - - // Get block i. - spine := atomic.Loadp(unsafe.Pointer(&b.spine)) - blockp := add(spine, sys.PtrSize*uintptr(i)) - block := (*gcSweepBlock)(atomic.Loadp(blockp)) - - // Slice the block if necessary. - cursor := uintptr(atomic.Load(&b.index)) - top, bottom := cursor/gcSweepBlockEntries, cursor%gcSweepBlockEntries - var spans []*mspan - if uintptr(i) < top { - spans = block.spans[:] - } else { - spans = block.spans[:bottom] - } - return spans -} diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 6341375160..0807726863 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -52,7 +52,7 @@ const ( // The definition of this flag helps ensure that if there's a problem with // the new markroot spans implementation and it gets turned off, that the new // mcentral implementation also gets turned off so the runtime isn't broken. - go115NewMCentralImpl = true && go115NewMarkrootSpans + go115NewMCentralImpl = true ) // Main malloc heap. @@ -1705,9 +1705,7 @@ func addspecial(p unsafe.Pointer, s *special) bool { s.offset = uint16(offset) s.next = *t *t = s - if go115NewMarkrootSpans { - spanHasSpecials(span) - } + spanHasSpecials(span) unlock(&span.speciallock) releasem(mp) @@ -1748,7 +1746,7 @@ func removespecial(p unsafe.Pointer, kind uint8) *special { } t = &s.next } - if go115NewMarkrootSpans && span.specials == nil { + if span.specials == nil { spanHasNoSpecials(span) } unlock(&span.speciallock) -- GitLab From e6d0bd2b8951bde6f0ac6421f20e18efc7ba0cdb Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 19 Feb 2020 16:37:48 +0000 Subject: [PATCH 0229/1792] runtime: clean up old mcentral code This change deletes the old mcentral implementation from the code base and the newMCentralImpl feature flag along with it. Updates #37487. Change-Id: Ibca8f722665f0865051f649ffe699cbdbfdcfcf2 Reviewed-on: https://go-review.googlesource.com/c/go/+/221184 Run-TryBot: Michael Knyszek TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements Reviewed-by: Michael Pratt --- src/runtime/lockrank.go | 16 +-- src/runtime/malloc.go | 8 +- src/runtime/mcache.go | 6 +- src/runtime/mcentral.go | 239 +------------------------------------ src/runtime/mgc.go | 10 +- src/runtime/mgcsweep.go | 237 ++---------------------------------- src/runtime/mgcsweepbuf.go | 138 --------------------- src/runtime/mheap.go | 36 +----- 8 files changed, 25 insertions(+), 665 deletions(-) delete mode 100644 src/runtime/mgcsweepbuf.go diff --git a/src/runtime/lockrank.go b/src/runtime/lockrank.go index 000193585d..b23cf767be 100644 --- a/src/runtime/lockrank.go +++ b/src/runtime/lockrank.go @@ -67,8 +67,6 @@ const ( lockRankRwmutexW lockRankRwmutexR - lockRankMcentral // For !go115NewMCentralImpl - lockRankSpine // For !go115NewMCentralImpl lockRankSpanSetSpine lockRankGscan lockRankStackpool @@ -149,8 +147,6 @@ var lockNames = []string{ lockRankRwmutexW: "rwmutexW", lockRankRwmutexR: "rwmutexR", - lockRankMcentral: "mcentral", - lockRankSpine: "spine", lockRankSpanSetSpine: "spanSetSpine", lockRankGscan: "gscan", lockRankStackpool: "stackpool", @@ -228,18 +224,16 @@ var lockPartialOrder [][]lockRank = [][]lockRank{ lockRankRwmutexW: {}, lockRankRwmutexR: {lockRankRwmutexW}, - lockRankMcentral: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan}, - lockRankSpine: {lockRankSysmon, lockRankScavenge, lockRankAssistQueue, lockRankCpuprof, lockRankSched, lockRankAllg, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan}, lockRankSpanSetSpine: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan}, - lockRankGscan: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankHchan, lockRankFin, lockRankTraceBuf, lockRankTraceStrings, lockRankRoot, lockRankNotifyList, lockRankProf, lockRankGcBitsArenas, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankMcentral, lockRankSpine, lockRankSpanSetSpine}, - lockRankStackpool: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankHchan, lockRankFin, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankRwmutexR, lockRankMcentral, lockRankSpine, lockRankSpanSetSpine, lockRankGscan}, - lockRankStackLarge: {lockRankSysmon, lockRankAssistQueue, lockRankSched, lockRankItab, lockRankHchan, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankMcentral, lockRankSpanSetSpine, lockRankGscan}, + lockRankGscan: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankHchan, lockRankFin, lockRankTraceBuf, lockRankTraceStrings, lockRankRoot, lockRankNotifyList, lockRankProf, lockRankGcBitsArenas, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankSpanSetSpine}, + lockRankStackpool: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankHchan, lockRankFin, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankTrace, lockRankTraceStackTab, lockRankNetpollInit, lockRankRwmutexR, lockRankSpanSetSpine, lockRankGscan}, + lockRankStackLarge: {lockRankSysmon, lockRankAssistQueue, lockRankSched, lockRankItab, lockRankHchan, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankSpanSetSpine, lockRankGscan}, lockRankDefer: {}, lockRankSudog: {lockRankNotifyList, lockRankHchan}, lockRankWbufSpans: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankSched, lockRankAllg, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankHchan, lockRankNotifyList, lockRankTraceStrings, lockRankMspanSpecial, lockRankProf, lockRankRoot, lockRankGscan, lockRankDefer, lockRankSudog}, - lockRankMheap: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankAllg, lockRankAllp, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan, lockRankMspanSpecial, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankMcentral, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankDefer, lockRankSudog, lockRankWbufSpans, lockRankSpanSetSpine}, + lockRankMheap: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankAllg, lockRankAllp, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan, lockRankMspanSpecial, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankDefer, lockRankSudog, lockRankWbufSpans, lockRankSpanSetSpine}, lockRankMheapSpecial: {lockRankSysmon, lockRankScavenge, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan}, - lockRankGlobalAlloc: {lockRankProf, lockRankSpine, lockRankSpanSetSpine, lockRankMheap, lockRankMheapSpecial}, + lockRankGlobalAlloc: {lockRankProf, lockRankSpanSetSpine, lockRankMheap, lockRankMheapSpecial}, lockRankGFree: {lockRankSched}, lockRankHchanLeaf: {lockRankGscan, lockRankHchanLeaf}, diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go index b3fac3de24..e46327f9ce 100644 --- a/src/runtime/malloc.go +++ b/src/runtime/malloc.go @@ -1178,11 +1178,9 @@ func largeAlloc(size uintptr, needzero bool, noscan bool) *mspan { if s == nil { throw("out of memory") } - if go115NewMCentralImpl { - // Put the large span in the mcentral swept list so that it's - // visible to the background sweeper. - mheap_.central[spc].mcentral.fullSwept(mheap_.sweepgen).push(s) - } + // Put the large span in the mcentral swept list so that it's + // visible to the background sweeper. + mheap_.central[spc].mcentral.fullSwept(mheap_.sweepgen).push(s) s.limit = s.base() + size heapBitsForAddr(s.base()).initSpan(s) return s diff --git a/src/runtime/mcache.go b/src/runtime/mcache.go index 5bceb51ac9..7a7d33ccae 100644 --- a/src/runtime/mcache.go +++ b/src/runtime/mcache.go @@ -131,11 +131,7 @@ func (c *mcache) refill(spc spanClass) { if s.sweepgen != mheap_.sweepgen+3 { throw("bad sweepgen in refill") } - if go115NewMCentralImpl { - mheap_.central[spc].mcentral.uncacheSpan(s) - } else { - atomic.Store(&s.sweepgen, mheap_.sweepgen) - } + mheap_.central[spc].mcentral.uncacheSpan(s) } // Get a new cached span from the central lists. diff --git a/src/runtime/mcentral.go b/src/runtime/mcentral.go index ed49d86d0c..ed49e01677 100644 --- a/src/runtime/mcentral.go +++ b/src/runtime/mcentral.go @@ -18,7 +18,6 @@ import "runtime/internal/atomic" // //go:notinheap type mcentral struct { - lock mutex spanclass spanClass // For !go115NewMCentralImpl. @@ -55,16 +54,10 @@ type mcentral struct { // Initialize a single central free list. func (c *mcentral) init(spc spanClass) { c.spanclass = spc - if go115NewMCentralImpl { - lockInit(&c.partial[0].spineLock, lockRankSpanSetSpine) - lockInit(&c.partial[1].spineLock, lockRankSpanSetSpine) - lockInit(&c.full[0].spineLock, lockRankSpanSetSpine) - lockInit(&c.full[1].spineLock, lockRankSpanSetSpine) - } else { - c.nonempty.init() - c.empty.init() - lockInit(&c.lock, lockRankMcentral) - } + lockInit(&c.partial[0].spineLock, lockRankSpanSetSpine) + lockInit(&c.partial[1].spineLock, lockRankSpanSetSpine) + lockInit(&c.full[0].spineLock, lockRankSpanSetSpine) + lockInit(&c.full[1].spineLock, lockRankSpanSetSpine) } // partialUnswept returns the spanSet which holds partially-filled @@ -93,9 +86,6 @@ func (c *mcentral) fullSwept(sweepgen uint32) *spanSet { // Allocate a span to use in an mcache. func (c *mcentral) cacheSpan() *mspan { - if !go115NewMCentralImpl { - return c.oldCacheSpan() - } // Deduct credit for this span allocation and sweep if necessary. spanBytes := uintptr(class_to_allocnpages[c.spanclass.sizeclass()]) * _PageSize deductSweepCredit(spanBytes, 0) @@ -213,127 +203,11 @@ havespan: return s } -// Allocate a span to use in an mcache. -// -// For !go115NewMCentralImpl. -func (c *mcentral) oldCacheSpan() *mspan { - // Deduct credit for this span allocation and sweep if necessary. - spanBytes := uintptr(class_to_allocnpages[c.spanclass.sizeclass()]) * _PageSize - deductSweepCredit(spanBytes, 0) - - lock(&c.lock) - traceDone := false - if trace.enabled { - traceGCSweepStart() - } - sg := mheap_.sweepgen -retry: - var s *mspan - for s = c.nonempty.first; s != nil; s = s.next { - if s.sweepgen == sg-2 && atomic.Cas(&s.sweepgen, sg-2, sg-1) { - c.nonempty.remove(s) - c.empty.insertBack(s) - unlock(&c.lock) - s.sweep(true) - goto havespan - } - if s.sweepgen == sg-1 { - // the span is being swept by background sweeper, skip - continue - } - // we have a nonempty span that does not require sweeping, allocate from it - c.nonempty.remove(s) - c.empty.insertBack(s) - unlock(&c.lock) - goto havespan - } - - for s = c.empty.first; s != nil; s = s.next { - if s.sweepgen == sg-2 && atomic.Cas(&s.sweepgen, sg-2, sg-1) { - // we have an empty span that requires sweeping, - // sweep it and see if we can free some space in it - c.empty.remove(s) - // swept spans are at the end of the list - c.empty.insertBack(s) - unlock(&c.lock) - s.sweep(true) - freeIndex := s.nextFreeIndex() - if freeIndex != s.nelems { - s.freeindex = freeIndex - goto havespan - } - lock(&c.lock) - // the span is still empty after sweep - // it is already in the empty list, so just retry - goto retry - } - if s.sweepgen == sg-1 { - // the span is being swept by background sweeper, skip - continue - } - // already swept empty span, - // all subsequent ones must also be either swept or in process of sweeping - break - } - if trace.enabled { - traceGCSweepDone() - traceDone = true - } - unlock(&c.lock) - - // Replenish central list if empty. - s = c.grow() - if s == nil { - return nil - } - lock(&c.lock) - c.empty.insertBack(s) - unlock(&c.lock) - - // At this point s is a non-empty span, queued at the end of the empty list, - // c is unlocked. -havespan: - if trace.enabled && !traceDone { - traceGCSweepDone() - } - n := int(s.nelems) - int(s.allocCount) - if n == 0 || s.freeindex == s.nelems || uintptr(s.allocCount) == s.nelems { - throw("span has no free objects") - } - // Assume all objects from this span will be allocated in the - // mcache. If it gets uncached, we'll adjust this. - atomic.Xadd64(&c.nmalloc, int64(n)) - usedBytes := uintptr(s.allocCount) * s.elemsize - atomic.Xadd64(&memstats.heap_live, int64(spanBytes)-int64(usedBytes)) - if trace.enabled { - // heap_live changed. - traceHeapAlloc() - } - if gcBlackenEnabled != 0 { - // heap_live changed. - gcController.revise() - } - freeByteBase := s.freeindex &^ (64 - 1) - whichByte := freeByteBase / 8 - // Init alloc bits cache. - s.refillAllocCache(whichByte) - - // Adjust the allocCache so that s.freeindex corresponds to the low bit in - // s.allocCache. - s.allocCache >>= s.freeindex % 64 - - return s -} - // Return span from an mcache. // // s must have a span class corresponding to this // mcentral and it must not be empty. func (c *mcentral) uncacheSpan(s *mspan) { - if !go115NewMCentralImpl { - c.oldUncacheSpan(s) - return - } if s.allocCount == 0 { throw("uncaching span but s.allocCount == 0") } @@ -393,111 +267,6 @@ func (c *mcentral) uncacheSpan(s *mspan) { } } -// Return span from an mcache. -// -// For !go115NewMCentralImpl. -func (c *mcentral) oldUncacheSpan(s *mspan) { - if s.allocCount == 0 { - throw("uncaching span but s.allocCount == 0") - } - - sg := mheap_.sweepgen - stale := s.sweepgen == sg+1 - if stale { - // Span was cached before sweep began. It's our - // responsibility to sweep it. - // - // Set sweepgen to indicate it's not cached but needs - // sweeping and can't be allocated from. sweep will - // set s.sweepgen to indicate s is swept. - atomic.Store(&s.sweepgen, sg-1) - } else { - // Indicate that s is no longer cached. - atomic.Store(&s.sweepgen, sg) - } - - n := int(s.nelems) - int(s.allocCount) - if n > 0 { - // cacheSpan updated alloc assuming all objects on s - // were going to be allocated. Adjust for any that - // weren't. We must do this before potentially - // sweeping the span. - atomic.Xadd64(&c.nmalloc, -int64(n)) - - lock(&c.lock) - c.empty.remove(s) - c.nonempty.insert(s) - if !stale { - // mCentral_CacheSpan conservatively counted - // unallocated slots in heap_live. Undo this. - // - // If this span was cached before sweep, then - // heap_live was totally recomputed since - // caching this span, so we don't do this for - // stale spans. - atomic.Xadd64(&memstats.heap_live, -int64(n)*int64(s.elemsize)) - } - unlock(&c.lock) - } - - if stale { - // Now that s is in the right mcentral list, we can - // sweep it. - s.sweep(false) - } -} - -// freeSpan updates c and s after sweeping s. -// It sets s's sweepgen to the latest generation, -// and, based on the number of free objects in s, -// moves s to the appropriate list of c or returns it -// to the heap. -// freeSpan reports whether s was returned to the heap. -// If preserve=true, it does not move s (the caller -// must take care of it). -// -// For !go115NewMCentralImpl. -func (c *mcentral) freeSpan(s *mspan, preserve bool, wasempty bool) bool { - if sg := mheap_.sweepgen; s.sweepgen == sg+1 || s.sweepgen == sg+3 { - throw("freeSpan given cached span") - } - s.needzero = 1 - - if preserve { - // preserve is set only when called from (un)cacheSpan above, - // the span must be in the empty list. - if !s.inList() { - throw("can't preserve unlinked span") - } - atomic.Store(&s.sweepgen, mheap_.sweepgen) - return false - } - - lock(&c.lock) - - // Move to nonempty if necessary. - if wasempty { - c.empty.remove(s) - c.nonempty.insert(s) - } - - // delay updating sweepgen until here. This is the signal that - // the span may be used in an mcache, so it must come after the - // linked list operations above (actually, just after the - // lock of c above.) - atomic.Store(&s.sweepgen, mheap_.sweepgen) - - if s.allocCount != 0 { - unlock(&c.lock) - return false - } - - c.nonempty.remove(s) - unlock(&c.lock) - mheap_.freeSpan(s) - return true -} - // grow allocates a new empty span from the heap and initializes it for c's size class. func (c *mcentral) grow() *mspan { npages := uintptr(class_to_allocnpages[c.spanclass.sizeclass()]) diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index c8c4a4c758..bd87144355 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -2149,21 +2149,13 @@ func gcSweep(mode gcMode) { lock(&mheap_.lock) mheap_.sweepgen += 2 mheap_.sweepdone = 0 - if !go115NewMCentralImpl && mheap_.sweepSpans[mheap_.sweepgen/2%2].index != 0 { - // We should have drained this list during the last - // sweep phase. We certainly need to start this phase - // with an empty swept list. - throw("non-empty swept list") - } mheap_.pagesSwept = 0 mheap_.sweepArenas = mheap_.allArenas mheap_.reclaimIndex = 0 mheap_.reclaimCredit = 0 unlock(&mheap_.lock) - if go115NewMCentralImpl { - sweep.centralIndex.clear() - } + sweep.centralIndex.clear() if !_ConcurrentSweep || mode == gcForceBlockMode { // Special case synchronous sweep. diff --git a/src/runtime/mgcsweep.go b/src/runtime/mgcsweep.go index 9244174403..6b8c56ce35 100644 --- a/src/runtime/mgcsweep.go +++ b/src/runtime/mgcsweep.go @@ -132,17 +132,15 @@ func finishsweep_m() { sweep.npausesweep++ } - if go115NewMCentralImpl { - // Reset all the unswept buffers, which should be empty. - // Do this in sweep termination as opposed to mark termination - // so that we can catch unswept spans and reclaim blocks as - // soon as possible. - sg := mheap_.sweepgen - for i := range mheap_.central { - c := &mheap_.central[i].mcentral - c.partialUnswept(sg).reset() - c.fullUnswept(sg).reset() - } + // Reset all the unswept buffers, which should be empty. + // Do this in sweep termination as opposed to mark termination + // so that we can catch unswept spans and reclaim blocks as + // soon as possible. + sg := mheap_.sweepgen + for i := range mheap_.central { + c := &mheap_.central[i].mcentral + c.partialUnswept(sg).reset() + c.fullUnswept(sg).reset() } // Sweeping is done, so if the scavenger isn't already awake, @@ -202,11 +200,7 @@ func sweepone() uintptr { var s *mspan sg := mheap_.sweepgen for { - if go115NewMCentralImpl { - s = mheap_.nextSpanForSweep() - } else { - s = mheap_.sweepSpans[1-sg/2%2].pop() - } + s = mheap_.nextSpanForSweep() if s == nil { atomic.Store(&mheap_.sweepdone, 1) break @@ -322,9 +316,6 @@ func (s *mspan) ensureSwept() { // If preserve=true, don't return it to heap nor relink in mcentral lists; // caller takes care of it. func (s *mspan) sweep(preserve bool) bool { - if !go115NewMCentralImpl { - return s.oldSweep(preserve) - } // It's critical that we enter this function with preemption disabled, // GC must not start while we are in the middle of this function. _g_ := getg() @@ -568,214 +559,6 @@ func (s *mspan) sweep(preserve bool) bool { return false } -// 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; -// caller takes care of it. -// -// For !go115NewMCentralImpl. -func (s *mspan) oldSweep(preserve bool) bool { - // It's critical that we enter this function with preemption disabled, - // GC must not start while we are in the middle of this function. - _g_ := getg() - if _g_.m.locks == 0 && _g_.m.mallocing == 0 && _g_ != _g_.m.g0 { - throw("mspan.sweep: m is not locked") - } - sweepgen := mheap_.sweepgen - if state := s.state.get(); state != mSpanInUse || s.sweepgen != sweepgen-1 { - print("mspan.sweep: state=", state, " sweepgen=", s.sweepgen, " mheap.sweepgen=", sweepgen, "\n") - throw("mspan.sweep: bad span state") - } - - if trace.enabled { - traceGCSweepSpan(s.npages * _PageSize) - } - - atomic.Xadd64(&mheap_.pagesSwept, int64(s.npages)) - - spc := s.spanclass - size := s.elemsize - res := false - - c := _g_.m.p.ptr().mcache - freeToHeap := false - - // The allocBits indicate which unmarked objects don't need to be - // processed since they were free at the end of the last GC cycle - // and were not allocated since then. - // If the allocBits index is >= s.freeindex and the bit - // is not marked then the object remains unallocated - // since the last GC. - // This situation is analogous to being on a freelist. - - // Unlink & free special records for any objects we're about to free. - // Two complications here: - // 1. An object can have both finalizer and profile special records. - // In such case we need to queue finalizer for execution, - // mark the object as live and preserve the profile special. - // 2. A tiny object can have several finalizers setup for different offsets. - // If such object is not marked, we need to queue all finalizers at once. - // Both 1 and 2 are possible at the same time. - hadSpecials := s.specials != nil - specialp := &s.specials - special := *specialp - for special != nil { - // A finalizer can be set for an inner byte of an object, find object beginning. - objIndex := uintptr(special.offset) / size - p := s.base() + objIndex*size - mbits := s.markBitsForIndex(objIndex) - if !mbits.isMarked() { - // This object is not marked and has at least one special record. - // Pass 1: see if it has at least one finalizer. - hasFin := false - endOffset := p - s.base() + size - for tmp := special; tmp != nil && uintptr(tmp.offset) < endOffset; tmp = tmp.next { - if tmp.kind == _KindSpecialFinalizer { - // Stop freeing of object if it has a finalizer. - mbits.setMarkedNonAtomic() - hasFin = true - break - } - } - // Pass 2: queue all finalizers _or_ handle profile record. - for special != nil && uintptr(special.offset) < endOffset { - // Find the exact byte for which the special was setup - // (as opposed to object beginning). - p := s.base() + uintptr(special.offset) - if special.kind == _KindSpecialFinalizer || !hasFin { - // Splice out special record. - y := special - special = special.next - *specialp = special - freespecial(y, unsafe.Pointer(p), size) - } else { - // This is profile record, but the object has finalizers (so kept alive). - // Keep special record. - specialp = &special.next - special = *specialp - } - } - } else { - // object is still live: keep special record - specialp = &special.next - special = *specialp - } - } - if hadSpecials && s.specials == nil { - spanHasNoSpecials(s) - } - - if debug.allocfreetrace != 0 || debug.clobberfree != 0 || raceenabled || msanenabled { - // Find all newly freed objects. This doesn't have to - // efficient; allocfreetrace has massive overhead. - mbits := s.markBitsForBase() - abits := s.allocBitsForIndex(0) - for i := uintptr(0); i < s.nelems; i++ { - if !mbits.isMarked() && (abits.index < s.freeindex || abits.isMarked()) { - x := s.base() + i*s.elemsize - if debug.allocfreetrace != 0 { - tracefree(unsafe.Pointer(x), size) - } - if debug.clobberfree != 0 { - clobberfree(unsafe.Pointer(x), size) - } - if raceenabled { - racefree(unsafe.Pointer(x), size) - } - if msanenabled { - msanfree(unsafe.Pointer(x), size) - } - } - mbits.advance() - abits.advance() - } - } - - // Count the number of free objects in this span. - nalloc := uint16(s.countAlloc()) - if spc.sizeclass() == 0 && nalloc == 0 { - s.needzero = 1 - freeToHeap = true - } - nfreed := s.allocCount - nalloc - if nalloc > s.allocCount { - print("runtime: nelems=", s.nelems, " nalloc=", nalloc, " previous allocCount=", s.allocCount, " nfreed=", nfreed, "\n") - throw("sweep increased allocation count") - } - - s.allocCount = nalloc - wasempty := s.nextFreeIndex() == s.nelems - s.freeindex = 0 // reset allocation index to start of span. - if trace.enabled { - getg().m.p.ptr().traceReclaimed += uintptr(nfreed) * s.elemsize - } - - // gcmarkBits becomes the allocBits. - // get a fresh cleared gcmarkBits in preparation for next GC - s.allocBits = s.gcmarkBits - s.gcmarkBits = newMarkBits(s.nelems) - - // Initialize alloc bits cache. - s.refillAllocCache(0) - - // We need to set s.sweepgen = h.sweepgen only when all blocks are swept, - // because of the potential for a concurrent free/SetFinalizer. - // But we need to set it before we make the span available for allocation - // (return it to heap or mcentral), because allocation code assumes that a - // span is already swept if available for allocation. - if freeToHeap || nfreed == 0 { - // The span must be in our exclusive ownership until we update sweepgen, - // check for potential races. - if state := s.state.get(); state != mSpanInUse || s.sweepgen != sweepgen-1 { - print("mspan.sweep: state=", state, " sweepgen=", s.sweepgen, " mheap.sweepgen=", sweepgen, "\n") - throw("mspan.sweep: bad span state after sweep") - } - // Serialization point. - // At this point the mark bits are cleared and allocation ready - // to go so release the span. - atomic.Store(&s.sweepgen, sweepgen) - } - - if nfreed > 0 && spc.sizeclass() != 0 { - c.local_nsmallfree[spc.sizeclass()] += uintptr(nfreed) - res = mheap_.central[spc].mcentral.freeSpan(s, preserve, wasempty) - // mcentral.freeSpan updates sweepgen - } else if freeToHeap { - // Free large span to heap - - // NOTE(rsc,dvyukov): The original implementation of efence - // in CL 22060046 used sysFree instead of sysFault, so that - // the operating system would eventually give the memory - // back to us again, so that an efence program could run - // longer without running out of memory. Unfortunately, - // calling sysFree here without any kind of adjustment of the - // heap data structures means that when the memory does - // come back to us, we have the wrong metadata for it, either in - // the mspan structures or in the garbage collection bitmap. - // Using sysFault here means that the program will run out of - // memory fairly quickly in efence mode, but at least it won't - // have mysterious crashes due to confused memory reuse. - // It should be possible to switch back to sysFree if we also - // implement and then call some kind of mheap.deleteSpan. - if debug.efence > 0 { - s.limit = 0 // prevent mlookup from finding this span - sysFault(unsafe.Pointer(s.base()), size) - } else { - mheap_.freeSpan(s) - } - c.local_nlargefree++ - c.local_largefree += size - res = true - } - if !res { - // The span has been swept and is still in-use, so put - // it on the swept in-use list. - mheap_.sweepSpans[sweepgen/2%2].push(s) - } - return res -} - // reportZombies reports any marked but free objects in s and throws. // // This generally means one of the following: diff --git a/src/runtime/mgcsweepbuf.go b/src/runtime/mgcsweepbuf.go deleted file mode 100644 index 5e5ca3dd2f..0000000000 --- a/src/runtime/mgcsweepbuf.go +++ /dev/null @@ -1,138 +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 runtime - -import ( - "internal/cpu" - "runtime/internal/atomic" - "runtime/internal/sys" - "unsafe" -) - -// A gcSweepBuf is a set of *mspans. -// -// gcSweepBuf is safe for concurrent push operations *or* concurrent -// pop operations, but not both simultaneously. -type gcSweepBuf struct { - // A gcSweepBuf is a two-level data structure consisting of a - // growable spine that points to fixed-sized blocks. The spine - // can be accessed without locks, but adding a block or - // growing it requires taking the spine lock. - // - // Because each mspan covers at least 8K of heap and takes at - // most 8 bytes in the gcSweepBuf, the growth of the spine is - // quite limited. - // - // The spine and all blocks are allocated off-heap, which - // allows this to be used in the memory manager and avoids the - // need for write barriers on all of these. We never release - // this memory because there could be concurrent lock-free - // access and we're likely to reuse it anyway. (In principle, - // we could do this during STW.) - - spineLock mutex - spine unsafe.Pointer // *[N]*gcSweepBlock, accessed atomically - spineLen uintptr // Spine array length, accessed atomically - spineCap uintptr // Spine array cap, accessed under lock - - // index is the first unused slot in the logical concatenation - // of all blocks. It is accessed atomically. - index uint32 -} - -const ( - gcSweepBlockEntries = 512 // 4KB on 64-bit - gcSweepBufInitSpineCap = 256 // Enough for 1GB heap on 64-bit -) - -type gcSweepBlock struct { - spans [gcSweepBlockEntries]*mspan -} - -// push adds span s to buffer b. push is safe to call concurrently -// with other push operations, but NOT to call concurrently with pop. -func (b *gcSweepBuf) push(s *mspan) { - // Obtain our slot. - cursor := uintptr(atomic.Xadd(&b.index, +1) - 1) - top, bottom := cursor/gcSweepBlockEntries, cursor%gcSweepBlockEntries - - // Do we need to add a block? - spineLen := atomic.Loaduintptr(&b.spineLen) - var block *gcSweepBlock -retry: - if top < spineLen { - spine := atomic.Loadp(unsafe.Pointer(&b.spine)) - blockp := add(spine, sys.PtrSize*top) - block = (*gcSweepBlock)(atomic.Loadp(blockp)) - } else { - // Add a new block to the spine, potentially growing - // the spine. - lock(&b.spineLock) - // spineLen cannot change until we release the lock, - // but may have changed while we were waiting. - spineLen = atomic.Loaduintptr(&b.spineLen) - if top < spineLen { - unlock(&b.spineLock) - goto retry - } - - if spineLen == b.spineCap { - // Grow the spine. - newCap := b.spineCap * 2 - if newCap == 0 { - newCap = gcSweepBufInitSpineCap - } - newSpine := persistentalloc(newCap*sys.PtrSize, cpu.CacheLineSize, &memstats.gc_sys) - if b.spineCap != 0 { - // Blocks are allocated off-heap, so - // no write barriers. - memmove(newSpine, b.spine, b.spineCap*sys.PtrSize) - } - // Spine is allocated off-heap, so no write barrier. - atomic.StorepNoWB(unsafe.Pointer(&b.spine), newSpine) - b.spineCap = newCap - // We can't immediately free the old spine - // since a concurrent push with a lower index - // could still be reading from it. We let it - // leak because even a 1TB heap would waste - // less than 2MB of memory on old spines. If - // this is a problem, we could free old spines - // during STW. - } - - // Allocate a new block and add it to the spine. - block = (*gcSweepBlock)(persistentalloc(unsafe.Sizeof(gcSweepBlock{}), cpu.CacheLineSize, &memstats.gc_sys)) - blockp := add(b.spine, sys.PtrSize*top) - // Blocks are allocated off-heap, so no write barrier. - atomic.StorepNoWB(blockp, unsafe.Pointer(block)) - atomic.Storeuintptr(&b.spineLen, spineLen+1) - unlock(&b.spineLock) - } - - // We have a block. Insert the span atomically, since there may be - // concurrent readers via the block API. - atomic.StorepNoWB(unsafe.Pointer(&block.spans[bottom]), unsafe.Pointer(s)) -} - -// pop removes and returns a span from buffer b, or nil if b is empty. -// pop is safe to call concurrently with other pop operations, but NOT -// to call concurrently with push. -func (b *gcSweepBuf) pop() *mspan { - cursor := atomic.Xadd(&b.index, -1) - if int32(cursor) < 0 { - atomic.Xadd(&b.index, +1) - return nil - } - - // There are no concurrent spine or block modifications during - // pop, so we can omit the atomics. - top, bottom := cursor/gcSweepBlockEntries, cursor%gcSweepBlockEntries - blockp := (**gcSweepBlock)(add(b.spine, sys.PtrSize*uintptr(top))) - block := *blockp - s := block.spans[bottom] - // Clear the pointer for block(i). - block.spans[bottom] = nil - return s -} diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 0807726863..cb586171c4 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -44,15 +44,6 @@ const ( // Must be a multiple of the pageInUse bitmap element size and // must also evenly divid pagesPerArena. pagesPerReclaimerChunk = 512 - - // go115NewMCentralImpl is a feature flag for the new mcentral implementation. - // - // This flag depends on go115NewMarkrootSpans because the new mcentral - // implementation requires that markroot spans no longer rely on mgcsweepbufs. - // The definition of this flag helps ensure that if there's a problem with - // the new markroot spans implementation and it gets turned off, that the new - // mcentral implementation also gets turned off so the runtime isn't broken. - go115NewMCentralImpl = true ) // Main malloc heap. @@ -85,19 +76,6 @@ type mheap struct { // access (since that may free the backing store). allspans []*mspan // all spans out there - // sweepSpans contains two mspan stacks: one of swept in-use - // spans, and one of unswept in-use spans. These two trade - // roles on each GC cycle. Since the sweepgen increases by 2 - // on each cycle, this means the swept spans are in - // sweepSpans[sweepgen/2%2] and the unswept spans are in - // sweepSpans[1-sweepgen/2%2]. Sweeping pops spans from the - // unswept stack and pushes spans that are still in-use on the - // swept stack. Likewise, allocating an in-use span pushes it - // on the swept stack. - // - // For !go115NewMCentralImpl. - sweepSpans [2]gcSweepBuf - _ uint32 // align uint64 fields on 32-bit for atomics // Proportional sweep @@ -220,7 +198,7 @@ type mheap struct { base, end uintptr } - // _ uint32 // ensure 64-bit alignment of central + _ uint32 // ensure 64-bit alignment of central // central free lists for small size classes. // the padding makes sure that the mcentrals are @@ -719,8 +697,6 @@ func pageIndexOf(p uintptr) (arena *heapArena, pageIdx uintptr, pageMask uint8) // Initialize the heap. func (h *mheap) init() { lockInit(&h.lock, lockRankMheap) - lockInit(&h.sweepSpans[0].spineLock, lockRankSpine) - lockInit(&h.sweepSpans[1].spineLock, lockRankSpine) lockInit(&h.speciallock, lockRankMheapSpecial) h.spanalloc.init(unsafe.Sizeof(mspan{}), recordspan, unsafe.Pointer(h), &memstats.mspan_sys) @@ -1294,16 +1270,6 @@ HaveSpan: h.setSpans(s.base(), npages, s) if !manual { - if !go115NewMCentralImpl { - // Add to swept in-use list. - // - // This publishes the span to root marking. - // - // h.sweepgen is guaranteed to only change during STW, - // and preemption is disabled in the page allocator. - h.sweepSpans[h.sweepgen/2%2].push(s) - } - // Mark in-use span in arena page bitmap. // // This publishes the span to the page sweeper, so -- GitLab From a61a3c378d9ce71d9b97a1b4fb3320b8b3d6a599 Mon Sep 17 00:00:00 2001 From: Heisenberg Date: Thu, 11 Jun 2020 11:17:20 +0800 Subject: [PATCH 0230/1792] runtime: use the CBZ instruction in the assembler Use CBZ to replace the comparison and branch of arm64 and the zero instruction in the assembly file. Change-Id: Id6c03e9af13aadafc3ad3953f82d2ffa29c12926 Reviewed-on: https://go-review.googlesource.com/c/go/+/237497 Reviewed-by: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot --- src/runtime/rt0_freebsd_arm64.s | 3 +-- src/runtime/rt0_netbsd_arm64.s | 3 +-- src/runtime/rt0_openbsd_arm64.s | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/runtime/rt0_freebsd_arm64.s b/src/runtime/rt0_freebsd_arm64.s index 3a348c33e2..a938d98262 100644 --- a/src/runtime/rt0_freebsd_arm64.s +++ b/src/runtime/rt0_freebsd_arm64.s @@ -45,8 +45,7 @@ TEXT _rt0_arm64_freebsd_lib(SB),NOSPLIT,$184 // Create a new thread to do the runtime initialization and return. MOVD _cgo_sys_thread_create(SB), R4 - CMP $0, R4 - BEQ nocgo + CBZ R4, nocgo MOVD $_rt0_arm64_freebsd_lib_go(SB), R0 MOVD $0, R1 SUB $16, RSP // reserve 16 bytes for sp-8 where fp may be saved. diff --git a/src/runtime/rt0_netbsd_arm64.s b/src/runtime/rt0_netbsd_arm64.s index 75ecbe5176..2f3b5a5a87 100644 --- a/src/runtime/rt0_netbsd_arm64.s +++ b/src/runtime/rt0_netbsd_arm64.s @@ -44,8 +44,7 @@ TEXT _rt0_arm64_netbsd_lib(SB),NOSPLIT,$184 // Create a new thread to do the runtime initialization and return. MOVD _cgo_sys_thread_create(SB), R4 - CMP $0, R4 - BEQ nocgo + CBZ R4, nocgo MOVD $_rt0_arm64_netbsd_lib_go(SB), R0 MOVD $0, R1 SUB $16, RSP // reserve 16 bytes for sp-8 where fp may be saved. diff --git a/src/runtime/rt0_openbsd_arm64.s b/src/runtime/rt0_openbsd_arm64.s index 12408f2eec..722fab6129 100644 --- a/src/runtime/rt0_openbsd_arm64.s +++ b/src/runtime/rt0_openbsd_arm64.s @@ -50,8 +50,7 @@ TEXT _rt0_arm64_openbsd_lib(SB),NOSPLIT,$184 // Create a new thread to do the runtime initialization and return. MOVD _cgo_sys_thread_create(SB), R4 - CMP $0, R4 - BEQ nocgo + CBZ R4, nocgo MOVD $_rt0_arm64_openbsd_lib_go(SB), R0 MOVD $0, R1 SUB $16, RSP // reserve 16 bytes for sp-8 where fp may be saved. -- GitLab From 99d6e3eec2cad4387b28759322273d774cc94fe5 Mon Sep 17 00:00:00 2001 From: Heisenberg Date: Thu, 11 Jun 2020 10:16:33 +0800 Subject: [PATCH 0231/1792] internal/bytealg: use CBZ instructions Use CBZ to replace the comparison and jump to the zero instruction in the arm64 assembly file. Change-Id: Ie16fb52e27b4d327343e119ebc0f0ca756437bc4 Reviewed-on: https://go-review.googlesource.com/c/go/+/237477 Reviewed-by: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot --- src/internal/bytealg/compare_arm64.s | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/internal/bytealg/compare_arm64.s b/src/internal/bytealg/compare_arm64.s index 32e2ba200d..56d56f241e 100644 --- a/src/internal/bytealg/compare_arm64.s +++ b/src/internal/bytealg/compare_arm64.s @@ -36,8 +36,7 @@ TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0 CMP R0, R1 CSEL LT, R1, R0, R6 // R6 is min(R0, R1) - CMP $0, R6 - BEQ samebytes + CBZ R6, samebytes BIC $0xf, R6, R10 CBZ R10, small // length < 16 ADD R2, R10 // end of chunk16 -- GitLab From 17553c6e7154deab8501595f4fa387c0b718337a Mon Sep 17 00:00:00 2001 From: surechen Date: Mon, 27 Jul 2020 12:00:19 +0800 Subject: [PATCH 0232/1792] cmd/compile: move dumpFileSeq I noticed that there is a Todo comment here. This variable is only used for filename when dump a function's ssa passes result in details. It is no problem to print a function alone, but may be edited by not only one goroutine if dump multiple functions at the same time. Although it looks only dump one function's ssa passes now. As far as I am concerned this variable can be a member variable of the struct Func. I'm not sure if this change is necessary. Looking forward to your advices, thank you very much. Change-Id: I35dd7247889e0cc7f19c0b400b597206592dee75 Reviewed-on: https://go-review.googlesource.com/c/go/+/244918 Reviewed-by: Keith Randall Run-TryBot: Keith Randall --- src/cmd/compile/internal/ssa/compile.go | 7 ++----- src/cmd/compile/internal/ssa/func.go | 7 ++++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/cmd/compile/internal/ssa/compile.go b/src/cmd/compile/internal/ssa/compile.go index dbdd027716..444475d67a 100644 --- a/src/cmd/compile/internal/ssa/compile.go +++ b/src/cmd/compile/internal/ssa/compile.go @@ -160,15 +160,12 @@ func Compile(f *Func) { phaseName = "" } -// TODO: should be a config field -var dumpFileSeq int - // dumpFile creates a file from the phase name and function name // Dumping is done to files to avoid buffering huge strings before // output. func (f *Func) dumpFile(phaseName string) { - dumpFileSeq++ - fname := fmt.Sprintf("%s_%02d__%s.dump", f.Name, dumpFileSeq, phaseName) + f.dumpFileSeq++ + fname := fmt.Sprintf("%s_%02d__%s.dump", f.Name, int(f.dumpFileSeq), phaseName) fname = strings.Replace(fname, " ", "_", -1) fname = strings.Replace(fname, "/", "_", -1) fname = strings.Replace(fname, ":", "_", -1) diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go index 4b9189fb3e..9e40b6214c 100644 --- a/src/cmd/compile/internal/ssa/func.go +++ b/src/cmd/compile/internal/ssa/func.go @@ -44,9 +44,10 @@ type Func struct { PrintOrHtmlSSA bool // true if GOSSAFUNC matches, true even if fe.Log() (spew phase results to stdout) is false. ruleMatches map[string]int // number of times countRule was called during compilation for any given string - scheduled bool // Values in Blocks are in final order - laidout bool // Blocks are ordered - NoSplit bool // true if function is marked as nosplit. Used by schedule check pass. + scheduled bool // Values in Blocks are in final order + laidout bool // Blocks are ordered + NoSplit bool // true if function is marked as nosplit. Used by schedule check pass. + dumpFileSeq uint8 // the sequence numbers of dump file. (%s_%02d__%s.dump", funcname, dumpFileSeq, phaseName) // when register allocation is done, maps value ids to locations RegAlloc []Location -- GitLab From ba97be4b58241bebbc4ff70574bd82152ab19ffe Mon Sep 17 00:00:00 2001 From: liu-xuewen Date: Mon, 13 Jul 2020 09:15:38 +0000 Subject: [PATCH 0233/1792] runtime: remove tracebackinit and unused skipPC CL [152537](https://go-review.googlesource.com/c/go/+/152537/) changed the way inlined frames are represented in tracebacks to no longer use skipPC Change-Id: I42386fdcc5cf72f3c122e789b6af9cbd0c6bed4b GitHub-Last-Rev: 79c26dcd532907eda4ffc30951845c1c01243501 GitHub-Pull-Request: golang/go#39829 Reviewed-on: https://go-review.googlesource.com/c/go/+/239701 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/asm.s | 21 --------------------- src/runtime/proc.go | 1 - src/runtime/traceback.go | 13 ------------- 3 files changed, 35 deletions(-) diff --git a/src/runtime/asm.s b/src/runtime/asm.s index 95a3424de2..27d8df9e06 100644 --- a/src/runtime/asm.s +++ b/src/runtime/asm.s @@ -11,24 +11,3 @@ DATA runtime·no_pointers_stackmap+0x00(SB)/4, $2 DATA runtime·no_pointers_stackmap+0x04(SB)/4, $0 GLOBL runtime·no_pointers_stackmap(SB),RODATA, $8 - -// NaCl requires that these skips be verifiable machine code. -#ifdef GOARCH_amd64 -#define SKIP4 BYTE $0x90; BYTE $0x90; BYTE $0x90; BYTE $0x90 -#endif -#ifdef GOARCH_386 -#define SKIP4 BYTE $0x90; BYTE $0x90; BYTE $0x90; BYTE $0x90 -#endif -#ifdef GOARCH_wasm -#define SKIP4 UNDEF; UNDEF; UNDEF; UNDEF -#endif -#ifndef SKIP4 -#define SKIP4 WORD $0 -#endif - -#define SKIP16 SKIP4; SKIP4; SKIP4; SKIP4 -#define SKIP64 SKIP16; SKIP16; SKIP16; SKIP16 - -// This function must be sizeofSkipFunction bytes. -TEXT runtime·skipPleaseUseCallersFrames(SB),NOSPLIT,$0-0 - SKIP64; SKIP64; SKIP64; SKIP64 diff --git a/src/runtime/proc.go b/src/runtime/proc.go index ed7e2128ae..9a358cd529 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -558,7 +558,6 @@ func schedinit() { sched.maxmcount = 10000 - tracebackinit() moduledataverify() stackinit() mallocinit() diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index 96e552524e..7850eceafa 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -36,16 +36,6 @@ import ( const usesLR = sys.MinFrameSize > 0 -var skipPC uintptr - -func tracebackinit() { - // Go variable initialization happens late during runtime startup. - // Instead of initializing the variables above in the declarations, - // schedinit calls this function so that the variables are - // initialized and available earlier in the startup sequence. - skipPC = funcPC(skipPleaseUseCallersFrames) -} - // Traceback over the deferred function calls. // Report them like calls that have been invoked but not started executing yet. func tracebackdefers(gp *g, callback func(*stkframe, unsafe.Pointer) bool, v unsafe.Pointer) { @@ -83,9 +73,6 @@ func tracebackdefers(gp *g, callback func(*stkframe, unsafe.Pointer) bool, v uns const sizeofSkipFunction = 256 -// This function is defined in asm.s to be sizeofSkipFunction bytes long. -func skipPleaseUseCallersFrames() - // 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 -- GitLab From 88c094c96a164aef2134e548d495c4bc14dc4687 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 25 Jun 2020 09:10:23 -0700 Subject: [PATCH 0234/1792] runtime: print faulting instruction on a SIGFPE Just like SIGILL, it might be useful to see what the instruction that generated the SIGFPE is. Update #39816 Change-Id: I8b2ff692998f0b770289339537dceab96b09d1ee Reviewed-on: https://go-review.googlesource.com/c/go/+/239999 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/signal_unix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index dd6d79f8ec..6a11c91fb9 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -616,7 +616,7 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) { print("signal arrived during cgo execution\n") gp = _g_.m.lockedg.ptr() } - if sig == _SIGILL { + if sig == _SIGILL || sig == _SIGFPE { // It would be nice to know how long the instruction is. // Unfortunately, that's complicated to do in general (mostly for x86 // and s930x, but other archs have non-standard instruction lengths also). -- GitLab From 4e5ed83e8d2fbbbc8f6524f40ab3b6733dc57a38 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 3 Jul 2020 11:28:50 -0700 Subject: [PATCH 0235/1792] runtime: use bit-parallel operations to compute heap bit summaries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The new implementation is much faster in all cases. name old time/op new time/op delta PallocBitsSummarize/Unpacked00-16 142ns ± 1% 7ns ± 2% -94.75% (p=0.000 n=10+9) PallocBitsSummarize/UnpackedFFFFFFFFFFFFFFFF-16 172ns ± 0% 24ns ± 0% -86.02% (p=0.000 n=9+9) PallocBitsSummarize/UnpackedAA-16 145ns ± 0% 32ns ± 0% -78.16% (p=0.000 n=8+10) PallocBitsSummarize/UnpackedAAAAAAAAAAAAAAAA-16 172ns ± 0% 33ns ± 0% -80.95% (p=0.000 n=9+9) PallocBitsSummarize/Unpacked80000000AAAAAAAA-16 162ns ± 1% 60ns ± 0% -62.69% (p=0.000 n=10+9) PallocBitsSummarize/UnpackedAAAAAAAA00000001-16 163ns ± 0% 68ns ± 1% -58.47% (p=0.000 n=8+10) PallocBitsSummarize/UnpackedBBBBBBBBBBBBBBBB-16 172ns ± 0% 35ns ± 0% -79.70% (p=0.000 n=9+9) PallocBitsSummarize/Unpacked80000000BBBBBBBB-16 161ns ± 0% 63ns ± 0% -60.61% (p=0.000 n=8+10) PallocBitsSummarize/UnpackedBBBBBBBB00000001-16 163ns ± 0% 60ns ± 0% -63.14% (p=0.000 n=9+10) PallocBitsSummarize/UnpackedCCCCCCCCCCCCCCCC-16 172ns ± 0% 39ns ± 0% -77.41% (p=0.000 n=7+10) PallocBitsSummarize/Unpacked4444444444444444-16 172ns ± 0% 39ns ± 0% -77.42% (p=0.000 n=7+10) PallocBitsSummarize/Unpacked4040404040404040-16 173ns ± 2% 51ns ± 1% -70.55% (p=0.000 n=10+10) PallocBitsSummarize/Unpacked4000400040004000-16 160ns ± 1% 53ns ± 0% -66.78% (p=0.000 n=10+10) PallocBitsSummarize/Unpacked1000404044CCAAFF-16 169ns ± 1% 59ns ± 1% -65.28% (p=0.000 n=10+10) Change-Id: I94daa645b76a9cf9c93edeb2058d7132216fcb72 Reviewed-on: https://go-review.googlesource.com/c/go/+/240900 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek --- src/runtime/mpallocbits.go | 147 ++++++++++++++++++-------------- src/runtime/mpallocbits_test.go | 36 +++++--- 2 files changed, 108 insertions(+), 75 deletions(-) diff --git a/src/runtime/mpallocbits.go b/src/runtime/mpallocbits.go index a8011341bc..ff79bfbc1a 100644 --- a/src/runtime/mpallocbits.go +++ b/src/runtime/mpallocbits.go @@ -120,78 +120,99 @@ func (b *pageBits) popcntRange(i, n uint) (s uint) { // sake of documentation, 0s are free pages and 1s are allocated pages. type pallocBits pageBits -// consec8tab is a table containing the number of consecutive -// zero bits for any uint8 value. -// -// The table is generated by calling consec8(i) for each -// possible uint8 value, which is defined as: -// -// // consec8 counts the maximum number of consecutive 0 bits -// // in a uint8. -// func consec8(n uint8) int { -// n = ^n -// i := 0 -// for n != 0 { -// n &= (n << 1) -// i++ -// } -// return i -// } -var consec8tab = [256]uint{ - 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 5, 4, 3, 3, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, - 4, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, - 6, 5, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, - 4, 3, 2, 2, 2, 1, 1, 1, 3, 2, 1, 1, 2, 1, 1, 1, - 5, 4, 3, 3, 2, 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, 1, - 4, 3, 2, 2, 2, 1, 1, 1, 3, 2, 1, 1, 2, 1, 1, 1, - 7, 6, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, - 4, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, - 5, 4, 3, 3, 2, 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, 1, - 4, 3, 2, 2, 2, 1, 1, 1, 3, 2, 1, 1, 2, 1, 1, 1, - 6, 5, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, - 4, 3, 2, 2, 2, 1, 1, 1, 3, 2, 1, 1, 2, 1, 1, 1, - 5, 4, 3, 3, 2, 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, 1, - 4, 3, 2, 2, 2, 1, 1, 1, 3, 2, 1, 1, 2, 1, 1, 0, -} - // summarize returns a packed summary of the bitmap in pallocBits. func (b *pallocBits) summarize() pallocSum { - // TODO(mknyszek): There may be something more clever to be done - // here to make the summarize operation more efficient. For example, - // we can compute start and end with 64-bit wide operations easily, - // but max is a bit more complex. Perhaps there exists some way to - // leverage the 64-bit start and end to our advantage? - var start, max, end uint + var start, max, cur uint + const notSetYet = ^uint(0) // sentinel for start value + start = notSetYet for i := 0; i < len(b); i++ { - a := b[i] - for j := 0; j < 64; j += 8 { - k := uint8(a >> j) - - // Compute start. - si := uint(sys.TrailingZeros8(k)) - if start == uint(i*64+j) { - start += si - } + x := b[i] + if x == 0 { + cur += 64 + continue + } + t := uint(sys.TrailingZeros64(x)) + l := uint(sys.LeadingZeros64(x)) - // Compute max. - if end+si > max { - max = end + si - } - if mi := consec8tab[k]; mi > max { - max = mi + // Finish any region spanning the uint64s + cur += t + if start == notSetYet { + start = cur + } + if cur > max { + max = cur + } + // Final region that might span to next uint64 + cur = l + } + if start == notSetYet { + // Made it all the way through without finding a single 1 bit. + const n = uint(64 * len(b)) + return packPallocSum(n, n, n) + } + if cur > max { + max = cur + } + if max >= 64-2 { + // There is no way an internal run of zeros could beat max. + return packPallocSum(start, max, cur) + } + // Now look inside each uint64 for runs of zeros. + // All uint64s must be nonzero, or we would have aborted above. +outer: + for i := 0; i < len(b); i++ { + x := b[i] + + // Look inside this uint64. We have a pattern like + // 000000 1xxxxx1 000000 + // We need to look inside the 1xxxxx1 for any contiguous + // region of zeros. + + // We already know the trailing zeros are no larger than max. Remove them. + x >>= sys.TrailingZeros64(x) & 63 + if x&(x+1) == 0 { // no more zeros (except at the top). + continue + } + + // Strategy: shrink all runs of zeros by max. If any runs of zero + // remain, then we've identified a larger maxiumum 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 { + // Shrink all runs of zeros by p places (except the top zeros). + for p > 0 { + if p <= k { + // Shift p ones down into the top of each run of zeros. + x |= x >> (p & 63) + if x&(x+1) == 0 { // no more zeros (except at the top). + continue outer + } + break + } + // Shift k ones down into the top of each run of zeros. + x |= x >> (k & 63) + if x&(x+1) == 0 { // no more zeros (except at the top). + continue outer + } + p -= k + // We've just doubled the minimum length of 1-runs. + // This allows us to shift farther in the next iteration. + k *= 2 } - // Compute end. - if k == 0 { - end += 8 - } else { - end = uint(sys.LeadingZeros8(k)) + // The length of the lowest-order zero run is an increment to our maximum. + j := uint(sys.TrailingZeros64(^x)) // count contiguous trailing ones + x >>= j & 63 // remove trailing ones + j = uint(sys.TrailingZeros64(x)) // count contiguous trailing zeros + x >>= j & 63 // remove zeros + max += j // we have a new maximum! + if x&(x+1) == 0 { // no more zeros (except at the top). + continue outer } + p = j // remove j more zeros from each zero run. } } - return packPallocSum(start, max, end) + return packPallocSum(start, max, cur) } // find searches for npages contiguous free pages in pallocBits and returns diff --git a/src/runtime/mpallocbits_test.go b/src/runtime/mpallocbits_test.go index 71a29f3b3a..42268a1698 100644 --- a/src/runtime/mpallocbits_test.go +++ b/src/runtime/mpallocbits_test.go @@ -101,7 +101,7 @@ func invertPallocBits(b *PallocBits) { // Ensures two packed summaries are identical, and reports a detailed description // of the difference if they're not. -func checkPallocSum(t *testing.T, got, want PallocSum) { +func checkPallocSum(t testing.TB, got, want PallocSum) { if got.Start() != want.Start() { t.Errorf("inconsistent start: got %d, want %d", got.Start(), want.Start()) } @@ -297,17 +297,29 @@ func TestPallocBitsSummarize(t *testing.T) { // Benchmarks how quickly we can summarize a PallocBits. func BenchmarkPallocBitsSummarize(b *testing.B) { - buf0 := new(PallocBits) - buf1 := new(PallocBits) - for i := 0; i < len(buf1); i++ { - buf1[i] = ^uint64(0) - } - bufa := new(PallocBits) - for i := 0; i < len(bufa); i++ { - bufa[i] = 0xaa - } - for _, buf := range []*PallocBits{buf0, buf1, bufa} { - b.Run(fmt.Sprintf("Unpacked%02X", buf[0]), func(b *testing.B) { + patterns := []uint64{ + 0, + ^uint64(0), + 0xaa, + 0xaaaaaaaaaaaaaaaa, + 0x80000000aaaaaaaa, + 0xaaaaaaaa00000001, + 0xbbbbbbbbbbbbbbbb, + 0x80000000bbbbbbbb, + 0xbbbbbbbb00000001, + 0xcccccccccccccccc, + 0x4444444444444444, + 0x4040404040404040, + 0x4000400040004000, + 0x1000404044ccaaff, + } + for _, p := range patterns { + buf := new(PallocBits) + for i := 0; i < len(buf); i++ { + buf[i] = p + } + b.Run(fmt.Sprintf("Unpacked%02X", p), func(b *testing.B) { + checkPallocSum(b, buf.Summarize(), SummarizeSlow(buf)) for i := 0; i < b.N; i++ { buf.Summarize() } -- GitLab From 8b8f926fc3f0e8f002d0a8e97aab9500e4db83a7 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 6 Jul 2020 20:46:31 -0700 Subject: [PATCH 0236/1792] runtime: bit parallel implementation of findBitRange64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a bit-parallel implementation of findBitRange64. It uses a repeated shift-'N-and technique to erase all the free marks that are too small for the allocation. Also some small improvements to find1. name old time/op new time/op delta FindBitRange64/Pattern00Size2-16 4.19ns ± 0% 2.26ns ± 0% -46.04% (p=0.000 n=10+8) FindBitRange64/Pattern00Size8-16 4.19ns ± 0% 2.12ns ± 0% -49.35% (p=0.000 n=9+10) FindBitRange64/Pattern00Size32-16 4.20ns ± 0% 2.12ns ± 0% -49.49% (p=0.000 n=10+8) FindBitRange64/PatternFFFFFFFFFFFFFFFFSize2-16 2.13ns ± 0% 2.27ns ± 0% +6.28% (p=0.000 n=10+10) FindBitRange64/PatternFFFFFFFFFFFFFFFFSize8-16 2.13ns ± 0% 4.46ns ± 0% +109.39% (p=0.000 n=10+9) FindBitRange64/PatternFFFFFFFFFFFFFFFFSize32-16 2.13ns ± 1% 5.58ns ± 0% +162.37% (p=0.000 n=10+9) FindBitRange64/PatternAASize2-16 22.2ns ± 0% 2.3ns ± 0% -89.82% (p=0.000 n=9+8) FindBitRange64/PatternAASize8-16 22.2ns ± 0% 2.1ns ± 1% -90.41% (p=0.000 n=9+10) FindBitRange64/PatternAASize32-16 22.2ns ± 0% 2.1ns ± 1% -90.43% (p=0.000 n=10+10) FindBitRange64/PatternAAAAAAAAAAAAAAAASize2-16 156ns ± 1% 2ns ± 0% -98.54% (p=0.000 n=10+10) FindBitRange64/PatternAAAAAAAAAAAAAAAASize8-16 155ns ± 1% 2ns ± 0% -98.63% (p=0.000 n=10+8) FindBitRange64/PatternAAAAAAAAAAAAAAAASize32-16 155ns ± 0% 2ns ± 1% -98.63% (p=0.000 n=8+10) FindBitRange64/Pattern80000000AAAAAAAASize2-16 81.2ns ± 0% 2.3ns ± 1% -97.21% (p=0.000 n=10+10) FindBitRange64/Pattern80000000AAAAAAAASize8-16 81.1ns ± 0% 2.1ns ± 0% -97.39% (p=0.000 n=10+9) FindBitRange64/Pattern80000000AAAAAAAASize32-16 81.1ns ± 0% 2.1ns ± 0% -97.38% (p=0.000 n=10+10) FindBitRange64/PatternAAAAAAAA00000001Size2-16 76.8ns ± 1% 2.3ns ± 0% -97.05% (p=0.000 n=10+10) FindBitRange64/PatternAAAAAAAA00000001Size8-16 76.6ns ± 0% 2.1ns ± 0% -97.23% (p=0.000 n=8+10) FindBitRange64/PatternAAAAAAAA00000001Size32-16 76.7ns ± 0% 2.1ns ± 0% -97.23% (p=0.000 n=9+9) FindBitRange64/PatternBBBBBBBBBBBBBBBBSize2-16 2.13ns ± 0% 2.27ns ± 0% +6.57% (p=0.000 n=8+8) FindBitRange64/PatternBBBBBBBBBBBBBBBBSize8-16 76.7ns ± 0% 2.9ns ± 0% -96.20% (p=0.000 n=9+10) FindBitRange64/PatternBBBBBBBBBBBBBBBBSize32-16 76.7ns ± 0% 2.9ns ± 0% -96.20% (p=0.000 n=10+10) FindBitRange64/Pattern80000000BBBBBBBBSize2-16 2.12ns ± 0% 2.27ns ± 1% +6.74% (p=0.000 n=10+10) FindBitRange64/Pattern80000000BBBBBBBBSize8-16 44.8ns ± 0% 2.9ns ± 0% -93.49% (p=0.000 n=9+10) FindBitRange64/Pattern80000000BBBBBBBBSize32-16 44.9ns ± 0% 2.9ns ± 0% -93.49% (p=0.000 n=10+8) FindBitRange64/PatternBBBBBBBB00000001Size2-16 4.20ns ± 1% 2.27ns ± 1% -46.02% (p=0.000 n=10+10) FindBitRange64/PatternBBBBBBBB00000001Size8-16 44.9ns ± 0% 2.9ns ± 1% -93.51% (p=0.000 n=10+9) FindBitRange64/PatternBBBBBBBB00000001Size32-16 44.9ns ± 0% 2.9ns ± 0% -93.51% (p=0.000 n=10+9) FindBitRange64/PatternCCCCCCCCCCCCCCCCSize2-16 4.19ns ± 0% 2.26ns ± 0% -46.10% (p=0.000 n=10+10) FindBitRange64/PatternCCCCCCCCCCCCCCCCSize8-16 76.5ns ± 0% 2.9ns ± 0% -96.19% (p=0.000 n=8+7) FindBitRange64/PatternCCCCCCCCCCCCCCCCSize32-16 76.5ns ± 0% 2.9ns ± 0% -96.19% (p=0.000 n=10+8) FindBitRange64/Pattern4444444444444444Size2-16 76.4ns ± 0% 2.3ns ± 0% -97.04% (p=0.000 n=8+10) FindBitRange64/Pattern4444444444444444Size8-16 76.5ns ± 0% 2.1ns ± 0% -97.23% (p=0.000 n=9+10) FindBitRange64/Pattern4444444444444444Size32-16 76.5ns ± 0% 2.1ns ± 0% -97.23% (p=0.000 n=8+10) FindBitRange64/Pattern4040404040404040Size2-16 40.3ns ± 0% 2.3ns ± 0% -94.38% (p=0.000 n=7+10) FindBitRange64/Pattern4040404040404040Size8-16 40.2ns ± 0% 2.1ns ± 0% -94.75% (p=0.000 n=10+10) FindBitRange64/Pattern4040404040404040Size32-16 40.2ns ± 0% 2.1ns ± 0% -94.76% (p=0.000 n=10+6) FindBitRange64/Pattern4000400040004000Size2-16 22.2ns ± 0% 2.2ns ± 0% -89.86% (p=0.001 n=8+9) FindBitRange64/Pattern4000400040004000Size8-16 22.2ns ± 0% 2.1ns ± 0% -90.52% (p=0.000 n=8+10) FindBitRange64/Pattern4000400040004000Size32-16 22.2ns ± 1% 2.1ns ± 0% -90.50% (p=0.000 n=10+10) The cases that slow down aren't really that slow, and those inputs never actually occur (there's a short circuit before the call to findBitRange64 for that case). Change-Id: I50fae62915098032d8ce7fa57ef29eee9deb01ba Reviewed-on: https://go-review.googlesource.com/c/go/+/241279 Reviewed-by: Michael Knyszek --- src/runtime/mpallocbits.go | 41 ++++++++++++++++++++++++--------- src/runtime/mpallocbits_test.go | 33 ++++++++++++++++++++++++-- 2 files changed, 61 insertions(+), 13 deletions(-) diff --git a/src/runtime/mpallocbits.go b/src/runtime/mpallocbits.go index ff79bfbc1a..ff112300c3 100644 --- a/src/runtime/mpallocbits.go +++ b/src/runtime/mpallocbits.go @@ -218,7 +218,7 @@ outer: // find searches for npages contiguous free pages in pallocBits and returns // the index where that run starts, as well as the index of the first free page // it found in the search. searchIdx represents the first known free page and -// where to begin the search from. +// where to begin the next search from. // // If find fails to find any free space, it returns an index of ^uint(0) and // the new searchIdx should be ignored. @@ -239,9 +239,10 @@ func (b *pallocBits) find(npages uintptr, searchIdx uint) (uint, uint) { // // See find for an explanation of the searchIdx parameter. func (b *pallocBits) find1(searchIdx uint) uint { + _ = b[0] // lift nil check out of loop for i := searchIdx / 64; i < uint(len(b)); i++ { x := b[i] - if x == ^uint64(0) { + if ^x == 0 { continue } return i*64 + uint(sys.TrailingZeros64(^x)) @@ -263,18 +264,18 @@ func (b *pallocBits) findSmallN(npages uintptr, searchIdx uint) (uint, uint) { end, newSearchIdx := uint(0), ^uint(0) for i := searchIdx / 64; i < uint(len(b)); i++ { bi := b[i] - if bi == ^uint64(0) { + if ^bi == 0 { end = 0 continue } // First see if we can pack our allocation in the trailing // zeros plus the end of the last 64 bits. - start := uint(sys.TrailingZeros64(bi)) if newSearchIdx == ^uint(0) { // The new searchIdx is going to be at these 64 bits after any // 1s we file, so count trailing 1s. newSearchIdx = i*64 + uint(sys.TrailingZeros64(^bi)) } + start := uint(sys.TrailingZeros64(bi)) if end+start >= uint(npages) { return i*64 - end, newSearchIdx } @@ -369,15 +370,33 @@ func (b *pallocBits) pages64(i uint) uint64 { // findBitRange64 returns the bit index of the first set of // n consecutive 1 bits. If no consecutive set of 1 bits of // size n may be found in c, then it returns an integer >= 64. +// n must be > 0. func findBitRange64(c uint64, n uint) uint { - i := uint(0) - cont := uint(sys.TrailingZeros64(^c)) - for cont < n && i < 64 { - i += cont - i += uint(sys.TrailingZeros64(c >> i)) - cont = uint(sys.TrailingZeros64(^(c >> i))) + // This implementation is based on shrinking the length of + // runs of contiguous 1 bits. We remove the top n-1 1 bits + // from each run of 1s, then look for the first remaining 1 bit. + p := n - 1 // number of 1s we want to remove. + k := uint(1) // current minimum width of runs of 0 in c. + for p > 0 { + if p <= k { + // Shift p 0s down into the top of each run of 1s. + c &= c >> (p & 63) + break + } + // Shift k 0s down into the top of each run of 1s. + c &= c >> (k & 63) + if c == 0 { + return 64 + } + p -= k + // We've just doubled the minimum length of 0-runs. + // This allows us to shift farther in the next iteration. + k *= 2 } - return i + // Find first remaining 1. + // Since we shrunk from the top down, the first 1 is in + // its correct original position. + return uint(sys.TrailingZeros64(c)) } // pallocData encapsulates pallocBits and a bitmap for diff --git a/src/runtime/mpallocbits_test.go b/src/runtime/mpallocbits_test.go index 42268a1698..5095e24220 100644 --- a/src/runtime/mpallocbits_test.go +++ b/src/runtime/mpallocbits_test.go @@ -504,10 +504,9 @@ func TestFindBitRange64(t *testing.T) { t.Errorf("case (%016x, %d): got %d, want %d", x, n, i, result) } } - for i := uint(0); i <= 64; i++ { + for i := uint(1); i <= 64; i++ { check(^uint64(0), i, 0) } - check(0, 0, 0) for i := uint(1); i <= 64; i++ { check(0, i, ^uint(0)) } @@ -520,3 +519,33 @@ func TestFindBitRange64(t *testing.T) { check(0xffff03ff0107ffff, 16, 0) check(0x0fff03ff01079fff, 16, ^uint(0)) } + +func BenchmarkFindBitRange64(b *testing.B) { + patterns := []uint64{ + 0, + ^uint64(0), + 0xaa, + 0xaaaaaaaaaaaaaaaa, + 0x80000000aaaaaaaa, + 0xaaaaaaaa00000001, + 0xbbbbbbbbbbbbbbbb, + 0x80000000bbbbbbbb, + 0xbbbbbbbb00000001, + 0xcccccccccccccccc, + 0x4444444444444444, + 0x4040404040404040, + 0x4000400040004000, + } + sizes := []uint{ + 2, 8, 32, + } + for _, pattern := range patterns { + for _, size := range sizes { + b.Run(fmt.Sprintf("Pattern%02XSize%d", pattern, size), func(b *testing.B) { + for i := 0; i < b.N; i++ { + FindBitRange64(pattern, size) + } + }) + } + } +} -- GitLab From ef9c8a38ad177fa7f48dfaad5d0e27f39a03529d Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 7 Jul 2020 09:32:12 -0700 Subject: [PATCH 0237/1792] cmd/compile: don't rewrite (CMP (AND x y) 0) to TEST if AND has other uses If the AND has other uses, we end up saving an argument to the AND in another register, so we can use it for the TEST. No point in doing that. Change-Id: I73444a6aeddd6f55e2328ce04d77c3e6cf4a83e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/241280 Run-TryBot: Keith Randall Reviewed-by: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/gen/AMD64.rules | 16 +-- src/cmd/compile/internal/ssa/rewriteAMD64.go | 128 ++++++++++++++----- test/codegen/logic.go | 24 ++++ 3 files changed, 128 insertions(+), 40 deletions(-) create mode 100644 test/codegen/logic.go diff --git a/src/cmd/compile/internal/ssa/gen/AMD64.rules b/src/cmd/compile/internal/ssa/gen/AMD64.rules index 9967c7b030..5111ef79d3 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64.rules +++ b/src/cmd/compile/internal/ssa/gen/AMD64.rules @@ -1463,14 +1463,14 @@ (MULQconst [c] (NEGQ x)) && c != -(1<<31) -> (MULQconst [-c] x) // checking AND against 0. -(CMPQconst (ANDQ x y) [0]) -> (TESTQ x y) -(CMPLconst (ANDL x y) [0]) -> (TESTL x y) -(CMPWconst (ANDL x y) [0]) -> (TESTW x y) -(CMPBconst (ANDL x y) [0]) -> (TESTB x y) -(CMPQconst (ANDQconst [c] x) [0]) -> (TESTQconst [c] x) -(CMPLconst (ANDLconst [c] x) [0]) -> (TESTLconst [c] x) -(CMPWconst (ANDLconst [c] x) [0]) -> (TESTWconst [int64(int16(c))] x) -(CMPBconst (ANDLconst [c] x) [0]) -> (TESTBconst [int64(int8(c))] x) +(CMPQconst a:(ANDQ x y) [0]) && a.Uses == 1 -> (TESTQ x y) +(CMPLconst a:(ANDL x y) [0]) && a.Uses == 1 -> (TESTL x y) +(CMPWconst a:(ANDL x y) [0]) && a.Uses == 1 -> (TESTW x y) +(CMPBconst a:(ANDL x y) [0]) && a.Uses == 1 -> (TESTB x y) +(CMPQconst a:(ANDQconst [c] x) [0]) && a.Uses == 1 -> (TESTQconst [c] x) +(CMPLconst a:(ANDLconst [c] x) [0]) && a.Uses == 1 -> (TESTLconst [c] x) +(CMPWconst a:(ANDLconst [c] x) [0]) && a.Uses == 1 -> (TESTWconst [int64(int16(c))] x) +(CMPBconst a:(ANDLconst [c] x) [0]) && a.Uses == 1 -> (TESTBconst [int64(int8(c))] x) // Convert TESTx to TESTxconst if possible. (TESTQ (MOVQconst [c]) x) && is32Bit(c) -> (TESTQconst [c] x) diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index 20eab05e9c..cda9df56f4 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -6924,26 +6924,42 @@ func rewriteValueAMD64_OpAMD64CMPBconst(v *Value) bool { v.reset(OpAMD64FlagLT_ULT) return true } - // match: (CMPBconst (ANDL x y) [0]) + // match: (CMPBconst a:(ANDL x y) [0]) + // cond: a.Uses == 1 // result: (TESTB x y) for { - if v.AuxInt != 0 || v_0.Op != OpAMD64ANDL { + if v.AuxInt != 0 { + break + } + a := v_0 + if a.Op != OpAMD64ANDL { + break + } + y := a.Args[1] + x := a.Args[0] + if !(a.Uses == 1) { break } - y := v_0.Args[1] - x := v_0.Args[0] v.reset(OpAMD64TESTB) v.AddArg2(x, y) return true } - // match: (CMPBconst (ANDLconst [c] x) [0]) + // match: (CMPBconst a:(ANDLconst [c] x) [0]) + // cond: a.Uses == 1 // result: (TESTBconst [int64(int8(c))] x) for { - if v.AuxInt != 0 || v_0.Op != OpAMD64ANDLconst { + if v.AuxInt != 0 { + break + } + a := v_0 + if a.Op != OpAMD64ANDLconst { + break + } + c := a.AuxInt + x := a.Args[0] + if !(a.Uses == 1) { break } - c := v_0.AuxInt - x := v_0.Args[0] v.reset(OpAMD64TESTBconst) v.AuxInt = int64(int8(c)) v.AddArg(x) @@ -7309,26 +7325,42 @@ func rewriteValueAMD64_OpAMD64CMPLconst(v *Value) bool { v.reset(OpAMD64FlagLT_ULT) return true } - // match: (CMPLconst (ANDL x y) [0]) + // match: (CMPLconst a:(ANDL x y) [0]) + // cond: a.Uses == 1 // result: (TESTL x y) for { - if v.AuxInt != 0 || v_0.Op != OpAMD64ANDL { + if v.AuxInt != 0 { + break + } + a := v_0 + if a.Op != OpAMD64ANDL { + break + } + y := a.Args[1] + x := a.Args[0] + if !(a.Uses == 1) { break } - y := v_0.Args[1] - x := v_0.Args[0] v.reset(OpAMD64TESTL) v.AddArg2(x, y) return true } - // match: (CMPLconst (ANDLconst [c] x) [0]) + // match: (CMPLconst a:(ANDLconst [c] x) [0]) + // cond: a.Uses == 1 // result: (TESTLconst [c] x) for { - if v.AuxInt != 0 || v_0.Op != OpAMD64ANDLconst { + if v.AuxInt != 0 { + break + } + a := v_0 + if a.Op != OpAMD64ANDLconst { + break + } + c := a.AuxInt + x := a.Args[0] + if !(a.Uses == 1) { break } - c := v_0.AuxInt - x := v_0.Args[0] v.reset(OpAMD64TESTLconst) v.AuxInt = c v.AddArg(x) @@ -7874,26 +7906,42 @@ func rewriteValueAMD64_OpAMD64CMPQconst(v *Value) bool { v.reset(OpAMD64FlagLT_ULT) return true } - // match: (CMPQconst (ANDQ x y) [0]) + // match: (CMPQconst a:(ANDQ x y) [0]) + // cond: a.Uses == 1 // result: (TESTQ x y) for { - if v.AuxInt != 0 || v_0.Op != OpAMD64ANDQ { + if v.AuxInt != 0 { + break + } + a := v_0 + if a.Op != OpAMD64ANDQ { + break + } + y := a.Args[1] + x := a.Args[0] + if !(a.Uses == 1) { break } - y := v_0.Args[1] - x := v_0.Args[0] v.reset(OpAMD64TESTQ) v.AddArg2(x, y) return true } - // match: (CMPQconst (ANDQconst [c] x) [0]) + // match: (CMPQconst a:(ANDQconst [c] x) [0]) + // cond: a.Uses == 1 // result: (TESTQconst [c] x) for { - if v.AuxInt != 0 || v_0.Op != OpAMD64ANDQconst { + if v.AuxInt != 0 { + break + } + a := v_0 + if a.Op != OpAMD64ANDQconst { + break + } + c := a.AuxInt + x := a.Args[0] + if !(a.Uses == 1) { break } - c := v_0.AuxInt - x := v_0.Args[0] v.reset(OpAMD64TESTQconst) v.AuxInt = c v.AddArg(x) @@ -8244,26 +8292,42 @@ func rewriteValueAMD64_OpAMD64CMPWconst(v *Value) bool { v.reset(OpAMD64FlagLT_ULT) return true } - // match: (CMPWconst (ANDL x y) [0]) + // match: (CMPWconst a:(ANDL x y) [0]) + // cond: a.Uses == 1 // result: (TESTW x y) for { - if v.AuxInt != 0 || v_0.Op != OpAMD64ANDL { + if v.AuxInt != 0 { + break + } + a := v_0 + if a.Op != OpAMD64ANDL { + break + } + y := a.Args[1] + x := a.Args[0] + if !(a.Uses == 1) { break } - y := v_0.Args[1] - x := v_0.Args[0] v.reset(OpAMD64TESTW) v.AddArg2(x, y) return true } - // match: (CMPWconst (ANDLconst [c] x) [0]) + // match: (CMPWconst a:(ANDLconst [c] x) [0]) + // cond: a.Uses == 1 // result: (TESTWconst [int64(int16(c))] x) for { - if v.AuxInt != 0 || v_0.Op != OpAMD64ANDLconst { + if v.AuxInt != 0 { + break + } + a := v_0 + if a.Op != OpAMD64ANDLconst { + break + } + c := a.AuxInt + x := a.Args[0] + if !(a.Uses == 1) { break } - c := v_0.AuxInt - x := v_0.Args[0] v.reset(OpAMD64TESTWconst) v.AuxInt = int64(int16(c)) v.AddArg(x) diff --git a/test/codegen/logic.go b/test/codegen/logic.go new file mode 100644 index 0000000000..9afdfd760f --- /dev/null +++ b/test/codegen/logic.go @@ -0,0 +1,24 @@ +// asmcheck + +// 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 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 + if z == 0 { + return 77 + } + // use z by returning it + return z +} -- GitLab From 77a11c05d6a6f766c75f804ea9b8796f9a9f85a3 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 17 Jun 2020 18:22:38 -0700 Subject: [PATCH 0238/1792] reflect: remove depth from deepequal recursion We aren't using it for anything. The visited map will terminate any recursion for us. Change-Id: I36e6bd8e34952123c2ed46323067e42928ec7168 Reviewed-on: https://go-review.googlesource.com/c/go/+/238759 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/reflect/deepequal.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/reflect/deepequal.go b/src/reflect/deepequal.go index 8a2bf8b09e..be66464129 100644 --- a/src/reflect/deepequal.go +++ b/src/reflect/deepequal.go @@ -21,7 +21,7 @@ type visit struct { // Tests for deep equality using reflected types. The map argument tracks // comparisons that have already been seen, which allows short circuiting on // recursive types. -func deepValueEqual(v1, v2 Value, visited map[visit]bool, depth int) bool { +func deepValueEqual(v1, v2 Value, visited map[visit]bool) bool { if !v1.IsValid() || !v2.IsValid() { return v1.IsValid() == v2.IsValid() } @@ -29,8 +29,6 @@ func deepValueEqual(v1, v2 Value, visited map[visit]bool, depth int) bool { return false } - // if depth > 10 { panic("deepValueEqual") } // for debugging - // We want to avoid putting more in the visited map than we need to. // For any possible reference cycle that might be encountered, // hard(v1, v2) needs to return true for at least one of the types in the cycle, @@ -79,7 +77,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]bool, depth int) bool { switch v1.Kind() { case Array: for i := 0; i < v1.Len(); i++ { - if !deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) { + if !deepValueEqual(v1.Index(i), v2.Index(i), visited) { return false } } @@ -95,7 +93,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]bool, depth int) bool { return true } for i := 0; i < v1.Len(); i++ { - if !deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) { + if !deepValueEqual(v1.Index(i), v2.Index(i), visited) { return false } } @@ -104,15 +102,15 @@ func deepValueEqual(v1, v2 Value, visited map[visit]bool, depth int) bool { if v1.IsNil() || v2.IsNil() { return v1.IsNil() == v2.IsNil() } - return deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1) + return deepValueEqual(v1.Elem(), v2.Elem(), visited) case Ptr: if v1.Pointer() == v2.Pointer() { return true } - return deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1) + return deepValueEqual(v1.Elem(), v2.Elem(), visited) case Struct: for i, n := 0, v1.NumField(); i < n; i++ { - if !deepValueEqual(v1.Field(i), v2.Field(i), visited, depth+1) { + if !deepValueEqual(v1.Field(i), v2.Field(i), visited) { return false } } @@ -130,7 +128,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]bool, depth int) bool { for _, k := range v1.MapKeys() { val1 := v1.MapIndex(k) val2 := v2.MapIndex(k) - if !val1.IsValid() || !val2.IsValid() || !deepValueEqual(val1, val2, visited, depth+1) { + if !val1.IsValid() || !val2.IsValid() || !deepValueEqual(val1, val2, visited) { return false } } @@ -207,5 +205,5 @@ func DeepEqual(x, y interface{}) bool { if v1.Type() != v2.Type() { return false } - return deepValueEqual(v1, v2, make(map[visit]bool), 0) + return deepValueEqual(v1, v2, make(map[visit]bool)) } -- GitLab From db4cda2ec0955854c8ff556ac19ec5e67d48d090 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Mon, 17 Aug 2020 12:25:49 -0700 Subject: [PATCH 0239/1792] testing/iotest: correct ErrReader signature and remove exported error Corrects ErrReader's signature to what was accepted in the approved proposal, and also removes an exported ErrIO which wasn't part of the proposal and is unnecessary. The new signature allows users to customize their own errors. While here, started examples, with ErrReader leading the way. Updates #38781 Change-Id: Ia7f84721f11061343cfef8b1adc2b7b69bc3f43c Reviewed-on: https://go-review.googlesource.com/c/go/+/248898 Run-TryBot: Emmanuel Odeke Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/testing/iotest/example_test.go | 22 ++++++++++++++++++++++ src/testing/iotest/logger_test.go | 4 ++-- src/testing/iotest/reader.go | 17 ++++++++--------- src/testing/iotest/reader_test.go | 27 +++++++++++++++++++++------ 4 files changed, 53 insertions(+), 17 deletions(-) create mode 100644 src/testing/iotest/example_test.go diff --git a/src/testing/iotest/example_test.go b/src/testing/iotest/example_test.go new file mode 100644 index 0000000000..10f6bd38f7 --- /dev/null +++ b/src/testing/iotest/example_test.go @@ -0,0 +1,22 @@ +// 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 iotest_test + +import ( + "errors" + "fmt" + "testing/iotest" +) + +func ExampleErrReader() { + // A reader that always returns a custom error. + r := iotest.ErrReader(errors.New("custom error")) + n, err := r.Read(nil) + fmt.Printf("n: %d\nerr: %q\n", n, err) + + // Output: + // n: 0 + // err: "custom error" +} diff --git a/src/testing/iotest/logger_test.go b/src/testing/iotest/logger_test.go index 575f37e05c..fec4467cc6 100644 --- a/src/testing/iotest/logger_test.go +++ b/src/testing/iotest/logger_test.go @@ -138,14 +138,14 @@ func TestReadLogger_errorOnRead(t *testing.T) { data := []byte("Hello, World!") p := make([]byte, len(data)) - lr := ErrReader() + lr := ErrReader(errors.New("io failure")) rl := NewReadLogger("read", lr) n, err := rl.Read(p) if err == nil { t.Fatalf("Unexpectedly succeeded to read: %v", err) } - wantLogWithHex := fmt.Sprintf("lr: read %x: %v\n", p[:n], "io") + wantLogWithHex := fmt.Sprintf("lr: read %x: io failure\n", p[:n]) if g, w := lOut.String(), wantLogWithHex; g != w { t.Errorf("ReadLogger mismatch\n\tgot: %q\n\twant: %q", g, w) } diff --git a/src/testing/iotest/reader.go b/src/testing/iotest/reader.go index b18e912f27..bc2f72a911 100644 --- a/src/testing/iotest/reader.go +++ b/src/testing/iotest/reader.go @@ -88,16 +88,15 @@ func (r *timeoutReader) Read(p []byte) (int, error) { return r.r.Read(p) } -// ErrIO is a fake IO error. -var ErrIO = errors.New("io") - -// ErrReader returns a fake error every time it is read from. -func ErrReader() io.Reader { - return errReader(0) +// ErrReader returns an io.Reader that returns 0, err from all Read calls. +func ErrReader(err error) io.Reader { + return &alwaysErrReader{err: err} } -type errReader int +type alwaysErrReader struct { + err error +} -func (r errReader) Read(p []byte) (int, error) { - return 0, ErrIO +func (aer *alwaysErrReader) Read(p []byte) (int, error) { + return 0, aer.err } diff --git a/src/testing/iotest/reader_test.go b/src/testing/iotest/reader_test.go index ccba22ee29..6004e841e5 100644 --- a/src/testing/iotest/reader_test.go +++ b/src/testing/iotest/reader_test.go @@ -6,6 +6,7 @@ package iotest import ( "bytes" + "errors" "io" "testing" ) @@ -226,11 +227,25 @@ func TestDataErrReader_emptyReader(t *testing.T) { } func TestErrReader(t *testing.T) { - n, err := ErrReader().Read([]byte{}) - if err != ErrIO { - t.Errorf("ErrReader.Read(any) should have returned ErrIO, returned %v", err) - } - if n != 0 { - t.Errorf("ErrReader.Read(any) should have read 0 bytes, read %v", n) + cases := []struct { + name string + err error + }{ + {"nil error", nil}, + {"non-nil error", errors.New("io failure")}, + {"io.EOF", io.EOF}, + } + + for _, tt := range cases { + tt := tt + t.Run(tt.name, func(t *testing.T) { + n, err := ErrReader(tt.err).Read(nil) + if err != tt.err { + t.Fatalf("Error mismatch\nGot: %v\nWant: %v", err, tt.err) + } + if n != 0 { + t.Fatalf("Byte count mismatch: got %d want 0", n) + } + }) } } -- GitLab From 7fbd8c75c6c57e713069a3a405e5cde26cfae090 Mon Sep 17 00:00:00 2001 From: lihaowei Date: Fri, 14 Aug 2020 10:35:46 +0000 Subject: [PATCH 0240/1792] all: fix spelling mistakes Change-Id: I7d512281d8442d306594b57b5deaecd132b5ea9e GitHub-Last-Rev: 251e1d6857516b21fd71f654133f81f23ffec654 GitHub-Pull-Request: golang/go#40793 Reviewed-on: https://go-review.googlesource.com/c/go/+/248441 Reviewed-by: Dave Cheney --- src/bufio/bufio.go | 2 +- src/net/http/client.go | 2 +- src/runtime/mheap.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bufio/bufio.go b/src/bufio/bufio.go index 7cbd5424ea..6baf9b9e40 100644 --- a/src/bufio/bufio.go +++ b/src/bufio/bufio.go @@ -425,7 +425,7 @@ func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error) { // of bytes in the combined first two elements, error). // The complete result is equal to // `bytes.Join(append(fullBuffers, finalFragment), nil)`, which has a -// length of `totalLen`. The result is strucured in this way to allow callers +// length of `totalLen`. The result is structured in this way to allow callers // to minimize allocations and copies. func (b *Reader) collectFragments(delim byte) (fullBuffers [][]byte, finalFragment []byte, totalLen int, err error) { var frag []byte diff --git a/src/net/http/client.go b/src/net/http/client.go index 3860d97d8f..6ca0d2e6cf 100644 --- a/src/net/http/client.go +++ b/src/net/http/client.go @@ -321,7 +321,7 @@ func knownRoundTripperImpl(rt RoundTripper, req *Request) bool { return true } // There's a very minor chance of a false positive with this. - // Insted of detecting our golang.org/x/net/http2.Transport, + // Instead of detecting our golang.org/x/net/http2.Transport, // it might detect a Transport type in a different http2 // package. But I know of none, and the only problem would be // some temporarily leaked goroutines if the transport didn't diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index cb586171c4..1a57bcd66e 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -42,7 +42,7 @@ const ( // roughly 100µs. // // Must be a multiple of the pageInUse bitmap element size and - // must also evenly divid pagesPerArena. + // must also evenly divide pagesPerArena. pagesPerReclaimerChunk = 512 ) -- GitLab From 06337823ef4d9c57b1b01f9b97a348a47277a9df Mon Sep 17 00:00:00 2001 From: Junchen Li Date: Fri, 10 Jul 2020 11:39:23 +0800 Subject: [PATCH 0241/1792] cmd/compile: optimize unsigned comparisons to 0/1 on arm64 For an unsigned integer, it's useful to convert its order test with 0/1 to its equality test with 0. We can save a comparison instruction that followed by a conditional branch on arm64 since it supports compare-with-zero-and-branch instructions. For example, if x > 0 { ... } else { ... } the original version: CMP $0, R0 BLS 9 the optimized version: CBZ R0, 8 Updates #21439 Change-Id: Id1de6f865f6aa72c5d45b29f7894818857288425 Reviewed-on: https://go-review.googlesource.com/c/go/+/246857 Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/ARM64.rules | 10 + src/cmd/compile/internal/ssa/rewriteARM64.go | 204 +++++++++++++++++++ test/codegen/comparisons.go | 32 +++ 3 files changed, 246 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 442d769fdd..27959d01fc 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -279,6 +279,16 @@ (Less32F x y) => (LessThanF (FCMPS x y)) (Less64F x y) => (LessThanF (FCMPD x y)) +// For an unsigned integer x, the following rules are useful when combining branch +// 0 < x => x != 0 +// x <= 0 => x == 0 +// 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) + (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)) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 8e48b33628..023d9908c2 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -21976,6 +21976,31 @@ func rewriteValueARM64_OpLeq16U(v *Value) bool { v_0 := v.Args[0] b := v.Block typ := &b.Func.Config.Types + // match: (Leq16U x zero:(MOVDconst [0])) + // result: (Eq16 x zero) + for { + x := v_0 + zero := v_1 + if zero.Op != OpARM64MOVDconst || auxIntToInt64(zero.AuxInt) != 0 { + break + } + v.reset(OpEq16) + v.AddArg2(x, zero) + return true + } + // match: (Leq16U (MOVDconst [1]) x) + // result: (Neq16 (MOVDconst [0]) x) + for { + if v_0.Op != OpARM64MOVDconst || auxIntToInt64(v_0.AuxInt) != 1 { + break + } + x := v_1 + v.reset(OpNeq16) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = int64ToAuxInt(0) + v.AddArg2(v0, x) + return true + } // match: (Leq16U x y) // result: (LessEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { @@ -22028,6 +22053,32 @@ func rewriteValueARM64_OpLeq32U(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] b := v.Block + typ := &b.Func.Config.Types + // match: (Leq32U x zero:(MOVDconst [0])) + // result: (Eq32 x zero) + for { + x := v_0 + zero := v_1 + if zero.Op != OpARM64MOVDconst || auxIntToInt64(zero.AuxInt) != 0 { + break + } + v.reset(OpEq32) + v.AddArg2(x, zero) + return true + } + // match: (Leq32U (MOVDconst [1]) x) + // result: (Neq32 (MOVDconst [0]) x) + for { + if v_0.Op != OpARM64MOVDconst || auxIntToInt64(v_0.AuxInt) != 1 { + break + } + x := v_1 + v.reset(OpNeq32) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = int64ToAuxInt(0) + v.AddArg2(v0, x) + return true + } // match: (Leq32U x y) // result: (LessEqualU (CMPW x y)) for { @@ -22076,6 +22127,32 @@ func rewriteValueARM64_OpLeq64U(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] b := v.Block + typ := &b.Func.Config.Types + // match: (Leq64U x zero:(MOVDconst [0])) + // result: (Eq64 x zero) + for { + x := v_0 + zero := v_1 + if zero.Op != OpARM64MOVDconst || auxIntToInt64(zero.AuxInt) != 0 { + break + } + v.reset(OpEq64) + v.AddArg2(x, zero) + return true + } + // match: (Leq64U (MOVDconst [1]) x) + // result: (Neq64 (MOVDconst [0]) x) + for { + if v_0.Op != OpARM64MOVDconst || auxIntToInt64(v_0.AuxInt) != 1 { + break + } + x := v_1 + v.reset(OpNeq64) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = int64ToAuxInt(0) + v.AddArg2(v0, x) + return true + } // match: (Leq64U x y) // result: (LessEqualU (CMP x y)) for { @@ -22114,6 +22191,31 @@ func rewriteValueARM64_OpLeq8U(v *Value) bool { v_0 := v.Args[0] b := v.Block typ := &b.Func.Config.Types + // match: (Leq8U x zero:(MOVDconst [0])) + // result: (Eq8 x zero) + for { + x := v_0 + zero := v_1 + if zero.Op != OpARM64MOVDconst || auxIntToInt64(zero.AuxInt) != 0 { + break + } + v.reset(OpEq8) + v.AddArg2(x, zero) + return true + } + // match: (Leq8U (MOVDconst [1]) x) + // result: (Neq8 (MOVDconst [0]) x) + for { + if v_0.Op != OpARM64MOVDconst || auxIntToInt64(v_0.AuxInt) != 1 { + break + } + x := v_1 + v.reset(OpNeq8) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = int64ToAuxInt(0) + v.AddArg2(v0, x) + return true + } // match: (Leq8U x y) // result: (LessEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { @@ -22156,6 +22258,31 @@ func rewriteValueARM64_OpLess16U(v *Value) bool { v_0 := v.Args[0] b := v.Block typ := &b.Func.Config.Types + // match: (Less16U zero:(MOVDconst [0]) x) + // result: (Neq16 zero x) + for { + zero := v_0 + if zero.Op != OpARM64MOVDconst || auxIntToInt64(zero.AuxInt) != 0 { + break + } + x := v_1 + v.reset(OpNeq16) + v.AddArg2(zero, x) + return true + } + // match: (Less16U x (MOVDconst [1])) + // result: (Eq16 x (MOVDconst [0])) + for { + x := v_0 + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { + break + } + v.reset(OpEq16) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = int64ToAuxInt(0) + v.AddArg2(x, v0) + return true + } // match: (Less16U x y) // result: (LessThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { @@ -22208,6 +22335,32 @@ func rewriteValueARM64_OpLess32U(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] b := v.Block + typ := &b.Func.Config.Types + // match: (Less32U zero:(MOVDconst [0]) x) + // result: (Neq32 zero x) + for { + zero := v_0 + if zero.Op != OpARM64MOVDconst || auxIntToInt64(zero.AuxInt) != 0 { + break + } + x := v_1 + v.reset(OpNeq32) + v.AddArg2(zero, x) + return true + } + // match: (Less32U x (MOVDconst [1])) + // result: (Eq32 x (MOVDconst [0])) + for { + x := v_0 + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { + break + } + v.reset(OpEq32) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = int64ToAuxInt(0) + v.AddArg2(x, v0) + return true + } // match: (Less32U x y) // result: (LessThanU (CMPW x y)) for { @@ -22256,6 +22409,32 @@ func rewriteValueARM64_OpLess64U(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] b := v.Block + typ := &b.Func.Config.Types + // match: (Less64U zero:(MOVDconst [0]) x) + // result: (Neq64 zero x) + for { + zero := v_0 + if zero.Op != OpARM64MOVDconst || auxIntToInt64(zero.AuxInt) != 0 { + break + } + x := v_1 + v.reset(OpNeq64) + v.AddArg2(zero, x) + return true + } + // match: (Less64U x (MOVDconst [1])) + // result: (Eq64 x (MOVDconst [0])) + for { + x := v_0 + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { + break + } + v.reset(OpEq64) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = int64ToAuxInt(0) + v.AddArg2(x, v0) + return true + } // match: (Less64U x y) // result: (LessThanU (CMP x y)) for { @@ -22294,6 +22473,31 @@ func rewriteValueARM64_OpLess8U(v *Value) bool { v_0 := v.Args[0] b := v.Block typ := &b.Func.Config.Types + // match: (Less8U zero:(MOVDconst [0]) x) + // result: (Neq8 zero x) + for { + zero := v_0 + if zero.Op != OpARM64MOVDconst || auxIntToInt64(zero.AuxInt) != 0 { + break + } + x := v_1 + v.reset(OpNeq8) + v.AddArg2(zero, x) + return true + } + // match: (Less8U x (MOVDconst [1])) + // result: (Eq8 x (MOVDconst [0])) + for { + x := v_0 + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { + break + } + v.reset(OpEq8) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = int64ToAuxInt(0) + v.AddArg2(x, v0) + return true + } // match: (Less8U x y) // result: (LessThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { diff --git a/test/codegen/comparisons.go b/test/codegen/comparisons.go index f3c15538a8..3c2dcb7eba 100644 --- a/test/codegen/comparisons.go +++ b/test/codegen/comparisons.go @@ -424,3 +424,35 @@ func UintGeqZero(a uint8, b uint16, c uint32, d uint64) int { } return 0 } + +func UintGtZero(a uint8, b uint16, c uint32, d uint64) int { + // arm64: `CBZW`, `CBNZW`, `CBNZ`, -`(CMPW|CMP|BLS|BHI)` + if a > 0 || b > 0 || c > 0 || d > 0 { + return 1 + } + return 0 +} + +func UintLeqZero(a uint8, b uint16, c uint32, d uint64) int { + // arm64: `CBNZW`, `CBZW`, `CBZ`, -`(CMPW|CMP|BHI|BLS)` + if a <= 0 || b <= 0 || c <= 0 || d <= 0 { + return 1 + } + return 0 +} + +func UintLtOne(a uint8, b uint16, c uint32, d uint64) int { + // arm64: `CBNZW`, `CBZW`, `CBZW`, `CBZ`, -`(CMPW|CMP|BHS|BLO)` + if a < 1 || b < 1 || c < 1 || d < 1 { + return 1 + } + return 0 +} + +func UintGeqOne(a uint8, b uint16, c uint32, d uint64) int { + // arm64: `CBZW`, `CBNZW`, `CBNZ`, -`(CMPW|CMP|BLO|BHS)` + if a >= 1 || b >= 1 || c >= 1 || d >= 1 { + return 1 + } + return 0 +} -- GitLab From 6dad1b4c9bb63cad432bcddb7aec0d36f03f8341 Mon Sep 17 00:00:00 2001 From: alex-semenyuk Date: Sun, 17 May 2020 16:05:05 +0000 Subject: [PATCH 0242/1792] cmd/cgo: close file Change-Id: Ia70edc8ba22e31e498fe07946db41882804bd39f GitHub-Last-Rev: 280232e879965b34fae3aa02e6215eff5bd7be46 GitHub-Pull-Request: golang/go#39120 Reviewed-on: https://go-review.googlesource.com/c/go/+/234317 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/cgo/out.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 4064f0ae41..50d2811f1b 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -243,6 +243,7 @@ func (p *Package) writeDefs() { if err != nil { fatalf("%s", err) } + defer fgcch.Close() _, err = io.Copy(fexp, fgcch) if err != nil { fatalf("%s", err) -- GitLab From 613388315e29d4e906805e602602500ca1e7e334 Mon Sep 17 00:00:00 2001 From: Cholerae Hu Date: Mon, 11 May 2020 11:18:57 +0800 Subject: [PATCH 0243/1792] runtime: reduce critical path in injectglist Change-Id: Ia3fb30ac9add39c803f11f69d967c6604fdeacf8 Reviewed-on: https://go-review.googlesource.com/c/go/+/233217 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/proc.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 9a358cd529..5e38b3194c 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -2575,15 +2575,20 @@ func injectglist(glist *gList) { return } - lock(&sched.lock) - npidle := int(sched.npidle) + npidle := int(atomic.Load(&sched.npidle)) + var globq gQueue var n int for n = 0; n < npidle && !q.empty(); n++ { - globrunqput(q.pop()) + g := q.pop() + globq.pushBack(g) + } + if n > 0 { + lock(&sched.lock) + globrunqputbatch(&globq, int32(n)) + unlock(&sched.lock) + startIdle(n) + qsize -= n } - unlock(&sched.lock) - startIdle(n) - qsize -= n if !q.empty() { runqputbatch(pp, &q, qsize) -- GitLab From a745171e6b30394b661a040d04e8807b4bd0c7da Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 17 Aug 2020 21:59:07 -0700 Subject: [PATCH 0244/1792] cmd/compile: fix SSA type comparison A typo in the conversion code caused comparisons of SSA types to report CMPeq when they were not in fact equal. Fixes #40837 Change-Id: I0627eee51d524a585908b34a4590bc533c8415fc Reviewed-on: https://go-review.googlesource.com/c/go/+/248781 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Cuong Manh Le Reviewed-by: Emmanuel Odeke --- src/cmd/compile/internal/types/type.go | 3 ++- src/cmd/compile/internal/types/type_test.go | 28 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/cmd/compile/internal/types/type_test.go diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go index 3b7b31c5d6..91b54b43d4 100644 --- a/src/cmd/compile/internal/types/type.go +++ b/src/cmd/compile/internal/types/type.go @@ -131,6 +131,7 @@ type Type struct { // TPTR: Ptr // TARRAY: *Array // TSLICE: Slice + // TSSA: string Extra interface{} // Width is the width of this Type in bytes. @@ -1026,7 +1027,7 @@ func (t *Type) cmp(x *Type) Cmp { case TSSA: tname := t.Extra.(string) - xname := t.Extra.(string) + xname := x.Extra.(string) // desire fast sorting, not pretty sorting. if len(tname) == len(xname) { if tname == xname { diff --git a/src/cmd/compile/internal/types/type_test.go b/src/cmd/compile/internal/types/type_test.go new file mode 100644 index 0000000000..fe3f380b21 --- /dev/null +++ b/src/cmd/compile/internal/types/type_test.go @@ -0,0 +1,28 @@ +// 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 types_test + +import ( + "cmd/compile/internal/types" + "testing" +) + +func TestSSACompare(t *testing.T) { + a := []*types.Type{ + types.TypeInvalid, + types.TypeMem, + types.TypeFlags, + types.TypeVoid, + types.TypeInt128, + } + for _, x := range a { + for _, y := range a { + c := x.Compare(y) + if x == y && c != types.CMPeq || x != y && c == types.CMPeq { + t.Errorf("%s compare %s == %d\n", x.Extra, y.Extra, c) + } + } + } +} -- GitLab From 4b94e881611890c6d6cbda6f542a94ab08de17e0 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 7 May 2020 20:48:37 +0200 Subject: [PATCH 0245/1792] net: simplify error return in *RawConn test helpers No need to check operr before returning. Change-Id: I64b849f7c102de01180823e3f0123d438ce7608a Reviewed-on: https://go-review.googlesource.com/c/go/+/232797 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/net/rawconn_unix_test.go | 20 ++++---------------- src/net/rawconn_windows_test.go | 20 ++++---------------- 2 files changed, 8 insertions(+), 32 deletions(-) diff --git a/src/net/rawconn_unix_test.go b/src/net/rawconn_unix_test.go index a71b6f3041..0194ba67c8 100644 --- a/src/net/rawconn_unix_test.go +++ b/src/net/rawconn_unix_test.go @@ -24,10 +24,7 @@ func readRawConn(c syscall.RawConn, b []byte) (int, error) { if err != nil { return n, err } - if operr != nil { - return n, operr - } - return n, nil + return n, operr } func writeRawConn(c syscall.RawConn, b []byte) error { @@ -42,10 +39,7 @@ func writeRawConn(c syscall.RawConn, b []byte) error { if err != nil { return err } - if operr != nil { - return operr - } - return nil + return operr } func controlRawConn(c syscall.RawConn, addr Addr) error { @@ -87,10 +81,7 @@ func controlRawConn(c syscall.RawConn, addr Addr) error { if err := c.Control(fn); err != nil { return err } - if operr != nil { - return operr - } - return nil + return operr } func controlOnConnSetup(network string, address string, c syscall.RawConn) error { @@ -120,8 +111,5 @@ func controlOnConnSetup(network string, address string, c syscall.RawConn) error if err := c.Control(fn); err != nil { return err } - if operr != nil { - return operr - } - return nil + return operr } diff --git a/src/net/rawconn_windows_test.go b/src/net/rawconn_windows_test.go index 2774c97e5c..5febf08f77 100644 --- a/src/net/rawconn_windows_test.go +++ b/src/net/rawconn_windows_test.go @@ -26,10 +26,7 @@ func readRawConn(c syscall.RawConn, b []byte) (int, error) { if err != nil { return n, err } - if operr != nil { - return n, operr - } - return n, nil + return n, operr } func writeRawConn(c syscall.RawConn, b []byte) error { @@ -45,10 +42,7 @@ func writeRawConn(c syscall.RawConn, b []byte) error { if err != nil { return err } - if operr != nil { - return operr - } - return nil + return operr } func controlRawConn(c syscall.RawConn, addr Addr) error { @@ -92,10 +86,7 @@ func controlRawConn(c syscall.RawConn, addr Addr) error { if err := c.Control(fn); err != nil { return err } - if operr != nil { - return operr - } - return nil + return operr } func controlOnConnSetup(network string, address string, c syscall.RawConn) error { @@ -121,8 +112,5 @@ func controlOnConnSetup(network string, address string, c syscall.RawConn) error if err := c.Control(fn); err != nil { return err } - if operr != nil { - return operr - } - return nil + return operr } -- GitLab From 4149493443f09c14d9f0fad7030704ed57149b55 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 17 Aug 2020 16:32:33 +0200 Subject: [PATCH 0246/1792] runtime: move startupRandomData declaration to os_linux.go startupRandomData is only used in sysauxv and getRandomData on linux, thus move it closer to where it is used. Also adjust its godoc comment. Change-Id: Ice51d579ec33436adbfdf247caf4ba00bae865e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/248761 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/os_linux.go | 4 ++++ src/runtime/runtime2.go | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index 22931b4d5c..9702920bcf 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -249,6 +249,10 @@ func sysargs(argc int32, argv **byte) { sysauxv(buf[:]) } +// startupRandomData holds random bytes initialized at startup. These come from +// the ELF AT_RANDOM auxiliary vector. +var startupRandomData []byte + func sysauxv(auxv []uintptr) int { var i int for ; auxv[i] != _AT_NULL; i += 2 { diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 0bddcaa789..959878400d 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -845,10 +845,6 @@ type forcegcstate struct { idle uint32 } -// startup_random_data holds random bytes initialized at startup. These come from -// the ELF AT_RANDOM auxiliary vector (vdso_linux_amd64.go or os_linux_386.go). -var startupRandomData []byte - // extendRandom extends the random numbers in r[:n] to the whole slice r. // Treats n<0 as n==0. func extendRandom(r []byte, n int) { -- GitLab From 26407b22129e2e54db269c1a92826521addd8d56 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Wed, 12 Aug 2020 19:26:53 -0400 Subject: [PATCH 0247/1792] [dev.link] cmd/{compile,link}: remove pcdata tables from pclntab_old MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the pctables out of pclntab_old. Creates a new generator symbol, runtime.pctab, which holds all the deduplicated pctables. Also, tightens up some of the types in runtime. Darwin, cmd/compile statistics: alloc/op Pclntab_GC 26.4MB ± 0% 13.8MB ± 0% allocs/op Pclntab_GC 89.9k ± 0% 86.4k ± 0% liveB Pclntab_GC 25.5M ± 0% 24.2M ± 0% No significant change in binary size. Change-Id: I1560fd4421f8a210f8d4b508fbc54e1780e338f9 Reviewed-on: https://go-review.googlesource.com/c/go/+/248332 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/data.go | 2 + src/cmd/link/internal/ld/pcln.go | 143 ++++++++++++------ src/cmd/link/internal/ld/symtab.go | 4 + src/cmd/link/internal/loader/symbolbuilder.go | 9 ++ src/cmd/link/internal/sym/symbol.go | 4 - src/debug/gosym/pclntab.go | 10 +- src/runtime/runtime2.go | 8 +- src/runtime/symtab.go | 28 ++-- 8 files changed, 136 insertions(+), 72 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index a551d46403..2aecbfbeb5 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1925,6 +1925,7 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.funcnametab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.cutab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.filetab", 0), sect) + ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pctab", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.pclntab_old", 0), sect) ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.epclntab", 0), sect) if ctxt.HeadType == objabi.Haix { @@ -2511,6 +2512,7 @@ func (ctxt *Link) address() []*sym.Segment { ctxt.defineInternal("runtime.funcnametab", sym.SRODATA) ctxt.defineInternal("runtime.cutab", sym.SRODATA) ctxt.defineInternal("runtime.filetab", sym.SRODATA) + ctxt.defineInternal("runtime.pctab", sym.SRODATA) ctxt.defineInternal("runtime.pclntab_old", sym.SRODATA) ctxt.xdefine("runtime.epclntab", sym.SRODATA, int64(pclntab.Vaddr+pclntab.Length)) ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, int64(noptr.Vaddr)) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index e9fd5937e7..576f1c3780 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -43,6 +43,7 @@ type pclntab struct { findfunctab loader.Sym cutab loader.Sym filetab loader.Sym + pctab loader.Sym // The number of functions + number of TEXT sections - 1. This is such an // unexpected value because platforms that have more than one TEXT section @@ -273,10 +274,11 @@ func (state *pclntab) generatePCHeader(ctxt *Link) { off = writeSymOffset(off, state.funcnametab) off = writeSymOffset(off, state.cutab) off = writeSymOffset(off, state.filetab) + off = writeSymOffset(off, state.pctab) off = writeSymOffset(off, state.pclntab) } - size := int64(8 + 6*ctxt.Arch.PtrSize) + size := int64(8 + 7*ctxt.Arch.PtrSize) state.pcheader = state.addGeneratedSym(ctxt, "runtime.pcheader", size, writeHeader) } @@ -463,6 +465,68 @@ func (state *pclntab) generateFilenameTabs(ctxt *Link, compUnits []*sym.Compilat return cuOffsets } +// generatePctab creates the runtime.pctab variable, holding all the +// deduplicated pcdata. +func (state *pclntab) generatePctab(ctxt *Link, container loader.Bitmap) { + ldr := ctxt.loader + + // Pctab offsets of 0 are considered invalid in the runtime. We respect + // that by just padding a single byte at the beginning of runtime.pctab, + // that way no real offsets can be zero. + size := int64(1) + + // Walk the functions, finding offset to store each pcdata. + seen := make(map[loader.Sym]struct{}) + saveOffset := func(pcSym loader.Sym) { + if _, ok := seen[pcSym]; !ok { + datSize := ldr.SymSize(pcSym) + if datSize != 0 { + ldr.SetSymValue(pcSym, size) + } else { + // Invalid PC data, record as zero. + ldr.SetSymValue(pcSym, 0) + } + size += datSize + seen[pcSym] = struct{}{} + } + } + for _, s := range ctxt.Textp { + if !emitPcln(ctxt, s, container) { + continue + } + fi := ldr.FuncInfo(s) + if !fi.Valid() { + continue + } + fi.Preload() + + pcSyms := []loader.Sym{fi.Pcsp(), fi.Pcfile(), fi.Pcline()} + for _, pcSym := range pcSyms { + saveOffset(pcSym) + } + for _, pcSym := range fi.Pcdata() { + saveOffset(pcSym) + } + if fi.NumInlTree() > 0 { + saveOffset(fi.Pcinline()) + } + } + + // TODO: There is no reason we need a generator for this variable, and it + // could be moved to a carrier symbol. However, carrier symbols containing + // carrier symbols don't work yet (as of Aug 2020). Once this is fixed, + // runtime.pctab could just be a carrier sym. + writePctab := func(ctxt *Link, s loader.Sym) { + ldr := ctxt.loader + sb := ldr.MakeSymbolUpdater(s) + for sym := range seen { + sb.SetBytesAt(ldr.SymValue(sym), ldr.Data(sym)) + } + } + + state.pctab = state.addGeneratedSym(ctxt, "runtime.pctab", size, writePctab) +} + // pclntab initializes the pclntab symbol with // runtime function and file name information. @@ -494,6 +558,9 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // runtime.filetab // []null terminated filename strings // + // runtime.pctab + // []byte of deduplicated pc data. + // // runtime.pclntab_old // function table, alternating PC and offset to func struct [each entry thearch.ptrsize bytes] // end PC [thearch.ptrsize bytes] @@ -514,6 +581,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { state.generatePCHeader(ctxt) state.generateFuncnametab(ctxt, container) cuOffsets := state.generateFilenameTabs(ctxt, compUnits, container) + state.generatePctab(ctxt, container) funcdataBytes := int64(0) ldr.SetCarrierSym(state.pclntab, state.carrier) @@ -525,21 +593,6 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { ftab.Grow(int64(state.nfunc)*2*int64(ctxt.Arch.PtrSize) + int64(ctxt.Arch.PtrSize) + 4) - szHint := len(ctxt.Textp) * 2 - pctaboff := make(map[string]uint32, szHint) - writepctab := func(off int32, p []byte) int32 { - start, ok := pctaboff[string(p)] - if !ok { - if len(p) > 0 { - start = uint32(len(ftab.Data())) - ftab.AddBytes(p) - } - pctaboff[string(p)] = start - } - newoff := int32(ftab.SetUint32(ctxt.Arch, int64(off), start)) - return newoff - } - setAddr := (*loader.SymbolBuilder).SetAddrPlus if ctxt.IsExe() && ctxt.IsInternal() { // Internal linking static executable. At this point the function @@ -555,10 +608,6 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { } } - pcsp := sym.Pcdata{} - pcfile := sym.Pcdata{} - pcline := sym.Pcdata{} - pcdata := []sym.Pcdata{} funcdata := []loader.Sym{} funcdataoff := []int64{} @@ -583,18 +632,13 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { } prevFunc = s - pcsp.P = pcsp.P[:0] - pcline.P = pcline.P[:0] - pcfile.P = pcfile.P[:0] - pcdata = pcdata[:0] + var numPCData int32 funcdataoff = funcdataoff[:0] funcdata = funcdata[:0] fi := ldr.FuncInfo(s) if fi.Valid() { fi.Preload() - for _, dataSym := range fi.Pcdata() { - pcdata = append(pcdata, sym.Pcdata{P: ldr.Data(dataSym)}) - } + numPCData = int32(len(fi.Pcdata())) nfd := fi.NumFuncdataoff() for i := uint32(0); i < nfd; i++ { funcdataoff = append(funcdataoff, fi.Funcdataoff(int(i))) @@ -602,15 +646,12 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { funcdata = fi.Funcdata(funcdata) } + writeInlPCData := false if fi.Valid() && fi.NumInlTree() > 0 { - - if len(pcdata) <= objabi.PCDATA_InlTreeIndex { - // Create inlining pcdata table. - newpcdata := make([]sym.Pcdata, objabi.PCDATA_InlTreeIndex+1) - copy(newpcdata, pcdata) - pcdata = newpcdata + writeInlPCData = true + if numPCData <= objabi.PCDATA_InlTreeIndex { + numPCData = objabi.PCDATA_InlTreeIndex + 1 } - if len(funcdataoff) <= objabi.FUNCDATA_InlTree { // Create inline tree funcdata. newfuncdata := make([]loader.Sym, objabi.FUNCDATA_InlTree+1) @@ -635,7 +676,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // fixed size of struct, checked below off := funcstart - end := funcstart + int32(ctxt.Arch.PtrSize) + 3*4 + 6*4 + int32(len(pcdata))*4 + int32(len(funcdata))*int32(ctxt.Arch.PtrSize) + end := funcstart + int32(ctxt.Arch.PtrSize) + 3*4 + 6*4 + numPCData*4 + int32(len(funcdata))*int32(ctxt.Arch.PtrSize) if len(funcdata) > 0 && (end&int32(ctxt.Arch.PtrSize-1) != 0) { end += 4 } @@ -664,23 +705,21 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { off = int32(ftab.SetUint32(ctxt.Arch, int64(off), deferreturn)) cu := ldr.SymUnit(s) - if fi.Valid() { - pcsp = sym.Pcdata{P: ldr.Data(fi.Pcsp())} - pcfile = sym.Pcdata{P: ldr.Data(fi.Pcfile())} - pcline = sym.Pcdata{P: ldr.Data(fi.Pcline())} - } if fi.Valid() && fi.NumInlTree() > 0 { its := oldState.genInlTreeSym(cu, fi, ctxt.Arch, state) funcdata[objabi.FUNCDATA_InlTree] = its - pcdata[objabi.PCDATA_InlTreeIndex] = sym.Pcdata{P: ldr.Data(fi.Pcinline())} } // pcdata - off = writepctab(off, pcsp.P) - off = writepctab(off, pcfile.P) - off = writepctab(off, pcline.P) - off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(len(pcdata)))) + if fi.Valid() { + off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(ldr.SymValue(fi.Pcsp())))) + off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(ldr.SymValue(fi.Pcfile())))) + off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(ldr.SymValue(fi.Pcline())))) + } else { + off += 12 + } + off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(numPCData))) // Store the offset to compilation unit's file table. cuIdx := ^uint32(0) @@ -700,9 +739,17 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // nfuncdata must be the final entry. off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(len(funcdata)))) - for i := range pcdata { - off = writepctab(off, pcdata[i].P) + + // Output the pcdata. + if fi.Valid() { + for i, pcSym := range fi.Pcdata() { + ftab.SetUint32(ctxt.Arch, int64(off+int32(i*4)), uint32(ldr.SymValue(pcSym))) + } + if writeInlPCData { + ftab.SetUint32(ctxt.Arch, int64(off+objabi.PCDATA_InlTreeIndex*4), uint32(ldr.SymValue(fi.Pcinline()))) + } } + off += numPCData * 4 // funcdata, must be pointer-aligned and we're only int32-aligned. // Missing funcdata will be 0 (nil pointer). @@ -724,7 +771,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { } if off != end { - ctxt.Errorf(s, "bad math in functab: funcstart=%d off=%d but end=%d (npcdata=%d nfuncdata=%d ptrsize=%d)", funcstart, off, end, len(pcdata), len(funcdata), ctxt.Arch.PtrSize) + ctxt.Errorf(s, "bad math in functab: funcstart=%d off=%d but end=%d (npcdata=%d nfuncdata=%d ptrsize=%d)", funcstart, off, end, numPCData, len(funcdata), ctxt.Arch.PtrSize) errorexit() } diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index d05b98f04a..520aaa44c2 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -627,6 +627,10 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { moduledata.AddAddr(ctxt.Arch, pcln.filetab) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.filetab))) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(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))) // The pclntab slice moduledata.AddAddr(ctxt.Arch, pcln.pclntab) moduledata.AddUint(ctxt.Arch, uint64(ldr.SymSize(pcln.pclntab))) diff --git a/src/cmd/link/internal/loader/symbolbuilder.go b/src/cmd/link/internal/loader/symbolbuilder.go index e14d89a927..c0c723d7f0 100644 --- a/src/cmd/link/internal/loader/symbolbuilder.go +++ b/src/cmd/link/internal/loader/symbolbuilder.go @@ -336,6 +336,15 @@ func (sb *SymbolBuilder) Addstring(str string) int64 { return r } +func (sb *SymbolBuilder) SetBytesAt(off int64, b []byte) int64 { + datLen := int64(len(b)) + if off+datLen > int64(len(sb.data)) { + panic("attempt to write past end of buffer") + } + copy(sb.data[off:off+datLen], b) + return off + datLen +} + func (sb *SymbolBuilder) addSymRef(tgt Sym, add int64, typ objabi.RelocType, rsize int) int64 { if sb.kind == 0 { sb.kind = sym.SDATA diff --git a/src/cmd/link/internal/sym/symbol.go b/src/cmd/link/internal/sym/symbol.go index 1a4165ebf7..70cf36a87e 100644 --- a/src/cmd/link/internal/sym/symbol.go +++ b/src/cmd/link/internal/sym/symbol.go @@ -33,7 +33,3 @@ func VersionToABI(v int) (obj.ABI, bool) { } return ^obj.ABI(0), false } - -type Pcdata struct { - P []byte -} diff --git a/src/debug/gosym/pclntab.go b/src/debug/gosym/pclntab.go index 21edddda20..a72f9847d7 100644 --- a/src/debug/gosym/pclntab.go +++ b/src/debug/gosym/pclntab.go @@ -58,6 +58,7 @@ type LineTable struct { functab []byte nfunctab uint32 filetab []byte + pctab []byte // points to the pctables. nfiletab uint32 funcNames map[uint32]string // cache the function names strings map[uint32]string // interned substrings of Data, keyed by offset @@ -235,6 +236,8 @@ func (t *LineTable) parsePclnTab() { offset = t.uintptr(t.Data[8+4*t.ptrsize:]) t.filetab = t.Data[offset:] offset = t.uintptr(t.Data[8+5*t.ptrsize:]) + t.pctab = t.Data[offset:] + offset = t.uintptr(t.Data[8+6*t.ptrsize:]) t.funcdata = t.Data[offset:] t.functab = t.Data[offset:] functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize @@ -244,6 +247,7 @@ func (t *LineTable) parsePclnTab() { t.funcdata = t.Data t.funcnametab = t.Data t.functab = t.Data[8+t.ptrsize:] + t.pctab = t.Data functabsize := t.nfunctab*2*t.ptrsize + t.ptrsize fileoff := t.binary.Uint32(t.functab[functabsize:]) t.functab = t.functab[:functabsize] @@ -373,7 +377,7 @@ func (t *LineTable) step(p *[]byte, pc *uint64, val *int32, first bool) bool { // off is the offset to the beginning of the pc-value table, // and entry is the start PC for the corresponding function. func (t *LineTable) pcvalue(off uint32, entry, targetpc uint64) int32 { - p := t.funcdata[off:] + p := t.pctab[off:] val := int32(-1) pc := entry @@ -396,8 +400,8 @@ func (t *LineTable) findFileLine(entry uint64, filetab, linetab uint32, filenum, return 0 } - fp := t.funcdata[filetab:] - fl := t.funcdata[linetab:] + fp := t.pctab[filetab:] + fl := t.pctab[linetab:] fileVal := int32(-1) filePC := entry lineVal := int32(-1) diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 5a79c7e6ec..755c409078 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -800,10 +800,10 @@ type _func struct { args int32 // in/out args size deferreturn uint32 // offset of start of a deferreturn call instruction from entry, if any. - pcsp int32 - pcfile int32 - pcln int32 - npcdata int32 + pcsp uint32 + pcfile uint32 + pcln uint32 + npcdata uint32 cuOffset uint32 // runtime.cutab offset of this function's CU funcID funcID // set for certain special runtime functions _ [2]byte // pad diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index fbd9315522..0610f75179 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -345,6 +345,7 @@ type pcHeader struct { funcnameOffset uintptr // offset to the funcnametab variable from pcHeader cuOffset uintptr // offset to the cutab variable from pcHeader filetabOffset uintptr // offset to the filetab variable from pcHeader + pctabOffset uintptr // offset to the pctab varible from pcHeader pclnOffset uintptr // offset to the pclntab variable from pcHeader } @@ -358,6 +359,7 @@ type moduledata struct { funcnametab []byte cutab []uint32 filetab []byte + pctab []byte pclntable []byte ftab []functab findfunctab uintptr @@ -721,7 +723,7 @@ type pcvalueCache struct { type pcvalueCacheEnt struct { // targetpc and off together are the key of this cache entry. targetpc uintptr - off int32 + off uint32 // val is the value of this cached pcvalue entry. val int32 } @@ -736,7 +738,7 @@ func pcvalueCacheKey(targetpc uintptr) uintptr { // Returns the PCData value, and the PC where this value starts. // TODO: the start PC is returned only when cache is nil. -func pcvalue(f funcInfo, off int32, targetpc uintptr, cache *pcvalueCache, strict bool) (int32, uintptr) { +func pcvalue(f funcInfo, off uint32, targetpc uintptr, cache *pcvalueCache, strict bool) (int32, uintptr) { if off == 0 { return -1, 0 } @@ -770,7 +772,7 @@ func pcvalue(f funcInfo, off int32, targetpc uintptr, cache *pcvalueCache, stric return -1, 0 } datap := f.datap - p := datap.pclntable[off:] + p := datap.pctab[off:] pc := f.entry prevpc := pc val := int32(-1) @@ -812,7 +814,7 @@ func pcvalue(f funcInfo, off int32, targetpc uintptr, cache *pcvalueCache, stric print("runtime: invalid pc-encoded table f=", funcname(f), " pc=", hex(pc), " targetpc=", hex(targetpc), " tab=", p, "\n") - p = datap.pclntable[off:] + p = datap.pctab[off:] pc = f.entry val = -1 for { @@ -893,7 +895,7 @@ func funcspdelta(f funcInfo, targetpc uintptr, cache *pcvalueCache) int32 { // funcMaxSPDelta returns the maximum spdelta at any point in f. func funcMaxSPDelta(f funcInfo) int32 { datap := f.datap - p := datap.pclntable[f.pcsp:] + p := datap.pctab[f.pcsp:] pc := f.entry val := int32(-1) max := int32(0) @@ -909,20 +911,20 @@ func funcMaxSPDelta(f funcInfo) int32 { } } -func pcdatastart(f funcInfo, table int32) int32 { - return *(*int32)(add(unsafe.Pointer(&f.nfuncdata), unsafe.Sizeof(f.nfuncdata)+uintptr(table)*4)) +func pcdatastart(f funcInfo, table uint32) uint32 { + return *(*uint32)(add(unsafe.Pointer(&f.nfuncdata), unsafe.Sizeof(f.nfuncdata)+uintptr(table)*4)) } -func pcdatavalue(f funcInfo, table int32, targetpc uintptr, cache *pcvalueCache) int32 { - if table < 0 || table >= f.npcdata { +func pcdatavalue(f funcInfo, table uint32, targetpc uintptr, cache *pcvalueCache) int32 { + if table >= f.npcdata { return -1 } r, _ := pcvalue(f, pcdatastart(f, table), targetpc, cache, true) return r } -func pcdatavalue1(f funcInfo, table int32, targetpc uintptr, cache *pcvalueCache, strict bool) int32 { - if table < 0 || table >= f.npcdata { +func pcdatavalue1(f funcInfo, table uint32, targetpc uintptr, cache *pcvalueCache, strict bool) int32 { + if table >= f.npcdata { return -1 } r, _ := pcvalue(f, pcdatastart(f, table), targetpc, cache, strict) @@ -931,8 +933,8 @@ func pcdatavalue1(f funcInfo, table int32, targetpc uintptr, cache *pcvalueCache // Like pcdatavalue, but also return the start PC of this PCData value. // It doesn't take a cache. -func pcdatavalue2(f funcInfo, table int32, targetpc uintptr) (int32, uintptr) { - if table < 0 || table >= f.npcdata { +func pcdatavalue2(f funcInfo, table uint32, targetpc uintptr) (int32, uintptr) { + if table >= f.npcdata { return -1, 0 } return pcvalue(f, pcdatastart(f, table), targetpc, nil, true) -- GitLab From ac5c406ef0ab20e2a11f57470271266ef4265221 Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Thu, 13 Aug 2020 12:21:18 -0400 Subject: [PATCH 0248/1792] [dev.link] cmd/link: clean up some pclntab state Clean up some pclntab state, specifically: 1) Remove the oldPclnState type. 2) Move a structure out of pclnState, that was holding some memory. 3) Stop passing container around everywhere and calling emitPcln. Use a slice of function symbols instead. Change-Id: I74e916564cd769a706750d024e55ee0d811a79da Reviewed-on: https://go-review.googlesource.com/c/go/+/248379 Run-TryBot: Jeremy Faller TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/pcln.go | 135 +++++++++++-------------------- 1 file changed, 47 insertions(+), 88 deletions(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 576f1c3780..33476ec292 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -16,17 +16,6 @@ import ( "strings" ) -// oldPclnState holds state information used during pclntab generation. Here -// 'ldr' is just a pointer to the context's loader, 'deferReturnSym' is the -// index for the symbol "runtime.deferreturn", -// -// NB: This is deprecated, and will be eliminated when pclntab_old is -// eliminated. -type oldPclnState struct { - ldr *loader.Loader - deferReturnSym loader.Sym -} - // pclntab holds the state needed for pclntab generation. type pclntab struct { // The first and last functions found. @@ -56,12 +45,6 @@ type pclntab struct { // The number of filenames in runtime.filetab. nfiles uint32 - - // maps the function symbol to offset in runtime.funcnametab - // This doesn't need to reside in the state once pclntab_old's been - // deleted -- it can live in generateFuncnametab. - // TODO(jfaller): Delete me! - funcNameOffset map[loader.Sym]int32 } // addGeneratedSym adds a generator symbol to pclntab, returning the new Sym. @@ -76,35 +59,26 @@ func (state *pclntab) addGeneratedSym(ctxt *Link, name string, size int64, f gen return s } -func makeOldPclnState(ctxt *Link) *oldPclnState { - ldr := ctxt.loader - drs := ldr.Lookup("runtime.deferreturn", sym.SymVerABIInternal) - state := &oldPclnState{ - ldr: ldr, - deferReturnSym: drs, - } - - return state -} - // makePclntab makes a pclntab object, and assembles all the compilation units -// we'll need to write pclntab. -func makePclntab(ctxt *Link, container loader.Bitmap) (*pclntab, []*sym.CompilationUnit) { +// we'll need to write pclntab. Returns the pclntab structure, a slice of the +// CompilationUnits we need, and a slice of the function symbols we need to +// generate pclntab. +func makePclntab(ctxt *Link, container loader.Bitmap) (*pclntab, []*sym.CompilationUnit, []loader.Sym) { ldr := ctxt.loader - state := &pclntab{ - funcNameOffset: make(map[loader.Sym]int32), - } + state := &pclntab{} // Gather some basic stats and info. seenCUs := make(map[*sym.CompilationUnit]struct{}) prevSect := ldr.SymSect(ctxt.Textp[0]) compUnits := []*sym.CompilationUnit{} + funcs := []loader.Sym{} for _, s := range ctxt.Textp { if !emitPcln(ctxt, s, container) { continue } + funcs = append(funcs, s) state.nfunc++ if state.firstFunc == 0 { state.firstFunc = s @@ -130,15 +104,7 @@ func makePclntab(ctxt *Link, container loader.Bitmap) (*pclntab, []*sym.Compilat compUnits = append(compUnits, cu) } } - return state, compUnits -} - -func ftabaddstring(ftab *loader.SymbolBuilder, s string) int32 { - start := len(ftab.Data()) - ftab.Grow(int64(start + len(s) + 1)) // make room for s plus trailing NUL - ftd := ftab.Data() - copy(ftd[start:], s) - return int32(start) + return state, compUnits, funcs } // onlycsymbol looks at a symbol's name to report whether this is a @@ -163,11 +129,13 @@ func emitPcln(ctxt *Link, s loader.Sym, container loader.Bitmap) bool { return !container.Has(s) } -func (state *oldPclnState) computeDeferReturn(target *Target, s loader.Sym) uint32 { +func computeDeferReturn(ctxt *Link, deferReturnSym, s loader.Sym) uint32 { + ldr := ctxt.loader + target := ctxt.Target deferreturn := uint32(0) lastWasmAddr := uint32(0) - relocs := state.ldr.Relocs(s) + relocs := ldr.Relocs(s) for ri := 0; ri < relocs.Count(); ri++ { r := relocs.At(ri) if target.IsWasm() && r.Type() == objabi.R_ADDR { @@ -178,7 +146,7 @@ func (state *oldPclnState) computeDeferReturn(target *Target, s loader.Sym) uint // set the resumption point to PC_B. lastWasmAddr = uint32(r.Add()) } - if r.Type().IsDirectCall() && (r.Sym() == state.deferReturnSym || state.ldr.IsDeferReturnTramp(r.Sym())) { + if r.Type().IsDirectCall() && (r.Sym() == deferReturnSym || ldr.IsDeferReturnTramp(r.Sym())) { if target.IsWasm() { deferreturn = lastWasmAddr - 1 } else { @@ -211,8 +179,8 @@ func (state *oldPclnState) computeDeferReturn(target *Target, s loader.Sym) uint // genInlTreeSym generates the InlTree sym for a function with the // specified FuncInfo. -func (state *oldPclnState) genInlTreeSym(cu *sym.CompilationUnit, fi loader.FuncInfo, arch *sys.Arch, newState *pclntab) loader.Sym { - ldr := state.ldr +func genInlTreeSym(ctxt *Link, cu *sym.CompilationUnit, fi loader.FuncInfo, arch *sys.Arch, nameOffsets map[loader.Sym]uint32) loader.Sym { + ldr := ctxt.loader its := ldr.CreateExtSym("", 0) inlTreeSym := ldr.MakeSymbolUpdater(its) // Note: the generated symbol is given a type of sym.SGOFUNC, as a @@ -225,7 +193,7 @@ func (state *oldPclnState) genInlTreeSym(cu *sym.CompilationUnit, fi loader.Func for i := 0; i < int(ninl); i++ { call := fi.InlTree(i) val := call.File - nameoff, ok := newState.funcNameOffset[call.Func] + nameoff, ok := nameOffsets[call.Func] if !ok { panic("couldn't find function name offset") } @@ -282,16 +250,12 @@ func (state *pclntab) generatePCHeader(ctxt *Link) { state.pcheader = state.addGeneratedSym(ctxt, "runtime.pcheader", size, writeHeader) } -// walkFuncs iterates over the Textp, calling a function for each unique +// walkFuncs iterates over the funcs, calling a function for each unique // function and inlined function. -func (state *pclntab) walkFuncs(ctxt *Link, container loader.Bitmap, f func(loader.Sym)) { +func walkFuncs(ctxt *Link, funcs []loader.Sym, f func(loader.Sym)) { ldr := ctxt.loader seen := make(map[loader.Sym]struct{}) - for _, ls := range ctxt.Textp { - s := loader.Sym(ls) - if !emitPcln(ctxt, s, container) { - continue - } + for _, s := range funcs { if _, ok := seen[s]; !ok { f(s) seen[s] = struct{}{} @@ -312,37 +276,37 @@ func (state *pclntab) walkFuncs(ctxt *Link, container loader.Bitmap, f func(load } } -// generateFuncnametab creates the function name table. -func (state *pclntab) generateFuncnametab(ctxt *Link, container loader.Bitmap) { +// generateFuncnametab creates the function name table. Returns a map of +// func symbol to the name offset in runtime.funcnamtab. +func (state *pclntab) generateFuncnametab(ctxt *Link, funcs []loader.Sym) map[loader.Sym]uint32 { + nameOffsets := make(map[loader.Sym]uint32, state.nfunc) + // Write the null terminated strings. writeFuncNameTab := func(ctxt *Link, s loader.Sym) { symtab := ctxt.loader.MakeSymbolUpdater(s) - for s, off := range state.funcNameOffset { + for s, off := range nameOffsets { symtab.AddStringAt(int64(off), ctxt.loader.SymName(s)) } } // Loop through the CUs, and calculate the size needed. var size int64 - state.walkFuncs(ctxt, container, func(s loader.Sym) { - state.funcNameOffset[s] = int32(size) + walkFuncs(ctxt, funcs, func(s loader.Sym) { + nameOffsets[s] = uint32(size) size += int64(ctxt.loader.SymNameLen(s)) + 1 // NULL terminate }) state.funcnametab = state.addGeneratedSym(ctxt, "runtime.funcnametab", size, writeFuncNameTab) + return nameOffsets } -// walkFilenames walks the filenames in the all reachable functions. -func walkFilenames(ctxt *Link, container loader.Bitmap, f func(*sym.CompilationUnit, goobj.CUFileIndex)) { +// walkFilenames walks funcs, calling a function for each filename used in each +// function's line table. +func walkFilenames(ctxt *Link, funcs []loader.Sym, f func(*sym.CompilationUnit, goobj.CUFileIndex)) { ldr := ctxt.loader // Loop through all functions, finding the filenames we need. - for _, ls := range ctxt.Textp { - s := loader.Sym(ls) - if !emitPcln(ctxt, s, container) { - continue - } - + for _, s := range funcs { fi := ldr.FuncInfo(s) if !fi.Valid() { continue @@ -382,7 +346,7 @@ func walkFilenames(ctxt *Link, container loader.Bitmap, f func(*sym.CompilationU // 1) Get Func.CUIndex: M := func.cuOffset // 2) Find filename offset: fileOffset := runtime.cutab[M+K] // 3) Get the filename: getcstring(runtime.filetab[fileOffset]) -func (state *pclntab) generateFilenameTabs(ctxt *Link, compUnits []*sym.CompilationUnit, container loader.Bitmap) []uint32 { +func (state *pclntab) generateFilenameTabs(ctxt *Link, compUnits []*sym.CompilationUnit, funcs []loader.Sym) []uint32 { // On a per-CU basis, keep track of all the filenames we need. // // Note, that we store the filenames in a separate section in the object @@ -402,7 +366,7 @@ func (state *pclntab) generateFilenameTabs(ctxt *Link, compUnits []*sym.Compilat // file index we've seen per CU so we can calculate how large the // CU->global table needs to be. var fileSize int64 - walkFilenames(ctxt, container, func(cu *sym.CompilationUnit, i goobj.CUFileIndex) { + walkFilenames(ctxt, funcs, func(cu *sym.CompilationUnit, i goobj.CUFileIndex) { // Note we use the raw filename for lookup, but use the expanded filename // when we save the size. filename := cu.FileTable[i] @@ -467,7 +431,7 @@ func (state *pclntab) generateFilenameTabs(ctxt *Link, compUnits []*sym.Compilat // generatePctab creates the runtime.pctab variable, holding all the // deduplicated pcdata. -func (state *pclntab) generatePctab(ctxt *Link, container loader.Bitmap) { +func (state *pclntab) generatePctab(ctxt *Link, funcs []loader.Sym) { ldr := ctxt.loader // Pctab offsets of 0 are considered invalid in the runtime. We respect @@ -490,10 +454,7 @@ func (state *pclntab) generatePctab(ctxt *Link, container loader.Bitmap) { seen[pcSym] = struct{}{} } } - for _, s := range ctxt.Textp { - if !emitPcln(ctxt, s, container) { - continue - } + for _, s := range funcs { fi := ldr.FuncInfo(s) if !fi.Valid() { continue @@ -566,8 +527,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // end PC [thearch.ptrsize bytes] // func structures, pcdata tables. - oldState := makeOldPclnState(ctxt) - state, compUnits := makePclntab(ctxt, container) + state, compUnits, funcs := makePclntab(ctxt, container) ldr := ctxt.loader state.carrier = ldr.LookupOrCreateSym("runtime.pclntab", 0) @@ -579,9 +539,12 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { // rational form. state.pclntab = ldr.LookupOrCreateSym("runtime.pclntab_old", 0) state.generatePCHeader(ctxt) - state.generateFuncnametab(ctxt, container) - cuOffsets := state.generateFilenameTabs(ctxt, compUnits, container) - state.generatePctab(ctxt, container) + nameOffsets := state.generateFuncnametab(ctxt, funcs) + cuOffsets := state.generateFilenameTabs(ctxt, compUnits, funcs) + state.generatePctab(ctxt, funcs) + + // Used to when computing defer return. + deferReturnSym := ldr.Lookup("runtime.deferreturn", sym.SymVerABIInternal) funcdataBytes := int64(0) ldr.SetCarrierSym(state.pclntab, state.carrier) @@ -613,11 +576,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { var nfunc int32 prevFunc := ctxt.Textp[0] - for _, s := range ctxt.Textp { - if !emitPcln(ctxt, s, container) { - continue - } - + for _, s := range funcs { thisSect := ldr.SymSect(s) prevSect := ldr.SymSect(prevFunc) if thisSect != prevSect { @@ -686,7 +645,7 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { off = int32(setAddr(ftab, ctxt.Arch, int64(off), s, 0)) // name int32 - nameoff, ok := state.funcNameOffset[s] + nameoff, ok := nameOffsets[s] if !ok { panic("couldn't find function name offset") } @@ -701,13 +660,13 @@ func (ctxt *Link) pclntab(container loader.Bitmap) *pclntab { off = int32(ftab.SetUint32(ctxt.Arch, int64(off), args)) // deferreturn - deferreturn := oldState.computeDeferReturn(&ctxt.Target, s) + deferreturn := computeDeferReturn(ctxt, deferReturnSym, s) off = int32(ftab.SetUint32(ctxt.Arch, int64(off), deferreturn)) cu := ldr.SymUnit(s) if fi.Valid() && fi.NumInlTree() > 0 { - its := oldState.genInlTreeSym(cu, fi, ctxt.Arch, state) + its := genInlTreeSym(ctxt, cu, fi, ctxt.Arch, nameOffsets) funcdata[objabi.FUNCDATA_InlTree] = its } -- GitLab From 6e876f19857a8fbd259571080f7f91bc03276559 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 4 Jun 2020 10:55:01 -0700 Subject: [PATCH 0249/1792] cmd/compile: clean up and optimize s390x multiplication rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some of the existing optimizations aren't triggered because they are handled by the generic rules so this CL removes them. Also some constraints were copied without much thought from the amd64 rules and they don't make sense on s390x, so we remove those constraints. Finally, add a 'multiply by the sum of two powers of two' optimization. This makes sense on s390x as shifts are low latency and can also sometimes be optimized further (especially if we add support for RISBG instructions). name old time/op new time/op delta IntMulByConst/3-8 1.70ns ±11% 1.10ns ± 5% -35.26% (p=0.000 n=10+10) IntMulByConst/5-8 1.64ns ± 7% 1.10ns ± 4% -32.94% (p=0.000 n=10+9) IntMulByConst/12-8 1.65ns ± 6% 1.20ns ± 4% -27.16% (p=0.000 n=10+9) IntMulByConst/120-8 1.66ns ± 4% 1.22ns ±13% -26.43% (p=0.000 n=10+10) IntMulByConst/-120-8 1.65ns ± 7% 1.19ns ± 4% -28.06% (p=0.000 n=9+10) IntMulByConst/65537-8 0.86ns ± 9% 1.12ns ±12% +30.41% (p=0.000 n=10+10) IntMulByConst/65538-8 1.65ns ± 5% 1.23ns ± 5% -25.11% (p=0.000 n=10+10) Change-Id: Ib196e6bff1e97febfd266134d0a2b2a62897989f Reviewed-on: https://go-review.googlesource.com/c/go/+/248937 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/S390X.rules | 51 +++- src/cmd/compile/internal/ssa/rewriteS390X.go | 268 ++++++++++-------- .../compile/internal/test/mulconst_test.go | 242 ++++++++++++++++ test/codegen/arithmetic.go | 6 + 4 files changed, 441 insertions(+), 126 deletions(-) create mode 100644 src/cmd/compile/internal/test/mulconst_test.go diff --git a/src/cmd/compile/internal/ssa/gen/S390X.rules b/src/cmd/compile/internal/ssa/gen/S390X.rules index d3234c1a00..5e4c436ca1 100644 --- a/src/cmd/compile/internal/ssa/gen/S390X.rules +++ b/src/cmd/compile/internal/ssa/gen/S390X.rules @@ -716,20 +716,40 @@ (ANDWconst [0xFF] x) => (MOVBZreg x) (ANDWconst [0xFFFF] x) => (MOVHZreg x) -// strength reduction -(MULLDconst [-1] x) => (NEG x) -(MULLDconst [0] _) => (MOVDconst [0]) -(MULLDconst [1] x) => x -(MULLDconst [c] x) && isPowerOfTwo(c) -> (SLDconst [log2(c)] x) -(MULLDconst [c] x) && isPowerOfTwo(c+1) && c >= 15 -> (SUB (SLDconst [log2(c+1)] x) x) -(MULLDconst [c] x) && isPowerOfTwo(c-1) && c >= 17 -> (ADD (SLDconst [log2(c-1)] x) x) - -(MULLWconst [-1] x) => (NEGW x) -(MULLWconst [0] _) => (MOVDconst [0]) -(MULLWconst [1] x) => x -(MULLWconst [c] x) && isPowerOfTwo(c) -> (SLWconst [log2(c)] x) -(MULLWconst [c] x) && isPowerOfTwo(c+1) && c >= 15 -> (SUBW (SLWconst [log2(c+1)] x) x) -(MULLWconst [c] x) && isPowerOfTwo(c-1) && c >= 17 -> (ADDW (SLWconst [log2(c-1)] x) x) +// Strength reduce multiplication to the sum (or difference) of two powers of two. +// +// Examples: +// 5x -> 4x + 1x +// 10x -> 8x + 2x +// 120x -> 128x - 8x +// -120x -> 8x - 128x +// +// We know that the rightmost bit of any positive value, once isolated, must either +// be a power of 2 (because it is a single bit) or 0 (if the original value is 0). +// In all of these rules we use a rightmost bit calculation to determine one operand +// for the addition or subtraction. We then just need to calculate if the other +// operand is a valid power of 2 before we can match the rule. +// +// Notes: +// - the generic rules have already matched single powers of two so we ignore them here +// - isPowerOfTwo32 asserts that its argument is greater than 0 +// - c&(c-1) = clear rightmost bit +// - c&^(c-1) = isolate rightmost bit + +// c = 2ˣ + 2ʸ => c - 2ˣ = 2ʸ +(MULL(D|W)const x [c]) && isPowerOfTwo32(c&(c-1)) + => ((ADD|ADDW) (SL(D|W)const x [int8(log32(c&(c-1)))]) + (SL(D|W)const x [int8(log32(c&^(c-1)))])) + +// c = 2ʸ - 2ˣ => c + 2ˣ = 2ʸ +(MULL(D|W)const x [c]) && isPowerOfTwo32(c+(c&^(c-1))) + => ((SUB|SUBW) (SL(D|W)const x [int8(log32(c+(c&^(c-1))))]) + (SL(D|W)const x [int8(log32(c&^(c-1)))])) + +// c = 2ˣ - 2ʸ => -c + 2ˣ = 2ʸ +(MULL(D|W)const x [c]) && isPowerOfTwo32(-c+(-c&^(-c-1))) + => ((SUB|SUBW) (SL(D|W)const x [int8(log32(-c&^(-c-1)))]) + (SL(D|W)const x [int8(log32(-c+(-c&^(-c-1))))])) // Fold ADD into MOVDaddr. Odd offsets from SB shouldn't be folded (LARL can't handle them). (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) && ((c+d)&1 == 0) && is32Bit(c+d) -> (MOVDaddr [c+d] {s} x) @@ -1133,6 +1153,9 @@ (XORconst [0] x) => x (XORWconst [c] x) && int32(c)==0 => x +// Shifts by zero (may be inserted during multiplication strength reduction). +((SLD|SLW|SRD|SRW|SRAD|SRAW)const x [0]) => x + // Convert constant subtracts to constant adds. (SUBconst [c] x) && c != -(1<<31) => (ADDconst [-c] x) (SUBWconst [c] x) -> (ADDWconst [int64(int32(-c))] x) diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index dc9b143562..536f8db320 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -732,8 +732,12 @@ func rewriteValueS390X(v *Value) bool { return rewriteValueS390X_OpS390XRLLG(v) case OpS390XSLD: return rewriteValueS390X_OpS390XSLD(v) + case OpS390XSLDconst: + return rewriteValueS390X_OpS390XSLDconst(v) case OpS390XSLW: return rewriteValueS390X_OpS390XSLW(v) + case OpS390XSLWconst: + return rewriteValueS390X_OpS390XSLWconst(v) case OpS390XSRAD: return rewriteValueS390X_OpS390XSRAD(v) case OpS390XSRADconst: @@ -748,6 +752,8 @@ func rewriteValueS390X(v *Value) bool { return rewriteValueS390X_OpS390XSRDconst(v) case OpS390XSRW: return rewriteValueS390X_OpS390XSRW(v) + case OpS390XSRWconst: + return rewriteValueS390X_OpS390XSRWconst(v) case OpS390XSTM2: return rewriteValueS390X_OpS390XSTM2(v) case OpS390XSTMG2: @@ -13853,81 +13859,64 @@ func rewriteValueS390X_OpS390XMULLD(v *Value) bool { func rewriteValueS390X_OpS390XMULLDconst(v *Value) bool { v_0 := v.Args[0] b := v.Block - // match: (MULLDconst [-1] x) - // result: (NEG x) + // match: (MULLDconst x [c]) + // cond: isPowerOfTwo32(c&(c-1)) + // result: (ADD (SLDconst x [int8(log32(c&(c-1)))]) (SLDconst x [int8(log32(c&^(c-1)))])) for { - if auxIntToInt32(v.AuxInt) != -1 { - break - } - x := v_0 - v.reset(OpS390XNEG) - v.AddArg(x) - return true - } - // match: (MULLDconst [0] _) - // result: (MOVDconst [0]) - for { - if auxIntToInt32(v.AuxInt) != 0 { - break - } - v.reset(OpS390XMOVDconst) - v.AuxInt = int64ToAuxInt(0) - return true - } - // match: (MULLDconst [1] x) - // result: x - for { - if auxIntToInt32(v.AuxInt) != 1 { - break - } - x := v_0 - v.copyOf(x) - return true - } - // match: (MULLDconst [c] x) - // cond: isPowerOfTwo(c) - // result: (SLDconst [log2(c)] x) - for { - c := v.AuxInt + t := v.Type + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c)) { + if !(isPowerOfTwo32(c & (c - 1))) { break } - v.reset(OpS390XSLDconst) - v.AuxInt = log2(c) - v.AddArg(x) + v.reset(OpS390XADD) + v0 := b.NewValue0(v.Pos, OpS390XSLDconst, t) + v0.AuxInt = int8ToAuxInt(int8(log32(c & (c - 1)))) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpS390XSLDconst, t) + v1.AuxInt = int8ToAuxInt(int8(log32(c &^ (c - 1)))) + v1.AddArg(x) + v.AddArg2(v0, v1) return true } - // match: (MULLDconst [c] x) - // cond: isPowerOfTwo(c+1) && c >= 15 - // result: (SUB (SLDconst [log2(c+1)] x) x) + // match: (MULLDconst x [c]) + // cond: isPowerOfTwo32(c+(c&^(c-1))) + // result: (SUB (SLDconst x [int8(log32(c+(c&^(c-1))))]) (SLDconst x [int8(log32(c&^(c-1)))])) for { - c := v.AuxInt + t := v.Type + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c+1) && c >= 15) { + if !(isPowerOfTwo32(c + (c &^ (c - 1)))) { break } v.reset(OpS390XSUB) - v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v0.AuxInt = log2(c + 1) + v0 := b.NewValue0(v.Pos, OpS390XSLDconst, t) + v0.AuxInt = int8ToAuxInt(int8(log32(c + (c &^ (c - 1))))) v0.AddArg(x) - v.AddArg2(v0, x) + v1 := b.NewValue0(v.Pos, OpS390XSLDconst, t) + v1.AuxInt = int8ToAuxInt(int8(log32(c &^ (c - 1)))) + v1.AddArg(x) + v.AddArg2(v0, v1) return true } - // match: (MULLDconst [c] x) - // cond: isPowerOfTwo(c-1) && c >= 17 - // result: (ADD (SLDconst [log2(c-1)] x) x) + // match: (MULLDconst x [c]) + // cond: isPowerOfTwo32(-c+(-c&^(-c-1))) + // result: (SUB (SLDconst x [int8(log32(-c&^(-c-1)))]) (SLDconst x [int8(log32(-c+(-c&^(-c-1))))])) for { - c := v.AuxInt + t := v.Type + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-1) && c >= 17) { + if !(isPowerOfTwo32(-c + (-c &^ (-c - 1)))) { break } - v.reset(OpS390XADD) - v0 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v0.AuxInt = log2(c - 1) + v.reset(OpS390XSUB) + v0 := b.NewValue0(v.Pos, OpS390XSLDconst, t) + v0.AuxInt = int8ToAuxInt(int8(log32(-c &^ (-c - 1)))) v0.AddArg(x) - v.AddArg2(v0, x) + v1 := b.NewValue0(v.Pos, OpS390XSLDconst, t) + v1.AuxInt = int8ToAuxInt(int8(log32(-c + (-c &^ (-c - 1))))) + v1.AddArg(x) + v.AddArg2(v0, v1) return true } // match: (MULLDconst [c] (MOVDconst [d])) @@ -14097,81 +14086,64 @@ func rewriteValueS390X_OpS390XMULLW(v *Value) bool { func rewriteValueS390X_OpS390XMULLWconst(v *Value) bool { v_0 := v.Args[0] b := v.Block - // match: (MULLWconst [-1] x) - // result: (NEGW x) - for { - if auxIntToInt32(v.AuxInt) != -1 { - break - } - x := v_0 - v.reset(OpS390XNEGW) - v.AddArg(x) - return true - } - // match: (MULLWconst [0] _) - // result: (MOVDconst [0]) - for { - if auxIntToInt32(v.AuxInt) != 0 { - break - } - v.reset(OpS390XMOVDconst) - v.AuxInt = int64ToAuxInt(0) - return true - } - // match: (MULLWconst [1] x) - // result: x + // match: (MULLWconst x [c]) + // cond: isPowerOfTwo32(c&(c-1)) + // result: (ADDW (SLWconst x [int8(log32(c&(c-1)))]) (SLWconst x [int8(log32(c&^(c-1)))])) for { - if auxIntToInt32(v.AuxInt) != 1 { - break - } - x := v_0 - v.copyOf(x) - return true - } - // match: (MULLWconst [c] x) - // cond: isPowerOfTwo(c) - // result: (SLWconst [log2(c)] x) - for { - c := v.AuxInt + t := v.Type + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c)) { + if !(isPowerOfTwo32(c & (c - 1))) { break } - v.reset(OpS390XSLWconst) - v.AuxInt = log2(c) - v.AddArg(x) + v.reset(OpS390XADDW) + v0 := b.NewValue0(v.Pos, OpS390XSLWconst, t) + v0.AuxInt = int8ToAuxInt(int8(log32(c & (c - 1)))) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpS390XSLWconst, t) + v1.AuxInt = int8ToAuxInt(int8(log32(c &^ (c - 1)))) + v1.AddArg(x) + v.AddArg2(v0, v1) return true } - // match: (MULLWconst [c] x) - // cond: isPowerOfTwo(c+1) && c >= 15 - // result: (SUBW (SLWconst [log2(c+1)] x) x) + // match: (MULLWconst x [c]) + // cond: isPowerOfTwo32(c+(c&^(c-1))) + // result: (SUBW (SLWconst x [int8(log32(c+(c&^(c-1))))]) (SLWconst x [int8(log32(c&^(c-1)))])) for { - c := v.AuxInt + t := v.Type + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c+1) && c >= 15) { + if !(isPowerOfTwo32(c + (c &^ (c - 1)))) { break } v.reset(OpS390XSUBW) - v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v0.AuxInt = log2(c + 1) + v0 := b.NewValue0(v.Pos, OpS390XSLWconst, t) + v0.AuxInt = int8ToAuxInt(int8(log32(c + (c &^ (c - 1))))) v0.AddArg(x) - v.AddArg2(v0, x) + v1 := b.NewValue0(v.Pos, OpS390XSLWconst, t) + v1.AuxInt = int8ToAuxInt(int8(log32(c &^ (c - 1)))) + v1.AddArg(x) + v.AddArg2(v0, v1) return true } - // match: (MULLWconst [c] x) - // cond: isPowerOfTwo(c-1) && c >= 17 - // result: (ADDW (SLWconst [log2(c-1)] x) x) + // match: (MULLWconst x [c]) + // cond: isPowerOfTwo32(-c+(-c&^(-c-1))) + // result: (SUBW (SLWconst x [int8(log32(-c&^(-c-1)))]) (SLWconst x [int8(log32(-c+(-c&^(-c-1))))])) for { - c := v.AuxInt + t := v.Type + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-1) && c >= 17) { + if !(isPowerOfTwo32(-c + (-c &^ (-c - 1)))) { break } - v.reset(OpS390XADDW) - v0 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v0.AuxInt = log2(c - 1) + v.reset(OpS390XSUBW) + v0 := b.NewValue0(v.Pos, OpS390XSLWconst, t) + v0.AuxInt = int8ToAuxInt(int8(log32(-c &^ (-c - 1)))) v0.AddArg(x) - v.AddArg2(v0, x) + v1 := b.NewValue0(v.Pos, OpS390XSLWconst, t) + v1.AuxInt = int8ToAuxInt(int8(log32(-c + (-c &^ (-c - 1))))) + v1.AddArg(x) + v.AddArg2(v0, v1) return true } // match: (MULLWconst [c] (MOVDconst [d])) @@ -16826,6 +16798,20 @@ func rewriteValueS390X_OpS390XSLD(v *Value) bool { } return false } +func rewriteValueS390X_OpS390XSLDconst(v *Value) bool { + v_0 := v.Args[0] + // match: (SLDconst x [0]) + // result: x + for { + if auxIntToInt8(v.AuxInt) != 0 { + break + } + x := v_0 + v.copyOf(x) + return true + } + return false +} func rewriteValueS390X_OpS390XSLW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -16960,6 +16946,20 @@ func rewriteValueS390X_OpS390XSLW(v *Value) bool { } return false } +func rewriteValueS390X_OpS390XSLWconst(v *Value) bool { + v_0 := v.Args[0] + // match: (SLWconst x [0]) + // result: x + for { + if auxIntToInt8(v.AuxInt) != 0 { + break + } + x := v_0 + v.copyOf(x) + return true + } + return false +} func rewriteValueS390X_OpS390XSRAD(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -17096,6 +17096,16 @@ func rewriteValueS390X_OpS390XSRAD(v *Value) bool { } func rewriteValueS390X_OpS390XSRADconst(v *Value) bool { v_0 := v.Args[0] + // match: (SRADconst x [0]) + // result: x + for { + if auxIntToInt8(v.AuxInt) != 0 { + break + } + x := v_0 + v.copyOf(x) + return true + } // match: (SRADconst [c] (MOVDconst [d])) // result: (MOVDconst [d>>uint64(c)]) for { @@ -17246,6 +17256,16 @@ func rewriteValueS390X_OpS390XSRAW(v *Value) bool { } func rewriteValueS390X_OpS390XSRAWconst(v *Value) bool { v_0 := v.Args[0] + // match: (SRAWconst x [0]) + // result: x + for { + if auxIntToInt8(v.AuxInt) != 0 { + break + } + x := v_0 + v.copyOf(x) + return true + } // match: (SRAWconst [c] (MOVDconst [d])) // result: (MOVDconst [int64(int32(d))>>uint64(c)]) for { @@ -17416,6 +17436,16 @@ func rewriteValueS390X_OpS390XSRDconst(v *Value) bool { v.AddArg(v0) return true } + // match: (SRDconst x [0]) + // result: x + for { + if auxIntToInt8(v.AuxInt) != 0 { + break + } + x := v_0 + v.copyOf(x) + return true + } return false } func rewriteValueS390X_OpS390XSRW(v *Value) bool { @@ -17552,6 +17582,20 @@ func rewriteValueS390X_OpS390XSRW(v *Value) bool { } return false } +func rewriteValueS390X_OpS390XSRWconst(v *Value) bool { + v_0 := v.Args[0] + // match: (SRWconst x [0]) + // result: x + for { + if auxIntToInt8(v.AuxInt) != 0 { + break + } + x := v_0 + v.copyOf(x) + return true + } + return false +} func rewriteValueS390X_OpS390XSTM2(v *Value) bool { v_3 := v.Args[3] v_2 := v.Args[2] diff --git a/src/cmd/compile/internal/test/mulconst_test.go b/src/cmd/compile/internal/test/mulconst_test.go new file mode 100644 index 0000000000..314cab32de --- /dev/null +++ b/src/cmd/compile/internal/test/mulconst_test.go @@ -0,0 +1,242 @@ +// 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 test + +import "testing" + +// Benchmark multiplication of an integer by various constants. +// +// The comment above each sub-benchmark provides an example of how the +// target multiplication operation might be implemented using shift +// (multiplication by a power of 2), addition and subtraction +// operations. It is platform-dependent whether these transformations +// are actually applied. + +var ( + mulSinkI32 int32 + mulSinkI64 int64 + mulSinkU32 uint32 + mulSinkU64 uint64 +) + +func BenchmarkMulconstI32(b *testing.B) { + // 3x = 2x + x + b.Run("3", func(b *testing.B) { + x := int32(1) + for i := 0; i < b.N; i++ { + x *= 3 + } + mulSinkI32 = x + }) + // 5x = 4x + x + b.Run("5", func(b *testing.B) { + x := int32(1) + for i := 0; i < b.N; i++ { + x *= 5 + } + mulSinkI32 = x + }) + // 12x = 8x + 4x + b.Run("12", func(b *testing.B) { + x := int32(1) + for i := 0; i < b.N; i++ { + x *= 12 + } + mulSinkI32 = x + }) + // 120x = 128x - 8x + b.Run("120", func(b *testing.B) { + x := int32(1) + for i := 0; i < b.N; i++ { + x *= 120 + } + mulSinkI32 = x + }) + // -120x = 8x - 120x + b.Run("-120", func(b *testing.B) { + x := int32(1) + for i := 0; i < b.N; i++ { + x *= -120 + } + mulSinkI32 = x + }) + // 65537x = 65536x + x + b.Run("65537", func(b *testing.B) { + x := int32(1) + for i := 0; i < b.N; i++ { + x *= 65537 + } + mulSinkI32 = x + }) + // 65538x = 65536x + 2x + b.Run("65538", func(b *testing.B) { + x := int32(1) + for i := 0; i < b.N; i++ { + x *= 65538 + } + mulSinkI32 = x + }) +} + +func BenchmarkMulconstI64(b *testing.B) { + // 3x = 2x + x + b.Run("3", func(b *testing.B) { + x := int64(1) + for i := 0; i < b.N; i++ { + x *= 3 + } + mulSinkI64 = x + }) + // 5x = 4x + x + b.Run("5", func(b *testing.B) { + x := int64(1) + for i := 0; i < b.N; i++ { + x *= 5 + } + mulSinkI64 = x + }) + // 12x = 8x + 4x + b.Run("12", func(b *testing.B) { + x := int64(1) + for i := 0; i < b.N; i++ { + x *= 12 + } + mulSinkI64 = x + }) + // 120x = 128x - 8x + b.Run("120", func(b *testing.B) { + x := int64(1) + for i := 0; i < b.N; i++ { + x *= 120 + } + mulSinkI64 = x + }) + // -120x = 8x - 120x + b.Run("-120", func(b *testing.B) { + x := int64(1) + for i := 0; i < b.N; i++ { + x *= -120 + } + mulSinkI64 = x + }) + // 65537x = 65536x + x + b.Run("65537", func(b *testing.B) { + x := int64(1) + for i := 0; i < b.N; i++ { + x *= 65537 + } + mulSinkI64 = x + }) + // 65538x = 65536x + 2x + b.Run("65538", func(b *testing.B) { + x := int64(1) + for i := 0; i < b.N; i++ { + x *= 65538 + } + mulSinkI64 = x + }) +} + +func BenchmarkMulconstU32(b *testing.B) { + // 3x = 2x + x + b.Run("3", func(b *testing.B) { + x := uint32(1) + for i := 0; i < b.N; i++ { + x *= 3 + } + mulSinkU32 = x + }) + // 5x = 4x + x + b.Run("5", func(b *testing.B) { + x := uint32(1) + for i := 0; i < b.N; i++ { + x *= 5 + } + mulSinkU32 = x + }) + // 12x = 8x + 4x + b.Run("12", func(b *testing.B) { + x := uint32(1) + for i := 0; i < b.N; i++ { + x *= 12 + } + mulSinkU32 = x + }) + // 120x = 128x - 8x + b.Run("120", func(b *testing.B) { + x := uint32(1) + for i := 0; i < b.N; i++ { + x *= 120 + } + mulSinkU32 = x + }) + // 65537x = 65536x + x + b.Run("65537", func(b *testing.B) { + x := uint32(1) + for i := 0; i < b.N; i++ { + x *= 65537 + } + mulSinkU32 = x + }) + // 65538x = 65536x + 2x + b.Run("65538", func(b *testing.B) { + x := uint32(1) + for i := 0; i < b.N; i++ { + x *= 65538 + } + mulSinkU32 = x + }) +} + +func BenchmarkMulconstU64(b *testing.B) { + // 3x = 2x + x + b.Run("3", func(b *testing.B) { + x := uint64(1) + for i := 0; i < b.N; i++ { + x *= 3 + } + mulSinkU64 = x + }) + // 5x = 4x + x + b.Run("5", func(b *testing.B) { + x := uint64(1) + for i := 0; i < b.N; i++ { + x *= 5 + } + mulSinkU64 = x + }) + // 12x = 8x + 4x + b.Run("12", func(b *testing.B) { + x := uint64(1) + for i := 0; i < b.N; i++ { + x *= 12 + } + mulSinkU64 = x + }) + // 120x = 128x - 8x + b.Run("120", func(b *testing.B) { + x := uint64(1) + for i := 0; i < b.N; i++ { + x *= 120 + } + mulSinkU64 = x + }) + // 65537x = 65536x + x + b.Run("65537", func(b *testing.B) { + x := uint64(1) + for i := 0; i < b.N; i++ { + x *= 65537 + } + mulSinkU64 = x + }) + // 65538x = 65536x + 2x + b.Run("65538", func(b *testing.B) { + x := uint64(1) + for i := 0; i < b.N; i++ { + x *= 65538 + } + mulSinkU64 = x + }) +} diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index 8f25974376..9f30ec8ce4 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -71,9 +71,15 @@ func Mul_96(n int) int { // 386:`SHLL\t[$]5`,`LEAL\t\(.*\)\(.*\*2\),`,-`IMULL` // arm64:`LSL\t[$]5`,`ADD\sR[0-9]+<<1,\sR[0-9]+`,-`MUL` // arm:`SLL\t[$]5`,`ADD\sR[0-9]+<<1,\sR[0-9]+`,-`MUL` + // s390x:`SLD\t[$]5`,`SLD\t[$]6`,-`MULLD` return n * 96 } +func Mul_n120(n int) int { + // s390x:`SLD\t[$]3`,`SLD\t[$]7`,-`MULLD` + return n * -120 +} + func MulMemSrc(a []uint32, b []float32) { // 386:`IMULL\s4\([A-Z]+\),\s[A-Z]+` a[0] *= a[1] -- GitLab From c12d9ed87596688aeeeb61111e408f6a176aa287 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Tue, 18 Aug 2020 10:54:11 -0400 Subject: [PATCH 0250/1792] cmd/go: revert 3 CLs affecting par.Work, context propagation, tracing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts the following changes: • cmd/go: add tracing for querying and downloading from the proxy CL 242786, commit 1a3558341860357c2400e37773e5076bb3a51628 • cmd/go: do context propagation for tracing downloads CL 248327, commit c0cf190d226cc3defb71d17c01d0b45bf49a8a85 • cmd/go/internal: remove some users of par.Work CL 248326, commit f30044a03bc7cf107dbec03c02fb6d0072878252 Reason for revert: broke linux 386 and amd64 longtest builders. The problem started with CL 248326, but CL 248327 and CL 242786 are reverted as well due to conflicts. Updates #38714. Fixes #40861. Change-Id: I68496b4e5a27e47a42183553c3a645b288edac83 Reviewed-on: https://go-review.googlesource.com/c/go/+/249017 Run-TryBot: Dmitri Shuralyov Reviewed-by: Bryan C. Mills Reviewed-by: Carlos Amedee TryBot-Result: Gobot Gobot --- src/cmd/go/internal/get/get.go | 4 +- src/cmd/go/internal/list/list.go | 5 +- src/cmd/go/internal/load/pkg.go | 40 +++++----- src/cmd/go/internal/load/test.go | 6 +- src/cmd/go/internal/modcmd/download.go | 75 ++++++++----------- src/cmd/go/internal/modcmd/graph.go | 19 +++-- src/cmd/go/internal/modcmd/init.go | 2 +- src/cmd/go/internal/modcmd/tidy.go | 2 +- src/cmd/go/internal/modcmd/vendor.go | 2 +- src/cmd/go/internal/modcmd/why.go | 6 +- src/cmd/go/internal/modconv/convert.go | 59 +++++++-------- src/cmd/go/internal/modconv/convert_test.go | 5 +- src/cmd/go/internal/modfetch/fetch.go | 24 ++---- .../modfetch/zip_sum_test/zip_sum_test.go | 3 +- src/cmd/go/internal/modget/get.go | 59 ++++++--------- src/cmd/go/internal/modload/build.go | 17 ++--- src/cmd/go/internal/modload/import.go | 9 +-- src/cmd/go/internal/modload/import_test.go | 5 +- src/cmd/go/internal/modload/init.go | 9 +-- src/cmd/go/internal/modload/list.go | 49 +++++------- src/cmd/go/internal/modload/load.go | 39 +++++----- src/cmd/go/internal/modload/mvs.go | 5 +- src/cmd/go/internal/modload/query.go | 55 +++++--------- src/cmd/go/internal/modload/query_test.go | 5 +- src/cmd/go/internal/modload/search.go | 5 +- src/cmd/go/internal/run/run.go | 2 +- src/cmd/go/internal/test/test.go | 2 +- src/cmd/go/internal/work/exec.go | 2 +- 28 files changed, 216 insertions(+), 299 deletions(-) diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index e5bacadaa3..ef43602aca 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -246,9 +246,9 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int) load1 := func(path string, mode int) *load.Package { if parent == nil { mode := 0 // don't do module or vendor resolution - return load.LoadImport(context.TODO(), path, base.Cwd, nil, stk, nil, mode) + return load.LoadImport(path, base.Cwd, nil, stk, nil, mode) } - return load.LoadImport(context.TODO(), path, parent.Dir, parent, stk, nil, mode|load.ResolveModule) + return load.LoadImport(path, parent.Dir, parent, stk, nil, mode|load.ResolveModule) } p := load1(arg, mode) diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index e68c39f392..7303e6c866 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -20,7 +20,6 @@ import ( "cmd/go/internal/cache" "cmd/go/internal/cfg" "cmd/go/internal/load" - "cmd/go/internal/modinfo" "cmd/go/internal/modload" "cmd/go/internal/str" "cmd/go/internal/work" @@ -350,7 +349,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { fm := template.FuncMap{ "join": strings.Join, "context": context, - "module": func(path string) *modinfo.ModulePublic { return modload.ModuleInfo(ctx, path) }, + "module": modload.ModuleInfo, } tmpl, err := template.New("main").Funcs(fm).Parse(*listFmt) if err != nil { @@ -390,7 +389,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go list -m: not using modules") } - modload.InitMod(ctx) // Parses go.mod and sets cfg.BuildMod. + modload.InitMod() // Parses go.mod and sets cfg.BuildMod. if cfg.BuildMod == "vendor" { const actionDisabledFormat = "go list -m: can't %s using the vendor directory\n\t(Use -mod=mod or -mod=readonly to bypass.)" diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 71fd9b5538..32c2ba7912 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -42,10 +42,10 @@ var ( ModBinDir func() string // return effective bin directory ModLookup func(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) // lookup effective meaning of import ModPackageModuleInfo func(path string) *modinfo.ModulePublic // return module info for Package struct - ModImportPaths func(ctx context.Context, args []string) []*search.Match // expand import paths + ModImportPaths func(args []string) []*search.Match // expand import paths ModPackageBuildInfo func(main string, deps []string) string // return module info to embed in binary ModInfoProg func(info string, isgccgo bool) []byte // wrap module info in .go code for binary - ModImportFromFiles func(context.Context, []string) // update go.mod to add modules for imports in these files + ModImportFromFiles func([]string) // update go.mod to add modules for imports in these files ModDirImportPath func(string) string // return effective import path for directory ) @@ -553,7 +553,7 @@ func ReloadPackageNoFlags(arg string, stk *ImportStack) *Package { }) packageDataCache.Delete(p.ImportPath) } - return LoadImport(context.TODO(), arg, base.Cwd, nil, stk, nil, 0) + return LoadImport(arg, base.Cwd, nil, stk, nil, 0) } // dirToImportPath returns the pseudo-import path we use for a package @@ -605,11 +605,11 @@ const ( // 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, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { - return loadImport(ctx, nil, path, srcDir, parent, stk, importPos, mode) +func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { + return loadImport(nil, path, srcDir, parent, stk, importPos, mode) } -func loadImport(ctx context.Context, pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { +func loadImport(pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { if path == "" { panic("LoadImport called with empty package path") } @@ -657,7 +657,7 @@ func loadImport(ctx context.Context, pre *preload, path, srcDir string, parent * // Load package. // loadPackageData may return bp != nil even if an error occurs, // in order to return partial information. - p.load(ctx, path, stk, importPos, bp, err) + p.load(path, stk, importPos, bp, err) if !cfg.ModulesEnabled && path != cleanImport(path) { p.Error = &PackageError{ @@ -1591,7 +1591,7 @@ func (p *Package) DefaultExecName() string { // load populates p using information from bp, err, which should // be the result of calling build.Context.Import. // stk contains the import stack, not including path itself. -func (p *Package) load(ctx context.Context, path string, stk *ImportStack, importPos []token.Position, bp *build.Package, err error) { +func (p *Package) load(path string, stk *ImportStack, importPos []token.Position, bp *build.Package, err error) { p.copyBuild(bp) // The localPrefix is the path we interpret ./ imports relative to. @@ -1800,7 +1800,7 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor if path == "C" { continue } - p1 := LoadImport(ctx, path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport) + p1 := LoadImport(path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport) path = p1.ImportPath importPaths[i] = path @@ -2073,7 +2073,7 @@ func PackageList(roots []*Package) []*Package { // TestPackageList returns the list of packages in the dag rooted at roots // as visited in a depth-first post-order traversal, including the test // imports of the roots. This ignores errors in test packages. -func TestPackageList(ctx context.Context, roots []*Package) []*Package { +func TestPackageList(roots []*Package) []*Package { seen := map[*Package]bool{} all := []*Package{} var walk func(*Package) @@ -2089,7 +2089,7 @@ func TestPackageList(ctx context.Context, roots []*Package) []*Package { } walkTest := func(root *Package, path string) { var stk ImportStack - p1 := LoadImport(ctx, path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport) + p1 := LoadImport(path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport) if p1.Error == nil { walk(p1) } @@ -2112,7 +2112,7 @@ func TestPackageList(ctx context.Context, roots []*Package) []*Package { // 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(), path, srcDir, parent, stk, importPos, mode) + p := LoadImport(path, srcDir, parent, stk, importPos, mode) setToolFlags(p) return p } @@ -2153,12 +2153,12 @@ func PackagesAndErrors(ctx context.Context, patterns []string) []*Package { // We need to test whether the path is an actual Go file and not a // package path or pattern ending in '.go' (see golang.org/issue/34653). if fi, err := os.Stat(p); err == nil && !fi.IsDir() { - return []*Package{GoFilesPackage(ctx, patterns)} + return []*Package{GoFilesPackage(patterns)} } } } - matches := ImportPaths(ctx, patterns) + matches := ImportPaths(patterns) var ( pkgs []*Package stk ImportStack @@ -2174,7 +2174,7 @@ func PackagesAndErrors(ctx context.Context, patterns []string) []*Package { if pkg == "" { panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern())) } - p := loadImport(ctx, pre, pkg, base.Cwd, nil, &stk, nil, 0) + p := loadImport(pre, pkg, base.Cwd, nil, &stk, nil, 0) p.Match = append(p.Match, m.Pattern()) p.Internal.CmdlinePkg = true if m.IsLiteral() { @@ -2228,9 +2228,9 @@ func setToolFlags(pkgs ...*Package) { } } -func ImportPaths(ctx context.Context, args []string) []*search.Match { +func ImportPaths(args []string) []*search.Match { if ModInit(); cfg.ModulesEnabled { - return ModImportPaths(ctx, args) + return ModImportPaths(args) } return search.ImportPaths(args) } @@ -2281,7 +2281,7 @@ func PackagesForBuild(ctx context.Context, args []string) []*Package { // GoFilesPackage creates a package for building a collection of Go files // (typically named on the command line). The target is named p.a for // package p or named after the first Go file for package main. -func GoFilesPackage(ctx context.Context, gofiles []string) *Package { +func GoFilesPackage(gofiles []string) *Package { ModInit() for _, f := range gofiles { @@ -2329,7 +2329,7 @@ func GoFilesPackage(ctx context.Context, gofiles []string) *Package { ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil } if cfg.ModulesEnabled { - ModImportFromFiles(ctx, gofiles) + ModImportFromFiles(gofiles) } var err error @@ -2345,7 +2345,7 @@ func GoFilesPackage(ctx context.Context, gofiles []string) *Package { pkg := new(Package) pkg.Internal.Local = true pkg.Internal.CmdlineFiles = true - pkg.load(ctx, "command-line-arguments", &stk, nil, bp, err) + pkg.load("command-line-arguments", &stk, nil, bp, err) pkg.Internal.LocalPrefix = dirToImportPath(dir) pkg.ImportPath = "command-line-arguments" pkg.Target = "" diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index a0e275095b..6db8a00245 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -108,7 +108,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p stk.Push(p.ImportPath + " (test)") rawTestImports := str.StringList(p.TestImports) for i, path := range p.TestImports { - p1 := loadImport(ctx, pre, path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport) + p1 := loadImport(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 @@ -127,7 +127,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p pxtestNeedsPtest := false rawXTestImports := str.StringList(p.XTestImports) for i, path := range p.XTestImports { - p1 := loadImport(ctx, pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) + p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) if p1.ImportPath == p.ImportPath { pxtestNeedsPtest = true } else { @@ -244,7 +244,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p if dep == ptest.ImportPath { pmain.Internal.Imports = append(pmain.Internal.Imports, ptest) } else { - p1 := loadImport(ctx, pre, dep, "", nil, &stk, nil, 0) + p1 := loadImport(pre, dep, "", nil, &stk, nil, 0) pmain.Internal.Imports = append(pmain.Internal.Imports, p1) } } diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 13e5cb066b..946e8ed3cf 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -5,15 +5,15 @@ package modcmd import ( - "cmd/go/internal/modfetch" "context" "encoding/json" "os" - "runtime" "cmd/go/internal/base" "cmd/go/internal/cfg" + "cmd/go/internal/modfetch" "cmd/go/internal/modload" + "cmd/go/internal/par" "cmd/go/internal/work" "golang.org/x/mod/module" @@ -90,7 +90,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { if len(args) == 0 { args = []string{"all"} } else if modload.HasModRoot() { - modload.InitMod(ctx) // to fill Target + modload.InitMod() // to fill Target targetAtLatest := modload.Target.Path + "@latest" targetAtUpgrade := modload.Target.Path + "@upgrade" targetAtPatch := modload.Target.Path + "@patch" @@ -102,7 +102,33 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { } } - downloadModule := func(m *moduleJSON) { + var mods []*moduleJSON + var work par.Work + listU := false + listVersions := false + for _, info := range modload.ListModules(ctx, args, listU, listVersions) { + if info.Replace != nil { + info = info.Replace + } + if info.Version == "" && info.Error == nil { + // main module or module replaced with file path. + // Nothing to download. + continue + } + m := &moduleJSON{ + Path: info.Path, + Version: info.Version, + } + mods = append(mods, m) + if info.Error != nil { + m.Error = info.Error.Err + continue + } + work.Add(m) + } + + work.Do(10, func(item interface{}) { + m := item.(*moduleJSON) var err error m.Info, err = modfetch.InfoFile(m.Path, m.Version) if err != nil { @@ -120,53 +146,18 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { return } mod := module.Version{Path: m.Path, Version: m.Version} - m.Zip, err = modfetch.DownloadZip(ctx, mod) + m.Zip, err = modfetch.DownloadZip(mod) if err != nil { m.Error = err.Error() return } m.Sum = modfetch.Sum(mod) - m.Dir, err = modfetch.Download(ctx, mod) + m.Dir, err = modfetch.Download(mod) if err != nil { m.Error = err.Error() return } - } - - var mods []*moduleJSON - listU := false - listVersions := false - type token struct{} - sem := make(chan token, runtime.GOMAXPROCS(0)) - for _, info := range modload.ListModules(ctx, args, listU, listVersions) { - if info.Replace != nil { - info = info.Replace - } - if info.Version == "" && info.Error == nil { - // main module or module replaced with file path. - // Nothing to download. - continue - } - m := &moduleJSON{ - Path: info.Path, - Version: info.Version, - } - mods = append(mods, m) - if info.Error != nil { - m.Error = info.Error.Err - continue - } - sem <- token{} - go func() { - downloadModule(m) - <-sem - }() - } - - // Fill semaphore channel to wait for goroutines to finish. - for n := cap(sem); n > 0; n-- { - sem <- token{} - } + }) if *downloadJSON { for _, m := range mods { diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index 6da12b9cab..4853503fd4 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -15,6 +15,7 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modload" + "cmd/go/internal/par" "cmd/go/internal/work" "golang.org/x/mod/module" @@ -58,25 +59,23 @@ func runGraph(ctx context.Context, cmd *base.Command, args []string) { return m.Path + "@" + m.Version } + // Note: using par.Work only to manage work queue. + // No parallelism here, so no locking. var out []string var deps int // index in out where deps start - seen := map[module.Version]bool{modload.Target: true} - queue := []module.Version{modload.Target} - for len(queue) > 0 { - var m module.Version - m, queue = queue[0], queue[1:] + var work par.Work + work.Add(modload.Target) + work.Do(1, func(item interface{}) { + m := item.(module.Version) list, _ := reqs.Required(m) for _, r := range list { - if !seen[r] { - queue = append(queue, r) - seen[r] = true - } + work.Add(r) out = append(out, format(m)+" "+format(r)+"\n") } if m == modload.Target { deps = len(out) } - } + }) sort.Slice(out[deps:], func(i, j int) bool { return out[deps+i][0] < out[deps+j][0] diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index b6cffd332d..95063e62f4 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -51,6 +51,6 @@ func runInit(ctx context.Context, cmd *base.Command, args []string) { if strings.Contains(modload.CmdModModule, "@") { base.Fatalf("go mod init: module path must not contain '@'") } - modload.InitMod(ctx) // does all the hard work + modload.InitMod() // does all the hard work modload.WriteGoMod() } diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index c7c53d7c0c..769cd11fe8 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -40,7 +40,7 @@ func runTidy(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go mod tidy: no arguments allowed") } - modload.LoadALL(ctx) + modload.LoadALL() modload.TidyBuildList() modload.TrimGoSum() modload.WriteGoMod() diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index e5353b5c7f..257d1cd0ef 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -48,7 +48,7 @@ func runVendor(ctx context.Context, cmd *base.Command, args []string) { if len(args) != 0 { base.Fatalf("go mod vendor: vendor takes no arguments") } - pkgs := modload.LoadVendor(ctx) + pkgs := modload.LoadVendor() vdir := filepath.Join(modload.ModRoot(), "vendor") if err := os.RemoveAll(vdir); err != nil { diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index da33fff89e..f400339b25 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -76,7 +76,7 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { } mods := modload.ListModules(ctx, args, listU, listVersions) byModule := make(map[module.Version][]string) - for _, path := range loadALL(ctx) { + for _, path := range loadALL() { m := modload.PackageModule(path) if m.Path != "" { byModule[m] = append(byModule[m], path) @@ -105,8 +105,8 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { sep = "\n" } } else { - matches := modload.ImportPaths(ctx, args) // resolve to packages - loadALL(ctx) // rebuild graph, from main module (not from named packages) + matches := modload.ImportPaths(args) // resolve to packages + loadALL() // rebuild graph, from main module (not from named packages) sep := "" for _, m := range matches { for _, path := range m.Pkgs { diff --git a/src/cmd/go/internal/modconv/convert.go b/src/cmd/go/internal/modconv/convert.go index d5a0bc21e9..f465a9f395 100644 --- a/src/cmd/go/internal/modconv/convert.go +++ b/src/cmd/go/internal/modconv/convert.go @@ -7,12 +7,13 @@ package modconv import ( "fmt" "os" - "runtime" "sort" "strings" + "sync" "cmd/go/internal/base" "cmd/go/internal/modfetch" + "cmd/go/internal/par" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -41,52 +42,46 @@ func ConvertLegacyConfig(f *modfile.File, file string, data []byte) error { // Convert requirements block, which may use raw SHA1 hashes as versions, // to valid semver requirement list, respecting major versions. - versions := make([]*module.Version, len(mf.Require)) - replace := make(map[string]*modfile.Replace) + var ( + work par.Work + mu sync.Mutex + need = make(map[string]string) + replace = make(map[string]*modfile.Replace) + ) for _, r := range mf.Replace { replace[r.New.Path] = r replace[r.Old.Path] = r } - - type token struct{} - sem := make(chan token, runtime.GOMAXPROCS(0)) - for i, r := range mf.Require { + for _, r := range mf.Require { m := r.Mod if m.Path == "" { continue } if re, ok := replace[m.Path]; ok { - m = re.New + work.Add(re.New) + continue } - sem <- token{} - go func(i int, m module.Version) { - repo, info, err := modfetch.ImportRepoRev(m.Path, m.Version) - if err != nil { - fmt.Fprintf(os.Stderr, "go: converting %s: stat %s@%s: %v\n", base.ShortPath(file), m.Path, m.Version, err) - return - } - - path := repo.ModulePath() - versions[i].Path = path - versions[i].Version = info.Version - - <-sem - }(i, m) - } - // Fill semaphore channel to wait for all tasks to finish. - for n := cap(sem); n > 0; n-- { - sem <- token{} + work.Add(r.Mod) } - need := map[string]string{} - for _, v := range versions { + work.Do(10, func(item interface{}) { + r := item.(module.Version) + repo, info, err := modfetch.ImportRepoRev(r.Path, r.Version) + if err != nil { + fmt.Fprintf(os.Stderr, "go: converting %s: stat %s@%s: %v\n", base.ShortPath(file), r.Path, r.Version, err) + return + } + mu.Lock() + path := repo.ModulePath() // Don't use semver.Max here; need to preserve +incompatible suffix. - if needv, ok := need[v.Path]; !ok || semver.Compare(needv, v.Version) < 0 { - need[v.Path] = v.Version + if v, ok := need[path]; !ok || semver.Compare(v, info.Version) < 0 { + need[path] = info.Version } - } - paths := make([]string, 0, len(need)) + mu.Unlock() + }) + + var paths []string for path := range need { paths = append(paths, path) } diff --git a/src/cmd/go/internal/modconv/convert_test.go b/src/cmd/go/internal/modconv/convert_test.go index faa2b4c606..a04a13b14f 100644 --- a/src/cmd/go/internal/modconv/convert_test.go +++ b/src/cmd/go/internal/modconv/convert_test.go @@ -6,7 +6,6 @@ package modconv import ( "bytes" - "context" "fmt" "internal/testenv" "io/ioutil" @@ -147,8 +146,6 @@ func TestConvertLegacyConfig(t *testing.T) { }, } - ctx := context.Background() - for _, tt := range tests { t.Run(strings.ReplaceAll(tt.path, "/", "_")+"_"+tt.vers, func(t *testing.T) { f, err := modfile.Parse("golden", []byte(tt.gomod), nil) @@ -160,7 +157,7 @@ func TestConvertLegacyConfig(t *testing.T) { t.Fatal(err) } - dir, err := modfetch.Download(ctx, module.Version{Path: tt.path, Version: tt.vers}) + dir, err := modfetch.Download(module.Version{Path: tt.path, Version: tt.vers}) 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 e29eb0a942..e40158b535 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -7,7 +7,6 @@ package modfetch import ( "archive/zip" "bytes" - "context" "errors" "fmt" "io" @@ -24,7 +23,6 @@ import ( "cmd/go/internal/par" "cmd/go/internal/renameio" "cmd/go/internal/robustio" - "cmd/go/internal/trace" "golang.org/x/mod/module" "golang.org/x/mod/sumdb/dirhash" @@ -36,7 +34,7 @@ var downloadCache par.Cache // 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) { +func Download(mod module.Version) (dir string, err 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. @@ -49,7 +47,7 @@ func Download(ctx context.Context, mod module.Version) (dir string, err error) { err error } c := downloadCache.Do(mod, func() interface{} { - dir, err := download(ctx, mod) + dir, err := download(mod) if err != nil { return cached{"", err} } @@ -59,10 +57,7 @@ func Download(ctx context.Context, mod module.Version) (dir string, err error) { return c.dir, c.err } -func download(ctx context.Context, mod module.Version) (dir string, err error) { - ctx, span := trace.StartSpan(ctx, "modfetch.download "+mod.String()) - defer span.Done() - +func download(mod module.Version) (dir string, err error) { // If the directory exists, and no .partial file exists, the module has // already been completely extracted. .partial files may be created when a // module zip directory is extracted in place instead of being extracted to a @@ -77,7 +72,7 @@ func download(ctx context.Context, mod module.Version) (dir string, err error) { // To avoid cluttering the cache with extraneous files, // DownloadZip uses the same lockfile as Download. // Invoke DownloadZip before locking the file. - zipfile, err := DownloadZip(ctx, mod) + zipfile, err := DownloadZip(mod) if err != nil { return "", err } @@ -147,7 +142,6 @@ func download(ctx context.Context, mod module.Version) (dir string, err error) { return "", err } - ctx, span = trace.StartSpan(ctx, "unzip "+zipfile) if unzipInPlace { if err := ioutil.WriteFile(partialPath, nil, 0666); err != nil { return "", err @@ -177,7 +171,6 @@ func download(ctx context.Context, mod module.Version) (dir string, err error) { return "", err } } - defer span.Done() if !cfg.ModCacheRW { // Make dir read-only only *after* renaming it. @@ -202,7 +195,7 @@ var downloadZipCache par.Cache // 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) { +func DownloadZip(mod module.Version) (zipfile string, err error) { // The par.Cache here avoids duplicate work. type cached struct { zipfile string @@ -237,7 +230,7 @@ func DownloadZip(ctx context.Context, mod module.Version) (zipfile string, err e if err := os.MkdirAll(filepath.Dir(zipfile), 0777); err != nil { return cached{"", err} } - if err := downloadZip(ctx, mod, zipfile); err != nil { + if err := downloadZip(mod, zipfile); err != nil { return cached{"", err} } return cached{zipfile, nil} @@ -245,10 +238,7 @@ func DownloadZip(ctx context.Context, mod module.Version) (zipfile string, err e return c.zipfile, c.err } -func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err error) { - ctx, span := trace.StartSpan(ctx, "modfetch.downloadZip "+zipfile) - defer span.Done() - +func downloadZip(mod module.Version, zipfile string) (err error) { // Clean up any remaining tempfiles from previous runs. // This is only safe to do because the lock file ensures that their // writers are no longer active. 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 82398ebfed..eac9b32fa8 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 @@ -16,7 +16,6 @@ package zip_sum_test import ( - "context" "crypto/sha256" "encoding/csv" "encoding/hex" @@ -120,7 +119,7 @@ func TestZipSums(t *testing.T) { 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) + zipPath, err := modfetch.DownloadZip(test.m) if err != nil { if *updateTestData { t.Logf("%s: could not download module: %s (will remove from testdata)", test.m, err) diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index ee9757912b..93a6bb54d5 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -11,7 +11,6 @@ import ( "fmt" "os" "path/filepath" - "runtime" "sort" "strings" "sync" @@ -22,6 +21,7 @@ import ( "cmd/go/internal/load" "cmd/go/internal/modload" "cmd/go/internal/mvs" + "cmd/go/internal/par" "cmd/go/internal/search" "cmd/go/internal/work" @@ -353,7 +353,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { if !strings.Contains(path, "...") { m := search.NewMatch(path) if pkgPath := modload.DirImportPath(path); pkgPath != "." { - m = modload.TargetPackages(ctx, pkgPath) + m = modload.TargetPackages(pkgPath) } if len(m.Pkgs) == 0 { for _, err := range m.Errs { @@ -399,7 +399,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { default: // The argument is a package or module path. if modload.HasModRoot() { - if m := modload.TargetPackages(ctx, path); len(m.Pkgs) != 0 { + if m := modload.TargetPackages(path); len(m.Pkgs) != 0 { // The path is in the main module. Nothing to query. if vers != "upgrade" && vers != "patch" { base.Errorf("go get %s: can't request explicit version of path in main module", arg) @@ -491,7 +491,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { if q.path == q.m.Path { wg.Add(1) go func(q *query) { - if hasPkg, err := modload.ModuleHasRootPackage(ctx, q.m); err != nil { + if hasPkg, err := modload.ModuleHasRootPackage(q.m); err != nil { base.Errorf("go get: %v", err) } else if !hasPkg { modOnlyMu.Lock() @@ -536,7 +536,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // Don't load packages if pkgPatterns is empty. Both // modload.ImportPathsQuiet and ModulePackages convert an empty list // of patterns to []string{"."}, which is not what we want. - matches = modload.ImportPathsQuiet(ctx, pkgPatterns, imports.AnyTags()) + matches = modload.ImportPathsQuiet(pkgPatterns, imports.AnyTags()) seenPkgs = make(map[string]bool) for i, match := range matches { arg := pkgGets[i] @@ -725,44 +725,29 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // reported. A map from module paths to queries is returned, which includes // queries and modOnly. func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*query, modOnly map[string]*query) map[string]*query { + var lookup par.Work + for _, q := range queries { + if cached := cache[q.querySpec]; cached != nil { + *q = *cached + } else { + cache[q.querySpec] = q + lookup.Add(q) + } + } - runQuery := func(q *query) { + lookup.Do(10, func(item interface{}) { + q := item.(*query) if q.vers == "none" { // Wait for downgrade step. q.m = module.Version{Path: q.path, Version: "none"} return } - m, err := getQuery(ctx, q.path, q.vers, q.prevM, q.forceModulePath) + m, err := getQuery(q.path, q.vers, q.prevM, q.forceModulePath) if err != nil { base.Errorf("go get %s: %v", q.arg, err) } q.m = m - } - - type token struct{} - sem := make(chan token, runtime.GOMAXPROCS(0)) - for _, q := range queries { - if cached := cache[q.querySpec]; cached != nil { - *q = *cached - } else { - sem <- token{} - go func(q *query) { - runQuery(q) - <-sem - }(q) - } - } - - // Fill semaphore channel to wait for goroutines to finish. - for n := cap(sem); n > 0; n-- { - sem <- token{} - } - - // Add to cache after concurrent section to avoid races... - for _, q := range queries { - cache[q.querySpec] = q - } - + }) base.ExitIfErrors() byPath := make(map[string]*query) @@ -790,7 +775,7 @@ func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*quer // to determine the underlying module version being requested. // If forceModulePath is set, getQuery must interpret path // as a module path. -func getQuery(ctx context.Context, path, vers string, prevM module.Version, forceModulePath bool) (module.Version, error) { +func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (module.Version, error) { if (prevM.Version != "") != forceModulePath { // We resolve package patterns by calling QueryPattern, which does not // accept a previous version and therefore cannot take it into account for @@ -812,7 +797,7 @@ func getQuery(ctx context.Context, path, vers string, prevM module.Version, forc } } - info, err := modload.Query(ctx, path, vers, prevM.Version, modload.Allowed) + info, err := modload.Query(path, vers, prevM.Version, modload.Allowed) if err == nil { if info.Version != vers && info.Version != prevM.Version { logOncef("go: %s %s => %s", path, vers, info.Version) @@ -838,7 +823,7 @@ func getQuery(ctx context.Context, path, vers string, prevM module.Version, forc // If it turns out to only exist as a module, we can detect the resulting // PackageNotInModuleError and avoid a second round-trip through (potentially) // all of the configured proxies. - results, err := modload.QueryPattern(ctx, path, vers, modload.Allowed) + results, err := modload.QueryPattern(path, vers, modload.Allowed) if err != nil { // If the path doesn't contain a wildcard, check whether it was actually a // module path instead. If so, return that. @@ -994,7 +979,7 @@ func (u *upgrader) Upgrade(m module.Version) (module.Version, error) { // If we're querying "upgrade" or "patch", Query will compare the current // version against the chosen version and will return the current version // if it is newer. - info, err := modload.Query(context.TODO(), m.Path, string(getU), m.Version, modload.Allowed) + info, err := modload.Query(m.Path, string(getU), m.Version, modload.Allowed) if err != nil { // Report error but return m, to let version selection continue. // (Reporting the error will fail the command at the next base.ExitIfErrors.) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index a101681a1f..5f8a2e7e05 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -6,7 +6,6 @@ package modload import ( "bytes" - "context" "encoding/hex" "fmt" "internal/goroot" @@ -58,21 +57,21 @@ func PackageModuleInfo(pkgpath string) *modinfo.ModulePublic { if !ok { return nil } - return moduleInfo(context.TODO(), m, true) + return moduleInfo(m, true) } -func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { +func ModuleInfo(path string) *modinfo.ModulePublic { if !Enabled() { return nil } if i := strings.Index(path, "@"); i >= 0 { - return moduleInfo(ctx, module.Version{Path: path[:i], Version: path[i+1:]}, false) + return moduleInfo(module.Version{Path: path[:i], Version: path[i+1:]}, false) } for _, m := range BuildList() { if m.Path == path { - return moduleInfo(ctx, m, true) + return moduleInfo(m, true) } } @@ -85,12 +84,12 @@ func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { } // addUpdate fills in m.Update if an updated version is available. -func addUpdate(ctx context.Context, m *modinfo.ModulePublic) { +func addUpdate(m *modinfo.ModulePublic) { if m.Version == "" { return } - if info, err := Query(ctx, m.Path, "upgrade", m.Version, Allowed); err == nil && semver.Compare(info.Version, m.Version) > 0 { + if info, err := Query(m.Path, "upgrade", m.Version, Allowed); err == nil && semver.Compare(info.Version, m.Version) > 0 { m.Update = &modinfo.ModulePublic{ Path: m.Path, Version: info.Version, @@ -104,7 +103,7 @@ func addVersions(m *modinfo.ModulePublic) { m.Versions, _ = versions(m.Path) } -func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modinfo.ModulePublic { +func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic { if m == Target { info := &modinfo.ModulePublic{ Path: m.Path, @@ -133,7 +132,7 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi // completeFromModCache fills in the extra fields in m using the module cache. completeFromModCache := func(m *modinfo.ModulePublic) { if m.Version != "" { - if q, err := Query(ctx, m.Path, m.Version, "", nil); err != nil { + if q, err := Query(m.Path, m.Version, "", nil); err != nil { m.Error = &modinfo.ModuleError{Err: err.Error()} } else { m.Version = q.Version diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 5c51a79124..4d2bc805e2 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -5,7 +5,6 @@ package modload import ( - "context" "errors" "fmt" "go/build" @@ -111,7 +110,7 @@ var _ load.ImportPathError = &AmbiguousImportError{} // Import returns an ImportMissingError as the error. // If Import can identify a module that could be added to supply the package, // the ImportMissingError records that module. -func Import(ctx context.Context, path string) (m module.Version, dir string, err error) { +func Import(path string) (m module.Version, dir string, err error) { if strings.Contains(path, "@") { return module.Version{}, "", fmt.Errorf("import path should not have @version") } @@ -166,7 +165,7 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err // Avoid possibly downloading irrelevant modules. continue } - root, isLocal, err := fetch(ctx, m) + root, isLocal, err := fetch(m) if err != nil { // Report fetch error. // Note that we don't know for sure this module is necessary, @@ -249,7 +248,7 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err return len(mods[i].Path) > len(mods[j].Path) }) for _, m := range mods { - root, isLocal, err := fetch(ctx, m) + root, isLocal, err := fetch(m) if err != nil { // Report fetch error as above. return module.Version{}, "", err @@ -286,7 +285,7 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err fmt.Fprintf(os.Stderr, "go: finding module for package %s\n", path) - candidates, err := QueryPackage(ctx, path, "latest", Allowed) + candidates, err := QueryPackage(path, "latest", Allowed) if err != nil { if errors.Is(err, os.ErrNotExist) { // Return "cannot find module providing package […]" instead of whatever diff --git a/src/cmd/go/internal/modload/import_test.go b/src/cmd/go/internal/modload/import_test.go index 47ce89a084..accc60eecd 100644 --- a/src/cmd/go/internal/modload/import_test.go +++ b/src/cmd/go/internal/modload/import_test.go @@ -5,7 +5,6 @@ package modload import ( - "context" "internal/testenv" "regexp" "strings" @@ -50,12 +49,10 @@ func TestImport(t *testing.T) { }(allowMissingModuleImports) AllowMissingModuleImports() - ctx := context.Background() - for _, tt := range importTests { t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) { // Note that there is no build list, so Import should always fail. - m, dir, err := Import(ctx, tt.path) + m, dir, err := Import(tt.path) if err == nil { t.Fatalf("Import(%q) = %v, %v, nil; expected error", tt.path, m, dir) } diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 93027c44c4..fff060e665 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -6,7 +6,6 @@ package modload import ( "bytes" - "context" "encoding/json" "errors" "fmt" @@ -333,7 +332,7 @@ func die() { // // As a side-effect, InitMod sets a default for cfg.BuildMod if it does not // already have an explicit value. -func InitMod(ctx context.Context) { +func InitMod() { if len(buildList) > 0 { return } @@ -360,7 +359,7 @@ func InitMod(ctx context.Context) { } var fixed bool - f, err := modfile.Parse(gomod, data, fixVersion(ctx, &fixed)) + f, err := modfile.Parse(gomod, data, fixVersion(&fixed)) if err != nil { // Errors returned by modfile.Parse begin with file:line. base.Fatalf("go: errors parsing go.mod:\n%s\n", err) @@ -398,7 +397,7 @@ func InitMod(ctx context.Context) { // and does nothing for versions that already appear to be canonical. // // The VersionFixer sets 'fixed' if it ever returns a non-canonical version. -func fixVersion(ctx context.Context, fixed *bool) modfile.VersionFixer { +func fixVersion(fixed *bool) modfile.VersionFixer { return func(path, vers string) (resolved string, err error) { defer func() { if err == nil && resolved != vers { @@ -430,7 +429,7 @@ func fixVersion(ctx context.Context, fixed *bool) modfile.VersionFixer { } } - info, err := Query(ctx, path, vers, "", nil) + info, err := Query(path, vers, "", nil) if err != nil { return "", err } diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 7bf4e86c8d..4768516e90 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -9,12 +9,12 @@ import ( "errors" "fmt" "os" - "runtime" "strings" "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modinfo" + "cmd/go/internal/par" "cmd/go/internal/search" "golang.org/x/mod/module" @@ -22,42 +22,31 @@ import ( func ListModules(ctx context.Context, args []string, listU, listVersions bool) []*modinfo.ModulePublic { mods := listModules(ctx, args, listVersions) - - type token struct{} - sem := make(chan token, runtime.GOMAXPROCS(0)) if listU || listVersions { + var work par.Work for _, m := range mods { - add := func(m *modinfo.ModulePublic) { - sem <- token{} - go func() { - if listU { - addUpdate(ctx, m) - } - if listVersions { - addVersions(m) - } - <-sem - }() - } - - add(m) + work.Add(m) if m.Replace != nil { - add(m.Replace) + work.Add(m.Replace) } } + work.Do(10, func(item interface{}) { + m := item.(*modinfo.ModulePublic) + if listU { + addUpdate(m) + } + if listVersions { + addVersions(m) + } + }) } - // Fill semaphore channel to wait for all tasks to finish. - for n := cap(sem); n > 0; n-- { - sem <- token{} - } - return mods } func listModules(ctx context.Context, args []string, listVersions bool) []*modinfo.ModulePublic { LoadBuildList(ctx) if len(args) == 0 { - return []*modinfo.ModulePublic{moduleInfo(ctx, buildList[0], true)} + return []*modinfo.ModulePublic{moduleInfo(buildList[0], true)} } var mods []*modinfo.ModulePublic @@ -83,7 +72,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin } } - info, err := Query(ctx, path, vers, current, nil) + info, err := Query(path, vers, current, nil) if err != nil { mods = append(mods, &modinfo.ModulePublic{ Path: path, @@ -92,7 +81,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin }) continue } - mods = append(mods, moduleInfo(ctx, module.Version{Path: path, Version: info.Version}, false)) + mods = append(mods, moduleInfo(module.Version{Path: path, Version: info.Version}, false)) continue } @@ -117,7 +106,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin matched = true if !matchedBuildList[i] { matchedBuildList[i] = true - mods = append(mods, moduleInfo(ctx, m, true)) + mods = append(mods, moduleInfo(m, true)) } } } @@ -127,9 +116,9 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin // Don't make the user provide an explicit '@latest' when they're // explicitly asking what the available versions are. // Instead, resolve the module, even if it isn't an existing dependency. - info, err := Query(ctx, arg, "latest", "", nil) + info, err := Query(arg, "latest", "", nil) if err == nil { - mods = append(mods, moduleInfo(ctx, module.Version{Path: arg, Version: info.Version}, false)) + mods = append(mods, moduleInfo(module.Version{Path: arg, Version: info.Version}, false)) } else { mods = append(mods, &modinfo.ModulePublic{ Path: arg, diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 686d491219..8190009b23 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -52,8 +52,8 @@ var loaded *loader // ImportPaths returns the set of packages matching the args (patterns), // on the target platform. Modules may be added to the build list // to satisfy new imports. -func ImportPaths(ctx context.Context, patterns []string) []*search.Match { - matches := ImportPathsQuiet(ctx, patterns, imports.Tags()) +func ImportPaths(patterns []string) []*search.Match { + matches := ImportPathsQuiet(patterns, imports.Tags()) search.WarnUnmatched(matches) return matches } @@ -62,7 +62,7 @@ func ImportPaths(ctx context.Context, patterns []string) []*search.Match { // no matches. It also lets the caller specify a set of build tags to match // packages. The build tags should typically be imports.Tags() or // imports.AnyTags(); a nil map has no special meaning. -func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bool) []*search.Match { +func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { updateMatches := func(matches []*search.Match, iterating bool) { for _, m := range matches { switch { @@ -103,7 +103,7 @@ func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bo case strings.Contains(m.Pattern(), "..."): m.Errs = m.Errs[:0] - matchPackages(ctx, m, loaded.tags, includeStd, buildList) + matchPackages(m, loaded.tags, includeStd, buildList) case m.Pattern() == "all": loaded.testAll = true @@ -111,7 +111,7 @@ func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bo // Enumerate the packages in the main module. // We'll load the dependencies as we find them. m.Errs = m.Errs[:0] - matchPackages(ctx, m, loaded.tags, omitStd, []module.Version{Target}) + matchPackages(m, loaded.tags, omitStd, []module.Version{Target}) } else { // Starting with the packages in the main module, // enumerate the full list of "all". @@ -129,7 +129,7 @@ func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bo } } - InitMod(ctx) + InitMod() var matches []*search.Match for _, pattern := range search.CleanPatterns(patterns) { @@ -338,8 +338,8 @@ func pathInModuleCache(dir string) string { // ImportFromFiles adds modules to the build list as needed // to satisfy the imports in the named Go source files. -func ImportFromFiles(ctx context.Context, gofiles []string) { - InitMod(ctx) +func ImportFromFiles(gofiles []string) { + InitMod() tags := imports.Tags() imports, testImports, err := imports.ScanFiles(gofiles, tags) @@ -391,7 +391,7 @@ func DirImportPath(dir string) string { func LoadBuildList(ctx context.Context) []module.Version { ctx, span := trace.StartSpan(ctx, "LoadBuildList") defer span.Done() - InitMod(ctx) + InitMod() ReloadBuildList() WriteGoMod() return buildList @@ -409,20 +409,20 @@ func ReloadBuildList() []module.Version { // It adds modules to the build list as needed to satisfy new imports. // This set is useful for deciding whether a particular import is needed // anywhere in a module. -func LoadALL(ctx context.Context) []string { - return loadAll(ctx, true) +func LoadALL() []string { + return loadAll(true) } // LoadVendor is like LoadALL but only follows test dependencies // for tests in the main module. Tests in dependency modules are // ignored completely. // This set is useful for identifying the which packages to include in a vendor directory. -func LoadVendor(ctx context.Context) []string { - return loadAll(ctx, false) +func LoadVendor() []string { + return loadAll(false) } -func loadAll(ctx context.Context, testAll bool) []string { - InitMod(ctx) +func loadAll(testAll bool) []string { + InitMod() loaded = newLoader(imports.AnyTags()) loaded.isALL = true @@ -430,7 +430,7 @@ func loadAll(ctx context.Context, testAll bool) []string { if !testAll { loaded.testRoots = true } - all := TargetPackages(ctx, "...") + all := TargetPackages("...") loaded.load(func() []string { return all.Pkgs }) checkMultiplePaths() WriteGoMod() @@ -453,13 +453,13 @@ func loadAll(ctx context.Context, testAll bool) []string { // TargetPackages returns the list of packages in the target (top-level) module // matching pattern, which may be relative to the working directory, under all // build tag settings. -func TargetPackages(ctx context.Context, pattern string) *search.Match { +func TargetPackages(pattern string) *search.Match { // TargetPackages is relative to the main module, so ensure that the main // module is a thing that can contain packages. ModRoot() m := search.NewMatch(pattern) - matchPackages(ctx, m, imports.AnyTags(), omitStd, []module.Version{Target}) + matchPackages(m, imports.AnyTags(), omitStd, []module.Version{Target}) return m } @@ -817,8 +817,7 @@ func (ld *loader) doPkg(item interface{}) { return } - // TODO(matloob): Handle TODO context. This needs to be threaded through Do. - pkg.mod, pkg.dir, pkg.err = Import(context.TODO(), pkg.path) + pkg.mod, pkg.dir, pkg.err = Import(pkg.path) if pkg.dir == "" { return } diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 67eb2c2e19..5dd009d31d 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -5,7 +5,6 @@ package modload import ( - "context" "errors" "fmt" "os" @@ -225,7 +224,7 @@ func (*mvsReqs) next(m module.Version) (module.Version, error) { // // The isLocal return value reports whether the replacement, // if any, is local to the filesystem. -func fetch(ctx context.Context, mod module.Version) (dir string, isLocal bool, err error) { +func fetch(mod module.Version) (dir string, isLocal bool, err error) { if mod == Target { return ModRoot(), true, nil } @@ -255,6 +254,6 @@ func fetch(ctx context.Context, mod module.Version) (dir string, isLocal bool, e mod = r } - dir, err = modfetch.Download(ctx, mod) + dir, err = modfetch.Download(mod) return dir, false, err } diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index e82eb1506f..acc886bf21 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -5,7 +5,6 @@ package modload import ( - "context" "errors" "fmt" "os" @@ -19,7 +18,6 @@ import ( "cmd/go/internal/modfetch" "cmd/go/internal/search" "cmd/go/internal/str" - "cmd/go/internal/trace" "golang.org/x/mod/module" "golang.org/x/mod/semver" @@ -57,10 +55,10 @@ import ( // // If path is the path of the main module and the query is "latest", // Query returns Target.Version as the version. -func Query(ctx context.Context, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { +func Query(path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { var info *modfetch.RevInfo err := modfetch.TryProxies(func(proxy string) (err error) { - info, err = queryProxy(ctx, proxy, path, query, current, allowed) + info, err = queryProxy(proxy, path, query, current, allowed) return err }) return info, err @@ -77,10 +75,7 @@ func (queryDisabledError) Error() string { return fmt.Sprintf("cannot query module due to -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason) } -func queryProxy(ctx context.Context, proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { - ctx, span := trace.StartSpan(ctx, "modload.queryProxy "+path+" "+query) - defer span.Done() - +func queryProxy(proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { if current != "" && !semver.IsValid(current) { return nil, fmt.Errorf("invalid previous version %q", current) } @@ -248,7 +243,7 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed if err != nil { return nil, err } - releases, prereleases, err := filterVersions(ctx, path, versions, ok, preferIncompatible) + releases, prereleases, err := filterVersions(path, versions, ok, preferIncompatible) if err != nil { return nil, err } @@ -332,7 +327,7 @@ func matchSemverPrefix(p, v string) bool { // 1. versions that do not satisfy the 'ok' predicate, and // 2. "+incompatible" versions, if a compatible one satisfies the predicate // and the incompatible version is not preferred. -func filterVersions(ctx context.Context, path string, versions []string, ok func(module.Version) bool, preferIncompatible bool) (releases, prereleases []string, err error) { +func filterVersions(path string, versions []string, ok func(module.Version) bool, preferIncompatible bool) (releases, prereleases []string, err error) { var lastCompatible string for _, v := range versions { if !ok(module.Version{Path: path, Version: v}) { @@ -348,7 +343,7 @@ func filterVersions(ctx context.Context, path string, versions []string, ok func // https://golang.org/issue/34165.) Note that we even prefer a // compatible pre-release over an incompatible release. - ok, err := versionHasGoMod(ctx, module.Version{Path: path, Version: lastCompatible}) + ok, err := versionHasGoMod(module.Version{Path: path, Version: lastCompatible}) if err != nil { return nil, nil, err } @@ -385,12 +380,12 @@ type QueryResult struct { // If the package is in the main module, QueryPackage considers only the main // module and only the version "latest", without checking for other possible // modules. -func QueryPackage(ctx context.Context, path, query string, allowed func(module.Version) bool) ([]QueryResult, error) { +func QueryPackage(path, query string, allowed func(module.Version) bool) ([]QueryResult, error) { m := search.NewMatch(path) if m.IsLocal() || !m.IsLiteral() { return nil, fmt.Errorf("pattern %s is not an importable package", path) } - return QueryPattern(ctx, path, query, allowed) + return QueryPattern(path, query, allowed) } // QueryPattern looks up the module(s) containing at least one package matching @@ -406,10 +401,7 @@ func QueryPackage(ctx context.Context, path, query string, allowed func(module.V // If any matching package is in the main module, QueryPattern considers only // the main module and only the version "latest", without checking for other // possible modules. -func QueryPattern(ctx context.Context, pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { - ctx, span := trace.StartSpan(ctx, "modload.QueryPattern "+pattern+" "+query) - defer span.Done() - +func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { base := pattern firstError := func(m *search.Match) error { @@ -425,7 +417,7 @@ func QueryPattern(ctx context.Context, pattern, query string, allowed func(modul base = pathpkg.Dir(pattern[:i+3]) match = func(mod module.Version, root string, isLocal bool) *search.Match { m := search.NewMatch(pattern) - matchPackages(ctx, m, imports.AnyTags(), omitStd, []module.Version{mod}) + matchPackages(m, imports.AnyTags(), omitStd, []module.Version{mod}) return m } } else { @@ -477,18 +469,15 @@ func QueryPattern(ctx context.Context, pattern, query string, allowed func(modul } err := modfetch.TryProxies(func(proxy string) error { - queryModule := func(ctx context.Context, path string) (r QueryResult, err error) { - ctx, span := trace.StartSpan(ctx, "modload.QueryPattern.queryModule ["+proxy+"] "+path) - defer span.Done() - + queryModule := func(path string) (r QueryResult, err error) { current := findCurrentVersion(path) r.Mod.Path = path - r.Rev, err = queryProxy(ctx, proxy, path, query, current, allowed) + r.Rev, err = queryProxy(proxy, path, query, current, allowed) if err != nil { return r, err } r.Mod.Version = r.Rev.Version - root, isLocal, err := fetch(ctx, r.Mod) + root, isLocal, err := fetch(r.Mod) if err != nil { return r, err } @@ -509,7 +498,7 @@ func QueryPattern(ctx context.Context, pattern, query string, allowed func(modul } var err error - results, err = queryPrefixModules(ctx, candidateModules, queryModule) + results, err = queryPrefixModules(candidateModules, queryModule) return err }) @@ -553,10 +542,7 @@ type prefixResult struct { err error } -func queryPrefixModules(ctx context.Context, candidateModules []string, queryModule func(ctx context.Context, path string) (QueryResult, error)) (found []QueryResult, err error) { - ctx, span := trace.StartSpan(ctx, "modload.queryPrefixModules") - defer span.Done() - +func queryPrefixModules(candidateModules []string, queryModule func(path string) (QueryResult, error)) (found []QueryResult, err error) { // If the path we're attempting is not in the module cache and we don't have a // fetch result cached either, we'll end up making a (potentially slow) // request to the proxy or (often even slower) the origin server. @@ -569,9 +555,8 @@ func queryPrefixModules(ctx context.Context, candidateModules []string, queryMod var wg sync.WaitGroup wg.Add(len(candidateModules)) for i, p := range candidateModules { - ctx := trace.StartGoroutine(ctx) go func(p string, r *result) { - r.QueryResult, r.err = queryModule(ctx, p) + r.QueryResult, r.err = queryModule(p) wg.Done() }(p, &results[i]) } @@ -713,8 +698,8 @@ func (e *PackageNotInModuleError) ImportPath() string { } // ModuleHasRootPackage returns whether module m contains a package m.Path. -func ModuleHasRootPackage(ctx context.Context, m module.Version) (bool, error) { - root, isLocal, err := fetch(ctx, m) +func ModuleHasRootPackage(m module.Version) (bool, error) { + root, isLocal, err := fetch(m) if err != nil { return false, err } @@ -722,8 +707,8 @@ func ModuleHasRootPackage(ctx context.Context, m module.Version) (bool, error) { return ok, err } -func versionHasGoMod(ctx context.Context, m module.Version) (bool, error) { - root, _, err := fetch(ctx, m) +func versionHasGoMod(m module.Version) (bool, error) { + root, _, err := fetch(m) if err != nil { return false, err } diff --git a/src/cmd/go/internal/modload/query_test.go b/src/cmd/go/internal/modload/query_test.go index 77080e9b5b..247e4c40d2 100644 --- a/src/cmd/go/internal/modload/query_test.go +++ b/src/cmd/go/internal/modload/query_test.go @@ -5,7 +5,6 @@ package modload import ( - "context" "internal/testenv" "io/ioutil" "log" @@ -180,8 +179,6 @@ func TestQuery(t *testing.T) { testenv.MustHaveExternalNetwork(t) testenv.MustHaveExecPath(t, "git") - ctx := context.Background() - for _, tt := range queryTests { allow := tt.allow if allow == "" { @@ -195,7 +192,7 @@ func TestQuery(t *testing.T) { t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.query+"/"+tt.current+"/"+allow, func(t *testing.T) { t.Parallel() - info, err := Query(ctx, tt.path, tt.query, tt.current, allowed) + info, err := Query(tt.path, tt.query, tt.current, allowed) if tt.err != "" { if err == nil { t.Errorf("Query(%q, %q, %v) = %v, want error %q", tt.path, tt.query, allow, info.Version, tt.err) diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index a9bee0af4e..c28e7c0c1e 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -5,7 +5,6 @@ package modload import ( - "context" "fmt" "os" "path/filepath" @@ -28,7 +27,7 @@ const ( // matchPackages is like m.MatchPackages, but uses a local variable (rather than // a global) for tags, can include or exclude packages in the standard library, // and is restricted to the given list of modules. -func matchPackages(ctx context.Context, m *search.Match, tags map[string]bool, filter stdFilter, modules []module.Version) { +func matchPackages(m *search.Match, tags map[string]bool, filter stdFilter, modules []module.Version) { m.Pkgs = []string{} isMatch := func(string) bool { return true } @@ -154,7 +153,7 @@ func matchPackages(ctx context.Context, m *search.Match, tags map[string]bool, f isLocal = true } else { var err error - root, isLocal, err = fetch(ctx, mod) + root, isLocal, err = fetch(mod) if err != nil { m.AddError(err) continue diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index 99578b244c..deec5106ff 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -77,7 +77,7 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go run: cannot run *_test.go files (%s)", file) } } - p = load.GoFilesPackage(ctx, files) + p = load.GoFilesPackage(files) } else if len(args) > 0 && !strings.HasPrefix(args[0], "-") { pkgs := load.PackagesAndErrors(ctx, args[:1]) if len(pkgs) == 0 { diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 3aee6939d2..9cef8cf89c 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -702,7 +702,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { } // Select for coverage all dependencies matching the testCoverPaths patterns. - for _, p := range load.TestPackageList(ctx, pkgs) { + for _, p := range load.TestPackageList(pkgs) { haveMatch := false for i := range testCoverPaths { if match[i](p) { diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index d975c36306..681ecd7646 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2900,7 +2900,7 @@ func (b *Builder) swigDoIntSize(objdir string) (intsize string, err error) { } srcs := []string{src} - p := load.GoFilesPackage(context.TODO(), srcs) + p := load.GoFilesPackage(srcs) if _, _, e := BuildToolchain.gc(b, &Action{Mode: "swigDoIntSize", Package: p, Objdir: objdir}, "", nil, "", false, srcs); e != nil { return "32", nil -- GitLab From b58d29741650c7bf10b17f455666e2727e1cdd2e Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 17 Aug 2020 19:06:19 -0400 Subject: [PATCH 0251/1792] cmd/compile, runtime: mark R12 clobbered for write barrier call on PPC64 When external linking, for large binaries, the external linker may insert a trampoline for the write barrier call, which looks 0000000005a98cc8 <__long_branch_runtime.gcWriteBarrier>: 5a98cc8: 86 01 82 3d addis r12,r2,390 5a98ccc: d8 bd 8c e9 ld r12,-16936(r12) 5a98cd0: a6 03 89 7d mtctr r12 5a98cd4: 20 04 80 4e bctr It clobbers R12 (and CTR, which is never live across a call). As at compile time we don't know whether the binary is big and what link mode will be used, I think we need to mark R12 as clobbered for write barrier call. For extra safety (future-proof) we mark caller-saved register that cannot be used for function arguments, which includes R11, as potentially clobbered as well. Fixes #40851. Change-Id: Iedd901c5072f1127cc59b0a48cfeb4aaec81b519 Reviewed-on: https://go-review.googlesource.com/c/go/+/248917 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 4 +- src/cmd/compile/internal/ssa/opGen.go | 2 +- src/runtime/asm_ppc64x.s | 41 ++++++++++---------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index f8bc6cb20b..0261dc283b 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -645,9 +645,9 @@ func init() { {name: "LoweredAtomicOr8", 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 R15, g, and its arguments R20 and R21, + // It preserves R0 through R17 (except special registers R1, R2, R11, R12, R13), g, and its arguments 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 R11 R12 R14 R15 R20 R21 g")) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"}, + {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"}, // 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/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 408c855dbd..df2a27368b 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -26889,7 +26889,7 @@ var opcodeTable = [...]opInfo{ {0, 1048576}, // R20 {1, 2097152}, // R21 }, - clobbers: 576460746931503104, // R16 R17 R18 R19 R22 R23 R24 R25 R26 R27 R28 R29 R31 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 + clobbers: 576460746931312640, // R11 R12 R18 R19 R22 R23 R24 R25 R26 R27 R28 R29 R31 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 }, }, { diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s index 11d2f2f51a..23387a2165 100644 --- a/src/runtime/asm_ppc64x.s +++ b/src/runtime/asm_ppc64x.s @@ -916,23 +916,23 @@ TEXT ·checkASM(SB),NOSPLIT,$0-1 // - R20 is the destination of the write // - R21 is the value being written at R20. // It clobbers condition codes. -// It does not clobber R0 through R15, +// It does not clobber R0 through R17 (except special registers), // but may clobber any other register, *including* R31. TEXT runtime·gcWriteBarrier(SB),NOSPLIT,$112 // The standard prologue clobbers R31. - // We use R16 and R17 as scratch registers. - MOVD g_m(g), R16 - MOVD m_p(R16), R16 - MOVD (p_wbBuf+wbBuf_next)(R16), R17 + // We use R18 and R19 as scratch registers. + MOVD g_m(g), R18 + MOVD m_p(R18), R18 + MOVD (p_wbBuf+wbBuf_next)(R18), R19 // Increment wbBuf.next position. - ADD $16, R17 - MOVD R17, (p_wbBuf+wbBuf_next)(R16) - MOVD (p_wbBuf+wbBuf_end)(R16), R16 - CMP R16, R17 + ADD $16, R19 + MOVD R19, (p_wbBuf+wbBuf_next)(R18) + MOVD (p_wbBuf+wbBuf_end)(R18), R18 + CMP R18, R19 // Record the write. - MOVD R21, -16(R17) // Record value - MOVD (R20), R16 // TODO: This turns bad writes into bad reads. - MOVD R16, -8(R17) // Record *slot + 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: @@ -956,11 +956,12 @@ flush: MOVD R8, (FIXED_FRAME+56)(R1) MOVD R9, (FIXED_FRAME+64)(R1) MOVD R10, (FIXED_FRAME+72)(R1) - MOVD R11, (FIXED_FRAME+80)(R1) - MOVD R12, (FIXED_FRAME+88)(R1) + // R11, R12 may be clobbered by external-linker-inserted trampoline // R13 is REGTLS - MOVD R14, (FIXED_FRAME+96)(R1) - MOVD R15, (FIXED_FRAME+104)(R1) + MOVD R14, (FIXED_FRAME+80)(R1) + MOVD R15, (FIXED_FRAME+88)(R1) + MOVD R16, (FIXED_FRAME+96)(R1) + MOVD R17, (FIXED_FRAME+104)(R1) // This takes arguments R20 and R21. CALL runtime·wbBufFlush(SB) @@ -975,10 +976,10 @@ flush: MOVD (FIXED_FRAME+56)(R1), R8 MOVD (FIXED_FRAME+64)(R1), R9 MOVD (FIXED_FRAME+72)(R1), R10 - MOVD (FIXED_FRAME+80)(R1), R11 - MOVD (FIXED_FRAME+88)(R1), R12 - MOVD (FIXED_FRAME+96)(R1), R14 - MOVD (FIXED_FRAME+104)(R1), R15 + MOVD (FIXED_FRAME+80)(R1), R14 + MOVD (FIXED_FRAME+88)(R1), R15 + MOVD (FIXED_FRAME+96)(R1), R16 + MOVD (FIXED_FRAME+104)(R1), R17 JMP ret // Note: these functions use a special calling convention to save generated code space. -- GitLab From 20b4987d3e658a1cd93472185d7998f745bd062e Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Wed, 13 May 2020 13:57:36 -0400 Subject: [PATCH 0252/1792] cmd/dist: use GO_TEST_SHORT value more consistently There were two places where the -short flag was added in order to speed up tests when run in short mode, in CL 178399 and CL 177417. It appears viable to re-use the GO_TEST_SHORT value so that -short flag is not used when the tests are executed on a longtest builder, where it is not a goal to skip slow tests for improved performance. Do so, in order to make the testing configurations simpler and more predictable. Factor out the flag name out of the string returned by short, so that it can be used in context of 'go test' which can accept a -short flag, and a test binary which requires the use of a longer -test.short flag. For #39054. For #29252. Change-Id: I52dfbef73cc8307735c52e2ebaa609305fb05933 Reviewed-on: https://go-review.googlesource.com/c/go/+/233898 Run-TryBot: Dmitri Shuralyov TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/dist/test.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 2dc9459215..a83ae35293 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -241,13 +241,15 @@ func (t *tester) shouldRunTest(name string) bool { return false } -// short returns a -short flag to pass to 'go test'. -// It returns "-short", unless the environment variable +// short returns a -short flag value to use with 'go test' +// or a test binary for tests intended to run in short mode. +// It returns "true", unless the environment variable // GO_TEST_SHORT is set to a non-empty, false-ish string. // // This environment variable is meant to be an internal -// detail between the Go build system and cmd/dist -// and is not intended for use by users. +// detail between the Go build system and cmd/dist for +// the purpose of longtest builders, and is not intended +// for use by users. See golang.org/issue/12508. func short() string { if v := os.Getenv("GO_TEST_SHORT"); v != "" { short, err := strconv.ParseBool(v) @@ -255,10 +257,10 @@ func short() string { fatalf("invalid GO_TEST_SHORT %q: %v", v, err) } if !short { - return "-short=false" + return "false" } } - return "-short" + return "true" } // goTest returns the beginning of the go test command line. @@ -266,7 +268,7 @@ func short() string { // defaults as later arguments in the command line. func (t *tester) goTest() []string { return []string{ - "go", "test", short(), "-count=1", t.tags(), t.runFlag(""), + "go", "test", "-short=" + short(), "-count=1", t.tags(), t.runFlag(""), } } @@ -335,7 +337,7 @@ func (t *tester) registerStdTest(pkg string) { } args := []string{ "test", - short(), + "-short=" + short(), t.tags(), t.timeout(timeoutSec), "-gcflags=all=" + gogcflags, @@ -373,7 +375,7 @@ func (t *tester) registerRaceBenchTest(pkg string) { ranGoBench = true args := []string{ "test", - short(), + "-short=" + short(), "-race", t.timeout(1200), // longer timeout for race with benchmarks "-run=^$", // nothing. only benchmarks. @@ -1069,7 +1071,7 @@ func (t *tester) runHostTest(dir, pkg string) error { if err := cmd.Run(); err != nil { return err } - return t.dirCmd(dir, f.Name(), "-test.short").Run() + return t.dirCmd(dir, f.Name(), "-test.short="+short()).Run() } func (t *tester) cgoTest(dt *distTest) error { @@ -1570,7 +1572,7 @@ func (t *tester) prebuiltGoPackageTestBinary() string { func (t *tester) runPrecompiledStdTest(timeout time.Duration) error { bin := t.prebuiltGoPackageTestBinary() fmt.Fprintf(os.Stderr, "# %s: using pre-built %s...\n", stdMatches[0], bin) - cmd := exec.Command(bin, "-test.short", "-test.timeout="+timeout.String()) + cmd := exec.Command(bin, "-test.short="+short(), "-test.timeout="+timeout.String()) cmd.Dir = filepath.Dir(bin) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr -- GitLab From 93eeb819cab491d4e429b7aa85a864a045979a18 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Mon, 8 Jun 2020 13:58:53 +0800 Subject: [PATCH 0253/1792] cmd/asm: Add SHA512 hardware instructions for ARM64 ARMv8.2-SHA add SHA512 intructions: 1. SHA512H Vm.D2, Vn, Vd 2. SHA512H2 Vm.D2, Vn, Vd 3. SHA512SU0 Vn.D2, Vd.D2 4. SHA512SU1 Vm.D2, Vn.D2, Vd.D2 ARMv8 Architecture Reference Manual C7.2.234-C7.2.234 Change-Id: Ie970fef1bba5312ad466f246035da4c40a1bbb39 Reviewed-on: https://go-review.googlesource.com/c/go/+/180057 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/asm/internal/asm/testdata/arm64.s | 4 ++++ src/cmd/internal/obj/arm64/a.out.go | 4 ++++ src/cmd/internal/obj/arm64/anames.go | 4 ++++ src/cmd/internal/obj/arm64/asm7.go | 16 ++++++++++++++++ 4 files changed, 28 insertions(+) diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index 69267bfa63..5a6db05074 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -77,6 +77,10 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8 SHA1H V5, V4 // a408285e SHA1M V8.S4, V7, V6 // e620085e SHA1P V11.S4, V10, V9 // 49110b5e + SHA512H V2.D2, V1, V0 // 208062ce + SHA512H2 V4.D2, V3, V2 // 628464ce + SHA512SU0 V9.D2, V8.D2 // 2881c0ce + SHA512SU1 V7.D2, V6.D2, V5.D2 // c58867ce VADDV V0.S4, V0 // 00b8b14e VMOVI $82, V0.B16 // 40e6024f VUADDLV V6.B16, V6 // c638306e diff --git a/src/cmd/internal/obj/arm64/a.out.go b/src/cmd/internal/obj/arm64/a.out.go index 152c493a65..03e0278a33 100644 --- a/src/cmd/internal/obj/arm64/a.out.go +++ b/src/cmd/internal/obj/arm64/a.out.go @@ -946,6 +946,10 @@ const ( ASHA256H2 ASHA256SU0 ASHA256SU1 + ASHA512H + ASHA512H2 + ASHA512SU0 + ASHA512SU1 AVADD AVADDP AVAND diff --git a/src/cmd/internal/obj/arm64/anames.go b/src/cmd/internal/obj/arm64/anames.go index 565f70aaf9..65ecd007ea 100644 --- a/src/cmd/internal/obj/arm64/anames.go +++ b/src/cmd/internal/obj/arm64/anames.go @@ -453,6 +453,10 @@ var Anames = []string{ "SHA256H2", "SHA256SU0", "SHA256SU1", + "SHA512H", + "SHA512H2", + "SHA512SU0", + "SHA512SU1", "VADD", "VADDP", "VAND", diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index df17729a76..8f8981479b 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -2747,6 +2747,7 @@ func buildop(ctxt *obj.Link) { oprangeset(AAESIMC, t) oprangeset(ASHA1SU1, t) oprangeset(ASHA256SU0, t) + oprangeset(ASHA512SU0, t) case ASHA1C: oprangeset(ASHA1P, t) @@ -2754,9 +2755,12 @@ func buildop(ctxt *obj.Link) { case ASHA256H: oprangeset(ASHA256H2, t) + oprangeset(ASHA512H, t) + oprangeset(ASHA512H2, t) case ASHA1SU0: oprangeset(ASHA256SU1, t) + oprangeset(ASHA512SU1, t) case AVADDV: oprangeset(AVUADDLV, t) @@ -5391,6 +5395,18 @@ func (c *ctxt7) oprrr(p *obj.Prog, a obj.As) uint32 { case ASHA256SU0: return 0x5E<<24 | 2<<20 | 8<<16 | 2<<12 | 2<<10 + case ASHA512H: + return 0xCE<<24 | 3<<21 | 8<<12 + + case ASHA512H2: + return 0xCE<<24 | 3<<21 | 8<<12 | 4<<8 + + case ASHA512SU1: + return 0xCE<<24 | 3<<21 | 8<<12 | 8<<8 + + case ASHA512SU0: + return 0xCE<<24 | 3<<22 | 8<<12 + case AFCVTZSD: return FPCVTI(1, 0, 1, 3, 0) -- GitLab From cdc77d34d7770ed02d84b9193380f9646017dce6 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 17 Aug 2020 17:31:21 -0400 Subject: [PATCH 0254/1792] testing: treat PAUSE lines as changing the active test name We could instead fix cmd/test2json to treat PAUSE lines as *not* changing the active test name, but that seems like it would be more confusing to humans, and also wouldn't fix tools that parse output using existing builds of cmd/test2json. Fixes #40657 Change-Id: I937611778f5b1e7dd1d6e9f44424d7e725a589ed Reviewed-on: https://go-review.googlesource.com/c/go/+/248727 Run-TryBot: Bryan C. Mills Reviewed-by: Jean de Klerk --- .../testdata/script/test_json_interleaved.txt | 27 +++++++++++++++++++ src/testing/testing.go | 25 +++++++++++++---- 2 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 src/cmd/go/testdata/script/test_json_interleaved.txt diff --git a/src/cmd/go/testdata/script/test_json_interleaved.txt b/src/cmd/go/testdata/script/test_json_interleaved.txt new file mode 100644 index 0000000000..e2d349e3fb --- /dev/null +++ b/src/cmd/go/testdata/script/test_json_interleaved.txt @@ -0,0 +1,27 @@ +# Regression test for https://golang.org/issue/40657: output from the main test +# function should be attributed correctly even if interleaved with the PAUSE +# line for a new parallel subtest. + +[short] skip + +go test -json +stdout '"Test":"TestWeirdTiming","Output":"[^"]* logging to outer again\\n"' + +-- go.mod -- +module example.com +go 1.15 +-- main_test.go -- +package main + +import ( + "testing" +) + +func TestWeirdTiming(outer *testing.T) { + outer.Run("pauser", func(pauser *testing.T) { + outer.Logf("logging to outer") + pauser.Parallel() + }) + + outer.Logf("logging to outer again") +} diff --git a/src/testing/testing.go b/src/testing/testing.go index 061142b9ab..6fc8c4fa9f 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -357,10 +357,19 @@ func (p *testPrinter) Fprint(w io.Writer, testName, out string) { defer p.lastNameMu.Unlock() if !p.chatty || - strings.HasPrefix(out, "--- PASS") || - strings.HasPrefix(out, "--- FAIL") || - strings.HasPrefix(out, "=== CONT") || - strings.HasPrefix(out, "=== RUN") { + strings.HasPrefix(out, "--- PASS: ") || + strings.HasPrefix(out, "--- FAIL: ") || + strings.HasPrefix(out, "--- SKIP: ") || + strings.HasPrefix(out, "=== RUN ") || + strings.HasPrefix(out, "=== CONT ") || + strings.HasPrefix(out, "=== PAUSE ") { + // If we're buffering test output (!p.chatty), we don't really care which + // test is emitting which line so long as they are serialized. + // + // If the message already implies an association with a specific new test, + // we don't need to check what the old test name was or log an extra CONT + // line for it. (We're updating it anyway, and the current message already + // includes the test name.) p.lastName = testName fmt.Fprint(w, out) return @@ -976,7 +985,13 @@ func (t *T) Parallel() { for ; root.parent != nil; root = root.parent { } root.mu.Lock() - fmt.Fprintf(root.w, "=== PAUSE %s\n", t.name) + // Unfortunately, even though PAUSE indicates that the named test is *no + // longer* running, cmd/test2json interprets it as changing the active test + // for the purpose of log parsing. We could fix cmd/test2json, but that + // won't fix existing deployments of third-party tools that already shell + // out to older builds of cmd/test2json — so merely fixing cmd/test2json + // isn't enough for now. + printer.Fprint(root.w, t.name, fmt.Sprintf("=== PAUSE %s\n", t.name)) root.mu.Unlock() } -- GitLab From 861a9483357a1a13609430ec6684b3dc9209e80c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20M=C3=B6hrmann?= Date: Sun, 3 May 2020 19:58:10 +0200 Subject: [PATCH 0255/1792] encoding/asn1: speed up marshal by reducing allocations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace strings.Split by strings.IndexByte and explicit slicing to avoid the allocation of the return slice of strings.Split. name old time/op new time/op delta Marshal 43.3µs ± 1% 36.7µs ± 1% -15.23% (p=0.000 n=9+9) name old alloc/op new alloc/op delta Marshal 10.7kB ± 0% 9.2kB ± 0% -13.96% (p=0.000 n=10+10) name old allocs/op new allocs/op delta Marshal 444 ± 0% 366 ± 0% -17.57% (p=0.000 n=10+10) Change-Id: I9e727defa23f7e5fc684f246de0136fe28cf8d25 Reviewed-on: https://go-review.googlesource.com/c/go/+/231738 TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/asn1/common.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/encoding/asn1/common.go b/src/encoding/asn1/common.go index e2aa8bd9c5..1c712e1eff 100644 --- a/src/encoding/asn1/common.go +++ b/src/encoding/asn1/common.go @@ -92,7 +92,16 @@ type fieldParameters struct { // parseFieldParameters will parse it into a fieldParameters structure, // ignoring unknown parts of the string. func parseFieldParameters(str string) (ret fieldParameters) { - for _, part := range strings.Split(str, ",") { + var part string + for len(str) > 0 { + // This loop uses IndexByte and explicit slicing + // instead of strings.Split(str, ",") to reduce allocations. + i := strings.IndexByte(str, ',') + if i < 0 { + part, str = str, "" + } else { + part, str = str[:i], str[i+1:] + } switch { case part == "optional": ret.optional = true -- GitLab From 30a68bfb806b5217932e280f5a5f521237e69077 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 27 Jul 2020 12:40:18 -0700 Subject: [PATCH 0256/1792] runtime: add "success" field to sudog The current wakeup protocol for channel communications is that the second goroutine sets gp.param to the sudog when a value is successfully communicated over the channel, and to nil when the wakeup is due to closing the channel. Setting nil to indicate channel closure works okay for chansend and chanrecv, because they're only communicating with one channel, so they know it must be the channel that was closed. However, it means selectgo has to re-poll all of the channels to figure out which one was closed. This commit adds a "success" field to sudog, and changes the wakeup protocol to always set gp.param to sg, and to use sg.success to indicate successful communication vs channel closure. While here, this also reorganizes the chansend code slightly so that the sudog is still released to the pool if the send blocks and then is awoken because the channel closed. Updates #40410. Change-Id: I6cd9a20ebf9febe370a15af1b8afe24c5539efc6 Reviewed-on: https://go-review.googlesource.com/c/go/+/245019 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Cuong Manh Le Reviewed-by: Keith Randall --- src/runtime/chan.go | 25 +++++++++++++++---------- src/runtime/runtime2.go | 6 ++++++ src/runtime/select.go | 19 +++++++------------ 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/runtime/chan.go b/src/runtime/chan.go index f6f4ffd02e..0afe5d962b 100644 --- a/src/runtime/chan.go +++ b/src/runtime/chan.go @@ -263,18 +263,19 @@ func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool { } gp.waiting = nil gp.activeStackChans = false - if gp.param == nil { - if c.closed == 0 { - throw("chansend: spurious wakeup") - } - panic(plainError("send on closed channel")) - } + closed := !mysg.success gp.param = nil if mysg.releasetime > 0 { blockevent(mysg.releasetime-t0, 2) } mysg.c = nil releaseSudog(mysg) + if closed { + if c.closed == 0 { + throw("chansend: spurious wakeup") + } + panic(plainError("send on closed channel")) + } return true } @@ -311,6 +312,7 @@ func send(c *hchan, sg *sudog, ep unsafe.Pointer, unlockf func(), skip int) { gp := sg.g unlockf() gp.param = unsafe.Pointer(sg) + sg.success = true if sg.releasetime != 0 { sg.releasetime = cputicks() } @@ -384,7 +386,8 @@ func closechan(c *hchan) { sg.releasetime = cputicks() } gp := sg.g - gp.param = nil + gp.param = unsafe.Pointer(sg) + sg.success = false if raceenabled { raceacquireg(gp, c.raceaddr()) } @@ -402,7 +405,8 @@ func closechan(c *hchan) { sg.releasetime = cputicks() } gp := sg.g - gp.param = nil + gp.param = unsafe.Pointer(sg) + sg.success = false if raceenabled { raceacquireg(gp, c.raceaddr()) } @@ -575,11 +579,11 @@ func chanrecv(c *hchan, ep unsafe.Pointer, block bool) (selected, received bool) if mysg.releasetime > 0 { blockevent(mysg.releasetime-t0, 2) } - closed := gp.param == nil + success := mysg.success gp.param = nil mysg.c = nil releaseSudog(mysg) - return true, !closed + return true, success } // recv processes a receive operation on a full channel c. @@ -632,6 +636,7 @@ func recv(c *hchan, sg *sudog, ep unsafe.Pointer, unlockf func(), skip int) { gp := sg.g unlockf() gp.param = unsafe.Pointer(sg) + sg.success = true if sg.releasetime != 0 { sg.releasetime = cputicks() } diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 959878400d..b7d0739e54 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -366,6 +366,12 @@ type sudog struct { // g.selectDone must be CAS'd to win the wake-up race. isSelect bool + // success indicates whether communication over channel c + // succeeded. It is true if the goroutine was awoken because a + // value was delivered over channel c, and false if awoken + // because c was closed. + success bool + parent *sudog // semaRoot binary tree waitlink *sudog // g.waiting list or semaRoot waittail *sudog // semaRoot diff --git a/src/runtime/select.go b/src/runtime/select.go index a069e3e050..081db7bad4 100644 --- a/src/runtime/select.go +++ b/src/runtime/select.go @@ -221,12 +221,12 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { nextp **sudog ) -loop: // pass 1 - look for something already waiting var dfli int var dfl *scase var casi int var cas *scase + var caseSuccess bool var recvOK bool for i := 0; i < ncases; i++ { casi = int(pollorder[i]) @@ -331,6 +331,7 @@ loop: // We singly-linked up the SudoGs in lock order. casi = -1 cas = nil + caseSuccess = false sglist = gp.waiting // Clear all elem before unlinking from gp.waiting. for sg1 := gp.waiting; sg1 != nil; sg1 = sg1.waitlink { @@ -352,6 +353,7 @@ loop: // sg has already been dequeued by the G that woke us up. casi = int(casei) cas = k + caseSuccess = sglist.success } else { c = k.c if k.kind == caseSend { @@ -367,16 +369,7 @@ loop: } if cas == nil { - // We can wake up with gp.param == nil (so cas == nil) - // when a channel involved in the select has been closed. - // It is easiest to loop and re-run the operation; - // we'll see that it's now closed. - // Maybe some day we can signal the close explicitly, - // but we'd have to distinguish close-on-reader from close-on-writer. - // It's easiest not to duplicate the code and just recheck above. - // We know that something closed, and things never un-close, - // so we won't block again. - goto loop + throw("selectgo: bad wakeup") } c = cas.c @@ -386,7 +379,9 @@ loop: } if cas.kind == caseRecv { - recvOK = true + recvOK = caseSuccess + } else if cas.kind == caseSend && !caseSuccess { + goto sclose } if raceenabled { -- GitLab From 78a1064d5dd05fc669342df3a6a5e11d49749d85 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 27 Jul 2020 14:05:05 -0700 Subject: [PATCH 0257/1792] runtime: remove scase.releasetime field selectgo will report at most one block event, so there's no need to keep a releasetime for every select case. It suffices to simply track the releasetime of the case responsible for the wakeup. Updates #40410. Change-Id: I72679cd43dde80d7e6dbab21a78952a4372d1e79 Reviewed-on: https://go-review.googlesource.com/c/go/+/245122 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/select.go | 1 - src/runtime/select.go | 23 ++++++++++------------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/cmd/compile/internal/gc/select.go b/src/cmd/compile/internal/gc/select.go index 49cc23cd3d..eb5ff8469b 100644 --- a/src/cmd/compile/internal/gc/select.go +++ b/src/cmd/compile/internal/gc/select.go @@ -386,7 +386,6 @@ func scasetype() *types.Type { namedfield("elem", types.Types[TUNSAFEPTR]), namedfield("kind", types.Types[TUINT16]), namedfield("pc", types.Types[TUINTPTR]), - namedfield("releasetime", types.Types[TINT64]), }) scase.SetNoalg(true) } diff --git a/src/runtime/select.go b/src/runtime/select.go index 081db7bad4..2f8b139155 100644 --- a/src/runtime/select.go +++ b/src/runtime/select.go @@ -26,11 +26,10 @@ const ( // Known to compiler. // Changes here must also be made in src/cmd/internal/gc/select.go's scasetype. type scase struct { - c *hchan // chan - elem unsafe.Pointer // data element - kind uint16 - pc uintptr // race pc (for race detector / msan) - releasetime int64 + c *hchan // chan + elem unsafe.Pointer // data element + kind uint16 + pc uintptr // race pc (for race detector / msan) } var ( @@ -142,9 +141,6 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { var t0 int64 if blockprofilerate > 0 { t0 = cputicks() - for i := 0; i < ncases; i++ { - scases[i].releasetime = -1 - } } // The compiler rewrites selects that statically have @@ -227,6 +223,7 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { var casi int var cas *scase var caseSuccess bool + var caseReleaseTime int64 = -1 var recvOK bool for i := 0; i < ncases; i++ { casi = int(pollorder[i]) @@ -346,14 +343,14 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { if k.kind == caseNil { continue } - if sglist.releasetime > 0 { - k.releasetime = sglist.releasetime - } if sg == sglist { // sg has already been dequeued by the G that woke us up. casi = int(casei) cas = k caseSuccess = sglist.success + if sglist.releasetime > 0 { + caseReleaseTime = sglist.releasetime + } } else { c = k.c if k.kind == caseSend { @@ -483,8 +480,8 @@ send: goto retc retc: - if cas.releasetime > 0 { - blockevent(cas.releasetime-t0, 1) + if caseReleaseTime > 0 { + blockevent(caseReleaseTime-t0, 1) } return casi, recvOK -- GitLab From 8a984e8e3f2cf4101f448ea9b9d9880b9e83c11e Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 27 Jul 2020 14:47:47 -0700 Subject: [PATCH 0258/1792] runtime: omit nil-channel cases from selectgo's orders Currently, selectgo does an initial pass over the cases array to look for entries with nil channels, so they can be easily recognized and skipped later on. But this still involves actually visiting the cases. This commit changes selectgo to omit cases with nil channels when constructing pollorder, so that they'll be skipped over entirely later on. It also checks for caseDefault up front, which will facilitate changing it to use a "block bool" parameter instead. Updates #40410. Change-Id: Icaebcb8f08df03cc33b6d8087616fb5585f7fedd Reviewed-on: https://go-review.googlesource.com/c/go/+/245123 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/select.go | 66 ++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 39 deletions(-) diff --git a/src/runtime/select.go b/src/runtime/select.go index 2f8b139155..d540dd2e69 100644 --- a/src/runtime/select.go +++ b/src/runtime/select.go @@ -45,7 +45,7 @@ func sellock(scases []scase, lockorder []uint16) { var c *hchan for _, o := range lockorder { c0 := scases[o].c - if c0 != nil && c0 != c { + if c0 != c { c = c0 lock(&c.lock) } @@ -61,11 +61,8 @@ func selunlock(scases []scase, lockorder []uint16) { // the G that calls select runnable again and schedules it for execution. // When the G runs on another M, it locks all the locks and frees sel. // Now if the first M touches sel, it will access freed memory. - for i := len(scases) - 1; i >= 0; i-- { + for i := len(lockorder) - 1; i >= 0; i-- { c := scases[lockorder[i]].c - if c == nil { - break - } if i > 0 && c == scases[lockorder[i-1]].c { continue // will unlock it on the next iteration } @@ -129,15 +126,6 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { pollorder := order1[:ncases:ncases] lockorder := order1[ncases:][:ncases:ncases] - // Replace send/receive cases involving nil channels with - // caseNil so logic below can assume non-nil channel. - for i := range scases { - cas := &scases[i] - if cas.c == nil && cas.kind != caseDefault { - *cas = scase{} - } - } - var t0 int64 if blockprofilerate > 0 { t0 = cputicks() @@ -152,15 +140,31 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { // optimizing (and needing to test). // generate permuted order - for i := 1; i < ncases; i++ { - j := fastrandn(uint32(i + 1)) - pollorder[i] = pollorder[j] + dfli := -1 + norder := 0 + for i := range scases { + cas := &scases[i] + + // Omit cases without channels from the poll and lock orders. + if cas.c == nil { + if cas.kind == caseDefault { + dfli = i + } + cas.elem = nil // allow GC + continue + } + + j := fastrandn(uint32(norder + 1)) + pollorder[norder] = pollorder[j] pollorder[j] = uint16(i) + norder++ } + pollorder = pollorder[:norder] + lockorder = lockorder[:norder] // sort the cases by Hchan address to get the locking order. // simple heap sort, to guarantee n log n time and constant stack footprint. - for i := 0; i < ncases; i++ { + for i := range lockorder { j := i // Start with the pollorder to permute cases on the same channel. c := scases[pollorder[i]].c @@ -171,7 +175,7 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { } lockorder[j] = pollorder[i] } - for i := ncases - 1; i >= 0; i-- { + for i := len(lockorder) - 1; i >= 0; i-- { o := lockorder[i] c := scases[o].c lockorder[i] = lockorder[0] @@ -195,7 +199,7 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { } if debugSelect { - for i := 0; i+1 < ncases; i++ { + for i := 0; i+1 < len(lockorder); i++ { if scases[lockorder[i]].c.sortkey() > scases[lockorder[i+1]].c.sortkey() { print("i=", i, " x=", lockorder[i], " y=", lockorder[i+1], "\n") throw("select: broken sort") @@ -218,22 +222,17 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { ) // pass 1 - look for something already waiting - var dfli int - var dfl *scase var casi int var cas *scase var caseSuccess bool var caseReleaseTime int64 = -1 var recvOK bool - for i := 0; i < ncases; i++ { - casi = int(pollorder[i]) + for _, casei := range pollorder { + casi = int(casei) cas = &scases[casi] c = cas.c switch cas.kind { - case caseNil: - continue - case caseRecv: sg = c.sendq.dequeue() if sg != nil { @@ -260,17 +259,12 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { if c.qcount < c.dataqsiz { goto bufsend } - - case caseDefault: - dfli = casi - dfl = cas } } - if dfl != nil { + if dfli >= 0 { selunlock(scases, lockorder) casi = dfli - cas = dfl goto retc } @@ -283,9 +277,6 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { for _, casei := range lockorder { casi = int(casei) cas = &scases[casi] - if cas.kind == caseNil { - continue - } c = cas.c sg := acquireSudog() sg.g = gp @@ -340,9 +331,6 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { for _, casei := range lockorder { k = &scases[casei] - if k.kind == caseNil { - continue - } if sg == sglist { // sg has already been dequeued by the G that woke us up. casi = int(casei) -- GitLab From d36bc7d78ad226b20056c08fb8bca041e25b3d1d Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 27 Jul 2020 15:20:18 -0700 Subject: [PATCH 0259/1792] runtime: split PCs out of scase Per-case PCs are only needed for race detector builds, so this allows skipping allocating stack space for them for non-race builds. It's possible to arrange the PCs and order arrays consecutively in memory so that we could just reuse the order0 pointer to identify both. However, there's more risk of that silently going wrong, so this commit passes them as separate arguments for now. We can revisit this in the future. Updates #40410. Change-Id: I8468bc25749e559891cb0cb007d1cc4a40fdd0f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/245124 Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/builtin.go | 199 +++++++++--------- .../compile/internal/gc/builtin/runtime.go | 4 +- src/cmd/compile/internal/gc/select.go | 18 +- src/runtime/select.go | 50 +++-- 4 files changed, 153 insertions(+), 118 deletions(-) diff --git a/src/cmd/compile/internal/gc/builtin.go b/src/cmd/compile/internal/gc/builtin.go index 2cf2f4687e..eafdb0ebe7 100644 --- a/src/cmd/compile/internal/gc/builtin.go +++ b/src/cmd/compile/internal/gc/builtin.go @@ -126,74 +126,74 @@ var runtimeDecls = [...]struct { {"selectnbsend", funcTag, 94}, {"selectnbrecv", funcTag, 95}, {"selectnbrecv2", funcTag, 97}, - {"selectsetpc", funcTag, 62}, - {"selectgo", funcTag, 98}, + {"selectsetpc", funcTag, 98}, + {"selectgo", funcTag, 99}, {"block", funcTag, 9}, - {"makeslice", funcTag, 99}, - {"makeslice64", funcTag, 100}, - {"makeslicecopy", funcTag, 101}, - {"growslice", funcTag, 103}, - {"memmove", funcTag, 104}, - {"memclrNoHeapPointers", funcTag, 105}, - {"memclrHasPointers", funcTag, 105}, - {"memequal", funcTag, 106}, - {"memequal0", funcTag, 107}, - {"memequal8", funcTag, 107}, - {"memequal16", funcTag, 107}, - {"memequal32", funcTag, 107}, - {"memequal64", funcTag, 107}, - {"memequal128", funcTag, 107}, - {"f32equal", funcTag, 108}, - {"f64equal", funcTag, 108}, - {"c64equal", funcTag, 108}, - {"c128equal", funcTag, 108}, - {"strequal", funcTag, 108}, - {"interequal", funcTag, 108}, - {"nilinterequal", funcTag, 108}, - {"memhash", funcTag, 109}, - {"memhash0", funcTag, 110}, - {"memhash8", funcTag, 110}, - {"memhash16", funcTag, 110}, - {"memhash32", funcTag, 110}, - {"memhash64", funcTag, 110}, - {"memhash128", funcTag, 110}, - {"f32hash", funcTag, 110}, - {"f64hash", funcTag, 110}, - {"c64hash", funcTag, 110}, - {"c128hash", funcTag, 110}, - {"strhash", funcTag, 110}, - {"interhash", funcTag, 110}, - {"nilinterhash", funcTag, 110}, - {"int64div", funcTag, 111}, - {"uint64div", funcTag, 112}, - {"int64mod", funcTag, 111}, - {"uint64mod", funcTag, 112}, - {"float64toint64", funcTag, 113}, - {"float64touint64", funcTag, 114}, - {"float64touint32", funcTag, 115}, - {"int64tofloat64", funcTag, 116}, - {"uint64tofloat64", funcTag, 117}, - {"uint32tofloat64", funcTag, 118}, - {"complex128div", funcTag, 119}, - {"racefuncenter", funcTag, 120}, + {"makeslice", funcTag, 100}, + {"makeslice64", funcTag, 101}, + {"makeslicecopy", funcTag, 102}, + {"growslice", funcTag, 104}, + {"memmove", funcTag, 105}, + {"memclrNoHeapPointers", funcTag, 106}, + {"memclrHasPointers", funcTag, 106}, + {"memequal", funcTag, 107}, + {"memequal0", funcTag, 108}, + {"memequal8", funcTag, 108}, + {"memequal16", funcTag, 108}, + {"memequal32", funcTag, 108}, + {"memequal64", funcTag, 108}, + {"memequal128", funcTag, 108}, + {"f32equal", funcTag, 109}, + {"f64equal", funcTag, 109}, + {"c64equal", funcTag, 109}, + {"c128equal", funcTag, 109}, + {"strequal", funcTag, 109}, + {"interequal", funcTag, 109}, + {"nilinterequal", funcTag, 109}, + {"memhash", funcTag, 110}, + {"memhash0", funcTag, 111}, + {"memhash8", funcTag, 111}, + {"memhash16", funcTag, 111}, + {"memhash32", funcTag, 111}, + {"memhash64", funcTag, 111}, + {"memhash128", funcTag, 111}, + {"f32hash", funcTag, 111}, + {"f64hash", funcTag, 111}, + {"c64hash", funcTag, 111}, + {"c128hash", funcTag, 111}, + {"strhash", funcTag, 111}, + {"interhash", funcTag, 111}, + {"nilinterhash", funcTag, 111}, + {"int64div", funcTag, 112}, + {"uint64div", funcTag, 113}, + {"int64mod", funcTag, 112}, + {"uint64mod", funcTag, 113}, + {"float64toint64", funcTag, 114}, + {"float64touint64", funcTag, 115}, + {"float64touint32", funcTag, 116}, + {"int64tofloat64", funcTag, 117}, + {"uint64tofloat64", funcTag, 118}, + {"uint32tofloat64", funcTag, 119}, + {"complex128div", funcTag, 120}, + {"racefuncenter", funcTag, 121}, {"racefuncenterfp", funcTag, 9}, {"racefuncexit", funcTag, 9}, - {"raceread", funcTag, 120}, - {"racewrite", funcTag, 120}, - {"racereadrange", funcTag, 121}, - {"racewriterange", funcTag, 121}, - {"msanread", funcTag, 121}, - {"msanwrite", funcTag, 121}, - {"checkptrAlignment", funcTag, 122}, - {"checkptrArithmetic", funcTag, 124}, - {"libfuzzerTraceCmp1", funcTag, 126}, - {"libfuzzerTraceCmp2", funcTag, 128}, - {"libfuzzerTraceCmp4", funcTag, 129}, - {"libfuzzerTraceCmp8", funcTag, 130}, - {"libfuzzerTraceConstCmp1", funcTag, 126}, - {"libfuzzerTraceConstCmp2", funcTag, 128}, - {"libfuzzerTraceConstCmp4", funcTag, 129}, - {"libfuzzerTraceConstCmp8", funcTag, 130}, + {"raceread", funcTag, 121}, + {"racewrite", funcTag, 121}, + {"racereadrange", funcTag, 122}, + {"racewriterange", funcTag, 122}, + {"msanread", funcTag, 122}, + {"msanwrite", funcTag, 122}, + {"checkptrAlignment", funcTag, 123}, + {"checkptrArithmetic", funcTag, 125}, + {"libfuzzerTraceCmp1", funcTag, 127}, + {"libfuzzerTraceCmp2", funcTag, 129}, + {"libfuzzerTraceCmp4", funcTag, 130}, + {"libfuzzerTraceCmp8", funcTag, 131}, + {"libfuzzerTraceConstCmp1", funcTag, 127}, + {"libfuzzerTraceConstCmp2", funcTag, 129}, + {"libfuzzerTraceConstCmp4", funcTag, 130}, + {"libfuzzerTraceConstCmp8", funcTag, 131}, {"x86HasPOPCNT", varTag, 6}, {"x86HasSSE41", varTag, 6}, {"x86HasFMA", varTag, 6}, @@ -202,7 +202,7 @@ var runtimeDecls = [...]struct { } func runtimeTypes() []*types.Type { - var typs [131]*types.Type + var typs [132]*types.Type typs[0] = types.Bytetype typs[1] = types.NewPtr(typs[0]) typs[2] = types.Types[TANY] @@ -301,38 +301,39 @@ func runtimeTypes() []*types.Type { typs[95] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[84])}, []*Node{anonfield(typs[6])}) typs[96] = types.NewPtr(typs[6]) typs[97] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[96]), anonfield(typs[84])}, []*Node{anonfield(typs[6])}) - typs[98] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[15])}, []*Node{anonfield(typs[15]), anonfield(typs[6])}) - typs[99] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[7])}) - typs[100] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[7])}) - typs[101] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15]), anonfield(typs[7])}, []*Node{anonfield(typs[7])}) - typs[102] = types.NewSlice(typs[2]) - typs[103] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[102]), anonfield(typs[15])}, []*Node{anonfield(typs[102])}) - typs[104] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[5])}, nil) - typs[105] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5])}, nil) - typs[106] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[5])}, []*Node{anonfield(typs[6])}) - typs[107] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[6])}) - typs[108] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[7])}, []*Node{anonfield(typs[6])}) - typs[109] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5]), anonfield(typs[5])}, []*Node{anonfield(typs[5])}) - typs[110] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5])}, []*Node{anonfield(typs[5])}) - typs[111] = functype(nil, []*Node{anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[22])}) - typs[112] = functype(nil, []*Node{anonfield(typs[24]), anonfield(typs[24])}, []*Node{anonfield(typs[24])}) - typs[113] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[22])}) - typs[114] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[24])}) - typs[115] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[65])}) - typs[116] = functype(nil, []*Node{anonfield(typs[22])}, []*Node{anonfield(typs[20])}) - typs[117] = functype(nil, []*Node{anonfield(typs[24])}, []*Node{anonfield(typs[20])}) - typs[118] = functype(nil, []*Node{anonfield(typs[65])}, []*Node{anonfield(typs[20])}) - typs[119] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[26])}, []*Node{anonfield(typs[26])}) - typs[120] = functype(nil, []*Node{anonfield(typs[5])}, nil) - typs[121] = functype(nil, []*Node{anonfield(typs[5]), anonfield(typs[5])}, nil) - typs[122] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[1]), anonfield(typs[5])}, nil) - typs[123] = types.NewSlice(typs[7]) - typs[124] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[123])}, nil) - typs[125] = types.Types[TUINT8] - typs[126] = functype(nil, []*Node{anonfield(typs[125]), anonfield(typs[125])}, nil) - typs[127] = types.Types[TUINT16] - typs[128] = functype(nil, []*Node{anonfield(typs[127]), anonfield(typs[127])}, nil) - typs[129] = functype(nil, []*Node{anonfield(typs[65]), anonfield(typs[65])}, nil) - typs[130] = functype(nil, []*Node{anonfield(typs[24]), anonfield(typs[24])}, nil) + typs[98] = functype(nil, []*Node{anonfield(typs[63])}, nil) + typs[99] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[15])}, []*Node{anonfield(typs[15]), anonfield(typs[6])}) + typs[100] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[7])}) + typs[101] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[7])}) + typs[102] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15]), anonfield(typs[7])}, []*Node{anonfield(typs[7])}) + typs[103] = types.NewSlice(typs[2]) + typs[104] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[103]), anonfield(typs[15])}, []*Node{anonfield(typs[103])}) + typs[105] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[5])}, nil) + typs[106] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5])}, nil) + typs[107] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[5])}, []*Node{anonfield(typs[6])}) + typs[108] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[6])}) + typs[109] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[7])}, []*Node{anonfield(typs[6])}) + typs[110] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5]), anonfield(typs[5])}, []*Node{anonfield(typs[5])}) + typs[111] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5])}, []*Node{anonfield(typs[5])}) + typs[112] = functype(nil, []*Node{anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[22])}) + typs[113] = functype(nil, []*Node{anonfield(typs[24]), anonfield(typs[24])}, []*Node{anonfield(typs[24])}) + typs[114] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[22])}) + typs[115] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[24])}) + typs[116] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[65])}) + typs[117] = functype(nil, []*Node{anonfield(typs[22])}, []*Node{anonfield(typs[20])}) + typs[118] = functype(nil, []*Node{anonfield(typs[24])}, []*Node{anonfield(typs[20])}) + typs[119] = functype(nil, []*Node{anonfield(typs[65])}, []*Node{anonfield(typs[20])}) + typs[120] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[26])}, []*Node{anonfield(typs[26])}) + typs[121] = functype(nil, []*Node{anonfield(typs[5])}, nil) + typs[122] = functype(nil, []*Node{anonfield(typs[5]), anonfield(typs[5])}, nil) + typs[123] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[1]), anonfield(typs[5])}, nil) + typs[124] = types.NewSlice(typs[7]) + typs[125] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[124])}, nil) + typs[126] = types.Types[TUINT8] + typs[127] = functype(nil, []*Node{anonfield(typs[126]), anonfield(typs[126])}, nil) + typs[128] = types.Types[TUINT16] + typs[129] = functype(nil, []*Node{anonfield(typs[128]), anonfield(typs[128])}, nil) + typs[130] = functype(nil, []*Node{anonfield(typs[65]), anonfield(typs[65])}, nil) + typs[131] = functype(nil, []*Node{anonfield(typs[24]), anonfield(typs[24])}, nil) return typs[:] } diff --git a/src/cmd/compile/internal/gc/builtin/runtime.go b/src/cmd/compile/internal/gc/builtin/runtime.go index 00448272c5..25f86efdd6 100644 --- a/src/cmd/compile/internal/gc/builtin/runtime.go +++ b/src/cmd/compile/internal/gc/builtin/runtime.go @@ -169,8 +169,8 @@ func selectnbsend(hchan chan<- any, elem *any) bool func selectnbrecv(elem *any, hchan <-chan any) bool func selectnbrecv2(elem *any, received *bool, hchan <-chan any) bool -func selectsetpc(cas *byte) -func selectgo(cas0 *byte, order0 *byte, ncases int) (int, bool) +func selectsetpc(pc *uintptr) +func selectgo(cas0 *byte, order0 *byte, pc0 *uintptr, ncases int) (int, bool) func block() func makeslice(typ *byte, len int, cap int) unsafe.Pointer diff --git a/src/cmd/compile/internal/gc/select.go b/src/cmd/compile/internal/gc/select.go index eb5ff8469b..8eb31eb5c1 100644 --- a/src/cmd/compile/internal/gc/select.go +++ b/src/cmd/compile/internal/gc/select.go @@ -271,6 +271,14 @@ func walkselectcases(cases *Nodes) []*Node { r = typecheck(r, ctxStmt) init = append(init, r) + var pc0, pcs *Node + if flag_race { + pcs = temp(types.NewArray(types.Types[TUINTPTR], int64(n))) + pc0 = typecheck(nod(OADDR, nod(OINDEX, pcs, nodintconst(0)), nil), ctxExpr) + } else { + pc0 = nodnil() + } + // register cases for i, cas := range cases.Slice() { setlineno(cas) @@ -324,8 +332,8 @@ func walkselectcases(cases *Nodes) []*Node { // TODO(mdempsky): There should be a cleaner way to // handle this. - if instrumenting { - r = mkcall("selectsetpc", nil, nil, bytePtrToIndex(selv, int64(i))) + if flag_race { + r = mkcall("selectsetpc", nil, nil, nod(OADDR, nod(OINDEX, pcs, nodintconst(int64(i))), nil)) init = append(init, r) } } @@ -337,13 +345,16 @@ func walkselectcases(cases *Nodes) []*Node { r = nod(OAS2, nil, nil) r.List.Set2(chosen, recvOK) fn := syslook("selectgo") - r.Rlist.Set1(mkcall1(fn, fn.Type.Results(), nil, bytePtrToIndex(selv, 0), bytePtrToIndex(order, 0), nodintconst(int64(n)))) + r.Rlist.Set1(mkcall1(fn, fn.Type.Results(), nil, bytePtrToIndex(selv, 0), bytePtrToIndex(order, 0), pc0, nodintconst(int64(n)))) r = typecheck(r, ctxStmt) init = append(init, r) // selv and order are no longer alive after selectgo. init = append(init, nod(OVARKILL, selv, nil)) init = append(init, nod(OVARKILL, order, nil)) + if flag_race { + init = append(init, nod(OVARKILL, pcs, nil)) + } // dispatch cases for i, cas := range cases.Slice() { @@ -385,7 +396,6 @@ func scasetype() *types.Type { namedfield("c", types.Types[TUNSAFEPTR]), namedfield("elem", types.Types[TUNSAFEPTR]), namedfield("kind", types.Types[TUINT16]), - namedfield("pc", types.Types[TUINTPTR]), }) scase.SetNoalg(true) } diff --git a/src/runtime/select.go b/src/runtime/select.go index d540dd2e69..d7c7d9f26f 100644 --- a/src/runtime/select.go +++ b/src/runtime/select.go @@ -29,7 +29,6 @@ type scase struct { c *hchan // chan elem unsafe.Pointer // data element kind uint16 - pc uintptr // race pc (for race detector / msan) } var ( @@ -37,8 +36,8 @@ var ( chanrecvpc = funcPC(chanrecv) ) -func selectsetpc(cas *scase) { - cas.pc = getcallerpc() +func selectsetpc(pc *uintptr) { + *pc = getcallerpc() } func sellock(scases []scase, lockorder []uint16) { @@ -108,11 +107,15 @@ func block() { // Both reside on the goroutine's stack (regardless of any escaping in // selectgo). // +// For race detector builds, pc0 points to an array of type +// [ncases]uintptr (also on the stack); for other builds, it's set to +// nil. +// // selectgo returns the index of the chosen scase, which matches the // ordinal position of its respective select{recv,send,default} call. // Also, if the chosen scase was a receive operation, it reports whether // a value was received. -func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { +func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) { if debugSelect { print("select: cas0=", cas0, "\n") } @@ -126,6 +129,21 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { pollorder := order1[:ncases:ncases] lockorder := order1[ncases:][:ncases:ncases] + // Even when raceenabled is true, there might be select + // statements in packages compiled without -race (e.g., + // ensureSigM in runtime/signal_unix.go). + var pcs []uintptr + if raceenabled && pc0 != nil { + pc1 := (*[1 << 16]uintptr)(unsafe.Pointer(pc0)) + pcs = pc1[:ncases:ncases] + } + casePC := func(casi int) uintptr { + if pcs == nil { + return 0 + } + return pcs[casi] + } + var t0 int64 if blockprofilerate > 0 { t0 = cputicks() @@ -247,7 +265,7 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { case caseSend: if raceenabled { - racereadpc(c.raceaddr(), cas.pc, chansendpc) + racereadpc(c.raceaddr(), casePC(casi), chansendpc) } if c.closed != 0 { goto sclose @@ -371,9 +389,9 @@ func selectgo(cas0 *scase, order0 *uint16, ncases int) (int, bool) { if raceenabled { if cas.kind == caseRecv && cas.elem != nil { - raceWriteObjectPC(c.elemtype, cas.elem, cas.pc, chanrecvpc) + raceWriteObjectPC(c.elemtype, cas.elem, casePC(casi), chanrecvpc) } else if cas.kind == caseSend { - raceReadObjectPC(c.elemtype, cas.elem, cas.pc, chansendpc) + raceReadObjectPC(c.elemtype, cas.elem, casePC(casi), chansendpc) } } if msanenabled { @@ -391,7 +409,7 @@ bufrecv: // can receive from buffer if raceenabled { if cas.elem != nil { - raceWriteObjectPC(c.elemtype, cas.elem, cas.pc, chanrecvpc) + raceWriteObjectPC(c.elemtype, cas.elem, casePC(casi), chanrecvpc) } raceacquire(chanbuf(c, c.recvx)) racerelease(chanbuf(c, c.recvx)) @@ -418,7 +436,7 @@ bufsend: if raceenabled { raceacquire(chanbuf(c, c.sendx)) racerelease(chanbuf(c, c.sendx)) - raceReadObjectPC(c.elemtype, cas.elem, cas.pc, chansendpc) + raceReadObjectPC(c.elemtype, cas.elem, casePC(casi), chansendpc) } if msanenabled { msanread(cas.elem, c.elemtype.size) @@ -456,7 +474,7 @@ rclose: send: // can send to a sleeping receiver (sg) if raceenabled { - raceReadObjectPC(c.elemtype, cas.elem, cas.pc, chansendpc) + raceReadObjectPC(c.elemtype, cas.elem, casePC(casi), chansendpc) } if msanenabled { msanread(cas.elem, c.elemtype.size) @@ -519,12 +537,18 @@ func reflect_rselect(cases []runtimeSelect) (int, bool) { case selectRecv: sel[i] = scase{kind: caseRecv, c: rc.ch, elem: rc.val} } - if raceenabled || msanenabled { - selectsetpc(&sel[i]) + } + + var pc0 *uintptr + if raceenabled { + pcs := make([]uintptr, len(cases)) + for i := range pcs { + selectsetpc(&pcs[i]) } + pc0 = &pcs[0] } - return selectgo(&sel[0], &order[0], len(cases)) + return selectgo(&sel[0], &order[0], pc0, len(cases)) } func (q *waitq) dequeueSudoG(sgp *sudog) { -- GitLab From fe23ba4a145ce8465d16ea2a92b9a7e96e15c28e Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 27 Jul 2020 16:19:15 -0700 Subject: [PATCH 0260/1792] runtime: eliminate scase.kind field Currently, we include a "kind" field on scase to distinguish the three kinds of cases in a select statement: sends, receives, and defaults. This commit removes by kind field by instead arranging for the compiler to always place sends before receives, and to provide their counts separately. It also passes an explicit "block bool" parameter to avoid needing to include a default case in the array. It's safe to shuffle cases like this because the runtime will randomize the order they're polled in anyway. Fixes #40410. Change-Id: Iaeaed4cf7bddd576d78f2c863bd91a03a5c82df2 Reviewed-on: https://go-review.googlesource.com/c/go/+/245125 Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/builtin.go | 2 +- .../compile/internal/gc/builtin/runtime.go | 2 +- src/cmd/compile/internal/gc/select.go | 108 +++++++++--------- src/reflect/all_test.go | 8 ++ src/runtime/select.go | 104 +++++++++-------- 5 files changed, 123 insertions(+), 101 deletions(-) diff --git a/src/cmd/compile/internal/gc/builtin.go b/src/cmd/compile/internal/gc/builtin.go index eafdb0ebe7..861ffaaa5b 100644 --- a/src/cmd/compile/internal/gc/builtin.go +++ b/src/cmd/compile/internal/gc/builtin.go @@ -302,7 +302,7 @@ func runtimeTypes() []*types.Type { typs[96] = types.NewPtr(typs[6]) typs[97] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[96]), anonfield(typs[84])}, []*Node{anonfield(typs[6])}) typs[98] = functype(nil, []*Node{anonfield(typs[63])}, nil) - typs[99] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[15])}, []*Node{anonfield(typs[15]), anonfield(typs[6])}) + typs[99] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[15]), anonfield(typs[15]), anonfield(typs[6])}, []*Node{anonfield(typs[15]), anonfield(typs[6])}) typs[100] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[7])}) typs[101] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[7])}) typs[102] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15]), anonfield(typs[7])}, []*Node{anonfield(typs[7])}) diff --git a/src/cmd/compile/internal/gc/builtin/runtime.go b/src/cmd/compile/internal/gc/builtin/runtime.go index 25f86efdd6..635da80f7c 100644 --- a/src/cmd/compile/internal/gc/builtin/runtime.go +++ b/src/cmd/compile/internal/gc/builtin/runtime.go @@ -170,7 +170,7 @@ func selectnbrecv(elem *any, hchan <-chan any) bool func selectnbrecv2(elem *any, received *bool, hchan <-chan any) bool func selectsetpc(pc *uintptr) -func selectgo(cas0 *byte, order0 *byte, pc0 *uintptr, ncases int) (int, bool) +func selectgo(cas0 *byte, order0 *byte, pc0 *uintptr, nsends int, nrecvs int, block bool) (int, bool) func block() func makeslice(typ *byte, len int, cap int) unsafe.Pointer diff --git a/src/cmd/compile/internal/gc/select.go b/src/cmd/compile/internal/gc/select.go index 8eb31eb5c1..bae7ed30e2 100644 --- a/src/cmd/compile/internal/gc/select.go +++ b/src/cmd/compile/internal/gc/select.go @@ -106,18 +106,16 @@ func walkselect(sel *Node) { } func walkselectcases(cases *Nodes) []*Node { - n := cases.Len() + ncas := cases.Len() sellineno := lineno // optimization: zero-case select - if n == 0 { + if ncas == 0 { return []*Node{mkcall("block", nil, nil)} } // optimization: one-case select: single op. - // TODO(rsc): Reenable optimization once order.go can handle it. - // golang.org/issue/7672. - if n == 1 { + if ncas == 1 { cas := cases.First() setlineno(cas) l := cas.Ninit.Slice() @@ -178,10 +176,12 @@ func walkselectcases(cases *Nodes) []*Node { // convert case value arguments to addresses. // this rewrite is used by both the general code and the next optimization. + var dflt *Node for _, cas := range cases.Slice() { setlineno(cas) n := cas.Left if n == nil { + dflt = cas continue } switch n.Op { @@ -202,15 +202,10 @@ func walkselectcases(cases *Nodes) []*Node { } // optimization: two-case select but one is default: single non-blocking op. - if n == 2 && (cases.First().Left == nil || cases.Second().Left == nil) { - var cas *Node - var dflt *Node - if cases.First().Left == nil { + if ncas == 2 && dflt != nil { + cas := cases.First() + if cas == dflt { cas = cases.Second() - dflt = cases.First() - } else { - dflt = cases.Second() - cas = cases.First() } n := cas.Left @@ -257,74 +252,73 @@ func walkselectcases(cases *Nodes) []*Node { return []*Node{r, nod(OBREAK, nil, nil)} } + if dflt != nil { + ncas-- + } + casorder := make([]*Node, ncas) + nsends, nrecvs := 0, 0 + var init []*Node // generate sel-struct lineno = sellineno - selv := temp(types.NewArray(scasetype(), int64(n))) + selv := temp(types.NewArray(scasetype(), int64(ncas))) r := nod(OAS, selv, nil) r = typecheck(r, ctxStmt) init = append(init, r) - order := temp(types.NewArray(types.Types[TUINT16], 2*int64(n))) + order := temp(types.NewArray(types.Types[TUINT16], 2*int64(ncas))) r = nod(OAS, order, nil) r = typecheck(r, ctxStmt) init = append(init, r) var pc0, pcs *Node if flag_race { - pcs = temp(types.NewArray(types.Types[TUINTPTR], int64(n))) + pcs = temp(types.NewArray(types.Types[TUINTPTR], int64(ncas))) pc0 = typecheck(nod(OADDR, nod(OINDEX, pcs, nodintconst(0)), nil), ctxExpr) } else { pc0 = nodnil() } // register cases - for i, cas := range cases.Slice() { + for _, cas := range cases.Slice() { setlineno(cas) init = append(init, cas.Ninit.Slice()...) cas.Ninit.Set(nil) - // Keep in sync with runtime/select.go. - const ( - caseNil = iota - caseRecv - caseSend - caseDefault - ) + n := cas.Left + if n == nil { // default: + continue + } + var i int var c, elem *Node - var kind int64 = caseDefault - - if n := cas.Left; n != nil { - init = append(init, n.Ninit.Slice()...) - - switch n.Op { - default: - Fatalf("select %v", n.Op) - case OSEND: - kind = caseSend - c = n.Left - elem = n.Right - case OSELRECV, OSELRECV2: - kind = caseRecv - c = n.Right.Left - elem = n.Left - } + switch n.Op { + default: + Fatalf("select %v", n.Op) + case OSEND: + i = nsends + nsends++ + c = n.Left + elem = n.Right + case OSELRECV, OSELRECV2: + nrecvs++ + i = ncas - nrecvs + c = n.Right.Left + elem = n.Left } + casorder[i] = cas + setField := func(f string, val *Node) { r := nod(OAS, nodSym(ODOT, nod(OINDEX, selv, nodintconst(int64(i))), lookup(f)), val) r = typecheck(r, ctxStmt) init = append(init, r) } - setField("kind", nodintconst(kind)) - if c != nil { - c = convnop(c, types.Types[TUNSAFEPTR]) - setField("c", c) - } + c = convnop(c, types.Types[TUNSAFEPTR]) + setField("c", c) if elem != nil { elem = convnop(elem, types.Types[TUNSAFEPTR]) setField("elem", elem) @@ -337,6 +331,9 @@ func walkselectcases(cases *Nodes) []*Node { init = append(init, r) } } + if nsends+nrecvs != ncas { + Fatalf("walkselectcases: miscount: %v + %v != %v", nsends, nrecvs, ncas) + } // run the select lineno = sellineno @@ -345,7 +342,7 @@ func walkselectcases(cases *Nodes) []*Node { r = nod(OAS2, nil, nil) r.List.Set2(chosen, recvOK) fn := syslook("selectgo") - r.Rlist.Set1(mkcall1(fn, fn.Type.Results(), nil, bytePtrToIndex(selv, 0), bytePtrToIndex(order, 0), pc0, nodintconst(int64(n)))) + r.Rlist.Set1(mkcall1(fn, fn.Type.Results(), nil, bytePtrToIndex(selv, 0), bytePtrToIndex(order, 0), pc0, nodintconst(int64(nsends)), nodintconst(int64(nrecvs)), nodbool(dflt == nil))) r = typecheck(r, ctxStmt) init = append(init, r) @@ -357,14 +354,11 @@ func walkselectcases(cases *Nodes) []*Node { } // dispatch cases - for i, cas := range cases.Slice() { - setlineno(cas) - - cond := nod(OEQ, chosen, nodintconst(int64(i))) + dispatch := func(cond, cas *Node) { cond = typecheck(cond, ctxExpr) cond = defaultlit(cond, nil) - r = nod(OIF, cond, nil) + r := nod(OIF, cond, nil) if n := cas.Left; n != nil && n.Op == OSELRECV2 { x := nod(OAS, n.List.First(), recvOK) @@ -377,6 +371,15 @@ func walkselectcases(cases *Nodes) []*Node { init = append(init, r) } + if dflt != nil { + setlineno(dflt) + dispatch(nod(OLT, chosen, nodintconst(0)), dflt) + } + for i, cas := range casorder { + setlineno(cas) + dispatch(nod(OEQ, chosen, nodintconst(int64(i))), cas) + } + return init } @@ -395,7 +398,6 @@ func scasetype() *types.Type { scase = tostruct([]*Node{ namedfield("c", types.Types[TUNSAFEPTR]), namedfield("elem", types.Types[TUNSAFEPTR]), - namedfield("kind", types.Types[TUINT16]), }) scase.SetNoalg(true) } diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index ed2f225077..5a12699472 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -1725,6 +1725,14 @@ func TestSelectMaxCases(t *testing.T) { _, _, _ = Select(sCases) } +func TestSelectNop(t *testing.T) { + // "select { default: }" should always return the default case. + chosen, _, _ := Select([]SelectCase{{Dir: SelectDefault}}) + if chosen != 0 { + t.Fatalf("expected Select to return 0, but got %#v", chosen) + } +} + func BenchmarkSelect(b *testing.B) { channel := make(chan int) close(channel) diff --git a/src/runtime/select.go b/src/runtime/select.go index d7c7d9f26f..80768b285b 100644 --- a/src/runtime/select.go +++ b/src/runtime/select.go @@ -12,23 +12,12 @@ import ( const debugSelect = false -// scase.kind values. -// Known to compiler. -// Changes here must also be made in src/cmd/compile/internal/gc/select.go's walkselectcases. -const ( - caseNil = iota - caseRecv - caseSend - caseDefault -) - // Select case descriptor. // Known to compiler. // Changes here must also be made in src/cmd/internal/gc/select.go's scasetype. type scase struct { c *hchan // chan elem unsafe.Pointer // data element - kind uint16 } var ( @@ -115,7 +104,7 @@ func block() { // ordinal position of its respective select{recv,send,default} call. // Also, if the chosen scase was a receive operation, it reports whether // a value was received. -func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) { +func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, nsends, nrecvs int, block bool) (int, bool) { if debugSelect { print("select: cas0=", cas0, "\n") } @@ -125,6 +114,7 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) cas1 := (*[1 << 16]scase)(unsafe.Pointer(cas0)) order1 := (*[1 << 17]uint16)(unsafe.Pointer(order0)) + ncases := nsends + nrecvs scases := cas1[:ncases:ncases] pollorder := order1[:ncases:ncases] lockorder := order1[ncases:][:ncases:ncases] @@ -158,16 +148,12 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) // optimizing (and needing to test). // generate permuted order - dfli := -1 norder := 0 for i := range scases { cas := &scases[i] // Omit cases without channels from the poll and lock orders. if cas.c == nil { - if cas.kind == caseDefault { - dfli = i - } cas.elem = nil // allow GC continue } @@ -250,8 +236,7 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) cas = &scases[casi] c = cas.c - switch cas.kind { - case caseRecv: + if casi >= nsends { sg = c.sendq.dequeue() if sg != nil { goto recv @@ -262,8 +247,7 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) if c.closed != 0 { goto rclose } - - case caseSend: + } else { if raceenabled { racereadpc(c.raceaddr(), casePC(casi), chansendpc) } @@ -280,9 +264,9 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) } } - if dfli >= 0 { + if !block { selunlock(scases, lockorder) - casi = dfli + casi = -1 goto retc } @@ -311,12 +295,10 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) *nextp = sg nextp = &sg.waitlink - switch cas.kind { - case caseRecv: - c.recvq.enqueue(sg) - - case caseSend: + if casi < nsends { c.sendq.enqueue(sg) + } else { + c.recvq.enqueue(sg) } } @@ -359,7 +341,7 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) } } else { c = k.c - if k.kind == caseSend { + if int(casei) < nsends { c.sendq.dequeueSudoG(sglist) } else { c.recvq.dequeueSudoG(sglist) @@ -378,27 +360,29 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, ncases int) (int, bool) c = cas.c if debugSelect { - print("wait-return: cas0=", cas0, " c=", c, " cas=", cas, " kind=", cas.kind, "\n") + print("wait-return: cas0=", cas0, " c=", c, " cas=", cas, " send=", casi < nsends, "\n") } - if cas.kind == caseRecv { + if casi < nsends { + if !caseSuccess { + goto sclose + } + } else { recvOK = caseSuccess - } else if cas.kind == caseSend && !caseSuccess { - goto sclose } if raceenabled { - if cas.kind == caseRecv && cas.elem != nil { - raceWriteObjectPC(c.elemtype, cas.elem, casePC(casi), chanrecvpc) - } else if cas.kind == caseSend { + if casi < nsends { raceReadObjectPC(c.elemtype, cas.elem, casePC(casi), chansendpc) + } else if cas.elem != nil { + raceWriteObjectPC(c.elemtype, cas.elem, casePC(casi), chanrecvpc) } } if msanenabled { - if cas.kind == caseRecv && cas.elem != nil { - msanwrite(cas.elem, c.elemtype.size) - } else if cas.kind == caseSend { + if casi < nsends { msanread(cas.elem, c.elemtype.size) + } else if cas.elem != nil { + msanwrite(cas.elem, c.elemtype.size) } } @@ -526,29 +510,57 @@ func reflect_rselect(cases []runtimeSelect) (int, bool) { block() } sel := make([]scase, len(cases)) - order := make([]uint16, 2*len(cases)) - for i := range cases { - rc := &cases[i] + orig := make([]int, len(cases)) + nsends, nrecvs := 0, 0 + dflt := -1 + for i, rc := range cases { + var j int switch rc.dir { case selectDefault: - sel[i] = scase{kind: caseDefault} + dflt = i + continue case selectSend: - sel[i] = scase{kind: caseSend, c: rc.ch, elem: rc.val} + j = nsends + nsends++ case selectRecv: - sel[i] = scase{kind: caseRecv, c: rc.ch, elem: rc.val} + nrecvs++ + j = len(cases) - nrecvs } + + sel[j] = scase{c: rc.ch, elem: rc.val} + orig[j] = i } + // Only a default case. + if nsends+nrecvs == 0 { + return dflt, false + } + + // Compact sel and orig if necessary. + if nsends+nrecvs < len(cases) { + copy(sel[nsends:], sel[len(cases)-nrecvs:]) + copy(orig[nsends:], orig[len(cases)-nrecvs:]) + } + + order := make([]uint16, 2*(nsends+nrecvs)) var pc0 *uintptr if raceenabled { - pcs := make([]uintptr, len(cases)) + pcs := make([]uintptr, nsends+nrecvs) for i := range pcs { selectsetpc(&pcs[i]) } pc0 = &pcs[0] } - return selectgo(&sel[0], &order[0], pc0, len(cases)) + chosen, recvOK := selectgo(&sel[0], &order[0], pc0, nsends, nrecvs, dflt == -1) + + // Translate chosen back to caller's ordering. + if chosen < 0 { + chosen = dflt + } else { + chosen = orig[chosen] + } + return chosen, recvOK } func (q *waitq) dequeueSudoG(sgp *sudog) { -- GitLab From a40171857595db60e95a04b64aad8ba262cf64a7 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 27 Jul 2020 16:45:48 -0700 Subject: [PATCH 0261/1792] cmd/compile/internal/gc: cleanup walkselectcases slightly Remove some unnecessary code. Most significantly, we can skip testing "if ch == nil { block() }", because this is already the semantics implied by normal send/receive operations. Updates #40410. Change-Id: I4acd33383cc876719fc3b998d85244d4ac1ff9d9 Reviewed-on: https://go-review.googlesource.com/c/go/+/245126 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Cuong Manh Le --- src/cmd/compile/internal/gc/select.go | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/cmd/compile/internal/gc/select.go b/src/cmd/compile/internal/gc/select.go index bae7ed30e2..3812a0e1fa 100644 --- a/src/cmd/compile/internal/gc/select.go +++ b/src/cmd/compile/internal/gc/select.go @@ -123,17 +123,14 @@ func walkselectcases(cases *Nodes) []*Node { n := cas.Left l = append(l, n.Ninit.Slice()...) n.Ninit.Set(nil) - var ch *Node switch n.Op { default: Fatalf("select %v", n.Op) - // ok already case OSEND: - ch = n.Left + // already ok case OSELRECV, OSELRECV2: - ch = n.Right.Left if n.Op == OSELRECV || n.List.Len() == 0 { if n.Left == nil { n = n.Right @@ -157,16 +154,7 @@ func walkselectcases(cases *Nodes) []*Node { n = typecheck(n, ctxStmt) } - // if ch == nil { block() }; n; - a := nod(OIF, nil, nil) - - a.Left = nod(OEQ, ch, nodnil()) - var ln Nodes - ln.Set(l) - a.Nbody.Set1(mkcall("block", nil, &ln)) - l = ln.Slice() - a = typecheck(a, ctxStmt) - l = append(l, a, n) + l = append(l, n) } l = append(l, cas.Nbody.Slice()...) @@ -223,8 +211,6 @@ func walkselectcases(cases *Nodes) []*Node { case OSELRECV: // if selectnbrecv(&v, c) { body } else { default body } - r = nod(OIF, nil, nil) - r.Ninit.Set(cas.Ninit.Slice()) ch := n.Right.Left elem := n.Left if elem == nil { @@ -234,8 +220,6 @@ func walkselectcases(cases *Nodes) []*Node { case OSELRECV2: // if selectnbrecv2(&v, &received, c) { body } else { default body } - r = nod(OIF, nil, nil) - r.Ninit.Set(cas.Ninit.Slice()) ch := n.Right.Left elem := n.Left if elem == nil { -- GitLab From 216714e44f703470f102cf248f7e9097160093d4 Mon Sep 17 00:00:00 2001 From: Lynn Boger Date: Mon, 17 Aug 2020 10:57:54 -0400 Subject: [PATCH 0262/1792] math/big: improve performance of mulAddVWW on ppc64x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This changes the assembly implementation on ppc64x to improve performance by reordering some instructions. It also eliminates an unnecessary move by changing an ADDZE to use the correct target register. Improvement on power9: MulAddVWW/1 6.89ns ± 0% 7.30ns ± 0% +5.95% (p=1.000 n=1+1) MulAddVWW/2 8.04ns ± 0% 8.06ns ± 0% +0.25% (p=1.000 n=1+1) MulAddVWW/3 9.39ns ± 0% 9.39ns ± 0% ~ (all equal) MulAddVWW/4 9.76ns ± 0% 9.48ns ± 0% -2.87% (p=1.000 n=1+1) MulAddVWW/5 10.5ns ± 0% 10.3ns ± 0% -1.90% (p=1.000 n=1+1) MulAddVWW/10 15.4ns ± 0% 14.9ns ± 0% -3.25% (p=1.000 n=1+1) MulAddVWW/100 149ns ± 0% 125ns ± 0% -16.11% (p=1.000 n=1+1) MulAddVWW/1000 1.42µs ± 0% 1.28µs ± 0% -9.74% (p=1.000 n=1+1) MulAddVWW/10000 14.2µs ± 0% 12.8µs ± 0% -9.73% (p=1.000 n=1+1) MulAddVWW/100000 144µs ± 0% 129µs ± 0% -10.10% (p=1.000 n=1+1) Change-Id: I0ae7002a69783ca19d7a4e3e42042ae75dc60069 Reviewed-on: https://go-review.googlesource.com/c/go/+/248721 Run-TryBot: Lynn Boger TryBot-Result: Gobot Gobot Reviewed-by: Carlos Eduardo Seo Reviewed-by: Paul Murphy --- src/math/big/arith_ppc64x.s | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/math/big/arith_ppc64x.s b/src/math/big/arith_ppc64x.s index dbb168a376..409e10ab48 100644 --- a/src/math/big/arith_ppc64x.s +++ b/src/math/big/arith_ppc64x.s @@ -394,17 +394,16 @@ loop: ADDZE R21 MULLD R9, R22, R26 MULHDU R9, R22, R22 - ADDC R21, R26 - ADDZE R22 MULLD R9, R23, R27 MULHDU R9, R23, R23 - ADDC R22, R27 - ADDZE R23 + ADDC R21, R26 + ADDZE R22 MOVD R24, 8(R10) // z[i] MOVD R25, 16(R10) // z[i+1] + ADDC R22, R27 + ADDZE R23,R4 // update carry MOVD R26, 24(R10) // z[i+2] MOVDU R27, 32(R10) // z[i+3] - MOVD R23, R4 // R4 = c ADD $-4, R11 // R11 = z_len - 4 BC 16, 0, loop // bdnz -- GitLab From e7c7ce646f37b260fe5a5635bc52243d28125dd8 Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Mon, 17 Aug 2020 16:14:48 -0500 Subject: [PATCH 0263/1792] cmd/compile: combine multiply/add into maddld on ppc64le/power9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a new lowering rule to match and replace such instances with the MADDLD instruction available on power9 where possible. Likewise, this plumbs in a new ppc64 ssa opcode to house the newly generated MADDLD instructions. When testing ed25519, this reduced binary size by 936B. Similarly, MADDLD combination occcurs in a few other less obvious cases such as division by constant. Testing of golang.org/x/crypto/ed25519 shows non-trivial speedup during keygeneration: name old time/op new time/op delta KeyGeneration 65.2µs ± 0% 63.1µs ± 0% -3.19% Signing 64.3µs ± 0% 64.4µs ± 0% +0.16% Verification 147µs ± 0% 147µs ± 0% +0.11% Similarly, this test binary has shrunk by 66488B. Change-Id: I077aeda7943119b41f07e4e62e44a648f16e4ad0 Reviewed-on: https://go-review.googlesource.com/c/go/+/248723 Run-TryBot: Lynn Boger TryBot-Result: Gobot Gobot Reviewed-by: Lynn Boger --- src/cmd/compile/internal/ppc64/ssa.go | 14 +++++++++++++ src/cmd/compile/internal/ssa/gen/PPC64.rules | 3 +++ src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 2 ++ src/cmd/compile/internal/ssa/opGen.go | 16 +++++++++++++++ src/cmd/compile/internal/ssa/rewritePPC64.go | 21 ++++++++++++++++++++ test/codegen/arithmetic.go | 12 +++++++---- 6 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go index 0efdd710fb..4d2ad48135 100644 --- a/src/cmd/compile/internal/ppc64/ssa.go +++ b/src/cmd/compile/internal/ppc64/ssa.go @@ -601,6 +601,20 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_REG p.To.Reg = v.Reg() + case ssa.OpPPC64MADDLD: + r := v.Reg() + r1 := v.Args[0].Reg() + r2 := v.Args[1].Reg() + r3 := v.Args[2].Reg() + // r = r1*r2 ± r3 + p := s.Prog(v.Op.Asm()) + p.From.Type = obj.TYPE_REG + p.From.Reg = r1 + p.Reg = r2 + p.SetFrom3(obj.Addr{Type: obj.TYPE_REG, Reg: r3}) + p.To.Type = obj.TYPE_REG + p.To.Reg = r + case ssa.OpPPC64FMADD, ssa.OpPPC64FMADDS, ssa.OpPPC64FMSUB, ssa.OpPPC64FMSUBS: r := v.Reg() r1 := v.Args[0].Reg() diff --git a/src/cmd/compile/internal/ssa/gen/PPC64.rules b/src/cmd/compile/internal/ssa/gen/PPC64.rules index fd28e10098..14942d50f9 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/gen/PPC64.rules @@ -11,6 +11,9 @@ (Sub32F ...) => (FSUBS ...) (Sub64F ...) => (FSUB ...) +// Combine 64 bit integer multiply and adds +(ADD l:(MULLD x y) z) && objabi.GOPPC64 >= 9 && l.Uses == 1 && clobber(l) => (MADDLD x y z) + (Mod16 x y) => (Mod32 (SignExt16to32 x) (SignExt16to32 y)) (Mod16u x y) => (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) (Mod8 x y) => (Mod32 (SignExt8to32 x) (SignExt8to32 y)) diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index 0261dc283b..825d0faf34 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -137,6 +137,7 @@ func init() { gp01 = regInfo{inputs: nil, outputs: []regMask{gp}} gp11 = regInfo{inputs: []regMask{gp | sp | sb}, outputs: []regMask{gp}} gp21 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}} + gp31 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp}} gp22 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp, gp}} gp32 = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, gp | sp | sb}, outputs: []regMask{gp, gp}} gp1cr = regInfo{inputs: []regMask{gp | sp | sb}} @@ -179,6 +180,7 @@ func init() { {name: "MULLD", argLength: 2, reg: gp21, asm: "MULLD", typ: "Int64", commutative: true}, // arg0*arg1 (signed 64-bit) {name: "MULLW", argLength: 2, reg: gp21, asm: "MULLW", typ: "Int32", commutative: true}, // arg0*arg1 (signed 32-bit) + {name: "MADDLD", argLength: 3, reg: gp31, asm: "MADDLD", typ: "Int64"}, // (arg0*arg1)+arg2 (signed 64-bit) {name: "MULHD", argLength: 2, reg: gp21, asm: "MULHD", commutative: true}, // (arg0 * arg1) >> 64, signed {name: "MULHW", argLength: 2, reg: gp21, asm: "MULHW", commutative: true}, // (arg0 * arg1) >> 32, signed diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index df2a27368b..4cd72799e8 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -1832,6 +1832,7 @@ const ( OpPPC64FSUBS OpPPC64MULLD OpPPC64MULLW + OpPPC64MADDLD OpPPC64MULHD OpPPC64MULHW OpPPC64MULHDU @@ -24374,6 +24375,21 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "MADDLD", + argLen: 3, + asm: ppc64.AMADDLD, + 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 + {1, 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 + {2, 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: "MULHD", argLen: 2, diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 37b75cc58a..7704b80dc6 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -3852,6 +3852,27 @@ func rewriteValuePPC64_OpPPC64ADD(v *Value) bool { v_0 := v.Args[0] b := v.Block typ := &b.Func.Config.Types + // match: (ADD l:(MULLD x y) z) + // cond: objabi.GOPPC64 >= 9 && l.Uses == 1 && clobber(l) + // result: (MADDLD x y z) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + l := v_0 + if l.Op != OpPPC64MULLD { + continue + } + y := l.Args[1] + x := l.Args[0] + z := v_1 + if !(objabi.GOPPC64 >= 9 && l.Uses == 1 && clobber(l)) { + continue + } + v.reset(OpPPC64MADDLD) + v.AddArg3(x, y, z) + return true + } + break + } // match: (ADD (SLDconst x [c]) (SRDconst x [d])) // cond: d == 64-c // result: (ROTLconst [c] x) diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index 9f30ec8ce4..45fdb68903 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -253,16 +253,20 @@ func Divisible(n1 uint, n2 int) (bool, bool, bool, bool) { // 386:"IMUL3L\t[$]-1431655765","ADDL\t[$]715827882","ROLL\t[$]31",-"DIVQ" // arm64:"MUL","ADD\t[$]3074457345618258602","ROR",-"DIV" // arm:"MUL","ADD\t[$]715827882",-".*udiv" - // ppc64:"MULLD","ADD","ROTL\t[$]63" - // ppc64le:"MULLD","ADD","ROTL\t[$]63" + // 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 // amd64:"IMULQ","ADD",-"ROLQ",-"DIVQ" // 386:"IMUL3L\t[$]678152731","ADDL\t[$]113025455",-"ROLL",-"DIVQ" // arm64:"MUL","ADD\t[$]485440633518672410",-"ROR",-"DIV" // arm:"MUL","ADD\t[$]113025455",-".*udiv" - // ppc64:"MULLD","ADD",-"ROTL" - // ppc64le:"MULLD","ADD",-"ROTL" + // ppc64/power8:"MULLD","ADD",-"ROTL" + // ppc64/power9:"MADDLD",-"ROTL" + // ppc64le/power8:"MULLD","ADD",-"ROTL" + // ppc64le/power9:"MADDLD",-"ROTL" oddS := n2%19 == 0 return evenU, oddU, evenS, oddS -- GitLab From 84a62453e5c01df3f7d0c48d9aca32832c2052c1 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 8 May 2020 17:12:45 -0400 Subject: [PATCH 0264/1792] cmd/compile: remove unnecessary error condition on reading fingerprint io.ReadFull guarantees n == len(buf) if and only if err == nil, so the length check is redundant. Change-Id: I15bff97868e27a65648acd791883cac8dab77630 Reviewed-on: https://go-review.googlesource.com/c/go/+/232988 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Dmitri Shuralyov --- src/cmd/compile/internal/gc/iimport.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/gc/iimport.go b/src/cmd/compile/internal/gc/iimport.go index 0eeb047c06..4169222c14 100644 --- a/src/cmd/compile/internal/gc/iimport.go +++ b/src/cmd/compile/internal/gc/iimport.go @@ -191,9 +191,9 @@ func iimport(pkg *types.Pkg, in *bio.Reader) (fingerprint goobj.FingerprintType) } } - // Fingerprint - n, err := io.ReadFull(in, fingerprint[:]) - if err != nil || n != len(fingerprint) { + // Fingerprint. + _, err = io.ReadFull(in, fingerprint[:]) + if err != nil { yyerror("import %s: error reading fingerprint", pkg.Path) errorexit() } -- GitLab From 0941fc3f9ff43598d25fa6e964e7829a268102bf Mon Sep 17 00:00:00 2001 From: cui Date: Wed, 12 Aug 2020 17:33:41 +0000 Subject: [PATCH 0265/1792] runtime: reduce syscall when call runtime.clone Change-Id: I3ea398fd86aae4c86557dd6fff65d90a6f756890 GitHub-Last-Rev: 4c295388f7b5e6768ffd2530337f78b4c75a9310 GitHub-Pull-Request: golang/go#40392 Reviewed-on: https://go-review.googlesource.com/c/go/+/244626 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/sys_linux_amd64.s | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s index 621c01b365..8d90813589 100644 --- a/src/runtime/sys_linux_amd64.s +++ b/src/runtime/sys_linux_amd64.s @@ -592,13 +592,25 @@ TEXT runtime·clone(SB),NOSPLIT,$0 MOVQ stk+8(FP), SI MOVQ $0, DX MOVQ $0, R10 - + MOVQ $0, R8 // Copy mp, gp, fn off parent stack for use by child. // Careful: Linux system call clobbers CX and R11. - MOVQ mp+16(FP), R8 + MOVQ mp+16(FP), R13 MOVQ gp+24(FP), R9 MOVQ fn+32(FP), R12 - + CMPQ R13, $0 // m + JEQ nog1 + CMPQ R9, $0 // g + JEQ nog1 + LEAQ m_tls(R13), R8 +#ifdef GOOS_android + // Android stores the TLS offset in runtime·tls_g. + SUBQ runtime·tls_g(SB), R8 +#else + ADDQ $8, R8 // ELF wants to use -8(FS) +#endif + ORQ $0x00080000, DI //add flag CLONE_SETTLS(0x00080000) to call clone +nog1: MOVL $SYS_clone, AX SYSCALL @@ -612,27 +624,23 @@ TEXT runtime·clone(SB),NOSPLIT,$0 MOVQ SI, SP // If g or m are nil, skip Go-related setup. - CMPQ R8, $0 // m - JEQ nog + CMPQ R13, $0 // m + JEQ nog2 CMPQ R9, $0 // g - JEQ nog + JEQ nog2 // Initialize m->procid to Linux tid MOVL $SYS_gettid, AX SYSCALL - MOVQ AX, m_procid(R8) - - // Set FS to point at m->tls. - LEAQ m_tls(R8), DI - CALL runtime·settls(SB) + MOVQ AX, m_procid(R13) // In child, set up new stack get_tls(CX) - MOVQ R8, g_m(R9) + MOVQ R13, g_m(R9) MOVQ R9, g(CX) CALL runtime·stackcheck(SB) -nog: +nog2: // Call fn CALL R12 -- GitLab From 98a0071a5363e307c2e284034f810378de3883dd Mon Sep 17 00:00:00 2001 From: Andrew Ekstedt Date: Fri, 24 Jul 2020 12:48:30 -0700 Subject: [PATCH 0266/1792] path,path/filepath: add Join examples with ".." components People sometimes expect Join to trim .. components from its arguments before joining, and are surprised that it doesn't. This is bad if they were relying on that assumed behaviour to prevent directory traversal attacks. While a careful reading of the documentation for Join and Clean might dispel this notion, it is not obvious at first glance. Add a case to the examples to nudge people in the right direction. Updates #40373 Change-Id: Ib5792c12ba1000811a0c0eb77048196d0b26da60 Reviewed-on: https://go-review.googlesource.com/c/go/+/249177 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor Reviewed-by: Rob Pike --- src/path/example_test.go | 5 +++++ src/path/filepath/example_unix_test.go | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/src/path/example_test.go b/src/path/example_test.go index 67b9718664..e30ebd13dc 100644 --- a/src/path/example_test.go +++ b/src/path/example_test.go @@ -79,13 +79,18 @@ func ExampleJoin() { fmt.Println(path.Join("a", "b", "c")) fmt.Println(path.Join("a", "b/c")) fmt.Println(path.Join("a/b", "c")) + + fmt.Println(path.Join("a/b", "../../../xyz")) + fmt.Println(path.Join("", "")) fmt.Println(path.Join("a", "")) fmt.Println(path.Join("", "a")) + // Output: // a/b/c // a/b/c // a/b/c + // ../xyz // // a // a diff --git a/src/path/filepath/example_unix_test.go b/src/path/filepath/example_unix_test.go index 23f21380d0..c9d6944518 100644 --- a/src/path/filepath/example_unix_test.go +++ b/src/path/filepath/example_unix_test.go @@ -72,12 +72,16 @@ func ExampleJoin() { fmt.Println(filepath.Join("a", "b/c")) fmt.Println(filepath.Join("a/b", "c")) fmt.Println(filepath.Join("a/b", "/c")) + + fmt.Println(filepath.Join("a/b", "../../../xyz")) + // Output: // On Unix: // a/b/c // a/b/c // a/b/c // a/b/c + // ../xyz } func ExampleMatch() { -- GitLab From ac875bc923db2b7350f244f06a06557e6fd97e05 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 15 Aug 2020 00:44:58 +0700 Subject: [PATCH 0267/1792] cmd/compile: don't bother to declare closure inside redeclared func Fixes #17758 Change-Id: I75f5dc5be85fd8a6791ac89dfc0681be759cca36 Reviewed-on: https://go-review.googlesource.com/c/go/+/248517 Run-TryBot: Cuong Manh Le Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/closure.go | 12 +++++++++++- test/fixedbugs/issue17758.go | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue17758.go diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index 04fb7d5495..23e48939b4 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -108,7 +108,17 @@ func typecheckclosure(clo *Node, top int) { xfunc.Func.Nname.Sym = closurename(Curfn) disableExport(xfunc.Func.Nname.Sym) - declare(xfunc.Func.Nname, PFUNC) + if xfunc.Func.Nname.Sym.Def != nil { + // The only case we can reach here is when the outer function was redeclared. + // In that case, don't bother to redeclare the closure. Otherwise, we will get + // a spurious error message, see #17758. While we are here, double check that + // we already reported other error. + if nsavederrors+nerrors == 0 { + Fatalf("unexpected symbol collision %v", xfunc.Func.Nname.Sym) + } + } else { + declare(xfunc.Func.Nname, PFUNC) + } xfunc = typecheck(xfunc, ctxStmt) // Type check the body now, but only if we're inside a function. diff --git a/test/fixedbugs/issue17758.go b/test/fixedbugs/issue17758.go new file mode 100644 index 0000000000..e7f2f3af91 --- /dev/null +++ b/test/fixedbugs/issue17758.go @@ -0,0 +1,17 @@ +// errorcheck + +// 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 main + +func foo() { + _ = func() {} +} + +func foo() { // ERROR "foo redeclared in this block" + _ = func() {} +} + +func main() {} -- GitLab From 31da1d993a498acefcf3dd5fdfbefa8eec132791 Mon Sep 17 00:00:00 2001 From: Tao Qingyun Date: Wed, 19 Aug 2020 01:38:43 +0000 Subject: [PATCH 0268/1792] cmd/internal/objfile: cache computation of goobj.Arch Change-Id: I23774cf185e5fa6b89398001cd0655fb0c5bdb46 GitHub-Last-Rev: ca8cae2469b5fad84bd636a3305a484dfdcb0db2 GitHub-Pull-Request: golang/go#40877 Reviewed-on: https://go-review.googlesource.com/c/go/+/249180 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/internal/archive/archive.go | 6 ++++++ src/cmd/internal/objfile/goobj.go | 32 ++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/cmd/internal/archive/archive.go b/src/cmd/internal/archive/archive.go index db67ce424b..c1661d7711 100644 --- a/src/cmd/internal/archive/archive.go +++ b/src/cmd/internal/archive/archive.go @@ -17,6 +17,7 @@ import ( "log" "os" "strconv" + "strings" "time" "unicode/utf8" ) @@ -83,6 +84,7 @@ func (e *Entry) String() string { type GoObj struct { TextHeader []byte + Arch string Data } @@ -404,6 +406,10 @@ func (r *objReader) parseObject(o *GoObj, size int64) error { } } o.TextHeader = h + hs := strings.Fields(string(h)) + if len(hs) >= 4 { + o.Arch = hs[3] + } o.Offset = r.offset o.Size = size - int64(len(h)) diff --git a/src/cmd/internal/objfile/goobj.go b/src/cmd/internal/objfile/goobj.go index e838f58aed..af9ada3324 100644 --- a/src/cmd/internal/objfile/goobj.go +++ b/src/cmd/internal/objfile/goobj.go @@ -17,13 +17,13 @@ import ( "fmt" "io" "os" - "strings" ) type goobjFile struct { goobj *archive.GoObj r *goobj.Reader f *os.File + arch *sys.Arch } func openGoFile(f *os.File) (*File, error) { @@ -45,9 +45,16 @@ L: return nil, err } r := goobj.NewReaderFromBytes(b, false) + var arch *sys.Arch + for _, a := range sys.Archs { + if a.Name == e.Obj.Arch { + arch = a + break + } + } entries = append(entries, &Entry{ name: e.Name, - raw: &goobjFile{e.Obj, r, f}, + raw: &goobjFile{e.Obj, r, f, arch}, }) continue case archive.EntryNativeObj: @@ -223,17 +230,8 @@ func (f *goobjFile) pcln() (textStart uint64, symtab, pclntab []byte, err error) // Returns "",0,nil if unknown. // This function implements the Liner interface in preference to pcln() above. func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { - // TODO: this is really inefficient. Binary search? Memoize last result? r := f.r - var arch *sys.Arch - archname := f.goarch() - for _, a := range sys.Archs { - if a.Name == archname { - arch = a - break - } - } - if arch == nil { + if f.arch == nil { return "", 0, nil } pcdataBase := r.PcdataBase() @@ -264,10 +262,10 @@ func (f *goobjFile) PCToLine(pc uint64) (string, int, *gosym.Func) { lengths := info.ReadFuncInfoLengths(b) off, end := info.ReadPcline(b) pcline := r.BytesAt(pcdataBase+off, int(end-off)) - line := int(pcValue(pcline, pc-addr, arch)) + line := int(pcValue(pcline, pc-addr, f.arch)) off, end = info.ReadPcfile(b) pcfile := r.BytesAt(pcdataBase+off, int(end-off)) - fileID := pcValue(pcfile, pc-addr, arch) + fileID := pcValue(pcfile, pc-addr, f.arch) globalFileID := info.ReadFile(b, lengths.FileOff, uint32(fileID)) fileName := r.File(int(globalFileID)) // Note: we provide only the name in the Func structure. @@ -332,11 +330,7 @@ func (f *goobjFile) text() (textStart uint64, text []byte, err error) { } func (f *goobjFile) goarch() string { - hs := strings.Fields(string(f.goobj.TextHeader)) - if len(hs) >= 4 { - return hs[3] - } - return "" + return f.goobj.Arch } func (f *goobjFile) loadAddress() (uint64, error) { -- GitLab From bd519d0c8734c3e30cb1a8b8217dd9934cd61e25 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 25 Jun 2020 14:50:10 -0700 Subject: [PATCH 0269/1792] runtime: don't call setitimer for each thread Previously, on Unix systems, when the profiler was enabled or disabled, we called setitimer once per thread. With this change we instead call it once per process. Change-Id: I90f0189b562e11232816390dc7d55ed154bd836d Reviewed-on: https://go-review.googlesource.com/c/go/+/240003 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/signal_unix.go | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index 6a11c91fb9..064a0ea100 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -272,6 +272,12 @@ func setProcessCPUProfiler(hz int32) { atomic.Storeuintptr(&fwdSig[_SIGPROF], getsig(_SIGPROF)) setsig(_SIGPROF, funcPC(sighandler)) } + + var it itimerval + it.it_interval.tv_sec = 0 + it.it_interval.set_usec(1000000 / hz) + it.it_value = it.it_interval + setitimer(_ITIMER_PROF, &it, nil) } else { // If the Go signal handler should be disabled by default, // switch back to the signal handler that was installed @@ -296,23 +302,16 @@ func setProcessCPUProfiler(hz int32) { setsig(_SIGPROF, h) } } + + setitimer(_ITIMER_PROF, &itimerval{}, nil) } } // setThreadCPUProfiler makes any thread-specific changes required to // implement profiling at a rate of hz. +// No changes required on Unix systems. func setThreadCPUProfiler(hz int32) { - var it itimerval - if hz == 0 { - setitimer(_ITIMER_PROF, &it, nil) - } else { - it.it_interval.tv_sec = 0 - it.it_interval.set_usec(1000000 / hz) - it.it_value = it.it_interval - setitimer(_ITIMER_PROF, &it, nil) - } - _g_ := getg() - _g_.m.profilehz = hz + getg().m.profilehz = hz } func sigpipe() { -- GitLab From d3a411b6debccb665da3497e7fa597c9a5ff16f1 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 12 Aug 2020 12:09:35 -0700 Subject: [PATCH 0270/1792] internal/poll: treat copy_file_range EOPNOTSUPP as not-handled Fixes #40731 Change-Id: I3e29878d597318acf5edcc38497aa2624f72be35 Reviewed-on: https://go-review.googlesource.com/c/go/+/248258 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke Reviewed-by: Tobias Klauser --- src/internal/poll/copy_file_range_linux.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/internal/poll/copy_file_range_linux.go b/src/internal/poll/copy_file_range_linux.go index 604607f774..7e67125818 100644 --- a/src/internal/poll/copy_file_range_linux.go +++ b/src/internal/poll/copy_file_range_linux.go @@ -41,7 +41,7 @@ func CopyFileRange(dst, src *FD, remain int64) (written int64, handled bool, err // use copy_file_range(2) again. atomic.StoreInt32(©FileRangeSupported, 0) return 0, false, nil - case syscall.EXDEV, syscall.EINVAL: + case syscall.EXDEV, syscall.EINVAL, syscall.EOPNOTSUPP: // Prior to Linux 5.3, it was not possible to // copy_file_range across file systems. Similarly to // the ENOSYS case above, if we see EXDEV, we have @@ -52,6 +52,9 @@ func CopyFileRange(dst, src *FD, remain int64) (written int64, handled bool, err // dst or src refer to a pipe rather than a regular // file. This is another case where no data has been // transfered, so we consider it unhandled. + // + // If the file is on NFS, we can see EOPNOTSUPP. + // See issue #40731. return 0, false, nil case nil: if n == 0 { -- GitLab From 8d91d736e2eb518e0a95eb47ae463c0dd80827c4 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 18 Aug 2020 12:01:41 -0400 Subject: [PATCH 0271/1792] cmd/dist: ignore _test.s files in bootstrap Ignore all _test.s files in bootstrap, not only the ARM64 one. They are for testing only. Fixes #40855. Change-Id: I00e6b4ab5349e317c9ad3a503997de85aed49373 Reviewed-on: https://go-review.googlesource.com/c/go/+/249018 Reviewed-by: Ian Lance Taylor --- src/cmd/dist/buildtool.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go index 40d28b535b..0b50f66c32 100644 --- a/src/cmd/dist/buildtool.go +++ b/src/cmd/dist/buildtool.go @@ -113,14 +113,15 @@ var ignorePrefixes = []string{ // File suffixes that use build tags introduced since Go 1.4. // These must not be copied into the bootstrap build directory. +// Also igonore test files. var ignoreSuffixes = []string{ "_arm64.s", - "_arm64_test.s", "_arm64.go", "_riscv64.s", "_riscv64.go", "_wasm.s", "_wasm.go", + "_test.s", } func bootstrapBuildTools() { -- GitLab From 01aad9ea939fed313d5c51778485349435302ead Mon Sep 17 00:00:00 2001 From: diaxu01 Date: Fri, 5 Jun 2020 03:53:53 +0000 Subject: [PATCH 0272/1792] cmd/compile: Optimize ARM64's code with EON This patch fuses pattern '(MVN (XOR x y))' into '(EON x y)'. Change-Id: I269c98ce198d51a4945ce8bd0e1024acbd1b7609 Reviewed-on: https://go-review.googlesource.com/c/go/+/239638 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssa/gen/ARM64.rules | 1 + src/cmd/compile/internal/ssa/rewriteARM64.go | 12 ++++++++++++ test/codegen/bits.go | 13 +++++++++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 27959d01fc..80e8c7137b 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -1323,6 +1323,7 @@ (AND x (MVN y)) -> (BIC x y) (XOR x (MVN y)) -> (EON x y) (OR x (MVN y)) -> (ORN x y) +(MVN (XOR x y)) -> (EON x y) (CSEL {cc} x (MOVDconst [0]) flag) -> (CSEL0 {cc} x flag) (CSEL {cc} (MOVDconst [0]) y flag) -> (CSEL0 {arm64Negate(cc.(Op))} y flag) (SUB x (SUB y z)) -> (SUB (ADD x z) y) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 023d9908c2..842eddbf4a 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -14593,6 +14593,18 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { } func rewriteValueARM64_OpARM64MVN(v *Value) bool { v_0 := v.Args[0] + // match: (MVN (XOR x y)) + // result: (EON x y) + for { + if v_0.Op != OpARM64XOR { + break + } + y := v_0.Args[1] + x := v_0.Args[0] + v.reset(OpARM64EON) + v.AddArg2(x, y) + return true + } // match: (MVN (MOVDconst [c])) // result: (MOVDconst [^c]) for { diff --git a/test/codegen/bits.go b/test/codegen/bits.go index 0a5428b55a..398dd84e9e 100644 --- a/test/codegen/bits.go +++ b/test/codegen/bits.go @@ -310,9 +310,18 @@ func op_bic(x, y uint32) uint32 { return x &^ y } -func op_eon(x, y uint32) uint32 { +func op_eon(x, y, z uint32, a []uint32, n, m uint64) uint64 { + // arm64:`EON\t`,-`EOR`,-`MVN` + a[0] = x ^ (y ^ 0xffffffff) + + // arm64:`EON\t`,-`EOR`,-`MVN` + a[1] = ^(y ^ z) + // arm64:`EON\t`,-`XOR` - return x ^ ^y + a[2] = x ^ ^z + + // arm64:`EON\t`,-`EOR`,-`MVN` + return n ^ (m ^ 0xffffffffffffffff) } func op_orn(x, y uint32) uint32 { -- GitLab From 64350f1eabeb688e997c6cd0c103e21c02ab2a46 Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Tue, 18 Aug 2020 16:26:42 -0500 Subject: [PATCH 0273/1792] cmd/asm,cmd/internal/obj/ppc64: add {l,st}xvx power9 instructions These are the indexed vsx load operations with the same endian and alignment benefits of {l,st}vx. Likewise, cleanup redundant comments in op{load,store}x and fix ISA 3.0 typos nearby. Change-Id: Ie1ace17c6150cf9168a834e435114028ff6eb07c Reviewed-on: https://go-review.googlesource.com/c/go/+/249025 Run-TryBot: Lynn Boger TryBot-Result: Gobot Gobot Reviewed-by: Lynn Boger --- src/cmd/asm/internal/asm/testdata/ppc64.s | 2 ++ src/cmd/asm/internal/asm/testdata/ppc64enc.s | 2 ++ src/cmd/internal/obj/ppc64/asm9.go | 30 +++++++++++--------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/ppc64.s b/src/cmd/asm/internal/asm/testdata/ppc64.s index b3736bf6a4..ba64d84a35 100644 --- a/src/cmd/asm/internal/asm/testdata/ppc64.s +++ b/src/cmd/asm/internal/asm/testdata/ppc64.s @@ -1037,6 +1037,7 @@ label1: // VSX load with length X-form (also left-justified) LXVL R3,R4, VS0 LXVLL R3,R4, VS0 + LXVX R3,R4, VS0 // VSX load, DQ-form // DQ(RA), XS produces // XS, DQ(RA) @@ -1060,6 +1061,7 @@ label1: // VSX store with length, X-form (also left-justified) STXVL VS0, R3,R4 STXVLL VS0, R3,R4 + STXVX VS0, R3,R4 // VSX move from VSR, XX1-form // XS,RA produces diff --git a/src/cmd/asm/internal/asm/testdata/ppc64enc.s b/src/cmd/asm/internal/asm/testdata/ppc64enc.s index 07a8a540cd..10a05ec402 100644 --- a/src/cmd/asm/internal/asm/testdata/ppc64enc.s +++ b/src/cmd/asm/internal/asm/testdata/ppc64enc.s @@ -595,11 +595,13 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$0 LXV 16(R3), VS1 // f4230011 LXVL R3, R4, VS1 // 7c23221a LXVLL R3, R4, VS1 // 7c23225a + LXVX R3, R4, VS1 // 7c232218 LXSDX (R3)(R4), VS1 // 7c241c98 STXVD2X VS1, (R3)(R4) // 7c241f98 STXV VS1,16(R3) // f4230015 STXVL VS1, R3, R4 // 7c23231a STXVLL VS1, R3, R4 // 7c23235a + STXVX VS1, R3, R4 // 7c232318 STXSDX VS1, (R3)(R4) // 7c241d98 LXSIWAX (R3)(R4), VS1 // 7c241898 STXSIWX VS1, (R3)(R4) // 7c241918 diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 238ca8f0b7..3c82477fc4 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -1584,8 +1584,9 @@ func buildop(ctxt *obj.Link) { case ALXV: /* lxv */ opset(ALXV, r0) - case ALXVL: /* lxvl */ + case ALXVL: /* lxvl, lxvll, lxvx */ opset(ALXVLL, r0) + opset(ALXVX, r0) case ASTXVD2X: /* stxvd2x, stxvdsx, stxvw4x, stxvh8x, stxvb16x */ opset(ASTXVW4X, r0) @@ -1595,8 +1596,9 @@ func buildop(ctxt *obj.Link) { case ASTXV: /* stxv */ opset(ASTXV, r0) - case ASTXVL: /* stxvl, stxvll */ + case ASTXVL: /* stxvl, stxvll, stvx */ opset(ASTXVLL, r0) + opset(ASTXVX, r0) case ALXSDX: /* lxsdx */ opset(ALXSDX, r0) @@ -5020,11 +5022,13 @@ func (c *ctxt9) opload(a obj.As) uint32 { case AMOVW: return OPVCC(58, 0, 0, 0) | 1<<1 /* lwa */ case ALXV: - return OPDQ(61, 1, 0) /* lxv - ISA v3.00 */ + return OPDQ(61, 1, 0) /* lxv - ISA v3.0 */ case ALXVL: - return OPVXX1(31, 269, 0) /* lxvl - ISA v3.00 */ + return OPVXX1(31, 269, 0) /* lxvl - ISA v3.0 */ case ALXVLL: - return OPVXX1(31, 301, 0) /* lxvll - ISA v3.00 */ + return OPVXX1(31, 301, 0) /* lxvll - ISA v3.0 */ + case ALXVX: + return OPVXX1(31, 268, 0) /* lxvx - ISA v3.0 */ /* no AMOVWU */ case AMOVB, AMOVBZ: @@ -5122,8 +5126,6 @@ func (c *ctxt9) oploadx(a obj.As) uint32 { return OPVCC(31, 309, 0, 0) /* ldmx */ /* Vector (VMX/Altivec) instructions */ - /* ISA 2.03 enables these for PPC970. For POWERx processors, these */ - /* are enabled starting at POWER6 (ISA 2.05). */ case ALVEBX: return OPVCC(31, 7, 0, 0) /* lvebx - v2.03 */ case ALVEHX: @@ -5141,7 +5143,8 @@ func (c *ctxt9) oploadx(a obj.As) uint32 { /* End of vector instructions */ /* Vector scalar (VSX) instructions */ - /* ISA 2.06 enables these for POWER7. */ + case ALXVX: + return OPVXX1(31, 268, 0) /* lxvx - ISA v3.0 */ case ALXVD2X: return OPVXX1(31, 844, 0) /* lxvd2x - v2.06 */ case ALXVW4X: @@ -5208,6 +5211,8 @@ func (c *ctxt9) opstore(a obj.As) uint32 { return OPVXX1(31, 397, 0) /* stxvl ISA 3.0 */ case ASTXVLL: return OPVXX1(31, 429, 0) /* stxvll ISA 3.0 */ + case ASTXVX: + return OPVXX1(31, 396, 0) /* stxvx - ISA v3.0 */ } @@ -5271,8 +5276,6 @@ func (c *ctxt9) opstorex(a obj.As) uint32 { return OPVCC(31, 181, 0, 0) /* stdux */ /* Vector (VMX/Altivec) instructions */ - /* ISA 2.03 enables these for PPC970. For POWERx processors, these */ - /* are enabled starting at POWER6 (ISA 2.05). */ case ASTVEBX: return OPVCC(31, 135, 0, 0) /* stvebx - v2.03 */ case ASTVEHX: @@ -5286,15 +5289,16 @@ func (c *ctxt9) opstorex(a obj.As) uint32 { /* End of vector instructions */ /* Vector scalar (VSX) instructions */ - /* ISA 2.06 enables these for POWER7. */ + case ASTXVX: + return OPVXX1(31, 396, 0) /* stxvx - v3.0 */ case ASTXVD2X: return OPVXX1(31, 972, 0) /* stxvd2x - v2.06 */ case ASTXVW4X: return OPVXX1(31, 908, 0) /* stxvw4x - v2.06 */ case ASTXVH8X: - return OPVXX1(31, 940, 0) /* stxvh8x - v3.00 */ + return OPVXX1(31, 940, 0) /* stxvh8x - v3.0 */ case ASTXVB16X: - return OPVXX1(31, 1004, 0) /* stxvb16x - v3.00 */ + return OPVXX1(31, 1004, 0) /* stxvb16x - v3.0 */ case ASTXSDX: return OPVXX1(31, 716, 0) /* stxsdx - v2.06 */ -- GitLab From 18239be10a0b5caa1b3222b228ff590b1c036382 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Thu, 25 Jun 2020 19:11:28 -0400 Subject: [PATCH 0274/1792] cmd/go/internal: remove some users of par.Work par.Work is used in a number of places as a parallel work queue. This change replaces it with goroutines and channels in a number of simpler places where it's used. This is the same CL as golang.org/cl/240062 and golang.org/cl/248326 except for the following changes in convert.go (all line numbers from this CL), as well as fixing up imports in download.go: - On line 44, the "*" before modules.Versions is removed (we were trying to assign to a nil value on lines 72 and 73). - Line 64 is new, and ensures that we receive on the semaphore channel once the goroutine function exits. (The previous versions of this CL only received at the end of the function, ignoring the return point in the branch in the middle of the function.) - The semaphore channel receive right before line 74 is gone, replaced with the deferred receive above. - The if block at line 83 is new, accounting for cases where modfetch.ImportRepoRev returned an error in the goroutine, so that versions[i] is ignored. Change-Id: I0e33670bb2eb0a1e4d7a5fa693a471e61ffbc8b7 Reviewed-on: https://go-review.googlesource.com/c/go/+/249020 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modcmd/download.go | 69 +++++++++++++++----------- src/cmd/go/internal/modcmd/graph.go | 19 +++---- src/cmd/go/internal/modconv/convert.go | 59 ++++++++++++---------- src/cmd/go/internal/modget/get.go | 41 ++++++++++----- src/cmd/go/internal/modload/list.go | 37 +++++++++----- 5 files changed, 134 insertions(+), 91 deletions(-) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 946e8ed3cf..2f42d4306b 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -8,12 +8,12 @@ import ( "context" "encoding/json" "os" + "runtime" "cmd/go/internal/base" "cmd/go/internal/cfg" - "cmd/go/internal/modfetch" "cmd/go/internal/modload" - "cmd/go/internal/par" + "cmd/go/internal/modfetch" "cmd/go/internal/work" "golang.org/x/mod/module" @@ -102,33 +102,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { } } - var mods []*moduleJSON - var work par.Work - listU := false - listVersions := false - for _, info := range modload.ListModules(ctx, args, listU, listVersions) { - if info.Replace != nil { - info = info.Replace - } - if info.Version == "" && info.Error == nil { - // main module or module replaced with file path. - // Nothing to download. - continue - } - m := &moduleJSON{ - Path: info.Path, - Version: info.Version, - } - mods = append(mods, m) - if info.Error != nil { - m.Error = info.Error.Err - continue - } - work.Add(m) - } - - work.Do(10, func(item interface{}) { - m := item.(*moduleJSON) + downloadModule := func(m *moduleJSON) { var err error m.Info, err = modfetch.InfoFile(m.Path, m.Version) if err != nil { @@ -157,7 +131,42 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { m.Error = err.Error() return } - }) + } + + var mods []*moduleJSON + listU := false + listVersions := false + type token struct{} + sem := make(chan token, runtime.GOMAXPROCS(0)) + for _, info := range modload.ListModules(ctx, args, listU, listVersions) { + if info.Replace != nil { + info = info.Replace + } + if info.Version == "" && info.Error == nil { + // main module or module replaced with file path. + // Nothing to download. + continue + } + m := &moduleJSON{ + Path: info.Path, + Version: info.Version, + } + mods = append(mods, m) + if info.Error != nil { + m.Error = info.Error.Err + continue + } + sem <- token{} + go func() { + downloadModule(m) + <-sem + }() + } + + // Fill semaphore channel to wait for goroutines to finish. + for n := cap(sem); n > 0; n-- { + sem <- token{} + } if *downloadJSON { for _, m := range mods { diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index 4853503fd4..6da12b9cab 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -15,7 +15,6 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modload" - "cmd/go/internal/par" "cmd/go/internal/work" "golang.org/x/mod/module" @@ -59,23 +58,25 @@ func runGraph(ctx context.Context, cmd *base.Command, args []string) { return m.Path + "@" + m.Version } - // Note: using par.Work only to manage work queue. - // No parallelism here, so no locking. var out []string var deps int // index in out where deps start - var work par.Work - work.Add(modload.Target) - work.Do(1, func(item interface{}) { - m := item.(module.Version) + seen := map[module.Version]bool{modload.Target: true} + queue := []module.Version{modload.Target} + for len(queue) > 0 { + var m module.Version + m, queue = queue[0], queue[1:] list, _ := reqs.Required(m) for _, r := range list { - work.Add(r) + if !seen[r] { + queue = append(queue, r) + seen[r] = true + } out = append(out, format(m)+" "+format(r)+"\n") } if m == modload.Target { deps = len(out) } - }) + } sort.Slice(out[deps:], func(i, j int) bool { return out[deps+i][0] < out[deps+j][0] diff --git a/src/cmd/go/internal/modconv/convert.go b/src/cmd/go/internal/modconv/convert.go index f465a9f395..5d4165c944 100644 --- a/src/cmd/go/internal/modconv/convert.go +++ b/src/cmd/go/internal/modconv/convert.go @@ -7,13 +7,12 @@ package modconv import ( "fmt" "os" + "runtime" "sort" "strings" - "sync" "cmd/go/internal/base" "cmd/go/internal/modfetch" - "cmd/go/internal/par" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -42,46 +41,54 @@ func ConvertLegacyConfig(f *modfile.File, file string, data []byte) error { // Convert requirements block, which may use raw SHA1 hashes as versions, // to valid semver requirement list, respecting major versions. - var ( - work par.Work - mu sync.Mutex - need = make(map[string]string) - replace = make(map[string]*modfile.Replace) - ) + versions := make([]module.Version, len(mf.Require)) + replace := make(map[string]*modfile.Replace) for _, r := range mf.Replace { replace[r.New.Path] = r replace[r.Old.Path] = r } - for _, r := range mf.Require { + + type token struct{} + sem := make(chan token, runtime.GOMAXPROCS(0)) + for i, r := range mf.Require { m := r.Mod if m.Path == "" { continue } if re, ok := replace[m.Path]; ok { - work.Add(re.New) - continue + m = re.New } - work.Add(r.Mod) + sem <- token{} + go func(i int, m module.Version) { + defer func() { <-sem }() + repo, info, err := modfetch.ImportRepoRev(m.Path, m.Version) + if err != nil { + fmt.Fprintf(os.Stderr, "go: converting %s: stat %s@%s: %v\n", base.ShortPath(file), m.Path, m.Version, err) + return + } + + path := repo.ModulePath() + versions[i].Path = path + versions[i].Version = info.Version + }(i, m) + } + // Fill semaphore channel to wait for all tasks to finish. + for n := cap(sem); n > 0; n-- { + sem <- token{} } - work.Do(10, func(item interface{}) { - r := item.(module.Version) - repo, info, err := modfetch.ImportRepoRev(r.Path, r.Version) - if err != nil { - fmt.Fprintf(os.Stderr, "go: converting %s: stat %s@%s: %v\n", base.ShortPath(file), r.Path, r.Version, err) - return + need := map[string]string{} + for _, v := range versions { + if v.Path == "" { + continue } - mu.Lock() - path := repo.ModulePath() // Don't use semver.Max here; need to preserve +incompatible suffix. - if v, ok := need[path]; !ok || semver.Compare(v, info.Version) < 0 { - need[path] = info.Version + if needv, ok := need[v.Path]; !ok || semver.Compare(needv, v.Version) < 0 { + need[v.Path] = v.Version } - mu.Unlock() - }) - - var paths []string + } + paths := make([]string, 0, len(need)) for path := range need { paths = append(paths, path) } diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 93a6bb54d5..d02c9a8da5 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -11,6 +11,7 @@ import ( "fmt" "os" "path/filepath" + "runtime" "sort" "strings" "sync" @@ -21,7 +22,6 @@ import ( "cmd/go/internal/load" "cmd/go/internal/modload" "cmd/go/internal/mvs" - "cmd/go/internal/par" "cmd/go/internal/search" "cmd/go/internal/work" @@ -725,18 +725,8 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // reported. A map from module paths to queries is returned, which includes // queries and modOnly. func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*query, modOnly map[string]*query) map[string]*query { - var lookup par.Work - for _, q := range queries { - if cached := cache[q.querySpec]; cached != nil { - *q = *cached - } else { - cache[q.querySpec] = q - lookup.Add(q) - } - } - lookup.Do(10, func(item interface{}) { - q := item.(*query) + runQuery := func(q *query) { if q.vers == "none" { // Wait for downgrade step. q.m = module.Version{Path: q.path, Version: "none"} @@ -747,7 +737,32 @@ func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*quer base.Errorf("go get %s: %v", q.arg, err) } q.m = m - }) + } + + type token struct{} + sem := make(chan token, runtime.GOMAXPROCS(0)) + for _, q := range queries { + if cached := cache[q.querySpec]; cached != nil { + *q = *cached + } else { + sem <- token{} + go func(q *query) { + runQuery(q) + <-sem + }(q) + } + } + + // Fill semaphore channel to wait for goroutines to finish. + for n := cap(sem); n > 0; n-- { + sem <- token{} + } + + // Add to cache after concurrent section to avoid races... + for _, q := range queries { + cache[q.querySpec] = q + } + base.ExitIfErrors() byPath := make(map[string]*query) diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 4768516e90..8db4d64706 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -9,12 +9,12 @@ import ( "errors" "fmt" "os" + "runtime" "strings" "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modinfo" - "cmd/go/internal/par" "cmd/go/internal/search" "golang.org/x/mod/module" @@ -22,24 +22,35 @@ import ( func ListModules(ctx context.Context, args []string, listU, listVersions bool) []*modinfo.ModulePublic { mods := listModules(ctx, args, listVersions) + + type token struct{} + sem := make(chan token, runtime.GOMAXPROCS(0)) if listU || listVersions { - var work par.Work for _, m := range mods { - work.Add(m) + add := func(m *modinfo.ModulePublic) { + sem <- token{} + go func() { + if listU { + addUpdate(m) + } + if listVersions { + addVersions(m) + } + <-sem + }() + } + + add(m) if m.Replace != nil { - work.Add(m.Replace) + add(m.Replace) } } - work.Do(10, func(item interface{}) { - m := item.(*modinfo.ModulePublic) - if listU { - addUpdate(m) - } - if listVersions { - addVersions(m) - } - }) } + // Fill semaphore channel to wait for all tasks to finish. + for n := cap(sem); n > 0; n-- { + sem <- token{} + } + return mods } -- GitLab From 6b420169d798c7ebe733487b56ea5c3fa4aab5ce Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 18 Aug 2020 16:46:24 -0700 Subject: [PATCH 0275/1792] os, internal/poll: loop on EINTR for all file syscalls When using a FUSE file system, any system call that touches the file system can return EINTR. Fixes #40846 Change-Id: I25d32da22cec08dea81ab297291a85ad72db2df7 Reviewed-on: https://go-review.googlesource.com/c/go/+/249178 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/internal/poll/fd_fsync_posix.go | 4 ++- src/internal/poll/fd_opendir_darwin.go | 8 +++++- src/internal/poll/fd_posix.go | 28 ++++++++++++++++-- src/internal/poll/fd_unix.go | 22 ++++++-------- src/os/dir_darwin.go | 3 ++ src/os/file.go | 5 +++- src/os/file_plan9.go | 4 +++ src/os/file_posix.go | 32 +++++++++++++++++++-- src/os/file_unix.go | 40 ++++++++++++++++++++------ src/os/getwd.go | 11 ++++++- src/os/stat_unix.go | 8 ++++-- src/runtime/trace/trace_stack_test.go | 2 +- 12 files changed, 133 insertions(+), 34 deletions(-) diff --git a/src/internal/poll/fd_fsync_posix.go b/src/internal/poll/fd_fsync_posix.go index 69358297f4..dd7956f14d 100644 --- a/src/internal/poll/fd_fsync_posix.go +++ b/src/internal/poll/fd_fsync_posix.go @@ -14,5 +14,7 @@ func (fd *FD) Fsync() error { return err } defer fd.decref() - return syscall.Fsync(fd.Sysfd) + return ignoringEINTR(func() error { + return syscall.Fsync(fd.Sysfd) + }) } diff --git a/src/internal/poll/fd_opendir_darwin.go b/src/internal/poll/fd_opendir_darwin.go index c7d3318c72..8eb770c358 100644 --- a/src/internal/poll/fd_opendir_darwin.go +++ b/src/internal/poll/fd_opendir_darwin.go @@ -19,7 +19,13 @@ func (fd *FD) OpenDir() (uintptr, string, error) { if err != nil { return 0, call, err } - dir, err := fdopendir(fd2) + var dir uintptr + for { + dir, err = fdopendir(fd2) + if err != syscall.EINTR { + break + } + } if err != nil { syscall.Close(fd2) return 0, "fdopendir", err diff --git a/src/internal/poll/fd_posix.go b/src/internal/poll/fd_posix.go index 54747b4c99..e5fb05c9c2 100644 --- a/src/internal/poll/fd_posix.go +++ b/src/internal/poll/fd_posix.go @@ -35,7 +35,9 @@ func (fd *FD) Fchmod(mode uint32) error { return err } defer fd.decref() - return syscall.Fchmod(fd.Sysfd, mode) + return ignoringEINTR(func() error { + return syscall.Fchmod(fd.Sysfd, mode) + }) } // Fchown wraps syscall.Fchown. @@ -44,7 +46,9 @@ func (fd *FD) Fchown(uid, gid int) error { return err } defer fd.decref() - return syscall.Fchown(fd.Sysfd, uid, gid) + return ignoringEINTR(func() error { + return syscall.Fchown(fd.Sysfd, uid, gid) + }) } // Ftruncate wraps syscall.Ftruncate. @@ -53,7 +57,9 @@ func (fd *FD) Ftruncate(size int64) error { return err } defer fd.decref() - return syscall.Ftruncate(fd.Sysfd, size) + return ignoringEINTR(func() error { + return syscall.Ftruncate(fd.Sysfd, size) + }) } // RawControl invokes the user-defined function f for a non-IO @@ -66,3 +72,19 @@ func (fd *FD) RawControl(f func(uintptr)) error { f(uintptr(fd.Sysfd)) return nil } + +// ignoringEINTR makes a function call and repeats it if it returns +// an EINTR error. This appears to be required even though we install all +// signal handlers with SA_RESTART: see #22838, #38033, #38836, #40846. +// Also #20400 and #36644 are issues in which a signal handler is +// installed without setting SA_RESTART. None of these are the common case, +// but there are enough of them that it seems that we can't avoid +// an EINTR loop. +func ignoringEINTR(fn func() error) error { + for { + err := fn() + if err != syscall.EINTR { + return err + } + } +} diff --git a/src/internal/poll/fd_unix.go b/src/internal/poll/fd_unix.go index 4872fa9851..1d5101eac3 100644 --- a/src/internal/poll/fd_unix.go +++ b/src/internal/poll/fd_unix.go @@ -152,7 +152,7 @@ func (fd *FD) Read(p []byte) (int, error) { p = p[:maxRW] } for { - n, err := ignoringEINTR(syscall.Read, fd.Sysfd, p) + n, err := ignoringEINTRIO(syscall.Read, fd.Sysfd, p) if err != nil { n = 0 if err == syscall.EAGAIN && fd.pd.pollable() { @@ -264,7 +264,7 @@ func (fd *FD) Write(p []byte) (int, error) { if fd.IsStream && max-nn > maxRW { max = nn + maxRW } - n, err := ignoringEINTR(syscall.Write, fd.Sysfd, p[nn:max]) + n, err := ignoringEINTRIO(syscall.Write, fd.Sysfd, p[nn:max]) if n > 0 { nn += n } @@ -423,7 +423,7 @@ func (fd *FD) ReadDirent(buf []byte) (int, error) { } defer fd.decref() for { - n, err := ignoringEINTR(syscall.ReadDirent, fd.Sysfd, buf) + n, err := ignoringEINTRIO(syscall.ReadDirent, fd.Sysfd, buf) if err != nil { n = 0 if err == syscall.EAGAIN && fd.pd.pollable() { @@ -452,7 +452,9 @@ func (fd *FD) Fstat(s *syscall.Stat_t) error { return err } defer fd.decref() - return syscall.Fstat(fd.Sysfd, s) + return ignoringEINTR(func() error { + return syscall.Fstat(fd.Sysfd, s) + }) } // tryDupCloexec indicates whether F_DUPFD_CLOEXEC should be used. @@ -514,7 +516,7 @@ func (fd *FD) WriteOnce(p []byte) (int, error) { return 0, err } defer fd.writeUnlock() - return ignoringEINTR(syscall.Write, fd.Sysfd, p) + return ignoringEINTRIO(syscall.Write, fd.Sysfd, p) } // RawRead invokes the user-defined function f for a read operation. @@ -555,14 +557,8 @@ func (fd *FD) RawWrite(f func(uintptr) bool) error { } } -// ignoringEINTR makes a function call and repeats it if it returns -// an EINTR error. This appears to be required even though we install -// all signal handlers with SA_RESTART: see #22838, #38033, #38836. -// Also #20400 and #36644 are issues in which a signal handler is -// installed without setting SA_RESTART. None of these are the common case, -// but there are enough of them that it seems that we can't avoid -// an EINTR loop. -func ignoringEINTR(fn func(fd int, p []byte) (int, error), fd int, p []byte) (int, error) { +// ignoringEINTRIO is like ignoringEINTR, but just for IO calls. +func ignoringEINTRIO(fn func(fd int, p []byte) (int, error), fd int, p []byte) (int, error) { for { n, err := fn(fd, p) if err != syscall.EINTR { diff --git a/src/os/dir_darwin.go b/src/os/dir_darwin.go index 2f9ba78d68..87797e2dda 100644 --- a/src/os/dir_darwin.go +++ b/src/os/dir_darwin.go @@ -47,6 +47,9 @@ func (f *File) readdirnames(n int) (names []string, err error) { var entptr *syscall.Dirent for len(names) < size || n == -1 { if res := readdir_r(d.dir, &dirent, &entptr); res != 0 { + if syscall.Errno(res) == syscall.EINTR { + continue + } return names, wrapSyscallError("readdir", syscall.Errno(res)) } if entptr == nil { // EOF diff --git a/src/os/file.go b/src/os/file.go index a2b71cb61a..05d2f83283 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -255,7 +255,10 @@ func Mkdir(name string, perm FileMode) error { if runtime.GOOS == "windows" && isWindowsNulName(name) { return &PathError{"mkdir", name, syscall.ENOTDIR} } - e := syscall.Mkdir(fixLongPath(name), syscallMode(perm)) + longName := fixLongPath(name) + e := ignoringEINTR(func() error { + return syscall.Mkdir(longName, syscallMode(perm)) + }) if e != nil { return &PathError{"mkdir", name, e} diff --git a/src/os/file_plan9.go b/src/os/file_plan9.go index eb158905ab..043500744b 100644 --- a/src/os/file_plan9.go +++ b/src/os/file_plan9.go @@ -558,3 +558,7 @@ func (c *rawConn) Write(f func(uintptr) bool) error { func newRawConn(file *File) (*rawConn, error) { return nil, syscall.EPLAN9 } + +func ignoringEINTR(fn func() error) error { + return fn() +} diff --git a/src/os/file_posix.go b/src/os/file_posix.go index 24ea554b62..ae23d22d0a 100644 --- a/src/os/file_posix.go +++ b/src/os/file_posix.go @@ -76,7 +76,11 @@ func syscallMode(i FileMode) (o uint32) { // See docs in file.go:Chmod. func chmod(name string, mode FileMode) error { - if e := syscall.Chmod(fixLongPath(name), syscallMode(mode)); e != nil { + longName := fixLongPath(name) + e := ignoringEINTR(func() error { + return syscall.Chmod(longName, syscallMode(mode)) + }) + if e != nil { return &PathError{"chmod", name, e} } return nil @@ -101,7 +105,10 @@ func (f *File) chmod(mode FileMode) error { // On Windows or Plan 9, Chown always returns the syscall.EWINDOWS or // EPLAN9 error, wrapped in *PathError. func Chown(name string, uid, gid int) error { - if e := syscall.Chown(name, uid, gid); e != nil { + e := ignoringEINTR(func() error { + return syscall.Chown(name, uid, gid) + }) + if e != nil { return &PathError{"chown", name, e} } return nil @@ -114,7 +121,10 @@ func Chown(name string, uid, gid int) error { // On Windows, it always returns the syscall.EWINDOWS error, wrapped // in *PathError. func Lchown(name string, uid, gid int) error { - if e := syscall.Lchown(name, uid, gid); e != nil { + e := ignoringEINTR(func() error { + return syscall.Lchown(name, uid, gid) + }) + if e != nil { return &PathError{"lchown", name, e} } return nil @@ -222,3 +232,19 @@ func (f *File) checkValid(op string) error { } return nil } + +// ignoringEINTR makes a function call and repeats it if it returns an +// EINTR error. This appears to be required even though we install all +// signal handlers with SA_RESTART: see #22838, #38033, #38836, #40846. +// Also #20400 and #36644 are issues in which a signal handler is +// installed without setting SA_RESTART. None of these are the common case, +// but there are enough of them that it seems that we can't avoid +// an EINTR loop. +func ignoringEINTR(fn func() error) error { + for { + err := fn() + if err != syscall.EINTR { + return err + } + } +} diff --git a/src/os/file_unix.go b/src/os/file_unix.go index f2c00ae0cb..5446dd5003 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -39,7 +39,9 @@ func rename(oldname, newname string) error { return &LinkError{"rename", oldname, newname, syscall.EEXIST} } } - err = syscall.Rename(oldname, newname) + err = ignoringEINTR(func() error { + return syscall.Rename(oldname, newname) + }) if err != nil { return &LinkError{"rename", oldname, newname, err} } @@ -129,7 +131,9 @@ func newFile(fd uintptr, name string, kind newFileKind) *File { switch runtime.GOOS { case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd": var st syscall.Stat_t - err := syscall.Fstat(fdi, &st) + err := ignoringEINTR(func() error { + return syscall.Fstat(fdi, &st) + }) typ := st.Mode & syscall.S_IFMT // Don't try to use kqueue with regular files on *BSDs. // On FreeBSD a regular file is always @@ -264,7 +268,10 @@ func (f *File) seek(offset int64, whence int) (ret int64, err error) { // If the file is a symbolic link, it changes the size of the link's target. // If there is an error, it will be of type *PathError. func Truncate(name string, size int64) error { - if e := syscall.Truncate(name, size); e != nil { + e := ignoringEINTR(func() error { + return syscall.Truncate(name, size) + }) + if e != nil { return &PathError{"truncate", name, e} } return nil @@ -277,11 +284,15 @@ func Remove(name string) error { // whether name is a file or directory. // Try both: it is cheaper on average than // doing a Stat plus the right one. - e := syscall.Unlink(name) + e := ignoringEINTR(func() error { + return syscall.Unlink(name) + }) if e == nil { return nil } - e1 := syscall.Rmdir(name) + e1 := ignoringEINTR(func() error { + return syscall.Rmdir(name) + }) if e1 == nil { return nil } @@ -316,7 +327,9 @@ func tempDir() string { // Link creates newname as a hard link to the oldname file. // If there is an error, it will be of type *LinkError. func Link(oldname, newname string) error { - e := syscall.Link(oldname, newname) + e := ignoringEINTR(func() error { + return syscall.Link(oldname, newname) + }) if e != nil { return &LinkError{"link", oldname, newname, e} } @@ -326,7 +339,9 @@ func Link(oldname, newname string) error { // Symlink creates newname as a symbolic link to oldname. // If there is an error, it will be of type *LinkError. func Symlink(oldname, newname string) error { - e := syscall.Symlink(oldname, newname) + e := ignoringEINTR(func() error { + return syscall.Symlink(oldname, newname) + }) if e != nil { return &LinkError{"symlink", oldname, newname, e} } @@ -365,7 +380,16 @@ func (f *File) readdir(n int) (fi []FileInfo, err error) { func Readlink(name string) (string, error) { for len := 128; ; len *= 2 { b := make([]byte, len) - n, e := fixCount(syscall.Readlink(name, b)) + var ( + n int + e error + ) + for { + n, e = fixCount(syscall.Readlink(name, b)) + if e != syscall.EINTR { + break + } + } // buffer too small if runtime.GOOS == "aix" && e == syscall.ERANGE { continue diff --git a/src/os/getwd.go b/src/os/getwd.go index 6d25466bb4..f3afd8c06c 100644 --- a/src/os/getwd.go +++ b/src/os/getwd.go @@ -45,7 +45,16 @@ func Getwd() (dir string, err error) { // If the operating system provides a Getwd call, use it. // Otherwise, we're trying to find our way back to ".". if syscall.ImplementsGetwd { - s, e := syscall.Getwd() + var ( + s string + e error + ) + for { + s, e = syscall.Getwd() + if e != syscall.EINTR { + break + } + } if useSyscallwd(e) { return s, NewSyscallError("getwd", e) } diff --git a/src/os/stat_unix.go b/src/os/stat_unix.go index 0a7e6029ac..ef74a43758 100644 --- a/src/os/stat_unix.go +++ b/src/os/stat_unix.go @@ -28,7 +28,9 @@ func (f *File) Stat() (FileInfo, error) { // statNolog stats a file with no test logging. func statNolog(name string) (FileInfo, error) { var fs fileStat - err := syscall.Stat(name, &fs.sys) + err := ignoringEINTR(func() error { + return syscall.Stat(name, &fs.sys) + }) if err != nil { return nil, &PathError{"stat", name, err} } @@ -39,7 +41,9 @@ func statNolog(name string) (FileInfo, error) { // lstatNolog lstats a file with no test logging. func lstatNolog(name string) (FileInfo, error) { var fs fileStat - err := syscall.Lstat(name, &fs.sys) + err := ignoringEINTR(func() error { + return syscall.Lstat(name, &fs.sys) + }) if err != nil { return nil, &PathError{"lstat", name, err} } diff --git a/src/runtime/trace/trace_stack_test.go b/src/runtime/trace/trace_stack_test.go index cfc0419b72..be3adc9801 100644 --- a/src/runtime/trace/trace_stack_test.go +++ b/src/runtime/trace/trace_stack_test.go @@ -252,7 +252,7 @@ func TestTraceSymbolize(t *testing.T) { {trace.EvGoSysCall, []frame{ {"syscall.read", 0}, {"syscall.Read", 0}, - {"internal/poll.ignoringEINTR", 0}, + {"internal/poll.ignoringEINTRIO", 0}, {"internal/poll.(*FD).Read", 0}, {"os.(*File).read", 0}, {"os.(*File).Read", 0}, -- GitLab From 2d34f3d023586fc001d64b372bd709efaab54a18 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 19 Aug 2020 14:42:11 -0700 Subject: [PATCH 0276/1792] cmd/dist: fix tipo in comment Change-Id: I98fbf0dc94cf182adec5d414a56b9cc5126c38f4 Reviewed-on: https://go-review.googlesource.com/c/go/+/249437 Run-TryBot: Ian Lance Taylor Reviewed-by: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/dist/buildtool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go index 0b50f66c32..79eab24d29 100644 --- a/src/cmd/dist/buildtool.go +++ b/src/cmd/dist/buildtool.go @@ -113,7 +113,7 @@ var ignorePrefixes = []string{ // File suffixes that use build tags introduced since Go 1.4. // These must not be copied into the bootstrap build directory. -// Also igonore test files. +// Also ignore test files. var ignoreSuffixes = []string{ "_arm64.s", "_arm64.go", -- GitLab From b0cc02e8c2bdba5401838d9d70a859191af9bfa5 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 19 Aug 2020 16:54:36 +0200 Subject: [PATCH 0277/1792] internal/poll: treat copy_file_range EPERM as not-handled Fixes #40893 Change-Id: I938ea4796c1e1d1e136117fe78b06ad6da8e40de Reviewed-on: https://go-review.googlesource.com/c/go/+/249257 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Antonio Troina Reviewed-by: Ian Lance Taylor --- src/internal/poll/copy_file_range_linux.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/internal/poll/copy_file_range_linux.go b/src/internal/poll/copy_file_range_linux.go index 7e67125818..09de299ff7 100644 --- a/src/internal/poll/copy_file_range_linux.go +++ b/src/internal/poll/copy_file_range_linux.go @@ -41,7 +41,7 @@ func CopyFileRange(dst, src *FD, remain int64) (written int64, handled bool, err // use copy_file_range(2) again. atomic.StoreInt32(©FileRangeSupported, 0) return 0, false, nil - case syscall.EXDEV, syscall.EINVAL, syscall.EOPNOTSUPP: + case syscall.EXDEV, syscall.EINVAL, syscall.EOPNOTSUPP, syscall.EPERM: // Prior to Linux 5.3, it was not possible to // copy_file_range across file systems. Similarly to // the ENOSYS case above, if we see EXDEV, we have @@ -55,6 +55,11 @@ func CopyFileRange(dst, src *FD, remain int64) (written int64, handled bool, err // // If the file is on NFS, we can see EOPNOTSUPP. // See issue #40731. + // + // If the process is running inside a Docker container, + // we might see EPERM instead of ENOSYS. See issue + // #40893. Since EPERM might also be a legitimate error, + // don't mark copy_file_range(2) as unsupported. return 0, false, nil case nil: if n == 0 { -- GitLab From 46ca7b5ee2a8582736f1ddac27d8660e1104c345 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Sat, 15 Aug 2020 08:08:37 -0700 Subject: [PATCH 0278/1792] cmd/internal/obj: stop removing NOPs from instruction stream This has already been done for s390x, ppc64. This CL is for all the other architectures. Fixes #40796 Change-Id: Idd1816e057df63022d47e99fa06617811d8c8489 Reviewed-on: https://go-review.googlesource.com/c/go/+/248684 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/internal/obj/arm/asm5.go | 3 ++ src/cmd/internal/obj/arm/obj5.go | 46 ------------------------ src/cmd/internal/obj/arm64/asm7.go | 3 ++ src/cmd/internal/obj/arm64/obj7.go | 56 ++---------------------------- src/cmd/internal/obj/mips/asm0.go | 3 ++ src/cmd/internal/obj/mips/obj0.go | 26 ++------------ 6 files changed, 14 insertions(+), 123 deletions(-) diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go index f66f8aaf84..7b7e42ee2e 100644 --- a/src/cmd/internal/obj/arm/asm5.go +++ b/src/cmd/internal/obj/arm/asm5.go @@ -327,6 +327,9 @@ var optab = []Optab{ {obj.APCDATA, C_LCON, C_NONE, C_LCON, 0, 0, 0, 0, 0, 0}, {obj.AFUNCDATA, C_LCON, C_NONE, C_ADDR, 0, 0, 0, 0, 0, 0}, {obj.ANOP, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0}, + {obj.ANOP, C_LCON, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0}, // nop variants, see #40689 + {obj.ANOP, C_REG, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0}, + {obj.ANOP, C_FREG, C_NONE, C_NONE, 0, 0, 0, 0, 0, 0}, {obj.ADUFFZERO, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0, 0}, // same as ABL {obj.ADUFFCOPY, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0, 0}, // same as ABL {obj.AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0, 0, 0, 0}, diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index 008118c47b..86831f2b44 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -276,67 +276,21 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { /* * find leaf subroutines - * strip NOPs - * expand RET - * expand BECOME pseudo */ - var q1 *obj.Prog - var q *obj.Prog for p := cursym.Func.Text; p != nil; p = p.Link { switch p.As { case obj.ATEXT: p.Mark |= LEAF - case obj.ARET: - break - case ADIV, ADIVU, AMOD, AMODU: - q = p cursym.Func.Text.Mark &^= LEAF - continue - - case obj.ANOP: - q1 = p.Link - q.Link = q1 /* q is non-nop */ - if q1 != nil { - q1.Mark |= p.Mark - } - continue case ABL, ABX, obj.ADUFFZERO, obj.ADUFFCOPY: cursym.Func.Text.Mark &^= LEAF - fallthrough - - case AB, - ABEQ, - ABNE, - ABCS, - ABHS, - ABCC, - ABLO, - ABMI, - ABPL, - ABVS, - ABVC, - ABHI, - ABLS, - ABGE, - ABLT, - ABGT, - ABLE: - q1 = p.Pcond - if q1 != nil { - for q1.As == obj.ANOP { - q1 = q1.Link - p.Pcond = q1 - } - } } - - q = p } var q2 *obj.Prog diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 8f8981479b..7a5a8ff38c 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -837,6 +837,9 @@ var optab = []Optab{ {obj.APCDATA, C_VCON, C_NONE, C_NONE, C_VCON, 0, 0, 0, 0, 0}, {obj.AFUNCDATA, C_VCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0, 0, 0}, {obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, + {obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // nop variants, see #40689 + {obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, + {obj.ANOP, C_VREG, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, {obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0}, // same as AB/ABL {obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0}, // same as AB/ABL {obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0, 0}, // align code diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index b046685ada..0d74430053 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -468,73 +468,21 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { /* * find leaf subroutines - * strip NOPs - * expand RET */ - q := (*obj.Prog)(nil) - var q1 *obj.Prog for p := c.cursym.Func.Text; p != nil; p = p.Link { switch p.As { case obj.ATEXT: p.Mark |= LEAF - case obj.ARET: - break - - case obj.ANOP: - if p.Link != nil { - q1 = p.Link - q.Link = q1 /* q is non-nop */ - q1.Mark |= p.Mark - } - continue - case ABL, obj.ADUFFZERO, obj.ADUFFCOPY: c.cursym.Func.Text.Mark &^= LEAF - fallthrough - - case ACBNZ, - ACBZ, - ACBNZW, - ACBZW, - ATBZ, - ATBNZ, - AB, - ABEQ, - ABNE, - ABCS, - ABHS, - ABCC, - ABLO, - ABMI, - ABPL, - ABVS, - ABVC, - ABHI, - ABLS, - ABGE, - ABLT, - ABGT, - ABLE, - AADR, /* strange */ - AADRP: - q1 = p.Pcond - - if q1 != nil { - for q1.As == obj.ANOP { - q1 = q1.Link - p.Pcond = q1 - } - } - - break } - - q = p } + var q *obj.Prog + var q1 *obj.Prog var retjmp *obj.LSym for p := c.cursym.Func.Text; p != nil; p = p.Link { o := p.As diff --git a/src/cmd/internal/obj/mips/asm0.go b/src/cmd/internal/obj/mips/asm0.go index faa12bf133..faa827da9f 100644 --- a/src/cmd/internal/obj/mips/asm0.go +++ b/src/cmd/internal/obj/mips/asm0.go @@ -391,6 +391,9 @@ var optab = []Optab{ {obj.APCDATA, C_LCON, C_NONE, C_LCON, 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_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 diff --git a/src/cmd/internal/obj/mips/obj0.go b/src/cmd/internal/obj/mips/obj0.go index 3106143844..77cad979a6 100644 --- a/src/cmd/internal/obj/mips/obj0.go +++ b/src/cmd/internal/obj/mips/obj0.go @@ -158,19 +158,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { /* * find leaf subroutines - * strip NOPs * expand RET * expand BECOME pseudo */ - var q *obj.Prog - var q1 *obj.Prog for p := c.cursym.Func.Text; p != nil; p = p.Link { switch p.As { /* too hard, just leave alone */ case obj.ATEXT: - q = p - p.Mark |= LABEL | LEAF | SYNC if p.Link != nil { p.Link.Mark |= LABEL @@ -179,7 +174,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { /* too hard, just leave alone */ case AMOVW, AMOVV: - q = p if p.To.Type == obj.TYPE_REG && p.To.Reg >= REG_SPECIAL { p.Mark |= LABEL | SYNC break @@ -195,11 +189,9 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ATLBWI, ATLBP, ATLBR: - q = p p.Mark |= LABEL | SYNC case ANOR: - q = p if p.To.Type == obj.TYPE_REG { if p.To.Reg == REGZERO { p.Mark |= LABEL | SYNC @@ -235,8 +227,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } else { p.Mark |= BRANCH } - q = p - q1 = p.Pcond + q1 := p.Pcond if q1 != nil { for q1.As == obj.ANOP { q1 = q1.Link @@ -254,24 +245,11 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { if q1 != nil { q1.Mark |= LABEL } - continue case ARET: - q = p if p.Link != nil { p.Link.Mark |= LABEL } - continue - - case obj.ANOP: - q1 = p.Link - q.Link = q1 /* q is non-nop */ - q1.Mark |= p.Mark - continue - - default: - q = p - continue } } @@ -284,6 +262,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { mov = AMOVW } + var q *obj.Prog + var q1 *obj.Prog autosize := int32(0) var p1 *obj.Prog var p2 *obj.Prog -- GitLab From 8ec5a052ec8d4e628353fb5099b29341fae9b3a4 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Mon, 17 Aug 2020 19:10:12 +0200 Subject: [PATCH 0279/1792] unicode: upgrade to Unicode 13.0.0 Fixes #40755 Change-Id: I14b3977317994095db8ae1bd873c174641209356 Reviewed-on: https://go-review.googlesource.com/c/go/+/248765 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- api/except.txt | 1 + api/next.txt | 5 + doc/go1.16.html | 11 + src/strconv/isprint.go | 98 ++++---- src/unicode/tables.go | 544 ++++++++++++++++++++++++++--------------- 5 files changed, 416 insertions(+), 243 deletions(-) diff --git a/api/except.txt b/api/except.txt index ccfdf06c55..962bb14271 100644 --- a/api/except.txt +++ b/api/except.txt @@ -456,3 +456,4 @@ pkg syscall (freebsd-arm-cgo), type Statfs_t struct, Mntonname [88]int8 pkg text/scanner, const GoTokens = 1012 pkg unicode, const Version = "10.0.0" pkg unicode, const Version = "11.0.0" +pkg unicode, const Version = "12.0.0" diff --git a/api/next.txt b/api/next.txt index e69de29bb2..fe7509bf82 100644 --- a/api/next.txt +++ b/api/next.txt @@ -0,0 +1,5 @@ +pkg unicode, const Version = "13.0.0" +pkg unicode, var Chorasmian *RangeTable +pkg unicode, var Dives_Akuru *RangeTable +pkg unicode, var Khitan_Small_Script *RangeTable +pkg unicode, var Yezidi *RangeTable diff --git a/doc/go1.16.html b/doc/go1.16.html index 1fea359436..4753cf914d 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -90,6 +90,17 @@ Do not send CLs removing the interior tags from such phrases. TODO

+

unicode

+ +

+ The unicode package and associated + support throughout the system has been upgraded from Unicode 12.0.0 to + Unicode 13.0.0, + which adds 5,930 new characters, including four new scripts, and 55 new emoji. + Unicode 13.0.0 also designates plane 3 (U+30000-U+3FFFF) as the tertiary + ideographic plane. +

+

Minor changes to the library

diff --git a/src/strconv/isprint.go b/src/strconv/isprint.go index 7ada2d1b04..994a8e423c 100644 --- a/src/strconv/isprint.go +++ b/src/strconv/isprint.go @@ -6,7 +6,7 @@ package strconv -// (442+132+90)*2 + (450)*4 = 3128 bytes +// (434+132+95)*2 + (468)*4 = 3194 bytes var isPrint16 = []uint16{ 0x0020, 0x007e, @@ -25,7 +25,7 @@ var isPrint16 = []uint16{ 0x07fd, 0x082d, 0x0830, 0x085b, 0x085e, 0x086a, - 0x08a0, 0x08bd, + 0x08a0, 0x08c7, 0x08d3, 0x098c, 0x098f, 0x0990, 0x0993, 0x09b2, @@ -56,7 +56,7 @@ var isPrint16 = []uint16{ 0x0b3c, 0x0b44, 0x0b47, 0x0b48, 0x0b4b, 0x0b4d, - 0x0b56, 0x0b57, + 0x0b55, 0x0b57, 0x0b5c, 0x0b63, 0x0b66, 0x0b77, 0x0b82, 0x0b8a, @@ -82,8 +82,7 @@ var isPrint16 = []uint16{ 0x0ce6, 0x0cf2, 0x0d00, 0x0d4f, 0x0d54, 0x0d63, - 0x0d66, 0x0d7f, - 0x0d82, 0x0d96, + 0x0d66, 0x0d96, 0x0d9a, 0x0dbd, 0x0dc0, 0x0dc6, 0x0dca, 0x0dca, @@ -138,7 +137,7 @@ var isPrint16 = []uint16{ 0x1a7f, 0x1a89, 0x1a90, 0x1a99, 0x1aa0, 0x1aad, - 0x1ab0, 0x1abe, + 0x1ab0, 0x1ac0, 0x1b00, 0x1b4b, 0x1b50, 0x1b7c, 0x1b80, 0x1bf3, @@ -166,30 +165,27 @@ var isPrint16 = []uint16{ 0x2190, 0x2426, 0x2440, 0x244a, 0x2460, 0x2b73, - 0x2b76, 0x2b95, - 0x2b98, 0x2cf3, + 0x2b76, 0x2cf3, 0x2cf9, 0x2d27, 0x2d2d, 0x2d2d, 0x2d30, 0x2d67, 0x2d6f, 0x2d70, 0x2d7f, 0x2d96, - 0x2da0, 0x2e4f, + 0x2da0, 0x2e52, 0x2e80, 0x2ef3, 0x2f00, 0x2fd5, 0x2ff0, 0x2ffb, 0x3001, 0x3096, 0x3099, 0x30ff, - 0x3105, 0x31ba, - 0x31c0, 0x31e3, - 0x31f0, 0x4db5, - 0x4dc0, 0x9fef, + 0x3105, 0x31e3, + 0x31f0, 0x9ffc, 0xa000, 0xa48c, 0xa490, 0xa4c6, 0xa4d0, 0xa62b, 0xa640, 0xa6f7, 0xa700, 0xa7bf, - 0xa7c2, 0xa7c6, - 0xa7f7, 0xa82b, + 0xa7c2, 0xa7ca, + 0xa7f5, 0xa82c, 0xa830, 0xa839, 0xa840, 0xa877, 0xa880, 0xa8c5, @@ -205,7 +201,7 @@ var isPrint16 = []uint16{ 0xab01, 0xab06, 0xab09, 0xab0e, 0xab11, 0xab16, - 0xab20, 0xab67, + 0xab20, 0xab6b, 0xab70, 0xabed, 0xabf0, 0xabf9, 0xac00, 0xd7a3, @@ -288,11 +284,11 @@ var isNotPrint16 = []uint16{ 0x0cc9, 0x0cdf, 0x0cf0, - 0x0d04, 0x0d0d, 0x0d11, 0x0d45, 0x0d49, + 0x0d80, 0x0d84, 0x0db2, 0x0dbc, @@ -335,6 +331,7 @@ var isNotPrint16 = []uint16{ 0x1fdc, 0x1ff5, 0x208f, + 0x2b96, 0x2c2f, 0x2c5f, 0x2d26, @@ -351,7 +348,6 @@ var isNotPrint16 = []uint16{ 0x3130, 0x318f, 0x321f, - 0x32ff, 0xa9ce, 0xa9ff, 0xab27, @@ -373,7 +369,7 @@ var isPrint32 = []uint32{ 0x010080, 0x0100fa, 0x010100, 0x010102, 0x010107, 0x010133, - 0x010137, 0x01019b, + 0x010137, 0x01019c, 0x0101a0, 0x0101a0, 0x0101d0, 0x0101fd, 0x010280, 0x01029c, @@ -424,19 +420,20 @@ var isPrint32 = []uint32{ 0x010cc0, 0x010cf2, 0x010cfa, 0x010d27, 0x010d30, 0x010d39, - 0x010e60, 0x010e7e, + 0x010e60, 0x010ead, + 0x010eb0, 0x010eb1, 0x010f00, 0x010f27, 0x010f30, 0x010f59, + 0x010fb0, 0x010fcb, 0x010fe0, 0x010ff6, 0x011000, 0x01104d, 0x011052, 0x01106f, 0x01107f, 0x0110c1, 0x0110d0, 0x0110e8, 0x0110f0, 0x0110f9, - 0x011100, 0x011146, + 0x011100, 0x011147, 0x011150, 0x011176, - 0x011180, 0x0111cd, - 0x0111d0, 0x0111f4, + 0x011180, 0x0111f4, 0x011200, 0x01123e, 0x011280, 0x0112a9, 0x0112b0, 0x0112ea, @@ -451,7 +448,7 @@ var isPrint32 = []uint32{ 0x01135d, 0x011363, 0x011366, 0x01136c, 0x011370, 0x011374, - 0x011400, 0x01145f, + 0x011400, 0x011461, 0x011480, 0x0114c7, 0x0114d0, 0x0114d9, 0x011580, 0x0115b5, @@ -466,7 +463,11 @@ var isPrint32 = []uint32{ 0x011730, 0x01173f, 0x011800, 0x01183b, 0x0118a0, 0x0118f2, - 0x0118ff, 0x0118ff, + 0x0118ff, 0x011906, + 0x011909, 0x011909, + 0x01190c, 0x011938, + 0x01193b, 0x011946, + 0x011950, 0x011959, 0x0119a0, 0x0119a7, 0x0119aa, 0x0119d7, 0x0119da, 0x0119e4, @@ -483,6 +484,7 @@ var isPrint32 = []uint32{ 0x011d60, 0x011d98, 0x011da0, 0x011da9, 0x011ee0, 0x011ef8, + 0x011fb0, 0x011fb0, 0x011fc0, 0x011ff1, 0x011fff, 0x012399, 0x012400, 0x012474, @@ -501,9 +503,11 @@ var isPrint32 = []uint32{ 0x016f00, 0x016f4a, 0x016f4f, 0x016f87, 0x016f8f, 0x016f9f, - 0x016fe0, 0x016fe3, + 0x016fe0, 0x016fe4, + 0x016ff0, 0x016ff1, 0x017000, 0x0187f7, - 0x018800, 0x018af2, + 0x018800, 0x018cd5, + 0x018d00, 0x018d08, 0x01b000, 0x01b11e, 0x01b150, 0x01b152, 0x01b164, 0x01b167, @@ -557,17 +561,15 @@ var isPrint32 = []uint32{ 0x01f030, 0x01f093, 0x01f0a0, 0x01f0ae, 0x01f0b1, 0x01f0f5, - 0x01f100, 0x01f10c, - 0x01f110, 0x01f16c, - 0x01f170, 0x01f1ac, + 0x01f100, 0x01f1ad, 0x01f1e6, 0x01f202, 0x01f210, 0x01f23b, 0x01f240, 0x01f248, 0x01f250, 0x01f251, 0x01f260, 0x01f265, - 0x01f300, 0x01f6d5, + 0x01f300, 0x01f6d7, 0x01f6e0, 0x01f6ec, - 0x01f6f0, 0x01f6fa, + 0x01f6f0, 0x01f6fc, 0x01f700, 0x01f773, 0x01f780, 0x01f7d8, 0x01f7e0, 0x01f7eb, @@ -576,22 +578,25 @@ var isPrint32 = []uint32{ 0x01f850, 0x01f859, 0x01f860, 0x01f887, 0x01f890, 0x01f8ad, - 0x01f900, 0x01f976, - 0x01f97a, 0x01f9a2, - 0x01f9a5, 0x01f9aa, - 0x01f9ae, 0x01f9ca, - 0x01f9cd, 0x01fa53, + 0x01f8b0, 0x01f8b1, + 0x01f900, 0x01fa53, 0x01fa60, 0x01fa6d, - 0x01fa70, 0x01fa73, + 0x01fa70, 0x01fa74, 0x01fa78, 0x01fa7a, - 0x01fa80, 0x01fa82, - 0x01fa90, 0x01fa95, - 0x020000, 0x02a6d6, + 0x01fa80, 0x01fa86, + 0x01fa90, 0x01faa8, + 0x01fab0, 0x01fab6, + 0x01fac0, 0x01fac2, + 0x01fad0, 0x01fad6, + 0x01fb00, 0x01fbca, + 0x01fbf0, 0x01fbf9, + 0x020000, 0x02a6dd, 0x02a700, 0x02b734, 0x02b740, 0x02b81d, 0x02b820, 0x02cea1, 0x02ceb0, 0x02ebe0, 0x02f800, 0x02fa1d, + 0x030000, 0x03134a, 0x0e0100, 0x0e01ef, } @@ -609,6 +614,8 @@ var isNotPrint32 = []uint16{ // add 0x10000 to each entry 0x0a04, 0x0a14, 0x0a18, + 0x0e7f, + 0x0eaa, 0x10bd, 0x1135, 0x11e0, @@ -622,8 +629,10 @@ var isNotPrint32 = []uint16{ // add 0x10000 to each entry 0x1331, 0x1334, 0x133a, - 0x145a, 0x145c, + 0x1914, + 0x1917, + 0x1936, 0x1c09, 0x1c37, 0x1ca8, @@ -684,8 +693,9 @@ var isNotPrint32 = []uint16{ // add 0x10000 to each entry 0xeeaa, 0xf0c0, 0xf0d0, - 0xf90c, - 0xf972, + 0xf979, + 0xf9cc, + 0xfb93, } // isGraphic lists the graphic runes not matched by IsPrint. diff --git a/src/unicode/tables.go b/src/unicode/tables.go index 12441682d0..a9b23bfacd 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 = "12.0.0" +const Version = "13.0.0" // Categories is the set of Unicode category tables. var Categories = map[string]*RangeTable{ @@ -170,7 +170,7 @@ var _L = &RangeTable{ {0x0841, 0x0858, 1}, {0x0860, 0x086a, 1}, {0x08a0, 0x08b4, 1}, - {0x08b6, 0x08bd, 1}, + {0x08b6, 0x08c7, 1}, {0x0904, 0x0939, 1}, {0x093d, 0x0950, 19}, {0x0958, 0x0961, 1}, @@ -241,7 +241,7 @@ var _L = &RangeTable{ {0x0cbd, 0x0cde, 33}, {0x0ce0, 0x0ce1, 1}, {0x0cf1, 0x0cf2, 1}, - {0x0d05, 0x0d0c, 1}, + {0x0d04, 0x0d0c, 1}, {0x0d0e, 0x0d10, 1}, {0x0d12, 0x0d3a, 1}, {0x0d3d, 0x0d4e, 17}, @@ -402,10 +402,10 @@ var _L = &RangeTable{ {0x30fc, 0x30ff, 1}, {0x3105, 0x312f, 1}, {0x3131, 0x318e, 1}, - {0x31a0, 0x31ba, 1}, + {0x31a0, 0x31bf, 1}, {0x31f0, 0x31ff, 1}, - {0x3400, 0x4db5, 1}, - {0x4e00, 0x9fef, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, {0xa000, 0xa48c, 1}, {0xa4d0, 0xa4fd, 1}, {0xa500, 0xa60c, 1}, @@ -417,8 +417,8 @@ var _L = &RangeTable{ {0xa717, 0xa71f, 1}, {0xa722, 0xa788, 1}, {0xa78b, 0xa7bf, 1}, - {0xa7c2, 0xa7c6, 1}, - {0xa7f7, 0xa801, 1}, + {0xa7c2, 0xa7ca, 1}, + {0xa7f5, 0xa801, 1}, {0xa803, 0xa805, 1}, {0xa807, 0xa80a, 1}, {0xa80c, 0xa822, 1}, @@ -454,7 +454,7 @@ var _L = &RangeTable{ {0xab20, 0xab26, 1}, {0xab28, 0xab2e, 1}, {0xab30, 0xab5a, 1}, - {0xab5c, 0xab67, 1}, + {0xab5c, 0xab69, 1}, {0xab70, 0xabe2, 1}, {0xac00, 0xd7a3, 1}, {0xd7b0, 0xd7c6, 1}, @@ -540,16 +540,19 @@ var _L = &RangeTable{ {0x10c80, 0x10cb2, 1}, {0x10cc0, 0x10cf2, 1}, {0x10d00, 0x10d23, 1}, + {0x10e80, 0x10ea9, 1}, + {0x10eb0, 0x10eb1, 1}, {0x10f00, 0x10f1c, 1}, {0x10f27, 0x10f30, 9}, {0x10f31, 0x10f45, 1}, + {0x10fb0, 0x10fc4, 1}, {0x10fe0, 0x10ff6, 1}, {0x11003, 0x11037, 1}, {0x11083, 0x110af, 1}, {0x110d0, 0x110e8, 1}, {0x11103, 0x11126, 1}, - {0x11144, 0x11150, 12}, - {0x11151, 0x11172, 1}, + {0x11144, 0x11147, 3}, + {0x11150, 0x11172, 1}, {0x11176, 0x11183, 13}, {0x11184, 0x111b2, 1}, {0x111c1, 0x111c4, 1}, @@ -572,8 +575,8 @@ var _L = &RangeTable{ {0x1135d, 0x11361, 1}, {0x11400, 0x11434, 1}, {0x11447, 0x1144a, 1}, - {0x1145f, 0x11480, 33}, - {0x11481, 0x114af, 1}, + {0x1145f, 0x11461, 1}, + {0x11480, 0x114af, 1}, {0x114c4, 0x114c5, 1}, {0x114c7, 0x11580, 185}, {0x11581, 0x115ae, 1}, @@ -585,8 +588,13 @@ var _L = &RangeTable{ {0x11701, 0x1171a, 1}, {0x11800, 0x1182b, 1}, {0x118a0, 0x118df, 1}, - {0x118ff, 0x119a0, 161}, - {0x119a1, 0x119a7, 1}, + {0x118ff, 0x11906, 1}, + {0x11909, 0x1190c, 3}, + {0x1190d, 0x11913, 1}, + {0x11915, 0x11916, 1}, + {0x11918, 0x1192f, 1}, + {0x1193f, 0x11941, 2}, + {0x119a0, 0x119a7, 1}, {0x119aa, 0x119d0, 1}, {0x119e1, 0x119e3, 2}, {0x11a00, 0x11a0b, 11}, @@ -608,7 +616,8 @@ var _L = &RangeTable{ {0x11d6a, 0x11d89, 1}, {0x11d98, 0x11ee0, 328}, {0x11ee1, 0x11ef2, 1}, - {0x12000, 0x12399, 1}, + {0x11fb0, 0x12000, 80}, + {0x12001, 0x12399, 1}, {0x12480, 0x12543, 1}, {0x13000, 0x1342e, 1}, {0x14400, 0x14646, 1}, @@ -626,7 +635,8 @@ var _L = &RangeTable{ {0x16fe0, 0x16fe1, 1}, {0x16fe3, 0x17000, 29}, {0x17001, 0x187f7, 1}, - {0x18800, 0x18af2, 1}, + {0x18800, 0x18cd5, 1}, + {0x18d00, 0x18d08, 1}, {0x1b000, 0x1b11e, 1}, {0x1b150, 0x1b152, 1}, {0x1b164, 0x1b167, 1}, @@ -696,12 +706,13 @@ var _L = &RangeTable{ {0x1eea1, 0x1eea3, 1}, {0x1eea5, 0x1eea9, 1}, {0x1eeab, 0x1eebb, 1}, - {0x20000, 0x2a6d6, 1}, + {0x20000, 0x2a6dd, 1}, {0x2a700, 0x2b734, 1}, {0x2b740, 0x2b81d, 1}, {0x2b820, 0x2cea1, 1}, {0x2ceb0, 0x2ebe0, 1}, {0x2f800, 0x2fa1d, 1}, + {0x30000, 0x3134a, 1}, }, LatinOffset: 6, } @@ -821,9 +832,11 @@ var _Ll = &RangeTable{ {0xa797, 0xa7a9, 2}, {0xa7af, 0xa7b5, 6}, {0xa7b7, 0xa7bf, 2}, - {0xa7c3, 0xa7fa, 55}, - {0xab30, 0xab5a, 1}, - {0xab60, 0xab67, 1}, + {0xa7c3, 0xa7c8, 5}, + {0xa7ca, 0xa7f6, 44}, + {0xa7fa, 0xab30, 822}, + {0xab31, 0xab5a, 1}, + {0xab60, 0xab68, 1}, {0xab70, 0xabbf, 1}, {0xfb00, 0xfb06, 1}, {0xfb13, 0xfb17, 1}, @@ -908,8 +921,8 @@ var _Lm = &RangeTable{ {0xaa70, 0xaadd, 109}, {0xaaf3, 0xaaf4, 1}, {0xab5c, 0xab5f, 1}, - {0xff70, 0xff9e, 46}, - {0xff9f, 0xff9f, 1}, + {0xab69, 0xff70, 21511}, + {0xff9e, 0xff9f, 1}, }, R32: []Range32{ {0x16b40, 0x16b43, 1}, @@ -945,7 +958,7 @@ var _Lo = &RangeTable{ {0x0840, 0x0858, 1}, {0x0860, 0x086a, 1}, {0x08a0, 0x08b4, 1}, - {0x08b6, 0x08bd, 1}, + {0x08b6, 0x08c7, 1}, {0x0904, 0x0939, 1}, {0x093d, 0x0950, 19}, {0x0958, 0x0961, 1}, @@ -1016,7 +1029,7 @@ var _Lo = &RangeTable{ {0x0cbd, 0x0cde, 33}, {0x0ce0, 0x0ce1, 1}, {0x0cf1, 0x0cf2, 1}, - {0x0d05, 0x0d0c, 1}, + {0x0d04, 0x0d0c, 1}, {0x0d0e, 0x0d10, 1}, {0x0d12, 0x0d3a, 1}, {0x0d3d, 0x0d4e, 17}, @@ -1127,10 +1140,10 @@ var _Lo = &RangeTable{ {0x30ff, 0x3105, 6}, {0x3106, 0x312f, 1}, {0x3131, 0x318e, 1}, - {0x31a0, 0x31ba, 1}, + {0x31a0, 0x31bf, 1}, {0x31f0, 0x31ff, 1}, - {0x3400, 0x4db5, 1}, - {0x4e00, 0x9fef, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, {0xa000, 0xa014, 1}, {0xa016, 0xa48c, 1}, {0xa4d0, 0xa4f7, 1}, @@ -1254,16 +1267,19 @@ var _Lo = &RangeTable{ {0x10b80, 0x10b91, 1}, {0x10c00, 0x10c48, 1}, {0x10d00, 0x10d23, 1}, + {0x10e80, 0x10ea9, 1}, + {0x10eb0, 0x10eb1, 1}, {0x10f00, 0x10f1c, 1}, {0x10f27, 0x10f30, 9}, {0x10f31, 0x10f45, 1}, + {0x10fb0, 0x10fc4, 1}, {0x10fe0, 0x10ff6, 1}, {0x11003, 0x11037, 1}, {0x11083, 0x110af, 1}, {0x110d0, 0x110e8, 1}, {0x11103, 0x11126, 1}, - {0x11144, 0x11150, 12}, - {0x11151, 0x11172, 1}, + {0x11144, 0x11147, 3}, + {0x11150, 0x11172, 1}, {0x11176, 0x11183, 13}, {0x11184, 0x111b2, 1}, {0x111c1, 0x111c4, 1}, @@ -1286,8 +1302,8 @@ var _Lo = &RangeTable{ {0x1135d, 0x11361, 1}, {0x11400, 0x11434, 1}, {0x11447, 0x1144a, 1}, - {0x1145f, 0x11480, 33}, - {0x11481, 0x114af, 1}, + {0x1145f, 0x11461, 1}, + {0x11480, 0x114af, 1}, {0x114c4, 0x114c5, 1}, {0x114c7, 0x11580, 185}, {0x11581, 0x115ae, 1}, @@ -1298,8 +1314,13 @@ var _Lo = &RangeTable{ {0x116b8, 0x11700, 72}, {0x11701, 0x1171a, 1}, {0x11800, 0x1182b, 1}, - {0x118ff, 0x119a0, 161}, - {0x119a1, 0x119a7, 1}, + {0x118ff, 0x11906, 1}, + {0x11909, 0x1190c, 3}, + {0x1190d, 0x11913, 1}, + {0x11915, 0x11916, 1}, + {0x11918, 0x1192f, 1}, + {0x1193f, 0x11941, 2}, + {0x119a0, 0x119a7, 1}, {0x119aa, 0x119d0, 1}, {0x119e1, 0x119e3, 2}, {0x11a00, 0x11a0b, 11}, @@ -1321,7 +1342,8 @@ var _Lo = &RangeTable{ {0x11d6a, 0x11d89, 1}, {0x11d98, 0x11ee0, 328}, {0x11ee1, 0x11ef2, 1}, - {0x12000, 0x12399, 1}, + {0x11fb0, 0x12000, 80}, + {0x12001, 0x12399, 1}, {0x12480, 0x12543, 1}, {0x13000, 0x1342e, 1}, {0x14400, 0x14646, 1}, @@ -1334,7 +1356,8 @@ var _Lo = &RangeTable{ {0x16f00, 0x16f4a, 1}, {0x16f50, 0x17000, 176}, {0x17001, 0x187f7, 1}, - {0x18800, 0x18af2, 1}, + {0x18800, 0x18cd5, 1}, + {0x18d00, 0x18d08, 1}, {0x1b000, 0x1b11e, 1}, {0x1b150, 0x1b152, 1}, {0x1b164, 0x1b167, 1}, @@ -1371,12 +1394,13 @@ var _Lo = &RangeTable{ {0x1eea1, 0x1eea3, 1}, {0x1eea5, 0x1eea9, 1}, {0x1eeab, 0x1eebb, 1}, - {0x20000, 0x2a6d6, 1}, + {0x20000, 0x2a6dd, 1}, {0x2a700, 0x2b734, 1}, {0x2b740, 0x2b81d, 1}, {0x2b820, 0x2cea1, 1}, {0x2ceb0, 0x2ebe0, 1}, {0x2f800, 0x2fa1d, 1}, + {0x30000, 0x3134a, 1}, }, LatinOffset: 1, } @@ -1500,7 +1524,8 @@ var _Lu = &RangeTable{ {0xa7b0, 0xa7b4, 1}, {0xa7b6, 0xa7be, 2}, {0xa7c2, 0xa7c4, 2}, - {0xa7c5, 0xa7c6, 1}, + {0xa7c5, 0xa7c7, 1}, + {0xa7c9, 0xa7f5, 44}, {0xff21, 0xff3a, 1}, }, R32: []Range32{ @@ -1601,7 +1626,7 @@ var _M = &RangeTable{ {0x0b3f, 0x0b44, 1}, {0x0b47, 0x0b48, 1}, {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, + {0x0b55, 0x0b57, 1}, {0x0b62, 0x0b63, 1}, {0x0b82, 0x0bbe, 60}, {0x0bbf, 0x0bc2, 1}, @@ -1627,9 +1652,10 @@ var _M = &RangeTable{ {0x0d46, 0x0d48, 1}, {0x0d4a, 0x0d4d, 1}, {0x0d57, 0x0d62, 11}, - {0x0d63, 0x0d82, 31}, - {0x0d83, 0x0dca, 71}, - {0x0dcf, 0x0dd4, 1}, + {0x0d63, 0x0d81, 30}, + {0x0d82, 0x0d83, 1}, + {0x0dca, 0x0dcf, 5}, + {0x0dd0, 0x0dd4, 1}, {0x0dd6, 0x0dd8, 2}, {0x0dd9, 0x0ddf, 1}, {0x0df2, 0x0df3, 1}, @@ -1672,7 +1698,7 @@ var _M = &RangeTable{ {0x1a55, 0x1a5e, 1}, {0x1a60, 0x1a7c, 1}, {0x1a7f, 0x1ab0, 49}, - {0x1ab1, 0x1abe, 1}, + {0x1ab1, 0x1ac0, 1}, {0x1b00, 0x1b04, 1}, {0x1b34, 0x1b44, 1}, {0x1b6b, 0x1b73, 1}, @@ -1699,8 +1725,9 @@ var _M = &RangeTable{ {0xa802, 0xa806, 4}, {0xa80b, 0xa823, 24}, {0xa824, 0xa827, 1}, - {0xa880, 0xa881, 1}, - {0xa8b4, 0xa8c5, 1}, + {0xa82c, 0xa880, 84}, + {0xa881, 0xa8b4, 51}, + {0xa8b5, 0xa8c5, 1}, {0xa8e0, 0xa8f1, 1}, {0xa8ff, 0xa926, 39}, {0xa927, 0xa92d, 1}, @@ -1735,6 +1762,7 @@ var _M = &RangeTable{ {0x10a3f, 0x10ae5, 166}, {0x10ae6, 0x10d24, 574}, {0x10d25, 0x10d27, 1}, + {0x10eab, 0x10eac, 1}, {0x10f46, 0x10f50, 1}, {0x11000, 0x11002, 1}, {0x11038, 0x11046, 1}, @@ -1747,6 +1775,7 @@ var _M = &RangeTable{ {0x11181, 0x11182, 1}, {0x111b3, 0x111c0, 1}, {0x111c9, 0x111cc, 1}, + {0x111ce, 0x111cf, 1}, {0x1122c, 0x11237, 1}, {0x1123e, 0x112df, 161}, {0x112e0, 0x112ea, 1}, @@ -1769,7 +1798,12 @@ var _M = &RangeTable{ {0x116ab, 0x116b7, 1}, {0x1171d, 0x1172b, 1}, {0x1182c, 0x1183a, 1}, - {0x119d1, 0x119d7, 1}, + {0x11930, 0x11935, 1}, + {0x11937, 0x11938, 1}, + {0x1193b, 0x1193e, 1}, + {0x11940, 0x11942, 2}, + {0x11943, 0x119d1, 142}, + {0x119d2, 0x119d7, 1}, {0x119da, 0x119e0, 1}, {0x119e4, 0x11a01, 29}, {0x11a02, 0x11a0a, 1}, @@ -1796,8 +1830,10 @@ var _M = &RangeTable{ {0x16f4f, 0x16f51, 2}, {0x16f52, 0x16f87, 1}, {0x16f8f, 0x16f92, 1}, - {0x1bc9d, 0x1bc9e, 1}, - {0x1d165, 0x1d169, 1}, + {0x16fe4, 0x16ff0, 12}, + {0x16ff1, 0x1bc9d, 19628}, + {0x1bc9e, 0x1d165, 5319}, + {0x1d166, 0x1d169, 1}, {0x1d16d, 0x1d172, 1}, {0x1d17b, 0x1d182, 1}, {0x1d185, 0x1d18b, 1}, @@ -1929,7 +1965,8 @@ var _Mc = &RangeTable{ {0x11146, 0x11182, 60}, {0x111b3, 0x111b5, 1}, {0x111bf, 0x111c0, 1}, - {0x1122c, 0x1122e, 1}, + {0x111ce, 0x1122c, 94}, + {0x1122d, 0x1122e, 1}, {0x11232, 0x11233, 1}, {0x11235, 0x112e0, 171}, {0x112e1, 0x112e2, 1}, @@ -1957,7 +1994,11 @@ var _Mc = &RangeTable{ {0x116b6, 0x11720, 106}, {0x11721, 0x11726, 5}, {0x1182c, 0x1182e, 1}, - {0x11838, 0x119d1, 409}, + {0x11838, 0x11930, 248}, + {0x11931, 0x11935, 1}, + {0x11937, 0x11938, 1}, + {0x1193d, 0x11940, 3}, + {0x11942, 0x119d1, 143}, {0x119d2, 0x119d3, 1}, {0x119dc, 0x119df, 1}, {0x119e4, 0x11a39, 85}, @@ -1970,6 +2011,7 @@ var _Mc = &RangeTable{ {0x11d96, 0x11ef5, 351}, {0x11ef6, 0x16f51, 20571}, {0x16f52, 0x16f87, 1}, + {0x16ff0, 0x16ff1, 1}, {0x1d165, 0x1d166, 1}, {0x1d16d, 0x1d172, 1}, }, @@ -2038,12 +2080,12 @@ var _Mn = &RangeTable{ {0x0b01, 0x0b3c, 59}, {0x0b3f, 0x0b41, 2}, {0x0b42, 0x0b44, 1}, - {0x0b4d, 0x0b56, 9}, - {0x0b62, 0x0b63, 1}, - {0x0b82, 0x0bc0, 62}, - {0x0bcd, 0x0c00, 51}, - {0x0c04, 0x0c3e, 58}, - {0x0c3f, 0x0c40, 1}, + {0x0b4d, 0x0b55, 8}, + {0x0b56, 0x0b62, 12}, + {0x0b63, 0x0b82, 31}, + {0x0bc0, 0x0bcd, 13}, + {0x0c00, 0x0c04, 4}, + {0x0c3e, 0x0c40, 1}, {0x0c46, 0x0c48, 1}, {0x0c4a, 0x0c4d, 1}, {0x0c55, 0x0c56, 1}, @@ -2056,8 +2098,9 @@ var _Mn = &RangeTable{ {0x0d3b, 0x0d3c, 1}, {0x0d41, 0x0d44, 1}, {0x0d4d, 0x0d62, 21}, - {0x0d63, 0x0dca, 103}, - {0x0dd2, 0x0dd4, 1}, + {0x0d63, 0x0d81, 30}, + {0x0dca, 0x0dd2, 8}, + {0x0dd3, 0x0dd4, 1}, {0x0dd6, 0x0e31, 91}, {0x0e34, 0x0e3a, 1}, {0x0e47, 0x0e4e, 1}, @@ -2107,6 +2150,7 @@ var _Mn = &RangeTable{ {0x1a73, 0x1a7c, 1}, {0x1a7f, 0x1ab0, 49}, {0x1ab1, 0x1abd, 1}, + {0x1abf, 0x1ac0, 1}, {0x1b00, 0x1b03, 1}, {0x1b34, 0x1b36, 2}, {0x1b37, 0x1b3a, 1}, @@ -2142,9 +2186,9 @@ var _Mn = &RangeTable{ {0xa6f0, 0xa6f1, 1}, {0xa802, 0xa806, 4}, {0xa80b, 0xa825, 26}, - {0xa826, 0xa8c4, 158}, - {0xa8c5, 0xa8e0, 27}, - {0xa8e1, 0xa8f1, 1}, + {0xa826, 0xa82c, 6}, + {0xa8c4, 0xa8c5, 1}, + {0xa8e0, 0xa8f1, 1}, {0xa8ff, 0xa926, 39}, {0xa927, 0xa92d, 1}, {0xa947, 0xa951, 1}, @@ -2178,6 +2222,7 @@ var _Mn = &RangeTable{ {0x10a3f, 0x10ae5, 166}, {0x10ae6, 0x10d24, 574}, {0x10d25, 0x10d27, 1}, + {0x10eab, 0x10eac, 1}, {0x10f46, 0x10f50, 1}, {0x11001, 0x11038, 55}, {0x11039, 0x11046, 1}, @@ -2191,7 +2236,8 @@ var _Mn = &RangeTable{ {0x11181, 0x111b6, 53}, {0x111b7, 0x111be, 1}, {0x111c9, 0x111cc, 1}, - {0x1122f, 0x11231, 1}, + {0x111cf, 0x1122f, 96}, + {0x11230, 0x11231, 1}, {0x11234, 0x11236, 2}, {0x11237, 0x1123e, 7}, {0x112df, 0x112e3, 4}, @@ -2223,6 +2269,8 @@ var _Mn = &RangeTable{ {0x11727, 0x1172b, 1}, {0x1182f, 0x11837, 1}, {0x11839, 0x1183a, 1}, + {0x1193b, 0x1193c, 1}, + {0x1193e, 0x11943, 5}, {0x119d4, 0x119d7, 1}, {0x119da, 0x119db, 1}, {0x119e0, 0x11a01, 33}, @@ -2253,8 +2301,9 @@ var _Mn = &RangeTable{ {0x16b30, 0x16b36, 1}, {0x16f4f, 0x16f8f, 64}, {0x16f90, 0x16f92, 1}, - {0x1bc9d, 0x1bc9e, 1}, - {0x1d167, 0x1d169, 1}, + {0x16fe4, 0x1bc9d, 19641}, + {0x1bc9e, 0x1d167, 5321}, + {0x1d168, 0x1d169, 1}, {0x1d17b, 0x1d182, 1}, {0x1d185, 0x1d18b, 1}, {0x1d1aa, 0x1d1ad, 1}, @@ -2375,6 +2424,7 @@ var _N = &RangeTable{ {0x10e60, 0x10e7e, 1}, {0x10f1d, 0x10f26, 1}, {0x10f51, 0x10f54, 1}, + {0x10fc5, 0x10fcb, 1}, {0x11052, 0x1106f, 1}, {0x110f0, 0x110f9, 1}, {0x11136, 0x1113f, 1}, @@ -2387,6 +2437,7 @@ var _N = &RangeTable{ {0x116c0, 0x116c9, 1}, {0x11730, 0x1173b, 1}, {0x118e0, 0x118f2, 1}, + {0x11950, 0x11959, 1}, {0x11c50, 0x11c6c, 1}, {0x11d50, 0x11d59, 1}, {0x11da0, 0x11da9, 1}, @@ -2409,6 +2460,7 @@ var _N = &RangeTable{ {0x1ed01, 0x1ed2d, 1}, {0x1ed2f, 0x1ed3d, 1}, {0x1f100, 0x1f10c, 1}, + {0x1fbf0, 0x1fbf9, 1}, }, LatinOffset: 4, } @@ -2467,6 +2519,7 @@ var _Nd = &RangeTable{ {0x116c0, 0x116c9, 1}, {0x11730, 0x11739, 1}, {0x118e0, 0x118e9, 1}, + {0x11950, 0x11959, 1}, {0x11c50, 0x11c59, 1}, {0x11d50, 0x11d59, 1}, {0x11da0, 0x11da9, 1}, @@ -2476,6 +2529,7 @@ var _Nd = &RangeTable{ {0x1e140, 0x1e149, 1}, {0x1e2f0, 0x1e2f9, 1}, {0x1e950, 0x1e959, 1}, + {0x1fbf0, 0x1fbf9, 1}, }, LatinOffset: 1, } @@ -2554,6 +2608,7 @@ var _No = &RangeTable{ {0x10e60, 0x10e7e, 1}, {0x10f1d, 0x10f26, 1}, {0x10f51, 0x10f54, 1}, + {0x10fc5, 0x10fcb, 1}, {0x11052, 0x11065, 1}, {0x111e1, 0x111f4, 1}, {0x1173a, 0x1173b, 1}, @@ -2655,7 +2710,8 @@ var _P = &RangeTable{ {0x2d70, 0x2e00, 144}, {0x2e01, 0x2e2e, 1}, {0x2e30, 0x2e4f, 1}, - {0x3001, 0x3003, 1}, + {0x2e52, 0x3001, 431}, + {0x3002, 0x3003, 1}, {0x3008, 0x3011, 1}, {0x3014, 0x301f, 1}, {0x3030, 0x303d, 13}, @@ -2701,7 +2757,8 @@ var _P = &RangeTable{ {0x10af1, 0x10af6, 1}, {0x10b39, 0x10b3f, 1}, {0x10b99, 0x10b9c, 1}, - {0x10f55, 0x10f59, 1}, + {0x10ead, 0x10f55, 168}, + {0x10f56, 0x10f59, 1}, {0x11047, 0x1104d, 1}, {0x110bb, 0x110bc, 1}, {0x110be, 0x110c1, 1}, @@ -2713,14 +2770,16 @@ var _P = &RangeTable{ {0x11238, 0x1123d, 1}, {0x112a9, 0x1144b, 418}, {0x1144c, 0x1144f, 1}, - {0x1145b, 0x1145d, 2}, - {0x114c6, 0x115c1, 251}, - {0x115c2, 0x115d7, 1}, + {0x1145a, 0x1145b, 1}, + {0x1145d, 0x114c6, 105}, + {0x115c1, 0x115d7, 1}, {0x11641, 0x11643, 1}, {0x11660, 0x1166c, 1}, {0x1173c, 0x1173e, 1}, - {0x1183b, 0x119e2, 423}, - {0x11a3f, 0x11a46, 1}, + {0x1183b, 0x11944, 265}, + {0x11945, 0x11946, 1}, + {0x119e2, 0x11a3f, 93}, + {0x11a40, 0x11a46, 1}, {0x11a9a, 0x11a9c, 1}, {0x11a9e, 0x11aa2, 1}, {0x11c41, 0x11c45, 1}, @@ -2764,6 +2823,9 @@ var _Pd = &RangeTable{ {0xfe58, 0xfe63, 11}, {0xff0d, 0xff0d, 1}, }, + R32: []Range32{ + {0x10ead, 0x10ead, 1}, + }, } var _Pe = &RangeTable{ @@ -2894,7 +2956,8 @@ var _Po = &RangeTable{ {0x2e3c, 0x2e3f, 1}, {0x2e41, 0x2e43, 2}, {0x2e44, 0x2e4f, 1}, - {0x3001, 0x3003, 1}, + {0x2e52, 0x3001, 431}, + {0x3002, 0x3003, 1}, {0x303d, 0x30fb, 190}, {0xa4fe, 0xa4ff, 1}, {0xa60d, 0xa60f, 1}, @@ -2951,14 +3014,16 @@ var _Po = &RangeTable{ {0x11238, 0x1123d, 1}, {0x112a9, 0x1144b, 418}, {0x1144c, 0x1144f, 1}, - {0x1145b, 0x1145d, 2}, - {0x114c6, 0x115c1, 251}, - {0x115c2, 0x115d7, 1}, + {0x1145a, 0x1145b, 1}, + {0x1145d, 0x114c6, 105}, + {0x115c1, 0x115d7, 1}, {0x11641, 0x11643, 1}, {0x11660, 0x1166c, 1}, {0x1173c, 0x1173e, 1}, - {0x1183b, 0x119e2, 423}, - {0x11a3f, 0x11a46, 1}, + {0x1183b, 0x11944, 265}, + {0x11945, 0x11946, 1}, + {0x119e2, 0x11a3f, 93}, + {0x11a40, 0x11a46, 1}, {0x11a9a, 0x11a9c, 1}, {0x11a9e, 0x11aa2, 1}, {0x11c41, 0x11c45, 1}, @@ -3094,8 +3159,9 @@ var _S = &RangeTable{ {0x29dc, 0x29fb, 1}, {0x29fe, 0x2b73, 1}, {0x2b76, 0x2b95, 1}, - {0x2b98, 0x2bff, 1}, + {0x2b97, 0x2bff, 1}, {0x2ce5, 0x2cea, 1}, + {0x2e50, 0x2e51, 1}, {0x2e80, 0x2e99, 1}, {0x2e9b, 0x2ef3, 1}, {0x2f00, 0x2fd5, 1}, @@ -3113,8 +3179,7 @@ var _S = &RangeTable{ {0x3250, 0x3260, 16}, {0x3261, 0x327f, 1}, {0x328a, 0x32b0, 1}, - {0x32c0, 0x32fe, 1}, - {0x3300, 0x33ff, 1}, + {0x32c0, 0x33ff, 1}, {0x4dc0, 0x4dff, 1}, {0xa490, 0xa4c6, 1}, {0xa700, 0xa716, 1}, @@ -3123,7 +3188,8 @@ var _S = &RangeTable{ {0xa828, 0xa82b, 1}, {0xa836, 0xa839, 1}, {0xaa77, 0xaa79, 1}, - {0xab5b, 0xfb29, 20430}, + {0xab5b, 0xab6a, 15}, + {0xab6b, 0xfb29, 20414}, {0xfbb2, 0xfbc1, 1}, {0xfdfc, 0xfdfd, 1}, {0xfe62, 0xfe64, 2}, @@ -3141,7 +3207,7 @@ var _S = &RangeTable{ {0x10137, 0x1013f, 1}, {0x10179, 0x10189, 1}, {0x1018c, 0x1018e, 1}, - {0x10190, 0x1019b, 1}, + {0x10190, 0x1019c, 1}, {0x101a0, 0x101d0, 48}, {0x101d1, 0x101fc, 1}, {0x10877, 0x10878, 1}, @@ -3179,16 +3245,15 @@ var _S = &RangeTable{ {0x1f0b1, 0x1f0bf, 1}, {0x1f0c1, 0x1f0cf, 1}, {0x1f0d1, 0x1f0f5, 1}, - {0x1f110, 0x1f16c, 1}, - {0x1f170, 0x1f1ac, 1}, + {0x1f10d, 0x1f1ad, 1}, {0x1f1e6, 0x1f202, 1}, {0x1f210, 0x1f23b, 1}, {0x1f240, 0x1f248, 1}, {0x1f250, 0x1f251, 1}, {0x1f260, 0x1f265, 1}, - {0x1f300, 0x1f6d5, 1}, + {0x1f300, 0x1f6d7, 1}, {0x1f6e0, 0x1f6ec, 1}, - {0x1f6f0, 0x1f6fa, 1}, + {0x1f6f0, 0x1f6fc, 1}, {0x1f700, 0x1f773, 1}, {0x1f780, 0x1f7d8, 1}, {0x1f7e0, 0x1f7eb, 1}, @@ -3197,18 +3262,20 @@ var _S = &RangeTable{ {0x1f850, 0x1f859, 1}, {0x1f860, 0x1f887, 1}, {0x1f890, 0x1f8ad, 1}, - {0x1f900, 0x1f90b, 1}, - {0x1f90d, 0x1f971, 1}, - {0x1f973, 0x1f976, 1}, - {0x1f97a, 0x1f9a2, 1}, - {0x1f9a5, 0x1f9aa, 1}, - {0x1f9ae, 0x1f9ca, 1}, + {0x1f8b0, 0x1f8b1, 1}, + {0x1f900, 0x1f978, 1}, + {0x1f97a, 0x1f9cb, 1}, {0x1f9cd, 0x1fa53, 1}, {0x1fa60, 0x1fa6d, 1}, - {0x1fa70, 0x1fa73, 1}, + {0x1fa70, 0x1fa74, 1}, {0x1fa78, 0x1fa7a, 1}, - {0x1fa80, 0x1fa82, 1}, - {0x1fa90, 0x1fa95, 1}, + {0x1fa80, 0x1fa86, 1}, + {0x1fa90, 0x1faa8, 1}, + {0x1fab0, 0x1fab6, 1}, + {0x1fac0, 0x1fac2, 1}, + {0x1fad0, 0x1fad6, 1}, + {0x1fb00, 0x1fb92, 1}, + {0x1fb94, 0x1fbca, 1}, }, LatinOffset: 10, } @@ -3257,7 +3324,8 @@ var _Sk = &RangeTable{ {0xa700, 0xa716, 1}, {0xa720, 0xa721, 1}, {0xa789, 0xa78a, 1}, - {0xab5b, 0xfbb2, 20567}, + {0xab5b, 0xab6a, 15}, + {0xab6b, 0xfbb2, 20551}, {0xfbb3, 0xfbc1, 1}, {0xff3e, 0xff40, 2}, {0xffe3, 0xffe3, 1}, @@ -3394,8 +3462,9 @@ var _So = &RangeTable{ {0x2b45, 0x2b46, 1}, {0x2b4d, 0x2b73, 1}, {0x2b76, 0x2b95, 1}, - {0x2b98, 0x2bff, 1}, + {0x2b97, 0x2bff, 1}, {0x2ce5, 0x2cea, 1}, + {0x2e50, 0x2e51, 1}, {0x2e80, 0x2e99, 1}, {0x2e9b, 0x2ef3, 1}, {0x2f00, 0x2fd5, 1}, @@ -3412,8 +3481,7 @@ var _So = &RangeTable{ {0x3250, 0x3260, 16}, {0x3261, 0x327f, 1}, {0x328a, 0x32b0, 1}, - {0x32c0, 0x32fe, 1}, - {0x3300, 0x33ff, 1}, + {0x32c0, 0x33ff, 1}, {0x4dc0, 0x4dff, 1}, {0xa490, 0xa4c6, 1}, {0xa828, 0xa82b, 1}, @@ -3429,7 +3497,7 @@ var _So = &RangeTable{ {0x10137, 0x1013f, 1}, {0x10179, 0x10189, 1}, {0x1018c, 0x1018e, 1}, - {0x10190, 0x1019b, 1}, + {0x10190, 0x1019c, 1}, {0x101a0, 0x101d0, 48}, {0x101d1, 0x101fc, 1}, {0x10877, 0x10878, 1}, @@ -3461,17 +3529,16 @@ var _So = &RangeTable{ {0x1f0b1, 0x1f0bf, 1}, {0x1f0c1, 0x1f0cf, 1}, {0x1f0d1, 0x1f0f5, 1}, - {0x1f110, 0x1f16c, 1}, - {0x1f170, 0x1f1ac, 1}, + {0x1f10d, 0x1f1ad, 1}, {0x1f1e6, 0x1f202, 1}, {0x1f210, 0x1f23b, 1}, {0x1f240, 0x1f248, 1}, {0x1f250, 0x1f251, 1}, {0x1f260, 0x1f265, 1}, {0x1f300, 0x1f3fa, 1}, - {0x1f400, 0x1f6d5, 1}, + {0x1f400, 0x1f6d7, 1}, {0x1f6e0, 0x1f6ec, 1}, - {0x1f6f0, 0x1f6fa, 1}, + {0x1f6f0, 0x1f6fc, 1}, {0x1f700, 0x1f773, 1}, {0x1f780, 0x1f7d8, 1}, {0x1f7e0, 0x1f7eb, 1}, @@ -3480,18 +3547,20 @@ var _So = &RangeTable{ {0x1f850, 0x1f859, 1}, {0x1f860, 0x1f887, 1}, {0x1f890, 0x1f8ad, 1}, - {0x1f900, 0x1f90b, 1}, - {0x1f90d, 0x1f971, 1}, - {0x1f973, 0x1f976, 1}, - {0x1f97a, 0x1f9a2, 1}, - {0x1f9a5, 0x1f9aa, 1}, - {0x1f9ae, 0x1f9ca, 1}, + {0x1f8b0, 0x1f8b1, 1}, + {0x1f900, 0x1f978, 1}, + {0x1f97a, 0x1f9cb, 1}, {0x1f9cd, 0x1fa53, 1}, {0x1fa60, 0x1fa6d, 1}, - {0x1fa70, 0x1fa73, 1}, + {0x1fa70, 0x1fa74, 1}, {0x1fa78, 0x1fa7a, 1}, - {0x1fa80, 0x1fa82, 1}, - {0x1fa90, 0x1fa95, 1}, + {0x1fa80, 0x1fa86, 1}, + {0x1fa90, 0x1faa8, 1}, + {0x1fab0, 0x1fab6, 1}, + {0x1fac0, 0x1fac2, 1}, + {0x1fad0, 0x1fad6, 1}, + {0x1fb00, 0x1fb92, 1}, + {0x1fb94, 0x1fbca, 1}, }, LatinOffset: 2, } @@ -3607,6 +3676,7 @@ var Scripts = map[string]*RangeTable{ "Chakma": Chakma, "Cham": Cham, "Cherokee": Cherokee, + "Chorasmian": Chorasmian, "Common": Common, "Coptic": Coptic, "Cuneiform": Cuneiform, @@ -3614,6 +3684,7 @@ var Scripts = map[string]*RangeTable{ "Cyrillic": Cyrillic, "Deseret": Deseret, "Devanagari": Devanagari, + "Dives_Akuru": Dives_Akuru, "Dogra": Dogra, "Duployan": Duployan, "Egyptian_Hieroglyphs": Egyptian_Hieroglyphs, @@ -3645,6 +3716,7 @@ var Scripts = map[string]*RangeTable{ "Katakana": Katakana, "Kayah_Li": Kayah_Li, "Kharoshthi": Kharoshthi, + "Khitan_Small_Script": Khitan_Small_Script, "Khmer": Khmer, "Khojki": Khojki, "Khudawadi": Khudawadi, @@ -3734,6 +3806,7 @@ var Scripts = map[string]*RangeTable{ "Vai": Vai, "Wancho": Wancho, "Warang_Citi": Warang_Citi, + "Yezidi": Yezidi, "Yi": Yi, "Zanabazar_Square": Zanabazar_Square, } @@ -3776,7 +3849,7 @@ var _Arabic = &RangeTable{ {0x06de, 0x06ff, 1}, {0x0750, 0x077f, 1}, {0x08a0, 0x08b4, 1}, - {0x08b6, 0x08bd, 1}, + {0x08b6, 0x08c7, 1}, {0x08d3, 0x08e1, 1}, {0x08e3, 0x08ff, 1}, {0xfb50, 0xfbc1, 1}, @@ -3820,9 +3893,8 @@ var _Arabic = &RangeTable{ var _Armenian = &RangeTable{ R16: []Range16{ {0x0531, 0x0556, 1}, - {0x0559, 0x0588, 1}, - {0x058a, 0x058d, 3}, - {0x058e, 0x058f, 1}, + {0x0559, 0x058a, 1}, + {0x058d, 0x058f, 1}, {0xfb13, 0xfb17, 1}, }, } @@ -3899,7 +3971,7 @@ var _Bopomofo = &RangeTable{ R16: []Range16{ {0x02ea, 0x02eb, 1}, {0x3105, 0x312f, 1}, - {0x31a0, 0x31ba, 1}, + {0x31a0, 0x31bf, 1}, }, } @@ -3957,7 +4029,7 @@ var _Chakma = &RangeTable{ R16: []Range16{}, R32: []Range32{ {0x11100, 0x11134, 1}, - {0x11136, 0x11146, 1}, + {0x11136, 0x11147, 1}, }, } @@ -3978,6 +4050,13 @@ var _Cherokee = &RangeTable{ }, } +var _Chorasmian = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10fb0, 0x10fcb, 1}, + }, +} + var _Common = &RangeTable{ R16: []Range16{ {0x0000, 0x0040, 1}, @@ -3991,13 +4070,12 @@ var _Common = &RangeTable{ {0x02ec, 0x02ff, 1}, {0x0374, 0x037e, 10}, {0x0385, 0x0387, 2}, - {0x0589, 0x0605, 124}, - {0x060c, 0x061b, 15}, - {0x061f, 0x0640, 33}, - {0x06dd, 0x08e2, 517}, - {0x0964, 0x0965, 1}, - {0x0e3f, 0x0fd5, 406}, - {0x0fd6, 0x0fd8, 1}, + {0x0605, 0x060c, 7}, + {0x061b, 0x061f, 4}, + {0x0640, 0x06dd, 157}, + {0x08e2, 0x0964, 130}, + {0x0965, 0x0e3f, 1242}, + {0x0fd5, 0x0fd8, 1}, {0x10fb, 0x16eb, 1520}, {0x16ec, 0x16ed, 1}, {0x1735, 0x1736, 1}, @@ -4025,8 +4103,8 @@ var _Common = &RangeTable{ {0x2460, 0x27ff, 1}, {0x2900, 0x2b73, 1}, {0x2b76, 0x2b95, 1}, - {0x2b98, 0x2bff, 1}, - {0x2e00, 0x2e4f, 1}, + {0x2b97, 0x2bff, 1}, + {0x2e00, 0x2e52, 1}, {0x2ff0, 0x2ffb, 1}, {0x3000, 0x3004, 1}, {0x3006, 0x3008, 2}, @@ -4040,13 +4118,15 @@ var _Common = &RangeTable{ {0x31c0, 0x31e3, 1}, {0x3220, 0x325f, 1}, {0x327f, 0x32cf, 1}, - {0x3358, 0x33ff, 1}, + {0x32ff, 0x3358, 89}, + {0x3359, 0x33ff, 1}, {0x4dc0, 0x4dff, 1}, {0xa700, 0xa721, 1}, {0xa788, 0xa78a, 1}, {0xa830, 0xa839, 1}, {0xa92e, 0xa9cf, 161}, - {0xab5b, 0xfd3e, 20963}, + {0xab5b, 0xab6a, 15}, + {0xab6b, 0xfd3e, 20947}, {0xfd3f, 0xfe10, 209}, {0xfe11, 0xfe19, 1}, {0xfe30, 0xfe52, 1}, @@ -4066,7 +4146,7 @@ var _Common = &RangeTable{ {0x10100, 0x10102, 1}, {0x10107, 0x10133, 1}, {0x10137, 0x1013f, 1}, - {0x10190, 0x1019b, 1}, + {0x10190, 0x1019c, 1}, {0x101d0, 0x101fc, 1}, {0x102e1, 0x102fb, 1}, {0x16fe2, 0x16fe3, 1}, @@ -4110,18 +4190,16 @@ var _Common = &RangeTable{ {0x1f0b1, 0x1f0bf, 1}, {0x1f0c1, 0x1f0cf, 1}, {0x1f0d1, 0x1f0f5, 1}, - {0x1f100, 0x1f10c, 1}, - {0x1f110, 0x1f16c, 1}, - {0x1f170, 0x1f1ac, 1}, + {0x1f100, 0x1f1ad, 1}, {0x1f1e6, 0x1f1ff, 1}, {0x1f201, 0x1f202, 1}, {0x1f210, 0x1f23b, 1}, {0x1f240, 0x1f248, 1}, {0x1f250, 0x1f251, 1}, {0x1f260, 0x1f265, 1}, - {0x1f300, 0x1f6d5, 1}, + {0x1f300, 0x1f6d7, 1}, {0x1f6e0, 0x1f6ec, 1}, - {0x1f6f0, 0x1f6fa, 1}, + {0x1f6f0, 0x1f6fc, 1}, {0x1f700, 0x1f773, 1}, {0x1f780, 0x1f7d8, 1}, {0x1f7e0, 0x1f7eb, 1}, @@ -4130,18 +4208,21 @@ var _Common = &RangeTable{ {0x1f850, 0x1f859, 1}, {0x1f860, 0x1f887, 1}, {0x1f890, 0x1f8ad, 1}, - {0x1f900, 0x1f90b, 1}, - {0x1f90d, 0x1f971, 1}, - {0x1f973, 0x1f976, 1}, - {0x1f97a, 0x1f9a2, 1}, - {0x1f9a5, 0x1f9aa, 1}, - {0x1f9ae, 0x1f9ca, 1}, + {0x1f8b0, 0x1f8b1, 1}, + {0x1f900, 0x1f978, 1}, + {0x1f97a, 0x1f9cb, 1}, {0x1f9cd, 0x1fa53, 1}, {0x1fa60, 0x1fa6d, 1}, - {0x1fa70, 0x1fa73, 1}, + {0x1fa70, 0x1fa74, 1}, {0x1fa78, 0x1fa7a, 1}, - {0x1fa80, 0x1fa82, 1}, - {0x1fa90, 0x1fa95, 1}, + {0x1fa80, 0x1fa86, 1}, + {0x1fa90, 0x1faa8, 1}, + {0x1fab0, 0x1fab6, 1}, + {0x1fac0, 0x1fac2, 1}, + {0x1fad0, 0x1fad6, 1}, + {0x1fb00, 0x1fb92, 1}, + {0x1fb94, 0x1fbca, 1}, + {0x1fbf0, 0x1fbf9, 1}, {0xe0001, 0xe0020, 31}, {0xe0021, 0xe007f, 1}, }, @@ -4205,6 +4286,20 @@ var _Devanagari = &RangeTable{ }, } +var _Dives_Akuru = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x11900, 0x11906, 1}, + {0x11909, 0x1190c, 3}, + {0x1190d, 0x11913, 1}, + {0x11915, 0x11916, 1}, + {0x11918, 0x11935, 1}, + {0x11937, 0x11938, 1}, + {0x1193b, 0x11946, 1}, + {0x11950, 0x11959, 1}, + }, +} + var _Dogra = &RangeTable{ R16: []Range16{}, R32: []Range32{ @@ -4435,18 +4530,20 @@ var _Han = &RangeTable{ {0x3005, 0x3007, 2}, {0x3021, 0x3029, 1}, {0x3038, 0x303b, 1}, - {0x3400, 0x4db5, 1}, - {0x4e00, 0x9fef, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, {0xf900, 0xfa6d, 1}, {0xfa70, 0xfad9, 1}, }, R32: []Range32{ - {0x20000, 0x2a6d6, 1}, + {0x16ff0, 0x16ff1, 1}, + {0x20000, 0x2a6dd, 1}, {0x2a700, 0x2b734, 1}, {0x2b740, 0x2b81d, 1}, {0x2b820, 0x2cea1, 1}, {0x2ceb0, 0x2ebe0, 1}, {0x2f800, 0x2fa1d, 1}, + {0x30000, 0x3134a, 1}, }, } @@ -4533,7 +4630,7 @@ var _Inherited = &RangeTable{ {0x064b, 0x0655, 1}, {0x0670, 0x0951, 737}, {0x0952, 0x0954, 1}, - {0x1ab0, 0x1abe, 1}, + {0x1ab0, 0x1ac0, 1}, {0x1cd0, 0x1cd2, 1}, {0x1cd4, 0x1ce0, 1}, {0x1ce2, 0x1ce8, 1}, @@ -4646,6 +4743,14 @@ var _Kharoshthi = &RangeTable{ }, } +var _Khitan_Small_Script = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x16fe4, 0x18b00, 6940}, + {0x18b01, 0x18cd5, 1}, + }, +} + var _Khmer = &RangeTable{ R16: []Range16{ {0x1780, 0x17dd, 1}, @@ -4710,11 +4815,11 @@ var _Latin = &RangeTable{ {0x2c60, 0x2c7f, 1}, {0xa722, 0xa787, 1}, {0xa78b, 0xa7bf, 1}, - {0xa7c2, 0xa7c6, 1}, - {0xa7f7, 0xa7ff, 1}, + {0xa7c2, 0xa7ca, 1}, + {0xa7f5, 0xa7ff, 1}, {0xab30, 0xab5a, 1}, {0xab5c, 0xab64, 1}, - {0xab66, 0xab67, 1}, + {0xab66, 0xab69, 1}, {0xfb00, 0xfb06, 1}, {0xff21, 0xff3a, 1}, {0xff41, 0xff5a, 1}, @@ -4766,6 +4871,9 @@ var _Lisu = &RangeTable{ R16: []Range16{ {0xa4d0, 0xa4ff, 1}, }, + R32: []Range32{ + {0x11fb0, 0x11fb0, 1}, + }, } var _Lycian = &RangeTable{ @@ -4799,8 +4907,7 @@ var _Makasar = &RangeTable{ var _Malayalam = &RangeTable{ R16: []Range16{ - {0x0d00, 0x0d03, 1}, - {0x0d05, 0x0d0c, 1}, + {0x0d00, 0x0d0c, 1}, {0x0d0e, 0x0d10, 1}, {0x0d12, 0x0d44, 1}, {0x0d46, 0x0d48, 1}, @@ -4974,9 +5081,8 @@ var _New_Tai_Lue = &RangeTable{ var _Newa = &RangeTable{ R16: []Range16{}, R32: []Range32{ - {0x11400, 0x11459, 1}, - {0x1145b, 0x1145d, 2}, - {0x1145e, 0x1145f, 1}, + {0x11400, 0x1145b, 1}, + {0x1145d, 0x11461, 1}, }, } @@ -5089,7 +5195,7 @@ var _Oriya = &RangeTable{ {0x0b3c, 0x0b44, 1}, {0x0b47, 0x0b48, 1}, {0x0b4b, 0x0b4d, 1}, - {0x0b56, 0x0b57, 1}, + {0x0b55, 0x0b57, 1}, {0x0b5c, 0x0b5d, 1}, {0x0b5f, 0x0b63, 1}, {0x0b66, 0x0b77, 1}, @@ -5191,8 +5297,7 @@ var _Saurashtra = &RangeTable{ var _Sharada = &RangeTable{ R16: []Range16{}, R32: []Range32{ - {0x11180, 0x111cd, 1}, - {0x111d0, 0x111df, 1}, + {0x11180, 0x111df, 1}, }, } @@ -5222,7 +5327,7 @@ var _SignWriting = &RangeTable{ var _Sinhala = &RangeTable{ R16: []Range16{ - {0x0d82, 0x0d83, 1}, + {0x0d81, 0x0d83, 1}, {0x0d85, 0x0d96, 1}, {0x0d9a, 0x0db1, 1}, {0x0db3, 0x0dbb, 1}, @@ -5271,7 +5376,7 @@ var _Sundanese = &RangeTable{ var _Syloti_Nagri = &RangeTable{ R16: []Range16{ - {0xa800, 0xa82b, 1}, + {0xa800, 0xa82c, 1}, }, } @@ -5360,7 +5465,8 @@ var _Tangut = &RangeTable{ R32: []Range32{ {0x16fe0, 0x17000, 32}, {0x17001, 0x187f7, 1}, - {0x18800, 0x18af2, 1}, + {0x18800, 0x18aff, 1}, + {0x18d00, 0x18d08, 1}, }, } @@ -5452,6 +5558,15 @@ var _Warang_Citi = &RangeTable{ }, } +var _Yezidi = &RangeTable{ + R16: []Range16{}, + R32: []Range32{ + {0x10e80, 0x10ea9, 1}, + {0x10eab, 0x10ead, 1}, + {0x10eb0, 0x10eb1, 1}, + }, +} + var _Yi = &RangeTable{ R16: []Range16{ {0xa000, 0xa48c, 1}, @@ -5491,6 +5606,7 @@ var ( Chakma = _Chakma // Chakma is the set of Unicode characters in script Chakma. Cham = _Cham // Cham is the set of Unicode characters in script Cham. Cherokee = _Cherokee // Cherokee is the set of Unicode characters in script Cherokee. + Chorasmian = _Chorasmian // Chorasmian is the set of Unicode characters in script Chorasmian. Common = _Common // Common is the set of Unicode characters in script Common. Coptic = _Coptic // Coptic is the set of Unicode characters in script Coptic. Cuneiform = _Cuneiform // Cuneiform is the set of Unicode characters in script Cuneiform. @@ -5498,6 +5614,7 @@ var ( 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. + Dives_Akuru = _Dives_Akuru // Dives_Akuru is the set of Unicode characters in script Dives_Akuru. Dogra = _Dogra // Dogra is the set of Unicode characters in script Dogra. Duployan = _Duployan // Duployan is the set of Unicode characters in script Duployan. Egyptian_Hieroglyphs = _Egyptian_Hieroglyphs // Egyptian_Hieroglyphs is the set of Unicode characters in script Egyptian_Hieroglyphs. @@ -5529,6 +5646,7 @@ var ( Katakana = _Katakana // Katakana is the set of Unicode characters in script Katakana. Kayah_Li = _Kayah_Li // Kayah_Li is the set of Unicode characters in script Kayah_Li. Kharoshthi = _Kharoshthi // Kharoshthi is the set of Unicode characters in script Kharoshthi. + Khitan_Small_Script = _Khitan_Small_Script // Khitan_Small_Script is the set of Unicode characters in script Khitan_Small_Script. Khmer = _Khmer // Khmer is the set of Unicode characters in script Khmer. Khojki = _Khojki // Khojki is the set of Unicode characters in script Khojki. Khudawadi = _Khudawadi // Khudawadi is the set of Unicode characters in script Khudawadi. @@ -5618,6 +5736,7 @@ var ( Vai = _Vai // Vai is the set of Unicode characters in script Vai. 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. Yi = _Yi // Yi is the set of Unicode characters in script Yi. Zanabazar_Square = _Zanabazar_Square // Zanabazar_Square is the set of Unicode characters in script Zanabazar_Square. ) @@ -5695,6 +5814,9 @@ var _Dash = &RangeTable{ {0xfe58, 0xfe63, 11}, {0xff0d, 0xff0d, 1}, }, + R32: []Range32{ + {0x10ead, 0x10ead, 1}, + }, } var _Deprecated = &RangeTable{ @@ -5746,10 +5868,11 @@ var _Diacritic = &RangeTable{ {0x0acd, 0x0afd, 48}, {0x0afe, 0x0aff, 1}, {0x0b3c, 0x0b4d, 17}, - {0x0bcd, 0x0c4d, 128}, - {0x0cbc, 0x0ccd, 17}, - {0x0d3b, 0x0d3c, 1}, - {0x0d4d, 0x0e47, 125}, + {0x0b55, 0x0bcd, 120}, + {0x0c4d, 0x0cbc, 111}, + {0x0ccd, 0x0d3b, 110}, + {0x0d3c, 0x0d4d, 17}, + {0x0dca, 0x0e47, 125}, {0x0e48, 0x0e4c, 1}, {0x0e4e, 0x0eba, 108}, {0x0ec8, 0x0ecc, 1}, @@ -5811,6 +5934,7 @@ var _Diacritic = &RangeTable{ {0xaabf, 0xaac2, 1}, {0xaaf6, 0xab5b, 101}, {0xab5c, 0xab5f, 1}, + {0xab69, 0xab6b, 1}, {0xabec, 0xabed, 1}, {0xfb1e, 0xfe20, 770}, {0xfe21, 0xfe2f, 1}, @@ -5838,14 +5962,16 @@ var _Diacritic = &RangeTable{ {0x1163f, 0x116b6, 119}, {0x116b7, 0x1172b, 116}, {0x11839, 0x1183a, 1}, - {0x119e0, 0x11a34, 84}, - {0x11a47, 0x11a99, 82}, - {0x11c3f, 0x11d42, 259}, - {0x11d44, 0x11d45, 1}, - {0x11d97, 0x16af0, 19801}, - {0x16af1, 0x16af4, 1}, + {0x1193d, 0x1193e, 1}, + {0x11943, 0x119e0, 157}, + {0x11a34, 0x11a47, 19}, + {0x11a99, 0x11c3f, 422}, + {0x11d42, 0x11d44, 2}, + {0x11d45, 0x11d97, 82}, + {0x16af0, 0x16af4, 1}, {0x16b30, 0x16b36, 1}, {0x16f8f, 0x16f9f, 1}, + {0x16ff0, 0x16ff1, 1}, {0x1d167, 0x1d169, 1}, {0x1d16d, 0x1d172, 1}, {0x1d17b, 0x1d182, 1}, @@ -5864,12 +5990,12 @@ var _Extender = &RangeTable{ R16: []Range16{ {0x00b7, 0x02d0, 537}, {0x02d1, 0x0640, 879}, - {0x07fa, 0x0e46, 1612}, - {0x0ec6, 0x180a, 2372}, - {0x1843, 0x1aa7, 612}, - {0x1c36, 0x1c7b, 69}, - {0x3005, 0x3031, 44}, - {0x3032, 0x3035, 1}, + {0x07fa, 0x0b55, 859}, + {0x0e46, 0x0ec6, 128}, + {0x180a, 0x1843, 57}, + {0x1aa7, 0x1c36, 399}, + {0x1c7b, 0x3005, 5002}, + {0x3031, 0x3035, 1}, {0x309d, 0x309e, 1}, {0x30fc, 0x30fe, 1}, {0xa015, 0xa60c, 1527}, @@ -5931,21 +6057,24 @@ var _Ideographic = &RangeTable{ {0x3006, 0x3007, 1}, {0x3021, 0x3029, 1}, {0x3038, 0x303a, 1}, - {0x3400, 0x4db5, 1}, - {0x4e00, 0x9fef, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, {0xf900, 0xfa6d, 1}, {0xfa70, 0xfad9, 1}, }, R32: []Range32{ - {0x17000, 0x187f7, 1}, - {0x18800, 0x18af2, 1}, + {0x16fe4, 0x17000, 28}, + {0x17001, 0x187f7, 1}, + {0x18800, 0x18cd5, 1}, + {0x18d00, 0x18d08, 1}, {0x1b170, 0x1b2fb, 1}, - {0x20000, 0x2a6d6, 1}, + {0x20000, 0x2a6dd, 1}, {0x2a700, 0x2b734, 1}, {0x2b740, 0x2b81d, 1}, {0x2b820, 0x2cea1, 1}, {0x2ceb0, 0x2ebe0, 1}, {0x2f800, 0x2fa1d, 1}, + {0x30000, 0x3134a, 1}, }, } @@ -6066,9 +6195,9 @@ var _Other_Alphabetic = &RangeTable{ {0x0d46, 0x0d48, 1}, {0x0d4a, 0x0d4c, 1}, {0x0d57, 0x0d62, 11}, - {0x0d63, 0x0d82, 31}, - {0x0d83, 0x0dcf, 76}, - {0x0dd0, 0x0dd4, 1}, + {0x0d63, 0x0d81, 30}, + {0x0d82, 0x0d83, 1}, + {0x0dcf, 0x0dd4, 1}, {0x0dd6, 0x0dd8, 2}, {0x0dd9, 0x0ddf, 1}, {0x0df2, 0x0df3, 1}, @@ -6104,6 +6233,7 @@ var _Other_Alphabetic = &RangeTable{ {0x1a17, 0x1a1b, 1}, {0x1a55, 0x1a5e, 1}, {0x1a61, 0x1a74, 1}, + {0x1abf, 0x1ac0, 1}, {0x1b00, 0x1b04, 1}, {0x1b35, 0x1b43, 1}, {0x1b80, 0x1b82, 1}, @@ -6145,6 +6275,7 @@ var _Other_Alphabetic = &RangeTable{ {0x10a05, 0x10a06, 1}, {0x10a0c, 0x10a0f, 1}, {0x10d24, 0x10d27, 1}, + {0x10eab, 0x10eac, 1}, {0x11000, 0x11002, 1}, {0x11038, 0x11045, 1}, {0x11082, 0x110b0, 46}, @@ -6154,6 +6285,7 @@ var _Other_Alphabetic = &RangeTable{ {0x11145, 0x11146, 1}, {0x11180, 0x11182, 1}, {0x111b3, 0x111bf, 1}, + {0x111ce, 0x111cf, 1}, {0x1122c, 0x11234, 1}, {0x11237, 0x1123e, 7}, {0x112df, 0x112e8, 1}, @@ -6174,6 +6306,10 @@ var _Other_Alphabetic = &RangeTable{ {0x116ac, 0x116b5, 1}, {0x1171d, 0x1172a, 1}, {0x1182c, 0x11838, 1}, + {0x11930, 0x11935, 1}, + {0x11937, 0x11938, 1}, + {0x1193b, 0x1193c, 1}, + {0x11940, 0x11942, 2}, {0x119d1, 0x119d7, 1}, {0x119da, 0x119df, 1}, {0x119e4, 0x11a01, 29}, @@ -6198,6 +6334,7 @@ var _Other_Alphabetic = &RangeTable{ {0x16f4f, 0x16f51, 2}, {0x16f52, 0x16f87, 1}, {0x16f8f, 0x16f92, 1}, + {0x16ff0, 0x16ff1, 1}, {0x1bc9e, 0x1e000, 9058}, {0x1e001, 0x1e006, 1}, {0x1e008, 0x1e018, 1}, @@ -6243,8 +6380,9 @@ var _Other_Grapheme_Extend = &RangeTable{ R32: []Range32{ {0x1133e, 0x11357, 25}, {0x114b0, 0x114bd, 13}, - {0x115af, 0x1d165, 48054}, - {0x1d16e, 0x1d172, 1}, + {0x115af, 0x11930, 897}, + {0x1d165, 0x1d16e, 9}, + {0x1d16f, 0x1d172, 1}, {0xe0020, 0xe007f, 1}, }, } @@ -6562,6 +6700,7 @@ var _Sentence_Terminal = &RangeTable{ {0x115c9, 0x115d7, 1}, {0x11641, 0x11642, 1}, {0x1173c, 0x1173e, 1}, + {0x11944, 0x11946, 2}, {0x11a42, 0x11a43, 1}, {0x11a9b, 0x11a9c, 1}, {0x11c41, 0x11c42, 1}, @@ -6679,11 +6818,12 @@ var _Terminal_Punctuation = &RangeTable{ {0x11239, 0x1123c, 1}, {0x112a9, 0x1144b, 418}, {0x1144c, 0x1144d, 1}, - {0x1145b, 0x115c2, 359}, - {0x115c3, 0x115c5, 1}, + {0x1145a, 0x1145b, 1}, + {0x115c2, 0x115c5, 1}, {0x115c9, 0x115d7, 1}, {0x11641, 0x11642, 1}, {0x1173c, 0x1173e, 1}, + {0x11944, 0x11946, 2}, {0x11a42, 0x11a43, 1}, {0x11a9b, 0x11a9c, 1}, {0x11aa1, 0x11aa2, 1}, @@ -6703,8 +6843,8 @@ var _Terminal_Punctuation = &RangeTable{ var _Unified_Ideograph = &RangeTable{ R16: []Range16{ - {0x3400, 0x4db5, 1}, - {0x4e00, 0x9fef, 1}, + {0x3400, 0x4dbf, 1}, + {0x4e00, 0x9ffc, 1}, {0xfa0e, 0xfa0f, 1}, {0xfa11, 0xfa13, 2}, {0xfa14, 0xfa1f, 11}, @@ -6713,11 +6853,12 @@ var _Unified_Ideograph = &RangeTable{ {0xfa28, 0xfa29, 1}, }, R32: []Range32{ - {0x20000, 0x2a6d6, 1}, + {0x20000, 0x2a6dd, 1}, {0x2a700, 0x2b734, 1}, {0x2b740, 0x2b81d, 1}, {0x2b820, 0x2cea1, 1}, {0x2ceb0, 0x2ebe0, 1}, + {0x30000, 0x3134a, 1}, }, } @@ -7088,6 +7229,8 @@ var _CaseRanges = []CaseRange{ {0xA7C4, 0xA7C4, d{0, -48, 0}}, {0xA7C5, 0xA7C5, d{0, -42307, 0}}, {0xA7C6, 0xA7C6, d{0, -35384, 0}}, + {0xA7C7, 0xA7CA, d{UpperLower, UpperLower, UpperLower}}, + {0xA7F5, 0xA7F6, d{UpperLower, UpperLower, UpperLower}}, {0xAB53, 0xAB53, d{-928, 0, -928}}, {0xAB70, 0xABBF, d{-38864, 0, -38864}}, {0xFF21, 0xFF3A, d{0, 32, 0}}, @@ -7711,7 +7854,8 @@ var foldLl = &RangeTable{ {0xa7b0, 0xa7b4, 1}, {0xa7b6, 0xa7be, 2}, {0xa7c2, 0xa7c4, 2}, - {0xa7c5, 0xa7c6, 1}, + {0xa7c5, 0xa7c7, 1}, + {0xa7c9, 0xa7f5, 44}, {0xff21, 0xff3a, 1}, }, R32: []Range32{ @@ -7844,8 +7988,10 @@ var foldLu = &RangeTable{ {0xa793, 0xa794, 1}, {0xa797, 0xa7a9, 2}, {0xa7b5, 0xa7bf, 2}, - {0xa7c3, 0xab53, 912}, - {0xab70, 0xabbf, 1}, + {0xa7c3, 0xa7c8, 5}, + {0xa7ca, 0xa7f6, 44}, + {0xab53, 0xab70, 29}, + {0xab71, 0xabbf, 1}, {0xff41, 0xff5a, 1}, }, R32: []Range32{ @@ -7902,7 +8048,7 @@ var foldInherited = &RangeTable{ }, } -// Range entries: 3483 16-bit, 1730 32-bit, 5213 total. -// Range bytes: 20898 16-bit, 20760 32-bit, 41658 total. +// Range entries: 3499 16-bit, 1820 32-bit, 5319 total. +// Range bytes: 20994 16-bit, 21840 32-bit, 42834 total. // Fold orbit bytes: 88 pairs, 352 bytes -- GitLab From c57c0212ebf44b7896477177c8e35be79ff3a586 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 19 Aug 2020 23:01:58 -0700 Subject: [PATCH 0280/1792] cmd/compile: define starting block before opening html writer Opening the html writer can fail, and the failure printer wants to use the entry block's line number. So make sure we set up the entry block first. Fixes #40919 Change-Id: I4ffa2839b45a721bbaf04ff84418e8108fa1cc37 Reviewed-on: https://go-review.googlesource.com/c/go/+/249497 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/gc/ssa.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 5d0098b4e6..4124655b79 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -338,6 +338,10 @@ func buildssa(fn *Node, worker int) *ssa.Func { s.panics = map[funcLine]*ssa.Block{} s.softFloat = s.config.SoftFloat + // Allocate starting block + s.f.Entry = s.f.NewBlock(ssa.BlockPlain) + s.f.Entry.Pos = fn.Pos + if printssa { s.f.HTMLWriter = ssa.NewHTMLWriter(ssaDumpFile, s.f, ssaDumpCFG) // TODO: generate and print a mapping from nodes to values and blocks @@ -345,9 +349,6 @@ func buildssa(fn *Node, worker int) *ssa.Func { s.f.HTMLWriter.WriteAST("AST", astBuf) } - // Allocate starting block - s.f.Entry = s.f.NewBlock(ssa.BlockPlain) - // Allocate starting values s.labels = map[string]*ssaLabel{} s.labeledNodes = map[*Node]*ssaLabel{} -- GitLab From 3f568625980f6e23a603cfd1cb4fcd2bf5c895d7 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Tue, 30 Jun 2020 17:51:52 -0400 Subject: [PATCH 0281/1792] cmd/go: do context propagation for tracing downloads This change does context propagation (and only context propagation) necessary to add context to modfetch.Download and pkg.LoadImport. This was done by adding context to their callers, and then adding context to all call-sites, and then repeating adding context to callers of those enclosing functions and their callers until none were left. In some cases the call graph expansion was pruned by using context.TODOs. The next CL will add a span to Download. I kept it out of this change to avoid making it any larger (and harder to review) than it needs to be. Updates #38714 Change-Id: I7a03416e04a14ca71636d96f2c1bda2c4c30d348 Reviewed-on: https://go-review.googlesource.com/c/go/+/249021 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/get/get.go | 4 +-- src/cmd/go/internal/list/list.go | 5 +-- src/cmd/go/internal/load/pkg.go | 40 ++++++++++----------- src/cmd/go/internal/load/test.go | 6 ++-- src/cmd/go/internal/modcmd/download.go | 4 +-- src/cmd/go/internal/modcmd/init.go | 2 +- src/cmd/go/internal/modcmd/tidy.go | 2 +- src/cmd/go/internal/modcmd/vendor.go | 2 +- src/cmd/go/internal/modcmd/why.go | 6 ++-- src/cmd/go/internal/modconv/convert_test.go | 5 ++- src/cmd/go/internal/modfetch/fetch.go | 3 +- src/cmd/go/internal/modget/get.go | 18 +++++----- src/cmd/go/internal/modload/build.go | 17 ++++----- src/cmd/go/internal/modload/import.go | 9 ++--- src/cmd/go/internal/modload/import_test.go | 5 ++- src/cmd/go/internal/modload/init.go | 9 ++--- src/cmd/go/internal/modload/list.go | 14 ++++---- src/cmd/go/internal/modload/load.go | 39 ++++++++++---------- src/cmd/go/internal/modload/mvs.go | 5 +-- src/cmd/go/internal/modload/query.go | 33 ++++++++--------- src/cmd/go/internal/modload/query_test.go | 5 ++- src/cmd/go/internal/modload/search.go | 5 +-- src/cmd/go/internal/run/run.go | 2 +- src/cmd/go/internal/test/test.go | 2 +- src/cmd/go/internal/work/exec.go | 2 +- 25 files changed, 131 insertions(+), 113 deletions(-) diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index ef43602aca..e5bacadaa3 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -246,9 +246,9 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int) load1 := func(path string, mode int) *load.Package { if parent == nil { mode := 0 // don't do module or vendor resolution - return load.LoadImport(path, base.Cwd, nil, stk, nil, mode) + return load.LoadImport(context.TODO(), path, base.Cwd, nil, stk, nil, mode) } - return load.LoadImport(path, parent.Dir, parent, stk, nil, mode|load.ResolveModule) + return load.LoadImport(context.TODO(), path, parent.Dir, parent, stk, nil, mode|load.ResolveModule) } p := load1(arg, mode) diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 7303e6c866..e68c39f392 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -20,6 +20,7 @@ import ( "cmd/go/internal/cache" "cmd/go/internal/cfg" "cmd/go/internal/load" + "cmd/go/internal/modinfo" "cmd/go/internal/modload" "cmd/go/internal/str" "cmd/go/internal/work" @@ -349,7 +350,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { fm := template.FuncMap{ "join": strings.Join, "context": context, - "module": modload.ModuleInfo, + "module": func(path string) *modinfo.ModulePublic { return modload.ModuleInfo(ctx, path) }, } tmpl, err := template.New("main").Funcs(fm).Parse(*listFmt) if err != nil { @@ -389,7 +390,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go list -m: not using modules") } - modload.InitMod() // Parses go.mod and sets cfg.BuildMod. + modload.InitMod(ctx) // Parses go.mod and sets cfg.BuildMod. if cfg.BuildMod == "vendor" { const actionDisabledFormat = "go list -m: can't %s using the vendor directory\n\t(Use -mod=mod or -mod=readonly to bypass.)" diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 32c2ba7912..71fd9b5538 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -42,10 +42,10 @@ var ( ModBinDir func() string // return effective bin directory ModLookup func(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) // lookup effective meaning of import ModPackageModuleInfo func(path string) *modinfo.ModulePublic // return module info for Package struct - ModImportPaths func(args []string) []*search.Match // expand import paths + ModImportPaths func(ctx context.Context, args []string) []*search.Match // expand import paths ModPackageBuildInfo func(main string, deps []string) string // return module info to embed in binary ModInfoProg func(info string, isgccgo bool) []byte // wrap module info in .go code for binary - ModImportFromFiles func([]string) // update go.mod to add modules for imports in these files + ModImportFromFiles func(context.Context, []string) // update go.mod to add modules for imports in these files ModDirImportPath func(string) string // return effective import path for directory ) @@ -553,7 +553,7 @@ func ReloadPackageNoFlags(arg string, stk *ImportStack) *Package { }) packageDataCache.Delete(p.ImportPath) } - return LoadImport(arg, base.Cwd, nil, stk, nil, 0) + return LoadImport(context.TODO(), arg, base.Cwd, nil, stk, nil, 0) } // dirToImportPath returns the pseudo-import path we use for a package @@ -605,11 +605,11 @@ const ( // 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(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { - return loadImport(nil, path, srcDir, parent, stk, importPos, mode) +func LoadImport(ctx context.Context, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { + return loadImport(ctx, nil, path, srcDir, parent, stk, importPos, mode) } -func loadImport(pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { +func loadImport(ctx context.Context, pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { if path == "" { panic("LoadImport called with empty package path") } @@ -657,7 +657,7 @@ func loadImport(pre *preload, path, srcDir string, parent *Package, stk *ImportS // Load package. // loadPackageData may return bp != nil even if an error occurs, // in order to return partial information. - p.load(path, stk, importPos, bp, err) + p.load(ctx, path, stk, importPos, bp, err) if !cfg.ModulesEnabled && path != cleanImport(path) { p.Error = &PackageError{ @@ -1591,7 +1591,7 @@ func (p *Package) DefaultExecName() string { // load populates p using information from bp, err, which should // be the result of calling build.Context.Import. // stk contains the import stack, not including path itself. -func (p *Package) load(path string, stk *ImportStack, importPos []token.Position, bp *build.Package, err error) { +func (p *Package) load(ctx context.Context, path string, stk *ImportStack, importPos []token.Position, bp *build.Package, err error) { p.copyBuild(bp) // The localPrefix is the path we interpret ./ imports relative to. @@ -1800,7 +1800,7 @@ func (p *Package) load(path string, stk *ImportStack, importPos []token.Position if path == "C" { continue } - p1 := LoadImport(path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport) + p1 := LoadImport(ctx, path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport) path = p1.ImportPath importPaths[i] = path @@ -2073,7 +2073,7 @@ func PackageList(roots []*Package) []*Package { // TestPackageList returns the list of packages in the dag rooted at roots // as visited in a depth-first post-order traversal, including the test // imports of the roots. This ignores errors in test packages. -func TestPackageList(roots []*Package) []*Package { +func TestPackageList(ctx context.Context, roots []*Package) []*Package { seen := map[*Package]bool{} all := []*Package{} var walk func(*Package) @@ -2089,7 +2089,7 @@ func TestPackageList(roots []*Package) []*Package { } walkTest := func(root *Package, path string) { var stk ImportStack - p1 := LoadImport(path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport) + p1 := LoadImport(ctx, path, root.Dir, root, &stk, root.Internal.Build.TestImportPos[path], ResolveImport) if p1.Error == nil { walk(p1) } @@ -2112,7 +2112,7 @@ func TestPackageList(roots []*Package) []*Package { // 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(path, srcDir, parent, stk, importPos, mode) + p := LoadImport(context.TODO(), path, srcDir, parent, stk, importPos, mode) setToolFlags(p) return p } @@ -2153,12 +2153,12 @@ func PackagesAndErrors(ctx context.Context, patterns []string) []*Package { // We need to test whether the path is an actual Go file and not a // package path or pattern ending in '.go' (see golang.org/issue/34653). if fi, err := os.Stat(p); err == nil && !fi.IsDir() { - return []*Package{GoFilesPackage(patterns)} + return []*Package{GoFilesPackage(ctx, patterns)} } } } - matches := ImportPaths(patterns) + matches := ImportPaths(ctx, patterns) var ( pkgs []*Package stk ImportStack @@ -2174,7 +2174,7 @@ func PackagesAndErrors(ctx context.Context, patterns []string) []*Package { if pkg == "" { panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern())) } - p := loadImport(pre, pkg, base.Cwd, nil, &stk, nil, 0) + p := loadImport(ctx, pre, pkg, base.Cwd, nil, &stk, nil, 0) p.Match = append(p.Match, m.Pattern()) p.Internal.CmdlinePkg = true if m.IsLiteral() { @@ -2228,9 +2228,9 @@ func setToolFlags(pkgs ...*Package) { } } -func ImportPaths(args []string) []*search.Match { +func ImportPaths(ctx context.Context, args []string) []*search.Match { if ModInit(); cfg.ModulesEnabled { - return ModImportPaths(args) + return ModImportPaths(ctx, args) } return search.ImportPaths(args) } @@ -2281,7 +2281,7 @@ func PackagesForBuild(ctx context.Context, args []string) []*Package { // GoFilesPackage creates a package for building a collection of Go files // (typically named on the command line). The target is named p.a for // package p or named after the first Go file for package main. -func GoFilesPackage(gofiles []string) *Package { +func GoFilesPackage(ctx context.Context, gofiles []string) *Package { ModInit() for _, f := range gofiles { @@ -2329,7 +2329,7 @@ func GoFilesPackage(gofiles []string) *Package { ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil } if cfg.ModulesEnabled { - ModImportFromFiles(gofiles) + ModImportFromFiles(ctx, gofiles) } var err error @@ -2345,7 +2345,7 @@ func GoFilesPackage(gofiles []string) *Package { pkg := new(Package) pkg.Internal.Local = true pkg.Internal.CmdlineFiles = true - pkg.load("command-line-arguments", &stk, nil, bp, err) + pkg.load(ctx, "command-line-arguments", &stk, nil, bp, err) pkg.Internal.LocalPrefix = dirToImportPath(dir) pkg.ImportPath = "command-line-arguments" pkg.Target = "" diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index 6db8a00245..a0e275095b 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -108,7 +108,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p stk.Push(p.ImportPath + " (test)") rawTestImports := str.StringList(p.TestImports) for i, path := range p.TestImports { - p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport) + p1 := loadImport(ctx, 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 @@ -127,7 +127,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p pxtestNeedsPtest := false rawXTestImports := str.StringList(p.XTestImports) for i, path := range p.XTestImports { - p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) + p1 := loadImport(ctx, pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) if p1.ImportPath == p.ImportPath { pxtestNeedsPtest = true } else { @@ -244,7 +244,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p if dep == ptest.ImportPath { pmain.Internal.Imports = append(pmain.Internal.Imports, ptest) } else { - p1 := loadImport(pre, dep, "", nil, &stk, nil, 0) + p1 := loadImport(ctx, pre, dep, "", nil, &stk, nil, 0) pmain.Internal.Imports = append(pmain.Internal.Imports, p1) } } diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 2f42d4306b..6c4ec572fc 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -90,7 +90,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { if len(args) == 0 { args = []string{"all"} } else if modload.HasModRoot() { - modload.InitMod() // to fill Target + modload.InitMod(ctx) // to fill Target targetAtLatest := modload.Target.Path + "@latest" targetAtUpgrade := modload.Target.Path + "@upgrade" targetAtPatch := modload.Target.Path + "@patch" @@ -126,7 +126,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { return } m.Sum = modfetch.Sum(mod) - m.Dir, err = modfetch.Download(mod) + m.Dir, err = modfetch.Download(ctx, mod) if err != nil { m.Error = err.Error() return diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index 95063e62f4..b6cffd332d 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -51,6 +51,6 @@ func runInit(ctx context.Context, cmd *base.Command, args []string) { if strings.Contains(modload.CmdModModule, "@") { base.Fatalf("go mod init: module path must not contain '@'") } - modload.InitMod() // does all the hard work + modload.InitMod(ctx) // does all the hard work modload.WriteGoMod() } diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index 769cd11fe8..c7c53d7c0c 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -40,7 +40,7 @@ func runTidy(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go mod tidy: no arguments allowed") } - modload.LoadALL() + modload.LoadALL(ctx) modload.TidyBuildList() modload.TrimGoSum() modload.WriteGoMod() diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index 257d1cd0ef..e5353b5c7f 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -48,7 +48,7 @@ func runVendor(ctx context.Context, cmd *base.Command, args []string) { if len(args) != 0 { base.Fatalf("go mod vendor: vendor takes no arguments") } - pkgs := modload.LoadVendor() + pkgs := modload.LoadVendor(ctx) vdir := filepath.Join(modload.ModRoot(), "vendor") if err := os.RemoveAll(vdir); err != nil { diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index f400339b25..da33fff89e 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -76,7 +76,7 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { } mods := modload.ListModules(ctx, args, listU, listVersions) byModule := make(map[module.Version][]string) - for _, path := range loadALL() { + for _, path := range loadALL(ctx) { m := modload.PackageModule(path) if m.Path != "" { byModule[m] = append(byModule[m], path) @@ -105,8 +105,8 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { sep = "\n" } } else { - matches := modload.ImportPaths(args) // resolve to packages - loadALL() // rebuild graph, from main module (not from named packages) + matches := modload.ImportPaths(ctx, args) // resolve to packages + loadALL(ctx) // rebuild graph, from main module (not from named packages) sep := "" for _, m := range matches { for _, path := range m.Pkgs { diff --git a/src/cmd/go/internal/modconv/convert_test.go b/src/cmd/go/internal/modconv/convert_test.go index a04a13b14f..faa2b4c606 100644 --- a/src/cmd/go/internal/modconv/convert_test.go +++ b/src/cmd/go/internal/modconv/convert_test.go @@ -6,6 +6,7 @@ package modconv import ( "bytes" + "context" "fmt" "internal/testenv" "io/ioutil" @@ -146,6 +147,8 @@ func TestConvertLegacyConfig(t *testing.T) { }, } + ctx := context.Background() + for _, tt := range tests { t.Run(strings.ReplaceAll(tt.path, "/", "_")+"_"+tt.vers, func(t *testing.T) { f, err := modfile.Parse("golden", []byte(tt.gomod), nil) @@ -157,7 +160,7 @@ func TestConvertLegacyConfig(t *testing.T) { t.Fatal(err) } - dir, err := modfetch.Download(module.Version{Path: tt.path, Version: tt.vers}) + dir, err := modfetch.Download(ctx, module.Version{Path: tt.path, Version: tt.vers}) 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 e40158b535..6606612658 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -7,6 +7,7 @@ package modfetch import ( "archive/zip" "bytes" + "context" "errors" "fmt" "io" @@ -34,7 +35,7 @@ var downloadCache par.Cache // 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(mod module.Version) (dir string, err error) { +func Download(ctx context.Context, mod module.Version) (dir string, err 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/modget/get.go b/src/cmd/go/internal/modget/get.go index d02c9a8da5..ee9757912b 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -353,7 +353,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { if !strings.Contains(path, "...") { m := search.NewMatch(path) if pkgPath := modload.DirImportPath(path); pkgPath != "." { - m = modload.TargetPackages(pkgPath) + m = modload.TargetPackages(ctx, pkgPath) } if len(m.Pkgs) == 0 { for _, err := range m.Errs { @@ -399,7 +399,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { default: // The argument is a package or module path. if modload.HasModRoot() { - if m := modload.TargetPackages(path); len(m.Pkgs) != 0 { + if m := modload.TargetPackages(ctx, path); len(m.Pkgs) != 0 { // The path is in the main module. Nothing to query. if vers != "upgrade" && vers != "patch" { base.Errorf("go get %s: can't request explicit version of path in main module", arg) @@ -491,7 +491,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { if q.path == q.m.Path { wg.Add(1) go func(q *query) { - if hasPkg, err := modload.ModuleHasRootPackage(q.m); err != nil { + if hasPkg, err := modload.ModuleHasRootPackage(ctx, q.m); err != nil { base.Errorf("go get: %v", err) } else if !hasPkg { modOnlyMu.Lock() @@ -536,7 +536,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // Don't load packages if pkgPatterns is empty. Both // modload.ImportPathsQuiet and ModulePackages convert an empty list // of patterns to []string{"."}, which is not what we want. - matches = modload.ImportPathsQuiet(pkgPatterns, imports.AnyTags()) + matches = modload.ImportPathsQuiet(ctx, pkgPatterns, imports.AnyTags()) seenPkgs = make(map[string]bool) for i, match := range matches { arg := pkgGets[i] @@ -732,7 +732,7 @@ func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*quer q.m = module.Version{Path: q.path, Version: "none"} return } - m, err := getQuery(q.path, q.vers, q.prevM, q.forceModulePath) + m, err := getQuery(ctx, q.path, q.vers, q.prevM, q.forceModulePath) if err != nil { base.Errorf("go get %s: %v", q.arg, err) } @@ -790,7 +790,7 @@ func runQueries(ctx context.Context, cache map[querySpec]*query, queries []*quer // to determine the underlying module version being requested. // If forceModulePath is set, getQuery must interpret path // as a module path. -func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (module.Version, error) { +func getQuery(ctx context.Context, path, vers string, prevM module.Version, forceModulePath bool) (module.Version, error) { if (prevM.Version != "") != forceModulePath { // We resolve package patterns by calling QueryPattern, which does not // accept a previous version and therefore cannot take it into account for @@ -812,7 +812,7 @@ func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (mo } } - info, err := modload.Query(path, vers, prevM.Version, modload.Allowed) + info, err := modload.Query(ctx, path, vers, prevM.Version, modload.Allowed) if err == nil { if info.Version != vers && info.Version != prevM.Version { logOncef("go: %s %s => %s", path, vers, info.Version) @@ -838,7 +838,7 @@ func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (mo // If it turns out to only exist as a module, we can detect the resulting // PackageNotInModuleError and avoid a second round-trip through (potentially) // all of the configured proxies. - results, err := modload.QueryPattern(path, vers, modload.Allowed) + results, err := modload.QueryPattern(ctx, path, vers, modload.Allowed) if err != nil { // If the path doesn't contain a wildcard, check whether it was actually a // module path instead. If so, return that. @@ -994,7 +994,7 @@ func (u *upgrader) Upgrade(m module.Version) (module.Version, error) { // If we're querying "upgrade" or "patch", Query will compare the current // version against the chosen version and will return the current version // if it is newer. - info, err := modload.Query(m.Path, string(getU), m.Version, modload.Allowed) + info, err := modload.Query(context.TODO(), m.Path, string(getU), m.Version, modload.Allowed) if err != nil { // Report error but return m, to let version selection continue. // (Reporting the error will fail the command at the next base.ExitIfErrors.) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 5f8a2e7e05..a101681a1f 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -6,6 +6,7 @@ package modload import ( "bytes" + "context" "encoding/hex" "fmt" "internal/goroot" @@ -57,21 +58,21 @@ func PackageModuleInfo(pkgpath string) *modinfo.ModulePublic { if !ok { return nil } - return moduleInfo(m, true) + return moduleInfo(context.TODO(), m, true) } -func ModuleInfo(path string) *modinfo.ModulePublic { +func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { if !Enabled() { return nil } if i := strings.Index(path, "@"); i >= 0 { - return moduleInfo(module.Version{Path: path[:i], Version: path[i+1:]}, false) + return moduleInfo(ctx, module.Version{Path: path[:i], Version: path[i+1:]}, false) } for _, m := range BuildList() { if m.Path == path { - return moduleInfo(m, true) + return moduleInfo(ctx, m, true) } } @@ -84,12 +85,12 @@ func ModuleInfo(path string) *modinfo.ModulePublic { } // addUpdate fills in m.Update if an updated version is available. -func addUpdate(m *modinfo.ModulePublic) { +func addUpdate(ctx context.Context, m *modinfo.ModulePublic) { if m.Version == "" { return } - if info, err := Query(m.Path, "upgrade", m.Version, Allowed); err == nil && semver.Compare(info.Version, m.Version) > 0 { + if info, err := Query(ctx, m.Path, "upgrade", m.Version, Allowed); err == nil && semver.Compare(info.Version, m.Version) > 0 { m.Update = &modinfo.ModulePublic{ Path: m.Path, Version: info.Version, @@ -103,7 +104,7 @@ func addVersions(m *modinfo.ModulePublic) { m.Versions, _ = versions(m.Path) } -func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic { +func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modinfo.ModulePublic { if m == Target { info := &modinfo.ModulePublic{ Path: m.Path, @@ -132,7 +133,7 @@ func moduleInfo(m module.Version, fromBuildList bool) *modinfo.ModulePublic { // completeFromModCache fills in the extra fields in m using the module cache. completeFromModCache := func(m *modinfo.ModulePublic) { if m.Version != "" { - if q, err := Query(m.Path, m.Version, "", nil); err != nil { + if q, err := Query(ctx, m.Path, m.Version, "", nil); err != nil { m.Error = &modinfo.ModuleError{Err: err.Error()} } else { m.Version = q.Version diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 4d2bc805e2..5c51a79124 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -5,6 +5,7 @@ package modload import ( + "context" "errors" "fmt" "go/build" @@ -110,7 +111,7 @@ var _ load.ImportPathError = &AmbiguousImportError{} // Import returns an ImportMissingError as the error. // If Import can identify a module that could be added to supply the package, // the ImportMissingError records that module. -func Import(path string) (m module.Version, dir string, err error) { +func Import(ctx context.Context, path string) (m module.Version, dir string, err error) { if strings.Contains(path, "@") { return module.Version{}, "", fmt.Errorf("import path should not have @version") } @@ -165,7 +166,7 @@ func Import(path string) (m module.Version, dir string, err error) { // Avoid possibly downloading irrelevant modules. continue } - root, isLocal, err := fetch(m) + root, isLocal, err := fetch(ctx, m) if err != nil { // Report fetch error. // Note that we don't know for sure this module is necessary, @@ -248,7 +249,7 @@ func Import(path string) (m module.Version, dir string, err error) { return len(mods[i].Path) > len(mods[j].Path) }) for _, m := range mods { - root, isLocal, err := fetch(m) + root, isLocal, err := fetch(ctx, m) if err != nil { // Report fetch error as above. return module.Version{}, "", err @@ -285,7 +286,7 @@ func Import(path string) (m module.Version, dir string, err error) { fmt.Fprintf(os.Stderr, "go: finding module for package %s\n", path) - candidates, err := QueryPackage(path, "latest", Allowed) + candidates, err := QueryPackage(ctx, path, "latest", Allowed) if err != nil { if errors.Is(err, os.ErrNotExist) { // Return "cannot find module providing package […]" instead of whatever diff --git a/src/cmd/go/internal/modload/import_test.go b/src/cmd/go/internal/modload/import_test.go index accc60eecd..47ce89a084 100644 --- a/src/cmd/go/internal/modload/import_test.go +++ b/src/cmd/go/internal/modload/import_test.go @@ -5,6 +5,7 @@ package modload import ( + "context" "internal/testenv" "regexp" "strings" @@ -49,10 +50,12 @@ func TestImport(t *testing.T) { }(allowMissingModuleImports) AllowMissingModuleImports() + ctx := context.Background() + for _, tt := range importTests { t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) { // Note that there is no build list, so Import should always fail. - m, dir, err := Import(tt.path) + m, dir, err := Import(ctx, tt.path) if err == nil { t.Fatalf("Import(%q) = %v, %v, nil; expected error", tt.path, m, dir) } diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index fff060e665..93027c44c4 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -6,6 +6,7 @@ package modload import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -332,7 +333,7 @@ func die() { // // As a side-effect, InitMod sets a default for cfg.BuildMod if it does not // already have an explicit value. -func InitMod() { +func InitMod(ctx context.Context) { if len(buildList) > 0 { return } @@ -359,7 +360,7 @@ func InitMod() { } var fixed bool - f, err := modfile.Parse(gomod, data, fixVersion(&fixed)) + f, err := modfile.Parse(gomod, data, fixVersion(ctx, &fixed)) if err != nil { // Errors returned by modfile.Parse begin with file:line. base.Fatalf("go: errors parsing go.mod:\n%s\n", err) @@ -397,7 +398,7 @@ func InitMod() { // and does nothing for versions that already appear to be canonical. // // The VersionFixer sets 'fixed' if it ever returns a non-canonical version. -func fixVersion(fixed *bool) modfile.VersionFixer { +func fixVersion(ctx context.Context, fixed *bool) modfile.VersionFixer { return func(path, vers string) (resolved string, err error) { defer func() { if err == nil && resolved != vers { @@ -429,7 +430,7 @@ func fixVersion(fixed *bool) modfile.VersionFixer { } } - info, err := Query(path, vers, "", nil) + info, err := Query(ctx, path, vers, "", nil) if err != nil { return "", err } diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 8db4d64706..7bf4e86c8d 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -31,7 +31,7 @@ func ListModules(ctx context.Context, args []string, listU, listVersions bool) [ sem <- token{} go func() { if listU { - addUpdate(m) + addUpdate(ctx, m) } if listVersions { addVersions(m) @@ -57,7 +57,7 @@ func ListModules(ctx context.Context, args []string, listU, listVersions bool) [ func listModules(ctx context.Context, args []string, listVersions bool) []*modinfo.ModulePublic { LoadBuildList(ctx) if len(args) == 0 { - return []*modinfo.ModulePublic{moduleInfo(buildList[0], true)} + return []*modinfo.ModulePublic{moduleInfo(ctx, buildList[0], true)} } var mods []*modinfo.ModulePublic @@ -83,7 +83,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin } } - info, err := Query(path, vers, current, nil) + info, err := Query(ctx, path, vers, current, nil) if err != nil { mods = append(mods, &modinfo.ModulePublic{ Path: path, @@ -92,7 +92,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin }) continue } - mods = append(mods, moduleInfo(module.Version{Path: path, Version: info.Version}, false)) + mods = append(mods, moduleInfo(ctx, module.Version{Path: path, Version: info.Version}, false)) continue } @@ -117,7 +117,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin matched = true if !matchedBuildList[i] { matchedBuildList[i] = true - mods = append(mods, moduleInfo(m, true)) + mods = append(mods, moduleInfo(ctx, m, true)) } } } @@ -127,9 +127,9 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin // Don't make the user provide an explicit '@latest' when they're // explicitly asking what the available versions are. // Instead, resolve the module, even if it isn't an existing dependency. - info, err := Query(arg, "latest", "", nil) + info, err := Query(ctx, arg, "latest", "", nil) if err == nil { - mods = append(mods, moduleInfo(module.Version{Path: arg, Version: info.Version}, false)) + mods = append(mods, moduleInfo(ctx, module.Version{Path: arg, Version: info.Version}, false)) } else { mods = append(mods, &modinfo.ModulePublic{ Path: arg, diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 8190009b23..686d491219 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -52,8 +52,8 @@ var loaded *loader // ImportPaths returns the set of packages matching the args (patterns), // on the target platform. Modules may be added to the build list // to satisfy new imports. -func ImportPaths(patterns []string) []*search.Match { - matches := ImportPathsQuiet(patterns, imports.Tags()) +func ImportPaths(ctx context.Context, patterns []string) []*search.Match { + matches := ImportPathsQuiet(ctx, patterns, imports.Tags()) search.WarnUnmatched(matches) return matches } @@ -62,7 +62,7 @@ func ImportPaths(patterns []string) []*search.Match { // no matches. It also lets the caller specify a set of build tags to match // packages. The build tags should typically be imports.Tags() or // imports.AnyTags(); a nil map has no special meaning. -func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { +func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bool) []*search.Match { updateMatches := func(matches []*search.Match, iterating bool) { for _, m := range matches { switch { @@ -103,7 +103,7 @@ func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { case strings.Contains(m.Pattern(), "..."): m.Errs = m.Errs[:0] - matchPackages(m, loaded.tags, includeStd, buildList) + matchPackages(ctx, m, loaded.tags, includeStd, buildList) case m.Pattern() == "all": loaded.testAll = true @@ -111,7 +111,7 @@ func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { // Enumerate the packages in the main module. // We'll load the dependencies as we find them. m.Errs = m.Errs[:0] - matchPackages(m, loaded.tags, omitStd, []module.Version{Target}) + matchPackages(ctx, m, loaded.tags, omitStd, []module.Version{Target}) } else { // Starting with the packages in the main module, // enumerate the full list of "all". @@ -129,7 +129,7 @@ func ImportPathsQuiet(patterns []string, tags map[string]bool) []*search.Match { } } - InitMod() + InitMod(ctx) var matches []*search.Match for _, pattern := range search.CleanPatterns(patterns) { @@ -338,8 +338,8 @@ func pathInModuleCache(dir string) string { // ImportFromFiles adds modules to the build list as needed // to satisfy the imports in the named Go source files. -func ImportFromFiles(gofiles []string) { - InitMod() +func ImportFromFiles(ctx context.Context, gofiles []string) { + InitMod(ctx) tags := imports.Tags() imports, testImports, err := imports.ScanFiles(gofiles, tags) @@ -391,7 +391,7 @@ func DirImportPath(dir string) string { func LoadBuildList(ctx context.Context) []module.Version { ctx, span := trace.StartSpan(ctx, "LoadBuildList") defer span.Done() - InitMod() + InitMod(ctx) ReloadBuildList() WriteGoMod() return buildList @@ -409,20 +409,20 @@ func ReloadBuildList() []module.Version { // It adds modules to the build list as needed to satisfy new imports. // This set is useful for deciding whether a particular import is needed // anywhere in a module. -func LoadALL() []string { - return loadAll(true) +func LoadALL(ctx context.Context) []string { + return loadAll(ctx, true) } // LoadVendor is like LoadALL but only follows test dependencies // for tests in the main module. Tests in dependency modules are // ignored completely. // This set is useful for identifying the which packages to include in a vendor directory. -func LoadVendor() []string { - return loadAll(false) +func LoadVendor(ctx context.Context) []string { + return loadAll(ctx, false) } -func loadAll(testAll bool) []string { - InitMod() +func loadAll(ctx context.Context, testAll bool) []string { + InitMod(ctx) loaded = newLoader(imports.AnyTags()) loaded.isALL = true @@ -430,7 +430,7 @@ func loadAll(testAll bool) []string { if !testAll { loaded.testRoots = true } - all := TargetPackages("...") + all := TargetPackages(ctx, "...") loaded.load(func() []string { return all.Pkgs }) checkMultiplePaths() WriteGoMod() @@ -453,13 +453,13 @@ func loadAll(testAll bool) []string { // TargetPackages returns the list of packages in the target (top-level) module // matching pattern, which may be relative to the working directory, under all // build tag settings. -func TargetPackages(pattern string) *search.Match { +func TargetPackages(ctx context.Context, pattern string) *search.Match { // TargetPackages is relative to the main module, so ensure that the main // module is a thing that can contain packages. ModRoot() m := search.NewMatch(pattern) - matchPackages(m, imports.AnyTags(), omitStd, []module.Version{Target}) + matchPackages(ctx, m, imports.AnyTags(), omitStd, []module.Version{Target}) return m } @@ -817,7 +817,8 @@ func (ld *loader) doPkg(item interface{}) { return } - pkg.mod, pkg.dir, pkg.err = Import(pkg.path) + // TODO(matloob): Handle TODO context. This needs to be threaded through Do. + pkg.mod, pkg.dir, pkg.err = Import(context.TODO(), pkg.path) if pkg.dir == "" { return } diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 5dd009d31d..67eb2c2e19 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -5,6 +5,7 @@ package modload import ( + "context" "errors" "fmt" "os" @@ -224,7 +225,7 @@ func (*mvsReqs) next(m module.Version) (module.Version, error) { // // The isLocal return value reports whether the replacement, // if any, is local to the filesystem. -func fetch(mod module.Version) (dir string, isLocal bool, err error) { +func fetch(ctx context.Context, mod module.Version) (dir string, isLocal bool, err error) { if mod == Target { return ModRoot(), true, nil } @@ -254,6 +255,6 @@ func fetch(mod module.Version) (dir string, isLocal bool, err error) { mod = r } - dir, err = modfetch.Download(mod) + dir, err = modfetch.Download(ctx, mod) return dir, false, err } diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index acc886bf21..39a813447c 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -5,6 +5,7 @@ package modload import ( + "context" "errors" "fmt" "os" @@ -55,10 +56,10 @@ import ( // // If path is the path of the main module and the query is "latest", // Query returns Target.Version as the version. -func Query(path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { +func Query(ctx context.Context, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { var info *modfetch.RevInfo err := modfetch.TryProxies(func(proxy string) (err error) { - info, err = queryProxy(proxy, path, query, current, allowed) + info, err = queryProxy(ctx, proxy, path, query, current, allowed) return err }) return info, err @@ -75,7 +76,7 @@ func (queryDisabledError) Error() string { return fmt.Sprintf("cannot query module due to -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason) } -func queryProxy(proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { +func queryProxy(ctx context.Context, proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { if current != "" && !semver.IsValid(current) { return nil, fmt.Errorf("invalid previous version %q", current) } @@ -243,7 +244,7 @@ func queryProxy(proxy, path, query, current string, allowed func(module.Version) if err != nil { return nil, err } - releases, prereleases, err := filterVersions(path, versions, ok, preferIncompatible) + releases, prereleases, err := filterVersions(ctx, path, versions, ok, preferIncompatible) if err != nil { return nil, err } @@ -327,7 +328,7 @@ func matchSemverPrefix(p, v string) bool { // 1. versions that do not satisfy the 'ok' predicate, and // 2. "+incompatible" versions, if a compatible one satisfies the predicate // and the incompatible version is not preferred. -func filterVersions(path string, versions []string, ok func(module.Version) bool, preferIncompatible bool) (releases, prereleases []string, err error) { +func filterVersions(ctx context.Context, path string, versions []string, ok func(module.Version) bool, preferIncompatible bool) (releases, prereleases []string, err error) { var lastCompatible string for _, v := range versions { if !ok(module.Version{Path: path, Version: v}) { @@ -343,7 +344,7 @@ func filterVersions(path string, versions []string, ok func(module.Version) bool // https://golang.org/issue/34165.) Note that we even prefer a // compatible pre-release over an incompatible release. - ok, err := versionHasGoMod(module.Version{Path: path, Version: lastCompatible}) + ok, err := versionHasGoMod(ctx, module.Version{Path: path, Version: lastCompatible}) if err != nil { return nil, nil, err } @@ -380,12 +381,12 @@ type QueryResult struct { // If the package is in the main module, QueryPackage considers only the main // module and only the version "latest", without checking for other possible // modules. -func QueryPackage(path, query string, allowed func(module.Version) bool) ([]QueryResult, error) { +func QueryPackage(ctx context.Context, path, query string, allowed func(module.Version) bool) ([]QueryResult, error) { m := search.NewMatch(path) if m.IsLocal() || !m.IsLiteral() { return nil, fmt.Errorf("pattern %s is not an importable package", path) } - return QueryPattern(path, query, allowed) + return QueryPattern(ctx, path, query, allowed) } // QueryPattern looks up the module(s) containing at least one package matching @@ -401,7 +402,7 @@ func QueryPackage(path, query string, allowed func(module.Version) bool) ([]Quer // If any matching package is in the main module, QueryPattern considers only // the main module and only the version "latest", without checking for other // possible modules. -func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { +func QueryPattern(ctx context.Context, pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { base := pattern firstError := func(m *search.Match) error { @@ -417,7 +418,7 @@ func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]Q base = pathpkg.Dir(pattern[:i+3]) match = func(mod module.Version, root string, isLocal bool) *search.Match { m := search.NewMatch(pattern) - matchPackages(m, imports.AnyTags(), omitStd, []module.Version{mod}) + matchPackages(ctx, m, imports.AnyTags(), omitStd, []module.Version{mod}) return m } } else { @@ -472,12 +473,12 @@ func QueryPattern(pattern, query string, allowed func(module.Version) bool) ([]Q queryModule := func(path string) (r QueryResult, err error) { current := findCurrentVersion(path) r.Mod.Path = path - r.Rev, err = queryProxy(proxy, path, query, current, allowed) + r.Rev, err = queryProxy(ctx, proxy, path, query, current, allowed) if err != nil { return r, err } r.Mod.Version = r.Rev.Version - root, isLocal, err := fetch(r.Mod) + root, isLocal, err := fetch(ctx, r.Mod) if err != nil { return r, err } @@ -698,8 +699,8 @@ func (e *PackageNotInModuleError) ImportPath() string { } // ModuleHasRootPackage returns whether module m contains a package m.Path. -func ModuleHasRootPackage(m module.Version) (bool, error) { - root, isLocal, err := fetch(m) +func ModuleHasRootPackage(ctx context.Context, m module.Version) (bool, error) { + root, isLocal, err := fetch(ctx, m) if err != nil { return false, err } @@ -707,8 +708,8 @@ func ModuleHasRootPackage(m module.Version) (bool, error) { return ok, err } -func versionHasGoMod(m module.Version) (bool, error) { - root, _, err := fetch(m) +func versionHasGoMod(ctx context.Context, m module.Version) (bool, error) { + root, _, err := fetch(ctx, m) if err != nil { return false, err } diff --git a/src/cmd/go/internal/modload/query_test.go b/src/cmd/go/internal/modload/query_test.go index 247e4c40d2..77080e9b5b 100644 --- a/src/cmd/go/internal/modload/query_test.go +++ b/src/cmd/go/internal/modload/query_test.go @@ -5,6 +5,7 @@ package modload import ( + "context" "internal/testenv" "io/ioutil" "log" @@ -179,6 +180,8 @@ func TestQuery(t *testing.T) { testenv.MustHaveExternalNetwork(t) testenv.MustHaveExecPath(t, "git") + ctx := context.Background() + for _, tt := range queryTests { allow := tt.allow if allow == "" { @@ -192,7 +195,7 @@ func TestQuery(t *testing.T) { t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.query+"/"+tt.current+"/"+allow, func(t *testing.T) { t.Parallel() - info, err := Query(tt.path, tt.query, tt.current, allowed) + info, err := Query(ctx, tt.path, tt.query, tt.current, allowed) if tt.err != "" { if err == nil { t.Errorf("Query(%q, %q, %v) = %v, want error %q", tt.path, tt.query, allow, info.Version, tt.err) diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index c28e7c0c1e..a9bee0af4e 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -5,6 +5,7 @@ package modload import ( + "context" "fmt" "os" "path/filepath" @@ -27,7 +28,7 @@ const ( // matchPackages is like m.MatchPackages, but uses a local variable (rather than // a global) for tags, can include or exclude packages in the standard library, // and is restricted to the given list of modules. -func matchPackages(m *search.Match, tags map[string]bool, filter stdFilter, modules []module.Version) { +func matchPackages(ctx context.Context, m *search.Match, tags map[string]bool, filter stdFilter, modules []module.Version) { m.Pkgs = []string{} isMatch := func(string) bool { return true } @@ -153,7 +154,7 @@ func matchPackages(m *search.Match, tags map[string]bool, filter stdFilter, modu isLocal = true } else { var err error - root, isLocal, err = fetch(mod) + root, isLocal, err = fetch(ctx, mod) if err != nil { m.AddError(err) continue diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index deec5106ff..99578b244c 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -77,7 +77,7 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go run: cannot run *_test.go files (%s)", file) } } - p = load.GoFilesPackage(files) + p = load.GoFilesPackage(ctx, files) } else if len(args) > 0 && !strings.HasPrefix(args[0], "-") { pkgs := load.PackagesAndErrors(ctx, args[:1]) if len(pkgs) == 0 { diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 9cef8cf89c..3aee6939d2 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -702,7 +702,7 @@ func runTest(ctx context.Context, cmd *base.Command, args []string) { } // Select for coverage all dependencies matching the testCoverPaths patterns. - for _, p := range load.TestPackageList(pkgs) { + for _, p := range load.TestPackageList(ctx, pkgs) { haveMatch := false for i := range testCoverPaths { if match[i](p) { diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 681ecd7646..d975c36306 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2900,7 +2900,7 @@ func (b *Builder) swigDoIntSize(objdir string) (intsize string, err error) { } srcs := []string{src} - p := load.GoFilesPackage(srcs) + p := load.GoFilesPackage(context.TODO(), srcs) if _, _, e := BuildToolchain.gc(b, &Action{Mode: "swigDoIntSize", Package: p, Objdir: objdir}, "", nil, "", false, srcs); e != nil { return "32", nil -- GitLab From 822dca4b383611335385ef05c2882d23f6f89d88 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 15 Jul 2020 17:38:36 -0400 Subject: [PATCH 0282/1792] cmd/go: add tracing for querying and downloading from the proxy This CL adds tracing spans for modload.queryPattern, modload.queryProxy, modload.QueryPattern, modload.QueryPattern.queryModule, modload.queryPrefixModules and modfetch.Download. Updates #38714 Change-Id: I91af3f022a6e18ab8d9c1d9b0ccf4928b6c236bd Reviewed-on: https://go-review.googlesource.com/c/go/+/249022 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modcmd/download.go | 2 +- src/cmd/go/internal/modfetch/fetch.go | 21 +++++++++++++----- .../modfetch/zip_sum_test/zip_sum_test.go | 3 ++- src/cmd/go/internal/modload/query.go | 22 +++++++++++++++---- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 6c4ec572fc..d4c161fca1 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -120,7 +120,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { return } mod := module.Version{Path: m.Path, Version: m.Version} - m.Zip, err = modfetch.DownloadZip(mod) + m.Zip, err = modfetch.DownloadZip(ctx, mod) if err != nil { m.Error = err.Error() return diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index 6606612658..e29eb0a942 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -24,6 +24,7 @@ import ( "cmd/go/internal/par" "cmd/go/internal/renameio" "cmd/go/internal/robustio" + "cmd/go/internal/trace" "golang.org/x/mod/module" "golang.org/x/mod/sumdb/dirhash" @@ -48,7 +49,7 @@ func Download(ctx context.Context, mod module.Version) (dir string, err error) { err error } c := downloadCache.Do(mod, func() interface{} { - dir, err := download(mod) + dir, err := download(ctx, mod) if err != nil { return cached{"", err} } @@ -58,7 +59,10 @@ func Download(ctx context.Context, mod module.Version) (dir string, err error) { return c.dir, c.err } -func download(mod module.Version) (dir string, err error) { +func download(ctx context.Context, mod module.Version) (dir string, err error) { + ctx, span := trace.StartSpan(ctx, "modfetch.download "+mod.String()) + defer span.Done() + // If the directory exists, and no .partial file exists, the module has // already been completely extracted. .partial files may be created when a // module zip directory is extracted in place instead of being extracted to a @@ -73,7 +77,7 @@ func download(mod module.Version) (dir string, err error) { // To avoid cluttering the cache with extraneous files, // DownloadZip uses the same lockfile as Download. // Invoke DownloadZip before locking the file. - zipfile, err := DownloadZip(mod) + zipfile, err := DownloadZip(ctx, mod) if err != nil { return "", err } @@ -143,6 +147,7 @@ func download(mod module.Version) (dir string, err error) { return "", err } + ctx, span = trace.StartSpan(ctx, "unzip "+zipfile) if unzipInPlace { if err := ioutil.WriteFile(partialPath, nil, 0666); err != nil { return "", err @@ -172,6 +177,7 @@ func download(mod module.Version) (dir string, err error) { return "", err } } + defer span.Done() if !cfg.ModCacheRW { // Make dir read-only only *after* renaming it. @@ -196,7 +202,7 @@ var downloadZipCache par.Cache // DownloadZip downloads the specific module version to the // local zip cache and returns the name of the zip file. -func DownloadZip(mod module.Version) (zipfile string, err error) { +func DownloadZip(ctx context.Context, mod module.Version) (zipfile string, err error) { // The par.Cache here avoids duplicate work. type cached struct { zipfile string @@ -231,7 +237,7 @@ func DownloadZip(mod module.Version) (zipfile string, err error) { if err := os.MkdirAll(filepath.Dir(zipfile), 0777); err != nil { return cached{"", err} } - if err := downloadZip(mod, zipfile); err != nil { + if err := downloadZip(ctx, mod, zipfile); err != nil { return cached{"", err} } return cached{zipfile, nil} @@ -239,7 +245,10 @@ func DownloadZip(mod module.Version) (zipfile string, err error) { return c.zipfile, c.err } -func downloadZip(mod module.Version, zipfile string) (err error) { +func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err error) { + ctx, span := trace.StartSpan(ctx, "modfetch.downloadZip "+zipfile) + defer span.Done() + // Clean up any remaining tempfiles from previous runs. // This is only safe to do because the lock file ensures that their // writers are no longer active. 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 eac9b32fa8..82398ebfed 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 @@ -16,6 +16,7 @@ package zip_sum_test import ( + "context" "crypto/sha256" "encoding/csv" "encoding/hex" @@ -119,7 +120,7 @@ func TestZipSums(t *testing.T) { 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(test.m) + zipPath, err := modfetch.DownloadZip(context.Background(), test.m) if err != nil { if *updateTestData { t.Logf("%s: could not download module: %s (will remove from testdata)", test.m, err) diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 39a813447c..e82eb1506f 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -19,6 +19,7 @@ import ( "cmd/go/internal/modfetch" "cmd/go/internal/search" "cmd/go/internal/str" + "cmd/go/internal/trace" "golang.org/x/mod/module" "golang.org/x/mod/semver" @@ -77,6 +78,9 @@ func (queryDisabledError) Error() string { } func queryProxy(ctx context.Context, proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { + ctx, span := trace.StartSpan(ctx, "modload.queryProxy "+path+" "+query) + defer span.Done() + if current != "" && !semver.IsValid(current) { return nil, fmt.Errorf("invalid previous version %q", current) } @@ -403,6 +407,9 @@ func QueryPackage(ctx context.Context, path, query string, allowed func(module.V // the main module and only the version "latest", without checking for other // possible modules. func QueryPattern(ctx context.Context, pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { + ctx, span := trace.StartSpan(ctx, "modload.QueryPattern "+pattern+" "+query) + defer span.Done() + base := pattern firstError := func(m *search.Match) error { @@ -470,7 +477,10 @@ func QueryPattern(ctx context.Context, pattern, query string, allowed func(modul } err := modfetch.TryProxies(func(proxy string) error { - queryModule := func(path string) (r QueryResult, err error) { + queryModule := func(ctx context.Context, path string) (r QueryResult, err error) { + ctx, span := trace.StartSpan(ctx, "modload.QueryPattern.queryModule ["+proxy+"] "+path) + defer span.Done() + current := findCurrentVersion(path) r.Mod.Path = path r.Rev, err = queryProxy(ctx, proxy, path, query, current, allowed) @@ -499,7 +509,7 @@ func QueryPattern(ctx context.Context, pattern, query string, allowed func(modul } var err error - results, err = queryPrefixModules(candidateModules, queryModule) + results, err = queryPrefixModules(ctx, candidateModules, queryModule) return err }) @@ -543,7 +553,10 @@ type prefixResult struct { err error } -func queryPrefixModules(candidateModules []string, queryModule func(path string) (QueryResult, error)) (found []QueryResult, err error) { +func queryPrefixModules(ctx context.Context, candidateModules []string, queryModule func(ctx context.Context, path string) (QueryResult, error)) (found []QueryResult, err error) { + ctx, span := trace.StartSpan(ctx, "modload.queryPrefixModules") + defer span.Done() + // If the path we're attempting is not in the module cache and we don't have a // fetch result cached either, we'll end up making a (potentially slow) // request to the proxy or (often even slower) the origin server. @@ -556,8 +569,9 @@ func queryPrefixModules(candidateModules []string, queryModule func(path string) var wg sync.WaitGroup wg.Add(len(candidateModules)) for i, p := range candidateModules { + ctx := trace.StartGoroutine(ctx) go func(p string, r *result) { - r.QueryResult, r.err = queryModule(p) + r.QueryResult, r.err = queryModule(ctx, p) wg.Done() }(p, &results[i]) } -- GitLab From 268dd2e5a7a8919bd26f0a59c847f8268a2437d1 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Mon, 10 Aug 2020 08:01:21 -0700 Subject: [PATCH 0283/1792] cmd/internal/obj: fix inline marker issue on s390x The optimization that replaces inline markers with pre-existing instructions assumes that 'Prog' values produced by the compiler are still reachable after the assembler has run. This was not true on s390x where the assembler was removing NOP instructions from the linked list of 'Prog' values. This led to broken inlining data which in turn caused an infinite loop in the runtime traceback code. Fix this by stopping the s390x assembler backend removing NOP values. It does not make any difference to the output of the assembler because NOP instructions are 0 bytes long anyway. Fixes #40473. Change-Id: I9b97c494afaae2d5ed6bca4cd428b4132b5f8133 Reviewed-on: https://go-review.googlesource.com/c/go/+/249448 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/internal/obj/pcln.go | 15 +++++++++++++++ src/cmd/internal/obj/s390x/objz.go | 11 ----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/cmd/internal/obj/pcln.go b/src/cmd/internal/obj/pcln.go index 1f7ccf47ef..bffeda041d 100644 --- a/src/cmd/internal/obj/pcln.go +++ b/src/cmd/internal/obj/pcln.go @@ -278,6 +278,21 @@ func linkpcln(ctxt *Link, cursym *LSym) { funcpctab(ctxt, &pcln.Pcfile, cursym, "pctofile", pctofileline, pcln) funcpctab(ctxt, &pcln.Pcline, cursym, "pctoline", pctofileline, nil) + // Check that all the Progs used as inline markers are still reachable. + // See issue #40473. + inlMarkProgs := make(map[*Prog]struct{}, len(cursym.Func.InlMarks)) + for _, inlMark := range cursym.Func.InlMarks { + inlMarkProgs[inlMark.p] = struct{}{} + } + for p := cursym.Func.Text; p != nil; p = p.Link { + if _, ok := inlMarkProgs[p]; ok { + delete(inlMarkProgs, p) + } + } + if len(inlMarkProgs) > 0 { + ctxt.Diag("one or more instructions used as inline markers are no longer reachable") + } + pcinlineState := new(pcinlineState) funcpctab(ctxt, &pcln.Pcinline, cursym, "pctoinline", pcinlineState.pctoinline, nil) for _, inlMark := range cursym.Func.InlMarks { diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go index b14dc810fa..ef6335d849 100644 --- a/src/cmd/internal/obj/s390x/objz.go +++ b/src/cmd/internal/obj/s390x/objz.go @@ -283,17 +283,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ACMPUBNE: q = p p.Mark |= BRANCH - if p.Pcond != nil { - q := p.Pcond - for q.As == obj.ANOP { - q = q.Link - p.Pcond = q - } - } - - case obj.ANOP: - q.Link = p.Link /* q is non-nop */ - p.Link.Mark |= p.Mark default: q = p -- GitLab From e94544cf012535da6b3c9e735bc4026e2db1c99c Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 19 Aug 2020 21:39:12 -0700 Subject: [PATCH 0284/1792] cmd/compile: fix checkptr handling of &^ checkptr has code to recognize &^ expressions, but it didn't take into account that "p &^ x" gets rewritten to "p & ^x" during walk, which resulted in false positive diagnostics. This CL changes walkexpr to mark OANDNOT expressions with Implicit when they're rewritten to OAND, so that walkCheckPtrArithmetic can still recognize them later. It would be slightly more idiomatic to instead mark the OBITNOT expression as Implicit (as it's a compiler-generated Node), but the OBITNOT expression might get constant folded. It's not worth the extra complexity/subtlety of relying on n.Right.Orig, so we set Implicit on the OAND node instead. To atone for this transgression, I add documentation for nodeImplicit. Fixes #40917. Change-Id: I386304171ad299c530e151e5924f179e9a5fd5b8 Reviewed-on: https://go-review.googlesource.com/c/go/+/249477 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall Reviewed-by: Cuong Manh Le --- src/cmd/compile/internal/gc/syntax.go | 4 ++-- src/cmd/compile/internal/gc/walk.go | 7 ++++++- src/runtime/checkptr_test.go | 1 + src/runtime/testdata/testprog/checkptr.go | 8 ++++++++ test/fixedbugs/issue40917.go | 23 +++++++++++++++++++++++ 5 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 test/fixedbugs/issue40917.go diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index b658410c53..47e5e59156 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -141,8 +141,8 @@ const ( nodeInitorder, _ // tracks state during init1; two bits _, _ // second nodeInitorder bit _, nodeHasBreak - _, nodeNoInline // used internally by inliner to indicate that a function call should not be inlined; set for OCALLFUNC and OCALLMETH only - _, nodeImplicit + _, nodeNoInline // used internally by inliner to indicate that a function call should not be inlined; set for OCALLFUNC and OCALLMETH only + _, nodeImplicit // implicit OADDR or ODEREF; ++/-- statement represented as OASOP; or ANDNOT lowered to OAND _, nodeIsDDD // is the argument variadic _, nodeDiag // already printed error about this _, nodeColas // OAS resulting from := diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 8ae3d9a5c7..74ed0411bd 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -973,6 +973,7 @@ opswitch: case OANDNOT: n.Left = walkexpr(n.Left, init) n.Op = OAND + n.SetImplicit(true) // for walkCheckPtrArithmetic n.Right = nod(OBITNOT, n.Right, nil) n.Right = typecheck(n.Right, ctxExpr) n.Right = walkexpr(n.Right, init) @@ -4003,8 +4004,12 @@ func walkCheckPtrArithmetic(n *Node, init *Nodes) *Node { case OADD: walk(n.Left) walk(n.Right) - case OSUB, OANDNOT: + case OSUB: walk(n.Left) + case OAND: + if n.Implicit() { // was OANDNOT + walk(n.Left) + } case OCONVNOP: if n.Left.Type.Etype == TUNSAFEPTR { n.Left = cheapexpr(n.Left, init) diff --git a/src/runtime/checkptr_test.go b/src/runtime/checkptr_test.go index 8ab8a4937c..194cc1243a 100644 --- a/src/runtime/checkptr_test.go +++ b/src/runtime/checkptr_test.go @@ -27,6 +27,7 @@ func TestCheckPtr(t *testing.T) { {"CheckPtrAlignmentPtr", "fatal error: checkptr: misaligned pointer conversion\n"}, {"CheckPtrAlignmentNoPtr", ""}, {"CheckPtrArithmetic", "fatal error: checkptr: pointer arithmetic result points to invalid allocation\n"}, + {"CheckPtrArithmetic2", "fatal error: checkptr: pointer arithmetic result points to invalid allocation\n"}, {"CheckPtrSize", "fatal error: checkptr: converted pointer straddles multiple allocations\n"}, {"CheckPtrSmall", "fatal error: checkptr: pointer arithmetic computed bad pointer value\n"}, } diff --git a/src/runtime/testdata/testprog/checkptr.go b/src/runtime/testdata/testprog/checkptr.go index 45e6fb1aa5..e0a2794f4c 100644 --- a/src/runtime/testdata/testprog/checkptr.go +++ b/src/runtime/testdata/testprog/checkptr.go @@ -10,6 +10,7 @@ func init() { register("CheckPtrAlignmentNoPtr", CheckPtrAlignmentNoPtr) register("CheckPtrAlignmentPtr", CheckPtrAlignmentPtr) register("CheckPtrArithmetic", CheckPtrArithmetic) + register("CheckPtrArithmetic2", CheckPtrArithmetic2) register("CheckPtrSize", CheckPtrSize) register("CheckPtrSmall", CheckPtrSmall) } @@ -32,6 +33,13 @@ func CheckPtrArithmetic() { sink2 = (*int)(unsafe.Pointer(i)) } +func CheckPtrArithmetic2() { + var x [2]int64 + p := unsafe.Pointer(&x[1]) + var one uintptr = 1 + sink2 = unsafe.Pointer(uintptr(p) & ^one) +} + func CheckPtrSize() { p := new(int64) sink2 = p diff --git a/test/fixedbugs/issue40917.go b/test/fixedbugs/issue40917.go new file mode 100644 index 0000000000..2128be5eca --- /dev/null +++ b/test/fixedbugs/issue40917.go @@ -0,0 +1,23 @@ +// run -gcflags=-d=checkptr + +// 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 main + +import "unsafe" + +func main() { + var x [2]uint64 + a := unsafe.Pointer(&x[1]) + + b := a + b = unsafe.Pointer(uintptr(b) + 2) + b = unsafe.Pointer(uintptr(b) - 1) + b = unsafe.Pointer(uintptr(b) &^ 1) + + if a != b { + panic("pointer arithmetic failed") + } +} -- GitLab From cbc0a7906cfb4c82f850d35ffdb7eb0d674cc9b1 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 20 Aug 2020 16:48:21 -0700 Subject: [PATCH 0285/1792] go/types: update flag documentation for gotype command The documentation refers to a non longer existing flag (-seq). Remove those references. Change-Id: I480b6259f9199b47761dc655a90911eabfe07427 Reviewed-on: https://go-review.googlesource.com/c/go/+/249738 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/go/types/gotype.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/go/types/gotype.go b/src/go/types/gotype.go index 19dd702c45..eacf68f52f 100644 --- a/src/go/types/gotype.go +++ b/src/go/types/gotype.go @@ -48,9 +48,9 @@ The flags are: Flags controlling additional output: -ast - print AST (forces -seq) + print AST -trace - print parse trace (forces -seq) + print parse trace -comments parse comments (ignored unless -ast or -trace is provided) -panic @@ -104,8 +104,8 @@ var ( compiler = flag.String("c", "source", "compiler used for installed packages (gc, gccgo, or source)") // additional output control - printAST = flag.Bool("ast", false, "print AST (forces -seq)") - printTrace = flag.Bool("trace", false, "print parse trace (forces -seq)") + printAST = flag.Bool("ast", false, "print AST") + printTrace = flag.Bool("trace", false, "print parse trace") parseComments = flag.Bool("comments", false, "parse comments (ignored unless -ast or -trace is provided)") panicOnError = flag.Bool("panic", false, "panic on first error") ) -- GitLab From 454300a617b35a417e7595ff93c6e2e059fe1374 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Fri, 21 Aug 2020 11:11:32 +0800 Subject: [PATCH 0286/1792] hash/maphash: adding benchmarks for maphash goos: linux goarch: arm64 pkg: hash/maphash BenchmarkHash8Bytes BenchmarkHash8Bytes 22568919 46.0 ns/op 173.80 MB/s BenchmarkHash320Bytes BenchmarkHash320Bytes 5243858 230 ns/op 1393.30 MB/s BenchmarkHash1K BenchmarkHash1K 1755870 660 ns/op 1550.60 MB/s BenchmarkHash8K BenchmarkHash8K 225688 5313 ns/op 1541.90 MB/s PASS ok hash/maphash 6.465s Change-Id: I5a909042a542135ebc47d639fea02dc46c900c1c Reviewed-on: https://go-review.googlesource.com/c/go/+/249079 Run-TryBot: Meng Zhuo Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/hash/maphash/maphash_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/hash/maphash/maphash_test.go b/src/hash/maphash/maphash_test.go index caea43a8c8..daf6eb4786 100644 --- a/src/hash/maphash/maphash_test.go +++ b/src/hash/maphash/maphash_test.go @@ -165,3 +165,32 @@ func TestSeedFromReset(t *testing.T) { // Make sure a Hash implements the hash.Hash and hash.Hash64 interfaces. var _ hash.Hash = &Hash{} var _ hash.Hash64 = &Hash{} + +func benchmarkSize(b *testing.B, size int) { + h := &Hash{} + buf := make([]byte, size) + b.SetBytes(int64(size)) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + h.Reset() + h.Write(buf) + h.Sum64() + } +} + +func BenchmarkHash8Bytes(b *testing.B) { + benchmarkSize(b, 8) +} + +func BenchmarkHash320Bytes(b *testing.B) { + benchmarkSize(b, 320) +} + +func BenchmarkHash1K(b *testing.B) { + benchmarkSize(b, 1024) +} + +func BenchmarkHash8K(b *testing.B) { + benchmarkSize(b, 8192) +} -- GitLab From 8535008765b4fcd5c7dc3fb2b73a856af4d51f9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=81owicki?= Date: Mon, 11 May 2020 22:57:26 +0100 Subject: [PATCH 0287/1792] cmd/go: clarify error for invalid proxy responses Add information that error comes from parsing module proxy responses. Fixes #38680 Change-Id: Ic318b9cdbca789c1b0d983e083e692a914892fbd Reviewed-on: https://go-review.googlesource.com/c/go/+/233437 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modfetch/proxy.go | 13 +++++++------ src/cmd/go/proxy_test.go | 6 ++++++ src/cmd/go/testdata/script/mod_proxy_invalid.txt | 8 ++++++++ src/cmd/go/testdata/script/mod_query_empty.txt | 2 +- 4 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_proxy_invalid.txt diff --git a/src/cmd/go/internal/modfetch/proxy.go b/src/cmd/go/internal/modfetch/proxy.go index 1c35d0b99b..4ac26650a9 100644 --- a/src/cmd/go/internal/modfetch/proxy.go +++ b/src/cmd/go/internal/modfetch/proxy.go @@ -242,8 +242,9 @@ func TryProxies(f func(proxy string) error) error { } type proxyRepo struct { - url *url.URL - path string + url *url.URL + path string + redactedURL string } func newProxyRepo(baseURL, path string) (Repo, error) { @@ -268,10 +269,10 @@ func newProxyRepo(baseURL, path string) (Repo, error) { if err != nil { return nil, err } - + redactedURL := base.Redacted() base.Path = strings.TrimSuffix(base.Path, "/") + "/" + enc base.RawPath = strings.TrimSuffix(base.RawPath, "/") + "/" + pathEscape(enc) - return &proxyRepo{base, path}, nil + return &proxyRepo{base, path, redactedURL}, nil } func (p *proxyRepo) ModulePath() string { @@ -413,7 +414,7 @@ func (p *proxyRepo) Stat(rev string) (*RevInfo, error) { } info := new(RevInfo) if err := json.Unmarshal(data, info); err != nil { - return nil, p.versionError(rev, err) + return nil, p.versionError(rev, fmt.Errorf("invalid response from proxy %q: %w", p.redactedURL, err)) } if info.Version != rev && rev == module.CanonicalVersion(rev) && module.Check(p.path, rev) == nil { // If we request a correct, appropriate version for the module path, the @@ -434,7 +435,7 @@ func (p *proxyRepo) Latest() (*RevInfo, error) { } info := new(RevInfo) if err := json.Unmarshal(data, info); err != nil { - return nil, p.versionError("", err) + return nil, p.versionError("", fmt.Errorf("invalid response from proxy %q: %w", p.redactedURL, err)) } return info, nil } diff --git a/src/cmd/go/proxy_test.go b/src/cmd/go/proxy_test.go index 2a4d2935b3..7f58fb8ce4 100644 --- a/src/cmd/go/proxy_test.go +++ b/src/cmd/go/proxy_test.go @@ -131,6 +131,12 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) { } path := r.URL.Path[len("/mod/"):] + // /mod/invalid returns faulty responses. + if strings.HasPrefix(path, "invalid/") { + w.Write([]byte("invalid")) + return + } + // /mod/quiet/ does not print errors. quiet := false if strings.HasPrefix(path, "quiet/") { diff --git a/src/cmd/go/testdata/script/mod_proxy_invalid.txt b/src/cmd/go/testdata/script/mod_proxy_invalid.txt new file mode 100644 index 0000000000..6427cc1527 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_proxy_invalid.txt @@ -0,0 +1,8 @@ +env GO111MODULE=on +env GOPROXY=$GOPROXY/invalid + +! go list -m rsc.io/quote@latest +stderr '^go list -m: module rsc.io/quote: invalid response from proxy "'$GOPROXY'": invalid character ''i'' looking for beginning of value$' + +! go list -m rsc.io/quote@1.5.2 +stderr '^go list -m: rsc.io/quote@1.5.2: invalid version: invalid response from proxy "'$GOPROXY'": invalid character ''i'' looking for beginning of value$' diff --git a/src/cmd/go/testdata/script/mod_query_empty.txt b/src/cmd/go/testdata/script/mod_query_empty.txt index 4d8259b40f..b3ea3e3de0 100644 --- a/src/cmd/go/testdata/script/mod_query_empty.txt +++ b/src/cmd/go/testdata/script/mod_query_empty.txt @@ -40,7 +40,7 @@ env GOPROXY=file:///$WORK/gatekeeper chmod 0000 $WORK/gatekeeper/example.com/join/subpkg/@latest cp go.mod.orig go.mod ! go get -d example.com/join/subpkg -stderr 'go get example.com/join/subpkg: module example.com/join/subpkg: (invalid character .+|reading file://.*/gatekeeper/example.com/join/subpkg/@latest: .+)' +stderr 'go get example.com/join/subpkg: module example.com/join/subpkg: (invalid response from proxy ".+": invalid character .+|reading file://.*/gatekeeper/example.com/join/subpkg/@latest: .+)' -- go.mod.orig -- module example.com/othermodule -- GitLab From 9679b307334bce77cc6e50751956a4c717e9458c Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Thu, 23 Apr 2020 18:06:21 -0400 Subject: [PATCH 0288/1792] cmd/go/testdata/script: make list_case_collision's behavior more clear Implementing the suggestion made by bcmills on a comment on golang.org/cl/228783. Change-Id: I314a24a002c65b582ea51610dcc1a54a69afbb8c Reviewed-on: https://go-review.googlesource.com/c/go/+/229705 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/script_test.go | 38 +++++++++++++++++++ src/cmd/go/testdata/script/README | 1 + .../testdata/script/list_case_collision.txt | 25 +++++------- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go index 2e8f18a897..986646252a 100644 --- a/src/cmd/go/script_test.go +++ b/src/cmd/go/script_test.go @@ -22,6 +22,7 @@ import ( "runtime" "strconv" "strings" + "sync" "testing" "time" @@ -296,6 +297,8 @@ Script: ok = os.Geteuid() == 0 case "symlink": ok = testenv.HasSymlink() + case "case-sensitive": + ok = isCaseSensitive(ts.t) default: if strings.HasPrefix(cond.tag, "exec:") { prog := cond.tag[len("exec:"):] @@ -364,6 +367,41 @@ Script: } } +var ( + onceCaseSensitive sync.Once + caseSensitive bool +) + +func isCaseSensitive(t *testing.T) bool { + onceCaseSensitive.Do(func() { + tmpdir, err := ioutil.TempDir("", "case-sensitive") + if err != nil { + t.Fatal("failed to create directory to determine case-sensitivity:", err) + } + defer os.RemoveAll(tmpdir) + + fcap := filepath.Join(tmpdir, "FILE") + if err := ioutil.WriteFile(fcap, []byte{}, 0644); err != nil { + t.Fatal("error writing file to determine case-sensitivity:", err) + } + + flow := filepath.Join(tmpdir, "file") + _, err = ioutil.ReadFile(flow) + switch { + case err == nil: + caseSensitive = false + return + case os.IsNotExist(err): + caseSensitive = true + return + default: + t.Fatal("unexpected error reading file when determining case-sensitivity:", err) + } + }) + + return caseSensitive +} + // scriptCmds are the script command implementations. // Keep list and the implementations below sorted by name. // diff --git a/src/cmd/go/testdata/script/README b/src/cmd/go/testdata/script/README index 76d6651718..d658cebfce 100644 --- a/src/cmd/go/testdata/script/README +++ b/src/cmd/go/testdata/script/README @@ -85,6 +85,7 @@ should only run when the condition is satisfied. The available conditions are: - [link] for testenv.HasLink() - [root] for os.Geteuid() == 0 - [symlink] for testenv.HasSymlink() + - [case-sensitive] for whether the file system is case-sensitive - [exec:prog] for whether prog is available for execution (found by exec.LookPath) - [GODEBUG:value] for whether value is one of the comma-separated entries in the GODEBUG variable - [buildmode:value] for whether -buildmode=value is supported diff --git a/src/cmd/go/testdata/script/list_case_collision.txt b/src/cmd/go/testdata/script/list_case_collision.txt index 1b5f305587..73f44b63a0 100644 --- a/src/cmd/go/testdata/script/list_case_collision.txt +++ b/src/cmd/go/testdata/script/list_case_collision.txt @@ -6,23 +6,20 @@ stdout 'case-insensitive import collision' ! go build example/a stderr 'case-insensitive import collision' -# If we're not guaranteed to have a case-sensitive file system, list files explicitly on command line. -# Otherwise, let directory read find both files. -[darwin] ! go list example/b/file.go example/b/FILE.go -[windows] ! go list example/b/file.go example/b/FILE.go -[!darwin] [!windows] ! go list example/b +# List files explicitly on command line, to encounter case-checking +# logic even on case-insensitive filesystems. +cp example/b/file.go example/b/FILE.go # no-op on case-insensitive filesystems +! go list example/b/file.go example/b/FILE.go stderr 'case-insensitive file name collision' +mkdir example/a/Pkg # no-op on case-insensitive filesystems +cp example/a/pkg/pkg.go example/a/Pkg/pkg.go # no-op on case-insensitive filesystems ! go list example/a/pkg example/a/Pkg -stderr 'case-insensitive import collision' -go list -json -e example/a/pkg example/a/Pkg -stdout 'case-insensitive import collision' -! go build example/a/pkg example/a/Pkg -stderr 'case-insensitive import collision' # Test that the path reported with an indirect import is correct. -[!darwin] [!windows] ! go build example/c -[!darwin] [!windows] stderr '^package example/c\n\timports example/b: case-insensitive file name collision: "FILE.go" and "file.go"$' +cp example/b/file.go example/b/FILE.go +[case-sensitive] ! go build example/c +[case-sensitive] stderr '^package example/c\n\timports example/b: case-insensitive file name collision: "FILE.go" and "file.go"$' -- example/a/a.go -- package p @@ -32,12 +29,8 @@ import ( ) -- example/a/pkg/pkg.go -- package pkg --- example/a/Pkg/pkg.go -- -package pkg -- example/b/file.go -- package b --- example/b/FILE.go -- -package b -- example/c/c.go -- package c -- GitLab From 5d7261870e73f10c90c903a329eeb99b151d9f9f Mon Sep 17 00:00:00 2001 From: Jonathan Amsterdam Date: Thu, 20 Aug 2020 11:35:17 -0400 Subject: [PATCH 0289/1792] go/doc: support examples on methods from embedded unexported types In type T1 struct { t2 } type t2 int func (t2) M() T1 has method M because it embeds t2, which has M. Classify the example func ExampleT1_M with T1 instead of ignoring it, as is done currently. There is no other way to provide an example for such a method, since its original type is unexported. Continue to ignore examples on methods from embedded types that are exported, unless in AllMethods mode. Examples for those methods could be written on the original type. The change involves removing a check in classifyExamples. The check isn't necessary to get the above behavior because reader.collectEmbeddedMethods and sortedFuncs already generate the appropriate list of methods. For #40172. Change-Id: Ibe7d965ecba6426466184e6e6655fc05989e9caf Reviewed-on: https://go-review.googlesource.com/c/go/+/249557 Reviewed-by: Dmitri Shuralyov --- src/go/doc/example.go | 2 +- src/go/doc/example_test.go | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/go/doc/example.go b/src/go/doc/example.go index ebf81189b5..125fd530b1 100644 --- a/src/go/doc/example.go +++ b/src/go/doc/example.go @@ -486,7 +486,7 @@ func classifyExamples(p *Package, examples []*Example) { ids[f.Name] = &f.Examples } for _, m := range t.Methods { - if !token.IsExported(m.Name) || m.Level != 0 { // avoid forwarded methods from embedding + if !token.IsExported(m.Name) { continue } ids[strings.TrimPrefix(m.Recv, "*")+"_"+m.Name] = &m.Examples diff --git a/src/go/doc/example_test.go b/src/go/doc/example_test.go index 32db3cd7da..7c96f0300a 100644 --- a/src/go/doc/example_test.go +++ b/src/go/doc/example_test.go @@ -563,6 +563,7 @@ type ( type2 int Embed struct { Type1 } + Uembed struct { type2 } ) func Func1() {} @@ -575,6 +576,8 @@ func (Type1) Func1_Foo() {} func (Type1) Func1_foo() {} func (Type1) func2() {} +func (type2) Func1() {} + type ( Conflict int Conflict_Conflict int @@ -633,7 +636,9 @@ func ExampleType1_Func1_foo_suffix() {} func ExampleType1_Func1_foo_Suffix() {} // matches Type1.Func1, instead of Type1.Func1_foo func ExampleType1_func2() {} // matches Type1, instead of Type1.func2 -func ExampleEmbed_Func1() {} // invalid - no support for forwarded methods from embedding +func ExampleEmbed_Func1() {} // invalid - no support for forwarded methods from embedding exported type +func ExampleUembed_Func1() {} // methods from embedding unexported types are OK +func ExampleUembed_Func1_suffix() {} func ExampleConflict_Conflict() {} // ambiguous with either Conflict or Conflict_Conflict type func ExampleConflict_conflict() {} // ambiguous with either Conflict or Conflict_conflict type @@ -683,6 +688,8 @@ func ExampleConflict_conflict_suffix() {} // ambiguous with either Conflict or C "Type1.Func1_Foo": {"", "suffix"}, "Type1.Func1_foo": {"", "suffix"}, + "Uembed.Func1": {"", "suffix"}, + // These are implementation dependent due to the ambiguous parsing. "Conflict_Conflict": {"", "suffix"}, "Conflict_conflict": {"", "suffix"}, -- GitLab From e5da468c51ad13a08730dc7890311915eefd2199 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 21 Aug 2020 08:01:01 +0000 Subject: [PATCH 0290/1792] net/http: use iotest.ErrReader in tests Updates #38781 Change-Id: I16a66904167ca4c0e916619b4da1dd23795b3ab2 GitHub-Last-Rev: 45054235a009cf776030bc951ba9a2a2a02c13e9 GitHub-Pull-Request: golang/go#40864 Reviewed-on: https://go-review.googlesource.com/c/go/+/249037 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/net/http/requestwrite_test.go | 5 +++-- src/net/http/transport_test.go | 9 ++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/net/http/requestwrite_test.go b/src/net/http/requestwrite_test.go index b110b57b1a..fc6257cb33 100644 --- a/src/net/http/requestwrite_test.go +++ b/src/net/http/requestwrite_test.go @@ -15,6 +15,7 @@ import ( "net/url" "strings" "testing" + "testing/iotest" "time" ) @@ -349,7 +350,7 @@ var reqWriteTests = []reqWriteTest{ Body: func() io.ReadCloser { err := errors.New("Custom reader error") - errReader := &errorReader{err} + errReader := iotest.ErrReader(err) return ioutil.NopCloser(io.MultiReader(strings.NewReader("x"), errReader)) }, @@ -369,7 +370,7 @@ var reqWriteTests = []reqWriteTest{ Body: func() io.ReadCloser { err := errors.New("Custom reader error") - errReader := &errorReader{err} + errReader := iotest.ErrReader(err) return ioutil.NopCloser(errReader) }, diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 0a47687d9a..2d9ca10bf0 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -41,6 +41,7 @@ import ( "sync" "sync/atomic" "testing" + "testing/iotest" "time" "golang.org/x/net/http/httpguts" @@ -3408,12 +3409,6 @@ func TestTransportIssue10457(t *testing.T) { } } -type errorReader struct { - err error -} - -func (e errorReader) Read(p []byte) (int, error) { return 0, e.err } - type closerFunc func() error func (f closerFunc) Close() error { return f() } @@ -3610,7 +3605,7 @@ func TestTransportClosesBodyOnError(t *testing.T) { io.Reader io.Closer }{ - io.MultiReader(io.LimitReader(neverEnding('x'), 1<<20), errorReader{fakeErr}), + io.MultiReader(io.LimitReader(neverEnding('x'), 1<<20), iotest.ErrReader(fakeErr)), closerFunc(func() error { select { case didClose <- true: -- GitLab From ea51acbabc687a2270438b05bf765ada2968b69a Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Sun, 28 Jun 2020 16:28:52 +1000 Subject: [PATCH 0291/1792] cmd/internal/objfile: use pe.FileHeader.Machine to reliably determine GOARCH Current peFile.goarch looks for symbols like "_rt0_386_windows" to determine GOARCH. But "_rt0_386_windows" is not present in executables built with cgo. Use pe.FileHeader.Machine instead. This should work with any Windows executable, not just with Go built executable. Fixes #39682 Change-Id: Ie0ffce664f4b8b8fed69b2ecc482425b042a38d5 Reviewed-on: https://go-review.googlesource.com/c/go/+/240957 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Emmanuel Odeke --- src/cmd/internal/objfile/pe.go | 14 +++++------ src/cmd/objdump/objdump_test.go | 31 ++++++++++++++++--------- src/cmd/objdump/testdata/fmthellocgo.go | 21 +++++++++++++++++ 3 files changed, 47 insertions(+), 19 deletions(-) create mode 100644 src/cmd/objdump/testdata/fmthellocgo.go diff --git a/src/cmd/internal/objfile/pe.go b/src/cmd/internal/objfile/pe.go index 259b59a4f4..b20cda9a44 100644 --- a/src/cmd/internal/objfile/pe.go +++ b/src/cmd/internal/objfile/pe.go @@ -182,18 +182,16 @@ func loadPETable(f *pe.File, sname, ename string) ([]byte, error) { } func (f *peFile) goarch() string { - // Not sure how to get the info we want from PE header. - // Look in symbol table for telltale rt0 symbol. - if _, err := findPESymbol(f.pe, "_rt0_386_windows"); err == nil { + switch f.pe.Machine { + case pe.IMAGE_FILE_MACHINE_I386: return "386" - } - if _, err := findPESymbol(f.pe, "_rt0_amd64_windows"); err == nil { + case pe.IMAGE_FILE_MACHINE_AMD64: return "amd64" - } - if _, err := findPESymbol(f.pe, "_rt0_arm_windows"); err == nil { + case pe.IMAGE_FILE_MACHINE_ARMNT: return "arm" + default: + return "" } - return "" } func (f *peFile) loadAddress() (uint64, error) { diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go index a9dc7d1a5e..d9c1660ffd 100644 --- a/src/cmd/objdump/objdump_test.go +++ b/src/cmd/objdump/objdump_test.go @@ -117,8 +117,7 @@ var target = flag.String("target", "", "test disassembly of `goos/goarch` binary // binary for the current system (only) and test that objdump // can handle that one. -func testDisasm(t *testing.T, printCode bool, printGnuAsm bool, flags ...string) { - t.Parallel() +func testDisasm(t *testing.T, srcfname string, printCode bool, printGnuAsm bool, flags ...string) { goarch := runtime.GOARCH if *target != "" { f := strings.Split(*target, "/") @@ -132,11 +131,11 @@ func testDisasm(t *testing.T, printCode bool, printGnuAsm bool, flags ...string) goarch = f[1] } - hash := md5.Sum([]byte(fmt.Sprintf("%v-%v-%v", flags, printCode, printGnuAsm))) + hash := md5.Sum([]byte(fmt.Sprintf("%v-%v-%v-%v", srcfname, flags, printCode, printGnuAsm))) hello := filepath.Join(tmp, fmt.Sprintf("hello-%x.exe", hash)) args := []string{"build", "-o", hello} args = append(args, flags...) - args = append(args, "fmthello.go") + args = append(args, srcfname) cmd := exec.Command(testenv.GoToolPath(t), args...) // "Bad line" bug #36683 is sensitive to being run in the source directory. cmd.Dir = "testdata" @@ -146,7 +145,7 @@ func testDisasm(t *testing.T, printCode bool, printGnuAsm bool, flags ...string) t.Logf("Running %v", cmd.Args) out, err := cmd.CombinedOutput() if err != nil { - t.Fatalf("go build fmthello.go: %v\n%s", err, out) + t.Fatalf("go build %s: %v\n%s", srcfname, err, out) } need := []string{ "TEXT main.main(SB)", @@ -155,7 +154,7 @@ func testDisasm(t *testing.T, printCode bool, printGnuAsm bool, flags ...string) if printCode { need = append(need, ` Println("hello, world")`) } else { - need = append(need, "fmthello.go:6") + need = append(need, srcfname+":6") } switch goarch { @@ -199,7 +198,8 @@ func testDisasm(t *testing.T, printCode bool, printGnuAsm bool, flags ...string) t.Logf("Running %v", cmd.Args) if err != nil { - t.Fatalf("objdump fmthello.exe: %v\n%s", err, out) + exename := srcfname[:len(srcfname)-len(filepath.Ext(srcfname))] + ".exe" + t.Fatalf("objdump %q: %v\n%s", exename, err, out) } text := string(out) @@ -222,6 +222,14 @@ func testDisasm(t *testing.T, printCode bool, printGnuAsm bool, flags ...string) } } +func testGoAndCgoDisasm(t *testing.T, printCode bool, printGnuAsm bool) { + t.Parallel() + testDisasm(t, "fmthello.go", printCode, printGnuAsm) + if build.Default.CgoEnabled { + testDisasm(t, "fmthellocgo.go", printCode, printGnuAsm) + } +} + func TestDisasm(t *testing.T) { switch runtime.GOARCH { case "mips", "mipsle", "mips64", "mips64le": @@ -231,7 +239,7 @@ func TestDisasm(t *testing.T) { case "s390x": t.Skipf("skipping on %s, issue 15255", runtime.GOARCH) } - testDisasm(t, false, false) + testGoAndCgoDisasm(t, false, false) } func TestDisasmCode(t *testing.T) { @@ -239,7 +247,7 @@ func TestDisasmCode(t *testing.T) { case "mips", "mipsle", "mips64", "mips64le", "riscv64", "s390x": t.Skipf("skipping on %s, issue 19160", runtime.GOARCH) } - testDisasm(t, true, false) + testGoAndCgoDisasm(t, true, false) } func TestDisasmGnuAsm(t *testing.T) { @@ -247,7 +255,7 @@ func TestDisasmGnuAsm(t *testing.T) { case "mips", "mipsle", "mips64", "mips64le", "riscv64", "s390x": t.Skipf("skipping on %s, issue 19160", runtime.GOARCH) } - testDisasm(t, false, true) + testGoAndCgoDisasm(t, false, true) } func TestDisasmExtld(t *testing.T) { @@ -268,7 +276,8 @@ func TestDisasmExtld(t *testing.T) { if !build.Default.CgoEnabled { t.Skip("skipping because cgo is not enabled") } - testDisasm(t, false, false, "-ldflags=-linkmode=external") + t.Parallel() + testDisasm(t, "fmthello.go", false, false, "-ldflags=-linkmode=external") } func TestDisasmGoobj(t *testing.T) { diff --git a/src/cmd/objdump/testdata/fmthellocgo.go b/src/cmd/objdump/testdata/fmthellocgo.go new file mode 100644 index 0000000000..6555c3bacf --- /dev/null +++ b/src/cmd/objdump/testdata/fmthellocgo.go @@ -0,0 +1,21 @@ +package main + +import "fmt" +import "C" + +func main() { + Println("hello, world") + if flag { +//line fmthello.go:999999 + Println("bad line") + for { + } + } +} + +//go:noinline +func Println(s string) { + fmt.Println(s) +} + +var flag bool -- GitLab From 13e41bcde8c788224f4896503b56d42614e0bf97 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Sat, 22 Aug 2020 12:06:24 +1000 Subject: [PATCH 0292/1792] cmd/objdump: skip cgo test in testGoAndCgoDisasm on AIX Updates #40972. Change-Id: Id2092f0bef4fb4bdc4178e7bc9730716136f7b8a Reviewed-on: https://go-review.googlesource.com/c/go/+/249760 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Dmitri Shuralyov --- src/cmd/objdump/objdump_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go index d9c1660ffd..85d1a2efb0 100644 --- a/src/cmd/objdump/objdump_test.go +++ b/src/cmd/objdump/objdump_test.go @@ -226,6 +226,9 @@ func testGoAndCgoDisasm(t *testing.T, printCode bool, printGnuAsm bool) { t.Parallel() testDisasm(t, "fmthello.go", printCode, printGnuAsm) if build.Default.CgoEnabled { + if runtime.GOOS == "aix" { + t.Skipf("skipping on %s, issue 40972", runtime.GOOS) + } testDisasm(t, "fmthellocgo.go", printCode, printGnuAsm) } } -- GitLab From 8acbe4c0b392840062cf882886e2424c5f07a665 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Sat, 8 Aug 2020 15:19:42 +0530 Subject: [PATCH 0293/1792] cmd/compile: optimize unsigned comparisons with 0/1 on wasm Updates #21439 Change-Id: I0fbcde6e0c2fc368fe686b271670f9d8be4a7900 Reviewed-on: https://go-review.googlesource.com/c/go/+/247557 Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot Reviewed-by: Richard Musiol --- src/cmd/compile/internal/ssa/gen/Wasm.rules | 4 ++ src/cmd/compile/internal/ssa/rewriteWasm.go | 66 +++++++++++++++++ test/codegen/comparisons.go | 80 +++++++++++++++++++++ 3 files changed, 150 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/Wasm.rules b/src/cmd/compile/internal/ssa/gen/Wasm.rules index c10ff2fa43..ea12c5d617 100644 --- a/src/cmd/compile/internal/ssa/gen/Wasm.rules +++ b/src/cmd/compile/internal/ssa/gen/Wasm.rules @@ -377,6 +377,10 @@ (I64Ne (I64Const [x]) y) && y.Op != OpWasmI64Const => (I64Ne y (I64Const [x])) (I64Eq x (I64Const [0])) => (I64Eqz x) +(I64LtU (I64Const [0]) x) => (I64Eqz (I64Eqz x)) +(I64LeU x (I64Const [0])) => (I64Eqz x) +(I64LtU x (I64Const [1])) => (I64Eqz x) +(I64LeU (I64Const [1]) x) => (I64Eqz (I64Eqz x)) (I64Ne x (I64Const [0])) => (I64Eqz (I64Eqz x)) (I64Add x (I64Const [y])) => (I64AddConst [y] x) diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index 16e6f96917..52b6f6bfc7 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -591,6 +591,8 @@ func rewriteValueWasm(v *Value) bool { return rewriteValueWasm_OpWasmI64Eq(v) case OpWasmI64Eqz: return rewriteValueWasm_OpWasmI64Eqz(v) + case OpWasmI64LeU: + return rewriteValueWasm_OpWasmI64LeU(v) case OpWasmI64Load: return rewriteValueWasm_OpWasmI64Load(v) case OpWasmI64Load16S: @@ -605,6 +607,8 @@ func rewriteValueWasm(v *Value) bool { return rewriteValueWasm_OpWasmI64Load8S(v) case OpWasmI64Load8U: return rewriteValueWasm_OpWasmI64Load8U(v) + case OpWasmI64LtU: + return rewriteValueWasm_OpWasmI64LtU(v) case OpWasmI64Mul: return rewriteValueWasm_OpWasmI64Mul(v) case OpWasmI64Ne: @@ -3824,6 +3828,37 @@ func rewriteValueWasm_OpWasmI64Eqz(v *Value) bool { } return false } +func rewriteValueWasm_OpWasmI64LeU(v *Value) bool { + v_1 := v.Args[1] + v_0 := v.Args[0] + b := v.Block + typ := &b.Func.Config.Types + // match: (I64LeU x (I64Const [0])) + // result: (I64Eqz x) + for { + x := v_0 + if v_1.Op != OpWasmI64Const || auxIntToInt64(v_1.AuxInt) != 0 { + break + } + v.reset(OpWasmI64Eqz) + v.AddArg(x) + return true + } + // match: (I64LeU (I64Const [1]) x) + // result: (I64Eqz (I64Eqz x)) + for { + if v_0.Op != OpWasmI64Const || auxIntToInt64(v_0.AuxInt) != 1 { + break + } + x := v_1 + v.reset(OpWasmI64Eqz) + v0 := b.NewValue0(v.Pos, OpWasmI64Eqz, typ.Bool) + v0.AddArg(x) + v.AddArg(v0) + return true + } + return false +} func rewriteValueWasm_OpWasmI64Load(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -4070,6 +4105,37 @@ func rewriteValueWasm_OpWasmI64Load8U(v *Value) bool { } return false } +func rewriteValueWasm_OpWasmI64LtU(v *Value) bool { + v_1 := v.Args[1] + v_0 := v.Args[0] + b := v.Block + typ := &b.Func.Config.Types + // match: (I64LtU (I64Const [0]) x) + // result: (I64Eqz (I64Eqz x)) + for { + if v_0.Op != OpWasmI64Const || auxIntToInt64(v_0.AuxInt) != 0 { + break + } + x := v_1 + v.reset(OpWasmI64Eqz) + v0 := b.NewValue0(v.Pos, OpWasmI64Eqz, typ.Bool) + v0.AddArg(x) + v.AddArg(v0) + return true + } + // match: (I64LtU x (I64Const [1])) + // result: (I64Eqz x) + for { + x := v_0 + if v_1.Op != OpWasmI64Const || auxIntToInt64(v_1.AuxInt) != 1 { + break + } + v.reset(OpWasmI64Eqz) + v.AddArg(x) + return true + } + return false +} func rewriteValueWasm_OpWasmI64Mul(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] diff --git a/test/codegen/comparisons.go b/test/codegen/comparisons.go index 3c2dcb7eba..02bed38661 100644 --- a/test/codegen/comparisons.go +++ b/test/codegen/comparisons.go @@ -456,3 +456,83 @@ func UintGeqOne(a uint8, b uint16, c uint32, d uint64) int { } return 0 } + +func CmpToZeroU_ex1(a uint8, b uint16, c uint32, d uint64) int { + // wasm:"I64Eqz"-"I64LtU" + if 0 < a { + return 1 + } + // wasm:"I64Eqz"-"I64LtU" + if 0 < b { + return 1 + } + // wasm:"I64Eqz"-"I64LtU" + if 0 < c { + return 1 + } + // wasm:"I64Eqz"-"I64LtU" + if 0 < d { + return 1 + } + return 0 +} + +func CmpToZeroU_ex2(a uint8, b uint16, c uint32, d uint64) int { + // wasm:"I64Eqz"-"I64LeU" + if a <= 0 { + return 1 + } + // wasm:"I64Eqz"-"I64LeU" + if b <= 0 { + return 1 + } + // wasm:"I64Eqz"-"I64LeU" + if c <= 0 { + return 1 + } + // wasm:"I64Eqz"-"I64LeU" + if d <= 0 { + return 1 + } + return 0 +} + +func CmpToOneU_ex1(a uint8, b uint16, c uint32, d uint64) int { + // wasm:"I64Eqz"-"I64LtU" + if a < 1 { + return 1 + } + // wasm:"I64Eqz"-"I64LtU" + if b < 1 { + return 1 + } + // wasm:"I64Eqz"-"I64LtU" + if c < 1 { + return 1 + } + // wasm:"I64Eqz"-"I64LtU" + if d < 1 { + return 1 + } + return 0 +} + +func CmpToOneU_ex2(a uint8, b uint16, c uint32, d uint64) int { + // wasm:"I64Eqz"-"I64LeU" + if 1 <= a { + return 1 + } + // wasm:"I64Eqz"-"I64LeU" + if 1 <= b { + return 1 + } + // wasm:"I64Eqz"-"I64LeU" + if 1 <= c { + return 1 + } + // wasm:"I64Eqz"-"I64LeU" + if 1 <= d { + return 1 + } + return 0 +} -- GitLab From 0c3bf27b9789e6e6e7d10c47f08163111ce6d9de Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 22 Aug 2020 23:26:32 +0700 Subject: [PATCH 0294/1792] test: remove nacl checking condition go1.14 drop nacl support, as go1.15 was released, go1.13 is not supported anymore, nacl is absolutely gone. Change-Id: I05efb46891ec875b08da8f2996751a8e9cb57d0c Reviewed-on: https://go-review.googlesource.com/c/go/+/249977 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- test/fixedbugs/issue13268.go | 6 ------ test/fixedbugs/issue21317.go | 2 +- test/fixedbugs/issue22660.go | 2 +- test/fixedbugs/issue22662b.go | 2 +- test/fixedbugs/issue9355.go | 2 +- 5 files changed, 4 insertions(+), 10 deletions(-) diff --git a/test/fixedbugs/issue13268.go b/test/fixedbugs/issue13268.go index 2a063fa60c..fcb69c9068 100644 --- a/test/fixedbugs/issue13268.go +++ b/test/fixedbugs/issue13268.go @@ -17,16 +17,10 @@ import ( "log" "os" "os/exec" - "runtime" "strings" ) func main() { - // cannot use temp file on nacl via child process - if runtime.GOOS == "nacl" { - return - } - // create source f, err := ioutil.TempFile("", "issue13268-") if err != nil { diff --git a/test/fixedbugs/issue21317.go b/test/fixedbugs/issue21317.go index ee1bbf810b..f4ec422371 100644 --- a/test/fixedbugs/issue21317.go +++ b/test/fixedbugs/issue21317.go @@ -21,7 +21,7 @@ import ( ) func main() { - if runtime.Compiler != "gc" || runtime.GOOS == "nacl" || runtime.GOOS == "js" { + if runtime.Compiler != "gc" || runtime.GOOS == "js" { return } diff --git a/test/fixedbugs/issue22660.go b/test/fixedbugs/issue22660.go index b2282ea665..44ba42ac96 100644 --- a/test/fixedbugs/issue22660.go +++ b/test/fixedbugs/issue22660.go @@ -19,7 +19,7 @@ import ( ) func main() { - if runtime.GOOS == "nacl" || runtime.GOOS == "js" { + if runtime.GOOS == "js" { return // no file system available on builders } diff --git a/test/fixedbugs/issue22662b.go b/test/fixedbugs/issue22662b.go index 2678383ab0..0fcfe8d0db 100644 --- a/test/fixedbugs/issue22662b.go +++ b/test/fixedbugs/issue22662b.go @@ -36,7 +36,7 @@ var tests = []struct { } func main() { - if runtime.GOOS == "nacl" || runtime.GOOS == "js" { + if runtime.GOOS == "js" { return // can not exec go tool } diff --git a/test/fixedbugs/issue9355.go b/test/fixedbugs/issue9355.go index 2498bf6a1b..ab3369d415 100644 --- a/test/fixedbugs/issue9355.go +++ b/test/fixedbugs/issue9355.go @@ -17,7 +17,7 @@ import ( ) func main() { - if runtime.Compiler != "gc" || runtime.GOOS == "nacl" || runtime.GOOS == "js" { + if runtime.Compiler != "gc" || runtime.GOOS == "js" { return } -- GitLab From 623652e73fa694eacac9e4b93049817615f1be1d Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Sat, 22 Aug 2020 14:07:30 -0700 Subject: [PATCH 0295/1792] cmd/compile: make Haspointers a method instead of a function More ergonomic that way. Also change Haspointers to HasPointers while we are here. Change-Id: I45bedc294c1a8c2bd01dc14bd04615ae77555375 Reviewed-on: https://go-review.googlesource.com/c/go/+/249959 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/esc.go | 4 ++-- src/cmd/compile/internal/gc/escape.go | 12 ++++++------ src/cmd/compile/internal/gc/gsubr.go | 3 +-- src/cmd/compile/internal/gc/order.go | 6 +++--- src/cmd/compile/internal/gc/pgen.go | 6 +++--- src/cmd/compile/internal/gc/pgen_test.go | 4 ++-- src/cmd/compile/internal/gc/plive.go | 2 +- src/cmd/compile/internal/gc/range.go | 2 +- src/cmd/compile/internal/gc/reflect.go | 10 +++++----- src/cmd/compile/internal/gc/ssa.go | 12 ++++++------ src/cmd/compile/internal/gc/walk.go | 14 +++++++------- src/cmd/compile/internal/types/type.go | 16 ++++++++-------- 12 files changed, 45 insertions(+), 46 deletions(-) diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 628953741a..4b843aba35 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -384,7 +384,7 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string { return unsafeUintptrTag } - if !types.Haspointers(f.Type) { // don't bother tagging for scalars + if !f.Type.HasPointers() { // don't bother tagging for scalars return "" } @@ -422,7 +422,7 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string { } } - if !types.Haspointers(f.Type) { // don't bother tagging for scalars + if !f.Type.HasPointers() { // don't bother tagging for scalars return "" } diff --git a/src/cmd/compile/internal/gc/escape.go b/src/cmd/compile/internal/gc/escape.go index 5dc755186e..ddf89f6159 100644 --- a/src/cmd/compile/internal/gc/escape.go +++ b/src/cmd/compile/internal/gc/escape.go @@ -326,7 +326,7 @@ func (e *Escape) stmt(n *Node) { if typesw && n.Left.Left != nil { cv := cas.Rlist.First() k := e.dcl(cv) // type switch variables have no ODCL. - if types.Haspointers(cv.Type) { + if cv.Type.HasPointers() { ks = append(ks, k.dotType(cv.Type, cas, "switch case")) } } @@ -433,7 +433,7 @@ func (e *Escape) exprSkipInit(k EscHole, n *Node) { if uintptrEscapesHack && n.Op == OCONVNOP && n.Left.Type.IsUnsafePtr() { // nop - } else if k.derefs >= 0 && !types.Haspointers(n.Type) { + } else if k.derefs >= 0 && !n.Type.HasPointers() { k = e.discardHole() } @@ -698,7 +698,7 @@ func (e *Escape) addr(n *Node) EscHole { e.assignHeap(n.Right, "key of map put", n) } - if !types.Haspointers(n.Type) { + if !n.Type.HasPointers() { k = e.discardHole() } @@ -811,14 +811,14 @@ func (e *Escape) call(ks []EscHole, call, where *Node) { // slice might be allocated, and all slice elements // might flow to heap. appendeeK := ks[0] - if types.Haspointers(args[0].Type.Elem()) { + if args[0].Type.Elem().HasPointers() { appendeeK = e.teeHole(appendeeK, e.heapHole().deref(call, "appendee slice")) } argument(appendeeK, args[0]) if call.IsDDD() { appendedK := e.discardHole() - if args[1].Type.IsSlice() && types.Haspointers(args[1].Type.Elem()) { + if args[1].Type.IsSlice() && args[1].Type.Elem().HasPointers() { appendedK = e.heapHole().deref(call, "appended slice...") } argument(appendedK, args[1]) @@ -832,7 +832,7 @@ func (e *Escape) call(ks []EscHole, call, where *Node) { argument(e.discardHole(), call.Left) copiedK := e.discardHole() - if call.Right.Type.IsSlice() && types.Haspointers(call.Right.Type.Elem()) { + if call.Right.Type.IsSlice() && call.Right.Type.Elem().HasPointers() { copiedK = e.heapHole().deref(call, "copied slice") } argument(copiedK, call.Right) diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go index 336e870bbd..15a84a8a43 100644 --- a/src/cmd/compile/internal/gc/gsubr.go +++ b/src/cmd/compile/internal/gc/gsubr.go @@ -32,7 +32,6 @@ package gc import ( "cmd/compile/internal/ssa" - "cmd/compile/internal/types" "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/src" @@ -316,7 +315,7 @@ func ggloblnod(nam *Node) { if nam.Name.Readonly() { flags = obj.RODATA } - if nam.Type != nil && !types.Haspointers(nam.Type) { + if nam.Type != nil && !nam.Type.HasPointers() { flags |= obj.NOPTR } Ctxt.Globl(s, nam.Type.Width, flags) diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 50d1a2a1b0..aa91160e5c 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -927,7 +927,7 @@ func (o *Order) stmt(n *Node) { n2.Ninit.Append(tmp2) } - r.Left = o.newTemp(r.Right.Left.Type.Elem(), types.Haspointers(r.Right.Left.Type.Elem())) + r.Left = o.newTemp(r.Right.Left.Type.Elem(), r.Right.Left.Type.Elem().HasPointers()) tmp2 := nod(OAS, tmp1, r.Left) tmp2 = typecheck(tmp2, ctxStmt) n2.Ninit.Append(tmp2) @@ -1406,7 +1406,7 @@ func (o *Order) as2(n *Node) { left := []*Node{} for ni, l := range n.List.Slice() { if !l.isBlank() { - tmp := o.newTemp(l.Type, types.Haspointers(l.Type)) + tmp := o.newTemp(l.Type, l.Type.HasPointers()) n.List.SetIndex(ni, tmp) tmplist = append(tmplist, tmp) left = append(left, l) @@ -1428,7 +1428,7 @@ func (o *Order) okAs2(n *Node) { var tmp1, tmp2 *Node if !n.List.First().isBlank() { typ := n.Right.Type - tmp1 = o.newTemp(typ, types.Haspointers(typ)) + tmp1 = o.newTemp(typ, typ.HasPointers()) } if !n.List.Second().isBlank() { diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index f80d0c179d..ca8cccf4ae 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -80,8 +80,8 @@ func cmpstackvarlt(a, b *Node) bool { return a.Name.Used() } - ap := types.Haspointers(a.Type) - bp := types.Haspointers(b.Type) + ap := a.Type.HasPointers() + bp := b.Type.HasPointers() if ap != bp { return ap } @@ -176,7 +176,7 @@ func (s *ssafn) AllocFrame(f *ssa.Func) { } s.stksize += w s.stksize = Rnd(s.stksize, int64(n.Type.Align)) - if types.Haspointers(n.Type) { + if n.Type.HasPointers() { s.stkptrsize = s.stksize lastHasPtr = true } else { diff --git a/src/cmd/compile/internal/gc/pgen_test.go b/src/cmd/compile/internal/gc/pgen_test.go index 89b977de85..41f0808a1c 100644 --- a/src/cmd/compile/internal/gc/pgen_test.go +++ b/src/cmd/compile/internal/gc/pgen_test.go @@ -185,8 +185,8 @@ func TestStackvarSort(t *testing.T) { // exercise this function on all inputs so that reflect.DeepEqual // doesn't produce false positives. for i := range want { - types.Haspointers(want[i].Type) - types.Haspointers(inp[i].Type) + want[i].Type.HasPointers() + inp[i].Type.HasPointers() } sort.Sort(byStackVar(inp)) diff --git a/src/cmd/compile/internal/gc/plive.go b/src/cmd/compile/internal/gc/plive.go index 0cb2661997..398bfe5baa 100644 --- a/src/cmd/compile/internal/gc/plive.go +++ b/src/cmd/compile/internal/gc/plive.go @@ -259,7 +259,7 @@ func (v *varRegVec) AndNot(v1, v2 varRegVec) { // nor do we care about empty structs (handled by the pointer check), // nor do we care about the fake PAUTOHEAP variables. func livenessShouldTrack(n *Node) bool { - return n.Op == ONAME && (n.Class() == PAUTO || n.Class() == PPARAM || n.Class() == PPARAMOUT) && types.Haspointers(n.Type) + return n.Op == ONAME && (n.Class() == PAUTO || n.Class() == PPARAM || n.Class() == PPARAMOUT) && n.Type.HasPointers() } // getvariables returns the list of on-stack variables that we need to track diff --git a/src/cmd/compile/internal/gc/range.go b/src/cmd/compile/internal/gc/range.go index 1cf0a0862f..d78a5f0d8d 100644 --- a/src/cmd/compile/internal/gc/range.go +++ b/src/cmd/compile/internal/gc/range.go @@ -334,7 +334,7 @@ func walkrange(n *Node) *Node { hv1 := temp(t.Elem()) hv1.SetTypecheck(1) - if types.Haspointers(t.Elem()) { + if t.Elem().HasPointers() { init = append(init, nod(OAS, hv1, nil)) } hb := temp(types.Types[TBOOL]) diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 59b00168e0..49b2a0ed49 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -119,7 +119,7 @@ func bmap(t *types.Type) *types.Type { // the type of the overflow field to uintptr in this case. // See comment on hmap.overflow in runtime/map.go. otyp := types.NewPtr(bucket) - if !types.Haspointers(elemtype) && !types.Haspointers(keytype) { + if !elemtype.HasPointers() && !keytype.HasPointers() { otyp = types.Types[TUINTPTR] } overflow := makefield("overflow", otyp) @@ -754,7 +754,7 @@ var kinds = []int{ // typeptrdata returns the length in bytes of the prefix of t // containing pointer data. Anything after this offset is scalar data. func typeptrdata(t *types.Type) int64 { - if !types.Haspointers(t) { + if !t.HasPointers() { return 0 } @@ -788,7 +788,7 @@ func typeptrdata(t *types.Type) int64 { // Find the last field that has pointers. var lastPtrField *types.Field for _, t1 := range t.Fields().Slice() { - if types.Haspointers(t1.Type) { + if t1.Type.HasPointers() { lastPtrField = t1 } } @@ -1734,7 +1734,7 @@ func fillptrmask(t *types.Type, ptrmask []byte) { for i := range ptrmask { ptrmask[i] = 0 } - if !types.Haspointers(t) { + if !t.HasPointers() { return } @@ -1803,7 +1803,7 @@ func (p *GCProg) end() { func (p *GCProg) emit(t *types.Type, offset int64) { dowidth(t) - if !types.Haspointers(t) { + if !t.HasPointers() { return } if t.Width == int64(Widthptr) { diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 4124655b79..956569b86f 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -4207,7 +4207,7 @@ func (s *state) openDeferSave(n *Node, t *types.Type, val *ssa.Value) *ssa.Value s.vars[&memVar] = s.newValue1Apos(ssa.OpVarLive, types.TypeMem, argTemp, s.mem(), false) addrArgTemp = s.newValue2Apos(ssa.OpLocalAddr, types.NewPtr(argTemp.Type), argTemp, s.sp, s.mem(), false) } - if types.Haspointers(t) { + if t.HasPointers() { // Since we may use this argTemp during exit depending on the // deferBits, we must define it unconditionally on entry. // Therefore, we must make sure it is zeroed out in the entry @@ -4309,12 +4309,12 @@ func (s *state) openDeferExit() { s.vars[&memVar] = s.newValue1Apos(ssa.OpVarLive, types.TypeMem, r.closureNode, s.mem(), false) } if r.rcvrNode != nil { - if types.Haspointers(r.rcvrNode.Type) { + if r.rcvrNode.Type.HasPointers() { s.vars[&memVar] = s.newValue1Apos(ssa.OpVarLive, types.TypeMem, r.rcvrNode, s.mem(), false) } } for _, argNode := range r.argNodes { - if types.Haspointers(argNode.Type) { + if argNode.Type.HasPointers() { s.vars[&memVar] = s.newValue1Apos(ssa.OpVarLive, types.TypeMem, argNode, s.mem(), false) } } @@ -4954,7 +4954,7 @@ func (s *state) rtcall(fn *obj.LSym, returns bool, results []*types.Type, args . func (s *state) storeType(t *types.Type, left, right *ssa.Value, skip skipMask, leftIsStmt bool) { s.instrument(t, left, true) - if skip == 0 && (!types.Haspointers(t) || ssa.IsStackAddr(left)) { + if skip == 0 && (!t.HasPointers() || ssa.IsStackAddr(left)) { // Known to not have write barrier. Store the whole type. s.vars[&memVar] = s.newValue3Apos(ssa.OpStore, types.TypeMem, t, left, right, s.mem(), leftIsStmt) return @@ -4966,7 +4966,7 @@ func (s *state) storeType(t *types.Type, left, right *ssa.Value, skip skipMask, // TODO: if the writebarrier pass knows how to reorder stores, // we can do a single store here as long as skip==0. s.storeTypeScalars(t, left, right, skip) - if skip&skipPtr == 0 && types.Haspointers(t) { + if skip&skipPtr == 0 && t.HasPointers() { s.storeTypePtrs(t, left, right) } } @@ -5038,7 +5038,7 @@ func (s *state) storeTypePtrs(t *types.Type, left, right *ssa.Value) { n := t.NumFields() for i := 0; i < n; i++ { ft := t.FieldType(i) - if !types.Haspointers(ft) { + if !ft.HasPointers() { continue } addr := s.newValue1I(ssa.OpOffPtr, ft.PtrTo(), t.FieldOff(i), left) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 74ed0411bd..77f88d8996 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -381,9 +381,9 @@ func convFuncName(from, to *types.Type) (fnname string, needsaddr bool) { switch { case from.Size() == 2 && from.Align == 2: return "convT16", false - case from.Size() == 4 && from.Align == 4 && !types.Haspointers(from): + case from.Size() == 4 && from.Align == 4 && !from.HasPointers(): return "convT32", false - case from.Size() == 8 && from.Align == types.Types[TUINT64].Align && !types.Haspointers(from): + case from.Size() == 8 && from.Align == types.Types[TUINT64].Align && !from.HasPointers(): return "convT64", false } if sc := from.SoleComponent(); sc != nil { @@ -397,12 +397,12 @@ func convFuncName(from, to *types.Type) (fnname string, needsaddr bool) { switch tkind { case 'E': - if !types.Haspointers(from) { + if !from.HasPointers() { return "convT2Enoptr", true } return "convT2E", true case 'I': - if !types.Haspointers(from) { + if !from.HasPointers() { return "convT2Inoptr", true } return "convT2I", true @@ -1410,7 +1410,7 @@ opswitch: copylen := nod(OLEN, n.Right, nil) copyptr := nod(OSPTR, n.Right, nil) - if !types.Haspointers(t.Elem()) && n.Bounded() { + if !t.Elem().HasPointers() && n.Bounded() { // When len(to)==len(from) and elements have no pointers: // replace make+copy with runtime.mallocgc+runtime.memmove. @@ -2865,7 +2865,7 @@ func isAppendOfMake(n *Node) bool { // s = s[:n] // lptr := &l1[0] // sptr := &s[0] -// if lptr == sptr || !hasPointers(T) { +// if lptr == sptr || !T.HasPointers() { // // growslice did not clear the whole underlying array (or did not get called) // hp := &s[len(l1)] // hn := l2 * sizeof(T) @@ -2946,7 +2946,7 @@ func extendslice(n *Node, init *Nodes) *Node { hn = conv(hn, types.Types[TUINTPTR]) clrname := "memclrNoHeapPointers" - hasPointers := types.Haspointers(elemtype) + hasPointers := elemtype.HasPointers() if hasPointers { clrname = "memclrHasPointers" Curfn.Func.setWBPos(n.Pos) diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go index 91b54b43d4..20ae856bba 100644 --- a/src/cmd/compile/internal/types/type.go +++ b/src/cmd/compile/internal/types/type.go @@ -1401,11 +1401,11 @@ func (t *Type) IsUntyped() bool { // TODO(austin): We probably only need HasHeapPointer. See // golang.org/cl/73412 for discussion. -func Haspointers(t *Type) bool { - return Haspointers1(t, false) +func (t *Type) HasPointers() bool { + return t.hasPointers1(false) } -func Haspointers1(t *Type, ignoreNotInHeap bool) bool { +func (t *Type) hasPointers1(ignoreNotInHeap bool) bool { switch t.Etype { case TINT, TUINT, TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64, TUINT64, TUINTPTR, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TBOOL, TSSA: @@ -1415,11 +1415,11 @@ func Haspointers1(t *Type, ignoreNotInHeap bool) bool { if t.NumElem() == 0 { // empty array has no pointers return false } - return Haspointers1(t.Elem(), ignoreNotInHeap) + return t.Elem().hasPointers1(ignoreNotInHeap) case TSTRUCT: for _, t1 := range t.Fields().Slice() { - if Haspointers1(t1.Type, ignoreNotInHeap) { + if t1.Type.hasPointers1(ignoreNotInHeap) { return true } } @@ -1430,7 +1430,7 @@ func Haspointers1(t *Type, ignoreNotInHeap bool) bool { case TTUPLE: ttup := t.Extra.(*Tuple) - return Haspointers1(ttup.first, ignoreNotInHeap) || Haspointers1(ttup.second, ignoreNotInHeap) + return ttup.first.hasPointers1(ignoreNotInHeap) || ttup.second.hasPointers1(ignoreNotInHeap) } return true @@ -1440,7 +1440,7 @@ func Haspointers1(t *Type, ignoreNotInHeap bool) bool { // This is used for write barrier insertion, so it ignores // pointers to go:notinheap types. func (t *Type) HasHeapPointer() bool { - return Haspointers1(t, true) + return t.hasPointers1(true) } func (t *Type) Symbol() *obj.LSym { @@ -1471,7 +1471,7 @@ func FakeRecvType() *Type { } var ( - // TSSA types. Haspointers assumes these are pointer-free. + // TSSA types. HasPointers assumes these are pointer-free. TypeInvalid = newSSA("invalid") TypeMem = newSSA("mem") TypeFlags = newSSA("flags") -- GitLab From c0602603b20186228b4f89f265cb3f7665e06768 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Sun, 23 Aug 2020 11:52:53 -0700 Subject: [PATCH 0296/1792] runtime: implement StorepNoWB for wasm in assembly The second argument of StorepNoWB must be forced to escape. The current Go code does not explicitly enforce that property. By implementing in assembly, and not using go:noescape, we force the issue. Test is in CL 249761. Issue #40975. This CL is needed for CL 249917, which changes how go:notinheap works and breaks the previous StorepNoWB wasm code. I checked for other possible errors like this. This is the only go:notinheap that isn't in the runtime itself. Change-Id: I43400a806662655727c4a3baa8902b63bdc9fa57 Reviewed-on: https://go-review.googlesource.com/c/go/+/249962 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/runtime/internal/atomic/asm_wasm.s | 10 ++++++++++ src/runtime/internal/atomic/atomic_wasm.go | 13 +++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 src/runtime/internal/atomic/asm_wasm.s diff --git a/src/runtime/internal/atomic/asm_wasm.s b/src/runtime/internal/atomic/asm_wasm.s new file mode 100644 index 0000000000..7c33cb1ee9 --- /dev/null +++ b/src/runtime/internal/atomic/asm_wasm.s @@ -0,0 +1,10 @@ +// 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. + +#include "textflag.h" + +TEXT runtime∕internal∕atomic·StorepNoWB(SB), NOSPLIT, $0-16 + MOVD ptr+0(FP), R0 + MOVD val+8(FP), 0(R0) + RET diff --git a/src/runtime/internal/atomic/atomic_wasm.go b/src/runtime/internal/atomic/atomic_wasm.go index 9037c2f7c8..2c0c3a8174 100644 --- a/src/runtime/internal/atomic/atomic_wasm.go +++ b/src/runtime/internal/atomic/atomic_wasm.go @@ -153,14 +153,11 @@ func Store64(ptr *uint64, val uint64) { *ptr = val } -//go:notinheap -type noWB struct{} - -//go:noinline -//go:nosplit -func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer) { - *(**noWB)(ptr) = (*noWB)(val) -} +// StorepNoWB performs *ptr = val atomically and without a write +// barrier. +// +// NO go:noescape annotation; see atomic_pointer.go. +func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer) //go:nosplit //go:noinline -- GitLab From 4220d670844e15f78041a9fa7dea1c2a89a9b139 Mon Sep 17 00:00:00 2001 From: David Chase Date: Wed, 5 Aug 2020 10:26:57 -0400 Subject: [PATCH 0297/1792] cmd/compile: make GOSSAHASH package-sensitive, also append to log files Turns out if your failure is in a function with a name like "Reset()" there will be a lot of hits on the same hashcode. Adding package sensitivity solves this problem. In additionm, it turned out that in the case that a logfile was specified for the GOSSAHASH logging, that it was opened in create mode, which meant that multiple compiler invocations would reset the file to zero length. Opening in append mode works better; the automated harness (github.com/dr2chase/gossahash) takes care of truncating the file before use. Change-Id: I5601bc280faa94cbd507d302448831849db6c842 Reviewed-on: https://go-review.googlesource.com/c/go/+/246937 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/ssa.go | 6 +++++- src/cmd/compile/internal/ssa/config.go | 3 +++ src/cmd/compile/internal/ssa/export_test.go | 4 ++++ src/cmd/compile/internal/ssa/func.go | 5 +++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 956569b86f..c8fb013ad0 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -329,8 +329,8 @@ func buildssa(fn *Node, worker int) *ssa.Func { s.f.Config = ssaConfig s.f.Cache = &ssaCaches[worker] s.f.Cache.Reset() - s.f.DebugTest = s.f.DebugHashMatch("GOSSAHASH", name) s.f.Name = name + s.f.DebugTest = s.f.DebugHashMatch("GOSSAHASH") s.f.PrintOrHtmlSSA = printssa if fn.Func.Pragma&Nosplit != 0 { s.f.NoSplit = true @@ -6863,6 +6863,10 @@ func (e *ssafn) SetWBPos(pos src.XPos) { e.curfn.Func.setWBPos(pos) } +func (e *ssafn) MyImportPath() string { + return myimportpath +} + func (n *Node) Typ() *types.Type { return n.Type } diff --git a/src/cmd/compile/internal/ssa/config.go b/src/cmd/compile/internal/ssa/config.go index fdff3bbdeb..4b2f06def1 100644 --- a/src/cmd/compile/internal/ssa/config.go +++ b/src/cmd/compile/internal/ssa/config.go @@ -173,6 +173,9 @@ type Frontend interface { // 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 } // interface used to hold a *gc.Node (a stack variable). diff --git a/src/cmd/compile/internal/ssa/export_test.go b/src/cmd/compile/internal/ssa/export_test.go index a94cce48a4..51665c60e2 100644 --- a/src/cmd/compile/internal/ssa/export_test.go +++ b/src/cmd/compile/internal/ssa/export_test.go @@ -146,6 +146,10 @@ func (d DummyFrontend) Fatalf(_ src.XPos, msg string, args ...interface{}) { d.t func (d DummyFrontend) Warnl(_ src.XPos, msg string, args ...interface{}) { d.t.Logf(msg, args...) } func (d DummyFrontend) Debug_checknil() bool { return false } +func (d DummyFrontend) MyImportPath() string { + return "my/import/path" +} + var dummyTypes Types func init() { diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go index 9e40b6214c..6718b778e1 100644 --- a/src/cmd/compile/internal/ssa/func.go +++ b/src/cmd/compile/internal/ssa/func.go @@ -678,7 +678,8 @@ func (f *Func) invalidateCFG() { // GSHS_LOGFILE // or standard out if that is empty or there is an error // opening the file. -func (f *Func) DebugHashMatch(evname, name string) bool { +func (f *Func) DebugHashMatch(evname string) bool { + name := f.fe.MyImportPath() + "." + f.Name evhash := os.Getenv(evname) switch evhash { case "": @@ -727,7 +728,7 @@ func (f *Func) logDebugHashMatch(evname, name string) { file = os.Stdout if tmpfile := os.Getenv("GSHS_LOGFILE"); tmpfile != "" { var err error - file, err = os.Create(tmpfile) + file, err = os.OpenFile(tmpfile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { f.Fatalf("could not open hash-testing logfile %s", tmpfile) } -- GitLab From aa49a0b37249fc1d4a7963b6f1119983eaae9f97 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 22 Aug 2020 18:21:14 +0700 Subject: [PATCH 0298/1792] runtime: add test for StorepNoWB param leaking CL 249962 added wasm StorepNoWB implementation in assembly, it's now like all other architectures. This CL adds a general test that the second param of StorepNoWB must be force to escape. Fixes #40975 Change-Id: I1eccc7e50a3ec742a1912d65f25b15f9f5ad9241 Reviewed-on: https://go-review.googlesource.com/c/go/+/249761 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/runtime/internal/atomic/atomic_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/runtime/internal/atomic/atomic_test.go b/src/runtime/internal/atomic/atomic_test.go index 0c1125c558..b0a8fa0610 100644 --- a/src/runtime/internal/atomic/atomic_test.go +++ b/src/runtime/internal/atomic/atomic_test.go @@ -220,3 +220,13 @@ func TestBitwiseContended(t *testing.T) { } } } + +func TestStorepNoWB(t *testing.T) { + var p [2]*int + for i := range p { + atomic.StorepNoWB(unsafe.Pointer(&p[i]), unsafe.Pointer(new(int))) + } + if p[0] == p[1] { + t.Error("Bad escape analysis of StorepNoWB") + } +} -- GitLab From 328214e85ccffa80daa2b78d017c0ccb249f8221 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Tue, 12 May 2020 11:05:24 +0800 Subject: [PATCH 0299/1792] cmd/compile: convert more ARM64.rules lines to typed aux mode Add a check code for checking whether the "c" value can be represented as a signed 32 bit integer in some rules. Passes toolstash-check -all. Change-Id: I84e4431dc75945985695516d34565b841c8b53e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/233738 Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/ARM64.rules | 266 +++++++------- src/cmd/compile/internal/ssa/rewriteARM64.go | 360 +++++++++++-------- 2 files changed, 335 insertions(+), 291 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 80e8c7137b..188528fade 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -950,41 +950,41 @@ (STP [off] {sym} ptr (MOVDconst [0]) (MOVDconst [0]) mem) => (MOVQstorezero [off] {sym} ptr mem) // register indexed store zero -(MOVDstorezero [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil -> (MOVDstorezeroidx ptr idx mem) -(MOVWstorezero [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil -> (MOVWstorezeroidx ptr idx mem) -(MOVHstorezero [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil -> (MOVHstorezeroidx ptr idx mem) -(MOVBstorezero [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil -> (MOVBstorezeroidx ptr idx mem) -(MOVDstoreidx ptr idx (MOVDconst [0]) mem) -> (MOVDstorezeroidx ptr idx mem) -(MOVWstoreidx ptr idx (MOVDconst [0]) mem) -> (MOVWstorezeroidx ptr idx mem) -(MOVHstoreidx ptr idx (MOVDconst [0]) mem) -> (MOVHstorezeroidx ptr idx mem) -(MOVBstoreidx ptr idx (MOVDconst [0]) mem) -> (MOVBstorezeroidx ptr idx mem) -(MOVDstorezeroidx ptr (MOVDconst [c]) mem) -> (MOVDstorezero [c] ptr mem) -(MOVDstorezeroidx (MOVDconst [c]) idx mem) -> (MOVDstorezero [c] idx mem) -(MOVWstorezeroidx ptr (MOVDconst [c]) mem) -> (MOVWstorezero [c] ptr mem) -(MOVWstorezeroidx (MOVDconst [c]) idx mem) -> (MOVWstorezero [c] idx mem) -(MOVHstorezeroidx ptr (MOVDconst [c]) mem) -> (MOVHstorezero [c] ptr mem) -(MOVHstorezeroidx (MOVDconst [c]) idx mem) -> (MOVHstorezero [c] idx mem) -(MOVBstorezeroidx ptr (MOVDconst [c]) mem) -> (MOVBstorezero [c] ptr mem) -(MOVBstorezeroidx (MOVDconst [c]) idx mem) -> (MOVBstorezero [c] idx mem) +(MOVDstorezero [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil => (MOVDstorezeroidx ptr idx mem) +(MOVWstorezero [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil => (MOVWstorezeroidx ptr idx mem) +(MOVHstorezero [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil => (MOVHstorezeroidx ptr idx mem) +(MOVBstorezero [off] {sym} (ADD ptr idx) mem) && off == 0 && sym == nil => (MOVBstorezeroidx ptr idx mem) +(MOVDstoreidx ptr idx (MOVDconst [0]) mem) => (MOVDstorezeroidx ptr idx mem) +(MOVWstoreidx ptr idx (MOVDconst [0]) mem) => (MOVWstorezeroidx ptr idx mem) +(MOVHstoreidx ptr idx (MOVDconst [0]) mem) => (MOVHstorezeroidx ptr idx mem) +(MOVBstoreidx ptr idx (MOVDconst [0]) mem) => (MOVBstorezeroidx ptr idx mem) +(MOVDstorezeroidx ptr (MOVDconst [c]) mem) && is32Bit(c) => (MOVDstorezero [int32(c)] ptr mem) +(MOVDstorezeroidx (MOVDconst [c]) idx mem) && is32Bit(c) => (MOVDstorezero [int32(c)] idx mem) +(MOVWstorezeroidx ptr (MOVDconst [c]) mem) && is32Bit(c) => (MOVWstorezero [int32(c)] ptr mem) +(MOVWstorezeroidx (MOVDconst [c]) idx mem) && is32Bit(c) => (MOVWstorezero [int32(c)] idx mem) +(MOVHstorezeroidx ptr (MOVDconst [c]) mem) && is32Bit(c) => (MOVHstorezero [int32(c)] ptr mem) +(MOVHstorezeroidx (MOVDconst [c]) idx mem) && is32Bit(c) => (MOVHstorezero [int32(c)] idx mem) +(MOVBstorezeroidx ptr (MOVDconst [c]) mem) && is32Bit(c) => (MOVBstorezero [int32(c)] ptr mem) +(MOVBstorezeroidx (MOVDconst [c]) idx mem) && is32Bit(c) => (MOVBstorezero [int32(c)] idx mem) // shifted register indexed store zero -(MOVDstorezero [off] {sym} (ADDshiftLL [3] ptr idx) mem) && off == 0 && sym == nil -> (MOVDstorezeroidx8 ptr idx mem) -(MOVWstorezero [off] {sym} (ADDshiftLL [2] ptr idx) mem) && off == 0 && sym == nil -> (MOVWstorezeroidx4 ptr idx mem) -(MOVHstorezero [off] {sym} (ADDshiftLL [1] ptr idx) mem) && off == 0 && sym == nil -> (MOVHstorezeroidx2 ptr idx mem) -(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) -(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) -(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) -(MOVDstorezeroidx8 ptr (MOVDconst [c]) mem) -> (MOVDstorezero [c<<3] ptr mem) -(MOVWstorezeroidx4 ptr (MOVDconst [c]) mem) -> (MOVWstorezero [c<<2] ptr mem) -(MOVHstorezeroidx2 ptr (MOVDconst [c]) mem) -> (MOVHstorezero [c<<1] ptr mem) +(MOVDstorezero [off] {sym} (ADDshiftLL [3] ptr idx) mem) && off == 0 && sym == nil => (MOVDstorezeroidx8 ptr idx mem) +(MOVWstorezero [off] {sym} (ADDshiftLL [2] ptr idx) mem) && off == 0 && sym == nil => (MOVWstorezeroidx4 ptr idx mem) +(MOVHstorezero [off] {sym} (ADDshiftLL [1] ptr idx) mem) && off == 0 && sym == nil => (MOVHstorezeroidx2 ptr idx mem) +(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) +(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) +(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) +(MOVDstorezeroidx8 ptr (MOVDconst [c]) mem) && is32Bit(c<<3) => (MOVDstorezero [int32(c<<3)] ptr mem) +(MOVWstorezeroidx4 ptr (MOVDconst [c]) mem) && is32Bit(c<<2) => (MOVWstorezero [int32(c<<2)] ptr mem) +(MOVHstorezeroidx2 ptr (MOVDconst [c]) mem) && is32Bit(c<<1) => (MOVHstorezero [int32(c<<1)] ptr mem) // 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 @@ -998,121 +998,121 @@ //(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 -(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]) -(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]) -(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]) +(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]) +(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]) +(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]) (MOVBloadidx ptr idx (MOVBstorezeroidx ptr2 idx2 _)) - && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) -> (MOVDconst [0]) + && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) => (MOVDconst [0]) (MOVBUloadidx ptr idx (MOVBstorezeroidx ptr2 idx2 _)) - && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) -> (MOVDconst [0]) + && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) => (MOVDconst [0]) (MOVHloadidx ptr idx (MOVHstorezeroidx ptr2 idx2 _)) - && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) -> (MOVDconst [0]) + && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) => (MOVDconst [0]) (MOVHUloadidx ptr idx (MOVHstorezeroidx ptr2 idx2 _)) - && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) -> (MOVDconst [0]) + && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) => (MOVDconst [0]) (MOVWloadidx ptr idx (MOVWstorezeroidx ptr2 idx2 _)) - && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) -> (MOVDconst [0]) + && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) => (MOVDconst [0]) (MOVWUloadidx ptr idx (MOVWstorezeroidx ptr2 idx2 _)) - && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) -> (MOVDconst [0]) + && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) => (MOVDconst [0]) (MOVDloadidx ptr idx (MOVDstorezeroidx ptr2 idx2 _)) - && (isSamePtr(ptr, ptr2) && isSamePtr(idx, idx2) || isSamePtr(ptr, idx2) && isSamePtr(idx, ptr2)) -> (MOVDconst [0]) + && (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]) -(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]) -(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]) +(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]) +(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]) // don't extend after proper load -(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) -(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) -(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) -(MOVHUreg x:(MOVHUloadidx2 _ _ _)) -> (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) +(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) +(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) +(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) +(MOVHUreg x:(MOVHUloadidx2 _ _ _)) => (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) -(MOVBUreg x:(MOVBUreg _)) -> (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) -(MOVWUreg x:(MOVBUreg _)) -> (MOVDreg x) -(MOVWUreg x:(MOVHUreg _)) -> (MOVDreg x) -(MOVWUreg x:(MOVWUreg _)) -> (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) +(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) +(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 (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 (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 (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 (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 (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 (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) -(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 (MOVWUreg x) mem) -> (MOVHstoreidx2 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) +(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 (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 (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 (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 (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 (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) +(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 (MOVWUreg x) mem) => (MOVHstoreidx2 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 // MOVDnop doesn't emit instruction, only for ensuring the type. diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 842eddbf4a..71743d7a34 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -6248,20 +6248,20 @@ func rewriteValueARM64_OpARM64MOVBUload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVBstorezero { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (MOVBUload [off] {sym} (SB) _) @@ -6334,7 +6334,7 @@ func rewriteValueARM64_OpARM64MOVBUloadidx(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -6517,20 +6517,20 @@ func rewriteValueARM64_OpARM64MOVBload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVBstorezero { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -6590,7 +6590,7 @@ func rewriteValueARM64_OpARM64MOVBloadidx(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -6750,8 +6750,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // match: (MOVBstore [off] {sym} ptr (MOVBreg x) mem) // result: (MOVBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVBreg { break @@ -6759,16 +6759,16 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVBUreg x) mem) // result: (MOVBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVBUreg { break @@ -6776,16 +6776,16 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVHreg x) mem) // result: (MOVBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVHreg { break @@ -6793,16 +6793,16 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVHUreg x) mem) // result: (MOVBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVHUreg { break @@ -6810,16 +6810,16 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVWreg x) mem) // result: (MOVBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVWreg { break @@ -6827,16 +6827,16 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVWUreg x) mem) // result: (MOVBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVWUreg { break @@ -6844,8 +6844,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -8221,7 +8221,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { for { ptr := v_0 idx := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } mem := v_3 @@ -8566,8 +8566,8 @@ func rewriteValueARM64_OpARM64MOVBstorezero(v *Value) bool { // cond: off == 0 && sym == nil // result: (MOVBstorezeroidx ptr idx mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -8647,30 +8647,38 @@ func rewriteValueARM64_OpARM64MOVBstorezeroidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBstorezeroidx ptr (MOVDconst [c]) mem) - // result: (MOVBstorezero [c] ptr mem) + // cond: is32Bit(c) + // result: (MOVBstorezero [int32(c)] ptr mem) for { ptr := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 + if !(is32Bit(c)) { + break + } v.reset(OpARM64MOVBstorezero) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(ptr, mem) return true } // match: (MOVBstorezeroidx (MOVDconst [c]) idx mem) - // result: (MOVBstorezero [c] idx mem) + // cond: is32Bit(c) + // result: (MOVBstorezero [int32(c)] idx mem) for { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) idx := v_1 mem := v_2 + if !(is32Bit(c)) { + break + } v.reset(OpARM64MOVBstorezero) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(idx, mem) return true } @@ -8804,20 +8812,20 @@ func rewriteValueARM64_OpARM64MOVDload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVDstorezero { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (MOVDload [off] {sym} (SB) _) @@ -8916,7 +8924,7 @@ func rewriteValueARM64_OpARM64MOVDloadidx(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -8958,7 +8966,7 @@ func rewriteValueARM64_OpARM64MOVDloadidx8(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -9192,7 +9200,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx(v *Value) bool { for { ptr := v_0 idx := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } mem := v_3 @@ -9231,7 +9239,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx8(v *Value) bool { for { ptr := v_0 idx := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } mem := v_3 @@ -9293,8 +9301,8 @@ func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool { // cond: off == 0 && sym == nil // result: (MOVDstorezeroidx ptr idx mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -9312,9 +9320,9 @@ func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool { // cond: off == 0 && sym == nil // result: (MOVDstorezeroidx8 ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 3 { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 3 { break } idx := v_0.Args[1] @@ -9426,30 +9434,38 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDstorezeroidx ptr (MOVDconst [c]) mem) - // result: (MOVDstorezero [c] ptr mem) + // cond: is32Bit(c) + // result: (MOVDstorezero [int32(c)] ptr mem) for { ptr := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 + if !(is32Bit(c)) { + break + } v.reset(OpARM64MOVDstorezero) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(ptr, mem) return true } // match: (MOVDstorezeroidx (MOVDconst [c]) idx mem) - // result: (MOVDstorezero [c] idx mem) + // cond: is32Bit(c) + // result: (MOVDstorezero [int32(c)] idx mem) for { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) idx := v_1 mem := v_2 + if !(is32Bit(c)) { + break + } v.reset(OpARM64MOVDstorezero) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(idx, mem) return true } @@ -9457,7 +9473,7 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx(v *Value) bool { // result: (MOVDstorezeroidx8 ptr idx mem) for { ptr := v_0 - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 3 { + if v_1.Op != OpARM64SLLconst || auxIntToInt64(v_1.AuxInt) != 3 { break } idx := v_1.Args[0] @@ -9469,7 +9485,7 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx(v *Value) bool { // match: (MOVDstorezeroidx (SLLconst [3] idx) ptr mem) // result: (MOVDstorezeroidx8 ptr idx mem) for { - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 3 { + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 3 { break } idx := v_0.Args[0] @@ -9486,16 +9502,20 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx8(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDstorezeroidx8 ptr (MOVDconst [c]) mem) - // result: (MOVDstorezero [c<<3] ptr mem) + // cond: is32Bit(c<<3) + // result: (MOVDstorezero [int32(c<<3)] ptr mem) for { ptr := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 + if !(is32Bit(c << 3)) { + break + } v.reset(OpARM64MOVDstorezero) - v.AuxInt = c << 3 + v.AuxInt = int32ToAuxInt(int32(c << 3)) v.AddArg2(ptr, mem) return true } @@ -9591,20 +9611,20 @@ func rewriteValueARM64_OpARM64MOVHUload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVHstorezero { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (MOVHUload [off] {sym} (SB) _) @@ -9722,7 +9742,7 @@ func rewriteValueARM64_OpARM64MOVHUloadidx(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -9764,7 +9784,7 @@ func rewriteValueARM64_OpARM64MOVHUloadidx2(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -9998,20 +10018,20 @@ func rewriteValueARM64_OpARM64MOVHload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVHstorezero { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -10116,7 +10136,7 @@ func rewriteValueARM64_OpARM64MOVHloadidx(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -10158,7 +10178,7 @@ func rewriteValueARM64_OpARM64MOVHloadidx2(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -10415,8 +10435,8 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // match: (MOVHstore [off] {sym} ptr (MOVHreg x) mem) // result: (MOVHstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVHreg { break @@ -10424,16 +10444,16 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVHstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVHstore [off] {sym} ptr (MOVHUreg x) mem) // result: (MOVHstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVHUreg { break @@ -10441,16 +10461,16 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVHstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVHstore [off] {sym} ptr (MOVWreg x) mem) // result: (MOVHstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVWreg { break @@ -10458,16 +10478,16 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVHstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVHstore [off] {sym} ptr (MOVWUreg x) mem) // result: (MOVHstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVWUreg { break @@ -10475,8 +10495,8 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVHstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10998,7 +11018,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx(v *Value) bool { for { ptr := v_0 idx := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } mem := v_3 @@ -11118,7 +11138,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2(v *Value) bool { for { ptr := v_0 idx := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } mem := v_3 @@ -11236,8 +11256,8 @@ func rewriteValueARM64_OpARM64MOVHstorezero(v *Value) bool { // cond: off == 0 && sym == nil // result: (MOVHstorezeroidx ptr idx mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -11255,9 +11275,9 @@ func rewriteValueARM64_OpARM64MOVHstorezero(v *Value) bool { // cond: off == 0 && sym == nil // result: (MOVHstorezeroidx2 ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 1 { break } idx := v_0.Args[1] @@ -11366,30 +11386,38 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHstorezeroidx ptr (MOVDconst [c]) mem) - // result: (MOVHstorezero [c] ptr mem) + // cond: is32Bit(c) + // result: (MOVHstorezero [int32(c)] ptr mem) for { ptr := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 + if !(is32Bit(c)) { + break + } v.reset(OpARM64MOVHstorezero) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(ptr, mem) return true } // match: (MOVHstorezeroidx (MOVDconst [c]) idx mem) - // result: (MOVHstorezero [c] idx mem) + // cond: is32Bit(c) + // result: (MOVHstorezero [int32(c)] idx mem) for { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) idx := v_1 mem := v_2 + if !(is32Bit(c)) { + break + } v.reset(OpARM64MOVHstorezero) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(idx, mem) return true } @@ -11397,7 +11425,7 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx(v *Value) bool { // result: (MOVHstorezeroidx2 ptr idx mem) for { ptr := v_0 - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64SLLconst || auxIntToInt64(v_1.AuxInt) != 1 { break } idx := v_1.Args[0] @@ -11425,7 +11453,7 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx(v *Value) bool { // match: (MOVHstorezeroidx (SLLconst [1] idx) ptr mem) // result: (MOVHstorezeroidx2 ptr idx mem) for { - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 1 { + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 1 { break } idx := v_0.Args[0] @@ -11479,16 +11507,20 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx2(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHstorezeroidx2 ptr (MOVDconst [c]) mem) - // result: (MOVHstorezero [c<<1] ptr mem) + // cond: is32Bit(c<<1) + // result: (MOVHstorezero [int32(c<<1)] ptr mem) for { ptr := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 + if !(is32Bit(c << 1)) { + break + } v.reset(OpARM64MOVHstorezero) - v.AuxInt = c << 1 + v.AuxInt = int32ToAuxInt(int32(c << 1)) v.AddArg2(ptr, mem) return true } @@ -11651,20 +11683,20 @@ func rewriteValueARM64_OpARM64MOVWUload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVWstorezero { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (MOVWUload [off] {sym} (SB) _) @@ -11763,7 +11795,7 @@ func rewriteValueARM64_OpARM64MOVWUloadidx(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -11805,7 +11837,7 @@ func rewriteValueARM64_OpARM64MOVWUloadidx4(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -12083,20 +12115,20 @@ func rewriteValueARM64_OpARM64MOVWload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVDconst [0]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVWstorezero { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -12182,7 +12214,7 @@ func rewriteValueARM64_OpARM64MOVWloadidx(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -12224,7 +12256,7 @@ func rewriteValueARM64_OpARM64MOVWloadidx4(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -12575,8 +12607,8 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { // match: (MOVWstore [off] {sym} ptr (MOVWreg x) mem) // result: (MOVWstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVWreg { break @@ -12584,16 +12616,16 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVWstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVWstore [off] {sym} ptr (MOVWUreg x) mem) // result: (MOVWstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpARM64MOVWUreg { break @@ -12601,8 +12633,8 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpARM64MOVWstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -12884,7 +12916,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx(v *Value) bool { for { ptr := v_0 idx := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } mem := v_3 @@ -12976,7 +13008,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4(v *Value) bool { for { ptr := v_0 idx := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } mem := v_3 @@ -13066,8 +13098,8 @@ func rewriteValueARM64_OpARM64MOVWstorezero(v *Value) bool { // cond: off == 0 && sym == nil // result: (MOVWstorezeroidx ptr idx mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -13085,9 +13117,9 @@ func rewriteValueARM64_OpARM64MOVWstorezero(v *Value) bool { // cond: off == 0 && sym == nil // result: (MOVWstorezeroidx4 ptr idx mem) for { - off := v.AuxInt - sym := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 2 { break } idx := v_0.Args[1] @@ -13196,30 +13228,38 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWstorezeroidx ptr (MOVDconst [c]) mem) - // result: (MOVWstorezero [c] ptr mem) + // cond: is32Bit(c) + // result: (MOVWstorezero [int32(c)] ptr mem) for { ptr := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 + if !(is32Bit(c)) { + break + } v.reset(OpARM64MOVWstorezero) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(ptr, mem) return true } // match: (MOVWstorezeroidx (MOVDconst [c]) idx mem) - // result: (MOVWstorezero [c] idx mem) + // cond: is32Bit(c) + // result: (MOVWstorezero [int32(c)] idx mem) for { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) idx := v_1 mem := v_2 + if !(is32Bit(c)) { + break + } v.reset(OpARM64MOVWstorezero) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(idx, mem) return true } @@ -13227,7 +13267,7 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx(v *Value) bool { // result: (MOVWstorezeroidx4 ptr idx mem) for { ptr := v_0 - if v_1.Op != OpARM64SLLconst || v_1.AuxInt != 2 { + if v_1.Op != OpARM64SLLconst || auxIntToInt64(v_1.AuxInt) != 2 { break } idx := v_1.Args[0] @@ -13239,7 +13279,7 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx(v *Value) bool { // match: (MOVWstorezeroidx (SLLconst [2] idx) ptr mem) // result: (MOVWstorezeroidx4 ptr idx mem) for { - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 2 { + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 2 { break } idx := v_0.Args[0] @@ -13277,16 +13317,20 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx4(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWstorezeroidx4 ptr (MOVDconst [c]) mem) - // result: (MOVWstorezero [c<<2] ptr mem) + // cond: is32Bit(c<<2) + // result: (MOVWstorezero [int32(c<<2)] ptr mem) for { ptr := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 + if !(is32Bit(c << 2)) { + break + } v.reset(OpARM64MOVWstorezero) - v.AuxInt = c << 2 + v.AuxInt = int32ToAuxInt(int32(c << 2)) v.AddArg2(ptr, mem) return true } -- GitLab From ffbd8524ac4777e164ac20d80c1d8bd6a4ad5ccc Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Tue, 12 May 2020 19:47:23 +0800 Subject: [PATCH 0300/1792] cmd/compile: convert typed aux to CCop for ARM64 rules Add a new conversion function to convert aux type to Op type. Passes toolstash-check -all. Change-Id: I25d649a5296f6f178d64320dfc5d291e0a597e24 Reviewed-on: https://go-review.googlesource.com/c/go/+/233739 Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/ARM64.rules | 102 +++++++-------- src/cmd/compile/internal/ssa/rewrite.go | 7 +- src/cmd/compile/internal/ssa/rewriteARM64.go | 126 +++++++++---------- 3 files changed, 119 insertions(+), 116 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 188528fade..a30ef3a104 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -1451,38 +1451,38 @@ (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) -(NZW (MOVDconst [c]) yes no) && int32(c) == 0 -> (First no yes) -(NZW (MOVDconst [c]) yes no) && int32(c) != 0 -> (First yes no) +(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) -(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) -(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) -(FGE (InvertFlags cmp) yes no) -> (FLE 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) +(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) +(FGE (InvertFlags cmp) yes no) => (FLE cmp yes no) (LTnoov (InvertFlags cmp) yes no) => (GTnoov cmp yes no) (GEnoov (InvertFlags cmp) yes no) => (LEnoov cmp yes no) (LEnoov (InvertFlags cmp) yes no) => (GEnoov cmp yes no) (GTnoov (InvertFlags cmp) yes no) => (LTnoov cmp yes no) // absorb InvertFlags into CSEL(0) -(CSEL {cc} x y (InvertFlags cmp)) -> (CSEL {arm64Invert(cc.(Op))} x y cmp) -(CSEL0 {cc} x (InvertFlags cmp)) -> (CSEL0 {arm64Invert(cc.(Op))} x cmp) +(CSEL {cc} x y (InvertFlags cmp)) => (CSEL {arm64Invert(cc)} x y cmp) +(CSEL0 {cc} x (InvertFlags cmp)) => (CSEL0 {arm64Invert(cc)} x cmp) // absorb flag constants into boolean values (Equal (FlagConstant [fc])) => (MOVDconst [b2i(fc.eq())]) @@ -1497,39 +1497,39 @@ (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) // Boolean-generating instructions always // zero upper bit of the register; no need to zero-extend -(MOVBUreg x) && x.Type.IsBoolean() -> (MOVDreg x) +(MOVBUreg x) && x.Type.IsBoolean() => (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]) // absorb flags back into boolean CSEL -(CSEL {cc} x y (CMPWconst [0] boolval)) && cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil -> +(CSEL {cc} x y (CMPWconst [0] boolval)) && cc == OpARM64NotEqual && flagArg(boolval) != nil => (CSEL {boolval.Op} x y flagArg(boolval)) -(CSEL {cc} x y (CMPWconst [0] boolval)) && cc.(Op) == OpARM64Equal && flagArg(boolval) != nil -> +(CSEL {cc} x y (CMPWconst [0] boolval)) && cc == OpARM64Equal && flagArg(boolval) != nil => (CSEL {arm64Negate(boolval.Op)} x y flagArg(boolval)) -(CSEL0 {cc} x (CMPWconst [0] boolval)) && cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil -> +(CSEL0 {cc} x (CMPWconst [0] boolval)) && cc == OpARM64NotEqual && flagArg(boolval) != nil => (CSEL0 {boolval.Op} x flagArg(boolval)) -(CSEL0 {cc} x (CMPWconst [0] boolval)) && cc.(Op) == OpARM64Equal && flagArg(boolval) != nil -> +(CSEL0 {cc} x (CMPWconst [0] boolval)) && cc == OpARM64Equal && flagArg(boolval) != nil => (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) // absorb shifts into ops @@ -1692,11 +1692,11 @@ // As arm64 does not have a ROL instruction, so ROL(x, y) is replaced by ROR(x, -y). ((ADD|OR|XOR) (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) - (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) && cc.(Op) == OpARM64LessThanU + (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) && cc == OpARM64LessThanU -> (ROR x (NEG y)) ((ADD|OR|XOR) (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) - (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) && cc.(Op) == OpARM64LessThanU + (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) && cc == OpARM64LessThanU -> (ROR x y) // These rules match the Go source code like @@ -1706,11 +1706,11 @@ // As arm64 does not have a ROLW instruction, so ROLW(x, y) is replaced by RORW(x, -y). ((ADD|OR|XOR) (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) - (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc.(Op) == OpARM64LessThanU + (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc == OpARM64LessThanU -> (RORW x (NEG y)) ((ADD|OR|XOR) (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) - (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc.(Op) == OpARM64LessThanU + (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc == OpARM64LessThanU -> (RORW x y) // ((x>>8) | (x<<8)) -> (REV16W x), the type of x is uint16, "|" can also be "^" or "+". diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index e082bb1dfa..0b35abf06d 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -705,6 +705,10 @@ func cCopToAux(o Op) interface{} { return o } +func auxToCCop(cc interface{}) Op { + return cc.(Op) +} + // uaddOvf reports whether unsigned a+b would overflow. func uaddOvf(a, b int64) bool { return uint64(a)+uint64(b) < uint64(a) @@ -1008,8 +1012,7 @@ func arm64Invert(op Op) Op { // evaluate an ARM64 op against a flags value // that is potentially constant; return 1 for true, // -1 for false, and 0 for not constant. -func ccARM64Eval(cc interface{}, flags *Value) int { - op := cc.(Op) +func ccARM64Eval(op Op, flags *Value) int { fop := flags.Op if fop == OpARM64InvertFlags { return -ccARM64Eval(op, flags.Args[0]) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 71743d7a34..8655880b38 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -1286,7 +1286,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { break } // match: (ADD (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (ROR x (NEG y)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -1344,7 +1344,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -1356,7 +1356,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { break } // match: (ADD (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (ROR x y) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -1414,7 +1414,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -1424,7 +1424,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { break } // match: (ADD (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (RORW x (NEG y)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -1483,7 +1483,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -1495,7 +1495,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { break } // match: (ADD (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (RORW x y) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -1557,7 +1557,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -3207,9 +3207,9 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { return true } // match: (CSEL {cc} x y (InvertFlags cmp)) - // result: (CSEL {arm64Invert(cc.(Op))} x y cmp) + // result: (CSEL {arm64Invert(cc)} x y cmp) for { - cc := v.Aux + cc := auxToCCop(v.Aux) x := v_0 y := v_1 if v_2.Op != OpARM64InvertFlags { @@ -3217,7 +3217,7 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { } cmp := v_2.Args[0] v.reset(OpARM64CSEL) - v.Aux = arm64Invert(cc.(Op)) + v.Aux = cCopToAux(arm64Invert(cc)) v.AddArg3(x, y, cmp) return true } @@ -3225,7 +3225,7 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { // cond: ccARM64Eval(cc, flag) > 0 // result: x for { - cc := v.Aux + cc := auxToCCop(v.Aux) x := v_0 flag := v_2 if !(ccARM64Eval(cc, flag) > 0) { @@ -3238,7 +3238,7 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { // cond: ccARM64Eval(cc, flag) < 0 // result: y for { - cc := v.Aux + cc := auxToCCop(v.Aux) y := v_1 flag := v_2 if !(ccARM64Eval(cc, flag) < 0) { @@ -3248,40 +3248,40 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { return true } // match: (CSEL {cc} x y (CMPWconst [0] boolval)) - // cond: cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil + // cond: cc == OpARM64NotEqual && flagArg(boolval) != nil // result: (CSEL {boolval.Op} x y flagArg(boolval)) for { - cc := v.Aux + cc := auxToCCop(v.Aux) x := v_0 y := v_1 - if v_2.Op != OpARM64CMPWconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64CMPWconst || auxIntToInt32(v_2.AuxInt) != 0 { break } boolval := v_2.Args[0] - if !(cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil) { + if !(cc == OpARM64NotEqual && flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL) - v.Aux = boolval.Op + v.Aux = cCopToAux(boolval.Op) v.AddArg3(x, y, flagArg(boolval)) return true } // match: (CSEL {cc} x y (CMPWconst [0] boolval)) - // cond: cc.(Op) == OpARM64Equal && flagArg(boolval) != nil + // cond: cc == OpARM64Equal && flagArg(boolval) != nil // result: (CSEL {arm64Negate(boolval.Op)} x y flagArg(boolval)) for { - cc := v.Aux + cc := auxToCCop(v.Aux) x := v_0 y := v_1 - if v_2.Op != OpARM64CMPWconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64CMPWconst || auxIntToInt32(v_2.AuxInt) != 0 { break } boolval := v_2.Args[0] - if !(cc.(Op) == OpARM64Equal && flagArg(boolval) != nil) { + if !(cc == OpARM64Equal && flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL) - v.Aux = arm64Negate(boolval.Op) + v.Aux = cCopToAux(arm64Negate(boolval.Op)) v.AddArg3(x, y, flagArg(boolval)) return true } @@ -3291,16 +3291,16 @@ func rewriteValueARM64_OpARM64CSEL0(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CSEL0 {cc} x (InvertFlags cmp)) - // result: (CSEL0 {arm64Invert(cc.(Op))} x cmp) + // result: (CSEL0 {arm64Invert(cc)} x cmp) for { - cc := v.Aux + cc := auxToCCop(v.Aux) x := v_0 if v_1.Op != OpARM64InvertFlags { break } cmp := v_1.Args[0] v.reset(OpARM64CSEL0) - v.Aux = arm64Invert(cc.(Op)) + v.Aux = cCopToAux(arm64Invert(cc)) v.AddArg2(x, cmp) return true } @@ -3308,7 +3308,7 @@ func rewriteValueARM64_OpARM64CSEL0(v *Value) bool { // cond: ccARM64Eval(cc, flag) > 0 // result: x for { - cc := v.Aux + cc := auxToCCop(v.Aux) x := v_0 flag := v_1 if !(ccARM64Eval(cc, flag) > 0) { @@ -3321,48 +3321,48 @@ func rewriteValueARM64_OpARM64CSEL0(v *Value) bool { // cond: ccARM64Eval(cc, flag) < 0 // result: (MOVDconst [0]) for { - cc := v.Aux + cc := auxToCCop(v.Aux) flag := v_1 if !(ccARM64Eval(cc, flag) < 0) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) - // cond: cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil + // cond: cc == OpARM64NotEqual && flagArg(boolval) != nil // result: (CSEL0 {boolval.Op} x flagArg(boolval)) for { - cc := v.Aux + cc := auxToCCop(v.Aux) x := v_0 - if v_1.Op != OpARM64CMPWconst || v_1.AuxInt != 0 { + if v_1.Op != OpARM64CMPWconst || auxIntToInt32(v_1.AuxInt) != 0 { break } boolval := v_1.Args[0] - if !(cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil) { + if !(cc == OpARM64NotEqual && flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL0) - v.Aux = boolval.Op + v.Aux = cCopToAux(boolval.Op) v.AddArg2(x, flagArg(boolval)) return true } // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) - // cond: cc.(Op) == OpARM64Equal && flagArg(boolval) != nil + // cond: cc == OpARM64Equal && flagArg(boolval) != nil // result: (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) for { - cc := v.Aux + cc := auxToCCop(v.Aux) x := v_0 - if v_1.Op != OpARM64CMPWconst || v_1.AuxInt != 0 { + if v_1.Op != OpARM64CMPWconst || auxIntToInt32(v_1.AuxInt) != 0 { break } boolval := v_1.Args[0] - if !(cc.(Op) == OpARM64Equal && flagArg(boolval) != nil) { + if !(cc == OpARM64Equal && flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL0) - v.Aux = arm64Negate(boolval.Op) + v.Aux = cCopToAux(arm64Negate(boolval.Op)) v.AddArg2(x, flagArg(boolval)) return true } @@ -15044,7 +15044,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { break } // match: (OR (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (ROR x (NEG y)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -15102,7 +15102,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -15114,7 +15114,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { break } // match: (OR (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (ROR x y) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -15172,7 +15172,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -15182,7 +15182,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { break } // match: (OR (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (RORW x (NEG y)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -15241,7 +15241,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -15253,7 +15253,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { break } // match: (OR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (RORW x y) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -15315,7 +15315,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -20714,7 +20714,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { break } // match: (XOR (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (ROR x (NEG y)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -20772,7 +20772,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -20784,7 +20784,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { break } // match: (XOR (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (ROR x y) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -20842,7 +20842,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -20852,7 +20852,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { break } // match: (XOR (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (RORW x (NEG y)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -20911,7 +20911,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -20923,7 +20923,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { break } // match: (XOR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) - // cond: cc.(Op) == OpARM64LessThanU + // cond: cc == OpARM64LessThanU // result: (RORW x y) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -20985,7 +20985,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc.(Op) == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -28256,7 +28256,7 @@ func rewriteBlockARM64(b *Block) bool { // result: (First no yes) for b.Controls[0].Op == OpARM64MOVDconst { v_0 := b.Controls[0] - if v_0.AuxInt != 0 { + if auxIntToInt64(v_0.AuxInt) != 0 { break } b.Reset(BlockFirst) @@ -28268,7 +28268,7 @@ func rewriteBlockARM64(b *Block) bool { // result: (First yes no) for b.Controls[0].Op == OpARM64MOVDconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if !(c != 0) { break } @@ -28295,7 +28295,7 @@ func rewriteBlockARM64(b *Block) bool { // result: (First no yes) for b.Controls[0].Op == OpARM64MOVDconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if !(int32(c) == 0) { break } @@ -28308,7 +28308,7 @@ func rewriteBlockARM64(b *Block) bool { // result: (First yes no) for b.Controls[0].Op == OpARM64MOVDconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if !(int32(c) != 0) { break } @@ -28470,7 +28470,7 @@ func rewriteBlockARM64(b *Block) bool { // result: (First yes no) for b.Controls[0].Op == OpARM64MOVDconst { v_0 := b.Controls[0] - if v_0.AuxInt != 0 { + if auxIntToInt64(v_0.AuxInt) != 0 { break } b.Reset(BlockFirst) @@ -28481,7 +28481,7 @@ func rewriteBlockARM64(b *Block) bool { // result: (First no yes) for b.Controls[0].Op == OpARM64MOVDconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if !(c != 0) { break } @@ -28509,7 +28509,7 @@ func rewriteBlockARM64(b *Block) bool { // result: (First yes no) for b.Controls[0].Op == OpARM64MOVDconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if !(int32(c) == 0) { break } @@ -28521,7 +28521,7 @@ func rewriteBlockARM64(b *Block) bool { // result: (First no yes) for b.Controls[0].Op == OpARM64MOVDconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if !(int32(c) != 0) { break } -- GitLab From 0e031676288ddd56fb410b6b27807a180a585db3 Mon Sep 17 00:00:00 2001 From: Constantin Konstantinidis Date: Sun, 12 Apr 2020 21:28:41 +0200 Subject: [PATCH 0301/1792] cmd/go: use verbose flag to log proxy activities Fixes #29515 Fixes #30604 Change-Id: Ie75a331cd6ca51806c5720443506d4fe0bec28cf Reviewed-on: https://go-review.googlesource.com/c/go/+/227162 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/proxy_test.go | 17 +++++------------ src/cmd/go/testdata/script/mod_download.txt | 1 - .../go/testdata/script/mod_download_json.txt | 1 - src/cmd/go/testdata/script/mod_get_commit.txt | 1 - src/cmd/go/testdata/script/mod_get_moved.txt | 1 - .../go/testdata/script/mod_query_exclude.txt | 1 - 6 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/cmd/go/proxy_test.go b/src/cmd/go/proxy_test.go index 7f58fb8ce4..42972f5b2a 100644 --- a/src/cmd/go/proxy_test.go +++ b/src/cmd/go/proxy_test.go @@ -91,7 +91,7 @@ func readModList() { encPath := strings.ReplaceAll(name[:i], "_", "/") path, err := module.UnescapePath(encPath) if err != nil { - if encPath != "example.com/invalidpath/v1" { + if testing.Verbose() && encPath != "example.com/invalidpath/v1" { fmt.Fprintf(os.Stderr, "go proxy_test: %v\n", err) } continue @@ -137,13 +137,6 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) { return } - // /mod/quiet/ does not print errors. - quiet := false - if strings.HasPrefix(path, "quiet/") { - path = path[len("quiet/"):] - quiet = true - } - // Next element may opt into special behavior. if j := strings.Index(path, "/"); j >= 0 { n, err := strconv.Atoi(path[:j]) @@ -220,7 +213,7 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) { enc := path[:i] modPath, err := module.UnescapePath(enc) if err != nil { - if !quiet { + if testing.Verbose() { fmt.Fprintf(os.Stderr, "go proxy_test: %v\n", err) } http.NotFound(w, r) @@ -273,7 +266,7 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) { enc, file := path[:i], path[i+len("/@v/"):] path, err := module.UnescapePath(enc) if err != nil { - if !quiet { + if testing.Verbose() { fmt.Fprintf(os.Stderr, "go proxy_test: %v\n", err) } http.NotFound(w, r) @@ -339,7 +332,7 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) { a, err := readArchive(path, vers) if err != nil { - if !quiet { + if testing.Verbose() { fmt.Fprintf(os.Stderr, "go proxy: no archive %s %s: %v\n", path, vers, err) } if errors.Is(err, os.ErrNotExist) { @@ -393,7 +386,7 @@ func proxyHandler(w http.ResponseWriter, r *http.Request) { }).(cached) if c.err != nil { - if !quiet { + if testing.Verbose() { fmt.Fprintf(os.Stderr, "go proxy: %v\n", c.err) } http.Error(w, c.err.Error(), 500) diff --git a/src/cmd/go/testdata/script/mod_download.txt b/src/cmd/go/testdata/script/mod_download.txt index 3573928a93..bb5c4627db 100644 --- a/src/cmd/go/testdata/script/mod_download.txt +++ b/src/cmd/go/testdata/script/mod_download.txt @@ -1,5 +1,4 @@ env GO111MODULE=on -env GOPROXY=$GOPROXY/quiet # download with version should print nothing go mod download rsc.io/quote@v1.5.0 diff --git a/src/cmd/go/testdata/script/mod_download_json.txt b/src/cmd/go/testdata/script/mod_download_json.txt index 01c35dd993..26291681ce 100644 --- a/src/cmd/go/testdata/script/mod_download_json.txt +++ b/src/cmd/go/testdata/script/mod_download_json.txt @@ -1,5 +1,4 @@ env GO111MODULE=on -env GOPROXY=$GOPROXY/quiet env GOSUMDB=$sumdb' '$proxy/sumdb-wrong # download -json with version should print JSON on sumdb failure diff --git a/src/cmd/go/testdata/script/mod_get_commit.txt b/src/cmd/go/testdata/script/mod_get_commit.txt index d108242c70..857740ae6c 100644 --- a/src/cmd/go/testdata/script/mod_get_commit.txt +++ b/src/cmd/go/testdata/script/mod_get_commit.txt @@ -1,5 +1,4 @@ env GO111MODULE=on -env GOPROXY=$GOPROXY/quiet [short] skip # @commit should resolve diff --git a/src/cmd/go/testdata/script/mod_get_moved.txt b/src/cmd/go/testdata/script/mod_get_moved.txt index edc41cf948..b46ec8e8b6 100644 --- a/src/cmd/go/testdata/script/mod_get_moved.txt +++ b/src/cmd/go/testdata/script/mod_get_moved.txt @@ -1,5 +1,4 @@ env GO111MODULE=on -env GOPROXY=$GOPROXY/quiet [short] skip # A 'go get' that worked at a previous version should continue to work at that version, diff --git a/src/cmd/go/testdata/script/mod_query_exclude.txt b/src/cmd/go/testdata/script/mod_query_exclude.txt index 1ae0d17844..a64a8e1086 100644 --- a/src/cmd/go/testdata/script/mod_query_exclude.txt +++ b/src/cmd/go/testdata/script/mod_query_exclude.txt @@ -1,5 +1,4 @@ env GO111MODULE=on -env GOPROXY=$GOPROXY/quiet # get excluded version cp go.mod1 go.mod -- GitLab From 85902b6786bbe40b297cbbf823f489b07c654bbd Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Thu, 14 May 2020 17:01:11 +0800 Subject: [PATCH 0302/1792] cmd/compile: convert rest ARM64.rules lines to typed aux mode This patch adds the ARM6464Bitfield auxInt to auxIntType() and returns its Go type as "arm64Bitfield" type, which is defined as int16 type. And the Go type of SymOff auxInt is int32, but some functions (such as min(), areAdjacentOffsets() and read16/32/64(),etc.) use SymOff as an input parameter and treat its type as int64, this patch adds the type conversion for these rules. Passes toolstash-check -all. Change-Id: Ib234b48d0a97ef244dd37878e06b5825316dd782 Reviewed-on: https://go-review.googlesource.com/c/go/+/234378 Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/ARM.rules | 2 +- src/cmd/compile/internal/ssa/gen/ARM64.rules | 722 +++-- src/cmd/compile/internal/ssa/gen/rulegen.go | 2 + src/cmd/compile/internal/ssa/op.go | 6 + src/cmd/compile/internal/ssa/rewrite.go | 16 +- src/cmd/compile/internal/ssa/rewriteARM.go | 12 +- src/cmd/compile/internal/ssa/rewriteARM64.go | 2704 +++++++++--------- src/cmd/compile/internal/ssa/value.go | 11 +- 8 files changed, 1746 insertions(+), 1729 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/ARM.rules b/src/cmd/compile/internal/ssa/gen/ARM.rules index ab8bd0e81e..983f884849 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM.rules @@ -1138,7 +1138,7 @@ // ((x>>8) | (x<<8)) -> (REV16 x), the type of x is uint16, "|" can also be "^" or "+". // UBFX instruction is supported by ARMv6T2, ARMv7 and above versions, REV16 is supported by // ARMv6 and above versions. So for ARMv6, we need to match SLLconst, SRLconst and ORshiftLL. -((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (BFXU [armBFAuxInt(8, 8)] x) x) -> (REV16 x) +((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (BFXU [int32(armBFAuxInt(8, 8))] x) x) => (REV16 x) ((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (SRLconst [24] (SLLconst [16] x)) x) && objabi.GOARM>=6 -> (REV16 x) // use indexed loads and stores diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index a30ef3a104..c29e7f7edf 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -1533,156 +1533,156 @@ (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) // absorb shifts into ops -(NEG x:(SLLconst [c] y)) && clobberIfDead(x) -> (NEGshiftLL [c] y) -(NEG x:(SRLconst [c] y)) && clobberIfDead(x) -> (NEGshiftRL [c] y) -(NEG x:(SRAconst [c] y)) && clobberIfDead(x) -> (NEGshiftRA [c] y) -(MVN x:(SLLconst [c] y)) && clobberIfDead(x) -> (MVNshiftLL [c] y) -(MVN x:(SRLconst [c] y)) && clobberIfDead(x) -> (MVNshiftRL [c] y) -(MVN x:(SRAconst [c] y)) && clobberIfDead(x) -> (MVNshiftRA [c] y) -(ADD x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (ADDshiftLL x0 y [c]) -(ADD x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (ADDshiftRL x0 y [c]) -(ADD x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (ADDshiftRA x0 y [c]) -(SUB x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (SUBshiftLL x0 y [c]) -(SUB x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (SUBshiftRL x0 y [c]) -(SUB x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (SUBshiftRA x0 y [c]) -(AND x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (ANDshiftLL x0 y [c]) -(AND x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (ANDshiftRL x0 y [c]) -(AND x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (ANDshiftRA x0 y [c]) -(OR x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (ORshiftLL x0 y [c]) // useful for combined load -(OR x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (ORshiftRL x0 y [c]) -(OR x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (ORshiftRA x0 y [c]) -(XOR x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (XORshiftLL x0 y [c]) -(XOR x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (XORshiftRL x0 y [c]) -(XOR x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (XORshiftRA x0 y [c]) -(BIC x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (BICshiftLL x0 y [c]) -(BIC x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (BICshiftRL x0 y [c]) -(BIC x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (BICshiftRA x0 y [c]) -(ORN x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (ORNshiftLL x0 y [c]) -(ORN x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (ORNshiftRL x0 y [c]) -(ORN x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (ORNshiftRA x0 y [c]) -(EON x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (EONshiftLL x0 y [c]) -(EON x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (EONshiftRL x0 y [c]) -(EON x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (EONshiftRA x0 y [c]) -(CMP x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (CMPshiftLL x0 y [c]) -(CMP x0:(SLLconst [c] y) x1) && clobberIfDead(x0) -> (InvertFlags (CMPshiftLL x1 y [c])) -(CMP x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (CMPshiftRL x0 y [c]) -(CMP x0:(SRLconst [c] y) x1) && clobberIfDead(x0) -> (InvertFlags (CMPshiftRL x1 y [c])) -(CMP x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (CMPshiftRA x0 y [c]) -(CMP x0:(SRAconst [c] y) x1) && clobberIfDead(x0) -> (InvertFlags (CMPshiftRA x1 y [c])) -(CMN x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (CMNshiftLL x0 y [c]) -(CMN x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (CMNshiftRL x0 y [c]) -(CMN x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (CMNshiftRA x0 y [c]) -(TST x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) -> (TSTshiftLL x0 y [c]) -(TST x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) -> (TSTshiftRL x0 y [c]) -(TST x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) -> (TSTshiftRA x0 y [c]) +(NEG x:(SLLconst [c] y)) && clobberIfDead(x) => (NEGshiftLL [c] y) +(NEG x:(SRLconst [c] y)) && clobberIfDead(x) => (NEGshiftRL [c] y) +(NEG x:(SRAconst [c] y)) && clobberIfDead(x) => (NEGshiftRA [c] y) +(MVN x:(SLLconst [c] y)) && clobberIfDead(x) => (MVNshiftLL [c] y) +(MVN x:(SRLconst [c] y)) && clobberIfDead(x) => (MVNshiftRL [c] y) +(MVN x:(SRAconst [c] y)) && clobberIfDead(x) => (MVNshiftRA [c] y) +(ADD x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (ADDshiftLL x0 y [c]) +(ADD x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (ADDshiftRL x0 y [c]) +(ADD x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (ADDshiftRA x0 y [c]) +(SUB x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (SUBshiftLL x0 y [c]) +(SUB x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (SUBshiftRL x0 y [c]) +(SUB x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (SUBshiftRA x0 y [c]) +(AND x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (ANDshiftLL x0 y [c]) +(AND x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (ANDshiftRL x0 y [c]) +(AND x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (ANDshiftRA x0 y [c]) +(OR x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (ORshiftLL x0 y [c]) // useful for combined load +(OR x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (ORshiftRL x0 y [c]) +(OR x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (ORshiftRA x0 y [c]) +(XOR x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (XORshiftLL x0 y [c]) +(XOR x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (XORshiftRL x0 y [c]) +(XOR x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (XORshiftRA x0 y [c]) +(BIC x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (BICshiftLL x0 y [c]) +(BIC x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (BICshiftRL x0 y [c]) +(BIC x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (BICshiftRA x0 y [c]) +(ORN x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (ORNshiftLL x0 y [c]) +(ORN x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (ORNshiftRL x0 y [c]) +(ORN x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (ORNshiftRA x0 y [c]) +(EON x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (EONshiftLL x0 y [c]) +(EON x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (EONshiftRL x0 y [c]) +(EON x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (EONshiftRA x0 y [c]) +(CMP x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (CMPshiftLL x0 y [c]) +(CMP x0:(SLLconst [c] y) x1) && clobberIfDead(x0) => (InvertFlags (CMPshiftLL x1 y [c])) +(CMP x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (CMPshiftRL x0 y [c]) +(CMP x0:(SRLconst [c] y) x1) && clobberIfDead(x0) => (InvertFlags (CMPshiftRL x1 y [c])) +(CMP x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (CMPshiftRA x0 y [c]) +(CMP x0:(SRAconst [c] y) x1) && clobberIfDead(x0) => (InvertFlags (CMPshiftRA x1 y [c])) +(CMN x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (CMNshiftLL x0 y [c]) +(CMN x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (CMNshiftRL x0 y [c]) +(CMN x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (CMNshiftRA x0 y [c]) +(TST x0 x1:(SLLconst [c] y)) && clobberIfDead(x1) => (TSTshiftLL x0 y [c]) +(TST x0 x1:(SRLconst [c] y)) && clobberIfDead(x1) => (TSTshiftRL x0 y [c]) +(TST x0 x1:(SRAconst [c] y)) && clobberIfDead(x1) => (TSTshiftRA x0 y [c]) // prefer *const ops to *shift ops -(ADDshiftLL (MOVDconst [c]) x [d]) -> (ADDconst [c] (SLLconst x [d])) -(ADDshiftRL (MOVDconst [c]) x [d]) -> (ADDconst [c] (SRLconst x [d])) -(ADDshiftRA (MOVDconst [c]) x [d]) -> (ADDconst [c] (SRAconst x [d])) -(ANDshiftLL (MOVDconst [c]) x [d]) -> (ANDconst [c] (SLLconst x [d])) -(ANDshiftRL (MOVDconst [c]) x [d]) -> (ANDconst [c] (SRLconst x [d])) -(ANDshiftRA (MOVDconst [c]) x [d]) -> (ANDconst [c] (SRAconst x [d])) -(ORshiftLL (MOVDconst [c]) x [d]) -> (ORconst [c] (SLLconst x [d])) -(ORshiftRL (MOVDconst [c]) x [d]) -> (ORconst [c] (SRLconst x [d])) -(ORshiftRA (MOVDconst [c]) x [d]) -> (ORconst [c] (SRAconst x [d])) -(XORshiftLL (MOVDconst [c]) x [d]) -> (XORconst [c] (SLLconst x [d])) -(XORshiftRL (MOVDconst [c]) x [d]) -> (XORconst [c] (SRLconst x [d])) -(XORshiftRA (MOVDconst [c]) x [d]) -> (XORconst [c] (SRAconst x [d])) -(CMPshiftLL (MOVDconst [c]) x [d]) -> (InvertFlags (CMPconst [c] (SLLconst x [d]))) -(CMPshiftRL (MOVDconst [c]) x [d]) -> (InvertFlags (CMPconst [c] (SRLconst x [d]))) -(CMPshiftRA (MOVDconst [c]) x [d]) -> (InvertFlags (CMPconst [c] (SRAconst x [d]))) -(CMNshiftLL (MOVDconst [c]) x [d]) -> (CMNconst [c] (SLLconst x [d])) -(CMNshiftRL (MOVDconst [c]) x [d]) -> (CMNconst [c] (SRLconst x [d])) -(CMNshiftRA (MOVDconst [c]) x [d]) -> (CMNconst [c] (SRAconst x [d])) -(TSTshiftLL (MOVDconst [c]) x [d]) -> (TSTconst [c] (SLLconst x [d])) -(TSTshiftRL (MOVDconst [c]) x [d]) -> (TSTconst [c] (SRLconst x [d])) -(TSTshiftRA (MOVDconst [c]) x [d]) -> (TSTconst [c] (SRAconst x [d])) +(ADDshiftLL (MOVDconst [c]) x [d]) => (ADDconst [c] (SLLconst x [d])) +(ADDshiftRL (MOVDconst [c]) x [d]) => (ADDconst [c] (SRLconst x [d])) +(ADDshiftRA (MOVDconst [c]) x [d]) => (ADDconst [c] (SRAconst x [d])) +(ANDshiftLL (MOVDconst [c]) x [d]) => (ANDconst [c] (SLLconst x [d])) +(ANDshiftRL (MOVDconst [c]) x [d]) => (ANDconst [c] (SRLconst x [d])) +(ANDshiftRA (MOVDconst [c]) x [d]) => (ANDconst [c] (SRAconst x [d])) +(ORshiftLL (MOVDconst [c]) x [d]) => (ORconst [c] (SLLconst x [d])) +(ORshiftRL (MOVDconst [c]) x [d]) => (ORconst [c] (SRLconst x [d])) +(ORshiftRA (MOVDconst [c]) x [d]) => (ORconst [c] (SRAconst x [d])) +(XORshiftLL (MOVDconst [c]) x [d]) => (XORconst [c] (SLLconst x [d])) +(XORshiftRL (MOVDconst [c]) x [d]) => (XORconst [c] (SRLconst x [d])) +(XORshiftRA (MOVDconst [c]) x [d]) => (XORconst [c] (SRAconst x [d])) +(CMPshiftLL (MOVDconst [c]) x [d]) => (InvertFlags (CMPconst [c] (SLLconst x [d]))) +(CMPshiftRL (MOVDconst [c]) x [d]) => (InvertFlags (CMPconst [c] (SRLconst x [d]))) +(CMPshiftRA (MOVDconst [c]) x [d]) => (InvertFlags (CMPconst [c] (SRAconst x [d]))) +(CMNshiftLL (MOVDconst [c]) x [d]) => (CMNconst [c] (SLLconst x [d])) +(CMNshiftRL (MOVDconst [c]) x [d]) => (CMNconst [c] (SRLconst x [d])) +(CMNshiftRA (MOVDconst [c]) x [d]) => (CMNconst [c] (SRAconst x [d])) +(TSTshiftLL (MOVDconst [c]) x [d]) => (TSTconst [c] (SLLconst x [d])) +(TSTshiftRL (MOVDconst [c]) x [d]) => (TSTconst [c] (SRLconst x [d])) +(TSTshiftRA (MOVDconst [c]) x [d]) => (TSTconst [c] (SRAconst x [d])) // constant folding in *shift ops -(MVNshiftLL (MOVDconst [c]) [d]) -> (MOVDconst [^int64(uint64(c)< (MOVDconst [^int64(uint64(c)>>uint64(d))]) -(MVNshiftRA (MOVDconst [c]) [d]) -> (MOVDconst [^(c>>uint64(d))]) -(NEGshiftLL (MOVDconst [c]) [d]) -> (MOVDconst [-int64(uint64(c)< (MOVDconst [-int64(uint64(c)>>uint64(d))]) -(NEGshiftRA (MOVDconst [c]) [d]) -> (MOVDconst [-(c>>uint64(d))]) -(ADDshiftLL x (MOVDconst [c]) [d]) -> (ADDconst x [int64(uint64(c)< (ADDconst x [int64(uint64(c)>>uint64(d))]) -(ADDshiftRA x (MOVDconst [c]) [d]) -> (ADDconst x [c>>uint64(d)]) -(SUBshiftLL x (MOVDconst [c]) [d]) -> (SUBconst x [int64(uint64(c)< (SUBconst x [int64(uint64(c)>>uint64(d))]) -(SUBshiftRA x (MOVDconst [c]) [d]) -> (SUBconst x [c>>uint64(d)]) -(ANDshiftLL x (MOVDconst [c]) [d]) -> (ANDconst x [int64(uint64(c)< (ANDconst x [int64(uint64(c)>>uint64(d))]) -(ANDshiftRA x (MOVDconst [c]) [d]) -> (ANDconst x [c>>uint64(d)]) -(ORshiftLL x (MOVDconst [c]) [d]) -> (ORconst x [int64(uint64(c)< (ORconst x [int64(uint64(c)>>uint64(d))]) -(ORshiftRA x (MOVDconst [c]) [d]) -> (ORconst x [c>>uint64(d)]) -(XORshiftLL x (MOVDconst [c]) [d]) -> (XORconst x [int64(uint64(c)< (XORconst x [int64(uint64(c)>>uint64(d))]) -(XORshiftRA x (MOVDconst [c]) [d]) -> (XORconst x [c>>uint64(d)]) -(BICshiftLL x (MOVDconst [c]) [d]) -> (ANDconst x [^int64(uint64(c)< (ANDconst x [^int64(uint64(c)>>uint64(d))]) -(BICshiftRA x (MOVDconst [c]) [d]) -> (ANDconst x [^(c>>uint64(d))]) -(ORNshiftLL x (MOVDconst [c]) [d]) -> (ORconst x [^int64(uint64(c)< (ORconst x [^int64(uint64(c)>>uint64(d))]) -(ORNshiftRA x (MOVDconst [c]) [d]) -> (ORconst x [^(c>>uint64(d))]) -(EONshiftLL x (MOVDconst [c]) [d]) -> (XORconst x [^int64(uint64(c)< (XORconst x [^int64(uint64(c)>>uint64(d))]) -(EONshiftRA x (MOVDconst [c]) [d]) -> (XORconst x [^(c>>uint64(d))]) -(CMPshiftLL x (MOVDconst [c]) [d]) -> (CMPconst x [int64(uint64(c)< (CMPconst x [int64(uint64(c)>>uint64(d))]) -(CMPshiftRA x (MOVDconst [c]) [d]) -> (CMPconst x [c>>uint64(d)]) -(CMNshiftLL x (MOVDconst [c]) [d]) -> (CMNconst x [int64(uint64(c)< (CMNconst x [int64(uint64(c)>>uint64(d))]) -(CMNshiftRA x (MOVDconst [c]) [d]) -> (CMNconst x [c>>uint64(d)]) -(TSTshiftLL x (MOVDconst [c]) [d]) -> (TSTconst x [int64(uint64(c)< (TSTconst x [int64(uint64(c)>>uint64(d))]) -(TSTshiftRA x (MOVDconst [c]) [d]) -> (TSTconst x [c>>uint64(d)]) +(MVNshiftLL (MOVDconst [c]) [d]) => (MOVDconst [^int64(uint64(c)< (MOVDconst [^int64(uint64(c)>>uint64(d))]) +(MVNshiftRA (MOVDconst [c]) [d]) => (MOVDconst [^(c>>uint64(d))]) +(NEGshiftLL (MOVDconst [c]) [d]) => (MOVDconst [-int64(uint64(c)< (MOVDconst [-int64(uint64(c)>>uint64(d))]) +(NEGshiftRA (MOVDconst [c]) [d]) => (MOVDconst [-(c>>uint64(d))]) +(ADDshiftLL x (MOVDconst [c]) [d]) => (ADDconst x [int64(uint64(c)< (ADDconst x [int64(uint64(c)>>uint64(d))]) +(ADDshiftRA x (MOVDconst [c]) [d]) => (ADDconst x [c>>uint64(d)]) +(SUBshiftLL x (MOVDconst [c]) [d]) => (SUBconst x [int64(uint64(c)< (SUBconst x [int64(uint64(c)>>uint64(d))]) +(SUBshiftRA x (MOVDconst [c]) [d]) => (SUBconst x [c>>uint64(d)]) +(ANDshiftLL x (MOVDconst [c]) [d]) => (ANDconst x [int64(uint64(c)< (ANDconst x [int64(uint64(c)>>uint64(d))]) +(ANDshiftRA x (MOVDconst [c]) [d]) => (ANDconst x [c>>uint64(d)]) +(ORshiftLL x (MOVDconst [c]) [d]) => (ORconst x [int64(uint64(c)< (ORconst x [int64(uint64(c)>>uint64(d))]) +(ORshiftRA x (MOVDconst [c]) [d]) => (ORconst x [c>>uint64(d)]) +(XORshiftLL x (MOVDconst [c]) [d]) => (XORconst x [int64(uint64(c)< (XORconst x [int64(uint64(c)>>uint64(d))]) +(XORshiftRA x (MOVDconst [c]) [d]) => (XORconst x [c>>uint64(d)]) +(BICshiftLL x (MOVDconst [c]) [d]) => (ANDconst x [^int64(uint64(c)< (ANDconst x [^int64(uint64(c)>>uint64(d))]) +(BICshiftRA x (MOVDconst [c]) [d]) => (ANDconst x [^(c>>uint64(d))]) +(ORNshiftLL x (MOVDconst [c]) [d]) => (ORconst x [^int64(uint64(c)< (ORconst x [^int64(uint64(c)>>uint64(d))]) +(ORNshiftRA x (MOVDconst [c]) [d]) => (ORconst x [^(c>>uint64(d))]) +(EONshiftLL x (MOVDconst [c]) [d]) => (XORconst x [^int64(uint64(c)< (XORconst x [^int64(uint64(c)>>uint64(d))]) +(EONshiftRA x (MOVDconst [c]) [d]) => (XORconst x [^(c>>uint64(d))]) +(CMPshiftLL x (MOVDconst [c]) [d]) => (CMPconst x [int64(uint64(c)< (CMPconst x [int64(uint64(c)>>uint64(d))]) +(CMPshiftRA x (MOVDconst [c]) [d]) => (CMPconst x [c>>uint64(d)]) +(CMNshiftLL x (MOVDconst [c]) [d]) => (CMNconst x [int64(uint64(c)< (CMNconst x [int64(uint64(c)>>uint64(d))]) +(CMNshiftRA x (MOVDconst [c]) [d]) => (CMNconst x [c>>uint64(d)]) +(TSTshiftLL x (MOVDconst [c]) [d]) => (TSTconst x [int64(uint64(c)< (TSTconst x [int64(uint64(c)>>uint64(d))]) +(TSTshiftRA x (MOVDconst [c]) [d]) => (TSTconst x [c>>uint64(d)]) // simplification with *shift ops -(SUBshiftLL x (SLLconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(SUBshiftRL x (SRLconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(SUBshiftRA x (SRAconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(ANDshiftLL x y:(SLLconst x [c]) [d]) && c==d -> y -(ANDshiftRL x y:(SRLconst x [c]) [d]) && c==d -> y -(ANDshiftRA x y:(SRAconst x [c]) [d]) && c==d -> y -(ORshiftLL x y:(SLLconst x [c]) [d]) && c==d -> y -(ORshiftRL x y:(SRLconst x [c]) [d]) && c==d -> y -(ORshiftRA x y:(SRAconst x [c]) [d]) && c==d -> y -(XORshiftLL x (SLLconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(XORshiftRL x (SRLconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(XORshiftRA x (SRAconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(BICshiftLL x (SLLconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(BICshiftRL x (SRLconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(BICshiftRA x (SRAconst x [c]) [d]) && c==d -> (MOVDconst [0]) -(EONshiftLL x (SLLconst x [c]) [d]) && c==d -> (MOVDconst [-1]) -(EONshiftRL x (SRLconst x [c]) [d]) && c==d -> (MOVDconst [-1]) -(EONshiftRA x (SRAconst x [c]) [d]) && c==d -> (MOVDconst [-1]) -(ORNshiftLL x (SLLconst x [c]) [d]) && c==d -> (MOVDconst [-1]) -(ORNshiftRL x (SRLconst x [c]) [d]) && c==d -> (MOVDconst [-1]) -(ORNshiftRA x (SRAconst x [c]) [d]) && c==d -> (MOVDconst [-1]) +(SUBshiftLL x (SLLconst x [c]) [d]) && c==d => (MOVDconst [0]) +(SUBshiftRL x (SRLconst x [c]) [d]) && c==d => (MOVDconst [0]) +(SUBshiftRA x (SRAconst x [c]) [d]) && c==d => (MOVDconst [0]) +(ANDshiftLL x y:(SLLconst x [c]) [d]) && c==d => y +(ANDshiftRL x y:(SRLconst x [c]) [d]) && c==d => y +(ANDshiftRA x y:(SRAconst x [c]) [d]) && c==d => y +(ORshiftLL x y:(SLLconst x [c]) [d]) && c==d => y +(ORshiftRL x y:(SRLconst x [c]) [d]) && c==d => y +(ORshiftRA x y:(SRAconst x [c]) [d]) && c==d => y +(XORshiftLL x (SLLconst x [c]) [d]) && c==d => (MOVDconst [0]) +(XORshiftRL x (SRLconst x [c]) [d]) && c==d => (MOVDconst [0]) +(XORshiftRA x (SRAconst x [c]) [d]) && c==d => (MOVDconst [0]) +(BICshiftLL x (SLLconst x [c]) [d]) && c==d => (MOVDconst [0]) +(BICshiftRL x (SRLconst x [c]) [d]) && c==d => (MOVDconst [0]) +(BICshiftRA x (SRAconst x [c]) [d]) && c==d => (MOVDconst [0]) +(EONshiftLL x (SLLconst x [c]) [d]) && c==d => (MOVDconst [-1]) +(EONshiftRL x (SRLconst x [c]) [d]) && c==d => (MOVDconst [-1]) +(EONshiftRA x (SRAconst x [c]) [d]) && c==d => (MOVDconst [-1]) +(ORNshiftLL x (SLLconst x [c]) [d]) && c==d => (MOVDconst [-1]) +(ORNshiftRL x (SRLconst x [c]) [d]) && c==d => (MOVDconst [-1]) +(ORNshiftRA x (SRAconst x [c]) [d]) && c==d => (MOVDconst [-1]) // Generate rotates with const shift -(ADDshiftLL [c] (SRLconst x [64-c]) x) -> (RORconst [64-c] x) -( ORshiftLL [c] (SRLconst x [64-c]) x) -> (RORconst [64-c] x) -(XORshiftLL [c] (SRLconst x [64-c]) x) -> (RORconst [64-c] x) -(ADDshiftRL [c] (SLLconst x [64-c]) x) -> (RORconst [ c] x) -( ORshiftRL [c] (SLLconst x [64-c]) x) -> (RORconst [ c] x) -(XORshiftRL [c] (SLLconst x [64-c]) x) -> (RORconst [ c] x) +(ADDshiftLL [c] (SRLconst x [64-c]) x) => (RORconst [64-c] x) +( ORshiftLL [c] (SRLconst x [64-c]) x) => (RORconst [64-c] x) +(XORshiftLL [c] (SRLconst x [64-c]) x) => (RORconst [64-c] x) +(ADDshiftRL [c] (SLLconst x [64-c]) x) => (RORconst [ c] x) +( ORshiftRL [c] (SLLconst x [64-c]) x) => (RORconst [ c] x) +(XORshiftRL [c] (SLLconst x [64-c]) x) => (RORconst [ c] x) (ADDshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - -> (RORWconst [32-c] x) + => (RORWconst [32-c] x) ( ORshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - -> (RORWconst [32-c] x) + => (RORWconst [32-c] x) (XORshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - -> (RORWconst [32-c] x) -(ADDshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) && c < 32 && t.Size() == 4 -> (RORWconst [c] x) -( ORshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) && c < 32 && t.Size() == 4 -> (RORWconst [c] x) -(XORshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) && c < 32 && t.Size() == 4 -> (RORWconst [c] x) + => (RORWconst [32-c] x) +(ADDshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) && c < 32 && t.Size() == 4 => (RORWconst [c] x) +( ORshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) && c < 32 && t.Size() == 4 => (RORWconst [c] x) +(XORshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) && c < 32 && t.Size() == 4 => (RORWconst [c] x) -(RORconst [c] (RORconst [d] x)) -> (RORconst [(c+d)&63] x) -(RORWconst [c] (RORWconst [d] x)) -> (RORWconst [(c+d)&31] x) +(RORconst [c] (RORconst [d] x)) => (RORconst [(c+d)&63] x) +(RORWconst [c] (RORWconst [d] x)) => (RORWconst [(c+d)&31] x) // Generate rotates with non-const shift. // These rules match the Go source code like @@ -1693,11 +1693,11 @@ ((ADD|OR|XOR) (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) && cc == OpARM64LessThanU - -> (ROR x (NEG y)) + => (ROR x (NEG y)) ((ADD|OR|XOR) (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) && cc == OpARM64LessThanU - -> (ROR x y) + => (ROR x y) // These rules match the Go source code like // y &= 31 @@ -1707,140 +1707,140 @@ ((ADD|OR|XOR) (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc == OpARM64LessThanU - -> (RORW x (NEG y)) + => (RORW x (NEG y)) ((ADD|OR|XOR) (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc == OpARM64LessThanU - -> (RORW x y) + => (RORW x y) -// ((x>>8) | (x<<8)) -> (REV16W x), the type of x is uint16, "|" can also be "^" or "+". -((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (UBFX [armBFAuxInt(8, 8)] x) x) -> (REV16W x) +// ((x>>8) | (x<<8)) => (REV16W x), the type of x is uint16, "|" can also be "^" or "+". +((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (UBFX [armBFAuxInt(8, 8)] x) x) => (REV16W x) // Extract from reg pair -(ADDshiftLL [c] (SRLconst x [64-c]) x2) -> (EXTRconst [64-c] x2 x) -( ORshiftLL [c] (SRLconst x [64-c]) x2) -> (EXTRconst [64-c] x2 x) -(XORshiftLL [c] (SRLconst x [64-c]) x2) -> (EXTRconst [64-c] x2 x) +(ADDshiftLL [c] (SRLconst x [64-c]) x2) => (EXTRconst [64-c] x2 x) +( ORshiftLL [c] (SRLconst x [64-c]) x2) => (EXTRconst [64-c] x2 x) +(XORshiftLL [c] (SRLconst x [64-c]) x2) => (EXTRconst [64-c] x2 x) (ADDshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - -> (EXTRWconst [32-c] x2 x) + => (EXTRWconst [32-c] x2 x) ( ORshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - -> (EXTRWconst [32-c] x2 x) + => (EXTRWconst [32-c] x2 x) (XORshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) - -> (EXTRWconst [32-c] x2 x) + => (EXTRWconst [32-c] x2 x) // Rewrite special pairs of shifts to AND. // On ARM64 the bitmask can fit into an instruction. -(SRLconst [c] (SLLconst [c] x)) && 0 < c && c < 64 -> (ANDconst [1< (ANDconst [^(1< (ANDconst [1< (ANDconst [^(1< (ORconst [c1] x) +(ORconst [c1] (ANDconst [c2] x)) && c2|c1 == ^0 => (ORconst [c1] x) // bitfield ops // sbfiz // (x << lc) >> rc -(SRAconst [rc] (SLLconst [lc] x)) && lc > rc -> (SBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) -(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) +(SRAconst [rc] (SLLconst [lc] x)) && lc > rc => (SBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) +(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) // sbfx // (x << lc) >> rc -(SRAconst [rc] (SLLconst [lc] x)) && lc <= rc -> (SBFX [armBFAuxInt(rc-lc, 64-rc)] x) -(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] (SLLconst [lc] x)) && lc <= rc => (SBFX [armBFAuxInt(rc-lc, 64-rc)] x) +(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) // sbfiz/sbfx combinations: merge shifts into bitfield ops -(SRAconst [sc] (SBFIZ [bfc] x)) && sc < getARM64BFlsb(bfc) - -> (SBFIZ [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) -(SRAconst [sc] (SBFIZ [bfc] x)) && sc >= getARM64BFlsb(bfc) - && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - -> (SBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) +(SRAconst [sc] (SBFIZ [bfc] x)) && sc < bfc.getARM64BFlsb() + => (SBFIZ [armBFAuxInt(bfc.getARM64BFlsb()-sc, bfc.getARM64BFwidth())] x) +(SRAconst [sc] (SBFIZ [bfc] x)) && sc >= bfc.getARM64BFlsb() + && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth() + => (SBFX [armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)] x) // ubfiz // (x & ac) << sc (SLLconst [sc] (ANDconst [ac] x)) && isARM64BFMask(sc, ac, 0) - -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) -(SLLconst [sc] (MOVWUreg x)) && isARM64BFMask(sc, 1<<32-1, 0) -> (UBFIZ [armBFAuxInt(sc, 32)] x) -(SLLconst [sc] (MOVHUreg x)) && isARM64BFMask(sc, 1<<16-1, 0) -> (UBFIZ [armBFAuxInt(sc, 16)] x) -(SLLconst [sc] (MOVBUreg x)) && isARM64BFMask(sc, 1<<8-1, 0) -> (UBFIZ [armBFAuxInt(sc, 8)] x) + => (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) +(SLLconst [sc] (MOVWUreg x)) && isARM64BFMask(sc, 1<<32-1, 0) => (UBFIZ [armBFAuxInt(sc, 32)] x) +(SLLconst [sc] (MOVHUreg x)) && isARM64BFMask(sc, 1<<16-1, 0) => (UBFIZ [armBFAuxInt(sc, 16)] x) +(SLLconst [sc] (MOVBUreg x)) && isARM64BFMask(sc, 1<<8-1, 0) => (UBFIZ [armBFAuxInt(sc, 8)] x) // (x << sc) & ac (ANDconst [ac] (SLLconst [sc] x)) && isARM64BFMask(sc, ac, sc) - -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) + => (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) (MOVWUreg (SLLconst [sc] x)) && isARM64BFMask(sc, 1<<32-1, sc) - -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) + => (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) (MOVHUreg (SLLconst [sc] x)) && isARM64BFMask(sc, 1<<16-1, sc) - -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + => (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) (MOVBUreg (SLLconst [sc] x)) && isARM64BFMask(sc, 1<<8-1, sc) - -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) + => (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) // (x << lc) >> rc -(SRLconst [rc] (SLLconst [lc] x)) && lc > rc -> (UBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) +(SRLconst [rc] (SLLconst [lc] x)) && lc > rc => (UBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) // ubfx // (x >> sc) & ac (ANDconst [ac] (SRLconst [sc] x)) && isARM64BFMask(sc, ac, 0) - -> (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) -(MOVWUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<32-1, 0) -> (UBFX [armBFAuxInt(sc, 32)] x) -(MOVHUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<16-1, 0) -> (UBFX [armBFAuxInt(sc, 16)] x) -(MOVBUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<8-1, 0) -> (UBFX [armBFAuxInt(sc, 8)] x) + => (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) +(MOVWUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<32-1, 0) => (UBFX [armBFAuxInt(sc, 32)] x) +(MOVHUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<16-1, 0) => (UBFX [armBFAuxInt(sc, 16)] x) +(MOVBUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<8-1, 0) => (UBFX [armBFAuxInt(sc, 8)] x) // (x & ac) >> sc (SRLconst [sc] (ANDconst [ac] x)) && isARM64BFMask(sc, ac, sc) - -> (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) + => (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) (SRLconst [sc] (MOVWUreg x)) && isARM64BFMask(sc, 1<<32-1, sc) - -> (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) + => (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) (SRLconst [sc] (MOVHUreg x)) && isARM64BFMask(sc, 1<<16-1, sc) - -> (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + => (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) (SRLconst [sc] (MOVBUreg x)) && isARM64BFMask(sc, 1<<8-1, sc) - -> (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) + => (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) // (x << lc) >> rc -(SRLconst [rc] (SLLconst [lc] x)) && lc < rc -> (UBFX [armBFAuxInt(rc-lc, 64-rc)] x) +(SRLconst [rc] (SLLconst [lc] x)) && lc < rc => (UBFX [armBFAuxInt(rc-lc, 64-rc)] x) // ubfiz/ubfx combinations: merge shifts into bitfield ops -(SRLconst [sc] (UBFX [bfc] x)) && sc < getARM64BFwidth(bfc) - -> (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) -(UBFX [bfc] (SRLconst [sc] x)) && sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 - -> (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) -(SLLconst [sc] (UBFIZ [bfc] x)) && sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 - -> (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) -(UBFIZ [bfc] (SLLconst [sc] x)) && sc < getARM64BFwidth(bfc) - -> (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) +(SRLconst [sc] (UBFX [bfc] x)) && sc < bfc.getARM64BFwidth() + => (UBFX [armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth()-sc)] x) +(UBFX [bfc] (SRLconst [sc] x)) && sc+bfc.getARM64BFwidth()+bfc.getARM64BFlsb() < 64 + => (UBFX [armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth())] x) +(SLLconst [sc] (UBFIZ [bfc] x)) && sc+bfc.getARM64BFwidth()+bfc.getARM64BFlsb() < 64 + => (UBFIZ [armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth())] x) +(UBFIZ [bfc] (SLLconst [sc] x)) && sc < bfc.getARM64BFwidth() + => (UBFIZ [armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth()-sc)] x) // ((x << c1) >> c2) >> c3 -(SRLconst [sc] (UBFIZ [bfc] x)) && sc == getARM64BFlsb(bfc) - -> (ANDconst [1< (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) -(SRLconst [sc] (UBFIZ [bfc] x)) && sc > getARM64BFlsb(bfc) - && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - -> (UBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) +(SRLconst [sc] (UBFIZ [bfc] x)) && sc == bfc.getARM64BFlsb() + => (ANDconst [1< (UBFIZ [armBFAuxInt(bfc.getARM64BFlsb()-sc, bfc.getARM64BFwidth())] x) +(SRLconst [sc] (UBFIZ [bfc] x)) && sc > bfc.getARM64BFlsb() + && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth() + => (UBFX [armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)] x) // ((x << c1) << c2) >> c3 -(UBFX [bfc] (SLLconst [sc] x)) && sc == getARM64BFlsb(bfc) - -> (ANDconst [1< (UBFX [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) -(UBFX [bfc] (SLLconst [sc] x)) && sc > getARM64BFlsb(bfc) - && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - -> (UBFIZ [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) +(UBFX [bfc] (SLLconst [sc] x)) && sc == bfc.getARM64BFlsb() + => (ANDconst [1< (UBFX [armBFAuxInt(bfc.getARM64BFlsb()-sc, bfc.getARM64BFwidth())] x) +(UBFX [bfc] (SLLconst [sc] x)) && sc > bfc.getARM64BFlsb() + && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth() + => (UBFIZ [armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)] x) // bfi (OR (UBFIZ [bfc] x) (ANDconst [ac] y)) - && ac == ^((1< (BFI [bfc] y x) + && ac == ^((1< (BFI [bfc] y x) (ORshiftRL [rc] (ANDconst [ac] x) (SLLconst [lc] y)) && lc > rc && ac == ^((1< (BFI [armBFAuxInt(lc-rc, 64-lc)] x y) + => (BFI [armBFAuxInt(lc-rc, 64-lc)] x y) // bfxil -(OR (UBFX [bfc] x) (ANDconst [ac] y)) && ac == ^(1< (BFXIL [bfc] y x) -(ORshiftLL [sc] (UBFX [bfc] x) (SRLconst [sc] y)) && sc == getARM64BFwidth(bfc) - -> (BFXIL [bfc] y x) +(OR (UBFX [bfc] x) (ANDconst [ac] y)) && ac == ^(1< (BFXIL [bfc] y x) +(ORshiftLL [sc] (UBFX [bfc] x) (SRLconst [sc] y)) && sc == bfc.getARM64BFwidth() + => (BFXIL [bfc] y x) (ORshiftRL [rc] (ANDconst [ac] y) (SLLconst [lc] x)) && lc < rc && ac == ^((1< (BFXIL [armBFAuxInt(rc-lc, 64-rc)] y x) + => (BFXIL [armBFAuxInt(rc-lc, 64-rc)] y x) // do combined loads // little endian loads -// b[0] | b[1]<<8 -> load 16-bit +// b[0] | b[1]<<8 => load 16-bit (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [i0] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) @@ -1849,7 +1849,7 @@ && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, y0, y1) - -> @mergePoint(b,x0,x1) (MOVHUload {s} (OffPtr [i0] p) mem) + => @mergePoint(b,x0,x1) (MOVHUload {s} (OffPtr [int64(i0)] p) mem) (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) @@ -1859,7 +1859,7 @@ && 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 ptr0 idx0 mem) + => @mergePoint(b,x0,x1) (MOVHUloadidx ptr0 idx0 mem) (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) @@ -1867,9 +1867,9 @@ && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, y0, y1) - -> @mergePoint(b,x0,x1) (MOVHUloadidx ptr idx mem) + => @mergePoint(b,x0,x1) (MOVHUloadidx ptr idx mem) -// b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24 -> load 32-bit +// b[0] | b[1]<<8 | b[2]<<16 | b[3]<<24 => load 32-bit (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i2] {s} p mem))) @@ -1881,7 +1881,7 @@ && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, y1, y2, o0) - -> @mergePoint(b,x0,x1,x2) (MOVWUload {s} (OffPtr [i0] p) mem) + => @mergePoint(b,x0,x1,x2) (MOVWUload {s} (OffPtr [int64(i0)] p) mem) (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADD ptr1 idx1) mem))) @@ -1894,7 +1894,7 @@ && (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 ptr0 idx0 mem) + => @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 idx0 mem) (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx ptr idx mem) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [2] idx) mem))) @@ -1904,7 +1904,7 @@ && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, y1, y2, o0) - -> @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr idx mem) + => @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr idx mem) (ORshiftLL [24] o0:(ORshiftLL [16] x0:(MOVHUloadidx2 ptr0 idx0 mem) y1:(MOVDnop x1:(MOVBUload [2] {s} p1:(ADDshiftLL [1] ptr1 idx1) mem))) @@ -1917,9 +1917,9 @@ && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && isSamePtr(p1, p) && clobber(x0, x1, x2, y1, y2, o0) - -> @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 (SLLconst [1] idx0) mem) + => @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 (SLLconst [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 +// 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 [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUload [i0] {s} p mem) y1:(MOVDnop x1:(MOVBUload [i4] {s} p mem))) @@ -1935,7 +1935,7 @@ && 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 {s} (OffPtr [i0] p) mem) + => @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload {s} (OffPtr [int64(i0)] p) mem) (ORshiftLL [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))) @@ -1950,7 +1950,7 @@ && (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 ptr0 idx0 mem) + => @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 idx0 mem) (ORshiftLL [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))) @@ -1965,7 +1965,7 @@ && 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 ptr0 (SLLconst [2] idx0) mem) + => @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 (SLLconst [2] idx0) mem) (ORshiftLL [56] o0:(ORshiftLL [48] o1:(ORshiftLL [40] o2:(ORshiftLL [32] x0:(MOVWUloadidx ptr idx mem) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [4] idx) mem))) @@ -1977,9 +1977,9 @@ && 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 ptr idx mem) + => @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr idx mem) -// b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0] -> load 32-bit +// b[3]<<24 | b[2]<<16 | b[1]<<8 | b[0] => load 32-bit (OR 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))) @@ -1993,7 +1993,7 @@ && 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 {s} (OffPtr [i0] p) mem) + => @mergePoint(b,x0,x1,x2,x3) (MOVWUload {s} (OffPtr [int64(i0)] p) mem) (OR 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))) @@ -2007,7 +2007,7 @@ && (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 ptr0 idx0 mem) + => @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx ptr0 idx0 mem) (OR 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))) @@ -2018,9 +2018,9 @@ && 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 ptr idx mem) + => @mergePoint(b,x0,x1,x2,x3) (MOVWUloadidx 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 +// 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 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))) @@ -2045,7 +2045,7 @@ && 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 {s} (OffPtr [i0] p) mem) + => @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload {s} (OffPtr [int64(i0)] p) mem) (OR 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))) @@ -2066,7 +2066,7 @@ && (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 ptr0 idx0 mem) + => @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr0 idx0 mem) (OR 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))) @@ -2084,10 +2084,10 @@ && 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 ptr idx mem) + => @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDloadidx ptr idx mem) // big endian loads -// b[1] | b[0]<<8 -> load 16-bit, reverse +// b[1] | b[0]<<8 => load 16-bit, reverse (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [i1] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i0] {s} p mem))) @@ -2096,7 +2096,7 @@ && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, y0, y1) - -> @mergePoint(b,x0,x1) (REV16W (MOVHUload [i0] {s} p mem)) + => @mergePoint(b,x0,x1) (REV16W (MOVHUload [i0] {s} p mem)) (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr0 idx0 mem))) @@ -2106,7 +2106,7 @@ && 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 (MOVHUloadidx ptr0 idx0 mem)) + => @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr0 idx0 mem)) (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr (ADDconst [1] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr idx mem))) @@ -2114,9 +2114,9 @@ && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, y0, y1) - -> @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr idx mem)) + => @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr idx mem)) -// b[3] | b[2]<<8 | b[1]<<16 | b[0]<<24 -> load 32-bit, reverse +// b[3] | b[2]<<8 | b[1]<<16 | b[0]<<24 => load 32-bit, reverse (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [i2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i1] {s} p mem))) @@ -2128,7 +2128,7 @@ && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, y0, y1, y2, o0) - -> @mergePoint(b,x0,x1,x2) (REVW (MOVWUload {s} (OffPtr [i0] p) mem)) + => @mergePoint(b,x0,x1,x2) (REVW (MOVWUload {s} (OffPtr [int64(i0)] p) mem)) (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUload [2] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) @@ -2141,7 +2141,7 @@ && (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 (MOVWUloadidx ptr0 idx0 mem)) + => @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr0 idx0 mem)) (ORshiftLL [24] o0:(ORshiftLL [16] y0:(REV16W x0:(MOVHUloadidx ptr (ADDconst [2] idx) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) @@ -2151,9 +2151,9 @@ && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0, x1, x2, y0, y1, y2, o0) - -> @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr idx mem)) + => @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx 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 +// 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 [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))) @@ -2169,7 +2169,7 @@ && 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 (MOVDload {s} (OffPtr [i0] p) mem)) + => @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDload {s} (OffPtr [int64(i0)] p) mem)) (ORshiftLL [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))) @@ -2184,7 +2184,7 @@ && (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 (MOVDloadidx ptr0 idx0 mem)) + => @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr0 idx0 mem)) (ORshiftLL [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))) @@ -2196,9 +2196,9 @@ && 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 (MOVDloadidx ptr idx mem)) + => @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr idx mem)) -// b[0]<<24 | b[1]<<16 | b[2]<<8 | b[3] -> load 32-bit, reverse +// b[0]<<24 | b[1]<<16 | b[2]<<8 | b[3] => load 32-bit, reverse (OR 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))) @@ -2212,7 +2212,7 @@ && 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 (MOVWUload {s} (OffPtr [i0] p) mem)) + => @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUload {s} (OffPtr [int64(i0)] p) mem)) (OR 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))) @@ -2226,7 +2226,7 @@ && (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 (MOVWUloadidx ptr0 idx0 mem)) + => @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr0 idx0 mem)) (OR 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))) @@ -2237,9 +2237,9 @@ && 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 (MOVWUloadidx ptr idx mem)) + => @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx 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 +// 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 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))) @@ -2264,7 +2264,7 @@ && 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 (MOVDload {s} (OffPtr [i0] p) mem)) + => @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDload {s} (OffPtr [int64(i0)] p) mem)) (OR 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))) @@ -2285,7 +2285,7 @@ && (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 (MOVDloadidx ptr0 idx0 mem)) + => @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr0 idx0 mem)) (OR 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))) @@ -2303,290 +2303,286 @@ && 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 (MOVDloadidx ptr idx mem)) + => @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDloadidx ptr idx mem)) // Combine zero stores into larger (unaligned) stores. (MOVBstorezero [i] {s} ptr0 x:(MOVBstorezero [j] {s} ptr1 mem)) && x.Uses == 1 - && areAdjacentOffsets(i,j,1) - && is32Bit(min(i,j)) + && areAdjacentOffsets(int64(i),int64(j),1) && isSamePtr(ptr0, ptr1) && clobber(x) - -> (MOVHstorezero [min(i,j)] {s} ptr0 mem) + => (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) + => (MOVHstorezeroidx ptr1 idx1 mem) (MOVBstorezeroidx ptr (ADDconst [1] idx) x:(MOVBstorezeroidx ptr idx mem)) && x.Uses == 1 && clobber(x) - -> (MOVHstorezeroidx ptr idx mem) + => (MOVHstorezeroidx ptr idx mem) (MOVHstorezero [i] {s} ptr0 x:(MOVHstorezero [j] {s} ptr1 mem)) && x.Uses == 1 - && areAdjacentOffsets(i,j,2) - && is32Bit(min(i,j)) + && areAdjacentOffsets(int64(i),int64(j),2) && isSamePtr(ptr0, ptr1) && clobber(x) - -> (MOVWstorezero [min(i,j)] {s} ptr0 mem) + => (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) + => (MOVWstorezeroidx ptr1 idx1 mem) (MOVHstorezeroidx ptr (ADDconst [2] idx) x:(MOVHstorezeroidx ptr idx mem)) && x.Uses == 1 && clobber(x) - -> (MOVWstorezeroidx ptr idx mem) + => (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 [1] idx1) mem) + => (MOVWstorezeroidx ptr1 (SLLconst [1] idx1) mem) (MOVWstorezero [i] {s} ptr0 x:(MOVWstorezero [j] {s} ptr1 mem)) && x.Uses == 1 - && areAdjacentOffsets(i,j,4) - && is32Bit(min(i,j)) + && areAdjacentOffsets(int64(i),int64(j),4) && isSamePtr(ptr0, ptr1) && clobber(x) - -> (MOVDstorezero [min(i,j)] {s} ptr0 mem) + => (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) + => (MOVDstorezeroidx ptr1 idx1 mem) (MOVWstorezeroidx ptr (ADDconst [4] idx) x:(MOVWstorezeroidx ptr idx mem)) && x.Uses == 1 && clobber(x) - -> (MOVDstorezeroidx ptr idx mem) + => (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 [2] idx1) mem) + => (MOVDstorezeroidx ptr1 (SLLconst [2] idx1) mem) (MOVDstorezero [i] {s} ptr0 x:(MOVDstorezero [j] {s} ptr1 mem)) && x.Uses == 1 - && areAdjacentOffsets(i,j,8) - && is32Bit(min(i,j)) + && areAdjacentOffsets(int64(i),int64(j),8) && isSamePtr(ptr0, ptr1) && clobber(x) - -> (MOVQstorezero [min(i,j)] {s} ptr0 mem) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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) - && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) - && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) - && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 + && bfc.getARM64BFwidth() == 32 - bfc.getARM64BFlsb() + && bfc2.getARM64BFwidth() == 32 - bfc2.getARM64BFlsb() + && bfc2.getARM64BFlsb() == bfc.getARM64BFlsb() - 8 && clobber(x) - -> (MOVHstore [i-1] {s} ptr0 w0 mem) + => (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)) - && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) - && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) - && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 + && bfc.getARM64BFwidth() == 32 - bfc.getARM64BFlsb() + && bfc2.getARM64BFwidth() == 32 - bfc2.getARM64BFlsb() + && bfc2.getARM64BFlsb() == bfc.getARM64BFlsb() - 8 && clobber(x) - -> (MOVHstoreidx ptr1 idx1 w0 mem) + => (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) + => (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) + => (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) + => (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) + => (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) + => (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 [1] idx1) w mem) + => (MOVWstoreidx ptr1 (SLLconst [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) + => (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) + => (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 [1] idx1) w mem) + => (MOVWstoreidx ptr1 (SLLconst [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) + => (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) + => (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 [1] idx1) w mem) + => (MOVWstoreidx ptr1 (SLLconst [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) + => (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) + => (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 [1] idx1) w0 mem) + => (MOVWstoreidx ptr1 (SLLconst [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) + => (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) + => (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) + => (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 [2] idx1) w mem) + => (MOVDstoreidx ptr1 (SLLconst [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) + => (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) + => (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 [2] idx1) w0 mem) + => (MOVDstoreidx ptr1 (SLLconst [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) @@ -2603,7 +2599,7 @@ && x5.Uses == 1 && x6.Uses == 1 && clobber(x0, x1, x2, x3, x4, x5, x6) - -> (MOVDstore [i-7] {s} ptr (REV w) mem) + => (MOVDstore [i-7] {s} ptr (REV w) mem) (MOVBstore [7] {s} p w x0:(MOVBstore [6] {s} p (SRLconst [8] w) x1:(MOVBstore [5] {s} p (SRLconst [16] w) @@ -2623,7 +2619,7 @@ && (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) mem) + => (MOVDstoreidx ptr0 idx0 (REV 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) @@ -2632,7 +2628,7 @@ && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2) - -> (MOVWstore [i-3] {s} ptr (REVW w) mem) + => (MOVWstore [i-3] {s} ptr (REVW 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) @@ -2644,7 +2640,7 @@ && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2) - -> (MOVWstoreidx ptr0 idx0 (REVW w) mem) + => (MOVWstoreidx ptr0 idx0 (REVW 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) @@ -2653,7 +2649,7 @@ && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2) - -> (MOVWstoreidx ptr idx (REVW w) mem) + => (MOVWstoreidx ptr idx (REVW 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) @@ -2662,7 +2658,7 @@ && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2) - -> (MOVWstoreidx ptr idx w mem) + => (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)) @@ -2671,7 +2667,7 @@ && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2) - -> (MOVWstore [i-3] {s} ptr (REVW w) mem) + => (MOVWstore [i-3] {s} ptr (REVW 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)) @@ -2683,7 +2679,7 @@ && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2) - -> (MOVWstoreidx ptr0 idx0 (REVW w) mem) + => (MOVWstoreidx ptr0 idx0 (REVW 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) @@ -2692,7 +2688,7 @@ && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2) - -> (MOVWstore [i-3] {s} ptr (REVW w) mem) + => (MOVWstore [i-3] {s} ptr (REVW 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) @@ -2704,79 +2700,79 @@ && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0, x1, x2) - -> (MOVWstoreidx ptr0 idx0 (REVW w) mem) + => (MOVWstoreidx ptr0 idx0 (REVW 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) mem) + => (MOVHstore [i-1] {s} ptr (REV16W 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) mem) + => (MOVHstoreidx ptr0 idx0 (REV16W 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) mem) + => (MOVHstore [i-1] {s} ptr (REV16W 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) mem) + => (MOVHstoreidx ptr0 idx0 (REV16W 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) mem) + => (MOVHstoreidx ptr idx (REV16W 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) + => (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) mem) + => (MOVHstore [i-1] {s} ptr (REV16W 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) mem) + => (MOVHstoreidx ptr0 idx0 (REV16W 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) mem) + => (MOVHstore [i-1] {s} ptr (REV16W 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) mem) + => (MOVHstoreidx ptr0 idx0 (REV16W 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) -(FADDS a (FMULS x y)) -> (FMADDS a x y) -(FADDD a (FMULD x y)) -> (FMADDD a x y) -(FSUBS a (FMULS x y)) -> (FMSUBS a x y) -(FSUBD a (FMULD x y)) -> (FMSUBD a x y) -(FSUBS (FMULS x y) a) -> (FNMSUBS a x y) -(FSUBD (FMULD x y) a) -> (FNMSUBD a x y) -(FADDS a (FNMULS x y)) -> (FMSUBS a x y) -(FADDD a (FNMULD x y)) -> (FMSUBD a x y) -(FSUBS a (FNMULS x y)) -> (FMADDS a x y) -(FSUBD a (FNMULD x y)) -> (FMADDD a x y) -(FSUBS (FNMULS x y) a) -> (FNMADDS a x y) -(FSUBD (FNMULD x y) a) -> (FNMADDD a x y) - -(MOVBUload [off] {sym} (SB) _) && symIsRO(sym) -> (MOVDconst [int64(read8(sym, off))]) -(MOVHUload [off] {sym} (SB) _) && symIsRO(sym) -> (MOVDconst [int64(read16(sym, off, config.ctxt.Arch.ByteOrder))]) -(MOVWUload [off] {sym} (SB) _) && symIsRO(sym) -> (MOVDconst [int64(read32(sym, off, config.ctxt.Arch.ByteOrder))]) -(MOVDload [off] {sym} (SB) _) && symIsRO(sym) -> (MOVDconst [int64(read64(sym, off, config.ctxt.Arch.ByteOrder))]) +(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)) => (FMADDS a x y) +(FADDD a (FMULD x y)) => (FMADDD a x y) +(FSUBS a (FMULS x y)) => (FMSUBS a x y) +(FSUBD a (FMULD x y)) => (FMSUBD a x y) +(FSUBS (FMULS x y) a) => (FNMSUBS a x y) +(FSUBD (FMULD x y) a) => (FNMSUBD a x y) +(FADDS a (FNMULS x y)) => (FMSUBS a x y) +(FADDD a (FNMULD x y)) => (FMSUBD a x y) +(FSUBS a (FNMULS x y)) => (FMADDS a x y) +(FSUBD a (FNMULD x y)) => (FMADDD a x y) +(FSUBS (FNMULS x y) a) => (FNMADDS a x y) +(FSUBD (FNMULD x y) a) => (FNMADDD a x y) + +(MOVBUload [off] {sym} (SB) _) && symIsRO(sym) => (MOVDconst [int64(read8(sym, int64(off)))]) +(MOVHUload [off] {sym} (SB) _) && symIsRO(sym) => (MOVDconst [int64(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))]) +(MOVWUload [off] {sym} (SB) _) && symIsRO(sym) => (MOVDconst [int64(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))]) +(MOVDload [off] {sym} (SB) _) && symIsRO(sym) => (MOVDconst [int64(read64(sym, int64(off), config.ctxt.Arch.ByteOrder))]) diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index 1104e69b4d..e520503ab1 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -1820,6 +1820,8 @@ func (op opData) auxIntType() string { return "Op" case "FlagConstant": return "flagConstant" + case "ARM64BitField": + return "arm64BitField" default: return "invalid" } diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go index 6ebdf8c3df..063998c6a1 100644 --- a/src/cmd/compile/internal/ssa/op.go +++ b/src/cmd/compile/internal/ssa/op.go @@ -277,3 +277,9 @@ func boundsABI(b int64) int { panic("bad BoundsKind") } } + +// arm64BitFileld is the GO type of ARM64BitField auxInt. +// if x is an ARM64BitField, then width=x&0xff, lsb=(x>>8)&0xff, and +// width+lsb<64 for 64-bit variant, width+lsb<32 for 32-bit variant. +// the meaning of width and lsb are instruction-dependent. +type arm64BitField int16 diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 0b35abf06d..fb35691296 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -618,6 +618,9 @@ func auxIntToFloat64(i int64) float64 { func auxIntToValAndOff(i int64) ValAndOff { return ValAndOff(i) } +func auxIntToArm64BitField(i int64) arm64BitField { + return arm64BitField(i) +} func auxIntToInt128(x int64) int128 { if x != 0 { panic("nonzero int128 not allowed") @@ -658,6 +661,9 @@ func float64ToAuxInt(f float64) int64 { func valAndOffToAuxInt(v ValAndOff) int64 { return int64(v) } +func arm64BitFieldToAuxInt(v arm64BitField) int64 { + return int64(v) +} func int128ToAuxInt(x int128) int64 { if x != 0 { panic("nonzero int128 not allowed") @@ -1295,24 +1301,24 @@ func hasSmallRotate(c *Config) bool { } // encodes the lsb and width for arm(64) bitfield ops into the expected auxInt format. -func armBFAuxInt(lsb, width int64) int64 { +func armBFAuxInt(lsb, width int64) arm64BitField { if lsb < 0 || lsb > 63 { panic("ARM(64) bit field lsb constant out of range") } if width < 1 || width > 64 { panic("ARM(64) bit field width constant out of range") } - return width | lsb<<8 + return arm64BitField(width | lsb<<8) } // returns the lsb part of the auxInt field of arm64 bitfield ops. -func getARM64BFlsb(bfc int64) int64 { +func (bfc arm64BitField) getARM64BFlsb() int64 { return int64(uint64(bfc) >> 8) } // returns the width part of the auxInt field of arm64 bitfield ops. -func getARM64BFwidth(bfc int64) int64 { - return bfc & 0xff +func (bfc arm64BitField) getARM64BFwidth() int64 { + return int64(bfc) & 0xff } // checks if mask >> rshift applied at lsb is a valid arm64 bitfield op mask. diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index f55e542505..eaf20e27b7 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -2069,10 +2069,10 @@ func rewriteValueARM_OpARMADDshiftLL(v *Value) bool { v.AddArg(x) return true } - // match: (ADDshiftLL [8] (BFXU [armBFAuxInt(8, 8)] x) x) + // match: (ADDshiftLL [8] (BFXU [int32(armBFAuxInt(8, 8))] x) x) // result: (REV16 x) for { - if v.Type != typ.UInt16 || v.AuxInt != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) { + if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) { break } x := v_0.Args[0] @@ -8537,10 +8537,10 @@ func rewriteValueARM_OpARMORshiftLL(v *Value) bool { v.AddArg(x) return true } - // match: (ORshiftLL [8] (BFXU [armBFAuxInt(8, 8)] x) x) + // match: (ORshiftLL [8] (BFXU [int32(armBFAuxInt(8, 8))] x) x) // result: (REV16 x) for { - if v.Type != typ.UInt16 || v.AuxInt != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) { + if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) { break } x := v_0.Args[0] @@ -12576,10 +12576,10 @@ func rewriteValueARM_OpARMXORshiftLL(v *Value) bool { v.AddArg(x) return true } - // match: (XORshiftLL [8] (BFXU [armBFAuxInt(8, 8)] x) x) + // match: (XORshiftLL [8] (BFXU [int32(armBFAuxInt(8, 8))] x) x) // result: (REV16 x) for { - if v.Type != typ.UInt16 || v.AuxInt != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) { + if v.Type != typ.UInt16 || auxIntToInt32(v.AuxInt) != 8 || v_0.Op != OpARMBFXU || v_0.Type != typ.UInt16 || auxIntToInt32(v_0.AuxInt) != int32(armBFAuxInt(8, 8)) { break } x := v_0.Args[0] diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 8655880b38..453578aa9a 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -1229,13 +1229,13 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { if x1.Op != OpARM64SLLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ADDshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -1251,13 +1251,13 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { if x1.Op != OpARM64SRLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ADDshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -1273,13 +1273,13 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { if x1.Op != OpARM64SRAconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ADDshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -1300,14 +1300,14 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 63 { + if auxIntToInt64(v_0_1.AuxInt) != 63 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { @@ -1323,15 +1323,15 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 64 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 63 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -1340,11 +1340,11 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 64 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -1370,14 +1370,14 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 63 { + if auxIntToInt64(v_0_1.AuxInt) != 63 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -1393,15 +1393,15 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 64 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 63 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -1410,11 +1410,11 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 64 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -1438,14 +1438,14 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 31 { + if auxIntToInt64(v_0_1.AuxInt) != 31 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { @@ -1462,15 +1462,15 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 32 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 31 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -1479,11 +1479,11 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 32 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -1513,14 +1513,14 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 31 { + if auxIntToInt64(v_0_1.AuxInt) != 31 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -1536,15 +1536,15 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 32 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 31 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -1553,11 +1553,11 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 32 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -1650,16 +1650,16 @@ func rewriteValueARM64_OpARM64ADDshiftLL(v *Value) bool { // match: (ADDshiftLL (MOVDconst [c]) x [d]) // result: (ADDconst [c] (SLLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ADDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -1667,22 +1667,22 @@ func rewriteValueARM64_OpARM64ADDshiftLL(v *Value) bool { // match: (ADDshiftLL x (MOVDconst [c]) [d]) // result: (ADDconst x [int64(uint64(c)< [8] (UBFX [armBFAuxInt(8, 8)] x) x) // result: (REV16W x) for { - if v.Type != typ.UInt16 || v.AuxInt != 8 || v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) { + if v.Type != typ.UInt16 || auxIntToInt64(v.AuxInt) != 8 || v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || auxIntToArm64BitField(v_0.AuxInt) != armBFAuxInt(8, 8) { break } x := v_0.Args[0] @@ -1730,14 +1730,14 @@ func rewriteValueARM64_OpARM64ADDshiftLL(v *Value) bool { // match: (ADDshiftLL [c] (SRLconst x [64-c]) x2) // result: (EXTRconst [64-c] x2 x) for { - c := v.AuxInt - if v_0.Op != OpARM64SRLconst || v_0.AuxInt != 64-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SRLconst || auxIntToInt64(v_0.AuxInt) != 64-c { break } x := v_0.Args[0] x2 := v_1 v.reset(OpARM64EXTRconst) - v.AuxInt = 64 - c + v.AuxInt = int64ToAuxInt(64 - c) v.AddArg2(x2, x) return true } @@ -1746,18 +1746,18 @@ func rewriteValueARM64_OpARM64ADDshiftLL(v *Value) bool { // result: (EXTRWconst [32-c] x2 x) for { t := v.Type - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64UBFX { break } - bfc := v_0.AuxInt + bfc := auxIntToArm64BitField(v_0.AuxInt) x := v_0.Args[0] x2 := v_1 if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64EXTRWconst) - v.AuxInt = 32 - c + v.AuxInt = int64ToAuxInt(32 - c) v.AddArg2(x2, x) return true } @@ -1770,16 +1770,16 @@ func rewriteValueARM64_OpARM64ADDshiftRA(v *Value) bool { // match: (ADDshiftRA (MOVDconst [c]) x [d]) // result: (ADDconst [c] (SRAconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ADDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -1787,14 +1787,14 @@ func rewriteValueARM64_OpARM64ADDshiftRA(v *Value) bool { // match: (ADDshiftRA x (MOVDconst [c]) [d]) // result: (ADDconst x [c>>uint64(d)]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ADDconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = int64ToAuxInt(c >> uint64(d)) v.AddArg(x) return true } @@ -1807,16 +1807,16 @@ func rewriteValueARM64_OpARM64ADDshiftRL(v *Value) bool { // match: (ADDshiftRL (MOVDconst [c]) x [d]) // result: (ADDconst [c] (SRLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ADDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -1824,22 +1824,22 @@ func rewriteValueARM64_OpARM64ADDshiftRL(v *Value) bool { // match: (ADDshiftRL x (MOVDconst [c]) [d]) // result: (ADDconst x [int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ADDconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } // match: (ADDshiftRL [c] (SLLconst x [64-c]) x) // result: (RORconst [ c] x) for { - c := v.AuxInt - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 64-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 64-c { break } x := v_0.Args[0] @@ -1847,7 +1847,7 @@ func rewriteValueARM64_OpARM64ADDshiftRL(v *Value) bool { break } v.reset(OpARM64RORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -1856,8 +1856,8 @@ func rewriteValueARM64_OpARM64ADDshiftRL(v *Value) bool { // result: (RORWconst [c] x) for { t := v.Type - c := v.AuxInt - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 32-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 32-c { break } x := v_0.Args[0] @@ -1865,7 +1865,7 @@ func rewriteValueARM64_OpARM64ADDshiftRL(v *Value) bool { break } v.reset(OpARM64RORWconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -1925,13 +1925,13 @@ func rewriteValueARM64_OpARM64AND(v *Value) bool { if x1.Op != OpARM64SLLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ANDshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -1947,13 +1947,13 @@ func rewriteValueARM64_OpARM64AND(v *Value) bool { if x1.Op != OpARM64SRLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ANDshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -1969,13 +1969,13 @@ func rewriteValueARM64_OpARM64AND(v *Value) bool { if x1.Op != OpARM64SRAconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ANDshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2074,17 +2074,17 @@ func rewriteValueARM64_OpARM64ANDconst(v *Value) bool { // cond: isARM64BFMask(sc, ac, sc) // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) for { - ac := v.AuxInt + ac := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SLLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, ac, sc)) { break } v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, sc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(ac, sc))) v.AddArg(x) return true } @@ -2092,17 +2092,17 @@ func rewriteValueARM64_OpARM64ANDconst(v *Value) bool { // cond: isARM64BFMask(sc, ac, 0) // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) for { - ac := v.AuxInt + ac := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SRLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, ac, 0)) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, 0)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(ac, 0))) v.AddArg(x) return true } @@ -2115,16 +2115,16 @@ func rewriteValueARM64_OpARM64ANDshiftLL(v *Value) bool { // match: (ANDshiftLL (MOVDconst [c]) x [d]) // result: (ANDconst [c] (SLLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ANDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -2132,14 +2132,14 @@ func rewriteValueARM64_OpARM64ANDshiftLL(v *Value) bool { // match: (ANDshiftLL x (MOVDconst [c]) [d]) // result: (ANDconst x [int64(uint64(c)< x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ANDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -2186,14 +2186,14 @@ func rewriteValueARM64_OpARM64ANDshiftRA(v *Value) bool { // match: (ANDshiftRA x (MOVDconst [c]) [d]) // result: (ANDconst x [c>>uint64(d)]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ANDconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = int64ToAuxInt(c >> uint64(d)) v.AddArg(x) return true } @@ -2201,13 +2201,13 @@ func rewriteValueARM64_OpARM64ANDshiftRA(v *Value) bool { // cond: c==d // result: y for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 y := v_1 if y.Op != OpARM64SRAconst { break } - c := y.AuxInt + c := auxIntToInt64(y.AuxInt) if x != y.Args[0] || !(c == d) { break } @@ -2223,16 +2223,16 @@ func rewriteValueARM64_OpARM64ANDshiftRL(v *Value) bool { // match: (ANDshiftRL (MOVDconst [c]) x [d]) // result: (ANDconst [c] (SRLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ANDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -2240,14 +2240,14 @@ func rewriteValueARM64_OpARM64ANDshiftRL(v *Value) bool { // match: (ANDshiftRL x (MOVDconst [c]) [d]) // result: (ANDconst x [int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ANDconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -2255,13 +2255,13 @@ func rewriteValueARM64_OpARM64ANDshiftRL(v *Value) bool { // cond: c==d // result: y for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 y := v_1 if y.Op != OpARM64SRLconst { break } - c := y.AuxInt + c := auxIntToInt64(y.AuxInt) if x != y.Args[0] || !(c == d) { break } @@ -2306,13 +2306,13 @@ func rewriteValueARM64_OpARM64BIC(v *Value) bool { if x1.Op != OpARM64SLLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64BICshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2325,13 +2325,13 @@ func rewriteValueARM64_OpARM64BIC(v *Value) bool { if x1.Op != OpARM64SRLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64BICshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2344,13 +2344,13 @@ func rewriteValueARM64_OpARM64BIC(v *Value) bool { if x1.Op != OpARM64SRAconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64BICshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2362,14 +2362,14 @@ func rewriteValueARM64_OpARM64BICshiftLL(v *Value) bool { // match: (BICshiftLL x (MOVDconst [c]) [d]) // result: (ANDconst x [^int64(uint64(c)<>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ANDconst) - v.AuxInt = ^(c >> uint64(d)) + v.AuxInt = int64ToAuxInt(^(c >> uint64(d))) v.AddArg(x) return true } @@ -2413,17 +2413,17 @@ func rewriteValueARM64_OpARM64BICshiftRA(v *Value) bool { // cond: c==d // result: (MOVDconst [0]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRAconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -2434,14 +2434,14 @@ func rewriteValueARM64_OpARM64BICshiftRL(v *Value) bool { // match: (BICshiftRL x (MOVDconst [c]) [d]) // result: (ANDconst x [^int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ANDconst) - v.AuxInt = ^int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(^int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -2449,17 +2449,17 @@ func rewriteValueARM64_OpARM64BICshiftRL(v *Value) bool { // cond: c==d // result: (MOVDconst [0]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRLconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -2493,13 +2493,13 @@ func rewriteValueARM64_OpARM64CMN(v *Value) bool { if x1.Op != OpARM64SLLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64CMNshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2515,13 +2515,13 @@ func rewriteValueARM64_OpARM64CMN(v *Value) bool { if x1.Op != OpARM64SRLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64CMNshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2537,13 +2537,13 @@ func rewriteValueARM64_OpARM64CMN(v *Value) bool { if x1.Op != OpARM64SRAconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64CMNshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2611,16 +2611,16 @@ func rewriteValueARM64_OpARM64CMNshiftLL(v *Value) bool { // match: (CMNshiftLL (MOVDconst [c]) x [d]) // result: (CMNconst [c] (SLLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64CMNconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -2628,14 +2628,14 @@ func rewriteValueARM64_OpARM64CMNshiftLL(v *Value) bool { // match: (CMNshiftLL x (MOVDconst [c]) [d]) // result: (CMNconst x [int64(uint64(c)< x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64CMNconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -2665,14 +2665,14 @@ func rewriteValueARM64_OpARM64CMNshiftRA(v *Value) bool { // match: (CMNshiftRA x (MOVDconst [c]) [d]) // result: (CMNconst x [c>>uint64(d)]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64CMNconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = int64ToAuxInt(c >> uint64(d)) v.AddArg(x) return true } @@ -2685,16 +2685,16 @@ func rewriteValueARM64_OpARM64CMNshiftRL(v *Value) bool { // match: (CMNshiftRL (MOVDconst [c]) x [d]) // result: (CMNconst [c] (SRLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64CMNconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -2702,14 +2702,14 @@ func rewriteValueARM64_OpARM64CMNshiftRL(v *Value) bool { // match: (CMNshiftRL x (MOVDconst [c]) [d]) // result: (CMNconst x [int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64CMNconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -2771,13 +2771,13 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { if x1.Op != OpARM64SLLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64CMPshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2789,7 +2789,7 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { if x0.Op != OpARM64SLLconst { break } - c := x0.AuxInt + c := auxIntToInt64(x0.AuxInt) y := x0.Args[0] x1 := v_1 if !(clobberIfDead(x0)) { @@ -2797,7 +2797,7 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { } v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPshiftLL, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int64ToAuxInt(c) v0.AddArg2(x1, y) v.AddArg(v0) return true @@ -2811,13 +2811,13 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { if x1.Op != OpARM64SRLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64CMPshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2829,7 +2829,7 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { if x0.Op != OpARM64SRLconst { break } - c := x0.AuxInt + c := auxIntToInt64(x0.AuxInt) y := x0.Args[0] x1 := v_1 if !(clobberIfDead(x0)) { @@ -2837,7 +2837,7 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { } v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPshiftRL, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int64ToAuxInt(c) v0.AddArg2(x1, y) v.AddArg(v0) return true @@ -2851,13 +2851,13 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { if x1.Op != OpARM64SRAconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64CMPshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -2869,7 +2869,7 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { if x0.Op != OpARM64SRAconst { break } - c := x0.AuxInt + c := auxIntToInt64(x0.AuxInt) y := x0.Args[0] x1 := v_1 if !(clobberIfDead(x0)) { @@ -2877,7 +2877,7 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { } v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPshiftRA, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int64ToAuxInt(c) v0.AddArg2(x1, y) v.AddArg(v0) return true @@ -3064,17 +3064,17 @@ func rewriteValueARM64_OpARM64CMPshiftLL(v *Value) bool { // match: (CMPshiftLL (MOVDconst [c]) x [d]) // result: (InvertFlags (CMPconst [c] (SLLconst x [d]))) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int64ToAuxInt(c) v1 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v1.AuxInt = d + v1.AuxInt = int64ToAuxInt(d) v1.AddArg(x) v0.AddArg(v1) v.AddArg(v0) @@ -3083,14 +3083,14 @@ func rewriteValueARM64_OpARM64CMPshiftLL(v *Value) bool { // match: (CMPshiftLL x (MOVDconst [c]) [d]) // result: (CMPconst x [int64(uint64(c)< x [d]))) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int64ToAuxInt(c) v1 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v1.AuxInt = d + v1.AuxInt = int64ToAuxInt(d) v1.AddArg(x) v0.AddArg(v1) v.AddArg(v0) @@ -3122,14 +3122,14 @@ func rewriteValueARM64_OpARM64CMPshiftRA(v *Value) bool { // match: (CMPshiftRA x (MOVDconst [c]) [d]) // result: (CMPconst x [c>>uint64(d)]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64CMPconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = int64ToAuxInt(c >> uint64(d)) v.AddArg(x) return true } @@ -3142,17 +3142,17 @@ func rewriteValueARM64_OpARM64CMPshiftRL(v *Value) bool { // match: (CMPshiftRL (MOVDconst [c]) x [d]) // result: (InvertFlags (CMPconst [c] (SRLconst x [d]))) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int64ToAuxInt(c) v1 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v1.AuxInt = d + v1.AuxInt = int64ToAuxInt(d) v1.AddArg(x) v0.AddArg(v1) v.AddArg(v0) @@ -3161,14 +3161,14 @@ func rewriteValueARM64_OpARM64CMPshiftRL(v *Value) bool { // match: (CMPshiftRL x (MOVDconst [c]) [d]) // result: (CMPconst x [int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64CMPconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -3444,13 +3444,13 @@ func rewriteValueARM64_OpARM64EON(v *Value) bool { if x1.Op != OpARM64SLLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64EONshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -3463,13 +3463,13 @@ func rewriteValueARM64_OpARM64EON(v *Value) bool { if x1.Op != OpARM64SRLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64EONshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -3482,13 +3482,13 @@ func rewriteValueARM64_OpARM64EON(v *Value) bool { if x1.Op != OpARM64SRAconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64EONshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -3500,14 +3500,14 @@ func rewriteValueARM64_OpARM64EONshiftLL(v *Value) bool { // match: (EONshiftLL x (MOVDconst [c]) [d]) // result: (XORconst x [^int64(uint64(c)<>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64XORconst) - v.AuxInt = ^(c >> uint64(d)) + v.AuxInt = int64ToAuxInt(^(c >> uint64(d))) v.AddArg(x) return true } @@ -3551,17 +3551,17 @@ func rewriteValueARM64_OpARM64EONshiftRA(v *Value) bool { // cond: c==d // result: (MOVDconst [-1]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRAconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.AuxInt = int64ToAuxInt(-1) return true } return false @@ -3572,14 +3572,14 @@ func rewriteValueARM64_OpARM64EONshiftRL(v *Value) bool { // match: (EONshiftRL x (MOVDconst [c]) [d]) // result: (XORconst x [^int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64XORconst) - v.AuxInt = ^int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(^int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -3587,17 +3587,17 @@ func rewriteValueARM64_OpARM64EONshiftRL(v *Value) bool { // cond: c==d // result: (MOVDconst [-1]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRLconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.AuxInt = int64ToAuxInt(-1) return true } return false @@ -6266,15 +6266,15 @@ func rewriteValueARM64_OpARM64MOVBUload(v *Value) bool { } // match: (MOVBUload [off] {sym} (SB) _) // cond: symIsRO(sym) - // result: (MOVDconst [int64(read8(sym, off))]) + // result: (MOVDconst [int64(read8(sym, int64(off)))]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpSB || !(symIsRO(sym)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = int64(read8(sym, off)) + v.AuxInt = int64ToAuxInt(int64(read8(sym, int64(off)))) return true } return false @@ -6417,13 +6417,13 @@ func rewriteValueARM64_OpARM64MOVBUreg(v *Value) bool { if v_0.Op != OpARM64SLLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, 1<<8-1, sc)) { break } v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))) v.AddArg(x) return true } @@ -6434,13 +6434,13 @@ func rewriteValueARM64_OpARM64MOVBUreg(v *Value) bool { if v_0.Op != OpARM64SRLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, 1<<8-1, 0)) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, 8) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, 8)) v.AddArg(x) return true } @@ -6648,13 +6648,13 @@ func rewriteValueARM64_OpARM64MOVBreg(v *Value) bool { if v_0.Op != OpARM64SLLconst { break } - lc := v_0.AuxInt + lc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(lc < 8) { break } v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(lc, 8-lc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(lc, 8-lc)) v.AddArg(x) return true } @@ -6853,15 +6853,15 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 8 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -6870,8 +6870,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(ptr0, w, mem) return true } @@ -6879,10 +6879,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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 v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -6892,7 +6892,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { 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 || v_1.AuxInt != 8 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 8 { continue } w := v_1.Args[0] @@ -6916,15 +6916,15 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 8) { + 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 || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -6933,8 +6933,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(ptr0, w, mem) return true } @@ -6942,10 +6942,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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 v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -6955,7 +6955,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { 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 || v_1.AuxInt != armBFAuxInt(8, 8) { + if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(8, 8) { continue } w := v_1.Args[0] @@ -6979,15 +6979,15 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(8, 24) { + 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 || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -6996,8 +6996,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(ptr0, w, mem) return true } @@ -7005,10 +7005,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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 v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -7018,7 +7018,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { 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 || v_1.AuxInt != armBFAuxInt(8, 24) { + if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(8, 24) { continue } w := v_1.Args[0] @@ -7042,10 +7042,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 8 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 8 { break } v_1_0 := v_1.Args[0] @@ -7054,7 +7054,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { } w := v_1_0.Args[0] x := v_2 - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -7063,8 +7063,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(ptr0, w, mem) return true } @@ -7072,10 +7072,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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 v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -7085,7 +7085,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { 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 || v_1.AuxInt != 8 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 8 { continue } v_1_0 := v_1.Args[0] @@ -7113,27 +7113,27 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 if v_1.Op != OpARM64SRLconst { break } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + 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 || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + 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 = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(ptr0, w0, mem) return true } @@ -7141,10 +7141,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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 v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -7157,7 +7157,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { if v_1.Op != OpARM64SRLconst { continue } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) w := v_1.Args[0] x := v_2 if x.Op != OpARM64MOVBstoreidx { @@ -7167,7 +7167,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || 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)) { + 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) @@ -7177,19 +7177,19 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { 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) && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 && clobber(x) + // 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 := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 if v_1.Op != OpARM64UBFX { break } - bfc := v_1.AuxInt + bfc := auxIntToArm64BitField(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -7198,24 +7198,24 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { if w0.Op != OpARM64UBFX { break } - bfc2 := w0.AuxInt - if w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { + 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 = i - 1 - v.Aux = s + 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)) && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 && clobber(x) + // 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 v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -7228,7 +7228,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { if v_1.Op != OpARM64UBFX { continue } - bfc := v_1.AuxInt + bfc := auxIntToArm64BitField(v_1.AuxInt) w := v_1.Args[0] x := v_2 if x.Op != OpARM64MOVBstoreidx { @@ -7241,8 +7241,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { if w0.Op != OpARM64UBFX { continue } - bfc2 := w0.AuxInt - if w != w0.Args[0] || !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { + 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) @@ -7255,26 +7255,26 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 if v_1.Op != OpARM64SRLconst { break } - j := v_1.AuxInt + 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 || x.AuxInt != i-1 || x.Aux != s { + 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 || w0.AuxInt != j-8 { + if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-8 { break } w0_0 := w0.Args[0] @@ -7282,8 +7282,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(ptr0, w0, mem) return true } @@ -7291,10 +7291,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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 v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -7307,7 +7307,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { if v_1.Op != OpARM64SRLconst { continue } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64MOVDreg { continue @@ -7321,7 +7321,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-8 { + if w0.Op != OpARM64SRLconst || auxIntToInt64(w0.AuxInt) != j-8 { continue } w0_0 := w0.Args[0] @@ -7338,12 +7338,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr := v_0 w := v_1 x0 := v_2 - if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { + if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s { break } _ = x0.Args[2] @@ -7351,11 +7351,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { + if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] { break } x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { + if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s { break } _ = x1.Args[2] @@ -7363,11 +7363,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] { break } x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != i-3 || auxToSym(x2.Aux) != s { break } _ = x2.Args[2] @@ -7375,11 +7375,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] { + if x2_1.Op != OpARM64SRLconst || auxIntToInt64(x2_1.AuxInt) != 24 || w != x2_1.Args[0] { break } x3 := x2.Args[2] - if x3.Op != OpARM64MOVBstore || x3.AuxInt != i-4 || x3.Aux != s { + if x3.Op != OpARM64MOVBstore || auxIntToInt32(x3.AuxInt) != i-4 || auxToSym(x3.Aux) != s { break } _ = x3.Args[2] @@ -7387,11 +7387,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x3_1 := x3.Args[1] - if x3_1.Op != OpARM64SRLconst || x3_1.AuxInt != 32 || w != x3_1.Args[0] { + if x3_1.Op != OpARM64SRLconst || auxIntToInt64(x3_1.AuxInt) != 32 || w != x3_1.Args[0] { break } x4 := x3.Args[2] - if x4.Op != OpARM64MOVBstore || x4.AuxInt != i-5 || x4.Aux != s { + if x4.Op != OpARM64MOVBstore || auxIntToInt32(x4.AuxInt) != i-5 || auxToSym(x4.Aux) != s { break } _ = x4.Args[2] @@ -7399,11 +7399,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x4_1 := x4.Args[1] - if x4_1.Op != OpARM64SRLconst || x4_1.AuxInt != 40 || w != x4_1.Args[0] { + if x4_1.Op != OpARM64SRLconst || auxIntToInt64(x4_1.AuxInt) != 40 || w != x4_1.Args[0] { break } x5 := x4.Args[2] - if x5.Op != OpARM64MOVBstore || x5.AuxInt != i-6 || x5.Aux != s { + if x5.Op != OpARM64MOVBstore || auxIntToInt32(x5.AuxInt) != i-6 || auxToSym(x5.Aux) != s { break } _ = x5.Args[2] @@ -7411,11 +7411,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x5_1 := x5.Args[1] - if x5_1.Op != OpARM64SRLconst || x5_1.AuxInt != 48 || w != x5_1.Args[0] { + if x5_1.Op != OpARM64SRLconst || auxIntToInt64(x5_1.AuxInt) != 48 || w != x5_1.Args[0] { break } x6 := x5.Args[2] - if x6.Op != OpARM64MOVBstore || x6.AuxInt != i-7 || x6.Aux != s { + if x6.Op != OpARM64MOVBstore || auxIntToInt32(x6.AuxInt) != i-7 || auxToSym(x6.Aux) != s { break } mem := x6.Args[2] @@ -7423,12 +7423,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x6_1 := x6.Args[1] - if x6_1.Op != OpARM64SRLconst || 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)) { + 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 = i - 7 - v.Aux = s + 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) @@ -7438,14 +7438,14 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - if v.AuxInt != 7 { + if auxIntToInt32(v.AuxInt) != 7 { break } - s := v.Aux + s := auxToSym(v.Aux) p := v_0 w := v_1 x0 := v_2 - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 6 || x0.Aux != s { + if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != 6 || auxToSym(x0.Aux) != s { break } _ = x0.Args[2] @@ -7453,11 +7453,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { + if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] { break } x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 5 || x1.Aux != s { + if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != 5 || auxToSym(x1.Aux) != s { break } _ = x1.Args[2] @@ -7465,11 +7465,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] { break } x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != 4 || x2.Aux != s { + if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != 4 || auxToSym(x2.Aux) != s { break } _ = x2.Args[2] @@ -7477,11 +7477,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] { + if x2_1.Op != OpARM64SRLconst || auxIntToInt64(x2_1.AuxInt) != 24 || w != x2_1.Args[0] { break } x3 := x2.Args[2] - if x3.Op != OpARM64MOVBstore || x3.AuxInt != 3 || x3.Aux != s { + if x3.Op != OpARM64MOVBstore || auxIntToInt32(x3.AuxInt) != 3 || auxToSym(x3.Aux) != s { break } _ = x3.Args[2] @@ -7489,11 +7489,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x3_1 := x3.Args[1] - if x3_1.Op != OpARM64SRLconst || x3_1.AuxInt != 32 || w != x3_1.Args[0] { + if x3_1.Op != OpARM64SRLconst || auxIntToInt64(x3_1.AuxInt) != 32 || w != x3_1.Args[0] { break } x4 := x3.Args[2] - if x4.Op != OpARM64MOVBstore || x4.AuxInt != 2 || x4.Aux != s { + if x4.Op != OpARM64MOVBstore || auxIntToInt32(x4.AuxInt) != 2 || auxToSym(x4.Aux) != s { break } _ = x4.Args[2] @@ -7501,11 +7501,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x4_1 := x4.Args[1] - if x4_1.Op != OpARM64SRLconst || x4_1.AuxInt != 40 || w != x4_1.Args[0] { + if x4_1.Op != OpARM64SRLconst || auxIntToInt64(x4_1.AuxInt) != 40 || w != x4_1.Args[0] { break } x5 := x4.Args[2] - if x5.Op != OpARM64MOVBstore || x5.AuxInt != 1 || x5.Aux != s { + if x5.Op != OpARM64MOVBstore || auxIntToInt32(x5.AuxInt) != 1 || auxToSym(x5.Aux) != s { break } _ = x5.Args[2] @@ -7520,7 +7520,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr1 := p1_0 idx1 := p1_1 x5_1 := x5.Args[1] - if x5_1.Op != OpARM64SRLconst || x5_1.AuxInt != 48 || w != x5_1.Args[0] { + if x5_1.Op != OpARM64SRLconst || auxIntToInt64(x5_1.AuxInt) != 48 || w != x5_1.Args[0] { continue } x6 := x5.Args[2] @@ -7531,7 +7531,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr0 := x6.Args[0] idx0 := x6.Args[1] x6_2 := x6.Args[2] - if x6_2.Op != OpARM64SRLconst || 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)) { + 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) @@ -7546,12 +7546,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2) // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr := v_0 w := v_1 x0 := v_2 - if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { + if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s { break } _ = x0.Args[2] @@ -7559,11 +7559,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64UBFX || x0_1.AuxInt != armBFAuxInt(8, 24) || w != x0_1.Args[0] { + 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 || x1.AuxInt != i-2 || x1.Aux != s { + if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s { break } _ = x1.Args[2] @@ -7571,11 +7571,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64UBFX || x1_1.AuxInt != armBFAuxInt(16, 16) || w != x1_1.Args[0] { + 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 || x2.AuxInt != i-3 || x2.Aux != s { + if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != i-3 || auxToSym(x2.Aux) != s { break } mem := x2.Args[2] @@ -7583,12 +7583,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64UBFX || x2_1.AuxInt != armBFAuxInt(24, 8) || w != x2_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) { + 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 = i - 3 - v.Aux = s + 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) @@ -7598,14 +7598,14 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - if v.AuxInt != 3 { + if auxIntToInt32(v.AuxInt) != 3 { break } - s := v.Aux + s := auxToSym(v.Aux) p := v_0 w := v_1 x0 := v_2 - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { + if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != 2 || auxToSym(x0.Aux) != s { break } _ = x0.Args[2] @@ -7613,11 +7613,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64UBFX || x0_1.AuxInt != armBFAuxInt(8, 24) || w != x0_1.Args[0] { + 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 || x1.AuxInt != 1 || x1.Aux != s { + if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != 1 || auxToSym(x1.Aux) != s { break } _ = x1.Args[2] @@ -7632,7 +7632,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr1 := p1_0 idx1 := p1_1 x1_1 := x1.Args[1] - if x1_1.Op != OpARM64UBFX || x1_1.AuxInt != armBFAuxInt(16, 16) || w != x1_1.Args[0] { + if x1_1.Op != OpARM64UBFX || auxIntToArm64BitField(x1_1.AuxInt) != armBFAuxInt(16, 16) || w != x1_1.Args[0] { continue } x2 := x1.Args[2] @@ -7643,7 +7643,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr0 := x2.Args[0] idx0 := x2.Args[1] x2_2 := x2.Args[2] - if x2_2.Op != OpARM64UBFX || 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)) { + 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) @@ -7658,12 +7658,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2) // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr := v_0 w := v_1 x0 := v_2 - if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { + if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s { break } _ = x0.Args[2] @@ -7671,7 +7671,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 { + if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 { break } x0_1_0 := x0_1.Args[0] @@ -7679,7 +7679,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { + if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s { break } _ = x1.Args[2] @@ -7687,7 +7687,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 { + if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 { break } x1_1_0 := x1_1.Args[0] @@ -7695,7 +7695,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != i-3 || auxToSym(x2.Aux) != s { break } mem := x2.Args[2] @@ -7703,7 +7703,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 { + if x2_1.Op != OpARM64SRLconst || auxIntToInt64(x2_1.AuxInt) != 24 { break } x2_1_0 := x2_1.Args[0] @@ -7711,8 +7711,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } v.reset(OpARM64MOVWstore) - v.AuxInt = i - 3 - v.Aux = s + 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) @@ -7722,14 +7722,14 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - if v.AuxInt != 3 { + if auxIntToInt32(v.AuxInt) != 3 { break } - s := v.Aux + s := auxToSym(v.Aux) p := v_0 w := v_1 x0 := v_2 - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { + if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != 2 || auxToSym(x0.Aux) != s { break } _ = x0.Args[2] @@ -7737,7 +7737,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 { + if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 { break } x0_1_0 := x0_1.Args[0] @@ -7745,7 +7745,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { + if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != 1 || auxToSym(x1.Aux) != s { break } _ = x1.Args[2] @@ -7760,7 +7760,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr1 := p1_0 idx1 := p1_1 x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 { + if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 { continue } x1_1_0 := x1_1.Args[0] @@ -7775,7 +7775,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr0 := x2.Args[0] idx0 := x2.Args[1] x2_2 := x2.Args[2] - if x2_2.Op != OpARM64SRLconst || x2_2.AuxInt != 24 { + if x2_2.Op != OpARM64SRLconst || auxIntToInt64(x2_2.AuxInt) != 24 { continue } x2_2_0 := x2_2.Args[0] @@ -7794,12 +7794,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2) // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr := v_0 w := v_1 x0 := v_2 - if x0.Op != OpARM64MOVBstore || x0.AuxInt != i-1 || x0.Aux != s { + if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != i-1 || auxToSym(x0.Aux) != s { break } _ = x0.Args[2] @@ -7807,11 +7807,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { + if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] { break } x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != i-2 || x1.Aux != s { + if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != i-2 || auxToSym(x1.Aux) != s { break } _ = x1.Args[2] @@ -7819,11 +7819,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] { break } x2 := x1.Args[2] - if x2.Op != OpARM64MOVBstore || x2.AuxInt != i-3 || x2.Aux != s { + if x2.Op != OpARM64MOVBstore || auxIntToInt32(x2.AuxInt) != i-3 || auxToSym(x2.Aux) != s { break } mem := x2.Args[2] @@ -7831,12 +7831,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64SRLconst || x2_1.AuxInt != 24 || w != x2_1.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) { + 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 = i - 3 - v.Aux = s + 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) @@ -7846,14 +7846,14 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - if v.AuxInt != 3 { + if auxIntToInt32(v.AuxInt) != 3 { break } - s := v.Aux + s := auxToSym(v.Aux) p := v_0 w := v_1 x0 := v_2 - if x0.Op != OpARM64MOVBstore || x0.AuxInt != 2 || x0.Aux != s { + if x0.Op != OpARM64MOVBstore || auxIntToInt32(x0.AuxInt) != 2 || auxToSym(x0.Aux) != s { break } _ = x0.Args[2] @@ -7861,11 +7861,11 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64SRLconst || x0_1.AuxInt != 8 || w != x0_1.Args[0] { + if x0_1.Op != OpARM64SRLconst || auxIntToInt64(x0_1.AuxInt) != 8 || w != x0_1.Args[0] { break } x1 := x0.Args[2] - if x1.Op != OpARM64MOVBstore || x1.AuxInt != 1 || x1.Aux != s { + if x1.Op != OpARM64MOVBstore || auxIntToInt32(x1.AuxInt) != 1 || auxToSym(x1.Aux) != s { break } _ = x1.Args[2] @@ -7880,7 +7880,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr1 := p1_0 idx1 := p1_1 x1_1 := x1.Args[1] - if x1_1.Op != OpARM64SRLconst || x1_1.AuxInt != 16 || w != x1_1.Args[0] { + if x1_1.Op != OpARM64SRLconst || auxIntToInt64(x1_1.AuxInt) != 16 || w != x1_1.Args[0] { continue } x2 := x1.Args[2] @@ -7891,7 +7891,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr0 := x2.Args[0] idx0 := x2.Args[1] x2_2 := x2.Args[2] - if x2_2.Op != OpARM64SRLconst || 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)) { + 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) @@ -7906,12 +7906,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr := v_0 w := v_1 x := v_2 - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -7919,12 +7919,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpARM64SRLconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + 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 = i - 1 - v.Aux = s + 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) @@ -7934,10 +7934,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - if v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -7956,7 +7956,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] - if x_2.Op != OpARM64SRLconst || 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)) { + 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) @@ -7971,12 +7971,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr := v_0 w := v_1 x := v_2 - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -7984,12 +7984,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpARM64UBFX || x_1.AuxInt != armBFAuxInt(8, 8) || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + 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 = i - 1 - v.Aux = s + 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) @@ -7999,10 +7999,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - if v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -8021,7 +8021,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || 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)) { + 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) @@ -8036,12 +8036,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr := v_0 w := v_1 x := v_2 - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -8049,7 +8049,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpARM64SRLconst || x_1.AuxInt != 8 { + if x_1.Op != OpARM64SRLconst || auxIntToInt64(x_1.AuxInt) != 8 { break } x_1_0 := x_1.Args[0] @@ -8057,8 +8057,8 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } v.reset(OpARM64MOVHstore) - v.AuxInt = i - 1 - v.Aux = s + 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) @@ -8068,10 +8068,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - if v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -8090,7 +8090,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] - if x_2.Op != OpARM64SRLconst || x_2.AuxInt != 8 { + if x_2.Op != OpARM64SRLconst || auxIntToInt64(x_2.AuxInt) != 8 { continue } x_2_0 := x_2.Args[0] @@ -8109,12 +8109,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr := v_0 w := v_1 x := v_2 - if x.Op != OpARM64MOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpARM64MOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -8122,12 +8122,12 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpARM64UBFX || x_1.AuxInt != armBFAuxInt(8, 24) || w != x_1.Args[0] || !(x.Uses == 1 && clobber(x)) { + 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 = i - 1 - v.Aux = s + 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) @@ -8137,10 +8137,10 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { // 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) mem) for { - if v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -8159,7 +8159,7 @@ func rewriteValueARM64_OpARM64MOVBstore(v *Value) bool { ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || 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)) { + 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) @@ -8318,11 +8318,11 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { // result: (MOVHstoreidx ptr idx w mem) for { ptr := v_0 - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 1 { break } idx := v_1.Args[0] - if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 8 { + if v_2.Op != OpARM64SRLconst || auxIntToInt64(v_2.AuxInt) != 8 { break } w := v_2.Args[0] @@ -8343,7 +8343,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { // result: (MOVWstoreidx ptr idx (REVW w) mem) for { ptr := v_0 - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 3 { + if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 3 { break } idx := v_1.Args[0] @@ -8357,11 +8357,11 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 2 || idx != x0_1.Args[0] { + 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 || x0_2.AuxInt != armBFAuxInt(8, 24) || w != x0_2.Args[0] { + if x0_2.Op != OpARM64UBFX || auxIntToArm64BitField(x0_2.AuxInt) != armBFAuxInt(8, 24) || w != x0_2.Args[0] { break } x1 := x0.Args[3] @@ -8373,11 +8373,11 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] { + 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 || x1_2.AuxInt != armBFAuxInt(16, 16) || w != x1_2.Args[0] { + if x1_2.Op != OpARM64UBFX || auxIntToArm64BitField(x1_2.AuxInt) != armBFAuxInt(16, 16) || w != x1_2.Args[0] { break } x2 := x1.Args[3] @@ -8389,7 +8389,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { break } x2_2 := x2.Args[2] - if x2_2.Op != OpARM64UBFX || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) { + 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) @@ -8414,11 +8414,11 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { break } x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 1 || idx != x0_1.Args[0] { + 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 || x0_2.AuxInt != armBFAuxInt(8, 24) || w != x0_2.Args[0] { + if x0_2.Op != OpARM64UBFX || auxIntToArm64BitField(x0_2.AuxInt) != armBFAuxInt(8, 24) || w != x0_2.Args[0] { break } x1 := x0.Args[3] @@ -8430,11 +8430,11 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] { + 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 || x1_2.AuxInt != armBFAuxInt(16, 16) || w != x1_2.Args[0] { + if x1_2.Op != OpARM64UBFX || auxIntToArm64BitField(x1_2.AuxInt) != armBFAuxInt(16, 16) || w != x1_2.Args[0] { break } x2 := x1.Args[3] @@ -8446,11 +8446,11 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 3 || idx != x2_1.Args[0] { + 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 || x2_2.AuxInt != armBFAuxInt(24, 8) || w != x2_2.Args[0] || !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0, x1, x2)) { + 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) @@ -8462,7 +8462,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { // result: (MOVHstoreidx ptr idx (REV16W w) mem) for { ptr := v_0 - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 1 { break } idx := v_1.Args[0] @@ -8476,7 +8476,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { break } x_2 := x.Args[2] - if x_2.Op != OpARM64UBFX || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + 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) @@ -8501,11 +8501,11 @@ func rewriteValueARM64_OpARM64MOVBstoreidx(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpARM64ADDconst || x_1.AuxInt != 1 || idx != x_1.Args[0] { + 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 || x_2.AuxInt != armBFAuxInt(8, 8) || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + 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) @@ -8582,28 +8582,28 @@ func rewriteValueARM64_OpARM64MOVBstorezero(v *Value) bool { return true } // match: (MOVBstorezero [i] {s} ptr0 x:(MOVBstorezero [j] {s} ptr1 mem)) - // cond: x.Uses == 1 && areAdjacentOffsets(i,j,1) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVHstorezero [min(i,j)] {s} ptr0 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 := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 x := v_1 if x.Op != OpARM64MOVBstorezero { break } - j := x.AuxInt - if x.Aux != s { + j := auxIntToInt32(x.AuxInt) + if auxToSym(x.Aux) != s { break } mem := x.Args[1] ptr1 := x.Args[0] - if !(x.Uses == 1 && areAdjacentOffsets(i, j, 1) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { + if !(x.Uses == 1 && areAdjacentOffsets(int64(i), int64(j), 1) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } v.reset(OpARM64MOVHstorezero) - v.AuxInt = min(i, j) - v.Aux = s + v.AuxInt = int32ToAuxInt(int32(min(int64(i), int64(j)))) + v.Aux = symToAux(s) v.AddArg2(ptr0, mem) return true } @@ -8611,10 +8611,10 @@ func rewriteValueARM64_OpARM64MOVBstorezero(v *Value) bool { // 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 v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -8687,7 +8687,7 @@ func rewriteValueARM64_OpARM64MOVBstorezeroidx(v *Value) bool { // result: (MOVHstorezeroidx ptr idx mem) for { ptr := v_0 - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 1 { break } idx := v_1.Args[0] @@ -8830,15 +8830,15 @@ func rewriteValueARM64_OpARM64MOVDload(v *Value) bool { } // match: (MOVDload [off] {sym} (SB) _) // cond: symIsRO(sym) - // result: (MOVDconst [int64(read64(sym, off, config.ctxt.Arch.ByteOrder))]) + // result: (MOVDconst [int64(read64(sym, int64(off), config.ctxt.Arch.ByteOrder))]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpSB || !(symIsRO(sym)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = int64(read64(sym, off, config.ctxt.Arch.ByteOrder)) + v.AuxInt = int64ToAuxInt(int64(read64(sym, int64(off), config.ctxt.Arch.ByteOrder))) return true } return false @@ -9336,28 +9336,28 @@ func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool { return true } // match: (MOVDstorezero [i] {s} ptr0 x:(MOVDstorezero [j] {s} ptr1 mem)) - // cond: x.Uses == 1 && areAdjacentOffsets(i,j,8) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVQstorezero [min(i,j)] {s} ptr0 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 := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 x := v_1 if x.Op != OpARM64MOVDstorezero { break } - j := x.AuxInt - if x.Aux != s { + j := auxIntToInt32(x.AuxInt) + if auxToSym(x.Aux) != s { break } mem := x.Args[1] ptr1 := x.Args[0] - if !(x.Uses == 1 && areAdjacentOffsets(i, j, 8) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { + if !(x.Uses == 1 && areAdjacentOffsets(int64(i), int64(j), 8) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } v.reset(OpARM64MOVQstorezero) - v.AuxInt = min(i, j) - v.Aux = s + v.AuxInt = int32ToAuxInt(int32(min(int64(i), int64(j)))) + v.Aux = symToAux(s) v.AddArg2(ptr0, mem) return true } @@ -9365,10 +9365,10 @@ func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool { // 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 v.AuxInt != 8 { + if auxIntToInt32(v.AuxInt) != 8 { break } - s := v.Aux + s := auxToSym(v.Aux) p0 := v_0 if p0.Op != OpARM64ADD { break @@ -9390,8 +9390,8 @@ func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool { continue } v.reset(OpARM64MOVQstorezero) - v.AuxInt = 0 - v.Aux = s + v.AuxInt = int32ToAuxInt(0) + v.Aux = symToAux(s) v.AddArg2(p0, mem) return true } @@ -9401,12 +9401,12 @@ func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVQstorezero [0] {s} p0 mem) for { - if v.AuxInt != 8 { + if auxIntToInt32(v.AuxInt) != 8 { break } - s := v.Aux + s := auxToSym(v.Aux) p0 := v_0 - if p0.Op != OpARM64ADDshiftLL || p0.AuxInt != 3 { + if p0.Op != OpARM64ADDshiftLL || auxIntToInt64(p0.AuxInt) != 3 { break } idx0 := p0.Args[1] @@ -9422,8 +9422,8 @@ func rewriteValueARM64_OpARM64MOVDstorezero(v *Value) bool { break } v.reset(OpARM64MOVQstorezero) - v.AuxInt = 0 - v.Aux = s + v.AuxInt = int32ToAuxInt(0) + v.Aux = symToAux(s) v.AddArg2(p0, mem) return true } @@ -9629,15 +9629,15 @@ func rewriteValueARM64_OpARM64MOVHUload(v *Value) bool { } // match: (MOVHUload [off] {sym} (SB) _) // cond: symIsRO(sym) - // result: (MOVDconst [int64(read16(sym, off, config.ctxt.Arch.ByteOrder))]) + // result: (MOVDconst [int64(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpSB || !(symIsRO(sym)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = int64(read16(sym, off, config.ctxt.Arch.ByteOrder)) + v.AuxInt = int64ToAuxInt(int64(read16(sym, int64(off), config.ctxt.Arch.ByteOrder))) return true } return false @@ -9899,13 +9899,13 @@ func rewriteValueARM64_OpARM64MOVHUreg(v *Value) bool { if v_0.Op != OpARM64SLLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, 1<<16-1, sc)) { break } v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))) v.AddArg(x) return true } @@ -9916,13 +9916,13 @@ func rewriteValueARM64_OpARM64MOVHUreg(v *Value) bool { if v_0.Op != OpARM64SRLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, 1<<16-1, 0)) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, 16) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, 16)) v.AddArg(x) return true } @@ -10313,13 +10313,13 @@ func rewriteValueARM64_OpARM64MOVHreg(v *Value) bool { if v_0.Op != OpARM64SLLconst { break } - lc := v_0.AuxInt + lc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(lc < 16) { break } v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(lc, 16-lc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(lc, 16-lc)) v.AddArg(x) return true } @@ -10504,15 +10504,15 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVWstore [i-2] {s} ptr0 w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpARM64MOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -10521,8 +10521,8 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { break } v.reset(OpARM64MOVWstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(ptr0, w, mem) return true } @@ -10530,10 +10530,10 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // 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 v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -10543,7 +10543,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { 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 || v_1.AuxInt != 16 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 { continue } w := v_1.Args[0] @@ -10567,16 +10567,16 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) for { - if v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + 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 || v_1.AuxInt != 16 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 { break } w := v_1.Args[0] @@ -10592,7 +10592,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { } v.reset(OpARM64MOVWstoreidx) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 + v0.AuxInt = int64ToAuxInt(1) v0.AddArg(idx1) v.AddArg4(ptr1, v0, w, mem) return true @@ -10601,15 +10601,15 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVWstore [i-2] {s} ptr0 w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 - if v_1.Op != OpARM64UBFX || v_1.AuxInt != armBFAuxInt(16, 16) { + 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 || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpARM64MOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -10618,8 +10618,8 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { break } v.reset(OpARM64MOVWstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(ptr0, w, mem) return true } @@ -10627,10 +10627,10 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // 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 v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -10640,7 +10640,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { 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 || v_1.AuxInt != armBFAuxInt(16, 16) { + if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(16, 16) { continue } w := v_1.Args[0] @@ -10664,16 +10664,16 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) for { - if v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + 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 || v_1.AuxInt != armBFAuxInt(16, 16) { + if v_1.Op != OpARM64UBFX || auxIntToArm64BitField(v_1.AuxInt) != armBFAuxInt(16, 16) { break } w := v_1.Args[0] @@ -10689,7 +10689,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { } v.reset(OpARM64MOVWstoreidx) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 + v0.AuxInt = int64ToAuxInt(1) v0.AddArg(idx1) v.AddArg4(ptr1, v0, w, mem) return true @@ -10698,10 +10698,10 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVWstore [i-2] {s} ptr0 w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 16 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 { break } v_1_0 := v_1.Args[0] @@ -10710,7 +10710,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { } w := v_1_0.Args[0] x := v_2 - if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpARM64MOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -10719,8 +10719,8 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { break } v.reset(OpARM64MOVWstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(ptr0, w, mem) return true } @@ -10728,10 +10728,10 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // 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 v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -10741,7 +10741,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { 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 || v_1.AuxInt != 16 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 { continue } v_1_0 := v_1.Args[0] @@ -10769,16 +10769,16 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) for { - if v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + 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 || v_1.AuxInt != 16 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 16 { break } v_1_0 := v_1.Args[0] @@ -10798,7 +10798,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { } v.reset(OpARM64MOVWstoreidx) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 + v0.AuxInt = int64ToAuxInt(1) v0.AddArg(idx1) v.AddArg4(ptr1, v0, w, mem) return true @@ -10807,27 +10807,27 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVWstore [i-2] {s} ptr0 w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 if v_1.Op != OpARM64SRLconst { break } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpARM64MOVHstore || x.AuxInt != i-2 || x.Aux != s { + 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 || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + 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 = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(ptr0, w0, mem) return true } @@ -10835,10 +10835,10 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // 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 v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -10851,7 +10851,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { if v_1.Op != OpARM64SRLconst { continue } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) w := v_1.Args[0] x := v_2 if x.Op != OpARM64MOVHstoreidx { @@ -10861,7 +10861,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || 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)) { + 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) @@ -10874,11 +10874,11 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w0 mem) for { - if v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + s := auxToSym(v.Aux) + if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 1 { break } idx0 := v_0.Args[1] @@ -10886,7 +10886,7 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { if v_1.Op != OpARM64SRLconst { break } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) w := v_1.Args[0] x := v_2 if x.Op != OpARM64MOVHstoreidx2 { @@ -10896,12 +10896,12 @@ func rewriteValueARM64_OpARM64MOVHstore(v *Value) bool { ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { + 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 = 1 + v0.AuxInt = int64ToAuxInt(1) v0.AddArg(idx1) v.AddArg4(ptr1, v0, w0, mem) return true @@ -11087,11 +11087,11 @@ func rewriteValueARM64_OpARM64MOVHstoreidx(v *Value) bool { // result: (MOVWstoreidx ptr idx w mem) for { ptr := v_0 - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 2 { + if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 2 { break } idx := v_1.Args[0] - if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 16 { + if v_2.Op != OpARM64SRLconst || auxIntToInt64(v_2.AuxInt) != 16 { break } w := v_2.Args[0] @@ -11291,28 +11291,28 @@ func rewriteValueARM64_OpARM64MOVHstorezero(v *Value) bool { return true } // match: (MOVHstorezero [i] {s} ptr0 x:(MOVHstorezero [j] {s} ptr1 mem)) - // cond: x.Uses == 1 && areAdjacentOffsets(i,j,2) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVWstorezero [min(i,j)] {s} ptr0 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 := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 x := v_1 if x.Op != OpARM64MOVHstorezero { break } - j := x.AuxInt - if x.Aux != s { + j := auxIntToInt32(x.AuxInt) + if auxToSym(x.Aux) != s { break } mem := x.Args[1] ptr1 := x.Args[0] - if !(x.Uses == 1 && areAdjacentOffsets(i, j, 2) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { + if !(x.Uses == 1 && areAdjacentOffsets(int64(i), int64(j), 2) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } v.reset(OpARM64MOVWstorezero) - v.AuxInt = min(i, j) - v.Aux = s + v.AuxInt = int32ToAuxInt(int32(min(int64(i), int64(j)))) + v.Aux = symToAux(s) v.AddArg2(ptr0, mem) return true } @@ -11320,10 +11320,10 @@ func rewriteValueARM64_OpARM64MOVHstorezero(v *Value) bool { // 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 v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -11353,11 +11353,11 @@ func rewriteValueARM64_OpARM64MOVHstorezero(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVWstorezeroidx ptr1 (SLLconst [1] idx1) mem) for { - if v.AuxInt != 2 { + if auxIntToInt32(v.AuxInt) != 2 { break } - s := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 1 { + s := auxToSym(v.Aux) + if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 1 { break } idx0 := v_0.Args[1] @@ -11374,7 +11374,7 @@ func rewriteValueARM64_OpARM64MOVHstorezero(v *Value) bool { } v.reset(OpARM64MOVWstorezeroidx) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 1 + v0.AuxInt = int64ToAuxInt(1) v0.AddArg(idx1) v.AddArg3(ptr1, v0, mem) return true @@ -11484,7 +11484,7 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx(v *Value) bool { // result: (MOVWstorezeroidx ptr idx mem) for { ptr := v_0 - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 2 { + if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 2 { break } idx := v_1.Args[0] @@ -11701,15 +11701,15 @@ func rewriteValueARM64_OpARM64MOVWUload(v *Value) bool { } // match: (MOVWUload [off] {sym} (SB) _) // cond: symIsRO(sym) - // result: (MOVDconst [int64(read32(sym, off, config.ctxt.Arch.ByteOrder))]) + // result: (MOVDconst [int64(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))]) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpSB || !(symIsRO(sym)) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = int64(read32(sym, off, config.ctxt.Arch.ByteOrder)) + v.AuxInt = int64ToAuxInt(int64(read32(sym, int64(off), config.ctxt.Arch.ByteOrder))) return true } return false @@ -11996,13 +11996,13 @@ func rewriteValueARM64_OpARM64MOVWUreg(v *Value) bool { if v_0.Op != OpARM64SLLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, 1<<32-1, sc)) { break } v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))) v.AddArg(x) return true } @@ -12013,13 +12013,13 @@ func rewriteValueARM64_OpARM64MOVWUreg(v *Value) bool { if v_0.Op != OpARM64SRLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, 1<<32-1, 0)) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, 32) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, 32)) v.AddArg(x) return true } @@ -12468,13 +12468,13 @@ func rewriteValueARM64_OpARM64MOVWreg(v *Value) bool { if v_0.Op != OpARM64SLLconst { break } - lc := v_0.AuxInt + lc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(lc < 32) { break } v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(lc, 32-lc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(lc, 32-lc)) v.AddArg(x) return true } @@ -12642,15 +12642,15 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVDstore [i-4] {s} ptr0 w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != 32 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 32 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpARM64MOVWstore || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpARM64MOVWstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -12659,8 +12659,8 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { break } v.reset(OpARM64MOVDstore) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg3(ptr0, w, mem) return true } @@ -12668,10 +12668,10 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { // 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 v.AuxInt != 4 { + if auxIntToInt32(v.AuxInt) != 4 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -12681,7 +12681,7 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { 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 || v_1.AuxInt != 32 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 32 { continue } w := v_1.Args[0] @@ -12705,16 +12705,16 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVDstoreidx ptr1 (SLLconst [2] idx1) w mem) for { - if v.AuxInt != 4 { + if auxIntToInt32(v.AuxInt) != 4 { break } - s := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { + 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 || v_1.AuxInt != 32 { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != 32 { break } w := v_1.Args[0] @@ -12730,7 +12730,7 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { } v.reset(OpARM64MOVDstoreidx) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg(idx1) v.AddArg4(ptr1, v0, w, mem) return true @@ -12739,27 +12739,27 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVDstore [i-4] {s} ptr0 w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 if v_1.Op != OpARM64SRLconst { break } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpARM64MOVWstore || x.AuxInt != i-4 || x.Aux != s { + 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 || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { + 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 = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg3(ptr0, w0, mem) return true } @@ -12767,10 +12767,10 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { // 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 v.AuxInt != 4 { + if auxIntToInt32(v.AuxInt) != 4 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -12783,7 +12783,7 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { if v_1.Op != OpARM64SRLconst { continue } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) w := v_1.Args[0] x := v_2 if x.Op != OpARM64MOVWstoreidx { @@ -12793,7 +12793,7 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || 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)) { + 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) @@ -12806,11 +12806,11 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVDstoreidx ptr1 (SLLconst [2] idx1) w0 mem) for { - if v.AuxInt != 4 { + if auxIntToInt32(v.AuxInt) != 4 { break } - s := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { + s := auxToSym(v.Aux) + if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 2 { break } idx0 := v_0.Args[1] @@ -12818,7 +12818,7 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { if v_1.Op != OpARM64SRLconst { break } - j := v_1.AuxInt + j := auxIntToInt64(v_1.AuxInt) w := v_1.Args[0] x := v_2 if x.Op != OpARM64MOVWstoreidx4 { @@ -12828,12 +12828,12 @@ func rewriteValueARM64_OpARM64MOVWstore(v *Value) bool { ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] - if w0.Op != OpARM64SRLconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { + 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 = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg(idx1) v.AddArg4(ptr1, v0, w0, mem) return true @@ -12957,11 +12957,11 @@ func rewriteValueARM64_OpARM64MOVWstoreidx(v *Value) bool { // result: (MOVDstoreidx ptr idx w mem) for { ptr := v_0 - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 4 { + if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 4 { break } idx := v_1.Args[0] - if v_2.Op != OpARM64SRLconst || v_2.AuxInt != 32 { + if v_2.Op != OpARM64SRLconst || auxIntToInt64(v_2.AuxInt) != 32 { break } w := v_2.Args[0] @@ -13133,28 +13133,28 @@ func rewriteValueARM64_OpARM64MOVWstorezero(v *Value) bool { return true } // match: (MOVWstorezero [i] {s} ptr0 x:(MOVWstorezero [j] {s} ptr1 mem)) - // cond: x.Uses == 1 && areAdjacentOffsets(i,j,4) && is32Bit(min(i,j)) && isSamePtr(ptr0, ptr1) && clobber(x) - // result: (MOVDstorezero [min(i,j)] {s} ptr0 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 := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) ptr0 := v_0 x := v_1 if x.Op != OpARM64MOVWstorezero { break } - j := x.AuxInt - if x.Aux != s { + j := auxIntToInt32(x.AuxInt) + if auxToSym(x.Aux) != s { break } mem := x.Args[1] ptr1 := x.Args[0] - if !(x.Uses == 1 && areAdjacentOffsets(i, j, 4) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { + if !(x.Uses == 1 && areAdjacentOffsets(int64(i), int64(j), 4) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } v.reset(OpARM64MOVDstorezero) - v.AuxInt = min(i, j) - v.Aux = s + v.AuxInt = int32ToAuxInt(int32(min(int64(i), int64(j)))) + v.Aux = symToAux(s) v.AddArg2(ptr0, mem) return true } @@ -13162,10 +13162,10 @@ func rewriteValueARM64_OpARM64MOVWstorezero(v *Value) bool { // 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 v.AuxInt != 4 { + if auxIntToInt32(v.AuxInt) != 4 { break } - s := v.Aux + s := auxToSym(v.Aux) if v_0.Op != OpARM64ADD { break } @@ -13195,11 +13195,11 @@ func rewriteValueARM64_OpARM64MOVWstorezero(v *Value) bool { // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVDstorezeroidx ptr1 (SLLconst [2] idx1) mem) for { - if v.AuxInt != 4 { + if auxIntToInt32(v.AuxInt) != 4 { break } - s := v.Aux - if v_0.Op != OpARM64ADDshiftLL || v_0.AuxInt != 2 { + s := auxToSym(v.Aux) + if v_0.Op != OpARM64ADDshiftLL || auxIntToInt64(v_0.AuxInt) != 2 { break } idx0 := v_0.Args[1] @@ -13216,7 +13216,7 @@ func rewriteValueARM64_OpARM64MOVWstorezero(v *Value) bool { } v.reset(OpARM64MOVDstorezeroidx) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, idx1.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg(idx1) v.AddArg3(ptr1, v0, mem) return true @@ -13294,7 +13294,7 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx(v *Value) bool { // result: (MOVDstorezeroidx ptr idx mem) for { ptr := v_0 - if v_1.Op != OpARM64ADDconst || v_1.AuxInt != 4 { + if v_1.Op != OpARM64ADDconst || auxIntToInt64(v_1.AuxInt) != 4 { break } idx := v_1.Args[0] @@ -14668,13 +14668,13 @@ func rewriteValueARM64_OpARM64MVN(v *Value) bool { if x.Op != OpARM64SLLconst { break } - c := x.AuxInt + c := auxIntToInt64(x.AuxInt) y := x.Args[0] if !(clobberIfDead(x)) { break } v.reset(OpARM64MVNshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(y) return true } @@ -14686,13 +14686,13 @@ func rewriteValueARM64_OpARM64MVN(v *Value) bool { if x.Op != OpARM64SRLconst { break } - c := x.AuxInt + c := auxIntToInt64(x.AuxInt) y := x.Args[0] if !(clobberIfDead(x)) { break } v.reset(OpARM64MVNshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(y) return true } @@ -14704,13 +14704,13 @@ func rewriteValueARM64_OpARM64MVN(v *Value) bool { if x.Op != OpARM64SRAconst { break } - c := x.AuxInt + c := auxIntToInt64(x.AuxInt) y := x.Args[0] if !(clobberIfDead(x)) { break } v.reset(OpARM64MVNshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(y) return true } @@ -14721,13 +14721,13 @@ func rewriteValueARM64_OpARM64MVNshiftLL(v *Value) bool { // match: (MVNshiftLL (MOVDconst [c]) [d]) // result: (MOVDconst [^int64(uint64(c)<>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = ^(c >> uint64(d)) + v.AuxInt = int64ToAuxInt(^(c >> uint64(d))) return true } return false @@ -14753,13 +14753,13 @@ func rewriteValueARM64_OpARM64MVNshiftRL(v *Value) bool { // match: (MVNshiftRL (MOVDconst [c]) [d]) // result: (MOVDconst [^int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = ^int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(^int64(uint64(c) >> uint64(d))) return true } return false @@ -14809,13 +14809,13 @@ func rewriteValueARM64_OpARM64NEG(v *Value) bool { if x.Op != OpARM64SLLconst { break } - c := x.AuxInt + c := auxIntToInt64(x.AuxInt) y := x.Args[0] if !(clobberIfDead(x)) { break } v.reset(OpARM64NEGshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(y) return true } @@ -14827,13 +14827,13 @@ func rewriteValueARM64_OpARM64NEG(v *Value) bool { if x.Op != OpARM64SRLconst { break } - c := x.AuxInt + c := auxIntToInt64(x.AuxInt) y := x.Args[0] if !(clobberIfDead(x)) { break } v.reset(OpARM64NEGshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(y) return true } @@ -14845,13 +14845,13 @@ func rewriteValueARM64_OpARM64NEG(v *Value) bool { if x.Op != OpARM64SRAconst { break } - c := x.AuxInt + c := auxIntToInt64(x.AuxInt) y := x.Args[0] if !(clobberIfDead(x)) { break } v.reset(OpARM64NEGshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(y) return true } @@ -14862,13 +14862,13 @@ func rewriteValueARM64_OpARM64NEGshiftLL(v *Value) bool { // match: (NEGshiftLL (MOVDconst [c]) [d]) // result: (MOVDconst [-int64(uint64(c)<>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = -(c >> uint64(d)) + v.AuxInt = int64ToAuxInt(-(c >> uint64(d))) return true } return false @@ -14894,13 +14894,13 @@ func rewriteValueARM64_OpARM64NEGshiftRL(v *Value) bool { // match: (NEGshiftRL (MOVDconst [c]) [d]) // result: (MOVDconst [-int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = -int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(-int64(uint64(c) >> uint64(d))) return true } return false @@ -14987,13 +14987,13 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x1.Op != OpARM64SLLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ORshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -15009,13 +15009,13 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x1.Op != OpARM64SRLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ORshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -15031,13 +15031,13 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x1.Op != OpARM64SRAconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64ORshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -15058,14 +15058,14 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 63 { + if auxIntToInt64(v_0_1.AuxInt) != 63 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { @@ -15081,15 +15081,15 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 64 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 63 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -15098,11 +15098,11 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 64 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -15128,14 +15128,14 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 63 { + if auxIntToInt64(v_0_1.AuxInt) != 63 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -15151,15 +15151,15 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 64 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 63 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -15168,11 +15168,11 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 64 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -15196,14 +15196,14 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 31 { + if auxIntToInt64(v_0_1.AuxInt) != 31 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { @@ -15220,15 +15220,15 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 32 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 31 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -15237,11 +15237,11 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 32 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -15271,14 +15271,14 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 31 { + if auxIntToInt64(v_0_1.AuxInt) != 31 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -15294,15 +15294,15 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 32 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 31 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -15311,11 +15311,11 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 32 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -15325,50 +15325,50 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { break } // match: (OR (UBFIZ [bfc] x) (ANDconst [ac] y)) - // cond: ac == ^((1< 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 {s} (OffPtr [i0] p) mem) + // result: @mergePoint(b,x0,x1,x2,x3) (MOVWUload {s} (OffPtr [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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 { continue } y0 := s0.Args[0] @@ -15402,8 +15402,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x0.Op != OpARM64MOVBUload { continue } - i3 := x0.AuxInt - s := x0.Aux + i3 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o1.Args[1] @@ -15414,8 +15414,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x1.Op != OpARM64MOVBUload { continue } - i2 := x1.AuxInt - if x1.Aux != s { + i2 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -15430,8 +15430,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x2.Op != OpARM64MOVBUload { continue } - i1 := x2.AuxInt - if x2.Aux != s { + i1 := auxIntToInt32(x2.AuxInt) + if auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -15446,8 +15446,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x3.Op != OpARM64MOVBUload { continue } - i0 := x3.AuxInt - if x3.Aux != s { + i0 := auxIntToInt32(x3.AuxInt) + if auxToSym(x3.Aux) != s { continue } _ = x3.Args[1] @@ -15457,9 +15457,9 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { b = mergePoint(b, x0, x1, x2, x3) v0 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t) v.copyOf(v0) - v0.Aux = s + v0.Aux = symToAux(s) v1 := b.NewValue0(x3.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 + v1.AuxInt = int64ToAuxInt(int64(i0)) v1.AddArg(p) v0.AddArg2(v1, mem) return true @@ -15473,17 +15473,17 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { 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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 { continue } y0 := s0.Args[0] @@ -15491,10 +15491,10 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 3 { + if x0.Op != OpARM64MOVBUload || auxIntToInt32(x0.AuxInt) != 3 { continue } - s := x0.Aux + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o1.Args[1] @@ -15502,7 +15502,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 || x1.Aux != s { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 2 || auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -15514,7 +15514,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 1 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 1 || auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -15561,17 +15561,17 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { 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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 { continue } y0 := s0.Args[0] @@ -15585,7 +15585,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 3 { + if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 3 { continue } idx := x0_1.Args[0] @@ -15602,7 +15602,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { + if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { continue } y2 := o0.Args[1] @@ -15618,7 +15618,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 1 || idx != x2_1.Args[0] || mem != x2.Args[2] { + if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 1 || idx != x2_1.Args[0] || mem != x2.Args[2] { continue } y3 := v_1 @@ -15643,42 +15643,42 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } // match: (OR 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 {s} (OffPtr [i0] p) mem) + // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload {s} (OffPtr [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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 { continue } _ = o2.Args[1] o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 { continue } _ = o3.Args[1] o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 { continue } _ = o4.Args[1] o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 { continue } _ = o5.Args[1] s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 { continue } y0 := s0.Args[0] @@ -15689,8 +15689,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x0.Op != OpARM64MOVBUload { continue } - i7 := x0.AuxInt - s := x0.Aux + i7 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o5.Args[1] @@ -15701,8 +15701,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x1.Op != OpARM64MOVBUload { continue } - i6 := x1.AuxInt - if x1.Aux != s { + i6 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -15717,8 +15717,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x2.Op != OpARM64MOVBUload { continue } - i5 := x2.AuxInt - if x2.Aux != s { + i5 := auxIntToInt32(x2.AuxInt) + if auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -15733,8 +15733,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x3.Op != OpARM64MOVBUload { continue } - i4 := x3.AuxInt - if x3.Aux != s { + i4 := auxIntToInt32(x3.AuxInt) + if auxToSym(x3.Aux) != s { continue } _ = x3.Args[1] @@ -15749,8 +15749,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x4.Op != OpARM64MOVBUload { continue } - i3 := x4.AuxInt - if x4.Aux != s { + i3 := auxIntToInt32(x4.AuxInt) + if auxToSym(x4.Aux) != s { continue } _ = x4.Args[1] @@ -15765,8 +15765,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x5.Op != OpARM64MOVBUload { continue } - i2 := x5.AuxInt - if x5.Aux != s { + i2 := auxIntToInt32(x5.AuxInt) + if auxToSym(x5.Aux) != s { continue } _ = x5.Args[1] @@ -15781,8 +15781,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x6.Op != OpARM64MOVBUload { continue } - i1 := x6.AuxInt - if x6.Aux != s { + i1 := auxIntToInt32(x6.AuxInt) + if auxToSym(x6.Aux) != s { continue } _ = x6.Args[1] @@ -15797,8 +15797,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x7.Op != OpARM64MOVBUload { continue } - i0 := x7.AuxInt - if x7.Aux != s { + i0 := auxIntToInt32(x7.AuxInt) + if auxToSym(x7.Aux) != s { continue } _ = x7.Args[1] @@ -15808,9 +15808,9 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { b = mergePoint(b, x0, x1, x2, x3, x4, x5, x6, x7) v0 := b.NewValue0(x7.Pos, OpARM64MOVDload, t) v.copyOf(v0) - v0.Aux = s + v0.Aux = symToAux(s) v1 := b.NewValue0(x7.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 + v1.AuxInt = int64ToAuxInt(int64(i0)) v1.AddArg(p) v0.AddArg2(v1, mem) return true @@ -15824,37 +15824,37 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { 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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 { continue } _ = o2.Args[1] o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 { continue } _ = o3.Args[1] o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 { continue } _ = o4.Args[1] o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 { continue } _ = o5.Args[1] s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 { continue } y0 := s0.Args[0] @@ -15862,10 +15862,10 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 7 { + if x0.Op != OpARM64MOVBUload || auxIntToInt32(x0.AuxInt) != 7 { continue } - s := x0.Aux + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o5.Args[1] @@ -15873,7 +15873,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 6 || x1.Aux != s { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 6 || auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -15885,7 +15885,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 5 || auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -15897,7 +15897,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 4 || x3.Aux != s { + if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 4 || auxToSym(x3.Aux) != s { continue } _ = x3.Args[1] @@ -15909,7 +15909,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 3 || x4.Aux != s { + if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 3 || auxToSym(x4.Aux) != s { continue } _ = x4.Args[1] @@ -15921,7 +15921,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 2 || x5.Aux != s { + if x5.Op != OpARM64MOVBUload || auxIntToInt32(x5.AuxInt) != 2 || auxToSym(x5.Aux) != s { continue } _ = x5.Args[1] @@ -15933,7 +15933,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 1 || x6.Aux != s { + if x6.Op != OpARM64MOVBUload || auxIntToInt32(x6.AuxInt) != 1 || auxToSym(x6.Aux) != s { continue } _ = x6.Args[1] @@ -15980,37 +15980,37 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { 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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 { continue } _ = o2.Args[1] o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 { continue } _ = o3.Args[1] o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 { continue } _ = o4.Args[1] o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 { continue } _ = o5.Args[1] s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 { continue } y0 := s0.Args[0] @@ -16024,7 +16024,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 7 { + if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 7 { continue } idx := x0_1.Args[0] @@ -16041,7 +16041,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 6 || idx != x1_1.Args[0] || mem != x1.Args[2] { + if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 6 || idx != x1_1.Args[0] || mem != x1.Args[2] { continue } y2 := o4.Args[1] @@ -16057,7 +16057,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { + if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { continue } y3 := o3.Args[1] @@ -16073,7 +16073,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 4 || idx != x3_1.Args[0] || mem != x3.Args[2] { + if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 4 || idx != x3_1.Args[0] || mem != x3.Args[2] { continue } y4 := o2.Args[1] @@ -16089,7 +16089,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x4_1 := x4.Args[1] - if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 3 || idx != x4_1.Args[0] || mem != x4.Args[2] { + if x4_1.Op != OpARM64ADDconst || auxIntToInt64(x4_1.AuxInt) != 3 || idx != x4_1.Args[0] || mem != x4.Args[2] { continue } y5 := o1.Args[1] @@ -16105,7 +16105,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x5_1 := x5.Args[1] - if x5_1.Op != OpARM64ADDconst || x5_1.AuxInt != 2 || idx != x5_1.Args[0] || mem != x5.Args[2] { + if x5_1.Op != OpARM64ADDconst || auxIntToInt64(x5_1.AuxInt) != 2 || idx != x5_1.Args[0] || mem != x5.Args[2] { continue } y6 := o0.Args[1] @@ -16121,7 +16121,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x6_1 := x6.Args[1] - if x6_1.Op != OpARM64ADDconst || x6_1.AuxInt != 1 || idx != x6_1.Args[0] || mem != x6.Args[2] { + if x6_1.Op != OpARM64ADDconst || auxIntToInt64(x6_1.AuxInt) != 1 || idx != x6_1.Args[0] || mem != x6.Args[2] { continue } y7 := v_1 @@ -16146,22 +16146,22 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } // match: (OR 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 (MOVWUload {s} (OffPtr [i0] p) mem)) + // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUload {s} (OffPtr [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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 { continue } y0 := s0.Args[0] @@ -16172,8 +16172,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x0.Op != OpARM64MOVBUload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o1.Args[1] @@ -16184,8 +16184,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x1.Op != OpARM64MOVBUload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -16200,8 +16200,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x2.Op != OpARM64MOVBUload { continue } - i2 := x2.AuxInt - if x2.Aux != s { + i2 := auxIntToInt32(x2.AuxInt) + if auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -16216,8 +16216,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x3.Op != OpARM64MOVBUload { continue } - i3 := x3.AuxInt - if x3.Aux != s { + i3 := auxIntToInt32(x3.AuxInt) + if auxToSym(x3.Aux) != s { continue } _ = x3.Args[1] @@ -16228,9 +16228,9 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { v0 := b.NewValue0(x3.Pos, OpARM64REVW, t) v.copyOf(v0) v1 := b.NewValue0(x3.Pos, OpARM64MOVWUload, t) - v1.Aux = s + v1.Aux = symToAux(s) v2 := b.NewValue0(x3.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 + v2.AuxInt = int64ToAuxInt(int64(i0)) v2.AddArg(p) v1.AddArg2(v2, mem) v0.AddArg(v1) @@ -16245,17 +16245,17 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { 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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 { continue } y0 := s0.Args[0] @@ -16274,10 +16274,10 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 { continue } - s := x1.Aux + s := auxToSym(x1.Aux) _ = x1.Args[1] p1 := x1.Args[0] if p1.Op != OpARM64ADD { @@ -16297,7 +16297,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 2 || auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -16310,7 +16310,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { + if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 3 || auxToSym(x3.Aux) != s { continue } _ = x3.Args[1] @@ -16335,17 +16335,17 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { 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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] s0 := o1.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 24 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 24 { continue } y0 := s0.Args[0] @@ -16372,7 +16372,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { + if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { continue } y2 := o0.Args[1] @@ -16388,7 +16388,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { + if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { continue } y3 := v_1 @@ -16404,7 +16404,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || 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)) { + 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) @@ -16419,42 +16419,42 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } // match: (OR 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 (MOVDload {s} (OffPtr [i0] p) mem)) + // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (REV (MOVDload {s} (OffPtr [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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 { continue } _ = o2.Args[1] o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 { continue } _ = o3.Args[1] o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 { continue } _ = o4.Args[1] o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 { continue } _ = o5.Args[1] s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 { continue } y0 := s0.Args[0] @@ -16465,8 +16465,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x0.Op != OpARM64MOVBUload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o5.Args[1] @@ -16477,8 +16477,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x1.Op != OpARM64MOVBUload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -16493,8 +16493,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x2.Op != OpARM64MOVBUload { continue } - i2 := x2.AuxInt - if x2.Aux != s { + i2 := auxIntToInt32(x2.AuxInt) + if auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -16509,8 +16509,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x3.Op != OpARM64MOVBUload { continue } - i3 := x3.AuxInt - if x3.Aux != s { + i3 := auxIntToInt32(x3.AuxInt) + if auxToSym(x3.Aux) != s { continue } _ = x3.Args[1] @@ -16525,8 +16525,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x4.Op != OpARM64MOVBUload { continue } - i4 := x4.AuxInt - if x4.Aux != s { + i4 := auxIntToInt32(x4.AuxInt) + if auxToSym(x4.Aux) != s { continue } _ = x4.Args[1] @@ -16541,8 +16541,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x5.Op != OpARM64MOVBUload { continue } - i5 := x5.AuxInt - if x5.Aux != s { + i5 := auxIntToInt32(x5.AuxInt) + if auxToSym(x5.Aux) != s { continue } _ = x5.Args[1] @@ -16557,8 +16557,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x6.Op != OpARM64MOVBUload { continue } - i6 := x6.AuxInt - if x6.Aux != s { + i6 := auxIntToInt32(x6.AuxInt) + if auxToSym(x6.Aux) != s { continue } _ = x6.Args[1] @@ -16573,8 +16573,8 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if x7.Op != OpARM64MOVBUload { continue } - i7 := x7.AuxInt - if x7.Aux != s { + i7 := auxIntToInt32(x7.AuxInt) + if auxToSym(x7.Aux) != s { continue } _ = x7.Args[1] @@ -16585,9 +16585,9 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { v0 := b.NewValue0(x7.Pos, OpARM64REV, t) v.copyOf(v0) v1 := b.NewValue0(x7.Pos, OpARM64MOVDload, t) - v1.Aux = s + v1.Aux = symToAux(s) v2 := b.NewValue0(x7.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 + v2.AuxInt = int64ToAuxInt(int64(i0)) v2.AddArg(p) v1.AddArg2(v2, mem) v0.AddArg(v1) @@ -16602,37 +16602,37 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { 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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 { continue } _ = o2.Args[1] o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 { continue } _ = o3.Args[1] o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 { continue } _ = o4.Args[1] o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 { continue } _ = o5.Args[1] s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 { continue } y0 := s0.Args[0] @@ -16651,10 +16651,10 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 { continue } - s := x1.Aux + s := auxToSym(x1.Aux) _ = x1.Args[1] p1 := x1.Args[0] if p1.Op != OpARM64ADD { @@ -16674,7 +16674,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 2 || auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -16687,7 +16687,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 3 || x3.Aux != s { + if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 3 || auxToSym(x3.Aux) != s { continue } _ = x3.Args[1] @@ -16699,7 +16699,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 4 || x4.Aux != s { + if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 4 || auxToSym(x4.Aux) != s { continue } _ = x4.Args[1] @@ -16711,7 +16711,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x5 := y5.Args[0] - if x5.Op != OpARM64MOVBUload || x5.AuxInt != 5 || x5.Aux != s { + if x5.Op != OpARM64MOVBUload || auxIntToInt32(x5.AuxInt) != 5 || auxToSym(x5.Aux) != s { continue } _ = x5.Args[1] @@ -16723,7 +16723,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x6 := y6.Args[0] - if x6.Op != OpARM64MOVBUload || x6.AuxInt != 6 || x6.Aux != s { + if x6.Op != OpARM64MOVBUload || auxIntToInt32(x6.AuxInt) != 6 || auxToSym(x6.Aux) != s { continue } _ = x6.Args[1] @@ -16735,7 +16735,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x7 := y7.Args[0] - if x7.Op != OpARM64MOVBUload || x7.AuxInt != 7 || x7.Aux != s { + if x7.Op != OpARM64MOVBUload || auxIntToInt32(x7.AuxInt) != 7 || auxToSym(x7.Aux) != s { continue } _ = x7.Args[1] @@ -16760,37 +16760,37 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { 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 || o0.AuxInt != 8 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 8 { continue } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 16 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 16 { continue } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 24 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 24 { continue } _ = o2.Args[1] o3 := o2.Args[0] - if o3.Op != OpARM64ORshiftLL || o3.AuxInt != 32 { + if o3.Op != OpARM64ORshiftLL || auxIntToInt64(o3.AuxInt) != 32 { continue } _ = o3.Args[1] o4 := o3.Args[0] - if o4.Op != OpARM64ORshiftLL || o4.AuxInt != 40 { + if o4.Op != OpARM64ORshiftLL || auxIntToInt64(o4.AuxInt) != 40 { continue } _ = o4.Args[1] o5 := o4.Args[0] - if o5.Op != OpARM64ORshiftLL || o5.AuxInt != 48 { + if o5.Op != OpARM64ORshiftLL || auxIntToInt64(o5.AuxInt) != 48 { continue } _ = o5.Args[1] s0 := o5.Args[0] - if s0.Op != OpARM64SLLconst || s0.AuxInt != 56 { + if s0.Op != OpARM64SLLconst || auxIntToInt64(s0.AuxInt) != 56 { continue } y0 := s0.Args[0] @@ -16817,7 +16817,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { + if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { continue } y2 := o4.Args[1] @@ -16833,7 +16833,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { + if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { continue } y3 := o3.Args[1] @@ -16849,7 +16849,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] { + if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 3 || idx != x3_1.Args[0] || mem != x3.Args[2] { continue } y4 := o2.Args[1] @@ -16865,7 +16865,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x4_1 := x4.Args[1] - if x4_1.Op != OpARM64ADDconst || x4_1.AuxInt != 4 || idx != x4_1.Args[0] || mem != x4.Args[2] { + if x4_1.Op != OpARM64ADDconst || auxIntToInt64(x4_1.AuxInt) != 4 || idx != x4_1.Args[0] || mem != x4.Args[2] { continue } y5 := o1.Args[1] @@ -16881,7 +16881,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x5_1 := x5.Args[1] - if x5_1.Op != OpARM64ADDconst || x5_1.AuxInt != 5 || idx != x5_1.Args[0] || mem != x5.Args[2] { + if x5_1.Op != OpARM64ADDconst || auxIntToInt64(x5_1.AuxInt) != 5 || idx != x5_1.Args[0] || mem != x5.Args[2] { continue } y6 := o0.Args[1] @@ -16897,7 +16897,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x6_1 := x6.Args[1] - if x6_1.Op != OpARM64ADDconst || x6_1.AuxInt != 6 || idx != x6_1.Args[0] || mem != x6.Args[2] { + if x6_1.Op != OpARM64ADDconst || auxIntToInt64(x6_1.AuxInt) != 6 || idx != x6_1.Args[0] || mem != x6.Args[2] { continue } y7 := v_1 @@ -16913,7 +16913,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { continue } x7_1 := x7.Args[1] - if x7_1.Op != OpARM64ADDconst || 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)) { + 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) @@ -16964,13 +16964,13 @@ func rewriteValueARM64_OpARM64ORN(v *Value) bool { if x1.Op != OpARM64SLLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64ORNshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -16983,13 +16983,13 @@ func rewriteValueARM64_OpARM64ORN(v *Value) bool { if x1.Op != OpARM64SRLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64ORNshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -17002,13 +17002,13 @@ func rewriteValueARM64_OpARM64ORN(v *Value) bool { if x1.Op != OpARM64SRAconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64ORNshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -17020,14 +17020,14 @@ func rewriteValueARM64_OpARM64ORNshiftLL(v *Value) bool { // match: (ORNshiftLL x (MOVDconst [c]) [d]) // result: (ORconst x [^int64(uint64(c)<>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ORconst) - v.AuxInt = ^(c >> uint64(d)) + v.AuxInt = int64ToAuxInt(^(c >> uint64(d))) v.AddArg(x) return true } @@ -17071,17 +17071,17 @@ func rewriteValueARM64_OpARM64ORNshiftRA(v *Value) bool { // cond: c==d // result: (MOVDconst [-1]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRAconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.AuxInt = int64ToAuxInt(-1) return true } return false @@ -17092,14 +17092,14 @@ func rewriteValueARM64_OpARM64ORNshiftRL(v *Value) bool { // match: (ORNshiftRL x (MOVDconst [c]) [d]) // result: (ORconst x [^int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ORconst) - v.AuxInt = ^int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(^int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -17107,17 +17107,17 @@ func rewriteValueARM64_OpARM64ORNshiftRL(v *Value) bool { // cond: c==d // result: (MOVDconst [-1]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRLconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.AuxInt = int64ToAuxInt(-1) return true } return false @@ -17174,17 +17174,17 @@ func rewriteValueARM64_OpARM64ORconst(v *Value) bool { // cond: c2|c1 == ^0 // result: (ORconst [c1] x) for { - c1 := v.AuxInt + c1 := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64ANDconst { break } - c2 := v_0.AuxInt + c2 := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(c2|c1 == ^0) { break } v.reset(OpARM64ORconst) - v.AuxInt = c1 + v.AuxInt = int64ToAuxInt(c1) v.AddArg(x) return true } @@ -17198,16 +17198,16 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // match: (ORshiftLL (MOVDconst [c]) x [d]) // result: (ORconst [c] (SLLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -17215,14 +17215,14 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // match: (ORshiftLL x (MOVDconst [c]) [d]) // result: (ORconst x [int64(uint64(c)< [8] (UBFX [armBFAuxInt(8, 8)] x) x) // result: (REV16W x) for { - if v.Type != typ.UInt16 || v.AuxInt != 8 || v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) { + if v.Type != typ.UInt16 || auxIntToInt64(v.AuxInt) != 8 || v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || auxIntToArm64BitField(v_0.AuxInt) != armBFAuxInt(8, 8) { break } x := v_0.Args[0] @@ -17295,14 +17295,14 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // match: ( ORshiftLL [c] (SRLconst x [64-c]) x2) // result: (EXTRconst [64-c] x2 x) for { - c := v.AuxInt - if v_0.Op != OpARM64SRLconst || v_0.AuxInt != 64-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SRLconst || auxIntToInt64(v_0.AuxInt) != 64-c { break } x := v_0.Args[0] x2 := v_1 v.reset(OpARM64EXTRconst) - v.AuxInt = 64 - c + v.AuxInt = int64ToAuxInt(64 - c) v.AddArg2(x2, x) return true } @@ -17311,49 +17311,49 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: (EXTRWconst [32-c] x2 x) for { t := v.Type - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64UBFX { break } - bfc := v_0.AuxInt + bfc := auxIntToArm64BitField(v_0.AuxInt) x := v_0.Args[0] x2 := v_1 if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64EXTRWconst) - v.AuxInt = 32 - c + v.AuxInt = int64ToAuxInt(32 - c) v.AddArg2(x2, x) return true } // match: (ORshiftLL [sc] (UBFX [bfc] x) (SRLconst [sc] y)) - // cond: sc == getARM64BFwidth(bfc) + // cond: sc == bfc.getARM64BFwidth() // result: (BFXIL [bfc] y x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64UBFX { break } - bfc := v_0.AuxInt + bfc := auxIntToArm64BitField(v_0.AuxInt) x := v_0.Args[0] - if v_1.Op != OpARM64SRLconst || v_1.AuxInt != sc { + if v_1.Op != OpARM64SRLconst || auxIntToInt64(v_1.AuxInt) != sc { break } y := v_1.Args[0] - if !(sc == getARM64BFwidth(bfc)) { + if !(sc == bfc.getARM64BFwidth()) { break } v.reset(OpARM64BFXIL) - v.AuxInt = bfc + v.AuxInt = arm64BitFieldToAuxInt(bfc) v.AddArg2(y, x) return true } // match: (ORshiftLL [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 {s} (OffPtr [i0] p) mem) + // result: @mergePoint(b,x0,x1) (MOVHUload {s} (OffPtr [int64(i0)] p) mem) for { t := v.Type - if v.AuxInt != 8 { + if auxIntToInt64(v.AuxInt) != 8 { break } y0 := v_0 @@ -17364,8 +17364,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x0.Op != OpARM64MOVBUload { break } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := v_1 @@ -17376,8 +17376,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x1.Op != OpARM64MOVBUload { break } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { break } _ = x1.Args[1] @@ -17387,9 +17387,9 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(x1.Pos, OpARM64MOVHUload, t) v.copyOf(v0) - v0.Aux = s + v0.Aux = symToAux(s) v1 := b.NewValue0(x1.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 + v1.AuxInt = int64ToAuxInt(int64(i0)) v1.AddArg(p) v0.AddArg2(v1, mem) return true @@ -17399,7 +17399,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr0 idx0 mem) for { t := v.Type - if v.AuxInt != 8 { + if auxIntToInt64(v.AuxInt) != 8 { break } y0 := v_0 @@ -17418,10 +17418,10 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 { break } - s := x1.Aux + s := auxToSym(x1.Aux) _ = x1.Args[1] p1 := x1.Args[0] if p1.Op != OpARM64ADD { @@ -17449,7 +17449,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr idx mem) for { t := v.Type - if v.AuxInt != 8 { + if auxIntToInt64(v.AuxInt) != 8 { break } y0 := v_0 @@ -17476,7 +17476,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || 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)) { + 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) @@ -17487,14 +17487,14 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { } // match: (ORshiftLL [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 {s} (OffPtr [i0] p) mem) + // result: @mergePoint(b,x0,x1,x2) (MOVWUload {s} (OffPtr [int64(i0)] p) mem) for { t := v.Type - if v.AuxInt != 24 { + if auxIntToInt64(v.AuxInt) != 24 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 { break } _ = o0.Args[1] @@ -17502,8 +17502,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x0.Op != OpARM64MOVHUload { break } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o0.Args[1] @@ -17514,8 +17514,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x1.Op != OpARM64MOVBUload { break } - i2 := x1.AuxInt - if x1.Aux != s { + i2 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { break } _ = x1.Args[1] @@ -17530,8 +17530,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x2.Op != OpARM64MOVBUload { break } - i3 := x2.AuxInt - if x2.Aux != s { + i3 := auxIntToInt32(x2.AuxInt) + if auxToSym(x2.Aux) != s { break } _ = x2.Args[1] @@ -17541,9 +17541,9 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { b = mergePoint(b, x0, x1, x2) v0 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t) v.copyOf(v0) - v0.Aux = s + v0.Aux = symToAux(s) v1 := b.NewValue0(x2.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 + v1.AuxInt = int64ToAuxInt(int64(i0)) v1.AddArg(p) v0.AddArg2(v1, mem) return true @@ -17553,11 +17553,11 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 idx0 mem) for { t := v.Type - if v.AuxInt != 24 { + if auxIntToInt64(v.AuxInt) != 24 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 { break } _ = o0.Args[1] @@ -17573,10 +17573,10 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 2 { break } - s := x1.Aux + s := auxToSym(x1.Aux) _ = x1.Args[1] p1 := x1.Args[0] if p1.Op != OpARM64ADD { @@ -17596,7 +17596,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { continue } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 3 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 3 || auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -17617,11 +17617,11 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr idx mem) for { t := v.Type - if v.AuxInt != 24 { + if auxIntToInt64(v.AuxInt) != 24 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 { break } _ = o0.Args[1] @@ -17645,7 +17645,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { + if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 2 || idx != x1_1.Args[0] || mem != x1.Args[2] { break } y2 := v_1 @@ -17661,7 +17661,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || 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)) { + 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) @@ -17675,11 +17675,11 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2) (MOVWUloadidx ptr0 (SLLconst [1] idx0) mem) for { t := v.Type - if v.AuxInt != 24 { + if auxIntToInt64(v.AuxInt) != 24 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 { break } _ = o0.Args[1] @@ -17695,13 +17695,13 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 2 { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 2 { break } - s := x1.Aux + s := auxToSym(x1.Aux) _ = x1.Args[1] p1 := x1.Args[0] - if p1.Op != OpARM64ADDshiftLL || p1.AuxInt != 1 { + if p1.Op != OpARM64ADDshiftLL || auxIntToInt64(p1.AuxInt) != 1 { break } idx1 := p1.Args[1] @@ -17714,7 +17714,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 3 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 3 || auxToSym(x2.Aux) != s { break } _ = x2.Args[1] @@ -17726,31 +17726,31 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { v0 := b.NewValue0(x2.Pos, OpARM64MOVWUloadidx, t) v.copyOf(v0) v1 := b.NewValue0(x2.Pos, OpARM64SLLconst, idx0.Type) - v1.AuxInt = 1 + v1.AuxInt = int64ToAuxInt(1) v1.AddArg(idx0) v0.AddArg3(ptr0, v1, mem) return true } // match: (ORshiftLL [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 {s} (OffPtr [i0] p) mem) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDload {s} (OffPtr [int64(i0)] p) mem) for { t := v.Type - if v.AuxInt != 56 { + if auxIntToInt64(v.AuxInt) != 56 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 { break } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 { break } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 { break } _ = o2.Args[1] @@ -17758,8 +17758,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x0.Op != OpARM64MOVWUload { break } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o2.Args[1] @@ -17770,8 +17770,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x1.Op != OpARM64MOVBUload { break } - i4 := x1.AuxInt - if x1.Aux != s { + i4 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { break } _ = x1.Args[1] @@ -17786,8 +17786,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x2.Op != OpARM64MOVBUload { break } - i5 := x2.AuxInt - if x2.Aux != s { + i5 := auxIntToInt32(x2.AuxInt) + if auxToSym(x2.Aux) != s { break } _ = x2.Args[1] @@ -17802,8 +17802,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x3.Op != OpARM64MOVBUload { break } - i6 := x3.AuxInt - if x3.Aux != s { + i6 := auxIntToInt32(x3.AuxInt) + if auxToSym(x3.Aux) != s { break } _ = x3.Args[1] @@ -17818,8 +17818,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x4.Op != OpARM64MOVBUload { break } - i7 := x4.AuxInt - if x4.Aux != s { + i7 := auxIntToInt32(x4.AuxInt) + if auxToSym(x4.Aux) != s { break } _ = x4.Args[1] @@ -17829,9 +17829,9 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { b = mergePoint(b, x0, x1, x2, x3, x4) v0 := b.NewValue0(x4.Pos, OpARM64MOVDload, t) v.copyOf(v0) - v0.Aux = s + v0.Aux = symToAux(s) v1 := b.NewValue0(x4.Pos, OpOffPtr, p.Type) - v1.AuxInt = i0 + v1.AuxInt = int64ToAuxInt(int64(i0)) v1.AddArg(p) v0.AddArg2(v1, mem) return true @@ -17841,21 +17841,21 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 idx0 mem) for { t := v.Type - if v.AuxInt != 56 { + if auxIntToInt64(v.AuxInt) != 56 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 { break } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 { break } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 { break } _ = o2.Args[1] @@ -17871,10 +17871,10 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 4 { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 4 { break } - s := x1.Aux + s := auxToSym(x1.Aux) _ = x1.Args[1] p1 := x1.Args[0] if p1.Op != OpARM64ADD { @@ -17894,7 +17894,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { continue } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 5 || auxToSym(x2.Aux) != s { continue } _ = x2.Args[1] @@ -17907,7 +17907,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { continue } x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 6 || x3.Aux != s { + if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 6 || auxToSym(x3.Aux) != s { continue } _ = x3.Args[1] @@ -17919,7 +17919,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { continue } x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 7 || x4.Aux != s { + if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 7 || auxToSym(x4.Aux) != s { continue } _ = x4.Args[1] @@ -17939,21 +17939,21 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr0 (SLLconst [2] idx0) mem) for { t := v.Type - if v.AuxInt != 56 { + if auxIntToInt64(v.AuxInt) != 56 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 { break } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 { break } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 { break } _ = o2.Args[1] @@ -17969,13 +17969,13 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 4 { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 4 { break } - s := x1.Aux + s := auxToSym(x1.Aux) _ = x1.Args[1] p1 := x1.Args[0] - if p1.Op != OpARM64ADDshiftLL || p1.AuxInt != 2 { + if p1.Op != OpARM64ADDshiftLL || auxIntToInt64(p1.AuxInt) != 2 { break } idx1 := p1.Args[1] @@ -17988,7 +17988,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 5 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 5 || auxToSym(x2.Aux) != s { break } _ = x2.Args[1] @@ -18001,7 +18001,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 6 || x3.Aux != s { + if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 6 || auxToSym(x3.Aux) != s { break } _ = x3.Args[1] @@ -18013,7 +18013,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x4 := y4.Args[0] - if x4.Op != OpARM64MOVBUload || x4.AuxInt != 7 || x4.Aux != s { + if x4.Op != OpARM64MOVBUload || auxIntToInt32(x4.AuxInt) != 7 || auxToSym(x4.Aux) != s { break } _ = x4.Args[1] @@ -18024,7 +18024,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { v0 := b.NewValue0(x4.Pos, OpARM64MOVDloadidx, t) v.copyOf(v0) v1 := b.NewValue0(x4.Pos, OpARM64SLLconst, idx0.Type) - v1.AuxInt = 2 + v1.AuxInt = int64ToAuxInt(2) v1.AddArg(idx0) v0.AddArg3(ptr0, v1, mem) return true @@ -18034,21 +18034,21 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDloadidx ptr idx mem) for { t := v.Type - if v.AuxInt != 56 { + if auxIntToInt64(v.AuxInt) != 56 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 { break } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 { break } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 { break } _ = o2.Args[1] @@ -18072,7 +18072,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 4 || idx != x1_1.Args[0] || mem != x1.Args[2] { + if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 4 || idx != x1_1.Args[0] || mem != x1.Args[2] { break } y2 := o1.Args[1] @@ -18088,7 +18088,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { + if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 5 || idx != x2_1.Args[0] || mem != x2.Args[2] { break } y3 := o0.Args[1] @@ -18104,7 +18104,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 6 || idx != x3_1.Args[0] || mem != x3.Args[2] { + if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 6 || idx != x3_1.Args[0] || mem != x3.Args[2] { break } y4 := v_1 @@ -18120,7 +18120,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x4_1 := x4.Args[1] - if x4_1.Op != OpARM64ADDconst || 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)) { + 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) @@ -18134,7 +18134,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1) (REV16W (MOVHUload [i0] {s} p mem)) for { t := v.Type - if v.AuxInt != 8 { + if auxIntToInt64(v.AuxInt) != 8 { break } y0 := v_0 @@ -18145,8 +18145,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x0.Op != OpARM64MOVBUload { break } - i1 := x0.AuxInt - s := x0.Aux + i1 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := v_1 @@ -18157,8 +18157,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x1.Op != OpARM64MOVBUload { break } - i0 := x1.AuxInt - if x1.Aux != s { + i0 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { break } _ = x1.Args[1] @@ -18169,8 +18169,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { v0 := b.NewValue0(x1.Pos, OpARM64REV16W, t) v.copyOf(v0) v1 := b.NewValue0(x1.Pos, OpARM64MOVHUload, t) - v1.AuxInt = i0 - v1.Aux = s + v1.AuxInt = int32ToAuxInt(i0) + v1.Aux = symToAux(s) v1.AddArg2(p, mem) v0.AddArg(v1) return true @@ -18180,7 +18180,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr0 idx0 mem)) for { t := v.Type - if v.AuxInt != 8 { + if auxIntToInt64(v.AuxInt) != 8 { break } y0 := v_0 @@ -18188,10 +18188,10 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x0 := y0.Args[0] - if x0.Op != OpARM64MOVBUload || x0.AuxInt != 1 { + if x0.Op != OpARM64MOVBUload || auxIntToInt32(x0.AuxInt) != 1 { break } - s := x0.Aux + s := auxToSym(x0.Aux) mem := x0.Args[1] p1 := x0.Args[0] if p1.Op != OpARM64ADD { @@ -18232,7 +18232,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr idx mem)) for { t := v.Type - if v.AuxInt != 8 { + if auxIntToInt64(v.AuxInt) != 8 { break } y0 := v_0 @@ -18246,7 +18246,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 1 { + if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 1 { break } idx := x0_1.Args[0] @@ -18272,14 +18272,14 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { } // match: (ORshiftLL [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 (MOVWUload {s} (OffPtr [i0] p) mem)) + // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUload {s} (OffPtr [int64(i0)] p) mem)) for { t := v.Type - if v.AuxInt != 24 { + if auxIntToInt64(v.AuxInt) != 24 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 { break } _ = o0.Args[1] @@ -18291,8 +18291,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x0.Op != OpARM64MOVHUload { break } - i2 := x0.AuxInt - s := x0.Aux + i2 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o0.Args[1] @@ -18303,8 +18303,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x1.Op != OpARM64MOVBUload { break } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { break } _ = x1.Args[1] @@ -18319,8 +18319,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x2.Op != OpARM64MOVBUload { break } - i0 := x2.AuxInt - if x2.Aux != s { + i0 := auxIntToInt32(x2.AuxInt) + if auxToSym(x2.Aux) != s { break } _ = x2.Args[1] @@ -18331,9 +18331,9 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { v0 := b.NewValue0(x2.Pos, OpARM64REVW, t) v.copyOf(v0) v1 := b.NewValue0(x2.Pos, OpARM64MOVWUload, t) - v1.Aux = s + v1.Aux = symToAux(s) v2 := b.NewValue0(x2.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 + v2.AuxInt = int64ToAuxInt(int64(i0)) v2.AddArg(p) v1.AddArg2(v2, mem) v0.AddArg(v1) @@ -18344,11 +18344,11 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr0 idx0 mem)) for { t := v.Type - if v.AuxInt != 24 { + if auxIntToInt64(v.AuxInt) != 24 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 { break } _ = o0.Args[1] @@ -18357,10 +18357,10 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x0 := y0.Args[0] - if x0.Op != OpARM64MOVHUload || x0.AuxInt != 2 { + if x0.Op != OpARM64MOVHUload || auxIntToInt32(x0.AuxInt) != 2 { break } - s := x0.Aux + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o0.Args[1] @@ -18368,7 +18368,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 1 || x1.Aux != s { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 1 || auxToSym(x1.Aux) != s { break } _ = x1.Args[1] @@ -18414,11 +18414,11 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2) (REVW (MOVWUloadidx ptr idx mem)) for { t := v.Type - if v.AuxInt != 24 { + if auxIntToInt64(v.AuxInt) != 24 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 16 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 16 { break } _ = o0.Args[1] @@ -18433,7 +18433,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 2 { + if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 2 { break } idx := x0_1.Args[0] @@ -18450,7 +18450,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { + if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 1 || idx != x1_1.Args[0] || mem != x1.Args[2] { break } y2 := v_1 @@ -18475,24 +18475,24 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { } // match: (ORshiftLL [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 (MOVDload {s} (OffPtr [i0] p) mem)) + // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDload {s} (OffPtr [int64(i0)] p) mem)) for { t := v.Type - if v.AuxInt != 56 { + if auxIntToInt64(v.AuxInt) != 56 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 { break } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 { break } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 { break } _ = o2.Args[1] @@ -18504,8 +18504,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x0.Op != OpARM64MOVWUload { break } - i4 := x0.AuxInt - s := x0.Aux + i4 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o2.Args[1] @@ -18516,8 +18516,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x1.Op != OpARM64MOVBUload { break } - i3 := x1.AuxInt - if x1.Aux != s { + i3 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { break } _ = x1.Args[1] @@ -18532,8 +18532,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x2.Op != OpARM64MOVBUload { break } - i2 := x2.AuxInt - if x2.Aux != s { + i2 := auxIntToInt32(x2.AuxInt) + if auxToSym(x2.Aux) != s { break } _ = x2.Args[1] @@ -18548,8 +18548,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x3.Op != OpARM64MOVBUload { break } - i1 := x3.AuxInt - if x3.Aux != s { + i1 := auxIntToInt32(x3.AuxInt) + if auxToSym(x3.Aux) != s { break } _ = x3.Args[1] @@ -18564,8 +18564,8 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { if x4.Op != OpARM64MOVBUload { break } - i0 := x4.AuxInt - if x4.Aux != s { + i0 := auxIntToInt32(x4.AuxInt) + if auxToSym(x4.Aux) != s { break } _ = x4.Args[1] @@ -18576,9 +18576,9 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { v0 := b.NewValue0(x4.Pos, OpARM64REV, t) v.copyOf(v0) v1 := b.NewValue0(x4.Pos, OpARM64MOVDload, t) - v1.Aux = s + v1.Aux = symToAux(s) v2 := b.NewValue0(x4.Pos, OpOffPtr, p.Type) - v2.AuxInt = i0 + v2.AuxInt = int64ToAuxInt(int64(i0)) v2.AddArg(p) v1.AddArg2(v2, mem) v0.AddArg(v1) @@ -18589,21 +18589,21 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr0 idx0 mem)) for { t := v.Type - if v.AuxInt != 56 { + if auxIntToInt64(v.AuxInt) != 56 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 { break } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 { break } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 { break } _ = o2.Args[1] @@ -18612,10 +18612,10 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x0 := y0.Args[0] - if x0.Op != OpARM64MOVWUload || x0.AuxInt != 4 { + if x0.Op != OpARM64MOVWUload || auxIntToInt32(x0.AuxInt) != 4 { break } - s := x0.Aux + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] y1 := o2.Args[1] @@ -18623,7 +18623,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1 := y1.Args[0] - if x1.Op != OpARM64MOVBUload || x1.AuxInt != 3 || x1.Aux != s { + if x1.Op != OpARM64MOVBUload || auxIntToInt32(x1.AuxInt) != 3 || auxToSym(x1.Aux) != s { break } _ = x1.Args[1] @@ -18635,7 +18635,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x2 := y2.Args[0] - if x2.Op != OpARM64MOVBUload || x2.AuxInt != 2 || x2.Aux != s { + if x2.Op != OpARM64MOVBUload || auxIntToInt32(x2.AuxInt) != 2 || auxToSym(x2.Aux) != s { break } _ = x2.Args[1] @@ -18647,7 +18647,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x3 := y3.Args[0] - if x3.Op != OpARM64MOVBUload || x3.AuxInt != 1 || x3.Aux != s { + if x3.Op != OpARM64MOVBUload || auxIntToInt32(x3.AuxInt) != 1 || auxToSym(x3.Aux) != s { break } _ = x3.Args[1] @@ -18693,21 +18693,21 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { // result: @mergePoint(b,x0,x1,x2,x3,x4) (REV (MOVDloadidx ptr idx mem)) for { t := v.Type - if v.AuxInt != 56 { + if auxIntToInt64(v.AuxInt) != 56 { break } o0 := v_0 - if o0.Op != OpARM64ORshiftLL || o0.AuxInt != 48 { + if o0.Op != OpARM64ORshiftLL || auxIntToInt64(o0.AuxInt) != 48 { break } _ = o0.Args[1] o1 := o0.Args[0] - if o1.Op != OpARM64ORshiftLL || o1.AuxInt != 40 { + if o1.Op != OpARM64ORshiftLL || auxIntToInt64(o1.AuxInt) != 40 { break } _ = o1.Args[1] o2 := o1.Args[0] - if o2.Op != OpARM64ORshiftLL || o2.AuxInt != 32 { + if o2.Op != OpARM64ORshiftLL || auxIntToInt64(o2.AuxInt) != 32 { break } _ = o2.Args[1] @@ -18722,7 +18722,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] - if x0_1.Op != OpARM64ADDconst || x0_1.AuxInt != 4 { + if x0_1.Op != OpARM64ADDconst || auxIntToInt64(x0_1.AuxInt) != 4 { break } idx := x0_1.Args[0] @@ -18739,7 +18739,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x1_1 := x1.Args[1] - if x1_1.Op != OpARM64ADDconst || x1_1.AuxInt != 3 || idx != x1_1.Args[0] || mem != x1.Args[2] { + if x1_1.Op != OpARM64ADDconst || auxIntToInt64(x1_1.AuxInt) != 3 || idx != x1_1.Args[0] || mem != x1.Args[2] { break } y2 := o1.Args[1] @@ -18755,7 +18755,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x2_1 := x2.Args[1] - if x2_1.Op != OpARM64ADDconst || x2_1.AuxInt != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { + if x2_1.Op != OpARM64ADDconst || auxIntToInt64(x2_1.AuxInt) != 2 || idx != x2_1.Args[0] || mem != x2.Args[2] { break } y3 := o0.Args[1] @@ -18771,7 +18771,7 @@ func rewriteValueARM64_OpARM64ORshiftLL(v *Value) bool { break } x3_1 := x3.Args[1] - if x3_1.Op != OpARM64ADDconst || x3_1.AuxInt != 1 || idx != x3_1.Args[0] || mem != x3.Args[2] { + if x3_1.Op != OpARM64ADDconst || auxIntToInt64(x3_1.AuxInt) != 1 || idx != x3_1.Args[0] || mem != x3.Args[2] { break } y4 := v_1 @@ -18803,16 +18803,16 @@ func rewriteValueARM64_OpARM64ORshiftRA(v *Value) bool { // match: (ORshiftRA (MOVDconst [c]) x [d]) // result: (ORconst [c] (SRAconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -18820,14 +18820,14 @@ func rewriteValueARM64_OpARM64ORshiftRA(v *Value) bool { // match: (ORshiftRA x (MOVDconst [c]) [d]) // result: (ORconst x [c>>uint64(d)]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ORconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = int64ToAuxInt(c >> uint64(d)) v.AddArg(x) return true } @@ -18835,13 +18835,13 @@ func rewriteValueARM64_OpARM64ORshiftRA(v *Value) bool { // cond: c==d // result: y for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 y := v_1 if y.Op != OpARM64SRAconst { break } - c := y.AuxInt + c := auxIntToInt64(y.AuxInt) if x != y.Args[0] || !(c == d) { break } @@ -18857,16 +18857,16 @@ func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { // match: (ORshiftRL (MOVDconst [c]) x [d]) // result: (ORconst [c] (SRLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64ORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -18874,14 +18874,14 @@ func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { // match: (ORshiftRL x (MOVDconst [c]) [d]) // result: (ORconst x [int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ORconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -18889,13 +18889,13 @@ func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { // cond: c==d // result: y for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 y := v_1 if y.Op != OpARM64SRLconst { break } - c := y.AuxInt + c := auxIntToInt64(y.AuxInt) if x != y.Args[0] || !(c == d) { break } @@ -18905,8 +18905,8 @@ func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { // match: ( ORshiftRL [c] (SLLconst x [64-c]) x) // result: (RORconst [ c] x) for { - c := v.AuxInt - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 64-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 64-c { break } x := v_0.Args[0] @@ -18914,7 +18914,7 @@ func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { break } v.reset(OpARM64RORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -18923,8 +18923,8 @@ func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { // result: (RORWconst [c] x) for { t := v.Type - c := v.AuxInt - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 32-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 32-c { break } x := v_0.Args[0] @@ -18932,7 +18932,7 @@ func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { break } v.reset(OpARM64RORWconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -18940,22 +18940,22 @@ func rewriteValueARM64_OpARM64ORshiftRL(v *Value) bool { // cond: lc > rc && ac == ^((1< rc && ac == ^((1< rc // result: (SBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) for { - rc := v.AuxInt + rc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SLLconst { break } - lc := v_0.AuxInt + lc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(lc > rc) { break } v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(lc-rc, 64-lc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(lc-rc, 64-lc)) v.AddArg(x) return true } @@ -19265,17 +19265,17 @@ func rewriteValueARM64_OpARM64SRAconst(v *Value) bool { // cond: lc <= rc // result: (SBFX [armBFAuxInt(rc-lc, 64-rc)] x) for { - rc := v.AuxInt + rc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SLLconst { break } - lc := v_0.AuxInt + lc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(lc <= rc) { break } v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(rc-lc, 64-rc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(rc-lc, 64-rc)) v.AddArg(x) return true } @@ -19283,7 +19283,7 @@ func rewriteValueARM64_OpARM64SRAconst(v *Value) bool { // cond: rc < 32 // result: (SBFX [armBFAuxInt(rc, 32-rc)] x) for { - rc := v.AuxInt + rc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVWreg { break } @@ -19292,7 +19292,7 @@ func rewriteValueARM64_OpARM64SRAconst(v *Value) bool { break } v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(rc, 32-rc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(rc, 32-rc)) v.AddArg(x) return true } @@ -19300,7 +19300,7 @@ func rewriteValueARM64_OpARM64SRAconst(v *Value) bool { // cond: rc < 16 // result: (SBFX [armBFAuxInt(rc, 16-rc)] x) for { - rc := v.AuxInt + rc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVHreg { break } @@ -19309,7 +19309,7 @@ func rewriteValueARM64_OpARM64SRAconst(v *Value) bool { break } v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(rc, 16-rc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(rc, 16-rc)) v.AddArg(x) return true } @@ -19317,7 +19317,7 @@ func rewriteValueARM64_OpARM64SRAconst(v *Value) bool { // cond: rc < 8 // result: (SBFX [armBFAuxInt(rc, 8-rc)] x) for { - rc := v.AuxInt + rc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVBreg { break } @@ -19326,43 +19326,43 @@ func rewriteValueARM64_OpARM64SRAconst(v *Value) bool { break } v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(rc, 8-rc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(rc, 8-rc)) v.AddArg(x) return true } // match: (SRAconst [sc] (SBFIZ [bfc] x)) - // cond: sc < getARM64BFlsb(bfc) - // result: (SBFIZ [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) + // cond: sc < bfc.getARM64BFlsb() + // result: (SBFIZ [armBFAuxInt(bfc.getARM64BFlsb()-sc, bfc.getARM64BFwidth())] x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SBFIZ { break } - bfc := v_0.AuxInt + bfc := auxIntToArm64BitField(v_0.AuxInt) x := v_0.Args[0] - if !(sc < getARM64BFlsb(bfc)) { + if !(sc < bfc.getARM64BFlsb()) { break } v.reset(OpARM64SBFIZ) - v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(bfc.getARM64BFlsb()-sc, bfc.getARM64BFwidth())) v.AddArg(x) return true } // match: (SRAconst [sc] (SBFIZ [bfc] x)) - // cond: sc >= getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (SBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + // cond: sc >= bfc.getARM64BFlsb() && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth() + // result: (SBFX [armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)] x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SBFIZ { break } - bfc := v_0.AuxInt + bfc := auxIntToArm64BitField(v_0.AuxInt) x := v_0.Args[0] - if !(sc >= getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { + if !(sc >= bfc.getARM64BFlsb() && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth()) { break } v.reset(OpARM64SBFX) - v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)) v.AddArg(x) return true } @@ -19404,8 +19404,8 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { // cond: 0 < c && c < 64 // result: (ANDconst [1< rc // result: (UBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) for { - rc := v.AuxInt + rc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SLLconst { break } - lc := v_0.AuxInt + lc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(lc > rc) { break } v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(lc-rc, 64-lc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(lc-rc, 64-lc)) v.AddArg(x) return true } @@ -19439,17 +19439,17 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { // cond: isARM64BFMask(sc, ac, sc) // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64ANDconst { break } - ac := v_0.AuxInt + ac := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(isARM64BFMask(sc, ac, sc)) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, sc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(ac, sc))) v.AddArg(x) return true } @@ -19457,7 +19457,7 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { // cond: isARM64BFMask(sc, 1<<32-1, sc) // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVWUreg { break } @@ -19466,7 +19466,7 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))) v.AddArg(x) return true } @@ -19474,7 +19474,7 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { // cond: isARM64BFMask(sc, 1<<16-1, sc) // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVHUreg { break } @@ -19483,7 +19483,7 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))) v.AddArg(x) return true } @@ -19491,7 +19491,7 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { // cond: isARM64BFMask(sc, 1<<8-1, sc) // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVBUreg { break } @@ -19500,7 +19500,7 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))) v.AddArg(x) return true } @@ -19508,89 +19508,89 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { // cond: lc < rc // result: (UBFX [armBFAuxInt(rc-lc, 64-rc)] x) for { - rc := v.AuxInt + rc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SLLconst { break } - lc := v_0.AuxInt + lc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] if !(lc < rc) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(rc-lc, 64-rc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(rc-lc, 64-rc)) v.AddArg(x) return true } // match: (SRLconst [sc] (UBFX [bfc] x)) - // cond: sc < getARM64BFwidth(bfc) - // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) + // cond: sc < bfc.getARM64BFwidth() + // result: (UBFX [armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth()-sc)] x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64UBFX { break } - bfc := v_0.AuxInt + bfc := auxIntToArm64BitField(v_0.AuxInt) x := v_0.Args[0] - if !(sc < getARM64BFwidth(bfc)) { + if !(sc < bfc.getARM64BFwidth()) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth()-sc)) v.AddArg(x) return true } // match: (SRLconst [sc] (UBFIZ [bfc] x)) - // cond: sc == getARM64BFlsb(bfc) - // result: (ANDconst [1< getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (UBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + // cond: sc > bfc.getARM64BFlsb() && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth() + // result: (UBFX [armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)] x) for { - sc := v.AuxInt + sc := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64UBFIZ { break } - bfc := v_0.AuxInt + bfc := auxIntToArm64BitField(v_0.AuxInt) x := v_0.Args[0] - if !(sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { + if !(sc > bfc.getARM64BFlsb() && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth()) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)) v.AddArg(x) return true } @@ -19807,13 +19807,13 @@ func rewriteValueARM64_OpARM64SUB(v *Value) bool { if x1.Op != OpARM64SLLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -19826,13 +19826,13 @@ func rewriteValueARM64_OpARM64SUB(v *Value) bool { if x1.Op != OpARM64SRLconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64SUBshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -19845,13 +19845,13 @@ func rewriteValueARM64_OpARM64SUB(v *Value) bool { if x1.Op != OpARM64SRAconst { break } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { break } v.reset(OpARM64SUBshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -19917,14 +19917,14 @@ func rewriteValueARM64_OpARM64SUBshiftLL(v *Value) bool { // match: (SUBshiftLL x (MOVDconst [c]) [d]) // result: (SUBconst x [int64(uint64(c)<>uint64(d)]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64SUBconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = int64ToAuxInt(c >> uint64(d)) v.AddArg(x) return true } @@ -19968,17 +19968,17 @@ func rewriteValueARM64_OpARM64SUBshiftRA(v *Value) bool { // cond: c==d // result: (MOVDconst [0]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRAconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -19989,14 +19989,14 @@ func rewriteValueARM64_OpARM64SUBshiftRL(v *Value) bool { // match: (SUBshiftRL x (MOVDconst [c]) [d]) // result: (SUBconst x [int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64SUBconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -20004,17 +20004,17 @@ func rewriteValueARM64_OpARM64SUBshiftRL(v *Value) bool { // cond: c==d // result: (MOVDconst [0]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRLconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -20048,13 +20048,13 @@ func rewriteValueARM64_OpARM64TST(v *Value) bool { if x1.Op != OpARM64SLLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64TSTshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -20070,13 +20070,13 @@ func rewriteValueARM64_OpARM64TST(v *Value) bool { if x1.Op != OpARM64SRLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64TSTshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -20092,13 +20092,13 @@ func rewriteValueARM64_OpARM64TST(v *Value) bool { if x1.Op != OpARM64SRAconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64TSTshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -20166,16 +20166,16 @@ func rewriteValueARM64_OpARM64TSTshiftLL(v *Value) bool { // match: (TSTshiftLL (MOVDconst [c]) x [d]) // result: (TSTconst [c] (SLLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64TSTconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -20183,14 +20183,14 @@ func rewriteValueARM64_OpARM64TSTshiftLL(v *Value) bool { // match: (TSTshiftLL x (MOVDconst [c]) [d]) // result: (TSTconst x [int64(uint64(c)< x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64TSTconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -20220,14 +20220,14 @@ func rewriteValueARM64_OpARM64TSTshiftRA(v *Value) bool { // match: (TSTshiftRA x (MOVDconst [c]) [d]) // result: (TSTconst x [c>>uint64(d)]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64TSTconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = int64ToAuxInt(c >> uint64(d)) v.AddArg(x) return true } @@ -20240,16 +20240,16 @@ func rewriteValueARM64_OpARM64TSTshiftRL(v *Value) bool { // match: (TSTshiftRL (MOVDconst [c]) x [d]) // result: (TSTconst [c] (SRLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64TSTconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -20257,14 +20257,14 @@ func rewriteValueARM64_OpARM64TSTshiftRL(v *Value) bool { // match: (TSTshiftRL x (MOVDconst [c]) [d]) // result: (TSTconst x [int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64TSTconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -20273,20 +20273,20 @@ func rewriteValueARM64_OpARM64TSTshiftRL(v *Value) bool { func rewriteValueARM64_OpARM64UBFIZ(v *Value) bool { v_0 := v.Args[0] // match: (UBFIZ [bfc] (SLLconst [sc] x)) - // cond: sc < getARM64BFwidth(bfc) - // result: (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) + // cond: sc < bfc.getARM64BFwidth() + // result: (UBFIZ [armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth()-sc)] x) for { - bfc := v.AuxInt + bfc := auxIntToArm64BitField(v.AuxInt) if v_0.Op != OpARM64SLLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] - if !(sc < getARM64BFwidth(bfc)) { + if !(sc < bfc.getARM64BFwidth()) { break } v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth()-sc)) v.AddArg(x) return true } @@ -20295,74 +20295,74 @@ func rewriteValueARM64_OpARM64UBFIZ(v *Value) bool { func rewriteValueARM64_OpARM64UBFX(v *Value) bool { v_0 := v.Args[0] // match: (UBFX [bfc] (SRLconst [sc] x)) - // cond: sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 - // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) + // cond: sc+bfc.getARM64BFwidth()+bfc.getARM64BFlsb() < 64 + // result: (UBFX [armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth())] x) for { - bfc := v.AuxInt + bfc := auxIntToArm64BitField(v.AuxInt) if v_0.Op != OpARM64SRLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] - if !(sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64) { + if !(sc+bfc.getARM64BFwidth()+bfc.getARM64BFlsb() < 64) { break } v.reset(OpARM64UBFX) - v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(bfc.getARM64BFlsb()+sc, bfc.getARM64BFwidth())) v.AddArg(x) return true } // match: (UBFX [bfc] (SLLconst [sc] x)) - // cond: sc == getARM64BFlsb(bfc) - // result: (ANDconst [1< getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (UBFIZ [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + // cond: sc > bfc.getARM64BFlsb() && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth() + // result: (UBFIZ [armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)] x) for { - bfc := v.AuxInt + bfc := auxIntToArm64BitField(v.AuxInt) if v_0.Op != OpARM64SLLconst { break } - sc := v_0.AuxInt + sc := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] - if !(sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc)) { + if !(sc > bfc.getARM64BFlsb() && sc < bfc.getARM64BFlsb()+bfc.getARM64BFwidth()) { break } v.reset(OpARM64UBFIZ) - v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.AuxInt = arm64BitFieldToAuxInt(armBFAuxInt(sc-bfc.getARM64BFlsb(), bfc.getARM64BFlsb()+bfc.getARM64BFwidth()-sc)) v.AddArg(x) return true } @@ -20657,13 +20657,13 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { if x1.Op != OpARM64SLLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64XORshiftLL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -20679,13 +20679,13 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { if x1.Op != OpARM64SRLconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64XORshiftRL) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -20701,13 +20701,13 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { if x1.Op != OpARM64SRAconst { continue } - c := x1.AuxInt + c := auxIntToInt64(x1.AuxInt) y := x1.Args[0] if !(clobberIfDead(x1)) { continue } v.reset(OpARM64XORshiftRA) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(x0, y) return true } @@ -20728,14 +20728,14 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 63 { + if auxIntToInt64(v_0_1.AuxInt) != 63 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { @@ -20751,15 +20751,15 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 64 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 63 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -20768,11 +20768,11 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 64 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -20798,14 +20798,14 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 63 { + if auxIntToInt64(v_0_1.AuxInt) != 63 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -20821,15 +20821,15 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 64 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 64 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 63 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 63 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -20838,11 +20838,11 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 64 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 64 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 63 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64ROR) @@ -20866,14 +20866,14 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 31 { + if auxIntToInt64(v_0_1.AuxInt) != 31 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { @@ -20890,15 +20890,15 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 32 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 31 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -20907,11 +20907,11 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 32 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -20941,14 +20941,14 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { continue } t := v_0_1.Type - if v_0_1.AuxInt != 31 { + if auxIntToInt64(v_0_1.AuxInt) != 31 { continue } y := v_0_1.Args[0] if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := v_1.Aux + cc := auxToCCop(v_1.Aux) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -20964,15 +20964,15 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } _ = v_1_0_1.Args[1] v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpARM64MOVDconst || v_1_0_1_0.AuxInt != 32 { + if v_1_0_1_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_0_1_0.AuxInt) != 32 { continue } v_1_0_1_1 := v_1_0_1.Args[1] - if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || v_1_0_1_1.AuxInt != 31 || y != v_1_0_1_1.Args[0] { + if v_1_0_1_1.Op != OpARM64ANDconst || v_1_0_1_1.Type != t || auxIntToInt64(v_1_0_1_1.AuxInt) != 31 || y != v_1_0_1_1.Args[0] { continue } v_1_1 := v_1.Args[1] - if v_1_1.Op != OpARM64CMPconst || v_1_1.AuxInt != 64 { + if v_1_1.Op != OpARM64CMPconst || auxIntToInt64(v_1_1.AuxInt) != 64 { continue } v_1_1_0 := v_1_1.Args[0] @@ -20981,11 +20981,11 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } _ = v_1_1_0.Args[1] v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpARM64MOVDconst || v_1_1_0_0.AuxInt != 32 { + if v_1_1_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_1_1_0_0.AuxInt) != 32 { continue } v_1_1_0_1 := v_1_1_0.Args[1] - if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || v_1_1_0_1.AuxInt != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { + if v_1_1_0_1.Op != OpARM64ANDconst || v_1_1_0_1.Type != t || auxIntToInt64(v_1_1_0_1.AuxInt) != 31 || y != v_1_1_0_1.Args[0] || !(cc == OpARM64LessThanU) { continue } v.reset(OpARM64RORW) @@ -21055,16 +21055,16 @@ func rewriteValueARM64_OpARM64XORshiftLL(v *Value) bool { // match: (XORshiftLL (MOVDconst [c]) x [d]) // result: (XORconst [c] (SLLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64XORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -21072,14 +21072,14 @@ func rewriteValueARM64_OpARM64XORshiftLL(v *Value) bool { // match: (XORshiftLL x (MOVDconst [c]) [d]) // result: (XORconst x [int64(uint64(c)< [8] (UBFX [armBFAuxInt(8, 8)] x) x) // result: (REV16W x) for { - if v.Type != typ.UInt16 || v.AuxInt != 8 || v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || v_0.AuxInt != armBFAuxInt(8, 8) { + if v.Type != typ.UInt16 || auxIntToInt64(v.AuxInt) != 8 || v_0.Op != OpARM64UBFX || v_0.Type != typ.UInt16 || auxIntToArm64BitField(v_0.AuxInt) != armBFAuxInt(8, 8) { break } x := v_0.Args[0] @@ -21152,14 +21152,14 @@ func rewriteValueARM64_OpARM64XORshiftLL(v *Value) bool { // match: (XORshiftLL [c] (SRLconst x [64-c]) x2) // result: (EXTRconst [64-c] x2 x) for { - c := v.AuxInt - if v_0.Op != OpARM64SRLconst || v_0.AuxInt != 64-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SRLconst || auxIntToInt64(v_0.AuxInt) != 64-c { break } x := v_0.Args[0] x2 := v_1 v.reset(OpARM64EXTRconst) - v.AuxInt = 64 - c + v.AuxInt = int64ToAuxInt(64 - c) v.AddArg2(x2, x) return true } @@ -21168,18 +21168,18 @@ func rewriteValueARM64_OpARM64XORshiftLL(v *Value) bool { // result: (EXTRWconst [32-c] x2 x) for { t := v.Type - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64UBFX { break } - bfc := v_0.AuxInt + bfc := auxIntToArm64BitField(v_0.AuxInt) x := v_0.Args[0] x2 := v_1 if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64EXTRWconst) - v.AuxInt = 32 - c + v.AuxInt = int64ToAuxInt(32 - c) v.AddArg2(x2, x) return true } @@ -21192,16 +21192,16 @@ func rewriteValueARM64_OpARM64XORshiftRA(v *Value) bool { // match: (XORshiftRA (MOVDconst [c]) x [d]) // result: (XORconst [c] (SRAconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64XORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -21209,14 +21209,14 @@ func rewriteValueARM64_OpARM64XORshiftRA(v *Value) bool { // match: (XORshiftRA x (MOVDconst [c]) [d]) // result: (XORconst x [c>>uint64(d)]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64XORconst) - v.AuxInt = c >> uint64(d) + v.AuxInt = int64ToAuxInt(c >> uint64(d)) v.AddArg(x) return true } @@ -21224,17 +21224,17 @@ func rewriteValueARM64_OpARM64XORshiftRA(v *Value) bool { // cond: c==d // result: (MOVDconst [0]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRAconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } return false @@ -21246,16 +21246,16 @@ func rewriteValueARM64_OpARM64XORshiftRL(v *Value) bool { // match: (XORshiftRL (MOVDconst [c]) x [d]) // result: (XORconst [c] (SRLconst x [d])) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64XORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) - v0.AuxInt = d + v0.AuxInt = int64ToAuxInt(d) v0.AddArg(x) v.AddArg(v0) return true @@ -21263,14 +21263,14 @@ func rewriteValueARM64_OpARM64XORshiftRL(v *Value) bool { // match: (XORshiftRL x (MOVDconst [c]) [d]) // result: (XORconst x [int64(uint64(c)>>uint64(d))]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64XORconst) - v.AuxInt = int64(uint64(c) >> uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) >> uint64(d))) v.AddArg(x) return true } @@ -21278,24 +21278,24 @@ func rewriteValueARM64_OpARM64XORshiftRL(v *Value) bool { // cond: c==d // result: (MOVDconst [0]) for { - d := v.AuxInt + d := auxIntToInt64(v.AuxInt) x := v_0 if v_1.Op != OpARM64SRLconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if x != v_1.Args[0] || !(c == d) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (XORshiftRL [c] (SLLconst x [64-c]) x) // result: (RORconst [ c] x) for { - c := v.AuxInt - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 64-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 64-c { break } x := v_0.Args[0] @@ -21303,7 +21303,7 @@ func rewriteValueARM64_OpARM64XORshiftRL(v *Value) bool { break } v.reset(OpARM64RORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -21312,8 +21312,8 @@ func rewriteValueARM64_OpARM64XORshiftRL(v *Value) bool { // result: (RORWconst [c] x) for { t := v.Type - c := v.AuxInt - if v_0.Op != OpARM64SLLconst || v_0.AuxInt != 32-c { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpARM64SLLconst || auxIntToInt64(v_0.AuxInt) != 32-c { break } x := v_0.Args[0] @@ -21321,7 +21321,7 @@ func rewriteValueARM64_OpARM64XORshiftRL(v *Value) bool { break } v.reset(OpARM64RORWconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } diff --git a/src/cmd/compile/internal/ssa/value.go b/src/cmd/compile/internal/ssa/value.go index 63c8f3decf..7ead0ff300 100644 --- a/src/cmd/compile/internal/ssa/value.go +++ b/src/cmd/compile/internal/ssa/value.go @@ -126,6 +126,13 @@ func (v *Value) AuxValAndOff() ValAndOff { return ValAndOff(v.AuxInt) } +func (v *Value) AuxArm64BitField() arm64BitField { + if opcodeTable[v.Op].auxType != auxARM64BitField { + v.Fatalf("op %s doesn't have a ValAndOff aux field", v.Op) + } + return arm64BitField(v.AuxInt) +} + // long form print. v# = opcode [aux] args [: reg] (names) func (v *Value) LongString() string { s := fmt.Sprintf("v%d = %s", v.ID, v.Op) @@ -176,8 +183,8 @@ func (v *Value) auxString() string { case auxInt64, auxInt128: return fmt.Sprintf(" [%d]", v.AuxInt) case auxARM64BitField: - lsb := getARM64BFlsb(v.AuxInt) - width := getARM64BFwidth(v.AuxInt) + lsb := v.AuxArm64BitField().getARM64BFlsb() + width := v.AuxArm64BitField().getARM64BFwidth() return fmt.Sprintf(" [lsb=%d,width=%d]", lsb, width) case auxFloat32, auxFloat64: return fmt.Sprintf(" [%g]", v.AuxFloat()) -- GitLab From 4e4d5df0b0af23d2fcb5690e89f27bd7e64e48f1 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Thu, 7 May 2020 18:08:35 +0800 Subject: [PATCH 0303/1792] cmd/compile: complete adjust MIPS64x rewrite rules to use typed aux fields Follow CL 228937 All MIPS64x rewrite rules has been converted into =>. toolstash-check passed for b1b67841d1..f2ad426737 Change-Id: I7eb7541ae1b86a005770003b61c555672660d2e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/230778 Reviewed-by: Keith Randall Run-TryBot: Meng Zhuo TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/gen/MIPS64.rules | 174 ++-- src/cmd/compile/internal/ssa/rewriteMIPS64.go | 804 ++++++++++-------- 2 files changed, 525 insertions(+), 453 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/MIPS64.rules b/src/cmd/compile/internal/ssa/gen/MIPS64.rules index 9d319e0df2..e008ec8703 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPS64.rules +++ b/src/cmd/compile/internal/ssa/gen/MIPS64.rules @@ -11,8 +11,8 @@ (Mul(64|32|16|8) x y) => (Select1 (MULVU x y)) (Mul(32|64)F ...) => (MUL(F|D) ...) (Mul64uhilo ...) => (MULVU ...) -(Select0 (Mul64uover x y)) -> (Select1 (MULVU x y)) -(Select1 (Mul64uover x y)) -> (SGTU (Select0 (MULVU x y)) (MOVVconst [0])) +(Select0 (Mul64uover x y)) => (Select1 (MULVU x y)) +(Select1 (Mul64uover x y)) => (SGTU (Select0 (MULVU x y)) (MOVVconst [0])) (Hmul64 x y) => (Select0 (MULV x y)) (Hmul64u x y) => (Select0 (MULVU x y)) @@ -38,8 +38,8 @@ (Mod8 x y) => (Select0 (DIVV (SignExt8to64 x) (SignExt8to64 y))) (Mod8u x y) => (Select0 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y))) -// (x + y) / 2 with x>=y -> (x - y) / 2 + y -(Avg64u x y) -> (ADDV (SRLVconst (SUBV x y) [1]) y) +// (x + y) / 2 with x>=y => (x - y) / 2 + y +(Avg64u x y) => (ADDV (SRLVconst (SUBV x y) [1]) y) (And(64|32|16|8) ...) => (AND ...) (Or(64|32|16|8) ...) => (OR ...) @@ -130,10 +130,10 @@ (Not x) => (XORconst [1] x) // constants -(Const(64|32|16|8) ...) -> (MOVVconst ...) -(Const(32|64)F ...) -> (MOV(F|D)const ...) +(Const(64|32|16|8) [val]) => (MOVVconst [int64(val)]) +(Const(32|64)F [val]) => (MOV(F|D)const [float64(val)]) (ConstNil) => (MOVVconst [0]) -(ConstBool ...) -> (MOVVconst ...) +(ConstBool [b]) => (MOVVconst [int64(b2i(b))]) (Slicemask x) => (SRAVconst (NEGV x) [63]) @@ -161,7 +161,7 @@ (SignExt16to64 ...) => (MOVHreg ...) (SignExt32to64 ...) => (MOVWreg ...) -// float <-> int conversion +// float <=> int conversion (Cvt32to32F ...) => (MOVWF ...) (Cvt32to64F ...) => (MOVWD ...) (Cvt64to32F ...) => (MOVVF ...) @@ -214,11 +214,11 @@ (Leq32U x y) => (XOR (MOVVconst [1]) (SGTU (ZeroExt32to64 x) (ZeroExt32to64 y))) (Leq64U x y) => (XOR (MOVVconst [1]) (SGTU x y)) -(OffPtr [off] ptr:(SP)) -> (MOVVaddr [off] ptr) -(OffPtr [off] ptr) -> (ADDVconst [off] ptr) +(OffPtr [off] ptr:(SP)) && is32Bit(off) => (MOVVaddr [int32(off)] ptr) +(OffPtr [off] ptr) => (ADDVconst [off] ptr) -(Addr ...) -> (MOVVaddr ...) -(LocalAddr {sym} base _) -> (MOVVaddr {sym} base) +(Addr {sym} base) => (MOVVaddr {sym} base) +(LocalAddr {sym} base _) => (MOVVaddr {sym} base) // loads (Load ptr mem) && t.IsBoolean() => (MOVBUload ptr mem) @@ -380,24 +380,17 @@ (InterCall ...) => (CALLinter ...) // atomic intrinsics -(AtomicLoad8 ...) -> (LoweredAtomicLoad8 ...) -(AtomicLoad32 ...) -> (LoweredAtomicLoad32 ...) -(AtomicLoad64 ...) -> (LoweredAtomicLoad64 ...) -(AtomicLoadPtr ...) -> (LoweredAtomicLoad64 ...) +(AtomicLoad(8|32|64) ...) => (LoweredAtomicLoad(8|32|64) ...) +(AtomicLoadPtr ...) => (LoweredAtomicLoad64 ...) -(AtomicStore8 ...) -> (LoweredAtomicStore8 ...) -(AtomicStore32 ...) -> (LoweredAtomicStore32 ...) -(AtomicStore64 ...) -> (LoweredAtomicStore64 ...) -(AtomicStorePtrNoWB ...) -> (LoweredAtomicStore64 ...) +(AtomicStore(8|32|64) ...) => (LoweredAtomicStore(8|32|64) ...) +(AtomicStorePtrNoWB ...) => (LoweredAtomicStore64 ...) -(AtomicExchange32 ...) -> (LoweredAtomicExchange32 ...) -(AtomicExchange64 ...) -> (LoweredAtomicExchange64 ...) +(AtomicExchange(32|64) ...) => (LoweredAtomicExchange(32|64) ...) -(AtomicAdd32 ...) -> (LoweredAtomicAdd32 ...) -(AtomicAdd64 ...) -> (LoweredAtomicAdd64 ...) +(AtomicAdd(32|64) ...) => (LoweredAtomicAdd(32|64) ...) -(AtomicCompareAndSwap32 ...) -> (LoweredAtomicCas32 ...) -(AtomicCompareAndSwap64 ...) -> (LoweredAtomicCas64 ...) +(AtomicCompareAndSwap(32|64) ...) => (LoweredAtomicCas(32|64) ...) // checks (NilCheck ...) => (LoweredNilCheck ...) @@ -444,69 +437,69 @@ (EQ (SGT x (MOVVconst [0])) yes no) => (LEZ x yes no) // fold offset into address -(ADDVconst [off1] (MOVVaddr [off2] {sym} ptr)) -> (MOVVaddr [off1+off2] {sym} ptr) +(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(off1+off2) -> (MOVBload [off1+off2] {sym} ptr mem) -(MOVBUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVBUload [off1+off2] {sym} ptr mem) -(MOVHload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVHload [off1+off2] {sym} ptr mem) -(MOVHUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVHUload [off1+off2] {sym} ptr mem) -(MOVWload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVWload [off1+off2] {sym} ptr mem) -(MOVWUload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVWUload [off1+off2] {sym} ptr mem) -(MOVVload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVVload [off1+off2] {sym} ptr mem) -(MOVFload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVFload [off1+off2] {sym} ptr mem) -(MOVDload [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVDload [off1+off2] {sym} ptr mem) - -(MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(off1+off2) -> (MOVBstore [off1+off2] {sym} ptr val mem) -(MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(off1+off2) -> (MOVHstore [off1+off2] {sym} ptr val mem) -(MOVWstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(off1+off2) -> (MOVWstore [off1+off2] {sym} ptr val mem) -(MOVVstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(off1+off2) -> (MOVVstore [off1+off2] {sym} ptr val mem) -(MOVFstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(off1+off2) -> (MOVFstore [off1+off2] {sym} ptr val mem) -(MOVDstore [off1] {sym} (ADDVconst [off2] ptr) val mem) && is32Bit(off1+off2) -> (MOVDstore [off1+off2] {sym} ptr val mem) -(MOVBstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVBstorezero [off1+off2] {sym} ptr mem) -(MOVHstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVHstorezero [off1+off2] {sym} ptr mem) -(MOVWstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVWstorezero [off1+off2] {sym} ptr mem) -(MOVVstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) && is32Bit(off1+off2) -> (MOVVstorezero [off1+off2] {sym} ptr mem) - -(MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVVload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) - -(MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) -(MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) -(MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) -(MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVVstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) -(MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) -(MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) -(MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) -(MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(off1+off2) -> - (MOVVstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) +(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) + +(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) + +(MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVBload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVBUload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVHload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVHUload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVWload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVWUload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVVload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVFload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVDload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) + +(MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVBstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) +(MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVHstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) +(MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVWstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) +(MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVVstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) +(MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVFstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) +(MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVDstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) +(MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVBstorezero [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVHstorezero [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVWstorezero [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) +(MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) && canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) => + (MOVVstorezero [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) // store zero (MOVBstore [off] {sym} ptr (MOVVconst [0]) mem) => (MOVBstorezero [off] {sym} ptr mem) @@ -643,10 +636,9 @@ (MOVWreg (MOVVconst [c])) => (MOVVconst [int64(int32(c))]) (MOVWUreg (MOVVconst [c])) => (MOVVconst [int64(uint32(c))]) (MOVVreg (MOVVconst [c])) => (MOVVconst [c]) -(LoweredAtomicStore32 ptr (MOVVconst [0]) mem) -> (LoweredAtomicStorezero32 ptr mem) -(LoweredAtomicStore64 ptr (MOVVconst [0]) mem) -> (LoweredAtomicStorezero64 ptr mem) -(LoweredAtomicAdd32 ptr (MOVVconst [c]) mem) && is32Bit(c) -> (LoweredAtomicAddconst32 [c] ptr mem) -(LoweredAtomicAdd64 ptr (MOVVconst [c]) mem) && is32Bit(c) -> (LoweredAtomicAddconst64 [c] ptr mem) +(LoweredAtomicStore(32|64) ptr (MOVVconst [0]) mem) => (LoweredAtomicStorezero(32|64) ptr mem) +(LoweredAtomicAdd32 ptr (MOVVconst [c]) mem) && is32Bit(c) => (LoweredAtomicAddconst32 [int32(c)] ptr mem) +(LoweredAtomicAdd64 ptr (MOVVconst [c]) mem) && is32Bit(c) => (LoweredAtomicAddconst64 [c] ptr mem) // constant comparisons (SGTconst [c] (MOVVconst [d])) && c>d => (MOVVconst [1]) diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS64.go b/src/cmd/compile/internal/ssa/rewriteMIPS64.go index ae7f496657..dfff1c03b7 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS64.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS64.go @@ -29,8 +29,7 @@ func rewriteValueMIPS64(v *Value) bool { v.Op = OpMIPS64ADDV return true case OpAddr: - v.Op = OpMIPS64MOVVaddr - return true + return rewriteValueMIPS64_OpAddr(v) case OpAnd16: v.Op = OpMIPS64AND return true @@ -102,26 +101,19 @@ func rewriteValueMIPS64(v *Value) bool { case OpCom8: return rewriteValueMIPS64_OpCom8(v) case OpConst16: - v.Op = OpMIPS64MOVVconst - return true + return rewriteValueMIPS64_OpConst16(v) case OpConst32: - v.Op = OpMIPS64MOVVconst - return true + return rewriteValueMIPS64_OpConst32(v) case OpConst32F: - v.Op = OpMIPS64MOVFconst - return true + return rewriteValueMIPS64_OpConst32F(v) case OpConst64: - v.Op = OpMIPS64MOVVconst - return true + return rewriteValueMIPS64_OpConst64(v) case OpConst64F: - v.Op = OpMIPS64MOVDconst - return true + return rewriteValueMIPS64_OpConst64F(v) case OpConst8: - v.Op = OpMIPS64MOVVconst - return true + return rewriteValueMIPS64_OpConst8(v) case OpConstBool: - v.Op = OpMIPS64MOVVconst - return true + return rewriteValueMIPS64_OpConstBool(v) case OpConstNil: return rewriteValueMIPS64_OpConstNil(v) case OpCvt32Fto32: @@ -684,6 +676,19 @@ func rewriteValueMIPS64(v *Value) bool { } return false } +func rewriteValueMIPS64_OpAddr(v *Value) bool { + v_0 := v.Args[0] + // match: (Addr {sym} base) + // result: (MOVVaddr {sym} base) + for { + sym := auxToSym(v.Aux) + base := v_0 + v.reset(OpMIPS64MOVVaddr) + v.Aux = symToAux(sym) + v.AddArg(base) + return true + } +} func rewriteValueMIPS64_OpAvg64u(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -696,7 +701,7 @@ func rewriteValueMIPS64_OpAvg64u(v *Value) bool { y := v_1 v.reset(OpMIPS64ADDV) v0 := b.NewValue0(v.Pos, OpMIPS64SRLVconst, t) - v0.AuxInt = 1 + v0.AuxInt = int64ToAuxInt(1) v1 := b.NewValue0(v.Pos, OpMIPS64SUBV, t) v1.AddArg2(x, y) v0.AddArg(v1) @@ -764,6 +769,76 @@ func rewriteValueMIPS64_OpCom8(v *Value) bool { return true } } +func rewriteValueMIPS64_OpConst16(v *Value) bool { + // match: (Const16 [val]) + // result: (MOVVconst [int64(val)]) + for { + val := auxIntToInt16(v.AuxInt) + v.reset(OpMIPS64MOVVconst) + v.AuxInt = int64ToAuxInt(int64(val)) + return true + } +} +func rewriteValueMIPS64_OpConst32(v *Value) bool { + // match: (Const32 [val]) + // result: (MOVVconst [int64(val)]) + for { + val := auxIntToInt32(v.AuxInt) + v.reset(OpMIPS64MOVVconst) + v.AuxInt = int64ToAuxInt(int64(val)) + return true + } +} +func rewriteValueMIPS64_OpConst32F(v *Value) bool { + // match: (Const32F [val]) + // result: (MOVFconst [float64(val)]) + for { + val := auxIntToFloat32(v.AuxInt) + v.reset(OpMIPS64MOVFconst) + v.AuxInt = float64ToAuxInt(float64(val)) + return true + } +} +func rewriteValueMIPS64_OpConst64(v *Value) bool { + // match: (Const64 [val]) + // result: (MOVVconst [int64(val)]) + for { + val := auxIntToInt64(v.AuxInt) + v.reset(OpMIPS64MOVVconst) + v.AuxInt = int64ToAuxInt(int64(val)) + return true + } +} +func rewriteValueMIPS64_OpConst64F(v *Value) bool { + // match: (Const64F [val]) + // result: (MOVDconst [float64(val)]) + for { + val := auxIntToFloat64(v.AuxInt) + v.reset(OpMIPS64MOVDconst) + v.AuxInt = float64ToAuxInt(float64(val)) + return true + } +} +func rewriteValueMIPS64_OpConst8(v *Value) bool { + // match: (Const8 [val]) + // result: (MOVVconst [int64(val)]) + for { + val := auxIntToInt8(v.AuxInt) + v.reset(OpMIPS64MOVVconst) + v.AuxInt = int64ToAuxInt(int64(val)) + return true + } +} +func rewriteValueMIPS64_OpConstBool(v *Value) bool { + // match: (ConstBool [b]) + // result: (MOVVconst [int64(b2i(b))]) + for { + b := auxIntToBool(v.AuxInt) + v.reset(OpMIPS64MOVVconst) + v.AuxInt = int64ToAuxInt(int64(b2i(b))) + return true + } +} func rewriteValueMIPS64_OpConstNil(v *Value) bool { // match: (ConstNil) // result: (MOVVconst [0]) @@ -1750,10 +1825,10 @@ func rewriteValueMIPS64_OpLocalAddr(v *Value) bool { // match: (LocalAddr {sym} base _) // result: (MOVVaddr {sym} base) for { - sym := v.Aux + sym := auxToSym(v.Aux) base := v_0 v.reset(OpMIPS64MOVVaddr) - v.Aux = sym + v.Aux = symToAux(sym) v.AddArg(base) return true } @@ -2209,18 +2284,22 @@ func rewriteValueMIPS64_OpMIPS64ADDV(v *Value) bool { func rewriteValueMIPS64_OpMIPS64ADDVconst(v *Value) bool { v_0 := v.Args[0] // match: (ADDVconst [off1] (MOVVaddr [off2] {sym} ptr)) - // result: (MOVVaddr [off1+off2] {sym} ptr) + // cond: is32Bit(off1+int64(off2)) + // result: (MOVVaddr [int32(off1)+int32(off2)] {sym} ptr) for { - off1 := v.AuxInt + off1 := auxIntToInt64(v.AuxInt) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym := auxToSym(v_0.Aux) ptr := v_0.Args[0] + if !(is32Bit(off1 + int64(off2))) { + break + } v.reset(OpMIPS64MOVVaddr) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(int32(off1) + int32(off2)) + v.Aux = symToAux(sym) v.AddArg(ptr) return true } @@ -2375,19 +2454,19 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicAdd32(v *Value) bool { v_0 := v.Args[0] // match: (LoweredAtomicAdd32 ptr (MOVVconst [c]) mem) // cond: is32Bit(c) - // result: (LoweredAtomicAddconst32 [c] ptr mem) + // result: (LoweredAtomicAddconst32 [int32(c)] ptr mem) for { ptr := v_0 if v_1.Op != OpMIPS64MOVVconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 if !(is32Bit(c)) { break } v.reset(OpMIPS64LoweredAtomicAddconst32) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg2(ptr, mem) return true } @@ -2405,13 +2484,13 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicAdd64(v *Value) bool { if v_1.Op != OpMIPS64MOVVconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 if !(is32Bit(c)) { break } v.reset(OpMIPS64LoweredAtomicAddconst64) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg2(ptr, mem) return true } @@ -2425,7 +2504,7 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicStore32(v *Value) bool { // result: (LoweredAtomicStorezero32 ptr mem) for { ptr := v_0 - if v_1.Op != OpMIPS64MOVVconst || v_1.AuxInt != 0 { + if v_1.Op != OpMIPS64MOVVconst || auxIntToInt64(v_1.AuxInt) != 0 { break } mem := v_2 @@ -2443,7 +2522,7 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicStore64(v *Value) bool { // result: (LoweredAtomicStorezero64 ptr mem) for { ptr := v_0 - if v_1.Op != OpMIPS64MOVVconst || v_1.AuxInt != 0 { + if v_1.Op != OpMIPS64MOVVconst || auxIntToInt64(v_1.AuxInt) != 0 { break } mem := v_2 @@ -2457,45 +2536,45 @@ func rewriteValueMIPS64_OpMIPS64MOVBUload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBUload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVBUload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVBUload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVBUload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVBUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVBUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVBUload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVBUload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -2542,45 +2621,45 @@ func rewriteValueMIPS64_OpMIPS64MOVBload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVBload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVBload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVBload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVBload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVBload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVBload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -2628,47 +2707,47 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBstore [off1] {sym} (ADDVconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVBstore [off1+off2] {sym} ptr val mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVBstore [off1+int32(off2)] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVBstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVBstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVBstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVBstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, val, mem) return true } @@ -2796,45 +2875,45 @@ func rewriteValueMIPS64_OpMIPS64MOVBstorezero(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVBstorezero [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVBstorezero [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVBstorezero) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVBstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVBstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVBstorezero [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVBstorezero) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -2844,45 +2923,45 @@ func rewriteValueMIPS64_OpMIPS64MOVDload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVDload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVDload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVDload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVDload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVDload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -2893,47 +2972,47 @@ func rewriteValueMIPS64_OpMIPS64MOVDstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDstore [off1] {sym} (ADDVconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVDstore [off1+off2] {sym} ptr val mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVDstore [off1+int32(off2)] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVDstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVDstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVDstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVDstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, val, mem) return true } @@ -2943,45 +3022,45 @@ func rewriteValueMIPS64_OpMIPS64MOVFload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVFload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVFload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVFload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVFload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVFload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVFload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVFload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVFload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -2992,47 +3071,47 @@ func rewriteValueMIPS64_OpMIPS64MOVFstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVFstore [off1] {sym} (ADDVconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVFstore [off1+off2] {sym} ptr val mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVFstore [off1+int32(off2)] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVFstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVFstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVFstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVFstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVFstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, val, mem) return true } @@ -3042,45 +3121,45 @@ func rewriteValueMIPS64_OpMIPS64MOVHUload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHUload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVHUload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVHUload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVHUload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVHUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVHUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVHUload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVHUload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -3149,45 +3228,45 @@ func rewriteValueMIPS64_OpMIPS64MOVHload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVHload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVHload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVHload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVHload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVHload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVHload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -3279,47 +3358,47 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHstore [off1] {sym} (ADDVconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVHstore [off1+off2] {sym} ptr val mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVHstore [off1+int32(off2)] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVHstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVHstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVHstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVHstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, val, mem) return true } @@ -3413,45 +3492,45 @@ func rewriteValueMIPS64_OpMIPS64MOVHstorezero(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVHstorezero [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVHstorezero [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVHstorezero) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVHstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVHstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVHstorezero [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVHstorezero) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -3461,45 +3540,45 @@ func rewriteValueMIPS64_OpMIPS64MOVVload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVVload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVVload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVVload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVVload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVVload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVVload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVVload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVVload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -3537,47 +3616,47 @@ func rewriteValueMIPS64_OpMIPS64MOVVstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVVstore [off1] {sym} (ADDVconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVVstore [off1+off2] {sym} ptr val mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVVstore [off1+int32(off2)] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVVstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVVstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVVstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVVstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVVstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, val, mem) return true } @@ -3603,45 +3682,45 @@ func rewriteValueMIPS64_OpMIPS64MOVVstorezero(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVVstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVVstorezero [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVVstorezero [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVVstorezero) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVVstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVVstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVVstorezero [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVVstorezero) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -3651,45 +3730,45 @@ func rewriteValueMIPS64_OpMIPS64MOVWUload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWUload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVWUload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVWUload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVWUload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVWUload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVWUload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVWUload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVWUload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -3780,45 +3859,45 @@ func rewriteValueMIPS64_OpMIPS64MOVWload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWload [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVWload [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVWload [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVWload [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVWload [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVWload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -3943,47 +4022,47 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWstore [off1] {sym} (ADDVconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) - // result: (MOVWstore [off1+off2] {sym} ptr val mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVWstore [off1+int32(off2)] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVWstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVWstore [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) val mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} ptr val mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVWstore [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVWstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, val, mem) return true } @@ -4043,45 +4122,45 @@ func rewriteValueMIPS64_OpMIPS64MOVWstorezero(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWstorezero [off1] {sym} (ADDVconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) - // result: (MOVWstorezero [off1+off2] {sym} ptr mem) + // cond: is32Bit(int64(off1)+off2) + // result: (MOVWstorezero [off1+int32(off2)] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpMIPS64ADDVconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt64(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + off2)) { break } v.reset(OpMIPS64MOVWstorezero) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVWstorezero [off1] {sym1} (MOVVaddr [off2] {sym2} ptr) mem) - // cond: canMergeSym(sym1,sym2) && is32Bit(off1+off2) - // result: (MOVWstorezero [off1+off2] {mergeSym(sym1,sym2)} ptr mem) + // cond: canMergeSym(sym1,sym2) && is32Bit(int64(off1)+int64(off2)) + // result: (MOVWstorezero [off1+int32(off2)] {mergeSymTyped(sym1,sym2)} ptr mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpMIPS64MOVVaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { + if !(canMergeSym(sym1, sym2) && is32Bit(int64(off1)+int64(off2))) { break } v.reset(OpMIPS64MOVWstorezero) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + int32(off2)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -5697,25 +5776,26 @@ func rewriteValueMIPS64_OpNot(v *Value) bool { func rewriteValueMIPS64_OpOffPtr(v *Value) bool { v_0 := v.Args[0] // match: (OffPtr [off] ptr:(SP)) - // result: (MOVVaddr [off] ptr) + // cond: is32Bit(off) + // result: (MOVVaddr [int32(off)] ptr) for { - off := v.AuxInt + off := auxIntToInt64(v.AuxInt) ptr := v_0 - if ptr.Op != OpSP { + if ptr.Op != OpSP || !(is32Bit(off)) { break } v.reset(OpMIPS64MOVVaddr) - v.AuxInt = off + v.AuxInt = int32ToAuxInt(int32(off)) v.AddArg(ptr) return true } // match: (OffPtr [off] ptr) // result: (ADDVconst [off] ptr) for { - off := v.AuxInt + off := auxIntToInt64(v.AuxInt) ptr := v_0 v.reset(OpMIPS64ADDVconst) - v.AuxInt = off + v.AuxInt = int64ToAuxInt(off) v.AddArg(ptr) return true } @@ -6869,7 +6949,7 @@ func rewriteValueMIPS64_OpSelect1(v *Value) bool { v1.AddArg2(x, y) v0.AddArg(v1) v2 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) - v2.AuxInt = 0 + v2.AuxInt = int64ToAuxInt(0) v.AddArg2(v0, v2) return true } -- GitLab From d556c251a1f1506f68e1e4064c3537948ff667a3 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Thu, 28 May 2020 18:11:52 +0800 Subject: [PATCH 0304/1792] cmd/compile: add more generic rewrite rules to reassociate (op (op y C) x|C) With this patch, opt pass can expose more obvious constant-folding opportunites. Example: func test(i int) int {return (i+8)-(i+4)} The previous version: MOVD "".i(FP), R0 ADD $8, R0, R1 ADD $4, R0, R0 SUB R0, R1, R0 MOVD R0, "".~r1+8(FP) RET (R30) The optimized version: MOVD $4, R0 MOVD R0, "".~r1+8(FP) RET (R30) This patch removes some existing reassociation rules, such as "x+(z-C)", because the current generic rewrite rules will canonicalize "x-const" to "x+(-const)", making "x+(z-C)" equal to "x+(z+(-C))". This patch also adds test cases. Change-Id: I857108ba0b5fcc18a879eeab38e2551bc4277797 Reviewed-on: https://go-review.googlesource.com/c/go/+/237137 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- .../compile/internal/ssa/gen/generic.rules | 54 +- .../compile/internal/ssa/rewritegeneric.go | 816 +++++++++++------- test/codegen/arithmetic.go | 31 +- 3 files changed, 545 insertions(+), 356 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index 2d39d27226..f7e6bbebac 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -1807,6 +1807,8 @@ // invariant that pointers must stay within the pointed-to object, // we can't pull part of a pointer computation above the AddPtr. // See issue 37881. +// Note: we don't need to handle any (x-C) cases because we already rewrite +// (x-C) to (x+(-C)). // x + (C + z) -> C + (x + z) (Add64 (Add64 i:(Const64 ) z) x) && (z.Op != OpConst64 && x.Op != OpConst64) => (Add64 i (Add64 z x)) @@ -1820,23 +1822,29 @@ (Add16 (Sub16 i:(Const16 ) z) x) && (z.Op != OpConst16 && x.Op != OpConst16) => (Add16 i (Sub16 x z)) (Add8 (Sub8 i:(Const8 ) z) x) && (z.Op != OpConst8 && x.Op != OpConst8) => (Add8 i (Sub8 x z)) -// x + (z - C) -> (x + z) - C -(Add64 (Sub64 z i:(Const64 )) x) && (z.Op != OpConst64 && x.Op != OpConst64) => (Sub64 (Add64 x z) i) -(Add32 (Sub32 z i:(Const32 )) x) && (z.Op != OpConst32 && x.Op != OpConst32) => (Sub32 (Add32 x z) i) -(Add16 (Sub16 z i:(Const16 )) x) && (z.Op != OpConst16 && x.Op != OpConst16) => (Sub16 (Add16 x z) i) -(Add8 (Sub8 z i:(Const8 )) x) && (z.Op != OpConst8 && x.Op != OpConst8) => (Sub8 (Add8 x z) i) - // x - (C - z) -> x + (z - C) -> (x + z) - C (Sub64 x (Sub64 i:(Const64 ) z)) && (z.Op != OpConst64 && x.Op != OpConst64) => (Sub64 (Add64 x z) i) (Sub32 x (Sub32 i:(Const32 ) z)) && (z.Op != OpConst32 && x.Op != OpConst32) => (Sub32 (Add32 x z) i) (Sub16 x (Sub16 i:(Const16 ) z)) && (z.Op != OpConst16 && x.Op != OpConst16) => (Sub16 (Add16 x z) i) (Sub8 x (Sub8 i:(Const8 ) z)) && (z.Op != OpConst8 && x.Op != OpConst8) => (Sub8 (Add8 x z) i) -// x - (z - C) -> x + (C - z) -> (x - z) + C -(Sub64 x (Sub64 z i:(Const64 ))) && (z.Op != OpConst64 && x.Op != OpConst64) => (Add64 i (Sub64 x z)) -(Sub32 x (Sub32 z i:(Const32 ))) && (z.Op != OpConst32 && x.Op != OpConst32) => (Add32 i (Sub32 x z)) -(Sub16 x (Sub16 z i:(Const16 ))) && (z.Op != OpConst16 && x.Op != OpConst16) => (Add16 i (Sub16 x z)) -(Sub8 x (Sub8 z i:(Const8 ))) && (z.Op != OpConst8 && x.Op != OpConst8) => (Add8 i (Sub8 x z)) +// x - (z + C) -> x + (-z - C) -> (x - z) - C +(Sub64 x (Add64 z i:(Const64 ))) && (z.Op != OpConst64 && x.Op != OpConst64) => (Sub64 (Sub64 x z) i) +(Sub32 x (Add32 z i:(Const32 ))) && (z.Op != OpConst32 && x.Op != OpConst32) => (Sub32 (Sub32 x z) i) +(Sub16 x (Add16 z i:(Const16 ))) && (z.Op != OpConst16 && x.Op != OpConst16) => (Sub16 (Sub16 x z) i) +(Sub8 x (Add8 z i:(Const8 ))) && (z.Op != OpConst8 && x.Op != OpConst8) => (Sub8 (Sub8 x z) i) + +// (C - z) - x -> C - (z + x) +(Sub64 (Sub64 i:(Const64 ) z) x) && (z.Op != OpConst64 && x.Op != OpConst64) => (Sub64 i (Add64 z x)) +(Sub32 (Sub32 i:(Const32 ) z) x) && (z.Op != OpConst32 && x.Op != OpConst32) => (Sub32 i (Add32 z x)) +(Sub16 (Sub16 i:(Const16 ) z) x) && (z.Op != OpConst16 && x.Op != OpConst16) => (Sub16 i (Add16 z x)) +(Sub8 (Sub8 i:(Const8 ) z) x) && (z.Op != OpConst8 && x.Op != OpConst8) => (Sub8 i (Add8 z x)) + +// (z + C) -x -> C + (z - x) +(Sub64 (Add64 z i:(Const64 )) x) && (z.Op != OpConst64 && x.Op != OpConst64) => (Add64 i (Sub64 z x)) +(Sub32 (Add32 z i:(Const32 )) x) && (z.Op != OpConst32 && x.Op != OpConst32) => (Add32 i (Sub32 z x)) +(Sub16 (Add16 z i:(Const16 )) x) && (z.Op != OpConst16 && x.Op != OpConst16) => (Add16 i (Sub16 z x)) +(Sub8 (Add8 z i:(Const8 )) x) && (z.Op != OpConst8 && x.Op != OpConst8) => (Add8 i (Sub8 z x)) // x & (C & z) -> C & (x & z) (And64 (And64 i:(Const64 ) z) x) && (z.Op != OpConst64 && x.Op != OpConst64) => (And64 i (And64 z x)) @@ -1856,6 +1864,12 @@ (Xor16 (Xor16 i:(Const16 ) z) x) && (z.Op != OpConst16 && x.Op != OpConst16) => (Xor16 i (Xor16 z x)) (Xor8 (Xor8 i:(Const8 ) z) x) && (z.Op != OpConst8 && x.Op != OpConst8) => (Xor8 i (Xor8 z x)) +// x * (D * z) = D * (x * z) +(Mul64 (Mul64 i:(Const64 ) z) x) && (z.Op != OpConst64 && x.Op != OpConst64) => (Mul64 i (Mul64 x z)) +(Mul32 (Mul32 i:(Const32 ) z) x) && (z.Op != OpConst32 && x.Op != OpConst32) => (Mul32 i (Mul32 x z)) +(Mul16 (Mul16 i:(Const16 ) z) x) && (z.Op != OpConst16 && x.Op != OpConst16) => (Mul16 i (Mul16 x z)) +(Mul8 (Mul8 i:(Const8 ) z) x) && (z.Op != OpConst8 && x.Op != OpConst8) => (Mul8 i (Mul8 x z)) + // C + (D + x) -> (C + D) + x (Add64 (Const64 [c]) (Add64 (Const64 [d]) x)) => (Add64 (Const64 [c+d]) x) (Add32 (Const32 [c]) (Add32 (Const32 [d]) x)) => (Add32 (Const32 [c+d]) x) @@ -1868,24 +1882,18 @@ (Add16 (Const16 [c]) (Sub16 (Const16 [d]) x)) => (Sub16 (Const16 [c+d]) x) (Add8 (Const8 [c]) (Sub8 (Const8 [d]) x)) => (Sub8 (Const8 [c+d]) x) -// C + (x - D) -> (C - D) + x -(Add64 (Const64 [c]) (Sub64 x (Const64 [d]))) => (Add64 (Const64 [c-d]) x) -(Add32 (Const32 [c]) (Sub32 x (Const32 [d]))) => (Add32 (Const32 [c-d]) x) -(Add16 (Const16 [c]) (Sub16 x (Const16 [d]))) => (Add16 (Const16 [c-d]) x) -(Add8 (Const8 [c]) (Sub8 x (Const8 [d]))) => (Add8 (Const8 [c-d]) x) - -// C - (x - D) -> (C + D) - x -(Sub64 (Const64 [c]) (Sub64 x (Const64 [d]))) => (Sub64 (Const64 [c+d]) x) -(Sub32 (Const32 [c]) (Sub32 x (Const32 [d]))) => (Sub32 (Const32 [c+d]) x) -(Sub16 (Const16 [c]) (Sub16 x (Const16 [d]))) => (Sub16 (Const16 [c+d]) x) -(Sub8 (Const8 [c]) (Sub8 x (Const8 [d]))) => (Sub8 (Const8 [c+d]) x) - // C - (D - x) -> (C - D) + x (Sub64 (Const64 [c]) (Sub64 (Const64 [d]) x)) => (Add64 (Const64 [c-d]) x) (Sub32 (Const32 [c]) (Sub32 (Const32 [d]) x)) => (Add32 (Const32 [c-d]) x) (Sub16 (Const16 [c]) (Sub16 (Const16 [d]) x)) => (Add16 (Const16 [c-d]) x) (Sub8 (Const8 [c]) (Sub8 (Const8 [d]) x)) => (Add8 (Const8 [c-d]) x) +// C - (D + x) -> (C - D) - x +(Sub64 (Const64 [c]) (Add64 (Const64 [d]) x)) => (Sub64 (Const64 [c-d]) x) +(Sub32 (Const32 [c]) (Add32 (Const32 [d]) x)) => (Sub32 (Const32 [c-d]) x) +(Sub16 (Const16 [c]) (Add16 (Const16 [d]) x)) => (Sub16 (Const16 [c-d]) x) +(Sub8 (Const8 [c]) (Add8 (Const8 [d]) x)) => (Sub8 (Const8 [c-d]) x) + // C & (D & x) -> (C & D) & x (And64 (Const64 [c]) (And64 (Const64 [d]) x)) => (And64 (Const64 [c&d]) x) (And32 (Const32 [c]) (And32 (Const32 [d]) x)) => (And32 (Const32 [c&d]) x) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 68e49f46f3..180e48b34c 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -588,33 +588,6 @@ func rewriteValuegeneric_OpAdd16(v *Value) bool { } break } - // match: (Add16 (Sub16 z i:(Const16 )) x) - // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Sub16 (Add16 x z) i) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpSub16 { - continue - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst16 { - continue - } - t := i.Type - x := v_1 - if !(z.Op != OpConst16 && x.Op != OpConst16) { - continue - } - v.reset(OpSub16) - v0 := b.NewValue0(v.Pos, OpAdd16, t) - v0.AddArg2(x, z) - v.AddArg2(v0, i) - return true - } - break - } // match: (Add16 (Const16 [c]) (Add16 (Const16 [d]) x)) // result: (Add16 (Const16 [c+d]) x) for { @@ -671,33 +644,6 @@ func rewriteValuegeneric_OpAdd16(v *Value) bool { } break } - // match: (Add16 (Const16 [c]) (Sub16 x (Const16 [d]))) - // result: (Add16 (Const16 [c-d]) x) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpConst16 { - continue - } - t := v_0.Type - c := auxIntToInt16(v_0.AuxInt) - if v_1.Op != OpSub16 { - continue - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { - continue - } - d := auxIntToInt16(v_1_1.AuxInt) - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int16ToAuxInt(c - d) - v.AddArg2(v0, x) - return true - } - break - } return false } func rewriteValuegeneric_OpAdd32(v *Value) bool { @@ -841,33 +787,6 @@ func rewriteValuegeneric_OpAdd32(v *Value) bool { } break } - // match: (Add32 (Sub32 z i:(Const32 )) x) - // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Sub32 (Add32 x z) i) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpSub32 { - continue - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst32 { - continue - } - t := i.Type - x := v_1 - if !(z.Op != OpConst32 && x.Op != OpConst32) { - continue - } - v.reset(OpSub32) - v0 := b.NewValue0(v.Pos, OpAdd32, t) - v0.AddArg2(x, z) - v.AddArg2(v0, i) - return true - } - break - } // match: (Add32 (Const32 [c]) (Add32 (Const32 [d]) x)) // result: (Add32 (Const32 [c+d]) x) for { @@ -924,33 +843,6 @@ func rewriteValuegeneric_OpAdd32(v *Value) bool { } break } - // match: (Add32 (Const32 [c]) (Sub32 x (Const32 [d]))) - // result: (Add32 (Const32 [c-d]) x) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpConst32 { - continue - } - t := v_0.Type - c := auxIntToInt32(v_0.AuxInt) - if v_1.Op != OpSub32 { - continue - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - continue - } - d := auxIntToInt32(v_1_1.AuxInt) - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int32ToAuxInt(c - d) - v.AddArg2(v0, x) - return true - } - break - } return false } func rewriteValuegeneric_OpAdd32F(v *Value) bool { @@ -1121,33 +1013,6 @@ func rewriteValuegeneric_OpAdd64(v *Value) bool { } break } - // match: (Add64 (Sub64 z i:(Const64 )) x) - // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Sub64 (Add64 x z) i) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpSub64 { - continue - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst64 { - continue - } - t := i.Type - x := v_1 - if !(z.Op != OpConst64 && x.Op != OpConst64) { - continue - } - v.reset(OpSub64) - v0 := b.NewValue0(v.Pos, OpAdd64, t) - v0.AddArg2(x, z) - v.AddArg2(v0, i) - return true - } - break - } // match: (Add64 (Const64 [c]) (Add64 (Const64 [d]) x)) // result: (Add64 (Const64 [c+d]) x) for { @@ -1204,33 +1069,6 @@ func rewriteValuegeneric_OpAdd64(v *Value) bool { } break } - // match: (Add64 (Const64 [c]) (Sub64 x (Const64 [d]))) - // result: (Add64 (Const64 [c-d]) x) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpConst64 { - continue - } - t := v_0.Type - c := auxIntToInt64(v_0.AuxInt) - if v_1.Op != OpSub64 { - continue - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { - continue - } - d := auxIntToInt64(v_1_1.AuxInt) - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64ToAuxInt(c - d) - v.AddArg2(v0, x) - return true - } - break - } return false } func rewriteValuegeneric_OpAdd64F(v *Value) bool { @@ -1401,33 +1239,6 @@ func rewriteValuegeneric_OpAdd8(v *Value) bool { } break } - // match: (Add8 (Sub8 z i:(Const8 )) x) - // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Sub8 (Add8 x z) i) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpSub8 { - continue - } - _ = v_0.Args[1] - z := v_0.Args[0] - i := v_0.Args[1] - if i.Op != OpConst8 { - continue - } - t := i.Type - x := v_1 - if !(z.Op != OpConst8 && x.Op != OpConst8) { - continue - } - v.reset(OpSub8) - v0 := b.NewValue0(v.Pos, OpAdd8, t) - v0.AddArg2(x, z) - v.AddArg2(v0, i) - return true - } - break - } // match: (Add8 (Const8 [c]) (Add8 (Const8 [d]) x)) // result: (Add8 (Const8 [c+d]) x) for { @@ -1484,33 +1295,6 @@ func rewriteValuegeneric_OpAdd8(v *Value) bool { } break } - // match: (Add8 (Const8 [c]) (Sub8 x (Const8 [d]))) - // result: (Add8 (Const8 [c-d]) x) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpConst8 { - continue - } - t := v_0.Type - c := auxIntToInt8(v_0.AuxInt) - if v_1.Op != OpSub8 { - continue - } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { - continue - } - d := auxIntToInt8(v_1_1.AuxInt) - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int8ToAuxInt(c - d) - v.AddArg2(v0, x) - return true - } - break - } return false } func rewriteValuegeneric_OpAddPtr(v *Value) bool { @@ -13922,6 +13706,37 @@ func rewriteValuegeneric_OpMul16(v *Value) bool { } break } + // match: (Mul16 (Mul16 i:(Const16 ) z) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Mul16 i (Mul16 x z)) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpMul16 { + continue + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + v_0_1 := v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 { + i := v_0_0 + if i.Op != OpConst16 { + continue + } + t := i.Type + z := v_0_1 + x := v_1 + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpMul16) + v0 := b.NewValue0(v.Pos, OpMul16, t) + v0.AddArg2(x, z) + v.AddArg2(i, v0) + return true + } + } + break + } // match: (Mul16 (Const16 [c]) (Mul16 (Const16 [d]) x)) // result: (Mul16 (Const16 [c*d]) x) for { @@ -14098,6 +13913,37 @@ func rewriteValuegeneric_OpMul32(v *Value) bool { } break } + // match: (Mul32 (Mul32 i:(Const32 ) z) x) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Mul32 i (Mul32 x z)) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpMul32 { + continue + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + v_0_1 := v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 { + i := v_0_0 + if i.Op != OpConst32 { + continue + } + t := i.Type + z := v_0_1 + x := v_1 + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpMul32) + v0 := b.NewValue0(v.Pos, OpMul32, t) + v0.AddArg2(x, z) + v.AddArg2(i, v0) + return true + } + } + break + } // match: (Mul32 (Const32 [c]) (Mul32 (Const32 [d]) x)) // result: (Mul32 (Const32 [c*d]) x) for { @@ -14342,16 +14188,47 @@ func rewriteValuegeneric_OpMul64(v *Value) bool { } break } - // match: (Mul64 (Const64 [c]) (Mul64 (Const64 [d]) x)) - // result: (Mul64 (Const64 [c*d]) x) + // match: (Mul64 (Mul64 i:(Const64 ) z) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Mul64 i (Mul64 x z)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpConst64 { - continue - } - t := v_0.Type - c := auxIntToInt64(v_0.AuxInt) - if v_1.Op != OpMul64 { + if v_0.Op != OpMul64 { + continue + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + v_0_1 := v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 { + i := v_0_0 + if i.Op != OpConst64 { + continue + } + t := i.Type + z := v_0_1 + x := v_1 + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpMul64) + v0 := b.NewValue0(v.Pos, OpMul64, t) + v0.AddArg2(x, z) + v.AddArg2(i, v0) + return true + } + } + break + } + // match: (Mul64 (Const64 [c]) (Mul64 (Const64 [d]) x)) + // result: (Mul64 (Const64 [c*d]) x) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpConst64 { + continue + } + t := v_0.Type + c := auxIntToInt64(v_0.AuxInt) + if v_1.Op != OpMul64 { continue } _ = v_1.Args[1] @@ -14552,6 +14429,37 @@ func rewriteValuegeneric_OpMul8(v *Value) bool { } break } + // match: (Mul8 (Mul8 i:(Const8 ) z) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Mul8 i (Mul8 x z)) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpMul8 { + continue + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + v_0_1 := v_0.Args[1] + for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 { + i := v_0_0 + if i.Op != OpConst8 { + continue + } + t := i.Type + z := v_0_1 + x := v_1 + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpMul8) + v0 := b.NewValue0(v.Pos, OpMul8, t) + v0.AddArg2(x, z) + v.AddArg2(i, v0) + return true + } + } + break + } // match: (Mul8 (Const8 [c]) (Mul8 (Const8 [d]) x)) // result: (Mul8 (Const8 [c*d]) x) for { @@ -22432,53 +22340,86 @@ func rewriteValuegeneric_OpSub16(v *Value) bool { v.AddArg2(v0, i) return true } - // match: (Sub16 x (Sub16 z i:(Const16 ))) + // match: (Sub16 x (Add16 z i:(Const16 ))) // cond: (z.Op != OpConst16 && x.Op != OpConst16) - // result: (Add16 i (Sub16 x z)) + // result: (Sub16 (Sub16 x z) i) for { x := v_0 - if v_1.Op != OpSub16 { + if v_1.Op != OpAdd16 { break } _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] + v_1_0 := v_1.Args[0] + v_1_1 := v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { + z := v_1_0 + i := v_1_1 + if i.Op != OpConst16 { + continue + } + t := i.Type + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpSub16) + v0 := b.NewValue0(v.Pos, OpSub16, t) + v0.AddArg2(x, z) + v.AddArg2(v0, i) + return true + } + break + } + // match: (Sub16 (Sub16 i:(Const16 ) z) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Sub16 i (Add16 z x)) + for { + if v_0.Op != OpSub16 { + break + } + z := v_0.Args[1] + i := v_0.Args[0] if i.Op != OpConst16 { break } t := i.Type + x := v_1 if !(z.Op != OpConst16 && x.Op != OpConst16) { break } - v.reset(OpAdd16) - v0 := b.NewValue0(v.Pos, OpSub16, t) - v0.AddArg2(x, z) + v.reset(OpSub16) + v0 := b.NewValue0(v.Pos, OpAdd16, t) + v0.AddArg2(z, x) v.AddArg2(i, v0) return true } - // match: (Sub16 (Const16 [c]) (Sub16 x (Const16 [d]))) - // result: (Sub16 (Const16 [c+d]) x) + // match: (Sub16 (Add16 z i:(Const16 )) x) + // cond: (z.Op != OpConst16 && x.Op != OpConst16) + // result: (Add16 i (Sub16 z x)) for { - if v_0.Op != OpConst16 { - break - } - t := v_0.Type - c := auxIntToInt16(v_0.AuxInt) - if v_1.Op != OpSub16 { + if v_0.Op != OpAdd16 { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst16 || v_1_1.Type != t { - 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 { + z := v_0_0 + i := v_0_1 + if i.Op != OpConst16 { + continue + } + t := i.Type + x := v_1 + if !(z.Op != OpConst16 && x.Op != OpConst16) { + continue + } + v.reset(OpAdd16) + v0 := b.NewValue0(v.Pos, OpSub16, t) + v0.AddArg2(z, x) + v.AddArg2(i, v0) + return true } - d := auxIntToInt16(v_1_1.AuxInt) - v.reset(OpSub16) - v0 := b.NewValue0(v.Pos, OpConst16, t) - v0.AuxInt = int16ToAuxInt(c + d) - v.AddArg2(v0, x) - return true + break } // match: (Sub16 (Const16 [c]) (Sub16 (Const16 [d]) x)) // result: (Add16 (Const16 [c-d]) x) @@ -22503,6 +22444,34 @@ func rewriteValuegeneric_OpSub16(v *Value) bool { v.AddArg2(v0, x) return true } + // match: (Sub16 (Const16 [c]) (Add16 (Const16 [d]) x)) + // result: (Sub16 (Const16 [c-d]) x) + for { + if v_0.Op != OpConst16 { + break + } + t := v_0.Type + c := auxIntToInt16(v_0.AuxInt) + if v_1.Op != OpAdd16 { + break + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + v_1_1 := v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { + if v_1_0.Op != OpConst16 || v_1_0.Type != t { + continue + } + d := auxIntToInt16(v_1_0.AuxInt) + x := v_1_1 + v.reset(OpSub16) + v0 := b.NewValue0(v.Pos, OpConst16, t) + v0.AuxInt = int16ToAuxInt(c - d) + v.AddArg2(v0, x) + return true + } + break + } return false } func rewriteValuegeneric_OpSub32(v *Value) bool { @@ -22650,53 +22619,86 @@ func rewriteValuegeneric_OpSub32(v *Value) bool { v.AddArg2(v0, i) return true } - // match: (Sub32 x (Sub32 z i:(Const32 ))) + // match: (Sub32 x (Add32 z i:(Const32 ))) // cond: (z.Op != OpConst32 && x.Op != OpConst32) - // result: (Add32 i (Sub32 x z)) + // result: (Sub32 (Sub32 x z) i) for { x := v_0 - if v_1.Op != OpSub32 { + if v_1.Op != OpAdd32 { break } _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] + v_1_0 := v_1.Args[0] + v_1_1 := v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { + z := v_1_0 + i := v_1_1 + if i.Op != OpConst32 { + continue + } + t := i.Type + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpSub32) + v0 := b.NewValue0(v.Pos, OpSub32, t) + v0.AddArg2(x, z) + v.AddArg2(v0, i) + return true + } + break + } + // match: (Sub32 (Sub32 i:(Const32 ) z) x) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Sub32 i (Add32 z x)) + for { + if v_0.Op != OpSub32 { + break + } + z := v_0.Args[1] + i := v_0.Args[0] if i.Op != OpConst32 { break } t := i.Type + x := v_1 if !(z.Op != OpConst32 && x.Op != OpConst32) { break } - v.reset(OpAdd32) - v0 := b.NewValue0(v.Pos, OpSub32, t) - v0.AddArg2(x, z) + v.reset(OpSub32) + v0 := b.NewValue0(v.Pos, OpAdd32, t) + v0.AddArg2(z, x) v.AddArg2(i, v0) return true } - // match: (Sub32 (Const32 [c]) (Sub32 x (Const32 [d]))) - // result: (Sub32 (Const32 [c+d]) x) + // match: (Sub32 (Add32 z i:(Const32 )) x) + // cond: (z.Op != OpConst32 && x.Op != OpConst32) + // result: (Add32 i (Sub32 z x)) for { - if v_0.Op != OpConst32 { - break - } - t := v_0.Type - c := auxIntToInt32(v_0.AuxInt) - if v_1.Op != OpSub32 { + if v_0.Op != OpAdd32 { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst32 || v_1_1.Type != t { - 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 { + z := v_0_0 + i := v_0_1 + if i.Op != OpConst32 { + continue + } + t := i.Type + x := v_1 + if !(z.Op != OpConst32 && x.Op != OpConst32) { + continue + } + v.reset(OpAdd32) + v0 := b.NewValue0(v.Pos, OpSub32, t) + v0.AddArg2(z, x) + v.AddArg2(i, v0) + return true } - d := auxIntToInt32(v_1_1.AuxInt) - v.reset(OpSub32) - v0 := b.NewValue0(v.Pos, OpConst32, t) - v0.AuxInt = int32ToAuxInt(c + d) - v.AddArg2(v0, x) - return true + break } // match: (Sub32 (Const32 [c]) (Sub32 (Const32 [d]) x)) // result: (Add32 (Const32 [c-d]) x) @@ -22721,6 +22723,34 @@ func rewriteValuegeneric_OpSub32(v *Value) bool { v.AddArg2(v0, x) return true } + // match: (Sub32 (Const32 [c]) (Add32 (Const32 [d]) x)) + // result: (Sub32 (Const32 [c-d]) x) + for { + if v_0.Op != OpConst32 { + break + } + t := v_0.Type + c := auxIntToInt32(v_0.AuxInt) + if v_1.Op != OpAdd32 { + break + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + v_1_1 := v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { + if v_1_0.Op != OpConst32 || v_1_0.Type != t { + continue + } + d := auxIntToInt32(v_1_0.AuxInt) + x := v_1_1 + v.reset(OpSub32) + v0 := b.NewValue0(v.Pos, OpConst32, t) + v0.AuxInt = int32ToAuxInt(c - d) + v.AddArg2(v0, x) + return true + } + break + } return false } func rewriteValuegeneric_OpSub32F(v *Value) bool { @@ -22892,53 +22922,86 @@ func rewriteValuegeneric_OpSub64(v *Value) bool { v.AddArg2(v0, i) return true } - // match: (Sub64 x (Sub64 z i:(Const64 ))) + // match: (Sub64 x (Add64 z i:(Const64 ))) // cond: (z.Op != OpConst64 && x.Op != OpConst64) - // result: (Add64 i (Sub64 x z)) + // result: (Sub64 (Sub64 x z) i) for { x := v_0 - if v_1.Op != OpSub64 { + if v_1.Op != OpAdd64 { break } _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] + v_1_0 := v_1.Args[0] + v_1_1 := v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { + z := v_1_0 + i := v_1_1 + if i.Op != OpConst64 { + continue + } + t := i.Type + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpSub64) + v0 := b.NewValue0(v.Pos, OpSub64, t) + v0.AddArg2(x, z) + v.AddArg2(v0, i) + return true + } + break + } + // match: (Sub64 (Sub64 i:(Const64 ) z) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Sub64 i (Add64 z x)) + for { + if v_0.Op != OpSub64 { + break + } + z := v_0.Args[1] + i := v_0.Args[0] if i.Op != OpConst64 { break } t := i.Type + x := v_1 if !(z.Op != OpConst64 && x.Op != OpConst64) { break } - v.reset(OpAdd64) - v0 := b.NewValue0(v.Pos, OpSub64, t) - v0.AddArg2(x, z) + v.reset(OpSub64) + v0 := b.NewValue0(v.Pos, OpAdd64, t) + v0.AddArg2(z, x) v.AddArg2(i, v0) return true } - // match: (Sub64 (Const64 [c]) (Sub64 x (Const64 [d]))) - // result: (Sub64 (Const64 [c+d]) x) + // match: (Sub64 (Add64 z i:(Const64 )) x) + // cond: (z.Op != OpConst64 && x.Op != OpConst64) + // result: (Add64 i (Sub64 z x)) for { - if v_0.Op != OpConst64 { - break - } - t := v_0.Type - c := auxIntToInt64(v_0.AuxInt) - if v_1.Op != OpSub64 { + if v_0.Op != OpAdd64 { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst64 || v_1_1.Type != t { - 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 { + z := v_0_0 + i := v_0_1 + if i.Op != OpConst64 { + continue + } + t := i.Type + x := v_1 + if !(z.Op != OpConst64 && x.Op != OpConst64) { + continue + } + v.reset(OpAdd64) + v0 := b.NewValue0(v.Pos, OpSub64, t) + v0.AddArg2(z, x) + v.AddArg2(i, v0) + return true } - d := auxIntToInt64(v_1_1.AuxInt) - v.reset(OpSub64) - v0 := b.NewValue0(v.Pos, OpConst64, t) - v0.AuxInt = int64ToAuxInt(c + d) - v.AddArg2(v0, x) - return true + break } // match: (Sub64 (Const64 [c]) (Sub64 (Const64 [d]) x)) // result: (Add64 (Const64 [c-d]) x) @@ -22963,6 +23026,34 @@ func rewriteValuegeneric_OpSub64(v *Value) bool { v.AddArg2(v0, x) return true } + // match: (Sub64 (Const64 [c]) (Add64 (Const64 [d]) x)) + // result: (Sub64 (Const64 [c-d]) x) + for { + if v_0.Op != OpConst64 { + break + } + t := v_0.Type + c := auxIntToInt64(v_0.AuxInt) + if v_1.Op != OpAdd64 { + break + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + v_1_1 := v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { + if v_1_0.Op != OpConst64 || v_1_0.Type != t { + continue + } + d := auxIntToInt64(v_1_0.AuxInt) + x := v_1_1 + v.reset(OpSub64) + v0 := b.NewValue0(v.Pos, OpConst64, t) + v0.AuxInt = int64ToAuxInt(c - d) + v.AddArg2(v0, x) + return true + } + break + } return false } func rewriteValuegeneric_OpSub64F(v *Value) bool { @@ -23134,53 +23225,86 @@ func rewriteValuegeneric_OpSub8(v *Value) bool { v.AddArg2(v0, i) return true } - // match: (Sub8 x (Sub8 z i:(Const8 ))) + // match: (Sub8 x (Add8 z i:(Const8 ))) // cond: (z.Op != OpConst8 && x.Op != OpConst8) - // result: (Add8 i (Sub8 x z)) + // result: (Sub8 (Sub8 x z) i) for { x := v_0 - if v_1.Op != OpSub8 { + if v_1.Op != OpAdd8 { break } _ = v_1.Args[1] - z := v_1.Args[0] - i := v_1.Args[1] + v_1_0 := v_1.Args[0] + v_1_1 := v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { + z := v_1_0 + i := v_1_1 + if i.Op != OpConst8 { + continue + } + t := i.Type + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpSub8) + v0 := b.NewValue0(v.Pos, OpSub8, t) + v0.AddArg2(x, z) + v.AddArg2(v0, i) + return true + } + break + } + // match: (Sub8 (Sub8 i:(Const8 ) z) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Sub8 i (Add8 z x)) + for { + if v_0.Op != OpSub8 { + break + } + z := v_0.Args[1] + i := v_0.Args[0] if i.Op != OpConst8 { break } t := i.Type + x := v_1 if !(z.Op != OpConst8 && x.Op != OpConst8) { break } - v.reset(OpAdd8) - v0 := b.NewValue0(v.Pos, OpSub8, t) - v0.AddArg2(x, z) + v.reset(OpSub8) + v0 := b.NewValue0(v.Pos, OpAdd8, t) + v0.AddArg2(z, x) v.AddArg2(i, v0) return true } - // match: (Sub8 (Const8 [c]) (Sub8 x (Const8 [d]))) - // result: (Sub8 (Const8 [c+d]) x) + // match: (Sub8 (Add8 z i:(Const8 )) x) + // cond: (z.Op != OpConst8 && x.Op != OpConst8) + // result: (Add8 i (Sub8 z x)) for { - if v_0.Op != OpConst8 { - break - } - t := v_0.Type - c := auxIntToInt8(v_0.AuxInt) - if v_1.Op != OpSub8 { + if v_0.Op != OpAdd8 { break } - _ = v_1.Args[1] - x := v_1.Args[0] - v_1_1 := v_1.Args[1] - if v_1_1.Op != OpConst8 || v_1_1.Type != t { - 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 { + z := v_0_0 + i := v_0_1 + if i.Op != OpConst8 { + continue + } + t := i.Type + x := v_1 + if !(z.Op != OpConst8 && x.Op != OpConst8) { + continue + } + v.reset(OpAdd8) + v0 := b.NewValue0(v.Pos, OpSub8, t) + v0.AddArg2(z, x) + v.AddArg2(i, v0) + return true } - d := auxIntToInt8(v_1_1.AuxInt) - v.reset(OpSub8) - v0 := b.NewValue0(v.Pos, OpConst8, t) - v0.AuxInt = int8ToAuxInt(c + d) - v.AddArg2(v0, x) - return true + break } // match: (Sub8 (Const8 [c]) (Sub8 (Const8 [d]) x)) // result: (Add8 (Const8 [c-d]) x) @@ -23205,6 +23329,34 @@ func rewriteValuegeneric_OpSub8(v *Value) bool { v.AddArg2(v0, x) return true } + // match: (Sub8 (Const8 [c]) (Add8 (Const8 [d]) x)) + // result: (Sub8 (Const8 [c-d]) x) + for { + if v_0.Op != OpConst8 { + break + } + t := v_0.Type + c := auxIntToInt8(v_0.AuxInt) + if v_1.Op != OpAdd8 { + break + } + _ = v_1.Args[1] + v_1_0 := v_1.Args[0] + v_1_1 := v_1.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { + if v_1_0.Op != OpConst8 || v_1_0.Type != t { + continue + } + d := auxIntToInt8(v_1_0.AuxInt) + x := v_1_1 + v.reset(OpSub8) + v0 := b.NewValue0(v.Pos, OpConst8, t) + v0.AuxInt = int8ToAuxInt(c - d) + v.AddArg2(v0, x) + return true + } + break + } return false } func rewriteValuegeneric_OpTrunc16to8(v *Value) bool { diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index 45fdb68903..afd4d66bd9 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -462,7 +462,6 @@ func addSpecial(a, b, c uint32) (uint32, uint32, uint32) { return a, b, c } - // Divide -> shift rules usually require fixup for negative inputs. // If the input is non-negative, make sure the fixup is eliminated. func divInt(v int64) int64 { @@ -472,3 +471,33 @@ func divInt(v int64) int64 { // amd64:-`.*SARQ.*63,`, -".*SHRQ", ".*SARQ.*[$]9," return v / 512 } + +// The reassociate rules "x - (z + C) -> (x - z) - C" and +// "(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" + r0 := (i0 + 3) - (j0 + 1) + // arm64:"SUB","SUB\t[$]4" + r1 := (i1 - 3) - (j1 + 1) + // arm64:"SUB","ADD\t[$]4" + r2 := (i2 + 3) - (j2 - 1) + // arm64:"SUB","SUB\t[$]2" + r3 := (i3 - 3) - (j3 - 1) + return r0, r1, r2, r3 +} + +// The reassociate rules "x - (z + C) -> (x - z) - C" and +// "(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" + r0 := (3 - i0) - (j0 + 1) + // arm64:"ADD","MOVD\t[$]4","SUB" + r1 := (3 - i1) - (j1 - 1) + return r0, r1 +} + +func constantFold3(i, j int) int { + // arm64: "MOVD\t[$]30","MUL",-"ADD",-"LSL" + r := (5 * i) * (6 * j) + return r +} -- GitLab From 3a7f8ccf246a5929458a7f818c1d4c125ac72892 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Wed, 1 Jul 2020 18:10:02 -0400 Subject: [PATCH 0305/1792] go/types: add tests for AssignableTo and ConvertibleTo These exported functions are mostly trivial wrappers, but do make certain assumptions about how the underlying Checker APIs can be called. Add some simple tests. Change-Id: I68e9ae875353c12d118ec961a6f3834385fbbb97 Reviewed-on: https://go-review.googlesource.com/c/go/+/241262 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/api_test.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/go/types/api_test.go b/src/go/types/api_test.go index fe3950a52d..798c09bbff 100644 --- a/src/go/types/api_test.go +++ b/src/go/types/api_test.go @@ -1232,6 +1232,41 @@ func F(){ } } +func TestConvertibleTo(t *testing.T) { + for _, test := range []struct { + v, t Type + want bool + }{ + {Typ[Int], Typ[Int], true}, + {Typ[Int], Typ[Float32], true}, + {newDefined(Typ[Int]), Typ[Int], true}, + {newDefined(new(Struct)), new(Struct), true}, + {newDefined(Typ[Int]), new(Struct), false}, + {Typ[UntypedInt], Typ[Int], true}, + } { + if got := ConvertibleTo(test.v, test.t); got != test.want { + t.Errorf("ConvertibleTo(%v, %v) = %t, want %t", test.v, test.t, got, test.want) + } + } +} + +func TestAssignableTo(t *testing.T) { + for _, test := range []struct { + v, t Type + want bool + }{ + {Typ[Int], Typ[Int], true}, + {Typ[Int], Typ[Float32], false}, + {newDefined(Typ[Int]), Typ[Int], false}, + {newDefined(new(Struct)), new(Struct), true}, + {Typ[UntypedBool], Typ[Bool], true}, + } { + if got := AssignableTo(test.v, test.t); got != test.want { + t.Errorf("AssignableTo(%v, %v) = %t, want %t", test.v, test.t, got, test.want) + } + } +} + func TestIdentical_issue15173(t *testing.T) { // Identical should allow nil arguments and be symmetric. for _, test := range []struct { -- GitLab From 494ec85d9fd6deea388c454dfd836d9f845f7153 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Mon, 6 Jul 2020 16:45:46 -0400 Subject: [PATCH 0306/1792] go/types: update test case to exercise mutually recursive interfaces Due to a typo, this test case was not actually exercising the bug described in golang/go#33656. Update it to do so. Interestingly, the comparison is now valid (as it should be) -- I suspect #33656 is actually fixed. Fixes #33656 Change-Id: If50a917f6477d8eb4f82f5a2a96bf5d9123ff0d4 Reviewed-on: https://go-review.googlesource.com/c/go/+/241263 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/testdata/cycles2.src | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/go/types/testdata/cycles2.src b/src/go/types/testdata/cycles2.src index 5fd9e838b6..1a7f40ae4b 100644 --- a/src/go/types/testdata/cycles2.src +++ b/src/go/types/testdata/cycles2.src @@ -37,7 +37,7 @@ type A interface { } type B interface { - a() interface { + b() interface { AB } } @@ -59,8 +59,7 @@ var y interface { B } -// TODO(gri) This should be a valid compare. See #33656. -var _ = x /* ERROR cannot compare */ == y +var _ = x == y // Test case for issue 6638. -- GitLab From fb5c3eabd16bbeea28ee8a11d29a31cf5ed124dd Mon Sep 17 00:00:00 2001 From: Segflow Date: Mon, 24 Aug 2020 13:42:45 +0000 Subject: [PATCH 0307/1792] net/http: set Content-Length:0 for empty PATCH requests as with POST, PATCH MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sets Content-Length:0 for nil bodies in PATCH requests, as we already do for POST and PUT requests. RFC 2616 mentions that unless a method’s Content-Length is forbidden it can send one. In the wild, we’ve found that Microsoft Azure’s DataLake Gen2 storage API https://docs.microsoft.com/en-us/rest/api/storageservices/datalakestoragegen2/path/update deliberately rejects PATCH requests without a Content-Length, yet there is no workaround for setting that header when trying to flush the content of a file which was uploaded in a previous request. Fixes #40978 Change-Id: Ib0a623b907d827a1c5ee431dca3c41024fa291c5 GitHub-Last-Rev: 12a3903f2bc22bcc4f5f8e2abcc3922b612b8871 GitHub-Pull-Request: golang/go#40991 Reviewed-on: https://go-review.googlesource.com/c/go/+/250039 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/net/http/requestwrite_test.go | 20 ++++++++++++++++++++ src/net/http/transfer.go | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/net/http/requestwrite_test.go b/src/net/http/requestwrite_test.go index fc6257cb33..9ac6701cfd 100644 --- a/src/net/http/requestwrite_test.go +++ b/src/net/http/requestwrite_test.go @@ -588,6 +588,26 @@ var reqWriteTests = []reqWriteTest{ }, WantError: errors.New("net/http: can't write control character in Request.URL"), }, + + 26: { // Request with nil body and PATCH method. Issue #40978 + Req: Request{ + Method: "PATCH", + URL: mustParseURL("/"), + Host: "example.com", + ProtoMajor: 1, + ProtoMinor: 1, + ContentLength: 0, // as if unset by user + }, + Body: nil, + WantWrite: "PATCH / HTTP/1.1\r\n" + + "Host: example.com\r\n" + + "User-Agent: Go-http-client/1.1\r\n" + + "Content-Length: 0\r\n\r\n", + WantProxy: "PATCH / HTTP/1.1\r\n" + + "Host: example.com\r\n" + + "User-Agent: Go-http-client/1.1\r\n" + + "Content-Length: 0\r\n\r\n", + }, } func TestRequestWrite(t *testing.T) { diff --git a/src/net/http/transfer.go b/src/net/http/transfer.go index 50d434b1fb..ab009177bc 100644 --- a/src/net/http/transfer.go +++ b/src/net/http/transfer.go @@ -258,7 +258,7 @@ func (t *transferWriter) shouldSendContentLength() bool { return false } // Many servers expect a Content-Length for these methods - if t.Method == "POST" || t.Method == "PUT" { + if t.Method == "POST" || t.Method == "PUT" || t.Method == "PATCH" { return true } if t.ContentLength == 0 && isIdentity(t.TransferEncoding) { -- GitLab From bb998747d6c5213e3a366936c482e149dce62720 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 1 Jul 2020 10:33:56 -0400 Subject: [PATCH 0308/1792] cmd/go: populate the Module field for test packages Fixes #39974 Change-Id: I52bb13e887fde52bf789198059c39fd6aacd96f0 Reviewed-on: https://go-review.googlesource.com/c/go/+/240678 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- src/cmd/go/internal/load/test.go | 2 ++ src/cmd/go/testdata/script/mod_list_test.txt | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index a0e275095b..e0f13323df 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -191,6 +191,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p GoFiles: p.XTestGoFiles, Imports: p.XTestImports, ForTest: p.ImportPath, + Module: p.Module, Error: pxtestErr, }, Internal: PackageInternal{ @@ -222,6 +223,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p ImportPath: p.ImportPath + ".test", Root: p.Root, Imports: str.StringList(TestMainDeps), + Module: p.Module, }, Internal: PackageInternal{ Build: &build.Package{Name: "main"}, diff --git a/src/cmd/go/testdata/script/mod_list_test.txt b/src/cmd/go/testdata/script/mod_list_test.txt index a99e4f36cd..f697af6c92 100644 --- a/src/cmd/go/testdata/script/mod_list_test.txt +++ b/src/cmd/go/testdata/script/mod_list_test.txt @@ -3,9 +3,19 @@ env GO111MODULE=on # go list -compiled -test must handle test-only packages # golang.org/issue/27097. go list -compiled -test +stdout -count=4 '^.' # 4 lines stdout '^m$' stdout '^m\.test$' stdout '^m \[m\.test\]$' +stdout '^m_test \[m\.test\]$' + +# https://golang.org/issue/39974: test packages should have the Module field populated. +go list -test -f '{{.ImportPath}}{{with .Module}}: {{.Path}}{{end}}' +stdout -count=4 '^.' # 4 lines +stdout '^m: m$' +stdout '^m\.test: m$' +stdout '^m \[m\.test\]: m$' +stdout '^m_test \[m\.test\]: m$' -- go.mod -- module m @@ -14,3 +24,7 @@ module m package x import "testing" func Test(t *testing.T) {} +-- x_x_test.go -- +package x_test +import "testing" +func Test(t *testing.T) {} -- GitLab From 94953d3e5928c8a577bad7911aabbf627269ef77 Mon Sep 17 00:00:00 2001 From: Changkun Ou Date: Mon, 24 Aug 2020 13:45:27 +0200 Subject: [PATCH 0309/1792] sync: delete dirty keys inside Map.LoadAndDelete Fixes #40999 Change-Id: Ie32427e5cb5ed512b976b554850f50be156ce9f2 Reviewed-on: https://go-review.googlesource.com/c/go/+/250197 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/sync/map.go | 1 + src/sync/map_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/sync/map.go b/src/sync/map.go index a61e2ebdd6..9ad25353ff 100644 --- a/src/sync/map.go +++ b/src/sync/map.go @@ -274,6 +274,7 @@ func (m *Map) LoadAndDelete(key interface{}) (value interface{}, loaded bool) { e, ok = read.m[key] if !ok && read.amended { e, ok = m.dirty[key] + delete(m.dirty, key) // Regardless of whether the entry was present, record a miss: this key // will take the slow path until the dirty map is promoted to the read // map. diff --git a/src/sync/map_test.go b/src/sync/map_test.go index 4ae989a6d5..7f163caa5c 100644 --- a/src/sync/map_test.go +++ b/src/sync/map_test.go @@ -9,6 +9,7 @@ import ( "reflect" "runtime" "sync" + "sync/atomic" "testing" "testing/quick" ) @@ -171,3 +172,26 @@ func TestConcurrentRange(t *testing.T) { } } } + +func TestIssue40999(t *testing.T) { + var m sync.Map + + // Since the miss-counting in missLocked (via Delete) + // compares the miss count with len(m.dirty), + // add an initial entry to bias len(m.dirty) above the miss count. + m.Store(nil, struct{}{}) + + var finalized uint32 + + // Set finalizers that count for collected keys. A non-zero count + // indicates that keys have not been leaked. + for atomic.LoadUint32(&finalized) == 0 { + p := new(int) + runtime.SetFinalizer(p, func(*int) { + atomic.AddUint32(&finalized, 1) + }) + m.Store(p, struct{}{}) + m.Delete(p) + runtime.GC() + } +} -- GitLab From 5c76382762cfc34b7a7678668460f127fec4a35b Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 13 Mar 2020 16:46:51 -0400 Subject: [PATCH 0310/1792] cmd/go/internal/modload: add a "v" prefix to the indexed go version This allows semver-based comparisons of the version without additional allocations. Also comment on the reason for the loops that iterate over modFile instead. (I was reading the vendor code in order to add the lazy-loading version check, and this section was a bit unclear to me.) For #36460 Change-Id: I11559d81ffb4eba0e4e10e6fa3c01990b11f9180 Reviewed-on: https://go-review.googlesource.com/c/go/+/240622 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/init.go | 6 +++--- src/cmd/go/internal/modload/modfile.go | 14 ++++++++------ src/cmd/go/internal/modload/vendor.go | 4 +++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 93027c44c4..71c7b158b8 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -483,15 +483,15 @@ func setDefaultBuildMod() { if fi, err := os.Stat(filepath.Join(modRoot, "vendor")); err == nil && fi.IsDir() { modGo := "unspecified" - if index.goVersion != "" { - if semver.Compare("v"+index.goVersion, "v1.14") >= 0 { + if index.goVersionV != "" { + if semver.Compare(index.goVersionV, "v1.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.goVersion + modGo = index.goVersionV[1:] } } diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index 9f4ec5a49f..9a166cae54 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -20,7 +20,7 @@ type modFileIndex struct { data []byte dataNeedsFix bool // true if fixVersion applied a change while parsing data module module.Version - goVersion string + goVersionV string // GoVersion with "v" prefix require map[module.Version]requireMeta replace map[module.Version]module.Version exclude map[module.Version]bool @@ -66,9 +66,11 @@ func indexModFile(data []byte, modFile *modfile.File, needsFix bool) *modFileInd i.module = modFile.Module.Mod } - i.goVersion = "" + i.goVersionV = "" if modFile.Go != nil { - i.goVersion = modFile.Go.Version + // 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.require = make(map[module.Version]requireMeta, len(modFile.Require)) @@ -114,11 +116,11 @@ func (i *modFileIndex) modFileIsDirty(modFile *modfile.File) bool { } if modFile.Go == nil { - if i.goVersion != "" { + if i.goVersionV != "" { return true } - } else if modFile.Go.Version != i.goVersion { - if i.goVersion == "" && cfg.BuildMod == "readonly" { + } else if "v"+modFile.Go.Version != i.goVersionV { + if i.goVersionV == "" && cfg.BuildMod == "readonly" { // 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. diff --git a/src/cmd/go/internal/modload/vendor.go b/src/cmd/go/internal/modload/vendor.go index 71f68efbcc..9f34b829fc 100644 --- a/src/cmd/go/internal/modload/vendor.go +++ b/src/cmd/go/internal/modload/vendor.go @@ -133,7 +133,7 @@ func checkVendorConsistency() { readVendorList() pre114 := false - if modFile.Go == nil || semver.Compare("v"+modFile.Go.Version, "v1.14") < 0 { + if semver.Compare(index.goVersionV, "v1.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. @@ -150,6 +150,8 @@ func checkVendorConsistency() { } } + // Iterate over the Require directives in their original (not indexed) order + // so that the errors match the original file. for _, r := range modFile.Require { if !vendorMeta[r.Mod].Explicit { if pre114 { -- GitLab From 5a691927659d1057bb3be80087732b5df5889aca Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 24 Jul 2020 17:43:55 -0400 Subject: [PATCH 0311/1792] cmd/go/internal/modload: drop requirements on excluded versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, when we encountered an excluded version in any module's requirements, we would resolve it to the next higher version. Unfortunately, the meaning of “the next higher version” can change over time. Moreover, users who use 'exclude' directives normally either already require some higher version (using the 'exclude' directive to prune out invalid requirements from some intermediate version), or already require some lower version (using the 'exclude' directive to prevent 'go get -u' from upgrading to a known-bad version). In both of these cases, resolving an upgrade for the excluded version is needless work even in the best case: it adds work for the 'go' command when there is already a perfectly usable selected version of the module in the requirement graph. Instead, we now interpret the 'exclude' directive as dropping all references to the excluded version. This implements the approach described in https://golang.org/issue/36465#issuecomment-572694990. Fixes #36465 Updates #36460 Change-Id: Ibf0187daced417b4cc23b97125826778658e4b0f Reviewed-on: https://go-review.googlesource.com/c/go/+/244773 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/init.go | 12 +++- src/cmd/go/internal/modload/mvs.go | 19 +++--- .../testdata/script/mod_require_exclude.txt | 62 ++++++++++++++++--- 3 files changed, 72 insertions(+), 21 deletions(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 71c7b158b8..7f493104b1 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -383,8 +383,8 @@ func InitMod(ctx context.Context) { legacyModInit() } - modFileToBuildList() setDefaultBuildMod() + modFileToBuildList() if cfg.BuildMod == "vendor" { readVendorList() checkVendorConsistency() @@ -459,7 +459,15 @@ func modFileToBuildList() { list := []module.Version{Target} for _, r := range modFile.Require { - list = append(list, r.Mod) + if index != nil && index.exclude[r.Mod] { + if cfg.BuildMod == "mod" { + fmt.Fprintf(os.Stderr, "go: dropping requirement on excluded version %s %s\n", r.Mod.Path, r.Mod.Version) + } else { + fmt.Fprintf(os.Stderr, "go: ignoring requirement on excluded version %s %s\n", r.Mod.Path, r.Mod.Version) + } + } else { + list = append(list, r.Mod) + } } buildList = list } diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 67eb2c2e19..39d0d69524 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -54,20 +54,15 @@ func (r *mvsReqs) Required(mod module.Version) ([]module.Version, error) { if err != nil { return cached{nil, err} } - for i, mv := range list { - if index != nil { - for index.exclude[mv] { - mv1, err := r.next(mv) - if err != nil { - return cached{nil, err} - } - if mv1.Version == "none" { - return cached{nil, fmt.Errorf("%s(%s) depends on excluded %s(%s) with no newer version available", mod.Path, mod.Version, mv.Path, mv.Version)} - } - mv = mv1 + if index != nil && len(index.exclude) > 0 { + // Drop requirements on excluded versions. + nonExcluded := list[:0] + for _, r := range list { + if !index.exclude[r] { + nonExcluded = append(nonExcluded, r) } } - list[i] = mv + list = nonExcluded } return cached{list, nil} diff --git a/src/cmd/go/testdata/script/mod_require_exclude.txt b/src/cmd/go/testdata/script/mod_require_exclude.txt index 60f7e3fa91..1a0fc3097b 100644 --- a/src/cmd/go/testdata/script/mod_require_exclude.txt +++ b/src/cmd/go/testdata/script/mod_require_exclude.txt @@ -1,16 +1,51 @@ # build with no newer version to satisfy exclude env GO111MODULE=on -! go list -m all -stderr 'no newer version available' +cp go.mod go.mod.orig + +# With the selected version excluded, commands that query that version without +# updating go.mod should fail. + +! go list -mod=readonly -m all +stderr '^go: ignoring requirement on excluded version rsc.io/sampler v1\.99\.99$' +stderr '^go: updates to go.mod needed, disabled by -mod=readonly$' +! stdout '^rsc.io/sampler v1.99.99' +cmp go.mod go.mod.orig + +! go list -mod=vendor -m rsc.io/sampler +stderr '^go: ignoring requirement on excluded version rsc.io/sampler v1\.99\.99$' +stderr '^go list -m: module rsc.io/sampler: can''t resolve module using the vendor directory\n\t\(Use -mod=mod or -mod=readonly to bypass\.\)$' +! stdout '^rsc.io/sampler v1.99.99' +cmp go.mod go.mod.orig + +# With the selected version excluded, commands that load only modules should +# drop the excluded module. + +go list -m all +stderr '^go: dropping requirement on excluded version rsc.io/sampler v1\.99\.99$' +stdout '^x$' +! stdout '^rsc.io/sampler' +cmp go.mod go.moddrop + +# With the latest version excluded, 'go list' should resolve needed packages +# from the next-highest version. + +cp go.mod.orig go.mod +go list -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all +stderr '^go: dropping requirement on excluded version rsc.io/sampler v1\.99\.99$' +stdout '^x $' +! stdout '^rsc.io/sampler v1.99.99' +stdout '^rsc.io/sampler v1.3.0' # build with newer version available cp go.mod2 go.mod -go list -m all +go list -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all +stderr '^go: dropping requirement on excluded version rsc.io/quote v1\.5\.1$' stdout 'rsc.io/quote v1.5.2' # build with excluded newer version cp go.mod3 go.mod -go list -m all +go list -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all +! stderr '^go: dropping requirement' stdout 'rsc.io/quote v1.5.1' -- x.go -- @@ -19,15 +54,28 @@ import _ "rsc.io/quote" -- go.mod -- module x -exclude rsc.io/sampler latest -require rsc.io/sampler latest +go 1.13 + +exclude rsc.io/sampler v1.99.99 +require rsc.io/sampler v1.99.99 +-- go.moddrop -- +module x + +go 1.13 + +exclude rsc.io/sampler v1.99.99 -- go.mod2 -- module x + +go 1.13 + exclude rsc.io/quote v1.5.1 require rsc.io/quote v1.5.1 - -- go.mod3 -- module x + +go 1.13 + exclude rsc.io/quote v1.5.2 require rsc.io/quote v1.5.1 -- GitLab From 9bcc5d20b6f2574e5b98822e0986a1cfa14032f6 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 23 Jul 2020 22:24:04 -0400 Subject: [PATCH 0312/1792] cmd/go/internal/mvs: reverse the order of BuildListError.stack When we print the stack from a BuildListError, we print the main module first and the error last. That was the opposite of the order in which in was stored in memory, leading to (arguably) more complex code and (definitely) my own inability to reason about the contents of the slice. For now, it's still more convenient to construct the stack reversed, so we do that and then reverse it before packing it into the error. For #36460 Change-Id: I6312fb67b2ad9bf9b64071fe829854833208bad7 Reviewed-on: https://go-review.googlesource.com/c/go/+/244759 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/mvs/mvs.go | 35 ++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/cmd/go/internal/mvs/mvs.go b/src/cmd/go/internal/mvs/mvs.go index 1f8eaa1f60..1056a500ff 100644 --- a/src/cmd/go/internal/mvs/mvs.go +++ b/src/cmd/go/internal/mvs/mvs.go @@ -83,7 +83,7 @@ func (e *BuildListError) Module() module.Version { if len(e.stack) == 0 { return module.Version{} } - return e.stack[0].m + return e.stack[len(e.stack)-1].m } func (e *BuildListError) Error() string { @@ -93,22 +93,22 @@ func (e *BuildListError) Error() string { // Don't print modules at the beginning of the chain without a // version. These always seem to be the main module or a // synthetic module ("target@"). - for len(stack) > 0 && stack[len(stack)-1].m.Version == "" { - stack = stack[:len(stack)-1] + for len(stack) > 0 && stack[0].m.Version == "" { + stack = stack[1:] } - for i := len(stack) - 1; i >= 1; i-- { - fmt.Fprintf(b, "%s@%s %s\n\t", stack[i].m.Path, stack[i].m.Version, stack[i].nextReason) - } if len(stack) == 0 { b.WriteString(e.Err.Error()) } else { + for _, elem := range stack[:len(stack)-1] { + fmt.Fprintf(b, "%s@%s %s\n\t", elem.m.Path, elem.m.Version, elem.nextReason) + } // Ensure that the final module path and version are included as part of the // error message. if _, ok := e.Err.(*module.ModuleError); ok { fmt.Fprintf(b, "%v", e.Err) } else { - fmt.Fprintf(b, "%v", module.VersionError(stack[0].m, e.Err)) + fmt.Fprintf(b, "%v", module.VersionError(stack[len(stack)-1].m, e.Err)) } } return b.String() @@ -202,16 +202,27 @@ func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) (m q = q[1:] if node.err != nil { - err := &BuildListError{ - Err: node.err, - stack: []buildListErrorElem{{m: node.m}}, - } + // Construct the stack reversed (from the error to the main module), + // then reverse it to obtain the usual order (from the main module to + // the error). + stack := []buildListErrorElem{{m: node.m}} for n, prev := neededBy[node], node; n != nil; n, prev = neededBy[n], n { reason := "requires" if n.upgrade == prev.m { reason = "updating to" } - err.stack = append(err.stack, buildListErrorElem{m: n.m, nextReason: reason}) + stack = append(stack, buildListErrorElem{m: n.m, nextReason: reason}) + } + i, j := 0, len(stack)-1 + for i < j { + stack[i], stack[j] = stack[j], stack[i] + i++ + j-- + } + + err := &BuildListError{ + Err: node.err, + stack: stack, } return nil, err } -- GitLab From 6a718175a6b5532bb49160047731181a4ecec2a1 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 4 Aug 2020 23:27:18 -0400 Subject: [PATCH 0313/1792] cmd/go/internal/mvs: export a NewBuildListError function Also factor out BuildListError to a separate file. For #36460 Change-Id: Ibd1143893b09a2bbef659bea1e8c5dd35184a7ef Reviewed-on: https://go-review.googlesource.com/c/go/+/247764 Reviewed-by: Jay Conrod --- src/cmd/go/internal/mvs/errors.go | 96 +++++++++++++++++++++++++++++++ src/cmd/go/internal/mvs/mvs.go | 77 ++++--------------------- 2 files changed, 108 insertions(+), 65 deletions(-) create mode 100644 src/cmd/go/internal/mvs/errors.go diff --git a/src/cmd/go/internal/mvs/errors.go b/src/cmd/go/internal/mvs/errors.go new file mode 100644 index 0000000000..8577902878 --- /dev/null +++ b/src/cmd/go/internal/mvs/errors.go @@ -0,0 +1,96 @@ +// 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 mvs + +import ( + "fmt" + "strings" + + "golang.org/x/mod/module" +) + +// BuildListError decorates an error that occurred gathering requirements +// while constructing a build list. BuildListError prints the chain +// of requirements to the module where the error occurred. +type BuildListError struct { + Err error + stack []buildListErrorElem +} + +type buildListErrorElem struct { + m module.Version + + // nextReason is the reason this module depends on the next module in the + // stack. Typically either "requires", or "updating to". + nextReason string +} + +// NewBuildListError returns a new BuildListError wrapping an error that +// occurred at a module found along the given path of requirements and/or +// upgrades, which must be non-empty. +// +// The isUpgrade function reports whether a path step is due to an upgrade. +// A nil isUpgrade function indicates that none of the path steps are due to upgrades. +func NewBuildListError(err error, path []module.Version, isUpgrade func(from, to module.Version) bool) *BuildListError { + stack := make([]buildListErrorElem, 0, len(path)) + for len(path) > 1 { + reason := "requires" + if isUpgrade != nil && isUpgrade(path[0], path[1]) { + reason = "updating to" + } + stack = append(stack, buildListErrorElem{ + m: path[0], + nextReason: reason, + }) + path = path[1:] + } + stack = append(stack, buildListErrorElem{m: path[0]}) + + return &BuildListError{ + Err: err, + stack: stack, + } +} + +// Module returns the module where the error occurred. If the module stack +// is empty, this returns a zero value. +func (e *BuildListError) Module() module.Version { + if len(e.stack) == 0 { + return module.Version{} + } + return e.stack[len(e.stack)-1].m +} + +func (e *BuildListError) Error() string { + b := &strings.Builder{} + stack := e.stack + + // Don't print modules at the beginning of the chain without a + // version. These always seem to be the main module or a + // synthetic module ("target@"). + for len(stack) > 0 && stack[0].m.Version == "" { + stack = stack[1:] + } + + if len(stack) == 0 { + b.WriteString(e.Err.Error()) + } else { + for _, elem := range stack[:len(stack)-1] { + fmt.Fprintf(b, "%s@%s %s\n\t", elem.m.Path, elem.m.Version, elem.nextReason) + } + // Ensure that the final module path and version are included as part of the + // error message. + m := stack[len(stack)-1].m + if _, ok := e.Err.(*module.ModuleError); ok { + // TODO(bcmills): Also ensure that the module path and version match. + // (Otherwise, we may be reporting an error from a replacement without + // indicating the replacement path.) + fmt.Fprintf(b, "%v", e.Err) + } else { + fmt.Fprintf(b, "%v", module.VersionError(m, e.Err)) + } + } + return b.String() +} diff --git a/src/cmd/go/internal/mvs/mvs.go b/src/cmd/go/internal/mvs/mvs.go index 1056a500ff..ea23a9f45e 100644 --- a/src/cmd/go/internal/mvs/mvs.go +++ b/src/cmd/go/internal/mvs/mvs.go @@ -9,7 +9,6 @@ package mvs import ( "fmt" "sort" - "strings" "sync" "sync/atomic" @@ -61,59 +60,6 @@ type Reqs interface { Previous(m module.Version) (module.Version, error) } -// BuildListError decorates an error that occurred gathering requirements -// while constructing a build list. BuildListError prints the chain -// of requirements to the module where the error occurred. -type BuildListError struct { - Err error - stack []buildListErrorElem -} - -type buildListErrorElem struct { - m module.Version - - // nextReason is the reason this module depends on the next module in the - // stack. Typically either "requires", or "upgraded to". - nextReason string -} - -// Module returns the module where the error occurred. If the module stack -// is empty, this returns a zero value. -func (e *BuildListError) Module() module.Version { - if len(e.stack) == 0 { - return module.Version{} - } - return e.stack[len(e.stack)-1].m -} - -func (e *BuildListError) Error() string { - b := &strings.Builder{} - stack := e.stack - - // Don't print modules at the beginning of the chain without a - // version. These always seem to be the main module or a - // synthetic module ("target@"). - for len(stack) > 0 && stack[0].m.Version == "" { - stack = stack[1:] - } - - if len(stack) == 0 { - b.WriteString(e.Err.Error()) - } else { - for _, elem := range stack[:len(stack)-1] { - fmt.Fprintf(b, "%s@%s %s\n\t", elem.m.Path, elem.m.Version, elem.nextReason) - } - // Ensure that the final module path and version are included as part of the - // error message. - if _, ok := e.Err.(*module.ModuleError); ok { - fmt.Fprintf(b, "%v", e.Err) - } else { - fmt.Fprintf(b, "%v", module.VersionError(stack[len(stack)-1].m, e.Err)) - } - } - return b.String() -} - // BuildList returns the build list for the target module. // // target is the root vertex of a module requirement graph. For cmd/go, this is @@ -202,29 +148,30 @@ func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) (m q = q[1:] if node.err != nil { - // Construct the stack reversed (from the error to the main module), + pathUpgrade := map[module.Version]module.Version{} + + // Construct the error path reversed (from the error to the main module), // then reverse it to obtain the usual order (from the main module to // the error). - stack := []buildListErrorElem{{m: node.m}} + errPath := []module.Version{node.m} for n, prev := neededBy[node], node; n != nil; n, prev = neededBy[n], n { - reason := "requires" if n.upgrade == prev.m { - reason = "updating to" + pathUpgrade[n.m] = prev.m } - stack = append(stack, buildListErrorElem{m: n.m, nextReason: reason}) + errPath = append(errPath, n.m) } - i, j := 0, len(stack)-1 + i, j := 0, len(errPath)-1 for i < j { - stack[i], stack[j] = stack[j], stack[i] + errPath[i], errPath[j] = errPath[j], errPath[i] i++ j-- } - err := &BuildListError{ - Err: node.err, - stack: stack, + isUpgrade := func(from, to module.Version) bool { + return pathUpgrade[from] == to } - return nil, err + + return nil, NewBuildListError(node.err, errPath, isUpgrade) } neighbors := node.required -- GitLab From c777863f77bb77be2e6c336b78dee2089647ff0e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 4 Aug 2020 23:53:01 -0400 Subject: [PATCH 0314/1792] cmd/go/internal/mvs: indicate the actual version when printing a mismatched ModuleError Previously, we suppressed the module version annotation if the last error in the stack was a *module.ModuleError, regardless of its path. However, if the error is for a replacement module, that produces a confusing error message: the error is attributed to the last module in the error path, but actually originates in the replacement (which is not otherwise indicated). Now, we print both the original and the replacement modules when they differ, which may add some unfortunate redundancy in the output but at least doesn't drop the very relevant information about replacements. Fixes #35039 Change-Id: I631a7398033602b1bd5656150a4fad4945a87ade Reviewed-on: https://go-review.googlesource.com/c/go/+/247765 Reviewed-by: Jay Conrod --- src/cmd/go/internal/mvs/errors.go | 17 +++++++++++------ .../script/mod_load_replace_mismatch.txt | 2 +- .../go/testdata/script/mod_replace_gopkgin.txt | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/cmd/go/internal/mvs/errors.go b/src/cmd/go/internal/mvs/errors.go index 8577902878..5564965fb5 100644 --- a/src/cmd/go/internal/mvs/errors.go +++ b/src/cmd/go/internal/mvs/errors.go @@ -78,16 +78,21 @@ func (e *BuildListError) Error() string { b.WriteString(e.Err.Error()) } else { for _, elem := range stack[:len(stack)-1] { - fmt.Fprintf(b, "%s@%s %s\n\t", elem.m.Path, elem.m.Version, elem.nextReason) + fmt.Fprintf(b, "%s %s\n\t", elem.m, elem.nextReason) } // Ensure that the final module path and version are included as part of the // error message. m := stack[len(stack)-1].m - if _, ok := e.Err.(*module.ModuleError); ok { - // TODO(bcmills): Also ensure that the module path and version match. - // (Otherwise, we may be reporting an error from a replacement without - // indicating the replacement path.) - fmt.Fprintf(b, "%v", e.Err) + if mErr, ok := e.Err.(*module.ModuleError); ok { + actual := module.Version{Path: mErr.Path, Version: mErr.Version} + if v, ok := mErr.Err.(*module.InvalidVersionError); ok { + actual.Version = v.Version + } + if actual == m { + fmt.Fprintf(b, "%v", e.Err) + } else { + fmt.Fprintf(b, "%s (replaced by %s): %v", m, actual, mErr.Err) + } } else { fmt.Fprintf(b, "%v", module.VersionError(m, e.Err)) } diff --git a/src/cmd/go/testdata/script/mod_load_replace_mismatch.txt b/src/cmd/go/testdata/script/mod_load_replace_mismatch.txt index 74dbb34b8a..067e209b01 100644 --- a/src/cmd/go/testdata/script/mod_load_replace_mismatch.txt +++ b/src/cmd/go/testdata/script/mod_load_replace_mismatch.txt @@ -18,6 +18,6 @@ package use import _ "rsc.io/quote" -- want -- -go: example.com/quote@v1.5.2: parsing go.mod: +go: rsc.io/quote@v1.5.2 (replaced by example.com/quote@v1.5.2): parsing go.mod: module declares its path as: rsc.io/Quote but was required as: rsc.io/quote diff --git a/src/cmd/go/testdata/script/mod_replace_gopkgin.txt b/src/cmd/go/testdata/script/mod_replace_gopkgin.txt index 28c1196284..674c99cb0c 100644 --- a/src/cmd/go/testdata/script/mod_replace_gopkgin.txt +++ b/src/cmd/go/testdata/script/mod_replace_gopkgin.txt @@ -34,7 +34,7 @@ go list -m gopkg.in/src-d/go-git.v4 # A mismatched gopkg.in path should not be able to replace a different major version. cd ../3-to-gomod-4 ! go list -m gopkg.in/src-d/go-git.v3 -stderr '^go: gopkg\.in/src-d/go-git\.v3@v3.0.0-20190801152248-0d1a009cbb60: invalid version: go\.mod has non-\.\.\.\.v3 module path "gopkg\.in/src-d/go-git\.v4" at revision 0d1a009cbb60$' +stderr '^go: gopkg\.in/src-d/go-git\.v3@v3\.2\.0 \(replaced by gopkg\.in/src-d/go-git\.v3@v3\.0\.0-20190801152248-0d1a009cbb60\): version "v3\.0\.0-20190801152248-0d1a009cbb60" invalid: go\.mod has non-\.\.\.\.v3 module path "gopkg\.in/src-d/go-git\.v4" at revision 0d1a009cbb60$' -- 4-to-4/go.mod -- module golang.org/issue/34254 -- GitLab From 2a9636dc2bdbb2865dde686352de528c6953c7bf Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 21 Jul 2020 16:50:59 -0400 Subject: [PATCH 0315/1792] cmd/go/internal/modload: cache the Go language version for each module globally Previously, this cache was a member of the (ephemeral) modload.loader struct. However, the Go language version for a given module version does not vary based on the build list, the set of loaded packages, the build tags in use, the meaning of the "all" pattern, or anything else that can be configured for an instance of the package loader. The map containing that information is therefore not appropriate as a field of the (configurable, package-list-dependent) loader struct. The Go language version mapping could, in theory, be read from the go.mod file in the module cache (or replacement directory) every time it is needed: this map is just a cache, and as such it belongs alongside the other caches and indexes in the modload package, which are currently found in modfile.go. We may want to do the same sort of global caching for the mapping from each module.Version to its list of direct requirements (which are similarly idempotent), but for now that is left for a future change. For #36460 For #36876 Change-Id: I90ac176ffea97f30c47d6540c3dfb874dc9cfa4f Reviewed-on: https://go-review.googlesource.com/c/go/+/244078 Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/build.go | 15 ++++++++++----- src/cmd/go/internal/modload/load.go | 10 +--------- src/cmd/go/internal/modload/modfile.go | 7 +++++++ src/cmd/go/internal/modload/mvs.go | 8 +++----- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index a101681a1f..b6f955d591 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -126,8 +126,8 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi Version: m.Version, Indirect: fromBuildList && loaded != nil && !loaded.direct[m.Path], } - if loaded != nil { - info.GoVersion = loaded.goVersion[m.Path] + if v, ok := rawGoVersion.Load(m); ok { + info.GoVersion = v.(string) } // completeFromModCache fills in the extra fields in m using the module cache. @@ -155,6 +155,8 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi } if !fromBuildList { + // If this was an explicitly-versioned argument to 'go mod download' or + // 'go list -m', report the actual requested version, not its replacement. completeFromModCache(info) // Will set m.Error in vendor mode. return info } @@ -178,9 +180,12 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi // worth the cost, and we're going to overwrite the GoMod and Dir from the // replacement anyway. See https://golang.org/issue/27859. info.Replace = &modinfo.ModulePublic{ - Path: r.Path, - Version: r.Version, - GoVersion: info.GoVersion, + Path: r.Path, + Version: r.Version, + } + if goV, ok := rawGoVersion.Load(r); ok { + info.Replace.GoVersion = goV.(string) + info.GoVersion = info.Replace.GoVersion } if r.Version == "" { if filepath.IsAbs(r.Path) { diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 686d491219..2a37f1d874 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -627,8 +627,7 @@ type loader struct { pkgCache *par.Cache // map from string to *loadPkg // computed at end of iterations - direct map[string]bool // imported directly by main module - goVersion map[string]string // go version recorded in each module + direct map[string]bool // imported directly by main module } // LoadTests controls whether the loaders load tests of the root packages. @@ -754,13 +753,6 @@ func (ld *loader) load(roots func() []string) { } } - // Add Go versions, computed during walk. - ld.goVersion = make(map[string]string) - for _, m := range buildList { - v, _ := reqs.(*mvsReqs).versions.Load(m) - ld.goVersion[m.Path], _ = v.(string) - } - // Mix in direct markings (really, lack of indirect markings) // from go.mod, unless we scanned the whole module // and can therefore be sure we know better than go.mod. diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index 9a166cae54..9ff00e9b5c 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -7,6 +7,7 @@ package modload import ( "cmd/go/internal/base" "cmd/go/internal/cfg" + "sync" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -164,3 +165,9 @@ func (i *modFileIndex) modFileIsDirty(modFile *modfile.File) bool { return false } + +// rawGoVersion records the Go version parsed from each module's go.mod file. +// +// If a module is replaced, the version of the replacement is keyed by the +// replacement module.Version, not the version being replaced. +var rawGoVersion sync.Map // map[module.Version]string diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 39d0d69524..873f5891c9 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -11,7 +11,6 @@ import ( "os" "path/filepath" "sort" - "sync" "cmd/go/internal/base" "cmd/go/internal/cfg" @@ -30,7 +29,6 @@ import ( type mvsReqs struct { buildList []module.Version cache par.Cache - versions sync.Map } // Reqs returns the current module requirement graph. @@ -83,7 +81,7 @@ func (r *mvsReqs) modFileToList(f *modfile.File) []module.Version { func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { if mod == Target { if modFile != nil && modFile.Go != nil { - r.versions.LoadOrStore(mod, modFile.Go.Version) + rawGoVersion.LoadOrStore(mod, modFile.Go.Version) } return append([]module.Version(nil), r.buildList[1:]...), nil } @@ -113,7 +111,7 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { return nil, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err) } if f.Go != nil { - r.versions.LoadOrStore(mod, f.Go.Version) + rawGoVersion.LoadOrStore(repl, f.Go.Version) } return r.modFileToList(f), nil } @@ -147,7 +145,7 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { but was required as: %s`, mpath, origPath)) } if f.Go != nil { - r.versions.LoadOrStore(mod, f.Go.Version) + rawGoVersion.LoadOrStore(mod, f.Go.Version) } return r.modFileToList(f), nil -- GitLab From a9146a49d0db666a7efd5f5d4555cf6117405cf5 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 23 Jul 2020 00:45:27 -0400 Subject: [PATCH 0316/1792] cmd/go/internal/modload: cache parsed go.mod files globally Previously they were cached per mvsReqs instance. However, the contents of the go.mod file of a given dependency version can only vary if the 'replace' directives that apply to that version have changed, and the only time we change 'replace' directives is in 'go mod edit' (which does not care about the build list or MVS). This not only simplifies the mvsReqs implementation, but also makes more of the underlying logic independent of mvsReqs. For #36460 Change-Id: Ieac20c2fcd56f64d847ac8a1b40f9361ece78663 Reviewed-on: https://go-review.googlesource.com/c/go/+/244774 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/build.go | 15 +- src/cmd/go/internal/modload/modfile.go | 171 ++++++++++++++++++ src/cmd/go/internal/modload/mvs.go | 109 +---------- .../testdata/script/mod_invalid_version.txt | 4 +- 4 files changed, 190 insertions(+), 109 deletions(-) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index b6f955d591..7e182b4a4d 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -132,6 +132,8 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi // completeFromModCache fills in the extra fields in m using the module cache. completeFromModCache := func(m *modinfo.ModulePublic) { + mod := module.Version{Path: m.Path, Version: m.Version} + if m.Version != "" { if q, err := Query(ctx, m.Path, m.Version, "", nil); err != nil { m.Error = &modinfo.ModuleError{Err: err.Error()} @@ -140,7 +142,6 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi m.Time = &q.Time } - mod := module.Version{Path: m.Path, Version: m.Version} gomod, err := modfetch.CachePath(mod, "mod") if err == nil { if info, err := os.Stat(gomod); err == nil && info.Mode().IsRegular() { @@ -152,6 +153,12 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi m.Dir = dir } } + + if m.GoVersion == "" { + if summary, err := rawGoModSummary(mod); err == nil && summary.goVersionV != "" { + m.GoVersion = summary.goVersionV[1:] + } + } } if !fromBuildList { @@ -183,9 +190,8 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi Path: r.Path, Version: r.Version, } - if goV, ok := rawGoVersion.Load(r); ok { - info.Replace.GoVersion = goV.(string) - info.GoVersion = info.Replace.GoVersion + if v, ok := rawGoVersion.Load(m); ok { + info.Replace.GoVersion = v.(string) } if r.Version == "" { if filepath.IsAbs(r.Path) { @@ -200,6 +206,7 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi info.Dir = info.Replace.Dir info.GoMod = info.Replace.GoMod } + info.GoVersion = info.Replace.GoVersion return info } diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index 9ff00e9b5c..c04e2add13 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -7,10 +7,17 @@ package modload import ( "cmd/go/internal/base" "cmd/go/internal/cfg" + "cmd/go/internal/lockedfile" + "cmd/go/internal/modfetch" + "cmd/go/internal/par" + "errors" + "fmt" + "path/filepath" "sync" "golang.org/x/mod/modfile" "golang.org/x/mod/module" + "golang.org/x/mod/semver" ) var modFile *modfile.File @@ -171,3 +178,167 @@ func (i *modFileIndex) modFileIsDirty(modFile *modfile.File) bool { // If a module is replaced, the version of the replacement is keyed by the // replacement module.Version, not the version being replaced. var rawGoVersion sync.Map // map[module.Version]string + +// A modFileSummary is a summary of a go.mod file for which we do not need to +// retain complete information — for example, the go.mod file of a dependency +// module. +type modFileSummary struct { + module module.Version + goVersionV string // GoVersion with "v" prefix + require []module.Version +} + +// goModSummary returns a summary of the go.mod file for module m, +// taking into account any replacements for m, exclusions of its dependencies, +// and or vendoring. +// +// goModSummary cannot be used on the Target module, as its requirements +// may change. +// +// The caller must not modify the returned summary. +func goModSummary(m module.Version) (*modFileSummary, error) { + if m == Target { + panic("internal error: goModSummary called on the Target module") + } + + type cached struct { + summary *modFileSummary + err error + } + c := goModSummaryCache.Do(m, func() interface{} { + if cfg.BuildMod == "vendor" { + summary := &modFileSummary{ + module: module.Version{Path: m.Path}, + } + 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. + return cached{summary, nil} + } + + // For every module other than the target, + // return the full list of modules from modules.txt. + readVendorList() + + // TODO(#36876): Load the "go" version from vendor/modules.txt and store it + // in rawGoVersion with the appropriate key. + + // We don't know what versions the vendored module actually relies on, + // so assume that it requires everything. + summary.require = vendorList + return cached{summary, nil} + } + + actual := Replacement(m) + if actual.Path == "" { + actual = m + } + summary, err := rawGoModSummary(actual) + if err != nil { + return cached{nil, err} + } + + if actual.Version == "" { + // The actual module is a filesystem-local replacement, for which we have + // unfortunately not enforced any sort of invariants about module lines or + // matching module paths. Anything goes. + // + // TODO(bcmills): Remove this special-case, update tests, and add a + // release note. + } else { + if summary.module.Path == "" { + return cached{nil, module.VersionError(actual, errors.New("parsing go.mod: missing module line"))} + } + + // In theory we should only allow mpath to be unequal to mod.Path here if the + // version that we fetched lacks an explicit go.mod file: if the go.mod file + // is explicit, then it should match exactly (to ensure that imports of other + // packages within the module are interpreted correctly). Unfortunately, we + // can't determine that information from the module proxy protocol: we'll have + // 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 cached{nil, module.VersionError(actual, fmt.Errorf(`parsing go.mod: + module declares its path as: %s + but was required as: %s`, mpath, m.Path))} + } + } + + if index != nil && len(index.exclude) > 0 { + // Drop any requirements on excluded versions. + nonExcluded := summary.require[:0] + for _, r := range summary.require { + if !index.exclude[r] { + nonExcluded = append(nonExcluded, r) + } + } + summary.require = nonExcluded + } + return cached{summary, nil} + }).(cached) + + return c.summary, c.err +} + +var goModSummaryCache par.Cache // module.Version → goModSummary result + +// rawGoModSummary returns a new summary of the go.mod file for module m, +// ignoring all replacements that may apply to m and excludes that may apply to +// its dependencies. +// +// rawGoModSummary cannot be used on the Target module. +func rawGoModSummary(m module.Version) (*modFileSummary, error) { + if m == Target { + panic("internal error: rawGoModSummary called on the Target module") + } + + summary := new(modFileSummary) + var f *modfile.File + if m.Version == "" { + // m is a replacement module with only a file path. + dir := m.Path + if !filepath.IsAbs(dir) { + dir = filepath.Join(ModRoot(), dir) + } + gomod := filepath.Join(dir, "go.mod") + + data, err := lockedfile.Read(gomod) + if err != nil { + return nil, module.VersionError(m, fmt.Errorf("reading %s: %v", base.ShortPath(gomod), err)) + } + f, err = modfile.ParseLax(gomod, data, nil) + if err != nil { + return nil, module.VersionError(m, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err)) + } + } else { + if !semver.IsValid(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) + } + + data, err := modfetch.GoMod(m.Path, m.Version) + if err != nil { + return nil, err + } + f, err = modfile.ParseLax("go.mod", data, nil) + if err != nil { + return nil, module.VersionError(m, fmt.Errorf("parsing go.mod: %v", err)) + } + } + + if f.Module != nil { + summary.module = f.Module.Mod + } + if f.Go != nil && f.Go.Version != "" { + rawGoVersion.LoadOrStore(m, f.Go.Version) + summary.goVersionV = "v" + f.Go.Version + } + if len(f.Require) > 0 { + summary.require = make([]module.Version, 0, len(f.Require)) + for _, req := range f.Require { + summary.require = append(summary.require, req.Mod) + } + } + + return summary, nil +} diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 873f5891c9..6b6ad945e4 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -6,20 +6,15 @@ package modload import ( "context" - "errors" "fmt" "os" "path/filepath" "sort" - "cmd/go/internal/base" - "cmd/go/internal/cfg" - "cmd/go/internal/lockedfile" "cmd/go/internal/modfetch" "cmd/go/internal/mvs" "cmd/go/internal/par" - "golang.org/x/mod/modfile" "golang.org/x/mod/module" "golang.org/x/mod/semver" ) @@ -28,7 +23,7 @@ import ( // with any exclusions or replacements applied internally. type mvsReqs struct { buildList []module.Version - cache par.Cache + cache par.Cache // module.Version → Required method results } // Reqs returns the current module requirement graph. @@ -42,113 +37,21 @@ func Reqs() mvs.Reqs { } func (r *mvsReqs) Required(mod module.Version) ([]module.Version, error) { - type cached struct { - list []module.Version - err error - } - - c := r.cache.Do(mod, func() interface{} { - list, err := r.required(mod) - if err != nil { - return cached{nil, err} - } - if index != nil && len(index.exclude) > 0 { - // Drop requirements on excluded versions. - nonExcluded := list[:0] - for _, r := range list { - if !index.exclude[r] { - nonExcluded = append(nonExcluded, r) - } - } - list = nonExcluded - } - - return cached{list, nil} - }).(cached) - - return c.list, c.err -} - -func (r *mvsReqs) modFileToList(f *modfile.File) []module.Version { - list := make([]module.Version, 0, len(f.Require)) - for _, r := range f.Require { - list = append(list, r.Mod) - } - return list -} - -// required returns a unique copy of the requirements of mod. -func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { if mod == Target { - if modFile != nil && modFile.Go != nil { - rawGoVersion.LoadOrStore(mod, modFile.Go.Version) - } - return append([]module.Version(nil), r.buildList[1:]...), nil - } - - if cfg.BuildMod == "vendor" { - // For every module other than the target, - // return the full list of modules from modules.txt. - readVendorList() - return append([]module.Version(nil), vendorList...), nil - } - - origPath := mod.Path - if repl := Replacement(mod); repl.Path != "" { - if repl.Version == "" { - // TODO: need to slip the new version into the tags list etc. - dir := repl.Path - if !filepath.IsAbs(dir) { - dir = filepath.Join(ModRoot(), dir) - } - gomod := filepath.Join(dir, "go.mod") - data, err := lockedfile.Read(gomod) - if err != nil { - return nil, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err) - } - f, err := modfile.ParseLax(gomod, data, nil) - if err != nil { - return nil, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err) - } - if f.Go != nil { - rawGoVersion.LoadOrStore(repl, f.Go.Version) - } - return r.modFileToList(f), nil - } - mod = repl + // Use the build list as it existed when r was constructed, not the current + // global build list. + return r.buildList[1:], nil } if mod.Version == "none" { return nil, nil } - if !semver.IsValid(mod.Version) { - // Disallow the broader queries supported by fetch.Lookup. - base.Fatalf("go: internal error: %s@%s: unexpected invalid semantic version", mod.Path, mod.Version) - } - - data, err := modfetch.GoMod(mod.Path, mod.Version) + summary, err := goModSummary(mod) if err != nil { return nil, err } - f, err := modfile.ParseLax("go.mod", data, nil) - if err != nil { - return nil, module.VersionError(mod, fmt.Errorf("parsing go.mod: %v", err)) - } - - if f.Module == nil { - return nil, module.VersionError(mod, errors.New("parsing go.mod: missing module line")) - } - if mpath := f.Module.Mod.Path; mpath != origPath && mpath != mod.Path { - return nil, module.VersionError(mod, fmt.Errorf(`parsing go.mod: - module declares its path as: %s - but was required as: %s`, mpath, origPath)) - } - if f.Go != nil { - rawGoVersion.LoadOrStore(mod, f.Go.Version) - } - - return r.modFileToList(f), nil + return summary.require, nil } // Max returns the maximum of v1 and v2 according to semver.Compare. diff --git a/src/cmd/go/testdata/script/mod_invalid_version.txt b/src/cmd/go/testdata/script/mod_invalid_version.txt index 7e1bc9ea4f..6dddd4b036 100644 --- a/src/cmd/go/testdata/script/mod_invalid_version.txt +++ b/src/cmd/go/testdata/script/mod_invalid_version.txt @@ -18,7 +18,7 @@ cp go.mod.orig go.mod go mod edit -require golang.org/x/text@14c0d48ead0c cd outside ! go list -m golang.org/x/text -stderr 'go: example.com@v0.0.0: parsing ../go.mod: '$WORK'/gopath/src/go.mod:5: require golang.org/x/text: version "14c0d48ead0c" invalid: must be of the form v1.2.3' +stderr 'go: example.com@v0.0.0 \(replaced by \./\..\): parsing ../go.mod: '$WORK'/gopath/src/go.mod:5: require golang.org/x/text: version "14c0d48ead0c" invalid: must be of the form v1.2.3' cd .. go list -m golang.org/x/text stdout 'golang.org/x/text v0.1.1-0.20170915032832-14c0d48ead0c' @@ -46,7 +46,7 @@ cp go.mod.orig go.mod go mod edit -require golang.org/x/text@v2.1.1-0.20170915032832-14c0d48ead0c cd outside ! go list -m golang.org/x/text -stderr 'go: example.com@v0.0.0: 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' +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' -- GitLab From 865d72f962fffbba326067e803ca30193b63bd3a Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 21 Feb 2020 12:23:47 -0500 Subject: [PATCH 0317/1792] cmd/go: add baseline test cases for non-lazy module loading For #36460 For #40799 Change-Id: Id55934cc4d66743a4087b4c2644b6c3b95e7d2ce Reviewed-on: https://go-review.googlesource.com/c/go/+/222341 Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/testdata/script/mod_all.txt | 296 ++++++++++++++++++ .../script/mod_lazy_import_allmod.txt | 155 +++++++++ .../script/mod_lazy_import_test_dep.txt | 159 ++++++++++ .../testdata/script/mod_lazy_new_import.txt | 89 ++++++ .../go/testdata/script/mod_lazy_test_all.txt | 125 ++++++++ .../testdata/script/mod_lazy_test_horizon.txt | 115 +++++++ .../script/mod_lazy_test_of_test_dep.txt | 118 +++++++ src/cmd/go/testdata/script/mod_notall.txt | 98 ++++++ 8 files changed, 1155 insertions(+) create mode 100644 src/cmd/go/testdata/script/mod_all.txt create mode 100644 src/cmd/go/testdata/script/mod_lazy_import_allmod.txt create mode 100644 src/cmd/go/testdata/script/mod_lazy_import_test_dep.txt create mode 100644 src/cmd/go/testdata/script/mod_lazy_new_import.txt create mode 100644 src/cmd/go/testdata/script/mod_lazy_test_all.txt create mode 100644 src/cmd/go/testdata/script/mod_lazy_test_horizon.txt create mode 100644 src/cmd/go/testdata/script/mod_lazy_test_of_test_dep.txt create mode 100644 src/cmd/go/testdata/script/mod_notall.txt diff --git a/src/cmd/go/testdata/script/mod_all.txt b/src/cmd/go/testdata/script/mod_all.txt new file mode 100644 index 0000000000..a219913094 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_all.txt @@ -0,0 +1,296 @@ +# This test illustrates the relationship between the 'all' pattern and +# the dependencies of the main module. + +env PKGFMT='{{if .Module}}{{.ImportPath}}{{end}}' +env MODFMT='{{.Path}}' + + +# 'go list -deps' lists packages and tests in the main module, +# along with their transitive dependencies. + +go list -f $PKGFMT -deps ./... +stdout -count=4 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/main$' +stdout '^example.com/main/testonly' + + +# 'go list -deps -test' lists transitive imports of tests and non-tests in the +# main module. + +go list -f $PKGFMT -deps -test ./... +stdout -count=13 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/main$' +stdout '^example.com/main.test$' +stdout '^example.com/main \[example.com/main.test\]$' +stdout '^example.com/main_test \[example.com/main.test\]$' +stdout '^example.com/main/testonly$' +stdout '^example.com/main/testonly.test$' +stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/t$' +stdout '^example.com/u$' + + +# 'go list all' lists the fixpoint of iterating 'go list -deps -test' starting +# with the packages in the main module, then reducing to only the non-test +# variants of those packages. + +go list -f $PKGFMT all +stdout -count=11 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/c$' +stdout '^example.com/main$' +stdout '^example.com/main/testonly$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/s$' +stdout '^example.com/t$' +stdout '^example.com/u$' +stdout '^example.com/w$' + + +# 'go list -test all' is equivalent to 'go list -test $(go list all)' +# and both should include tests for every package in 'all'. + +go list -test -f $PKGFMT example.com/a example.com/b example.com/c example.com/main example.com/main/testonly example.com/q example.com/r example.com/s example.com/t example.com/u example.com/w +cp stdout list-test-explicit.txt + +go list -test -f $PKGFMT all +cmp stdout list-test-explicit.txt +stdout -count=34 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/c$' +stdout '^example.com/main$' +stdout '^example.com/main/testonly$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/s$' +stdout '^example.com/t$' +stdout '^example.com/u$' +stdout '^example.com/w$' +stdout '^example.com/a.test$' +stdout '^example.com/a_test \[example.com/a.test\]$' +stdout '^example.com/b.test$' +stdout '^example.com/b_test \[example.com/b.test\]$' +stdout '^example.com/c.test$' +stdout '^example.com/c_test \[example.com/c.test\]$' +stdout '^example.com/main.test$' +stdout '^example.com/main \[example.com/main.test\]$' +stdout '^example.com/main_test \[example.com/main.test\]$' +stdout '^example.com/main/testonly.test$' +stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' +stdout '^example.com/q.test$' +stdout '^example.com/q_test \[example.com/q.test\]$' +stdout '^example.com/r.test$' +stdout '^example.com/r_test \[example.com/r.test\]$' +stdout '^example.com/s.test$' +stdout '^example.com/s_test \[example.com/s.test\]$' +stdout '^example.com/t.test$' +stdout '^example.com/t_test \[example.com/t.test\]$' +stdout '^example.com/u.test$' +stdout '^example.com/u_test \[example.com/u.test\]$' +stdout '^example.com/w.test$' +stdout '^example.com/w_test \[example.com/w.test\]$' + + +# 'go list -m all' covers the packages in 'go list -test -deps all'. + +go list -m -f $MODFMT all +stdout -count=10 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/c$' +stdout '^example.com/main$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/s$' +stdout '^example.com/t$' +stdout '^example.com/u$' +stdout '^example.com/w$' + + +# 'go mod vendor' copies in only the packages transitively imported by the main +# module, and omits their tests. As a result, the 'all' and '...' patterns +# report fewer packages when using '-mod=vendor'. + +go mod vendor + +go list -f $PKGFMT -mod=vendor all +stdout -count=8 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/main$' +stdout '^example.com/main/testonly$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/t$' +stdout '^example.com/u$' + +go list -test -f $PKGFMT -mod=vendor all +stdout -count=13 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/main$' +stdout '^example.com/main/testonly$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/t$' +stdout '^example.com/u$' +stdout '^example.com/main.test$' +stdout '^example.com/main \[example.com/main.test\]$' +stdout '^example.com/main_test \[example.com/main.test\]$' +stdout '^example.com/main/testonly.test$' +stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' + +# TODO(#36460): + +# With lazy loading, 'go list all' without -mod=vendor should match +# 'go mod vendor'. + +# 'go list -test all' should expand that to cover test dependencies +# of packages imported by the main module. + +# 'go list -m all' should cover the packages in 'go list -test all'. + + +-- go.mod -- +module example.com/main + +go 1.15 + +require ( + example.com/a v0.1.0 + example.com/b v0.1.0 + example.com/q v0.1.0 + example.com/t v0.1.0 +) + +replace ( + example.com/a v0.1.0 => ./a + example.com/b v0.1.0 => ./b + example.com/c v0.1.0 => ./c + example.com/q v0.1.0 => ./q + example.com/r v0.1.0 => ./r + example.com/s v0.1.0 => ./s + example.com/t v0.1.0 => ./t + example.com/u v0.1.0 => ./u + example.com/w v0.1.0 => ./w +) +-- main.go -- +package main + +import _ "example.com/a" + +func main() {} +-- main_test.go -- +package main_test + +import _ "example.com/t" +-- testonly/testonly_test.go -- +package testonly_test + +import _ "example.com/q" +-- a/go.mod -- +module example.com/a + +go 1.15 + +require ( + example.com/b v0.1.0 + example.com/c v0.1.0 +) +-- a/a.go -- +package x + +import _ "example.com/b" +-- a/a_test.go -- +package x_test + +import _ "example.com/c" +-- b/go.mod -- +module example.com/b + +go 1.15 +-- b/b.go -- +package b +-- b/b_test.go -- +package b_test +-- c/go.mod -- +module example.com/c + +go 1.15 +-- c/c.go -- +package c +-- c/c_test.go -- +package c_test +-- q/go.mod -- +module example.com/q + +go 1.15 + +require ( + example.com/r v0.1.0 + example.com/s v0.1.0 +) +-- q/q.go -- +package q +import _ "example.com/r" +-- q/q_test.go -- +package q_test +import _ "example.com/s" +-- r/go.mod -- +module example.com/r + +go 1.15 +-- r/r.go -- +package r +-- r/r_test.go -- +package r_test +-- s/go.mod -- +module example.com/s + +go 1.15 +-- s/s.go -- +package s +-- s/s_test.go -- +package s_test +-- t/go.mod -- +module example.com/t + +go 1.15 + +require ( + example.com/u v0.1.0 + example.com/w v0.1.0 +) +-- t/t.go -- +package t + +import _ "example.com/u" +-- t/t_test.go -- +package t_test + +import _ "example.com/w" +-- u/go.mod -- +module example.com/u + +go 1.15 +-- u/u.go -- +package u +-- u/u_test.go -- +package u_test +-- w/go.mod -- +module example.com/w + +go 1.15 +-- w/w.go -- +package w +-- w/w_test.go -- +package w_test diff --git a/src/cmd/go/testdata/script/mod_lazy_import_allmod.txt b/src/cmd/go/testdata/script/mod_lazy_import_allmod.txt new file mode 100644 index 0000000000..aade00d602 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_lazy_import_allmod.txt @@ -0,0 +1,155 @@ +# This file demonstrates dependency resolution when the main module imports a +# new package from a previously-test-only dependency. +# +# When lazy loading is active, the loader will not load dependencies of any +# module whose packages are *only* imported by tests outside the main module. If +# the main module is changed to import a package from such a module, the +# dependencies of that module will need to be reloaded. + +# Control case: in Go 1.14, the original go.mod is tidy, +# and the dependency on c is eagerly loaded. + +cp go.mod go.mod.orig +go mod tidy +cmp go.mod.orig go.mod + +go list -m all +stdout '^a v0.1.0 ' +stdout '^b v0.1.0 ' +stdout '^c v0.1.0 ' + +# After adding a new import of b/y, +# the import of c from b/y should resolve to the version required by b. + +cp m.go m.go.orig +cp m.go.new m.go +go mod tidy +cmp go.mod.new go.mod + +go list -m all +stdout '^a v0.1.0 ' +stdout '^b v0.1.0 ' +stdout '^c v0.1.0 ' + +# With lazy loading, the go.mod requirements are the same, +# but the dependency on c is initially pruned out. + +cp m.go.orig m.go +cp go.mod.orig go.mod +go mod edit -go=1.16 +go mod edit -go=1.16 go.mod.new + +cp go.mod go.mod.orig +go mod tidy +cmp go.mod.orig go.mod + +go list -m all +stdout '^a v0.1.0 ' +stdout '^b v0.1.0 ' +stdout '^c v0.1.0 ' # TODO(#36460): This should be pruned out. + +# After adding a new import of b/y, +# the import of c from b/y should again resolve to the version required by b. + +cp m.go.new m.go +go mod tidy +cmp go.mod.new go.mod + +go list -m all +stdout '^a v0.1.0 ' +stdout '^b v0.1.0 ' +stdout '^c v0.1.0 ' + +-- m.go -- +package main + +import ( + "fmt" + + _ "a" // a_test imports b/x. +) + +func main() { +} +-- m.go.new -- +package main + +import ( + "fmt" + + _ "a" // a_test imports b/x. + "b/y" // This is a new import, not yet reflected in the go.mod file. +) + +func main() { + fmt.Println(b.CVersion()) +} +-- go.mod -- +module m + +go 1.14 + +require a v0.1.0 + +replace ( + a v0.1.0 => ./a1 + b v0.1.0 => ./b1 + c v0.1.0 => ./c1 + c v0.2.0 => ./c2 +) +-- go.mod.new -- +module m + +go 1.14 + +require ( + a v0.1.0 + b v0.1.0 +) + +replace ( + a v0.1.0 => ./a1 + b v0.1.0 => ./b1 + c v0.1.0 => ./c1 + c v0.2.0 => ./c2 +) +-- a1/go.mod -- +module a + +go 1.16 + +require b v0.1.0 +-- a1/a.go -- +package a +-- a1/a_test.go -- +package a_test + +import _ "b/x" +-- b1/go.mod -- +module b + +go 1.16 + +require c v0.1.0 +-- b1/x/x.go -- +package x +-- b1/y/y.go -- +package y + +import "c" + +func CVersion() string { + return c.Version +} +-- c1/go.mod -- +module c + +go 1.16 +-- c1/c.go -- +package c + +const Version = "v0.1.0" +-- c2/go.mod -- +This file should be unused. +-- c2/c.go -- +This file should be unused. diff --git a/src/cmd/go/testdata/script/mod_lazy_import_test_dep.txt b/src/cmd/go/testdata/script/mod_lazy_import_test_dep.txt new file mode 100644 index 0000000000..b7e3e6cb08 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_lazy_import_test_dep.txt @@ -0,0 +1,159 @@ +# This file demonstrates the go.mod changes needed to ensure reproducibility +# when running 'go test' on a sequence of packages for which each package in the +# sequence is a test-only dependency of the previous package, as a user might do +# if they encounter a test failure while fixing a bug found in one of their +# dependencies. + +cp go.mod go.mod.old +cp lazy.go lazy.go.old +go mod tidy +cmp go.mod go.mod.old + +# Before adding a new import, the go.mod file should +# enumerate modules for all packages already imported. +go list -m all +stdout '^example.com/d v0.1.0' # not v0.2.0 as would be resolved by 'latest' +cp stdout list.old +cmp go.mod go.mod.old + +# Following the chain of dependencies by listing test dependencies +# or running tests should not change the go.mod file. +go list -test -deps example.com/a +stdout '^example.com/a' +stdout '^example.com/b' +! stdout '^example.com/c' +[!short] go test -c example.com/a +cmp go.mod go.mod.old + +go list -test -deps example.com/b +stdout '^example.com/b' +stdout '^example.com/c' +! stdout '^example.com/d' +[!short] go test -c example.com/b +cmp go.mod go.mod.old + +go list -test -deps example.com/c +stdout '^example.com/c' +stdout '^example.com/d' +[!short] go test -c example.com/c +cmp go.mod go.mod.old + +# When we add a new import of a package already imported by a test of a test of +# a dependency, and that dependency is already tidy, its transitive dependencies +# should already be present. +cp lazy.go.new lazy.go +go list all +go list -m all +cmp stdout list.old +cmp go.mod go.mod.new # Indirect dependency promoted to direct. + +# TODO(#36460): + +cp lazy.go.old lazy.go +cp go.mod.old go.mod +go mod edit -go=1.16 + +# If we reach d by running successive tests, we should end up with exactly the +# version required by c, with an update to the go.mod file as soon as we load a +# dependency not found in the deepening scan. + +# However, if we skip directly to adding a new import of d, the dependency is +# too far away for a deepening scan to find, which is fine because the package +# whose test imported it wasn't even in "all". It should resolve from the latest +# version of its module. + +-- go.mod -- +module example.com/lazy + +go 1.14 + +require example.com/a v0.1.0 + +replace ( + example.com/a v0.1.0 => ./a + example.com/b v0.1.0 => ./b + example.com/c v0.1.0 => ./c + example.com/d v0.1.0 => ./d1 + example.com/d v0.2.0 => ./d2 +) +-- go.mod.new -- +module example.com/lazy + +go 1.14 + +require ( + example.com/a v0.1.0 + example.com/d v0.1.0 +) + +replace ( + example.com/a v0.1.0 => ./a + example.com/b v0.1.0 => ./b + example.com/c v0.1.0 => ./c + example.com/d v0.1.0 => ./d1 + example.com/d v0.2.0 => ./d2 +) +-- lazy.go -- +package lazy + +import ( + _ "example.com/a" +) + +func main() {} +-- lazy.go.new -- +package lazy + +import ( + _ "example.com/a" + "example.com/d" +) + +func main() { + println(d.Version) +} +-- a/go.mod -- +module example.com/a + +go 1.14 + +require example.com/b v0.1.0 +-- a/a.go -- +package a +import _ "example.com/b" +-- b/go.mod -- +module example.com/b + +go 1.16 + +require example.com/c v0.1.0 +-- b/b.go -- +package b +-- b/b_test.go -- +package b +import _ "example.com/c" +-- c/go.mod -- +module example.com/c + +go 1.16 + +require example.com/d v0.1.0 +-- c/c.go -- +package c +-- c/c_test.go -- +package c +import _ "example.com/d" +-- d1/go.mod -- +module example.com/d + +go 1.16 +-- d1/d.go -- +package d +const Version = "v0.1.0" +-- d2/go.mod -- +module example.com/d + +go 1.16 +-- d2/d.go -- +package d +const Version = "v0.2.0" diff --git a/src/cmd/go/testdata/script/mod_lazy_new_import.txt b/src/cmd/go/testdata/script/mod_lazy_new_import.txt new file mode 100644 index 0000000000..76b915afaa --- /dev/null +++ b/src/cmd/go/testdata/script/mod_lazy_new_import.txt @@ -0,0 +1,89 @@ +cp go.mod go.mod.old +cp lazy.go lazy.go.old +go mod tidy +cmp go.mod go.mod.old + +# Before adding a new import, the go.mod file should +# enumerate modules for all packages already imported. +go list all +cmp go.mod go.mod.old + +# When we add a new import of a package in an existing dependency, +# and that dependency is already tidy, its transitive dependencies +# should already be present. +cp lazy.go.new lazy.go +go list all +go list -m all +stdout '^example.com/c v0.1.0' # not v0.2.0 as would be be resolved by 'latest' +cmp go.mod go.mod.old + +# TODO(#36460): +cp lazy.go.old lazy.go +cp go.mod.old go.mod +go mod edit -go=1.16 + +# When a new import is found, we should perform a deepening scan of the existing +# dependencies and add a requirement on the version required by those +# dependencies — not re-resolve 'latest'. + + +-- go.mod -- +module example.com/lazy + +go 1.14 + +require example.com/a v0.1.0 + +replace ( + example.com/a v0.1.0 => ./a + example.com/b v0.1.0 => ./b + example.com/c v0.1.0 => ./c1 + example.com/c v0.2.0 => ./c2 +) +-- lazy.go -- +package lazy + +import ( + _ "example.com/a/x" +) +-- lazy.go.new -- +package lazy + +import ( + _ "example.com/a/x" + _ "example.com/a/y" +) +-- a/go.mod -- +module example.com/a + +go 1.14 + +require ( + example.com/b v0.1.0 + example.com/c v0.1.0 +) +-- a/x/x.go -- +package x +import _ "example.com/b" +-- a/y/y.go -- +package y +import _ "example.com/c" +-- b/go.mod -- +module example.com/b + +go 1.14 +-- b/b.go -- +package b +-- c1/go.mod -- +module example.com/c + +go 1.14 +-- c1/c.go -- +package c +-- c2/go.mod -- +module example.com/c + +go 1.14 +-- c2/c.go -- +package c +This file should not be used, so this syntax error should be ignored. diff --git a/src/cmd/go/testdata/script/mod_lazy_test_all.txt b/src/cmd/go/testdata/script/mod_lazy_test_all.txt new file mode 100644 index 0000000000..4ce9fb167b --- /dev/null +++ b/src/cmd/go/testdata/script/mod_lazy_test_all.txt @@ -0,0 +1,125 @@ +cp go.mod go.mod.old +go mod tidy +cmp go.mod go.mod.old + +# 'go list -m all' includes modules that cover the test dependencies of +# the packages imported by the main module. + +go list -m all +stdout 'example.com/b v0.1.0' +stdout 'example.com/c v0.1.0' +cmp go.mod go.mod.old + +# 'go test' (or equivalent) of any package in 'all' should use its existing +# dependencies without updating the go.mod file. + +go list all # Control case: example.com/b really is in 'all'. +stdout '^example.com/b$' +cmp go.mod go.mod.old # Already tidy, so dependencies shouldn't change. + +go list -test -deps example.com/b +stdout '^example.com/b$' +stdout '^example.com/c$' +! stdout '^example.com/d$' + +[!short] go test -c example.com/b + +cmp go.mod go.mod.old # Should have resolved the above without modifying go.mod. + + +# TODO(#36460): + +# 'go list -m all' should include modules that cover the test dependencies of +# the packages imported by the main module, found via a deepening scan. + +# 'go test' of any package in 'all' should use its existing dependencies without +# updating the go.mod file. This requires that we consider _dependencies of_ the +# explicit dependencies of the main module, and that we not record those +# dependencies explicitly after loading them. + + +-- go.mod -- +module example.com/lazy + +go 1.14 + +require example.com/a v0.1.0 + +replace ( + example.com/a v0.1.0 => ./a + example.com/b v0.1.0 => ./b1 + example.com/b v0.2.0 => ./b2 + example.com/c v0.1.0 => ./c + example.com/d v0.1.0 => ./d +) +-- lazy.go -- +package lazy + +import ( + _ "example.com/a/x" +) +-- a/go.mod -- +module example.com/a + +go 1.14 + +require example.com/b v0.1.0 +-- a/x/x.go -- +package x +-- a/x/x_test.go -- +package x + +import ( + "testing" + + _ "example.com/b" +) + +func TestUsingB(t *testing.T) { + // … +} +-- b1/go.mod -- +module example.com/b + +go 1.14 + +require example.com/c v0.1.0 +-- b1/b.go -- +package b +-- b1/b_test.go -- +package b + +import _ "example.com/c" +-- b2/go.mod -- +module example.com/b + +go 1.14 + +require example.com/c v0.1.0 +-- b2/b.go -- +package b +-- b2/b_test.go -- +package b + +import _ "example.com/c" + +This file should not be used, so this syntax error should be ignored. +-- c/go.mod -- +module example.com/c + +go 1.14 + +require example.com/d v0.1.0 +-- c/c.go -- +package c +-- c/c_test.go -- +package c +import _ "example.com/d" +This file should not be used, so this syntax error should be ignored. +-- d/go.mod -- +module example.com/d + +go 1.14 +-- d/d.go -- +package d +This file should not be used, so this syntax error should be ignored. diff --git a/src/cmd/go/testdata/script/mod_lazy_test_horizon.txt b/src/cmd/go/testdata/script/mod_lazy_test_horizon.txt new file mode 100644 index 0000000000..29fc0aaa74 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_lazy_test_horizon.txt @@ -0,0 +1,115 @@ +# This file demonstrates the effect of lazy loading on the selected +# versions of test dependencies. + +# Control case: in Go 1.14, the version of c imported by 'go test x' is the +# version required by module b, even though b_test is not relevant to the main +# module. (The main module imports a, and a_test imports b, but all of the +# packages and tests in the main module can be built without b.) + +go list -m c +stdout '^c v0.2.0 ' + +[!short] go test -v x +[!short] stdout ' c v0.2.0$' + +# With lazy loading, the go.mod requirements are the same, +# but the irrelevant dependency on c v0.2.0 should be pruned out, +# leaving only the relevant dependency on c v0.1.0. + +go mod edit -go=1.16 +go list -m c +stdout '^c v0.2.0' # TODO(#36460): v0.1.0 + +[!short] go test -v x +[!short] stdout ' c v0.2.0$' # TODO(#36460): v0.1.0 + +-- m.go -- +package m + +import ( + _ "a" + _ "x" +) +-- go.mod -- +module m + +go 1.14 + +require ( + a v0.1.0 + x v0.1.0 +) + +replace ( + a v0.1.0 => ./a1 + b v0.1.0 => ./b1 + c v0.1.0 => ./c1 + c v0.2.0 => ./c2 + x v0.1.0 => ./x1 +) +-- a1/go.mod -- +module a + +go 1.16 + +require b v0.1.0 +-- a1/a.go -- +package a +-- a1/a_test.go -- +package a_test + +import _ "b" +-- b1/go.mod -- +module b + +go 1.16 + +require c v0.2.0 +-- b1/b.go -- +package b +-- b1/b_test.go -- +package b_test + +import ( + "c" + "testing" +) + +func TestCVersion(t *testing.T) { + t.Log(c.Version) +} +-- c1/go.mod -- +module c + +go 1.16 +-- c1/c.go -- +package c + +const Version = "v0.1.0" +-- c2/go.mod -- +module c + +go 1.16 +-- c2/c.go -- +package c + +const Version = "v0.2.0" +-- x1/go.mod -- +module x + +go 1.16 + +require c v0.1.0 +-- x1/x.go -- +package x +-- x1/x_test.go -- +package x_test + +import ( + "c" + "testing" +) + +func TestCVersion(t *testing.T) { + t.Log("c", c.Version) +} diff --git a/src/cmd/go/testdata/script/mod_lazy_test_of_test_dep.txt b/src/cmd/go/testdata/script/mod_lazy_test_of_test_dep.txt new file mode 100644 index 0000000000..bbb0772303 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_lazy_test_of_test_dep.txt @@ -0,0 +1,118 @@ +cp go.mod go.mod.old +go mod tidy +cmp go.mod go.mod.old + +# In Go 1.14 mode, 'go list -m all' includes modules needed by the +# transitive closure of tests of dependencies of tests of dependencies of …. + +go list -m all +stdout 'example.com/b v0.1.0' +stdout 'example.com/c v0.1.0' +cmp go.mod go.mod.old + +# 'go test' (or equivalent) of any such dependency, no matter how remote, does +# not update the go.mod file. + +go list all +stdout example.com/a/x +stdout example.com/b # Test dependency of example.com/a/x. +stdout example.com/c # Test dependency of example.com/b. + +go list -test -deps all +stdout example.com/b +stdout example.com/c +cmp go.mod go.mod.old + +[!short] go test example.com/a/x +[!short] cmp go.mod go.mod.old + +[!short] go test example.com/b +[!short] cmp go.mod go.mod.old + +# TODO(#36460): + +# After changing to 'go 1.15` uniformly, 'go list -m all' should prune out +# example.com/c, because it is not imported by any package (or test of a package) +# transitively imported by the main module. +# example.com/a/x is transitively imported, +# and example.com/b is needed in order to run 'go test example.com/a/x', +# but example.com/c is not needed because we don't expect the user to need to run +# 'go test example.com/b'. + +-- go.mod -- +module example.com/lazy + +go 1.14 + +require example.com/a v0.1.0 + +replace ( + example.com/a v0.1.0 => ./a + 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 +) +-- lazy.go -- +package lazy + +import ( + _ "example.com/a/x" +) +-- a/go.mod -- +module example.com/a + +go 1.14 + +require example.com/b v0.1.0 +-- a/x/x.go -- +package x +-- a/x/x_test.go -- +package x + +import ( + "testing" + + _ "example.com/b" +) + +func TestUsingB(t *testing.T) { + // … +} +-- b1/go.mod -- +module example.com/b + +go 1.14 + +require example.com/c v0.1.0 +-- b1/b.go -- +package b +-- b1/b_test.go -- +package b + +import _ "example.com/c" +-- b2/go.mod -- +module example.com/b + +go 1.14 + +require example.com/c v0.1.0 +-- b2/b.go -- +package b +This file should not be used, so this syntax error should be ignored. +-- b2/b_test.go -- +package b +This file should not be used, so this syntax error should be ignored. +-- c1/go.mod -- +module example.com/c + +go 1.14 +-- c1/c.go -- +package c +-- c2/go.mod -- +module example.com/c + +go 1.14 +-- c2/c.go -- +package c +This file should not be used, so this syntax error should be ignored. diff --git a/src/cmd/go/testdata/script/mod_notall.txt b/src/cmd/go/testdata/script/mod_notall.txt new file mode 100644 index 0000000000..72a02485a4 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_notall.txt @@ -0,0 +1,98 @@ +# This test demonstrates go commands that combine the 'all' pattern +# with packages outside of 'all'. + +# With -deps, 'all' should include test dependencies of packages in the main +# module, but not should not include test dependencies of packages imported only +# by other root patterns. + +cp go.mod go.mod.orig + +go list -deps all x/otherroot + +stdout '^x/inall$' +stdout '^x/inall/fromtest$' +stdout '^x/inall/fromtestinall$' +stdout '^x/otherroot$' +stdout '^x/otherdep$' + +! stdout '^x/fromotherroottest$' +! stdout '^y/fromotherdeptest$' + +# TODO(#40799): cmp go.mod go.mod.orig + +# With -deps -test, test dependencies of other roots should be included, +# but test dependencies of non-roots should not. + +go list -deps -test all x/otherroot +stdout '^x/inall$' +stdout '^x/inall/fromtest$' +stdout '^x/inall/fromtestinall$' +stdout '^x/otherroot$' +stdout '^x/otherdep$' + +stdout '^x/fromotherroottest$' +! stdout '^y/fromotherdeptest$' + +# TODO(#40799): cmp go.mod go.mod.orig + +-- m.go -- +package m + +import _ "x/inall" +-- m_test.go -- +package m_test + +import _ "x/inall/fromtest" +-- go.mod -- +module m + +go 1.15 + +require x v0.1.0 + +replace ( + x v0.1.0 => ./x + y v0.1.0 => ./y +) +-- x/go.mod -- +module x + +go 1.15 +-- x/inall/inall.go -- +package inall +-- x/inall/inall_test.go -- +package inall_test + +import _ "x/inall/fromtestinall" +-- x/inall/fromtest/fromtest.go -- +package fromtest +-- x/inall/fromtestinall/fromtestinall.go -- +package fromtestinall +-- x/otherroot/otherroot.go -- +package otherroot + +import _ "x/otherdep" +-- x/otherroot/otherroot_test.go -- +package otherroot_test + +import _ "x/fromotherroottest" +-- x/fromotherroottest/fromotherroottest.go -- +package fromotherroottest +-- x/otherdep/otherdep.go -- +package otherdep +-- x/otherdep/otherdep_test.go -- +package otherdep_test + +import _ "y/fromotherdeptest" +-- x/otherroot/testonly/testonly.go -- +package testonly +-- y/go.mod -- +module y + +go 1.15 +-- y/fromotherdeptest/fromotherdeptest.go -- +// Package fromotherdeptest is a test dependency of x/otherdep that is +// not declared in x/go.mod. If the loader resolves this package, +// it will add this module to the main module's go.mod file, +// and we can detect the mistake. +package fromotherdeptest -- GitLab From 95df156e6ac53f98efd6c57e4586c1dfb43066dd Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 10 Aug 2020 15:11:07 -0400 Subject: [PATCH 0318/1792] cmd/go/internal/par: add Queue as a simpler alternative to Work par.Work performs two different tasks: deduplicating work (a task which overlaps with par.Cache), and executing limited active work in parallel. It also requires the caller to re-invoke Do whenever the workqueue transititions from empty to non-empty. The new par.Queue only performs the second of those two tasks, and presents a simpler API: it starts and stops its own goroutines as needed (indicating its idle state via a channel), rather than expecting the caller to drive the transitions explicitly. For #36460 Change-Id: I5c38657dda63ab55718497467d05d41744ff59f2 Reviewed-on: https://go-review.googlesource.com/c/go/+/247766 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/par/queue.go | 88 +++++++++++++++++++++++++++ src/cmd/go/internal/par/queue_test.go | 79 ++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 src/cmd/go/internal/par/queue.go create mode 100644 src/cmd/go/internal/par/queue_test.go diff --git a/src/cmd/go/internal/par/queue.go b/src/cmd/go/internal/par/queue.go new file mode 100644 index 0000000000..180bc75e34 --- /dev/null +++ b/src/cmd/go/internal/par/queue.go @@ -0,0 +1,88 @@ +// 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 par + +import "fmt" + +// Queue manages a set of work items to be executed in parallel. The number of +// active work items is limited, and excess items are queued sequentially. +type Queue struct { + maxActive int + st chan queueState +} + +type queueState struct { + active int // number of goroutines processing work; always nonzero when len(backlog) > 0 + backlog []func() + idle chan struct{} // if non-nil, closed when active becomes 0 +} + +// NewQueue returns a Queue that executes up to maxActive items in parallel. +// +// maxActive must be positive. +func NewQueue(maxActive int) *Queue { + if maxActive < 1 { + panic(fmt.Sprintf("par.NewQueue called with nonpositive limit (%d)", maxActive)) + } + + q := &Queue{ + maxActive: maxActive, + st: make(chan queueState, 1), + } + q.st <- queueState{} + return q +} + +// Add adds f as a work item in the queue. +// +// Add returns immediately, but the queue will be marked as non-idle until after +// f (and any subsequently-added work) has completed. +func (q *Queue) Add(f func()) { + st := <-q.st + if st.active == q.maxActive { + st.backlog = append(st.backlog, f) + q.st <- st + return + } + if st.active == 0 { + // Mark q as non-idle. + st.idle = nil + } + st.active++ + q.st <- st + + go func() { + for { + f() + + st := <-q.st + if len(st.backlog) == 0 { + if st.active--; st.active == 0 && st.idle != nil { + close(st.idle) + } + q.st <- st + return + } + f, st.backlog = st.backlog[0], st.backlog[1:] + q.st <- st + } + }() +} + +// Idle returns a channel that will be closed when q has no (active or enqueued) +// work outstanding. +func (q *Queue) Idle() <-chan struct{} { + st := <-q.st + defer func() { q.st <- st }() + + if st.idle == nil { + st.idle = make(chan struct{}) + if st.active == 0 { + close(st.idle) + } + } + + return st.idle +} diff --git a/src/cmd/go/internal/par/queue_test.go b/src/cmd/go/internal/par/queue_test.go new file mode 100644 index 0000000000..1331e65f98 --- /dev/null +++ b/src/cmd/go/internal/par/queue_test.go @@ -0,0 +1,79 @@ +// 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 par + +import ( + "sync" + "testing" +) + +func TestQueueIdle(t *testing.T) { + q := NewQueue(1) + select { + case <-q.Idle(): + default: + t.Errorf("NewQueue(1) is not initially idle.") + } + + started := make(chan struct{}) + unblock := make(chan struct{}) + q.Add(func() { + close(started) + <-unblock + }) + + <-started + idle := q.Idle() + select { + case <-idle: + t.Errorf("NewQueue(1) is marked idle while processing work.") + default: + } + + close(unblock) + <-idle // Should be closed as soon as the Add callback returns. +} + +func TestQueueBacklog(t *testing.T) { + const ( + maxActive = 2 + totalWork = 3 * maxActive + ) + + q := NewQueue(maxActive) + t.Logf("q = NewQueue(%d)", maxActive) + + var wg sync.WaitGroup + wg.Add(totalWork) + started := make([]chan struct{}, totalWork) + unblock := make(chan struct{}) + for i := range started { + started[i] = make(chan struct{}) + i := i + q.Add(func() { + close(started[i]) + <-unblock + wg.Done() + }) + } + + for i, c := range started { + if i < maxActive { + <-c // Work item i should be started immediately. + } else { + select { + case <-c: + t.Errorf("Work item %d started before previous items finished.", i) + default: + } + } + } + + close(unblock) + for _, c := range started[maxActive:] { + <-c + } + wg.Wait() +} -- GitLab From d9a6bdf7ef4d0dd15608427b0f7ba3c45c221a3c Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 21 Aug 2020 20:20:12 -0700 Subject: [PATCH 0319/1792] cmd/compile: don't allow go:notinheap on the heap or stack Right now we just prevent such types from being on the heap. This CL makes it so they cannot appear on the stack either. The distinction between heap and stack is pretty vague at the language level (e.g. it is affected by -N), and we don't need the flexibility anyway. Once go:notinheap types cannot be in either place, we don't need to consider pointers to such types to be pointers, at least according to the garbage collector and stack copying. (This is the big win of this CL, in my opinion.) The distinction between HasPointers and HasHeapPointer no longer exists. There is only HasPointers. This CL is cleanup before possible use of go:notinheap to fix #40954. Update #13386 Change-Id: Ibd895aadf001c0385078a6d4809c3f374991231a Reviewed-on: https://go-review.googlesource.com/c/go/+/249917 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky Reviewed-by: Cuong Manh Le --- src/cmd/compile/internal/gc/escape.go | 3 +++ src/cmd/compile/internal/gc/pgen_test.go | 10 +------- src/cmd/compile/internal/gc/plive.go | 14 ++++++------ src/cmd/compile/internal/gc/range.go | 2 +- src/cmd/compile/internal/gc/walk.go | 23 +++++++++---------- src/cmd/compile/internal/ssa/decompose.go | 2 +- src/cmd/compile/internal/ssa/gen/dec.rules | 4 ++-- src/cmd/compile/internal/ssa/nilcheck.go | 2 +- src/cmd/compile/internal/ssa/rewritedec.go | 7 +++--- src/cmd/compile/internal/ssa/writebarrier.go | 2 +- src/cmd/compile/internal/types/type.go | 24 +++++--------------- src/runtime/export_test.go | 7 +++--- src/runtime/mgcmark.go | 3 ++- src/runtime/mgcstack.go | 2 -- src/runtime/runtime2.go | 5 +--- test/notinheap2.go | 12 ++++++++-- 16 files changed, 54 insertions(+), 68 deletions(-) diff --git a/src/cmd/compile/internal/gc/escape.go b/src/cmd/compile/internal/gc/escape.go index ddf89f6159..d5cca4a38b 100644 --- a/src/cmd/compile/internal/gc/escape.go +++ b/src/cmd/compile/internal/gc/escape.go @@ -1029,6 +1029,9 @@ func (e *Escape) newLoc(n *Node, transient bool) *EscLocation { if e.curfn == nil { Fatalf("e.curfn isn't set") } + if n != nil && n.Type != nil && n.Type.NotInHeap() { + yyerrorl(n.Pos, "%v is go:notinheap; stack allocation disallowed", n.Type) + } n = canonicalNode(n) loc := &EscLocation{ diff --git a/src/cmd/compile/internal/gc/pgen_test.go b/src/cmd/compile/internal/gc/pgen_test.go index 41f0808a1c..b1db29825c 100644 --- a/src/cmd/compile/internal/gc/pgen_test.go +++ b/src/cmd/compile/internal/gc/pgen_test.go @@ -20,7 +20,7 @@ func typeWithoutPointers() *types.Type { func typeWithPointers() *types.Type { t := types.New(TSTRUCT) - f := &types.Field{Type: types.New(TPTR)} + f := &types.Field{Type: types.NewPtr(types.New(TINT))} t.SetFields([]*types.Field{f}) return t } @@ -181,14 +181,6 @@ func TestStackvarSort(t *testing.T) { nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO), nodeWithClass(Node{Type: typeWithoutPointers(), Sym: &types.Sym{}}, PAUTO), } - // haspointers updates Type.Haspointers as a side effect, so - // exercise this function on all inputs so that reflect.DeepEqual - // doesn't produce false positives. - for i := range want { - want[i].Type.HasPointers() - inp[i].Type.HasPointers() - } - sort.Sort(byStackVar(inp)) if !reflect.DeepEqual(want, inp) { t.Error("sort failed") diff --git a/src/cmd/compile/internal/gc/plive.go b/src/cmd/compile/internal/gc/plive.go index 398bfe5baa..8976ed657a 100644 --- a/src/cmd/compile/internal/gc/plive.go +++ b/src/cmd/compile/internal/gc/plive.go @@ -436,7 +436,7 @@ func (lv *Liveness) regEffects(v *ssa.Value) (uevar, kill liveRegMask) { case ssa.LocalSlot: return mask case *ssa.Register: - if ptrOnly && !v.Type.HasHeapPointer() { + if ptrOnly && !v.Type.HasPointers() { return mask } regs[0] = loc @@ -451,7 +451,7 @@ func (lv *Liveness) regEffects(v *ssa.Value) (uevar, kill liveRegMask) { if loc1 == nil { continue } - if ptrOnly && !v.Type.FieldType(i).HasHeapPointer() { + if ptrOnly && !v.Type.FieldType(i).HasPointers() { continue } regs[nreg] = loc1.(*ssa.Register) @@ -568,13 +568,13 @@ func onebitwalktype1(t *types.Type, off int64, bv bvec) { if t.Align > 0 && off&int64(t.Align-1) != 0 { Fatalf("onebitwalktype1: invalid initial alignment: type %v has alignment %d, but offset is %v", t, t.Align, off) } + if !t.HasPointers() { + // Note: this case ensures that pointers to go:notinheap types + // are not considered pointers by garbage collection and stack copying. + return + } switch t.Etype { - case TINT8, TUINT8, TINT16, TUINT16, - TINT32, TUINT32, TINT64, TUINT64, - TINT, TUINT, TUINTPTR, TBOOL, - TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128: - case TPTR, TUNSAFEPTR, TFUNC, TCHAN, TMAP: if off&int64(Widthptr-1) != 0 { Fatalf("onebitwalktype1: invalid alignment, %v", t) diff --git a/src/cmd/compile/internal/gc/range.go b/src/cmd/compile/internal/gc/range.go index d78a5f0d8d..5434b0167a 100644 --- a/src/cmd/compile/internal/gc/range.go +++ b/src/cmd/compile/internal/gc/range.go @@ -586,7 +586,7 @@ func arrayClear(n, v1, v2, a *Node) bool { n.Nbody.Append(nod(OAS, hn, tmp)) var fn *Node - if a.Type.Elem().HasHeapPointer() { + if a.Type.Elem().HasPointers() { // memclrHasPointers(hp, hn) Curfn.Func.setWBPos(stmt.Pos) fn = mkcall("memclrHasPointers", nil, nil, hp, hn) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 77f88d8996..90ecb50d6a 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -1156,6 +1156,9 @@ opswitch: } case ONEW: + if n.Type.Elem().NotInHeap() { + yyerror("%v is go:notinheap; heap allocation disallowed", n.Type.Elem()) + } if n.Esc == EscNone { if n.Type.Elem().Width >= maxImplicitStackVarSize { Fatalf("large ONEW with EscNone: %v", n) @@ -1324,6 +1327,9 @@ opswitch: l = r } t := n.Type + if t.Elem().NotInHeap() { + yyerror("%v is go:notinheap; heap allocation disallowed", t.Elem()) + } if n.Esc == EscNone { if !isSmallMakeSlice(n) { Fatalf("non-small OMAKESLICE with EscNone: %v", n) @@ -1365,10 +1371,6 @@ opswitch: // When len and cap can fit into int, use makeslice instead of // makeslice64, which is faster and shorter on 32 bit platforms. - if t.Elem().NotInHeap() { - yyerror("%v is go:notinheap; heap allocation disallowed", t.Elem()) - } - len, cap := l, r fnname := "makeslice64" @@ -1403,7 +1405,7 @@ opswitch: t := n.Type if t.Elem().NotInHeap() { - Fatalf("%v is go:notinheap; heap allocation disallowed", t.Elem()) + yyerror("%v is go:notinheap; heap allocation disallowed", t.Elem()) } length := conv(n.Left, types.Types[TINT]) @@ -2012,9 +2014,6 @@ func walkprint(nn *Node, init *Nodes) *Node { } func callnew(t *types.Type) *Node { - if t.NotInHeap() { - yyerror("%v is go:notinheap; heap allocation disallowed", t) - } dowidth(t) n := nod(ONEWOBJ, typename(t), nil) n.Type = types.NewPtr(t) @@ -2589,7 +2588,7 @@ func mapfast(t *types.Type) int { } switch algtype(t.Key()) { case AMEM32: - if !t.Key().HasHeapPointer() { + if !t.Key().HasPointers() { return mapfast32 } if Widthptr == 4 { @@ -2597,7 +2596,7 @@ func mapfast(t *types.Type) int { } Fatalf("small pointer %v", t.Key()) case AMEM64: - if !t.Key().HasHeapPointer() { + if !t.Key().HasPointers() { return mapfast64 } if Widthptr == 8 { @@ -2744,7 +2743,7 @@ func appendslice(n *Node, init *Nodes) *Node { nodes.Append(nod(OAS, s, nt)) var ncopy *Node - if elemtype.HasHeapPointer() { + if elemtype.HasPointers() { // copy(s[len(l1):], l2) nptr1 := nod(OSLICE, s, nil) nptr1.Type = s.Type @@ -3082,7 +3081,7 @@ func walkappend(n *Node, init *Nodes, dst *Node) *Node { // Also works if b is a string. // func copyany(n *Node, init *Nodes, runtimecall bool) *Node { - if n.Left.Type.Elem().HasHeapPointer() { + if n.Left.Type.Elem().HasPointers() { Curfn.Func.setWBPos(n.Pos) fn := writebarrierfn("typedslicecopy", n.Left.Type.Elem(), n.Right.Type.Elem()) n.Left = cheapexpr(n.Left, init) diff --git a/src/cmd/compile/internal/ssa/decompose.go b/src/cmd/compile/internal/ssa/decompose.go index c59ec4c77d..6e72e3825c 100644 --- a/src/cmd/compile/internal/ssa/decompose.go +++ b/src/cmd/compile/internal/ssa/decompose.go @@ -139,7 +139,7 @@ func decomposeStringPhi(v *Value) { func decomposeSlicePhi(v *Value) { types := &v.Block.Func.Config.Types - ptrType := types.BytePtr + ptrType := v.Type.Elem().PtrTo() lenType := types.Int ptr := v.Block.NewValue0(v.Pos, OpPhi, ptrType) diff --git a/src/cmd/compile/internal/ssa/gen/dec.rules b/src/cmd/compile/internal/ssa/gen/dec.rules index 3fd2be409f..4c677f8418 100644 --- a/src/cmd/compile/internal/ssa/gen/dec.rules +++ b/src/cmd/compile/internal/ssa/gen/dec.rules @@ -66,14 +66,14 @@ (Load (OffPtr [2*config.PtrSize] ptr) mem)) -(Store dst (SliceMake ptr len cap) mem) => +(Store {t} dst (SliceMake ptr len cap) mem) => (Store {typ.Int} (OffPtr [2*config.PtrSize] dst) cap (Store {typ.Int} (OffPtr [config.PtrSize] dst) len - (Store {typ.BytePtr} dst ptr mem))) + (Store {t.Elem().PtrTo()} dst ptr mem))) // interface ops (ITab (IMake itab _)) => itab diff --git a/src/cmd/compile/internal/ssa/nilcheck.go b/src/cmd/compile/internal/ssa/nilcheck.go index 6b24371ac7..d1bad529e7 100644 --- a/src/cmd/compile/internal/ssa/nilcheck.go +++ b/src/cmd/compile/internal/ssa/nilcheck.go @@ -235,7 +235,7 @@ func nilcheckelim2(f *Func) { continue } if v.Type.IsMemory() || v.Type.IsTuple() && v.Type.FieldType(1).IsMemory() { - if v.Op == OpVarKill || v.Op == OpVarLive || (v.Op == OpVarDef && !v.Aux.(GCNode).Typ().HasHeapPointer()) { + if v.Op == OpVarKill || v.Op == OpVarLive || (v.Op == OpVarDef && !v.Aux.(GCNode).Typ().HasPointers()) { // These ops don't really change memory. continue // Note: OpVarDef requires that the defined variable not have pointers. diff --git a/src/cmd/compile/internal/ssa/rewritedec.go b/src/cmd/compile/internal/ssa/rewritedec.go index cef781ffaa..e0fa9768d9 100644 --- a/src/cmd/compile/internal/ssa/rewritedec.go +++ b/src/cmd/compile/internal/ssa/rewritedec.go @@ -328,9 +328,10 @@ func rewriteValuedec_OpStore(v *Value) bool { v.AddArg3(v0, len, v1) return true } - // match: (Store dst (SliceMake ptr len cap) mem) - // result: (Store {typ.Int} (OffPtr [2*config.PtrSize] dst) cap (Store {typ.Int} (OffPtr [config.PtrSize] dst) len (Store {typ.BytePtr} dst ptr mem))) + // match: (Store {t} dst (SliceMake ptr len cap) mem) + // result: (Store {typ.Int} (OffPtr [2*config.PtrSize] dst) cap (Store {typ.Int} (OffPtr [config.PtrSize] dst) len (Store {t.Elem().PtrTo()} dst ptr mem))) for { + t := auxToType(v.Aux) dst := v_0 if v_1.Op != OpSliceMake { break @@ -350,7 +351,7 @@ func rewriteValuedec_OpStore(v *Value) bool { v2.AuxInt = int64ToAuxInt(config.PtrSize) v2.AddArg(dst) v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) - v3.Aux = typeToAux(typ.BytePtr) + v3.Aux = typeToAux(t.Elem().PtrTo()) v3.AddArg3(dst, ptr, mem) v1.AddArg3(v2, len, v3) v.AddArg3(v0, cap, v1) diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index c7fb059475..214798a1ab 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -31,7 +31,7 @@ func needwb(v *Value, zeroes map[ID]ZeroRegion) bool { if !ok { v.Fatalf("store aux is not a type: %s", v.LongString()) } - if !t.HasHeapPointer() { + if !t.HasPointers() { return false } if IsStackAddr(v.Args[0]) { diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go index 20ae856bba..e4b3d885d9 100644 --- a/src/cmd/compile/internal/types/type.go +++ b/src/cmd/compile/internal/types/type.go @@ -1398,14 +1398,9 @@ func (t *Type) IsUntyped() bool { return false } -// TODO(austin): We probably only need HasHeapPointer. See -// golang.org/cl/73412 for discussion. - +// HasPointers reports whether t contains a heap pointer. +// Note that this function ignores pointers to go:notinheap types. func (t *Type) HasPointers() bool { - return t.hasPointers1(false) -} - -func (t *Type) hasPointers1(ignoreNotInHeap bool) bool { switch t.Etype { case TINT, TUINT, TINT8, TUINT8, TINT16, TUINT16, TINT32, TUINT32, TINT64, TUINT64, TUINTPTR, TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128, TBOOL, TSSA: @@ -1415,34 +1410,27 @@ func (t *Type) hasPointers1(ignoreNotInHeap bool) bool { if t.NumElem() == 0 { // empty array has no pointers return false } - return t.Elem().hasPointers1(ignoreNotInHeap) + return t.Elem().HasPointers() case TSTRUCT: for _, t1 := range t.Fields().Slice() { - if t1.Type.hasPointers1(ignoreNotInHeap) { + if t1.Type.HasPointers() { return true } } return false case TPTR, TSLICE: - return !(ignoreNotInHeap && t.Elem().NotInHeap()) + return !t.Elem().NotInHeap() case TTUPLE: ttup := t.Extra.(*Tuple) - return ttup.first.hasPointers1(ignoreNotInHeap) || ttup.second.hasPointers1(ignoreNotInHeap) + return ttup.first.HasPointers() || ttup.second.HasPointers() } return true } -// HasHeapPointer reports whether t contains a heap pointer. -// This is used for write barrier insertion, so it ignores -// pointers to go:notinheap types. -func (t *Type) HasHeapPointer() bool { - return t.hasPointers1(true) -} - func (t *Type) Symbol() *obj.LSym { return TypeLinkSym(t) } diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index d591fdc4e9..3307000c51 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -981,9 +981,8 @@ func MapHashCheck(m interface{}, k interface{}) (uintptr, uintptr) { } func MSpanCountAlloc(bits []byte) int { - s := mspan{ - nelems: uintptr(len(bits) * 8), - gcmarkBits: (*gcBits)(unsafe.Pointer(&bits[0])), - } + s := (*mspan)(mheap_.spanalloc.alloc()) + s.nelems = uintptr(len(bits) * 8) + s.gcmarkBits = (*gcBits)(unsafe.Pointer(&bits[0])) return s.countAlloc() } diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 2b84945471..79df59d6d6 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -837,7 +837,8 @@ func scanstack(gp *g, gcw *gcWork) { x := state.head state.head = x.next if stackTraceDebug { - for _, obj := range x.obj[:x.nobj] { + for i := 0; i < x.nobj; i++ { + obj := &x.obj[i] if obj.typ == nil { // reachable continue } diff --git a/src/runtime/mgcstack.go b/src/runtime/mgcstack.go index 211d882fa6..8eb941a328 100644 --- a/src/runtime/mgcstack.go +++ b/src/runtime/mgcstack.go @@ -167,8 +167,6 @@ func (obj *stackObject) setType(typ *_type) { // A stackScanState keeps track of the state used during the GC walk // of a goroutine. -// -//go:notinheap type stackScanState struct { cache pcvalueCache diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index b7d0739e54..64c6cc7198 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -909,15 +909,12 @@ type _defer struct { // A _panic holds information about an active panic. // -// This is marked go:notinheap because _panic values must only ever -// live on the stack. +// A _panic value must only ever live on the stack. // // The argp and link fields are stack pointers, but don't need special // handling during stack growth: because they are pointer-typed and // _panic values only live on the stack, regular stack pointer // adjustment takes care of them. -// -//go:notinheap type _panic struct { argp unsafe.Pointer // pointer to arguments of deferred call run during panic; cannot move - known to liblink arg interface{} // argument to panic diff --git a/test/notinheap2.go b/test/notinheap2.go index 944f2993ab..de1e6db1d3 100644 --- a/test/notinheap2.go +++ b/test/notinheap2.go @@ -13,12 +13,14 @@ type nih struct { next *nih } -// Globals and stack variables are okay. +// Global variables are okay. var x nih +// Stack variables are not okay. + func f() { - var y nih + var y nih // ERROR "nih is go:notinheap; stack allocation disallowed" x = y } @@ -26,11 +28,17 @@ func f() { var y *nih var z []nih +var w []nih +var n int func g() { y = new(nih) // ERROR "heap allocation disallowed" z = make([]nih, 1) // ERROR "heap allocation disallowed" z = append(z, x) // ERROR "heap allocation disallowed" + // Test for special case of OMAKESLICECOPY + x := make([]nih, n) // ERROR "heap allocation disallowed" + copy(x, z) + z = x } // Writes don't produce write barriers. -- GitLab From c78d215ce38288afe382d38af11b6692ce44c368 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 26 Jun 2020 11:48:37 -0400 Subject: [PATCH 0320/1792] go/build: ignore symlinks to directories when matching source files Fixes #39841 Change-Id: Icbdc37d40e9c10179d6eb704d04482175b139f57 Reviewed-on: https://go-review.googlesource.com/c/go/+/240120 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- .../go/testdata/script/mod_symlink_dotgo.txt | 17 +++++++++++++++++ src/go/build/build.go | 6 ++++++ 2 files changed, 23 insertions(+) create mode 100644 src/cmd/go/testdata/script/mod_symlink_dotgo.txt diff --git a/src/cmd/go/testdata/script/mod_symlink_dotgo.txt b/src/cmd/go/testdata/script/mod_symlink_dotgo.txt new file mode 100644 index 0000000000..d4cc143a36 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_symlink_dotgo.txt @@ -0,0 +1,17 @@ +env GO111MODULE=on +[!symlink] skip + +symlink dir.go -> dir + +# Issue #39841: symlinks to directories should be ignored, not treated as source files. +go list -f '{{range .GoFiles}}{{.}}{{"\n"}}{{end}}' . +stdout 'p\.go$' +! stdout 'dir\.go$' + +-- go.mod -- +module example.com +go 1.15 +-- p.go -- +package p +-- dir/README.txt -- +This file exists to ensure that dir is a directory. diff --git a/src/go/build/build.go b/src/go/build/build.go index 4a5da308a0..39bc3591a7 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -793,6 +793,12 @@ Found: if d.IsDir() { continue } + if (d.Mode() & os.ModeSymlink) != 0 { + if fi, err := os.Stat(filepath.Join(p.Dir, d.Name())); err == nil && fi.IsDir() { + // Symlinks to directories are not source files. + continue + } + } name := d.Name() ext := nameExt(name) -- GitLab From b3d9cf7a07518020c6ec5032474aafef9345cdd5 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 13 May 2020 14:59:29 -0400 Subject: [PATCH 0321/1792] os: return a *PathError from Readdirnames and Readdir on POSIX platforms Previously, Readdirnames returned a *PathError on Windows and Plan 9, but a *SyscallError on POSIX systems. In contrast, similar methods (such as Stat) return a *PathError on all platforms. Fixes #38923 Change-Id: I26395905b1e723933f07b792c7aeee7c335949cd Reviewed-on: https://go-review.googlesource.com/c/go/+/233917 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/os/dir_darwin.go | 10 +++++----- src/os/dir_unix.go | 2 +- src/os/os_test.go | 4 ++++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/os/dir_darwin.go b/src/os/dir_darwin.go index 87797e2dda..476af6862e 100644 --- a/src/os/dir_darwin.go +++ b/src/os/dir_darwin.go @@ -28,7 +28,7 @@ func (f *File) readdirnames(n int) (names []string, err error) { if f.dirinfo == nil { dir, call, errno := f.pfd.OpenDir() if errno != nil { - return nil, wrapSyscallError(call, errno) + return nil, &PathError{call, f.name, errno} } f.dirinfo = &dirInfo{ dir: dir, @@ -46,11 +46,11 @@ func (f *File) readdirnames(n int) (names []string, err error) { var dirent syscall.Dirent var entptr *syscall.Dirent for len(names) < size || n == -1 { - if res := readdir_r(d.dir, &dirent, &entptr); res != 0 { - if syscall.Errno(res) == syscall.EINTR { + if errno := readdir_r(d.dir, &dirent, &entptr); errno != 0 { + if errno == syscall.EINTR { continue } - return names, wrapSyscallError("readdir", syscall.Errno(res)) + return names, &PathError{"readdir", f.name, errno} } if entptr == nil { // EOF break @@ -84,4 +84,4 @@ func (f *File) readdirnames(n int) (names []string, err error) { func closedir(dir uintptr) (err error) //go:linkname readdir_r syscall.readdir_r -func readdir_r(dir uintptr, entry *syscall.Dirent, result **syscall.Dirent) (res int) +func readdir_r(dir uintptr, entry *syscall.Dirent, result **syscall.Dirent) (res syscall.Errno) diff --git a/src/os/dir_unix.go b/src/os/dir_unix.go index e0c4989756..58ec406ab8 100644 --- a/src/os/dir_unix.go +++ b/src/os/dir_unix.go @@ -50,7 +50,7 @@ func (f *File) readdirnames(n int) (names []string, err error) { d.nbuf, errno = f.pfd.ReadDirent(d.buf) runtime.KeepAlive(f) if errno != nil { - return names, wrapSyscallError("readdirent", errno) + return names, &PathError{"readdirent", f.name, errno} } if d.nbuf <= 0 { break // EOF diff --git a/src/os/os_test.go b/src/os/os_test.go index e8c64510f5..520916d880 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -688,6 +688,10 @@ func TestReaddirOfFile(t *testing.T) { if err == nil { t.Error("Readdirnames succeeded; want non-nil error") } + var pe *PathError + if !errors.As(err, &pe) || pe.Path != f.Name() { + t.Errorf("Readdirnames returned %q; want a PathError with path %q", err, f.Name()) + } if len(names) > 0 { t.Errorf("unexpected dir names in regular file: %q", names) } -- GitLab From bb54a855a9b5733569f40ac19a2c338b87c23d14 Mon Sep 17 00:00:00 2001 From: Andrew Gerrand Date: Wed, 13 May 2020 10:39:11 +1000 Subject: [PATCH 0322/1792] net/http: handle Request.URL.RawPath in StripPrefix The StripPrefix wrapper strips a prefix string from the request's URL.Path field, but doesn't touch the RawPath field. This leads to the confusing situation when StripPrefix handles a request with URL.RawPath populated (due to some escaped characters in the request path) and the wrapped request's RawPath contains the prefix but Path does not. This change modifies StripPrefix to strip the prefix from both Path and RawPath. If there are escaped characters in the prefix part of the request URL the stripped handler serves a 404 instead of invoking the underlying handler with a mismatched Path/RawPath pair. This is a backward incompatible change for a very small minority of requests; I would be surprised if anyone is depending on this behavior, but it is possible. If that's the case, we could make a more conservative change where the RawPath is trimmed if possible, but when the prefix contains escaped characters then we don't 404 but rather send through the invalid Path/RawPath pair as before. Fixes #24366 Change-Id: I7030b8c183a3dfce307bc0272bba9a18df4cfe08 Reviewed-on: https://go-review.googlesource.com/c/go/+/233637 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke Reviewed-by: Bryan C. Mills --- doc/go1.16.html | 14 ++++++++++ src/net/http/serve_test.go | 52 +++++++++++++++++++++++++------------- src/net/http/server.go | 16 +++++++----- 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 4753cf914d..09e974d07c 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -112,3 +112,17 @@ Do not send CLs removing the interior tags from such phrases.

TODO

+ +

+ In the net/http package, the + behavior of StripPrefix + has been changed to strip the prefix from the request URL's + RawPath field in addition to its Path field. + In past releases, only the Path field was trimmed, and so if the + request URL contained any escaped characters the URL would be modified to + have mismatched Path and RawPath fields. + In Go 1.16, StripPrefix trims both fields. + If there are escaped characters in the prefix part of the request URL the + handler serves a 404 instead of its previous behavior of invoking the + underlying handler with a mismatched Path/RawPath pair. +

diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 5f56932778..635bf5dfc9 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -2849,29 +2849,47 @@ func TestStripPrefix(t *testing.T) { defer afterTest(t) h := HandlerFunc(func(w ResponseWriter, r *Request) { w.Header().Set("X-Path", r.URL.Path) + w.Header().Set("X-RawPath", r.URL.RawPath) }) - ts := httptest.NewServer(StripPrefix("/foo", h)) + ts := httptest.NewServer(StripPrefix("/foo/bar", h)) defer ts.Close() c := ts.Client() - res, err := c.Get(ts.URL + "/foo/bar") - if err != nil { - t.Fatal(err) - } - if g, e := res.Header.Get("X-Path"), "/bar"; g != e { - t.Errorf("test 1: got %s, want %s", g, e) - } - res.Body.Close() - - res, err = Get(ts.URL + "/bar") - if err != nil { - t.Fatal(err) - } - if g, e := res.StatusCode, 404; g != e { - t.Errorf("test 2: got status %v, want %v", g, e) + cases := []struct { + reqPath string + path string // If empty we want a 404. + rawPath string + }{ + {"/foo/bar/qux", "/qux", ""}, + {"/foo/bar%2Fqux", "/qux", "%2Fqux"}, + {"/foo%2Fbar/qux", "", ""}, // Escaped prefix does not match. + {"/bar", "", ""}, // No prefix match. + } + for _, tc := range cases { + t.Run(tc.reqPath, func(t *testing.T) { + res, err := c.Get(ts.URL + tc.reqPath) + if err != nil { + t.Fatal(err) + } + res.Body.Close() + if tc.path == "" { + if res.StatusCode != StatusNotFound { + t.Errorf("got %q, want 404 Not Found", res.Status) + } + return + } + if res.StatusCode != StatusOK { + t.Fatalf("got %q, want 200 OK", res.Status) + } + if g, w := res.Header.Get("X-Path"), tc.path; g != w { + t.Errorf("got Path %q, want %q", g, w) + } + if g, w := res.Header.Get("X-RawPath"), tc.rawPath; g != w { + t.Errorf("got RawPath %q, want %q", g, w) + } + }) } - res.Body.Close() } // https://golang.org/issue/18952. diff --git a/src/net/http/server.go b/src/net/http/server.go index d41b5f6f48..ed5de350a9 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -2062,22 +2062,26 @@ func NotFound(w ResponseWriter, r *Request) { Error(w, "404 page not found", Sta // that replies to each request with a ``404 page not found'' reply. func NotFoundHandler() Handler { return HandlerFunc(NotFound) } -// StripPrefix returns a handler that serves HTTP requests -// by removing the given prefix from the request URL's Path -// and invoking the handler h. StripPrefix handles a -// request for a path that doesn't begin with prefix by -// replying with an HTTP 404 not found error. +// StripPrefix returns a handler that serves HTTP requests by removing the +// given prefix from the request URL's Path (and RawPath if set) and invoking +// the handler h. StripPrefix handles a request for a path that doesn't begin +// with prefix by replying with an HTTP 404 not found error. The prefix must +// match exactly: if the prefix in the request contains escaped characters +// the reply is also an HTTP 404 not found error. func StripPrefix(prefix string, h Handler) Handler { if prefix == "" { return h } return HandlerFunc(func(w ResponseWriter, r *Request) { - if p := strings.TrimPrefix(r.URL.Path, prefix); len(p) < len(r.URL.Path) { + p := strings.TrimPrefix(r.URL.Path, prefix) + rp := strings.TrimPrefix(r.URL.RawPath, prefix) + if len(p) < len(r.URL.Path) && (r.URL.RawPath == "" || len(rp) < len(r.URL.RawPath)) { r2 := new(Request) *r2 = *r r2.URL = new(url.URL) *r2.URL = *r.URL r2.URL.Path = p + r2.URL.RawPath = rp h.ServeHTTP(w, r2) } else { NotFound(w, r) -- GitLab From 02f445258c284f295d8648078d6cc15836670756 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 25 Aug 2020 15:19:50 +0200 Subject: [PATCH 0323/1792] cmd/link: remove superfluous check in TestIssue34788Android386TLSSequence err != nil is already checked in the if condition one line above. Change-Id: If36cdb41016f7be98a65be0a7211d85cd6017f87 Reviewed-on: https://go-review.googlesource.com/c/go/+/250477 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/link_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 3b5efdf7a3..72ff01c932 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -455,9 +455,7 @@ func TestIssue34788Android386TLSSequence(t *testing.T) { cmd := exec.Command(testenv.GoToolPath(t), "tool", "compile", "-o", obj, src) cmd.Env = append(os.Environ(), "GOARCH=386", "GOOS=android") if out, err := cmd.CombinedOutput(); err != nil { - if err != nil { - t.Fatalf("failed to compile blah.go: %v, output: %s\n", err, out) - } + t.Fatalf("failed to compile blah.go: %v, output: %s\n", err, out) } // Run objdump on the resulting object. -- GitLab From bca0b44629f1317cc177072560d9a1486620e48f Mon Sep 17 00:00:00 2001 From: David Chase Date: Mon, 24 Aug 2020 22:57:01 -0400 Subject: [PATCH 0324/1792] cmd/compile: also check package.function for GOSSAFUNC match Old behavior is still enabled because it doesn't hurt to leave it in and existing users of this feature (there are dozens of us!) will not be surprised. Adding this finer control allows users to avoid writing ssa.html where they can't, shouldn't, or just don't want to. Example, both ways: $ GOSSAFUNC="(*Reader).Reset" go test -c -o ./a compress/gzip dumped SSA to bytes/ssa.html dumped SSA to strings/ssa.html dumped SSA to bufio/ssa.html dumped SSA to compress/gzip/ssa.html $ GOSSAFUNC="compress/gzip.(*Reader).Reset" go test -c -o ./a compress/gzip dumped SSA to compress/gzip/ssa.html Updates #40919. Change-Id: I06b77c3c1d326372a32651570b5dd6e56dfb1d7f Reviewed-on: https://go-review.googlesource.com/c/go/+/250340 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/ssa.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index c8fb013ad0..104dd403ea 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -295,7 +295,10 @@ func (s *state) emitOpenDeferInfo() { // worker indicates which of the backend workers is doing the processing. func buildssa(fn *Node, worker int) *ssa.Func { name := fn.funcname() - printssa := name == ssaDump + printssa := false + if ssaDump != "" { // match either a simple name e.g. "(*Reader).Reset", or a package.name e.g. "compress/gzip.(*Reader).Reset" + printssa = name == ssaDump || myimportpath+"."+name == ssaDump + } var astBuf *bytes.Buffer if printssa { astBuf = &bytes.Buffer{} -- GitLab From 27136419d4784d3f81af3ec1faf0962a60c69b7e Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Fri, 21 Aug 2020 10:02:44 -0700 Subject: [PATCH 0325/1792] encoding/binary: replace constant literals with named constant (cleanup) Follow-up on https://golang.org/cl/247120. Brought to my attention by Luke McCoy. Change-Id: I4530c96fb164d23b0ce5311f2cecb1964f2dea74 Reviewed-on: https://go-review.googlesource.com/c/go/+/249837 Reviewed-by: Katie Hockman --- src/encoding/binary/varint.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/encoding/binary/varint.go b/src/encoding/binary/varint.go index 38af61075c..1fa325dec7 100644 --- a/src/encoding/binary/varint.go +++ b/src/encoding/binary/varint.go @@ -62,7 +62,7 @@ func Uvarint(buf []byte) (uint64, int) { var s uint for i, b := range buf { if b < 0x80 { - if i > 9 || i == 9 && b > 1 { + if i >= MaxVarintLen64 || i == MaxVarintLen64-1 && b > 1 { return 0, -(i + 1) // overflow } return x | uint64(b)< 1 { + if i == MaxVarintLen64-1 && b > 1 { return x, overflow } return x | uint64(b)< Date: Mon, 24 Aug 2020 15:23:27 +0700 Subject: [PATCH 0326/1792] cmd/compile: report error for unexported name only once Fixes #22921 Change-Id: If29bd962335ac7676ea4f379727db3d55ae1bf8e Reviewed-on: https://go-review.googlesource.com/c/go/+/250177 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/dcl.go | 10 ++++++++++ src/cmd/compile/internal/gc/noder.go | 8 ++++---- src/cmd/compile/internal/gc/subr.go | 7 ------- test/fixedbugs/bug229.go | 8 ++++---- test/fixedbugs/issue22921.go | 18 ++++++++++++++++++ test/runtime.go | 2 +- 6 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 test/fixedbugs/issue22921.go diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index cd64d9a7bf..4f6fddd089 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -297,6 +297,16 @@ func oldname(s *types.Sym) *Node { return n } +// importName is like oldname, but it reports an error if sym is from another package and not exported. +func importName(sym *types.Sym) *Node { + n := oldname(sym) + if !types.IsExported(sym.Name) && sym.Pkg != localpkg { + n.SetDiag(true) + yyerror("cannot refer to unexported name %s.%s", sym.Pkg.Name, sym.Name) + } + return n +} + // := declarations func colasname(n *Node) bool { switch n.Op { diff --git a/src/cmd/compile/internal/gc/noder.go b/src/cmd/compile/internal/gc/noder.go index 802aab2268..590c1a16de 100644 --- a/src/cmd/compile/internal/gc/noder.go +++ b/src/cmd/compile/internal/gc/noder.go @@ -653,7 +653,7 @@ func (p *noder) expr(expr syntax.Expr) *Node { obj := p.expr(expr.X) if obj.Op == OPACK { obj.Name.SetUsed(true) - return oldname(restrictlookup(expr.Sel.Value, obj.Name.Pkg)) + return importName(obj.Name.Pkg.Lookup(expr.Sel.Value)) } n := nodSym(OXDOT, obj, p.name(expr.Sel)) n.Pos = p.pos(expr) // lineno may have been changed by p.expr(expr.X) @@ -857,7 +857,7 @@ func (p *noder) interfaceType(expr *syntax.InterfaceType) *Node { p.setlineno(method) var n *Node if method.Name == nil { - n = p.nodSym(method, ODCLFIELD, oldname(p.packname(method.Type)), nil) + n = p.nodSym(method, ODCLFIELD, importName(p.packname(method.Type)), nil) } else { mname := p.name(method.Name) sig := p.typeExpr(method.Type) @@ -896,7 +896,7 @@ func (p *noder) packname(expr syntax.Expr) *types.Sym { def.Name.SetUsed(true) pkg = def.Name.Pkg } - return restrictlookup(expr.Sel.Value, pkg) + return pkg.Lookup(expr.Sel.Value) } panic(fmt.Sprintf("unexpected packname: %#v", expr)) } @@ -911,7 +911,7 @@ func (p *noder) embedded(typ syntax.Expr) *Node { } sym := p.packname(typ) - n := p.nodSym(typ, ODCLFIELD, oldname(sym), lookup(sym.Name)) + n := p.nodSym(typ, ODCLFIELD, importName(sym), lookup(sym.Name)) n.SetEmbedded(true) if isStar { diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 9362c74288..9c6cd24eb7 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -271,13 +271,6 @@ func autolabel(prefix string) *types.Sym { return lookupN(prefix, int(n)) } -func restrictlookup(name string, pkg *types.Pkg) *types.Sym { - if !types.IsExported(name) && pkg != localpkg { - yyerror("cannot refer to unexported name %s.%s", pkg.Name, name) - } - return pkg.Lookup(name) -} - // find all the exported symbols in package opkg // and make them available in the current package func importdot(opkg *types.Pkg, pack *Node) { diff --git a/test/fixedbugs/bug229.go b/test/fixedbugs/bug229.go index 4baf65e48b..a30202fa2c 100644 --- a/test/fixedbugs/bug229.go +++ b/test/fixedbugs/bug229.go @@ -10,11 +10,11 @@ import "testing" func main() { var t testing.T - + // make sure error mentions that // name is unexported, not just "name not found". - t.common.name = nil // ERROR "unexported" - - println(testing.anyLowercaseName("asdf")) // ERROR "unexported" "undefined: testing.anyLowercaseName" + t.common.name = nil // ERROR "unexported" + + println(testing.anyLowercaseName("asdf")) // ERROR "unexported" } diff --git a/test/fixedbugs/issue22921.go b/test/fixedbugs/issue22921.go new file mode 100644 index 0000000000..04f78b2c08 --- /dev/null +++ b/test/fixedbugs/issue22921.go @@ -0,0 +1,18 @@ +// errorcheck + +// 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 main + +import "bytes" + +type _ struct{ bytes.nonexist } // ERROR "unexported" + +type _ interface{ bytes.nonexist } // ERROR "unexported" + +func main() { + var _ bytes.Buffer + var _ bytes.buffer // ERROR "unexported" +} diff --git a/test/runtime.go b/test/runtime.go index 0cf781b814..bccc9b53af 100644 --- a/test/runtime.go +++ b/test/runtime.go @@ -17,5 +17,5 @@ package main import "runtime" func main() { - runtime.printbool(true) // ERROR "unexported" "undefined" + runtime.printbool(true) // ERROR "unexported" } -- GitLab From 41bc0a1713b9436e96c2d64211ad94e42cafd591 Mon Sep 17 00:00:00 2001 From: SparrowLii Date: Mon, 24 Aug 2020 14:43:32 +0800 Subject: [PATCH 0327/1792] math/big: fix TestShiftOverlap for test -count arguments > 1 Don't overwrite incoming test data. The change uses copy instead of assigning statement to avoid this. Change-Id: Ib907101822d811de5c45145cb9d7961907e212c3 Reviewed-on: https://go-review.googlesource.com/c/go/+/250137 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/arith_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/math/big/arith_test.go b/src/math/big/arith_test.go index 05136f1895..e2b982c89c 100644 --- a/src/math/big/arith_test.go +++ b/src/math/big/arith_test.go @@ -241,20 +241,20 @@ var argshrVU = []argVU{ } func testShiftFunc(t *testing.T, f func(z, x []Word, s uint) Word, a argVU) { - // save a.d for error message, or it will be overwritten. + // work on copy of a.d to preserve the original data. b := make([]Word, len(a.d)) copy(b, a.d) - z := a.d[a.zp : a.zp+a.l] - x := a.d[a.xp : a.xp+a.l] + z := b[a.zp : a.zp+a.l] + x := b[a.xp : a.xp+a.l] c := f(z, x, a.s) for i, zi := range z { if zi != a.r[i] { - t.Errorf("d := %v, %s(d[%d:%d], d[%d:%d], %d)\n\tgot z[%d] = %#x; want %#x", b, a.m, a.zp, a.zp+a.l, a.xp, a.xp+a.l, a.s, i, zi, a.r[i]) + t.Errorf("d := %v, %s(d[%d:%d], d[%d:%d], %d)\n\tgot z[%d] = %#x; want %#x", a.d, a.m, a.zp, a.zp+a.l, a.xp, a.xp+a.l, a.s, i, zi, a.r[i]) break } } if c != a.c { - t.Errorf("d := %v, %s(d[%d:%d], d[%d:%d], %d)\n\tgot c = %#x; want %#x", b, a.m, a.zp, a.zp+a.l, a.xp, a.xp+a.l, a.s, c, a.c) + t.Errorf("d := %v, %s(d[%d:%d], d[%d:%d], %d)\n\tgot c = %#x; want %#x", a.d, a.m, a.zp, a.zp+a.l, a.xp, a.xp+a.l, a.s, c, a.c) } } -- GitLab From 91a52de5274a13fcaab68c0a78115eff632f68fc Mon Sep 17 00:00:00 2001 From: Katie Hockman Date: Tue, 25 Aug 2020 11:30:32 -0400 Subject: [PATCH 0328/1792] crypto/x509: fix duplicate import Updates dave/dst#45. Change-Id: I165e6b3d002407a33908bf90a66ad01f8003b260 Reviewed-on: https://go-review.googlesource.com/c/go/+/250497 TryBot-Result: Gobot Gobot Reviewed-by: Filippo Valsorda --- src/crypto/x509/x509.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 8ce57fb1ec..49ac059a0e 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -14,7 +14,6 @@ import ( "crypto/elliptic" "crypto/rsa" "crypto/sha1" - _ "crypto/sha1" _ "crypto/sha256" _ "crypto/sha512" "crypto/x509/pkix" -- GitLab From 5e1e8c4c9f99da52419c99e618425794102c9769 Mon Sep 17 00:00:00 2001 From: Steven Hartland Date: Thu, 7 May 2020 21:12:21 +0000 Subject: [PATCH 0329/1792] net/http: fix data race due to writeLoop goroutine left running Fix a data race for clients that mutate requests after receiving a response error which is caused by the writeLoop goroutine left running, this can be seen on canceled requests. Fixes #37669 Change-Id: I0e0e4fd63266326b32587d8596456760bf848b13 Reviewed-on: https://go-review.googlesource.com/c/go/+/232799 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/net/http/transport.go | 10 +++- src/net/http/transport_test.go | 92 ++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index d37b52b13d..05ff3ba1c2 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -1963,6 +1963,15 @@ func (pc *persistConn) mapRoundTripError(req *transportRequest, startBytesWritte return nil } + // Wait for the writeLoop goroutine to terminate to avoid data + // races on callers who mutate the request on failure. + // + // When resc in pc.roundTrip and hence rc.ch receives a responseAndError + // with a non-nil error it implies that the persistConn is either closed + // or closing. Waiting on pc.writeLoopDone is hence safe as all callers + // close closech which in turn ensures writeLoop returns. + <-pc.writeLoopDone + // If the request was canceled, that's better than network // failures that were likely the result of tearing down the // connection. @@ -1988,7 +1997,6 @@ func (pc *persistConn) mapRoundTripError(req *transportRequest, startBytesWritte return err } if pc.isBroken() { - <-pc.writeLoopDone if pc.nwrite == startBytesWritten { return nothingWrittenError{err} } diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 2d9ca10bf0..29d1ec3f46 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -25,6 +25,7 @@ import ( "io" "io/ioutil" "log" + mrand "math/rand" "net" . "net/http" "net/http/httptest" @@ -6284,3 +6285,94 @@ func TestTransportRejectsSignInContentLength(t *testing.T) { t.Fatalf("Error mismatch\nGot: %q\nWanted substring: %q", got, want) } } + +// dumpConn is a net.Conn which writes to Writer and reads from Reader +type dumpConn struct { + io.Writer + io.Reader +} + +func (c *dumpConn) Close() error { return nil } +func (c *dumpConn) LocalAddr() net.Addr { return nil } +func (c *dumpConn) RemoteAddr() net.Addr { return nil } +func (c *dumpConn) SetDeadline(t time.Time) error { return nil } +func (c *dumpConn) SetReadDeadline(t time.Time) error { return nil } +func (c *dumpConn) SetWriteDeadline(t time.Time) error { return nil } + +// delegateReader is a reader that delegates to another reader, +// once it arrives on a channel. +type delegateReader struct { + c chan io.Reader + r io.Reader // nil until received from c +} + +func (r *delegateReader) Read(p []byte) (int, error) { + if r.r == nil { + r.r = <-r.c + } + return r.r.Read(p) +} + +func testTransportRace(req *Request) { + save := req.Body + pr, pw := io.Pipe() + defer pr.Close() + defer pw.Close() + dr := &delegateReader{c: make(chan io.Reader)} + + t := &Transport{ + Dial: func(net, addr string) (net.Conn, error) { + return &dumpConn{pw, dr}, nil + }, + } + defer t.CloseIdleConnections() + + quitReadCh := make(chan struct{}) + // Wait for the request before replying with a dummy response: + go func() { + defer close(quitReadCh) + + req, err := ReadRequest(bufio.NewReader(pr)) + if err == nil { + // Ensure all the body is read; otherwise + // we'll get a partial dump. + io.Copy(ioutil.Discard, req.Body) + req.Body.Close() + } + select { + case dr.c <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n"): + case quitReadCh <- struct{}{}: + } + }() + + t.RoundTrip(req) + + // Ensure the reader returns before we reset req.Body to prevent + // a data race on req.Body. + pw.Close() + <-quitReadCh + + req.Body = save +} + +// Issue 37669 +// Test that a cancellation doesn't result in a data race due to the writeLoop +// goroutine being left running, if the caller mutates the processed Request +// upon completion. +func TestErrorWriteLoopRace(t *testing.T) { + for i := 0; i < 1000; i++ { + ctx, cancel := context.WithCancel(context.Background()) + r := bytes.NewBuffer(make([]byte, 10000)) + delay := time.Duration(mrand.Intn(5)) * time.Millisecond + go func() { + time.Sleep(delay) + cancel() + }() + req, err := NewRequestWithContext(ctx, MethodPost, "http://example.com", r) + if err != nil { + t.Fatal(err) + } + + testTransportRace(req) + } +} -- GitLab From 8d31ca255bd6b00d04f1673d26110b702e96662b Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 25 Aug 2020 18:01:27 +0000 Subject: [PATCH 0330/1792] Revert "net/http: fix data race due to writeLoop goroutine left running" This reverts CL 232799. Reason for revert: net/http test is failing on all longtest builders. Change-Id: I4694e34f35419bab2d0b45fa6d8c3ac2aa1f51a0 Reviewed-on: https://go-review.googlesource.com/c/go/+/250597 Run-TryBot: Bryan C. Mills Reviewed-by: Dmitri Shuralyov Reviewed-by: Katie Hockman TryBot-Result: Gobot Gobot --- src/net/http/transport.go | 10 +--- src/net/http/transport_test.go | 92 ---------------------------------- 2 files changed, 1 insertion(+), 101 deletions(-) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index 05ff3ba1c2..d37b52b13d 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -1963,15 +1963,6 @@ func (pc *persistConn) mapRoundTripError(req *transportRequest, startBytesWritte return nil } - // Wait for the writeLoop goroutine to terminate to avoid data - // races on callers who mutate the request on failure. - // - // When resc in pc.roundTrip and hence rc.ch receives a responseAndError - // with a non-nil error it implies that the persistConn is either closed - // or closing. Waiting on pc.writeLoopDone is hence safe as all callers - // close closech which in turn ensures writeLoop returns. - <-pc.writeLoopDone - // If the request was canceled, that's better than network // failures that were likely the result of tearing down the // connection. @@ -1997,6 +1988,7 @@ func (pc *persistConn) mapRoundTripError(req *transportRequest, startBytesWritte return err } if pc.isBroken() { + <-pc.writeLoopDone if pc.nwrite == startBytesWritten { return nothingWrittenError{err} } diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 29d1ec3f46..2d9ca10bf0 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -25,7 +25,6 @@ import ( "io" "io/ioutil" "log" - mrand "math/rand" "net" . "net/http" "net/http/httptest" @@ -6285,94 +6284,3 @@ func TestTransportRejectsSignInContentLength(t *testing.T) { t.Fatalf("Error mismatch\nGot: %q\nWanted substring: %q", got, want) } } - -// dumpConn is a net.Conn which writes to Writer and reads from Reader -type dumpConn struct { - io.Writer - io.Reader -} - -func (c *dumpConn) Close() error { return nil } -func (c *dumpConn) LocalAddr() net.Addr { return nil } -func (c *dumpConn) RemoteAddr() net.Addr { return nil } -func (c *dumpConn) SetDeadline(t time.Time) error { return nil } -func (c *dumpConn) SetReadDeadline(t time.Time) error { return nil } -func (c *dumpConn) SetWriteDeadline(t time.Time) error { return nil } - -// delegateReader is a reader that delegates to another reader, -// once it arrives on a channel. -type delegateReader struct { - c chan io.Reader - r io.Reader // nil until received from c -} - -func (r *delegateReader) Read(p []byte) (int, error) { - if r.r == nil { - r.r = <-r.c - } - return r.r.Read(p) -} - -func testTransportRace(req *Request) { - save := req.Body - pr, pw := io.Pipe() - defer pr.Close() - defer pw.Close() - dr := &delegateReader{c: make(chan io.Reader)} - - t := &Transport{ - Dial: func(net, addr string) (net.Conn, error) { - return &dumpConn{pw, dr}, nil - }, - } - defer t.CloseIdleConnections() - - quitReadCh := make(chan struct{}) - // Wait for the request before replying with a dummy response: - go func() { - defer close(quitReadCh) - - req, err := ReadRequest(bufio.NewReader(pr)) - if err == nil { - // Ensure all the body is read; otherwise - // we'll get a partial dump. - io.Copy(ioutil.Discard, req.Body) - req.Body.Close() - } - select { - case dr.c <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n"): - case quitReadCh <- struct{}{}: - } - }() - - t.RoundTrip(req) - - // Ensure the reader returns before we reset req.Body to prevent - // a data race on req.Body. - pw.Close() - <-quitReadCh - - req.Body = save -} - -// Issue 37669 -// Test that a cancellation doesn't result in a data race due to the writeLoop -// goroutine being left running, if the caller mutates the processed Request -// upon completion. -func TestErrorWriteLoopRace(t *testing.T) { - for i := 0; i < 1000; i++ { - ctx, cancel := context.WithCancel(context.Background()) - r := bytes.NewBuffer(make([]byte, 10000)) - delay := time.Duration(mrand.Intn(5)) * time.Millisecond - go func() { - time.Sleep(delay) - cancel() - }() - req, err := NewRequestWithContext(ctx, MethodPost, "http://example.com", r) - if err != nil { - t.Fatal(err) - } - - testTransportRace(req) - } -} -- GitLab From 00a053bd4b2c19b2d9680f78f4c8657fcc6f1c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=81owicki?= Date: Sun, 23 Aug 2020 23:53:04 +0100 Subject: [PATCH 0331/1792] testing: fix Cleanup race with Logf and Errorf Fixes #40908 Change-Id: I25561a3f18e730a50e6fbf85aa7bd85bf1b73b6e Reviewed-on: https://go-review.googlesource.com/c/go/+/250078 Reviewed-by: Tobias Klauser Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- .../go/testdata/script/testing_issue40908.txt | 21 +++++++++++++++++++ src/testing/testing.go | 4 ++++ 2 files changed, 25 insertions(+) create mode 100644 src/cmd/go/testdata/script/testing_issue40908.txt diff --git a/src/cmd/go/testdata/script/testing_issue40908.txt b/src/cmd/go/testdata/script/testing_issue40908.txt new file mode 100644 index 0000000000..4939de080c --- /dev/null +++ b/src/cmd/go/testdata/script/testing_issue40908.txt @@ -0,0 +1,21 @@ +[short] skip +[!race] skip + +go test -race testrace + +-- testrace/race_test.go -- +package testrace + +import "testing" + +func TestRace(t *testing.T) { + helperDone := make(chan struct{}) + go func() { + t.Logf("Something happened before cleanup.") + close(helperDone) + }() + + t.Cleanup(func() { + <-helperDone + }) +} diff --git a/src/testing/testing.go b/src/testing/testing.go index 6fc8c4fa9f..bf83df8863 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -860,11 +860,15 @@ func (c *common) Cleanup(f func()) { c.cleanup = func() { if oldCleanup != nil { defer func() { + c.mu.Lock() c.cleanupPc = oldCleanupPc + c.mu.Unlock() oldCleanup() }() } + c.mu.Lock() c.cleanupName = callerName(0) + c.mu.Unlock() f() } var pc [maxStackLen]uintptr -- GitLab From e3d608a8664b2cb0054f4d4706cdf911fd699b82 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Sun, 12 Jul 2020 16:20:02 -0400 Subject: [PATCH 0332/1792] go/types: factor out some methods that compute a single error In order to generate more accurate or informative error messages from the type checker, it can be helpful to interpret error messages in context. This is currently achieved in a number of ways: + Return a boolean value, and then reverse-engineer the error at the callsite (as in representable->representableConst). + Return a value causing the error (as in Checker.missingMethod), and add the error at the callsite. + Pass a "reason" string pointer to capture the error (as in Checker.assignableTo), and add the error at the callsite. + Pass a "context" string pointer, and use this when writing errors in the delegated method. In all cases, it is the responsibility of whatever code calls Checker.error* to set the operand mode to invalid. These methods are used as appropriate, depending on whether multiple errors are generated, whether additional context is needed, and whether the mere presence of an error needs to be interpreted at the callsite. However, this practice has some downsides: the plurality of error handling techniques can be a barrier to readability and composability. In this CL, we introduce Yet Another Pattern, with the hope that it can replace some or all of the existing techniques: factor out side-effect free functions that evaluate a single error, and add helpers for recording this error in the Checker. As a proof of concept this is done for Checker.representable and Checker.convertUntyped. If the general pattern does not seem appropriate for replacing some or all of the error-handling techniques listed above, we should revert to an established technique. Some internal error APIs are refactored to operate on an error, rather than a types.Error, with internal error metadata extracted using errors.As. This seemed to have negligible impact on performance, but we should be careful about actually wrapping errors: I expect that many users will expect err to be a types.Error. Change-Id: Ic5c6edcdc02768cd84e04638fad648934bcf3c17 Reviewed-on: https://go-review.googlesource.com/c/go/+/242082 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/errors.go | 39 +++++++++++++++++++++++++++++++++------ src/go/types/expr.go | 36 ++++++++++++++++++++++++------------ 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/go/types/errors.go b/src/go/types/errors.go index 91b077163c..88e41c5713 100644 --- a/src/go/types/errors.go +++ b/src/go/types/errors.go @@ -7,6 +7,7 @@ package types import ( + "errors" "fmt" "go/ast" "go/token" @@ -72,22 +73,33 @@ func (check *Checker) dump(format string, args ...interface{}) { fmt.Println(check.sprintf(format, args...)) } -func (check *Checker) err(pos token.Pos, msg string, soft bool) { +func (check *Checker) err(err error) { + if err == nil { + return + } + var e Error + isInternal := errors.As(err, &e) // Cheap trick: Don't report errors with messages containing // "invalid operand" or "invalid type" as those tend to be // follow-on errors which don't add useful information. Only // exclude them if these strings are not at the beginning, // and only if we have at least one error already reported. - if check.firstErr != nil && (strings.Index(msg, "invalid operand") > 0 || strings.Index(msg, "invalid type") > 0) { + isInvalidErr := isInternal && (strings.Index(e.Msg, "invalid operand") > 0 || strings.Index(e.Msg, "invalid type") > 0) + if check.firstErr != nil && isInvalidErr { return } - err := Error{check.fset, pos, msg, soft} if check.firstErr == nil { check.firstErr = err } if trace { + pos := e.Pos + msg := e.Msg + if !isInternal { + msg = err.Error() + pos = token.NoPos + } check.trace(pos, "ERROR: %s", msg) } @@ -99,15 +111,30 @@ func (check *Checker) err(pos token.Pos, msg string, soft bool) { } func (check *Checker) error(pos token.Pos, msg string) { - check.err(pos, msg, false) + check.err(Error{Fset: check.fset, Pos: pos, Msg: msg}) +} + +// newErrorf creates a new Error, but does not handle it. +func (check *Checker) newErrorf(pos token.Pos, format string, args ...interface{}) error { + return Error{ + Fset: check.fset, + Pos: pos, + Msg: check.sprintf(format, args...), + Soft: false, + } } func (check *Checker) errorf(pos token.Pos, format string, args ...interface{}) { - check.err(pos, check.sprintf(format, args...), false) + check.error(pos, check.sprintf(format, args...)) } func (check *Checker) softErrorf(pos token.Pos, format string, args ...interface{}) { - check.err(pos, check.sprintf(format, args...), true) + check.err(Error{ + Fset: check.fset, + Pos: pos, + Msg: check.sprintf(format, args...), + Soft: true, + }) } func (check *Checker) invalidAST(pos token.Pos, format string, args ...interface{}) { diff --git a/src/go/types/expr.go b/src/go/types/expr.go index d1e892a9b7..8503a521f6 100644 --- a/src/go/types/expr.go +++ b/src/go/types/expr.go @@ -329,8 +329,16 @@ func representableConst(x constant.Value, check *Checker, typ *Basic, rounded *c return false } -// representable checks that a constant operand is representable in the given basic type. +// representable checks that a constant operand is representable in the given +// basic type. func (check *Checker) representable(x *operand, typ *Basic) { + if err := check.isRepresentable(x, typ); err != nil { + x.mode = invalid + check.err(err) + } +} + +func (check *Checker) isRepresentable(x *operand, typ *Basic) error { assert(x.mode == constant_) if !representableConst(x.val, check, typ, &x.val) { var msg string @@ -350,9 +358,9 @@ func (check *Checker) representable(x *operand, typ *Basic) { } else { msg = "cannot convert %s to %s" } - check.errorf(x.pos(), msg, x, typ) - x.mode = invalid + return check.newErrorf(x.pos(), msg, x, typ) } + return nil } // updateExprType updates the type of x to typ and invokes itself @@ -488,10 +496,16 @@ func (check *Checker) updateExprVal(x ast.Expr, val constant.Value) { // convertUntyped attempts to set the type of an untyped value to the target type. func (check *Checker) convertUntyped(x *operand, target Type) { - if x.mode == invalid || isTyped(x.typ) || target == Typ[Invalid] { - return + if err := check.canConvertUntyped(x, target); err != nil { + x.mode = invalid + check.err(err) } +} +func (check *Checker) canConvertUntyped(x *operand, target Type) error { + if x.mode == invalid || isTyped(x.typ) || target == Typ[Invalid] { + return nil + } // TODO(gri) Sloppy code - clean up. This function is central // to assignment and expression checking. @@ -507,16 +521,15 @@ func (check *Checker) convertUntyped(x *operand, target Type) { } else if xkind != tkind { goto Error } - return + return nil } // typed target switch t := target.Underlying().(type) { case *Basic: if x.mode == constant_ { - check.representable(x, t) - if x.mode == invalid { - return + if err := check.isRepresentable(x, t); err != nil { + return err } // expression value may have been rounded - update if needed check.updateExprVal(x.expr, x.val) @@ -576,11 +589,10 @@ func (check *Checker) convertUntyped(x *operand, target Type) { x.typ = target check.updateExprType(x.expr, target, true) // UntypedNils are final - return + return nil Error: - check.errorf(x.pos(), "cannot convert %s to %s", x, target) - x.mode = invalid + return check.newErrorf(x.pos(), "cannot convert %s to %s", x, target) } func (check *Checker) comparison(x, y *operand, op token.Token) { -- GitLab From 3d774611feee49aa44b4f5ed65d40497a47ad4c8 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Sat, 22 Aug 2020 05:47:06 -0700 Subject: [PATCH 0333/1792] src/go.mod, net/http: update bundled and latest golang.org/x/net Updates x/net/http2 to git rev c89045814202410a2d67ec20ecf177ec77ceae7f http2: perform connection health check https://golang.org/cl/198040 (fixes #31643) http2: use ASCII space trimming for parsing Trailer header https://golang.org/cl/231437 all: update golang.org/x/crypto to v0.0.0-20200622213623-75b288015ac9 https://golang.org/cl/239700 (updates #30965) net/http2: fix erringRoundTripper https://golang.org/cl/243257 (updates #40213) also updates the vendored version of golang.org/x/net as per $ go get golang.org/x/net@c890458142 $ go mod tidy $ go mod vendor $ go generate -run bundle std Change-Id: Iea2473ef086df760144d9656f03a0218eb9da91f Reviewed-on: https://go-review.googlesource.com/c/go/+/249842 Run-TryBot: Emmanuel Odeke Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/go.mod | 2 +- src/go.sum | 4 +-- src/net/http/h2_bundle.go | 70 +++++++++++++++++++++++++++++++++++---- src/vendor/modules.txt | 2 +- 4 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/go.mod b/src/go.mod index b002f8e516..c75f74b916 100644 --- a/src/go.mod +++ b/src/go.mod @@ -4,7 +4,7 @@ go 1.15 require ( golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 - golang.org/x/net v0.0.0-20200707034311-ab3426394381 + golang.org/x/net v0.0.0-20200822124328-c89045814202 golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 // indirect golang.org/x/text v0.3.3-0.20200430171850-afb9336c4530 // indirect ) diff --git a/src/go.sum b/src/go.sum index 528f7e460e..dc9641be1a 100644 --- a/src/go.sum +++ b/src/go.sum @@ -2,8 +2,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go index 81c3671f85..463e7e8ce9 100644 --- a/src/net/http/h2_bundle.go +++ b/src/net/http/h2_bundle.go @@ -5629,7 +5629,7 @@ func (sc *http2serverConn) newWriterAndRequestNoBody(st *http2stream, rp http2re var trailer Header for _, v := range rp.header["Trailer"] { for _, key := range strings.Split(v, ",") { - key = CanonicalHeaderKey(strings.TrimSpace(key)) + key = CanonicalHeaderKey(textproto.TrimString(key)) switch key { case "Transfer-Encoding", "Trailer", "Content-Length": // Bogus. (copy of http1 rules) @@ -6606,6 +6606,19 @@ type http2Transport struct { // waiting for their turn. StrictMaxConcurrentStreams bool + // ReadIdleTimeout is the timeout after which a health check using ping + // frame will be carried out if no frame is received on the connection. + // Note that a ping response will is considered a received frame, so if + // there is no other traffic on the connection, the health check will + // be performed every ReadIdleTimeout interval. + // If zero, no health check is performed. + ReadIdleTimeout time.Duration + + // PingTimeout is the timeout after which the connection will be closed + // if a response to Ping is not received. + // Defaults to 15s. + PingTimeout time.Duration + // t1, if non-nil, is the standard library Transport using // this transport. Its settings are used (but not its // RoundTrip method, etc). @@ -6629,6 +6642,14 @@ func (t *http2Transport) disableCompression() bool { return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression) } +func (t *http2Transport) pingTimeout() time.Duration { + if t.PingTimeout == 0 { + return 15 * time.Second + } + return t.PingTimeout + +} + // ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. // It returns an error if t1 has already been HTTP/2-enabled. func http2ConfigureTransport(t1 *Transport) error { @@ -7174,6 +7195,20 @@ func (t *http2Transport) newClientConn(c net.Conn, singleUse bool) (*http2Client return cc, nil } +func (cc *http2ClientConn) healthCheck() { + pingTimeout := cc.t.pingTimeout() + // We don't need to periodically ping in the health check, because the readLoop of ClientConn will + // trigger the healthCheck again if there is no frame received. + ctx, cancel := context.WithTimeout(context.Background(), pingTimeout) + defer cancel() + err := cc.Ping(ctx) + if err != nil { + cc.closeForLostPing() + cc.t.connPool().MarkDead(cc) + return + } +} + func (cc *http2ClientConn) setGoAway(f *http2GoAwayFrame) { cc.mu.Lock() defer cc.mu.Unlock() @@ -7345,14 +7380,12 @@ func (cc *http2ClientConn) sendGoAway() error { return nil } -// Close closes the client connection immediately. -// -// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead. -func (cc *http2ClientConn) Close() error { +// closes the client connection immediately. In-flight requests are interrupted. +// err is sent to streams. +func (cc *http2ClientConn) closeForError(err error) error { cc.mu.Lock() defer cc.cond.Broadcast() defer cc.mu.Unlock() - err := errors.New("http2: client connection force closed via ClientConn.Close") for id, cs := range cc.streams { select { case cs.resc <- http2resAndError{err: err}: @@ -7365,6 +7398,20 @@ func (cc *http2ClientConn) Close() error { return cc.tconn.Close() } +// Close closes the client connection immediately. +// +// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead. +func (cc *http2ClientConn) Close() error { + err := errors.New("http2: client connection force closed via ClientConn.Close") + return cc.closeForError(err) +} + +// closes the client connection immediately. In-flight requests are interrupted. +func (cc *http2ClientConn) closeForLostPing() error { + err := errors.New("http2: client connection lost") + return cc.closeForError(err) +} + const http2maxAllocFrameSize = 512 << 10 // frameBuffer returns a scratch buffer suitable for writing DATA frames. @@ -8236,8 +8283,17 @@ func (rl *http2clientConnReadLoop) run() error { rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse gotReply := false // ever saw a HEADERS reply gotSettings := false + readIdleTimeout := cc.t.ReadIdleTimeout + var t *time.Timer + if readIdleTimeout != 0 { + t = time.AfterFunc(readIdleTimeout, cc.healthCheck) + defer t.Stop() + } for { f, err := cc.fr.ReadFrame() + if t != nil { + t.Reset(readIdleTimeout) + } if err != nil { cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err) } @@ -8968,6 +9024,8 @@ func http2strSliceContains(ss []string, s string) bool { type http2erringRoundTripper struct{ err error } +func (rt http2erringRoundTripper) RoundTripErr() error { return rt.err } + func (rt http2erringRoundTripper) RoundTrip(*Request) (*Response, error) { return nil, rt.err } // gzipReader wraps a response body so it can lazily diff --git a/src/vendor/modules.txt b/src/vendor/modules.txt index e687d77b4d..d1e4f28e21 100644 --- a/src/vendor/modules.txt +++ b/src/vendor/modules.txt @@ -8,7 +8,7 @@ golang.org/x/crypto/curve25519 golang.org/x/crypto/hkdf golang.org/x/crypto/internal/subtle golang.org/x/crypto/poly1305 -# golang.org/x/net v0.0.0-20200707034311-ab3426394381 +# golang.org/x/net v0.0.0-20200822124328-c89045814202 ## explicit golang.org/x/net/dns/dnsmessage golang.org/x/net/http/httpguts -- GitLab From 8381408048018aa2b6eec874f3161b4641191522 Mon Sep 17 00:00:00 2001 From: Michael Fraenkel Date: Thu, 16 Jul 2020 21:30:12 -0600 Subject: [PATCH 0334/1792] net/http: fix detection of Roundtrippers that always error CL 220905 added code to identify alternate transports that always error by using http2erringRoundTripper. This does not work when the transport is from another package, e.g., http2.erringRoundTripper. Expose a new method that allow detection of such a RoundTripper. Switch to an interface that is both a RoundTripper and can return the underlying error. Fixes #40213 Change-Id: I170739857ab9e99dffb5fa55c99b24b23c2f9c54 Reviewed-on: https://go-review.googlesource.com/c/go/+/243258 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/net/http/omithttp2.go | 4 ---- src/net/http/transport.go | 8 ++++++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/net/http/omithttp2.go b/src/net/http/omithttp2.go index 7e2f492579..c8f5c28a59 100644 --- a/src/net/http/omithttp2.go +++ b/src/net/http/omithttp2.go @@ -32,10 +32,6 @@ type http2Transport struct { func (*http2Transport) RoundTrip(*Request) (*Response, error) { panic(noHTTP2) } func (*http2Transport) CloseIdleConnections() {} -type http2erringRoundTripper struct{ err error } - -func (http2erringRoundTripper) RoundTrip(*Request) (*Response, error) { panic(noHTTP2) } - type http2noDialH2RoundTripper struct{} func (http2noDialH2RoundTripper) RoundTrip(*Request) (*Response, error) { panic(noHTTP2) } diff --git a/src/net/http/transport.go b/src/net/http/transport.go index d37b52b13d..c23042b1e3 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -1528,6 +1528,10 @@ func (pconn *persistConn) addTLS(name string, trace *httptrace.ClientTrace) erro return nil } +type erringRoundTripper interface { + RoundTripErr() error +} + func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *persistConn, err error) { pconn = &persistConn{ t: t, @@ -1694,9 +1698,9 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *pers if s := pconn.tlsState; s != nil && s.NegotiatedProtocolIsMutual && s.NegotiatedProtocol != "" { if next, ok := t.TLSNextProto[s.NegotiatedProtocol]; ok { alt := next(cm.targetAddr, pconn.conn.(*tls.Conn)) - if e, ok := alt.(http2erringRoundTripper); ok { + if e, ok := alt.(erringRoundTripper); ok { // pconn.conn was closed by next (http2configureTransport.upgradeFn). - return nil, e.err + return nil, e.RoundTripErr() } return &persistConn{t: t, cacheKey: pconn.cacheKey, alt: alt}, nil } -- GitLab From 758ac371ab930734053ed226ac62681e62ab8eea Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sat, 15 Aug 2020 21:15:35 +0200 Subject: [PATCH 0335/1792] misc/wasm: make wasm_exec more robust against uncommon environments JavaScript environments are quite unpredictable because bundlers add mocks for compatibility and libraries can polute the global namespace. Detect more of such situations: - Add check that require("fs") returns an object. - Fix check that require("fs") returns an non-empty object. - Add check that "module" is defined. Fixes #40730 Change-Id: I2ce65fc7db64bbbb0b60eec79a4cfe5c3fec99c0 Reviewed-on: https://go-review.googlesource.com/c/go/+/248758 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Dmitri Shuralyov Reviewed-by: Cherry Zhang --- misc/wasm/wasm_exec.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/misc/wasm/wasm_exec.js b/misc/wasm/wasm_exec.js index 8501ae7cd8..ef97c4e311 100644 --- a/misc/wasm/wasm_exec.js +++ b/misc/wasm/wasm_exec.js @@ -11,6 +11,7 @@ // - Node.js // - Electron // - Parcel + // - Webpack if (typeof global !== "undefined") { // global already exists @@ -28,7 +29,7 @@ if (!global.fs && global.require) { const fs = require("fs"); - if (Object.keys(fs) !== 0) { + if (typeof fs === "object" && fs !== null && Object.keys(fs).length !== 0) { global.fs = fs; } } @@ -556,6 +557,7 @@ } if ( + typeof module !== "undefined" && global.require && global.require.main === module && global.process && -- GitLab From 03eb7e20e4d4d0a9cc3d34787049f101c9f72761 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Tue, 25 Aug 2020 06:43:27 -0700 Subject: [PATCH 0336/1792] cmd/compile: apply strong typing to all remaining s390x rewrite rules This CL applies strong aux typing to the remaining s390x rewrite rules in preparation for strong aux typing becoming the default. Passes toolstash-check on s390x. Change-Id: Id585b0db492780737818024e1b22b4837435b525 Reviewed-on: https://go-review.googlesource.com/c/go/+/250558 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/S390X.rules | 677 ++-- src/cmd/compile/internal/ssa/rewriteS390X.go | 3723 +++++++++--------- 2 files changed, 2189 insertions(+), 2211 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/S390X.rules b/src/cmd/compile/internal/ssa/gen/S390X.rules index 5e4c436ca1..f7d391cf3a 100644 --- a/src/cmd/compile/internal/ssa/gen/S390X.rules +++ b/src/cmd/compile/internal/ssa/gen/S390X.rules @@ -641,41 +641,37 @@ (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 [c] x) -(ADDW x (MOVDconst [c])) -> (ADDWconst [int64(int32(c))] x) +(ADD x (MOVDconst [c])) && is32Bit(c) => (ADDconst [int32(c)] x) +(ADDW x (MOVDconst [c])) => (ADDWconst [int32(c)] x) -(SUB x (MOVDconst [c])) && is32Bit(c) -> (SUBconst x [c]) -(SUB (MOVDconst [c]) x) && is32Bit(c) -> (NEG (SUBconst x [c])) -(SUBW x (MOVDconst [c])) -> (SUBWconst x [int64(int32(c))]) -(SUBW (MOVDconst [c]) x) -> (NEGW (SUBWconst x [int64(int32(c))])) +(SUB x (MOVDconst [c])) && is32Bit(c) => (SUBconst x [int32(c)]) +(SUB (MOVDconst [c]) x) && is32Bit(c) => (NEG (SUBconst x [int32(c)])) +(SUBW x (MOVDconst [c])) => (SUBWconst x [int32(c)]) +(SUBW (MOVDconst [c]) x) => (NEGW (SUBWconst x [int32(c)])) -(MULLD x (MOVDconst [c])) && is32Bit(c) -> (MULLDconst [c] x) -(MULLW x (MOVDconst [c])) -> (MULLWconst [int64(int32(c))] x) +(MULLD x (MOVDconst [c])) && is32Bit(c) => (MULLDconst [int32(c)] x) +(MULLW x (MOVDconst [c])) => (MULLWconst [int32(c)] x) // NILF instructions leave the high 32 bits unchanged which is // equivalent to the leftmost 32 bits being set. // TODO(mundaym): modify the assembler to accept 64-bit values // and use isU32Bit(^c). (AND x (MOVDconst [c])) && is32Bit(c) && c < 0 => (ANDconst [c] x) -(AND x (MOVDconst [c])) && is32Bit(c) && c >= 0 -> (MOVWZreg (ANDWconst [int64(int32(c))] x)) -(ANDW x (MOVDconst [c])) -> (ANDWconst [int64(int32(c))] x) +(AND x (MOVDconst [c])) && is32Bit(c) && c >= 0 => (MOVWZreg (ANDWconst [int32(c)] x)) +(ANDW x (MOVDconst [c])) => (ANDWconst [int32(c)] x) -(ANDWconst [c] (ANDWconst [d] x)) => (ANDWconst [c & d] x) -(ANDconst [c] (ANDconst [d] x)) => (ANDconst [c & d] x) +((AND|ANDW)const [c] ((AND|ANDW)const [d] x)) => ((AND|ANDW)const [c&d] x) -(OR x (MOVDconst [c])) && isU32Bit(c) => (ORconst [c] x) -(ORW x (MOVDconst [c])) -> (ORWconst [int64(int32(c))] x) - -(XOR x (MOVDconst [c])) && isU32Bit(c) => (XORconst [c] x) -(XORW x (MOVDconst [c])) -> (XORWconst [int64(int32(c))] x) +((OR|XOR) x (MOVDconst [c])) && isU32Bit(c) => ((OR|XOR)const [c] x) +((OR|XOR)W x (MOVDconst [c])) => ((OR|XOR)Wconst [int32(c)] x) // Constant shifts. (S(LD|RD|RAD|LW|RW|RAW) x (MOVDconst [c])) - -> (S(LD|RD|RAD|LW|RW|RAW)const x [c&63]) + => (S(LD|RD|RAD|LW|RW|RAW)const x [int8(c&63)]) // Shifts only use the rightmost 6 bits of the shift value. (S(LD|RD|RAD|LW|RW|RAW) x (AND (MOVDconst [c]) y)) - -> (S(LD|RD|RAD|LW|RW|RAW) x (ANDWconst [c&63] y)) + => (S(LD|RD|RAD|LW|RW|RAW) x (ANDWconst [int32(c&63)] y)) (S(LD|RD|RAD|LW|RW|RAW) x (ANDWconst [c] y)) && c&63 == 63 => (S(LD|RD|RAD|LW|RW|RAW) x y) (SLD x (MOV(W|H|B|WZ|HZ|BZ)reg y)) => (SLD x y) @@ -686,8 +682,8 @@ (SRAW x (MOV(W|H|B|WZ|HZ|BZ)reg y)) => (SRAW x y) // Constant rotate generation -(RLL x (MOVDconst [c])) -> (RLLconst x [c&31]) -(RLLG x (MOVDconst [c])) -> (RLLGconst x [c&63]) +(RLL x (MOVDconst [c])) => (RLLconst x [int8(c&31)]) +(RLLG x (MOVDconst [c])) => (RLLGconst x [int8(c&63)]) (ADD (SLDconst x [c]) (SRDconst x [d])) && d == 64-c => (RLLGconst [c] x) ( OR (SLDconst x [c]) (SRDconst x [d])) && d == 64-c => (RLLGconst [c] x) @@ -697,14 +693,17 @@ ( ORW (SLWconst x [c]) (SRWconst x [d])) && d == 32-c => (RLLconst [c] x) (XORW (SLWconst x [c]) (SRWconst x [d])) && d == 32-c => (RLLconst [c] x) -(CMP x (MOVDconst [c])) && is32Bit(c) -> (CMPconst x [c]) -(CMP (MOVDconst [c]) x) && is32Bit(c) -> (InvertFlags (CMPconst x [c])) -(CMPW x (MOVDconst [c])) -> (CMPWconst x [int64(int32(c))]) -(CMPW (MOVDconst [c]) x) -> (InvertFlags (CMPWconst x [int64(int32(c))])) -(CMPU x (MOVDconst [c])) && isU32Bit(c) -> (CMPUconst x [int64(int32(c))]) -(CMPU (MOVDconst [c]) x) && isU32Bit(c) -> (InvertFlags (CMPUconst x [int64(int32(c))])) -(CMPWU x (MOVDconst [c])) -> (CMPWUconst x [int64(int32(c))]) -(CMPWU (MOVDconst [c]) x) -> (InvertFlags (CMPWUconst x [int64(int32(c))])) +// Signed 64-bit comparison with immediate. +(CMP x (MOVDconst [c])) && is32Bit(c) => (CMPconst x [int32(c)]) +(CMP (MOVDconst [c]) x) && is32Bit(c) => (InvertFlags (CMPconst x [int32(c)])) + +// Unsigned 64-bit comparison with immediate. +(CMPU x (MOVDconst [c])) && isU32Bit(c) => (CMPUconst x [int32(c)]) +(CMPU (MOVDconst [c]) x) && isU32Bit(c) => (InvertFlags (CMPUconst x [int32(c)])) + +// Signed and unsigned 32-bit comparison with immediate. +(CMP(W|WU) x (MOVDconst [c])) => (CMP(W|WU)const x [int32(c)]) +(CMP(W|WU) (MOVDconst [c]) x) => (InvertFlags (CMP(W|WU)const x [int32(c)])) // Canonicalize the order of arguments to comparisons - helps with CSE. ((CMP|CMPW|CMPU|CMPWU) x y) && x.ID > y.ID => (InvertFlags ((CMP|CMPW|CMPU|CMPWU) y x)) @@ -752,14 +751,14 @@ (SL(D|W)const x [int8(log32(-c+(-c&^(-c-1))))])) // Fold ADD into MOVDaddr. Odd offsets from SB shouldn't be folded (LARL can't handle them). -(ADDconst [c] (MOVDaddr [d] {s} x:(SB))) && ((c+d)&1 == 0) && is32Bit(c+d) -> (MOVDaddr [c+d] {s} x) -(ADDconst [c] (MOVDaddr [d] {s} x)) && x.Op != OpSB && is20Bit(c+d) -> (MOVDaddr [c+d] {s} x) +(ADDconst [c] (MOVDaddr [d] {s} x:(SB))) && ((c+d)&1 == 0) && is32Bit(int64(c)+int64(d)) => (MOVDaddr [c+d] {s} x) +(ADDconst [c] (MOVDaddr [d] {s} x)) && x.Op != OpSB && is20Bit(int64(c)+int64(d)) => (MOVDaddr [c+d] {s} x) (ADD idx (MOVDaddr [c] {s} ptr)) && ptr.Op != OpSB && idx.Op != OpSB => (MOVDaddridx [c] {s} ptr idx) // fold ADDconst into MOVDaddrx -(ADDconst [c] (MOVDaddridx [d] {s} x y)) && is20Bit(c+d) -> (MOVDaddridx [c+d] {s} x y) -(MOVDaddridx [c] {s} (ADDconst [d] x) y) && is20Bit(c+d) && x.Op != OpSB -> (MOVDaddridx [c+d] {s} x y) -(MOVDaddridx [c] {s} x (ADDconst [d] y)) && is20Bit(c+d) && y.Op != OpSB -> (MOVDaddridx [c+d] {s} x y) +(ADDconst [c] (MOVDaddridx [d] {s} x y)) && is20Bit(int64(c)+int64(d)) => (MOVDaddridx [c+d] {s} x y) +(MOVDaddridx [c] {s} (ADDconst [d] x) y) && is20Bit(int64(c)+int64(d)) && x.Op != OpSB => (MOVDaddridx [c+d] {s} x y) +(MOVDaddridx [c] {s} x (ADDconst [d] y)) && is20Bit(int64(c)+int64(d)) && y.Op != OpSB => (MOVDaddridx [c+d] {s} x y) // reverse ordering of compare instruction (LOCGR {c} x y (InvertFlags cmp)) => (LOCGR {c.ReverseComparison()} x y cmp) @@ -799,11 +798,11 @@ // detect copysign (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (LGDR (LPDFR y))) => (LGDR (CPSDR y x)) -(OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c])) && c & -1<<63 == 0 -> (LGDR (CPSDR (FMOVDconst [c]) x)) +(OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c])) && c & -1<<63 == 0 => (LGDR (CPSDR (FMOVDconst [math.Float64frombits(uint64(c))]) x)) (OR (AND (MOVDconst [-1<<63]) (LGDR x)) (LGDR (LPDFR y))) => (LGDR (CPSDR y x)) -(OR (AND (MOVDconst [-1<<63]) (LGDR x)) (MOVDconst [c])) && c & -1<<63 == 0 -> (LGDR (CPSDR (FMOVDconst [c]) x)) -(CPSDR y (FMOVDconst [c])) && c & -1<<63 == 0 -> (LPDFR y) -(CPSDR y (FMOVDconst [c])) && c & -1<<63 != 0 -> (LNDFR y) +(OR (AND (MOVDconst [-1<<63]) (LGDR x)) (MOVDconst [c])) && c & -1<<63 == 0 => (LGDR (CPSDR (FMOVDconst [math.Float64frombits(uint64(c))]) x)) +(CPSDR y (FMOVDconst [c])) && !math.Signbit(c) => (LPDFR y) +(CPSDR y (FMOVDconst [c])) && math.Signbit(c) => (LNDFR y) // absorb negations into set/clear sign bit (FNEG (LPDFR x)) => (LNDFR x) @@ -832,150 +831,150 @@ // the ADDconst get eliminated, we still have to compute the ADDconst and we now // have potentially two live values (ptr and (ADDconst [off] ptr)) instead of one. // Nevertheless, let's do it! -(MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (MOVDload [off1+off2] {sym} ptr mem) -(MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (MOVWload [off1+off2] {sym} ptr mem) -(MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (MOVHload [off1+off2] {sym} ptr mem) -(MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (MOVBload [off1+off2] {sym} ptr mem) -(MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (MOVWZload [off1+off2] {sym} ptr mem) -(MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (MOVHZload [off1+off2] {sym} ptr mem) -(MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (MOVBZload [off1+off2] {sym} ptr mem) -(FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (FMOVSload [off1+off2] {sym} ptr mem) -(FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(off1+off2) -> (FMOVDload [off1+off2] {sym} ptr mem) - -(MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(off1+off2) -> (MOVDstore [off1+off2] {sym} ptr val mem) -(MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(off1+off2) -> (MOVWstore [off1+off2] {sym} ptr val mem) -(MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(off1+off2) -> (MOVHstore [off1+off2] {sym} ptr val mem) -(MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(off1+off2) -> (MOVBstore [off1+off2] {sym} ptr val mem) -(FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(off1+off2) -> (FMOVSstore [off1+off2] {sym} ptr val mem) -(FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(off1+off2) -> (FMOVDstore [off1+off2] {sym} ptr val mem) - -(ADDload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (ADDload [off1+off2] {sym} x ptr mem) -(ADDWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (ADDWload [off1+off2] {sym} x ptr mem) -(MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (MULLDload [off1+off2] {sym} x ptr mem) -(MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (MULLWload [off1+off2] {sym} x ptr mem) -(SUBload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (SUBload [off1+off2] {sym} x ptr mem) -(SUBWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (SUBWload [off1+off2] {sym} x ptr mem) - -(ANDload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (ANDload [off1+off2] {sym} x ptr mem) -(ANDWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (ANDWload [off1+off2] {sym} x ptr mem) -(ORload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (ORload [off1+off2] {sym} x ptr mem) -(ORWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (ORWload [off1+off2] {sym} x ptr mem) -(XORload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (XORload [off1+off2] {sym} x ptr mem) -(XORWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(off1+off2) -> (XORWload [off1+off2] {sym} x ptr mem) +(MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (MOVDload [off1+off2] {sym} ptr mem) +(MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (MOVWload [off1+off2] {sym} ptr mem) +(MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (MOVHload [off1+off2] {sym} ptr mem) +(MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (MOVBload [off1+off2] {sym} ptr mem) +(MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (MOVWZload [off1+off2] {sym} ptr mem) +(MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (MOVHZload [off1+off2] {sym} ptr mem) +(MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (MOVBZload [off1+off2] {sym} ptr mem) +(FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (FMOVSload [off1+off2] {sym} ptr mem) +(FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) && is20Bit(int64(off1)+int64(off2)) => (FMOVDload [off1+off2] {sym} ptr mem) + +(MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(int64(off1)+int64(off2)) => (MOVDstore [off1+off2] {sym} ptr val mem) +(MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(int64(off1)+int64(off2)) => (MOVWstore [off1+off2] {sym} ptr val mem) +(MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(int64(off1)+int64(off2)) => (MOVHstore [off1+off2] {sym} ptr val mem) +(MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(int64(off1)+int64(off2)) => (MOVBstore [off1+off2] {sym} ptr val mem) +(FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(int64(off1)+int64(off2)) => (FMOVSstore [off1+off2] {sym} ptr val mem) +(FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) && is20Bit(int64(off1)+int64(off2)) => (FMOVDstore [off1+off2] {sym} ptr val mem) + +(ADDload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (ADDload [off1+off2] {sym} x ptr mem) +(ADDWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (ADDWload [off1+off2] {sym} x ptr mem) +(MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (MULLDload [off1+off2] {sym} x ptr mem) +(MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (MULLWload [off1+off2] {sym} x ptr mem) +(SUBload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (SUBload [off1+off2] {sym} x ptr mem) +(SUBWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (SUBWload [off1+off2] {sym} x ptr mem) + +(ANDload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (ANDload [off1+off2] {sym} x ptr mem) +(ANDWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (ANDWload [off1+off2] {sym} x ptr mem) +(ORload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (ORload [off1+off2] {sym} x ptr mem) +(ORWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (ORWload [off1+off2] {sym} x ptr mem) +(XORload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (XORload [off1+off2] {sym} x ptr mem) +(XORWload [off1] {sym} x (ADDconst [off2] ptr) mem) && ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) => (XORWload [off1+off2] {sym} x ptr mem) // Fold constants into stores. -(MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) && is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB -> - (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) -(MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) && is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB -> - (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) -(MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) && isU12Bit(off) && ptr.Op != OpSB -> - (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) -(MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) && is20Bit(off) && ptr.Op != OpSB -> - (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) +(MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) && is16Bit(c) && isU12Bit(int64(off)) && ptr.Op != OpSB => + (MOVDstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) +(MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) && is16Bit(c) && isU12Bit(int64(off)) && ptr.Op != OpSB => + (MOVWstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) +(MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) && isU12Bit(int64(off)) && ptr.Op != OpSB => + (MOVHstoreconst [makeValAndOff32(int32(int16(c)),off)] {sym} ptr mem) +(MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) && is20Bit(int64(off)) && ptr.Op != OpSB => + (MOVBstoreconst [makeValAndOff32(int32(int8(c)),off)] {sym} ptr mem) // Fold address offsets into constant stores. -(MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) && isU12Bit(ValAndOff(sc).Off()+off) -> - (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) -(MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) && isU12Bit(ValAndOff(sc).Off()+off) -> - (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) -(MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) && isU12Bit(ValAndOff(sc).Off()+off) -> - (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) -(MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) && is20Bit(ValAndOff(sc).Off()+off) -> - (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) +(MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) && isU12Bit(sc.Off()+int64(off)) => + (MOVDstoreconst [sc.addOffset32(off)] {s} ptr mem) +(MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) && isU12Bit(sc.Off()+int64(off)) => + (MOVWstoreconst [sc.addOffset32(off)] {s} ptr mem) +(MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) && isU12Bit(sc.Off()+int64(off)) => + (MOVHstoreconst [sc.addOffset32(off)] {s} ptr mem) +(MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) && is20Bit(sc.Off()+int64(off)) => + (MOVBstoreconst [sc.addOffset32(off)] {s} ptr mem) // Merge address calculations into loads and stores. // Offsets from SB must not be merged into unaligned memory accesses because // loads/stores using PC-relative addressing directly must be aligned to the // size of the target. -(MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) -> - (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) -(MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) -> - (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) -(MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) -> - (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) -(MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) -(FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) -(FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) - -(MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) -> - (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) -(MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) -> - (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) -(MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) - -(MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) -> - (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) -(MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) -> - (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) -(MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) -> - (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) -(MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) -(FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) -(FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) - -(ADDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (ADDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(ADDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (ADDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (MULLDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (MULLWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(SUBload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (SUBload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(SUBWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (SUBWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) - -(ANDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (ANDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(ANDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (ANDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(ORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (ORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(ORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (ORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(XORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (XORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) -(XORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) -> (XORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) +(MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) => + (MOVDload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) +(MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) => + (MOVWZload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) +(MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) => + (MOVHZload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) +(MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVBZload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) +(FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (FMOVSload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) +(FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (FMOVDload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) + +(MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) => + (MOVWload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) +(MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) => + (MOVHload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) +(MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVBload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) + +(MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) => + (MOVDstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) +(MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) => + (MOVWstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) +(MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) => + (MOVHstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) +(MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVBstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) +(FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (FMOVSstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) +(FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (FMOVDstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) + +(ADDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (ADDload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(ADDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (ADDWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (MULLDload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (MULLWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(SUBload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (SUBload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(SUBWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (SUBWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) + +(ANDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (ANDload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(ANDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (ANDWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(ORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (ORload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(ORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (ORWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(XORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (XORload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) +(XORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) && ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) => (XORWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) // Cannot store constant to SB directly (no 'move relative long immediate' instructions). -(MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) -> - (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) -(MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) -> - (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) -(MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) -> - (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) -(MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) -> - (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) +(MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) => + (MOVDstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) +(MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) => + (MOVWstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) +(MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) => + (MOVHstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) +(MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) => + (MOVBstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) // generating indexed loads and stores -(MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) -(MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVBloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) -(MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) -(MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVHloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) -(MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) -(MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVWloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) -(MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) -(FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) -(FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) - -(MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) -(MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) -(MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) -(MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) -(FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) -(FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) -> - (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) +(MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVBZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) +(MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVBloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) +(MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVHZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) +(MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVHloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) +(MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVWZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) +(MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVWloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) +(MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVDloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) +(FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (FMOVSloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) +(FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (FMOVDloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) + +(MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVBstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) +(MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVHstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) +(MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVWstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) +(MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (MOVDstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) +(FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (FMOVSstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) +(FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => + (FMOVDstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) (MOVBZload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVBZloadidx [off] {sym} ptr idx mem) (MOVBload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVBloadidx [off] {sym} ptr idx mem) @@ -995,53 +994,53 @@ (FMOVDstore [off] {sym} (ADD ptr idx) val mem) && ptr.Op != OpSB => (FMOVDstoreidx [off] {sym} ptr idx val mem) // combine ADD into indexed loads and stores -(MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (MOVBZloadidx [c+d] {sym} ptr idx mem) -(MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (MOVBloadidx [c+d] {sym} ptr idx mem) -(MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (MOVHZloadidx [c+d] {sym} ptr idx mem) -(MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (MOVHloadidx [c+d] {sym} ptr idx mem) -(MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (MOVWZloadidx [c+d] {sym} ptr idx mem) -(MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (MOVWloadidx [c+d] {sym} ptr idx mem) -(MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (MOVDloadidx [c+d] {sym} ptr idx mem) -(FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (FMOVSloadidx [c+d] {sym} ptr idx mem) -(FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(c+d) -> (FMOVDloadidx [c+d] {sym} ptr idx mem) - -(MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(c+d) -> (MOVBstoreidx [c+d] {sym} ptr idx val mem) -(MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(c+d) -> (MOVHstoreidx [c+d] {sym} ptr idx val mem) -(MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(c+d) -> (MOVWstoreidx [c+d] {sym} ptr idx val mem) -(MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(c+d) -> (MOVDstoreidx [c+d] {sym} ptr idx val mem) -(FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(c+d) -> (FMOVSstoreidx [c+d] {sym} ptr idx val mem) -(FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(c+d) -> (FMOVDstoreidx [c+d] {sym} ptr idx val mem) - -(MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (MOVBZloadidx [c+d] {sym} ptr idx mem) -(MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (MOVBloadidx [c+d] {sym} ptr idx mem) -(MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (MOVHZloadidx [c+d] {sym} ptr idx mem) -(MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (MOVHloadidx [c+d] {sym} ptr idx mem) -(MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (MOVWZloadidx [c+d] {sym} ptr idx mem) -(MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (MOVWloadidx [c+d] {sym} ptr idx mem) -(MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (MOVDloadidx [c+d] {sym} ptr idx mem) -(FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (FMOVSloadidx [c+d] {sym} ptr idx mem) -(FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(c+d) -> (FMOVDloadidx [c+d] {sym} ptr idx mem) - -(MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(c+d) -> (MOVBstoreidx [c+d] {sym} ptr idx val mem) -(MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(c+d) -> (MOVHstoreidx [c+d] {sym} ptr idx val mem) -(MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(c+d) -> (MOVWstoreidx [c+d] {sym} ptr idx val mem) -(MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(c+d) -> (MOVDstoreidx [c+d] {sym} ptr idx val mem) -(FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(c+d) -> (FMOVSstoreidx [c+d] {sym} ptr idx val mem) -(FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(c+d) -> (FMOVDstoreidx [c+d] {sym} ptr idx val mem) +(MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVBZloadidx [c+d] {sym} ptr idx mem) +(MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVBloadidx [c+d] {sym} ptr idx mem) +(MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVHZloadidx [c+d] {sym} ptr idx mem) +(MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVHloadidx [c+d] {sym} ptr idx mem) +(MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVWZloadidx [c+d] {sym} ptr idx mem) +(MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVWloadidx [c+d] {sym} ptr idx mem) +(MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVDloadidx [c+d] {sym} ptr idx mem) +(FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (FMOVSloadidx [c+d] {sym} ptr idx mem) +(FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (FMOVDloadidx [c+d] {sym} ptr idx mem) + +(MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (MOVBstoreidx [c+d] {sym} ptr idx val mem) +(MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (MOVHstoreidx [c+d] {sym} ptr idx val mem) +(MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (MOVWstoreidx [c+d] {sym} ptr idx val mem) +(MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (MOVDstoreidx [c+d] {sym} ptr idx val mem) +(FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (FMOVSstoreidx [c+d] {sym} ptr idx val mem) +(FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (FMOVDstoreidx [c+d] {sym} ptr idx val mem) + +(MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVBZloadidx [c+d] {sym} ptr idx mem) +(MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVBloadidx [c+d] {sym} ptr idx mem) +(MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVHZloadidx [c+d] {sym} ptr idx mem) +(MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVHloadidx [c+d] {sym} ptr idx mem) +(MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVWZloadidx [c+d] {sym} ptr idx mem) +(MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVWloadidx [c+d] {sym} ptr idx mem) +(MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVDloadidx [c+d] {sym} ptr idx mem) +(FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (FMOVSloadidx [c+d] {sym} ptr idx mem) +(FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (FMOVDloadidx [c+d] {sym} ptr idx mem) + +(MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (MOVBstoreidx [c+d] {sym} ptr idx val mem) +(MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (MOVHstoreidx [c+d] {sym} ptr idx val mem) +(MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (MOVWstoreidx [c+d] {sym} ptr idx val mem) +(MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (MOVDstoreidx [c+d] {sym} ptr idx val mem) +(FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (FMOVSstoreidx [c+d] {sym} ptr idx val mem) +(FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (FMOVDstoreidx [c+d] {sym} ptr idx val mem) // MOVDaddr into MOVDaddridx -(MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB -> - (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) -(MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) && is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB -> - (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) +(MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && x.Op != OpSB => + (MOVDaddridx [off1+off2] {mergeSymTyped(sym1,sym2)} x y) +(MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && y.Op != OpSB => + (MOVDaddridx [off1+off2] {mergeSymTyped(sym1,sym2)} x y) // Absorb InvertFlags into branches. (BRC {c} (InvertFlags cmp) yes no) => (BRC {c.ReverseComparison()} cmp yes no) // Constant comparisons. -(CMPconst (MOVDconst [x]) [y]) && x==y -> (FlagEQ) -(CMPconst (MOVDconst [x]) [y]) && x (FlagLT) -(CMPconst (MOVDconst [x]) [y]) && x>y -> (FlagGT) +(CMPconst (MOVDconst [x]) [y]) && x==int64(y) => (FlagEQ) +(CMPconst (MOVDconst [x]) [y]) && x (FlagLT) +(CMPconst (MOVDconst [x]) [y]) && x>int64(y) => (FlagGT) (CMPUconst (MOVDconst [x]) [y]) && uint64(x)==uint64(y) => (FlagEQ) (CMPUconst (MOVDconst [x]) [y]) && uint64(x) (FlagLT) (CMPUconst (MOVDconst [x]) [y]) && uint64(x)>uint64(y) => (FlagGT) @@ -1158,31 +1157,31 @@ // Convert constant subtracts to constant adds. (SUBconst [c] x) && c != -(1<<31) => (ADDconst [-c] x) -(SUBWconst [c] x) -> (ADDWconst [int64(int32(-c))] x) +(SUBWconst [c] x) => (ADDWconst [-int32(c)] x) // generic constant folding // TODO: more of this -(ADDconst [c] (MOVDconst [d])) -> (MOVDconst [c+d]) -(ADDWconst [c] (MOVDconst [d])) -> (MOVDconst [int64(int32(c+d))]) -(ADDconst [c] (ADDconst [d] x)) && is32Bit(c+d) -> (ADDconst [c+d] x) -(ADDWconst [c] (ADDWconst [d] x)) -> (ADDWconst [int64(int32(c+d))] x) -(SUBconst (MOVDconst [d]) [c]) -> (MOVDconst [d-c]) -(SUBconst (SUBconst x [d]) [c]) && is32Bit(-c-d) -> (ADDconst [-c-d] x) +(ADDconst [c] (MOVDconst [d])) => (MOVDconst [int64(c)+d]) +(ADDWconst [c] (MOVDconst [d])) => (MOVDconst [int64(c)+d]) +(ADDconst [c] (ADDconst [d] x)) && is32Bit(int64(c)+int64(d)) => (ADDconst [c+d] x) +(ADDWconst [c] (ADDWconst [d] x)) => (ADDWconst [int32(c+d)] x) +(SUBconst (MOVDconst [d]) [c]) => (MOVDconst [d-int64(c)]) +(SUBconst (SUBconst x [d]) [c]) && is32Bit(-int64(c)-int64(d)) => (ADDconst [-c-d] x) (SRADconst [c] (MOVDconst [d])) => (MOVDconst [d>>uint64(c)]) (SRAWconst [c] (MOVDconst [d])) => (MOVDconst [int64(int32(d))>>uint64(c)]) (NEG (MOVDconst [c])) => (MOVDconst [-c]) (NEGW (MOVDconst [c])) => (MOVDconst [int64(int32(-c))]) -(MULLDconst [c] (MOVDconst [d])) -> (MOVDconst [c*d]) -(MULLWconst [c] (MOVDconst [d])) -> (MOVDconst [int64(int32(c*d))]) +(MULLDconst [c] (MOVDconst [d])) => (MOVDconst [int64(c)*d]) +(MULLWconst [c] (MOVDconst [d])) => (MOVDconst [int64(c*int32(d))]) (AND (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [c&d]) (ANDconst [c] (MOVDconst [d])) => (MOVDconst [c&d]) -(ANDWconst [c] (MOVDconst [d])) -> (MOVDconst [c&d]) +(ANDWconst [c] (MOVDconst [d])) => (MOVDconst [int64(c)&d]) (OR (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [c|d]) (ORconst [c] (MOVDconst [d])) => (MOVDconst [c|d]) -(ORWconst [c] (MOVDconst [d])) -> (MOVDconst [c|d]) +(ORWconst [c] (MOVDconst [d])) => (MOVDconst [int64(c)|d]) (XOR (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [c^d]) (XORconst [c] (MOVDconst [d])) => (MOVDconst [c^d]) -(XORWconst [c] (MOVDconst [d])) -> (MOVDconst [c^d]) +(XORWconst [c] (MOVDconst [d])) => (MOVDconst [int64(c)^d]) (LoweredRound32F x:(FMOVSconst)) => x (LoweredRound64F x:(FMOVDconst)) => x @@ -1199,19 +1198,19 @@ (XOR x x) => (MOVDconst [0]) (XORW x x) => (MOVDconst [0]) (NEG (ADDconst [c] (NEG x))) && c != -(1<<31) => (ADDconst [-c] x) -(MOVBZreg (ANDWconst [m] x)) -> (MOVWZreg (ANDWconst [int64( uint8(m))] x)) -(MOVHZreg (ANDWconst [m] x)) -> (MOVWZreg (ANDWconst [int64(uint16(m))] x)) -(MOVBreg (ANDWconst [m] x)) && int8(m) >= 0 -> (MOVWZreg (ANDWconst [int64( uint8(m))] x)) -(MOVHreg (ANDWconst [m] x)) && int16(m) >= 0 -> (MOVWZreg (ANDWconst [int64(uint16(m))] x)) +(MOVBZreg (ANDWconst [m] x)) => (MOVWZreg (ANDWconst [int32( uint8(m))] x)) +(MOVHZreg (ANDWconst [m] x)) => (MOVWZreg (ANDWconst [int32(uint16(m))] x)) +(MOVBreg (ANDWconst [m] x)) && int8(m) >= 0 => (MOVWZreg (ANDWconst [int32( uint8(m))] x)) +(MOVHreg (ANDWconst [m] x)) && int16(m) >= 0 => (MOVWZreg (ANDWconst [int32(uint16(m))] x)) // carry flag generation // (only constant fold carry of zero) (Select1 (ADDCconst (MOVDconst [c]) [d])) - && uint64(c+d) >= uint64(c) && c+d == 0 - -> (FlagEQ) + && uint64(c+int64(d)) >= uint64(c) && c+int64(d) == 0 + => (FlagEQ) (Select1 (ADDCconst (MOVDconst [c]) [d])) - && uint64(c+d) >= uint64(c) && c+d != 0 - -> (FlagLT) + && uint64(c+int64(d)) >= uint64(c) && c+int64(d) != 0 + => (FlagLT) // borrow flag generation // (only constant fold borrow of zero) @@ -1225,8 +1224,8 @@ // add with carry (ADDE x y (FlagEQ)) => (ADDC x y) (ADDE x y (FlagLT)) => (ADDC x y) -(ADDC x (MOVDconst [c])) && is16Bit(c) -> (ADDCconst x [c]) -(Select0 (ADDCconst (MOVDconst [c]) [d])) -> (MOVDconst [c+d]) +(ADDC x (MOVDconst [c])) && is16Bit(c) => (ADDCconst x [int16(c)]) +(Select0 (ADDCconst (MOVDconst [c]) [d])) => (MOVDconst [c+int64(d)]) // subtract with borrow (SUBE x y (FlagGT)) => (SUBC x y) @@ -1256,14 +1255,12 @@ (C(G|LG)IJ {s390x.Greater} (NEG (Select0 (SUBE (MOVDconst [0]) (MOVDconst [0]) borrow))) [0]) => (BRC {s390x.Borrow} borrow) // fused multiply-add -(Select0 (F(ADD|SUB) (FMUL y z) x)) -> (FM(ADD|SUB) x y z) -(Select0 (F(ADDS|SUBS) (FMULS y z) x)) -> (FM(ADDS|SUBS) x y z) +(Select0 (F(ADD|SUB) (FMUL y z) x)) => (FM(ADD|SUB) x y z) +(Select0 (F(ADDS|SUBS) (FMULS y z) x)) => (FM(ADDS|SUBS) x y z) // Convert floating point comparisons against zero into 'load and test' instructions. -(FCMP x (FMOVDconst [c])) && auxTo64F(c) == 0 -> (LTDBR x) -(FCMPS x (FMOVSconst [c])) && auxTo32F(c) == 0 -> (LTEBR x) -(FCMP (FMOVDconst [c]) x) && auxTo64F(c) == 0 -> (InvertFlags (LTDBR x)) -(FCMPS (FMOVSconst [c]) x) && auxTo32F(c) == 0 -> (InvertFlags (LTEBR x)) +(F(CMP|CMPS) x (FMOV(D|S)const [0.0])) => (LT(D|E)BR x) +(F(CMP|CMPS) (FMOV(D|S)const [0.0]) x) => (InvertFlags (LT(D|E)BR x)) // FSUB, FSUBS, FADD, FADDS now produce a condition code representing the // comparison of the result with 0.0. If a compare with zero instruction @@ -1274,30 +1271,30 @@ // but moving the flag generating value to a different block seems to // increase the likelihood that the flags value will have to be regenerated // by flagalloc which is not what we want. -(LTDBR (Select0 x:(F(ADD|SUB) _ _))) && b == x.Block -> (Select1 x) -(LTEBR (Select0 x:(F(ADDS|SUBS) _ _))) && b == x.Block -> (Select1 x) +(LTDBR (Select0 x:(F(ADD|SUB) _ _))) && b == x.Block => (Select1 x) +(LTEBR (Select0 x:(F(ADDS|SUBS) _ _))) && b == x.Block => (Select1 x) // Fold memory operations into operations. // Exclude global data (SB) because these instructions cannot handle relative addresses. // TODO(mundaym): indexed versions of these? ((ADD|SUB|MULLD|AND|OR|XOR) x g:(MOVDload [off] {sym} ptr mem)) && ptr.Op != OpSB - && is20Bit(off) + && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) - -> ((ADD|SUB|MULLD|AND|OR|XOR)load [off] {sym} x ptr mem) + => ((ADD|SUB|MULLD|AND|OR|XOR)load [off] {sym} x ptr mem) ((ADD|SUB|MULL|AND|OR|XOR)W x g:(MOVWload [off] {sym} ptr mem)) && ptr.Op != OpSB - && is20Bit(off) + && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) - -> ((ADD|SUB|MULL|AND|OR|XOR)Wload [off] {sym} x ptr mem) + => ((ADD|SUB|MULL|AND|OR|XOR)Wload [off] {sym} x ptr mem) ((ADD|SUB|MULL|AND|OR|XOR)W x g:(MOVWZload [off] {sym} ptr mem)) && ptr.Op != OpSB - && is20Bit(off) + && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) - -> ((ADD|SUB|MULL|AND|OR|XOR)Wload [off] {sym} x ptr mem) + => ((ADD|SUB|MULL|AND|OR|XOR)Wload [off] {sym} x ptr mem) // Combine constant stores into larger (unaligned) stores. // Avoid SB because constant stores to relative offsets are @@ -1305,21 +1302,21 @@ (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) && p.Op != OpSB && x.Uses == 1 - && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() + && a.Off() + 1 == c.Off() && clobber(x) - -> (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) + => (MOVHstoreconst [makeValAndOff32(c.Val32()&0xff | a.Val32()<<8, a.Off32())] {s} p mem) (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) && p.Op != OpSB && x.Uses == 1 - && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() + && a.Off() + 2 == c.Off() && clobber(x) - -> (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) + => (MOVWstore [a.Off32()] {s} p (MOVDconst [int64(c.Val32()&0xffff | a.Val32()<<16)]) mem) (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) && p.Op != OpSB && x.Uses == 1 - && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() + && a.Off() + 4 == c.Off() && clobber(x) - -> (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) + => (MOVDstore [a.Off32()] {s} p (MOVDconst [c.Val()&0xffffffff | a.Val()<<32]) mem) // Combine stores into larger (unaligned) stores. // It doesn't work on global data (based on SB) because stores with relative addressing @@ -1328,93 +1325,93 @@ && p.Op != OpSB && x.Uses == 1 && clobber(x) - -> (MOVHstore [i-1] {s} p w mem) + => (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) + => (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) + => (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-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) + => (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) + => (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) + => (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-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) + => (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) + => (MOVDstore [i-4] {s} p w0 mem) (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVHstoreidx [i-1] {s} p idx w mem) + => (MOVHstoreidx [i-1] {s} p idx w mem) (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVHstoreidx [i-1] {s} p idx w0 mem) + => (MOVHstoreidx [i-1] {s} p idx w0 mem) (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVHstoreidx [i-1] {s} p idx w mem) + => (MOVHstoreidx [i-1] {s} p idx w mem) (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVHstoreidx [i-1] {s} p idx w0 mem) + => (MOVHstoreidx [i-1] {s} p idx w0 mem) (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVWstoreidx [i-2] {s} p idx w mem) + => (MOVWstoreidx [i-2] {s} p idx w mem) (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVWstoreidx [i-2] {s} p idx w0 mem) + => (MOVWstoreidx [i-2] {s} p idx w0 mem) (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVWstoreidx [i-2] {s} p idx w mem) + => (MOVWstoreidx [i-2] {s} p idx w mem) (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVWstoreidx [i-2] {s} p idx w0 mem) + => (MOVWstoreidx [i-2] {s} p idx w0 mem) (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVDstoreidx [i-4] {s} p idx w mem) + => (MOVDstoreidx [i-4] {s} p idx w mem) (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVDstoreidx [i-4] {s} p idx w0 mem) + => (MOVDstoreidx [i-4] {s} p idx 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, @@ -1423,87 +1420,87 @@ && p.Op != OpSB && x.Uses == 1 && clobber(x) - -> (MOVHBRstore [i-1] {s} p w mem) + => (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) + => (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) + => (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-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) + => (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) + => (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) + => (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-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) + => (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) + => (MOVDBRstore [i-4] {s} p w0 mem) (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) && x.Uses == 1 && clobber(x) - -> (MOVHBRstoreidx [i-1] {s} p idx w mem) + => (MOVHBRstoreidx [i-1] {s} p idx w mem) (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + => (MOVHBRstoreidx [i-1] {s} p idx w0 mem) (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) && x.Uses == 1 && clobber(x) - -> (MOVHBRstoreidx [i-1] {s} p idx w mem) + => (MOVHBRstoreidx [i-1] {s} p idx w mem) (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVHBRstoreidx [i-1] {s} p idx w0 mem) + => (MOVHBRstoreidx [i-1] {s} p idx w0 mem) (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) && x.Uses == 1 && clobber(x) - -> (MOVWBRstoreidx [i-2] {s} p idx w mem) + => (MOVWBRstoreidx [i-2] {s} p idx w mem) (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + => (MOVWBRstoreidx [i-2] {s} p idx w0 mem) (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) && x.Uses == 1 && clobber(x) - -> (MOVWBRstoreidx [i-2] {s} p idx w mem) + => (MOVWBRstoreidx [i-2] {s} p idx w mem) (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVWBRstoreidx [i-2] {s} p idx w0 mem) + => (MOVWBRstoreidx [i-2] {s} p idx w0 mem) (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) && x.Uses == 1 && clobber(x) - -> (MOVDBRstoreidx [i-4] {s} p idx w mem) + => (MOVDBRstoreidx [i-4] {s} p idx w mem) (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) && x.Uses == 1 && clobber(x) - -> (MOVDBRstoreidx [i-4] {s} p idx w0 mem) + => (MOVDBRstoreidx [i-4] {s} p idx w0 mem) // Combining byte loads into larger (unaligned) loads. @@ -1518,7 +1515,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) + => @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))) @@ -1529,7 +1526,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVHZload [i0] {s} p mem) + => @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))) @@ -1540,7 +1537,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) + => @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))) @@ -1551,7 +1548,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) + => @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))) @@ -1562,7 +1559,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) + => @mergePoint(b,x0,x1) (MOVDload [i0] {s} p mem) (ORW s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem)) @@ -1579,7 +1576,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZload [i0] {s} p mem)) y) + => @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZload [i0] {s} p mem)) y) (OR s0:(SLDconst [j0] x0:(MOVBZload [i0] {s} p mem)) @@ -1596,7 +1593,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZload [i0] {s} p mem)) y) + => @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZload [i0] {s} p mem)) y) (OR s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem)) @@ -1613,7 +1610,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) + => @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) // Big-endian indexed loads @@ -1626,7 +1623,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) + => @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) (OR x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx mem))) @@ -1637,7 +1634,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) + => @mergePoint(b,x0,x1) (MOVHZloadidx [i0] {s} p idx mem) (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) @@ -1648,7 +1645,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) + => @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) @@ -1659,7 +1656,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) + => @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx mem))) @@ -1670,7 +1667,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) + => @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) @@ -1687,7 +1684,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) + => @mergePoint(b,x0,x1,y) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) @@ -1704,7 +1701,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) + => @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) @@ -1721,7 +1718,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) + => @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) // Little-endian loads @@ -1734,7 +1731,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) + => @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))) @@ -1745,7 +1742,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRload [i0] {s} p mem)) + => @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)))) @@ -1757,7 +1754,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh) - -> @mergePoint(b,x0,x1) (MOVWBRload [i0] {s} p mem) + => @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)))) @@ -1769,7 +1766,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh) - -> @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) + => @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)))) @@ -1781,7 +1778,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh) - -> @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) + => @mergePoint(b,x0,x1) (MOVDBRload [i0] {s} p mem) (ORW s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem)) @@ -1799,7 +1796,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) + => @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) (OR s1:(SLDconst [j1] x1:(MOVBZload [i1] {s} p mem)) @@ -1817,7 +1814,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) + => @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) @@ -1836,7 +1833,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, r0, r1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) + => @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) // Little-endian indexed loads @@ -1849,7 +1846,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + => @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx mem))) @@ -1860,7 +1857,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, sh) - -> @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) + => @mergePoint(b,x0,x1) (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem)) (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) @@ -1872,7 +1869,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh) - -> @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) + => @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) @@ -1884,7 +1881,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh) - -> @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) + => @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx mem)))) @@ -1896,7 +1893,7 @@ && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0, x1, r0, r1, sh) - -> @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) + => @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) @@ -1914,7 +1911,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + => @mergePoint(b,x0,x1,y) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) @@ -1932,7 +1929,7 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) + => @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) @@ -1951,53 +1948,53 @@ && or.Uses == 1 && mergePoint(b,x0,x1,y) != nil && clobber(x0, x1, r0, r1, s0, s1, or) - -> @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) + => @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) // Combine stores into store multiples. // 32-bit (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) && p.Op != OpSB && x.Uses == 1 - && is20Bit(i-4) + && is20Bit(int64(i)-4) && clobber(x) - -> (STM2 [i-4] {s} p w0 w1 mem) + => (STM2 [i-4] {s} p w0 w1 mem) (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) && x.Uses == 1 - && is20Bit(i-8) + && is20Bit(int64(i)-8) && clobber(x) - -> (STM3 [i-8] {s} p w0 w1 w2 mem) + => (STM3 [i-8] {s} p w0 w1 w2 mem) (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) && x.Uses == 1 - && is20Bit(i-12) + && is20Bit(int64(i)-12) && clobber(x) - -> (STM4 [i-12] {s} p w0 w1 w2 w3 mem) + => (STM4 [i-12] {s} p w0 w1 w2 w3 mem) (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) && x.Uses == 1 - && is20Bit(i-8) + && is20Bit(int64(i)-8) && clobber(x) - -> (STM4 [i-8] {s} p w0 w1 w2 w3 mem) + => (STM4 [i-8] {s} p w0 w1 w2 w3 mem) // 64-bit (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) && p.Op != OpSB && x.Uses == 1 - && is20Bit(i-8) + && is20Bit(int64(i)-8) && clobber(x) - -> (STMG2 [i-8] {s} p w0 w1 mem) + => (STMG2 [i-8] {s} p w0 w1 mem) (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) && x.Uses == 1 - && is20Bit(i-16) + && is20Bit(int64(i)-16) && clobber(x) - -> (STMG3 [i-16] {s} p w0 w1 w2 mem) + => (STMG3 [i-16] {s} p w0 w1 w2 mem) (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) && x.Uses == 1 - && is20Bit(i-24) + && is20Bit(int64(i)-24) && clobber(x) - -> (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) + => (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) && x.Uses == 1 - && is20Bit(i-16) + && is20Bit(int64(i)-16) && clobber(x) - -> (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) + => (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) // Convert 32-bit store multiples into 64-bit stores. -(STM2 [i] {s} p (SRDconst [32] x) x mem) -> (MOVDstore [i] {s} p x mem) +(STM2 [i] {s} p (SRDconst [32] x) x mem) => (MOVDstore [i] {s} p x mem) diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index 536f8db320..2dba8163bc 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -3,6 +3,7 @@ package ssa +import "math" import "cmd/compile/internal/types" import "cmd/internal/obj/s390x" @@ -5281,19 +5282,19 @@ func rewriteValueS390X_OpS390XADD(v *Value) bool { v_0 := v.Args[0] // match: (ADD x (MOVDconst [c])) // cond: is32Bit(c) - // result: (ADDconst [c] x) + // result: (ADDconst [int32(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 != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { continue } v.reset(OpS390XADDconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -5362,7 +5363,7 @@ func rewriteValueS390X_OpS390XADD(v *Value) bool { break } // match: (ADD x g:(MOVDload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ADDload [off] {sym} x ptr mem) for { t := v.Type @@ -5372,17 +5373,17 @@ func rewriteValueS390X_OpS390XADD(v *Value) bool { if g.Op != OpS390XMOVDload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XADDload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -5395,19 +5396,19 @@ func rewriteValueS390X_OpS390XADDC(v *Value) bool { v_0 := v.Args[0] // match: (ADDC x (MOVDconst [c])) // cond: is16Bit(c) - // result: (ADDCconst x [c]) + // result: (ADDCconst x [int16(c)]) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 if v_1.Op != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is16Bit(c)) { continue } v.reset(OpS390XADDCconst) - v.AuxInt = c + v.AuxInt = int16ToAuxInt(int16(c)) v.AddArg(x) return true } @@ -5482,16 +5483,16 @@ func rewriteValueS390X_OpS390XADDW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ADDW x (MOVDconst [c])) - // result: (ADDWconst [int64(int32(c))] x) + // result: (ADDWconst [int32(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 != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XADDWconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -5537,7 +5538,7 @@ func rewriteValueS390X_OpS390XADDW(v *Value) bool { break } // match: (ADDW x g:(MOVWload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ADDWload [off] {sym} x ptr mem) for { t := v.Type @@ -5547,24 +5548,24 @@ func rewriteValueS390X_OpS390XADDW(v *Value) bool { if g.Op != OpS390XMOVWload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XADDWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } break } // match: (ADDW x g:(MOVWZload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ADDWload [off] {sym} x ptr mem) for { t := v.Type @@ -5574,17 +5575,17 @@ func rewriteValueS390X_OpS390XADDW(v *Value) bool { if g.Op != OpS390XMOVWZload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XADDWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -5607,28 +5608,28 @@ func rewriteValueS390X_OpS390XADDWconst(v *Value) bool { return true } // match: (ADDWconst [c] (MOVDconst [d])) - // result: (MOVDconst [int64(int32(c+d))]) + // result: (MOVDconst [int64(c)+d]) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = int64(int32(c + d)) + v.AuxInt = int64ToAuxInt(int64(c) + d) return true } // match: (ADDWconst [c] (ADDWconst [d] x)) - // result: (ADDWconst [int64(int32(c+d))] x) + // result: (ADDWconst [int32(c+d)] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XADDWconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] v.reset(OpS390XADDWconst) - v.AuxInt = int64(int32(c + d)) + v.AuxInt = int32ToAuxInt(int32(c + d)) v.AddArg(x) return true } @@ -5639,47 +5640,47 @@ func rewriteValueS390X_OpS390XADDWload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ADDWload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (ADDWload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XADDWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (ADDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (ADDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (ADDWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XADDWload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -5688,63 +5689,63 @@ func rewriteValueS390X_OpS390XADDWload(v *Value) bool { func rewriteValueS390X_OpS390XADDconst(v *Value) bool { v_0 := v.Args[0] // match: (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) - // cond: ((c+d)&1 == 0) && is32Bit(c+d) + // cond: ((c+d)&1 == 0) && is32Bit(int64(c)+int64(d)) // result: (MOVDaddr [c+d] {s} x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDaddr { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) x := v_0.Args[0] - if x.Op != OpSB || !(((c+d)&1 == 0) && is32Bit(c+d)) { + if x.Op != OpSB || !(((c+d)&1 == 0) && is32Bit(int64(c)+int64(d))) { break } v.reset(OpS390XMOVDaddr) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg(x) return true } // match: (ADDconst [c] (MOVDaddr [d] {s} x)) - // cond: x.Op != OpSB && is20Bit(c+d) + // cond: x.Op != OpSB && is20Bit(int64(c)+int64(d)) // result: (MOVDaddr [c+d] {s} x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDaddr { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) x := v_0.Args[0] - if !(x.Op != OpSB && is20Bit(c+d)) { + if !(x.Op != OpSB && is20Bit(int64(c)+int64(d))) { break } v.reset(OpS390XMOVDaddr) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg(x) return true } // match: (ADDconst [c] (MOVDaddridx [d] {s} x y)) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVDaddridx [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDaddridx { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XMOVDaddridx) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -5759,32 +5760,32 @@ func rewriteValueS390X_OpS390XADDconst(v *Value) bool { return true } // match: (ADDconst [c] (MOVDconst [d])) - // result: (MOVDconst [c+d]) + // result: (MOVDconst [int64(c)+d]) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = c + d + v.AuxInt = int64ToAuxInt(int64(c) + d) return true } // match: (ADDconst [c] (ADDconst [d] x)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (ADDconst [c+d] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XADDconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpS390XADDconst) - v.AuxInt = c + d + v.AuxInt = int32ToAuxInt(c + d) v.AddArg(x) return true } @@ -5819,47 +5820,47 @@ func rewriteValueS390X_OpS390XADDload(v *Value) bool { return true } // match: (ADDload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (ADDload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XADDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (ADDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (ADDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (ADDload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XADDload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -5892,20 +5893,20 @@ func rewriteValueS390X_OpS390XAND(v *Value) bool { } // match: (AND x (MOVDconst [c])) // cond: is32Bit(c) && c >= 0 - // result: (MOVWZreg (ANDWconst [int64(int32(c))] x)) + // result: (MOVWZreg (ANDWconst [int32(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 != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c) && c >= 0) { continue } v.reset(OpS390XMOVWZreg) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(int32(c)) + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -6001,7 +6002,7 @@ func rewriteValueS390X_OpS390XAND(v *Value) bool { return true } // match: (AND x g:(MOVDload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ANDload [off] {sym} x ptr mem) for { t := v.Type @@ -6011,17 +6012,17 @@ func rewriteValueS390X_OpS390XAND(v *Value) bool { if g.Op != OpS390XMOVDload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XANDload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -6033,16 +6034,16 @@ func rewriteValueS390X_OpS390XANDW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ANDW x (MOVDconst [c])) - // result: (ANDWconst [int64(int32(c))] x) + // result: (ANDWconst [int32(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 != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XANDWconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -6059,7 +6060,7 @@ func rewriteValueS390X_OpS390XANDW(v *Value) bool { return true } // match: (ANDW x g:(MOVWload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ANDWload [off] {sym} x ptr mem) for { t := v.Type @@ -6069,24 +6070,24 @@ func rewriteValueS390X_OpS390XANDW(v *Value) bool { if g.Op != OpS390XMOVWload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XANDWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } break } // match: (ANDW x g:(MOVWZload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ANDWload [off] {sym} x ptr mem) for { t := v.Type @@ -6096,17 +6097,17 @@ func rewriteValueS390X_OpS390XANDW(v *Value) bool { if g.Op != OpS390XMOVWZload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XANDWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -6117,7 +6118,7 @@ func rewriteValueS390X_OpS390XANDW(v *Value) bool { func rewriteValueS390X_OpS390XANDWconst(v *Value) bool { v_0 := v.Args[0] // match: (ANDWconst [c] (ANDWconst [d] x)) - // result: (ANDWconst [c & d] x) + // result: (ANDWconst [c&d] x) for { c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XANDWconst { @@ -6177,15 +6178,15 @@ func rewriteValueS390X_OpS390XANDWconst(v *Value) bool { return true } // match: (ANDWconst [c] (MOVDconst [d])) - // result: (MOVDconst [c&d]) + // result: (MOVDconst [int64(c)&d]) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = c & d + v.AuxInt = int64ToAuxInt(int64(c) & d) return true } return false @@ -6195,47 +6196,47 @@ func rewriteValueS390X_OpS390XANDWload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ANDWload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (ANDWload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XANDWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (ANDWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (ANDWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (ANDWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XANDWload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -6244,7 +6245,7 @@ func rewriteValueS390X_OpS390XANDWload(v *Value) bool { func rewriteValueS390X_OpS390XANDconst(v *Value) bool { v_0 := v.Args[0] // match: (ANDconst [c] (ANDconst [d] x)) - // result: (ANDconst [c & d] x) + // result: (ANDconst [c&d] x) for { c := auxIntToInt64(v.AuxInt) if v_0.Op != OpS390XANDconst { @@ -6320,47 +6321,47 @@ func rewriteValueS390X_OpS390XANDload(v *Value) bool { return true } // match: (ANDload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (ANDload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XANDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (ANDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (ANDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (ANDload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XANDload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -6372,36 +6373,36 @@ func rewriteValueS390X_OpS390XCMP(v *Value) bool { b := v.Block // match: (CMP x (MOVDconst [c])) // cond: is32Bit(c) - // result: (CMPconst x [c]) + // result: (CMPconst x [int32(c)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { break } v.reset(OpS390XCMPconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } // match: (CMP (MOVDconst [c]) x) // cond: is32Bit(c) - // result: (InvertFlags (CMPconst x [c])) + // result: (InvertFlags (CMPconst x [int32(c)])) for { if v_0.Op != OpS390XMOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 if !(is32Bit(c)) { break } v.reset(OpS390XInvertFlags) v0 := b.NewValue0(v.Pos, OpS390XCMPconst, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -6429,36 +6430,36 @@ func rewriteValueS390X_OpS390XCMPU(v *Value) bool { b := v.Block // match: (CMPU x (MOVDconst [c])) // cond: isU32Bit(c) - // result: (CMPUconst x [int64(int32(c))]) + // result: (CMPUconst x [int32(c)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isU32Bit(c)) { break } v.reset(OpS390XCMPUconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } // match: (CMPU (MOVDconst [c]) x) // cond: isU32Bit(c) - // result: (InvertFlags (CMPUconst x [int64(int32(c))])) + // result: (InvertFlags (CMPUconst x [int32(c)])) for { if v_0.Op != OpS390XMOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 if !(isU32Bit(c)) { break } v.reset(OpS390XInvertFlags) v0 := b.NewValue0(v.Pos, OpS390XCMPUconst, types.TypeFlags) - v0.AuxInt = int64(int32(c)) + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -6656,29 +6657,29 @@ func rewriteValueS390X_OpS390XCMPW(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (CMPW x (MOVDconst [c])) - // result: (CMPWconst x [int64(int32(c))]) + // result: (CMPWconst x [int32(c)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XCMPWconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } // match: (CMPW (MOVDconst [c]) x) - // result: (InvertFlags (CMPWconst x [int64(int32(c))])) + // result: (InvertFlags (CMPWconst x [int32(c)])) for { if v_0.Op != OpS390XMOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpS390XInvertFlags) v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) - v0.AuxInt = int64(int32(c)) + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -6753,29 +6754,29 @@ func rewriteValueS390X_OpS390XCMPWU(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (CMPWU x (MOVDconst [c])) - // result: (CMPWUconst x [int64(int32(c))]) + // result: (CMPWUconst x [int32(c)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XCMPWUconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } // match: (CMPWU (MOVDconst [c]) x) - // result: (InvertFlags (CMPWUconst x [int64(int32(c))])) + // result: (InvertFlags (CMPWUconst x [int32(c)])) for { if v_0.Op != OpS390XMOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpS390XInvertFlags) v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) - v0.AuxInt = int64(int32(c)) + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -7120,45 +7121,45 @@ func rewriteValueS390X_OpS390XCMPWconst(v *Value) bool { func rewriteValueS390X_OpS390XCMPconst(v *Value) bool { v_0 := v.Args[0] // match: (CMPconst (MOVDconst [x]) [y]) - // cond: x==y + // cond: x==int64(y) // result: (FlagEQ) for { - y := v.AuxInt + y := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - x := v_0.AuxInt - if !(x == y) { + x := auxIntToInt64(v_0.AuxInt) + if !(x == int64(y)) { break } v.reset(OpS390XFlagEQ) return true } // match: (CMPconst (MOVDconst [x]) [y]) - // cond: xy + // cond: x>int64(y) // result: (FlagGT) for { - y := v.AuxInt + y := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - x := v_0.AuxInt - if !(x > y) { + x := auxIntToInt64(v_0.AuxInt) + if !(x > int64(y)) { break } v.reset(OpS390XFlagGT) @@ -7310,15 +7311,15 @@ func rewriteValueS390X_OpS390XCPSDR(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CPSDR y (FMOVDconst [c])) - // cond: c & -1<<63 == 0 + // cond: !math.Signbit(c) // result: (LPDFR y) for { y := v_0 if v_1.Op != OpS390XFMOVDconst { break } - c := v_1.AuxInt - if !(c&-1<<63 == 0) { + c := auxIntToFloat64(v_1.AuxInt) + if !(!math.Signbit(c)) { break } v.reset(OpS390XLPDFR) @@ -7326,15 +7327,15 @@ func rewriteValueS390X_OpS390XCPSDR(v *Value) bool { return true } // match: (CPSDR y (FMOVDconst [c])) - // cond: c & -1<<63 != 0 + // cond: math.Signbit(c) // result: (LNDFR y) for { y := v_0 if v_1.Op != OpS390XFMOVDconst { break } - c := v_1.AuxInt - if !(c&-1<<63 != 0) { + c := auxIntToFloat64(v_1.AuxInt) + if !(math.Signbit(c)) { break } v.reset(OpS390XLNDFR) @@ -7347,34 +7348,24 @@ func rewriteValueS390X_OpS390XFCMP(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] b := v.Block - // match: (FCMP x (FMOVDconst [c])) - // cond: auxTo64F(c) == 0 + // match: (FCMP x (FMOVDconst [0.0])) // result: (LTDBR x) for { x := v_0 - if v_1.Op != OpS390XFMOVDconst { - break - } - c := v_1.AuxInt - if !(auxTo64F(c) == 0) { + if v_1.Op != OpS390XFMOVDconst || auxIntToFloat64(v_1.AuxInt) != 0.0 { break } v.reset(OpS390XLTDBR) v.AddArg(x) return true } - // match: (FCMP (FMOVDconst [c]) x) - // cond: auxTo64F(c) == 0 + // match: (FCMP (FMOVDconst [0.0]) x) // result: (InvertFlags (LTDBR x)) for { - if v_0.Op != OpS390XFMOVDconst { + if v_0.Op != OpS390XFMOVDconst || auxIntToFloat64(v_0.AuxInt) != 0.0 { break } - c := v_0.AuxInt x := v_1 - if !(auxTo64F(c) == 0) { - break - } v.reset(OpS390XInvertFlags) v0 := b.NewValue0(v.Pos, OpS390XLTDBR, v.Type) v0.AddArg(x) @@ -7387,34 +7378,24 @@ func rewriteValueS390X_OpS390XFCMPS(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] b := v.Block - // match: (FCMPS x (FMOVSconst [c])) - // cond: auxTo32F(c) == 0 + // match: (FCMPS x (FMOVSconst [0.0])) // result: (LTEBR x) for { x := v_0 - if v_1.Op != OpS390XFMOVSconst { - break - } - c := v_1.AuxInt - if !(auxTo32F(c) == 0) { + if v_1.Op != OpS390XFMOVSconst || auxIntToFloat32(v_1.AuxInt) != 0.0 { break } v.reset(OpS390XLTEBR) v.AddArg(x) return true } - // match: (FCMPS (FMOVSconst [c]) x) - // cond: auxTo32F(c) == 0 + // match: (FCMPS (FMOVSconst [0.0]) x) // result: (InvertFlags (LTEBR x)) for { - if v_0.Op != OpS390XFMOVSconst { + if v_0.Op != OpS390XFMOVSconst || auxIntToFloat32(v_0.AuxInt) != 0.0 { break } - c := v_0.AuxInt x := v_1 - if !(auxTo32F(c) == 0) { - break - } v.reset(OpS390XInvertFlags) v0 := b.NewValue0(v.Pos, OpS390XLTEBR, v.Type) v0.AddArg(x) @@ -7464,68 +7445,68 @@ func rewriteValueS390X_OpS390XFMOVDload(v *Value) bool { return true } // match: (FMOVDload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (FMOVDload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XFMOVDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (FMOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (FMOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (FMOVDload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XFMOVDload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (FMOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (FMOVDloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XFMOVDloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -7563,46 +7544,46 @@ func rewriteValueS390X_OpS390XFMOVDloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XFMOVDloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpS390XADDconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XFMOVDloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -7613,71 +7594,71 @@ func rewriteValueS390X_OpS390XFMOVDstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (FMOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (FMOVDstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XFMOVDstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (FMOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (FMOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (FMOVDstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XFMOVDstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(base, val, mem) return true } // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (FMOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (FMOVDstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg4(ptr, idx, val, mem) return true } @@ -7717,48 +7698,48 @@ func rewriteValueS390X_OpS390XFMOVDstoreidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpS390XADDconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } @@ -7786,68 +7767,68 @@ func rewriteValueS390X_OpS390XFMOVSload(v *Value) bool { return true } // match: (FMOVSload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (FMOVSload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XFMOVSload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (FMOVSload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (FMOVSload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (FMOVSload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XFMOVSload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (FMOVSloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (FMOVSloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XFMOVSloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -7885,46 +7866,46 @@ func rewriteValueS390X_OpS390XFMOVSloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XFMOVSloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpS390XADDconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XFMOVSloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -7935,71 +7916,71 @@ func rewriteValueS390X_OpS390XFMOVSstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (FMOVSstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (FMOVSstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XFMOVSstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (FMOVSstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (FMOVSstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (FMOVSstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XFMOVSstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(base, val, mem) return true } // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (FMOVSstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (FMOVSstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg4(ptr, idx, val, mem) return true } @@ -8039,48 +8020,48 @@ func rewriteValueS390X_OpS390XFMOVSstoreidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpS390XADDconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } @@ -8536,68 +8517,68 @@ func rewriteValueS390X_OpS390XMOVBZload(v *Value) bool { return true } // match: (MOVBZload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVBZload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVBZload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVBZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVBZload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVBZload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVBZload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVBZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVBZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVBZloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -8635,50 +8616,50 @@ func rewriteValueS390X_OpS390XMOVBZloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVBZloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } break } // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVBZloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -8909,16 +8890,16 @@ func rewriteValueS390X_OpS390XMOVBZreg(v *Value) bool { return true } // match: (MOVBZreg (ANDWconst [m] x)) - // result: (MOVWZreg (ANDWconst [int64( uint8(m))] x)) + // result: (MOVWZreg (ANDWconst [int32( uint8(m))] x)) for { if v_0.Op != OpS390XANDWconst { break } - m := v_0.AuxInt + m := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] v.reset(OpS390XMOVWZreg) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(uint8(m)) + v0.AuxInt = int32ToAuxInt(int32(uint8(m))) v0.AddArg(x) v.AddArg(v0) return true @@ -8948,68 +8929,68 @@ func rewriteValueS390X_OpS390XMOVBload(v *Value) bool { return true } // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVBload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVBload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVBload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVBload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVBload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVBload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVBloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVBloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVBloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -9047,50 +9028,50 @@ func rewriteValueS390X_OpS390XMOVBloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVBloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVBloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } break } // match: (MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVBloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVBloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -9297,19 +9278,19 @@ func rewriteValueS390X_OpS390XMOVBreg(v *Value) bool { } // match: (MOVBreg (ANDWconst [m] x)) // cond: int8(m) >= 0 - // result: (MOVWZreg (ANDWconst [int64( uint8(m))] x)) + // result: (MOVWZreg (ANDWconst [int32( uint8(m))] x)) for { if v_0.Op != OpS390XANDWconst { break } - m := v_0.AuxInt + m := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] if !(int8(m) >= 0) { break } v.reset(OpS390XMOVWZreg) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(uint8(m)) + v0.AuxInt = int32ToAuxInt(int32(uint8(m))) v0.AddArg(x) v.AddArg(v0) return true @@ -9355,92 +9336,92 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { return true } // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVBstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVBstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVDconst [c]) mem) - // cond: is20Bit(off) && ptr.Op != OpSB - // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) + // cond: is20Bit(int64(off)) && ptr.Op != OpSB + // result: (MOVBstoreconst [makeValAndOff32(int32(int8(c)),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 - if !(is20Bit(off) && ptr.Op != OpSB) { + if !(is20Bit(int64(off)) && ptr.Op != OpSB) { break } v.reset(OpS390XMOVBstoreconst) - v.AuxInt = makeValAndOff(int64(int8(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(int8(c)), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVBstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVBstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVBstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVBstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(base, val, mem) return true } // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVBstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVBstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVBstoreidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg4(ptr, idx, val, mem) return true } @@ -9476,12 +9457,12 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w := v_1 x := v_2 - if x.Op != OpS390XMOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -9489,12 +9470,12 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRDconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRDconst || auxIntToInt8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -9502,17 +9483,17 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w0 := v_1 if w0.Op != OpS390XSRDconst { break } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_2 - if x.Op != OpS390XMOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -9520,12 +9501,12 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRDconst || x_1.AuxInt != j+8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRDconst || auxIntToInt8(x_1.AuxInt) != j+8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -9533,12 +9514,12 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w := v_1 x := v_2 - if x.Op != OpS390XMOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -9546,12 +9527,12 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRWconst || x_1.AuxInt != 8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRWconst || auxIntToInt8(x_1.AuxInt) != 8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -9559,17 +9540,17 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w0 := v_1 if w0.Op != OpS390XSRWconst { break } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_2 - if x.Op != OpS390XMOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -9577,12 +9558,12 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRWconst || x_1.AuxInt != j+8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRWconst || auxIntToInt8(x_1.AuxInt) != j+8 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVHstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -9590,15 +9571,15 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHBRstore [i-1] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 - if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 8 { + if v_1.Op != OpS390XSRDconst || auxIntToInt8(v_1.AuxInt) != 8 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -9606,8 +9587,8 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { break } v.reset(OpS390XMOVHBRstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -9615,16 +9596,16 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHBRstore [i-1] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 if v_1.Op != OpS390XSRDconst { break } - j := v_1.AuxInt + j := auxIntToInt8(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -9632,12 +9613,12 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { break } w0 := x.Args[1] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVHBRstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -9645,15 +9626,15 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHBRstore [i-1] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 - if v_1.Op != OpS390XSRWconst || v_1.AuxInt != 8 { + if v_1.Op != OpS390XSRWconst || auxIntToInt8(v_1.AuxInt) != 8 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -9661,8 +9642,8 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { break } v.reset(OpS390XMOVHBRstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -9670,16 +9651,16 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVHBRstore [i-1] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 if v_1.Op != OpS390XSRWconst { break } - j := v_1.AuxInt + j := auxIntToInt8(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVBstore || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstore || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -9687,12 +9668,12 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { break } w0 := x.Args[1] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRWconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVHBRstore) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -9702,70 +9683,70 @@ func rewriteValueS390X_OpS390XMOVBstoreconst(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBstoreconst [sc] {s} (ADDconst [off] ptr) mem) - // cond: is20Bit(ValAndOff(sc).Off()+off) - // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // cond: is20Bit(sc.Off()+int64(off)) + // result: (MOVBstoreconst [sc.addOffset32(off)] {s} ptr mem) for { - sc := v.AuxInt - s := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off := v_0.AuxInt + off := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(ValAndOff(sc).Off() + off)) { + if !(is20Bit(sc.Off() + int64(off))) { break } v.reset(OpS390XMOVBstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(sc.addOffset32(off)) + v.Aux = symToAux(s) v.AddArg2(ptr, mem) return true } // match: (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) - // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) - // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) + // result: (MOVBstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) for { - sc := v.AuxInt - sym1 := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off := v_0.AuxInt - sym2 := v_0.Aux + off := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { + if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off)) { break } v.reset(OpS390XMOVBstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = valAndOffToAuxInt(sc.addOffset32(off)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } // match: (MOVBstoreconst [c] {s} p x:(MOVBstoreconst [a] {s} p mem)) - // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 1 == ValAndOff(c).Off() && clobber(x) - // result: (MOVHstoreconst [makeValAndOff(ValAndOff(c).Val()&0xff | ValAndOff(a).Val()<<8, ValAndOff(a).Off())] {s} p mem) + // cond: p.Op != OpSB && x.Uses == 1 && a.Off() + 1 == c.Off() && clobber(x) + // result: (MOVHstoreconst [makeValAndOff32(c.Val32()&0xff | a.Val32()<<8, a.Off32())] {s} p mem) for { - c := v.AuxInt - s := v.Aux + c := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 x := v_1 if x.Op != OpS390XMOVBstoreconst { break } - a := x.AuxInt - if x.Aux != s { + 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 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { + if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && a.Off()+1 == c.Off() && clobber(x)) { break } v.reset(OpS390XMOVHstoreconst) - v.AuxInt = makeValAndOff(ValAndOff(c).Val()&0xff|ValAndOff(a).Val()<<8, ValAndOff(a).Off()) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(c.Val32()&0xff|a.Val32()<<8, a.Off32())) + v.Aux = symToAux(s) v.AddArg2(p, mem) return true } @@ -9777,52 +9758,52 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVBstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } break } // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVBstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } @@ -9832,14 +9813,14 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHstoreidx [i-1] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 w := v_2 x := v_3 - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -9850,12 +9831,12 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -9866,8 +9847,8 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 @@ -9875,10 +9856,10 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { if w0.Op != OpS390XSRDconst { continue } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_3 - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -9889,12 +9870,12 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -9905,14 +9886,14 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHstoreidx [i-1] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 w := v_2 x := v_3 - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -9923,12 +9904,12 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRWconst || auxIntToInt8(x_2.AuxInt) != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -9939,8 +9920,8 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 @@ -9948,10 +9929,10 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { if w0.Op != OpS390XSRWconst { continue } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_3 - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -9962,12 +9943,12 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRWconst || auxIntToInt8(x_2.AuxInt) != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVHstoreidx) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -9978,17 +9959,17 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 8 { + if v_2.Op != OpS390XSRDconst || auxIntToInt8(v_2.AuxInt) != 8 { continue } w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -9999,8 +9980,8 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { continue } v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -10011,18 +9992,18 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 if v_2.Op != OpS390XSRDconst { continue } - j := v_2.AuxInt + j := auxIntToInt8(v_2.AuxInt) w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -10033,12 +10014,12 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { continue } w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -10049,17 +10030,17 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 8 { + if v_2.Op != OpS390XSRWconst || auxIntToInt8(v_2.AuxInt) != 8 { continue } w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -10070,8 +10051,8 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { continue } v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -10082,18 +10063,18 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 if v_2.Op != OpS390XSRWconst { continue } - j := v_2.AuxInt + j := auxIntToInt8(v_2.AuxInt) w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVBstoreidx || x.AuxInt != i-1 || x.Aux != s { + if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -10104,12 +10085,12 @@ func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { continue } w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRWconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = i - 1 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 1) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -10122,88 +10103,88 @@ func rewriteValueS390X_OpS390XMOVDaddridx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) - // cond: is20Bit(c+d) && x.Op != OpSB + // cond: is20Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (MOVDaddridx [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is20Bit(c+d) && x.Op != OpSB) { + if !(is20Bit(int64(c)+int64(d)) && x.Op != OpSB) { break } v.reset(OpS390XMOVDaddridx) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) - // cond: is20Bit(c+d) && y.Op != OpSB + // cond: is20Bit(int64(c)+int64(d)) && y.Op != OpSB // result: (MOVDaddridx [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] - if !(is20Bit(c+d) && y.Op != OpSB) { + if !(is20Bit(int64(c)+int64(d)) && y.Op != OpSB) { break } v.reset(OpS390XMOVDaddridx) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB - // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && x.Op != OpSB + // result: (MOVDaddridx [off1+off2] {mergeSymTyped(sym1,sym2)} x y) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) x := v_0.Args[0] y := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } v.reset(OpS390XMOVDaddridx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(x, y) return true } // match: (MOVDaddridx [off1] {sym1} x (MOVDaddr [off2] {sym2} y)) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB - // result: (MOVDaddridx [off1+off2] {mergeSym(sym1,sym2)} x y) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && y.Op != OpSB + // result: (MOVDaddridx [off1+off2] {mergeSymTyped(sym1,sym2)} x y) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) y := v_1.Args[0] - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && y.Op != OpSB) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && y.Op != OpSB) { break } v.reset(OpS390XMOVDaddridx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(x, y) return true } @@ -10250,69 +10231,69 @@ func rewriteValueS390X_OpS390XMOVDload(v *Value) bool { return true } // match: (MOVDload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVDload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVDload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) - // result: (MOVDload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) + // result: (MOVDload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { break } v.reset(OpS390XMOVDload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVDloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVDloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVDloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -10350,50 +10331,50 @@ func rewriteValueS390X_OpS390XMOVDloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVDloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVDloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } break } // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVDloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVDloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -10406,93 +10387,93 @@ func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVDstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVDstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) - // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB - // result: (MOVDstoreconst [makeValAndOff(c,off)] {sym} ptr mem) + // cond: is16Bit(c) && isU12Bit(int64(off)) && ptr.Op != OpSB + // result: (MOVDstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 - if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { + if !(is16Bit(c) && isU12Bit(int64(off)) && ptr.Op != OpSB) { break } v.reset(OpS390XMOVDstoreconst) - v.AuxInt = makeValAndOff(c, off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(c), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVDstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) - // result: (MOVDstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0)) + // result: (MOVDstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { break } v.reset(OpS390XMOVDstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(base, val, mem) return true } // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVDstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVDstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVDstoreidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg4(ptr, idx, val, mem) return true } @@ -10525,15 +10506,15 @@ func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { break } // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) - // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x) + // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(int64(i)-8) && clobber(x) // result: (STMG2 [i-8] {s} p w0 w1 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w1 := v_1 x := v_2 - if x.Op != OpS390XMOVDstore || x.AuxInt != i-8 || x.Aux != s { + if x.Op != OpS390XMOVDstore || auxIntToInt32(x.AuxInt) != i-8 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -10541,25 +10522,25 @@ func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { break } w0 := x.Args[1] - if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { + if !(p.Op != OpSB && x.Uses == 1 && is20Bit(int64(i)-8) && clobber(x)) { break } v.reset(OpS390XSTMG2) - v.AuxInt = i - 8 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 8) + v.Aux = symToAux(s) v.AddArg4(p, w0, w1, mem) return true } // match: (MOVDstore [i] {s} p w2 x:(STMG2 [i-16] {s} p w0 w1 mem)) - // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) + // cond: x.Uses == 1 && is20Bit(int64(i)-16) && clobber(x) // result: (STMG3 [i-16] {s} p w0 w1 w2 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w2 := v_1 x := v_2 - if x.Op != OpS390XSTMG2 || x.AuxInt != i-16 || x.Aux != s { + if x.Op != OpS390XSTMG2 || auxIntToInt32(x.AuxInt) != i-16 || auxToSym(x.Aux) != s { break } mem := x.Args[3] @@ -10568,25 +10549,25 @@ func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { } w0 := x.Args[1] w1 := x.Args[2] - if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { + if !(x.Uses == 1 && is20Bit(int64(i)-16) && clobber(x)) { break } v.reset(OpS390XSTMG3) - v.AuxInt = i - 16 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 16) + v.Aux = symToAux(s) v.AddArg5(p, w0, w1, w2, mem) return true } // match: (MOVDstore [i] {s} p w3 x:(STMG3 [i-24] {s} p w0 w1 w2 mem)) - // cond: x.Uses == 1 && is20Bit(i-24) && clobber(x) + // cond: x.Uses == 1 && is20Bit(int64(i)-24) && clobber(x) // result: (STMG4 [i-24] {s} p w0 w1 w2 w3 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w3 := v_1 x := v_2 - if x.Op != OpS390XSTMG3 || x.AuxInt != i-24 || x.Aux != s { + if x.Op != OpS390XSTMG3 || auxIntToInt32(x.AuxInt) != i-24 || auxToSym(x.Aux) != s { break } mem := x.Args[4] @@ -10596,12 +10577,12 @@ func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { w0 := x.Args[1] w1 := x.Args[2] w2 := x.Args[3] - if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { + if !(x.Uses == 1 && is20Bit(int64(i)-24) && clobber(x)) { break } v.reset(OpS390XSTMG4) - v.AuxInt = i - 24 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 24) + v.Aux = symToAux(s) v.AddArg6(p, w0, w1, w2, w3, mem) return true } @@ -10611,45 +10592,45 @@ func rewriteValueS390X_OpS390XMOVDstoreconst(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDstoreconst [sc] {s} (ADDconst [off] ptr) mem) - // cond: isU12Bit(ValAndOff(sc).Off()+off) - // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // cond: isU12Bit(sc.Off()+int64(off)) + // result: (MOVDstoreconst [sc.addOffset32(off)] {s} ptr mem) for { - sc := v.AuxInt - s := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off := v_0.AuxInt + off := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(isU12Bit(ValAndOff(sc).Off() + off)) { + if !(isU12Bit(sc.Off() + int64(off))) { break } v.reset(OpS390XMOVDstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(sc.addOffset32(off)) + v.Aux = symToAux(s) v.AddArg2(ptr, mem) return true } // match: (MOVDstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) - // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) - // result: (MOVDstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) + // result: (MOVDstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) for { - sc := v.AuxInt - sym1 := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off := v_0.AuxInt - sym2 := v_0.Aux + off := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { + if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off)) { break } v.reset(OpS390XMOVDstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = valAndOffToAuxInt(sc.addOffset32(off)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } @@ -10661,52 +10642,52 @@ func rewriteValueS390X_OpS390XMOVDstoreidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVDstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } break } // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVDstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } @@ -10722,15 +10703,15 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWBRstore [i-2] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 - if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 16 { + if v_1.Op != OpS390XSRDconst || auxIntToInt8(v_1.AuxInt) != 16 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHBRstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -10738,8 +10719,8 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { break } v.reset(OpS390XMOVWBRstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -10747,16 +10728,16 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWBRstore [i-2] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 if v_1.Op != OpS390XSRDconst { break } - j := v_1.AuxInt + j := auxIntToInt8(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHBRstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -10764,12 +10745,12 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { break } w0 := x.Args[1] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVWBRstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -10777,15 +10758,15 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWBRstore [i-2] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 - if v_1.Op != OpS390XSRWconst || v_1.AuxInt != 16 { + if v_1.Op != OpS390XSRWconst || auxIntToInt8(v_1.AuxInt) != 16 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHBRstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -10793,8 +10774,8 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { break } v.reset(OpS390XMOVWBRstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -10802,16 +10783,16 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWBRstore [i-2] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 if v_1.Op != OpS390XSRWconst { break } - j := v_1.AuxInt + j := auxIntToInt8(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVHBRstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHBRstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -10819,12 +10800,12 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { break } w0 := x.Args[1] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRWconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVWBRstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -10839,17 +10820,17 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 16 { + if v_2.Op != OpS390XSRDconst || auxIntToInt8(v_2.AuxInt) != 16 { continue } w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHBRstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -10860,8 +10841,8 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { continue } v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -10872,18 +10853,18 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 if v_2.Op != OpS390XSRDconst { continue } - j := v_2.AuxInt + j := auxIntToInt8(v_2.AuxInt) w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHBRstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -10894,12 +10875,12 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { continue } w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -10910,17 +10891,17 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 - if v_2.Op != OpS390XSRWconst || v_2.AuxInt != 16 { + if v_2.Op != OpS390XSRWconst || auxIntToInt8(v_2.AuxInt) != 16 { continue } w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHBRstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -10931,8 +10912,8 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { continue } v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -10943,18 +10924,18 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 if v_2.Op != OpS390XSRWconst { continue } - j := v_2.AuxInt + j := auxIntToInt8(v_2.AuxInt) w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVHBRstoreidx || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHBRstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -10965,12 +10946,12 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { continue } w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || w0.AuxInt != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRWconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -11002,69 +10983,69 @@ func rewriteValueS390X_OpS390XMOVHZload(v *Value) bool { return true } // match: (MOVHZload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVHZload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVHZload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVHZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) - // result: (MOVHZload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) + // result: (MOVHZload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } v.reset(OpS390XMOVHZload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVHZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVHZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVHZloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -11102,50 +11083,50 @@ func rewriteValueS390X_OpS390XMOVHZloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVHZloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } break } // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVHZloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -11357,16 +11338,16 @@ func rewriteValueS390X_OpS390XMOVHZreg(v *Value) bool { return true } // match: (MOVHZreg (ANDWconst [m] x)) - // result: (MOVWZreg (ANDWconst [int64(uint16(m))] x)) + // result: (MOVWZreg (ANDWconst [int32(uint16(m))] x)) for { if v_0.Op != OpS390XANDWconst { break } - m := v_0.AuxInt + m := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] v.reset(OpS390XMOVWZreg) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(uint16(m)) + v0.AuxInt = int32ToAuxInt(int32(uint16(m))) v0.AddArg(x) v.AddArg(v0) return true @@ -11396,69 +11377,69 @@ func rewriteValueS390X_OpS390XMOVHload(v *Value) bool { return true } // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVHload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVHload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVHload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) - // result: (MOVHload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) + // result: (MOVHload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } v.reset(OpS390XMOVHload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVHloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVHloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVHloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -11496,50 +11477,50 @@ func rewriteValueS390X_OpS390XMOVHloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVHloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVHloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } break } // match: (MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVHloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVHloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -11774,19 +11755,19 @@ func rewriteValueS390X_OpS390XMOVHreg(v *Value) bool { } // match: (MOVHreg (ANDWconst [m] x)) // cond: int16(m) >= 0 - // result: (MOVWZreg (ANDWconst [int64(uint16(m))] x)) + // result: (MOVWZreg (ANDWconst [int32(uint16(m))] x)) for { if v_0.Op != OpS390XANDWconst { break } - m := v_0.AuxInt + m := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] if !(int16(m) >= 0) { break } v.reset(OpS390XMOVWZreg) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = int64(uint16(m)) + v0.AuxInt = int32ToAuxInt(int32(uint16(m))) v0.AddArg(x) v.AddArg(v0) return true @@ -11832,93 +11813,93 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { return true } // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVHstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVHstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVHstore [off] {sym} ptr (MOVDconst [c]) mem) - // cond: isU12Bit(off) && ptr.Op != OpSB - // result: (MOVHstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) + // cond: isU12Bit(int64(off)) && ptr.Op != OpSB + // result: (MOVHstoreconst [makeValAndOff32(int32(int16(c)),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 - if !(isU12Bit(off) && ptr.Op != OpSB) { + if !(isU12Bit(int64(off)) && ptr.Op != OpSB) { break } v.reset(OpS390XMOVHstoreconst) - v.AuxInt = makeValAndOff(int64(int16(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(int16(c)), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVHstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) - // result: (MOVHstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0)) + // result: (MOVHstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } v.reset(OpS390XMOVHstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(base, val, mem) return true } // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVHstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVHstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVHstoreidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg4(ptr, idx, val, mem) return true } @@ -11954,12 +11935,12 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVWstore [i-2] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w := v_1 x := v_2 - if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -11967,12 +11948,12 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRDconst || x_1.AuxInt != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRDconst || auxIntToInt8(x_1.AuxInt) != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVWstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -11980,17 +11961,17 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVWstore [i-2] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w0 := v_1 if w0.Op != OpS390XSRDconst { break } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_2 - if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -11998,12 +11979,12 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRDconst || x_1.AuxInt != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRDconst || auxIntToInt8(x_1.AuxInt) != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVWstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -12011,12 +11992,12 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVWstore [i-2] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w := v_1 x := v_2 - if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -12024,12 +12005,12 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRWconst || x_1.AuxInt != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRWconst || auxIntToInt8(x_1.AuxInt) != 16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVWstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -12037,17 +12018,17 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVWstore [i-2] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w0 := v_1 if w0.Op != OpS390XSRWconst { break } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_2 - if x.Op != OpS390XMOVHstore || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHstore || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -12055,12 +12036,12 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRWconst || x_1.AuxInt != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRWconst || auxIntToInt8(x_1.AuxInt) != j+16 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVWstore) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -12072,72 +12053,72 @@ func rewriteValueS390X_OpS390XMOVHstoreconst(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) - // cond: isU12Bit(ValAndOff(sc).Off()+off) - // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // cond: isU12Bit(sc.Off()+int64(off)) + // result: (MOVHstoreconst [sc.addOffset32(off)] {s} ptr mem) for { - sc := v.AuxInt - s := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off := v_0.AuxInt + off := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(isU12Bit(ValAndOff(sc).Off() + off)) { + if !(isU12Bit(sc.Off() + int64(off))) { break } v.reset(OpS390XMOVHstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(sc.addOffset32(off)) + v.Aux = symToAux(s) v.AddArg2(ptr, mem) return true } // match: (MOVHstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) - // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) - // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) + // result: (MOVHstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) for { - sc := v.AuxInt - sym1 := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off := v_0.AuxInt - sym2 := v_0.Aux + off := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { + if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off)) { break } v.reset(OpS390XMOVHstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = valAndOffToAuxInt(sc.addOffset32(off)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } // match: (MOVHstoreconst [c] {s} p x:(MOVHstoreconst [a] {s} p mem)) - // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 2 == ValAndOff(c).Off() && clobber(x) - // result: (MOVWstore [ValAndOff(a).Off()] {s} p (MOVDconst [int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16))]) mem) + // cond: p.Op != OpSB && x.Uses == 1 && a.Off() + 2 == c.Off() && clobber(x) + // result: (MOVWstore [a.Off32()] {s} p (MOVDconst [int64(c.Val32()&0xffff | a.Val32()<<16)]) mem) for { - c := v.AuxInt - s := v.Aux + c := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 x := v_1 if x.Op != OpS390XMOVHstoreconst { break } - a := x.AuxInt - if x.Aux != s { + 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 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { + if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && a.Off()+2 == c.Off() && clobber(x)) { break } v.reset(OpS390XMOVWstore) - v.AuxInt = ValAndOff(a).Off() - v.Aux = s + v.AuxInt = int32ToAuxInt(a.Off32()) + v.Aux = symToAux(s) v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64) - v0.AuxInt = int64(int32(ValAndOff(c).Val()&0xffff | ValAndOff(a).Val()<<16)) + v0.AuxInt = int64ToAuxInt(int64(c.Val32()&0xffff | a.Val32()<<16)) v.AddArg3(p, v0, mem) return true } @@ -12149,52 +12130,52 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVHstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } break } // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVHstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } @@ -12204,14 +12185,14 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWstoreidx [i-2] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 w := v_2 x := v_3 - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -12222,12 +12203,12 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -12238,8 +12219,8 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 @@ -12247,10 +12228,10 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { if w0.Op != OpS390XSRDconst { continue } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_3 - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -12261,12 +12242,12 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -12277,14 +12258,14 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWstoreidx [i-2] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 w := v_2 x := v_3 - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -12295,12 +12276,12 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRWconst || auxIntToInt8(x_2.AuxInt) != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -12311,8 +12292,8 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 @@ -12320,10 +12301,10 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { if w0.Op != OpS390XSRWconst { continue } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_3 - if x.Op != OpS390XMOVHstoreidx || x.AuxInt != i-2 || x.Aux != s { + if x.Op != OpS390XMOVHstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -12334,12 +12315,12 @@ func rewriteValueS390X_OpS390XMOVHstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || x_2.AuxInt != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRWconst || auxIntToInt8(x_2.AuxInt) != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVWstoreidx) - v.AuxInt = i - 2 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 2) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -12356,15 +12337,15 @@ func rewriteValueS390X_OpS390XMOVWBRstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVDBRstore [i-4] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 - if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 32 { + if v_1.Op != OpS390XSRDconst || auxIntToInt8(v_1.AuxInt) != 32 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVWBRstore || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWBRstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -12372,8 +12353,8 @@ func rewriteValueS390X_OpS390XMOVWBRstore(v *Value) bool { break } v.reset(OpS390XMOVDBRstore) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -12381,16 +12362,16 @@ func rewriteValueS390X_OpS390XMOVWBRstore(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVDBRstore [i-4] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 if v_1.Op != OpS390XSRDconst { break } - j := v_1.AuxInt + j := auxIntToInt8(v_1.AuxInt) w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVWBRstore || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWBRstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -12398,12 +12379,12 @@ func rewriteValueS390X_OpS390XMOVWBRstore(v *Value) bool { break } w0 := x.Args[1] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVDBRstore) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg3(p, w0, mem) return true } @@ -12418,17 +12399,17 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 - if v_2.Op != OpS390XSRDconst || v_2.AuxInt != 32 { + if v_2.Op != OpS390XSRDconst || auxIntToInt8(v_2.AuxInt) != 32 { continue } w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWBRstoreidx || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -12439,8 +12420,8 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx(v *Value) bool { continue } v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -12451,18 +12432,18 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 if v_2.Op != OpS390XSRDconst { continue } - j := v_2.AuxInt + j := auxIntToInt8(v_2.AuxInt) w := v_2.Args[0] x := v_3 - if x.Op != OpS390XMOVWBRstoreidx || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWBRstoreidx || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -12473,12 +12454,12 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx(v *Value) bool { continue } w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || w0.AuxInt != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { + if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -12510,69 +12491,69 @@ func rewriteValueS390X_OpS390XMOVWZload(v *Value) bool { return true } // match: (MOVWZload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVWZload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVWZload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVWZload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) - // result: (MOVWZload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) + // result: (MOVWZload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } v.reset(OpS390XMOVWZload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWZloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVWZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVWZloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -12610,50 +12591,50 @@ func rewriteValueS390X_OpS390XMOVWZloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVWZloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } break } // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVWZloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -12894,69 +12875,69 @@ func rewriteValueS390X_OpS390XMOVWload(v *Value) bool { return true } // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVWload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVWload [off1] {sym1} (MOVDaddr [off2] {sym2} base) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) - // result: (MOVWload [off1+off2] {mergeSym(sym1,sym2)} base mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) + // result: (MOVWload [off1+off2] {mergeSymTyped(sym1,sym2)} base mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } v.reset(OpS390XMOVWload) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(base, mem) return true } // match: (MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWloadidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVWloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVWloadidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(ptr, idx, mem) return true } @@ -12994,50 +12975,50 @@ func rewriteValueS390X_OpS390XMOVWloadidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVWloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVWloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } break } // match: (MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVWloadidx [c+d] {sym} ptr idx mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] mem := v_2 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVWloadidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg3(ptr, idx, mem) return true } @@ -13338,93 +13319,93 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { return true } // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(off1+off2) + // cond: is20Bit(int64(off1)+int64(off2)) // result: (MOVWstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is20Bit(off1 + off2)) { + if !(is20Bit(int64(off1) + int64(off2))) { break } v.reset(OpS390XMOVWstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVWstore [off] {sym} ptr (MOVDconst [c]) mem) - // cond: is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB - // result: (MOVWstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) + // cond: is16Bit(c) && isU12Bit(int64(off)) && ptr.Op != OpSB + // result: (MOVWstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 - if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { + if !(is16Bit(c) && isU12Bit(int64(off)) && ptr.Op != OpSB) { break } v.reset(OpS390XMOVWstoreconst) - v.AuxInt = makeValAndOff(int64(int32(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(c), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVWstore [off1] {sym1} (MOVDaddr [off2] {sym2} base) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) - // result: (MOVWstore [off1+off2] {mergeSym(sym1,sym2)} base val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0)) + // result: (MOVWstore [off1+off2] {mergeSymTyped(sym1,sym2)} base val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } t := v_0.Type - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } v.reset(OpS390XMOVWstore) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg3(base, val, mem) return true } // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(off1+off2) && canMergeSym(sym1, sym2) - // result: (MOVWstoreidx [off1+off2] {mergeSym(sym1,sym2)} ptr idx val mem) + // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) + // result: (MOVWstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) for { - off1 := v.AuxInt - sym1 := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddridx { break } - off2 := v_0.AuxInt - sym2 := v_0.Aux + off2 := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) idx := v_0.Args[1] ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { + if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { break } v.reset(OpS390XMOVWstoreidx) - v.AuxInt = off1 + off2 - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg4(ptr, idx, val, mem) return true } @@ -13460,15 +13441,15 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVDstore [i-4] {s} p w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 - if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 32 { + if v_1.Op != OpS390XSRDconst || auxIntToInt8(v_1.AuxInt) != 32 { break } w := v_1.Args[0] x := v_2 - if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -13476,8 +13457,8 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { break } v.reset(OpS390XMOVDstore) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg3(p, w, mem) return true } @@ -13485,17 +13466,17 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { // cond: p.Op != OpSB && x.Uses == 1 && clobber(x) // result: (MOVDstore [i-4] {s} p w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w0 := v_1 if w0.Op != OpS390XSRDconst { break } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_2 - if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -13503,25 +13484,25 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { break } x_1 := x.Args[1] - if x_1.Op != OpS390XSRDconst || x_1.AuxInt != j+32 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { + if x_1.Op != OpS390XSRDconst || auxIntToInt8(x_1.AuxInt) != j+32 || w != x_1.Args[0] || !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } v.reset(OpS390XMOVDstore) - v.AuxInt = i - 4 - v.Aux = s + 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(i-4) && clobber(x) + // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(int64(i)-4) && clobber(x) // result: (STM2 [i-4] {s} p w0 w1 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w1 := v_1 x := v_2 - if x.Op != OpS390XMOVWstore || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWstore || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { break } mem := x.Args[2] @@ -13529,25 +13510,25 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { break } w0 := x.Args[1] - if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { + if !(p.Op != OpSB && x.Uses == 1 && is20Bit(int64(i)-4) && clobber(x)) { break } v.reset(OpS390XSTM2) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg4(p, w0, w1, mem) return true } // match: (MOVWstore [i] {s} p w2 x:(STM2 [i-8] {s} p w0 w1 mem)) - // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) + // cond: x.Uses == 1 && is20Bit(int64(i)-8) && clobber(x) // result: (STM3 [i-8] {s} p w0 w1 w2 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w2 := v_1 x := v_2 - if x.Op != OpS390XSTM2 || x.AuxInt != i-8 || x.Aux != s { + if x.Op != OpS390XSTM2 || auxIntToInt32(x.AuxInt) != i-8 || auxToSym(x.Aux) != s { break } mem := x.Args[3] @@ -13556,25 +13537,25 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { } w0 := x.Args[1] w1 := x.Args[2] - if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { + if !(x.Uses == 1 && is20Bit(int64(i)-8) && clobber(x)) { break } v.reset(OpS390XSTM3) - v.AuxInt = i - 8 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 8) + v.Aux = symToAux(s) v.AddArg5(p, w0, w1, w2, mem) return true } // match: (MOVWstore [i] {s} p w3 x:(STM3 [i-12] {s} p w0 w1 w2 mem)) - // cond: x.Uses == 1 && is20Bit(i-12) && clobber(x) + // cond: x.Uses == 1 && is20Bit(int64(i)-12) && clobber(x) // result: (STM4 [i-12] {s} p w0 w1 w2 w3 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w3 := v_1 x := v_2 - if x.Op != OpS390XSTM3 || x.AuxInt != i-12 || x.Aux != s { + if x.Op != OpS390XSTM3 || auxIntToInt32(x.AuxInt) != i-12 || auxToSym(x.Aux) != s { break } mem := x.Args[4] @@ -13584,12 +13565,12 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { w0 := x.Args[1] w1 := x.Args[2] w2 := x.Args[3] - if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { + if !(x.Uses == 1 && is20Bit(int64(i)-12) && clobber(x)) { break } v.reset(OpS390XSTM4) - v.AuxInt = i - 12 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 12) + v.Aux = symToAux(s) v.AddArg6(p, w0, w1, w2, w3, mem) return true } @@ -13601,72 +13582,72 @@ func rewriteValueS390X_OpS390XMOVWstoreconst(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) - // cond: isU12Bit(ValAndOff(sc).Off()+off) - // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // cond: isU12Bit(sc.Off()+int64(off)) + // result: (MOVWstoreconst [sc.addOffset32(off)] {s} ptr mem) for { - sc := v.AuxInt - s := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpS390XADDconst { break } - off := v_0.AuxInt + off := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(isU12Bit(ValAndOff(sc).Off() + off)) { + if !(isU12Bit(sc.Off() + int64(off))) { break } v.reset(OpS390XMOVWstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(sc.addOffset32(off)) + v.Aux = symToAux(s) v.AddArg2(ptr, mem) return true } // match: (MOVWstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) - // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) - // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {mergeSym(sym1, sym2)} ptr mem) + // cond: ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) + // result: (MOVWstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) for { - sc := v.AuxInt - sym1 := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + sym1 := auxToSym(v.Aux) if v_0.Op != OpS390XMOVDaddr { break } - off := v_0.AuxInt - sym2 := v_0.Aux + off := auxIntToInt32(v_0.AuxInt) + sym2 := auxToSym(v_0.Aux) ptr := v_0.Args[0] mem := v_1 - if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { + if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off)) { break } v.reset(OpS390XMOVWstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = mergeSym(sym1, sym2) + v.AuxInt = valAndOffToAuxInt(sc.addOffset32(off)) + v.Aux = symToAux(mergeSymTyped(sym1, sym2)) v.AddArg2(ptr, mem) return true } // match: (MOVWstoreconst [c] {s} p x:(MOVWstoreconst [a] {s} p mem)) - // cond: p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off() + 4 == ValAndOff(c).Off() && clobber(x) - // result: (MOVDstore [ValAndOff(a).Off()] {s} p (MOVDconst [ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32]) mem) + // cond: p.Op != OpSB && x.Uses == 1 && a.Off() + 4 == c.Off() && clobber(x) + // result: (MOVDstore [a.Off32()] {s} p (MOVDconst [c.Val()&0xffffffff | a.Val()<<32]) mem) for { - c := v.AuxInt - s := v.Aux + c := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 x := v_1 if x.Op != OpS390XMOVWstoreconst { break } - a := x.AuxInt - if x.Aux != s { + 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 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { + if p != x.Args[0] || !(p.Op != OpSB && x.Uses == 1 && a.Off()+4 == c.Off() && clobber(x)) { break } v.reset(OpS390XMOVDstore) - v.AuxInt = ValAndOff(a).Off() - v.Aux = s + v.AuxInt = int32ToAuxInt(a.Off32()) + v.Aux = symToAux(s) v0 := b.NewValue0(x.Pos, OpS390XMOVDconst, typ.UInt64) - v0.AuxInt = ValAndOff(c).Val()&0xffffffff | ValAndOff(a).Val()<<32 + v0.AuxInt = int64ToAuxInt(c.Val()&0xffffffff | a.Val()<<32) v.AddArg3(p, v0, mem) return true } @@ -13678,52 +13659,52 @@ func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XADDconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] idx := v_1 val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVWstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } break } // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(c+d) + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) for { - c := v.AuxInt - sym := v.Aux + c := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { ptr := v_0 if v_1.Op != OpS390XADDconst { continue } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) idx := v_1.Args[0] val := v_2 mem := v_3 - if !(is20Bit(c + d)) { + if !(is20Bit(int64(c) + int64(d))) { continue } v.reset(OpS390XMOVWstoreidx) - v.AuxInt = c + d - v.Aux = sym + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(sym) v.AddArg4(ptr, idx, val, mem) return true } @@ -13733,14 +13714,14 @@ func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVDstoreidx [i-4] {s} p idx w mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 w := v_2 x := v_3 - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWstoreidx || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -13751,12 +13732,12 @@ func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != 32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != 32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg4(p, idx, w, mem) return true } @@ -13767,8 +13748,8 @@ func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value) bool { // cond: x.Uses == 1 && clobber(x) // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { p := v_0 idx := v_1 @@ -13776,10 +13757,10 @@ func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value) bool { if w0.Op != OpS390XSRDconst { continue } - j := w0.AuxInt + j := auxIntToInt8(w0.AuxInt) w := w0.Args[0] x := v_3 - if x.Op != OpS390XMOVWstoreidx || x.AuxInt != i-4 || x.Aux != s { + if x.Op != OpS390XMOVWstoreidx || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { continue } mem := x.Args[3] @@ -13790,12 +13771,12 @@ func rewriteValueS390X_OpS390XMOVWstoreidx(v *Value) bool { continue } x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || x_2.AuxInt != j+32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { + if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != j+32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { continue } v.reset(OpS390XMOVDstoreidx) - v.AuxInt = i - 4 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 4) + v.Aux = symToAux(s) v.AddArg4(p, idx, w0, mem) return true } @@ -13809,26 +13790,26 @@ func rewriteValueS390X_OpS390XMULLD(v *Value) bool { v_0 := v.Args[0] // match: (MULLD x (MOVDconst [c])) // cond: is32Bit(c) - // result: (MULLDconst [c] x) + // result: (MULLDconst [int32(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 != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { continue } v.reset(OpS390XMULLDconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } break } // match: (MULLD x g:(MOVDload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (MULLDload [off] {sym} x ptr mem) for { t := v.Type @@ -13838,17 +13819,17 @@ func rewriteValueS390X_OpS390XMULLD(v *Value) bool { if g.Op != OpS390XMOVDload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XMULLDload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -13920,15 +13901,15 @@ func rewriteValueS390X_OpS390XMULLDconst(v *Value) bool { return true } // match: (MULLDconst [c] (MOVDconst [d])) - // result: (MOVDconst [c*d]) + // result: (MOVDconst [int64(c)*d]) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = c * d + v.AuxInt = int64ToAuxInt(int64(c) * d) return true } return false @@ -13962,47 +13943,47 @@ func rewriteValueS390X_OpS390XMULLDload(v *Value) bool { return true } // match: (MULLDload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (MULLDload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XMULLDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (MULLDload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (MULLDload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (MULLDload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XMULLDload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -14012,23 +13993,23 @@ func rewriteValueS390X_OpS390XMULLW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MULLW x (MOVDconst [c])) - // result: (MULLWconst [int64(int32(c))] x) + // result: (MULLWconst [int32(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 != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XMULLWconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } break } // match: (MULLW x g:(MOVWload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (MULLWload [off] {sym} x ptr mem) for { t := v.Type @@ -14038,24 +14019,24 @@ func rewriteValueS390X_OpS390XMULLW(v *Value) bool { if g.Op != OpS390XMOVWload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XMULLWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } break } // match: (MULLW x g:(MOVWZload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (MULLWload [off] {sym} x ptr mem) for { t := v.Type @@ -14065,17 +14046,17 @@ func rewriteValueS390X_OpS390XMULLW(v *Value) bool { if g.Op != OpS390XMOVWZload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XMULLWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -14147,15 +14128,15 @@ func rewriteValueS390X_OpS390XMULLWconst(v *Value) bool { return true } // match: (MULLWconst [c] (MOVDconst [d])) - // result: (MOVDconst [int64(int32(c*d))]) + // result: (MOVDconst [int64(c*int32(d))]) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = int64(int32(c * d)) + v.AuxInt = int64ToAuxInt(int64(c * int32(d))) return true } return false @@ -14165,47 +14146,47 @@ func rewriteValueS390X_OpS390XMULLWload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MULLWload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (MULLWload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XMULLWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (MULLWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (MULLWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (MULLWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XMULLWload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -14391,14 +14372,14 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { } // match: (OR (SLDconst [63] (SRDconst [63] (LGDR x))) (MOVDconst [c])) // cond: c & -1<<63 == 0 - // result: (LGDR (CPSDR (FMOVDconst [c]) x)) + // result: (LGDR (CPSDR (FMOVDconst [math.Float64frombits(uint64(c))]) x)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XSLDconst || v_0.AuxInt != 63 { + if v_0.Op != OpS390XSLDconst || auxIntToInt8(v_0.AuxInt) != 63 { continue } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpS390XSRDconst || v_0_0.AuxInt != 63 { + if v_0_0.Op != OpS390XSRDconst || auxIntToInt8(v_0_0.AuxInt) != 63 { continue } v_0_0_0 := v_0_0.Args[0] @@ -14409,14 +14390,14 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if v_1.Op != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c&-1<<63 == 0) { continue } v.reset(OpS390XLGDR) v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) - v1.AuxInt = c + v1.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(c))) v0.AddArg2(v1, x) v.AddArg(v0) return true @@ -14458,7 +14439,7 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { } // match: (OR (AND (MOVDconst [-1<<63]) (LGDR x)) (MOVDconst [c])) // cond: c & -1<<63 == 0 - // result: (LGDR (CPSDR (FMOVDconst [c]) x)) + // result: (LGDR (CPSDR (FMOVDconst [math.Float64frombits(uint64(c))]) x)) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpS390XAND { @@ -14468,21 +14449,21 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v_0_0 := v_0.Args[0] v_0_1 := v_0.Args[1] for _i1 := 0; _i1 <= 1; _i1, v_0_0, v_0_1 = _i1+1, v_0_1, v_0_0 { - if v_0_0.Op != OpS390XMOVDconst || v_0_0.AuxInt != -1<<63 || v_0_1.Op != OpS390XLGDR { + if v_0_0.Op != OpS390XMOVDconst || auxIntToInt64(v_0_0.AuxInt) != -1<<63 || v_0_1.Op != OpS390XLGDR { continue } x := v_0_1.Args[0] if v_1.Op != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c&-1<<63 == 0) { continue } v.reset(OpS390XLGDR) v0 := b.NewValue0(v.Pos, OpS390XCPSDR, x.Type) v1 := b.NewValue0(v.Pos, OpS390XFMOVDconst, x.Type) - v1.AuxInt = c + v1.AuxInt = float64ToAuxInt(math.Float64frombits(uint64(c))) v0.AddArg2(v1, x) v.AddArg(v0) return true @@ -14519,7 +14500,7 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { return true } // match: (OR x g:(MOVDload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ORload [off] {sym} x ptr mem) for { t := v.Type @@ -14529,17 +14510,17 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if g.Op != OpS390XMOVDload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XORload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -14554,20 +14535,20 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVBZload { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[1] p := x1.Args[0] sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 8 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVBZload { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[1] @@ -14577,8 +14558,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg2(p, mem) return true } @@ -14593,20 +14574,20 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVHZload { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[1] p := x1.Args[0] sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 16 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVHZload { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[1] @@ -14616,8 +14597,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg2(p, mem) return true } @@ -14632,20 +14613,20 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVWZload { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[1] p := x1.Args[0] sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 32 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVWZload { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[1] @@ -14655,8 +14636,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(x0.Pos, OpS390XMOVDload, typ.UInt64) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg2(p, mem) return true } @@ -14671,13 +14652,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s0.Op != OpS390XSLDconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVBZload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] or := v_1 @@ -14692,13 +14673,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s1.Op != OpS390XSLDconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVBZload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -14713,10 +14694,10 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) v.copyOf(v0) v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 + v1.AuxInt = int8ToAuxInt(j1) v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s + v2.AuxInt = int32ToAuxInt(i0) + v2.Aux = symToAux(s) v2.AddArg2(p, mem) v1.AddArg(v2) v0.AddArg2(v1, y) @@ -14734,13 +14715,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s0.Op != OpS390XSLDconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVHZload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] or := v_1 @@ -14755,13 +14736,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s1.Op != OpS390XSLDconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVHZload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -14776,10 +14757,10 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(x1.Pos, OpS390XOR, v.Type) v.copyOf(v0) v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 + v1.AuxInt = int8ToAuxInt(j1) v2 := b.NewValue0(x1.Pos, OpS390XMOVWZload, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s + v2.AuxInt = int32ToAuxInt(i0) + v2.Aux = symToAux(s) v2.AddArg2(p, mem) v1.AddArg(v2) v0.AddArg2(v1, y) @@ -14797,8 +14778,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVBZloadidx { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[2] x1_0 := x1.Args[0] x1_1 := x1.Args[1] @@ -14806,15 +14787,15 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { p := x1_0 idx := x1_1 sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 8 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVBZloadidx { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[2] @@ -14827,8 +14808,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg3(p, idx, mem) return true } @@ -14845,8 +14826,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVHZloadidx { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[2] x1_0 := x1.Args[0] x1_1 := x1.Args[1] @@ -14854,15 +14835,15 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { p := x1_0 idx := x1_1 sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 16 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVHZloadidx { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[2] @@ -14875,8 +14856,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg3(p, idx, mem) return true } @@ -14893,8 +14874,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVWZloadidx { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[2] x1_0 := x1.Args[0] x1_1 := x1.Args[1] @@ -14902,15 +14883,15 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { p := x1_0 idx := x1_1 sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 32 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVWZloadidx { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[2] @@ -14923,8 +14904,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(v.Pos, OpS390XMOVDloadidx, typ.UInt64) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg3(p, idx, mem) return true } @@ -14941,13 +14922,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s0.Op != OpS390XSLDconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVBZloadidx { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[2] x0_0 := x0.Args[0] x0_1 := x0.Args[1] @@ -14966,13 +14947,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s1.Op != OpS390XSLDconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVBZloadidx { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[2] @@ -14990,10 +14971,10 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 + v1.AuxInt = int8ToAuxInt(j1) v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s + v2.AuxInt = int32ToAuxInt(i0) + v2.Aux = symToAux(s) v2.AddArg3(p, idx, mem) v1.AddArg(v2) v0.AddArg2(v1, y) @@ -15013,13 +14994,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s0.Op != OpS390XSLDconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVHZloadidx { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[2] x0_0 := x0.Args[0] x0_1 := x0.Args[1] @@ -15038,13 +15019,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s1.Op != OpS390XSLDconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVHZloadidx { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[2] @@ -15062,10 +15043,10 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j1 + v1.AuxInt = int8ToAuxInt(j1) v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = i0 - v2.Aux = s + v2.AuxInt = int32ToAuxInt(i0) + v2.Aux = symToAux(s) v2.AddArg3(p, idx, mem) v1.AddArg(v2) v0.AddArg2(v1, y) @@ -15085,20 +15066,20 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x0.Op != OpS390XMOVBZload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 8 { continue } x1 := sh.Args[0] if x1.Op != OpS390XMOVBZload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -15109,8 +15090,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) v.copyOf(v0) v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s + v1.AuxInt = int32ToAuxInt(i0) + v1.Aux = symToAux(s) v1.AddArg2(p, mem) v0.AddArg(v1) return true @@ -15130,12 +15111,12 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x0.Op != OpS390XMOVHBRload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 16 { continue } r1 := sh.Args[0] @@ -15146,8 +15127,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVHBRload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -15158,8 +15139,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(x1.Pos, OpS390XMOVWZreg, typ.UInt64) v.copyOf(v0) v1 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) - v1.AuxInt = i0 - v1.Aux = s + v1.AuxInt = int32ToAuxInt(i0) + v1.Aux = symToAux(s) v1.AddArg2(p, mem) v0.AddArg(v1) return true @@ -15179,12 +15160,12 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x0.Op != OpS390XMOVWBRload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 32 { continue } r1 := sh.Args[0] @@ -15195,8 +15176,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVWBRload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -15206,8 +15187,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(x1.Pos, OpS390XMOVDBRload, typ.UInt64) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg2(p, mem) return true } @@ -15222,13 +15203,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s1.Op != OpS390XSLDconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVBZload { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[1] p := x1.Args[0] or := v_1 @@ -15243,13 +15224,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s0.Op != OpS390XSLDconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVBZload { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[1] @@ -15264,11 +15245,11 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) v.copyOf(v0) v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 + v1.AuxInt = int8ToAuxInt(j0) v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s + v3.AuxInt = int32ToAuxInt(i0) + v3.Aux = symToAux(s) v3.AddArg2(p, mem) v2.AddArg(v3) v1.AddArg(v2) @@ -15287,7 +15268,7 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s1.Op != OpS390XSLDconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) r1 := s1.Args[0] if r1.Op != OpS390XMOVHZreg { continue @@ -15296,8 +15277,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVHBRload { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[1] p := x1.Args[0] or := v_1 @@ -15312,7 +15293,7 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s0.Op != OpS390XSLDconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) r0 := s0.Args[0] if r0.Op != OpS390XMOVHZreg { continue @@ -15321,8 +15302,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x0.Op != OpS390XMOVHBRload { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[1] @@ -15337,11 +15318,11 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(x0.Pos, OpS390XOR, v.Type) v.copyOf(v0) v1 := b.NewValue0(x0.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 + v1.AuxInt = int8ToAuxInt(j0) v2 := b.NewValue0(x0.Pos, OpS390XMOVWZreg, typ.UInt64) v3 := b.NewValue0(x0.Pos, OpS390XMOVWBRload, typ.UInt32) - v3.AuxInt = i0 - v3.Aux = s + v3.AuxInt = int32ToAuxInt(i0) + v3.Aux = symToAux(s) v3.AddArg2(p, mem) v2.AddArg(v3) v1.AddArg(v2) @@ -15360,8 +15341,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x0.Op != OpS390XMOVBZloadidx { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[2] x0_0 := x0.Args[0] x0_1 := x0.Args[1] @@ -15369,15 +15350,15 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { p := x0_0 idx := x0_1 sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 8 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 8 { continue } x1 := sh.Args[0] if x1.Op != OpS390XMOVBZloadidx { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[2] @@ -15391,8 +15372,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s + v1.AuxInt = int32ToAuxInt(i0) + v1.Aux = symToAux(s) v1.AddArg3(p, idx, mem) v0.AddArg(v1) return true @@ -15414,8 +15395,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x0.Op != OpS390XMOVHBRloadidx { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[2] x0_0 := x0.Args[0] x0_1 := x0.Args[1] @@ -15423,7 +15404,7 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { p := x0_0 idx := x0_1 sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 16 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 16 { continue } r1 := sh.Args[0] @@ -15434,8 +15415,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVHBRloadidx { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[2] @@ -15449,8 +15430,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = i0 - v1.Aux = s + v1.AuxInt = int32ToAuxInt(i0) + v1.Aux = symToAux(s) v1.AddArg3(p, idx, mem) v0.AddArg(v1) return true @@ -15472,8 +15453,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x0.Op != OpS390XMOVWBRloadidx { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[2] x0_0 := x0.Args[0] x0_1 := x0.Args[1] @@ -15481,7 +15462,7 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { p := x0_0 idx := x0_1 sh := v_1 - if sh.Op != OpS390XSLDconst || sh.AuxInt != 32 { + if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 32 { continue } r1 := sh.Args[0] @@ -15492,8 +15473,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVWBRloadidx { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[2] @@ -15506,8 +15487,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg3(p, idx, mem) return true } @@ -15524,13 +15505,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s1.Op != OpS390XSLDconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVBZloadidx { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[2] x1_0 := x1.Args[0] x1_1 := x1.Args[1] @@ -15549,13 +15530,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s0.Op != OpS390XSLDconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVBZloadidx { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[2] @@ -15573,11 +15554,11 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 + v1.AuxInt = int8ToAuxInt(j0) v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s + v3.AuxInt = int32ToAuxInt(i0) + v3.Aux = symToAux(s) v3.AddArg3(p, idx, mem) v2.AddArg(v3) v1.AddArg(v2) @@ -15598,7 +15579,7 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s1.Op != OpS390XSLDconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) r1 := s1.Args[0] if r1.Op != OpS390XMOVHZreg { continue @@ -15607,8 +15588,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x1.Op != OpS390XMOVHBRloadidx { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[2] x1_0 := x1.Args[0] x1_1 := x1.Args[1] @@ -15627,7 +15608,7 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if s0.Op != OpS390XSLDconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) r0 := s0.Args[0] if r0.Op != OpS390XMOVHZreg { continue @@ -15636,8 +15617,8 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { if x0.Op != OpS390XMOVHBRloadidx { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[2] @@ -15655,11 +15636,11 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XOR, v.Type) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = j0 + v1.AuxInt = int8ToAuxInt(j0) v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = i0 - v3.Aux = s + v3.AuxInt = int32ToAuxInt(i0) + v3.Aux = symToAux(s) v3.AddArg3(p, idx, mem) v2.AddArg(v3) v1.AddArg(v2) @@ -15679,16 +15660,16 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ORW x (MOVDconst [c])) - // result: (ORWconst [int64(int32(c))] x) + // result: (ORWconst [int32(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 != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XORWconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -15729,7 +15710,7 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { return true } // match: (ORW x g:(MOVWload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ORWload [off] {sym} x ptr mem) for { t := v.Type @@ -15739,24 +15720,24 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if g.Op != OpS390XMOVWload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XORWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } break } // match: (ORW x g:(MOVWZload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ORWload [off] {sym} x ptr mem) for { t := v.Type @@ -15766,17 +15747,17 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if g.Op != OpS390XMOVWZload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XORWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -15791,20 +15772,20 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x1.Op != OpS390XMOVBZload { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[1] p := x1.Args[0] sh := v_1 - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { + if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 8 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVBZload { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[1] @@ -15814,8 +15795,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(x0.Pos, OpS390XMOVHZload, typ.UInt16) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg2(p, mem) return true } @@ -15830,20 +15811,20 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x1.Op != OpS390XMOVHZload { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[1] p := x1.Args[0] sh := v_1 - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { + if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 16 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVHZload { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[1] @@ -15853,8 +15834,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(x0.Pos, OpS390XMOVWZload, typ.UInt32) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg2(p, mem) return true } @@ -15869,13 +15850,13 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if s0.Op != OpS390XSLWconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVBZload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] or := v_1 @@ -15890,13 +15871,13 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if s1.Op != OpS390XSLWconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVBZload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -15911,10 +15892,10 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { v0 := b.NewValue0(x1.Pos, OpS390XORW, v.Type) v.copyOf(v0) v1 := b.NewValue0(x1.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 + v1.AuxInt = int8ToAuxInt(j1) v2 := b.NewValue0(x1.Pos, OpS390XMOVHZload, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s + v2.AuxInt = int32ToAuxInt(i0) + v2.Aux = symToAux(s) v2.AddArg2(p, mem) v1.AddArg(v2) v0.AddArg2(v1, y) @@ -15932,8 +15913,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x1.Op != OpS390XMOVBZloadidx { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[2] x1_0 := x1.Args[0] x1_1 := x1.Args[1] @@ -15941,15 +15922,15 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { p := x1_0 idx := x1_1 sh := v_1 - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { + if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 8 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVBZloadidx { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[2] @@ -15962,8 +15943,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg3(p, idx, mem) return true } @@ -15980,8 +15961,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x1.Op != OpS390XMOVHZloadidx { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[2] x1_0 := x1.Args[0] x1_1 := x1.Args[1] @@ -15989,15 +15970,15 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { p := x1_0 idx := x1_1 sh := v_1 - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { + if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 16 { continue } x0 := sh.Args[0] if x0.Op != OpS390XMOVHZloadidx { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[2] @@ -16010,8 +15991,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg3(p, idx, mem) return true } @@ -16028,13 +16009,13 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if s0.Op != OpS390XSLWconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVBZloadidx { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[2] x0_0 := x0.Args[0] x0_1 := x0.Args[1] @@ -16053,13 +16034,13 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if s1.Op != OpS390XSLWconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVBZloadidx { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[2] @@ -16077,10 +16058,10 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j1 + v1.AuxInt = int8ToAuxInt(j1) v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = i0 - v2.Aux = s + v2.AuxInt = int32ToAuxInt(i0) + v2.Aux = symToAux(s) v2.AddArg3(p, idx, mem) v1.AddArg(v2) v0.AddArg2(v1, y) @@ -16100,20 +16081,20 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x0.Op != OpS390XMOVBZload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] sh := v_1 - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { + if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 8 { continue } x1 := sh.Args[0] if x1.Op != OpS390XMOVBZload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -16124,8 +16105,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { v0 := b.NewValue0(x1.Pos, OpS390XMOVHZreg, typ.UInt64) v.copyOf(v0) v1 := b.NewValue0(x1.Pos, OpS390XMOVHBRload, typ.UInt16) - v1.AuxInt = i0 - v1.Aux = s + v1.AuxInt = int32ToAuxInt(i0) + v1.Aux = symToAux(s) v1.AddArg2(p, mem) v0.AddArg(v1) return true @@ -16145,12 +16126,12 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x0.Op != OpS390XMOVHBRload { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[1] p := x0.Args[0] sh := v_1 - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { + if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 16 { continue } r1 := sh.Args[0] @@ -16161,8 +16142,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x1.Op != OpS390XMOVHBRload { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[1] @@ -16172,8 +16153,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(x1.Pos, OpS390XMOVWBRload, typ.UInt32) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg2(p, mem) return true } @@ -16188,13 +16169,13 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if s1.Op != OpS390XSLWconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVBZload { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[1] p := x1.Args[0] or := v_1 @@ -16209,13 +16190,13 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if s0.Op != OpS390XSLWconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVBZload { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[1] @@ -16230,11 +16211,11 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { v0 := b.NewValue0(x0.Pos, OpS390XORW, v.Type) v.copyOf(v0) v1 := b.NewValue0(x0.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 + v1.AuxInt = int8ToAuxInt(j0) v2 := b.NewValue0(x0.Pos, OpS390XMOVHZreg, typ.UInt64) v3 := b.NewValue0(x0.Pos, OpS390XMOVHBRload, typ.UInt16) - v3.AuxInt = i0 - v3.Aux = s + v3.AuxInt = int32ToAuxInt(i0) + v3.Aux = symToAux(s) v3.AddArg2(p, mem) v2.AddArg(v3) v1.AddArg(v2) @@ -16253,8 +16234,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x0.Op != OpS390XMOVBZloadidx { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[2] x0_0 := x0.Args[0] x0_1 := x0.Args[1] @@ -16262,15 +16243,15 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { p := x0_0 idx := x0_1 sh := v_1 - if sh.Op != OpS390XSLWconst || sh.AuxInt != 8 { + if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 8 { continue } x1 := sh.Args[0] if x1.Op != OpS390XMOVBZloadidx { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[2] @@ -16284,8 +16265,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = i0 - v1.Aux = s + v1.AuxInt = int32ToAuxInt(i0) + v1.Aux = symToAux(s) v1.AddArg3(p, idx, mem) v0.AddArg(v1) return true @@ -16307,8 +16288,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x0.Op != OpS390XMOVHBRloadidx { continue } - i0 := x0.AuxInt - s := x0.Aux + i0 := auxIntToInt32(x0.AuxInt) + s := auxToSym(x0.Aux) mem := x0.Args[2] x0_0 := x0.Args[0] x0_1 := x0.Args[1] @@ -16316,7 +16297,7 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { p := x0_0 idx := x0_1 sh := v_1 - if sh.Op != OpS390XSLWconst || sh.AuxInt != 16 { + if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 16 { continue } r1 := sh.Args[0] @@ -16327,8 +16308,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if x1.Op != OpS390XMOVHBRloadidx { continue } - i1 := x1.AuxInt - if x1.Aux != s { + i1 := auxIntToInt32(x1.AuxInt) + if auxToSym(x1.Aux) != s { continue } _ = x1.Args[2] @@ -16341,8 +16322,8 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { b = mergePoint(b, x0, x1) v0 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) v.copyOf(v0) - v0.AuxInt = i0 - v0.Aux = s + v0.AuxInt = int32ToAuxInt(i0) + v0.Aux = symToAux(s) v0.AddArg3(p, idx, mem) return true } @@ -16359,13 +16340,13 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if s1.Op != OpS390XSLWconst { continue } - j1 := s1.AuxInt + j1 := auxIntToInt8(s1.AuxInt) x1 := s1.Args[0] if x1.Op != OpS390XMOVBZloadidx { continue } - i1 := x1.AuxInt - s := x1.Aux + i1 := auxIntToInt32(x1.AuxInt) + s := auxToSym(x1.Aux) mem := x1.Args[2] x1_0 := x1.Args[0] x1_1 := x1.Args[1] @@ -16384,13 +16365,13 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { if s0.Op != OpS390XSLWconst { continue } - j0 := s0.AuxInt + j0 := auxIntToInt8(s0.AuxInt) x0 := s0.Args[0] if x0.Op != OpS390XMOVBZloadidx { continue } - i0 := x0.AuxInt - if x0.Aux != s { + i0 := auxIntToInt32(x0.AuxInt) + if auxToSym(x0.Aux) != s { continue } _ = x0.Args[2] @@ -16408,11 +16389,11 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { v0 := b.NewValue0(v.Pos, OpS390XORW, v.Type) v.copyOf(v0) v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = j0 + v1.AuxInt = int8ToAuxInt(j0) v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = i0 - v3.Aux = s + v3.AuxInt = int32ToAuxInt(i0) + v3.Aux = symToAux(s) v3.AddArg3(p, idx, mem) v2.AddArg(v3) v1.AddArg(v2) @@ -16453,15 +16434,15 @@ func rewriteValueS390X_OpS390XORWconst(v *Value) bool { return true } // match: (ORWconst [c] (MOVDconst [d])) - // result: (MOVDconst [c|d]) + // result: (MOVDconst [int64(c)|d]) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = c | d + v.AuxInt = int64ToAuxInt(int64(c) | d) return true } return false @@ -16471,47 +16452,47 @@ func rewriteValueS390X_OpS390XORWload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ORWload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (ORWload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XORWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (ORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (ORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (ORWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XORWload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -16582,47 +16563,47 @@ func rewriteValueS390X_OpS390XORload(v *Value) bool { return true } // match: (ORload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (ORload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XORload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (ORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (ORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (ORload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XORload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -16632,15 +16613,15 @@ func rewriteValueS390X_OpS390XRLL(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (RLL x (MOVDconst [c])) - // result: (RLLconst x [c&31]) + // result: (RLLconst x [int8(c&31)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XRLLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } @@ -16650,15 +16631,15 @@ func rewriteValueS390X_OpS390XRLLG(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (RLLG x (MOVDconst [c])) - // result: (RLLGconst x [c&63]) + // result: (RLLGconst x [int8(c&63)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XRLLGconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } @@ -16670,20 +16651,20 @@ func rewriteValueS390X_OpS390XSLD(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SLD x (MOVDconst [c])) - // result: (SLDconst x [c&63]) + // result: (SLDconst x [int8(c&63)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XSLDconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SLD x (AND (MOVDconst [c]) y)) - // result: (SLD x (ANDWconst [c&63] y)) + // result: (SLD x (ANDWconst [int32(c&63)] y)) for { x := v_0 if v_1.Op != OpS390XAND { @@ -16696,11 +16677,11 @@ func rewriteValueS390X_OpS390XSLD(v *Value) bool { if v_1_0.Op != OpS390XMOVDconst { continue } - c := v_1_0.AuxInt + c := auxIntToInt64(v_1_0.AuxInt) y := v_1_1 v.reset(OpS390XSLD) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 + v0.AuxInt = int32ToAuxInt(int32(c & 63)) v0.AddArg(y) v.AddArg2(x, v0) return true @@ -16818,20 +16799,20 @@ func rewriteValueS390X_OpS390XSLW(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SLW x (MOVDconst [c])) - // result: (SLWconst x [c&63]) + // result: (SLWconst x [int8(c&63)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XSLWconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SLW x (AND (MOVDconst [c]) y)) - // result: (SLW x (ANDWconst [c&63] y)) + // result: (SLW x (ANDWconst [int32(c&63)] y)) for { x := v_0 if v_1.Op != OpS390XAND { @@ -16844,11 +16825,11 @@ func rewriteValueS390X_OpS390XSLW(v *Value) bool { if v_1_0.Op != OpS390XMOVDconst { continue } - c := v_1_0.AuxInt + c := auxIntToInt64(v_1_0.AuxInt) y := v_1_1 v.reset(OpS390XSLW) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 + v0.AuxInt = int32ToAuxInt(int32(c & 63)) v0.AddArg(y) v.AddArg2(x, v0) return true @@ -16966,20 +16947,20 @@ func rewriteValueS390X_OpS390XSRAD(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SRAD x (MOVDconst [c])) - // result: (SRADconst x [c&63]) + // result: (SRADconst x [int8(c&63)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XSRADconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SRAD x (AND (MOVDconst [c]) y)) - // result: (SRAD x (ANDWconst [c&63] y)) + // result: (SRAD x (ANDWconst [int32(c&63)] y)) for { x := v_0 if v_1.Op != OpS390XAND { @@ -16992,11 +16973,11 @@ func rewriteValueS390X_OpS390XSRAD(v *Value) bool { if v_1_0.Op != OpS390XMOVDconst { continue } - c := v_1_0.AuxInt + c := auxIntToInt64(v_1_0.AuxInt) y := v_1_1 v.reset(OpS390XSRAD) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 + v0.AuxInt = int32ToAuxInt(int32(c & 63)) v0.AddArg(y) v.AddArg2(x, v0) return true @@ -17126,20 +17107,20 @@ func rewriteValueS390X_OpS390XSRAW(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SRAW x (MOVDconst [c])) - // result: (SRAWconst x [c&63]) + // result: (SRAWconst x [int8(c&63)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XSRAWconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SRAW x (AND (MOVDconst [c]) y)) - // result: (SRAW x (ANDWconst [c&63] y)) + // result: (SRAW x (ANDWconst [int32(c&63)] y)) for { x := v_0 if v_1.Op != OpS390XAND { @@ -17152,11 +17133,11 @@ func rewriteValueS390X_OpS390XSRAW(v *Value) bool { if v_1_0.Op != OpS390XMOVDconst { continue } - c := v_1_0.AuxInt + c := auxIntToInt64(v_1_0.AuxInt) y := v_1_1 v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 + v0.AuxInt = int32ToAuxInt(int32(c & 63)) v0.AddArg(y) v.AddArg2(x, v0) return true @@ -17286,20 +17267,20 @@ func rewriteValueS390X_OpS390XSRD(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SRD x (MOVDconst [c])) - // result: (SRDconst x [c&63]) + // result: (SRDconst x [int8(c&63)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XSRDconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SRD x (AND (MOVDconst [c]) y)) - // result: (SRD x (ANDWconst [c&63] y)) + // result: (SRD x (ANDWconst [int32(c&63)] y)) for { x := v_0 if v_1.Op != OpS390XAND { @@ -17312,11 +17293,11 @@ func rewriteValueS390X_OpS390XSRD(v *Value) bool { if v_1_0.Op != OpS390XMOVDconst { continue } - c := v_1_0.AuxInt + c := auxIntToInt64(v_1_0.AuxInt) y := v_1_1 v.reset(OpS390XSRD) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 + v0.AuxInt = int32ToAuxInt(int32(c & 63)) v0.AddArg(y) v.AddArg2(x, v0) return true @@ -17454,20 +17435,20 @@ func rewriteValueS390X_OpS390XSRW(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SRW x (MOVDconst [c])) - // result: (SRWconst x [c&63]) + // result: (SRWconst x [int8(c&63)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XSRWconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SRW x (AND (MOVDconst [c]) y)) - // result: (SRW x (ANDWconst [c&63] y)) + // result: (SRW x (ANDWconst [int32(c&63)] y)) for { x := v_0 if v_1.Op != OpS390XAND { @@ -17480,11 +17461,11 @@ func rewriteValueS390X_OpS390XSRW(v *Value) bool { if v_1_0.Op != OpS390XMOVDconst { continue } - c := v_1_0.AuxInt + c := auxIntToInt64(v_1_0.AuxInt) y := v_1_1 v.reset(OpS390XSRW) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) - v0.AuxInt = c & 63 + v0.AuxInt = int32ToAuxInt(int32(c & 63)) v0.AddArg(y) v.AddArg2(x, v0) return true @@ -17602,16 +17583,16 @@ func rewriteValueS390X_OpS390XSTM2(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (STM2 [i] {s} p w2 w3 x:(STM2 [i-8] {s} p w0 w1 mem)) - // cond: x.Uses == 1 && is20Bit(i-8) && clobber(x) + // cond: x.Uses == 1 && is20Bit(int64(i)-8) && clobber(x) // result: (STM4 [i-8] {s} p w0 w1 w2 w3 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w2 := v_1 w3 := v_2 x := v_3 - if x.Op != OpS390XSTM2 || x.AuxInt != i-8 || x.Aux != s { + if x.Op != OpS390XSTM2 || auxIntToInt32(x.AuxInt) != i-8 || auxToSym(x.Aux) != s { break } mem := x.Args[3] @@ -17620,22 +17601,22 @@ func rewriteValueS390X_OpS390XSTM2(v *Value) bool { } w0 := x.Args[1] w1 := x.Args[2] - if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { + if !(x.Uses == 1 && is20Bit(int64(i)-8) && clobber(x)) { break } v.reset(OpS390XSTM4) - v.AuxInt = i - 8 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 8) + v.Aux = symToAux(s) v.AddArg6(p, w0, w1, w2, w3, mem) return true } // match: (STM2 [i] {s} p (SRDconst [32] x) x mem) // result: (MOVDstore [i] {s} p x mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 - if v_1.Op != OpS390XSRDconst || v_1.AuxInt != 32 { + if v_1.Op != OpS390XSRDconst || auxIntToInt8(v_1.AuxInt) != 32 { break } x := v_1.Args[0] @@ -17644,8 +17625,8 @@ func rewriteValueS390X_OpS390XSTM2(v *Value) bool { } mem := v_3 v.reset(OpS390XMOVDstore) - v.AuxInt = i - v.Aux = s + v.AuxInt = int32ToAuxInt(i) + v.Aux = symToAux(s) v.AddArg3(p, x, mem) return true } @@ -17657,16 +17638,16 @@ func rewriteValueS390X_OpS390XSTMG2(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (STMG2 [i] {s} p w2 w3 x:(STMG2 [i-16] {s} p w0 w1 mem)) - // cond: x.Uses == 1 && is20Bit(i-16) && clobber(x) + // cond: x.Uses == 1 && is20Bit(int64(i)-16) && clobber(x) // result: (STMG4 [i-16] {s} p w0 w1 w2 w3 mem) for { - i := v.AuxInt - s := v.Aux + i := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) p := v_0 w2 := v_1 w3 := v_2 x := v_3 - if x.Op != OpS390XSTMG2 || x.AuxInt != i-16 || x.Aux != s { + if x.Op != OpS390XSTMG2 || auxIntToInt32(x.AuxInt) != i-16 || auxToSym(x.Aux) != s { break } mem := x.Args[3] @@ -17675,12 +17656,12 @@ func rewriteValueS390X_OpS390XSTMG2(v *Value) bool { } w0 := x.Args[1] w1 := x.Args[2] - if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { + if !(x.Uses == 1 && is20Bit(int64(i)-16) && clobber(x)) { break } v.reset(OpS390XSTMG4) - v.AuxInt = i - 16 - v.Aux = s + v.AuxInt = int32ToAuxInt(i - 16) + v.Aux = symToAux(s) v.AddArg6(p, w0, w1, w2, w3, mem) return true } @@ -17692,36 +17673,36 @@ func rewriteValueS390X_OpS390XSUB(v *Value) bool { b := v.Block // match: (SUB x (MOVDconst [c])) // cond: is32Bit(c) - // result: (SUBconst x [c]) + // result: (SUBconst x [int32(c)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { break } v.reset(OpS390XSUBconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } // match: (SUB (MOVDconst [c]) x) // cond: is32Bit(c) - // result: (NEG (SUBconst x [c])) + // result: (NEG (SUBconst x [int32(c)])) for { if v_0.Op != OpS390XMOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 if !(is32Bit(c)) { break } v.reset(OpS390XNEG) v0 := b.NewValue0(v.Pos, OpS390XSUBconst, v.Type) - v0.AuxInt = c + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -17738,7 +17719,7 @@ func rewriteValueS390X_OpS390XSUB(v *Value) bool { return true } // match: (SUB x g:(MOVDload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (SUBload [off] {sym} x ptr mem) for { t := v.Type @@ -17747,17 +17728,17 @@ func rewriteValueS390X_OpS390XSUB(v *Value) bool { if g.Op != OpS390XMOVDload { break } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } v.reset(OpS390XSUBload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -17840,29 +17821,29 @@ func rewriteValueS390X_OpS390XSUBW(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (SUBW x (MOVDconst [c])) - // result: (SUBWconst x [int64(int32(c))]) + // result: (SUBWconst x [int32(c)]) for { x := v_0 if v_1.Op != OpS390XMOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XSUBWconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } // match: (SUBW (MOVDconst [c]) x) - // result: (NEGW (SUBWconst x [int64(int32(c))])) + // result: (NEGW (SUBWconst x [int32(c)])) for { if v_0.Op != OpS390XMOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpS390XNEGW) v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) - v0.AuxInt = int64(int32(c)) + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -17879,7 +17860,7 @@ func rewriteValueS390X_OpS390XSUBW(v *Value) bool { return true } // match: (SUBW x g:(MOVWload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (SUBWload [off] {sym} x ptr mem) for { t := v.Type @@ -17888,22 +17869,22 @@ func rewriteValueS390X_OpS390XSUBW(v *Value) bool { if g.Op != OpS390XMOVWload { break } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } v.reset(OpS390XSUBWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (SUBW x g:(MOVWZload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (SUBWload [off] {sym} x ptr mem) for { t := v.Type @@ -17912,17 +17893,17 @@ func rewriteValueS390X_OpS390XSUBW(v *Value) bool { if g.Op != OpS390XMOVWZload { break } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } v.reset(OpS390XSUBWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -17943,12 +17924,12 @@ func rewriteValueS390X_OpS390XSUBWconst(v *Value) bool { return true } // match: (SUBWconst [c] x) - // result: (ADDWconst [int64(int32(-c))] x) + // result: (ADDWconst [-int32(c)] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 v.reset(OpS390XADDWconst) - v.AuxInt = int64(int32(-c)) + v.AuxInt = int32ToAuxInt(-int32(c)) v.AddArg(x) return true } @@ -17958,47 +17939,47 @@ func rewriteValueS390X_OpS390XSUBWload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (SUBWload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (SUBWload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XSUBWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (SUBWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (SUBWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (SUBWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XSUBWload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -18031,32 +18012,32 @@ func rewriteValueS390X_OpS390XSUBconst(v *Value) bool { return true } // match: (SUBconst (MOVDconst [d]) [c]) - // result: (MOVDconst [d-c]) + // result: (MOVDconst [d-int64(c)]) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = d - c + v.AuxInt = int64ToAuxInt(d - int64(c)) return true } // match: (SUBconst (SUBconst x [d]) [c]) - // cond: is32Bit(-c-d) + // cond: is32Bit(-int64(c)-int64(d)) // result: (ADDconst [-c-d] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XSUBconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(is32Bit(-c - d)) { + if !(is32Bit(-int64(c) - int64(d))) { break } v.reset(OpS390XADDconst) - v.AuxInt = -c - d + v.AuxInt = int32ToAuxInt(-c - d) v.AddArg(x) return true } @@ -18091,47 +18072,47 @@ func rewriteValueS390X_OpS390XSUBload(v *Value) bool { return true } // match: (SUBload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (SUBload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XSUBload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (SUBload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (SUBload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (SUBload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XSUBload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -18266,7 +18247,7 @@ func rewriteValueS390X_OpS390XXOR(v *Value) bool { return true } // match: (XOR x g:(MOVDload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (XORload [off] {sym} x ptr mem) for { t := v.Type @@ -18276,17 +18257,17 @@ func rewriteValueS390X_OpS390XXOR(v *Value) bool { if g.Op != OpS390XMOVDload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XXORload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -18298,16 +18279,16 @@ func rewriteValueS390X_OpS390XXORW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (XORW x (MOVDconst [c])) - // result: (XORWconst [int64(int32(c))] x) + // result: (XORWconst [int32(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 != OpS390XMOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpS390XXORWconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -18349,7 +18330,7 @@ func rewriteValueS390X_OpS390XXORW(v *Value) bool { return true } // match: (XORW x g:(MOVWload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (XORWload [off] {sym} x ptr mem) for { t := v.Type @@ -18359,24 +18340,24 @@ func rewriteValueS390X_OpS390XXORW(v *Value) bool { if g.Op != OpS390XMOVWload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XXORWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } break } // match: (XORW x g:(MOVWZload [off] {sym} ptr mem)) - // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) + // cond: ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (XORWload [off] {sym} x ptr mem) for { t := v.Type @@ -18386,17 +18367,17 @@ func rewriteValueS390X_OpS390XXORW(v *Value) bool { if g.Op != OpS390XMOVWZload { continue } - off := g.AuxInt - sym := g.Aux + off := auxIntToInt32(g.AuxInt) + sym := auxToSym(g.Aux) mem := g.Args[1] ptr := g.Args[0] - if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { + if !(ptr.Op != OpSB && is20Bit(int64(off)) && canMergeLoadClobber(v, g, x) && clobber(g)) { continue } v.reset(OpS390XXORWload) v.Type = t - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } @@ -18419,15 +18400,15 @@ func rewriteValueS390X_OpS390XXORWconst(v *Value) bool { return true } // match: (XORWconst [c] (MOVDconst [d])) - // result: (MOVDconst [c^d]) + // result: (MOVDconst [int64(c)^d]) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpS390XMOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = c ^ d + v.AuxInt = int64ToAuxInt(int64(c) ^ d) return true } return false @@ -18437,47 +18418,47 @@ func rewriteValueS390X_OpS390XXORWload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (XORWload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (XORWload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XXORWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (XORWload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (XORWload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (XORWload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XXORWload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -18538,47 +18519,47 @@ func rewriteValueS390X_OpS390XXORload(v *Value) bool { return true } // match: (XORload [off1] {sym} x (ADDconst [off2] ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(off1+off2) + // cond: ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2)) // result: (XORload [off1+off2] {sym} x ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XADDconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(off1+off2)) { + if !(ptr.Op != OpSB && is20Bit(int64(off1)+int64(off2))) { break } v.reset(OpS390XXORload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(x, ptr, mem) return true } // match: (XORload [o1] {s1} x (MOVDaddr [o2] {s2} ptr) mem) - // cond: ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2) - // result: (XORload [o1+o2] {mergeSym(s1, s2)} x ptr mem) + // cond: ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2) + // result: (XORload [o1+o2] {mergeSymTyped(s1, s2)} x ptr mem) for { - o1 := v.AuxInt - s1 := v.Aux + o1 := auxIntToInt32(v.AuxInt) + s1 := auxToSym(v.Aux) x := v_0 if v_1.Op != OpS390XMOVDaddr { break } - o2 := v_1.AuxInt - s2 := v_1.Aux + o2 := auxIntToInt32(v_1.AuxInt) + s2 := auxToSym(v_1.Aux) ptr := v_1.Args[0] mem := v_2 - if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { + if !(ptr.Op != OpSB && is20Bit(int64(o1)+int64(o2)) && canMergeSym(s1, s2)) { break } v.reset(OpS390XXORload) - v.AuxInt = o1 + o2 - v.Aux = mergeSym(s1, s2) + v.AuxInt = int32ToAuxInt(o1 + o2) + v.Aux = symToAux(mergeSymTyped(s1, s2)) v.AddArg3(x, ptr, mem) return true } @@ -18662,19 +18643,19 @@ func rewriteValueS390X_OpSelect0(v *Value) bool { return true } // match: (Select0 (ADDCconst (MOVDconst [c]) [d])) - // result: (MOVDconst [c+d]) + // result: (MOVDconst [c+int64(d)]) for { if v_0.Op != OpS390XADDCconst { break } - d := v_0.AuxInt + d := auxIntToInt16(v_0.AuxInt) v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break } - c := v_0_0.AuxInt + c := auxIntToInt64(v_0_0.AuxInt) v.reset(OpS390XMOVDconst) - v.AuxInt = c + d + v.AuxInt = int64ToAuxInt(c + int64(d)) return true } // match: (Select0 (SUBC (MOVDconst [c]) (MOVDconst [d]))) @@ -18859,38 +18840,38 @@ func rewriteValueS390X_OpSelect1(v *Value) bool { return true } // match: (Select1 (ADDCconst (MOVDconst [c]) [d])) - // cond: uint64(c+d) >= uint64(c) && c+d == 0 + // cond: uint64(c+int64(d)) >= uint64(c) && c+int64(d) == 0 // result: (FlagEQ) for { if v_0.Op != OpS390XADDCconst { break } - d := v_0.AuxInt + d := auxIntToInt16(v_0.AuxInt) v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break } - c := v_0_0.AuxInt - if !(uint64(c+d) >= uint64(c) && c+d == 0) { + c := auxIntToInt64(v_0_0.AuxInt) + if !(uint64(c+int64(d)) >= uint64(c) && c+int64(d) == 0) { break } v.reset(OpS390XFlagEQ) return true } // match: (Select1 (ADDCconst (MOVDconst [c]) [d])) - // cond: uint64(c+d) >= uint64(c) && c+d != 0 + // cond: uint64(c+int64(d)) >= uint64(c) && c+int64(d) != 0 // result: (FlagLT) for { if v_0.Op != OpS390XADDCconst { break } - d := v_0.AuxInt + d := auxIntToInt16(v_0.AuxInt) v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break } - c := v_0_0.AuxInt - if !(uint64(c+d) >= uint64(c) && c+d != 0) { + c := auxIntToInt64(v_0_0.AuxInt) + if !(uint64(c+int64(d)) >= uint64(c) && c+int64(d) != 0) { break } v.reset(OpS390XFlagLT) -- GitLab From 3ffa1381ec6e44ce1858da8c26267f2888480a4d Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sat, 22 Aug 2020 14:31:49 -0400 Subject: [PATCH 0337/1792] cmd/internal/objabi: delete doc.go cmd/internal/objabi/doc.go has comments decribing the (old) object file format. But cmd/internal/objabi has nothing to do with object files, and never did. Delete. Move some comment to cmd/internal/goobj, where the (new) object file format is actually defined, and update to reflect the current status. Change-Id: Ied96089df4be35e5d259a572ed60ee00f2cd0d1d Reviewed-on: https://go-review.googlesource.com/c/go/+/249958 Reviewed-by: Than McIntosh --- src/cmd/internal/goobj/objfile.go | 14 +++- src/cmd/internal/objabi/doc.go | 122 ------------------------------ 2 files changed, 13 insertions(+), 123 deletions(-) delete mode 100644 src/cmd/internal/objabi/doc.go diff --git a/src/cmd/internal/goobj/objfile.go b/src/cmd/internal/goobj/objfile.go index 5d4a253024..8ec7c481d6 100644 --- a/src/cmd/internal/goobj/objfile.go +++ b/src/cmd/internal/goobj/objfile.go @@ -2,7 +2,19 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Go new object file format, reading and writing. +// This package defines the Go object file format, and provide "low-level" functions +// for reading and writing object files. + +// The object file is understood by the compiler, assembler, linker, and tools. They +// have "high level" code that operates on object files, handling application-specific +// logics, and use this package for the actual reading and writing. Specifically, the +// code below: +// +// - cmd/internal/obj/objfile.go (used by cmd/asm and cmd/compile) +// - cmd/internal/objfile/goobj.go (used cmd/nm, cmd/objdump) +// - cmd/link/internal/loader package (used by cmd/link) +// +// If the object file format changes, they may (or may not) need to change. package goobj diff --git a/src/cmd/internal/objabi/doc.go b/src/cmd/internal/objabi/doc.go deleted file mode 100644 index 08e922b11f..0000000000 --- a/src/cmd/internal/objabi/doc.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// NOTE: There are *three* independent implementations of this object -// file format in the Go source tree: -// -// - cmd/internal/goobj/read.go (used by cmd/addr2line, cmd/nm, cmd/objdump, cmd/pprof) -// - cmd/internal/obj/objfile.go (used by cmd/asm and cmd/compile) -// - cmd/link/internal/objfile.go (used by cmd/link) -// -// When changing the object file format, remember to change all three. - -// Originally, Go object files were Plan 9 object files, but no longer. -// Now they are more like standard object files, in that each symbol is defined -// by an associated memory image (bytes) and a list of relocations to apply -// during linking. We do not (yet?) use a standard file format, however. -// For now, the format is chosen to be as simple as possible to read and write. -// It may change for reasons of efficiency, or we may even switch to a -// standard file format if there are compelling benefits to doing so. -// See golang.org/s/go13linker for more background. -// -// The file format is: -// -// - magic header: "\x00go114ld" -// - byte 1 - version number -// - sequence of strings giving dependencies (imported packages) -// - empty string (marks end of sequence) -// - number of entries in the following sequence -// - sequence of filename strings to generate debug information -// - sequence of symbol references used by the defined symbols -// - byte 0xff (marks end of sequence) -// - sequence of integer lengths: -// - total data length -// - total number of relocations -// - total number of pcdata -// - total number of automatics -// - total number of funcdata -// - total number of files -// - data, the content of the defined symbols -// - sequence of defined symbols -// - byte 0xff (marks end of sequence) -// - magic footer: "\xffgo114ld" -// -// All integers are stored in a zigzag varint format. -// See golang.org/s/go12symtab for a definition. -// -// Data blocks and strings are both stored as an integer -// followed by that many bytes. -// -// A symbol reference is a string name followed by an ABI or -1 for static. -// -// A symbol points to other symbols using an index into the symbol -// reference sequence. Index 0 corresponds to a nil symbol pointer. -// In the symbol layout described below "symref index" stands for this -// index. -// -// Each symbol is laid out as the following fields: -// -// - byte 0xfe (sanity check for synchronization) -// - type [byte] -// - name & ABI [symref index] -// - flags [int] -// 1<<0 dupok -// 1<<1 local -// 1<<2 add to typelink table -// - size [int] -// - gotype [symref index] -// - p [data block] -// - nr [int] -// - r [nr relocations, sorted by off] -// -// If type == STEXT, there are a few more fields: -// -// - args [int] -// - locals [int] -// - nosplit [int] -// - flags [int] -// 1<<0 leaf -// 1<<1 C function -// 1<<2 function may call reflect.Type.Method -// 1<<3 function compiled with -shared -// - nlocal [int] -// - local [nlocal automatics] -// - pcln [pcln table] -// -// Each relocation has the encoding: -// -// - off [int] -// - siz [int] -// - type [int] -// - add [int] -// - sym [symref index] -// -// Each local has the encoding: -// -// - asym [symref index] -// - offset [int] -// - type [int] -// - gotype [symref index] -// -// The pcln table has the encoding: -// -// - pcsp [data block] -// - pcfile [data block] -// - pcline [data block] -// - pcinline [data block] -// - npcdata [int] -// - pcdata [npcdata data blocks] -// - nfuncdata [int] -// - funcdata [nfuncdata symref index] -// - funcdatasym [nfuncdata ints] -// - nfile [int] -// - file [nfile symref index] -// - ninlinedcall [int] -// - inlinedcall [ninlinedcall int symref int symref] -// -// The file layout and meaning of type integers are architecture-independent. -// -// TODO(rsc): The file format is good for a first pass but needs work. -// - There are SymID in the object file that should really just be strings. -package objabi -- GitLab From 63828096f61593cd766d6e25fce74133efeb17f8 Mon Sep 17 00:00:00 2001 From: zhouzhongyuan Date: Fri, 8 May 2020 18:13:58 +0800 Subject: [PATCH 0338/1792] math/big: add function example While reading the source code of the math/big package, I found the SetString function example of float type missing. Change-Id: Id8c16a58e2e24f9463e8ff38adbc98f8c418ab26 Reviewed-on: https://go-review.googlesource.com/c/go/+/232804 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/example_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/math/big/example_test.go b/src/math/big/example_test.go index cfc77351d4..31ca784154 100644 --- a/src/math/big/example_test.go +++ b/src/math/big/example_test.go @@ -25,6 +25,13 @@ func ExampleInt_SetString() { // Output: 420 } +func ExampleFloat_SetString() { + f := new(big.Float) + f.SetString("3.14159") + fmt.Println(f) + // Output: 3.14159 +} + func ExampleRat_Scan() { // The Scan function is rarely used directly; // the fmt package recognizes it as an implementation of fmt.Scanner. -- GitLab From 6f561e65b16645fea771375d3af6d7896ab025e6 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 26 Aug 2020 23:18:41 +0700 Subject: [PATCH 0339/1792] cmd/fix: remove un-used code Change-Id: Ibbd9da6fd1f3219c9c6103d8f858347ab3a21210 Reviewed-on: https://go-review.googlesource.com/c/go/+/250857 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/fix/fix.go | 292 --------------------------------------------- 1 file changed, 292 deletions(-) diff --git a/src/cmd/fix/fix.go b/src/cmd/fix/fix.go index 2c64e9b414..b49db37571 100644 --- a/src/cmd/fix/fix.go +++ b/src/cmd/fix/fix.go @@ -7,13 +7,9 @@ package main import ( "fmt" "go/ast" - "go/parser" "go/token" - "os" "path" - "reflect" "strconv" - "strings" ) type fix struct { @@ -323,160 +319,12 @@ func declImports(gen *ast.GenDecl, path string) bool { return false } -// isPkgDot reports whether t is the expression "pkg.name" -// where pkg is an imported identifier. -func isPkgDot(t ast.Expr, pkg, name string) bool { - sel, ok := t.(*ast.SelectorExpr) - return ok && isTopName(sel.X, pkg) && sel.Sel.String() == name -} - -// isPtrPkgDot reports whether f is the expression "*pkg.name" -// where pkg is an imported identifier. -func isPtrPkgDot(t ast.Expr, pkg, name string) bool { - ptr, ok := t.(*ast.StarExpr) - return ok && isPkgDot(ptr.X, pkg, name) -} - // isTopName reports whether n is a top-level unresolved identifier with the given name. func isTopName(n ast.Expr, name string) bool { id, ok := n.(*ast.Ident) return ok && id.Name == name && id.Obj == nil } -// isName reports whether n is an identifier with the given name. -func isName(n ast.Expr, name string) bool { - id, ok := n.(*ast.Ident) - return ok && id.String() == name -} - -// isCall reports whether t is a call to pkg.name. -func isCall(t ast.Expr, pkg, name string) bool { - call, ok := t.(*ast.CallExpr) - return ok && isPkgDot(call.Fun, pkg, name) -} - -// If n is an *ast.Ident, isIdent returns it; otherwise isIdent returns nil. -func isIdent(n interface{}) *ast.Ident { - id, _ := n.(*ast.Ident) - return id -} - -// refersTo reports whether n is a reference to the same object as x. -func refersTo(n ast.Node, x *ast.Ident) bool { - id, ok := n.(*ast.Ident) - // The test of id.Name == x.Name handles top-level unresolved - // identifiers, which all have Obj == nil. - return ok && id.Obj == x.Obj && id.Name == x.Name -} - -// isBlank reports whether n is the blank identifier. -func isBlank(n ast.Expr) bool { - return isName(n, "_") -} - -// isEmptyString reports whether n is an empty string literal. -func isEmptyString(n ast.Expr) bool { - lit, ok := n.(*ast.BasicLit) - return ok && lit.Kind == token.STRING && len(lit.Value) == 2 -} - -func warn(pos token.Pos, msg string, args ...interface{}) { - if pos.IsValid() { - msg = "%s: " + msg - arg1 := []interface{}{fset.Position(pos).String()} - args = append(arg1, args...) - } - fmt.Fprintf(os.Stderr, msg+"\n", args...) -} - -// countUses returns the number of uses of the identifier x in scope. -func countUses(x *ast.Ident, scope []ast.Stmt) int { - count := 0 - ff := func(n interface{}) { - if n, ok := n.(ast.Node); ok && refersTo(n, x) { - count++ - } - } - for _, n := range scope { - walk(n, ff) - } - return count -} - -// rewriteUses replaces all uses of the identifier x and !x in scope -// with f(x.Pos()) and fnot(x.Pos()). -func rewriteUses(x *ast.Ident, f, fnot func(token.Pos) ast.Expr, scope []ast.Stmt) { - var lastF ast.Expr - ff := func(n interface{}) { - ptr, ok := n.(*ast.Expr) - if !ok { - return - } - nn := *ptr - - // The child node was just walked and possibly replaced. - // If it was replaced and this is a negation, replace with fnot(p). - not, ok := nn.(*ast.UnaryExpr) - if ok && not.Op == token.NOT && not.X == lastF { - *ptr = fnot(nn.Pos()) - return - } - if refersTo(nn, x) { - lastF = f(nn.Pos()) - *ptr = lastF - } - } - for _, n := range scope { - walk(n, ff) - } -} - -// assignsTo reports whether any of the code in scope assigns to or takes the address of x. -func assignsTo(x *ast.Ident, scope []ast.Stmt) bool { - assigned := false - ff := func(n interface{}) { - if assigned { - return - } - switch n := n.(type) { - case *ast.UnaryExpr: - // use of &x - if n.Op == token.AND && refersTo(n.X, x) { - assigned = true - return - } - case *ast.AssignStmt: - for _, l := range n.Lhs { - if refersTo(l, x) { - assigned = true - return - } - } - } - } - for _, n := range scope { - if assigned { - break - } - walk(n, ff) - } - return assigned -} - -// newPkgDot returns an ast.Expr referring to "pkg.name" at position pos. -func newPkgDot(pos token.Pos, pkg, name string) ast.Expr { - return &ast.SelectorExpr{ - X: &ast.Ident{ - NamePos: pos, - Name: pkg, - }, - Sel: &ast.Ident{ - NamePos: pos, - Name: name, - }, - } -} - // renameTop renames all references to the top-level name old. // It reports whether it makes any changes. func renameTop(f *ast.File, old, new string) bool { @@ -707,143 +555,3 @@ func rewriteImport(f *ast.File, oldPath, newPath string) (rewrote bool) { } return } - -func usesImport(f *ast.File, path string) (used bool) { - spec := importSpec(f, path) - if spec == nil { - return - } - - name := spec.Name.String() - switch name { - case "": - // If the package name is not explicitly specified, - // make an educated guess. This is not guaranteed to be correct. - lastSlash := strings.LastIndex(path, "/") - if lastSlash == -1 { - name = path - } else { - name = path[lastSlash+1:] - } - case "_", ".": - // Not sure if this import is used - err on the side of caution. - return true - } - - walk(f, func(n interface{}) { - sel, ok := n.(*ast.SelectorExpr) - if ok && isTopName(sel.X, name) { - used = true - } - }) - - return -} - -func expr(s string) ast.Expr { - x, err := parser.ParseExpr(s) - if err != nil { - panic("parsing " + s + ": " + err.Error()) - } - // Remove position information to avoid spurious newlines. - killPos(reflect.ValueOf(x)) - return x -} - -var posType = reflect.TypeOf(token.Pos(0)) - -func killPos(v reflect.Value) { - switch v.Kind() { - case reflect.Ptr, reflect.Interface: - if !v.IsNil() { - killPos(v.Elem()) - } - case reflect.Slice: - n := v.Len() - for i := 0; i < n; i++ { - killPos(v.Index(i)) - } - case reflect.Struct: - n := v.NumField() - for i := 0; i < n; i++ { - f := v.Field(i) - if f.Type() == posType { - f.SetInt(0) - continue - } - killPos(f) - } - } -} - -// A Rename describes a single renaming. -type rename struct { - OldImport string // only apply rename if this import is present - NewImport string // add this import during rewrite - Old string // old name: p.T or *p.T - New string // new name: p.T or *p.T -} - -func renameFix(tab []rename) func(*ast.File) bool { - return func(f *ast.File) bool { - return renameFixTab(f, tab) - } -} - -func parseName(s string) (ptr bool, pkg, nam string) { - i := strings.Index(s, ".") - if i < 0 { - panic("parseName: invalid name " + s) - } - if strings.HasPrefix(s, "*") { - ptr = true - s = s[1:] - i-- - } - pkg = s[:i] - nam = s[i+1:] - return -} - -func renameFixTab(f *ast.File, tab []rename) bool { - fixed := false - added := map[string]bool{} - check := map[string]bool{} - for _, t := range tab { - if !imports(f, t.OldImport) { - continue - } - optr, opkg, onam := parseName(t.Old) - walk(f, func(n interface{}) { - np, ok := n.(*ast.Expr) - if !ok { - return - } - x := *np - if optr { - p, ok := x.(*ast.StarExpr) - if !ok { - return - } - x = p.X - } - if !isPkgDot(x, opkg, onam) { - return - } - if t.NewImport != "" && !added[t.NewImport] { - addImport(f, t.NewImport) - added[t.NewImport] = true - } - *np = expr(t.New) - check[t.OldImport] = true - fixed = true - }) - } - - for ipath := range check { - if !usesImport(f, ipath) { - deleteImport(f, ipath) - } - } - return fixed -} -- GitLab From d4986e0e1d6e03e1b92e905ca5e01b4c223fbeb3 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Mon, 16 Dec 2019 17:18:06 -0500 Subject: [PATCH 0340/1792] cmd/go/internal/modload: reject empty go.mod files Don't add a module declaration to a go.mod file when loading a module. Require a user to call go mod init or to add the module declaration themselves. Fixes #35070 Change-Id: If5543580d3c1cfee1fc528eb853b872c4173ca82 Reviewed-on: https://go-review.googlesource.com/c/go/+/234107 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/init.go | 10 +++------- src/cmd/go/testdata/script/mod_find.txt | 5 +++++ src/cmd/go/testdata/script/mod_invalid_path.txt | 12 ++++++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_invalid_path.txt diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 7f493104b1..af23647cd4 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -368,13 +368,9 @@ func InitMod(ctx context.Context) { modFile = f index = indexModFile(data, f, fixed) - if len(f.Syntax.Stmt) == 0 || f.Module == nil { - // Empty mod file. Must add module path. - path, err := findModulePath(modRoot) - if err != nil { - base.Fatalf("go: %v", err) - } - f.AddModuleStmt(path) + if f.Module == nil { + // No module declaration. Must add module path. + base.Fatalf("go: no module declaration in go.mod.\n\tRun 'go mod edit -module=example.com/mod' to specify the module path.") } if len(f.Syntax.Stmt) == 1 && f.Module != nil { diff --git a/src/cmd/go/testdata/script/mod_find.txt b/src/cmd/go/testdata/script/mod_find.txt index 7fbe9fb7fe..9468acfd33 100644 --- a/src/cmd/go/testdata/script/mod_find.txt +++ b/src/cmd/go/testdata/script/mod_find.txt @@ -19,6 +19,11 @@ go mod init stderr 'module example.com/x/y$' rm go.mod +# go mod init rejects a zero-length go.mod file +cp $devnull go.mod # can't use touch to create it because Windows +! go mod init +stderr 'go.mod already exists' + # Module path from Godeps/Godeps.json overrides GOPATH. cd $GOPATH/src/example.com/x/y/z go mod init diff --git a/src/cmd/go/testdata/script/mod_invalid_path.txt b/src/cmd/go/testdata/script/mod_invalid_path.txt new file mode 100644 index 0000000000..1ab418a075 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_invalid_path.txt @@ -0,0 +1,12 @@ +# Test that mod files with missing paths produce an error. + +# 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.\n\tRun ''go mod edit -module=example.com/mod'' to specify the module path.$' + +-- mod/go.mod -- + +-- mod/foo.go -- +package foo + -- GitLab From bf869c65d1a96da5db78a891430ea3acd7ddf1ab Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 13 Apr 2020 16:33:28 -0400 Subject: [PATCH 0341/1792] cmd/go: update vendored golang.org/x/mod This CL vendors go.mod parser changes for the retract directive. For #24031 Change-Id: Ief19b0eca4c7956eceadc893bb209da7e9ecf22c Reviewed-on: https://go-review.googlesource.com/c/go/+/228377 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills Reviewed-by: Michael Matloob --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 5 +- .../vendor/golang.org/x/mod/modfile/read.go | 8 + .../vendor/golang.org/x/mod/modfile/rule.go | 243 ++++++++++++++++-- src/cmd/vendor/modules.txt | 2 +- 5 files changed, 235 insertions(+), 25 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 21670b9996..5c5c99e3cd 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -7,7 +7,7 @@ require ( github.com/ianlancetaylor/demangle v0.0.0-20200414190113-039b1ae3a340 // indirect golang.org/x/arch v0.0.0-20200511175325-f7c78586839d golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 - golang.org/x/mod v0.3.1-0.20200625141748-0b26df4a2231 + golang.org/x/mod v0.3.1-0.20200824162228-c0d644d00ab8 golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 // indirect golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316 // indirect diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 1b5ef515c2..69cebe1b23 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -14,8 +14,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200625141748-0b26df4a2231 h1:R11LxkoUvECaAHdM5/ZOevSR7n+016EgTw8nbE1l+XM= -golang.org/x/mod v0.3.1-0.20200625141748-0b26df4a2231/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200824162228-c0d644d00ab8 h1:Qbq3laTJZip3mEOreFwHF81RGkkhIvmraRMINHNyWHE= +golang.org/x/mod v0.3.1-0.20200824162228-c0d644d00ab8/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -32,7 +32,6 @@ golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 h1:HHeAlu5H9b71C+Fx0K+1dGg golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316 h1:Jhw4VC65LaKnpq9FvcK+a8ZzrFm3D+UygvMMrhkOw70= golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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 c1f2008ee4..2a961ca81c 100644 --- a/src/cmd/vendor/golang.org/x/mod/modfile/read.go +++ b/src/cmd/vendor/golang.org/x/mod/modfile/read.go @@ -477,9 +477,17 @@ func (in *input) startToken() { // endToken marks the end of an input token. // It records the actual token string in tok.text. +// A single trailing newline (LF or CRLF) will be removed from comment tokens. func (in *input) endToken(kind tokenKind) { in.token.kind = kind text := string(in.tokenStart[:len(in.tokenStart)-len(in.remaining)]) + if kind.isComment() { + if strings.HasSuffix(text, "\r\n") { + text = text[:len(text)-2] + } else { + text = strings.TrimSuffix(text, "\n") + } + } in.token.text = text in.token.endPos = in.pos } 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 91ca6828df..83398dda5d 100644 --- a/src/cmd/vendor/golang.org/x/mod/modfile/rule.go +++ b/src/cmd/vendor/golang.org/x/mod/modfile/rule.go @@ -30,6 +30,7 @@ import ( "golang.org/x/mod/internal/lazyregexp" "golang.org/x/mod/module" + "golang.org/x/mod/semver" ) // A File is the parsed, interpreted form of a go.mod file. @@ -39,6 +40,7 @@ type File struct { Require []*Require Exclude []*Exclude Replace []*Replace + Retract []*Retract Syntax *FileSyntax } @@ -75,6 +77,21 @@ type Replace struct { Syntax *Line } +// A Retract is a single retract statement. +type Retract struct { + VersionInterval + Rationale string + Syntax *Line +} + +// A VersionInterval represents a range of versions with upper and lower bounds. +// Intervals are closed: both bounds are included. When Low is equal to High, +// the interval may refer to a single version ('v1.2.3') or an interval +// ('[v1.2.3, v1.2.3]'); both have the same representation. +type VersionInterval struct { + Low, High string +} + func (f *File) AddModuleStmt(path string) error { if f.Syntax == nil { f.Syntax = new(FileSyntax) @@ -138,7 +155,7 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File for _, x := range fs.Stmt { switch x := x.(type) { case *Line: - f.add(&errs, x, x.Token[0], x.Token[1:], fix, strict) + f.add(&errs, nil, x, x.Token[0], x.Token[1:], fix, strict) case *LineBlock: if len(x.Token) > 1 { @@ -161,9 +178,9 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File }) } continue - case "module", "require", "exclude", "replace": + case "module", "require", "exclude", "replace", "retract": for _, l := range x.Line { - f.add(&errs, l, x.Token[0], l.Token, fix, strict) + f.add(&errs, x, l, x.Token[0], l.Token, fix, strict) } } } @@ -177,7 +194,7 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File var GoVersionRE = lazyregexp.New(`^([1-9][0-9]*)\.(0|[1-9][0-9]*)$`) -func (f *File) add(errs *ErrorList, line *Line, verb string, args []string, fix VersionFixer, strict bool) { +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 // directives like replace and exclude. It will work better for @@ -186,7 +203,7 @@ func (f *File) add(errs *ErrorList, line *Line, verb string, args []string, fix // and simply ignore those statements. if !strict { switch verb { - case "module", "require", "go": + case "go", "module", "retract", "require": // want these even for dependency go.mods default: return @@ -232,6 +249,7 @@ func (f *File) add(errs *ErrorList, line *Line, verb string, args []string, fix f.Go = &Go{Syntax: line} f.Go.Version = args[0] + case "module": if f.Module != nil { errorf("repeated module statement") @@ -248,6 +266,7 @@ func (f *File) add(errs *ErrorList, line *Line, verb string, args []string, fix return } f.Module.Mod = module.Version{Path: s} + case "require", "exclude": if len(args) != 2 { errorf("usage: %s module/path v1.2.3", verb) @@ -284,6 +303,7 @@ func (f *File) add(errs *ErrorList, line *Line, verb string, args []string, fix Syntax: line, }) } + case "replace": arrow := 2 if len(args) >= 2 && args[1] == "=>" { @@ -347,6 +367,33 @@ func (f *File) add(errs *ErrorList, line *Line, verb string, args []string, fix New: module.Version{Path: ns, Version: nv}, Syntax: line, }) + + case "retract": + rationale := parseRetractRationale(block, line) + vi, err := parseVersionInterval(verb, &args, fix) + if err != nil { + if strict { + wrapError(err) + return + } else { + // Only report errors parsing intervals in the main module. We may + // support additional syntax in the future, such as open and half-open + // intervals. Those can't be supported now, because they break the + // go.mod parser, even in lax mode. + return + } + } + if len(args) > 0 && strict { + // In the future, there may be additional information after the version. + errorf("unexpected token after version: %q", args[0]) + return + } + retract := &Retract{ + VersionInterval: vi, + Rationale: rationale, + Syntax: line, + } + f.Retract = append(f.Retract, retract) } } @@ -444,6 +491,53 @@ func AutoQuote(s string) string { return s } +func parseVersionInterval(verb string, args *[]string, fix VersionFixer) (VersionInterval, error) { + toks := *args + if len(toks) == 0 || toks[0] == "(" { + return VersionInterval{}, fmt.Errorf("expected '[' or version") + } + if toks[0] != "[" { + v, err := parseVersion(verb, "", &toks[0], fix) + if err != nil { + return VersionInterval{}, err + } + *args = toks[1:] + return VersionInterval{Low: v, High: v}, nil + } + toks = toks[1:] + + if len(toks) == 0 { + return VersionInterval{}, fmt.Errorf("expected version after '['") + } + low, err := parseVersion(verb, "", &toks[0], fix) + if err != nil { + return VersionInterval{}, err + } + toks = toks[1:] + + if len(toks) == 0 || toks[0] != "," { + return VersionInterval{}, fmt.Errorf("expected ',' after version") + } + toks = toks[1:] + + if len(toks) == 0 { + return VersionInterval{}, fmt.Errorf("expected version after ','") + } + high, err := parseVersion(verb, "", &toks[0], fix) + if err != nil { + return VersionInterval{}, err + } + toks = toks[1:] + + if len(toks) == 0 || toks[0] != "]" { + return VersionInterval{}, fmt.Errorf("expected ']' after version") + } + toks = toks[1:] + + *args = toks + return VersionInterval{Low: low, High: high}, nil +} + func parseString(s *string) (string, error) { t := *s if strings.HasPrefix(t, `"`) { @@ -461,6 +555,27 @@ func parseString(s *string) (string, error) { return t, nil } +// parseRetractRationale extracts the rationale for a retract directive from the +// surrounding comments. If the line does not have comments and is part of a +// block that does have comments, the block's comments are used. +func parseRetractRationale(block *LineBlock, line *Line) string { + comments := line.Comment() + if block != nil && len(comments.Before) == 0 && len(comments.Suffix) == 0 { + comments = block.Comment() + } + groups := [][]Comment{comments.Before, comments.Suffix} + var lines []string + for _, g := range groups { + for _, c := range g { + if !strings.HasPrefix(c.Token, "//") { + continue // blank line + } + lines = append(lines, strings.TrimSpace(strings.TrimPrefix(c.Token, "//"))) + } + } + return strings.Join(lines, "\n") +} + type ErrorList []Error func (e ErrorList) Error() string { @@ -494,6 +609,8 @@ func (e *Error) Error() string { var directive string if e.ModPath != "" { directive = fmt.Sprintf("%s %s: ", e.Verb, e.ModPath) + } else if e.Verb != "" { + directive = fmt.Sprintf("%s: ", e.Verb) } return pos + directive + e.Err.Error() @@ -585,6 +702,15 @@ func (f *File) Cleanup() { } f.Replace = f.Replace[:w] + w = 0 + for _, r := range f.Retract { + if r.Low != "" || r.High != "" { + f.Retract[w] = r + w++ + } + } + f.Retract = f.Retract[:w] + f.Syntax.Cleanup() } @@ -778,6 +904,34 @@ func (f *File) DropReplace(oldPath, oldVers string) error { return nil } +func (f *File) AddRetract(vi VersionInterval, rationale string) error { + r := &Retract{ + VersionInterval: vi, + } + if vi.Low == vi.High { + r.Syntax = f.Syntax.addLine(nil, "retract", AutoQuote(vi.Low)) + } else { + r.Syntax = f.Syntax.addLine(nil, "retract", "[", AutoQuote(vi.Low), ",", AutoQuote(vi.High), "]") + } + if rationale != "" { + for _, line := range strings.Split(rationale, "\n") { + com := Comment{Token: "// " + line} + r.Syntax.Comment().Before = append(r.Syntax.Comment().Before, com) + } + } + return nil +} + +func (f *File) DropRetract(vi VersionInterval) error { + for _, r := range f.Retract { + if r.VersionInterval == vi { + f.Syntax.removeLine(r.Syntax) + *r = Retract{} + } + } + return nil +} + func (f *File) SortBlocks() { f.removeDups() // otherwise sorting is unsafe @@ -786,28 +940,38 @@ func (f *File) SortBlocks() { if !ok { continue } - sort.Slice(block.Line, func(i, j int) bool { - li := block.Line[i] - lj := block.Line[j] - for k := 0; k < len(li.Token) && k < len(lj.Token); k++ { - if li.Token[k] != lj.Token[k] { - return li.Token[k] < lj.Token[k] - } - } - return len(li.Token) < len(lj.Token) + less := lineLess + if block.Token[0] == "retract" { + less = lineRetractLess + } + sort.SliceStable(block.Line, func(i, j int) bool { + return less(block.Line[i], block.Line[j]) }) } } +// removeDups removes duplicate exclude and replace directives. +// +// Earlier exclude directives take priority. +// +// Later replace directives take priority. +// +// require directives are not de-duplicated. That's left up to higher-level +// logic (MVS). +// +// retract directives are not de-duplicated since comments are +// meaningful, and versions may be retracted multiple times. func (f *File) removeDups() { - have := make(map[module.Version]bool) kill := make(map[*Line]bool) + + // Remove duplicate excludes. + haveExclude := make(map[module.Version]bool) for _, x := range f.Exclude { - if have[x.Mod] { + if haveExclude[x.Mod] { kill[x.Syntax] = true continue } - have[x.Mod] = true + haveExclude[x.Mod] = true } var excl []*Exclude for _, x := range f.Exclude { @@ -817,15 +981,16 @@ func (f *File) removeDups() { } f.Exclude = excl - have = make(map[module.Version]bool) + // Remove duplicate replacements. // Later replacements take priority over earlier ones. + haveReplace := make(map[module.Version]bool) for i := len(f.Replace) - 1; i >= 0; i-- { x := f.Replace[i] - if have[x.Old] { + if haveReplace[x.Old] { kill[x.Syntax] = true continue } - have[x.Old] = true + haveReplace[x.Old] = true } var repl []*Replace for _, x := range f.Replace { @@ -835,6 +1000,9 @@ func (f *File) removeDups() { } f.Replace = repl + // Duplicate require and retract directives are not removed. + + // Drop killed statements from the syntax tree. var stmts []Expr for _, stmt := range f.Syntax.Stmt { switch stmt := stmt.(type) { @@ -858,3 +1026,38 @@ func (f *File) removeDups() { } f.Syntax.Stmt = stmts } + +// lineLess returns whether li should be sorted before lj. It sorts +// lexicographically without assigning any special meaning to tokens. +func lineLess(li, lj *Line) bool { + for k := 0; k < len(li.Token) && k < len(lj.Token); k++ { + if li.Token[k] != lj.Token[k] { + return li.Token[k] < lj.Token[k] + } + } + return len(li.Token) < len(lj.Token) +} + +// 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. +// Intervals are sorted in descending order, first by low version, then by +// high version, using semver.Compare. +func lineRetractLess(li, lj *Line) bool { + interval := func(l *Line) VersionInterval { + if len(l.Token) == 1 { + return VersionInterval{Low: l.Token[0], High: l.Token[0]} + } else if len(l.Token) == 5 && l.Token[0] == "[" && l.Token[2] == "," && l.Token[4] == "]" { + return VersionInterval{Low: l.Token[1], High: l.Token[3]} + } else { + // Line in unknown format. Treat as an invalid version. + return VersionInterval{} + } + } + vii := interval(li) + vij := interval(lj) + if cmp := semver.Compare(vii.Low, vij.Low); cmp != 0 { + return cmp > 0 + } + return semver.Compare(vii.High, vij.High) > 0 +} diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 7272f04ff3..ab2f81a66b 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -29,7 +29,7 @@ golang.org/x/arch/x86/x86asm golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ssh/terminal -# golang.org/x/mod v0.3.1-0.20200625141748-0b26df4a2231 +# golang.org/x/mod v0.3.1-0.20200824162228-c0d644d00ab8 ## explicit golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile -- GitLab From db821b54d1a8dffa85a9a3cf599f83a19184f020 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 15 Apr 2020 12:08:24 -0400 Subject: [PATCH 0342/1792] cmd/go/internal/modload: refactor version filtering for exclude Query and other functions now accept an "allowed" function that returns an error (previously, the function returned a bool). If the error is equivalent to ErrDisallowed, it indicates the version is excluded (or, in a future CL, retracted). This provides predicates a chance to explain why a version is not allowed. When a query refers to a specific revision (by version, branch, tag, or commit name), most callers will not use the Allowed predicate. This allows commands like 'go list -m' and 'go mod download' to handle disallowed versions when explicitly requested. 'go get' will reject excluded versions though. When a query does not refer to a specific revision (for example, "latest"), disallowed versions will not be considered. When an "allowed" predicate returns an error not equivalent to ErrDisallowed, it may be ignored or returned, depending on the case. This never happens for excluded versions, but it may happen for retractions (in a future CL). This indicates a list of retractions could not be loaded. This frequently happens when offline, and it shouldn't cause a fatal or warning in most cases. For #24031 Change-Id: I4df6fb6bd60e3e0259e5b3b4bf71a307b4b32298 Reviewed-on: https://go-review.googlesource.com/c/go/+/228379 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modget/get.go | 6 +- src/cmd/go/internal/modload/build.go | 6 +- src/cmd/go/internal/modload/import.go | 2 +- src/cmd/go/internal/modload/list.go | 9 +- src/cmd/go/internal/modload/modfile.go | 38 ++++-- src/cmd/go/internal/modload/mvs.go | 28 ++++- src/cmd/go/internal/modload/query.go | 111 ++++++++++++------ src/cmd/go/internal/modload/query_test.go | 8 +- .../go/testdata/script/mod_query_exclude.txt | 40 +++++-- 9 files changed, 177 insertions(+), 71 deletions(-) diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index ee9757912b..06d59d9e0d 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -812,7 +812,7 @@ func getQuery(ctx context.Context, path, vers string, prevM module.Version, forc } } - info, err := modload.Query(ctx, path, vers, prevM.Version, modload.Allowed) + info, err := modload.Query(ctx, path, vers, prevM.Version, modload.CheckAllowed) if err == nil { if info.Version != vers && info.Version != prevM.Version { logOncef("go: %s %s => %s", path, vers, info.Version) @@ -838,7 +838,7 @@ func getQuery(ctx context.Context, path, vers string, prevM module.Version, forc // If it turns out to only exist as a module, we can detect the resulting // PackageNotInModuleError and avoid a second round-trip through (potentially) // all of the configured proxies. - results, err := modload.QueryPattern(ctx, path, vers, modload.Allowed) + results, err := modload.QueryPattern(ctx, path, vers, modload.CheckAllowed) if err != nil { // If the path doesn't contain a wildcard, check whether it was actually a // module path instead. If so, return that. @@ -994,7 +994,7 @@ func (u *upgrader) Upgrade(m module.Version) (module.Version, error) { // If we're querying "upgrade" or "patch", Query will compare the current // version against the chosen version and will return the current version // if it is newer. - info, err := modload.Query(context.TODO(), m.Path, string(getU), m.Version, modload.Allowed) + info, err := modload.Query(context.TODO(), m.Path, string(getU), m.Version, modload.CheckAllowed) if err != nil { // Report error but return m, to let version selection continue. // (Reporting the error will fail the command at the next base.ExitIfErrors.) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 7e182b4a4d..a29e085875 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -90,7 +90,7 @@ func addUpdate(ctx context.Context, m *modinfo.ModulePublic) { return } - if info, err := Query(ctx, m.Path, "upgrade", m.Version, Allowed); err == nil && semver.Compare(info.Version, m.Version) > 0 { + if info, err := Query(ctx, m.Path, "upgrade", m.Version, CheckAllowed); err == nil && semver.Compare(info.Version, m.Version) > 0 { m.Update = &modinfo.ModulePublic{ Path: m.Path, Version: info.Version, @@ -100,8 +100,8 @@ func addUpdate(ctx context.Context, m *modinfo.ModulePublic) { } // addVersions fills in m.Versions with the list of known versions. -func addVersions(m *modinfo.ModulePublic) { - m.Versions, _ = versions(m.Path) +func addVersions(ctx context.Context, m *modinfo.ModulePublic) { + m.Versions, _ = versions(ctx, m.Path, CheckAllowed) } func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modinfo.ModulePublic { diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 5c51a79124..6459e716b7 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -286,7 +286,7 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err fmt.Fprintf(os.Stderr, "go: finding module for package %s\n", path) - candidates, err := QueryPackage(ctx, path, "latest", Allowed) + candidates, err := QueryPackage(ctx, path, "latest", CheckAllowed) if err != nil { if errors.Is(err, os.ErrNotExist) { // Return "cannot find module providing package […]" instead of whatever diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 7bf4e86c8d..2f549540a6 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -34,7 +34,7 @@ func ListModules(ctx context.Context, args []string, listU, listVersions bool) [ addUpdate(ctx, m) } if listVersions { - addVersions(m) + addVersions(ctx, m) } <-sem }() @@ -83,7 +83,12 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin } } - info, err := Query(ctx, path, vers, current, nil) + allowed := CheckAllowed + if IsRevisionQuery(vers) { + // Allow excluded versions if the user asked for a specific revision. + allowed = nil + } + info, err := Query(ctx, path, vers, current, allowed) if err != nil { mods = append(mods, &modinfo.ModulePublic{ Path: path, diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index c04e2add13..aed1f0a36b 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -5,15 +5,17 @@ package modload import ( + "context" + "errors" + "fmt" + "path/filepath" + "sync" + "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/lockedfile" "cmd/go/internal/modfetch" "cmd/go/internal/par" - "errors" - "fmt" - "path/filepath" - "sync" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -41,11 +43,33 @@ type requireMeta struct { indirect bool } -// Allowed reports whether module m is allowed (not excluded) by the main module's go.mod. -func Allowed(m module.Version) bool { - return index == nil || !index.exclude[m] +// CheckAllowed returns an error equivalent to ErrDisallowed if m is excluded by +// the main module's go.mod. Most version queries use this to filter out +// versions that should not be used. +func CheckAllowed(ctx context.Context, m module.Version) error { + return CheckExclusions(ctx, m) +} + +// ErrDisallowed is returned by version predicates passed to Query and similar +// functions to indicate that a version should not be considered. +var ErrDisallowed = errors.New("disallowed module version") + +// CheckExclusions returns an error equivalent to ErrDisallowed if module m is +// excluded by the main module's go.mod file. +func CheckExclusions(ctx context.Context, m module.Version) error { + if index != nil && index.exclude[m] { + return module.VersionError(m, errExcluded) + } + return nil } +var errExcluded = &excludedError{} + +type excludedError struct{} + +func (e *excludedError) Error() string { return "excluded by go.mod" } +func (e *excludedError) Is(err error) bool { return err == ErrDisallowed } + // Replacement returns the replacement for mod, if any, from go.mod. // If there is no replacement for mod, Replacement returns // a module.Version with Path == "". diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 6b6ad945e4..d023ab5094 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -6,6 +6,7 @@ package modload import ( "context" + "errors" "fmt" "os" "path/filepath" @@ -73,16 +74,29 @@ func (*mvsReqs) Upgrade(m module.Version) (module.Version, error) { return m, nil } -func versions(path string) ([]string, error) { +func versions(ctx context.Context, path string, allowed AllowedFunc) ([]string, error) { // Note: modfetch.Lookup and repo.Versions are cached, // so there's no need for us to add extra caching here. var versions []string err := modfetch.TryProxies(func(proxy string) error { repo, err := modfetch.Lookup(proxy, path) - if err == nil { - versions, err = repo.Versions("") + if err != nil { + return err } - return err + allVersions, err := repo.Versions("") + if err != nil { + return err + } + allowedVersions := make([]string, 0, len(allVersions)) + for _, v := range allVersions { + if err := allowed(ctx, module.Version{Path: path, Version: v}); err == nil { + allowedVersions = append(allowedVersions, v) + } else if !errors.Is(err, ErrDisallowed) { + return err + } + } + versions = allowedVersions + return nil }) return versions, err } @@ -90,7 +104,8 @@ func versions(path string) ([]string, error) { // Previous returns the tagged version of m.Path immediately prior to // m.Version, or version "none" if no prior version is tagged. func (*mvsReqs) Previous(m module.Version) (module.Version, error) { - list, err := versions(m.Path) + // TODO(golang.org/issue/38714): thread tracing context through MVS. + list, err := versions(context.TODO(), m.Path, CheckAllowed) if err != nil { return module.Version{}, err } @@ -105,7 +120,8 @@ func (*mvsReqs) Previous(m module.Version) (module.Version, error) { // It is only used by the exclusion processing in the Required method, // not called directly by MVS. func (*mvsReqs) next(m module.Version) (module.Version, error) { - list, err := versions(m.Path) + // TODO(golang.org/issue/38714): thread tracing context through MVS. + list, err := versions(context.TODO(), m.Path, CheckAllowed) if err != nil { return module.Version{}, err } diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index e82eb1506f..f67a738677 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -52,12 +52,16 @@ import ( // version that would otherwise be chosen. This prevents accidental downgrades // from newer pre-release or development versions. // -// If the allowed function is non-nil, Query excludes any versions for which -// allowed returns false. +// The allowed function (which may be nil) is used to filter out unsuitable +// versions (see AllowedFunc documentation for details). If the query refers to +// a specific revision (for example, "master"; see IsRevisionQuery), and the +// revision is disallowed by allowed, Query returns the error. If the query +// does not refer to a specific revision (for example, "latest"), Query +// acts as if versions disallowed by allowed do not exist. // // If path is the path of the main module and the query is "latest", // Query returns Target.Version as the version. -func Query(ctx context.Context, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { +func Query(ctx context.Context, path, query, current string, allowed AllowedFunc) (*modfetch.RevInfo, error) { var info *modfetch.RevInfo err := modfetch.TryProxies(func(proxy string) (err error) { info, err = queryProxy(ctx, proxy, path, query, current, allowed) @@ -66,6 +70,17 @@ func Query(ctx context.Context, path, query, current string, allowed func(module return info, err } +// AllowedFunc is used by Query and other functions to filter out unsuitable +// versions, for example, those listed in exclude directives in the main +// module's go.mod file. +// +// An AllowedFunc returns an error equivalent to ErrDisallowed for an unsuitable +// 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. +type AllowedFunc func(context.Context, module.Version) error + var errQueryDisabled error = queryDisabledError{} type queryDisabledError struct{} @@ -77,7 +92,7 @@ func (queryDisabledError) Error() string { return fmt.Sprintf("cannot query module due to -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason) } -func queryProxy(ctx context.Context, proxy, path, query, current string, allowed func(module.Version) bool) (*modfetch.RevInfo, error) { +func queryProxy(ctx context.Context, proxy, path, query, current string, allowed AllowedFunc) (*modfetch.RevInfo, error) { ctx, span := trace.StartSpan(ctx, "modload.queryProxy "+path+" "+query) defer span.Done() @@ -88,7 +103,7 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed return nil, errQueryDisabled } if allowed == nil { - allowed = func(module.Version) bool { return true } + allowed = func(context.Context, module.Version) error { return nil } } // Parse query to detect parse errors (and possibly handle query) @@ -104,7 +119,8 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed return module.CheckPathMajor(v, pathMajor) == nil } var ( - ok func(module.Version) bool + match = func(m module.Version) bool { return true } + prefix string preferOlder bool mayUseLatest bool @@ -112,21 +128,18 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed ) switch { case query == "latest": - ok = allowed mayUseLatest = true case query == "upgrade": - ok = allowed mayUseLatest = true case query == "patch": if current == "" { - ok = allowed mayUseLatest = true } else { prefix = semver.MajorMinor(current) - ok = func(m module.Version) bool { - return matchSemverPrefix(prefix, m.Version) && allowed(m) + match = func(m module.Version) bool { + return matchSemverPrefix(prefix, m.Version) } } @@ -139,8 +152,8 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed // 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) } - ok = func(m module.Version) bool { - return semver.Compare(m.Version, v) <= 0 && allowed(m) + match = func(m module.Version) bool { + return semver.Compare(m.Version, v) <= 0 } if !matchesMajor(v) { preferIncompatible = true @@ -151,8 +164,8 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed if !semver.IsValid(v) { return badVersion(v) } - ok = func(m module.Version) bool { - return semver.Compare(m.Version, v) < 0 && allowed(m) + match = func(m module.Version) bool { + return semver.Compare(m.Version, v) < 0 } if !matchesMajor(v) { preferIncompatible = true @@ -163,8 +176,8 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed if !semver.IsValid(v) { return badVersion(v) } - ok = func(m module.Version) bool { - return semver.Compare(m.Version, v) >= 0 && allowed(m) + match = func(m module.Version) bool { + return semver.Compare(m.Version, v) >= 0 } preferOlder = true if !matchesMajor(v) { @@ -180,8 +193,8 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed // 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) } - ok = func(m module.Version) bool { - return semver.Compare(m.Version, v) > 0 && allowed(m) + match = func(m module.Version) bool { + return semver.Compare(m.Version, v) > 0 } preferOlder = true if !matchesMajor(v) { @@ -189,8 +202,8 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed } case semver.IsValid(query) && isSemverPrefix(query): - ok = func(m module.Version) bool { - return matchSemverPrefix(query, m.Version) && allowed(m) + match = func(m module.Version) bool { + return matchSemverPrefix(query, m.Version) } prefix = query + "." if !matchesMajor(query) { @@ -219,8 +232,8 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed return nil, queryErr } } - if !allowed(module.Version{Path: path, Version: info.Version}) { - return nil, fmt.Errorf("%s@%s excluded", path, info.Version) + if err := allowed(ctx, module.Version{Path: path, Version: info.Version}); errors.Is(err, ErrDisallowed) { + return nil, err } return info, nil } @@ -229,8 +242,8 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed if query != "latest" { return nil, fmt.Errorf("can't query specific version (%q) for the main module (%s)", query, path) } - if !allowed(Target) { - return nil, fmt.Errorf("internal error: main module version is not allowed") + if err := allowed(ctx, Target); err != nil { + return nil, fmt.Errorf("internal error: main module version is not allowed: %w", err) } return &modfetch.RevInfo{Version: Target.Version}, nil } @@ -248,7 +261,13 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed if err != nil { return nil, err } - releases, prereleases, err := filterVersions(ctx, path, versions, ok, preferIncompatible) + matchAndAllowed := func(ctx context.Context, m module.Version) error { + if !match(m) { + return ErrDisallowed + } + return allowed(ctx, m) + } + releases, prereleases, err := filterVersions(ctx, path, versions, matchAndAllowed, preferIncompatible) if err != nil { return nil, err } @@ -288,11 +307,12 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed } if mayUseLatest { - // Special case for "latest": if no tags match, use latest commit in repo, - // provided it is not excluded. + // Special case for "latest": if no tags match, use latest commit in repo + // if it is allowed. latest, err := repo.Latest() if err == nil { - if allowed(module.Version{Path: path, Version: latest.Version}) { + m := module.Version{Path: path, Version: latest.Version} + if err := allowed(ctx, m); !errors.Is(err, ErrDisallowed) { return lookup(latest.Version) } } else if !errors.Is(err, os.ErrNotExist) { @@ -303,6 +323,22 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed return nil, &NoMatchingVersionError{query: query, current: current} } +// IsRevisionQuery returns true if vers is a version query that may refer to +// 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 { + if vers == "latest" || + vers == "upgrade" || + vers == "patch" || + strings.HasPrefix(vers, "<") || + strings.HasPrefix(vers, ">") || + (semver.IsValid(vers) && isSemverPrefix(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 { @@ -329,13 +365,16 @@ func matchSemverPrefix(p, v string) bool { // filterVersions classifies versions into releases and pre-releases, filtering // out: -// 1. versions that do not satisfy the 'ok' predicate, and +// 1. versions that do not satisfy the 'allowed' predicate, and // 2. "+incompatible" versions, if a compatible one satisfies the predicate // and the incompatible version is not preferred. -func filterVersions(ctx context.Context, path string, versions []string, ok func(module.Version) bool, preferIncompatible bool) (releases, prereleases []string, err error) { +// +// If the allowed predicate returns an error not equivalent to ErrDisallowed, +// filterVersions returns that error. +func filterVersions(ctx context.Context, path string, versions []string, allowed AllowedFunc, preferIncompatible bool) (releases, prereleases []string, err error) { var lastCompatible string for _, v := range versions { - if !ok(module.Version{Path: path, Version: v}) { + if err := allowed(ctx, module.Version{Path: path, Version: v}); errors.Is(err, ErrDisallowed) { continue } @@ -385,7 +424,7 @@ type QueryResult struct { // If the package is in the main module, QueryPackage considers only the main // module and only the version "latest", without checking for other possible // modules. -func QueryPackage(ctx context.Context, path, query string, allowed func(module.Version) bool) ([]QueryResult, error) { +func QueryPackage(ctx context.Context, path, query string, allowed AllowedFunc) ([]QueryResult, error) { m := search.NewMatch(path) if m.IsLocal() || !m.IsLiteral() { return nil, fmt.Errorf("pattern %s is not an importable package", path) @@ -406,7 +445,7 @@ func QueryPackage(ctx context.Context, path, query string, allowed func(module.V // If any matching package is in the main module, QueryPattern considers only // the main module and only the version "latest", without checking for other // possible modules. -func QueryPattern(ctx context.Context, pattern, query string, allowed func(module.Version) bool) ([]QueryResult, error) { +func QueryPattern(ctx context.Context, pattern, query string, allowed AllowedFunc) ([]QueryResult, error) { ctx, span := trace.StartSpan(ctx, "modload.QueryPattern "+pattern+" "+query) defer span.Done() @@ -450,8 +489,8 @@ func QueryPattern(ctx context.Context, pattern, query string, allowed func(modul if query != "latest" { return nil, fmt.Errorf("can't query specific version for package %s in the main module (%s)", pattern, Target.Path) } - if !allowed(Target) { - return nil, fmt.Errorf("internal error: package %s is in the main module (%s), but version is not allowed", pattern, Target.Path) + if err := allowed(ctx, Target); err != nil { + return nil, fmt.Errorf("internal error: package %s is in the main module (%s), but version is not allowed: %w", pattern, Target.Path, err) } return []QueryResult{{ Mod: Target, diff --git a/src/cmd/go/internal/modload/query_test.go b/src/cmd/go/internal/modload/query_test.go index 77080e9b5b..351826f2ab 100644 --- a/src/cmd/go/internal/modload/query_test.go +++ b/src/cmd/go/internal/modload/query_test.go @@ -187,9 +187,11 @@ func TestQuery(t *testing.T) { if allow == "" { allow = "*" } - allowed := func(m module.Version) bool { - ok, _ := path.Match(allow, m.Version) - return ok + allowed := func(ctx context.Context, m module.Version) error { + if ok, _ := path.Match(allow, m.Version); !ok { + return ErrDisallowed + } + return nil } tt := tt t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.query+"/"+tt.current+"/"+allow, func(t *testing.T) { diff --git a/src/cmd/go/testdata/script/mod_query_exclude.txt b/src/cmd/go/testdata/script/mod_query_exclude.txt index a64a8e1086..742c6f17e3 100644 --- a/src/cmd/go/testdata/script/mod_query_exclude.txt +++ b/src/cmd/go/testdata/script/mod_query_exclude.txt @@ -1,23 +1,43 @@ env GO111MODULE=on +# list excluded version +go list -modfile=go.exclude.mod -m rsc.io/quote@v1.5.0 +stdout '^rsc.io/quote v1.5.0$' + +# list versions should not print excluded versions +go list -m -versions rsc.io/quote +stdout '\bv1.5.0\b' +go list -modfile=go.exclude.mod -m -versions rsc.io/quote +! stdout '\bv1.5.0\b' + +# list query with excluded version +go list -m rsc.io/quote@>=v1.5 +stdout '^rsc.io/quote v1.5.0$' +go list -modfile=go.exclude.mod -m rsc.io/quote@>=v1.5 +stdout '^rsc.io/quote v1.5.1$' + # get excluded version -cp go.mod1 go.mod -! go get rsc.io/quote@v1.5.0 -stderr 'rsc.io/quote@v1.5.0 excluded' +cp go.exclude.mod go.exclude.mod.orig +! go get -modfile=go.exclude.mod -d rsc.io/quote@v1.5.0 +stderr '^go get rsc.io/quote@v1.5.0: rsc.io/quote@v1.5.0: excluded by go.mod$' # get non-excluded version -cp go.mod1 go.mod -go get rsc.io/quote@v1.5.1 +cp go.exclude.mod.orig go.exclude.mod +go get -modfile=go.exclude.mod -d rsc.io/quote@v1.5.1 stderr 'rsc.io/quote v1.5.1' -# get range with excluded version -cp go.mod1 go.mod -go get rsc.io/quote@>=v1.5 -go list -m ...quote +# get query with excluded version +cp go.exclude.mod.orig go.exclude.mod +go get -modfile=go.exclude.mod -d rsc.io/quote@>=v1.5 +go list -modfile=go.exclude.mod -m ...quote stdout 'rsc.io/quote v1.5.[1-9]' --- go.mod1 -- +-- go.mod -- module x + +-- go.exclude.mod -- +module x + exclude rsc.io/quote v1.5.0 -- x.go -- -- GitLab From c769f034d796769ad10fc03fe6866b36039d1a09 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 15 Apr 2020 13:56:09 -0400 Subject: [PATCH 0343/1792] cmd/go/internal/modload: support go.mod retract directive The go command now recognizes 'retract' directives in go.mod. A retract directive may be used by a module author to indicate a version should not be used. The go command will not automatically upgrade to a retracted version. Retracted versions will not be considered when resolving version queries like "latest" that don't refer to a specific version. Internally, when the go command resolves a version query, it will find the highest release version (or pre-release if no release is available), then it will load retractions from the go.mod file for that version. Comments on retractions are treated as a rationale and may appear in error messages. Retractions are only loaded when a query is resolved, so this should have no impact on performance for most builds, except when go.mod is incomplete. For #24031 Change-Id: I17d643b9e03a3445676dbf1a5a351090c6ff6914 Reviewed-on: https://go-review.googlesource.com/c/go/+/228380 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 8 +- src/cmd/go/internal/modinfo/info.go | 17 +- src/cmd/go/internal/modload/help.go | 8 +- src/cmd/go/internal/modload/list.go | 3 +- src/cmd/go/internal/modload/modfile.go | 146 +++++++++++++++++- ...ample.com_retract_self_prev_v1.0.0-bad.txt | 14 ++ .../example.com_retract_self_prev_v1.1.0.txt | 14 ++ .../example.com_retract_self_prev_v1.9.0.txt | 18 +++ .../mod/example.com_retract_v1.0.0-bad.txt | 10 ++ .../mod/example.com_retract_v1.0.0-good.txt | 10 ++ .../mod/example.com_retract_v1.0.0-unused.txt | 10 ++ .../mod/example.com_retract_v1.1.0.txt | 13 ++ src/cmd/go/testdata/script/mod_download.txt | 64 ++++---- src/cmd/go/testdata/script/mod_retract.txt | 40 +++++ .../go/testdata/script/mod_sumdb_golang.txt | 12 +- 15 files changed, 340 insertions(+), 47 deletions(-) create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.0.0-bad.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.1.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.9.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_v1.0.0-bad.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_v1.0.0-good.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_v1.0.0-unused.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_v1.1.0.txt create mode 100644 src/cmd/go/testdata/script/mod_retract.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 68bad3cff1..f50529c4f2 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1894,15 +1894,17 @@ // require new/thing/v2 v2.3.4 // exclude old/thing v1.2.3 // replace bad/thing v1.4.5 => good/thing v1.4.5 +// retract v1.5.6 // // The verbs are // module, to define the module path; // go, to set the expected language version; // require, to require a particular module at a given version or later; -// exclude, to exclude a particular module version from use; and -// replace, to replace a module version with a different module version. +// exclude, to exclude a particular module version from use; +// replace, to replace a module version with a different module version; and +// retract, to indicate a previously released version should not be used. // Exclude and replace apply only in the main module's go.mod and are ignored -// in dependencies. See https://research.swtch.com/vgo-mvs for details. +// in dependencies. See https://golang.org/ref/mod for details. // // The leading verb can be factored out of adjacent lines to create a block, // like in Go imports: diff --git a/src/cmd/go/internal/modinfo/info.go b/src/cmd/go/internal/modinfo/info.go index 07248d1a61..897be56397 100644 --- a/src/cmd/go/internal/modinfo/info.go +++ b/src/cmd/go/internal/modinfo/info.go @@ -21,6 +21,7 @@ type ModulePublic struct { Dir string `json:",omitempty"` // directory holding local copy of files, if any GoMod string `json:",omitempty"` // path to go.mod file describing module, if any GoVersion string `json:",omitempty"` // go version used in module + Retracted []string `json:",omitempty"` // retraction information, if any (with -retracted or -u) Error *ModuleError `json:",omitempty"` // error loading module } @@ -30,18 +31,26 @@ type ModuleError struct { func (m *ModulePublic) String() string { s := m.Path + versionString := func(mm *ModulePublic) string { + v := mm.Version + if len(mm.Retracted) == 0 { + return v + } + return v + " (retracted)" + } + if m.Version != "" { - s += " " + m.Version + s += " " + versionString(m) if m.Update != nil { - s += " [" + m.Update.Version + "]" + s += " [" + versionString(m.Update) + "]" } } if m.Replace != nil { s += " => " + m.Replace.Path if m.Replace.Version != "" { - s += " " + m.Replace.Version + s += " " + versionString(m.Replace) if m.Replace.Update != nil { - s += " [" + m.Replace.Update.Version + "]" + s += " [" + versionString(m.Replace.Update) + "]" } } } diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go index d80206b194..37f23d967f 100644 --- a/src/cmd/go/internal/modload/help.go +++ b/src/cmd/go/internal/modload/help.go @@ -432,15 +432,17 @@ verb followed by arguments. For example: require new/thing/v2 v2.3.4 exclude old/thing v1.2.3 replace bad/thing v1.4.5 => good/thing v1.4.5 + retract v1.5.6 The verbs are module, to define the module path; go, to set the expected language version; require, to require a particular module at a given version or later; - exclude, to exclude a particular module version from use; and - replace, to replace a module version with a different module version. + exclude, to exclude a particular module version from use; + replace, to replace a module version with a different module version; and + retract, to indicate a previously released version should not be used. Exclude and replace apply only in the main module's go.mod and are ignored -in dependencies. See https://research.swtch.com/vgo-mvs for details. +in dependencies. See https://golang.org/ref/mod for details. The leading verb can be factored out of adjacent lines to create a block, like in Go imports: diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 2f549540a6..a3461eea26 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -85,7 +85,8 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin allowed := CheckAllowed if IsRevisionQuery(vers) { - // Allow excluded versions if the user asked for a specific revision. + // Allow excluded and retracted versions if the user asked for a + // specific revision. allowed = nil } info, err := Query(ctx, path, vers, current, allowed) diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index aed1f0a36b..0b135c5fb5 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -9,13 +9,16 @@ import ( "errors" "fmt" "path/filepath" + "strings" "sync" + "unicode" "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/lockedfile" "cmd/go/internal/modfetch" "cmd/go/internal/par" + "cmd/go/internal/trace" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -44,10 +47,16 @@ type requireMeta struct { } // CheckAllowed returns an error equivalent to ErrDisallowed if m is excluded by -// the main module's go.mod. Most version queries use this to filter out -// versions that should not be used. +// the main module's go.mod or retracted by its author. Most version queries use +// this to filter out versions that should not be used. func CheckAllowed(ctx context.Context, m module.Version) error { - return CheckExclusions(ctx, m) + if err := CheckExclusions(ctx, m); err != nil { + return err + } + if err := checkRetractions(ctx, m); err != nil { + return err + } + return nil } // ErrDisallowed is returned by version predicates passed to Query and similar @@ -70,6 +79,120 @@ type excludedError struct{} func (e *excludedError) Error() string { return "excluded by go.mod" } func (e *excludedError) Is(err error) bool { return err == ErrDisallowed } +// checkRetractions returns an error if module m has been retracted by +// its author. +func checkRetractions(ctx context.Context, m module.Version) error { + if m.Version == "" { + // Main module, standard library, or file replacement module. + // Cannot be retracted. + return nil + } + + // Look up retraction information from the latest available version of + // the module. Cache retraction information so we don't parse the go.mod + // file repeatedly. + type entry struct { + retract []retraction + err error + } + path := m.Path + e := retractCache.Do(path, func() (v interface{}) { + ctx, span := trace.StartSpan(ctx, "checkRetractions "+path) + defer span.Done() + + if repl := Replacement(module.Version{Path: m.Path}); repl.Path != "" { + // All versions of the module were replaced with a local directory. + // Don't load retractions. + return &entry{nil, nil} + } + + // Find the latest version of the module. + // Ignore exclusions from the main module's go.mod. + // We may need to account for the current version: for example, + // v2.0.0+incompatible is not "latest" if v1.0.0 is current. + rev, err := Query(ctx, path, "latest", findCurrentVersion(path), nil) + if err != nil { + return &entry{err: err} + } + + // Load go.mod for that version. + // If the version is replaced, we'll load retractions from the replacement. + // If there's an error loading the go.mod, we'll return it here. + // These errors should generally be ignored by callers of checkRetractions, + // since they happen frequently when we're offline. These errors are not + // equivalent to ErrDisallowed, so they may be distinguished from + // retraction errors. + summary, err := goModSummary(module.Version{Path: path, Version: rev.Version}) + if err != nil { + return &entry{err: err} + } + return &entry{retract: summary.retract} + }).(*entry) + + if e.err != nil { + return fmt.Errorf("loading module retractions: %v", e.err) + } + + var rationale []string + isRetracted := false + for _, r := range e.retract { + if semver.Compare(r.Low, m.Version) <= 0 && semver.Compare(m.Version, r.High) <= 0 { + isRetracted = true + if r.Rationale != "" { + rationale = append(rationale, r.Rationale) + } + } + } + if isRetracted { + return &retractedError{rationale: rationale} + } + return nil +} + +var retractCache par.Cache + +type retractedError struct { + rationale []string +} + +func (e *retractedError) Error() string { + msg := "retracted by module author" + if len(e.rationale) > 0 { + // This is meant to be a short error printed on a terminal, so just + // print the first rationale. + msg += ": " + ShortRetractionRationale(e.rationale[0]) + } + return msg +} + +func (e *retractedError) Is(err error) bool { + return err == ErrDisallowed +} + +// ShortRetractionRationale returns a retraction rationale string that is safe +// to print in a terminal. It returns hard-coded strings if the rationale +// is empty, too long, or contains non-printable characters. +func ShortRetractionRationale(rationale string) string { + const maxRationaleBytes = 500 + if i := strings.Index(rationale, "\n"); i >= 0 { + rationale = rationale[:i] + } + rationale = strings.TrimSpace(rationale) + if rationale == "" { + return "retracted by module author" + } + if len(rationale) > maxRationaleBytes { + return "(rationale omitted: too long)" + } + for _, r := range rationale { + if !unicode.IsGraphic(r) && !unicode.IsSpace(r) { + return "(rationale omitted: contains non-printable characters)" + } + } + // NOTE: the go.mod parser rejects invalid UTF-8, so we don't check that here. + return rationale +} + // Replacement returns the replacement for mod, if any, from go.mod. // If there is no replacement for mod, Replacement returns // a module.Version with Path == "". @@ -210,6 +333,14 @@ type modFileSummary struct { module module.Version goVersionV string // GoVersion with "v" prefix require []module.Version + retract []retraction +} + +// A retraction consists of a retracted version interval and rationale. +// retraction is like modfile.Retract, but it doesn't point to the syntax tree. +type retraction struct { + modfile.VersionInterval + Rationale string } // goModSummary returns a summary of the go.mod file for module m, @@ -363,6 +494,15 @@ func rawGoModSummary(m module.Version) (*modFileSummary, error) { summary.require = append(summary.require, req.Mod) } } + if len(f.Retract) > 0 { + summary.retract = make([]retraction, 0, len(f.Retract)) + for _, ret := range f.Retract { + summary.retract = append(summary.retract, retraction{ + VersionInterval: ret.VersionInterval, + Rationale: ret.Rationale, + }) + } + } return summary, nil } diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.0.0-bad.txt b/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.0.0-bad.txt new file mode 100644 index 0000000000..095063d69b --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.0.0-bad.txt @@ -0,0 +1,14 @@ +See example.com_retract_self_prev_v1.9.0.txt. + +This version is retracted. + +-- .mod -- +module example.com/retract/self/prev + +go 1.15 + +-- .info -- +{"Version":"v1.0.0-bad"} + +-- p.go -- +package p diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.1.0.txt b/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.1.0.txt new file mode 100644 index 0000000000..27c3a39065 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.1.0.txt @@ -0,0 +1,14 @@ +See example.com_retract_self_pref_v1.9.0.txt. + +This version is the latest (only) non-retracted version. + +-- .mod -- +module example.com/retract/self/prev + +go 1.15 + +-- .info -- +{"Version":"v1.1.0"} + +-- p.go -- +package p diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.9.0.txt b/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.9.0.txt new file mode 100644 index 0000000000..03d6168f0d --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_prev_v1.9.0.txt @@ -0,0 +1,18 @@ +Module example.com/retract/self/prev is a module that retracts its own +latest version, as well as an earlier version. + +A previous unretracted release version, v1.1.0, is still available. + +-- .mod -- +module example.com/retract/self/prev + +go 1.15 + +retract v1.0.0-bad // bad +retract v1.9.0 // self + +-- .info -- +{"Version":"v1.9.0"} + +-- p.go -- +package p diff --git a/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-bad.txt b/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-bad.txt new file mode 100644 index 0000000000..2f996cfc36 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-bad.txt @@ -0,0 +1,10 @@ +-- .mod -- +module example.com/retract + +go 1.15 + +-- .info -- +{"Version":"v1.0.0-bad"} + +-- retract.go -- +package retract diff --git a/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-good.txt b/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-good.txt new file mode 100644 index 0000000000..78152bba4f --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-good.txt @@ -0,0 +1,10 @@ +-- .mod -- +module example.com/retract + +go 1.15 + +-- .info -- +{"Version":"v1.0.0-good"} + +-- retract.go -- +package retract diff --git a/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-unused.txt b/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-unused.txt new file mode 100644 index 0000000000..3bc9e35b7c --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_v1.0.0-unused.txt @@ -0,0 +1,10 @@ +-- .mod -- +module example.com/retract + +go 1.15 + +-- .info -- +{"Version":"v1.0.0-unused"} + +-- retract.go -- +package retract diff --git a/src/cmd/go/testdata/mod/example.com_retract_v1.1.0.txt b/src/cmd/go/testdata/mod/example.com_retract_v1.1.0.txt new file mode 100644 index 0000000000..18d6d832e2 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_v1.1.0.txt @@ -0,0 +1,13 @@ +-- .mod -- +module example.com/retract + +go 1.15 + +retract v1.0.0-bad // bad +retract v1.0.0-unused // bad + +-- .info -- +{"Version":"v1.1.0"} + +-- retract.go -- +package retract diff --git a/src/cmd/go/testdata/script/mod_download.txt b/src/cmd/go/testdata/script/mod_download.txt index bb5c4627db..5acb83266b 100644 --- a/src/cmd/go/testdata/script/mod_download.txt +++ b/src/cmd/go/testdata/script/mod_download.txt @@ -1,13 +1,15 @@ env GO111MODULE=on -# download with version should print nothing +# download with version should print nothing. +# It should not load retractions from the .mod file from the latest version. go mod download rsc.io/quote@v1.5.0 ! stdout . ! stderr . - exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.info exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.mod exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.0.zip +! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.info +! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod # download of an invalid path should report the error [short] skip @@ -31,53 +33,59 @@ stdout '^\t"GoModSum": "h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe\+TKr0="' go list -m all ! stdout rsc.io -# add to go.mod so we can test non-query downloads -go mod edit -require rsc.io/quote@v1.5.2 -! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.info -! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod +# download query should have downloaded go.mod for the highest release version +# in order to find retractions when resolving the query '@<=v1.5.0'. +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.info +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip +# add to go.mod so we can test non-query downloads +go mod edit -require rsc.io/quote@v1.5.3-pre1 +! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.info +! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.mod +! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip + # module loading will page in the info and mod files go list -m all -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.info -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod -! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.info +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.mod +! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip # download will fetch and unpack the zip file go mod download -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.info -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip -exists $GOPATH/pkg/mod/rsc.io/quote@v1.5.2 +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.info +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.mod +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip +exists $GOPATH/pkg/mod/rsc.io/quote@v1.5.3-pre1 # download repopulates deleted files and directories independently. -rm $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.info +rm $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.info go mod download -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.info -rm $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.info +rm $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.mod go mod download -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod -rm $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.mod +rm $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip go mod download -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip -rm -r $GOPATH/pkg/mod/rsc.io/quote@v1.5.2 +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip +rm -r $GOPATH/pkg/mod/rsc.io/quote@v1.5.3-pre1 go mod download -exists $GOPATH/pkg/mod/rsc.io/quote@v1.5.2 +exists $GOPATH/pkg/mod/rsc.io/quote@v1.5.3-pre1 # download reports the locations of downloaded files go mod download -json stdout '^\t"Path": "rsc.io/quote"' -stdout '^\t"Version": "v1.5.2"' -stdout '^\t"Info": ".*(\\\\|/)pkg(\\\\|/)mod(\\\\|/)cache(\\\\|/)download(\\\\|/)rsc.io(\\\\|/)quote(\\\\|/)@v(\\\\|/)v1.5.2.info"' -stdout '^\t"GoMod": ".*(\\\\|/)pkg(\\\\|/)mod(\\\\|/)cache(\\\\|/)download(\\\\|/)rsc.io(\\\\|/)quote(\\\\|/)@v(\\\\|/)v1.5.2.mod"' -stdout '^\t"Zip": ".*(\\\\|/)pkg(\\\\|/)mod(\\\\|/)cache(\\\\|/)download(\\\\|/)rsc.io(\\\\|/)quote(\\\\|/)@v(\\\\|/)v1.5.2.zip"' -stdout '^\t"Dir": ".*(\\\\|/)pkg(\\\\|/)mod(\\\\|/)rsc.io(\\\\|/)quote@v1.5.2"' +stdout '^\t"Version": "v1.5.3-pre1"' +stdout '^\t"Info": ".*(\\\\|/)pkg(\\\\|/)mod(\\\\|/)cache(\\\\|/)download(\\\\|/)rsc.io(\\\\|/)quote(\\\\|/)@v(\\\\|/)v1.5.3-pre1.info"' +stdout '^\t"GoMod": ".*(\\\\|/)pkg(\\\\|/)mod(\\\\|/)cache(\\\\|/)download(\\\\|/)rsc.io(\\\\|/)quote(\\\\|/)@v(\\\\|/)v1.5.3-pre1.mod"' +stdout '^\t"Zip": ".*(\\\\|/)pkg(\\\\|/)mod(\\\\|/)cache(\\\\|/)download(\\\\|/)rsc.io(\\\\|/)quote(\\\\|/)@v(\\\\|/)v1.5.3-pre1.zip"' +stdout '^\t"Dir": ".*(\\\\|/)pkg(\\\\|/)mod(\\\\|/)rsc.io(\\\\|/)quote@v1.5.3-pre1"' # download will follow replacements -go mod edit -require rsc.io/quote@v1.5.1 -replace rsc.io/quote@v1.5.1=rsc.io/quote@v1.5.3-pre1 +go mod edit -require rsc.io/quote@v1.5.1 -replace rsc.io/quote@v1.5.1=rsc.io/quote@v1.5.2 go mod download ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.1.zip -exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip # download will not follow replacements for explicit module queries go mod download -json rsc.io/quote@v1.5.1 diff --git a/src/cmd/go/testdata/script/mod_retract.txt b/src/cmd/go/testdata/script/mod_retract.txt new file mode 100644 index 0000000000..5d21902043 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_retract.txt @@ -0,0 +1,40 @@ +cp go.mod go.mod.orig + +# 'go list pkg' does not report an error when a retracted version is used. +go list -e -f '{{if .Error}}{{.Error}}{{end}}' ./use +! stdout . +cmp go.mod go.mod.orig + +# Nor does 'go build'. +[!short] go build ./use +[!short] ! stderr . +[!short] cmp go.mod go.mod.orig + +# Neither 'go list' nor 'go build' should download go.mod from the version +# that would list retractions. +exists $GOPATH/pkg/mod/cache/download/example.com/retract/@v/v1.0.0-bad.mod +! exists $GOPATH/pkg/mod/cache/download/example.com/retract/@v/v1.1.0.mod + +# Importing a package from a module with a retracted latest version will +# select the latest non-retracted version. +go list ./use_self_prev +go list -m example.com/retract/self/prev +stdout '^example.com/retract/self/prev v1.1.0$' +exists $GOPATH/pkg/mod/cache/download/example.com/retract/self/prev/@v/v1.9.0.mod + +-- go.mod -- +module example.com/use + +go 1.15 + +require example.com/retract v1.0.0-bad + +-- use/use.go -- +package use + +import _ "example.com/retract" + +-- use_self_prev/use.go -- +package use_self_prev + +import _ "example.com/retract/self/prev" diff --git a/src/cmd/go/testdata/script/mod_sumdb_golang.txt b/src/cmd/go/testdata/script/mod_sumdb_golang.txt index 40a07fc7e9..d9fb63acb0 100644 --- a/src/cmd/go/testdata/script/mod_sumdb_golang.txt +++ b/src/cmd/go/testdata/script/mod_sumdb_golang.txt @@ -9,7 +9,7 @@ env GOPROXY=https://proxy.golang.org go env GOSUMDB stdout '^sum.golang.org$' -# download direct from github +# Download direct from github. [!net] skip [!exec:git] skip env GOSUMDB=sum.golang.org @@ -17,11 +17,13 @@ env GOPROXY=direct go get -d rsc.io/quote@v1.5.2 cp go.sum saved.sum -# download from proxy.golang.org with go.sum entry already +# Download from proxy.golang.org with go.sum entry already. +# Use 'go list' instead of 'go get' since the latter may download extra go.mod +# files not listed in go.sum. go clean -modcache env GOSUMDB= env GOPROXY= -go get -x -d rsc.io/quote@v1.5.2 +go list -x -deps rsc.io/quote ! stderr github stderr proxy.golang.org/rsc.io/quote ! stderr sum.golang.org/tile @@ -32,7 +34,7 @@ cmp go.sum saved.sum # Should use the checksum database to validate new go.sum lines, # but not need to fetch any new data from the proxy. rm go.sum -go get -x -d rsc.io/quote@v1.5.2 +go list -x rsc.io/quote ! stderr github ! stderr proxy.golang.org/rsc.io/quote stderr sum.golang.org/tile @@ -43,7 +45,7 @@ cmp go.sum saved.sum env TESTGOPROXY404=1 go clean -modcache rm go.sum -go get -x -d rsc.io/quote@v1.5.2 +go list -x rsc.io/quote stderr 'proxy.golang.org.*404 testing' stderr github.com/rsc cmp go.sum saved.sum -- GitLab From 0bbd386e8bbdf419077d708d3671245fc0f50f0c Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 15 Apr 2020 14:17:08 -0400 Subject: [PATCH 0344/1792] cmd/go: add -retract and -dropretract flags to 'go mod edit' 'go mod edit' can now add and remove 'retract' directives from go.mod files. Also, retractions are now included in the 'go mod edit -json' output. For #24031 Change-Id: Ife7915e259fa508626d6ec5f786b5c860b489599 Reviewed-on: https://go-review.googlesource.com/c/go/+/228381 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 18 +++- src/cmd/go/internal/modcmd/edit.go | 101 +++++++++++++++++++-- src/cmd/go/testdata/script/mod_edit.txt | 114 +++++++++++++++++++++--- 3 files changed, 208 insertions(+), 25 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index f50529c4f2..609ede49cd 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1100,9 +1100,14 @@ // module path and version pair. If the @v is omitted, a replacement without // a version on the left side is dropped. // +// The -retract=version and -dropretract=version flags add and drop a +// retraction on the given version. The version may be a single version +// like "v1.2.3" or a closed interval like "[v1.1.0-v1.1.9]". Note that +// -retract=version is a no-op if that retraction already exists. +// // The -require, -droprequire, -exclude, -dropexclude, -replace, -// and -dropreplace editing flags may be repeated, and the changes -// are applied in the order given. +// -dropreplace, -retract, and -dropretract editing flags may be repeated, +// and the changes are applied in the order given. // // The -go=version flag sets the expected Go language version. // @@ -1136,6 +1141,15 @@ // New Module // } // +// type Retract struct { +// Low string +// High string +// Rationale string +// } +// +// Retract entries representing a single version (not an interval) will have +// the "Low" and "High" fields set to the same value. +// // Note that this only describes the go.mod file itself, not other modules // referred to indirectly. For the full set of modules available to a build, // use 'go list -m -json all'. diff --git a/src/cmd/go/internal/modcmd/edit.go b/src/cmd/go/internal/modcmd/edit.go index a81c25270f..18bdd34cd0 100644 --- a/src/cmd/go/internal/modcmd/edit.go +++ b/src/cmd/go/internal/modcmd/edit.go @@ -68,9 +68,14 @@ The -dropreplace=old[@v] flag drops a replacement of the given module path and version pair. If the @v is omitted, a replacement without a version on the left side is dropped. +The -retract=version and -dropretract=version flags add and drop a +retraction on the given version. The version may be a single version +like "v1.2.3" or a closed interval like "[v1.1.0-v1.1.9]". Note that +-retract=version is a no-op if that retraction already exists. + The -require, -droprequire, -exclude, -dropexclude, -replace, -and -dropreplace editing flags may be repeated, and the changes -are applied in the order given. +-dropreplace, -retract, and -dropretract editing flags may be repeated, +and the changes are applied in the order given. The -go=version flag sets the expected Go language version. @@ -104,6 +109,15 @@ writing it back to go.mod. The JSON output corresponds to these Go types: New Module } + type Retract struct { + Low string + High string + Rationale string + } + +Retract entries representing a single version (not an interval) will have +the "Low" and "High" fields set to the same value. + Note that this only describes the go.mod file itself, not other modules referred to indirectly. For the full set of modules available to a build, use 'go list -m -json all'. @@ -137,6 +151,8 @@ func init() { cmdEdit.Flag.Var(flagFunc(flagDropReplace), "dropreplace", "") cmdEdit.Flag.Var(flagFunc(flagReplace), "replace", "") cmdEdit.Flag.Var(flagFunc(flagDropExclude), "dropexclude", "") + cmdEdit.Flag.Var(flagFunc(flagRetract), "retract", "") + cmdEdit.Flag.Var(flagFunc(flagDropRetract), "dropretract", "") work.AddModCommonFlags(cmdEdit) base.AddBuildFlagsNX(&cmdEdit.Flag) @@ -252,12 +268,7 @@ func parsePathVersion(flag, arg string) (path, version string) { base.Fatalf("go mod: -%s=%s: invalid path: %v", flag, arg, err) } - // We don't call modfile.CheckPathVersion, because that insists - // on versions being in semver form, but here we want to allow - // versions like "master" or "1234abcdef", which the go command will resolve - // the next time it runs (or during -fix). - // Even so, we need to make sure the version is a valid token. - if modfile.MustQuote(version) { + if !allowedVersionArg(version) { base.Fatalf("go mod: -%s=%s: invalid version %q", flag, arg, version) } @@ -289,12 +300,48 @@ func parsePathVersionOptional(adj, arg string, allowDirPath bool) (path, version return path, version, fmt.Errorf("invalid %s path: %v", adj, err) } } - if path != arg && modfile.MustQuote(version) { + if path != arg && !allowedVersionArg(version) { return path, version, fmt.Errorf("invalid %s version: %q", adj, version) } return path, version, nil } +// parseVersionInterval parses a single version like "v1.2.3" or a closed +// interval like "[v1.2.3,v1.4.5]". Note that a single version has the same +// representation as an interval with equal upper and lower bounds: both +// Low and High are set. +func parseVersionInterval(arg string) (modfile.VersionInterval, error) { + if !strings.HasPrefix(arg, "[") { + if !allowedVersionArg(arg) { + return modfile.VersionInterval{}, fmt.Errorf("invalid version: %q", arg) + } + return modfile.VersionInterval{Low: arg, High: arg}, nil + } + if !strings.HasSuffix(arg, "]") { + return modfile.VersionInterval{}, fmt.Errorf("invalid version interval: %q", arg) + } + s := arg[1 : len(arg)-1] + i := strings.Index(s, ",") + if i < 0 { + return modfile.VersionInterval{}, fmt.Errorf("invalid version interval: %q", arg) + } + low := strings.TrimSpace(s[:i]) + high := strings.TrimSpace(s[i+1:]) + if !allowedVersionArg(low) || !allowedVersionArg(high) { + return modfile.VersionInterval{}, fmt.Errorf("invalid version interval: %q", arg) + } + return modfile.VersionInterval{Low: low, High: high}, nil +} + +// allowedVersionArg returns whether a token may be used as a version in go.mod. +// We don't call modfile.CheckPathVersion, because that insists on versions +// being in semver form, but here we want to allow versions like "master" or +// "1234abcdef", which the go command will resolve the next time it runs (or +// during -fix). Even so, we need to make sure the version is a valid token. +func allowedVersionArg(arg string) bool { + return !modfile.MustQuote(arg) +} + // flagRequire implements the -require flag. func flagRequire(arg string) { path, version := parsePathVersion("require", arg) @@ -377,6 +424,32 @@ func flagDropReplace(arg string) { }) } +// flagRetract implements the -retract flag. +func flagRetract(arg string) { + vi, err := parseVersionInterval(arg) + if err != nil { + base.Fatalf("go mod: -retract=%s: %v", arg, err) + } + edits = append(edits, func(f *modfile.File) { + if err := f.AddRetract(vi, ""); err != nil { + base.Fatalf("go mod: -retract=%s: %v", arg, err) + } + }) +} + +// flagDropRetract implements the -dropretract flag. +func flagDropRetract(arg string) { + vi, err := parseVersionInterval(arg) + if err != nil { + base.Fatalf("go mod: -dropretract=%s: %v", arg, err) + } + edits = append(edits, func(f *modfile.File) { + if err := f.DropRetract(vi); err != nil { + base.Fatalf("go mod: -dropretract=%s: %v", arg, err) + } + }) +} + // fileJSON is the -json output data structure. type fileJSON struct { Module module.Version @@ -384,6 +457,7 @@ type fileJSON struct { Require []requireJSON Exclude []module.Version Replace []replaceJSON + Retract []retractJSON } type requireJSON struct { @@ -397,6 +471,12 @@ type replaceJSON struct { New module.Version } +type retractJSON struct { + Low string `json:",omitempty"` + High string `json:",omitempty"` + Rationale string `json:",omitempty"` +} + // editPrintJSON prints the -json output. func editPrintJSON(modFile *modfile.File) { var f fileJSON @@ -415,6 +495,9 @@ func editPrintJSON(modFile *modfile.File) { for _, r := range modFile.Replace { f.Replace = append(f.Replace, replaceJSON{r.Old, r.New}) } + for _, r := range modFile.Retract { + f.Retract = append(f.Retract, retractJSON{r.Low, r.High, r.Rationale}) + } data, err := json.MarshalIndent(&f, "", "\t") if err != nil { base.Fatalf("go: internal error: %v", err) diff --git a/src/cmd/go/testdata/script/mod_edit.txt b/src/cmd/go/testdata/script/mod_edit.txt index 898d8524ac..78485eb86a 100644 --- a/src/cmd/go/testdata/script/mod_edit.txt +++ b/src/cmd/go/testdata/script/mod_edit.txt @@ -16,15 +16,19 @@ cmpenv go.mod $WORK/go.mod.init cmpenv go.mod $WORK/go.mod.init # go mod edits -go mod edit -droprequire=x.1 -require=x.1@v1.0.0 -require=x.2@v1.1.0 -droprequire=x.2 -exclude='x.1 @ v1.2.0' -exclude=x.1@v1.2.1 -replace=x.1@v1.3.0=y.1@v1.4.0 -replace='x.1@v1.4.0 = ../z' +go mod edit -droprequire=x.1 -require=x.1@v1.0.0 -require=x.2@v1.1.0 -droprequire=x.2 -exclude='x.1 @ v1.2.0' -exclude=x.1@v1.2.1 -replace=x.1@v1.3.0=y.1@v1.4.0 -replace='x.1@v1.4.0 = ../z' -retract=v1.6.0 -retract=[v1.1.0,v1.2.0] -retract=[v1.3.0,v1.4.0] -retract=v1.0.0 cmpenv go.mod $WORK/go.mod.edit1 -go mod edit -droprequire=x.1 -dropexclude=x.1@v1.2.1 -dropreplace=x.1@v1.3.0 -require=x.3@v1.99.0 +go mod edit -droprequire=x.1 -dropexclude=x.1@v1.2.1 -dropreplace=x.1@v1.3.0 -require=x.3@v1.99.0 -dropretract=v1.0.0 -dropretract=[v1.1.0,v1.2.0] cmpenv go.mod $WORK/go.mod.edit2 # go mod edit -json go mod edit -json cmpenv stdout $WORK/go.mod.json +# go mod edit -json (retractions with rationales) +go mod edit -json $WORK/go.mod.retractrationale +cmp stdout $WORK/go.mod.retractrationale.json + # go mod edit -json (empty mod file) go mod edit -json $WORK/go.mod.empty cmp stdout $WORK/go.mod.empty.json @@ -40,11 +44,11 @@ cmpenv go.mod $WORK/go.mod.edit5 # go mod edit -fmt cp $WORK/go.mod.badfmt go.mod go mod edit -fmt -print # -print should avoid writing file -cmpenv stdout $WORK/go.mod.edit6 +cmpenv stdout $WORK/go.mod.goodfmt cmp go.mod $WORK/go.mod.badfmt go mod edit -fmt # without -print, should write file (and nothing to stdout) ! stdout . -cmpenv go.mod $WORK/go.mod.edit6 +cmpenv go.mod $WORK/go.mod.goodfmt # go mod edit -module cd $WORK/m @@ -84,6 +88,13 @@ replace ( x.1 v1.3.0 => y.1 v1.4.0 x.1 v1.4.0 => ../z ) + +retract ( + v1.6.0 + [v1.3.0, v1.4.0] + [v1.1.0, v1.2.0] + v1.0.0 +) -- $WORK/go.mod.edit2 -- module x.x/y/z @@ -93,6 +104,11 @@ exclude x.1 v1.2.0 replace x.1 v1.4.0 => ../z +retract ( + v1.6.0 + [v1.3.0, v1.4.0] +) + require x.3 v1.99.0 -- $WORK/go.mod.json -- { @@ -122,6 +138,16 @@ require x.3 v1.99.0 "Path": "../z" } } + ], + "Retract": [ + { + "Low": "v1.6.0", + "High": "v1.6.0" + }, + { + "Low": "v1.3.0", + "High": "v1.4.0" + } ] } -- $WORK/go.mod.edit3 -- @@ -136,6 +162,11 @@ replace ( x.1 v1.4.0 => y.1/v2 v2.3.5 ) +retract ( + v1.6.0 + [v1.3.0, v1.4.0] +) + require x.3 v1.99.0 -- $WORK/go.mod.edit4 -- module x.x/y/z @@ -146,6 +177,11 @@ exclude x.1 v1.2.0 replace x.1 => y.1/v2 v2.3.6 +retract ( + v1.6.0 + [v1.3.0, v1.4.0] +) + require x.3 v1.99.0 -- $WORK/go.mod.edit5 -- module x.x/y/z @@ -154,15 +190,10 @@ go $goversion exclude x.1 v1.2.0 -require x.3 v1.99.0 --- $WORK/go.mod.edit6 -- -module x.x/y/z - -go 1.10 - -exclude x.1 v1.2.0 - -replace x.1 => y.1/v2 v2.3.6 +retract ( + v1.6.0 + [v1.3.0, v1.4.0] +) require x.3 v1.99.0 -- $WORK/local/go.mod.edit -- @@ -183,10 +214,64 @@ exclude x.1 v1.2.0 replace x.1 => y.1/v2 v2.3.6 require x.3 v1.99.0 + +retract [ "v1.8.1" , "v1.8.2" ] +-- $WORK/go.mod.goodfmt -- +module x.x/y/z + +go 1.10 + +exclude x.1 v1.2.0 + +replace x.1 => y.1/v2 v2.3.6 + +require x.3 v1.99.0 + +retract [v1.8.1, v1.8.2] -- $WORK/m/go.mod.edit -- module x.x/y/z go $goversion +-- $WORK/go.mod.retractrationale -- +module x.x/y/z + +go 1.15 + +// a +retract v1.0.0 + +// b +retract ( + v1.0.1 + v1.0.2 // c +) +-- $WORK/go.mod.retractrationale.json -- +{ + "Module": { + "Path": "x.x/y/z" + }, + "Go": "1.15", + "Require": null, + "Exclude": null, + "Replace": null, + "Retract": [ + { + "Low": "v1.0.0", + "High": "v1.0.0", + "Rationale": "a" + }, + { + "Low": "v1.0.1", + "High": "v1.0.1", + "Rationale": "b" + }, + { + "Low": "v1.0.2", + "High": "v1.0.2", + "Rationale": "c" + } + ] +} -- $WORK/go.mod.empty -- -- $WORK/go.mod.empty.json -- { @@ -195,5 +280,6 @@ go $goversion }, "Require": null, "Exclude": null, - "Replace": null + "Replace": null, + "Retract": null } -- GitLab From eb3e27ac1a9346c7c2669ba2b863811607eddeae Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 15 Apr 2020 14:42:15 -0400 Subject: [PATCH 0345/1792] cmd/go: add -retracted flag to 'go list' The -retracted flag causes 'go list' to load information about retracted module module versions. When -retracted is used with -f or -json, the Retracted field is set to a string containing the reason for the retraction on retracted module versions. The string is based on comments on the retract directive. This field is also populated when the -u flag is used. When -retracted is used with -versions, retracted versions are shown. Normally, they are omitted. For #24031 Change-Id: Ic13d516eddffb1b8404e21034f78cecc9896d1b8 Reviewed-on: https://go-review.googlesource.com/c/go/+/228382 Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 15 ++- src/cmd/go/internal/list/list.go | 100 +++++++++++++--- src/cmd/go/internal/modcmd/download.go | 5 +- src/cmd/go/internal/modcmd/why.go | 3 +- src/cmd/go/internal/modload/build.go | 50 +++++++- src/cmd/go/internal/modload/list.go | 27 +++-- .../example.com_retract_missingmod_v1.0.0.txt | 8 ++ .../example.com_retract_missingmod_v1.9.0.txt | 4 + .../example.com_retract_self_all_v1.9.0.txt | 14 +++ ...ple.com_retract_self_prerelease_v1.0.0.txt | 16 +++ ...ple.com_retract_self_prerelease_v1.9.0.txt | 19 +++ ...com_retract_self_prerelease_v1.9.1-pre.txt | 16 +++ ..._pseudo_v0.0.0-20200325131415-0123456789ab | 20 ++++ ...ple.com_retract_self_pseudo_v1.0.0-bad.txt | 14 +++ ...example.com_retract_self_pseudo_v1.9.0.txt | 16 +++ .../go/testdata/script/mod_list_pseudo.txt | 21 +--- .../go/testdata/script/mod_list_retract.txt | 108 ++++++++++++++++++ .../testdata/script/mod_retract_replace.txt | 51 +++++++++ 18 files changed, 455 insertions(+), 52 deletions(-) create mode 100644 src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.9.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_all_v1.9.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.9.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.9.1-pre.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v0.0.0-20200325131415-0123456789ab create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v1.0.0-bad.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v1.9.0.txt create mode 100644 src/cmd/go/testdata/script/mod_list_retract.txt create mode 100644 src/cmd/go/testdata/script/mod_retract_replace.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 609ede49cd..98861c8a0d 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -916,6 +916,7 @@ // Dir string // directory holding files for this module, if any // GoMod string // path to go.mod file used when loading this module, if any // GoVersion string // go version used in module +// Retracted string // retraction information, if any (with -retracted or -u) // Error *ModuleError // error loading module // } // @@ -947,14 +948,16 @@ // The -u flag adds information about available upgrades. // When the latest version of a given module is newer than // the current one, list -u sets the Module's Update field -// to information about the newer module. +// to information about the newer module. list -u will also set +// the module's Retracted field if the current version is retracted. // The Module's String method indicates an available upgrade by // formatting the newer version in brackets after the current version. +// If a version is retracted, the string "(retracted)" will follow it. // For example, 'go list -m -u all' might print: // // my/main/module // golang.org/x/text v0.3.0 [v0.4.0] => /tmp/text -// rsc.io/pdf v0.1.1 [v0.1.2] +// rsc.io/pdf v0.1.1 (retracted) [v0.1.2] // // (For tools, 'go list -m -u -json all' may be more convenient to parse.) // @@ -964,6 +967,14 @@ // the default output format to display the module path followed by the // space-separated version list. // +// The -retracted flag causes list to report information about retracted +// module versions. When -retracted is used with -f or -json, the Retracted +// field will be set to a string explaining why the version was retracted. +// The string is taken from comments on the retract directive in the +// module's go.mod file. When -retracted is used with -versions, retracted +// versions are listed together with unretracted versions. The -retracted +// flag may be used with or without -m. +// // The arguments to list -m are interpreted as a list of modules, not packages. // The main module is the module containing the current directory. // The active modules are the main module and its dependencies. diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index e68c39f392..6d81c1cad1 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -10,6 +10,7 @@ import ( "bytes" "context" "encoding/json" + "fmt" "io" "os" "sort" @@ -215,6 +216,7 @@ applied to a Go struct, but now a Module struct: Dir string // directory holding files for this module, if any GoMod string // path to go.mod file used when loading this module, if any GoVersion string // go version used in module + Retracted string // retraction information, if any (with -retracted or -u) Error *ModuleError // error loading module } @@ -246,14 +248,16 @@ the replaced source code.) The -u flag adds information about available upgrades. When the latest version of a given module is newer than the current one, list -u sets the Module's Update field -to information about the newer module. +to information about the newer module. list -u will also set +the module's Retracted field if the current version is retracted. The Module's String method indicates an available upgrade by formatting the newer version in brackets after the current version. +If a version is retracted, the string "(retracted)" will follow it. For example, 'go list -m -u all' might print: my/main/module golang.org/x/text v0.3.0 [v0.4.0] => /tmp/text - rsc.io/pdf v0.1.1 [v0.1.2] + rsc.io/pdf v0.1.1 (retracted) [v0.1.2] (For tools, 'go list -m -u -json all' may be more convenient to parse.) @@ -263,6 +267,14 @@ to semantic versioning, earliest to latest. The flag also changes the default output format to display the module path followed by the space-separated version list. +The -retracted flag causes list to report information about retracted +module versions. When -retracted is used with -f or -json, the Retracted +field will be set to a string explaining why the version was retracted. +The string is taken from comments on the retract directive in the +module's go.mod file. When -retracted is used with -versions, retracted +versions are listed together with unretracted versions. The -retracted +flag may be used with or without -m. + The arguments to list -m are interpreted as a list of modules, not packages. The main module is the module containing the current directory. The active modules are the main module and its dependencies. @@ -296,17 +308,18 @@ func init() { } var ( - listCompiled = CmdList.Flag.Bool("compiled", false, "") - listDeps = CmdList.Flag.Bool("deps", false, "") - listE = CmdList.Flag.Bool("e", false, "") - listExport = CmdList.Flag.Bool("export", false, "") - listFmt = CmdList.Flag.String("f", "", "") - listFind = CmdList.Flag.Bool("find", false, "") - listJson = CmdList.Flag.Bool("json", false, "") - listM = CmdList.Flag.Bool("m", false, "") - listU = CmdList.Flag.Bool("u", false, "") - listTest = CmdList.Flag.Bool("test", false, "") - listVersions = CmdList.Flag.Bool("versions", false, "") + listCompiled = CmdList.Flag.Bool("compiled", false, "") + listDeps = CmdList.Flag.Bool("deps", false, "") + listE = CmdList.Flag.Bool("e", false, "") + listExport = CmdList.Flag.Bool("export", false, "") + listFmt = CmdList.Flag.String("f", "", "") + listFind = CmdList.Flag.Bool("find", false, "") + listJson = CmdList.Flag.Bool("json", false, "") + listM = CmdList.Flag.Bool("m", false, "") + listRetracted = CmdList.Flag.Bool("retracted", false, "") + listTest = CmdList.Flag.Bool("test", false, "") + listU = CmdList.Flag.Bool("u", false, "") + listVersions = CmdList.Flag.Bool("versions", false, "") ) var nl = []byte{'\n'} @@ -367,6 +380,16 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { } } + modload.Init() + if *listRetracted { + if cfg.BuildMod == "vendor" { + base.Fatalf("go list -retracted cannot be used when vendoring is enabled") + } + if !modload.Enabled() { + base.Fatalf("go list -retracted can only be used in module-aware mode") + } + } + if *listM { // Module mode. if *listCompiled { @@ -416,7 +439,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { modload.LoadBuildList(ctx) - mods := modload.ListModules(ctx, args, *listU, *listVersions) + mods := modload.ListModules(ctx, args, *listU, *listVersions, *listRetracted) if !*listE { for _, m := range mods { if m.Error != nil { @@ -607,6 +630,55 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { } } + // TODO(golang.org/issue/40676): This mechanism could be extended to support + // -u without -m. + if *listRetracted { + // Load retractions for modules that provide packages that will be printed. + // TODO(golang.org/issue/40775): Packages from the same module refer to + // distinct ModulePublic instance. It would be nice if they could all point + // to the same instance. This would require additional global state in + // modload.loaded, so that should be refactored first. For now, we update + // all instances. + modToArg := make(map[*modinfo.ModulePublic]string) + argToMods := make(map[string][]*modinfo.ModulePublic) + var args []string + addModule := func(mod *modinfo.ModulePublic) { + if mod.Version == "" { + return + } + arg := fmt.Sprintf("%s@%s", mod.Path, mod.Version) + if argToMods[arg] == nil { + args = append(args, arg) + } + argToMods[arg] = append(argToMods[arg], mod) + modToArg[mod] = arg + } + for _, p := range pkgs { + if p.Module == nil { + continue + } + addModule(p.Module) + if p.Module.Replace != nil { + addModule(p.Module.Replace) + } + } + + if len(args) > 0 { + listU := false + listVersions := false + rmods := modload.ListModules(ctx, args, listU, listVersions, *listRetracted) + for i, arg := range args { + rmod := rmods[i] + for _, mod := range argToMods[arg] { + mod.Retracted = rmod.Retracted + if rmod.Error != nil && mod.Error == nil { + mod.Error = rmod.Error + } + } + } + } + } + // Record non-identity import mappings in p.ImportMap. for _, p := range pkgs { for i, srcPath := range p.Internal.RawImports { diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index d4c161fca1..41f294d475 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -12,8 +12,8 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" - "cmd/go/internal/modload" "cmd/go/internal/modfetch" + "cmd/go/internal/modload" "cmd/go/internal/work" "golang.org/x/mod/module" @@ -136,9 +136,10 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { var mods []*moduleJSON listU := false listVersions := false + listRetractions := false type token struct{} sem := make(chan token, runtime.GOMAXPROCS(0)) - for _, info := range modload.ListModules(ctx, args, listU, listVersions) { + for _, info := range modload.ListModules(ctx, args, listU, listVersions, listRetractions) { if info.Replace != nil { info = info.Replace } diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index da33fff89e..b16887d318 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -69,12 +69,13 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { if *whyM { listU := false listVersions := false + listRetractions := false for _, arg := range args { if strings.Contains(arg, "@") { base.Fatalf("go mod why: module query not allowed") } } - mods := modload.ListModules(ctx, args, listU, listVersions) + mods := modload.ListModules(ctx, args, listU, listVersions, listRetractions) byModule := make(map[module.Version][]string) for _, path := range loadALL(ctx) { m := modload.PackageModule(path) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index a29e085875..e9f9a82fab 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -8,6 +8,7 @@ import ( "bytes" "context" "encoding/hex" + "errors" "fmt" "internal/goroot" "os" @@ -58,7 +59,9 @@ func PackageModuleInfo(pkgpath string) *modinfo.ModulePublic { if !ok { return nil } - return moduleInfo(context.TODO(), m, true) + fromBuildList := true + listRetracted := false + return moduleInfo(context.TODO(), m, fromBuildList, listRetracted) } func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { @@ -66,13 +69,17 @@ func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { return nil } + listRetracted := false if i := strings.Index(path, "@"); i >= 0 { - return moduleInfo(ctx, module.Version{Path: path[:i], Version: path[i+1:]}, false) + m := module.Version{Path: path[:i], Version: path[i+1:]} + fromBuildList := false + return moduleInfo(ctx, m, fromBuildList, listRetracted) } for _, m := range BuildList() { if m.Path == path { - return moduleInfo(ctx, m, true) + fromBuildList := true + return moduleInfo(ctx, m, fromBuildList, listRetracted) } } @@ -100,11 +107,37 @@ func addUpdate(ctx context.Context, m *modinfo.ModulePublic) { } // addVersions fills in m.Versions with the list of known versions. -func addVersions(ctx context.Context, m *modinfo.ModulePublic) { - m.Versions, _ = versions(ctx, m.Path, CheckAllowed) +// Excluded versions will be omitted. If listRetracted is false, retracted +// versions will also be omitted. +func addVersions(ctx context.Context, m *modinfo.ModulePublic, listRetracted bool) { + allowed := CheckAllowed + if listRetracted { + allowed = CheckExclusions + } + m.Versions, _ = versions(ctx, m.Path, allowed) +} + +// addRetraction fills in m.Retracted if the module was retracted by its author. +// m.Error is set if there's an error loading retraction information. +func addRetraction(ctx context.Context, m *modinfo.ModulePublic) { + if m.Version == "" { + return + } + + err := checkRetractions(ctx, module.Version{Path: m.Path, Version: m.Version}) + var rerr *retractedError + if errors.As(err, &rerr) { + if len(rerr.rationale) == 0 { + m.Retracted = []string{"retracted by module author"} + } else { + m.Retracted = rerr.rationale + } + } else if err != nil && m.Error == nil { + m.Error = &modinfo.ModuleError{Err: err.Error()} + } } -func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modinfo.ModulePublic { +func moduleInfo(ctx context.Context, m module.Version, fromBuildList, listRetracted bool) *modinfo.ModulePublic { if m == Target { info := &modinfo.ModulePublic{ Path: m.Path, @@ -152,6 +185,10 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi if err == nil { m.Dir = dir } + + if listRetracted { + addRetraction(ctx, m) + } } if m.GoVersion == "" { @@ -205,6 +242,7 @@ func moduleInfo(ctx context.Context, m module.Version, fromBuildList bool) *modi completeFromModCache(info.Replace) info.Dir = info.Replace.Dir info.GoMod = info.Replace.GoMod + info.Retracted = info.Replace.Retracted } info.GoVersion = info.Replace.GoVersion return info diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index a3461eea26..8c7b9a3950 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -20,12 +20,12 @@ import ( "golang.org/x/mod/module" ) -func ListModules(ctx context.Context, args []string, listU, listVersions bool) []*modinfo.ModulePublic { - mods := listModules(ctx, args, listVersions) +func ListModules(ctx context.Context, args []string, listU, listVersions, listRetracted bool) []*modinfo.ModulePublic { + mods := listModules(ctx, args, listVersions, listRetracted) type token struct{} sem := make(chan token, runtime.GOMAXPROCS(0)) - if listU || listVersions { + if listU || listVersions || listRetracted { for _, m := range mods { add := func(m *modinfo.ModulePublic) { sem <- token{} @@ -34,7 +34,10 @@ func ListModules(ctx context.Context, args []string, listU, listVersions bool) [ addUpdate(ctx, m) } if listVersions { - addVersions(ctx, m) + addVersions(ctx, m, listRetracted) + } + if listRetracted || listU { + addRetraction(ctx, m) } <-sem }() @@ -54,10 +57,10 @@ func ListModules(ctx context.Context, args []string, listU, listVersions bool) [ return mods } -func listModules(ctx context.Context, args []string, listVersions bool) []*modinfo.ModulePublic { +func listModules(ctx context.Context, args []string, listVersions, listRetracted bool) []*modinfo.ModulePublic { LoadBuildList(ctx) if len(args) == 0 { - return []*modinfo.ModulePublic{moduleInfo(ctx, buildList[0], true)} + return []*modinfo.ModulePublic{moduleInfo(ctx, buildList[0], true, listRetracted)} } var mods []*modinfo.ModulePublic @@ -84,9 +87,9 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin } allowed := CheckAllowed - if IsRevisionQuery(vers) { + if IsRevisionQuery(vers) || listRetracted { // Allow excluded and retracted versions if the user asked for a - // specific revision. + // specific revision or used 'go list -retracted'. allowed = nil } info, err := Query(ctx, path, vers, current, allowed) @@ -98,7 +101,8 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin }) continue } - mods = append(mods, moduleInfo(ctx, module.Version{Path: path, Version: info.Version}, false)) + mod := moduleInfo(ctx, module.Version{Path: path, Version: info.Version}, false, listRetracted) + mods = append(mods, mod) continue } @@ -123,7 +127,7 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin matched = true if !matchedBuildList[i] { matchedBuildList[i] = true - mods = append(mods, moduleInfo(ctx, m, true)) + mods = append(mods, moduleInfo(ctx, m, true, listRetracted)) } } } @@ -135,7 +139,8 @@ func listModules(ctx context.Context, args []string, listVersions bool) []*modin // Instead, resolve the module, even if it isn't an existing dependency. info, err := Query(ctx, arg, "latest", "", nil) if err == nil { - mods = append(mods, moduleInfo(ctx, module.Version{Path: arg, Version: info.Version}, false)) + mod := moduleInfo(ctx, module.Version{Path: arg, Version: info.Version}, false, listRetracted) + mods = append(mods, mod) } else { mods = append(mods, &modinfo.ModulePublic{ Path: arg, diff --git a/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.0.0.txt new file mode 100644 index 0000000000..2023c7b096 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.0.0.txt @@ -0,0 +1,8 @@ +This version should be retracted, but the go.mod file for the version that would +contain the retraction is not available. +-- .mod -- +module example.com/retract/missingmod + +go 1.14 +-- .info -- +{"Version":"v1.0.0"} diff --git a/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.9.0.txt b/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.9.0.txt new file mode 100644 index 0000000000..bba919ec21 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.9.0.txt @@ -0,0 +1,4 @@ +The go.mod file at this version will be loaded to check for retractions +of earlier versions. However, the .mod file is not available. +-- .info -- +{"Version":"v1.9.0"} diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_all_v1.9.0.txt b/src/cmd/go/testdata/mod/example.com_retract_self_all_v1.9.0.txt new file mode 100644 index 0000000000..4dc486b599 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_all_v1.9.0.txt @@ -0,0 +1,14 @@ +Module example.com/retract/self/prev is a module that retracts its own +latest version. + +No unretracted versions are available. + +-- .mod -- +module example.com/retract/self/all + +go 1.15 + +retract v1.9.0 // bad + +-- .info -- +{"Version":"v1.9.0"} diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.0.0.txt new file mode 100644 index 0000000000..04c28455d7 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.0.0.txt @@ -0,0 +1,16 @@ +Module example.com/retract/self/prerelease is a module that retracts its own +latest version and all other release version. + +A pre-release version higher than the highest release version is still +available, and that should be matched by @latest. + +-- .mod -- +module example.com/retract/self/prerelease + +go 1.15 + +-- .info -- +{"Version":"v1.0.0"} + +-- p.go -- +package p diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.9.0.txt b/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.9.0.txt new file mode 100644 index 0000000000..7c1c047e69 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.9.0.txt @@ -0,0 +1,19 @@ +Module example.com/retract/self/prerelease is a module that retracts its own +latest version and all other release version. + +A pre-release version higher than the highest release version is still +available, and that should be matched by @latest. + +-- .mod -- +module example.com/retract/self/prerelease + +go 1.15 + +retract v1.0.0 // bad +retract v1.9.0 // self + +-- .info -- +{"Version":"v1.9.0"} + +-- p.go -- +package p diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.9.1-pre.txt b/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.9.1-pre.txt new file mode 100644 index 0000000000..abf44fdae1 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_prerelease_v1.9.1-pre.txt @@ -0,0 +1,16 @@ +Module example.com/retract/self/prerelease is a module that retracts its own +latest version and all other release version. + +A pre-release version higher than the highest release version is still +available, and that should be matched by @latest. + +-- .mod -- +module example.com/retract/self/prerelease + +go 1.15 + +-- .info -- +{"Version":"v1.9.1-pre"} + +-- p.go -- +package p diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v0.0.0-20200325131415-0123456789ab b/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v0.0.0-20200325131415-0123456789ab new file mode 100644 index 0000000000..f9ab41e88f --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v0.0.0-20200325131415-0123456789ab @@ -0,0 +1,20 @@ +See example.com_retract_self_pseudo_v1.9.0.txt. + +This version is not retracted. It should be returned by the proxy's +@latest endpoint. It should match the @latest version query. + +TODO(golang.org/issue/24031): the proxy and proxy.golang.org both return +the highest release version from the @latest endpoint, even if that +version is retracted, so there is no way for the go command to +discover an unretracted pseudo-version. + +-- .mod -- +module example.com/retract/self/pseudo + +go 1.15 + +-- .info -- +{"Version":"v0.0.0-20200325131415-01234567890ab"} + +-- p.go -- +package p diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v1.0.0-bad.txt b/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v1.0.0-bad.txt new file mode 100644 index 0000000000..d47eda0597 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v1.0.0-bad.txt @@ -0,0 +1,14 @@ +See example.com_retract_self_pseudo_v1.9.0.txt. + +This version is retracted. + +-- .mod -- +module example.com/retract/self/pseudo + +go 1.15 + +-- .info -- +{"Version":"v1.0.0-bad"} + +-- p.go -- +package p diff --git a/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v1.9.0.txt b/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v1.9.0.txt new file mode 100644 index 0000000000..db09cc6a5f --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_self_pseudo_v1.9.0.txt @@ -0,0 +1,16 @@ +Module example.com/retract/self/pseudo is a module that retracts its own +latest version, as well as an earlier version. + +An unretracted pseudo-version is available. + +-- .mod -- +module example.com/retract/self/pseudo + +go 1.15 + +retract v1.0.0-bad // bad +retract v1.9.0 // self + +-- .info -- +{"Version":"v1.9.0"} + diff --git a/src/cmd/go/testdata/script/mod_list_pseudo.txt b/src/cmd/go/testdata/script/mod_list_pseudo.txt index 3a10b3a040..056c093128 100644 --- a/src/cmd/go/testdata/script/mod_list_pseudo.txt +++ b/src/cmd/go/testdata/script/mod_list_pseudo.txt @@ -10,30 +10,25 @@ go mod download github.com/dmitshur-test/modtest5@v0.5.0-alpha go mod download github.com/dmitshur-test/modtest5@v0.5.0-alpha.0.20190619023908-3da23a9deb9e cmp $GOPATH/pkg/mod/cache/download/github.com/dmitshur-test/modtest5/@v/list $WORK/modtest5.list +env GOSUMDB=off # don't verify go.mod files when loading retractions env GOPROXY=file:///$GOPATH/pkg/mod/cache/download env GOPATH=$WORK/gopath2 mkdir $GOPATH -go list -m -json github.com/dmitshur-test/modtest5@latest -cmp stdout $WORK/modtest5.json +go list -m -f '{{.Path}} {{.Version}} {{.Time.Format "2006-01-02"}}' github.com/dmitshur-test/modtest5@latest +stdout '^github.com/dmitshur-test/modtest5 v0.5.0-alpha 2019-06-18$' # If the module proxy contains only pseudo-versions, 'latest' should stat # the version with the most recent timestamp — not the highest semantic # version — and return its metadata. env GOPROXY=file:///$WORK/tinyproxy -go list -m -json dmitri.shuralyov.com/test/modtest3@latest -cmp stdout $WORK/modtest3.json +go list -m -f '{{.Path}} {{.Version}} {{.Time.Format "2006-01-02"}}' dmitri.shuralyov.com/test/modtest3@latest +stdout '^dmitri.shuralyov.com/test/modtest3 v0.0.0-20181023043359-a85b471d5412 2018-10-22$' -- $WORK/modtest5.list -- v0.0.0-20190619020302-197a620e0c9a v0.5.0-alpha v0.5.0-alpha.0.20190619023908-3da23a9deb9e --- $WORK/modtest5.json -- -{ - "Path": "github.com/dmitshur-test/modtest5", - "Version": "v0.5.0-alpha", - "Time": "2019-06-18T19:04:46-07:00" -} -- $WORK/tinyproxy/dmitri.shuralyov.com/test/modtest3/@v/list -- v0.1.0-0.20161023043300-000000000000 v0.0.0-20181023043359-a85b471d5412 @@ -42,9 +37,3 @@ v0.0.0-20181023043359-a85b471d5412 "Version": "v0.0.0-20181023043359-a85b471d5412", "Time": "2018-10-22T21:33:59-07:00" } --- $WORK/modtest3.json -- -{ - "Path": "dmitri.shuralyov.com/test/modtest3", - "Version": "v0.0.0-20181023043359-a85b471d5412", - "Time": "2018-10-22T21:33:59-07:00" -} diff --git a/src/cmd/go/testdata/script/mod_list_retract.txt b/src/cmd/go/testdata/script/mod_list_retract.txt new file mode 100644 index 0000000000..4e177b3f54 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_list_retract.txt @@ -0,0 +1,108 @@ +# 'go list -mod=vendor -retracted' reports an error. +go mod vendor +! go list -m -retracted -mod=vendor +stderr '^go list -retracted cannot be used when vendoring is enabled$' +rm vendor + +# 'go list -retracted' reports an error in GOPATH mode. +env GO111MODULE=off +! go list -retracted +stderr '^go list -retracted can only be used in module-aware mode$' +env GO111MODULE= + +# 'go list pkg' does not show retraction. +go list -f '{{with .Module}}{{with .Retracted}}retracted{{end}}{{end}}' example.com/retract +! stdout . + +# 'go list -retracted pkg' shows retraction. +go list -retracted -f '{{with .Module}}{{with .Retracted}}retracted{{end}}{{end}}' example.com/retract +stdout retracted + +# 'go list -m' does not show retraction. +go list -m -f '{{with .Retracted}}retracted{{end}}' example.com/retract +! stdout . + +# 'go list -m -retracted' shows retraction. +go list -m -retracted -f '{{with .Retracted}}retracted{{end}}' example.com/retract + +# 'go list -m mod@version' does not show retraction. +go list -m -f '{{with .Retracted}}retracted{{end}}' example.com/retract@v1.0.0-unused +! stdout . + +# 'go list -m -retracted mod@version' shows an error if the go.mod that should +# contain the retractions is not available. +! go list -m -retracted example.com/retract/missingmod@v1.0.0 +stderr '^go list -m: loading module retractions: example.com/retract/missingmod@v1.9.0:.*404 Not Found$' +go list -e -m -retracted -f '{{.Error.Err}}' example.com/retract/missingmod@v1.0.0 +stdout '^loading module retractions: example.com/retract/missingmod@v1.9.0:.*404 Not Found$' + +# 'go list -m -retracted mod@version' shows retractions. +go list -m -retracted example.com/retract@v1.0.0-unused +stdout '^example.com/retract v1.0.0-unused \(retracted\)$' +go list -m -retracted -f '{{with .Retracted}}retracted{{end}}' example.com/retract@v1.0.0-unused +stdout retracted + +# 'go list -m mod@latest' selects a previous release version, not self-retracted latest. +go list -m -f '{{.Version}}{{with .Retracted}} retracted{{end}}' example.com/retract/self/prev@latest +stdout '^v1.1.0$' + +# 'go list -m -retracted mod@latest' selects the self-retracted latest version. +go list -m -retracted -f '{{.Version}}{{with .Retracted}} retracted{{end}}' example.com/retract/self/prev@latest +stdout '^v1.9.0 retracted$' + +# 'go list -m mod@latest' selects a pre-release version if all release versions are retracted. +go list -m -f '{{.Version}}{{with .Retracted}} retracted{{end}}' example.com/retract/self/prerelease@latest +stdout '^v1.9.1-pre$' + +# 'go list -m -retracted mod@latest' selects the self-retracted latest version. +go list -m -retracted -f '{{.Version}}{{with .Retracted}} retracted{{end}}' example.com/retract/self/prerelease@latest +stdout '^v1.9.0 retracted$' + +# 'go list -m mod@latest' selects a pseudo-version if all versions are retracted. +# TODO(golang.org/issue/24031): the proxy does not expose the pseudo-version, +# even if all release versions are retracted. +go list -m -e -f '{{.Error.Err}}' example.com/retract/self/pseudo@latest +stdout '^module example.com/retract/self/pseudo: no matching versions for query "latest"$' + +# 'go list -m mod@latest' reports an error if all versions are retracted. +go list -m -e -f '{{.Error.Err}}' example.com/retract/self/all@latest +stdout '^module example.com/retract/self/all: no matching versions for query "latest"$' + +# 'go list -m mod@ Date: Wed, 15 Apr 2020 14:52:38 -0400 Subject: [PATCH 0346/1792] cmd/go: improve 'go get' handling of retracted versions 'go get' will now warn about retracted versions in the build list, after updating go.mod. The warning instructs users to run 'go get module@latest' to upgrade or downgrade away from the retracted version. 'go get' now allows users to explicitly request a specific retracted version. For #24031 Change-Id: I15fda918dc84258fb35b615dcd33b0f499481bd7 Reviewed-on: https://go-review.googlesource.com/c/go/+/228383 Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modget/get.go | 58 +++++++++++++- ...ple.com_retract_rationale_v1.0.0-block.txt | 6 ++ ...ract_rationale_v1.0.0-blockwithcomment.txt | 6 ++ ...ple.com_retract_rationale_v1.0.0-empty.txt | 8 ++ ...mple.com_retract_rationale_v1.0.0-long.txt | 8 ++ ...om_retract_rationale_v1.0.0-multiline1.txt | 8 ++ ...om_retract_rationale_v1.0.0-multiline2.txt | 8 ++ ...ple.com_retract_rationale_v1.0.0-order.txt | 6 ++ ...m_retract_rationale_v1.0.0-unprintable.txt | 8 ++ ...ple.com_retract_rationale_v1.0.1-order.txt | 6 ++ .../example.com_retract_rationale_v1.9.0.txt | 48 +++++++++++ .../go/testdata/script/mod_get_retract.txt | 49 ++++++++++++ .../testdata/script/mod_retract_rationale.txt | 79 +++++++++++++++++++ 13 files changed, 296 insertions(+), 2 deletions(-) create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-block.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-blockwithcomment.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-empty.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-long.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-multiline1.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-multiline2.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-order.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-unprintable.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.1-order.txt create mode 100644 src/cmd/go/testdata/mod/example.com_retract_rationale_v1.9.0.txt create mode 100644 src/cmd/go/testdata/script/mod_get_retract.txt create mode 100644 src/cmd/go/testdata/script/mod_retract_rationale.txt diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 06d59d9e0d..4ca7f5b529 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -702,6 +702,15 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // Everything succeeded. Update go.mod. modload.AllowWriteGoMod() modload.WriteGoMod() + modload.DisallowWriteGoMod() + + // Report warnings if any retracted versions are in the build list. + // This must be done after writing go.mod to avoid spurious '// indirect' + // comments. These functions read and write global state. + // TODO(golang.org/issue/40775): ListModules resets modload.loader, which + // contains information about direct dependencies that WriteGoMod uses. + // Refactor to avoid these kinds of global side effects. + reportRetractions(ctx) // If -d was specified, we're done after the module work. // We've already downloaded modules by loading packages above. @@ -804,6 +813,14 @@ func getQuery(ctx context.Context, path, vers string, prevM module.Version, forc base.Fatalf("go get: internal error: prevM may be set if and only if forceModulePath is set") } + // If vers is a query like "latest", we should ignore retracted and excluded + // versions. If vers refers to a specific version or commit like "v1.0.0" + // or "master", we should only ignore excluded versions. + allowed := modload.CheckAllowed + if modload.IsRevisionQuery(vers) { + allowed = modload.CheckExclusions + } + // If the query must be a module path, try only that module path. if forceModulePath { if path == modload.Target.Path { @@ -812,7 +829,7 @@ func getQuery(ctx context.Context, path, vers string, prevM module.Version, forc } } - info, err := modload.Query(ctx, path, vers, prevM.Version, modload.CheckAllowed) + info, err := modload.Query(ctx, path, vers, prevM.Version, allowed) if err == nil { if info.Version != vers && info.Version != prevM.Version { logOncef("go: %s %s => %s", path, vers, info.Version) @@ -838,7 +855,7 @@ func getQuery(ctx context.Context, path, vers string, prevM module.Version, forc // If it turns out to only exist as a module, we can detect the resulting // PackageNotInModuleError and avoid a second round-trip through (potentially) // all of the configured proxies. - results, err := modload.QueryPattern(ctx, path, vers, modload.CheckAllowed) + results, err := modload.QueryPattern(ctx, path, vers, allowed) if err != nil { // If the path doesn't contain a wildcard, check whether it was actually a // module path instead. If so, return that. @@ -1050,6 +1067,43 @@ func (r *lostUpgradeReqs) Required(mod module.Version) ([]module.Version, error) return r.Reqs.Required(mod) } +// reportRetractions prints warnings if any modules in the build list are +// retracted. +func reportRetractions(ctx context.Context) { + // Query for retractions of modules in the build list. + // Use modload.ListModules, since that provides information in the same format + // as 'go list -m'. Don't query for "all", since that's not allowed outside a + // module. + buildList := modload.BuildList() + args := make([]string, 0, len(buildList)) + for _, m := range buildList { + if m.Version == "" { + // main module or dummy target module + continue + } + args = append(args, m.Path+"@"+m.Version) + } + listU := false + listVersions := false + listRetractions := true + mods := modload.ListModules(ctx, args, listU, listVersions, listRetractions) + retractPath := "" + for _, mod := range mods { + if len(mod.Retracted) > 0 { + if retractPath == "" { + retractPath = mod.Path + } else { + retractPath = "" + } + rationale := modload.ShortRetractionRationale(mod.Retracted[0]) + logOncef("go: warning: %s@%s is retracted: %s", mod.Path, mod.Version, rationale) + } + } + if modload.HasModRoot() && retractPath != "" { + logOncef("go: run 'go get %s@latest' to switch to the latest unretracted version", retractPath) + } +} + var loggedLines sync.Map func logOncef(format string, args ...interface{}) { diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-block.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-block.txt new file mode 100644 index 0000000000..c4a53e1d80 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-block.txt @@ -0,0 +1,6 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.0-block"} diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-blockwithcomment.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-blockwithcomment.txt new file mode 100644 index 0000000000..92573b62e3 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-blockwithcomment.txt @@ -0,0 +1,6 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.0-blockwithcomment"} diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-empty.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-empty.txt new file mode 100644 index 0000000000..1f0894aa8b --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-empty.txt @@ -0,0 +1,8 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.0-empty"} +-- empty.go -- +package empty diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-long.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-long.txt new file mode 100644 index 0000000000..1b5e753428 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-long.txt @@ -0,0 +1,8 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.0-long"} +-- empty.go -- +package empty diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-multiline1.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-multiline1.txt new file mode 100644 index 0000000000..b1ffe27225 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-multiline1.txt @@ -0,0 +1,8 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.0-multiline1"} +-- empty.go -- +package empty diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-multiline2.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-multiline2.txt new file mode 100644 index 0000000000..72f80b3254 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-multiline2.txt @@ -0,0 +1,8 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.0-multiline2"} +-- empty.go -- +package empty diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-order.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-order.txt new file mode 100644 index 0000000000..1b0450462b --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-order.txt @@ -0,0 +1,6 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.0-order"} diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-unprintable.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-unprintable.txt new file mode 100644 index 0000000000..949612431e --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.0-unprintable.txt @@ -0,0 +1,8 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.0-unprintable"} +-- empty.go -- +package empty diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.1-order.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.1-order.txt new file mode 100644 index 0000000000..3be7d5b56e --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.0.1-order.txt @@ -0,0 +1,6 @@ +-- .mod -- +module example.com/retract/rationale + +go 1.14 +-- .info -- +{"Version":"v1.0.1-order"} diff --git a/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.9.0.txt b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.9.0.txt new file mode 100644 index 0000000000..6975d4ebd4 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_retract_rationale_v1.9.0.txt @@ -0,0 +1,48 @@ +Module example.com/retract/description retracts all versions of itself. +The rationale comments have various problems. + +-- .mod -- +module example.com/retract/rationale + +go 1.14 + +retract ( + v1.0.0-empty + + // short description + // more + // + // detail + v1.0.0-multiline1 // suffix + // after not included +) + +// short description +// more +// +// detail +retract v1.0.0-multiline2 // suffix + +// loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong +retract v1.0.0-long + +// Ends with a BEL character. Beep! +retract v1.0.0-unprintable + +// block comment +retract ( + v1.0.0-block + + // inner comment + v1.0.0-blockwithcomment +) + +retract ( + [v1.0.0-order, v1.0.0-order] // degenerate range + v1.0.0-order // single version + + v1.0.1-order // single version + [v1.0.1-order, v1.0.1-order] // degenerate range +) +-- .info -- +{"Version":"v1.9.0"} diff --git a/src/cmd/go/testdata/script/mod_get_retract.txt b/src/cmd/go/testdata/script/mod_get_retract.txt new file mode 100644 index 0000000000..da6c25523f --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_retract.txt @@ -0,0 +1,49 @@ +# 'go get pkg' should not upgrade to a retracted version. +cp go.mod.orig go.mod +go mod edit -require example.com/retract/self/prev@v1.1.0 +go get -d example.com/retract/self/prev +go list -m example.com/retract/self/prev +stdout '^example.com/retract/self/prev v1.1.0$' + +# 'go get pkg' should not downgrade from a retracted version when no higher +# version is available. +cp go.mod.orig go.mod +go mod edit -require example.com/retract/self/prev@v1.9.0 +go get -d example.com/retract/self/prev +stderr '^go: warning: example.com/retract/self/prev@v1.9.0 is retracted: self$' +go list -m example.com/retract/self/prev +stdout '^example.com/retract/self/prev v1.9.0$' + +# 'go get pkg@latest' should downgrade from a retracted version. +cp go.mod.orig go.mod +go mod edit -require example.com/retract/self/prev@v1.9.0 +go get -d example.com/retract/self/prev@latest +go list -m example.com/retract/self/prev +stdout '^example.com/retract/self/prev v1.1.0$' + +# 'go get pkg@version' should update to a specific version, even if that +# version is retracted. +cp go.mod.orig go.mod +go get -d example.com/retract@v1.0.0-bad +stderr '^go: warning: example.com/retract@v1.0.0-bad is retracted: bad$' +go list -m example.com/retract +stdout '^example.com/retract v1.0.0-bad$' + +# 'go get -u' should not downgrade from a retracted version when no higher +# version is available. +cp go.mod.orig go.mod +go mod edit -require example.com/retract/self/prev@v1.9.0 +go get -d -u . +stderr '^go: warning: example.com/retract/self/prev@v1.9.0 is retracted: self$' +go list -m example.com/retract/self/prev +stdout '^example.com/retract/self/prev v1.9.0$' + +-- go.mod.orig -- +module example.com/use + +go 1.15 + +-- use.go -- +package use + +import _ "example.com/retract/self/prev" diff --git a/src/cmd/go/testdata/script/mod_retract_rationale.txt b/src/cmd/go/testdata/script/mod_retract_rationale.txt new file mode 100644 index 0000000000..584c3a3849 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_retract_rationale.txt @@ -0,0 +1,79 @@ +# When there is no rationale, 'go get' should print a hard-coded message. +go get -d example.com/retract/rationale@v1.0.0-empty +stderr '^go: warning: example.com/retract/rationale@v1.0.0-empty is retracted: retracted by module author$' + +# 'go list' should print the same hard-coded message. +go list -m -retracted -f '{{.Retracted}}' example.com/retract/rationale +stdout '^\[retracted by module author\]$' + + +# When there is a multi-line message, 'go get' should print the first line. +go get -d example.com/retract/rationale@v1.0.0-multiline1 +stderr '^go: warning: example.com/retract/rationale@v1.0.0-multiline1 is retracted: short description$' +! stderr 'detail' + +# 'go list' should show the full message. +go list -m -retracted -f '{{.Retracted}}' example.com/retract/rationale +cmp stdout multiline + +# 'go get' output should be the same whether the retraction appears at top-level +# or in a block. +go get -d example.com/retract/rationale@v1.0.0-multiline2 +stderr '^go: warning: example.com/retract/rationale@v1.0.0-multiline2 is retracted: short description$' +! stderr 'detail' + +# Same for 'go list'. +go list -m -retracted -f '{{.Retracted}}' example.com/retract/rationale +cmp stdout multiline + + +# 'go get' should omit long messages. +go get -d example.com/retract/rationale@v1.0.0-long +stderr '^go: warning: example.com/retract/rationale@v1.0.0-long is retracted: \(rationale omitted: too long\)' + +# 'go list' should show the full message. +go list -m -retracted -f '{{.Retracted}}' example.com/retract/rationale +stdout '^\[lo{500}ng\]$' + + +# 'go get' should omit messages with unprintable characters. +go get -d example.com/retract/rationale@v1.0.0-unprintable +stderr '^go: warning: example.com/retract/rationale@v1.0.0-unprintable is retracted: \(rationale omitted: contains non-printable characters\)' + +# 'go list' should show the full message. +go list -m -retracted -f '{{.Retracted}}' example.com/retract/rationale +stdout '^\[Ends with a BEL character. Beep!\x07\]$' + + +# When there is a comment on a block, but not on individual retractions within +# the block, the rationale should come from the block comment. +go list -m -retracted -f '{{.Retracted}}' example.com/retract/rationale@v1.0.0-block +stdout '^\[block comment\]$' +go list -m -retracted -f '{{.Retracted}}' example.com/retract/rationale@v1.0.0-blockwithcomment +stdout '^\[inner comment\]$' + + +# When a version is covered by multiple retractions, all retractions should +# be reported in the order they appear in the file. +go list -m -retracted -f '{{range .Retracted}}{{.}},{{end}}' example.com/retract/rationale@v1.0.0-order +stdout '^degenerate range,single version,$' +go list -m -retracted -f '{{range .Retracted}}{{.}},{{end}}' example.com/retract/rationale@v1.0.1-order +stdout '^single version,degenerate range,$' + +# 'go get' will only report the first retraction to avoid being too verbose. +go get -d example.com/retract/rationale@v1.0.0-order +stderr '^go: warning: example.com/retract/rationale@v1.0.0-order is retracted: degenerate range$' +go get -d example.com/retract/rationale@v1.0.1-order +stderr '^go: warning: example.com/retract/rationale@v1.0.1-order is retracted: single version$' + +-- go.mod -- +module m + +go 1.14 + +-- multiline -- +[short description +more + +detail +suffix] -- GitLab From 008048c5f4613c6b864c2e69ce795df9fa227e63 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 15 Apr 2020 15:11:51 -0400 Subject: [PATCH 0347/1792] doc: add module retraction to release notes For #24031 Change-Id: I9bd0905e9aacee4bec3463b7d91f6f0929744752 Reviewed-on: https://go-review.googlesource.com/c/go/+/228384 Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- doc/go1.16.html | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 09e974d07c..b11af7fd99 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -43,6 +43,15 @@ Do not send CLs removing the interior tags from such phrases.

Go command

+

+ retract directives may now be used in a go.mod file + to indicate that certain published versions of the module should not be used + by other modules. A module author may retract a version after a severe problem + is discovered or if the version was published unintentionally.
+ TODO: write and link to section in golang.org/ref/mod
+ TODO: write and link to tutorial or blog post +

+

TODO

-- GitLab From 694fc8e76bec99b67bbd0302852f6a1c1dafe7ca Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Mon, 16 Dec 2019 17:18:06 -0500 Subject: [PATCH 0348/1792] cmd/go/internal/modload: reject some bad module paths This change rejects module paths that don't conform to the new checkModulePathLax function, when loading a go.mod file. The change uses the checkModulePathLax function instead of CheckPath because there are still many users who are using unpublished modules with unpublishable paths, and we don't want to break them all. Next, before this change, when go mod init is run in GOPATH, it would try to use the location of the directory within GOPATH to infer the module path. After this change, it will only use that inferred module path if it conforms to module.CheckPath. Change-Id: Idb36d1655cc76aae82671e87ba634609503ad1a2 Reviewed-on: https://go-review.googlesource.com/c/go/+/211597 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/init.go | 72 ++++++++++++++++++- .../go/testdata/script/mod_invalid_path.txt | 30 +++++++- 2 files changed, 98 insertions(+), 4 deletions(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index af23647cd4..6f93b88eab 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -379,6 +379,10 @@ func InitMod(ctx context.Context) { legacyModInit() } + if err := checkModulePathLax(f.Module.Mod.Path); err != nil { + base.Fatalf("go: %v", err) + } + setDefaultBuildMod() modFileToBuildList() if cfg.BuildMod == "vendor" { @@ -387,6 +391,49 @@ func InitMod(ctx context.Context) { } } +// checkModulePathLax checks that the path meets some minimum requirements +// to avoid confusing users or the module cache. The requirements are weaker +// than those of module.CheckPath to allow room for weakening module path +// requirements in the future, but strong enough to help users avoid significant +// problems. +func checkModulePathLax(p string) error { + // TODO(matloob): Replace calls of this function in this CL with calls + // to module.CheckImportPath once it's been laxened, if it becomes laxened. + // See golang.org/issue/29101 for a discussion about whether to make CheckImportPath + // more lax or more strict. + + errorf := func(format string, args ...interface{}) error { + return fmt.Errorf("invalid module path %q: %s", p, fmt.Sprintf(format, args...)) + } + + // Disallow shell characters " ' * < > ? ` | to avoid triggering bugs + // with file systems and subcommands. Disallow file path separators : and \ + // because path separators other than / will confuse the module cache. + // See fileNameOK in golang.org/x/mod/module/module.go. + shellChars := "`" + `\"'*<>?|` + fsChars := `\:` + if i := strings.IndexAny(p, shellChars); i >= 0 { + return errorf("contains disallowed shell character %q", p[i]) + } + if i := strings.IndexAny(p, fsChars); i >= 0 { + return errorf("contains disallowed path separator character %q", p[i]) + } + + // Ensure path.IsAbs and build.IsLocalImport are false, and that the path is + // invariant under path.Clean, also to avoid confusing the module cache. + if path.IsAbs(p) { + return errorf("is an absolute path") + } + if build.IsLocalImport(p) { + return errorf("is a local import path") + } + if path.Clean(p) != p { + return errorf("is not clean") + } + + return nil +} + // fixVersion returns a modfile.VersionFixer implemented using the Query function. // // It resolves commit hashes and branch names to versions, @@ -678,16 +725,35 @@ func findModulePath(dir string) (string, error) { } // Look for path in GOPATH. + var badPathErr error for _, gpdir := range filepath.SplitList(cfg.BuildContext.GOPATH) { if gpdir == "" { continue } if rel := search.InDir(dir, filepath.Join(gpdir, "src")); rel != "" && rel != "." { - return filepath.ToSlash(rel), nil + path := filepath.ToSlash(rel) + // TODO(matloob): replace this with module.CheckImportPath + // once it's been laxened. + // Only checkModulePathLax here. There are some unpublishable + // module names that are compatible with checkModulePathLax + // but they already work in GOPATH so don't break users + // trying to do a build with modules. gorelease will alert users + // publishing their modules to fix their paths. + if err := checkModulePathLax(path); err != nil { + badPathErr = err + break + } + return path, nil } } - msg := `cannot determine module path for source directory %s (outside GOPATH, module path must be specified) + reason := "outside GOPATH, module path must be specified" + if badPathErr != nil { + // return a different error message if the module was in GOPATH, but + // the module path determined above would be an invalid path. + reason = fmt.Sprintf("bad module path inferred from directory in GOPATH: %v", badPathErr) + } + msg := `cannot determine module path for source directory %s (%s) Example usage: 'go mod init example.com/m' to initialize a v0 or v1 module @@ -695,7 +761,7 @@ Example usage: Run 'go help mod init' for more information. ` - return "", fmt.Errorf(msg, dir) + return "", fmt.Errorf(msg, dir, reason) } var ( diff --git a/src/cmd/go/testdata/script/mod_invalid_path.txt b/src/cmd/go/testdata/script/mod_invalid_path.txt index 1ab418a075..05a5133571 100644 --- a/src/cmd/go/testdata/script/mod_invalid_path.txt +++ b/src/cmd/go/testdata/script/mod_invalid_path.txt @@ -1,12 +1,40 @@ -# Test that mod files with missing paths produce an error. +# Test that mod files with invalid or missing paths produce an error. # 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.\n\tRun ''go mod edit -module=example.com/mod'' to specify the module path.$' +# 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 +# it isn't even a valid import path. +# The single quote and backtick are the only characters we don't allow +# in checkModulePathLax, but is allowed in a Windows file name. +# TODO(matloob): choose a different character once +# module.CheckImportPath is laxened and replaces +# checkModulePathLax. +cd $WORK/'gopath/src/m''d' +! go mod init +stderr 'cannot determine module path' + +# Test that a go.mod file is rejected when its module declaration has a path that can't +# possibly be a module path, because it isn't even a valid import path +cd $WORK/gopath/src/badname +! go list . +stderr 'invalid module path' + -- mod/go.mod -- -- mod/foo.go -- package foo +-- m'd/foo.go -- +package mad + +-- badname/go.mod -- + +module .\. + +-- badname/foo.go -- +package badname + -- GitLab From e9ad52e46dee4b4f9c73ff44f44e1e234815800f Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 24 Aug 2020 21:42:20 -0700 Subject: [PATCH 0349/1792] net: export ErrClosed This permits programs to reliably detect whether they are using a closed network connection. Fixes #4373 Change-Id: Ib4ce8cc82bbb134c4689f0ebc8b9b11bb8b32a22 Reviewed-on: https://go-review.googlesource.com/c/go/+/250357 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser Reviewed-by: Russ Cox --- doc/go1.16.html | 12 ++++++++++++ src/net/error_test.go | 17 +++++++++++------ src/net/net.go | 12 ++++++++++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index b11af7fd99..c82b3b9276 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -99,6 +99,18 @@ Do not send CLs removing the interior tags from such phrases. TODO

+

net

+ +

+ The case of I/O on a closed network connection, or I/O on a network + connection that is closed before any of the I/O completes, can now + be detected using the new ErrClosed error. + A typical use would be errors.Is(err, net.ErrClosed). + In earlier releases the only way to reliably detect this case was to + match the string returned by the Error method + with "use of closed network connection". +

+

unicode

diff --git a/src/net/error_test.go b/src/net/error_test.go index 8d4a7ffb3d..62dfb9c15d 100644 --- a/src/net/error_test.go +++ b/src/net/error_test.go @@ -8,6 +8,7 @@ package net import ( "context" + "errors" "fmt" "internal/poll" "io" @@ -101,7 +102,7 @@ second: goto third } switch nestedErr { - case errCanceled, poll.ErrNetClosing, errMissingAddress, errNoSuitableAddress, + case errCanceled, ErrClosed, errMissingAddress, errNoSuitableAddress, context.DeadlineExceeded, context.Canceled: return nil } @@ -436,7 +437,7 @@ second: goto third } switch nestedErr { - case poll.ErrNetClosing, errTimeout, poll.ErrNotPollable, os.ErrDeadlineExceeded: + case ErrClosed, errTimeout, poll.ErrNotPollable, os.ErrDeadlineExceeded: return nil } return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr) @@ -478,7 +479,7 @@ second: goto third } switch nestedErr { - case errCanceled, poll.ErrNetClosing, errMissingAddress, errTimeout, os.ErrDeadlineExceeded, ErrWriteToConnected, io.ErrUnexpectedEOF: + case errCanceled, ErrClosed, errMissingAddress, errTimeout, os.ErrDeadlineExceeded, ErrWriteToConnected, io.ErrUnexpectedEOF: return nil } return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr) @@ -508,6 +509,10 @@ func parseCloseError(nestedErr error, isShutdown bool) error { return fmt.Errorf("error string %q does not contain expected string %q", nestedErr, want) } + if !isShutdown && !errors.Is(nestedErr, ErrClosed) { + return fmt.Errorf("errors.Is(%v, errClosed) returns false, want true", nestedErr) + } + switch err := nestedErr.(type) { case *OpError: if err := err.isValid(); err != nil { @@ -531,7 +536,7 @@ second: goto third } switch nestedErr { - case poll.ErrNetClosing: + case ErrClosed: return nil } return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr) @@ -627,7 +632,7 @@ second: goto third } switch nestedErr { - case poll.ErrNetClosing, errTimeout, poll.ErrNotPollable, os.ErrDeadlineExceeded: + case ErrClosed, errTimeout, poll.ErrNotPollable, os.ErrDeadlineExceeded: return nil } return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr) @@ -706,7 +711,7 @@ second: goto third } switch nestedErr { - case poll.ErrNetClosing: + case ErrClosed: return nil } return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr) diff --git a/src/net/net.go b/src/net/net.go index 2e61a7c02e..4b4ed129cc 100644 --- a/src/net/net.go +++ b/src/net/net.go @@ -81,6 +81,7 @@ package net import ( "context" "errors" + "internal/poll" "io" "os" "sync" @@ -632,6 +633,17 @@ func (e *DNSError) Timeout() bool { return e.IsTimeout } // error and return a DNSError for which Temporary returns false. func (e *DNSError) Temporary() bool { return e.IsTimeout || e.IsTemporary } +// errClosed exists just so that the docs for ErrClosed don't mention +// the internal package poll. +var errClosed = poll.ErrNetClosing + +// ErrClosed is the error returned by an I/O call on a network +// connection that has already been closed, or that is closed by +// another goroutine before the I/O is completed. This may be wrapped +// in another error, and should normally be tested using +// errors.Is(err, net.ErrClosed). +var ErrClosed = errClosed + type writerOnly struct { io.Writer } -- GitLab From 47b450997778163dfed6f58cae379d928fc37687 Mon Sep 17 00:00:00 2001 From: ShihCheng Tu Date: Mon, 15 Jun 2020 00:07:10 +0800 Subject: [PATCH 0350/1792] doc/go1.14: document json.Umarshal map key support of TextUnmarshaler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document that json.Unmarshal supports map keys whose underlying types implement encoding.TextUnmarshaler. Fixes #38801 Change-Id: Icb9414e9067517531ba0da910bd4a2bb3daace65 Reviewed-on: https://go-review.googlesource.com/c/go/+/237857 Reviewed-by: Daniel Martí Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot --- doc/go1.14.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/go1.14.html b/doc/go1.14.html index 35a9f3c2f3..410e0cbf7c 100644 --- a/doc/go1.14.html +++ b/doc/go1.14.html @@ -609,6 +609,12 @@ Do not send CLs removing the interior tags from such phrases. If a program needs to accept invalid numbers like the empty string, consider wrapping the type with Unmarshaler.

+ +

+ Unmarshal + can now support map keys with string underlying type which implement + encoding.TextUnmarshaler. +

-- GitLab From 2aba467933b3252c758b65146d2ea5a5cff196da Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Thu, 20 Aug 2020 15:06:06 -0500 Subject: [PATCH 0351/1792] cmd/compile: remove unused carry related ssa ops in ppc64 The intermediate SSA opcodes* are no longer generated during the lowering pass. The shifting rules have been improved using ISEL. Therefore, we can remove them and the rules which expand them. * The removed opcodes are: LoweredAdd64Carry ADDconstForCarry MaskIfNotCarry FlagCarryClear FlagCarrySet Change-Id: I1ebe2726ed988f29ed4800c8f57b428f7a214cd0 Reviewed-on: https://go-review.googlesource.com/c/go/+/249462 Run-TryBot: Lynn Boger TryBot-Result: Gobot Gobot Reviewed-by: Lynn Boger --- src/cmd/compile/internal/ppc64/ssa.go | 19 +---- src/cmd/compile/internal/ssa/gen/PPC64.rules | 9 +-- src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 12 +-- src/cmd/compile/internal/ssa/opGen.go | 36 --------- src/cmd/compile/internal/ssa/rewritePPC64.go | 82 -------------------- 5 files changed, 6 insertions(+), 152 deletions(-) diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go index 4d2ad48135..9c4c01e935 100644 --- a/src/cmd/compile/internal/ppc64/ssa.go +++ b/src/cmd/compile/internal/ppc64/ssa.go @@ -629,23 +629,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_REG p.To.Reg = r - case ssa.OpPPC64MaskIfNotCarry: - r := v.Reg() - p := s.Prog(v.Op.Asm()) - p.From.Type = obj.TYPE_REG - p.From.Reg = ppc64.REGZERO - p.To.Type = obj.TYPE_REG - p.To.Reg = r - - case ssa.OpPPC64ADDconstForCarry: - r1 := v.Args[0].Reg() - p := s.Prog(v.Op.Asm()) - p.Reg = r1 - p.From.Type = obj.TYPE_CONST - p.From.Offset = v.AuxInt - p.To.Type = obj.TYPE_REG - p.To.Reg = ppc64.REGTMP // Ignored; this is for the carry effect. - 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, @@ -1802,7 +1785,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { v.Fatalf("Pseudo-op should not make it to codegen: %s ###\n", v.LongString()) case ssa.OpPPC64InvertFlags: v.Fatalf("InvertFlags should never make it to codegen %v", v.LongString()) - case ssa.OpPPC64FlagEQ, ssa.OpPPC64FlagLT, ssa.OpPPC64FlagGT, ssa.OpPPC64FlagCarrySet, ssa.OpPPC64FlagCarryClear: + case ssa.OpPPC64FlagEQ, ssa.OpPPC64FlagLT, ssa.OpPPC64FlagGT: v.Fatalf("Flag* ops should never make it to codegen %v", v.LongString()) case ssa.OpClobber: // TODO: implement for clobberdead experiment. Nop is ok for now. diff --git a/src/cmd/compile/internal/ssa/gen/PPC64.rules b/src/cmd/compile/internal/ssa/gen/PPC64.rules index 14942d50f9..509cfe1c4f 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/gen/PPC64.rules @@ -276,18 +276,11 @@ (Rsh8Ux8 x y) => (SRW (ZeroExt8to32 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 when input is masked -(MaskIfNotCarry (ADDconstForCarry [c] (ANDconst [d] _))) && c < 0 && d > 0 && int64(c) + d < 0 => (MOVDconst [-1]) +// Cleaning up shift ops (ISEL [0] (ANDconst [d] y) (MOVDconst [-1]) (CMPU (ANDconst [d] y) (MOVDconst [c]))) && c >= d => (ANDconst [d] y) (ISEL [0] (ANDconst [d] y) (MOVDconst [-1]) (CMPUconst [c] (ANDconst [d] y))) && c >= d => (ANDconst [d] y) (ORN x (MOVDconst [-1])) => x -(ADDconstForCarry [c] (MOVDconst [d])) && c < 0 && (c < 0 || int64(c) + d >= 0) => (FlagCarryClear) -(ADDconstForCarry [c] (MOVDconst [d])) && c < 0 && c >= 0 && int64(c) + d < 0 => (FlagCarrySet) - -(MaskIfNotCarry (FlagCarrySet)) => (MOVDconst [0]) -(MaskIfNotCarry (FlagCarryClear)) => (MOVDconst [-1]) - (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) diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index 825d0faf34..f91222446c 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -206,9 +206,7 @@ func init() { {name: "ROTL", argLength: 2, reg: gp21, asm: "ROTL"}, // arg0 rotate left by arg1 mod 64 {name: "ROTLW", argLength: 2, reg: gp21, asm: "ROTLW"}, // uint32(arg0) rotate left by arg1 mod 32 - {name: "LoweredAdd64Carry", argLength: 3, reg: gp32, resultNotInArgs: true}, // arg0 + arg1 + carry, returns (sum, carry) - {name: "ADDconstForCarry", argLength: 1, reg: regInfo{inputs: []regMask{gp | sp | sb}, clobbers: tmp}, aux: "Int16", asm: "ADDC", typ: "Flags"}, // _, carry := arg0 + auxint - {name: "MaskIfNotCarry", argLength: 1, reg: crgp, asm: "ADDME", typ: "Int64"}, // carry - 1 (if carry then 0 else -1) + {name: "LoweredAdd64Carry", argLength: 3, reg: gp32, resultNotInArgs: true}, // arg0 + arg1 + carry, returns (sum, carry) {name: "SRADconst", argLength: 1, reg: gp11, asm: "SRAD", aux: "Int64"}, // signed arg0 >> auxInt, 0 <= auxInt < 64, 64 bit width {name: "SRAWconst", argLength: 1, reg: gp11, asm: "SRAW", aux: "Int64"}, // signed arg0 >> auxInt, 0 <= auxInt < 32, 32 bit width @@ -674,11 +672,9 @@ func init() { // These ops are for temporary use by rewrite rules. They // cannot appear in the generated assembly. - {name: "FlagEQ"}, // equal - {name: "FlagLT"}, // signed < or unsigned < - {name: "FlagGT"}, // signed > or unsigned > - {name: "FlagCarrySet"}, // carry flag set - {name: "FlagCarryClear"}, // carry flag clear + {name: "FlagEQ"}, // equal + {name: "FlagLT"}, // signed < or unsigned < + {name: "FlagGT"}, // signed > or unsigned > } blocks := []blockData{ diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 4cd72799e8..e181174d11 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -1853,8 +1853,6 @@ const ( OpPPC64ROTL OpPPC64ROTLW OpPPC64LoweredAdd64Carry - OpPPC64ADDconstForCarry - OpPPC64MaskIfNotCarry OpPPC64SRADconst OpPPC64SRAWconst OpPPC64SRDconst @@ -2027,8 +2025,6 @@ const ( OpPPC64FlagEQ OpPPC64FlagLT OpPPC64FlagGT - OpPPC64FlagCarrySet - OpPPC64FlagCarryClear OpRISCV64ADD OpRISCV64ADDI @@ -24683,28 +24679,6 @@ var opcodeTable = [...]opInfo{ }, }, }, - { - name: "ADDconstForCarry", - auxType: auxInt16, - argLen: 1, - asm: ppc64.AADDC, - 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 - }, - clobbers: 2147483648, // R31 - }, - }, - { - name: "MaskIfNotCarry", - argLen: 1, - asm: ppc64.AADDME, - 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 - }, - }, - }, { name: "SRADconst", auxType: auxInt64, @@ -26964,16 +26938,6 @@ var opcodeTable = [...]opInfo{ argLen: 0, reg: regInfo{}, }, - { - name: "FlagCarrySet", - argLen: 0, - reg: regInfo{}, - }, - { - name: "FlagCarryClear", - argLen: 0, - reg: regInfo{}, - }, { name: "ADD", diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 7704b80dc6..1a0b03e81c 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -428,8 +428,6 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64ADD(v) case OpPPC64ADDconst: return rewriteValuePPC64_OpPPC64ADDconst(v) - case OpPPC64ADDconstForCarry: - return rewriteValuePPC64_OpPPC64ADDconstForCarry(v) case OpPPC64AND: return rewriteValuePPC64_OpPPC64AND(v) case OpPPC64ANDN: @@ -570,8 +568,6 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64MOVWstorezero(v) case OpPPC64MTVSRD: return rewriteValuePPC64_OpPPC64MTVSRD(v) - case OpPPC64MaskIfNotCarry: - return rewriteValuePPC64_OpPPC64MaskIfNotCarry(v) case OpPPC64NOR: return rewriteValuePPC64_OpPPC64NOR(v) case OpPPC64NotEqual: @@ -4075,40 +4071,6 @@ func rewriteValuePPC64_OpPPC64ADDconst(v *Value) bool { } return false } -func rewriteValuePPC64_OpPPC64ADDconstForCarry(v *Value) bool { - v_0 := v.Args[0] - // match: (ADDconstForCarry [c] (MOVDconst [d])) - // cond: c < 0 && (c < 0 || int64(c) + d >= 0) - // result: (FlagCarryClear) - for { - c := auxIntToInt16(v.AuxInt) - if v_0.Op != OpPPC64MOVDconst { - break - } - d := auxIntToInt64(v_0.AuxInt) - if !(c < 0 && (c < 0 || int64(c)+d >= 0)) { - break - } - v.reset(OpPPC64FlagCarryClear) - return true - } - // match: (ADDconstForCarry [c] (MOVDconst [d])) - // cond: c < 0 && c >= 0 && int64(c) + d < 0 - // result: (FlagCarrySet) - for { - c := auxIntToInt16(v.AuxInt) - if v_0.Op != OpPPC64MOVDconst { - break - } - d := auxIntToInt64(v_0.AuxInt) - if !(c < 0 && c >= 0 && int64(c)+d < 0) { - break - } - v.reset(OpPPC64FlagCarrySet) - return true - } - return false -} func rewriteValuePPC64_OpPPC64AND(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -10374,50 +10336,6 @@ func rewriteValuePPC64_OpPPC64MTVSRD(v *Value) bool { } return false } -func rewriteValuePPC64_OpPPC64MaskIfNotCarry(v *Value) bool { - v_0 := v.Args[0] - // match: (MaskIfNotCarry (ADDconstForCarry [c] (ANDconst [d] _))) - // cond: c < 0 && d > 0 && int64(c) + d < 0 - // result: (MOVDconst [-1]) - for { - if v_0.Op != OpPPC64ADDconstForCarry { - break - } - c := auxIntToInt16(v_0.AuxInt) - v_0_0 := v_0.Args[0] - if v_0_0.Op != OpPPC64ANDconst { - break - } - d := auxIntToInt64(v_0_0.AuxInt) - if !(c < 0 && d > 0 && int64(c)+d < 0) { - break - } - v.reset(OpPPC64MOVDconst) - v.AuxInt = int64ToAuxInt(-1) - return true - } - // match: (MaskIfNotCarry (FlagCarrySet)) - // result: (MOVDconst [0]) - for { - if v_0.Op != OpPPC64FlagCarrySet { - break - } - v.reset(OpPPC64MOVDconst) - v.AuxInt = int64ToAuxInt(0) - return true - } - // match: (MaskIfNotCarry (FlagCarryClear)) - // result: (MOVDconst [-1]) - for { - if v_0.Op != OpPPC64FlagCarryClear { - break - } - v.reset(OpPPC64MOVDconst) - v.AuxInt = int64ToAuxInt(-1) - return true - } - return false -} func rewriteValuePPC64_OpPPC64NOR(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] -- GitLab From 3e636ab9ad31040aff2d484237808907a776cec6 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 14 Aug 2020 13:29:07 -0700 Subject: [PATCH 0352/1792] net/mail: return error on empty address list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This restores the handling accidentally changed in CL 217377. Fixes #40803 For #36959 Change-Id: If77fbc0c2a1dde4799f760affdfb8dde9bcaf458 Reviewed-on: https://go-review.googlesource.com/c/go/+/248598 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí Reviewed-by: Jeremy Fishman --- src/net/mail/message.go | 13 +++++++++---- src/net/mail/message_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/net/mail/message.go b/src/net/mail/message.go index 6833cfaec1..09fb794005 100644 --- a/src/net/mail/message.go +++ b/src/net/mail/message.go @@ -279,9 +279,6 @@ func (p *addrParser) parseAddressList() ([]*Address, error) { if p.consume(',') { continue } - if p.empty() { - break - } addrs, err := p.parseAddress(true) if err != nil { @@ -295,9 +292,17 @@ func (p *addrParser) parseAddressList() ([]*Address, error) { if p.empty() { break } - if !p.consume(',') { + if p.peek() != ',' { return nil, errors.New("mail: expected comma") } + + // Skip empty entries for obs-addr-list. + for p.consume(',') { + p.skipSpace() + } + if p.empty() { + break + } } return list, nil } diff --git a/src/net/mail/message_test.go b/src/net/mail/message_test.go index 75db767547..67e3643aeb 100644 --- a/src/net/mail/message_test.go +++ b/src/net/mail/message_test.go @@ -445,6 +445,19 @@ func TestAddressParsing(t *testing.T) { }, }, }, + { + ` , joe@where.test,,John ,,`, + []*Address{ + { + Name: "", + Address: "joe@where.test", + }, + { + Name: "John", + Address: "jdoe@one.test", + }, + }, + }, { `Group1: ;, Group 2: addr2@example.com;, John `, []*Address{ @@ -1067,3 +1080,22 @@ func TestAddressFormattingAndParsing(t *testing.T) { } } } + +func TestEmptyAddress(t *testing.T) { + parsed, err := ParseAddress("") + if parsed != nil || err == nil { + t.Errorf(`ParseAddress("") = %v, %v, want nil, error`, parsed, err) + } + list, err := ParseAddressList("") + if len(list) > 0 || err == nil { + t.Errorf(`ParseAddressList("") = %v, %v, want nil, error`, list, err) + } + list, err = ParseAddressList(",") + if len(list) > 0 || err == nil { + t.Errorf(`ParseAddressList("") = %v, %v, want nil, error`, list, err) + } + list, err = ParseAddressList("a@b c@d") + if len(list) > 0 || err == nil { + t.Errorf(`ParseAddressList("") = %v, %v, want nil, error`, list, err) + } +} -- GitLab From 346efc28508dc358cba7e246adeb40bde99cfb2a Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Sun, 12 Jul 2020 16:57:01 -0400 Subject: [PATCH 0353/1792] go/types: better error when converting untyped values in assignments The error returned by convertUntyped is 'cannot convert _ to _', which can be misleading in contexts where an explicit conversion would be allowed. Arguably the error message from convertUntyped should just be 'cannot use _ as _', as 'convert' has an explicit meaning within the spec. Making that change caused a large number of test failures, so for now we just fix this for assignments by interpreting the error. For #22070 Change-Id: I4eed6f39d1a991e8df7e035ec301d28a05150eb5 Reviewed-on: https://go-review.googlesource.com/c/go/+/242083 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/assignments.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/go/types/assignments.go b/src/go/types/assignments.go index 34a9d7843d..9697e504cd 100644 --- a/src/go/types/assignments.go +++ b/src/go/types/assignments.go @@ -7,6 +7,7 @@ package types import ( + "errors" "go/ast" "go/token" ) @@ -43,8 +44,16 @@ func (check *Checker) assignment(x *operand, T Type, context string) { } target = Default(x.typ) } - check.convertUntyped(x, target) - if x.mode == invalid { + if err := check.canConvertUntyped(x, target); err != nil { + var internalErr Error + var msg string + if errors.As(err, &internalErr) { + msg = internalErr.Msg + } else { + msg = err.Error() + } + check.errorf(x.pos(), "cannot use %s as %s value in %s: %v", x, target, context, msg) + x.mode = invalid return } } -- GitLab From 73a5c372410adb272b6a63484c9a9de5e93e986c Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Mon, 24 Aug 2020 10:43:43 -0400 Subject: [PATCH 0354/1792] go/types: add untyped test cases for AssignableTo API The AssignableTo API is specifically for non-constant values, but is currently called by gopls for constant completions. Add a test to ensure that we handle this edge case correctly. Change-Id: I83115cbca2443a783df1c3090b5741260dffb78e Reviewed-on: https://go-review.googlesource.com/c/go/+/250258 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/api_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/go/types/api_test.go b/src/go/types/api_test.go index 798c09bbff..6c129cd01b 100644 --- a/src/go/types/api_test.go +++ b/src/go/types/api_test.go @@ -1243,6 +1243,11 @@ func TestConvertibleTo(t *testing.T) { {newDefined(new(Struct)), new(Struct), true}, {newDefined(Typ[Int]), new(Struct), false}, {Typ[UntypedInt], Typ[Int], true}, + // TODO (rFindley): the below behavior is undefined as non-constant untyped + // string values are not permitted by the spec. But we should consider + // changing this case to return 'true', to have more reasonable behavior in + // cases where the API is used for constant expressions. + {Typ[UntypedString], Typ[String], false}, } { if got := ConvertibleTo(test.v, test.t); got != test.want { t.Errorf("ConvertibleTo(%v, %v) = %t, want %t", test.v, test.t, got, test.want) @@ -1260,6 +1265,14 @@ func TestAssignableTo(t *testing.T) { {newDefined(Typ[Int]), Typ[Int], false}, {newDefined(new(Struct)), new(Struct), true}, {Typ[UntypedBool], Typ[Bool], true}, + {Typ[UntypedString], Typ[Bool], false}, + // TODO (rFindley): the below behavior is undefined as AssignableTo is + // intended for non-constant values (and neither UntypedString or + // UntypedInt assignments arise during normal type checking). But as + // described in TestConvertibleTo above, we should consider changing this + // behavior. + {Typ[UntypedString], Typ[String], false}, + {Typ[UntypedInt], Typ[Int], false}, } { if got := AssignableTo(test.v, test.t); got != test.want { t.Errorf("AssignableTo(%v, %v) = %t, want %t", test.v, test.t, got, test.want) -- GitLab From 17ae5873833fd9a20aae123faf96f3eca9a149ea Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 14 May 2020 07:58:27 -0700 Subject: [PATCH 0355/1792] cmd/compile: use addressing modes pass on s390x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add s390x support to the addressing modes pass. This significantly reduces the number of rules we need to have to handle indexed addressing modes on s390x. There are some changes introduced with the new approach. Notably pointer calculations of the form '(ADD x (ADDconst y [c]))' won't get fully merged into address fields right now, the constant offset will remain separate. That is a relatively minor issue though. file before after Δ % addr2line 4120904 4120960 +56 +0.001% api 4944005 4948765 +4760 +0.096% asm 4977431 4984335 +6904 +0.139% buildid 2683760 2683504 -256 -0.010% cgo 4557976 4558408 +432 +0.009% compile 19103577 18916634 -186943 -0.979% cover 4883694 4885054 +1360 +0.028% dist 3545177 3553689 +8512 +0.240% doc 3921766 3921518 -248 -0.006% fix 3295254 3302182 +6928 +0.210% link 6539222 6540286 +1064 +0.016% nm 4105085 4107757 +2672 +0.065% objdump 4546015 4545439 -576 -0.013% pack 2416661 2415485 -1176 -0.049% pprof 13267433 13265489 -1944 -0.015% test2json 2762180 2761996 -184 -0.007% trace 10145090 10135626 -9464 -0.093% vet 6772946 6771738 -1208 -0.018% total 106588176 106418865 -169311 -0.159% Fixes #37891. Change-Id: If60d51f31eb2806b011432a6519951b8668cb42f Reviewed-on: https://go-review.googlesource.com/c/go/+/250958 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- .../compile/internal/ssa/addressingmodes.go | 65 +- src/cmd/compile/internal/ssa/gen/S390X.rules | 412 +- src/cmd/compile/internal/ssa/rewriteS390X.go | 3795 +---------------- 3 files changed, 145 insertions(+), 4127 deletions(-) diff --git a/src/cmd/compile/internal/ssa/addressingmodes.go b/src/cmd/compile/internal/ssa/addressingmodes.go index 97a5ab4f03..aae0def27f 100644 --- a/src/cmd/compile/internal/ssa/addressingmodes.go +++ b/src/cmd/compile/internal/ssa/addressingmodes.go @@ -7,12 +7,14 @@ package ssa // addressingModes combines address calculations into memory operations // that can perform complicated addressing modes. func addressingModes(f *Func) { + isInImmediateRange := is32Bit switch f.Config.arch { default: // Most architectures can't do this. return case "amd64", "386": - // TODO: s390x? + case "s390x": + isInImmediateRange = is20Bit } var tmp []*Value @@ -40,7 +42,7 @@ func addressingModes(f *Func) { switch [2]auxType{opcodeTable[v.Op].auxType, opcodeTable[p.Op].auxType} { case [2]auxType{auxSymOff, auxInt32}: // TODO: introduce auxSymOff32 - if !is32Bit(v.AuxInt + p.AuxInt) { + if !isInImmediateRange(v.AuxInt + p.AuxInt) { continue } v.AuxInt += p.AuxInt @@ -48,7 +50,7 @@ func addressingModes(f *Func) { if v.Aux != nil && p.Aux != nil { continue } - if !is32Bit(v.AuxInt + p.AuxInt) { + if !isInImmediateRange(v.AuxInt + p.AuxInt) { continue } if p.Aux != nil { @@ -398,4 +400,61 @@ var combine = map[[2]Op]Op{ [2]Op{Op386ANDLconstmodify, Op386LEAL4}: Op386ANDLconstmodifyidx4, [2]Op{Op386ORLconstmodify, Op386LEAL4}: Op386ORLconstmodifyidx4, [2]Op{Op386XORLconstmodify, Op386LEAL4}: Op386XORLconstmodifyidx4, + + // s390x + [2]Op{OpS390XMOVDload, OpS390XADD}: OpS390XMOVDloadidx, + [2]Op{OpS390XMOVWload, OpS390XADD}: OpS390XMOVWloadidx, + [2]Op{OpS390XMOVHload, OpS390XADD}: OpS390XMOVHloadidx, + [2]Op{OpS390XMOVBload, OpS390XADD}: OpS390XMOVBloadidx, + + [2]Op{OpS390XMOVWZload, OpS390XADD}: OpS390XMOVWZloadidx, + [2]Op{OpS390XMOVHZload, OpS390XADD}: OpS390XMOVHZloadidx, + [2]Op{OpS390XMOVBZload, OpS390XADD}: OpS390XMOVBZloadidx, + + [2]Op{OpS390XMOVDBRload, OpS390XADD}: OpS390XMOVDBRloadidx, + [2]Op{OpS390XMOVWBRload, OpS390XADD}: OpS390XMOVWBRloadidx, + [2]Op{OpS390XMOVHBRload, OpS390XADD}: OpS390XMOVHBRloadidx, + + [2]Op{OpS390XFMOVDload, OpS390XADD}: OpS390XFMOVDloadidx, + [2]Op{OpS390XFMOVSload, OpS390XADD}: OpS390XFMOVSloadidx, + + [2]Op{OpS390XMOVDstore, OpS390XADD}: OpS390XMOVDstoreidx, + [2]Op{OpS390XMOVWstore, OpS390XADD}: OpS390XMOVWstoreidx, + [2]Op{OpS390XMOVHstore, OpS390XADD}: OpS390XMOVHstoreidx, + [2]Op{OpS390XMOVBstore, OpS390XADD}: OpS390XMOVBstoreidx, + + [2]Op{OpS390XMOVDBRstore, OpS390XADD}: OpS390XMOVDBRstoreidx, + [2]Op{OpS390XMOVWBRstore, OpS390XADD}: OpS390XMOVWBRstoreidx, + [2]Op{OpS390XMOVHBRstore, OpS390XADD}: OpS390XMOVHBRstoreidx, + + [2]Op{OpS390XFMOVDstore, OpS390XADD}: OpS390XFMOVDstoreidx, + [2]Op{OpS390XFMOVSstore, OpS390XADD}: OpS390XFMOVSstoreidx, + + [2]Op{OpS390XMOVDload, OpS390XMOVDaddridx}: OpS390XMOVDloadidx, + [2]Op{OpS390XMOVWload, OpS390XMOVDaddridx}: OpS390XMOVWloadidx, + [2]Op{OpS390XMOVHload, OpS390XMOVDaddridx}: OpS390XMOVHloadidx, + [2]Op{OpS390XMOVBload, OpS390XMOVDaddridx}: OpS390XMOVBloadidx, + + [2]Op{OpS390XMOVWZload, OpS390XMOVDaddridx}: OpS390XMOVWZloadidx, + [2]Op{OpS390XMOVHZload, OpS390XMOVDaddridx}: OpS390XMOVHZloadidx, + [2]Op{OpS390XMOVBZload, OpS390XMOVDaddridx}: OpS390XMOVBZloadidx, + + [2]Op{OpS390XMOVDBRload, OpS390XMOVDaddridx}: OpS390XMOVDBRloadidx, + [2]Op{OpS390XMOVWBRload, OpS390XMOVDaddridx}: OpS390XMOVWBRloadidx, + [2]Op{OpS390XMOVHBRload, OpS390XMOVDaddridx}: OpS390XMOVHBRloadidx, + + [2]Op{OpS390XFMOVDload, OpS390XMOVDaddridx}: OpS390XFMOVDloadidx, + [2]Op{OpS390XFMOVSload, OpS390XMOVDaddridx}: OpS390XFMOVSloadidx, + + [2]Op{OpS390XMOVDstore, OpS390XMOVDaddridx}: OpS390XMOVDstoreidx, + [2]Op{OpS390XMOVWstore, OpS390XMOVDaddridx}: OpS390XMOVWstoreidx, + [2]Op{OpS390XMOVHstore, OpS390XMOVDaddridx}: OpS390XMOVHstoreidx, + [2]Op{OpS390XMOVBstore, OpS390XMOVDaddridx}: OpS390XMOVBstoreidx, + + [2]Op{OpS390XMOVDBRstore, OpS390XMOVDaddridx}: OpS390XMOVDBRstoreidx, + [2]Op{OpS390XMOVWBRstore, OpS390XMOVDaddridx}: OpS390XMOVWBRstoreidx, + [2]Op{OpS390XMOVHBRstore, OpS390XMOVDaddridx}: OpS390XMOVHBRstoreidx, + + [2]Op{OpS390XFMOVDstore, OpS390XMOVDaddridx}: OpS390XFMOVDstoreidx, + [2]Op{OpS390XFMOVSstore, OpS390XMOVDaddridx}: OpS390XFMOVSstoreidx, } diff --git a/src/cmd/compile/internal/ssa/gen/S390X.rules b/src/cmd/compile/internal/ssa/gen/S390X.rules index f7d391cf3a..e564f638d3 100644 --- a/src/cmd/compile/internal/ssa/gen/S390X.rules +++ b/src/cmd/compile/internal/ssa/gen/S390X.rules @@ -498,27 +498,19 @@ // Remove zero extensions after zero extending load. // Note: take care that if x is spilled it is restored correctly. (MOV(B|H|W)Zreg x:(MOVBZload _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 1) => x -(MOV(B|H|W)Zreg x:(MOVBZloadidx _ _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 1) => x (MOV(H|W)Zreg x:(MOVHZload _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 2) => x -(MOV(H|W)Zreg x:(MOVHZloadidx _ _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 2) => x (MOVWZreg x:(MOVWZload _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 4) => x -(MOVWZreg x:(MOVWZloadidx _ _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 4) => x // Remove sign extensions after sign extending load. // Note: take care that if x is spilled it is restored correctly. (MOV(B|H|W)reg x:(MOVBload _ _)) && (x.Type.IsSigned() || x.Type.Size() == 8) => x -(MOV(B|H|W)reg x:(MOVBloadidx _ _ _)) && (x.Type.IsSigned() || x.Type.Size() == 8) => x (MOV(H|W)reg x:(MOVHload _ _)) && (x.Type.IsSigned() || x.Type.Size() == 8) => x -(MOV(H|W)reg x:(MOVHloadidx _ _ _)) && (x.Type.IsSigned() || x.Type.Size() == 8) => x (MOVWreg x:(MOVWload _ _)) && (x.Type.IsSigned() || x.Type.Size() == 8) => x -(MOVWreg x:(MOVWloadidx _ _ _)) && (x.Type.IsSigned() || x.Type.Size() == 8) => x // Remove sign extensions after zero extending load. // These type checks are probably unnecessary but do them anyway just in case. (MOV(H|W)reg x:(MOVBZload _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 1) => x -(MOV(H|W)reg x:(MOVBZloadidx _ _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 1) => x (MOVWreg x:(MOVHZload _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 2) => x -(MOVWreg x:(MOVHZloadidx _ _ _)) && (!x.Type.IsSigned() || x.Type.Size() > 2) => x // Fold sign and zero extensions into loads. // @@ -538,14 +530,6 @@ && x.Uses == 1 && clobber(x) => @x.Block (MOV(B|H|W)load [o] {s} p mem) -(MOV(B|H|W)Zreg x:(MOV(B|H|W)loadidx [o] {s} p i mem)) - && x.Uses == 1 - && clobber(x) - => @x.Block (MOV(B|H|W)Zloadidx [o] {s} p i mem) -(MOV(B|H|W)reg x:(MOV(B|H|W)Zloadidx [o] {s} p i mem)) - && x.Uses == 1 - && clobber(x) - => @x.Block (MOV(B|H|W)loadidx [o] {s} p i mem) // Remove zero extensions after argument load. (MOVBZreg x:(Arg )) && !t.IsSigned() && t.Size() == 1 => x @@ -753,12 +737,12 @@ // Fold ADD into MOVDaddr. Odd offsets from SB shouldn't be folded (LARL can't handle them). (ADDconst [c] (MOVDaddr [d] {s} x:(SB))) && ((c+d)&1 == 0) && is32Bit(int64(c)+int64(d)) => (MOVDaddr [c+d] {s} x) (ADDconst [c] (MOVDaddr [d] {s} x)) && x.Op != OpSB && is20Bit(int64(c)+int64(d)) => (MOVDaddr [c+d] {s} x) -(ADD idx (MOVDaddr [c] {s} ptr)) && ptr.Op != OpSB && idx.Op != OpSB => (MOVDaddridx [c] {s} ptr idx) +(ADD idx (MOVDaddr [c] {s} ptr)) && ptr.Op != OpSB => (MOVDaddridx [c] {s} ptr idx) // fold ADDconst into MOVDaddrx (ADDconst [c] (MOVDaddridx [d] {s} x y)) && is20Bit(int64(c)+int64(d)) => (MOVDaddridx [c+d] {s} x y) -(MOVDaddridx [c] {s} (ADDconst [d] x) y) && is20Bit(int64(c)+int64(d)) && x.Op != OpSB => (MOVDaddridx [c+d] {s} x y) -(MOVDaddridx [c] {s} x (ADDconst [d] y)) && is20Bit(int64(c)+int64(d)) && y.Op != OpSB => (MOVDaddridx [c+d] {s} x y) +(MOVDaddridx [c] {s} (ADDconst [d] x) y) && is20Bit(int64(c)+int64(d)) => (MOVDaddridx [c+d] {s} x y) +(MOVDaddridx [c] {s} x (ADDconst [d] y)) && is20Bit(int64(c)+int64(d)) => (MOVDaddridx [c+d] {s} x y) // reverse ordering of compare instruction (LOCGR {c} x y (InvertFlags cmp)) => (LOCGR {c.ReverseComparison()} x y cmp) @@ -943,91 +927,6 @@ (MOVBstoreconst [sc] {sym1} (MOVDaddr [off] {sym2} ptr) mem) && ptr.Op != OpSB && canMergeSym(sym1, sym2) && sc.canAdd32(off) => (MOVBstoreconst [sc.addOffset32(off)] {mergeSymTyped(sym1, sym2)} ptr mem) -// generating indexed loads and stores -(MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVBZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) -(MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVBloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) -(MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVHZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) -(MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVHloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) -(MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVWZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) -(MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVWloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) -(MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVDloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) -(FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (FMOVSloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) -(FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (FMOVDloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) - -(MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVBstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) -(MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVHstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) -(MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVWstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) -(MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (MOVDstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) -(FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (FMOVSstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) -(FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) => - (FMOVDstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) - -(MOVBZload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVBZloadidx [off] {sym} ptr idx mem) -(MOVBload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVBloadidx [off] {sym} ptr idx mem) -(MOVHZload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVHZloadidx [off] {sym} ptr idx mem) -(MOVHload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVHloadidx [off] {sym} ptr idx mem) -(MOVWZload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVWZloadidx [off] {sym} ptr idx mem) -(MOVWload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVWloadidx [off] {sym} ptr idx mem) -(MOVDload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (MOVDloadidx [off] {sym} ptr idx mem) -(FMOVSload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (FMOVSloadidx [off] {sym} ptr idx mem) -(FMOVDload [off] {sym} (ADD ptr idx) mem) && ptr.Op != OpSB => (FMOVDloadidx [off] {sym} ptr idx mem) - -(MOVBstore [off] {sym} (ADD ptr idx) val mem) && ptr.Op != OpSB => (MOVBstoreidx [off] {sym} ptr idx val mem) -(MOVHstore [off] {sym} (ADD ptr idx) val mem) && ptr.Op != OpSB => (MOVHstoreidx [off] {sym} ptr idx val mem) -(MOVWstore [off] {sym} (ADD ptr idx) val mem) && ptr.Op != OpSB => (MOVWstoreidx [off] {sym} ptr idx val mem) -(MOVDstore [off] {sym} (ADD ptr idx) val mem) && ptr.Op != OpSB => (MOVDstoreidx [off] {sym} ptr idx val mem) -(FMOVSstore [off] {sym} (ADD ptr idx) val mem) && ptr.Op != OpSB => (FMOVSstoreidx [off] {sym} ptr idx val mem) -(FMOVDstore [off] {sym} (ADD ptr idx) val mem) && ptr.Op != OpSB => (FMOVDstoreidx [off] {sym} ptr idx val mem) - -// combine ADD into indexed loads and stores -(MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVBZloadidx [c+d] {sym} ptr idx mem) -(MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVBloadidx [c+d] {sym} ptr idx mem) -(MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVHZloadidx [c+d] {sym} ptr idx mem) -(MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVHloadidx [c+d] {sym} ptr idx mem) -(MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVWZloadidx [c+d] {sym} ptr idx mem) -(MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVWloadidx [c+d] {sym} ptr idx mem) -(MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (MOVDloadidx [c+d] {sym} ptr idx mem) -(FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (FMOVSloadidx [c+d] {sym} ptr idx mem) -(FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) && is20Bit(int64(c)+int64(d)) => (FMOVDloadidx [c+d] {sym} ptr idx mem) - -(MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (MOVBstoreidx [c+d] {sym} ptr idx val mem) -(MOVHstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (MOVHstoreidx [c+d] {sym} ptr idx val mem) -(MOVWstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (MOVWstoreidx [c+d] {sym} ptr idx val mem) -(MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (MOVDstoreidx [c+d] {sym} ptr idx val mem) -(FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (FMOVSstoreidx [c+d] {sym} ptr idx val mem) -(FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) && is20Bit(int64(c)+int64(d)) => (FMOVDstoreidx [c+d] {sym} ptr idx val mem) - -(MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVBZloadidx [c+d] {sym} ptr idx mem) -(MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVBloadidx [c+d] {sym} ptr idx mem) -(MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVHZloadidx [c+d] {sym} ptr idx mem) -(MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVHloadidx [c+d] {sym} ptr idx mem) -(MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVWZloadidx [c+d] {sym} ptr idx mem) -(MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVWloadidx [c+d] {sym} ptr idx mem) -(MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (MOVDloadidx [c+d] {sym} ptr idx mem) -(FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (FMOVSloadidx [c+d] {sym} ptr idx mem) -(FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) && is20Bit(int64(c)+int64(d)) => (FMOVDloadidx [c+d] {sym} ptr idx mem) - -(MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (MOVBstoreidx [c+d] {sym} ptr idx val mem) -(MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (MOVHstoreidx [c+d] {sym} ptr idx val mem) -(MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (MOVWstoreidx [c+d] {sym} ptr idx val mem) -(MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (MOVDstoreidx [c+d] {sym} ptr idx val mem) -(FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (FMOVSstoreidx [c+d] {sym} ptr idx val mem) -(FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) && is20Bit(int64(c)+int64(d)) => (FMOVDstoreidx [c+d] {sym} ptr idx val mem) - // MOVDaddr into MOVDaddridx (MOVDaddridx [off1] {sym1} (MOVDaddr [off2] {sym2} x) y) && is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) && x.Op != OpSB => (MOVDaddridx [off1+off2] {mergeSymTyped(sym1,sym2)} x y) @@ -1372,47 +1271,6 @@ && clobber(x) => (MOVDstore [i-4] {s} p w0 mem) -(MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVHstoreidx [i-1] {s} p idx w mem) -(MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVHstoreidx [i-1] {s} p idx w0 mem) -(MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVHstoreidx [i-1] {s} p idx w mem) -(MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVHstoreidx [i-1] {s} p idx w0 mem) -(MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVWstoreidx [i-2] {s} p idx w mem) -(MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVWstoreidx [i-2] {s} p idx w0 mem) -(MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVWstoreidx [i-2] {s} p idx w mem) -(MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVWstoreidx [i-2] {s} p idx w0 mem) -(MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVDstoreidx [i-4] {s} p idx w mem) -(MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVDstoreidx [i-4] {s} p idx 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). @@ -1461,47 +1319,6 @@ && clobber(x) => (MOVDBRstore [i-4] {s} p w0 mem) -(MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) - && x.Uses == 1 - && clobber(x) - => (MOVHBRstoreidx [i-1] {s} p idx w mem) -(MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVHBRstoreidx [i-1] {s} p idx w0 mem) -(MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) - && x.Uses == 1 - && clobber(x) - => (MOVHBRstoreidx [i-1] {s} p idx w mem) -(MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVHBRstoreidx [i-1] {s} p idx w0 mem) -(MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) - && x.Uses == 1 - && clobber(x) - => (MOVWBRstoreidx [i-2] {s} p idx w mem) -(MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVWBRstoreidx [i-2] {s} p idx w0 mem) -(MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) - && x.Uses == 1 - && clobber(x) - => (MOVWBRstoreidx [i-2] {s} p idx w mem) -(MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVWBRstoreidx [i-2] {s} p idx w0 mem) -(MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) - && x.Uses == 1 - && clobber(x) - => (MOVDBRstoreidx [i-4] {s} p idx w mem) -(MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) - && x.Uses == 1 - && clobber(x) - => (MOVDBRstoreidx [i-4] {s} p idx w0 mem) - // Combining byte loads into larger (unaligned) loads. // Big-endian loads @@ -1612,114 +1429,6 @@ && clobber(x0, x1, s0, s1, or) => @mergePoint(b,x0,x1,y) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) -// Big-endian indexed loads - -(ORW x1:(MOVBZloadidx [i1] {s} p idx mem) - sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx 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) (MOVHZloadidx [i0] {s} p idx mem) - -(OR x1:(MOVBZloadidx [i1] {s} p idx mem) - sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx 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) (MOVHZloadidx [i0] {s} p idx mem) - -(ORW x1:(MOVHZloadidx [i1] {s} p idx mem) - sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx 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) (MOVWZloadidx [i0] {s} p idx mem) - -(OR x1:(MOVHZloadidx [i1] {s} p idx mem) - sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx 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) (MOVWZloadidx [i0] {s} p idx mem) - -(OR x1:(MOVWZloadidx [i1] {s} p idx mem) - sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx 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) (MOVDloadidx [i0] {s} p idx mem) - -(ORW - s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) - or:(ORW - s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx 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 (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - -(OR - s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) - or:(OR - s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx 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 (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) - -(OR - s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) - or:(OR - s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx 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 (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) - // Little-endian loads (ORW x0:(MOVBZload [i0] {s} p mem) @@ -1835,121 +1544,6 @@ && clobber(x0, x1, r0, r1, s0, s1, or) => @mergePoint(b,x0,x1,y) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) -// Little-endian indexed loads - -(ORW x0:(MOVBZloadidx [i0] {s} p idx mem) - sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx 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 (MOVHBRloadidx [i0] {s} p idx mem)) - -(OR x0:(MOVBZloadidx [i0] {s} p idx mem) - sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx 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 (MOVHBRloadidx [i0] {s} p idx mem)) - -(ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) - sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx 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) (MOVWBRloadidx [i0] {s} p idx mem) - -(OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) - sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx 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 (MOVWBRloadidx [i0] {s} p idx mem)) - -(OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) - sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx 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) (MOVDBRloadidx [i0] {s} p idx mem) - -(ORW - s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) - or:(ORW - s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx 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 (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - -(OR - s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) - or:(OR - s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx 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 (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) - -(OR - s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) - or:(OR - s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx 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 (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) - // Combine stores into store multiples. // 32-bit (MOVWstore [i] {s} p w1 x:(MOVWstore [i-4] {s} p w0 mem)) diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index 2dba8163bc..78a57c2388 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -587,20 +587,12 @@ func rewriteValueS390X(v *Value) bool { return rewriteValueS390X_OpS390XFCMPS(v) case OpS390XFMOVDload: return rewriteValueS390X_OpS390XFMOVDload(v) - case OpS390XFMOVDloadidx: - return rewriteValueS390X_OpS390XFMOVDloadidx(v) case OpS390XFMOVDstore: return rewriteValueS390X_OpS390XFMOVDstore(v) - case OpS390XFMOVDstoreidx: - return rewriteValueS390X_OpS390XFMOVDstoreidx(v) case OpS390XFMOVSload: return rewriteValueS390X_OpS390XFMOVSload(v) - case OpS390XFMOVSloadidx: - return rewriteValueS390X_OpS390XFMOVSloadidx(v) case OpS390XFMOVSstore: return rewriteValueS390X_OpS390XFMOVSstore(v) - case OpS390XFMOVSstoreidx: - return rewriteValueS390X_OpS390XFMOVSstoreidx(v) case OpS390XFNEG: return rewriteValueS390X_OpS390XFNEG(v) case OpS390XFNEGS: @@ -623,78 +615,52 @@ func rewriteValueS390X(v *Value) bool { return rewriteValueS390X_OpS390XLoweredRound64F(v) case OpS390XMOVBZload: return rewriteValueS390X_OpS390XMOVBZload(v) - case OpS390XMOVBZloadidx: - return rewriteValueS390X_OpS390XMOVBZloadidx(v) case OpS390XMOVBZreg: return rewriteValueS390X_OpS390XMOVBZreg(v) case OpS390XMOVBload: return rewriteValueS390X_OpS390XMOVBload(v) - case OpS390XMOVBloadidx: - return rewriteValueS390X_OpS390XMOVBloadidx(v) case OpS390XMOVBreg: return rewriteValueS390X_OpS390XMOVBreg(v) case OpS390XMOVBstore: return rewriteValueS390X_OpS390XMOVBstore(v) case OpS390XMOVBstoreconst: return rewriteValueS390X_OpS390XMOVBstoreconst(v) - case OpS390XMOVBstoreidx: - return rewriteValueS390X_OpS390XMOVBstoreidx(v) case OpS390XMOVDaddridx: return rewriteValueS390X_OpS390XMOVDaddridx(v) case OpS390XMOVDload: return rewriteValueS390X_OpS390XMOVDload(v) - case OpS390XMOVDloadidx: - return rewriteValueS390X_OpS390XMOVDloadidx(v) case OpS390XMOVDstore: return rewriteValueS390X_OpS390XMOVDstore(v) case OpS390XMOVDstoreconst: return rewriteValueS390X_OpS390XMOVDstoreconst(v) - case OpS390XMOVDstoreidx: - return rewriteValueS390X_OpS390XMOVDstoreidx(v) case OpS390XMOVHBRstore: return rewriteValueS390X_OpS390XMOVHBRstore(v) - case OpS390XMOVHBRstoreidx: - return rewriteValueS390X_OpS390XMOVHBRstoreidx(v) case OpS390XMOVHZload: return rewriteValueS390X_OpS390XMOVHZload(v) - case OpS390XMOVHZloadidx: - return rewriteValueS390X_OpS390XMOVHZloadidx(v) case OpS390XMOVHZreg: return rewriteValueS390X_OpS390XMOVHZreg(v) case OpS390XMOVHload: return rewriteValueS390X_OpS390XMOVHload(v) - case OpS390XMOVHloadidx: - return rewriteValueS390X_OpS390XMOVHloadidx(v) case OpS390XMOVHreg: return rewriteValueS390X_OpS390XMOVHreg(v) case OpS390XMOVHstore: return rewriteValueS390X_OpS390XMOVHstore(v) case OpS390XMOVHstoreconst: return rewriteValueS390X_OpS390XMOVHstoreconst(v) - case OpS390XMOVHstoreidx: - return rewriteValueS390X_OpS390XMOVHstoreidx(v) case OpS390XMOVWBRstore: return rewriteValueS390X_OpS390XMOVWBRstore(v) - case OpS390XMOVWBRstoreidx: - return rewriteValueS390X_OpS390XMOVWBRstoreidx(v) case OpS390XMOVWZload: return rewriteValueS390X_OpS390XMOVWZload(v) - case OpS390XMOVWZloadidx: - return rewriteValueS390X_OpS390XMOVWZloadidx(v) case OpS390XMOVWZreg: return rewriteValueS390X_OpS390XMOVWZreg(v) case OpS390XMOVWload: return rewriteValueS390X_OpS390XMOVWload(v) - case OpS390XMOVWloadidx: - return rewriteValueS390X_OpS390XMOVWloadidx(v) case OpS390XMOVWreg: return rewriteValueS390X_OpS390XMOVWreg(v) case OpS390XMOVWstore: return rewriteValueS390X_OpS390XMOVWstore(v) case OpS390XMOVWstoreconst: return rewriteValueS390X_OpS390XMOVWstoreconst(v) - case OpS390XMOVWstoreidx: - return rewriteValueS390X_OpS390XMOVWstoreidx(v) case OpS390XMULLD: return rewriteValueS390X_OpS390XMULLD(v) case OpS390XMULLDconst: @@ -5325,7 +5291,7 @@ func rewriteValueS390X_OpS390XADD(v *Value) bool { break } // match: (ADD idx (MOVDaddr [c] {s} ptr)) - // cond: ptr.Op != OpSB && idx.Op != OpSB + // cond: ptr.Op != OpSB // result: (MOVDaddridx [c] {s} ptr idx) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { @@ -5336,7 +5302,7 @@ func rewriteValueS390X_OpS390XADD(v *Value) bool { c := auxIntToInt32(v_1.AuxInt) s := auxToSym(v_1.Aux) ptr := v_1.Args[0] - if !(ptr.Op != OpSB && idx.Op != OpSB) { + if !(ptr.Op != OpSB) { continue } v.reset(OpS390XMOVDaddridx) @@ -7487,106 +7453,6 @@ func rewriteValueS390X_OpS390XFMOVDload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (FMOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (FMOVDloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XFMOVDloadidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (FMOVDload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (FMOVDloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XFMOVDloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XFMOVDloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (FMOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADDconst { - break - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - break - } - v.reset(OpS390XFMOVDloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (FMOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (FMOVDloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - ptr := v_0 - if v_1.Op != OpS390XADDconst { - break - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - break - } - v.reset(OpS390XFMOVDloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } return false } func rewriteValueS390X_OpS390XFMOVDstore(v *Value) bool { @@ -7638,111 +7504,6 @@ func rewriteValueS390X_OpS390XFMOVDstore(v *Value) bool { v.AddArg3(base, val, mem) return true } - // match: (FMOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (FMOVDstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v_1 - mem := v_2 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg4(ptr, idx, val, mem) - return true - } - // match: (FMOVDstore [off] {sym} (ADD ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (FMOVDstoreidx [off] {sym} ptr idx val mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - val := v_1 - mem := v_2 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XFMOVDstoreidx(v *Value) bool { - v_3 := v.Args[3] - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (FMOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADDconst { - break - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - break - } - v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - // match: (FMOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (FMOVDstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - ptr := v_0 - if v_1.Op != OpS390XADDconst { - break - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - break - } - v.reset(OpS390XFMOVDstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } return false } func rewriteValueS390X_OpS390XFMOVSload(v *Value) bool { @@ -7809,106 +7570,6 @@ func rewriteValueS390X_OpS390XFMOVSload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (FMOVSload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (FMOVSloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XFMOVSloadidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (FMOVSload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (FMOVSloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XFMOVSloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XFMOVSloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (FMOVSloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADDconst { - break - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - break - } - v.reset(OpS390XFMOVSloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (FMOVSloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (FMOVSloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - ptr := v_0 - if v_1.Op != OpS390XADDconst { - break - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - break - } - v.reset(OpS390XFMOVSloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } return false } func rewriteValueS390X_OpS390XFMOVSstore(v *Value) bool { @@ -7960,124 +7621,19 @@ func rewriteValueS390X_OpS390XFMOVSstore(v *Value) bool { v.AddArg3(base, val, mem) return true } - // match: (FMOVSstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (FMOVSstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) + return false +} +func rewriteValueS390X_OpS390XFNEG(v *Value) bool { + v_0 := v.Args[0] + // match: (FNEG (LPDFR x)) + // result: (LNDFR x) for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v_1 - mem := v_2 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { + if v_0.Op != OpS390XLPDFR { break } - v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg4(ptr, idx, val, mem) - return true - } - // match: (FMOVSstore [off] {sym} (ADD ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (FMOVSstoreidx [off] {sym} ptr idx val mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - val := v_1 - mem := v_2 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XFMOVSstoreidx(v *Value) bool { - v_3 := v.Args[3] - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (FMOVSstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADDconst { - break - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - break - } - v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - // match: (FMOVSstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (FMOVSstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - ptr := v_0 - if v_1.Op != OpS390XADDconst { - break - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - break - } - v.reset(OpS390XFMOVSstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - return false -} -func rewriteValueS390X_OpS390XFNEG(v *Value) bool { - v_0 := v.Args[0] - // match: (FNEG (LPDFR x)) - // result: (LNDFR x) - for { - if v_0.Op != OpS390XLPDFR { - break - } - x := v_0.Args[0] - v.reset(OpS390XLNDFR) - v.AddArg(x) + x := v_0.Args[0] + v.reset(OpS390XLNDFR) + v.AddArg(x) return true } // match: (FNEG (LNDFR x)) @@ -8559,112 +8115,6 @@ func rewriteValueS390X_OpS390XMOVBZload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (MOVBZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVBZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (MOVBZload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVBZloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVBZloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVBZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - // match: (MOVBZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVBZloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVBZloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } return false } func rewriteValueS390X_OpS390XMOVBZreg(v *Value) bool { @@ -8778,17 +8228,6 @@ func rewriteValueS390X_OpS390XMOVBZreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVBZreg x:(MOVBZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVBZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 1) { - break - } - v.copyOf(x) - return true - } // match: (MOVBZreg x:(MOVBload [o] {s} p mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVBZload [o] {s} p mem) @@ -8813,31 +8252,6 @@ func rewriteValueS390X_OpS390XMOVBZreg(v *Value) bool { v0.AddArg2(p, mem) return true } - // match: (MOVBZreg x:(MOVBloadidx [o] {s} p i mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVBZloadidx [o] {s} p i mem) - for { - t := v.Type - x := v_0 - if x.Op != OpS390XMOVBloadidx { - break - } - o := auxIntToInt32(x.AuxInt) - s := auxToSym(x.Aux) - mem := x.Args[2] - p := x.Args[0] - i := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVBZloadidx, t) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(o) - v0.Aux = symToAux(s) - v0.AddArg3(p, i, mem) - return true - } // match: (MOVBZreg x:(Arg )) // cond: !t.IsSigned() && t.Size() == 1 // result: x @@ -8971,112 +8385,6 @@ func rewriteValueS390X_OpS390XMOVBload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (MOVBload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVBloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (MOVBload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVBloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVBloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVBloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVBloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - // match: (MOVBloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVBloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVBloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } return false } func rewriteValueS390X_OpS390XMOVBreg(v *Value) bool { @@ -9190,17 +8498,6 @@ func rewriteValueS390X_OpS390XMOVBreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVBreg x:(MOVBloadidx _ _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVBloadidx || !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.copyOf(x) - return true - } // match: (MOVBreg x:(MOVBZload [o] {s} p mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVBload [o] {s} p mem) @@ -9225,34 +8522,9 @@ func rewriteValueS390X_OpS390XMOVBreg(v *Value) bool { v0.AddArg2(p, mem) return true } - // match: (MOVBreg x:(MOVBZloadidx [o] {s} p i mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVBloadidx [o] {s} p i mem) - for { - t := v.Type - x := v_0 - if x.Op != OpS390XMOVBZloadidx { - break - } - o := auxIntToInt32(x.AuxInt) - s := auxToSym(x.Aux) - mem := x.Args[2] - p := x.Args[0] - i := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVBloadidx, t) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(o) - v0.Aux = symToAux(s) - v0.AddArg3(p, i, mem) - return true - } - // match: (MOVBreg x:(Arg )) - // cond: t.IsSigned() && t.Size() == 1 - // result: x + // match: (MOVBreg x:(Arg )) + // cond: t.IsSigned() && t.Size() == 1 + // result: x for { x := v_0 if x.Op != OpArg { @@ -9401,58 +8673,6 @@ func rewriteValueS390X_OpS390XMOVBstore(v *Value) bool { v.AddArg3(base, val, mem) return true } - // match: (MOVBstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVBstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v_1 - mem := v_2 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg4(ptr, idx, val, mem) - return true - } - // match: (MOVBstore [off] {sym} (ADD ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVBstoreidx [off] {sym} ptr idx val mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - val := v_1 - mem := v_2 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } // 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) @@ -9752,358 +8972,11 @@ func rewriteValueS390X_OpS390XMOVBstoreconst(v *Value) bool { } return false } -func rewriteValueS390X_OpS390XMOVBstoreidx(v *Value) bool { - v_3 := v.Args[3] - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVBstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - // match: (MOVBstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVBstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVBstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w := v_2 - x := v_3 - if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = int32ToAuxInt(i - 1) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVBstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRDconst [j+8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w0 := v_2 - if w0.Op != OpS390XSRDconst { - continue - } - j := auxIntToInt8(w0.AuxInt) - w := w0.Args[0] - x := v_3 - if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = int32ToAuxInt(i - 1) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - // match: (MOVBstoreidx [i] {s} p idx w x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w := v_2 - x := v_3 - if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || auxIntToInt8(x_2.AuxInt) != 8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = int32ToAuxInt(i - 1) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVBstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx (SRWconst [j+8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHstoreidx [i-1] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w0 := v_2 - if w0.Op != OpS390XSRWconst { - continue - } - j := auxIntToInt8(w0.AuxInt) - w := w0.Args[0] - x := v_3 - if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || auxIntToInt8(x_2.AuxInt) != j+8 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = int32ToAuxInt(i - 1) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - // match: (MOVBstoreidx [i] {s} p idx (SRDconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRDconst || auxIntToInt8(v_2.AuxInt) != 8 { - continue - } - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 1) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVBstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRDconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRDconst { - continue - } - j := auxIntToInt8(v_2.AuxInt) - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 1) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - // match: (MOVBstoreidx [i] {s} p idx (SRWconst [8] w) x:(MOVBstoreidx [i-1] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRWconst || auxIntToInt8(v_2.AuxInt) != 8 { - continue - } - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 1) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVBstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVBstoreidx [i-1] {s} p idx w0:(SRWconst [j-8] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVHBRstoreidx [i-1] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRWconst { - continue - } - j := auxIntToInt8(v_2.AuxInt) - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVBstoreidx || auxIntToInt32(x.AuxInt) != i-1 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || auxIntToInt8(w0.AuxInt) != j-8 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVHBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 1) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - return false -} func rewriteValueS390X_OpS390XMOVDaddridx(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVDaddridx [c] {s} (ADDconst [d] x) y) - // cond: is20Bit(int64(c)+int64(d)) && x.Op != OpSB + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVDaddridx [c+d] {s} x y) for { c := auxIntToInt32(v.AuxInt) @@ -10114,7 +8987,7 @@ func rewriteValueS390X_OpS390XMOVDaddridx(v *Value) bool { d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is20Bit(int64(c)+int64(d)) && x.Op != OpSB) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XMOVDaddridx) @@ -10124,7 +8997,7 @@ func rewriteValueS390X_OpS390XMOVDaddridx(v *Value) bool { return true } // match: (MOVDaddridx [c] {s} x (ADDconst [d] y)) - // cond: is20Bit(int64(c)+int64(d)) && y.Op != OpSB + // cond: is20Bit(int64(c)+int64(d)) // result: (MOVDaddridx [c+d] {s} x y) for { c := auxIntToInt32(v.AuxInt) @@ -10135,7 +9008,7 @@ func rewriteValueS390X_OpS390XMOVDaddridx(v *Value) bool { } d := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] - if !(is20Bit(int64(c)+int64(d)) && y.Op != OpSB) { + if !(is20Bit(int64(c) + int64(d))) { break } v.reset(OpS390XMOVDaddridx) @@ -10274,138 +9147,32 @@ func rewriteValueS390X_OpS390XMOVDload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (MOVDload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVDloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) + return false +} +func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { + v_2 := v.Args[2] + v_1 := v.Args[1] + v_0 := v.Args[0] + // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) + // cond: is20Bit(int64(off1)+int64(off2)) + // result: (MOVDstore [off1+off2] {sym} ptr val mem) for { off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { + sym := auxToSym(v.Aux) + if v_0.Op != OpS390XADDconst { break } off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { + val := v_1 + mem := v_2 + if !(is20Bit(int64(off1) + int64(off2))) { break } - v.reset(OpS390XMOVDloadidx) + v.reset(OpS390XMOVDstore) v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (MOVDload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVDloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVDloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVDloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVDloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - // match: (MOVDloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVDloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVDloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVDstore [off1] {sym} (ADDconst [off2] ptr) val mem) - // cond: is20Bit(int64(off1)+int64(off2)) - // result: (MOVDstore [off1+off2] {sym} ptr val mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADDconst { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - val := v_1 - mem := v_2 - if !(is20Bit(int64(off1) + int64(off2))) { - break - } - v.reset(OpS390XMOVDstore) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(sym) - v.AddArg3(ptr, val, mem) + v.Aux = symToAux(sym) + v.AddArg3(ptr, val, mem) return true } // match: (MOVDstore [off] {sym} ptr (MOVDconst [c]) mem) @@ -10453,58 +9220,6 @@ func rewriteValueS390X_OpS390XMOVDstore(v *Value) bool { v.AddArg3(base, val, mem) return true } - // match: (MOVDstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVDstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v_1 - mem := v_2 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg4(ptr, idx, val, mem) - return true - } - // match: (MOVDstore [off] {sym} (ADD ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVDstoreidx [off] {sym} ptr idx val mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - val := v_1 - mem := v_2 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } // match: (MOVDstore [i] {s} p w1 x:(MOVDstore [i-8] {s} p w0 mem)) // cond: p.Op != OpSB && x.Uses == 1 && is20Bit(int64(i)-8) && clobber(x) // result: (STMG2 [i-8] {s} p w0 w1 mem) @@ -10636,65 +9351,6 @@ func rewriteValueS390X_OpS390XMOVDstoreconst(v *Value) bool { } return false } -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: (MOVDstoreidx [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - // match: (MOVDstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVDstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - return false -} func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] @@ -10811,155 +9467,6 @@ func rewriteValueS390X_OpS390XMOVHBRstore(v *Value) bool { } return false } -func rewriteValueS390X_OpS390XMOVHBRstoreidx(v *Value) bool { - v_3 := v.Args[3] - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRDconst || auxIntToInt8(v_2.AuxInt) != 16 { - continue - } - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVHBRstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 2) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVHBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRDconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRDconst { - continue - } - j := auxIntToInt8(v_2.AuxInt) - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVHBRstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 2) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [16] w) x:(MOVHBRstoreidx [i-2] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRWconst || auxIntToInt8(v_2.AuxInt) != 16 { - continue - } - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVHBRstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 2) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVHBRstoreidx [i] {s} p idx (SRWconst [j] w) x:(MOVHBRstoreidx [i-2] {s} p idx w0:(SRWconst [j-16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWBRstoreidx [i-2] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRWconst { - continue - } - j := auxIntToInt8(v_2.AuxInt) - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVHBRstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - w0 := x.Args[2] - if w0.Op != OpS390XSRWconst || auxIntToInt8(w0.AuxInt) != j-16 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVWBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 2) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - return false -} func rewriteValueS390X_OpS390XMOVHZload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -11026,137 +9533,31 @@ func rewriteValueS390X_OpS390XMOVHZload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (MOVHZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVHZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) + return false +} +func rewriteValueS390X_OpS390XMOVHZreg(v *Value) bool { + v_0 := v.Args[0] + b := v.Block + typ := &b.Func.Config.Types + // match: (MOVHZreg e:(MOVBZreg x)) + // cond: clobberIfDead(e) + // result: (MOVBZreg x) for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { + e := v_0 + if e.Op != OpS390XMOVBZreg { break } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { + x := e.Args[0] + if !(clobberIfDead(e)) { break } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) + v.reset(OpS390XMOVBZreg) + v.AddArg(x) return true } - // match: (MOVHZload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVHZloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVHZloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVHZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - // match: (MOVHZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVHZloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVHZloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVHZreg(v *Value) bool { - v_0 := v.Args[0] - b := v.Block - typ := &b.Func.Config.Types - // match: (MOVHZreg e:(MOVBZreg x)) - // cond: clobberIfDead(e) - // result: (MOVBZreg x) - for { - e := v_0 - if e.Op != OpS390XMOVBZreg { - break - } - x := e.Args[0] - if !(clobberIfDead(e)) { - break - } - v.reset(OpS390XMOVBZreg) - v.AddArg(x) - return true - } - // match: (MOVHZreg e:(MOVHreg x)) - // cond: clobberIfDead(e) - // result: (MOVHZreg x) + // match: (MOVHZreg e:(MOVHreg x)) + // cond: clobberIfDead(e) + // result: (MOVHZreg x) for { e := v_0 if e.Op != OpS390XMOVHreg { @@ -11229,17 +9630,6 @@ func rewriteValueS390X_OpS390XMOVHZreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVHZreg x:(MOVBZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVBZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 1) { - break - } - v.copyOf(x) - return true - } // match: (MOVHZreg x:(MOVHZload _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) // result: x @@ -11251,17 +9641,6 @@ func rewriteValueS390X_OpS390XMOVHZreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVHZreg x:(MOVHZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVHZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 2) { - break - } - v.copyOf(x) - return true - } // match: (MOVHZreg x:(MOVHload [o] {s} p mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVHZload [o] {s} p mem) @@ -11286,31 +9665,6 @@ func rewriteValueS390X_OpS390XMOVHZreg(v *Value) bool { v0.AddArg2(p, mem) return true } - // match: (MOVHZreg x:(MOVHloadidx [o] {s} p i mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVHZloadidx [o] {s} p i mem) - for { - t := v.Type - x := v_0 - if x.Op != OpS390XMOVHloadidx { - break - } - o := auxIntToInt32(x.AuxInt) - s := auxToSym(x.Aux) - mem := x.Args[2] - p := x.Args[0] - i := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, t) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(o) - v0.Aux = symToAux(s) - v0.AddArg3(p, i, mem) - return true - } // match: (MOVHZreg x:(Arg )) // cond: !t.IsSigned() && t.Size() <= 2 // result: x @@ -11420,112 +9774,6 @@ func rewriteValueS390X_OpS390XMOVHload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (MOVHload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVHloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (MOVHload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVHloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVHloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVHloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVHloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - // match: (MOVHloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVHloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVHloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } return false } func rewriteValueS390X_OpS390XMOVHreg(v *Value) bool { @@ -11623,17 +9871,6 @@ func rewriteValueS390X_OpS390XMOVHreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVHreg x:(MOVBloadidx _ _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVBloadidx || !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.copyOf(x) - return true - } // match: (MOVHreg x:(MOVHload _ _)) // cond: (x.Type.IsSigned() || x.Type.Size() == 8) // result: x @@ -11645,17 +9882,6 @@ func rewriteValueS390X_OpS390XMOVHreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVHreg x:(MOVHloadidx _ _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVHloadidx || !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.copyOf(x) - return true - } // match: (MOVHreg x:(MOVBZload _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) // result: x @@ -11667,17 +9893,6 @@ func rewriteValueS390X_OpS390XMOVHreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVHreg x:(MOVBZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVBZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 1) { - break - } - v.copyOf(x) - return true - } // match: (MOVHreg x:(MOVHZload [o] {s} p mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVHload [o] {s} p mem) @@ -11702,31 +9917,6 @@ func rewriteValueS390X_OpS390XMOVHreg(v *Value) bool { v0.AddArg2(p, mem) return true } - // match: (MOVHreg x:(MOVHZloadidx [o] {s} p i mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVHloadidx [o] {s} p i mem) - for { - t := v.Type - x := v_0 - if x.Op != OpS390XMOVHZloadidx { - break - } - o := auxIntToInt32(x.AuxInt) - s := auxToSym(x.Aux) - mem := x.Args[2] - p := x.Args[0] - i := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVHloadidx, t) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(o) - v0.Aux = symToAux(s) - v0.AddArg3(p, i, mem) - return true - } // match: (MOVHreg x:(Arg )) // cond: t.IsSigned() && t.Size() <= 2 // result: x @@ -11879,72 +10069,20 @@ func rewriteValueS390X_OpS390XMOVHstore(v *Value) bool { v.AddArg3(base, val, mem) return true } - // match: (MOVHstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVHstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) + // 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) for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { + 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 } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v_1 - mem := v_2 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg4(ptr, idx, val, mem) - return true - } - // match: (MOVHstore [off] {sym} (ADD ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVHstoreidx [off] {sym} ptr idx val mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - val := v_1 - mem := v_2 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - // 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) - 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] { + mem := x.Args[2] + if p != x.Args[0] { break } x_1 := x.Args[1] @@ -12124,211 +10262,6 @@ func rewriteValueS390X_OpS390XMOVHstoreconst(v *Value) bool { } 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 [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - // match: (MOVHstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVHstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVHstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w := v_2 - x := v_3 - if x.Op != OpS390XMOVHstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = int32ToAuxInt(i - 2) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVHstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRDconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w0 := v_2 - if w0.Op != OpS390XSRDconst { - continue - } - j := auxIntToInt8(w0.AuxInt) - w := w0.Args[0] - x := v_3 - if x.Op != OpS390XMOVHstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = int32ToAuxInt(i - 2) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - // match: (MOVHstoreidx [i] {s} p idx w x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w := v_2 - x := v_3 - if x.Op != OpS390XMOVHstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || auxIntToInt8(x_2.AuxInt) != 16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = int32ToAuxInt(i - 2) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVHstoreidx [i] {s} p idx w0:(SRWconst [j] w) x:(MOVHstoreidx [i-2] {s} p idx (SRWconst [j+16] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVWstoreidx [i-2] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w0 := v_2 - if w0.Op != OpS390XSRWconst { - continue - } - j := auxIntToInt8(w0.AuxInt) - w := w0.Args[0] - x := v_3 - if x.Op != OpS390XMOVHstoreidx || auxIntToInt32(x.AuxInt) != i-2 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRWconst || auxIntToInt8(x_2.AuxInt) != j+16 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = int32ToAuxInt(i - 2) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - return false -} func rewriteValueS390X_OpS390XMOVWBRstore(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] @@ -12390,84 +10323,6 @@ func rewriteValueS390X_OpS390XMOVWBRstore(v *Value) bool { } return false } -func rewriteValueS390X_OpS390XMOVWBRstoreidx(v *Value) bool { - v_3 := v.Args[3] - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [32] w) x:(MOVWBRstoreidx [i-4] {s} p idx w mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRDconst || auxIntToInt8(v_2.AuxInt) != 32 { - continue - } - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVWBRstoreidx || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 || w != x.Args[2] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 4) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVWBRstoreidx [i] {s} p idx (SRDconst [j] w) x:(MOVWBRstoreidx [i-4] {s} p idx w0:(SRDconst [j-32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDBRstoreidx [i-4] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - if v_2.Op != OpS390XSRDconst { - continue - } - j := auxIntToInt8(v_2.AuxInt) - w := v_2.Args[0] - x := v_3 - if x.Op != OpS390XMOVWBRstoreidx || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - w0 := x.Args[2] - if w0.Op != OpS390XSRDconst || auxIntToInt8(w0.AuxInt) != j-32 || w != w0.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVDBRstoreidx) - v.AuxInt = int32ToAuxInt(i - 4) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - return false -} func rewriteValueS390X_OpS390XMOVWZload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -12534,112 +10389,6 @@ func rewriteValueS390X_OpS390XMOVWZload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (MOVWZload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVWZloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (MOVWZload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVWZloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVWZloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVWZloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - // match: (MOVWZloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVWZloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVWZloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } return false } func rewriteValueS390X_OpS390XMOVWZreg(v *Value) bool { @@ -12720,17 +10469,6 @@ func rewriteValueS390X_OpS390XMOVWZreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVWZreg x:(MOVBZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVBZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 1) { - break - } - v.copyOf(x) - return true - } // match: (MOVWZreg x:(MOVHZload _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) // result: x @@ -12742,17 +10480,6 @@ func rewriteValueS390X_OpS390XMOVWZreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVWZreg x:(MOVHZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVHZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 2) { - break - } - v.copyOf(x) - return true - } // match: (MOVWZreg x:(MOVWZload _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 4) // result: x @@ -12764,17 +10491,6 @@ func rewriteValueS390X_OpS390XMOVWZreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVWZreg x:(MOVWZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 4) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVWZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 4) { - break - } - v.copyOf(x) - return true - } // match: (MOVWZreg x:(MOVWload [o] {s} p mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVWZload [o] {s} p mem) @@ -12799,31 +10515,6 @@ func rewriteValueS390X_OpS390XMOVWZreg(v *Value) bool { v0.AddArg2(p, mem) return true } - // match: (MOVWZreg x:(MOVWloadidx [o] {s} p i mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWZloadidx [o] {s} p i mem) - for { - t := v.Type - x := v_0 - if x.Op != OpS390XMOVWloadidx { - break - } - o := auxIntToInt32(x.AuxInt) - s := auxToSym(x.Aux) - mem := x.Args[2] - p := x.Args[0] - i := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, t) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(o) - v0.Aux = symToAux(s) - v0.AddArg3(p, i, mem) - return true - } // match: (MOVWZreg x:(Arg )) // cond: !t.IsSigned() && t.Size() <= 4 // result: x @@ -12918,112 +10609,6 @@ func rewriteValueS390X_OpS390XMOVWload(v *Value) bool { v.AddArg2(base, mem) return true } - // match: (MOVWload [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVWloadidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - mem := v_1 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg3(ptr, idx, mem) - return true - } - // match: (MOVWload [off] {sym} (ADD ptr idx) mem) - // cond: ptr.Op != OpSB - // result: (MOVWloadidx [off] {sym} ptr idx mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - mem := v_1 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - return false -} -func rewriteValueS390X_OpS390XMOVWloadidx(v *Value) bool { - v_2 := v.Args[2] - v_1 := v.Args[1] - v_0 := v.Args[0] - // match: (MOVWloadidx [c] {sym} (ADDconst [d] ptr) idx mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVWloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } - // match: (MOVWloadidx [c] {sym} ptr (ADDconst [d] idx) mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVWloadidx [c+d] {sym} ptr idx mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - mem := v_2 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVWloadidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg3(ptr, idx, mem) - return true - } - break - } return false } func rewriteValueS390X_OpS390XMOVWreg(v *Value) bool { @@ -13098,84 +10683,40 @@ func rewriteValueS390X_OpS390XMOVWreg(v *Value) bool { // result: x for { x := v_0 - if x.Op != OpS390XMOVBload || !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.copyOf(x) - return true - } - // match: (MOVWreg x:(MOVBloadidx _ _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVBloadidx || !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.copyOf(x) - return true - } - // match: (MOVWreg x:(MOVHload _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVHload || !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.copyOf(x) - return true - } - // match: (MOVWreg x:(MOVHloadidx _ _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVHloadidx || !(x.Type.IsSigned() || x.Type.Size() == 8) { - break - } - v.copyOf(x) - return true - } - // match: (MOVWreg x:(MOVWload _ _)) - // cond: (x.Type.IsSigned() || x.Type.Size() == 8) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVWload || !(x.Type.IsSigned() || x.Type.Size() == 8) { + if x.Op != OpS390XMOVBload || !(x.Type.IsSigned() || x.Type.Size() == 8) { break } v.copyOf(x) return true } - // match: (MOVWreg x:(MOVWloadidx _ _ _)) + // match: (MOVWreg x:(MOVHload _ _)) // cond: (x.Type.IsSigned() || x.Type.Size() == 8) // result: x for { x := v_0 - if x.Op != OpS390XMOVWloadidx || !(x.Type.IsSigned() || x.Type.Size() == 8) { + if x.Op != OpS390XMOVHload || !(x.Type.IsSigned() || x.Type.Size() == 8) { break } v.copyOf(x) return true } - // match: (MOVWreg x:(MOVBZload _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) + // match: (MOVWreg x:(MOVWload _ _)) + // cond: (x.Type.IsSigned() || x.Type.Size() == 8) // result: x for { x := v_0 - if x.Op != OpS390XMOVBZload || !(!x.Type.IsSigned() || x.Type.Size() > 1) { + if x.Op != OpS390XMOVWload || !(x.Type.IsSigned() || x.Type.Size() == 8) { break } v.copyOf(x) return true } - // match: (MOVWreg x:(MOVBZloadidx _ _ _)) + // match: (MOVWreg x:(MOVBZload _ _)) // cond: (!x.Type.IsSigned() || x.Type.Size() > 1) // result: x for { x := v_0 - if x.Op != OpS390XMOVBZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 1) { + if x.Op != OpS390XMOVBZload || !(!x.Type.IsSigned() || x.Type.Size() > 1) { break } v.copyOf(x) @@ -13192,17 +10733,6 @@ func rewriteValueS390X_OpS390XMOVWreg(v *Value) bool { v.copyOf(x) return true } - // match: (MOVWreg x:(MOVHZloadidx _ _ _)) - // cond: (!x.Type.IsSigned() || x.Type.Size() > 2) - // result: x - for { - x := v_0 - if x.Op != OpS390XMOVHZloadidx || !(!x.Type.IsSigned() || x.Type.Size() > 2) { - break - } - v.copyOf(x) - return true - } // match: (MOVWreg x:(MOVWZload [o] {s} p mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVWload [o] {s} p mem) @@ -13227,31 +10757,6 @@ func rewriteValueS390X_OpS390XMOVWreg(v *Value) bool { v0.AddArg2(p, mem) return true } - // match: (MOVWreg x:(MOVWZloadidx [o] {s} p i mem)) - // cond: x.Uses == 1 && clobber(x) - // result: @x.Block (MOVWloadidx [o] {s} p i mem) - for { - t := v.Type - x := v_0 - if x.Op != OpS390XMOVWZloadidx { - break - } - o := auxIntToInt32(x.AuxInt) - s := auxToSym(x.Aux) - mem := x.Args[2] - p := x.Args[0] - i := x.Args[1] - if !(x.Uses == 1 && clobber(x)) { - break - } - b = x.Block - v0 := b.NewValue0(v.Pos, OpS390XMOVWloadidx, t) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(o) - v0.Aux = symToAux(s) - v0.AddArg3(p, i, mem) - return true - } // match: (MOVWreg x:(Arg )) // cond: t.IsSigned() && t.Size() <= 4 // result: x @@ -13385,58 +10890,6 @@ func rewriteValueS390X_OpS390XMOVWstore(v *Value) bool { v.AddArg3(base, val, mem) return true } - // match: (MOVWstore [off1] {sym1} (MOVDaddridx [off2] {sym2} ptr idx) val mem) - // cond: is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2) - // result: (MOVWstoreidx [off1+off2] {mergeSymTyped(sym1,sym2)} ptr idx val mem) - for { - off1 := auxIntToInt32(v.AuxInt) - sym1 := auxToSym(v.Aux) - if v_0.Op != OpS390XMOVDaddridx { - break - } - off2 := auxIntToInt32(v_0.AuxInt) - sym2 := auxToSym(v_0.Aux) - idx := v_0.Args[1] - ptr := v_0.Args[0] - val := v_1 - mem := v_2 - if !(is32Bit(int64(off1)+int64(off2)) && canMergeSym(sym1, sym2)) { - break - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = int32ToAuxInt(off1 + off2) - v.Aux = symToAux(mergeSymTyped(sym1, sym2)) - v.AddArg4(ptr, idx, val, mem) - return true - } - // match: (MOVWstore [off] {sym} (ADD ptr idx) val mem) - // cond: ptr.Op != OpSB - // result: (MOVWstoreidx [off] {sym} ptr idx val mem) - for { - off := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - if v_0.Op != OpS390XADD { - 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 { - ptr := v_0_0 - idx := v_0_1 - val := v_1 - mem := v_2 - if !(ptr.Op != OpSB) { - continue - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = int32ToAuxInt(off) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } // 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) @@ -13653,138 +11106,6 @@ func rewriteValueS390X_OpS390XMOVWstoreconst(v *Value) bool { } 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 [c] {sym} (ADDconst [d] ptr) idx val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_0.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_0.AuxInt) - ptr := v_0.Args[0] - idx := v_1 - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - // match: (MOVWstoreidx [c] {sym} ptr (ADDconst [d] idx) val mem) - // cond: is20Bit(int64(c)+int64(d)) - // result: (MOVWstoreidx [c+d] {sym} ptr idx val mem) - for { - c := auxIntToInt32(v.AuxInt) - sym := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - ptr := v_0 - if v_1.Op != OpS390XADDconst { - continue - } - d := auxIntToInt32(v_1.AuxInt) - idx := v_1.Args[0] - val := v_2 - mem := v_3 - if !(is20Bit(int64(c) + int64(d))) { - continue - } - v.reset(OpS390XMOVWstoreidx) - v.AuxInt = int32ToAuxInt(c + d) - v.Aux = symToAux(sym) - v.AddArg4(ptr, idx, val, mem) - return true - } - break - } - // match: (MOVWstoreidx [i] {s} p idx w x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w := v_2 - x := v_3 - if x.Op != OpS390XMOVWstoreidx || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != 32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = int32ToAuxInt(i - 4) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w, mem) - return true - } - } - break - } - // match: (MOVWstoreidx [i] {s} p idx w0:(SRDconst [j] w) x:(MOVWstoreidx [i-4] {s} p idx (SRDconst [j+32] w) mem)) - // cond: x.Uses == 1 && clobber(x) - // result: (MOVDstoreidx [i-4] {s} p idx w0 mem) - for { - i := auxIntToInt32(v.AuxInt) - s := auxToSym(v.Aux) - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - p := v_0 - idx := v_1 - w0 := v_2 - if w0.Op != OpS390XSRDconst { - continue - } - j := auxIntToInt8(w0.AuxInt) - w := w0.Args[0] - x := v_3 - if x.Op != OpS390XMOVWstoreidx || auxIntToInt32(x.AuxInt) != i-4 || auxToSym(x.Aux) != s { - continue - } - mem := x.Args[3] - x_0 := x.Args[0] - x_1 := x.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x_0, x_1 = _i1+1, x_1, x_0 { - if p != x_0 || idx != x_1 { - continue - } - x_2 := x.Args[2] - if x_2.Op != OpS390XSRDconst || auxIntToInt8(x_2.AuxInt) != j+32 || w != x_2.Args[0] || !(x.Uses == 1 && clobber(x)) { - continue - } - v.reset(OpS390XMOVDstoreidx) - v.AuxInt = int32ToAuxInt(i - 4) - v.Aux = symToAux(s) - v.AddArg4(p, idx, w0, mem) - return true - } - } - break - } - return false -} func rewriteValueS390X_OpS390XMULLD(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -14758,301 +12079,13 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { v.copyOf(v0) v1 := b.NewValue0(x1.Pos, OpS390XSLDconst, v.Type) v1.AuxInt = int8ToAuxInt(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 x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLDconst [8] x0:(MOVBZloadidx [i0] {s} p idx 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) (MOVHZloadidx [i0] {s} p idx mem) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - x1 := v_0 - if x1.Op != OpS390XMOVBZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - s := auxToSym(x1.Aux) - mem := x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x1_0, x1_1 = _i1+1, x1_1, x1_0 { - p := x1_0 - idx := x1_1 - sh := v_1 - if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 8 { - continue - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - if auxToSym(x0.Aux) != s { - continue - } - _ = x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x0_0, x0_1 = _i2+1, x0_1, x0_0 { - if p != x0_0 || idx != x0_1 || mem != x0.Args[2] || !(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(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(i0) - v0.Aux = symToAux(s) - v0.AddArg3(p, idx, mem) - return true - } - } - } - break - } - // match: (OR x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx 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) (MOVWZloadidx [i0] {s} p idx mem) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - x1 := v_0 - if x1.Op != OpS390XMOVHZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - s := auxToSym(x1.Aux) - mem := x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x1_0, x1_1 = _i1+1, x1_1, x1_0 { - p := x1_0 - idx := x1_1 - sh := v_1 - if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 16 { - continue - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - if auxToSym(x0.Aux) != s { - continue - } - _ = x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x0_0, x0_1 = _i2+1, x0_1, x0_0 { - if p != x0_0 || idx != x0_1 || mem != x0.Args[2] || !(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(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(i0) - v0.Aux = symToAux(s) - v0.AddArg3(p, idx, mem) - return true - } - } - } - break - } - // match: (OR x1:(MOVWZloadidx [i1] {s} p idx mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} p idx 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) (MOVDloadidx [i0] {s} p idx mem) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - x1 := v_0 - if x1.Op != OpS390XMOVWZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - s := auxToSym(x1.Aux) - mem := x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x1_0, x1_1 = _i1+1, x1_1, x1_0 { - p := x1_0 - idx := x1_1 - sh := v_1 - if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 32 { - continue - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVWZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - if auxToSym(x0.Aux) != s { - continue - } - _ = x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x0_0, x0_1 = _i2+1, x0_1, x0_0 { - if p != x0_0 || idx != x0_1 || mem != x0.Args[2] || !(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(v.Pos, OpS390XMOVDloadidx, typ.UInt64) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(i0) - v0.Aux = symToAux(s) - v0.AddArg3(p, idx, mem) - return true - } - } - } - break - } - // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx 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 (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx 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 := auxIntToInt8(s0.AuxInt) - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - s := auxToSym(x0.Aux) - mem := x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x0_0, x0_1 = _i1+1, x0_1, x0_0 { - p := x0_0 - idx := x0_1 - or := v_1 - if or.Op != OpS390XOR { - continue - } - _ = or.Args[1] - or_0 := or.Args[0] - or_1 := or.Args[1] - for _i2 := 0; _i2 <= 1; _i2, or_0, or_1 = _i2+1, or_1, or_0 { - s1 := or_0 - if s1.Op != OpS390XSLDconst { - continue - } - j1 := auxIntToInt8(s1.AuxInt) - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - if auxToSym(x1.Aux) != s { - continue - } - _ = x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i3 := 0; _i3 <= 1; _i3, x1_0, x1_1 = _i3+1, x1_1, x1_0 { - if p != x1_0 || idx != x1_1 || mem != x1.Args[2] { - 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(v.Pos, OpS390XOR, v.Type) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = int8ToAuxInt(j1) - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = int32ToAuxInt(i0) - v2.Aux = symToAux(s) - v2.AddArg3(p, idx, mem) - v1.AddArg(v2) - v0.AddArg2(v1, y) - return true - } - } - } - } - break - } - // match: (OR s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem)) or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} p idx 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 (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx 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 := auxIntToInt8(s0.AuxInt) - x0 := s0.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - s := auxToSym(x0.Aux) - mem := x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x0_0, x0_1 = _i1+1, x0_1, x0_0 { - p := x0_0 - idx := x0_1 - or := v_1 - if or.Op != OpS390XOR { - continue - } - _ = or.Args[1] - or_0 := or.Args[0] - or_1 := or.Args[1] - for _i2 := 0; _i2 <= 1; _i2, or_0, or_1 = _i2+1, or_1, or_0 { - s1 := or_0 - if s1.Op != OpS390XSLDconst { - continue - } - j1 := auxIntToInt8(s1.AuxInt) - x1 := s1.Args[0] - if x1.Op != OpS390XMOVHZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - if auxToSym(x1.Aux) != s { - continue - } - _ = x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i3 := 0; _i3 <= 1; _i3, x1_0, x1_1 = _i3+1, x1_1, x1_0 { - if p != x1_0 || idx != x1_1 || mem != x1.Args[2] { - 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(v.Pos, OpS390XOR, v.Type) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = int8ToAuxInt(j1) - v2 := b.NewValue0(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v2.AuxInt = int32ToAuxInt(i0) - v2.Aux = symToAux(s) - v2.AddArg3(p, idx, mem) - v1.AddArg(v2) - v0.AddArg2(v1, y) - return true - } - } + 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 @@ -15332,326 +12365,6 @@ func rewriteValueS390X_OpS390XOR(v *Value) bool { } break } - // match: (OR x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLDconst [8] x1:(MOVBZloadidx [i1] {s} p idx 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 (MOVHBRloadidx [i0] {s} p idx mem)) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - x0 := v_0 - if x0.Op != OpS390XMOVBZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - s := auxToSym(x0.Aux) - mem := x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x0_0, x0_1 = _i1+1, x0_1, x0_0 { - p := x0_0 - idx := x0_1 - sh := v_1 - if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 8 { - continue - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - if auxToSym(x1.Aux) != s { - continue - } - _ = x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x1_0, x1_1 = _i2+1, x1_1, x1_0 { - if p != x1_0 || idx != x1_1 || mem != x1.Args[2] || !(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(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = int32ToAuxInt(i0) - v1.Aux = symToAux(s) - v1.AddArg3(p, idx, mem) - v0.AddArg(v1) - return true - } - } - } - break - } - // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx 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 (MOVWBRloadidx [i0] {s} p idx 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 != OpS390XMOVHBRloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - s := auxToSym(x0.Aux) - mem := x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x0_0, x0_1 = _i1+1, x0_1, x0_0 { - p := x0_0 - idx := x0_1 - sh := v_1 - if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 16 { - continue - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - continue - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - if auxToSym(x1.Aux) != s { - continue - } - _ = x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x1_0, x1_1 = _i2+1, x1_1, x1_0 { - if p != x1_0 || idx != x1_1 || mem != x1.Args[2] || !(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(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v1.AuxInt = int32ToAuxInt(i0) - v1.Aux = symToAux(s) - v1.AddArg3(p, idx, mem) - v0.AddArg(v1) - return true - } - } - } - break - } - // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} p idx mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} p idx 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) (MOVDBRloadidx [i0] {s} p idx 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 != OpS390XMOVWBRloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - s := auxToSym(x0.Aux) - mem := x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x0_0, x0_1 = _i1+1, x0_1, x0_0 { - p := x0_0 - idx := x0_1 - sh := v_1 - if sh.Op != OpS390XSLDconst || auxIntToInt8(sh.AuxInt) != 32 { - continue - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVWZreg { - continue - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVWBRloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - if auxToSym(x1.Aux) != s { - continue - } - _ = x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x1_0, x1_1 = _i2+1, x1_1, x1_0 { - if p != x1_0 || idx != x1_1 || mem != x1.Args[2] || !(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(v.Pos, OpS390XMOVDBRloadidx, typ.Int64) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(i0) - v0.Aux = symToAux(s) - v0.AddArg3(p, idx, mem) - return true - } - } - } - break - } - // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx 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 (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx 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 := auxIntToInt8(s1.AuxInt) - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - s := auxToSym(x1.Aux) - mem := x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x1_0, x1_1 = _i1+1, x1_1, x1_0 { - p := x1_0 - idx := x1_1 - or := v_1 - if or.Op != OpS390XOR { - continue - } - _ = or.Args[1] - or_0 := or.Args[0] - or_1 := or.Args[1] - for _i2 := 0; _i2 <= 1; _i2, or_0, or_1 = _i2+1, or_1, or_0 { - s0 := or_0 - if s0.Op != OpS390XSLDconst { - continue - } - j0 := auxIntToInt8(s0.AuxInt) - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - if auxToSym(x0.Aux) != s { - continue - } - _ = x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i3 := 0; _i3 <= 1; _i3, x0_0, x0_1 = _i3+1, x0_1, x0_0 { - if p != x0_0 || idx != x0_1 || mem != x0.Args[2] { - 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(v.Pos, OpS390XOR, v.Type) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = int8ToAuxInt(j0) - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = int32ToAuxInt(i0) - v3.Aux = symToAux(s) - v3.AddArg3(p, idx, mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg2(v1, y) - return true - } - } - } - } - break - } - // match: (OR s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem))) or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx 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 (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx 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 := auxIntToInt8(s1.AuxInt) - r1 := s1.Args[0] - if r1.Op != OpS390XMOVHZreg { - continue - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - s := auxToSym(x1.Aux) - mem := x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x1_0, x1_1 = _i1+1, x1_1, x1_0 { - p := x1_0 - idx := x1_1 - or := v_1 - if or.Op != OpS390XOR { - continue - } - _ = or.Args[1] - or_0 := or.Args[0] - or_1 := or.Args[1] - for _i2 := 0; _i2 <= 1; _i2, or_0, or_1 = _i2+1, or_1, or_0 { - s0 := or_0 - if s0.Op != OpS390XSLDconst { - continue - } - j0 := auxIntToInt8(s0.AuxInt) - r0 := s0.Args[0] - if r0.Op != OpS390XMOVHZreg { - continue - } - x0 := r0.Args[0] - if x0.Op != OpS390XMOVHBRloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - if auxToSym(x0.Aux) != s { - continue - } - _ = x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i3 := 0; _i3 <= 1; _i3, x0_0, x0_1 = _i3+1, x0_1, x0_0 { - if p != x0_0 || idx != x0_1 || mem != x0.Args[2] { - 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(v.Pos, OpS390XOR, v.Type) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLDconst, v.Type) - v1.AuxInt = int8ToAuxInt(j0) - v2 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v3.AuxInt = int32ToAuxInt(i0) - v3.Aux = symToAux(s) - v3.AddArg3(p, idx, mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg2(v1, y) - return true - } - } - } - } - break - } return false } func rewriteValueS390X_OpS390XORW(v *Value) bool { @@ -15904,174 +12617,6 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { } break } - // match: (ORW x1:(MOVBZloadidx [i1] {s} p idx mem) sh:(SLWconst [8] x0:(MOVBZloadidx [i0] {s} p idx 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) (MOVHZloadidx [i0] {s} p idx mem) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - x1 := v_0 - if x1.Op != OpS390XMOVBZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - s := auxToSym(x1.Aux) - mem := x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x1_0, x1_1 = _i1+1, x1_1, x1_0 { - p := x1_0 - idx := x1_1 - sh := v_1 - if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 8 { - continue - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - if auxToSym(x0.Aux) != s { - continue - } - _ = x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x0_0, x0_1 = _i2+1, x0_1, x0_0 { - if p != x0_0 || idx != x0_1 || mem != x0.Args[2] || !(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(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(i0) - v0.Aux = symToAux(s) - v0.AddArg3(p, idx, mem) - return true - } - } - } - break - } - // match: (ORW x1:(MOVHZloadidx [i1] {s} p idx mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx 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) (MOVWZloadidx [i0] {s} p idx mem) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - x1 := v_0 - if x1.Op != OpS390XMOVHZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - s := auxToSym(x1.Aux) - mem := x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x1_0, x1_1 = _i1+1, x1_1, x1_0 { - p := x1_0 - idx := x1_1 - sh := v_1 - if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 16 { - continue - } - x0 := sh.Args[0] - if x0.Op != OpS390XMOVHZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - if auxToSym(x0.Aux) != s { - continue - } - _ = x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x0_0, x0_1 = _i2+1, x0_1, x0_0 { - if p != x0_0 || idx != x0_1 || mem != x0.Args[2] || !(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(v.Pos, OpS390XMOVWZloadidx, typ.UInt32) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(i0) - v0.Aux = symToAux(s) - v0.AddArg3(p, idx, mem) - return true - } - } - } - break - } - // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx 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 (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx 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 := auxIntToInt8(s0.AuxInt) - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - s := auxToSym(x0.Aux) - mem := x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x0_0, x0_1 = _i1+1, x0_1, x0_0 { - p := x0_0 - idx := x0_1 - or := v_1 - if or.Op != OpS390XORW { - continue - } - _ = or.Args[1] - or_0 := or.Args[0] - or_1 := or.Args[1] - for _i2 := 0; _i2 <= 1; _i2, or_0, or_1 = _i2+1, or_1, or_0 { - s1 := or_0 - if s1.Op != OpS390XSLWconst { - continue - } - j1 := auxIntToInt8(s1.AuxInt) - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - if auxToSym(x1.Aux) != s { - continue - } - _ = x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i3 := 0; _i3 <= 1; _i3, x1_0, x1_1 = _i3+1, x1_1, x1_0 { - if p != x1_0 || idx != x1_1 || mem != x1.Args[2] { - 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(v.Pos, OpS390XORW, v.Type) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = int8ToAuxInt(j1) - v2 := b.NewValue0(v.Pos, OpS390XMOVHZloadidx, typ.UInt16) - v2.AuxInt = int32ToAuxInt(i0) - v2.Aux = symToAux(s) - v2.AddArg3(p, idx, 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)) @@ -16225,186 +12770,6 @@ func rewriteValueS390X_OpS390XORW(v *Value) bool { } break } - // match: (ORW x0:(MOVBZloadidx [i0] {s} p idx mem) sh:(SLWconst [8] x1:(MOVBZloadidx [i1] {s} p idx 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 (MOVHBRloadidx [i0] {s} p idx mem)) - for { - for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - x0 := v_0 - if x0.Op != OpS390XMOVBZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - s := auxToSym(x0.Aux) - mem := x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x0_0, x0_1 = _i1+1, x0_1, x0_0 { - p := x0_0 - idx := x0_1 - sh := v_1 - if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 8 { - continue - } - x1 := sh.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - if auxToSym(x1.Aux) != s { - continue - } - _ = x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x1_0, x1_1 = _i2+1, x1_1, x1_0 { - if p != x1_0 || idx != x1_1 || mem != x1.Args[2] || !(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(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v1.AuxInt = int32ToAuxInt(i0) - v1.Aux = symToAux(s) - v1.AddArg3(p, idx, mem) - v0.AddArg(v1) - return true - } - } - } - break - } - // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} p idx mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx 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) (MOVWBRloadidx [i0] {s} p idx 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 != OpS390XMOVHBRloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - s := auxToSym(x0.Aux) - mem := x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x0_0, x0_1 = _i1+1, x0_1, x0_0 { - p := x0_0 - idx := x0_1 - sh := v_1 - if sh.Op != OpS390XSLWconst || auxIntToInt8(sh.AuxInt) != 16 { - continue - } - r1 := sh.Args[0] - if r1.Op != OpS390XMOVHZreg { - continue - } - x1 := r1.Args[0] - if x1.Op != OpS390XMOVHBRloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - if auxToSym(x1.Aux) != s { - continue - } - _ = x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i2 := 0; _i2 <= 1; _i2, x1_0, x1_1 = _i2+1, x1_1, x1_0 { - if p != x1_0 || idx != x1_1 || mem != x1.Args[2] || !(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(v.Pos, OpS390XMOVWBRloadidx, typ.Int32) - v.copyOf(v0) - v0.AuxInt = int32ToAuxInt(i0) - v0.Aux = symToAux(s) - v0.AddArg3(p, idx, mem) - return true - } - } - } - break - } - // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} p idx 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 (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx 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 := auxIntToInt8(s1.AuxInt) - x1 := s1.Args[0] - if x1.Op != OpS390XMOVBZloadidx { - continue - } - i1 := auxIntToInt32(x1.AuxInt) - s := auxToSym(x1.Aux) - mem := x1.Args[2] - x1_0 := x1.Args[0] - x1_1 := x1.Args[1] - for _i1 := 0; _i1 <= 1; _i1, x1_0, x1_1 = _i1+1, x1_1, x1_0 { - p := x1_0 - idx := x1_1 - or := v_1 - if or.Op != OpS390XORW { - continue - } - _ = or.Args[1] - or_0 := or.Args[0] - or_1 := or.Args[1] - for _i2 := 0; _i2 <= 1; _i2, or_0, or_1 = _i2+1, or_1, or_0 { - s0 := or_0 - if s0.Op != OpS390XSLWconst { - continue - } - j0 := auxIntToInt8(s0.AuxInt) - x0 := s0.Args[0] - if x0.Op != OpS390XMOVBZloadidx { - continue - } - i0 := auxIntToInt32(x0.AuxInt) - if auxToSym(x0.Aux) != s { - continue - } - _ = x0.Args[2] - x0_0 := x0.Args[0] - x0_1 := x0.Args[1] - for _i3 := 0; _i3 <= 1; _i3, x0_0, x0_1 = _i3+1, x0_1, x0_0 { - if p != x0_0 || idx != x0_1 || mem != x0.Args[2] { - 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(v.Pos, OpS390XORW, v.Type) - v.copyOf(v0) - v1 := b.NewValue0(v.Pos, OpS390XSLWconst, v.Type) - v1.AuxInt = int8ToAuxInt(j0) - v2 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) - v3 := b.NewValue0(v.Pos, OpS390XMOVHBRloadidx, typ.Int16) - v3.AuxInt = int32ToAuxInt(i0) - v3.Aux = symToAux(s) - v3.AddArg3(p, idx, mem) - v2.AddArg(v3) - v1.AddArg(v2) - v0.AddArg2(v1, y) - return true - } - } - } - } - break - } return false } func rewriteValueS390X_OpS390XORWconst(v *Value) bool { -- GitLab From 3b20d484fbb7a4f64881002f8a63eca42f0e7c29 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Tue, 18 Aug 2020 22:29:22 -0400 Subject: [PATCH 0356/1792] go/types: fix missing Importer for TestBenchmark TestBenchmark is broken due to lack of a Config.Importer, but unfortunately fails silently due to an unchecked error. Fix the importer and check the error. Also improve the output to include allocation stats. Finally, don't run TestBenchmark on go/types by default. If the benchmark is being used during a refactoring of go/types itself, results for go/types will not be comparable. Change-Id: Ib6bdb6807403b3ec99762f535e2496c94bd9b6e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/249517 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Alan Donovan --- src/go/types/self_test.go | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/go/types/self_test.go b/src/go/types/self_test.go index 10ad06fbca..04c9cd3458 100644 --- a/src/go/types/self_test.go +++ b/src/go/types/self_test.go @@ -47,8 +47,13 @@ func TestBenchmark(t *testing.T) { // We're not using testing's benchmarking mechanism directly // because we want custom output. - for _, p := range []string{"types", "constant", filepath.Join("internal", "gcimporter")} { - path := filepath.Join("..", p) + for _, p := range []string{ + "net/http", + "go/parser", + "go/constant", + filepath.Join("go", "internal", "gcimporter"), + } { + path := filepath.Join("..", "..", p) runbench(t, path, false) runbench(t, path, true) fmt.Println() @@ -64,8 +69,13 @@ func runbench(t *testing.T, path string, ignoreFuncBodies bool) { b := testing.Benchmark(func(b *testing.B) { for i := 0; i < b.N; i++ { - conf := Config{IgnoreFuncBodies: ignoreFuncBodies} - conf.Check(path, fset, files, nil) + conf := Config{ + IgnoreFuncBodies: ignoreFuncBodies, + Importer: importer.Default(), + } + if _, err := conf.Check(path, fset, files, nil); err != nil { + t.Fatal(err) + } } }) @@ -77,10 +87,9 @@ func runbench(t *testing.T, path string, ignoreFuncBodies bool) { }) d := time.Duration(b.NsPerOp()) - fmt.Printf( - "%s: %s for %d lines (%d lines/s), ignoreFuncBodies = %v\n", - filepath.Base(path), d, lines, int64(float64(lines)/d.Seconds()), ignoreFuncBodies, - ) + fmt.Printf("%s (ignoreFuncBodies = %v):\n", filepath.Base(path), ignoreFuncBodies) + fmt.Printf("\t%s for %d lines (%.0f lines/s)\n", d, lines, float64(lines)/d.Seconds()) + fmt.Printf("\t%s\n", b.MemString()) } func pkgFiles(fset *token.FileSet, path string) ([]*ast.File, error) { -- GitLab From c00b7081699d3b3ced2970fdae2de6febf638c05 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 26 Aug 2020 23:17:53 -0400 Subject: [PATCH 0357/1792] cmd/go/internal/modfetch: do not use mangled version strings to construct module.VersionErrors Better still would be to avoid passing around module.Version instances with invalid Version strings in the first place, so that any time we see a module.Version we know that it is actually a version of a module (and not a structurally-similar datum with something else tacked on to one of the fields). But that's a bigger cleanup for which I don't currently have enough bandwidth. Fixes #41060 Change-Id: I32fba5619105cbf67dd03691064c82b8ebb3ce18 Reviewed-on: https://go-review.googlesource.com/c/go/+/250951 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modfetch/fetch.go | 14 ++++++++++++-- src/cmd/go/testdata/script/mod_download_json.txt | 2 +- src/cmd/go/testdata/script/mod_sumdb.txt | 6 ++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index e29eb0a942..01d8f007ac 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -503,6 +503,9 @@ func checkGoMod(path, version string, data []byte) error { } // checkModSum checks that the recorded checksum for mod is h. +// +// mod.Version may have the additional suffix "/go.mod" to request the checksum +// for the module's go.mod file only. func checkModSum(mod module.Version, h string) error { // We lock goSum when manipulating it, // but we arrange to release the lock when calling checkSumDB, @@ -579,9 +582,16 @@ func addModSumLocked(mod module.Version, h string) { // checkSumDB checks the mod, h pair against the Go checksum database. // It calls base.Fatalf if the hash is to be rejected. func checkSumDB(mod module.Version, h string) error { + modWithoutSuffix := mod + noun := "module" + if strings.HasSuffix(mod.Version, "/go.mod") { + noun = "go.mod" + modWithoutSuffix.Version = strings.TrimSuffix(mod.Version, "/go.mod") + } + db, lines, err := lookupSumDB(mod) if err != nil { - return module.VersionError(mod, fmt.Errorf("verifying module: %v", err)) + return module.VersionError(modWithoutSuffix, fmt.Errorf("verifying %s: %v", noun, err)) } have := mod.Path + " " + mod.Version + " " + h @@ -591,7 +601,7 @@ func checkSumDB(mod module.Version, h string) error { return nil } if strings.HasPrefix(line, prefix) { - return module.VersionError(mod, fmt.Errorf("verifying module: checksum mismatch\n\tdownloaded: %v\n\t%s: %v"+sumdbMismatch, h, db, line[len(prefix)-len("h1:"):])) + return module.VersionError(modWithoutSuffix, fmt.Errorf("verifying %s: checksum mismatch\n\tdownloaded: %v\n\t%s: %v"+sumdbMismatch, noun, h, db, line[len(prefix)-len("h1:"):])) } } return nil diff --git a/src/cmd/go/testdata/script/mod_download_json.txt b/src/cmd/go/testdata/script/mod_download_json.txt index 26291681ce..9555adf8c4 100644 --- a/src/cmd/go/testdata/script/mod_download_json.txt +++ b/src/cmd/go/testdata/script/mod_download_json.txt @@ -3,7 +3,7 @@ env GOSUMDB=$sumdb' '$proxy/sumdb-wrong # download -json with version should print JSON on sumdb failure ! go mod download -json 'rsc.io/quote@<=v1.5.0' -stdout '"Error": ".*verifying module' +stdout '"Error": ".*verifying (module|go.mod)' -- go.mod -- module m diff --git a/src/cmd/go/testdata/script/mod_sumdb.txt b/src/cmd/go/testdata/script/mod_sumdb.txt index caf97e9699..68bbd9c274 100644 --- a/src/cmd/go/testdata/script/mod_sumdb.txt +++ b/src/cmd/go/testdata/script/mod_sumdb.txt @@ -15,6 +15,12 @@ stderr 'localhost.localdev/sumdb: h1:wrong' stderr 'SECURITY ERROR\nThis download does NOT match the one reported by the checksum server.' ! go get -d rsc.io/sampler ! go get -d golang.org/x/text + +go mod edit -require rsc.io/quote@v1.5.2 +! go list all +stderr 'go: rsc.io/quote@v1.5.2: verifying go.mod: checksum mismatch' +stderr 'SECURITY ERROR\n' + rm go.sum # switching to truthful sumdb detects timeline inconsistency -- GitLab From ac2a1f8796101459a1700d02093745ffe1c821f4 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Tue, 11 Aug 2020 12:49:40 -0400 Subject: [PATCH 0358/1792] go/types: clean up test support code and remove global variables This is a straightforward port of CL 244627. Change-Id: Ide980957430b35e22a6e22818b0ce9de410988af Reviewed-on: https://go-review.googlesource.com/c/go/+/247902 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/stdlib_test.go | 51 +++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/go/types/stdlib_test.go b/src/go/types/stdlib_test.go index 51ee0b1c36..f5a3273fa1 100644 --- a/src/go/types/stdlib_test.go +++ b/src/go/types/stdlib_test.go @@ -27,22 +27,21 @@ import ( . "go/types" ) -var ( - pkgCount int // number of packages processed - start time.Time - - // Use the same importer for all std lib tests to - // avoid repeated importing of the same packages. - stdLibImporter = importer.Default() -) +// Use the same importer for all std lib tests to +// avoid repeated importing of the same packages. +var stdLibImporter = importer.Default() func TestStdlib(t *testing.T) { testenv.MustHaveGoBuild(t) - start = time.Now() - walkDirs(t, filepath.Join(runtime.GOROOT(), "src")) + pkgCount := 0 + duration := walkPkgDirs(filepath.Join(runtime.GOROOT(), "src"), func(dir string, filenames []string) { + typecheck(t, dir, filenames) + pkgCount++ + }, t.Error) + if testing.Verbose() { - fmt.Println(pkgCount, "packages typechecked in", time.Since(start)) + fmt.Println(pkgCount, "packages typechecked in", duration) } } @@ -235,7 +234,6 @@ func typecheck(t *testing.T, path string, filenames []string) { } info := Info{Uses: make(map[*ast.Ident]Object)} conf.Check(path, fset, files, &info) - pkgCount++ // Perform checks of API invariants. @@ -278,39 +276,48 @@ func pkgFilenames(dir string) ([]string, error) { return filenames, nil } -// Note: Could use filepath.Walk instead of walkDirs but that wouldn't -// necessarily be shorter or clearer after adding the code to -// terminate early for -short tests. +func walkPkgDirs(dir string, pkgh func(dir string, filenames []string), errh func(args ...interface{})) time.Duration { + w := walker{time.Now(), 10 * time.Millisecond, pkgh, errh} + w.walk(dir) + return time.Since(w.start) +} -func walkDirs(t *testing.T, dir string) { +type walker struct { + start time.Time + dmax time.Duration + pkgh func(dir string, filenames []string) + errh func(args ...interface{}) +} + +func (w *walker) walk(dir string) { // limit run time for short tests - if testing.Short() && time.Since(start) >= 10*time.Millisecond { + if testing.Short() && time.Since(w.start) >= w.dmax { return } fis, err := ioutil.ReadDir(dir) if err != nil { - t.Error(err) + w.errh(err) return } - // typecheck package in directory + // apply pkgh to the files in directory dir // but ignore files directly under $GOROOT/src (might be temporary test files). if dir != filepath.Join(runtime.GOROOT(), "src") { files, err := pkgFilenames(dir) if err != nil { - t.Error(err) + w.errh(err) return } if files != nil { - typecheck(t, dir, files) + w.pkgh(dir, files) } } // traverse subdirectories, but don't walk into testdata for _, fi := range fis { if fi.IsDir() && fi.Name() != "testdata" { - walkDirs(t, filepath.Join(dir, fi.Name())) + w.walk(filepath.Join(dir, fi.Name())) } } } -- GitLab From 234e37bcda2b5efdd685ad11d1bb3d336415648e Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Tue, 11 Aug 2020 13:21:14 -0400 Subject: [PATCH 0359/1792] go/types: remove need to enumerate fixedbugs test files This is a port of CL 244628, updated to move some existing regression tests into the fixedbugs directory, and to use subtests. Also, 'TestFixed' is renamed to 'TestFixedBugs'. Change-Id: I43aac3f75f2bd850567d08e8b008d91aeb717064 Reviewed-on: https://go-review.googlesource.com/c/go/+/247904 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/check_test.go | 32 +++++++++++++++---- .../{testdata => fixedbugs}/issue23203a.src | 0 .../{testdata => fixedbugs}/issue23203b.src | 0 .../{testdata => fixedbugs}/issue26390.src | 2 ++ .../{testdata => fixedbugs}/issue28251.src | 0 .../{testdata => fixedbugs}/issue6977.src | 0 6 files changed, 28 insertions(+), 6 deletions(-) rename src/go/types/{testdata => fixedbugs}/issue23203a.src (100%) rename src/go/types/{testdata => fixedbugs}/issue23203b.src (100%) rename src/go/types/{testdata => fixedbugs}/issue26390.src (83%) rename src/go/types/{testdata => fixedbugs}/issue28251.src (100%) rename src/go/types/{testdata => fixedbugs}/issue6977.src (100%) diff --git a/src/go/types/check_test.go b/src/go/types/check_test.go index 89122d75ff..e01c3de13b 100644 --- a/src/go/types/check_test.go +++ b/src/go/types/check_test.go @@ -34,6 +34,7 @@ import ( "go/token" "internal/testenv" "io/ioutil" + "path/filepath" "regexp" "strings" "testing" @@ -93,11 +94,6 @@ var tests = [][]string{ {"testdata/issues.src"}, {"testdata/blank.src"}, {"testdata/issue25008b.src", "testdata/issue25008a.src"}, // order (b before a) is crucial! - {"testdata/issue26390.src"}, // stand-alone test to ensure case is triggered - {"testdata/issue23203a.src"}, - {"testdata/issue23203b.src"}, - {"testdata/issue28251.src"}, - {"testdata/issue6977.src"}, } var fset = token.NewFileSet() @@ -259,7 +255,7 @@ func checkFiles(t *testing.T, testfiles []string) { // typecheck and collect typechecker errors var conf Config // special case for importC.src - if len(testfiles) == 1 && testfiles[0] == "testdata/importC.src" { + if len(testfiles) == 1 && strings.HasSuffix(testfiles[0], "importC.src") { conf.FakeImportC = true } conf.Importer = importer.Default() @@ -316,3 +312,27 @@ func TestCheck(t *testing.T) { checkFiles(t, files) } } + +func TestFixedBugs(t *testing.T) { testDir(t, "fixedbugs") } + +func testDir(t *testing.T, dir string) { + testenv.MustHaveGoBuild(t) + + fis, err := ioutil.ReadDir(dir) + if err != nil { + t.Fatal(err) + } + + for _, fi := range fis { + testname := filepath.Base(fi.Name()) + testname = strings.TrimSuffix(testname, filepath.Ext(testname)) + t.Run(testname, func(t *testing.T) { + filename := filepath.Join(dir, fi.Name()) + if fi.IsDir() { + t.Errorf("skipped directory %q", filename) + return + } + checkFiles(t, []string{filename}) + }) + } +} diff --git a/src/go/types/testdata/issue23203a.src b/src/go/types/fixedbugs/issue23203a.src similarity index 100% rename from src/go/types/testdata/issue23203a.src rename to src/go/types/fixedbugs/issue23203a.src diff --git a/src/go/types/testdata/issue23203b.src b/src/go/types/fixedbugs/issue23203b.src similarity index 100% rename from src/go/types/testdata/issue23203b.src rename to src/go/types/fixedbugs/issue23203b.src diff --git a/src/go/types/testdata/issue26390.src b/src/go/types/fixedbugs/issue26390.src similarity index 83% rename from src/go/types/testdata/issue26390.src rename to src/go/types/fixedbugs/issue26390.src index b8e67e9bdd..9e0101f581 100644 --- a/src/go/types/testdata/issue26390.src +++ b/src/go/types/fixedbugs/issue26390.src @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// stand-alone test to ensure case is triggered + package issue26390 type A = T diff --git a/src/go/types/testdata/issue28251.src b/src/go/types/fixedbugs/issue28251.src similarity index 100% rename from src/go/types/testdata/issue28251.src rename to src/go/types/fixedbugs/issue28251.src diff --git a/src/go/types/testdata/issue6977.src b/src/go/types/fixedbugs/issue6977.src similarity index 100% rename from src/go/types/testdata/issue6977.src rename to src/go/types/fixedbugs/issue6977.src -- GitLab From a98fe2632cf144d6ed41daf7255aa912f0e430db Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 24 Aug 2020 21:34:33 -0400 Subject: [PATCH 0360/1792] cmd/go/internal/modload: address issues missed in CL 244774 For #36460 Change-Id: I5e9a42d64e36679b881e96145833e66cf77b98a5 Reviewed-on: https://go-review.googlesource.com/c/go/+/250338 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/modfile.go | 4 ++-- src/cmd/go/internal/modload/mvs.go | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index 0b135c5fb5..a45c4a63be 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -345,7 +345,7 @@ type retraction struct { // goModSummary returns a summary of the go.mod file for module m, // taking into account any replacements for m, exclusions of its dependencies, -// and or vendoring. +// and/or vendoring. // // goModSummary cannot be used on the Target module, as its requirements // may change. @@ -405,7 +405,7 @@ func goModSummary(m module.Version) (*modFileSummary, error) { return cached{nil, module.VersionError(actual, errors.New("parsing go.mod: missing module line"))} } - // In theory we should only allow mpath to be unequal to mod.Path here if the + // In theory we should only allow mpath to be unequal to m.Path here if the // version that we fetched lacks an explicit go.mod file: if the go.mod file // is explicit, then it should match exactly (to ensure that imports of other // packages within the module are interpreted correctly). Unfortunately, we diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index d023ab5094..24856260d4 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -14,7 +14,6 @@ import ( "cmd/go/internal/modfetch" "cmd/go/internal/mvs" - "cmd/go/internal/par" "golang.org/x/mod/module" "golang.org/x/mod/semver" @@ -24,7 +23,6 @@ import ( // with any exclusions or replacements applied internally. type mvsReqs struct { buildList []module.Version - cache par.Cache // module.Version → Required method results } // Reqs returns the current module requirement graph. -- GitLab From 2013f70256e55f5f6f826757333aae42b4667561 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Tue, 25 Aug 2020 10:39:02 -0400 Subject: [PATCH 0361/1792] runtime: add lock partial order edge (fin -> wbufSpans) runfinq may have write barriers, thus it may need to take wbufSpans on any write. Fixes #41021 Change-Id: Ib69e20994b5d7d1526ad53d6ddb5e2e83bf2ed00 Reviewed-on: https://go-review.googlesource.com/c/go/+/250464 Run-TryBot: Michael Pratt TryBot-Result: Gobot Gobot Reviewed-by: Dan Scales --- src/runtime/lockrank.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/lockrank.go b/src/runtime/lockrank.go index b23cf767be..042f10b1d3 100644 --- a/src/runtime/lockrank.go +++ b/src/runtime/lockrank.go @@ -230,7 +230,7 @@ var lockPartialOrder [][]lockRank = [][]lockRank{ lockRankStackLarge: {lockRankSysmon, lockRankAssistQueue, lockRankSched, lockRankItab, lockRankHchan, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankSpanSetSpine, lockRankGscan}, lockRankDefer: {}, lockRankSudog: {lockRankNotifyList, lockRankHchan}, - lockRankWbufSpans: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankSched, lockRankAllg, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankHchan, lockRankNotifyList, lockRankTraceStrings, lockRankMspanSpecial, lockRankProf, lockRankRoot, lockRankGscan, lockRankDefer, lockRankSudog}, + lockRankWbufSpans: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankSweep, lockRankSched, lockRankAllg, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankHchan, lockRankFin, lockRankNotifyList, lockRankTraceStrings, lockRankMspanSpecial, lockRankProf, lockRankRoot, lockRankGscan, lockRankDefer, lockRankSudog}, lockRankMheap: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankAllg, lockRankAllp, lockRankPollDesc, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan, lockRankMspanSpecial, lockRankProf, lockRankGcBitsArenas, lockRankRoot, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankDefer, lockRankSudog, lockRankWbufSpans, lockRankSpanSetSpine}, lockRankMheapSpecial: {lockRankSysmon, lockRankScavenge, lockRankAssistQueue, lockRankCpuprof, lockRankSweep, lockRankSched, lockRankAllg, lockRankAllp, lockRankTimers, lockRankItab, lockRankReflectOffs, lockRankNotifyList, lockRankTraceBuf, lockRankTraceStrings, lockRankHchan}, lockRankGlobalAlloc: {lockRankProf, lockRankSpanSetSpine, lockRankMheap, lockRankMheapSpecial}, -- GitLab From 7615b20d06500fe5c95c061f6ff32e0c97639a60 Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Thu, 20 Aug 2020 15:06:23 -0500 Subject: [PATCH 0362/1792] cmd/compile: generate subfic on ppc64 This merges an lis + subf into subfic, and for 32b constants lwa + subf into oris + ori + subf. The carry bit is no longer used in code generation, therefore I think we can clobber it as needed. Note, lowered borrow/carry arithmetic is self-contained and thus is not affected. A few extra rules are added to ensure early transformations to SUBFCconst don't trip up earlier rules, fold constant operations, or otherwise simplify lowering. Likewise, tests are added to ensure all rules are hit. Generic constant folding catches trivial cases, however some lowering rules insert arithmetic which can introduce new opportunities (e.g BitLen or Slicemask). I couldn't find a specific benchmark to demonstrate noteworthy improvements, but this is generating subfic in many of the default bent test binaries, so we are at least saving a little code space. Change-Id: Iad7c6e5767eaa9dc24dc1c989bd1c8cfe1982012 Reviewed-on: https://go-review.googlesource.com/c/go/+/249461 Run-TryBot: Lynn Boger TryBot-Result: Gobot Gobot Reviewed-by: Carlos Eduardo Seo --- src/cmd/compile/internal/ppc64/ssa.go | 8 + src/cmd/compile/internal/ssa/gen/PPC64.rules | 31 +- src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 1 + src/cmd/compile/internal/ssa/opGen.go | 15 + src/cmd/compile/internal/ssa/rewritePPC64.go | 571 ++++++++++++++++++- test/codegen/arithmetic.go | 42 ++ test/codegen/mathbits.go | 14 + test/codegen/slices.go | 21 + 8 files changed, 686 insertions(+), 17 deletions(-) diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go index 9c4c01e935..f8d9ac2379 100644 --- a/src/cmd/compile/internal/ppc64/ssa.go +++ b/src/cmd/compile/internal/ppc64/ssa.go @@ -649,6 +649,14 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_REG p.To.Reg = v.Reg() + case ssa.OpPPC64SUBFCconst: + p := s.Prog(v.Op.Asm()) + p.SetFrom3(obj.Addr{Type: obj.TYPE_CONST, Offset: v.AuxInt}) + p.From.Type = obj.TYPE_REG + p.From.Reg = v.Args[0].Reg() + p.To.Type = obj.TYPE_REG + p.To.Reg = v.Reg() + case ssa.OpPPC64ANDCCconst: p := s.Prog(v.Op.Asm()) p.Reg = v.Args[0].Reg() diff --git a/src/cmd/compile/internal/ssa/gen/PPC64.rules b/src/cmd/compile/internal/ssa/gen/PPC64.rules index 509cfe1c4f..e5fb1e98c2 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/gen/PPC64.rules @@ -110,13 +110,21 @@ // Rotate generation with non-const shift // these match patterns from math/bits/RotateLeft[32|64], but there could be others (ADD (SLD x (ANDconst [63] y)) (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y)))) => (ROTL x y) +(ADD (SLD x (ANDconst [63] y)) (SRD x (SUBFCconst [64] (ANDconst [63] y)))) => (ROTL x y) ( OR (SLD x (ANDconst [63] y)) (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y)))) => (ROTL x y) +( OR (SLD x (ANDconst [63] y)) (SRD x (SUBFCconst [64] (ANDconst [63] y)))) => (ROTL x y) (XOR (SLD x (ANDconst [63] y)) (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y)))) => (ROTL x y) +(XOR (SLD x (ANDconst [63] y)) (SRD x (SUBFCconst [64] (ANDconst [63] y)))) => (ROTL x y) + +(ADD (SLW x (ANDconst [31] y)) (SRW x (SUBFCconst [32] (ANDconst [31] y)))) => (ROTLW x y) (ADD (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) => (ROTLW x y) +( OR (SLW x (ANDconst [31] y)) (SRW x (SUBFCconst [32] (ANDconst [31] y)))) => (ROTLW x y) ( OR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) => (ROTLW x y) +(XOR (SLW x (ANDconst [31] y)) (SRW x (SUBFCconst [32] (ANDconst [31] y)))) => (ROTLW x y) (XOR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) => (ROTLW x y) + // Lowering rotates (RotateLeft32 x y) => (ROTLW x y) (RotateLeft64 x y) => (ROTL x y) @@ -192,11 +200,15 @@ (Rsh64Ux64 x (AND y (MOVDconst [63]))) => (SRD x (ANDconst [63] y)) (Rsh64Ux64 x (ANDconst [63] y)) => (SRD x (ANDconst [63] y)) (Rsh64Ux64 x (SUB (MOVDconst [64]) (ANDconst [63] y))) => (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) +(Rsh64Ux64 x (SUBFCconst [64] (ANDconst [63] y))) => (SRD x (SUBFCconst [64] (ANDconst [63] y))) (Rsh64Ux64 x (SUB (MOVDconst [64]) (AND y (MOVDconst [63])))) => (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) +(Rsh64Ux64 x (SUBFCconst [64] (AND y (MOVDconst [63])))) => (SRD x (SUBFCconst [64] (ANDconst [63] y))) (Rsh64x64 x (AND y (MOVDconst [63]))) => (SRAD x (ANDconst [63] y)) (Rsh64x64 x (ANDconst [63] y)) => (SRAD x (ANDconst [63] y)) (Rsh64x64 x (SUB (MOVDconst [64]) (ANDconst [63] y))) => (SRAD x (SUB (MOVDconst [64]) (ANDconst [63] y))) +(Rsh64x64 x (SUBFCconst [64] (ANDconst [63] y))) => (SRAD x (SUBFCconst [64] (ANDconst [63] y))) (Rsh64x64 x (SUB (MOVDconst [64]) (AND y (MOVDconst [63])))) => (SRAD x (SUB (MOVDconst [64]) (ANDconst [63] y))) +(Rsh64x64 x (SUBFCconst [64] (AND y (MOVDconst [63])))) => (SRAD x (SUBFCconst [64] (ANDconst [63] y))) (Lsh64x64 x y) => (SLD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64])))) (Rsh64x64 x y) => (SRAD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64])))) @@ -208,12 +220,16 @@ (Rsh32Ux64 x (AND y (MOVDconst [31]))) => (SRW x (ANDconst [31] y)) (Rsh32Ux64 x (ANDconst [31] y)) => (SRW x (ANDconst [31] y)) (Rsh32Ux64 x (SUB (MOVDconst [32]) (ANDconst [31] y))) => (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y))) +(Rsh32Ux64 x (SUBFCconst [32] (ANDconst [31] y))) => (SRW x (SUBFCconst [32] (ANDconst [31] y))) (Rsh32Ux64 x (SUB (MOVDconst [32]) (AND y (MOVDconst [31])))) => (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y))) +(Rsh32Ux64 x (SUBFCconst [32] (AND y (MOVDconst [31])))) => (SRW x (SUBFCconst [32] (ANDconst [31] y))) (Rsh32x64 x (AND y (MOVDconst [31]))) => (SRAW x (ANDconst [31] y)) (Rsh32x64 x (ANDconst [31] y)) => (SRAW x (ANDconst [31] y)) (Rsh32x64 x (SUB (MOVDconst [32]) (ANDconst [31] y))) => (SRAW x (SUB (MOVDconst [32]) (ANDconst [31] y))) +(Rsh32x64 x (SUBFCconst [32] (ANDconst [31] y))) => (SRAW x (SUBFCconst [32] (ANDconst [31] y))) (Rsh32x64 x (SUB (MOVDconst [32]) (AND y (MOVDconst [31])))) => (SRAW x (SUB (MOVDconst [32]) (ANDconst [31] y))) +(Rsh32x64 x (SUBFCconst [32] (AND y (MOVDconst [31])))) => (SRAW x (SUBFCconst [32] (ANDconst [31] y))) (Rsh32x64 x y) => (SRAW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32])))) (Rsh32Ux64 x y) => (SRW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32])))) @@ -299,8 +315,8 @@ (Ctz16 x) => (POPCNTW (MOVHZreg (ANDN (ADDconst [-1] x) x))) (Ctz8 x) => (POPCNTB (MOVBZreg (ANDN (ADDconst [-1] x) x))) -(BitLen64 x) => (SUB (MOVDconst [64]) (CNTLZD x)) -(BitLen32 x) => (SUB (MOVDconst [32]) (CNTLZW x)) +(BitLen64 x) => (SUBFCconst [64] (CNTLZD x)) +(BitLen32 x) => (SUBFCconst [32] (CNTLZW x)) (PopCount64 ...) => (POPCNTD ...) (PopCount32 x) => (POPCNTW (MOVWZreg x)) @@ -770,10 +786,19 @@ (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) -// TODO deal with subtract-from-const (ADDconst [c] (MOVDaddr [d] {sym} x)) && is32Bit(c+int64(d)) => (MOVDaddr [int32(c+int64(d))] {sym} x) +// Subtract from (with carry, but ignored) constant. +// Note, these clobber the carry bit. +(SUB (MOVDconst [c]) x) && is32Bit(c) => (SUBFCconst [c] x) +(SUBFCconst [c] (NEG x)) => (ADDconst [c] x) +(SUBFCconst [c] (SUBFCconst [d] x)) && is32Bit(c-d) => (ADDconst [c-d] x) +(SUBFCconst [0] x) => (NEG x) +(ADDconst [c] (SUBFCconst [d] x)) && is32Bit(c+d) => (SUBFCconst [c+d] x) +(NEG (ADDconst [c] x)) && is32Bit(-c) => (SUBFCconst [-c] x) +(NEG (SUBFCconst [c] x)) && is32Bit(-c) => (ADDconst [-c] x) + // Use register moves instead of stores and loads to move int<=>float values // Common with math Float64bits, Float64frombits (MOVDload [off] {sym} ptr (FMOVDstore [off] {sym} ptr x _)) => (MFVSRD x) diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index f91222446c..44f6a74c63 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -175,6 +175,7 @@ func init() { {name: "FADD", argLength: 2, reg: fp21, asm: "FADD", commutative: true}, // arg0+arg1 {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true}, // arg0+arg1 {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"}, // arg0-arg1 + {name: "SUBFCconst", argLength: 1, reg: gp11, asm: "SUBC", aux: "Int64"}, // auxInt - arg0 (with carry) {name: "FSUB", argLength: 2, reg: fp21, asm: "FSUB"}, // arg0-arg1 {name: "FSUBS", argLength: 2, reg: fp21, asm: "FSUBS"}, // arg0-arg1 diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index e181174d11..45401898c8 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -1828,6 +1828,7 @@ const ( OpPPC64FADD OpPPC64FADDS OpPPC64SUB + OpPPC64SUBFCconst OpPPC64FSUB OpPPC64FSUBS OpPPC64MULLD @@ -24313,6 +24314,20 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "SUBFCconst", + auxType: auxInt64, + argLen: 1, + asm: ppc64.ASUBC, + 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: "FSUB", argLen: 2, diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 1a0b03e81c..152cdfdf4d 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -568,6 +568,8 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64MOVWstorezero(v) case OpPPC64MTVSRD: return rewriteValuePPC64_OpPPC64MTVSRD(v) + case OpPPC64NEG: + return rewriteValuePPC64_OpPPC64NEG(v) case OpPPC64NOR: return rewriteValuePPC64_OpPPC64NOR(v) case OpPPC64NotEqual: @@ -596,6 +598,8 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64SRW(v) case OpPPC64SUB: return rewriteValuePPC64_OpPPC64SUB(v) + case OpPPC64SUBFCconst: + return rewriteValuePPC64_OpPPC64SUBFCconst(v) case OpPPC64XOR: return rewriteValuePPC64_OpPPC64XOR(v) case OpPPC64XORconst: @@ -1021,15 +1025,14 @@ func rewriteValuePPC64_OpBitLen32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (BitLen32 x) - // result: (SUB (MOVDconst [32]) (CNTLZW x)) + // result: (SUBFCconst [32] (CNTLZW x)) for { x := v_0 - v.reset(OpPPC64SUB) - v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v0.AuxInt = int64ToAuxInt(32) - v1 := b.NewValue0(v.Pos, OpPPC64CNTLZW, typ.Int) - v1.AddArg(x) - v.AddArg2(v0, v1) + v.reset(OpPPC64SUBFCconst) + v.AuxInt = int64ToAuxInt(32) + v0 := b.NewValue0(v.Pos, OpPPC64CNTLZW, typ.Int) + v0.AddArg(x) + v.AddArg(v0) return true } } @@ -1038,15 +1041,14 @@ func rewriteValuePPC64_OpBitLen64(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (BitLen64 x) - // result: (SUB (MOVDconst [64]) (CNTLZD x)) + // result: (SUBFCconst [64] (CNTLZD x)) for { x := v_0 - v.reset(OpPPC64SUB) - v0 := b.NewValue0(v.Pos, OpPPC64MOVDconst, typ.Int64) - v0.AuxInt = int64ToAuxInt(64) - v1 := b.NewValue0(v.Pos, OpPPC64CNTLZD, typ.Int) - v1.AddArg(x) - v.AddArg2(v0, v1) + v.reset(OpPPC64SUBFCconst) + v.AuxInt = int64ToAuxInt(64) + v0 := b.NewValue0(v.Pos, OpPPC64CNTLZD, typ.Int) + v0.AddArg(x) + v.AddArg(v0) return true } } @@ -3957,6 +3959,76 @@ func rewriteValuePPC64_OpPPC64ADD(v *Value) bool { } break } + // match: (ADD (SLD x (ANDconst [63] y)) (SRD x (SUBFCconst [64] (ANDconst [63] y)))) + // result: (ROTL x y) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpPPC64SLD { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || auxIntToInt64(v_0_1.AuxInt) != 63 { + continue + } + y := v_0_1.Args[0] + if v_1.Op != OpPPC64SRD { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUBFCconst || v_1_1.Type != typ.UInt || auxIntToInt64(v_1_1.AuxInt) != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64ANDconst || v_1_1_0.Type != typ.UInt || auxIntToInt64(v_1_1_0.AuxInt) != 63 || y != v_1_1_0.Args[0] { + continue + } + v.reset(OpPPC64ROTL) + v.AddArg2(x, y) + return true + } + break + } + // match: (ADD (SLW x (ANDconst [31] y)) (SRW x (SUBFCconst [32] (ANDconst [31] y)))) + // result: (ROTLW x y) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpPPC64SLW { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || auxIntToInt64(v_0_1.AuxInt) != 31 { + continue + } + y := v_0_1.Args[0] + if v_1.Op != OpPPC64SRW { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUBFCconst || v_1_1.Type != typ.UInt || auxIntToInt64(v_1_1.AuxInt) != 32 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64ANDconst || v_1_1_0.Type != typ.UInt || auxIntToInt64(v_1_1_0.AuxInt) != 31 || y != v_1_1_0.Args[0] { + continue + } + v.reset(OpPPC64ROTLW) + v.AddArg2(x, y) + return true + } + break + } // match: (ADD (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) // result: (ROTLW x y) for { @@ -4069,6 +4141,24 @@ func rewriteValuePPC64_OpPPC64ADDconst(v *Value) bool { v.AddArg(x) return true } + // match: (ADDconst [c] (SUBFCconst [d] x)) + // cond: is32Bit(c+d) + // result: (SUBFCconst [c+d] x) + for { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpPPC64SUBFCconst { + break + } + d := auxIntToInt64(v_0.AuxInt) + x := v_0.Args[0] + if !(is32Bit(c + d)) { + break + } + v.reset(OpPPC64SUBFCconst) + v.AuxInt = int64ToAuxInt(c + d) + v.AddArg(x) + return true + } return false } func rewriteValuePPC64_OpPPC64AND(v *Value) bool { @@ -10336,6 +10426,44 @@ func rewriteValuePPC64_OpPPC64MTVSRD(v *Value) bool { } return false } +func rewriteValuePPC64_OpPPC64NEG(v *Value) bool { + v_0 := v.Args[0] + // match: (NEG (ADDconst [c] x)) + // cond: is32Bit(-c) + // result: (SUBFCconst [-c] x) + for { + if v_0.Op != OpPPC64ADDconst { + break + } + c := auxIntToInt64(v_0.AuxInt) + x := v_0.Args[0] + if !(is32Bit(-c)) { + break + } + v.reset(OpPPC64SUBFCconst) + v.AuxInt = int64ToAuxInt(-c) + v.AddArg(x) + return true + } + // match: (NEG (SUBFCconst [c] x)) + // cond: is32Bit(-c) + // result: (ADDconst [-c] x) + for { + if v_0.Op != OpPPC64SUBFCconst { + break + } + c := auxIntToInt64(v_0.AuxInt) + x := v_0.Args[0] + if !(is32Bit(-c)) { + break + } + v.reset(OpPPC64ADDconst) + v.AuxInt = int64ToAuxInt(-c) + v.AddArg(x) + return true + } + return false +} func rewriteValuePPC64_OpPPC64NOR(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -10510,6 +10638,76 @@ func rewriteValuePPC64_OpPPC64OR(v *Value) bool { } break } + // match: ( OR (SLD x (ANDconst [63] y)) (SRD x (SUBFCconst [64] (ANDconst [63] y)))) + // result: (ROTL x y) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpPPC64SLD { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || auxIntToInt64(v_0_1.AuxInt) != 63 { + continue + } + y := v_0_1.Args[0] + if v_1.Op != OpPPC64SRD { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUBFCconst || v_1_1.Type != typ.UInt || auxIntToInt64(v_1_1.AuxInt) != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64ANDconst || v_1_1_0.Type != typ.UInt || auxIntToInt64(v_1_1_0.AuxInt) != 63 || y != v_1_1_0.Args[0] { + continue + } + v.reset(OpPPC64ROTL) + v.AddArg2(x, y) + return true + } + break + } + // match: ( OR (SLW x (ANDconst [31] y)) (SRW x (SUBFCconst [32] (ANDconst [31] y)))) + // result: (ROTLW x y) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpPPC64SLW { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || auxIntToInt64(v_0_1.AuxInt) != 31 { + continue + } + y := v_0_1.Args[0] + if v_1.Op != OpPPC64SRW { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUBFCconst || v_1_1.Type != typ.UInt || auxIntToInt64(v_1_1.AuxInt) != 32 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64ANDconst || v_1_1_0.Type != typ.UInt || auxIntToInt64(v_1_1_0.AuxInt) != 31 || y != v_1_1_0.Args[0] { + continue + } + v.reset(OpPPC64ROTLW) + v.AddArg2(x, y) + return true + } + break + } // match: ( OR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) // result: (ROTLW x y) for { @@ -12109,6 +12307,69 @@ func rewriteValuePPC64_OpPPC64SUB(v *Value) bool { v.AddArg(x) return true } + // match: (SUB (MOVDconst [c]) x) + // cond: is32Bit(c) + // result: (SUBFCconst [c] x) + for { + if v_0.Op != OpPPC64MOVDconst { + break + } + c := auxIntToInt64(v_0.AuxInt) + x := v_1 + if !(is32Bit(c)) { + break + } + v.reset(OpPPC64SUBFCconst) + v.AuxInt = int64ToAuxInt(c) + v.AddArg(x) + return true + } + return false +} +func rewriteValuePPC64_OpPPC64SUBFCconst(v *Value) bool { + v_0 := v.Args[0] + // match: (SUBFCconst [c] (NEG x)) + // result: (ADDconst [c] x) + for { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpPPC64NEG { + break + } + x := v_0.Args[0] + v.reset(OpPPC64ADDconst) + v.AuxInt = int64ToAuxInt(c) + v.AddArg(x) + return true + } + // match: (SUBFCconst [c] (SUBFCconst [d] x)) + // cond: is32Bit(c-d) + // result: (ADDconst [c-d] x) + for { + c := auxIntToInt64(v.AuxInt) + if v_0.Op != OpPPC64SUBFCconst { + break + } + d := auxIntToInt64(v_0.AuxInt) + x := v_0.Args[0] + if !(is32Bit(c - d)) { + break + } + v.reset(OpPPC64ADDconst) + v.AuxInt = int64ToAuxInt(c - d) + v.AddArg(x) + return true + } + // match: (SUBFCconst [0] x) + // result: (NEG x) + for { + if auxIntToInt64(v.AuxInt) != 0 { + break + } + x := v_0 + v.reset(OpPPC64NEG) + v.AddArg(x) + return true + } return false } func rewriteValuePPC64_OpPPC64XOR(v *Value) bool { @@ -12204,6 +12465,76 @@ func rewriteValuePPC64_OpPPC64XOR(v *Value) bool { } break } + // match: (XOR (SLD x (ANDconst [63] y)) (SRD x (SUBFCconst [64] (ANDconst [63] y)))) + // result: (ROTL x y) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpPPC64SLD { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int64 || auxIntToInt64(v_0_1.AuxInt) != 63 { + continue + } + y := v_0_1.Args[0] + if v_1.Op != OpPPC64SRD { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUBFCconst || v_1_1.Type != typ.UInt || auxIntToInt64(v_1_1.AuxInt) != 64 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64ANDconst || v_1_1_0.Type != typ.UInt || auxIntToInt64(v_1_1_0.AuxInt) != 63 || y != v_1_1_0.Args[0] { + continue + } + v.reset(OpPPC64ROTL) + v.AddArg2(x, y) + return true + } + break + } + // match: (XOR (SLW x (ANDconst [31] y)) (SRW x (SUBFCconst [32] (ANDconst [31] y)))) + // result: (ROTLW x y) + for { + for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { + if v_0.Op != OpPPC64SLW { + continue + } + _ = v_0.Args[1] + x := v_0.Args[0] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpPPC64ANDconst || v_0_1.Type != typ.Int32 || auxIntToInt64(v_0_1.AuxInt) != 31 { + continue + } + y := v_0_1.Args[0] + if v_1.Op != OpPPC64SRW { + continue + } + _ = v_1.Args[1] + if x != v_1.Args[0] { + continue + } + v_1_1 := v_1.Args[1] + if v_1_1.Op != OpPPC64SUBFCconst || v_1_1.Type != typ.UInt || auxIntToInt64(v_1_1.AuxInt) != 32 { + continue + } + v_1_1_0 := v_1_1.Args[0] + if v_1_1_0.Op != OpPPC64ANDconst || v_1_1_0.Type != typ.UInt || auxIntToInt64(v_1_1_0.AuxInt) != 31 || y != v_1_1_0.Args[0] { + continue + } + v.reset(OpPPC64ROTLW) + v.AddArg2(x, y) + return true + } + break + } // match: (XOR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) // result: (ROTLW x y) for { @@ -13175,6 +13506,28 @@ func rewriteValuePPC64_OpRsh32Ux64(v *Value) bool { v.AddArg2(x, v0) return true } + // match: (Rsh32Ux64 x (SUBFCconst [32] (ANDconst [31] y))) + // result: (SRW x (SUBFCconst [32] (ANDconst [31] y))) + for { + x := v_0 + if v_1.Op != OpPPC64SUBFCconst || v_1.Type != typ.UInt || auxIntToInt64(v_1.AuxInt) != 32 { + break + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpPPC64ANDconst || v_1_0.Type != typ.UInt || auxIntToInt64(v_1_0.AuxInt) != 31 { + break + } + y := v_1_0.Args[0] + v.reset(OpPPC64SRW) + v0 := b.NewValue0(v.Pos, OpPPC64SUBFCconst, typ.UInt) + v0.AuxInt = int64ToAuxInt(32) + v1 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v1.AuxInt = int64ToAuxInt(31) + v1.AddArg(y) + v0.AddArg(v1) + v.AddArg2(x, v0) + return true + } // match: (Rsh32Ux64 x (SUB (MOVDconst [32]) (AND y (MOVDconst [31])))) // result: (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y))) for { @@ -13212,6 +13565,37 @@ func rewriteValuePPC64_OpRsh32Ux64(v *Value) bool { } break } + // match: (Rsh32Ux64 x (SUBFCconst [32] (AND y (MOVDconst [31])))) + // result: (SRW x (SUBFCconst [32] (ANDconst [31] y))) + for { + x := v_0 + if v_1.Op != OpPPC64SUBFCconst || v_1.Type != typ.UInt || auxIntToInt64(v_1.AuxInt) != 32 { + break + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpPPC64AND || v_1_0.Type != typ.UInt { + break + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + v_1_0_1 := v_1_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 { + y := v_1_0_0 + if v_1_0_1.Op != OpPPC64MOVDconst || auxIntToInt64(v_1_0_1.AuxInt) != 31 { + continue + } + v.reset(OpPPC64SRW) + v0 := b.NewValue0(v.Pos, OpPPC64SUBFCconst, typ.UInt) + v0.AuxInt = int64ToAuxInt(32) + v1 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v1.AuxInt = int64ToAuxInt(31) + v1.AddArg(y) + v0.AddArg(v1) + v.AddArg2(x, v0) + return true + } + break + } // match: (Rsh32Ux64 x y) // result: (SRW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32])))) for { @@ -13482,6 +13866,28 @@ func rewriteValuePPC64_OpRsh32x64(v *Value) bool { v.AddArg2(x, v0) return true } + // match: (Rsh32x64 x (SUBFCconst [32] (ANDconst [31] y))) + // result: (SRAW x (SUBFCconst [32] (ANDconst [31] y))) + for { + x := v_0 + if v_1.Op != OpPPC64SUBFCconst || v_1.Type != typ.UInt || auxIntToInt64(v_1.AuxInt) != 32 { + break + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpPPC64ANDconst || v_1_0.Type != typ.UInt || auxIntToInt64(v_1_0.AuxInt) != 31 { + break + } + y := v_1_0.Args[0] + v.reset(OpPPC64SRAW) + v0 := b.NewValue0(v.Pos, OpPPC64SUBFCconst, typ.UInt) + v0.AuxInt = int64ToAuxInt(32) + v1 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v1.AuxInt = int64ToAuxInt(31) + v1.AddArg(y) + v0.AddArg(v1) + v.AddArg2(x, v0) + return true + } // match: (Rsh32x64 x (SUB (MOVDconst [32]) (AND y (MOVDconst [31])))) // result: (SRAW x (SUB (MOVDconst [32]) (ANDconst [31] y))) for { @@ -13519,6 +13925,37 @@ func rewriteValuePPC64_OpRsh32x64(v *Value) bool { } break } + // match: (Rsh32x64 x (SUBFCconst [32] (AND y (MOVDconst [31])))) + // result: (SRAW x (SUBFCconst [32] (ANDconst [31] y))) + for { + x := v_0 + if v_1.Op != OpPPC64SUBFCconst || v_1.Type != typ.UInt || auxIntToInt64(v_1.AuxInt) != 32 { + break + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpPPC64AND || v_1_0.Type != typ.UInt { + break + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + v_1_0_1 := v_1_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 { + y := v_1_0_0 + if v_1_0_1.Op != OpPPC64MOVDconst || auxIntToInt64(v_1_0_1.AuxInt) != 31 { + continue + } + v.reset(OpPPC64SRAW) + v0 := b.NewValue0(v.Pos, OpPPC64SUBFCconst, typ.UInt) + v0.AuxInt = int64ToAuxInt(32) + v1 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v1.AuxInt = int64ToAuxInt(31) + v1.AddArg(y) + v0.AddArg(v1) + v.AddArg2(x, v0) + return true + } + break + } // match: (Rsh32x64 x y) // result: (SRAW x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [32])))) for { @@ -13787,6 +14224,28 @@ func rewriteValuePPC64_OpRsh64Ux64(v *Value) bool { v.AddArg2(x, v0) return true } + // match: (Rsh64Ux64 x (SUBFCconst [64] (ANDconst [63] y))) + // result: (SRD x (SUBFCconst [64] (ANDconst [63] y))) + for { + x := v_0 + if v_1.Op != OpPPC64SUBFCconst || v_1.Type != typ.UInt || auxIntToInt64(v_1.AuxInt) != 64 { + break + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpPPC64ANDconst || v_1_0.Type != typ.UInt || auxIntToInt64(v_1_0.AuxInt) != 63 { + break + } + y := v_1_0.Args[0] + v.reset(OpPPC64SRD) + v0 := b.NewValue0(v.Pos, OpPPC64SUBFCconst, typ.UInt) + v0.AuxInt = int64ToAuxInt(64) + v1 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v1.AuxInt = int64ToAuxInt(63) + v1.AddArg(y) + v0.AddArg(v1) + v.AddArg2(x, v0) + return true + } // match: (Rsh64Ux64 x (SUB (MOVDconst [64]) (AND y (MOVDconst [63])))) // result: (SRD x (SUB (MOVDconst [64]) (ANDconst [63] y))) for { @@ -13824,6 +14283,37 @@ func rewriteValuePPC64_OpRsh64Ux64(v *Value) bool { } break } + // match: (Rsh64Ux64 x (SUBFCconst [64] (AND y (MOVDconst [63])))) + // result: (SRD x (SUBFCconst [64] (ANDconst [63] y))) + for { + x := v_0 + if v_1.Op != OpPPC64SUBFCconst || v_1.Type != typ.UInt || auxIntToInt64(v_1.AuxInt) != 64 { + break + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpPPC64AND || v_1_0.Type != typ.UInt { + break + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + v_1_0_1 := v_1_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 { + y := v_1_0_0 + if v_1_0_1.Op != OpPPC64MOVDconst || auxIntToInt64(v_1_0_1.AuxInt) != 63 { + continue + } + v.reset(OpPPC64SRD) + v0 := b.NewValue0(v.Pos, OpPPC64SUBFCconst, typ.UInt) + v0.AuxInt = int64ToAuxInt(64) + v1 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v1.AuxInt = int64ToAuxInt(63) + v1.AddArg(y) + v0.AddArg(v1) + v.AddArg2(x, v0) + return true + } + break + } // match: (Rsh64Ux64 x y) // result: (SRD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64])))) for { @@ -14094,6 +14584,28 @@ func rewriteValuePPC64_OpRsh64x64(v *Value) bool { v.AddArg2(x, v0) return true } + // match: (Rsh64x64 x (SUBFCconst [64] (ANDconst [63] y))) + // result: (SRAD x (SUBFCconst [64] (ANDconst [63] y))) + for { + x := v_0 + if v_1.Op != OpPPC64SUBFCconst || v_1.Type != typ.UInt || auxIntToInt64(v_1.AuxInt) != 64 { + break + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpPPC64ANDconst || v_1_0.Type != typ.UInt || auxIntToInt64(v_1_0.AuxInt) != 63 { + break + } + y := v_1_0.Args[0] + v.reset(OpPPC64SRAD) + v0 := b.NewValue0(v.Pos, OpPPC64SUBFCconst, typ.UInt) + v0.AuxInt = int64ToAuxInt(64) + v1 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v1.AuxInt = int64ToAuxInt(63) + v1.AddArg(y) + v0.AddArg(v1) + v.AddArg2(x, v0) + return true + } // match: (Rsh64x64 x (SUB (MOVDconst [64]) (AND y (MOVDconst [63])))) // result: (SRAD x (SUB (MOVDconst [64]) (ANDconst [63] y))) for { @@ -14131,6 +14643,37 @@ func rewriteValuePPC64_OpRsh64x64(v *Value) bool { } break } + // match: (Rsh64x64 x (SUBFCconst [64] (AND y (MOVDconst [63])))) + // result: (SRAD x (SUBFCconst [64] (ANDconst [63] y))) + for { + x := v_0 + if v_1.Op != OpPPC64SUBFCconst || v_1.Type != typ.UInt || auxIntToInt64(v_1.AuxInt) != 64 { + break + } + v_1_0 := v_1.Args[0] + if v_1_0.Op != OpPPC64AND || v_1_0.Type != typ.UInt { + break + } + _ = v_1_0.Args[1] + v_1_0_0 := v_1_0.Args[0] + v_1_0_1 := v_1_0.Args[1] + for _i0 := 0; _i0 <= 1; _i0, v_1_0_0, v_1_0_1 = _i0+1, v_1_0_1, v_1_0_0 { + y := v_1_0_0 + if v_1_0_1.Op != OpPPC64MOVDconst || auxIntToInt64(v_1_0_1.AuxInt) != 63 { + continue + } + v.reset(OpPPC64SRAD) + v0 := b.NewValue0(v.Pos, OpPPC64SUBFCconst, typ.UInt) + v0.AuxInt = int64ToAuxInt(64) + v1 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.UInt) + v1.AuxInt = int64ToAuxInt(63) + v1.AddArg(y) + v0.AddArg(v1) + v.AddArg2(x, v0) + return true + } + break + } // match: (Rsh64x64 x y) // result: (SRAD x (ISEL [0] y (MOVDconst [-1]) (CMPU y (MOVDconst [64])))) for { diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index afd4d66bd9..0bdb66a376 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -42,6 +42,48 @@ func SubMem(arr []int, b, c, d int) int { return arr[0] - arr[1] } +func SubFromConst(a int) int { + // ppc64le: `SUBC\tR[0-9]+,\s[$]40,\sR` + // ppc64: `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` + 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` + 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` + 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` + 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` + c := -(-40 + a) + return c +} + // -------------------- // // Multiplication // // -------------------- // diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index 942605de55..4c35f26997 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -76,9 +76,17 @@ func Len64(n uint64) int { // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" // wasm:"I64Clz" + // ppc64le:"SUBC","CNTLZD" + // ppc64:"SUBC","CNTLZD" return bits.Len64(n) } +func SubFromLen64(n uint64) int { + // ppc64le:"CNTLZD",-"SUBC" + // ppc64:"CNTLZD",-"SUBC" + return 64 - bits.Len64(n) +} + func Len32(n uint32) int { // amd64:"BSRQ","LEAQ",-"CMOVQEQ" // s390x:"FLOGR" @@ -291,6 +299,12 @@ func TrailingZeros64(n uint64) int { return bits.TrailingZeros64(n) } +func TrailingZeros64Subtract(n uint64) int { + // ppc64le/power8:"NEG","SUBC","ANDN","POPCNTD" + // ppc64le/power9:"SUBC","CNTTZD" + return bits.TrailingZeros64(1 - n) +} + func TrailingZeros32(n uint32) int { // amd64:"BTSQ\\t\\$32","BSFQ" // arm:"CLZ" diff --git a/test/codegen/slices.go b/test/codegen/slices.go index 40e857f9f6..38e8a62f4b 100644 --- a/test/codegen/slices.go +++ b/test/codegen/slices.go @@ -347,3 +347,24 @@ func InitNotSmallSliceLiteral() []int { 42, } } + +// --------------------------------------- // +// Test PPC64 SUBFCconst folding rules // +// triggered by slice operations. // +// --------------------------------------- // + +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" + return c[b:] + } + return a +} + +func SliceWithSubtractBound(a []int, b int) []int { + // ppc64le:"SUBC",-"NEG" + // ppc64:"SUBC",-"NEG" + return a[(3 - b):] +} -- GitLab From 29634436fd741a7c685bf8f242b6fd62f093d1ad Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Thu, 27 Aug 2020 16:12:18 -0400 Subject: [PATCH 0363/1792] cmd/cgo: ensure GCC does not use ANSI escape sequences in errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cgo parses GCC’s error messages to classify C identifiers referenced from Go programs (are they integer constants? type names?). If GCC tries to colorize its errors, cgo can’t figure out what GCC is saying. GCC avoids escape sequences in this scenario by default, but the default behavior can be overridden in at least two places: - The user can set `CGO_COPTS=-fdiagnostics-color`. - Whoever compiled GCC can configure GCC itself to always colorize output. The most reliable way to ensure that GCC doesn’t colorize output is to append `-fdiagnostics-color=never` to the GCC command line; do so. Fixes #40415 Change-Id: Id4bdf8d92fac8b038340b4264f726e8fe38875b4 Reviewed-on: https://go-review.googlesource.com/c/go/+/248398 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/cgo/gcc.go | 28 +++++++++++++++++++++------- src/cmd/dist/test.go | 5 +++-- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index a59534ebd0..9179b5490e 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -369,7 +369,18 @@ func (p *Package) guessKinds(f *File) []*Name { fmt.Fprintf(&b, "#line 1 \"completed\"\n"+ "int __cgo__1 = __cgo__2;\n") - stderr := p.gccErrors(b.Bytes()) + // We need to parse the output from this gcc command, so ensure that it + // doesn't have any ANSI escape sequences in it. (TERM=dumb is + // insufficient; if the user specifies CGO_CFLAGS=-fdiagnostics-color, + // GCC will ignore TERM, and GCC can also be configured at compile-time + // to ignore TERM.) + stderr := p.gccErrors(b.Bytes(), "-fdiagnostics-color=never") + if strings.Contains(stderr, "unrecognized command line option") { + // We're using an old version of GCC that doesn't understand + // -fdiagnostics-color. Those versions can't print color anyway, + // so just rerun without that option. + stderr = p.gccErrors(b.Bytes()) + } if stderr == "" { fatalf("%s produced no output\non input:\n%s", p.gccBaseCmd()[0], b.Bytes()) } @@ -1970,22 +1981,25 @@ func (p *Package) gccDefines(stdin []byte) string { // gccErrors runs gcc over the C program stdin and returns // the errors that gcc prints. That is, this function expects // gcc to fail. -func (p *Package) gccErrors(stdin []byte) string { +func (p *Package) gccErrors(stdin []byte, extraArgs ...string) string { // TODO(rsc): require failure args := p.gccCmd() // Optimization options can confuse the error messages; remove them. - nargs := make([]string, 0, len(args)) + nargs := make([]string, 0, len(args)+len(extraArgs)) for _, arg := range args { if !strings.HasPrefix(arg, "-O") { nargs = append(nargs, arg) } } - // Force -O0 optimization but keep the trailing "-" at the end. - nargs = append(nargs, "-O0") - nl := len(nargs) - nargs[nl-2], nargs[nl-1] = nargs[nl-1], nargs[nl-2] + // Force -O0 optimization and append extra arguments, but keep the + // trailing "-" at the end. + li := len(nargs) - 1 + last := nargs[li] + nargs[li] = "-O0" + nargs = append(nargs, extraArgs...) + nargs = append(nargs, last) if *debugGcc { fmt.Fprintf(os.Stderr, "$ %s < Date: Fri, 21 Aug 2020 11:09:45 -0700 Subject: [PATCH 0364/1792] runtime: framepointers are no longer an experiment - hard code them I think they are no longer experimental status. Might as well promote them to permanent. Change-Id: Id1259601b3dd2061dd60df86ee48080bfb575d2f Reviewed-on: https://go-review.googlesource.com/c/go/+/249857 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/gc/pgen.go | 4 ++-- src/cmd/compile/internal/ssa/regalloc.go | 2 +- src/cmd/internal/obj/arm64/obj7.go | 10 +++++----- src/cmd/internal/obj/link.go | 7 +++---- src/cmd/internal/obj/sym.go | 1 - src/cmd/internal/obj/x86/asm6.go | 6 +++--- src/cmd/internal/obj/x86/obj6.go | 2 +- src/cmd/internal/objabi/util.go | 7 ++----- src/cmd/link/internal/ld/lib.go | 8 -------- src/runtime/cgocall.go | 9 ++------- src/runtime/proc.go | 3 --- src/runtime/runtime2.go | 8 +++++--- src/runtime/stack.go | 6 +----- src/runtime/traceback.go | 6 +++--- 14 files changed, 28 insertions(+), 51 deletions(-) diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index ca8cccf4ae..74262595b0 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -507,7 +507,7 @@ func createSimpleVar(fnsym *obj.LSym, n *Node) *dwarf.Var { if Ctxt.FixedFrameSize() == 0 { offs -= int64(Widthptr) } - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) || objabi.GOARCH == "arm64" { + if objabi.Framepointer_enabled || objabi.GOARCH == "arm64" { // There is a word space for FP on ARM64 even if the frame pointer is disabled offs -= int64(Widthptr) } @@ -703,7 +703,7 @@ func stackOffset(slot ssa.LocalSlot) int32 { if Ctxt.FixedFrameSize() == 0 { base -= int64(Widthptr) } - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) || objabi.GOARCH == "arm64" { + if objabi.Framepointer_enabled || objabi.GOARCH == "arm64" { // There is a word space for FP on ARM64 even if the frame pointer is disabled base -= int64(Widthptr) } diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go index a2be7bb596..64c6aed3e7 100644 --- a/src/cmd/compile/internal/ssa/regalloc.go +++ b/src/cmd/compile/internal/ssa/regalloc.go @@ -588,7 +588,7 @@ func (s *regAllocState) init(f *Func) { if s.f.Config.hasGReg { s.allocatable &^= 1 << s.GReg } - if s.f.Config.ctxt.Framepointer_enabled && s.f.Config.FPReg >= 0 { + if objabi.Framepointer_enabled && s.f.Config.FPReg >= 0 { s.allocatable &^= 1 << uint(s.f.Config.FPReg) } if s.f.Config.LinkReg != -1 { diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index 0d74430053..f54429fabe 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -621,7 +621,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { prologueEnd.Pos = prologueEnd.Pos.WithXlogue(src.PosPrologueEnd) - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) { + if objabi.Framepointer_enabled { q1 = obj.Appendp(q1, c.newprog) q1.Pos = p.Pos q1.As = AMOVD @@ -764,7 +764,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p.To.Reg = REGSP p.Spadj = -c.autosize - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) { + if objabi.Framepointer_enabled { p = obj.Appendp(p, c.newprog) p.As = ASUB p.From.Type = obj.TYPE_CONST @@ -777,7 +777,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } else { /* want write-back pre-indexed SP+autosize -> SP, loading REGLINK*/ - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) { + if objabi.Framepointer_enabled { p.As = AMOVD p.From.Type = obj.TYPE_MEM p.From.Reg = REGSP @@ -865,7 +865,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } case obj.ADUFFCOPY: - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) { + if objabi.Framepointer_enabled { // ADR ret_addr, R27 // STP (FP, R27), -24(SP) // SUB 24, SP, FP @@ -918,7 +918,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } case obj.ADUFFZERO: - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) { + if objabi.Framepointer_enabled { // ADR ret_addr, R27 // STP (FP, R27), -24(SP) // SUB 24, SP, FP diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 311e5ae2e8..1fc90db864 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -682,10 +682,9 @@ type Link struct { GenAbstractFunc func(fn *LSym) Errors int - InParallel bool // parallel backend phase in effect - Framepointer_enabled bool - UseBASEntries bool // use Base Address Selection Entries in location lists and PC ranges - IsAsm bool // is the source assembly language, which may contain surprising idioms (e.g., call tables) + InParallel bool // parallel backend phase in effect + UseBASEntries bool // use Base Address Selection Entries in location lists and PC ranges + IsAsm bool // is the source assembly language, which may contain surprising idioms (e.g., call tables) // state for writing objects Text []*LSym diff --git a/src/cmd/internal/obj/sym.go b/src/cmd/internal/obj/sym.go index 34f61b7f62..d58877ee15 100644 --- a/src/cmd/internal/obj/sym.go +++ b/src/cmd/internal/obj/sym.go @@ -53,7 +53,6 @@ func Linknew(arch *LinkArch) *Link { } ctxt.Flag_optimize = true - ctxt.Framepointer_enabled = objabi.Framepointer_enabled(objabi.GOOS, arch.Name) return ctxt } diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index 82a2e6adc4..a530636373 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -4833,12 +4833,12 @@ func (ab *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { ctxt.Diag("directly calling duff when dynamically linking Go") } - if ctxt.Framepointer_enabled && yt.zcase == Zcallduff && ctxt.Arch.Family == sys.AMD64 { + if yt.zcase == Zcallduff && ctxt.Arch.Family == sys.AMD64 { // Maintain BP around call, since duffcopy/duffzero can't do it // (the call jumps into the middle of the function). // This makes it possible to see call sites for duffcopy/duffzero in // BP-based profiling tools like Linux perf (which is the - // whole point of obj.Framepointer_enabled). + // whole point of maintaining frame pointers in Go). // MOVQ BP, -16(SP) // LEAQ -16(SP), BP ab.Put(bpduff1) @@ -4852,7 +4852,7 @@ func (ab *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { r.Siz = 4 ab.PutInt32(0) - if ctxt.Framepointer_enabled && yt.zcase == Zcallduff && ctxt.Arch.Family == sys.AMD64 { + if yt.zcase == Zcallduff && ctxt.Arch.Family == sys.AMD64 { // Pop BP pushed above. // MOVQ 0(BP), BP ab.Put(bpduff2) diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index c1e5bea055..016c247ff5 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -582,7 +582,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } var bpsize int - if ctxt.Arch.Family == sys.AMD64 && ctxt.Framepointer_enabled && + 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 diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index f7873a42b9..6c5a9ba441 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -133,9 +133,8 @@ func init() { } } -func Framepointer_enabled(goos, goarch string) bool { - return framepointer_enabled != 0 && (goarch == "amd64" || goarch == "arm64" && (goos == "linux" || goos == "darwin")) -} +// Note: must agree with runtime.framepointer_enabled. +var Framepointer_enabled = GOARCH == "amd64" || GOARCH == "arm64" && (GOOS == "linux" || GOOS == "darwin") func addexp(s string) { // Could do general integer parsing here, but the runtime copy doesn't yet. @@ -159,7 +158,6 @@ func addexp(s string) { } var ( - framepointer_enabled int = 1 Fieldtrack_enabled int Preemptibleloops_enabled int Staticlockranking_enabled int @@ -174,7 +172,6 @@ var exper = []struct { val *int }{ {"fieldtrack", &Fieldtrack_enabled}, - {"framepointer", &framepointer_enabled}, {"preemptibleloops", &Preemptibleloops_enabled}, {"staticlockranking", &Staticlockranking_enabled}, } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 09c7bbfb53..d6ee437bca 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -775,14 +775,6 @@ func (ctxt *Link) linksetup() { sb.SetSize(0) sb.AddUint8(uint8(objabi.GOARM)) } - - if objabi.Framepointer_enabled(objabi.GOOS, objabi.GOARCH) { - fpe := ctxt.loader.LookupOrCreateSym("runtime.framepointer_enabled", 0) - sb := ctxt.loader.MakeSymbolUpdater(fpe) - sb.SetType(sym.SNOPTRDATA) - sb.SetSize(0) - sb.AddUint8(1) - } } else { // If OTOH the module does not contain the runtime package, // create a local symbol for the moduledata. diff --git a/src/runtime/cgocall.go b/src/runtime/cgocall.go index 099aa540e0..427ed0ffb9 100644 --- a/src/runtime/cgocall.go +++ b/src/runtime/cgocall.go @@ -286,13 +286,8 @@ func cgocallbackg1(ctxt uintptr) { // Additional two words (16-byte alignment) are for saving FP. cb = (*args)(unsafe.Pointer(sp + 7*sys.PtrSize)) case "amd64": - // On amd64, stack frame is two words, plus caller PC. - if framepointer_enabled { - // In this case, there's also saved BP. - cb = (*args)(unsafe.Pointer(sp + 4*sys.PtrSize)) - break - } - cb = (*args)(unsafe.Pointer(sp + 3*sys.PtrSize)) + // On amd64, stack frame is two words, plus caller PC and BP. + cb = (*args)(unsafe.Pointer(sp + 4*sys.PtrSize)) case "386": // On 386, stack frame is three words, plus caller PC. cb = (*args)(unsafe.Pointer(sp + 4*sys.PtrSize)) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 5e38b3194c..341d52aea8 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -5459,9 +5459,6 @@ func setMaxThreads(in int) (out int) { } func haveexperiment(name string) bool { - if name == "framepointer" { - return framepointer_enabled // set by linker - } x := sys.Goexperiment for x != "" { xname := "" diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 64c6cc7198..a3157037e7 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -329,7 +329,7 @@ type gobuf struct { ctxt unsafe.Pointer ret sys.Uintreg lr uintptr - bp uintptr // for GOEXPERIMENT=framepointer + bp uintptr // for framepointer-enabled architectures } // sudog represents a g in a wait list, such as for sending/receiving @@ -1046,8 +1046,7 @@ var ( isIntel bool lfenceBeforeRdtsc bool - goarm uint8 // set by cmd/link on arm systems - framepointer_enabled bool // set by cmd/link + goarm uint8 // set by cmd/link on arm systems ) // Set by the linker so the runtime can determine the buildmode. @@ -1055,3 +1054,6 @@ var ( islibrary bool // -buildmode=c-shared isarchive bool // -buildmode=c-archive ) + +// Must agree with cmd/internal/objabi.Framepointer_enabled. +const framepointer_enabled = GOARCH == "amd64" || GOARCH == "arm64" && (GOOS == "linux" || GOOS == "darwin") diff --git a/src/runtime/stack.go b/src/runtime/stack.go index 0e930f60db..403b3c313e 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -648,12 +648,8 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool { } // Adjust saved base pointer if there is one. + // TODO what about arm64 frame pointer adjustment? if sys.ArchFamily == sys.AMD64 && frame.argp-frame.varp == 2*sys.RegSize { - if !framepointer_enabled { - print("runtime: found space for saved base pointer, but no framepointer experiment\n") - print("argp=", hex(frame.argp), " varp=", hex(frame.varp), "\n") - throw("bad frame layout") - } if stackDebug >= 3 { print(" saved bp\n") } diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index 7850eceafa..94f4a44976 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -269,9 +269,9 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in frame.varp -= sys.RegSize } - // If framepointer_enabled and there's a frame, then - // there's a saved bp here. - if frame.varp > frame.sp && (framepointer_enabled && GOARCH == "amd64" || GOARCH == "arm64") { + // For architectures with frame pointers, if there's + // a frame, then there's a saved frame pointer here. + if frame.varp > frame.sp && (GOARCH == "amd64" || GOARCH == "arm64") { frame.varp -= sys.RegSize } -- GitLab From 8247da36621986a282c96b2abc236bbda2fdef41 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 17 Jul 2020 12:12:59 -0700 Subject: [PATCH 0365/1792] cmd/compile,cmd/asm: simplify recording of branch targets We currently use two fields to store the targets of branches. Some phases use p.To.Val, some use p.Pcond. Rewrite so that every branch instruction uses p.To.Val. p.From.Val is also used in rare instances. Introduce a Pool link for use by arm/arm64, instead of repurposing Pcond. This is a cleanup CL in preparation for some stack frame CLs. Change-Id: I9055bf0a1d986aff421e47951a1dedc301c846f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/243318 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/amd64/ssa.go | 4 ++-- src/cmd/compile/internal/gc/gsubr.go | 2 +- src/cmd/compile/internal/gc/ssa.go | 2 +- src/cmd/compile/internal/s390x/ssa.go | 4 ++-- src/cmd/compile/internal/x86/ssa.go | 4 ++-- src/cmd/internal/obj/arm/asm5.go | 16 +++++++------- src/cmd/internal/obj/arm/obj5.go | 10 ++++----- src/cmd/internal/obj/arm64/asm7.go | 30 +++++++++++++-------------- src/cmd/internal/obj/arm64/obj7.go | 16 +++++++------- src/cmd/internal/obj/link.go | 17 +++++++++++++-- src/cmd/internal/obj/mips/asm0.go | 24 ++++++++++----------- src/cmd/internal/obj/mips/obj0.go | 14 ++++++------- src/cmd/internal/obj/pass.go | 17 +++++++-------- src/cmd/internal/obj/ppc64/asm9.go | 18 ++++++++-------- src/cmd/internal/obj/ppc64/obj9.go | 12 +++++------ src/cmd/internal/obj/riscv/obj.go | 28 ++++++++++++------------- src/cmd/internal/obj/s390x/asmz.go | 18 ++++++++-------- src/cmd/internal/obj/s390x/objz.go | 10 ++++----- src/cmd/internal/obj/util.go | 6 ++---- src/cmd/internal/obj/x86/asm6.go | 12 +++++------ src/cmd/internal/obj/x86/obj6.go | 12 +++++------ 21 files changed, 142 insertions(+), 134 deletions(-) diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index 9d8a0920b3..4ac877986c 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -319,8 +319,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { // 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.Val = n1 - j2.To.Val = s.Pc() + j1.To.SetTarget(n1) + j2.To.SetTarget(s.Pc()) } case ssa.OpAMD64HMULQ, ssa.OpAMD64HMULL, ssa.OpAMD64HMULQU, ssa.OpAMD64HMULLU: diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go index 15a84a8a43..480d411f49 100644 --- a/src/cmd/compile/internal/gc/gsubr.go +++ b/src/cmd/compile/internal/gc/gsubr.go @@ -342,6 +342,6 @@ func Patch(p *obj.Prog, to *obj.Prog) { if p.To.Type != obj.TYPE_BRANCH { Fatalf("patch: not a branch") } - p.To.Val = to + p.To.SetTarget(to) p.To.Offset = to.Pc } diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 104dd403ea..52083d999e 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -6182,7 +6182,7 @@ func genssa(f *ssa.Func, pp *Progs) { // Resolve branches, and relax DefaultStmt into NotStmt for _, br := range s.Branches { - br.P.To.Val = s.bstart[br.B.ID] + br.P.To.SetTarget(s.bstart[br.B.ID]) if br.P.Pos.IsStmt() != src.PosIsStmt { br.P.Pos = br.P.Pos.WithNotStmt() } else if v0 := br.B.FirstPossibleStmtValue(); v0 != nil && v0.Pos.Line() == br.P.Pos.Line() && v0.Pos.IsStmt() == src.PosIsStmt { diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go index 4cf4b70a32..00d253c95a 100644 --- a/src/cmd/compile/internal/s390x/ssa.go +++ b/src/cmd/compile/internal/s390x/ssa.go @@ -338,8 +338,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { n.To.Reg = dividend } - j.To.Val = n - j2.To.Val = s.Pc() + j.To.SetTarget(n) + j2.To.SetTarget(s.Pc()) } case ssa.OpS390XADDconst, ssa.OpS390XADDWconst: opregregimm(s, v.Op.Asm(), v.Reg(), v.Args[0].Reg(), v.AuxInt) diff --git a/src/cmd/compile/internal/x86/ssa.go b/src/cmd/compile/internal/x86/ssa.go index 2de978c28a..c21ac32297 100644 --- a/src/cmd/compile/internal/x86/ssa.go +++ b/src/cmd/compile/internal/x86/ssa.go @@ -261,8 +261,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { n.To.Reg = x86.REG_DX } - j.To.Val = n - j2.To.Val = s.Pc() + j.To.SetTarget(n) + j2.To.SetTarget(s.Pc()) } case ssa.Op386HMULL, ssa.Op386HMULLU: diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go index 7b7e42ee2e..269a4223d5 100644 --- a/src/cmd/internal/obj/arm/asm5.go +++ b/src/cmd/internal/obj/arm/asm5.go @@ -644,7 +644,7 @@ func (c *ctxt5) flushpool(p *obj.Prog, skip int, force int) bool { q := c.newprog() q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Link + q.To.SetTarget(p.Link) q.Link = c.blitrl q.Pos = p.Pos c.blitrl = q @@ -705,7 +705,7 @@ func (c *ctxt5) addpool(p *obj.Prog, a *obj.Addr) { if t.Rel == nil { for q := c.blitrl; q != nil; q = q.Link { /* could hash on t.t0.offset */ if q.Rel == nil && q.To == t.To { - p.Pcond = q + p.Pool = q return } } @@ -724,8 +724,8 @@ func (c *ctxt5) addpool(p *obj.Prog, a *obj.Addr) { c.elitrl = q c.pool.size += 4 - // Store the link to the pool entry in Pcond. - p.Pcond = q + // Store the link to the pool entry in Pool. + p.Pool = q } func (c *ctxt5) regoff(a *obj.Addr) int32 { @@ -1584,8 +1584,8 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { break } - if p.Pcond != nil { - v = int32((p.Pcond.Pc - c.pc) - 8) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - c.pc) - 8) } o1 |= (uint32(v) >> 2) & 0xffffff @@ -3023,7 +3023,7 @@ func (c *ctxt5) omvr(p *obj.Prog, a *obj.Addr, dr int) uint32 { func (c *ctxt5) omvl(p *obj.Prog, a *obj.Addr, dr int) uint32 { var o1 uint32 - if p.Pcond == nil { + if p.Pool == nil { c.aclass(a) v := immrot(^uint32(c.instoffset)) if v == 0 { @@ -3035,7 +3035,7 @@ func (c *ctxt5) omvl(p *obj.Prog, a *obj.Addr, dr int) uint32 { o1 |= uint32(v) o1 |= (uint32(dr) & 15) << 12 } else { - v := int32(p.Pcond.Pc - p.Pc - 8) + v := int32(p.Pool.Pc - p.Pc - 8) o1 = c.olr(v, REGPC, dr, int(p.Scond)&C_SCOND) } diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index 86831f2b44..4d9187b530 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -406,7 +406,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { mov.To.Reg = REG_R2 // B.NE branch target is MOVW above - bne.Pcond = mov + bne.To.SetTarget(mov) // ADD $(autosize+4), R13, R3 p = obj.Appendp(mov, newprog) @@ -428,7 +428,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = ABNE p.To.Type = obj.TYPE_BRANCH - p.Pcond = end + p.To.SetTarget(end) // ADD $4, R13, R4 p = obj.Appendp(p, newprog) @@ -452,7 +452,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = AB p.To.Type = obj.TYPE_BRANCH - p.Pcond = end + p.To.SetTarget(end) // reset for subsequent passes p = end @@ -741,7 +741,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { movw.To.Type = obj.TYPE_REG movw.To.Reg = REG_R3 - bls.Pcond = movw + bls.To.SetTarget(movw) // BL runtime.morestack call := obj.Appendp(movw, c.newprog) @@ -762,7 +762,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { b := obj.Appendp(pcdata, c.newprog) b.As = obj.AJMP b.To.Type = obj.TYPE_BRANCH - b.Pcond = c.cursym.Func.Text.Link + b.To.SetTarget(c.cursym.Func.Text.Link) b.Spadj = +framesize return end diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 7a5a8ff38c..0fa0c20b6a 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -977,8 +977,8 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) /* very large branches */ - if (o.type_ == 7 || o.type_ == 39 || o.type_ == 40) && p.Pcond != nil { // 7: BEQ and like, 39: CBZ and like, 40: TBZ and like - otxt := p.Pcond.Pc - pc + if (o.type_ == 7 || o.type_ == 39 || o.type_ == 40) && p.To.Target() != nil { // 7: BEQ and like, 39: CBZ and like, 40: TBZ and like + otxt := p.To.Target().Pc - pc var toofar bool switch o.type_ { case 7, 39: // branch instruction encodes 19 bits @@ -992,14 +992,14 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p.Link = q q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Pcond - p.Pcond = q + q.To.SetTarget(p.To.Target()) + p.To.SetTarget(q) q = c.newprog() q.Link = p.Link p.Link = q q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = q.Link.Link + q.To.SetTarget(q.Link.Link) bflag = 1 } } @@ -1123,7 +1123,7 @@ func (c *ctxt7) flushpool(p *obj.Prog, skip int) { q := c.newprog() q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Link + q.To.SetTarget(p.Link) q.Link = c.blitrl q.Pos = p.Pos c.blitrl = q @@ -1249,7 +1249,7 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) { for q := c.blitrl; q != nil; q = q.Link { /* could hash on t.t0.offset */ if q.To == t.To { - p.Pcond = q + p.Pool = q return } } @@ -1266,7 +1266,7 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) { c.elitrl = q c.pool.size = -c.pool.size & (funcAlign - 1) c.pool.size += uint32(sz) - p.Pcond = q + p.Pool = q } func (c *ctxt7) regoff(a *obj.Addr) uint32 { @@ -6042,15 +6042,15 @@ func (c *ctxt7) opimm(p *obj.Prog, a obj.As) uint32 { func (c *ctxt7) brdist(p *obj.Prog, preshift int, flen int, shift int) int64 { v := int64(0) t := int64(0) - if p.Pcond != nil { - v = (p.Pcond.Pc >> uint(preshift)) - (c.pc >> uint(preshift)) + if p.To.Target() != nil { + v = (p.To.Target().Pc >> uint(preshift)) - (c.pc >> uint(preshift)) if (v & ((1 << uint(shift)) - 1)) != 0 { c.ctxt.Diag("misaligned label\n%v", p) } v >>= uint(shift) t = int64(1) << uint(flen-1) if v < -t || v >= t { - c.ctxt.Diag("branch too far %#x vs %#x [%p]\n%v\n%v", v, t, c.blitrl, p, p.Pcond) + c.ctxt.Diag("branch too far %#x vs %#x [%p]\n%v\n%v", v, t, c.blitrl, p, p.To.Target()) panic("branch too far") } } @@ -6526,7 +6526,7 @@ func (c *ctxt7) oaddi(p *obj.Prog, o1 int32, v int32, r int, rt int) uint32 { */ func (c *ctxt7) omovlit(as obj.As, p *obj.Prog, a *obj.Addr, dr int) uint32 { var o1 int32 - if p.Pcond == nil { /* not in literal pool */ + if p.Pool == nil { /* not in literal pool */ c.aclass(a) c.ctxt.Logf("omovlit add %d (%#x)\n", c.instoffset, uint64(c.instoffset)) @@ -6552,11 +6552,11 @@ func (c *ctxt7) omovlit(as obj.As, p *obj.Prog, a *obj.Addr, dr int) uint32 { w = 1 /* 64-bit SIMD/FP */ case AMOVD: - if p.Pcond.As == ADWORD { + if p.Pool.As == ADWORD { w = 1 /* 64-bit */ - } else if p.Pcond.To.Offset < 0 { + } else if p.Pool.To.Offset < 0 { w = 2 /* 32-bit, sign-extended to 64-bit */ - } else if p.Pcond.To.Offset >= 0 { + } else if p.Pool.To.Offset >= 0 { w = 0 /* 32-bit, zero-extended to 64-bit */ } else { c.ctxt.Diag("invalid operand %v in %v", a, p) diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index f54429fabe..56da854f16 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -187,9 +187,9 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { movlr.To.Type = obj.TYPE_REG movlr.To.Reg = REG_R3 if q != nil { - q.Pcond = movlr + q.To.SetTarget(movlr) } - bls.Pcond = movlr + bls.To.SetTarget(movlr) debug := movlr if false { @@ -220,7 +220,7 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { jmp := obj.Appendp(pcdata, c.newprog) jmp.As = AB jmp.To.Type = obj.TYPE_BRANCH - jmp.Pcond = c.cursym.Func.Text.Link + jmp.To.SetTarget(c.cursym.Func.Text.Link) jmp.Spadj = +framesize return end @@ -697,7 +697,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { mov.To.Reg = REG_R2 // CBNZ branches to the MOV above - cbnz.Pcond = mov + cbnz.To.SetTarget(mov) // ADD $(autosize+8), SP, R3 q = obj.Appendp(mov, c.newprog) @@ -719,7 +719,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = ABNE q.To.Type = obj.TYPE_BRANCH - q.Pcond = end + q.To.SetTarget(end) // ADD $8, SP, R4 q = obj.Appendp(q, c.newprog) @@ -743,7 +743,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = end + q.To.SetTarget(end) } case obj.ARET: @@ -913,7 +913,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q5.Reg = REGSP q5.To.Type = obj.TYPE_REG q5.To.Reg = REGFP - q1.Pcond = q5 + q1.From.SetTarget(q5) p = q5 } @@ -966,7 +966,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q5.Reg = REGSP q5.To.Type = obj.TYPE_REG q5.To.Reg = REGFP - q1.Pcond = q5 + q1.From.SetTarget(q5) p = q5 } } diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 1fc90db864..1d4217b5f5 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -237,6 +237,19 @@ const ( TYPE_REGLIST ) +func (a *Addr) Target() *Prog { + if a.Type == TYPE_BRANCH && a.Val != nil { + return a.Val.(*Prog) + } + return nil +} +func (a *Addr) SetTarget(t *Prog) { + if a.Type != TYPE_BRANCH { + panic("setting branch target when type is not TYPE_BRANCH") + } + a.Val = t +} + // Prog describes a single machine instruction. // // The general instruction form is: @@ -255,7 +268,7 @@ const ( // to avoid too much changes in a single swing. // (1) scheme is enough to express any kind of operand combination. // -// Jump instructions use the Pcond field to point to the target instruction, +// Jump instructions use the To.Val field to point to the target *Prog, // which must be in the same linked list as the jump instruction. // // The Progs for a given function are arranged in a list linked through the Link field. @@ -274,7 +287,7 @@ type Prog struct { From Addr // first source operand RestArgs []Addr // can pack any operands that not fit into {Prog.From, Prog.To} To Addr // destination operand (second is RegTo2 below) - Pcond *Prog // target of conditional jump + Pool *Prog // constant pool entry, for arm,arm64 back ends Forwd *Prog // for x86 back end Rel *Prog // for x86, arm back ends Pc int64 // for back ends or assembler: virtual or actual program counter, depending on phase diff --git a/src/cmd/internal/obj/mips/asm0.go b/src/cmd/internal/obj/mips/asm0.go index faa827da9f..6107974745 100644 --- a/src/cmd/internal/obj/mips/asm0.go +++ b/src/cmd/internal/obj/mips/asm0.go @@ -460,8 +460,8 @@ func span0(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) // very large conditional branches - if o.type_ == 6 && p.Pcond != nil { - otxt = p.Pcond.Pc - pc + if o.type_ == 6 && p.To.Target() != nil { + otxt = p.To.Target().Pc - pc if otxt < -(1<<17)+10 || otxt >= (1<<17)-10 { q = c.newprog() q.Link = p.Link @@ -469,15 +469,15 @@ func span0(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q.As = AJMP q.Pos = p.Pos q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Pcond - p.Pcond = q + q.To.SetTarget(p.To.Target()) + p.To.SetTarget(q) q = c.newprog() q.Link = p.Link p.Link = q q.As = AJMP q.Pos = p.Pos q.To.Type = obj.TYPE_BRANCH - q.Pcond = q.Link.Link + q.To.SetTarget(q.Link.Link) c.addnop(p.Link) c.addnop(p) @@ -1230,10 +1230,10 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) { case 6: /* beq r1,[r2],sbra */ v := int32(0) - if p.Pcond == nil { + if p.To.Target() == nil { v = int32(-4) >> 2 } else { - v = int32(p.Pcond.Pc-p.Pc-4) >> 2 + v = int32(p.To.Target().Pc-p.Pc-4) >> 2 } if (v<<16)>>16 != v { c.ctxt.Diag("short branch too far\n%v", p) @@ -1285,25 +1285,25 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) { 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.Pcond == nil { + if p.To.Target() == nil { v = int32(-4) >> 2 } else { - v = int32(p.Pcond.Pc-p.Pc-4) >> 2 + v = int32(p.To.Target().Pc-p.Pc-4) >> 2 } if (v<<16)>>16 == v { o1 = OP_IRR(c.opirr(ABEQ), uint32(v), uint32(REGZERO), uint32(REGZERO)) break } } - if p.Pcond == nil { + if p.To.Target() == nil { v = int32(p.Pc) >> 2 } else { - v = int32(p.Pcond.Pc) >> 2 + v = int32(p.To.Target().Pc) >> 2 } o1 = OP_JMP(c.opirr(p.As), uint32(v)) if p.To.Sym == nil { p.To.Sym = c.cursym.Func.Text.From.Sym - p.To.Offset = p.Pcond.Pc + p.To.Offset = p.To.Target().Pc } rel := obj.Addrel(c.cursym) rel.Off = int32(c.pc) diff --git a/src/cmd/internal/obj/mips/obj0.go b/src/cmd/internal/obj/mips/obj0.go index 77cad979a6..f19facc00c 100644 --- a/src/cmd/internal/obj/mips/obj0.go +++ b/src/cmd/internal/obj/mips/obj0.go @@ -227,11 +227,11 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } else { p.Mark |= BRANCH } - q1 := p.Pcond + q1 := p.To.Target() if q1 != nil { for q1.As == obj.ANOP { q1 = q1.Link - p.Pcond = q1 + p.To.SetTarget(q1) } if q1.Mark&LEAF == 0 { @@ -424,8 +424,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, newprog) q.As = obj.ANOP - p1.Pcond = q - p2.Pcond = q + p1.To.SetTarget(q) + p2.To.SetTarget(q) } case ARET: @@ -778,7 +778,7 @@ func (c *ctxt0) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.To.Type = obj.TYPE_REG p.To.Reg = REG_R3 if q != nil { - q.Pcond = p + q.To.SetTarget(p) p.Mark |= LABEL } @@ -805,14 +805,14 @@ func (c *ctxt0) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.As = AJMP p.To.Type = obj.TYPE_BRANCH - p.Pcond = c.cursym.Func.Text.Link + p.To.SetTarget(c.cursym.Func.Text.Link) p.Mark |= BRANCH // placeholder for q1's jump target p = obj.Appendp(p, c.newprog) p.As = obj.ANOP // zero-width place holder - q1.Pcond = p + q1.To.SetTarget(p) return p } diff --git a/src/cmd/internal/obj/pass.go b/src/cmd/internal/obj/pass.go index 4f156d969b..09d520b4e9 100644 --- a/src/cmd/internal/obj/pass.go +++ b/src/cmd/internal/obj/pass.go @@ -36,8 +36,8 @@ package obj // In the case of an infinite loop, brloop returns nil. func brloop(p *Prog) *Prog { c := 0 - for q := p; q != nil; q = q.Pcond { - if q.As != AJMP || q.Pcond == nil { + for q := p; q != nil; q = q.To.Target() { + if q.As != AJMP || q.To.Target() == nil { return q } c++ @@ -132,8 +132,6 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { continue } if p.To.Val != nil { - // TODO: Remove To.Val.(*Prog) in favor of p->pcond. - p.Pcond = p.To.Val.(*Prog) continue } @@ -158,8 +156,7 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { p.To.Type = TYPE_NONE } - p.To.Val = q - p.Pcond = q + p.To.SetTarget(q) } if !ctxt.Flag_optimize { @@ -168,12 +165,12 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { // Collapse series of jumps to jumps. for p := sym.Func.Text; p != nil; p = p.Link { - if p.Pcond == nil { + if p.To.Target() == nil { continue } - p.Pcond = brloop(p.Pcond) - if p.Pcond != nil && p.To.Type == TYPE_BRANCH { - p.To.Offset = p.Pcond.Pc + p.To.SetTarget(brloop(p.To.Target())) + if p.To.Target() != nil && p.To.Type == TYPE_BRANCH { + p.To.Offset = p.To.Target().Pc } } } diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 3c82477fc4..98b453de6c 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -725,22 +725,22 @@ func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) // very large conditional branches - if (o.type_ == 16 || o.type_ == 17) && p.Pcond != nil { - otxt = p.Pcond.Pc - pc + if (o.type_ == 16 || o.type_ == 17) && p.To.Target() != nil { + otxt = p.To.Target().Pc - pc if otxt < -(1<<15)+10 || otxt >= (1<<15)-10 { q = c.newprog() q.Link = p.Link p.Link = q q.As = ABR q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Pcond - p.Pcond = q + q.To.SetTarget(p.To.Target()) + p.To.SetTarget(q) q = c.newprog() q.Link = p.Link p.Link = q q.As = ABR q.To.Type = obj.TYPE_BRANCH - q.Pcond = q.Link.Link + q.To.SetTarget(q.Link.Link) //addnop(p->link); //addnop(p); @@ -2630,8 +2630,8 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { case 11: /* br/bl lbra */ v := int32(0) - if p.Pcond != nil { - v = int32(p.Pcond.Pc - p.Pc) + if p.To.Target() != nil { + v = int32(p.To.Target().Pc - p.Pc) if v&03 != 0 { c.ctxt.Diag("odd branch target address\n%v", p) v &^= 03 @@ -2781,8 +2781,8 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { } } v := int32(0) - if p.Pcond != nil { - v = int32(p.Pcond.Pc - p.Pc) + if p.To.Target() != nil { + v = int32(p.To.Target().Pc - p.Pc) } if v&03 != 0 { c.ctxt.Diag("odd branch target address\n%v", p) diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index 749f7066de..c012762a18 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -556,7 +556,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ABVS: p.Mark |= BRANCH q = p - q1 = p.Pcond + q1 = p.To.Target() if q1 != nil { // NOPs are not removed due to #40689. @@ -841,8 +841,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = obj.ANOP - p1.Pcond = q - p2.Pcond = q + p1.To.SetTarget(q) + p2.To.SetTarget(q) } case obj.ARET: @@ -1153,7 +1153,7 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.To.Type = obj.TYPE_REG p.To.Reg = REG_R5 if q != nil { - q.Pcond = p + q.To.SetTarget(p) } p = c.ctxt.EmitEntryStackMap(c.cursym, p, c.newprog) @@ -1248,13 +1248,13 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p = obj.Appendp(p, c.newprog) p.As = ABR p.To.Type = obj.TYPE_BRANCH - p.Pcond = p0.Link + p.To.SetTarget(p0.Link) // placeholder for q1's jump target p = obj.Appendp(p, c.newprog) p.As = obj.ANOP // zero-width place holder - q1.Pcond = p + q1.To.SetTarget(p) return p } diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index 2eb2935b31..d2816487e4 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -634,7 +634,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { getargp.Reg = 0 getargp.To = obj.Addr{Type: obj.TYPE_REG, Reg: REG_X12} - bneadj.Pcond = getargp + bneadj.To.SetTarget(getargp) calcargp := obj.Appendp(getargp, newprog) calcargp.As = AADDI @@ -647,7 +647,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { testargp.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_X12} testargp.Reg = REG_X13 testargp.To.Type = obj.TYPE_BRANCH - testargp.Pcond = endadj + testargp.To.SetTarget(endadj) adjargp := obj.Appendp(testargp, newprog) adjargp.As = AADDI @@ -665,7 +665,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { godone.As = AJAL godone.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} godone.To.Type = obj.TYPE_BRANCH - godone.Pcond = endadj + godone.To.SetTarget(endadj) } // Update stack-based offsets. @@ -890,27 +890,27 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { if p.To.Type != obj.TYPE_BRANCH { panic("assemble: instruction with branch-like opcode lacks destination") } - offset := p.Pcond.Pc - p.Pc + offset := p.To.Target().Pc - p.Pc if offset < -4096 || 4096 <= offset { // Branch is long. Replace it with a jump. jmp := obj.Appendp(p, newprog) jmp.As = AJAL jmp.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} jmp.To = obj.Addr{Type: obj.TYPE_BRANCH} - jmp.Pcond = p.Pcond + jmp.To.SetTarget(p.To.Target()) p.As = InvertBranch(p.As) - p.Pcond = jmp.Link + p.To.SetTarget(jmp.Link) // We may have made previous branches too long, // so recheck them. rescan = true } case AJAL: - if p.Pcond == nil { + if p.To.Target() == nil { panic("intersymbol jumps should be expressed as AUIPC+JALR") } - offset := p.Pcond.Pc - p.Pc + offset := p.To.Target().Pc - p.Pc if offset < -(1<<20) || (1<<20) <= offset { // Replace with 2-instruction sequence. This assumes // that TMP is not live across J instructions, since @@ -946,16 +946,16 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { case ABEQ, ABEQZ, ABGE, ABGEU, ABGEZ, ABGT, ABGTU, ABGTZ, ABLE, ABLEU, ABLEZ, ABLT, ABLTU, ABLTZ, ABNE, ABNEZ, AJAL: switch p.To.Type { case obj.TYPE_BRANCH: - p.To.Type, p.To.Offset = obj.TYPE_CONST, p.Pcond.Pc-p.Pc + p.To.Type, p.To.Offset = obj.TYPE_CONST, p.To.Target().Pc-p.Pc case obj.TYPE_MEM: panic("unhandled type") } case AAUIPC: if p.From.Type == obj.TYPE_BRANCH { - low, high, err := Split32BitImmediate(p.Pcond.Pc - p.Pc) + low, high, err := Split32BitImmediate(p.To.Target().Pc - p.Pc) if err != nil { - ctxt.Diag("%v: jump displacement %d too large", p, p.Pcond.Pc-p.Pc) + ctxt.Diag("%v: jump displacement %d too large", p, p.To.Target().Pc-p.Pc) } p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: high, Sym: cursym} p.Link.From.Offset = low @@ -1098,7 +1098,7 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, cursym *obj.LSym, newprog obj.ProgA p.To.Sym = ctxt.Lookup("runtime.morestack") } if to_more != nil { - to_more.Pcond = p + to_more.To.SetTarget(p) } p = jalrToSym(ctxt, p, newprog, REG_X5) @@ -1107,12 +1107,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, cursym *obj.LSym, newprog obj.ProgA p.As = AJAL p.To = obj.Addr{Type: obj.TYPE_BRANCH} p.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} - p.Pcond = cursym.Func.Text.Link + p.To.SetTarget(cursym.Func.Text.Link) // placeholder for to_done's jump target p = obj.Appendp(p, newprog) p.As = obj.ANOP // zero-width place holder - to_done.Pcond = p + to_done.To.SetTarget(p) return p } diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go index 29182ea805..68f01f1c5d 100644 --- a/src/cmd/internal/obj/s390x/asmz.go +++ b/src/cmd/internal/obj/s390x/asmz.go @@ -3001,8 +3001,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 11: // br/bl v := int32(0) - if p.Pcond != nil { - v = int32((p.Pcond.Pc - p.Pc) >> 1) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - p.Pc) >> 1) } if p.As == ABR && p.To.Sym == nil && int32(int16(v)) == v { @@ -3122,8 +3122,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 16: // conditional branch v := int32(0) - if p.Pcond != nil { - v = int32((p.Pcond.Pc - p.Pc) >> 1) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - p.Pc) >> 1) } mask := uint32(c.branchMask(p)) if p.To.Sym == nil && int32(int16(v)) == v { @@ -3440,7 +3440,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 41: // branch on count r1 := p.From.Reg - ri2 := (p.Pcond.Pc - p.Pc) >> 1 + ri2 := (p.To.Target().Pc - p.Pc) >> 1 if int64(int16(ri2)) != ri2 { c.ctxt.Diag("branch target too far away") } @@ -3885,8 +3885,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 89: // compare and branch reg reg var v int32 - if p.Pcond != nil { - v = int32((p.Pcond.Pc - p.Pc) >> 1) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - p.Pc) >> 1) } // Some instructions take a mask as the first argument. @@ -3930,8 +3930,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 90: // compare and branch reg $constant var v int32 - if p.Pcond != nil { - v = int32((p.Pcond.Pc - p.Pc) >> 1) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - p.Pc) >> 1) } // Some instructions take a mask as the first argument. diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go index ef6335d849..625bb0f7b4 100644 --- a/src/cmd/internal/obj/s390x/objz.go +++ b/src/cmd/internal/obj/s390x/objz.go @@ -454,8 +454,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = obj.ANOP - p1.Pcond = q - p2.Pcond = q + p1.To.SetTarget(q) + p2.To.SetTarget(q) } case obj.ARET: @@ -679,14 +679,14 @@ func (c *ctxtz) stacksplitPost(p *obj.Prog, pPre *obj.Prog, pPreempt *obj.Prog, // MOVD LR, R5 p = obj.Appendp(pcdata, c.newprog) - pPre.Pcond = p + pPre.To.SetTarget(p) p.As = AMOVD p.From.Type = obj.TYPE_REG p.From.Reg = REG_LR p.To.Type = obj.TYPE_REG p.To.Reg = REG_R5 if pPreempt != nil { - pPreempt.Pcond = p + pPreempt.To.SetTarget(p) } // BL runtime.morestack(SB) @@ -709,7 +709,7 @@ func (c *ctxtz) stacksplitPost(p *obj.Prog, pPre *obj.Prog, pPreempt *obj.Prog, p.As = ABR p.To.Type = obj.TYPE_BRANCH - p.Pcond = c.cursym.Func.Text.Link + p.To.SetTarget(c.cursym.Func.Text.Link) return p } diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index d020026445..a30ccf0564 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -251,10 +251,8 @@ func WriteDconv(w io.Writer, p *Prog, a *Addr) { case TYPE_BRANCH: if a.Sym != nil { fmt.Fprintf(w, "%s(SB)", a.Sym.Name) - } else if p != nil && p.Pcond != nil { - fmt.Fprint(w, p.Pcond.Pc) - } else if a.Val != nil { - fmt.Fprint(w, a.Val.(*Prog).Pc) + } else if a.Target() != nil { + fmt.Fprint(w, a.Target().Pc) } else { fmt.Fprintf(w, "%d(PC)", a.Offset) } diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index a530636373..fb99c620ad 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -1855,7 +1855,7 @@ func spadjop(ctxt *obj.Link, l, q obj.As) obj.As { // no standalone or macro-fused jump will straddle or end on a 32 byte boundary // by inserting NOPs before the jumps func isJump(p *obj.Prog) bool { - return p.Pcond != nil || p.As == obj.AJMP || p.As == obj.ACALL || + return p.To.Target() != nil || p.As == obj.AJMP || p.As == obj.ACALL || p.As == obj.ARET || p.As == obj.ADUFFCOPY || p.As == obj.ADUFFZERO } @@ -1867,7 +1867,7 @@ func lookForJCC(p *obj.Prog) *obj.Prog { for q = p.Link; q != nil && (q.As == obj.APCDATA || q.As == obj.AFUNCDATA || q.As == obj.ANOP); q = q.Link { } - if q == nil || q.Pcond == nil || p.As == obj.AJMP || p.As == obj.ACALL { + if q == nil || q.To.Target() == nil || p.As == obj.AJMP || p.As == obj.ACALL { return nil } @@ -2051,8 +2051,8 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { } for p := s.Func.Text; p != nil; p = p.Link { - if p.To.Type == obj.TYPE_BRANCH && p.Pcond == nil { - p.Pcond = p + if p.To.Type == obj.TYPE_BRANCH && p.To.Target() == nil { + p.To.SetTarget(p) } if p.As == AADJSP { p.To.Type = obj.TYPE_REG @@ -2088,7 +2088,7 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { for p := s.Func.Text; p != nil; p = p.Link { count++ p.Back = branchShort // use short branches first time through - if q := p.Pcond; q != nil && (q.Back&branchShort != 0) { + if q := p.To.Target(); q != nil && (q.Back&branchShort != 0) { p.Back |= branchBackwards q.Back |= branchLoopHead } @@ -4886,7 +4886,7 @@ func (ab *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { // TODO: Check in input, preserve in brchain. // Fill in backward jump now. - q = p.Pcond + q = p.To.Target() if q == nil { ctxt.Diag("jmp/branch/loop without target") diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index 016c247ff5..18a6afcd77 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -765,7 +765,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } // Set jne branch target. - jne.Pcond = p + jne.To.SetTarget(p) // CMPQ panic_argp(BX), DI p = obj.Appendp(p, newprog) @@ -783,7 +783,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = AJNE p.To.Type = obj.TYPE_BRANCH - p.Pcond = end + p.To.SetTarget(end) // MOVQ SP, panic_argp(BX) p = obj.Appendp(p, newprog) @@ -801,7 +801,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = obj.AJMP p.To.Type = obj.TYPE_BRANCH - p.Pcond = end + p.To.SetTarget(end) // Reset p for following code. p = end @@ -1144,12 +1144,12 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA jmp := obj.Appendp(pcdata, newprog) jmp.As = obj.AJMP jmp.To.Type = obj.TYPE_BRANCH - jmp.Pcond = cursym.Func.Text.Link + jmp.To.SetTarget(cursym.Func.Text.Link) jmp.Spadj = +framesize - jls.Pcond = call + jls.To.SetTarget(call) if q1 != nil { - q1.Pcond = call + q1.To.SetTarget(call) } return end -- GitLab From cdc635547fc436dc49c91ddb172b0e101febd3d7 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 30 Jun 2020 15:59:40 -0700 Subject: [PATCH 0366/1792] cmd/compile: invalidate zero-use values during rewrite This helps remove uses that aren't needed any more. That in turn helps other rules with Uses==1 conditions fire. Update #39918 Change-Id: I68635b675472f1d59e59604e4d34b949a0016533 Reviewed-on: https://go-review.googlesource.com/c/go/+/249463 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/ssa/decompose.go | 8 +++++--- src/cmd/compile/internal/ssa/lower.go | 2 +- src/cmd/compile/internal/ssa/opt.go | 2 +- src/cmd/compile/internal/ssa/rewrite.go | 22 +++++++++++++++++++++- src/cmd/compile/internal/ssa/softfloat.go | 2 +- src/cmd/compile/internal/ssa/value.go | 20 ++++++++++++++++++++ 6 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/cmd/compile/internal/ssa/decompose.go b/src/cmd/compile/internal/ssa/decompose.go index 6e72e3825c..ab27ba85ae 100644 --- a/src/cmd/compile/internal/ssa/decompose.go +++ b/src/cmd/compile/internal/ssa/decompose.go @@ -23,9 +23,11 @@ func decomposeBuiltIn(f *Func) { } // Decompose other values - applyRewrite(f, rewriteBlockdec, rewriteValuedec) + // Note: deadcode is false because we need to keep the original + // values around so the name component resolution below can still work. + applyRewrite(f, rewriteBlockdec, rewriteValuedec, leaveDeadValues) if f.Config.RegSize == 4 { - applyRewrite(f, rewriteBlockdec64, rewriteValuedec64) + applyRewrite(f, rewriteBlockdec64, rewriteValuedec64, leaveDeadValues) } // Split up named values into their components. @@ -215,7 +217,7 @@ func decomposeInterfacePhi(v *Value) { } func decomposeArgs(f *Func) { - applyRewrite(f, rewriteBlockdecArgs, rewriteValuedecArgs) + applyRewrite(f, rewriteBlockdecArgs, rewriteValuedecArgs, removeDeadValues) } func decomposeUser(f *Func) { diff --git a/src/cmd/compile/internal/ssa/lower.go b/src/cmd/compile/internal/ssa/lower.go index ab0fa803bf..f332b2e028 100644 --- a/src/cmd/compile/internal/ssa/lower.go +++ b/src/cmd/compile/internal/ssa/lower.go @@ -7,7 +7,7 @@ package ssa // convert to machine-dependent ops func lower(f *Func) { // repeat rewrites until we find no more rewrites - applyRewrite(f, f.Config.lowerBlock, f.Config.lowerValue) + applyRewrite(f, f.Config.lowerBlock, f.Config.lowerValue, removeDeadValues) } // checkLower checks for unlowered opcodes and fails if we find one. diff --git a/src/cmd/compile/internal/ssa/opt.go b/src/cmd/compile/internal/ssa/opt.go index 6e91fd7da3..128e614175 100644 --- a/src/cmd/compile/internal/ssa/opt.go +++ b/src/cmd/compile/internal/ssa/opt.go @@ -6,5 +6,5 @@ package ssa // machine-independent optimization func opt(f *Func) { - applyRewrite(f, rewriteBlockgeneric, rewriteValuegeneric) + applyRewrite(f, rewriteBlockgeneric, rewriteValuegeneric, removeDeadValues) } diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index fb35691296..3df9ad24f9 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -20,7 +20,15 @@ import ( "path/filepath" ) -func applyRewrite(f *Func, rb blockRewriter, rv valueRewriter) { +type deadValueChoice bool + +const ( + leaveDeadValues deadValueChoice = false + removeDeadValues = true +) + +// deadcode indicates that rewrite should try to remove any values that become dead. +func applyRewrite(f *Func, rb blockRewriter, rv valueRewriter, deadcode deadValueChoice) { // repeat rewrites until we find no more rewrites pendingLines := f.cachedLineStarts // Holds statement boundaries that need to be moved to a new value/block pendingLines.clear() @@ -56,6 +64,18 @@ func applyRewrite(f *Func, rb blockRewriter, rv valueRewriter) { *v0 = *v v0.Args = append([]*Value{}, v.Args...) // make a new copy, not aliasing } + if v.Uses == 0 && v.removeable() { + if v.Op != OpInvalid && deadcode == removeDeadValues { + // Reset any values that are now unused, so that we decrement + // the use count of all of its arguments. + // Not quite a deadcode pass, because it does not handle cycles. + // But it should help Uses==1 rules to fire. + v.reset(OpInvalid) + change = true + } + // No point rewriting values which aren't used. + continue + } vchange := phielimValue(v) if vchange && debug > 1 { diff --git a/src/cmd/compile/internal/ssa/softfloat.go b/src/cmd/compile/internal/ssa/softfloat.go index 4b578b133b..8db4334fef 100644 --- a/src/cmd/compile/internal/ssa/softfloat.go +++ b/src/cmd/compile/internal/ssa/softfloat.go @@ -72,7 +72,7 @@ func softfloat(f *Func) { if newInt64 && f.Config.RegSize == 4 { // On 32bit arch, decompose Uint64 introduced in the switch above. decomposeBuiltIn(f) - applyRewrite(f, rewriteBlockdec64, rewriteValuedec64) + applyRewrite(f, rewriteBlockdec64, rewriteValuedec64, removeDeadValues) } } diff --git a/src/cmd/compile/internal/ssa/value.go b/src/cmd/compile/internal/ssa/value.go index 7ead0ff300..7fc33772d3 100644 --- a/src/cmd/compile/internal/ssa/value.go +++ b/src/cmd/compile/internal/ssa/value.go @@ -460,3 +460,23 @@ func (v *Value) LackingPos() bool { return v.Op == OpVarDef || v.Op == OpVarKill || v.Op == OpVarLive || v.Op == OpPhi || (v.Op == OpFwdRef || v.Op == OpCopy) && v.Type == types.TypeMem } + +// removeable reports whether the value v can be removed from the SSA graph entirely +// if its use count drops to 0. +func (v *Value) removeable() bool { + if v.Type.IsVoid() { + // Void ops, like nil pointer checks, must stay. + return false + } + if v.Type.IsMemory() { + // All memory ops aren't needed here, but we do need + // to keep calls at least (because they might have + // syncronization operations we can't see). + return false + } + if v.Op.HasSideEffects() { + // These are mostly synchronization operations. + return false + } + return true +} -- GitLab From 4f76fe86756841befb6574ce4bf04113d14389d4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 26 Aug 2020 17:26:05 -0700 Subject: [PATCH 0367/1792] cmd/go, testing, os: fail test that calls os.Exit(0) This catches cases where a test calls code that calls os.Exit(0), thereby skipping all subsequent tests. Fixes #29062 Change-Id: If9478972f40189e27623557e7141469ca4234d89 Reviewed-on: https://go-review.googlesource.com/c/go/+/250977 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- doc/go1.16.html | 12 ++- src/cmd/go/internal/test/flagdefs_test.go | 11 ++- src/cmd/go/internal/test/genflags.go | 7 +- src/cmd/go/internal/test/test.go | 3 +- src/cmd/go/testdata/script/test_exit.txt | 114 ++++++++++++++++++++++ src/internal/testlog/exit.go | 33 +++++++ src/os/proc.go | 8 ++ src/testing/internal/testdeps/deps.go | 5 + src/testing/testing.go | 10 ++ 9 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 src/cmd/go/testdata/script/test_exit.txt create mode 100644 src/internal/testlog/exit.go diff --git a/doc/go1.16.html b/doc/go1.16.html index c82b3b9276..805234bdab 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -52,6 +52,16 @@ Do not send CLs removing the interior tags from such phrases. TODO: write and link to tutorial or blog post

+

+ When using go test, a test that + calls os.Exit(0) during execution of a test function + will now be considered to fail. + This will help catch cases in which a test calls code that calls + os.Exit(0) and thereby stops running all future tests. + If a TestMain function calls os.Exit(0) + that is still considered to be a passing test. +

+

TODO

@@ -101,7 +111,7 @@ Do not send CLs removing the interior tags from such phrases.

net

-

+

The case of I/O on a closed network connection, or I/O on a network connection that is closed before any of the I/O completes, can now be detected using the new ErrClosed error. diff --git a/src/cmd/go/internal/test/flagdefs_test.go b/src/cmd/go/internal/test/flagdefs_test.go index 7562415298..ab5440b380 100644 --- a/src/cmd/go/internal/test/flagdefs_test.go +++ b/src/cmd/go/internal/test/flagdefs_test.go @@ -16,9 +16,14 @@ func TestPassFlagToTestIncludesAllTestFlags(t *testing.T) { return } name := strings.TrimPrefix(f.Name, "test.") - if name != "testlogfile" && !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.)") + switch name { + case "testlogfile", "paniconexit0": + // 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.)") + } } }) diff --git a/src/cmd/go/internal/test/genflags.go b/src/cmd/go/internal/test/genflags.go index 512fa1671e..5e83d53980 100644 --- a/src/cmd/go/internal/test/genflags.go +++ b/src/cmd/go/internal/test/genflags.go @@ -62,9 +62,10 @@ func testFlags() []string { } name := strings.TrimPrefix(f.Name, "test.") - if name == "testlogfile" { - // test.testlogfile is “for use only by cmd/go” - } else { + switch name { + case "testlogfile", "paniconexit0": + // These flags are only for use by cmd/go. + default: names = append(names, name) } }) diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 3aee6939d2..1ea6d2881e 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -1164,7 +1164,8 @@ func (c *runCache) builderRunTest(b *work.Builder, ctx context.Context, a *work. if !c.disableCache && len(execCmd) == 0 { testlogArg = []string{"-test.testlogfile=" + a.Objdir + "testlog.txt"} } - args := str.StringList(execCmd, a.Deps[0].BuiltTarget(), testlogArg, testArgs) + panicArg := "-test.paniconexit0" + args := str.StringList(execCmd, a.Deps[0].BuiltTarget(), testlogArg, panicArg, testArgs) if testCoverProfile != "" { // Write coverage to temporary profile, for merging later. diff --git a/src/cmd/go/testdata/script/test_exit.txt b/src/cmd/go/testdata/script/test_exit.txt new file mode 100644 index 0000000000..23a2429d1e --- /dev/null +++ b/src/cmd/go/testdata/script/test_exit.txt @@ -0,0 +1,114 @@ +# Builds and runs test binaries, so skip in short mode. +[short] skip + +env GO111MODULE=on + +# If a test invoked by 'go test' exits with a zero status code, +# it will panic. +! go test ./zero +! stdout ^ok +! stdout 'exit status' +stdout 'panic' +stdout ^FAIL + +# If a test exits with a non-zero status code, 'go test' fails normally. +! go test ./one +! stdout ^ok +stdout 'exit status' +! stdout 'panic' +stdout ^FAIL + +# Ensure that other flags still do the right thing. +go test -list=. ./zero +stdout ExitZero + +! go test -bench=. ./zero +stdout 'panic' + +# 'go test' with no args streams output without buffering. Ensure that it still +# catches a zero exit with missing output. +cd zero +! go test +stdout 'panic' +cd ../normal +go test +stdout ^ok +cd .. + +# If a TestMain exits with a zero status code, 'go test' shouldn't +# complain about that. It's a common way to skip testing a package +# entirely. +go test ./main_zero +! stdout 'skipping all tests' +stdout ^ok + +# With -v, we'll see the warning from TestMain. +go test -v ./main_zero +stdout 'skipping all tests' +stdout ^ok + +# Listing all tests won't actually give a result if TestMain exits. That's okay, +# because this is how TestMain works. If we decide to support -list even when +# TestMain is used to skip entire packages, we can change this test case. +go test -list=. ./main_zero +stdout 'skipping all tests' +! stdout TestNotListed + +-- go.mod -- +module m + +-- ./normal/normal.go -- +package normal +-- ./normal/normal_test.go -- +package normal + +import "testing" + +func TestExitZero(t *testing.T) { +} + +-- ./zero/zero.go -- +package zero +-- ./zero/zero_test.go -- +package zero + +import ( + "os" + "testing" +) + +func TestExitZero(t *testing.T) { + os.Exit(0) +} + +-- ./one/one.go -- +package one +-- ./one/one_test.go -- +package one + +import ( + "os" + "testing" +) + +func TestExitOne(t *testing.T) { + os.Exit(1) +} + +-- ./main_zero/zero.go -- +package zero +-- ./main_zero/zero_test.go -- +package zero + +import ( + "fmt" + "os" + "testing" +) + +func TestMain(m *testing.M) { + fmt.Println("skipping all tests") + os.Exit(0) +} + +func TestNotListed(t *testing.T) {} diff --git a/src/internal/testlog/exit.go b/src/internal/testlog/exit.go new file mode 100644 index 0000000000..e15defdb5b --- /dev/null +++ b/src/internal/testlog/exit.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. + +package testlog + +import "sync" + +// PanicOnExit0 reports whether to panic on a call to os.Exit(0). +// This is in the testlog package because, like other definitions in +// package testlog, it is a hook between the testing package and the +// os package. This is used to ensure that an early call to os.Exit(0) +// does not cause a test to pass. +func PanicOnExit0() bool { + panicOnExit0.mu.Lock() + defer panicOnExit0.mu.Unlock() + return panicOnExit0.val +} + +// panicOnExit0 is the flag used for PanicOnExit0. This uses a lock +// because the value can be cleared via a timer call that may race +// with calls to os.Exit +var panicOnExit0 struct { + mu sync.Mutex + val bool +} + +// SetPanicOnExit0 sets panicOnExit0 to v. +func SetPanicOnExit0(v bool) { + panicOnExit0.mu.Lock() + defer panicOnExit0.mu.Unlock() + panicOnExit0.val = v +} diff --git a/src/os/proc.go b/src/os/proc.go index 7364d631f2..cbd5a6aad9 100644 --- a/src/os/proc.go +++ b/src/os/proc.go @@ -7,6 +7,7 @@ package os import ( + "internal/testlog" "runtime" "syscall" ) @@ -60,6 +61,13 @@ func Getgroups() ([]int, error) { // For portability, the status code should be in the range [0, 125]. func Exit(code int) { if code == 0 { + if testlog.PanicOnExit0() { + // We were told to panic on calls to os.Exit(0). + // This is used to fail tests that make an early + // unexpected call to os.Exit(0). + panic("unexpected call to os.Exit(0) during test") + } + // Give race detector a chance to fail the program. // Racy programs do not have the right to finish successfully. runtime_beforeExit() diff --git a/src/testing/internal/testdeps/deps.go b/src/testing/internal/testdeps/deps.go index af08dd768a..3608d33294 100644 --- a/src/testing/internal/testdeps/deps.go +++ b/src/testing/internal/testdeps/deps.go @@ -121,3 +121,8 @@ func (TestDeps) StopTestLog() error { log.w = nil return err } + +// SetPanicOnExit0 tells the os package whether to panic on os.Exit(0). +func (TestDeps) SetPanicOnExit0(v bool) { + testlog.SetPanicOnExit0(v) +} diff --git a/src/testing/testing.go b/src/testing/testing.go index bf83df8863..d0334243f4 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -294,6 +294,7 @@ func Init() { blockProfileRate = flag.Int("test.blockprofilerate", 1, "set blocking profile `rate` (see runtime.SetBlockProfileRate)") mutexProfile = flag.String("test.mutexprofile", "", "write a mutex contention profile to the named file after execution") mutexProfileFraction = flag.Int("test.mutexprofilefraction", 1, "if >= 0, calls runtime.SetMutexProfileFraction()") + panicOnExit0 = flag.Bool("test.paniconexit0", false, "panic on call to os.Exit(0)") traceFile = flag.String("test.trace", "", "write an execution trace to `file`") timeout = flag.Duration("test.timeout", 0, "panic test binary after duration `d` (default 0, timeout disabled)") cpuListStr = flag.String("test.cpu", "", "comma-separated `list` of cpu counts to run each test with") @@ -320,6 +321,7 @@ var ( blockProfileRate *int mutexProfile *string mutexProfileFraction *int + panicOnExit0 *bool traceFile *string timeout *time.Duration cpuListStr *string @@ -1261,6 +1263,7 @@ func (f matchStringOnly) WriteProfileTo(string, io.Writer, int) error { return e func (f matchStringOnly) ImportPath() string { return "" } func (f matchStringOnly) StartTestLog(io.Writer) {} func (f matchStringOnly) StopTestLog() error { return errMain } +func (f matchStringOnly) SetPanicOnExit0(bool) {} // Main is an internal function, part of the implementation of the "go test" command. // It was exported because it is cross-package and predates "internal" packages. @@ -1296,6 +1299,7 @@ type M struct { type testDeps interface { ImportPath() string MatchString(pat, str string) (bool, error) + SetPanicOnExit0(bool) StartCPUProfile(io.Writer) error StopCPUProfile() StartTestLog(io.Writer) @@ -1521,11 +1525,17 @@ func (m *M) before() { m.deps.StartTestLog(f) testlogFile = f } + if *panicOnExit0 { + m.deps.SetPanicOnExit0(true) + } } // after runs after all testing. func (m *M) after() { m.afterOnce.Do(func() { + if *panicOnExit0 { + m.deps.SetPanicOnExit0(false) + } m.writeProfiles() }) } -- GitLab From 42fd1306cea2dc2ff91bd5208d9593721ab5a30f Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 15 Jun 2020 11:08:36 -0700 Subject: [PATCH 0368/1792] cmd/compile: clean up equality generation We're using sort.SliceStable, so no need to keep track of indexes as well. Use a more robust test for whether a node is a call. Add a test that we're actually reordering comparisons. This test fails without the alg.go changes in this CL because eqstring uses OCALLFUNC instead of OCALL for its data comparisons. Update #8606 Change-Id: Ieeec33434c72e3aa328deb11cc415cfda05632e2 Reviewed-on: https://go-review.googlesource.com/c/go/+/237921 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/alg.go | 31 ++++++--------- test/fixedbugs/issue8606b.go | 63 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 19 deletions(-) create mode 100644 test/fixedbugs/issue8606b.go diff --git a/src/cmd/compile/internal/gc/alg.go b/src/cmd/compile/internal/gc/alg.go index e2e2374717..2b63700569 100644 --- a/src/cmd/compile/internal/gc/alg.go +++ b/src/cmd/compile/internal/gc/alg.go @@ -646,17 +646,11 @@ func geneq(t *types.Type) *obj.LSym { // Build a list of conditions to satisfy. // The conditions are a list-of-lists. Conditions are reorderable // within each inner list. The outer lists must be evaluated in order. - // Even within each inner list, track their order so that we can preserve - // aspects of that order. (TODO: latter part needed?) - type nodeIdx struct { - n *Node - idx int - } - var conds [][]nodeIdx - conds = append(conds, []nodeIdx{}) + var conds [][]*Node + conds = append(conds, []*Node{}) and := func(n *Node) { i := len(conds) - 1 - conds[i] = append(conds[i], nodeIdx{n: n, idx: len(conds[i])}) + conds[i] = append(conds[i], n) } // Walk the struct using memequal for runs of AMEM @@ -674,7 +668,7 @@ func geneq(t *types.Type) *obj.LSym { if !IsRegularMemory(f.Type) { if EqCanPanic(f.Type) { // Enforce ordering by starting a new set of reorderable conditions. - conds = append(conds, []nodeIdx{}) + conds = append(conds, []*Node{}) } p := nodSym(OXDOT, np, f.Sym) q := nodSym(OXDOT, nq, f.Sym) @@ -688,7 +682,7 @@ func geneq(t *types.Type) *obj.LSym { } if EqCanPanic(f.Type) { // Also enforce ordering after something that can panic. - conds = append(conds, []nodeIdx{}) + conds = append(conds, []*Node{}) } i++ continue @@ -713,14 +707,13 @@ func geneq(t *types.Type) *obj.LSym { // Sort conditions to put runtime calls last. // Preserve the rest of the ordering. - var flatConds []nodeIdx + var flatConds []*Node for _, c := range conds { + isCall := func(n *Node) bool { + return n.Op == OCALL || n.Op == OCALLFUNC + } sort.SliceStable(c, func(i, j int) bool { - x, y := c[i], c[j] - if (x.n.Op != OCALL) == (y.n.Op != OCALL) { - return x.idx < y.idx - } - return x.n.Op != OCALL + return !isCall(c[i]) && isCall(c[j]) }) flatConds = append(flatConds, c...) } @@ -729,9 +722,9 @@ func geneq(t *types.Type) *obj.LSym { if len(flatConds) == 0 { cond = nodbool(true) } else { - cond = flatConds[0].n + cond = flatConds[0] for _, c := range flatConds[1:] { - cond = nod(OANDAND, cond, c.n) + cond = nod(OANDAND, cond, c) } } diff --git a/test/fixedbugs/issue8606b.go b/test/fixedbugs/issue8606b.go new file mode 100644 index 0000000000..448ea566f0 --- /dev/null +++ b/test/fixedbugs/issue8606b.go @@ -0,0 +1,63 @@ +// run + +// 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 is an optimization check. We want to make sure that we compare +// string lengths, and other scalar fields, before checking string +// contents. There's no way to verify this in the language, and +// codegen tests in test/codegen can't really detect ordering +// optimizations like this. Instead, we generate invalid strings with +// bad backing store pointers but nonzero length, so we can check that +// the backing store never gets compared. +// +// We use two different bad strings so that pointer comparisons of +// backing store pointers fail. + +package main + +import ( + "fmt" + "reflect" + "unsafe" +) + +func bad1() string { + s := "foo" + (*reflect.StringHeader)(unsafe.Pointer(&s)).Data = 1 // write bad value to data ptr + return s +} +func bad2() string { + s := "foo" + (*reflect.StringHeader)(unsafe.Pointer(&s)).Data = 2 // write bad value to data ptr + return s +} + +type SI struct { + s string + i int +} + +type SS struct { + s string + t string +} + +func main() { + for _, test := range []struct { + a, b interface{} + }{ + {SI{s: bad1(), i: 1}, SI{s: bad2(), i: 2}}, + {SS{s: bad1(), t: "a"}, SS{s: bad2(), t: "aa"}}, + {SS{s: "a", t: bad1()}, SS{s: "b", t: bad2()}}, + // This one would panic because the length of both strings match, and we check + // the body of the bad strings before the body of the good strings. + //{SS{s: bad1(), t: "a"}, SS{s: bad2(), t: "b"}}, + } { + if test.a == test.b { + panic(fmt.Sprintf("values %#v and %#v should not be equal", test.a, test.b)) + } + } + +} -- GitLab From 26ad27bb026a34149ad0b1d7d56723c8b5dee3d7 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 27 Aug 2020 23:34:32 +0000 Subject: [PATCH 0369/1792] Revert "cmd/compile,cmd/asm: simplify recording of branch targets" This reverts CL 243318. Reason for revert: Seems to be crashing some builders. Change-Id: I2ffc59bc5535be60b884b281c8d0eff4647dc756 Reviewed-on: https://go-review.googlesource.com/c/go/+/251169 Reviewed-by: Bryan C. Mills --- src/cmd/compile/internal/amd64/ssa.go | 4 ++-- src/cmd/compile/internal/gc/gsubr.go | 2 +- src/cmd/compile/internal/gc/ssa.go | 2 +- src/cmd/compile/internal/s390x/ssa.go | 4 ++-- src/cmd/compile/internal/x86/ssa.go | 4 ++-- src/cmd/internal/obj/arm/asm5.go | 16 +++++++------- src/cmd/internal/obj/arm/obj5.go | 10 ++++----- src/cmd/internal/obj/arm64/asm7.go | 30 +++++++++++++-------------- src/cmd/internal/obj/arm64/obj7.go | 16 +++++++------- src/cmd/internal/obj/link.go | 17 ++------------- src/cmd/internal/obj/mips/asm0.go | 24 ++++++++++----------- src/cmd/internal/obj/mips/obj0.go | 14 ++++++------- src/cmd/internal/obj/pass.go | 17 ++++++++------- src/cmd/internal/obj/ppc64/asm9.go | 18 ++++++++-------- src/cmd/internal/obj/ppc64/obj9.go | 12 +++++------ src/cmd/internal/obj/riscv/obj.go | 28 ++++++++++++------------- src/cmd/internal/obj/s390x/asmz.go | 18 ++++++++-------- src/cmd/internal/obj/s390x/objz.go | 10 ++++----- src/cmd/internal/obj/util.go | 6 ++++-- src/cmd/internal/obj/x86/asm6.go | 12 +++++------ src/cmd/internal/obj/x86/obj6.go | 12 +++++------ 21 files changed, 134 insertions(+), 142 deletions(-) diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index 4ac877986c..9d8a0920b3 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -319,8 +319,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { // 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) - j2.To.SetTarget(s.Pc()) + j1.To.Val = n1 + j2.To.Val = s.Pc() } case ssa.OpAMD64HMULQ, ssa.OpAMD64HMULL, ssa.OpAMD64HMULQU, ssa.OpAMD64HMULLU: diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go index 480d411f49..15a84a8a43 100644 --- a/src/cmd/compile/internal/gc/gsubr.go +++ b/src/cmd/compile/internal/gc/gsubr.go @@ -342,6 +342,6 @@ func Patch(p *obj.Prog, to *obj.Prog) { if p.To.Type != obj.TYPE_BRANCH { Fatalf("patch: not a branch") } - p.To.SetTarget(to) + p.To.Val = to p.To.Offset = to.Pc } diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 52083d999e..104dd403ea 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -6182,7 +6182,7 @@ func genssa(f *ssa.Func, pp *Progs) { // Resolve branches, and relax DefaultStmt into NotStmt for _, br := range s.Branches { - br.P.To.SetTarget(s.bstart[br.B.ID]) + br.P.To.Val = s.bstart[br.B.ID] if br.P.Pos.IsStmt() != src.PosIsStmt { br.P.Pos = br.P.Pos.WithNotStmt() } else if v0 := br.B.FirstPossibleStmtValue(); v0 != nil && v0.Pos.Line() == br.P.Pos.Line() && v0.Pos.IsStmt() == src.PosIsStmt { diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go index 00d253c95a..4cf4b70a32 100644 --- a/src/cmd/compile/internal/s390x/ssa.go +++ b/src/cmd/compile/internal/s390x/ssa.go @@ -338,8 +338,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { n.To.Reg = dividend } - j.To.SetTarget(n) - j2.To.SetTarget(s.Pc()) + j.To.Val = n + j2.To.Val = s.Pc() } case ssa.OpS390XADDconst, ssa.OpS390XADDWconst: opregregimm(s, v.Op.Asm(), v.Reg(), v.Args[0].Reg(), v.AuxInt) diff --git a/src/cmd/compile/internal/x86/ssa.go b/src/cmd/compile/internal/x86/ssa.go index c21ac32297..2de978c28a 100644 --- a/src/cmd/compile/internal/x86/ssa.go +++ b/src/cmd/compile/internal/x86/ssa.go @@ -261,8 +261,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { n.To.Reg = x86.REG_DX } - j.To.SetTarget(n) - j2.To.SetTarget(s.Pc()) + j.To.Val = n + j2.To.Val = s.Pc() } case ssa.Op386HMULL, ssa.Op386HMULLU: diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go index 269a4223d5..7b7e42ee2e 100644 --- a/src/cmd/internal/obj/arm/asm5.go +++ b/src/cmd/internal/obj/arm/asm5.go @@ -644,7 +644,7 @@ func (c *ctxt5) flushpool(p *obj.Prog, skip int, force int) bool { q := c.newprog() q.As = AB q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(p.Link) + q.Pcond = p.Link q.Link = c.blitrl q.Pos = p.Pos c.blitrl = q @@ -705,7 +705,7 @@ func (c *ctxt5) addpool(p *obj.Prog, a *obj.Addr) { if t.Rel == nil { for q := c.blitrl; q != nil; q = q.Link { /* could hash on t.t0.offset */ if q.Rel == nil && q.To == t.To { - p.Pool = q + p.Pcond = q return } } @@ -724,8 +724,8 @@ func (c *ctxt5) addpool(p *obj.Prog, a *obj.Addr) { c.elitrl = q c.pool.size += 4 - // Store the link to the pool entry in Pool. - p.Pool = q + // Store the link to the pool entry in Pcond. + p.Pcond = q } func (c *ctxt5) regoff(a *obj.Addr) int32 { @@ -1584,8 +1584,8 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { break } - if p.To.Target() != nil { - v = int32((p.To.Target().Pc - c.pc) - 8) + if p.Pcond != nil { + v = int32((p.Pcond.Pc - c.pc) - 8) } o1 |= (uint32(v) >> 2) & 0xffffff @@ -3023,7 +3023,7 @@ func (c *ctxt5) omvr(p *obj.Prog, a *obj.Addr, dr int) uint32 { func (c *ctxt5) omvl(p *obj.Prog, a *obj.Addr, dr int) uint32 { var o1 uint32 - if p.Pool == nil { + if p.Pcond == nil { c.aclass(a) v := immrot(^uint32(c.instoffset)) if v == 0 { @@ -3035,7 +3035,7 @@ func (c *ctxt5) omvl(p *obj.Prog, a *obj.Addr, dr int) uint32 { o1 |= uint32(v) o1 |= (uint32(dr) & 15) << 12 } else { - v := int32(p.Pool.Pc - p.Pc - 8) + v := int32(p.Pcond.Pc - p.Pc - 8) o1 = c.olr(v, REGPC, dr, int(p.Scond)&C_SCOND) } diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index 4d9187b530..86831f2b44 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -406,7 +406,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { mov.To.Reg = REG_R2 // B.NE branch target is MOVW above - bne.To.SetTarget(mov) + bne.Pcond = mov // ADD $(autosize+4), R13, R3 p = obj.Appendp(mov, newprog) @@ -428,7 +428,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = ABNE p.To.Type = obj.TYPE_BRANCH - p.To.SetTarget(end) + p.Pcond = end // ADD $4, R13, R4 p = obj.Appendp(p, newprog) @@ -452,7 +452,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = AB p.To.Type = obj.TYPE_BRANCH - p.To.SetTarget(end) + p.Pcond = end // reset for subsequent passes p = end @@ -741,7 +741,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { movw.To.Type = obj.TYPE_REG movw.To.Reg = REG_R3 - bls.To.SetTarget(movw) + bls.Pcond = movw // BL runtime.morestack call := obj.Appendp(movw, c.newprog) @@ -762,7 +762,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { b := obj.Appendp(pcdata, c.newprog) b.As = obj.AJMP b.To.Type = obj.TYPE_BRANCH - b.To.SetTarget(c.cursym.Func.Text.Link) + b.Pcond = c.cursym.Func.Text.Link b.Spadj = +framesize return end diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 0fa0c20b6a..7a5a8ff38c 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -977,8 +977,8 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) /* very large branches */ - if (o.type_ == 7 || o.type_ == 39 || o.type_ == 40) && p.To.Target() != nil { // 7: BEQ and like, 39: CBZ and like, 40: TBZ and like - otxt := p.To.Target().Pc - pc + if (o.type_ == 7 || o.type_ == 39 || o.type_ == 40) && p.Pcond != nil { // 7: BEQ and like, 39: CBZ and like, 40: TBZ and like + otxt := p.Pcond.Pc - pc var toofar bool switch o.type_ { case 7, 39: // branch instruction encodes 19 bits @@ -992,14 +992,14 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p.Link = q q.As = AB q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(p.To.Target()) - p.To.SetTarget(q) + q.Pcond = p.Pcond + p.Pcond = q q = c.newprog() q.Link = p.Link p.Link = q q.As = AB q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(q.Link.Link) + q.Pcond = q.Link.Link bflag = 1 } } @@ -1123,7 +1123,7 @@ func (c *ctxt7) flushpool(p *obj.Prog, skip int) { q := c.newprog() q.As = AB q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(p.Link) + q.Pcond = p.Link q.Link = c.blitrl q.Pos = p.Pos c.blitrl = q @@ -1249,7 +1249,7 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) { for q := c.blitrl; q != nil; q = q.Link { /* could hash on t.t0.offset */ if q.To == t.To { - p.Pool = q + p.Pcond = q return } } @@ -1266,7 +1266,7 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) { c.elitrl = q c.pool.size = -c.pool.size & (funcAlign - 1) c.pool.size += uint32(sz) - p.Pool = q + p.Pcond = q } func (c *ctxt7) regoff(a *obj.Addr) uint32 { @@ -6042,15 +6042,15 @@ func (c *ctxt7) opimm(p *obj.Prog, a obj.As) uint32 { func (c *ctxt7) brdist(p *obj.Prog, preshift int, flen int, shift int) int64 { v := int64(0) t := int64(0) - if p.To.Target() != nil { - v = (p.To.Target().Pc >> uint(preshift)) - (c.pc >> uint(preshift)) + if p.Pcond != nil { + v = (p.Pcond.Pc >> uint(preshift)) - (c.pc >> uint(preshift)) if (v & ((1 << uint(shift)) - 1)) != 0 { c.ctxt.Diag("misaligned label\n%v", p) } v >>= uint(shift) t = int64(1) << uint(flen-1) if v < -t || v >= t { - c.ctxt.Diag("branch too far %#x vs %#x [%p]\n%v\n%v", v, t, c.blitrl, p, p.To.Target()) + c.ctxt.Diag("branch too far %#x vs %#x [%p]\n%v\n%v", v, t, c.blitrl, p, p.Pcond) panic("branch too far") } } @@ -6526,7 +6526,7 @@ func (c *ctxt7) oaddi(p *obj.Prog, o1 int32, v int32, r int, rt int) uint32 { */ func (c *ctxt7) omovlit(as obj.As, p *obj.Prog, a *obj.Addr, dr int) uint32 { var o1 int32 - if p.Pool == nil { /* not in literal pool */ + if p.Pcond == nil { /* not in literal pool */ c.aclass(a) c.ctxt.Logf("omovlit add %d (%#x)\n", c.instoffset, uint64(c.instoffset)) @@ -6552,11 +6552,11 @@ func (c *ctxt7) omovlit(as obj.As, p *obj.Prog, a *obj.Addr, dr int) uint32 { w = 1 /* 64-bit SIMD/FP */ case AMOVD: - if p.Pool.As == ADWORD { + if p.Pcond.As == ADWORD { w = 1 /* 64-bit */ - } else if p.Pool.To.Offset < 0 { + } else if p.Pcond.To.Offset < 0 { w = 2 /* 32-bit, sign-extended to 64-bit */ - } else if p.Pool.To.Offset >= 0 { + } else if p.Pcond.To.Offset >= 0 { w = 0 /* 32-bit, zero-extended to 64-bit */ } else { c.ctxt.Diag("invalid operand %v in %v", a, p) diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index 56da854f16..f54429fabe 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -187,9 +187,9 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { movlr.To.Type = obj.TYPE_REG movlr.To.Reg = REG_R3 if q != nil { - q.To.SetTarget(movlr) + q.Pcond = movlr } - bls.To.SetTarget(movlr) + bls.Pcond = movlr debug := movlr if false { @@ -220,7 +220,7 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { jmp := obj.Appendp(pcdata, c.newprog) jmp.As = AB jmp.To.Type = obj.TYPE_BRANCH - jmp.To.SetTarget(c.cursym.Func.Text.Link) + jmp.Pcond = c.cursym.Func.Text.Link jmp.Spadj = +framesize return end @@ -697,7 +697,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { mov.To.Reg = REG_R2 // CBNZ branches to the MOV above - cbnz.To.SetTarget(mov) + cbnz.Pcond = mov // ADD $(autosize+8), SP, R3 q = obj.Appendp(mov, c.newprog) @@ -719,7 +719,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = ABNE q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(end) + q.Pcond = end // ADD $8, SP, R4 q = obj.Appendp(q, c.newprog) @@ -743,7 +743,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = AB q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(end) + q.Pcond = end } case obj.ARET: @@ -913,7 +913,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q5.Reg = REGSP q5.To.Type = obj.TYPE_REG q5.To.Reg = REGFP - q1.From.SetTarget(q5) + q1.Pcond = q5 p = q5 } @@ -966,7 +966,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q5.Reg = REGSP q5.To.Type = obj.TYPE_REG q5.To.Reg = REGFP - q1.From.SetTarget(q5) + q1.Pcond = q5 p = q5 } } diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 1d4217b5f5..1fc90db864 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -237,19 +237,6 @@ const ( TYPE_REGLIST ) -func (a *Addr) Target() *Prog { - if a.Type == TYPE_BRANCH && a.Val != nil { - return a.Val.(*Prog) - } - return nil -} -func (a *Addr) SetTarget(t *Prog) { - if a.Type != TYPE_BRANCH { - panic("setting branch target when type is not TYPE_BRANCH") - } - a.Val = t -} - // Prog describes a single machine instruction. // // The general instruction form is: @@ -268,7 +255,7 @@ func (a *Addr) SetTarget(t *Prog) { // to avoid too much changes in a single swing. // (1) scheme is enough to express any kind of operand combination. // -// Jump instructions use the To.Val field to point to the target *Prog, +// Jump instructions use the Pcond field to point to the target instruction, // which must be in the same linked list as the jump instruction. // // The Progs for a given function are arranged in a list linked through the Link field. @@ -287,7 +274,7 @@ type Prog struct { From Addr // first source operand RestArgs []Addr // can pack any operands that not fit into {Prog.From, Prog.To} To Addr // destination operand (second is RegTo2 below) - Pool *Prog // constant pool entry, for arm,arm64 back ends + Pcond *Prog // target of conditional jump Forwd *Prog // for x86 back end Rel *Prog // for x86, arm back ends Pc int64 // for back ends or assembler: virtual or actual program counter, depending on phase diff --git a/src/cmd/internal/obj/mips/asm0.go b/src/cmd/internal/obj/mips/asm0.go index 6107974745..faa827da9f 100644 --- a/src/cmd/internal/obj/mips/asm0.go +++ b/src/cmd/internal/obj/mips/asm0.go @@ -460,8 +460,8 @@ func span0(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) // very large conditional branches - if o.type_ == 6 && p.To.Target() != nil { - otxt = p.To.Target().Pc - pc + if o.type_ == 6 && p.Pcond != nil { + otxt = p.Pcond.Pc - pc if otxt < -(1<<17)+10 || otxt >= (1<<17)-10 { q = c.newprog() q.Link = p.Link @@ -469,15 +469,15 @@ func span0(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q.As = AJMP q.Pos = p.Pos q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(p.To.Target()) - p.To.SetTarget(q) + q.Pcond = p.Pcond + p.Pcond = q q = c.newprog() q.Link = p.Link p.Link = q q.As = AJMP q.Pos = p.Pos q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(q.Link.Link) + q.Pcond = q.Link.Link c.addnop(p.Link) c.addnop(p) @@ -1230,10 +1230,10 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) { case 6: /* beq r1,[r2],sbra */ v := int32(0) - if p.To.Target() == nil { + if p.Pcond == nil { v = int32(-4) >> 2 } else { - v = int32(p.To.Target().Pc-p.Pc-4) >> 2 + v = int32(p.Pcond.Pc-p.Pc-4) >> 2 } if (v<<16)>>16 != v { c.ctxt.Diag("short branch too far\n%v", p) @@ -1285,25 +1285,25 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) { 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 { + if p.Pcond == nil { v = int32(-4) >> 2 } else { - v = int32(p.To.Target().Pc-p.Pc-4) >> 2 + v = int32(p.Pcond.Pc-p.Pc-4) >> 2 } if (v<<16)>>16 == v { o1 = OP_IRR(c.opirr(ABEQ), uint32(v), uint32(REGZERO), uint32(REGZERO)) break } } - if p.To.Target() == nil { + if p.Pcond == nil { v = int32(p.Pc) >> 2 } else { - v = int32(p.To.Target().Pc) >> 2 + v = int32(p.Pcond.Pc) >> 2 } o1 = OP_JMP(c.opirr(p.As), uint32(v)) if p.To.Sym == nil { p.To.Sym = c.cursym.Func.Text.From.Sym - p.To.Offset = p.To.Target().Pc + p.To.Offset = p.Pcond.Pc } rel := obj.Addrel(c.cursym) rel.Off = int32(c.pc) diff --git a/src/cmd/internal/obj/mips/obj0.go b/src/cmd/internal/obj/mips/obj0.go index f19facc00c..77cad979a6 100644 --- a/src/cmd/internal/obj/mips/obj0.go +++ b/src/cmd/internal/obj/mips/obj0.go @@ -227,11 +227,11 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } else { p.Mark |= BRANCH } - q1 := p.To.Target() + q1 := p.Pcond if q1 != nil { for q1.As == obj.ANOP { q1 = q1.Link - p.To.SetTarget(q1) + p.Pcond = q1 } if q1.Mark&LEAF == 0 { @@ -424,8 +424,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, newprog) q.As = obj.ANOP - p1.To.SetTarget(q) - p2.To.SetTarget(q) + p1.Pcond = q + p2.Pcond = q } case ARET: @@ -778,7 +778,7 @@ func (c *ctxt0) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.To.Type = obj.TYPE_REG p.To.Reg = REG_R3 if q != nil { - q.To.SetTarget(p) + q.Pcond = p p.Mark |= LABEL } @@ -805,14 +805,14 @@ func (c *ctxt0) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.As = AJMP p.To.Type = obj.TYPE_BRANCH - p.To.SetTarget(c.cursym.Func.Text.Link) + p.Pcond = c.cursym.Func.Text.Link p.Mark |= BRANCH // placeholder for q1's jump target p = obj.Appendp(p, c.newprog) p.As = obj.ANOP // zero-width place holder - q1.To.SetTarget(p) + q1.Pcond = p return p } diff --git a/src/cmd/internal/obj/pass.go b/src/cmd/internal/obj/pass.go index 09d520b4e9..4f156d969b 100644 --- a/src/cmd/internal/obj/pass.go +++ b/src/cmd/internal/obj/pass.go @@ -36,8 +36,8 @@ package obj // In the case of an infinite loop, brloop returns nil. func brloop(p *Prog) *Prog { c := 0 - for q := p; q != nil; q = q.To.Target() { - if q.As != AJMP || q.To.Target() == nil { + for q := p; q != nil; q = q.Pcond { + if q.As != AJMP || q.Pcond == nil { return q } c++ @@ -132,6 +132,8 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { continue } if p.To.Val != nil { + // TODO: Remove To.Val.(*Prog) in favor of p->pcond. + p.Pcond = p.To.Val.(*Prog) continue } @@ -156,7 +158,8 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { p.To.Type = TYPE_NONE } - p.To.SetTarget(q) + p.To.Val = q + p.Pcond = q } if !ctxt.Flag_optimize { @@ -165,12 +168,12 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { // Collapse series of jumps to jumps. for p := sym.Func.Text; p != nil; p = p.Link { - if p.To.Target() == nil { + if p.Pcond == nil { continue } - p.To.SetTarget(brloop(p.To.Target())) - if p.To.Target() != nil && p.To.Type == TYPE_BRANCH { - p.To.Offset = p.To.Target().Pc + p.Pcond = brloop(p.Pcond) + if p.Pcond != nil && p.To.Type == TYPE_BRANCH { + p.To.Offset = p.Pcond.Pc } } } diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 98b453de6c..3c82477fc4 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -725,22 +725,22 @@ func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) // very large conditional branches - if (o.type_ == 16 || o.type_ == 17) && p.To.Target() != nil { - otxt = p.To.Target().Pc - pc + if (o.type_ == 16 || o.type_ == 17) && p.Pcond != nil { + otxt = p.Pcond.Pc - pc if otxt < -(1<<15)+10 || otxt >= (1<<15)-10 { q = c.newprog() q.Link = p.Link p.Link = q q.As = ABR q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(p.To.Target()) - p.To.SetTarget(q) + q.Pcond = p.Pcond + p.Pcond = q q = c.newprog() q.Link = p.Link p.Link = q q.As = ABR q.To.Type = obj.TYPE_BRANCH - q.To.SetTarget(q.Link.Link) + q.Pcond = q.Link.Link //addnop(p->link); //addnop(p); @@ -2630,8 +2630,8 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { case 11: /* br/bl lbra */ v := int32(0) - if p.To.Target() != nil { - v = int32(p.To.Target().Pc - p.Pc) + if p.Pcond != nil { + v = int32(p.Pcond.Pc - p.Pc) if v&03 != 0 { c.ctxt.Diag("odd branch target address\n%v", p) v &^= 03 @@ -2781,8 +2781,8 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { } } v := int32(0) - if p.To.Target() != nil { - v = int32(p.To.Target().Pc - p.Pc) + if p.Pcond != nil { + v = int32(p.Pcond.Pc - p.Pc) } if v&03 != 0 { c.ctxt.Diag("odd branch target address\n%v", p) diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index c012762a18..749f7066de 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -556,7 +556,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ABVS: p.Mark |= BRANCH q = p - q1 = p.To.Target() + q1 = p.Pcond if q1 != nil { // NOPs are not removed due to #40689. @@ -841,8 +841,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = obj.ANOP - p1.To.SetTarget(q) - p2.To.SetTarget(q) + p1.Pcond = q + p2.Pcond = q } case obj.ARET: @@ -1153,7 +1153,7 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.To.Type = obj.TYPE_REG p.To.Reg = REG_R5 if q != nil { - q.To.SetTarget(p) + q.Pcond = p } p = c.ctxt.EmitEntryStackMap(c.cursym, p, c.newprog) @@ -1248,13 +1248,13 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p = obj.Appendp(p, c.newprog) p.As = ABR p.To.Type = obj.TYPE_BRANCH - p.To.SetTarget(p0.Link) + p.Pcond = p0.Link // placeholder for q1's jump target p = obj.Appendp(p, c.newprog) p.As = obj.ANOP // zero-width place holder - q1.To.SetTarget(p) + q1.Pcond = p return p } diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index d2816487e4..2eb2935b31 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -634,7 +634,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { getargp.Reg = 0 getargp.To = obj.Addr{Type: obj.TYPE_REG, Reg: REG_X12} - bneadj.To.SetTarget(getargp) + bneadj.Pcond = getargp calcargp := obj.Appendp(getargp, newprog) calcargp.As = AADDI @@ -647,7 +647,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { testargp.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_X12} testargp.Reg = REG_X13 testargp.To.Type = obj.TYPE_BRANCH - testargp.To.SetTarget(endadj) + testargp.Pcond = endadj adjargp := obj.Appendp(testargp, newprog) adjargp.As = AADDI @@ -665,7 +665,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { godone.As = AJAL godone.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} godone.To.Type = obj.TYPE_BRANCH - godone.To.SetTarget(endadj) + godone.Pcond = endadj } // Update stack-based offsets. @@ -890,27 +890,27 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { if p.To.Type != obj.TYPE_BRANCH { panic("assemble: instruction with branch-like opcode lacks destination") } - offset := p.To.Target().Pc - p.Pc + offset := p.Pcond.Pc - p.Pc if offset < -4096 || 4096 <= offset { // Branch is long. Replace it with a jump. jmp := obj.Appendp(p, newprog) jmp.As = AJAL jmp.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} jmp.To = obj.Addr{Type: obj.TYPE_BRANCH} - jmp.To.SetTarget(p.To.Target()) + jmp.Pcond = p.Pcond p.As = InvertBranch(p.As) - p.To.SetTarget(jmp.Link) + p.Pcond = jmp.Link // We may have made previous branches too long, // so recheck them. rescan = true } case AJAL: - if p.To.Target() == nil { + if p.Pcond == nil { panic("intersymbol jumps should be expressed as AUIPC+JALR") } - offset := p.To.Target().Pc - p.Pc + offset := p.Pcond.Pc - p.Pc if offset < -(1<<20) || (1<<20) <= offset { // Replace with 2-instruction sequence. This assumes // that TMP is not live across J instructions, since @@ -946,16 +946,16 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { case ABEQ, ABEQZ, ABGE, ABGEU, ABGEZ, ABGT, ABGTU, ABGTZ, ABLE, ABLEU, ABLEZ, ABLT, ABLTU, ABLTZ, ABNE, ABNEZ, AJAL: switch p.To.Type { case obj.TYPE_BRANCH: - p.To.Type, p.To.Offset = obj.TYPE_CONST, p.To.Target().Pc-p.Pc + p.To.Type, p.To.Offset = obj.TYPE_CONST, p.Pcond.Pc-p.Pc case obj.TYPE_MEM: panic("unhandled type") } case AAUIPC: if p.From.Type == obj.TYPE_BRANCH { - low, high, err := Split32BitImmediate(p.To.Target().Pc - p.Pc) + low, high, err := Split32BitImmediate(p.Pcond.Pc - p.Pc) if err != nil { - ctxt.Diag("%v: jump displacement %d too large", p, p.To.Target().Pc-p.Pc) + ctxt.Diag("%v: jump displacement %d too large", p, p.Pcond.Pc-p.Pc) } p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: high, Sym: cursym} p.Link.From.Offset = low @@ -1098,7 +1098,7 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, cursym *obj.LSym, newprog obj.ProgA p.To.Sym = ctxt.Lookup("runtime.morestack") } if to_more != nil { - to_more.To.SetTarget(p) + to_more.Pcond = p } p = jalrToSym(ctxt, p, newprog, REG_X5) @@ -1107,12 +1107,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, cursym *obj.LSym, newprog obj.ProgA p.As = AJAL p.To = obj.Addr{Type: obj.TYPE_BRANCH} p.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} - p.To.SetTarget(cursym.Func.Text.Link) + p.Pcond = cursym.Func.Text.Link // placeholder for to_done's jump target p = obj.Appendp(p, newprog) p.As = obj.ANOP // zero-width place holder - to_done.To.SetTarget(p) + to_done.Pcond = p return p } diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go index 68f01f1c5d..29182ea805 100644 --- a/src/cmd/internal/obj/s390x/asmz.go +++ b/src/cmd/internal/obj/s390x/asmz.go @@ -3001,8 +3001,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 11: // br/bl v := int32(0) - if p.To.Target() != nil { - v = int32((p.To.Target().Pc - p.Pc) >> 1) + if p.Pcond != nil { + v = int32((p.Pcond.Pc - p.Pc) >> 1) } if p.As == ABR && p.To.Sym == nil && int32(int16(v)) == v { @@ -3122,8 +3122,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 16: // conditional branch v := int32(0) - if p.To.Target() != nil { - v = int32((p.To.Target().Pc - p.Pc) >> 1) + if p.Pcond != nil { + v = int32((p.Pcond.Pc - p.Pc) >> 1) } mask := uint32(c.branchMask(p)) if p.To.Sym == nil && int32(int16(v)) == v { @@ -3440,7 +3440,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 41: // branch on count r1 := p.From.Reg - ri2 := (p.To.Target().Pc - p.Pc) >> 1 + ri2 := (p.Pcond.Pc - p.Pc) >> 1 if int64(int16(ri2)) != ri2 { c.ctxt.Diag("branch target too far away") } @@ -3885,8 +3885,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 89: // compare and branch reg reg var v int32 - if p.To.Target() != nil { - v = int32((p.To.Target().Pc - p.Pc) >> 1) + if p.Pcond != nil { + v = int32((p.Pcond.Pc - p.Pc) >> 1) } // Some instructions take a mask as the first argument. @@ -3930,8 +3930,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 90: // compare and branch reg $constant var v int32 - if p.To.Target() != nil { - v = int32((p.To.Target().Pc - p.Pc) >> 1) + if p.Pcond != nil { + v = int32((p.Pcond.Pc - p.Pc) >> 1) } // Some instructions take a mask as the first argument. diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go index 625bb0f7b4..ef6335d849 100644 --- a/src/cmd/internal/obj/s390x/objz.go +++ b/src/cmd/internal/obj/s390x/objz.go @@ -454,8 +454,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = obj.ANOP - p1.To.SetTarget(q) - p2.To.SetTarget(q) + p1.Pcond = q + p2.Pcond = q } case obj.ARET: @@ -679,14 +679,14 @@ func (c *ctxtz) stacksplitPost(p *obj.Prog, pPre *obj.Prog, pPreempt *obj.Prog, // MOVD LR, R5 p = obj.Appendp(pcdata, c.newprog) - pPre.To.SetTarget(p) + pPre.Pcond = p p.As = AMOVD p.From.Type = obj.TYPE_REG p.From.Reg = REG_LR p.To.Type = obj.TYPE_REG p.To.Reg = REG_R5 if pPreempt != nil { - pPreempt.To.SetTarget(p) + pPreempt.Pcond = p } // BL runtime.morestack(SB) @@ -709,7 +709,7 @@ func (c *ctxtz) stacksplitPost(p *obj.Prog, pPre *obj.Prog, pPreempt *obj.Prog, p.As = ABR p.To.Type = obj.TYPE_BRANCH - p.To.SetTarget(c.cursym.Func.Text.Link) + p.Pcond = c.cursym.Func.Text.Link return p } diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index a30ccf0564..d020026445 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -251,8 +251,10 @@ func WriteDconv(w io.Writer, p *Prog, a *Addr) { case TYPE_BRANCH: if a.Sym != nil { fmt.Fprintf(w, "%s(SB)", a.Sym.Name) - } else if a.Target() != nil { - fmt.Fprint(w, a.Target().Pc) + } else if p != nil && p.Pcond != nil { + fmt.Fprint(w, p.Pcond.Pc) + } else if a.Val != nil { + fmt.Fprint(w, a.Val.(*Prog).Pc) } else { fmt.Fprintf(w, "%d(PC)", a.Offset) } diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index fb99c620ad..a530636373 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -1855,7 +1855,7 @@ func spadjop(ctxt *obj.Link, l, q obj.As) obj.As { // no standalone or macro-fused jump will straddle or end on a 32 byte boundary // by inserting NOPs before the jumps func isJump(p *obj.Prog) bool { - return p.To.Target() != nil || p.As == obj.AJMP || p.As == obj.ACALL || + return p.Pcond != nil || p.As == obj.AJMP || p.As == obj.ACALL || p.As == obj.ARET || p.As == obj.ADUFFCOPY || p.As == obj.ADUFFZERO } @@ -1867,7 +1867,7 @@ func lookForJCC(p *obj.Prog) *obj.Prog { for q = p.Link; q != nil && (q.As == obj.APCDATA || q.As == obj.AFUNCDATA || q.As == obj.ANOP); q = q.Link { } - if q == nil || q.To.Target() == nil || p.As == obj.AJMP || p.As == obj.ACALL { + if q == nil || q.Pcond == nil || p.As == obj.AJMP || p.As == obj.ACALL { return nil } @@ -2051,8 +2051,8 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { } for p := s.Func.Text; p != nil; p = p.Link { - if p.To.Type == obj.TYPE_BRANCH && p.To.Target() == nil { - p.To.SetTarget(p) + if p.To.Type == obj.TYPE_BRANCH && p.Pcond == nil { + p.Pcond = p } if p.As == AADJSP { p.To.Type = obj.TYPE_REG @@ -2088,7 +2088,7 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { for p := s.Func.Text; p != nil; p = p.Link { count++ p.Back = branchShort // use short branches first time through - if q := p.To.Target(); q != nil && (q.Back&branchShort != 0) { + if q := p.Pcond; q != nil && (q.Back&branchShort != 0) { p.Back |= branchBackwards q.Back |= branchLoopHead } @@ -4886,7 +4886,7 @@ func (ab *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { // TODO: Check in input, preserve in brchain. // Fill in backward jump now. - q = p.To.Target() + q = p.Pcond if q == nil { ctxt.Diag("jmp/branch/loop without target") diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index 18a6afcd77..016c247ff5 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -765,7 +765,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } // Set jne branch target. - jne.To.SetTarget(p) + jne.Pcond = p // CMPQ panic_argp(BX), DI p = obj.Appendp(p, newprog) @@ -783,7 +783,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = AJNE p.To.Type = obj.TYPE_BRANCH - p.To.SetTarget(end) + p.Pcond = end // MOVQ SP, panic_argp(BX) p = obj.Appendp(p, newprog) @@ -801,7 +801,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = obj.AJMP p.To.Type = obj.TYPE_BRANCH - p.To.SetTarget(end) + p.Pcond = end // Reset p for following code. p = end @@ -1144,12 +1144,12 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA jmp := obj.Appendp(pcdata, newprog) jmp.As = obj.AJMP jmp.To.Type = obj.TYPE_BRANCH - jmp.To.SetTarget(cursym.Func.Text.Link) + jmp.Pcond = cursym.Func.Text.Link jmp.Spadj = +framesize - jls.To.SetTarget(call) + jls.Pcond = call if q1 != nil { - q1.To.SetTarget(call) + q1.Pcond = call } return end -- GitLab From 18ea6f597c031d5f3c5160217db72d80cb62f689 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 27 Aug 2020 21:30:24 -0400 Subject: [PATCH 0370/1792] testing: restore os.Exit(0) after every call to (*M).Run cmd/go.TestScript/test_main_twice demonstrates a program that invokes (*M).Run twice in a row. If we only restore os.Exit(0) in m.afterOnce, we will fail to restore it after the second run and fail the test process despite both runs passing. Updates #29062 Updates #23129 Change-Id: Id22ec68f1708e4583c8dda14a8ba0efae7178b85 Reviewed-on: https://go-review.googlesource.com/c/go/+/251262 Run-TryBot: Bryan C. Mills Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/testing/testing.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/testing/testing.go b/src/testing/testing.go index d0334243f4..01743969ee 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -1533,11 +1533,15 @@ func (m *M) before() { // after runs after all testing. func (m *M) after() { m.afterOnce.Do(func() { - if *panicOnExit0 { - m.deps.SetPanicOnExit0(false) - } m.writeProfiles() }) + + // Restore PanicOnExit0 after every run, because we set it to true before + // every run. Otherwise, if m.Run is called multiple times the behavior of + // os.Exit(0) will not be restored after the second run. + if *panicOnExit0 { + m.deps.SetPanicOnExit0(false) + } } func (m *M) writeProfiles() { -- GitLab From 3b6c812f3defa90bfd7dbddf24bc6135adc5a7eb Mon Sep 17 00:00:00 2001 From: Santiago De la Cruz <51337247+xhit@users.noreply.github.com> Date: Thu, 27 Aug 2020 04:00:59 +0000 Subject: [PATCH 0371/1792] doc: add linux/riscv64 valid combination Mention valid combination GOOS=linux and GOARCH=riscv64 in the "Installing Go from source" document. Updates #27532 Change-Id: I8c1406087132f5c82a2eee5dbcda95d53c64d263 GitHub-Last-Rev: ee74ff9517bd428b75400956d5b7f774ff800ae5 GitHub-Pull-Request: golang/go#41063 Reviewed-on: https://go-review.googlesource.com/c/go/+/250997 Reviewed-by: Tobias Klauser --- doc/install-source.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/install-source.html b/doc/install-source.html index f8cda1dc21..cbf4eac70b 100644 --- a/doc/install-source.html +++ b/doc/install-source.html @@ -600,6 +600,9 @@ The valid combinations of $GOOS and $GOARCH are: linux mips64le +linux riscv64 + + linux s390x -- GitLab From bd6dfe9a3e381e6aae7aa11787ba70fcb77909ff Mon Sep 17 00:00:00 2001 From: surechen Date: Wed, 13 May 2020 17:03:36 +0800 Subject: [PATCH 0372/1792] math/big: add a comment for SetMantExp Change-Id: I9ff5d1767cf70648c2251268e5e815944a7cb371 Reviewed-on: https://go-review.googlesource.com/c/go/+/233737 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/float.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/math/big/float.go b/src/math/big/float.go index da964eef3e..42050e2c39 100644 --- a/src/math/big/float.go +++ b/src/math/big/float.go @@ -322,10 +322,11 @@ func (z *Float) SetMantExp(mant *Float, exp int) *Float { mant.validate() } z.Copy(mant) - if z.form != finite { - return z + + if z.form == finite { + // 0 < |mant| < +Inf + z.setExpAndRound(int64(z.exp)+int64(exp), 0) } - z.setExpAndRound(int64(z.exp)+int64(exp), 0) return z } -- GitLab From 5d0b35ca98f57b378e8b45839721d60c06603af2 Mon Sep 17 00:00:00 2001 From: Xiangdong Ji Date: Fri, 12 Jun 2020 16:27:08 +0000 Subject: [PATCH 0373/1792] cmd/asm: Always use go-style arrangement specifiers on ARM64 Fixing several error message and comment texts of the ARM64 assembler to use arrangement specifiers of Go's assembly style. Change-Id: Icdbb14fba7aaede40d57d0d754795b050366a1ab Reviewed-on: https://go-review.googlesource.com/c/go/+/237859 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/asm/internal/asm/testdata/arm64enc.s | 4 ++-- src/cmd/internal/obj/arm64/asm7.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/arm64enc.s b/src/cmd/asm/internal/asm/testdata/arm64enc.s index 56cf51c303..e802ee76f5 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64enc.s +++ b/src/cmd/asm/internal/asm/testdata/arm64enc.s @@ -591,7 +591,7 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8 FMOVS R8, F15 // 0f01271e FMOVD F2, F9 // 4940601e FMOVS F4, F27 // 9b40201e - //TODO VFMOV $3.125, V8.2D // 28f5006f + //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 @@ -648,7 +648,7 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8 FSUBS F25, F23, F0 // e03a391e FSUBD F11, F13, F24 // b8396b1e //TODO SCVTFSS F30, F20 // d4db215e - //TODO VSCVTF V7.2S, V17.2S // f1d8210e + //TODO VSCVTF V7.S2, V17.S2 // f1d8210e SCVTFWS R3, F16 // 7000221e SCVTFWD R20, F4 // 8402621e SCVTFS R16, F12 // 0c02229e diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 7a5a8ff38c..bc27740469 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -4801,7 +4801,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { Q = 1 b = 15 } else { - c.ctxt.Diag("invalid arrangement, should be 8B or 16B: %v", p) + c.ctxt.Diag("invalid arrangement, should be B8 or B16: %v", p) break } -- GitLab From 55cf84b0778c382967b46f3f2ffd402fba005a26 Mon Sep 17 00:00:00 2001 From: Xiangdong Ji Date: Thu, 18 Jun 2020 03:36:12 +0000 Subject: [PATCH 0374/1792] cmd/compile: Install testcases for flag constant Ops Flag constant Ops on arm and arm64 are under refactoring, this change adds a couple of testcases that verify the behavior of 'noov' branches. Updates #39505 Updates #38740 Updates #39303 Change-Id: I493344b52276900cd296c32da494d72932dfc9be Reviewed-on: https://go-review.googlesource.com/c/go/+/238677 Reviewed-by: Cherry Zhang Reviewed-by: Keith Randall Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- test/fixedbugs/issue39505.go | 31 ++++++ test/fixedbugs/issue39505b.go | 183 ++++++++++++++++++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 test/fixedbugs/issue39505.go create mode 100644 test/fixedbugs/issue39505b.go diff --git a/test/fixedbugs/issue39505.go b/test/fixedbugs/issue39505.go new file mode 100644 index 0000000000..711b562867 --- /dev/null +++ b/test/fixedbugs/issue39505.go @@ -0,0 +1,31 @@ +// compile + +// 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 p + +func f() { + if len([]int{})-1 < len([]int{}) { + } + + var st struct { + i int + } + g := func() string { + return "" + } + h := func(string) string { + return g() + g() + } + s, i := "", 0 + + st.i = len(s) + i = len(h(s[i+0:i+1])) + len(s[len(s)+1:i+1]) + s = s[(len(s[i+1:len(s)+1])+1):len(h(""))+1] + (s[i+1 : len([]int{})+i]) + i = 1 + len([]int{len([]string{s[i+len([]int{}) : len(s)+i]})}) + + var ch chan int + ch <- len(h("")) - len(s) +} diff --git a/test/fixedbugs/issue39505b.go b/test/fixedbugs/issue39505b.go new file mode 100644 index 0000000000..ecf1ab64f4 --- /dev/null +++ b/test/fixedbugs/issue39505b.go @@ -0,0 +1,183 @@ +// run + +// 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 main + +func main() { + ff := []func(){lt_f1, lt_f2, lt_f3, lt_f4, lt_f5, lt_f6, lt_f7, lt_f8, lt_f9, + gt_f1, gt_f2, gt_f3, le_f1, le_f2, le_f3, ge_f1, ge_f2, ge_f3} + + for _, f := range ff { + f() + } +} + +func lt_f1() { + const c = 1 + var a = 0 + var v *int = &a + if *v-c < len([]int{}) { + } else { + panic("bad") + } +} + +func lt_f2() { + const c = 10 + var a = 0 + var v *int = &a + if *v+c < len([]int{}) { + panic("bad") + } +} + +func lt_f3() { + const c = -10 + var a = 0 + var v *int = &a + if *v|0xff+c < len([]int{}) { + panic("bad") + } +} + +func lt_f4() { + const c = 10 + var a = 0 + var v *int = &a + if *v|0x0f+c < len([]int{}) { + panic("bad") + } +} + +func lt_f5() { + const c int32 = 1 + var a int32 = 0 + var v *int32 = &a + if *v-c < int32(len([]int32{})) { + } else { + panic("bad") + } +} + +func lt_f6() { + const c int32 = 10 + var a int32 = 0 + var v *int32 = &a + if *v+c < int32(len([]int32{})) { + panic("bad") + } +} + +func lt_f7() { + const c int32 = -10 + var a int32 = 0 + var v *int32 = &a + if *v|0xff+c < int32(len([]int{})) { + panic("bad") + } +} + +func lt_f8() { + const c int32 = 10 + var a int32 = 0 + var v *int32 = &a + if *v|0x0f+c < int32(len([]int{})) { + panic("bad") + } +} + +func lt_f9() { + const c int32 = -10 + var a int32 = 0 + var v *int32 = &a + if *v|0x0a+c < int32(len([]int{})) { + panic("bad") + } +} + +func gt_f1() { + const c = 1 + var a = 0 + var v *int = &a + if len([]int{}) > *v-c { + } else { + panic("bad") + } +} + +func gt_f2() { + const c = 10 + var a = 0 + var v *int = &a + if len([]int{}) > *v|0x0f+c { + panic("bad") + } +} + +func gt_f3() { + const c int32 = 10 + var a int32 = 0 + var v *int32 = &a + if int32(len([]int{})) > *v|0x0f+c { + panic("bad") + } +} + +func le_f1() { + const c = -10 + var a = 0 + var v *int = &a + if *v|0xff+c <= len([]int{}) { + panic("bad") + } +} + +func le_f2() { + const c = 0xf + var a = 0 + var v *int = &a + if *v|0xf-c <= len([]int{}) { + } else { + panic("bad") + } +} + +func le_f3() { + const c int32 = -10 + var a int32 = 0 + var v *int32 = &a + if *v|0xff+c <= int32(len([]int{})) { + panic("bad") + } +} + +func ge_f1() { + const c = -10 + var a = 0 + var v *int = &a + if len([]int{}) >= *v|0xff+c { + panic("bad") + } +} + +func ge_f2() { + const c int32 = 10 + var a int32 = 0 + var v *int32 = &a + if int32(len([]int{})) >= *v|0x0f+c { + panic("bad") + } +} + +func ge_f3() { + const c = -10 + var a = 0 + var v *int = &a + if len([]int{}) >= *v|0x0a+c { + } else { + panic("bad") + } +} -- GitLab From ae7b6a3b779c4d6de96f59efbfed0b899c3ff6df Mon Sep 17 00:00:00 2001 From: Xiangdong Ji Date: Sat, 22 Feb 2020 08:12:54 +0000 Subject: [PATCH 0375/1792] math/big: tune addVW/subVW performance on arm64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an optimization for addVW and subVW over large-sized vectors, it switches from add/sub with carry to copy the rest of the vector when we are done with carries. Consistent performance improvement are observed on various arm64 machines. Add additional tests and benchmarks to increase the test coverage. TestFunVWExt: Testing with various types of input vector, using the result from go-version addVW/subVW as golden reference. BenchmarkAddVWext and BenchmarkSubVWext: Benchmarking using input vector having all 1s or all 0s, for evaluating the overhead of worst case. 1. Perf. comparison over randomly generated input vectors: Server 1: name old time/op new time/op delta AddVW/1 12.3ns ± 3% 12.0ns ± 0% -2.60% (p=0.001 n=10+8) AddVW/2 12.5ns ± 2% 12.3ns ± 0% -1.84% (p=0.001 n=10+8) AddVW/3 12.6ns ± 2% 12.3ns ± 0% -1.91% (p=0.009 n=10+10) AddVW/4 13.1ns ± 3% 12.7ns ± 0% -2.98% (p=0.006 n=10+8) AddVW/5 14.4ns ± 1% 13.9ns ± 0% -3.81% (p=0.000 n=10+10) AddVW/10 11.7ns ± 0% 11.7ns ± 0% ~ (all equal) AddVW/100 47.8ns ± 0% 29.9ns ± 2% -37.38% (p=0.000 n=10+9) AddVW/1000 446ns ± 0% 207ns ± 0% -53.59% (p=0.000 n=10+10) AddVW/10000 4.35µs ± 1% 2.92µs ± 0% -32.85% (p=0.000 n=10+10) AddVW/100000 43.6µs ± 0% 29.7µs ± 0% -31.92% (p=0.000 n=8+10) SubVW/1 12.6ns ± 0% 12.3ns ± 2% -2.22% (p=0.000 n=7+10) SubVW/2 12.7ns ± 0% 12.6ns ± 1% -0.39% (p=0.046 n=8+10) SubVW/3 12.7ns ± 1% 12.6ns ± 1% ~ (p=0.410 n=10+10) SubVW/4 13.3ns ± 3% 13.1ns ± 3% ~ (p=0.072 n=10+10) SubVW/5 14.2ns ± 0% 14.1ns ± 1% -0.63% (p=0.046 n=8+10) SubVW/10 11.7ns ± 0% 11.7ns ± 0% ~ (all equal) SubVW/100 47.8ns ± 0% 33.1ns ±19% -30.71% (p=0.000 n=10+10) SubVW/1000 446ns ± 0% 207ns ± 0% -53.59% (p=0.000 n=10+10) SubVW/10000 4.33µs ± 1% 2.92µs ± 0% -32.66% (p=0.000 n=10+6) SubVW/100000 43.4µs ± 0% 29.6µs ± 0% -31.90% (p=0.000 n=10+9) Server 2: name old time/op new time/op delta AddVW/1 5.49ns ± 0% 5.53ns ± 2% ~ (p=1.000 n=9+10) AddVW/2 5.96ns ± 2% 5.92ns ± 1% -0.69% (p=0.039 n=10+10) AddVW/3 6.72ns ± 0% 6.73ns ± 0% ~ (p=0.078 n=10+10) AddVW/4 7.07ns ± 0% 6.75ns ± 2% -4.55% (p=0.000 n=10+10) AddVW/5 8.14ns ± 0% 8.17ns ± 0% +0.46% (p=0.003 n=8+8) AddVW/10 10.0ns ± 0% 10.1ns ± 1% +0.70% (p=0.003 n=10+10) AddVW/100 43.0ns ± 0% 33.5ns ± 0% -22.09% (p=0.000 n=9+9) AddVW/1000 394ns ± 0% 278ns ± 0% -29.44% (p=0.000 n=10+10) AddVW/10000 4.18µs ± 0% 3.14µs ± 0% -24.81% (p=0.000 n=8+8) AddVW/100000 68.3µs ± 3% 62.1µs ± 5% -9.13% (p=0.000 n=10+10) SubVW/1 5.37ns ± 2% 5.42ns ± 1% ~ (p=0.990 n=10+10) SubVW/2 5.89ns ± 0% 5.92ns ± 1% +0.58% (p=0.000 n=8+10) SubVW/3 6.64ns ± 1% 6.82ns ± 3% +2.63% (p=0.000 n=9+10) SubVW/4 7.17ns ± 0% 6.69ns ± 2% -6.74% (p=0.000 n=10+9) SubVW/5 8.22ns ± 0% 8.18ns ± 0% -0.46% (p=0.001 n=8+9) SubVW/10 10.0ns ± 1% 10.1ns ± 1% ~ (p=0.341 n=10+10) SubVW/100 43.0ns ± 0% 33.5ns ± 0% -22.09% (p=0.000 n=7+10) SubVW/1000 394ns ± 0% 278ns ± 0% -29.44% (p=0.000 n=10+10) SubVW/10000 4.18µs ± 0% 3.15µs ± 0% -24.62% (p=0.000 n=9+9) SubVW/100000 67.7µs ± 4% 62.4µs ± 2% -7.92% (p=0.000 n=10+10) 2. Perf. comparison over input vectors of all 1s or all 0s Server 1: name old time/op new time/op delta AddVWext/1 12.6ns ± 0% 12.0ns ± 0% -4.76% (p=0.000 n=6+10) AddVWext/2 12.7ns ± 0% 12.4ns ± 1% -2.52% (p=0.000 n=10+10) AddVWext/3 12.7ns ± 0% 12.4ns ± 0% -2.36% (p=0.000 n=9+7) AddVWext/4 13.2ns ± 4% 12.7ns ± 0% -3.71% (p=0.001 n=10+9) AddVWext/5 14.6ns ± 0% 13.9ns ± 0% -4.79% (p=0.000 n=10+8) AddVWext/10 11.7ns ± 0% 11.7ns ± 0% ~ (all equal) AddVWext/100 47.8ns ± 0% 47.4ns ± 0% -0.84% (p=0.000 n=10+10) AddVWext/1000 446ns ± 0% 399ns ± 0% -10.54% (p=0.000 n=10+10) AddVWext/10000 4.34µs ± 1% 3.90µs ± 0% -10.12% (p=0.000 n=10+10) AddVWext/100000 43.9µs ± 1% 39.4µs ± 0% -10.18% (p=0.000 n=10+10) SubVWext/1 12.6ns ± 0% 12.3ns ± 2% -2.70% (p=0.000 n=7+10) SubVWext/2 12.6ns ± 1% 12.6ns ± 2% ~ (p=0.234 n=10+10) SubVWext/3 12.7ns ± 0% 12.6ns ± 2% -0.71% (p=0.033 n=10+10) SubVWext/4 13.4ns ± 0% 13.1ns ± 3% -2.01% (p=0.006 n=8+10) SubVWext/5 14.2ns ± 0% 14.1ns ± 1% -0.85% (p=0.003 n=10+10) SubVWext/10 11.7ns ± 0% 11.7ns ± 0% ~ (all equal) SubVWext/100 47.8ns ± 0% 47.4ns ± 0% -0.84% (p=0.000 n=10+10) SubVWext/1000 446ns ± 0% 399ns ± 0% -10.54% (p=0.000 n=10+10) SubVWext/10000 4.33µs ± 1% 3.90µs ± 0% -10.02% (p=0.000 n=10+10) SubVWext/100000 43.5µs ± 0% 39.5µs ± 1% -9.16% (p=0.000 n=7+10) Server 2: name old time/op new time/op delta AddVWext/1 5.48ns ± 0% 5.43ns ± 1% -0.97% (p=0.000 n=9+9) AddVWext/2 5.99ns ± 2% 5.93ns ± 1% ~ (p=0.054 n=10+10) AddVWext/3 6.74ns ± 0% 6.79ns ± 1% +0.80% (p=0.000 n=9+10) AddVWext/4 7.18ns ± 0% 7.21ns ± 1% +0.36% (p=0.034 n=9+10) AddVWext/5 7.93ns ± 3% 8.18ns ± 0% +3.18% (p=0.000 n=10+8) AddVWext/10 10.0ns ± 0% 10.1ns ± 1% +0.60% (p=0.011 n=10+10) AddVWext/100 43.0ns ± 0% 47.7ns ± 0% +10.93% (p=0.000 n=9+10) AddVWext/1000 394ns ± 0% 399ns ± 0% +1.27% (p=0.000 n=10+10) AddVWext/10000 4.18µs ± 0% 4.50µs ± 0% +7.73% (p=0.000 n=9+10) AddVWext/100000 67.6µs ± 2% 68.4µs ± 3% ~ (p=0.139 n=9+8) SubVWext/1 5.46ns ± 1% 5.43ns ± 0% -0.55% (p=0.002 n=9+9) SubVWext/2 5.89ns ± 0% 5.93ns ± 1% +0.68% (p=0.000 n=8+10) SubVWext/3 6.72ns ± 1% 6.79ns ± 1% +1.07% (p=0.000 n=10+10) SubVWext/4 6.98ns ± 1% 7.21ns ± 0% +3.25% (p=0.000 n=10+10) SubVWext/5 8.22ns ± 0% 7.99ns ± 3% -2.83% (p=0.000 n=8+10) SubVWext/10 10.0ns ± 1% 10.1ns ± 1% ~ (p=0.239 n=10+10) SubVWext/100 43.0ns ± 0% 47.7ns ± 0% +10.93% (p=0.000 n=8+10) SubVWext/1000 394ns ± 0% 399ns ± 0% +1.27% (p=0.000 n=10+10) SubVWext/10000 4.18µs ± 0% 4.51µs ± 0% +7.86% (p=0.000 n=8+8) SubVWext/100000 68.3µs ± 2% 68.0µs ± 3% ~ (p=0.515 n=10+8) Change-Id: I134a5194b8a2deaaebbaa2b771baf72846971d58 Reviewed-on: https://go-review.googlesource.com/c/go/+/229739 Reviewed-by: Cherry Zhang Reviewed-by: Robert Griesemer Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/math/big/arith_arm64.s | 113 ++++++++++++++++++++++++++++++------- src/math/big/arith_test.go | 96 +++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 20 deletions(-) diff --git a/src/math/big/arith_arm64.s b/src/math/big/arith_arm64.s index 18e513e2c3..da6e408e19 100644 --- a/src/math/big/arith_arm64.s +++ b/src/math/big/arith_arm64.s @@ -109,13 +109,59 @@ done: MOVD R0, c+72(FP) RET +#define vwOneOp(instr, op1) \ + MOVD.P 8(R1), R4; \ + instr op1, R4; \ + MOVD.P R4, 8(R3); + +// handle the first 1~4 elements before starting iteration in addVW/subVW +#define vwPreIter(instr1, instr2, counter, target) \ + vwOneOp(instr1, R2); \ + SUB $1, counter; \ + CBZ counter, target; \ + vwOneOp(instr2, $0); \ + SUB $1, counter; \ + CBZ counter, target; \ + vwOneOp(instr2, $0); \ + SUB $1, counter; \ + CBZ counter, target; \ + vwOneOp(instr2, $0); + +// do one iteration of add or sub in addVW/subVW +#define vwOneIter(instr, counter, exit) \ + CBZ counter, exit; \ // careful not to touch the carry flag + LDP.P 32(R1), (R4, R5); \ + LDP -16(R1), (R6, R7); \ + instr $0, R4, R8; \ + instr $0, R5, R9; \ + instr $0, R6, R10; \ + instr $0, R7, R11; \ + STP.P (R8, R9), 32(R3); \ + STP (R10, R11), -16(R3); \ + SUB $4, counter; + +// do one iteration of copy in addVW/subVW +#define vwOneIterCopy(counter, exit) \ + CBZ counter, exit; \ + LDP.P 32(R1), (R4, R5); \ + LDP -16(R1), (R6, R7); \ + STP.P (R4, R5), 32(R3); \ + STP (R6, R7), -16(R3); \ + SUB $4, counter; // func addVW(z, x []Word, y Word) (c Word) +// The 'large' branch handles large 'z'. It checks the carry flag on every iteration +// and switches to copy if we are done with carries. The copying is skipped as well +// if 'x' and 'z' happen to share the same underlying storage. +// The overhead of the checking and branching is visible when 'z' are small (~5%), +// so set a threshold of 32, and remain the small-sized part entirely untouched. TEXT ·addVW(SB),NOSPLIT,$0 MOVD z+0(FP), R3 MOVD z_len+8(FP), R0 MOVD x+24(FP), R1 MOVD y+48(FP), R2 + CMP $32, R0 + BGE large // large-sized 'z' and 'x' CBZ R0, len0 // the length of z is 0 MOVD.P 8(R1), R4 ADDS R2, R4 // z[0] = x[0] + y, set carry @@ -135,29 +181,46 @@ two: // do it twice STP.P (R8, R9), 16(R3) SUB $2, R0 loop: // do four times per round - CBZ R0, len1 // careful not to touch the carry flag - LDP.P 32(R1), (R4, R5) - LDP -16(R1), (R6, R7) - ADCS $0, R4, R8 - ADCS $0, R5, R9 - ADCS $0, R6, R10 - ADCS $0, R7, R11 - STP.P (R8, R9), 32(R3) - STP (R10, R11), -16(R3) - SUB $4, R0 + vwOneIter(ADCS, R0, len1) B loop len1: CSET HS, R2 // extract carry flag len0: MOVD R2, c+56(FP) +done: RET +large: + AND $0x3, R0, R10 + AND $~0x3, R0 + // unrolling for the first 1~4 elements to avoid saving the carry + // flag in each step, adjust $R0 if we unrolled 4 elements + vwPreIter(ADDS, ADCS, R10, add4) + SUB $4, R0 +add4: + BCC copy + vwOneIter(ADCS, R0, len1) + B add4 +copy: + MOVD ZR, c+56(FP) + CMP R1, R3 + BEQ done +copy_4: // no carry flag, copy the rest + vwOneIterCopy(R0, done) + B copy_4 // func subVW(z, x []Word, y Word) (c Word) +// The 'large' branch handles large 'z'. It checks the carry flag on every iteration +// and switches to copy if we are done with carries. The copying is skipped as well +// if 'x' and 'z' happen to share the same underlying storage. +// The overhead of the checking and branching is visible when 'z' are small (~5%), +// so set a threshold of 32, and remain the small-sized part entirely untouched. TEXT ·subVW(SB),NOSPLIT,$0 MOVD z+0(FP), R3 MOVD z_len+8(FP), R0 MOVD x+24(FP), R1 MOVD y+48(FP), R2 + CMP $32, R0 + BGE large // large-sized 'z' and 'x' CBZ R0, len0 // the length of z is 0 MOVD.P 8(R1), R4 SUBS R2, R4 // z[0] = x[0] - y, set carry @@ -177,22 +240,32 @@ two: // do it twice STP.P (R8, R9), 16(R3) SUB $2, R0 loop: // do four times per round - CBZ R0, len1 // careful not to touch the carry flag - LDP.P 32(R1), (R4, R5) - LDP -16(R1), (R6, R7) - SBCS $0, R4, R8 - SBCS $0, R5, R9 - SBCS $0, R6, R10 - SBCS $0, R7, R11 - STP.P (R8, R9), 32(R3) - STP (R10, R11), -16(R3) - SUB $4, R0 + vwOneIter(SBCS, R0, len1) B loop len1: CSET LO, R2 // extract carry flag len0: MOVD R2, c+56(FP) +done: RET +large: + AND $0x3, R0, R10 + AND $~0x3, R0 + // unrolling for the first 1~4 elements to avoid saving the carry + // flag in each step, adjust $R0 if we unrolled 4 elements + vwPreIter(SUBS, SBCS, R10, sub4) + SUB $4, R0 +sub4: + BCS copy + vwOneIter(SBCS, R0, len1) + B sub4 +copy: + MOVD ZR, c+56(FP) + CMP R1, R3 + BEQ done +copy_4: // no carry flag, copy the rest + vwOneIterCopy(R0, done) + B copy_4 // func shlVU(z, x []Word, s uint) (c Word) // This implementation handles the shift operation from the high word to the low word, diff --git a/src/math/big/arith_test.go b/src/math/big/arith_test.go index e2b982c89c..fc205934c5 100644 --- a/src/math/big/arith_test.go +++ b/src/math/big/arith_test.go @@ -179,6 +179,23 @@ func testFunVW(t *testing.T, msg string, f funVW, a argVW) { } } +func testFunVWext(t *testing.T, msg string, f funVW, f_g funVW, a argVW) { + // using the result of addVW_g/subVW_g as golden + z_g := make(nat, len(a.z)) + c_g := f_g(z_g, a.x, a.y) + c := f(a.z, a.x, a.y) + + for i, zi := range a.z { + if zi != z_g[i] { + t.Errorf("%s\n\tgot z[%d] = %#x; want %#x", msg, i, zi, z_g[i]) + break + } + } + if c != c_g { + t.Errorf("%s\n\tgot c = %#x; want %#x", msg, c, c_g) + } +} + func makeFunVW(f func(z, x []Word, s uint) (c Word)) funVW { return func(z, x []Word, s Word) (c Word) { return f(z, x, uint(s)) @@ -213,6 +230,49 @@ func TestFunVW(t *testing.T) { } } +// Construct a vector comprising the same word, usually '0' or 'maximum uint' +func makeWordVec(e Word, n int) []Word { + v := make([]Word, n) + for i := range v { + v[i] = e + } + return v +} + +// Extended testing to addVW and subVW using various kinds of input data. +// We utilize the results of addVW_g and subVW_g as golden reference to check +// correctness. +func TestFunVWExt(t *testing.T) { + // 32 is the current threshold that triggers an optimized version of + // calculation for large-sized vector, ensure we have sizes around it tested. + var vwSizes = []int{0, 1, 3, 4, 5, 8, 9, 23, 31, 32, 33, 34, 35, 36, 50, 120} + for _, n := range vwSizes { + // vector of random numbers, using the result of addVW_g/subVW_g as golden + x := rndV(n) + y := rndW() + z := make(nat, n) + arg := argVW{z, x, y, 0} + testFunVWext(t, "addVW, random inputs", addVW, addVW_g, arg) + testFunVWext(t, "subVW, random inputs", subVW, subVW_g, arg) + + // vector of random numbers, but make 'x' and 'z' share storage + arg = argVW{x, x, y, 0} + testFunVWext(t, "addVW, random inputs, sharing storage", addVW, addVW_g, arg) + testFunVWext(t, "subVW, random inputs, sharing storage", subVW, subVW_g, arg) + + // vector of maximum uint, to force carry flag set in each 'add' + y = ^Word(0) + x = makeWordVec(y, n) + arg = argVW{z, x, y, 0} + testFunVWext(t, "addVW, vector of max uint", addVW, addVW_g, arg) + + // vector of '0', to force carry flag set in each 'sub' + x = makeWordVec(0, n) + arg = argVW{z, x, 1, 0} + testFunVWext(t, "subVW, vector of zero", subVW, subVW_g, arg) + } +} + type argVU struct { d []Word // d is a Word slice, the input parameters x and z come from this array. l uint // l is the length of the input parameters x and z. @@ -299,6 +359,24 @@ func BenchmarkAddVW(b *testing.B) { } } +// Benchmarking addVW using vector of maximum uint to force carry flag set +func BenchmarkAddVWext(b *testing.B) { + for _, n := range benchSizes { + if isRaceBuilder && n > 1e3 { + continue + } + y := ^Word(0) + x := makeWordVec(y, n) + z := make([]Word, n) + b.Run(fmt.Sprint(n), func(b *testing.B) { + b.SetBytes(int64(n * _S)) + for i := 0; i < b.N; i++ { + addVW(z, x, y) + } + }) + } +} + func BenchmarkSubVW(b *testing.B) { for _, n := range benchSizes { if isRaceBuilder && n > 1e3 { @@ -316,6 +394,24 @@ func BenchmarkSubVW(b *testing.B) { } } +// Benchmarking subVW using vector of zero to force carry flag set +func BenchmarkSubVWext(b *testing.B) { + for _, n := range benchSizes { + if isRaceBuilder && n > 1e3 { + continue + } + x := makeWordVec(0, n) + y := Word(1) + z := make([]Word, n) + b.Run(fmt.Sprint(n), func(b *testing.B) { + b.SetBytes(int64(n * _S)) + for i := 0; i < b.N; i++ { + subVW(z, x, y) + } + }) + } +} + type funVWW func(z, x []Word, y, r Word) (c Word) type argVWW struct { z, x nat -- GitLab From 42e09dc1ba1e820af44b2cbd4db0d60abb5559a2 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Sun, 12 Jul 2020 22:36:34 -0400 Subject: [PATCH 0376/1792] go/types: factor out usage of implicit type There was some duplication of logic interpreting the implicit type of an operand in assignableTo and convertUntyped. Factor out this logic to a new 'implicitType' function, which returns the implicit type of an untyped operand when used in a context where a target type is expected. I believe this resolves some comments about code duplication. There is other similar code in assignable, assignableTo, and convertUntypes, but I found it to to be sufficiently semantically distinct to not warrant factoring out. Change-Id: I199298a2e58fcf05344318fca0226b460c57867d Reviewed-on: https://go-review.googlesource.com/c/go/+/242084 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/api_test.go | 20 +++--- src/go/types/assignments.go | 4 +- src/go/types/expr.go | 125 +++++++++++++++++++----------------- src/go/types/operand.go | 43 ++++--------- 4 files changed, 88 insertions(+), 104 deletions(-) diff --git a/src/go/types/api_test.go b/src/go/types/api_test.go index 6c129cd01b..75cebc9826 100644 --- a/src/go/types/api_test.go +++ b/src/go/types/api_test.go @@ -1243,11 +1243,9 @@ func TestConvertibleTo(t *testing.T) { {newDefined(new(Struct)), new(Struct), true}, {newDefined(Typ[Int]), new(Struct), false}, {Typ[UntypedInt], Typ[Int], true}, - // TODO (rFindley): the below behavior is undefined as non-constant untyped - // string values are not permitted by the spec. But we should consider - // changing this case to return 'true', to have more reasonable behavior in - // cases where the API is used for constant expressions. - {Typ[UntypedString], Typ[String], false}, + // Untyped string values are not permitted by the spec, so the below + // behavior is undefined. + {Typ[UntypedString], Typ[String], true}, } { if got := ConvertibleTo(test.v, test.t); got != test.want { t.Errorf("ConvertibleTo(%v, %v) = %t, want %t", test.v, test.t, got, test.want) @@ -1266,13 +1264,11 @@ func TestAssignableTo(t *testing.T) { {newDefined(new(Struct)), new(Struct), true}, {Typ[UntypedBool], Typ[Bool], true}, {Typ[UntypedString], Typ[Bool], false}, - // TODO (rFindley): the below behavior is undefined as AssignableTo is - // intended for non-constant values (and neither UntypedString or - // UntypedInt assignments arise during normal type checking). But as - // described in TestConvertibleTo above, we should consider changing this - // behavior. - {Typ[UntypedString], Typ[String], false}, - {Typ[UntypedInt], Typ[Int], false}, + // Neither untyped string nor untyped numeric assignments arise during + // normal type checking, so the below behavior is technically undefined by + // the spec. + {Typ[UntypedString], Typ[String], true}, + {Typ[UntypedInt], Typ[Int], true}, } { if got := AssignableTo(test.v, test.t); got != test.want { t.Errorf("AssignableTo(%v, %v) = %t, want %t", test.v, test.t, got, test.want) diff --git a/src/go/types/assignments.go b/src/go/types/assignments.go index 9697e504cd..4e8ec278fc 100644 --- a/src/go/types/assignments.go +++ b/src/go/types/assignments.go @@ -34,8 +34,8 @@ func (check *Checker) assignment(x *operand, T Type, context string) { // spec: "If an untyped constant is assigned to a variable of interface // type or the blank identifier, the constant is first converted to type // bool, rune, int, float64, complex128 or string respectively, depending - // on whether the value is a boolean, rune, integer, floating-point, complex, - // or string constant." + // on whether the value is a boolean, rune, integer, floating-point, + // complex, or string constant." if T == nil || IsInterface(T) { if T == nil && x.typ == Typ[UntypedNil] { check.errorf(x.pos(), "use of untyped nil in %s", context) diff --git a/src/go/types/expr.go b/src/go/types/expr.go index 8503a521f6..94d98f0fbb 100644 --- a/src/go/types/expr.go +++ b/src/go/types/expr.go @@ -506,8 +506,6 @@ func (check *Checker) canConvertUntyped(x *operand, target Type) error { if x.mode == invalid || isTyped(x.typ) || target == Typ[Invalid] { return nil } - // TODO(gri) Sloppy code - clean up. This function is central - // to assignment and expression checking. if isUntyped(target) { // both x and target are untyped @@ -519,80 +517,91 @@ func (check *Checker) canConvertUntyped(x *operand, target Type) error { check.updateExprType(x.expr, target, false) } } else if xkind != tkind { - goto Error + return check.newErrorf(x.pos(), "cannot convert %s to %s", x, target) } return nil } - // typed target + if t, ok := target.Underlying().(*Basic); ok && x.mode == constant_ { + if err := check.isRepresentable(x, t); err != nil { + return err + } + // Expression value may have been rounded - update if needed. + check.updateExprVal(x.expr, x.val) + } else { + newTarget := check.implicitType(x, target) + if newTarget == nil { + return check.newErrorf(x.pos(), "cannot convert %s to %s", x, target) + } + target = newTarget + } + x.typ = target + // Even though implicitType can return UntypedNil, this value is final: the + // predeclared identifier nil has no type. + check.updateExprType(x.expr, target, true) + return nil +} + +// implicitType 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 nil. +func (check *Checker) implicitType(x *operand, target Type) Type { + assert(isUntyped(x.typ)) switch t := target.Underlying().(type) { case *Basic: - if x.mode == constant_ { - if err := check.isRepresentable(x, t); err != nil { - return err + assert(x.mode != constant_) + // Non-constant untyped values may appear as the + // result of comparisons (untyped bool), intermediate + // (delayed-checked) rhs operands of shifts, and as + // the value nil. + switch x.typ.(*Basic).kind { + case UntypedBool: + if !isBoolean(target) { + return nil } - // expression value may have been rounded - update if needed - check.updateExprVal(x.expr, x.val) - } else { - // Non-constant untyped values may appear as the - // result of comparisons (untyped bool), intermediate - // (delayed-checked) rhs operands of shifts, and as - // the value nil. - switch x.typ.(*Basic).kind { - case UntypedBool: - if !isBoolean(target) { - goto Error - } - case UntypedInt, UntypedRune, UntypedFloat, UntypedComplex: - if !isNumeric(target) { - goto Error - } - case UntypedString: - // Non-constant untyped string values are not - // permitted by the spec and should not occur. - unreachable() - case UntypedNil: - // Unsafe.Pointer is a basic type that includes nil. - if !hasNil(target) { - goto Error - } - default: - goto Error + case UntypedInt, UntypedRune, UntypedFloat, UntypedComplex: + if !isNumeric(target) { + return nil + } + case UntypedString: + // Non-constant untyped string values are not permitted by the spec and + // should not occur during normal typechecking passes, but this path is + // reachable via the AssignableTo API. + if !isString(target) { + return nil } + case UntypedNil: + // Unsafe.Pointer is a basic type that includes nil. + if !hasNil(target) { + return nil + } + default: + return nil } case *Interface: - // Update operand types to the default type rather then - // the target (interface) type: values must have concrete - // dynamic types. If the value is nil, keep it untyped - // (this is important for tools such as go vet which need - // the dynamic type for argument checking of say, print + // Values must have concrete dynamic types. If the value is nil, + // keep it untyped (this is important for tools such as go vet which + // need the dynamic type for argument checking of say, print // functions) if x.isNil() { - target = Typ[UntypedNil] - } else { - // cannot assign untyped values to non-empty interfaces - check.completeInterface(t) - if !t.Empty() { - goto Error - } - target = Default(x.typ) + return Typ[UntypedNil] + } + // cannot assign untyped values to non-empty interfaces + check.completeInterface(t) + if !t.Empty() { + return nil } + return Default(x.typ) case *Pointer, *Signature, *Slice, *Map, *Chan: if !x.isNil() { - goto Error + return nil } - // keep nil untyped - see comment for interfaces, above - target = Typ[UntypedNil] + // Keep nil untyped - see comment for interfaces, above. + return Typ[UntypedNil] default: - goto Error + return nil } - - x.typ = target - check.updateExprType(x.expr, target, true) // UntypedNils are final - return nil - -Error: - return check.newErrorf(x.pos(), "cannot convert %s to %s", x, target) + return target } func (check *Checker) comparison(x, y *operand, op token.Token) { diff --git a/src/go/types/operand.go b/src/go/types/operand.go index 80d11e2f21..6fbfe09627 100644 --- a/src/go/types/operand.go +++ b/src/go/types/operand.go @@ -205,15 +205,11 @@ func (x *operand) isNil() bool { return x.mode == value && x.typ == Typ[UntypedNil] } -// TODO(gri) The functions operand.assignableTo, checker.convertUntyped, -// checker.representable, and checker.assignment are -// overlapping in functionality. Need to simplify and clean up. - -// assignableTo reports whether x is assignable to a variable of type T. -// If the result is false and a non-nil reason is provided, it may be set -// to a more detailed explanation of the failure (result != ""). -// The check parameter may be nil if assignableTo is invoked through -// an exported API call, i.e., when all methods have been type-checked. +// assignableTo reports whether x is assignable to a variable of type T. If the +// result is false and a non-nil reason is provided, it may be set to a more +// detailed explanation of the failure (result != ""). The check parameter may +// be nil if assignableTo is invoked through an exported API call, i.e., when +// all methods have been type-checked. func (x *operand) assignableTo(check *Checker, T Type, reason *string) bool { if x.mode == invalid || T == Typ[Invalid] { return true // avoid spurious errors @@ -229,34 +225,17 @@ func (x *operand) assignableTo(check *Checker, T Type, reason *string) bool { Vu := V.Underlying() Tu := T.Underlying() - // x is an untyped value representable by a value of type T - // TODO(gri) This is borrowing from checker.convertUntyped and - // checker.representable. Need to clean up. + // x is an untyped value representable by a value of type T. if isUntyped(Vu) { - switch t := Tu.(type) { - case *Basic: - if x.isNil() && t.kind == UnsafePointer { - return true - } - if x.mode == constant_ { - return representableConst(x.val, check, t, nil) - } - // The result of a comparison is an untyped boolean, - // but may not be a constant. - if Vb, _ := Vu.(*Basic); Vb != nil { - return Vb.kind == UntypedBool && isBoolean(Tu) - } - case *Interface: - check.completeInterface(t) - return x.isNil() || t.Empty() - case *Pointer, *Signature, *Slice, *Map, *Chan: - return x.isNil() + if t, ok := Tu.(*Basic); ok && x.mode == constant_ { + return representableConst(x.val, check, t, nil) } + return check.implicitType(x, Tu) != nil } // Vu is typed - // x's type V and T have identical underlying types - // and at least one of V or T is not a named type + // x's type V and T have identical underlying types and at least one of V or + // T is not a named type. if check.identical(Vu, Tu) && (!isNamed(V) || !isNamed(T)) { return true } -- GitLab From 45e12e95e683d0720f8c93ba059a87b2b0e58e09 Mon Sep 17 00:00:00 2001 From: Rob Findley Date: Fri, 28 Aug 2020 12:10:31 -0400 Subject: [PATCH 0377/1792] go/types: add tests for conversion of non-constant untyped values This was fixed by CL 242084. Retroactively add some tests that would have failed before the fix. Also, remove some existing duplicate tests. Change-Id: I95f7a215d4a9651ded6d739f89c574f33f573c60 Reviewed-on: https://go-review.googlesource.com/c/go/+/251397 Run-TryBot: Robert Findley TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/types/testdata/shifts.src | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/go/types/testdata/shifts.src b/src/go/types/testdata/shifts.src index ebc95ba4d7..c9a38ae169 100644 --- a/src/go/types/testdata/shifts.src +++ b/src/go/types/testdata/shifts.src @@ -193,14 +193,27 @@ func shifts6() { _ = float32(1.0 /* ERROR "must be integer" */ < Date: Fri, 28 Aug 2020 10:34:16 -0700 Subject: [PATCH 0378/1792] testing: run a Cleanup registered by a Cleanup Fixes #41085 Change-Id: Ieafc60cbc8e09f1935d38b1767b084d78dae5cb4 Reviewed-on: https://go-review.googlesource.com/c/go/+/251457 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/testing/sub_test.go | 27 +++++++++++++++ src/testing/testing.go | 76 +++++++++++++++++++++++++---------------- 2 files changed, 74 insertions(+), 29 deletions(-) diff --git a/src/testing/sub_test.go b/src/testing/sub_test.go index 8eb0084b1c..51fc0ccc39 100644 --- a/src/testing/sub_test.go +++ b/src/testing/sub_test.go @@ -928,3 +928,30 @@ func TestCleanupParallelSubtests(t *T) { t.Errorf("unexpected cleanup count; got %d want 1", ranCleanup) } } + +func TestNestedCleanup(t *T) { + ranCleanup := 0 + t.Run("test", func(t *T) { + t.Cleanup(func() { + if ranCleanup != 2 { + t.Errorf("unexpected cleanup count in first cleanup: got %d want 2", ranCleanup) + } + ranCleanup++ + }) + t.Cleanup(func() { + if ranCleanup != 0 { + t.Errorf("unexpected cleanup count in second cleanup: got %d want 0", ranCleanup) + } + ranCleanup++ + t.Cleanup(func() { + if ranCleanup != 1 { + t.Errorf("unexpected cleanup count in nested cleanup: got %d want 1", ranCleanup) + } + ranCleanup++ + }) + }) + }) + if ranCleanup != 3 { + t.Errorf("unexpected cleanup count: got %d want 3", ranCleanup) + } +} diff --git a/src/testing/testing.go b/src/testing/testing.go index 01743969ee..f4f0060523 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -403,7 +403,7 @@ type common struct { skipped bool // Test of benchmark has been skipped. done bool // Test is finished and all subtests have completed. helpers map[string]struct{} // functions to be skipped when writing file/line info - cleanup func() // optional function to be called at the end of the test + cleanups []func() // optional functions to be called at the end of the test cleanupName string // Name of the cleanup function. cleanupPc []uintptr // The stack trace at the point where Cleanup was called. @@ -855,28 +855,31 @@ func (c *common) Helper() { // subtests complete. Cleanup functions will be called in last added, // first called order. func (c *common) Cleanup(f func()) { - c.mu.Lock() - defer c.mu.Unlock() - oldCleanup := c.cleanup - oldCleanupPc := c.cleanupPc - c.cleanup = func() { - if oldCleanup != nil { - defer func() { - c.mu.Lock() - c.cleanupPc = oldCleanupPc - c.mu.Unlock() - oldCleanup() - }() - } + var pc [maxStackLen]uintptr + // Skip two extra frames to account for this function and runtime.Callers itself. + n := runtime.Callers(2, pc[:]) + cleanupPc := pc[:n] + + fn := func() { + defer func() { + c.mu.Lock() + defer c.mu.Unlock() + c.cleanupName = "" + c.cleanupPc = nil + }() + + name := callerName(0) c.mu.Lock() - c.cleanupName = callerName(0) + c.cleanupName = name + c.cleanupPc = cleanupPc c.mu.Unlock() + f() } - var pc [maxStackLen]uintptr - // Skip two extra frames to account for this function and runtime.Callers itself. - n := runtime.Callers(2, pc[:]) - c.cleanupPc = pc[:n] + + c.mu.Lock() + defer c.mu.Unlock() + c.cleanups = append(c.cleanups, fn) } var tempDirReplacer struct { @@ -934,22 +937,37 @@ const ( // If catchPanic is true, this will catch panics, and return the recovered // value if any. func (c *common) runCleanup(ph panicHandling) (panicVal interface{}) { - c.mu.Lock() - cleanup := c.cleanup - c.cleanup = nil - c.mu.Unlock() - if cleanup == nil { - return nil - } - if ph == recoverAndReturnPanic { defer func() { panicVal = recover() }() } - cleanup() - return nil + // Make sure that if a cleanup function panics, + // we still run the remaining cleanup functions. + defer func() { + c.mu.Lock() + recur := len(c.cleanups) > 0 + c.mu.Unlock() + if recur { + c.runCleanup(normalPanic) + } + }() + + for { + var cleanup func() + c.mu.Lock() + if len(c.cleanups) > 0 { + last := len(c.cleanups) - 1 + cleanup = c.cleanups[last] + c.cleanups = c.cleanups[:last] + } + c.mu.Unlock() + if cleanup == nil { + return nil + } + cleanup() + } } // callerName gives the function name (qualified with a package path) -- GitLab From a58a8d2e97d605f9f115a0e77ba09cd36bb82ba6 Mon Sep 17 00:00:00 2001 From: zdjones Date: Thu, 16 Jul 2020 12:33:25 +0100 Subject: [PATCH 0379/1792] test: document specifying individual test files as operands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current command will run this entire set of tests, which takes a noticeable amount of time. Contributors may wish to run only a subset of these tests to save time/compute (e.g. when iterating on a CL that failed tests in that subset). Listing file(s) as operands to the command will run only those tests. Change-Id: I1874c43681a594190bc40b61cee0b8d321be73f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/242997 Reviewed-by: Daniel Martí --- test/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/README.md b/test/README.md index 068dc1b22b..432d36b653 100644 --- a/test/README.md +++ b/test/README.md @@ -6,6 +6,10 @@ To run just these tests, execute: ../bin/go run run.go +To run just tests from specified files in this directory, execute: + + ../bin/go run run.go -- file1.go file2.go ... + Standard library tests should be written as regular Go tests in the appropriate package. The tool chain and runtime also have regular Go tests in their packages. -- GitLab From c8ea03828b0645b1fd5725888e44873b75fcfbb6 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki Date: Wed, 22 Apr 2020 22:17:56 +0300 Subject: [PATCH 0380/1792] text/template: add CommentNode to template parse tree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #34652 Change-Id: Icf6e3eda593fed826736f34f95a9d66f5450cc98 Reviewed-on: https://go-review.googlesource.com/c/go/+/229398 Reviewed-by: Daniel Martí Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot --- api/next.txt | 14 ++++++++++++ doc/go1.16.html | 10 ++++++++ src/html/template/escape.go | 2 ++ src/html/template/template_test.go | 16 +++++++++++++ src/text/template/exec.go | 1 + src/text/template/parse/lex.go | 8 ++++++- src/text/template/parse/lex_test.go | 7 ++++-- src/text/template/parse/node.go | 33 +++++++++++++++++++++++++++ src/text/template/parse/parse.go | 22 +++++++++++++++--- src/text/template/parse/parse_test.go | 25 ++++++++++++++++++++ 10 files changed, 132 insertions(+), 6 deletions(-) diff --git a/api/next.txt b/api/next.txt index fe7509bf82..076f39ec34 100644 --- a/api/next.txt +++ b/api/next.txt @@ -3,3 +3,17 @@ pkg unicode, var Chorasmian *RangeTable pkg unicode, var Dives_Akuru *RangeTable pkg unicode, var Khitan_Small_Script *RangeTable pkg unicode, var Yezidi *RangeTable +pkg text/template/parse, const NodeComment = 20 +pkg text/template/parse, const NodeComment NodeType +pkg text/template/parse, const ParseComments = 1 +pkg text/template/parse, const ParseComments Mode +pkg text/template/parse, method (*CommentNode) Copy() Node +pkg text/template/parse, method (*CommentNode) String() string +pkg text/template/parse, method (CommentNode) Position() Pos +pkg text/template/parse, method (CommentNode) Type() NodeType +pkg text/template/parse, type CommentNode struct +pkg text/template/parse, type CommentNode struct, Text string +pkg text/template/parse, type CommentNode struct, embedded NodeType +pkg text/template/parse, type CommentNode struct, embedded Pos +pkg text/template/parse, type Mode uint +pkg text/template/parse, type Tree struct, Mode Mode diff --git a/doc/go1.16.html b/doc/go1.16.html index 805234bdab..7738cbdada 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -121,6 +121,16 @@ Do not send CLs removing the interior tags from such phrases. with "use of closed network connection".

+ +

text/template/parse

+ +

+ A new CommentNode + was added to the parse tree. The Mode + field in the parse.Tree enables access to it. +

+ +

unicode

diff --git a/src/html/template/escape.go b/src/html/template/escape.go index f12dafa870..8739735cb7 100644 --- a/src/html/template/escape.go +++ b/src/html/template/escape.go @@ -124,6 +124,8 @@ func (e *escaper) escape(c context, n parse.Node) context { switch n := n.(type) { case *parse.ActionNode: return e.escapeAction(c, n) + case *parse.CommentNode: + return c case *parse.IfNode: return e.escapeBranch(c, &n.BranchNode, "if") case *parse.ListNode: diff --git a/src/html/template/template_test.go b/src/html/template/template_test.go index 86bd4db444..1f2c888bbe 100644 --- a/src/html/template/template_test.go +++ b/src/html/template/template_test.go @@ -10,6 +10,7 @@ import ( . "html/template" "strings" "testing" + "text/template/parse" ) func TestTemplateClone(t *testing.T) { @@ -160,6 +161,21 @@ func TestStringsInScriptsWithJsonContentTypeAreCorrectlyEscaped(t *testing.T) { } } +func TestSkipEscapeComments(t *testing.T) { + c := newTestCase(t) + tr := parse.New("root") + tr.Mode = parse.ParseComments + newT, err := tr.Parse("{{/* A comment */}}{{ 1 }}{{/* Another comment */}}", "", "", make(map[string]*parse.Tree)) + if err != nil { + t.Fatalf("Cannot parse template text: %v", err) + } + c.root, err = c.root.AddParseTree("root", newT) + if err != nil { + t.Fatalf("Cannot add parse tree to template: %v", err) + } + c.mustExecute(c.root, nil, "1") +} + type testCase struct { t *testing.T root *Template diff --git a/src/text/template/exec.go b/src/text/template/exec.go index ac3e741390..7ac5175006 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -256,6 +256,7 @@ func (s *state) walk(dot reflect.Value, node parse.Node) { if len(node.Pipe.Decl) == 0 { s.printValue(node, val) } + case *parse.CommentNode: case *parse.IfNode: s.walkIfOrWith(parse.NodeIf, dot, node.Pipe, node.List, node.ElseList) case *parse.ListNode: diff --git a/src/text/template/parse/lex.go b/src/text/template/parse/lex.go index 30371f2862..e41373a002 100644 --- a/src/text/template/parse/lex.go +++ b/src/text/template/parse/lex.go @@ -41,6 +41,7 @@ const ( itemBool // boolean constant itemChar // printable ASCII character; grab bag for comma etc. itemCharConstant // character constant + itemComment // comment text itemComplex // complex constant (1+2i); imaginary is just a number itemAssign // equals ('=') introducing an assignment itemDeclare // colon-equals (':=') introducing a declaration @@ -112,6 +113,7 @@ type lexer struct { leftDelim string // start of action rightDelim string // end of action trimRightDelim string // end of action with trim marker + emitComment bool // emit itemComment tokens. pos Pos // current position in the input start Pos // start position of this item width Pos // width of last rune read from input @@ -203,7 +205,7 @@ func (l *lexer) drain() { } // lex creates a new scanner for the input string. -func lex(name, input, left, right string) *lexer { +func lex(name, input, left, right string, emitComment bool) *lexer { if left == "" { left = leftDelim } @@ -216,6 +218,7 @@ func lex(name, input, left, right string) *lexer { leftDelim: left, rightDelim: right, trimRightDelim: rightTrimMarker + right, + emitComment: emitComment, items: make(chan item), line: 1, startLine: 1, @@ -323,6 +326,9 @@ func lexComment(l *lexer) stateFn { if !delim { return l.errorf("comment ends before closing delimiter") } + if l.emitComment { + l.emit(itemComment) + } if trimSpace { l.pos += trimMarkerLen } diff --git a/src/text/template/parse/lex_test.go b/src/text/template/parse/lex_test.go index 563c4fc1cb..f6d5f285ed 100644 --- a/src/text/template/parse/lex_test.go +++ b/src/text/template/parse/lex_test.go @@ -15,6 +15,7 @@ var itemName = map[itemType]string{ itemBool: "bool", itemChar: "char", itemCharConstant: "charconst", + itemComment: "comment", itemComplex: "complex", itemDeclare: ":=", itemEOF: "EOF", @@ -90,6 +91,7 @@ var lexTests = []lexTest{ {"text", `now is the time`, []item{mkItem(itemText, "now is the time"), tEOF}}, {"text with comment", "hello-{{/* this is a comment */}}-world", []item{ mkItem(itemText, "hello-"), + mkItem(itemComment, "/* this is a comment */"), mkItem(itemText, "-world"), tEOF, }}, @@ -311,6 +313,7 @@ var lexTests = []lexTest{ }}, {"trimming spaces before and after comment", "hello- {{- /* hello */ -}} -world", []item{ mkItem(itemText, "hello-"), + mkItem(itemComment, "/* hello */"), mkItem(itemText, "-world"), tEOF, }}, @@ -389,7 +392,7 @@ var lexTests = []lexTest{ // collect gathers the emitted items into a slice. func collect(t *lexTest, left, right string) (items []item) { - l := lex(t.name, t.input, left, right) + l := lex(t.name, t.input, left, right, true) for { item := l.nextItem() items = append(items, item) @@ -529,7 +532,7 @@ func TestPos(t *testing.T) { func TestShutdown(t *testing.T) { // We need to duplicate template.Parse here to hold on to the lexer. const text = "erroneous{{define}}{{else}}1234" - lexer := lex("foo", text, "{{", "}}") + lexer := lex("foo", text, "{{", "}}", false) _, err := New("root").parseLexer(lexer) if err == nil { t.Fatalf("expected error") diff --git a/src/text/template/parse/node.go b/src/text/template/parse/node.go index dddc7752a2..177482f9b2 100644 --- a/src/text/template/parse/node.go +++ b/src/text/template/parse/node.go @@ -70,6 +70,7 @@ const ( NodeTemplate // A template invocation action. NodeVariable // A $ variable. NodeWith // A with action. + NodeComment // A comment. ) // Nodes. @@ -149,6 +150,38 @@ func (t *TextNode) Copy() Node { return &TextNode{tr: t.tr, NodeType: NodeText, Pos: t.Pos, Text: append([]byte{}, t.Text...)} } +// CommentNode holds a comment. +type CommentNode struct { + NodeType + Pos + tr *Tree + Text string // Comment text. +} + +func (t *Tree) newComment(pos Pos, text string) *CommentNode { + return &CommentNode{tr: t, NodeType: NodeComment, Pos: pos, Text: text} +} + +func (c *CommentNode) String() string { + var sb strings.Builder + c.writeTo(&sb) + return sb.String() +} + +func (c *CommentNode) writeTo(sb *strings.Builder) { + sb.WriteString("{{") + sb.WriteString(c.Text) + sb.WriteString("}}") +} + +func (c *CommentNode) tree() *Tree { + return c.tr +} + +func (c *CommentNode) Copy() Node { + return &CommentNode{tr: c.tr, NodeType: NodeComment, Pos: c.Pos, Text: c.Text} +} + // PipeNode holds a pipeline with optional declaration type PipeNode struct { NodeType diff --git a/src/text/template/parse/parse.go b/src/text/template/parse/parse.go index c9b80f4a24..496d8bfa1d 100644 --- a/src/text/template/parse/parse.go +++ b/src/text/template/parse/parse.go @@ -21,6 +21,7 @@ type Tree struct { Name string // name of the template represented by the tree. ParseName string // name of the top-level template during parsing, for error messages. Root *ListNode // top-level root of the tree. + Mode Mode // parsing mode. text string // text parsed to create the template (or its parent) // Parsing only; cleared after parse. funcs []map[string]interface{} @@ -29,8 +30,16 @@ type Tree struct { peekCount int vars []string // variables defined at the moment. treeSet map[string]*Tree + mode Mode } +// A mode value is a set of flags (or 0). Modes control parser behavior. +type Mode uint + +const ( + ParseComments Mode = 1 << iota // parse comments and add them to AST +) + // Copy returns a copy of the Tree. Any parsing state is discarded. func (t *Tree) Copy() *Tree { if t == nil { @@ -220,7 +229,8 @@ func (t *Tree) stopParse() { func (t *Tree) Parse(text, leftDelim, rightDelim string, treeSet map[string]*Tree, funcs ...map[string]interface{}) (tree *Tree, err error) { defer t.recover(&err) t.ParseName = t.Name - t.startParse(funcs, lex(t.Name, text, leftDelim, rightDelim), treeSet) + emitComment := t.Mode&ParseComments != 0 + t.startParse(funcs, lex(t.Name, text, leftDelim, rightDelim, emitComment), treeSet) t.text = text t.parse() t.add() @@ -240,12 +250,14 @@ func (t *Tree) add() { } } -// IsEmptyTree reports whether this tree (node) is empty of everything but space. +// IsEmptyTree reports whether this tree (node) is empty of everything but space or comments. func IsEmptyTree(n Node) bool { switch n := n.(type) { case nil: return true case *ActionNode: + case *CommentNode: + return true case *IfNode: case *ListNode: for _, node := range n.Nodes { @@ -276,6 +288,7 @@ func (t *Tree) parse() { if t.nextNonSpace().typ == itemDefine { newT := New("definition") // name will be updated once we know it. newT.text = t.text + newT.Mode = t.Mode newT.ParseName = t.ParseName newT.startParse(t.funcs, t.lex, t.treeSet) newT.parseDefinition() @@ -331,13 +344,15 @@ func (t *Tree) itemList() (list *ListNode, next Node) { } // textOrAction: -// text | action +// text | comment | action func (t *Tree) textOrAction() Node { switch token := t.nextNonSpace(); token.typ { case itemText: return t.newText(token.pos, token.val) case itemLeftDelim: return t.action() + case itemComment: + return t.newComment(token.pos, token.val) default: t.unexpected(token, "input") } @@ -539,6 +554,7 @@ func (t *Tree) blockControl() Node { block := New(name) // name will be updated once we know it. block.text = t.text + block.Mode = t.Mode block.ParseName = t.ParseName block.startParse(t.funcs, t.lex, t.treeSet) var end Node diff --git a/src/text/template/parse/parse_test.go b/src/text/template/parse/parse_test.go index 4e09a7852c..d9c13c5d95 100644 --- a/src/text/template/parse/parse_test.go +++ b/src/text/template/parse/parse_test.go @@ -348,6 +348,30 @@ func TestParseCopy(t *testing.T) { testParse(true, t) } +func TestParseWithComments(t *testing.T) { + textFormat = "%q" + defer func() { textFormat = "%s" }() + tests := [...]parseTest{ + {"comment", "{{/*\n\n\n*/}}", noError, "{{/*\n\n\n*/}}"}, + {"comment trim left", "x \r\n\t{{- /* hi */}}", noError, `"x"{{/* hi */}}`}, + {"comment trim right", "{{/* hi */ -}}\n\n\ty", noError, `{{/* hi */}}"y"`}, + {"comment trim left and right", "x \r\n\t{{- /* */ -}}\n\n\ty", noError, `"x"{{/* */}}"y"`}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + tr := New(test.name) + tr.Mode = ParseComments + tmpl, err := tr.Parse(test.input, "", "", make(map[string]*Tree)) + if err != nil { + t.Errorf("%q: expected error; got none", test.name) + } + if result := tmpl.Root.String(); result != test.result { + t.Errorf("%s=(%q): got\n\t%v\nexpected\n\t%v", test.name, test.input, result, test.result) + } + }) + } +} + type isEmptyTest struct { name string input string @@ -358,6 +382,7 @@ var isEmptyTests = []isEmptyTest{ {"empty", ``, true}, {"nonempty", `hello`, false}, {"spaces only", " \t\n \t\n", true}, + {"comment only", "{{/* comment */}}", true}, {"definition", `{{define "x"}}something{{end}}`, true}, {"definitions and space", "{{define `x`}}something{{end}}\n\n{{define `y`}}something{{end}}\n\n", true}, {"definitions and text", "{{define `x`}}something{{end}}\nx\n{{define `y`}}something{{end}}\ny\n", false}, -- GitLab From 49bae984955bd57302895beba2ecd8b9d5cd764c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 27 Aug 2020 16:31:30 -0700 Subject: [PATCH 0381/1792] test: add test that gccgo failed to compile For #38125 Change-Id: Id6ef10d74f0f9dbad2851531e0fe019cd145cf7c Reviewed-on: https://go-review.googlesource.com/c/go/+/251168 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- test/fixedbugs/issue38125.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 test/fixedbugs/issue38125.go diff --git a/test/fixedbugs/issue38125.go b/test/fixedbugs/issue38125.go new file mode 100644 index 0000000000..1207aecd39 --- /dev/null +++ b/test/fixedbugs/issue38125.go @@ -0,0 +1,22 @@ +// compile + +// 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. + +// gccgo mishandled embedded methods of type aliases. + +package p + +type I int + +func (I) M() {} + +type T = struct { + I +} + +func F() { + _ = T.M + _ = struct { I }.M +} -- GitLab From 27a30186abc18a8fc22b8ab40e3ee9f29d81c1d4 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 29 Aug 2020 03:25:21 +0700 Subject: [PATCH 0382/1792] cmd/compile,runtime: skip zero'ing order array for select statements The order array was zero initialized by the compiler, but ends up being overwritten by the runtime anyway. So let the runtime takes full responsibility for initializing, save us one instruction per select. Fixes #40399 Change-Id: Iec1eca27ad7180d4fcb3cc9ef97348206b7fe6b8 Reviewed-on: https://go-review.googlesource.com/c/go/+/251517 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/select.go | 4 +--- src/runtime/select.go | 1 + test/codegen/select.go | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 test/codegen/select.go diff --git a/src/cmd/compile/internal/gc/select.go b/src/cmd/compile/internal/gc/select.go index 3812a0e1fa..97e0424ce0 100644 --- a/src/cmd/compile/internal/gc/select.go +++ b/src/cmd/compile/internal/gc/select.go @@ -251,10 +251,8 @@ func walkselectcases(cases *Nodes) []*Node { r = typecheck(r, ctxStmt) init = append(init, r) + // No initialization for order; runtime.selectgo is responsible for that. order := temp(types.NewArray(types.Types[TUINT16], 2*int64(ncas))) - r = nod(OAS, order, nil) - r = typecheck(r, ctxStmt) - init = append(init, r) var pc0, pcs *Node if flag_race { diff --git a/src/runtime/select.go b/src/runtime/select.go index 80768b285b..a506747910 100644 --- a/src/runtime/select.go +++ b/src/runtime/select.go @@ -118,6 +118,7 @@ func selectgo(cas0 *scase, order0 *uint16, pc0 *uintptr, nsends, nrecvs int, blo scases := cas1[:ncases:ncases] pollorder := order1[:ncases:ncases] lockorder := order1[ncases:][:ncases:ncases] + // NOTE: pollorder/lockorder's underlying array was not zero-initialized by compiler. // Even when raceenabled is true, there might be select // statements in packages compiled without -race (e.g., diff --git a/test/codegen/select.go b/test/codegen/select.go new file mode 100644 index 0000000000..4426924b36 --- /dev/null +++ b/test/codegen/select.go @@ -0,0 +1,20 @@ +// asmcheck + +// 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 codegen + +func f() { + ch1 := make(chan int) + ch2 := make(chan int) + for { + // amd64:-`MOVQ\t[$]0, ""..autotmp_3` + select { + case <-ch1: + case <-ch2: + default: + } + } +} -- GitLab From 4fc3896e7933e31822caa50e024d4e139befc75f Mon Sep 17 00:00:00 2001 From: Shinnosuke Sawada <6warashi9@gmail.com> Date: Mon, 17 Aug 2020 20:37:51 +0900 Subject: [PATCH 0383/1792] database/sql: shortestIdleTimeLocked correct min comparison When zero or less, maxIdleTime and maxLifetime means unlimited. Helper function shortestIdleTimeLocked must not return the minimum of the two until both are verified to be greater then zero. Fixes #40841 Change-Id: I1130332baf4ad259cd90c10f4221f5def8510655 Reviewed-on: https://go-review.googlesource.com/c/go/+/248817 Reviewed-by: Daniel Theophanes --- src/database/sql/sql.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go index 0b85db66b9..e3580698fd 100644 --- a/src/database/sql/sql.go +++ b/src/database/sql/sql.go @@ -869,6 +869,13 @@ func (db *DB) maxIdleConnsLocked() int { } func (db *DB) shortestIdleTimeLocked() time.Duration { + if db.maxIdleTime <= 0 { + return db.maxLifetime + } + if db.maxLifetime <= 0 { + return db.maxIdleTime + } + min := db.maxIdleTime if min > db.maxLifetime { min = db.maxLifetime -- GitLab From ba0fab3cb731fe9a383bd61c3480cccfe32bb1f4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 29 Aug 2020 14:11:18 -0700 Subject: [PATCH 0384/1792] debug/elf: run relocation tests in parallel Also don't restart DWARF reading from beginning when we are testing multiple entries. Also reformat relocationTests slice to use indexed literals. Change-Id: Ia5f17214483394d0ef033be516df61f0bdc521b6 Reviewed-on: https://go-review.googlesource.com/c/go/+/251637 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/debug/elf/file_test.go | 550 ++++++++++++++++++++----------------- 1 file changed, 296 insertions(+), 254 deletions(-) diff --git a/src/debug/elf/file_test.go b/src/debug/elf/file_test.go index b13d13ebf0..4da580da5a 100644 --- a/src/debug/elf/file_test.go +++ b/src/debug/elf/file_test.go @@ -304,367 +304,409 @@ var relocationTests = []relocationTest{ { "testdata/go-relocation-test-gcc441-x86-64.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.4.1", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "go-relocation-test.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: uint64(0x6), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.4.1", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "go-relocation-test.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: uint64(0x6), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc441-x86.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.4.1", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "t.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: uint64(0x5), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.4.1", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "t.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: uint64(0x5), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc424-x86-64.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.2.4 (Ubuntu 4.2.4-1ubuntu4)", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc424.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: uint64(0x6), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.2.4 (Ubuntu 4.2.4-1ubuntu4)", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc424.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: uint64(0x6), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc482-aarch64.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.8.2 -g -fstack-protector", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc482.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(0x24), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.8.2 -g -fstack-protector", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc482.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(0x24), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc492-arm.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 20141224 (prerelease) -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mtls-dialect=gnu -g", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc492.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/root/go/src/debug/elf/testdata", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(0x28), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 20141224 (prerelease) -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mtls-dialect=gnu -g", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc492.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/root/go/src/debug/elf/testdata", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(0x28), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-clang-arm.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrStmtList, Val: int64(0x0), Class: dwarf.ClassLinePtr}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(48), Class: dwarf.ClassConstant}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrStmtList, Val: int64(0x0), Class: dwarf.ClassLinePtr}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(48), Class: dwarf.ClassConstant}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc5-ppc.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C11 5.0.0 20150116 (experimental) -Asystem=linux -Asystem=unix -Asystem=posix -g", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc5-ppc.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(0x44), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C11 5.0.0 20150116 (experimental) -Asystem=linux -Asystem=unix -Asystem=posix -g", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc5-ppc.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(0x44), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc482-ppc64le.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.8.2 -Asystem=linux -Asystem=unix -Asystem=posix -msecure-plt -mtune=power8 -mcpu=power7 -gdwarf-2 -fstack-protector", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc482-ppc64le.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: uint64(0x24), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.8.2 -Asystem=linux -Asystem=unix -Asystem=posix -msecure-plt -mtune=power8 -mcpu=power7 -gdwarf-2 -fstack-protector", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "go-relocation-test-gcc482-ppc64le.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: uint64(0x24), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc492-mips64.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 -meb -mabi=64 -march=mips3 -mtune=mips64 -mllsc -mno-shared -g", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(100), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 -meb -mabi=64 -march=mips3 -mtune=mips64 -mllsc -mno-shared -g", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(100), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc531-s390x.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C11 5.3.1 20160316 -march=zEC12 -m64 -mzarch -g -fstack-protector-strong", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(58), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C11 5.3.1 20160316 -march=zEC12 -m64 -mzarch -g -fstack-protector-strong", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(58), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc620-sparc64.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C11 6.2.0 20160914 -mcpu=v9 -g -fstack-protector-strong", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(0x2c), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C11 6.2.0 20160914 -mcpu=v9 -g -fstack-protector-strong", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(0x2c), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc492-mipsle.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 -mel -march=mips2 -mtune=mips32 -mllsc -mno-shared -mabi=32 -g", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(0x58), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.2 -mel -march=mips2 -mtune=mips32 -mllsc -mno-shared -mabi=32 -g", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(0x58), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc540-mips.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C11 5.4.0 20160609 -meb -mips32 -mtune=mips32r2 -mfpxx -mllsc -mno-shared -mabi=32 -g -gdwarf-2", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: uint64(0x5c), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C11 5.4.0 20160609 -meb -mips32 -mtune=mips32r2 -mfpxx -mllsc -mno-shared -mabi=32 -g -gdwarf-2", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: uint64(0x5c), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc493-mips64le.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.3 -mel -mabi=64 -mllsc -mno-shared -g -fstack-protector-strong", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(100), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C 4.9.3 -mel -mabi=64 -mllsc -mno-shared -g -fstack-protector-strong", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(1), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: int64(100), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-gcc720-riscv64.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "GNU C11 7.2.0 -march=rv64imafdc -mabi=lp64d -g -gdwarf-2", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: uint64(0x2c), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C11 7.2.0 -march=rv64imafdc -mabi=lp64d -g -gdwarf-2", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrHighpc, Val: uint64(0x2c), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, }, - }}, + }, }, }, { "testdata/go-relocation-test-clang-x86.obj", []relocationTestEntry{ - {0, &dwarf.Entry{ - Offset: 0xb, - Tag: dwarf.TagCompileUnit, - Children: true, - Field: []dwarf.Field{ - {Attr: dwarf.AttrProducer, Val: "clang version google3-trunk (trunk r209387)", Class: dwarf.ClassString}, - {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrName, Val: "go-relocation-test-clang.c", Class: dwarf.ClassString}, - {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, - {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "clang version google3-trunk (trunk r209387)", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "go-relocation-test-clang.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + }, }, - }}, + }, }, }, { "testdata/gcc-amd64-openbsd-debug-with-rela.obj", []relocationTestEntry{ - {203, &dwarf.Entry{ - Offset: 0xc62, - Tag: dwarf.TagMember, - Children: false, - Field: []dwarf.Field{ - {Attr: dwarf.AttrName, Val: "it_interval", Class: dwarf.ClassString}, - {Attr: dwarf.AttrDeclFile, Val: int64(7), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrDeclLine, Val: int64(236), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrType, Val: dwarf.Offset(0xb7f), Class: dwarf.ClassReference}, - {Attr: dwarf.AttrDataMemberLoc, Val: []byte{0x23, 0x0}, Class: dwarf.ClassExprLoc}, + { + entryNumber: 203, + entry: &dwarf.Entry{ + Offset: 0xc62, + Tag: dwarf.TagMember, + Children: false, + Field: []dwarf.Field{ + {Attr: dwarf.AttrName, Val: "it_interval", Class: dwarf.ClassString}, + {Attr: dwarf.AttrDeclFile, Val: int64(7), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrDeclLine, Val: int64(236), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrType, Val: dwarf.Offset(0xb7f), Class: dwarf.ClassReference}, + {Attr: dwarf.AttrDataMemberLoc, Val: []byte{0x23, 0x0}, Class: dwarf.ClassExprLoc}, + }, }, - }}, - {204, &dwarf.Entry{ - Offset: 0xc70, - Tag: dwarf.TagMember, - Children: false, - Field: []dwarf.Field{ - {Attr: dwarf.AttrName, Val: "it_value", Class: dwarf.ClassString}, - {Attr: dwarf.AttrDeclFile, Val: int64(7), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrDeclLine, Val: int64(237), Class: dwarf.ClassConstant}, - {Attr: dwarf.AttrType, Val: dwarf.Offset(0xb7f), Class: dwarf.ClassReference}, - {Attr: dwarf.AttrDataMemberLoc, Val: []byte{0x23, 0x10}, Class: dwarf.ClassExprLoc}, + }, + { + entryNumber: 204, + entry: &dwarf.Entry{ + Offset: 0xc70, + Tag: dwarf.TagMember, + Children: false, + Field: []dwarf.Field{ + {Attr: dwarf.AttrName, Val: "it_value", Class: dwarf.ClassString}, + {Attr: dwarf.AttrDeclFile, Val: int64(7), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrDeclLine, Val: int64(237), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrType, Val: dwarf.Offset(0xb7f), Class: dwarf.ClassReference}, + {Attr: dwarf.AttrDataMemberLoc, Val: []byte{0x23, 0x10}, Class: dwarf.ClassExprLoc}, + }, }, - }}, + }, }, }, } func TestDWARFRelocations(t *testing.T) { - for i, test := range relocationTests { - f, err := Open(test.file) - if err != nil { - t.Error(err) - continue - } - dwarf, err := f.DWARF() - if err != nil { - t.Error(err) - continue - } - for _, testEntry := range test.entries { - reader := dwarf.Reader() - for j := 0; j < testEntry.entryNumber; j++ { - entry, err := reader.Next() - if entry == nil || err != nil { - t.Errorf("Failed to skip to entry %d: %v", testEntry.entryNumber, err) - continue - } + for _, test := range relocationTests { + test := test + t.Run(test.file, func(t *testing.T) { + t.Parallel() + f, err := Open(test.file) + if err != nil { + t.Fatal(err) } - entry, err := reader.Next() + dwarf, err := f.DWARF() if err != nil { - t.Error(err) - continue + t.Fatal(err) } - if !reflect.DeepEqual(testEntry.entry, entry) { - t.Errorf("#%d/%d: mismatch: got:%#v want:%#v", i, testEntry.entryNumber, entry, testEntry.entry) - continue + reader := dwarf.Reader() + idx := 0 + for _, testEntry := range test.entries { + if testEntry.entryNumber < idx { + t.Fatalf("internal test error: %d < %d", testEntry.entryNumber, idx) + } + for ; idx < testEntry.entryNumber; idx++ { + entry, err := reader.Next() + if entry == nil || err != nil { + t.Fatalf("Failed to skip to entry %d: %v", testEntry.entryNumber, err) + } + } + entry, err := reader.Next() + idx++ + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(testEntry.entry, entry) { + t.Errorf("entry %d mismatch: got:%#v want:%#v", testEntry.entryNumber, entry, testEntry.entry) + } } - } + }) } } -- GitLab From 9e70564f639252aade60369b51a121f3325e9d6c Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 28 Aug 2020 17:10:32 +0000 Subject: [PATCH 0385/1792] cmd/compile,cmd/asm: simplify recording of branch targets, take 2 We currently use two fields to store the targets of branches. Some phases use p.To.Val, some use p.Pcond. Rewrite so that every branch instruction uses p.To.Val. p.From.Val is also used in rare instances. Introduce a Pool link for use by arm/arm64, instead of repurposing Pcond. This is a cleanup CL in preparation for some stack frame CLs. Change-Id: If8239177e4b1ea2bccd0608eb39553d23210d405 Reviewed-on: https://go-review.googlesource.com/c/go/+/251437 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/amd64/ssa.go | 4 +-- src/cmd/compile/internal/gc/gsubr.go | 2 +- src/cmd/compile/internal/gc/ssa.go | 2 +- src/cmd/compile/internal/s390x/ssa.go | 4 +-- src/cmd/compile/internal/x86/ssa.go | 4 +-- src/cmd/internal/obj/arm/asm5.go | 16 ++++++------ src/cmd/internal/obj/arm/obj5.go | 10 ++++---- src/cmd/internal/obj/arm64/asm7.go | 36 ++++++++++++++++----------- src/cmd/internal/obj/arm64/obj7.go | 16 ++++++------ src/cmd/internal/obj/link.go | 17 +++++++++++-- src/cmd/internal/obj/mips/asm0.go | 24 +++++++++--------- src/cmd/internal/obj/mips/obj0.go | 14 +++++------ src/cmd/internal/obj/pass.go | 17 ++++++------- src/cmd/internal/obj/ppc64/asm9.go | 18 +++++++------- src/cmd/internal/obj/ppc64/obj9.go | 12 ++++----- src/cmd/internal/obj/riscv/obj.go | 29 ++++++++++----------- src/cmd/internal/obj/s390x/asmz.go | 18 +++++++------- src/cmd/internal/obj/s390x/objz.go | 10 ++++---- src/cmd/internal/obj/util.go | 6 ++--- src/cmd/internal/obj/x86/asm6.go | 12 ++++----- src/cmd/internal/obj/x86/obj6.go | 12 ++++----- 21 files changed, 149 insertions(+), 134 deletions(-) diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index 9d8a0920b3..4ac877986c 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -319,8 +319,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { // 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.Val = n1 - j2.To.Val = s.Pc() + j1.To.SetTarget(n1) + j2.To.SetTarget(s.Pc()) } case ssa.OpAMD64HMULQ, ssa.OpAMD64HMULL, ssa.OpAMD64HMULQU, ssa.OpAMD64HMULLU: diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go index 15a84a8a43..480d411f49 100644 --- a/src/cmd/compile/internal/gc/gsubr.go +++ b/src/cmd/compile/internal/gc/gsubr.go @@ -342,6 +342,6 @@ func Patch(p *obj.Prog, to *obj.Prog) { if p.To.Type != obj.TYPE_BRANCH { Fatalf("patch: not a branch") } - p.To.Val = to + p.To.SetTarget(to) p.To.Offset = to.Pc } diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 104dd403ea..52083d999e 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -6182,7 +6182,7 @@ func genssa(f *ssa.Func, pp *Progs) { // Resolve branches, and relax DefaultStmt into NotStmt for _, br := range s.Branches { - br.P.To.Val = s.bstart[br.B.ID] + br.P.To.SetTarget(s.bstart[br.B.ID]) if br.P.Pos.IsStmt() != src.PosIsStmt { br.P.Pos = br.P.Pos.WithNotStmt() } else if v0 := br.B.FirstPossibleStmtValue(); v0 != nil && v0.Pos.Line() == br.P.Pos.Line() && v0.Pos.IsStmt() == src.PosIsStmt { diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go index 4cf4b70a32..00d253c95a 100644 --- a/src/cmd/compile/internal/s390x/ssa.go +++ b/src/cmd/compile/internal/s390x/ssa.go @@ -338,8 +338,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { n.To.Reg = dividend } - j.To.Val = n - j2.To.Val = s.Pc() + j.To.SetTarget(n) + j2.To.SetTarget(s.Pc()) } case ssa.OpS390XADDconst, ssa.OpS390XADDWconst: opregregimm(s, v.Op.Asm(), v.Reg(), v.Args[0].Reg(), v.AuxInt) diff --git a/src/cmd/compile/internal/x86/ssa.go b/src/cmd/compile/internal/x86/ssa.go index 2de978c28a..c21ac32297 100644 --- a/src/cmd/compile/internal/x86/ssa.go +++ b/src/cmd/compile/internal/x86/ssa.go @@ -261,8 +261,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { n.To.Reg = x86.REG_DX } - j.To.Val = n - j2.To.Val = s.Pc() + j.To.SetTarget(n) + j2.To.SetTarget(s.Pc()) } case ssa.Op386HMULL, ssa.Op386HMULLU: diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go index 7b7e42ee2e..269a4223d5 100644 --- a/src/cmd/internal/obj/arm/asm5.go +++ b/src/cmd/internal/obj/arm/asm5.go @@ -644,7 +644,7 @@ func (c *ctxt5) flushpool(p *obj.Prog, skip int, force int) bool { q := c.newprog() q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Link + q.To.SetTarget(p.Link) q.Link = c.blitrl q.Pos = p.Pos c.blitrl = q @@ -705,7 +705,7 @@ func (c *ctxt5) addpool(p *obj.Prog, a *obj.Addr) { if t.Rel == nil { for q := c.blitrl; q != nil; q = q.Link { /* could hash on t.t0.offset */ if q.Rel == nil && q.To == t.To { - p.Pcond = q + p.Pool = q return } } @@ -724,8 +724,8 @@ func (c *ctxt5) addpool(p *obj.Prog, a *obj.Addr) { c.elitrl = q c.pool.size += 4 - // Store the link to the pool entry in Pcond. - p.Pcond = q + // Store the link to the pool entry in Pool. + p.Pool = q } func (c *ctxt5) regoff(a *obj.Addr) int32 { @@ -1584,8 +1584,8 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { break } - if p.Pcond != nil { - v = int32((p.Pcond.Pc - c.pc) - 8) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - c.pc) - 8) } o1 |= (uint32(v) >> 2) & 0xffffff @@ -3023,7 +3023,7 @@ func (c *ctxt5) omvr(p *obj.Prog, a *obj.Addr, dr int) uint32 { func (c *ctxt5) omvl(p *obj.Prog, a *obj.Addr, dr int) uint32 { var o1 uint32 - if p.Pcond == nil { + if p.Pool == nil { c.aclass(a) v := immrot(^uint32(c.instoffset)) if v == 0 { @@ -3035,7 +3035,7 @@ func (c *ctxt5) omvl(p *obj.Prog, a *obj.Addr, dr int) uint32 { o1 |= uint32(v) o1 |= (uint32(dr) & 15) << 12 } else { - v := int32(p.Pcond.Pc - p.Pc - 8) + v := int32(p.Pool.Pc - p.Pc - 8) o1 = c.olr(v, REGPC, dr, int(p.Scond)&C_SCOND) } diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index 86831f2b44..4d9187b530 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -406,7 +406,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { mov.To.Reg = REG_R2 // B.NE branch target is MOVW above - bne.Pcond = mov + bne.To.SetTarget(mov) // ADD $(autosize+4), R13, R3 p = obj.Appendp(mov, newprog) @@ -428,7 +428,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = ABNE p.To.Type = obj.TYPE_BRANCH - p.Pcond = end + p.To.SetTarget(end) // ADD $4, R13, R4 p = obj.Appendp(p, newprog) @@ -452,7 +452,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = AB p.To.Type = obj.TYPE_BRANCH - p.Pcond = end + p.To.SetTarget(end) // reset for subsequent passes p = end @@ -741,7 +741,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { movw.To.Type = obj.TYPE_REG movw.To.Reg = REG_R3 - bls.Pcond = movw + bls.To.SetTarget(movw) // BL runtime.morestack call := obj.Appendp(movw, c.newprog) @@ -762,7 +762,7 @@ func (c *ctxt5) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { b := obj.Appendp(pcdata, c.newprog) b.As = obj.AJMP b.To.Type = obj.TYPE_BRANCH - b.Pcond = c.cursym.Func.Text.Link + b.To.SetTarget(c.cursym.Func.Text.Link) b.Spadj = +framesize return end diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index bc27740469..65f7898332 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -977,8 +977,8 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) /* very large branches */ - if (o.type_ == 7 || o.type_ == 39 || o.type_ == 40) && p.Pcond != nil { // 7: BEQ and like, 39: CBZ and like, 40: TBZ and like - otxt := p.Pcond.Pc - pc + if (o.type_ == 7 || o.type_ == 39 || o.type_ == 40) && p.To.Target() != nil { // 7: BEQ and like, 39: CBZ and like, 40: TBZ and like + otxt := p.To.Target().Pc - pc var toofar bool switch o.type_ { case 7, 39: // branch instruction encodes 19 bits @@ -992,14 +992,14 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p.Link = q q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Pcond - p.Pcond = q + q.To.SetTarget(p.To.Target()) + p.To.SetTarget(q) q = c.newprog() q.Link = p.Link p.Link = q q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = q.Link.Link + q.To.SetTarget(q.Link.Link) bflag = 1 } } @@ -1123,7 +1123,7 @@ func (c *ctxt7) flushpool(p *obj.Prog, skip int) { q := c.newprog() q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Link + q.To.SetTarget(p.Link) q.Link = c.blitrl q.Pos = p.Pos c.blitrl = q @@ -1249,7 +1249,7 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) { for q := c.blitrl; q != nil; q = q.Link { /* could hash on t.t0.offset */ if q.To == t.To { - p.Pcond = q + p.Pool = q return } } @@ -1266,7 +1266,7 @@ func (c *ctxt7) addpool(p *obj.Prog, a *obj.Addr) { c.elitrl = q c.pool.size = -c.pool.size & (funcAlign - 1) c.pool.size += uint32(sz) - p.Pcond = q + p.Pool = q } func (c *ctxt7) regoff(a *obj.Addr) uint32 { @@ -6042,15 +6042,21 @@ func (c *ctxt7) opimm(p *obj.Prog, a obj.As) uint32 { func (c *ctxt7) brdist(p *obj.Prog, preshift int, flen int, shift int) int64 { v := int64(0) t := int64(0) - if p.Pcond != nil { - v = (p.Pcond.Pc >> uint(preshift)) - (c.pc >> uint(preshift)) + q := p.To.Target() + if q == nil { + // TODO: don't use brdist for this case, as it isn't a branch. + // (Calls from omovlit, and maybe adr/adrp opcodes as well.) + q = p.Pool + } + if q != nil { + v = (q.Pc >> uint(preshift)) - (c.pc >> uint(preshift)) if (v & ((1 << uint(shift)) - 1)) != 0 { c.ctxt.Diag("misaligned label\n%v", p) } v >>= uint(shift) t = int64(1) << uint(flen-1) if v < -t || v >= t { - c.ctxt.Diag("branch too far %#x vs %#x [%p]\n%v\n%v", v, t, c.blitrl, p, p.Pcond) + c.ctxt.Diag("branch too far %#x vs %#x [%p]\n%v\n%v", v, t, c.blitrl, p, q) panic("branch too far") } } @@ -6526,7 +6532,7 @@ func (c *ctxt7) oaddi(p *obj.Prog, o1 int32, v int32, r int, rt int) uint32 { */ func (c *ctxt7) omovlit(as obj.As, p *obj.Prog, a *obj.Addr, dr int) uint32 { var o1 int32 - if p.Pcond == nil { /* not in literal pool */ + if p.Pool == nil { /* not in literal pool */ c.aclass(a) c.ctxt.Logf("omovlit add %d (%#x)\n", c.instoffset, uint64(c.instoffset)) @@ -6552,11 +6558,11 @@ func (c *ctxt7) omovlit(as obj.As, p *obj.Prog, a *obj.Addr, dr int) uint32 { w = 1 /* 64-bit SIMD/FP */ case AMOVD: - if p.Pcond.As == ADWORD { + if p.Pool.As == ADWORD { w = 1 /* 64-bit */ - } else if p.Pcond.To.Offset < 0 { + } else if p.Pool.To.Offset < 0 { w = 2 /* 32-bit, sign-extended to 64-bit */ - } else if p.Pcond.To.Offset >= 0 { + } else if p.Pool.To.Offset >= 0 { w = 0 /* 32-bit, zero-extended to 64-bit */ } else { c.ctxt.Diag("invalid operand %v in %v", a, p) diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go index f54429fabe..56da854f16 100644 --- a/src/cmd/internal/obj/arm64/obj7.go +++ b/src/cmd/internal/obj/arm64/obj7.go @@ -187,9 +187,9 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { movlr.To.Type = obj.TYPE_REG movlr.To.Reg = REG_R3 if q != nil { - q.Pcond = movlr + q.To.SetTarget(movlr) } - bls.Pcond = movlr + bls.To.SetTarget(movlr) debug := movlr if false { @@ -220,7 +220,7 @@ func (c *ctxt7) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { jmp := obj.Appendp(pcdata, c.newprog) jmp.As = AB jmp.To.Type = obj.TYPE_BRANCH - jmp.Pcond = c.cursym.Func.Text.Link + jmp.To.SetTarget(c.cursym.Func.Text.Link) jmp.Spadj = +framesize return end @@ -697,7 +697,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { mov.To.Reg = REG_R2 // CBNZ branches to the MOV above - cbnz.Pcond = mov + cbnz.To.SetTarget(mov) // ADD $(autosize+8), SP, R3 q = obj.Appendp(mov, c.newprog) @@ -719,7 +719,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = ABNE q.To.Type = obj.TYPE_BRANCH - q.Pcond = end + q.To.SetTarget(end) // ADD $8, SP, R4 q = obj.Appendp(q, c.newprog) @@ -743,7 +743,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = AB q.To.Type = obj.TYPE_BRANCH - q.Pcond = end + q.To.SetTarget(end) } case obj.ARET: @@ -913,7 +913,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q5.Reg = REGSP q5.To.Type = obj.TYPE_REG q5.To.Reg = REGFP - q1.Pcond = q5 + q1.From.SetTarget(q5) p = q5 } @@ -966,7 +966,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q5.Reg = REGSP q5.To.Type = obj.TYPE_REG q5.To.Reg = REGFP - q1.Pcond = q5 + q1.From.SetTarget(q5) p = q5 } } diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 1fc90db864..1d4217b5f5 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -237,6 +237,19 @@ const ( TYPE_REGLIST ) +func (a *Addr) Target() *Prog { + if a.Type == TYPE_BRANCH && a.Val != nil { + return a.Val.(*Prog) + } + return nil +} +func (a *Addr) SetTarget(t *Prog) { + if a.Type != TYPE_BRANCH { + panic("setting branch target when type is not TYPE_BRANCH") + } + a.Val = t +} + // Prog describes a single machine instruction. // // The general instruction form is: @@ -255,7 +268,7 @@ const ( // to avoid too much changes in a single swing. // (1) scheme is enough to express any kind of operand combination. // -// Jump instructions use the Pcond field to point to the target instruction, +// Jump instructions use the To.Val field to point to the target *Prog, // which must be in the same linked list as the jump instruction. // // The Progs for a given function are arranged in a list linked through the Link field. @@ -274,7 +287,7 @@ type Prog struct { From Addr // first source operand RestArgs []Addr // can pack any operands that not fit into {Prog.From, Prog.To} To Addr // destination operand (second is RegTo2 below) - Pcond *Prog // target of conditional jump + Pool *Prog // constant pool entry, for arm,arm64 back ends Forwd *Prog // for x86 back end Rel *Prog // for x86, arm back ends Pc int64 // for back ends or assembler: virtual or actual program counter, depending on phase diff --git a/src/cmd/internal/obj/mips/asm0.go b/src/cmd/internal/obj/mips/asm0.go index faa827da9f..6107974745 100644 --- a/src/cmd/internal/obj/mips/asm0.go +++ b/src/cmd/internal/obj/mips/asm0.go @@ -460,8 +460,8 @@ func span0(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) // very large conditional branches - if o.type_ == 6 && p.Pcond != nil { - otxt = p.Pcond.Pc - pc + if o.type_ == 6 && p.To.Target() != nil { + otxt = p.To.Target().Pc - pc if otxt < -(1<<17)+10 || otxt >= (1<<17)-10 { q = c.newprog() q.Link = p.Link @@ -469,15 +469,15 @@ func span0(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q.As = AJMP q.Pos = p.Pos q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Pcond - p.Pcond = q + q.To.SetTarget(p.To.Target()) + p.To.SetTarget(q) q = c.newprog() q.Link = p.Link p.Link = q q.As = AJMP q.Pos = p.Pos q.To.Type = obj.TYPE_BRANCH - q.Pcond = q.Link.Link + q.To.SetTarget(q.Link.Link) c.addnop(p.Link) c.addnop(p) @@ -1230,10 +1230,10 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) { case 6: /* beq r1,[r2],sbra */ v := int32(0) - if p.Pcond == nil { + if p.To.Target() == nil { v = int32(-4) >> 2 } else { - v = int32(p.Pcond.Pc-p.Pc-4) >> 2 + v = int32(p.To.Target().Pc-p.Pc-4) >> 2 } if (v<<16)>>16 != v { c.ctxt.Diag("short branch too far\n%v", p) @@ -1285,25 +1285,25 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) { 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.Pcond == nil { + if p.To.Target() == nil { v = int32(-4) >> 2 } else { - v = int32(p.Pcond.Pc-p.Pc-4) >> 2 + v = int32(p.To.Target().Pc-p.Pc-4) >> 2 } if (v<<16)>>16 == v { o1 = OP_IRR(c.opirr(ABEQ), uint32(v), uint32(REGZERO), uint32(REGZERO)) break } } - if p.Pcond == nil { + if p.To.Target() == nil { v = int32(p.Pc) >> 2 } else { - v = int32(p.Pcond.Pc) >> 2 + v = int32(p.To.Target().Pc) >> 2 } o1 = OP_JMP(c.opirr(p.As), uint32(v)) if p.To.Sym == nil { p.To.Sym = c.cursym.Func.Text.From.Sym - p.To.Offset = p.Pcond.Pc + p.To.Offset = p.To.Target().Pc } rel := obj.Addrel(c.cursym) rel.Off = int32(c.pc) diff --git a/src/cmd/internal/obj/mips/obj0.go b/src/cmd/internal/obj/mips/obj0.go index 77cad979a6..f19facc00c 100644 --- a/src/cmd/internal/obj/mips/obj0.go +++ b/src/cmd/internal/obj/mips/obj0.go @@ -227,11 +227,11 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } else { p.Mark |= BRANCH } - q1 := p.Pcond + q1 := p.To.Target() if q1 != nil { for q1.As == obj.ANOP { q1 = q1.Link - p.Pcond = q1 + p.To.SetTarget(q1) } if q1.Mark&LEAF == 0 { @@ -424,8 +424,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, newprog) q.As = obj.ANOP - p1.Pcond = q - p2.Pcond = q + p1.To.SetTarget(q) + p2.To.SetTarget(q) } case ARET: @@ -778,7 +778,7 @@ func (c *ctxt0) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.To.Type = obj.TYPE_REG p.To.Reg = REG_R3 if q != nil { - q.Pcond = p + q.To.SetTarget(p) p.Mark |= LABEL } @@ -805,14 +805,14 @@ func (c *ctxt0) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.As = AJMP p.To.Type = obj.TYPE_BRANCH - p.Pcond = c.cursym.Func.Text.Link + p.To.SetTarget(c.cursym.Func.Text.Link) p.Mark |= BRANCH // placeholder for q1's jump target p = obj.Appendp(p, c.newprog) p.As = obj.ANOP // zero-width place holder - q1.Pcond = p + q1.To.SetTarget(p) return p } diff --git a/src/cmd/internal/obj/pass.go b/src/cmd/internal/obj/pass.go index 4f156d969b..09d520b4e9 100644 --- a/src/cmd/internal/obj/pass.go +++ b/src/cmd/internal/obj/pass.go @@ -36,8 +36,8 @@ package obj // In the case of an infinite loop, brloop returns nil. func brloop(p *Prog) *Prog { c := 0 - for q := p; q != nil; q = q.Pcond { - if q.As != AJMP || q.Pcond == nil { + for q := p; q != nil; q = q.To.Target() { + if q.As != AJMP || q.To.Target() == nil { return q } c++ @@ -132,8 +132,6 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { continue } if p.To.Val != nil { - // TODO: Remove To.Val.(*Prog) in favor of p->pcond. - p.Pcond = p.To.Val.(*Prog) continue } @@ -158,8 +156,7 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { p.To.Type = TYPE_NONE } - p.To.Val = q - p.Pcond = q + p.To.SetTarget(q) } if !ctxt.Flag_optimize { @@ -168,12 +165,12 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { // Collapse series of jumps to jumps. for p := sym.Func.Text; p != nil; p = p.Link { - if p.Pcond == nil { + if p.To.Target() == nil { continue } - p.Pcond = brloop(p.Pcond) - if p.Pcond != nil && p.To.Type == TYPE_BRANCH { - p.To.Offset = p.Pcond.Pc + p.To.SetTarget(brloop(p.To.Target())) + if p.To.Target() != nil && p.To.Type == TYPE_BRANCH { + p.To.Offset = p.To.Target().Pc } } } diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 3c82477fc4..98b453de6c 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -725,22 +725,22 @@ func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { o = c.oplook(p) // very large conditional branches - if (o.type_ == 16 || o.type_ == 17) && p.Pcond != nil { - otxt = p.Pcond.Pc - pc + if (o.type_ == 16 || o.type_ == 17) && p.To.Target() != nil { + otxt = p.To.Target().Pc - pc if otxt < -(1<<15)+10 || otxt >= (1<<15)-10 { q = c.newprog() q.Link = p.Link p.Link = q q.As = ABR q.To.Type = obj.TYPE_BRANCH - q.Pcond = p.Pcond - p.Pcond = q + q.To.SetTarget(p.To.Target()) + p.To.SetTarget(q) q = c.newprog() q.Link = p.Link p.Link = q q.As = ABR q.To.Type = obj.TYPE_BRANCH - q.Pcond = q.Link.Link + q.To.SetTarget(q.Link.Link) //addnop(p->link); //addnop(p); @@ -2630,8 +2630,8 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { case 11: /* br/bl lbra */ v := int32(0) - if p.Pcond != nil { - v = int32(p.Pcond.Pc - p.Pc) + if p.To.Target() != nil { + v = int32(p.To.Target().Pc - p.Pc) if v&03 != 0 { c.ctxt.Diag("odd branch target address\n%v", p) v &^= 03 @@ -2781,8 +2781,8 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { } } v := int32(0) - if p.Pcond != nil { - v = int32(p.Pcond.Pc - p.Pc) + if p.To.Target() != nil { + v = int32(p.To.Target().Pc - p.Pc) } if v&03 != 0 { c.ctxt.Diag("odd branch target address\n%v", p) diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index 749f7066de..c012762a18 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -556,7 +556,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ABVS: p.Mark |= BRANCH q = p - q1 = p.Pcond + q1 = p.To.Target() if q1 != nil { // NOPs are not removed due to #40689. @@ -841,8 +841,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = obj.ANOP - p1.Pcond = q - p2.Pcond = q + p1.To.SetTarget(q) + p2.To.SetTarget(q) } case obj.ARET: @@ -1153,7 +1153,7 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p.To.Type = obj.TYPE_REG p.To.Reg = REG_R5 if q != nil { - q.Pcond = p + q.To.SetTarget(p) } p = c.ctxt.EmitEntryStackMap(c.cursym, p, c.newprog) @@ -1248,13 +1248,13 @@ func (c *ctxt9) stacksplit(p *obj.Prog, framesize int32) *obj.Prog { p = obj.Appendp(p, c.newprog) p.As = ABR p.To.Type = obj.TYPE_BRANCH - p.Pcond = p0.Link + p.To.SetTarget(p0.Link) // placeholder for q1's jump target p = obj.Appendp(p, c.newprog) p.As = obj.ANOP // zero-width place holder - q1.Pcond = p + q1.To.SetTarget(p) return p } diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index 2eb2935b31..77d383b290 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -634,7 +634,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { getargp.Reg = 0 getargp.To = obj.Addr{Type: obj.TYPE_REG, Reg: REG_X12} - bneadj.Pcond = getargp + bneadj.To.SetTarget(getargp) calcargp := obj.Appendp(getargp, newprog) calcargp.As = AADDI @@ -647,7 +647,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { testargp.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_X12} testargp.Reg = REG_X13 testargp.To.Type = obj.TYPE_BRANCH - testargp.Pcond = endadj + testargp.To.SetTarget(endadj) adjargp := obj.Appendp(testargp, newprog) adjargp.As = AADDI @@ -665,7 +665,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { godone.As = AJAL godone.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} godone.To.Type = obj.TYPE_BRANCH - godone.Pcond = endadj + godone.To.SetTarget(endadj) } // Update stack-based offsets. @@ -890,27 +890,27 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { if p.To.Type != obj.TYPE_BRANCH { panic("assemble: instruction with branch-like opcode lacks destination") } - offset := p.Pcond.Pc - p.Pc + offset := p.To.Target().Pc - p.Pc if offset < -4096 || 4096 <= offset { // Branch is long. Replace it with a jump. jmp := obj.Appendp(p, newprog) jmp.As = AJAL jmp.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} jmp.To = obj.Addr{Type: obj.TYPE_BRANCH} - jmp.Pcond = p.Pcond + jmp.To.SetTarget(p.To.Target()) p.As = InvertBranch(p.As) - p.Pcond = jmp.Link + p.To.SetTarget(jmp.Link) // We may have made previous branches too long, // so recheck them. rescan = true } case AJAL: - if p.Pcond == nil { + if p.To.Target() == nil { panic("intersymbol jumps should be expressed as AUIPC+JALR") } - offset := p.Pcond.Pc - p.Pc + offset := p.To.Target().Pc - p.Pc if offset < -(1<<20) || (1<<20) <= offset { // Replace with 2-instruction sequence. This assumes // that TMP is not live across J instructions, since @@ -925,6 +925,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { // fixed up in the next loop. p.As = AAUIPC p.From = obj.Addr{Type: obj.TYPE_BRANCH, Sym: p.From.Sym} + p.From.SetTarget(p.To.Target()) p.Reg = 0 p.To = obj.Addr{Type: obj.TYPE_REG, Reg: REG_TMP} @@ -946,16 +947,16 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { case ABEQ, ABEQZ, ABGE, ABGEU, ABGEZ, ABGT, ABGTU, ABGTZ, ABLE, ABLEU, ABLEZ, ABLT, ABLTU, ABLTZ, ABNE, ABNEZ, AJAL: switch p.To.Type { case obj.TYPE_BRANCH: - p.To.Type, p.To.Offset = obj.TYPE_CONST, p.Pcond.Pc-p.Pc + p.To.Type, p.To.Offset = obj.TYPE_CONST, p.To.Target().Pc-p.Pc case obj.TYPE_MEM: panic("unhandled type") } case AAUIPC: if p.From.Type == obj.TYPE_BRANCH { - low, high, err := Split32BitImmediate(p.Pcond.Pc - p.Pc) + low, high, err := Split32BitImmediate(p.From.Target().Pc - p.Pc) if err != nil { - ctxt.Diag("%v: jump displacement %d too large", p, p.Pcond.Pc-p.Pc) + ctxt.Diag("%v: jump displacement %d too large", p, p.To.Target().Pc-p.Pc) } p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: high, Sym: cursym} p.Link.From.Offset = low @@ -1098,7 +1099,7 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, cursym *obj.LSym, newprog obj.ProgA p.To.Sym = ctxt.Lookup("runtime.morestack") } if to_more != nil { - to_more.Pcond = p + to_more.To.SetTarget(p) } p = jalrToSym(ctxt, p, newprog, REG_X5) @@ -1107,12 +1108,12 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, cursym *obj.LSym, newprog obj.ProgA p.As = AJAL p.To = obj.Addr{Type: obj.TYPE_BRANCH} p.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} - p.Pcond = cursym.Func.Text.Link + p.To.SetTarget(cursym.Func.Text.Link) // placeholder for to_done's jump target p = obj.Appendp(p, newprog) p.As = obj.ANOP // zero-width place holder - to_done.Pcond = p + to_done.To.SetTarget(p) return p } diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go index 29182ea805..68f01f1c5d 100644 --- a/src/cmd/internal/obj/s390x/asmz.go +++ b/src/cmd/internal/obj/s390x/asmz.go @@ -3001,8 +3001,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 11: // br/bl v := int32(0) - if p.Pcond != nil { - v = int32((p.Pcond.Pc - p.Pc) >> 1) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - p.Pc) >> 1) } if p.As == ABR && p.To.Sym == nil && int32(int16(v)) == v { @@ -3122,8 +3122,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 16: // conditional branch v := int32(0) - if p.Pcond != nil { - v = int32((p.Pcond.Pc - p.Pc) >> 1) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - p.Pc) >> 1) } mask := uint32(c.branchMask(p)) if p.To.Sym == nil && int32(int16(v)) == v { @@ -3440,7 +3440,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 41: // branch on count r1 := p.From.Reg - ri2 := (p.Pcond.Pc - p.Pc) >> 1 + ri2 := (p.To.Target().Pc - p.Pc) >> 1 if int64(int16(ri2)) != ri2 { c.ctxt.Diag("branch target too far away") } @@ -3885,8 +3885,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 89: // compare and branch reg reg var v int32 - if p.Pcond != nil { - v = int32((p.Pcond.Pc - p.Pc) >> 1) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - p.Pc) >> 1) } // Some instructions take a mask as the first argument. @@ -3930,8 +3930,8 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { case 90: // compare and branch reg $constant var v int32 - if p.Pcond != nil { - v = int32((p.Pcond.Pc - p.Pc) >> 1) + if p.To.Target() != nil { + v = int32((p.To.Target().Pc - p.Pc) >> 1) } // Some instructions take a mask as the first argument. diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go index ef6335d849..625bb0f7b4 100644 --- a/src/cmd/internal/obj/s390x/objz.go +++ b/src/cmd/internal/obj/s390x/objz.go @@ -454,8 +454,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { q = obj.Appendp(q, c.newprog) q.As = obj.ANOP - p1.Pcond = q - p2.Pcond = q + p1.To.SetTarget(q) + p2.To.SetTarget(q) } case obj.ARET: @@ -679,14 +679,14 @@ func (c *ctxtz) stacksplitPost(p *obj.Prog, pPre *obj.Prog, pPreempt *obj.Prog, // MOVD LR, R5 p = obj.Appendp(pcdata, c.newprog) - pPre.Pcond = p + pPre.To.SetTarget(p) p.As = AMOVD p.From.Type = obj.TYPE_REG p.From.Reg = REG_LR p.To.Type = obj.TYPE_REG p.To.Reg = REG_R5 if pPreempt != nil { - pPreempt.Pcond = p + pPreempt.To.SetTarget(p) } // BL runtime.morestack(SB) @@ -709,7 +709,7 @@ func (c *ctxtz) stacksplitPost(p *obj.Prog, pPre *obj.Prog, pPreempt *obj.Prog, p.As = ABR p.To.Type = obj.TYPE_BRANCH - p.Pcond = c.cursym.Func.Text.Link + p.To.SetTarget(c.cursym.Func.Text.Link) return p } diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index d020026445..a30ccf0564 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -251,10 +251,8 @@ func WriteDconv(w io.Writer, p *Prog, a *Addr) { case TYPE_BRANCH: if a.Sym != nil { fmt.Fprintf(w, "%s(SB)", a.Sym.Name) - } else if p != nil && p.Pcond != nil { - fmt.Fprint(w, p.Pcond.Pc) - } else if a.Val != nil { - fmt.Fprint(w, a.Val.(*Prog).Pc) + } else if a.Target() != nil { + fmt.Fprint(w, a.Target().Pc) } else { fmt.Fprintf(w, "%d(PC)", a.Offset) } diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index a530636373..fb99c620ad 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -1855,7 +1855,7 @@ func spadjop(ctxt *obj.Link, l, q obj.As) obj.As { // no standalone or macro-fused jump will straddle or end on a 32 byte boundary // by inserting NOPs before the jumps func isJump(p *obj.Prog) bool { - return p.Pcond != nil || p.As == obj.AJMP || p.As == obj.ACALL || + return p.To.Target() != nil || p.As == obj.AJMP || p.As == obj.ACALL || p.As == obj.ARET || p.As == obj.ADUFFCOPY || p.As == obj.ADUFFZERO } @@ -1867,7 +1867,7 @@ func lookForJCC(p *obj.Prog) *obj.Prog { for q = p.Link; q != nil && (q.As == obj.APCDATA || q.As == obj.AFUNCDATA || q.As == obj.ANOP); q = q.Link { } - if q == nil || q.Pcond == nil || p.As == obj.AJMP || p.As == obj.ACALL { + if q == nil || q.To.Target() == nil || p.As == obj.AJMP || p.As == obj.ACALL { return nil } @@ -2051,8 +2051,8 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { } for p := s.Func.Text; p != nil; p = p.Link { - if p.To.Type == obj.TYPE_BRANCH && p.Pcond == nil { - p.Pcond = p + if p.To.Type == obj.TYPE_BRANCH && p.To.Target() == nil { + p.To.SetTarget(p) } if p.As == AADJSP { p.To.Type = obj.TYPE_REG @@ -2088,7 +2088,7 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { for p := s.Func.Text; p != nil; p = p.Link { count++ p.Back = branchShort // use short branches first time through - if q := p.Pcond; q != nil && (q.Back&branchShort != 0) { + if q := p.To.Target(); q != nil && (q.Back&branchShort != 0) { p.Back |= branchBackwards q.Back |= branchLoopHead } @@ -4886,7 +4886,7 @@ func (ab *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { // TODO: Check in input, preserve in brchain. // Fill in backward jump now. - q = p.Pcond + q = p.To.Target() if q == nil { ctxt.Diag("jmp/branch/loop without target") diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index 016c247ff5..18a6afcd77 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -765,7 +765,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { } // Set jne branch target. - jne.Pcond = p + jne.To.SetTarget(p) // CMPQ panic_argp(BX), DI p = obj.Appendp(p, newprog) @@ -783,7 +783,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = AJNE p.To.Type = obj.TYPE_BRANCH - p.Pcond = end + p.To.SetTarget(end) // MOVQ SP, panic_argp(BX) p = obj.Appendp(p, newprog) @@ -801,7 +801,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = obj.Appendp(p, newprog) p.As = obj.AJMP p.To.Type = obj.TYPE_BRANCH - p.Pcond = end + p.To.SetTarget(end) // Reset p for following code. p = end @@ -1144,12 +1144,12 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, newprog obj.ProgA jmp := obj.Appendp(pcdata, newprog) jmp.As = obj.AJMP jmp.To.Type = obj.TYPE_BRANCH - jmp.Pcond = cursym.Func.Text.Link + jmp.To.SetTarget(cursym.Func.Text.Link) jmp.Spadj = +framesize - jls.Pcond = call + jls.To.SetTarget(call) if q1 != nil { - q1.Pcond = call + q1.To.SetTarget(call) } return end -- GitLab From f0c7e3e9463069f60b3d31696860f6fb75aa3e87 Mon Sep 17 00:00:00 2001 From: David Finkel Date: Sat, 25 Apr 2020 13:32:06 -0400 Subject: [PATCH 0386/1792] cmd/compile: adjust some AMD64 rewrite rules to use typed aux fields Remove an extra int32-representable check when deciding to use an int32 constant as an immediate value. Comment out a broken optimization that relies on MaxUint32 being representable by a signed int32. It never triggers and when fixed, the signedness of the auxint prevents other optimization passes from handling it properly, thus causing segfaults in the runtime. Remove a couple offset representable in 32-bits checks on 32-bit aux vals. toolstash-check clean Change-Id: I148b53403fde523c90d692cb90e412460664b439 Reviewed-on: https://go-review.googlesource.com/c/go/+/230458 Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/AMD64.rules | 835 ++-- src/cmd/compile/internal/ssa/rewriteAMD64.go | 4227 +++++++++--------- 2 files changed, 2515 insertions(+), 2547 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/AMD64.rules b/src/cmd/compile/internal/ssa/gen/AMD64.rules index 5111ef79d3..8898fe55eb 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64.rules +++ b/src/cmd/compile/internal/ssa/gen/AMD64.rules @@ -436,69 +436,69 @@ // Absorb InvertFlags (CMOVQ(EQ|NE|LT|GT|LE|GE|HI|CS|CC|LS) x y (InvertFlags cond)) - -> (CMOVQ(EQ|NE|GT|LT|GE|LE|CS|HI|LS|CC) x y cond) + => (CMOVQ(EQ|NE|GT|LT|GE|LE|CS|HI|LS|CC) x y cond) (CMOVL(EQ|NE|LT|GT|LE|GE|HI|CS|CC|LS) x y (InvertFlags cond)) - -> (CMOVL(EQ|NE|GT|LT|GE|LE|CS|HI|LS|CC) x y cond) + => (CMOVL(EQ|NE|GT|LT|GE|LE|CS|HI|LS|CC) x y cond) (CMOVW(EQ|NE|LT|GT|LE|GE|HI|CS|CC|LS) x y (InvertFlags cond)) - -> (CMOVW(EQ|NE|GT|LT|GE|LE|CS|HI|LS|CC) x y cond) + => (CMOVW(EQ|NE|GT|LT|GE|LE|CS|HI|LS|CC) x y cond) // Absorb constants generated during lower -(CMOV(QEQ|QLE|QGE|QCC|QLS|LEQ|LLE|LGE|LCC|LLS|WEQ|WLE|WGE|WCC|WLS) _ x (FlagEQ)) -> x -(CMOV(QNE|QLT|QGT|QCS|QHI|LNE|LLT|LGT|LCS|LHI|WNE|WLT|WGT|WCS|WHI) y _ (FlagEQ)) -> y -(CMOV(QNE|QGT|QGE|QHI|QCC|LNE|LGT|LGE|LHI|LCC|WNE|WGT|WGE|WHI|WCC) _ x (FlagGT_UGT)) -> x -(CMOV(QEQ|QLE|QLT|QLS|QCS|LEQ|LLE|LLT|LLS|LCS|WEQ|WLE|WLT|WLS|WCS) y _ (FlagGT_UGT)) -> y -(CMOV(QNE|QGT|QGE|QLS|QCS|LNE|LGT|LGE|LLS|LCS|WNE|WGT|WGE|WLS|WCS) _ x (FlagGT_ULT)) -> x -(CMOV(QEQ|QLE|QLT|QHI|QCC|LEQ|LLE|LLT|LHI|LCC|WEQ|WLE|WLT|WHI|WCC) y _ (FlagGT_ULT)) -> y -(CMOV(QNE|QLT|QLE|QCS|QLS|LNE|LLT|LLE|LCS|LLS|WNE|WLT|WLE|WCS|WLS) _ x (FlagLT_ULT)) -> x -(CMOV(QEQ|QGT|QGE|QHI|QCC|LEQ|LGT|LGE|LHI|LCC|WEQ|WGT|WGE|WHI|WCC) y _ (FlagLT_ULT)) -> y -(CMOV(QNE|QLT|QLE|QHI|QCC|LNE|LLT|LLE|LHI|LCC|WNE|WLT|WLE|WHI|WCC) _ x (FlagLT_UGT)) -> x -(CMOV(QEQ|QGT|QGE|QCS|QLS|LEQ|LGT|LGE|LCS|LLS|WEQ|WGT|WGE|WCS|WLS) y _ (FlagLT_UGT)) -> y +(CMOV(QEQ|QLE|QGE|QCC|QLS|LEQ|LLE|LGE|LCC|LLS|WEQ|WLE|WGE|WCC|WLS) _ x (FlagEQ)) => x +(CMOV(QNE|QLT|QGT|QCS|QHI|LNE|LLT|LGT|LCS|LHI|WNE|WLT|WGT|WCS|WHI) y _ (FlagEQ)) => y +(CMOV(QNE|QGT|QGE|QHI|QCC|LNE|LGT|LGE|LHI|LCC|WNE|WGT|WGE|WHI|WCC) _ x (FlagGT_UGT)) => x +(CMOV(QEQ|QLE|QLT|QLS|QCS|LEQ|LLE|LLT|LLS|LCS|WEQ|WLE|WLT|WLS|WCS) y _ (FlagGT_UGT)) => y +(CMOV(QNE|QGT|QGE|QLS|QCS|LNE|LGT|LGE|LLS|LCS|WNE|WGT|WGE|WLS|WCS) _ x (FlagGT_ULT)) => x +(CMOV(QEQ|QLE|QLT|QHI|QCC|LEQ|LLE|LLT|LHI|LCC|WEQ|WLE|WLT|WHI|WCC) y _ (FlagGT_ULT)) => y +(CMOV(QNE|QLT|QLE|QCS|QLS|LNE|LLT|LLE|LCS|LLS|WNE|WLT|WLE|WCS|WLS) _ x (FlagLT_ULT)) => x +(CMOV(QEQ|QGT|QGE|QHI|QCC|LEQ|LGT|LGE|LHI|LCC|WEQ|WGT|WGE|WHI|WCC) y _ (FlagLT_ULT)) => y +(CMOV(QNE|QLT|QLE|QHI|QCC|LNE|LLT|LLE|LHI|LCC|WNE|WLT|WLE|WHI|WCC) _ x (FlagLT_UGT)) => x +(CMOV(QEQ|QGT|QGE|QCS|QLS|LEQ|LGT|LGE|LCS|LLS|WEQ|WGT|WGE|WCS|WLS) y _ (FlagLT_UGT)) => y // Miscellaneous -(IsNonNil p) -> (SETNE (TESTQ p p)) -(IsInBounds idx len) -> (SETB (CMPQ idx len)) -(IsSliceInBounds idx len) -> (SETBE (CMPQ idx len)) -(NilCheck ...) -> (LoweredNilCheck ...) -(GetG ...) -> (LoweredGetG ...) -(GetClosurePtr ...) -> (LoweredGetClosurePtr ...) -(GetCallerPC ...) -> (LoweredGetCallerPC ...) -(GetCallerSP ...) -> (LoweredGetCallerSP ...) - -(HasCPUFeature {s}) -> (SETNE (CMPQconst [0] (LoweredHasCPUFeature {s}))) +(IsNonNil p) => (SETNE (TESTQ p p)) +(IsInBounds idx len) => (SETB (CMPQ idx len)) +(IsSliceInBounds idx len) => (SETBE (CMPQ idx len)) +(NilCheck ...) => (LoweredNilCheck ...) +(GetG ...) => (LoweredGetG ...) +(GetClosurePtr ...) => (LoweredGetClosurePtr ...) +(GetCallerPC ...) => (LoweredGetCallerPC ...) +(GetCallerSP ...) => (LoweredGetCallerSP ...) + +(HasCPUFeature {s}) => (SETNE (CMPQconst [0] (LoweredHasCPUFeature {s}))) (Addr ...) -> (LEAQ ...) -(LocalAddr {sym} base _) -> (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) -(MOVBstore [off] {sym} ptr y:(SETG x) mem) && y.Uses == 1 -> (SETGstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr y:(SETGE x) mem) && y.Uses == 1 -> (SETGEstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr y:(SETEQ x) mem) && y.Uses == 1 -> (SETEQstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr y:(SETNE x) mem) && y.Uses == 1 -> (SETNEstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr y:(SETB x) mem) && y.Uses == 1 -> (SETBstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr y:(SETBE x) mem) && y.Uses == 1 -> (SETBEstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr y:(SETA x) mem) && y.Uses == 1 -> (SETAstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr y:(SETAE x) mem) && y.Uses == 1 -> (SETAEstore [off] {sym} ptr x mem) +(LocalAddr {sym} base _) => (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) +(MOVBstore [off] {sym} ptr y:(SETG x) mem) && y.Uses == 1 => (SETGstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr y:(SETGE x) mem) && y.Uses == 1 => (SETGEstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr y:(SETEQ x) mem) && y.Uses == 1 => (SETEQstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr y:(SETNE x) mem) && y.Uses == 1 => (SETNEstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr y:(SETB x) mem) && y.Uses == 1 => (SETBstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr y:(SETBE x) mem) && y.Uses == 1 => (SETBEstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr y:(SETA x) mem) && y.Uses == 1 => (SETAstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr y:(SETAE x) mem) && y.Uses == 1 => (SETAEstore [off] {sym} ptr x mem) // block rewrites -(If (SETL cmp) yes no) -> (LT cmp yes no) -(If (SETLE cmp) yes no) -> (LE cmp yes no) -(If (SETG cmp) yes no) -> (GT cmp yes no) -(If (SETGE cmp) yes no) -> (GE cmp yes no) -(If (SETEQ cmp) yes no) -> (EQ cmp yes no) -(If (SETNE cmp) yes no) -> (NE cmp yes no) -(If (SETB cmp) yes no) -> (ULT cmp yes no) -(If (SETBE cmp) yes no) -> (ULE cmp yes no) -(If (SETA cmp) yes no) -> (UGT cmp yes no) -(If (SETAE cmp) yes no) -> (UGE cmp yes no) -(If (SETO cmp) yes no) -> (OS cmp yes no) +(If (SETL cmp) yes no) => (LT cmp yes no) +(If (SETLE cmp) yes no) => (LE cmp yes no) +(If (SETG cmp) yes no) => (GT cmp yes no) +(If (SETGE cmp) yes no) => (GE cmp yes no) +(If (SETEQ cmp) yes no) => (EQ cmp yes no) +(If (SETNE cmp) yes no) => (NE cmp yes no) +(If (SETB cmp) yes no) => (ULT cmp yes no) +(If (SETBE cmp) yes no) => (ULE cmp yes no) +(If (SETA cmp) yes no) => (UGT cmp yes no) +(If (SETAE cmp) yes no) => (UGE cmp yes no) +(If (SETO cmp) yes no) => (OS cmp yes no) // Special case for floating point - LF/LEF not generated -(If (SETGF cmp) yes no) -> (UGT cmp yes no) -(If (SETGEF cmp) yes no) -> (UGE cmp yes no) -(If (SETEQF cmp) yes no) -> (EQF cmp yes no) -(If (SETNEF cmp) yes no) -> (NEF cmp yes no) +(If (SETGF cmp) yes no) => (UGT cmp yes no) +(If (SETGEF cmp) yes no) => (UGE cmp yes no) +(If (SETEQF cmp) yes no) => (EQF cmp yes no) +(If (SETNEF cmp) yes no) => (NEF cmp yes no) -(If cond yes no) -> (NE (TESTB cond cond) yes no) +(If cond yes no) => (NE (TESTB cond cond) yes no) // Atomic loads. Other than preserving their ordering with respect to other loads, nothing special here. (AtomicLoad8 ...) -> (MOVBatomicload ...) @@ -508,22 +508,22 @@ // Atomic stores. We use XCHG to prevent the hardware reordering a subsequent load. // TODO: most runtime uses of atomic stores don't need that property. Use normal stores for those? -(AtomicStore8 ptr val mem) -> (Select1 (XCHGB val ptr mem)) -(AtomicStore32 ptr val mem) -> (Select1 (XCHGL val ptr mem)) -(AtomicStore64 ptr val mem) -> (Select1 (XCHGQ val ptr mem)) -(AtomicStorePtrNoWB ptr val mem) -> (Select1 (XCHGQ val ptr mem)) +(AtomicStore8 ptr val mem) => (Select1 (XCHGB val ptr mem)) +(AtomicStore32 ptr val mem) => (Select1 (XCHGL val ptr mem)) +(AtomicStore64 ptr val mem) => (Select1 (XCHGQ val ptr mem)) +(AtomicStorePtrNoWB ptr val mem) => (Select1 (XCHGQ val ptr mem)) // Atomic exchanges. -(AtomicExchange32 ptr val mem) -> (XCHGL val ptr mem) -(AtomicExchange64 ptr val mem) -> (XCHGQ val ptr mem) +(AtomicExchange32 ptr val mem) => (XCHGL val ptr mem) +(AtomicExchange64 ptr val mem) => (XCHGQ val ptr mem) // Atomic adds. -(AtomicAdd32 ptr val mem) -> (AddTupleFirst32 val (XADDLlock val ptr mem)) -(AtomicAdd64 ptr val mem) -> (AddTupleFirst64 val (XADDQlock val ptr mem)) -(Select0 (AddTupleFirst32 val tuple)) -> (ADDL val (Select0 tuple)) -(Select1 (AddTupleFirst32 _ tuple)) -> (Select1 tuple) -(Select0 (AddTupleFirst64 val tuple)) -> (ADDQ val (Select0 tuple)) -(Select1 (AddTupleFirst64 _ tuple)) -> (Select1 tuple) +(AtomicAdd32 ptr val mem) => (AddTupleFirst32 val (XADDLlock val ptr mem)) +(AtomicAdd64 ptr val mem) => (AddTupleFirst64 val (XADDQlock val ptr mem)) +(Select0 (AddTupleFirst32 val tuple)) => (ADDL val (Select0 tuple)) +(Select1 (AddTupleFirst32 _ tuple)) => (Select1 tuple) +(Select0 (AddTupleFirst64 val tuple)) => (ADDQ val (Select0 tuple)) +(Select1 (AddTupleFirst64 _ tuple)) => (Select1 tuple) // Atomic compare and swap. (AtomicCompareAndSwap32 ...) -> (CMPXCHGLlock ...) @@ -536,9 +536,9 @@ // Write barrier. (WB ...) -> (LoweredWB ...) -(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) -(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) -(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 => (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 => (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 => (LoweredPanicBoundsC [kind] x y mem) // *************************** // Above: lowering rules @@ -547,23 +547,23 @@ // TODO: Should the optimizations be a separate pass? // Fold boolean tests into blocks -(NE (TESTB (SETL cmp) (SETL cmp)) yes no) -> (LT cmp yes no) -(NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) -> (LE cmp yes no) -(NE (TESTB (SETG cmp) (SETG cmp)) yes no) -> (GT cmp yes no) -(NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) -> (GE cmp yes no) -(NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) -> (EQ cmp yes no) -(NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) -> (NE cmp yes no) -(NE (TESTB (SETB cmp) (SETB cmp)) yes no) -> (ULT cmp yes no) -(NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) -> (ULE cmp yes no) -(NE (TESTB (SETA cmp) (SETA cmp)) yes no) -> (UGT cmp yes no) -(NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) -> (UGE cmp yes no) -(NE (TESTB (SETO cmp) (SETO cmp)) yes no) -> (OS cmp yes no) +(NE (TESTB (SETL cmp) (SETL cmp)) yes no) => (LT cmp yes no) +(NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) => (LE cmp yes no) +(NE (TESTB (SETG cmp) (SETG cmp)) yes no) => (GT cmp yes no) +(NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) => (GE cmp yes no) +(NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) => (EQ cmp yes no) +(NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) => (NE cmp yes no) +(NE (TESTB (SETB cmp) (SETB cmp)) yes no) => (ULT cmp yes no) +(NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) => (ULE cmp yes no) +(NE (TESTB (SETA cmp) (SETA cmp)) yes no) => (UGT cmp yes no) +(NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) => (UGE cmp yes no) +(NE (TESTB (SETO cmp) (SETO cmp)) yes no) => (OS cmp yes no) // Unsigned comparisons to 0/1 -(ULT (TEST(Q|L|W|B) x x) yes no) -> (First no yes) -(UGE (TEST(Q|L|W|B) x x) yes no) -> (First yes no) -(SETB (TEST(Q|L|W|B) x x)) -> (ConstBool [0]) -(SETAE (TEST(Q|L|W|B) x x)) -> (ConstBool [1]) +(ULT (TEST(Q|L|W|B) x x) yes no) => (First no yes) +(UGE (TEST(Q|L|W|B) x x) yes no) => (First yes no) +(SETB (TEST(Q|L|W|B) x x)) => (ConstBool [false]) +(SETAE (TEST(Q|L|W|B) x x)) => (ConstBool [true]) // x & 1 != 0 -> x & 1 (SETNE (TEST(B|W)const [1] x)) => (AND(L|L)const [1] x) @@ -574,75 +574,75 @@ // into tests for carry flags. // ULT and SETB check the carry flag; they are identical to CS and SETCS. Same, mutatis // mutandis, for UGE and SETAE, and CC and SETCC. -((NE|EQ) (TESTL (SHLL (MOVLconst [1]) x) y)) -> ((ULT|UGE) (BTL x y)) -((NE|EQ) (TESTQ (SHLQ (MOVQconst [1]) x) y)) -> ((ULT|UGE) (BTQ x y)) -((NE|EQ) (TESTLconst [c] x)) && isUint32PowerOfTwo(c) - -> ((ULT|UGE) (BTLconst [log2uint32(c)] x)) -((NE|EQ) (TESTQconst [c] x)) && isUint64PowerOfTwo(c) - -> ((ULT|UGE) (BTQconst [log2(c)] x)) +((NE|EQ) (TESTL (SHLL (MOVLconst [1]) x) y)) => ((ULT|UGE) (BTL x y)) +((NE|EQ) (TESTQ (SHLQ (MOVQconst [1]) x) y)) => ((ULT|UGE) (BTQ x y)) +((NE|EQ) (TESTLconst [c] x)) && isUint32PowerOfTwo(int64(c)) + => ((ULT|UGE) (BTLconst [int8(log32(c))] x)) +((NE|EQ) (TESTQconst [c] x)) && isUint64PowerOfTwo(int64(c)) + => ((ULT|UGE) (BTQconst [int8(log32(c))] x)) ((NE|EQ) (TESTQ (MOVQconst [c]) x)) && isUint64PowerOfTwo(c) - -> ((ULT|UGE) (BTQconst [log2(c)] x)) -(SET(NE|EQ) (TESTL (SHLL (MOVLconst [1]) x) y)) -> (SET(B|AE) (BTL x y)) -(SET(NE|EQ) (TESTQ (SHLQ (MOVQconst [1]) x) y)) -> (SET(B|AE) (BTQ x y)) -(SET(NE|EQ) (TESTLconst [c] x)) && isUint32PowerOfTwo(c) - -> (SET(B|AE) (BTLconst [log2uint32(c)] x)) -(SET(NE|EQ) (TESTQconst [c] x)) && isUint64PowerOfTwo(c) - -> (SET(B|AE) (BTQconst [log2(c)] x)) + => ((ULT|UGE) (BTQconst [int8(log2(c))] x)) +(SET(NE|EQ) (TESTL (SHLL (MOVLconst [1]) x) y)) => (SET(B|AE) (BTL x y)) +(SET(NE|EQ) (TESTQ (SHLQ (MOVQconst [1]) x) y)) => (SET(B|AE) (BTQ x y)) +(SET(NE|EQ) (TESTLconst [c] x)) && isUint32PowerOfTwo(int64(c)) + => (SET(B|AE) (BTLconst [int8(log32(c))] x)) +(SET(NE|EQ) (TESTQconst [c] x)) && isUint64PowerOfTwo(int64(c)) + => (SET(B|AE) (BTQconst [int8(log32(c))] x)) (SET(NE|EQ) (TESTQ (MOVQconst [c]) x)) && isUint64PowerOfTwo(c) - -> (SET(B|AE) (BTQconst [log2(c)] x)) + => (SET(B|AE) (BTQconst [int8(log2(c))] x)) // SET..store variant (SET(NE|EQ)store [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) - -> (SET(B|AE)store [off] {sym} ptr (BTL x y) mem) + => (SET(B|AE)store [off] {sym} ptr (BTL x y) mem) (SET(NE|EQ)store [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem) - -> (SET(B|AE)store [off] {sym} ptr (BTQ x y) mem) -(SET(NE|EQ)store [off] {sym} ptr (TESTLconst [c] x) mem) && isUint32PowerOfTwo(c) - -> (SET(B|AE)store [off] {sym} ptr (BTLconst [log2uint32(c)] x) mem) -(SET(NE|EQ)store [off] {sym} ptr (TESTQconst [c] x) mem) && isUint64PowerOfTwo(c) - -> (SET(B|AE)store [off] {sym} ptr (BTQconst [log2(c)] x) mem) + => (SET(B|AE)store [off] {sym} ptr (BTQ x y) mem) +(SET(NE|EQ)store [off] {sym} ptr (TESTLconst [c] x) mem) && isUint32PowerOfTwo(int64(c)) + => (SET(B|AE)store [off] {sym} ptr (BTLconst [int8(log32(c))] x) mem) +(SET(NE|EQ)store [off] {sym} ptr (TESTQconst [c] x) mem) && isUint64PowerOfTwo(int64(c)) + => (SET(B|AE)store [off] {sym} ptr (BTQconst [int8(log32(c))] x) mem) (SET(NE|EQ)store [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem) && isUint64PowerOfTwo(c) - -> (SET(B|AE)store [off] {sym} ptr (BTQconst [log2(c)] x) mem) + => (SET(B|AE)store [off] {sym} ptr (BTQconst [int8(log2(c))] x) mem) // Handle bit-testing in the form (a>>b)&1 != 0 by building the above rules // and further combining shifts. -(BT(Q|L)const [c] (SHRQconst [d] x)) && (c+d)<64 -> (BTQconst [c+d] x) -(BT(Q|L)const [c] (SHLQconst [d] x)) && c>d -> (BT(Q|L)const [c-d] x) -(BT(Q|L)const [0] s:(SHRQ x y)) -> (BTQ y x) -(BTLconst [c] (SHRLconst [d] x)) && (c+d)<32 -> (BTLconst [c+d] x) -(BTLconst [c] (SHLLconst [d] x)) && c>d -> (BTLconst [c-d] x) -(BTLconst [0] s:(SHRL x y)) -> (BTL y x) +(BT(Q|L)const [c] (SHRQconst [d] x)) && (c+d)<64 => (BTQconst [c+d] x) +(BT(Q|L)const [c] (SHLQconst [d] x)) && c>d => (BT(Q|L)const [c-d] x) +(BT(Q|L)const [0] s:(SHRQ x y)) => (BTQ y x) +(BTLconst [c] (SHRLconst [d] x)) && (c+d)<32 => (BTLconst [c+d] x) +(BTLconst [c] (SHLLconst [d] x)) && c>d => (BTLconst [c-d] x) +(BTLconst [0] s:(SHRL x y)) => (BTL y x) // Rewrite a & 1 != 1 into a & 1 == 0. // Among other things, this lets us turn (a>>b)&1 != 1 into a bit test. -(SET(NE|EQ) (CMPLconst [1] s:(ANDLconst [1] _))) -> (SET(EQ|NE) (CMPLconst [0] s)) -(SET(NE|EQ)store [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem) -> (SET(EQ|NE)store [off] {sym} ptr (CMPLconst [0] s) mem) -(SET(NE|EQ) (CMPQconst [1] s:(ANDQconst [1] _))) -> (SET(EQ|NE) (CMPQconst [0] s)) -(SET(NE|EQ)store [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem) -> (SET(EQ|NE)store [off] {sym} ptr (CMPQconst [0] s) mem) +(SET(NE|EQ) (CMPLconst [1] s:(ANDLconst [1] _))) => (SET(EQ|NE) (CMPLconst [0] s)) +(SET(NE|EQ)store [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem) => (SET(EQ|NE)store [off] {sym} ptr (CMPLconst [0] s) mem) +(SET(NE|EQ) (CMPQconst [1] s:(ANDQconst [1] _))) => (SET(EQ|NE) (CMPQconst [0] s)) +(SET(NE|EQ)store [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem) => (SET(EQ|NE)store [off] {sym} ptr (CMPQconst [0] s) mem) // Recognize bit setting (a |= 1< (BTS(Q|L) x y) -(XOR(Q|L) (SHL(Q|L) (MOV(Q|L)const [1]) y) x) -> (BTC(Q|L) x y) +(OR(Q|L) (SHL(Q|L) (MOV(Q|L)const [1]) y) x) => (BTS(Q|L) x y) +(XOR(Q|L) (SHL(Q|L) (MOV(Q|L)const [1]) y) x) => (BTC(Q|L) x y) // Convert ORconst into BTS, if the code gets smaller, with boundary being // (ORL $40,AX is 3 bytes, ORL $80,AX is 6 bytes). -((ORQ|XORQ)const [c] x) && isUint64PowerOfTwo(c) && uint64(c) >= 128 - -> (BT(S|C)Qconst [log2(c)] x) -((ORL|XORL)const [c] x) && isUint32PowerOfTwo(c) && uint64(c) >= 128 - -> (BT(S|C)Lconst [log2uint32(c)] x) +((ORQ|XORQ)const [c] x) && isUint64PowerOfTwo(int64(c)) && uint64(c) >= 128 + => (BT(S|C)Qconst [int8(log32(c))] x) +((ORL|XORL)const [c] x) && isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128 + => (BT(S|C)Lconst [int8(log32(c))] x) ((ORQ|XORQ) (MOVQconst [c]) x) && isUint64PowerOfTwo(c) && uint64(c) >= 128 - -> (BT(S|C)Qconst [log2(c)] x) -((ORL|XORL) (MOVLconst [c]) x) && isUint32PowerOfTwo(c) && uint64(c) >= 128 - -> (BT(S|C)Lconst [log2uint32(c)] x) + => (BT(S|C)Qconst [int8(log2(c))] x) +((ORL|XORL) (MOVLconst [c]) x) && isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128 + => (BT(S|C)Lconst [int8(log32(c))] x) // Recognize bit clearing: a &^= 1< (BTR(Q|L) x y) -(ANDQconst [c] x) && isUint64PowerOfTwo(^c) && uint64(^c) >= 128 - -> (BTRQconst [log2(^c)] x) -(ANDLconst [c] x) && isUint32PowerOfTwo(^c) && uint64(^c) >= 128 - -> (BTRLconst [log2uint32(^c)] x) +(AND(Q|L) (NOT(Q|L) (SHL(Q|L) (MOV(Q|L)const [1]) y)) x) => (BTR(Q|L) x y) +(ANDQconst [c] x) && isUint64PowerOfTwo(int64(^c)) && uint64(^c) >= 128 + => (BTRQconst [int8(log32(^c))] x) +(ANDLconst [c] x) && isUint32PowerOfTwo(int64(^c)) && uint64(^c) >= 128 + => (BTRLconst [int8(log32(^c))] x) (ANDQ (MOVQconst [c]) x) && isUint64PowerOfTwo(^c) && uint64(^c) >= 128 - -> (BTRQconst [log2(^c)] x) -(ANDL (MOVLconst [c]) x) && isUint32PowerOfTwo(^c) && uint64(^c) >= 128 - -> (BTRLconst [log2uint32(^c)] x) + => (BTRQconst [int8(log2(^c))] x) +(ANDL (MOVLconst [c]) x) && isUint32PowerOfTwo(int64(^c)) && uint64(^c) >= 128 + => (BTRLconst [int8(log32(^c))] x) // Special-case bit patterns on first/last bit. // generic.rules changes ANDs of high-part/low-part masks into a couple of shifts, @@ -656,84 +656,84 @@ // Special case resetting first/last bit (SHL(L|Q)const [1] (SHR(L|Q)const [1] x)) - -> (BTR(L|Q)const [0] x) + => (BTR(L|Q)const [0] x) (SHRLconst [1] (SHLLconst [1] x)) - -> (BTRLconst [31] x) + => (BTRLconst [31] x) (SHRQconst [1] (SHLQconst [1] x)) - -> (BTRQconst [63] x) + => (BTRQconst [63] x) // Special case testing first/last bit (with double-shift generated by generic.rules) ((SETNE|SETEQ|NE|EQ) (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) && z1==z2 - -> ((SETB|SETAE|ULT|UGE) (BTQconst [63] x)) + => ((SETB|SETAE|ULT|UGE) (BTQconst [63] x)) ((SETNE|SETEQ|NE|EQ) (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) && z1==z2 - -> ((SETB|SETAE|ULT|UGE) (BTQconst [31] x)) + => ((SETB|SETAE|ULT|UGE) (BTQconst [31] x)) (SET(NE|EQ)store [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem) && z1==z2 - -> (SET(B|AE)store [off] {sym} ptr (BTQconst [63] x) mem) + => (SET(B|AE)store [off] {sym} ptr (BTQconst [63] x) mem) (SET(NE|EQ)store [off] {sym} ptr (TESTL z1:(SHLLconst [31] (SHRLconst [31] x)) z2) mem) && z1==z2 - -> (SET(B|AE)store [off] {sym} ptr (BTLconst [31] x) mem) + => (SET(B|AE)store [off] {sym} ptr (BTLconst [31] x) mem) ((SETNE|SETEQ|NE|EQ) (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) && z1==z2 - -> ((SETB|SETAE|ULT|UGE) (BTQconst [0] x)) + => ((SETB|SETAE|ULT|UGE) (BTQconst [0] x)) ((SETNE|SETEQ|NE|EQ) (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) && z1==z2 - -> ((SETB|SETAE|ULT|UGE) (BTLconst [0] x)) + => ((SETB|SETAE|ULT|UGE) (BTLconst [0] x)) (SET(NE|EQ)store [off] {sym} ptr (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2) mem) && z1==z2 - -> (SET(B|AE)store [off] {sym} ptr (BTQconst [0] x) mem) + => (SET(B|AE)store [off] {sym} ptr (BTQconst [0] x) mem) (SET(NE|EQ)store [off] {sym} ptr (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2) mem) && z1==z2 - -> (SET(B|AE)store [off] {sym} ptr (BTLconst [0] x) mem) + => (SET(B|AE)store [off] {sym} ptr (BTLconst [0] x) mem) // Special-case manually testing last bit with "a>>63 != 0" (without "&1") ((SETNE|SETEQ|NE|EQ) (TESTQ z1:(SHRQconst [63] x) z2)) && z1==z2 - -> ((SETB|SETAE|ULT|UGE) (BTQconst [63] x)) + => ((SETB|SETAE|ULT|UGE) (BTQconst [63] x)) ((SETNE|SETEQ|NE|EQ) (TESTL z1:(SHRLconst [31] x) z2)) && z1==z2 - -> ((SETB|SETAE|ULT|UGE) (BTLconst [31] x)) + => ((SETB|SETAE|ULT|UGE) (BTLconst [31] x)) (SET(NE|EQ)store [off] {sym} ptr (TESTQ z1:(SHRQconst [63] x) z2) mem) && z1==z2 - -> (SET(B|AE)store [off] {sym} ptr (BTQconst [63] x) mem) + => (SET(B|AE)store [off] {sym} ptr (BTQconst [63] x) mem) (SET(NE|EQ)store [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem) && z1==z2 - -> (SET(B|AE)store [off] {sym} ptr (BTLconst [31] x) mem) + => (SET(B|AE)store [off] {sym} ptr (BTLconst [31] x) mem) // Fold combinations of bit ops on same bit. An example is math.Copysign(c,-1) -(BTS(Q|L)const [c] (BTR(Q|L)const [c] x)) -> (BTS(Q|L)const [c] x) -(BTS(Q|L)const [c] (BTC(Q|L)const [c] x)) -> (BTS(Q|L)const [c] x) -(BTR(Q|L)const [c] (BTS(Q|L)const [c] x)) -> (BTR(Q|L)const [c] x) -(BTR(Q|L)const [c] (BTC(Q|L)const [c] x)) -> (BTR(Q|L)const [c] x) +(BTS(Q|L)const [c] (BTR(Q|L)const [c] x)) => (BTS(Q|L)const [c] x) +(BTS(Q|L)const [c] (BTC(Q|L)const [c] x)) => (BTS(Q|L)const [c] x) +(BTR(Q|L)const [c] (BTS(Q|L)const [c] x)) => (BTR(Q|L)const [c] x) +(BTR(Q|L)const [c] (BTC(Q|L)const [c] x)) => (BTR(Q|L)const [c] x) // Fold boolean negation into SETcc. -(XORLconst [1] (SETNE x)) -> (SETEQ x) -(XORLconst [1] (SETEQ x)) -> (SETNE x) -(XORLconst [1] (SETL x)) -> (SETGE x) -(XORLconst [1] (SETGE x)) -> (SETL x) -(XORLconst [1] (SETLE x)) -> (SETG x) -(XORLconst [1] (SETG x)) -> (SETLE x) -(XORLconst [1] (SETB x)) -> (SETAE x) -(XORLconst [1] (SETAE x)) -> (SETB x) -(XORLconst [1] (SETBE x)) -> (SETA x) -(XORLconst [1] (SETA x)) -> (SETBE x) +(XORLconst [1] (SETNE x)) => (SETEQ x) +(XORLconst [1] (SETEQ x)) => (SETNE x) +(XORLconst [1] (SETL x)) => (SETGE x) +(XORLconst [1] (SETGE x)) => (SETL x) +(XORLconst [1] (SETLE x)) => (SETG x) +(XORLconst [1] (SETG x)) => (SETLE x) +(XORLconst [1] (SETB x)) => (SETAE x) +(XORLconst [1] (SETAE x)) => (SETB x) +(XORLconst [1] (SETBE x)) => (SETA x) +(XORLconst [1] (SETA x)) => (SETBE x) // Special case for floating point - LF/LEF not generated -(NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) -> (UGT cmp yes no) -(NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) -> (UGE cmp yes no) -(NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) -> (EQF cmp yes no) -(NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) -> (NEF cmp yes no) +(NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) => (UGT cmp yes no) +(NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) => (UGE cmp yes no) +(NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) => (EQF cmp yes no) +(NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) => (NEF cmp yes no) // Disabled because it interferes with the pattern match above and makes worse code. -// (SETNEF x) -> (ORQ (SETNE x) (SETNAN x)) -// (SETEQF x) -> (ANDQ (SETEQ x) (SETORD x)) +// (SETNEF x) => (ORQ (SETNE x) (SETNAN x)) +// (SETEQF x) => (ANDQ (SETEQ x) (SETORD x)) // fold constants into instructions -(ADDQ x (MOVQconst [c])) && is32Bit(c) -> (ADDQconst [c] x) -(ADDQ x (MOVLconst [c])) && is32Bit(c) -> (ADDQconst [int64(int32(c))] x) -(ADDL x (MOVLconst [c])) -> (ADDLconst [c] x) +(ADDQ x (MOVQconst [c])) && is32Bit(c) => (ADDQconst [int32(c)] x) +(ADDQ x (MOVLconst [c])) => (ADDQconst [c] x) +(ADDL x (MOVLconst [c])) => (ADDLconst [c] x) -(SUBQ x (MOVQconst [c])) && is32Bit(c) -> (SUBQconst x [c]) -(SUBQ (MOVQconst [c]) x) && is32Bit(c) -> (NEGQ (SUBQconst x [c])) -(SUBL x (MOVLconst [c])) -> (SUBLconst x [c]) -(SUBL (MOVLconst [c]) x) -> (NEGL (SUBLconst x [c])) +(SUBQ x (MOVQconst [c])) && is32Bit(c) => (SUBQconst x [int32(c)]) +(SUBQ (MOVQconst [c]) x) && is32Bit(c) => (NEGQ (SUBQconst x [int32(c)])) +(SUBL x (MOVLconst [c])) => (SUBLconst x [c]) +(SUBL (MOVLconst [c]) x) => (NEGL (SUBLconst x [c])) -(MULQ x (MOVQconst [c])) && is32Bit(c) -> (MULQconst [c] x) -(MULL x (MOVLconst [c])) -> (MULLconst [c] x) +(MULQ x (MOVQconst [c])) && is32Bit(c) => (MULQconst [int32(c)] x) +(MULL x (MOVLconst [c])) => (MULLconst [c] x) -(ANDQ x (MOVQconst [c])) && is32Bit(c) -> (ANDQconst [c] x) -(ANDL x (MOVLconst [c])) -> (ANDLconst [c] x) +(ANDQ x (MOVQconst [c])) && is32Bit(c) => (ANDQconst [int32(c)] x) +(ANDL x (MOVLconst [c])) => (ANDLconst [c] x) (AND(L|Q)const [c] (AND(L|Q)const [d] x)) => (AND(L|Q)const [c & d] x) (XOR(L|Q)const [c] (XOR(L|Q)const [d] x)) => (XOR(L|Q)const [c ^ d] x) @@ -763,68 +763,70 @@ (ORQconst [c] (BTSQconst [d] x)) && is32Bit(int64(c) | 1< (ORQconst [c | 1< (ORQconst [1< (MULLconst [int64(int32(c * d))] x) -(MULQconst [c] (MULQconst [d] x)) && is32Bit(c*d) -> (MULQconst [c * d] x) -(ORQ x (MOVQconst [c])) && is32Bit(c) -> (ORQconst [c] x) -(ORQ x (MOVLconst [c])) -> (ORQconst [c] x) -(ORL x (MOVLconst [c])) -> (ORLconst [c] x) +(MULLconst [c] (MULLconst [d] x)) => (MULLconst [c * d] x) +(MULQconst [c] (MULQconst [d] x)) && is32Bit(int64(c)*int64(d)) => (MULQconst [c * d] x) -(XORQ x (MOVQconst [c])) && is32Bit(c) -> (XORQconst [c] x) -(XORL x (MOVLconst [c])) -> (XORLconst [c] x) +(ORQ x (MOVQconst [c])) && is32Bit(c) => (ORQconst [int32(c)] x) +(ORQ x (MOVLconst [c])) => (ORQconst [c] x) +(ORL x (MOVLconst [c])) => (ORLconst [c] x) -(SHLQ x (MOV(Q|L)const [c])) -> (SHLQconst [c&63] x) -(SHLL x (MOV(Q|L)const [c])) -> (SHLLconst [c&31] x) +(XORQ x (MOVQconst [c])) && is32Bit(c) => (XORQconst [int32(c)] x) +(XORL x (MOVLconst [c])) => (XORLconst [c] x) -(SHRQ x (MOV(Q|L)const [c])) -> (SHRQconst [c&63] x) -(SHRL x (MOV(Q|L)const [c])) -> (SHRLconst [c&31] x) -(SHRW x (MOV(Q|L)const [c])) && c&31 < 16 -> (SHRWconst [c&31] x) -(SHRW _ (MOV(Q|L)const [c])) && c&31 >= 16 -> (MOVLconst [0]) -(SHRB x (MOV(Q|L)const [c])) && c&31 < 8 -> (SHRBconst [c&31] x) -(SHRB _ (MOV(Q|L)const [c])) && c&31 >= 8 -> (MOVLconst [0]) +(SHLQ x (MOV(Q|L)const [c])) => (SHLQconst [int8(c&63)] x) +(SHLL x (MOV(Q|L)const [c])) => (SHLLconst [int8(c&31)] x) + +(SHRQ x (MOV(Q|L)const [c])) => (SHRQconst [int8(c&63)] x) +(SHRL x (MOV(Q|L)const [c])) => (SHRLconst [int8(c&31)] x) +(SHRW x (MOV(Q|L)const [c])) && c&31 < 16 => (SHRWconst [int8(c&31)] x) +(SHRW _ (MOV(Q|L)const [c])) && c&31 >= 16 => (MOVLconst [0]) +(SHRB x (MOV(Q|L)const [c])) && c&31 < 8 => (SHRBconst [int8(c&31)] x) +(SHRB _ (MOV(Q|L)const [c])) && c&31 >= 8 => (MOVLconst [0]) + +(SARQ x (MOV(Q|L)const [c])) => (SARQconst [int8(c&63)] x) +(SARL x (MOV(Q|L)const [c])) => (SARLconst [int8(c&31)] x) +(SARW x (MOV(Q|L)const [c])) => (SARWconst [int8(min(int64(c)&31,15))] x) +(SARB x (MOV(Q|L)const [c])) => (SARBconst [int8(min(int64(c)&31,7))] x) -(SARQ x (MOV(Q|L)const [c])) -> (SARQconst [c&63] x) -(SARL x (MOV(Q|L)const [c])) -> (SARLconst [c&31] x) -(SARW x (MOV(Q|L)const [c])) -> (SARWconst [min(c&31,15)] x) -(SARB x (MOV(Q|L)const [c])) -> (SARBconst [min(c&31,7)] x) // Operations which don't affect the low 6/5 bits of the shift amount are NOPs. -((SHLQ|SHRQ|SARQ) x (ADDQconst [c] y)) && c & 63 == 0 -> ((SHLQ|SHRQ|SARQ) x y) -((SHLQ|SHRQ|SARQ) x (NEGQ (ADDQconst [c] y))) && c & 63 == 0 -> ((SHLQ|SHRQ|SARQ) x (NEGQ y)) -((SHLQ|SHRQ|SARQ) x (ANDQconst [c] y)) && c & 63 == 63 -> ((SHLQ|SHRQ|SARQ) x y) -((SHLQ|SHRQ|SARQ) x (NEGQ (ANDQconst [c] y))) && c & 63 == 63 -> ((SHLQ|SHRQ|SARQ) x (NEGQ y)) - -((SHLL|SHRL|SARL) x (ADDQconst [c] y)) && c & 31 == 0 -> ((SHLL|SHRL|SARL) x y) -((SHLL|SHRL|SARL) x (NEGQ (ADDQconst [c] y))) && c & 31 == 0 -> ((SHLL|SHRL|SARL) x (NEGQ y)) -((SHLL|SHRL|SARL) x (ANDQconst [c] y)) && c & 31 == 31 -> ((SHLL|SHRL|SARL) x y) -((SHLL|SHRL|SARL) x (NEGQ (ANDQconst [c] y))) && c & 31 == 31 -> ((SHLL|SHRL|SARL) x (NEGQ y)) - -((SHLQ|SHRQ|SARQ) x (ADDLconst [c] y)) && c & 63 == 0 -> ((SHLQ|SHRQ|SARQ) x y) -((SHLQ|SHRQ|SARQ) x (NEGL (ADDLconst [c] y))) && c & 63 == 0 -> ((SHLQ|SHRQ|SARQ) x (NEGL y)) -((SHLQ|SHRQ|SARQ) x (ANDLconst [c] y)) && c & 63 == 63 -> ((SHLQ|SHRQ|SARQ) x y) -((SHLQ|SHRQ|SARQ) x (NEGL (ANDLconst [c] y))) && c & 63 == 63 -> ((SHLQ|SHRQ|SARQ) x (NEGL y)) - -((SHLL|SHRL|SARL) x (ADDLconst [c] y)) && c & 31 == 0 -> ((SHLL|SHRL|SARL) x y) -((SHLL|SHRL|SARL) x (NEGL (ADDLconst [c] y))) && c & 31 == 0 -> ((SHLL|SHRL|SARL) x (NEGL y)) -((SHLL|SHRL|SARL) x (ANDLconst [c] y)) && c & 31 == 31 -> ((SHLL|SHRL|SARL) x y) -((SHLL|SHRL|SARL) x (NEGL (ANDLconst [c] y))) && c & 31 == 31 -> ((SHLL|SHRL|SARL) x (NEGL y)) +((SHLQ|SHRQ|SARQ) x (ADDQconst [c] y)) && c & 63 == 0 => ((SHLQ|SHRQ|SARQ) x y) +((SHLQ|SHRQ|SARQ) x (NEGQ (ADDQconst [c] y))) && c & 63 == 0 => ((SHLQ|SHRQ|SARQ) x (NEGQ y)) +((SHLQ|SHRQ|SARQ) x (ANDQconst [c] y)) && c & 63 == 63 => ((SHLQ|SHRQ|SARQ) x y) +((SHLQ|SHRQ|SARQ) x (NEGQ (ANDQconst [c] y))) && c & 63 == 63 => ((SHLQ|SHRQ|SARQ) x (NEGQ y)) + +((SHLL|SHRL|SARL) x (ADDQconst [c] y)) && c & 31 == 0 => ((SHLL|SHRL|SARL) x y) +((SHLL|SHRL|SARL) x (NEGQ (ADDQconst [c] y))) && c & 31 == 0 => ((SHLL|SHRL|SARL) x (NEGQ y)) +((SHLL|SHRL|SARL) x (ANDQconst [c] y)) && c & 31 == 31 => ((SHLL|SHRL|SARL) x y) +((SHLL|SHRL|SARL) x (NEGQ (ANDQconst [c] y))) && c & 31 == 31 => ((SHLL|SHRL|SARL) x (NEGQ y)) + +((SHLQ|SHRQ|SARQ) x (ADDLconst [c] y)) && c & 63 == 0 => ((SHLQ|SHRQ|SARQ) x y) +((SHLQ|SHRQ|SARQ) x (NEGL (ADDLconst [c] y))) && c & 63 == 0 => ((SHLQ|SHRQ|SARQ) x (NEGL y)) +((SHLQ|SHRQ|SARQ) x (ANDLconst [c] y)) && c & 63 == 63 => ((SHLQ|SHRQ|SARQ) x y) +((SHLQ|SHRQ|SARQ) x (NEGL (ANDLconst [c] y))) && c & 63 == 63 => ((SHLQ|SHRQ|SARQ) x (NEGL y)) + +((SHLL|SHRL|SARL) x (ADDLconst [c] y)) && c & 31 == 0 => ((SHLL|SHRL|SARL) x y) +((SHLL|SHRL|SARL) x (NEGL (ADDLconst [c] y))) && c & 31 == 0 => ((SHLL|SHRL|SARL) x (NEGL y)) +((SHLL|SHRL|SARL) x (ANDLconst [c] y)) && c & 31 == 31 => ((SHLL|SHRL|SARL) x y) +((SHLL|SHRL|SARL) x (NEGL (ANDLconst [c] y))) && c & 31 == 31 => ((SHLL|SHRL|SARL) x (NEGL y)) // Constant rotate instructions -((ADDQ|ORQ|XORQ) (SHLQconst x [c]) (SHRQconst x [d])) && d==64-c -> (ROLQconst x [c]) -((ADDL|ORL|XORL) (SHLLconst x [c]) (SHRLconst x [d])) && d==32-c -> (ROLLconst x [c]) +((ADDQ|ORQ|XORQ) (SHLQconst x [c]) (SHRQconst x [d])) && d==64-c => (ROLQconst x [c]) +((ADDL|ORL|XORL) (SHLLconst x [c]) (SHRLconst x [d])) && d==32-c => (ROLLconst x [c]) -((ADDL|ORL|XORL) (SHLLconst x [c]) (SHRWconst x [d])) && d==16-c && c < 16 && t.Size() == 2 -> (ROLWconst x [c]) -((ADDL|ORL|XORL) (SHLLconst x [c]) (SHRBconst x [d])) && d==8-c && c < 8 && t.Size() == 1 -> (ROLBconst x [c]) +((ADDL|ORL|XORL) (SHLLconst x [c]) (SHRWconst x [d])) && d==16-c && c < 16 && t.Size() == 2 => (ROLWconst x [c]) +((ADDL|ORL|XORL) (SHLLconst x [c]) (SHRBconst x [d])) && d==8-c && c < 8 && t.Size() == 1 => (ROLBconst x [c]) -(ROLQconst [c] (ROLQconst [d] x)) -> (ROLQconst [(c+d)&63] x) -(ROLLconst [c] (ROLLconst [d] x)) -> (ROLLconst [(c+d)&31] x) -(ROLWconst [c] (ROLWconst [d] x)) -> (ROLWconst [(c+d)&15] x) -(ROLBconst [c] (ROLBconst [d] x)) -> (ROLBconst [(c+d)& 7] x) +(ROLQconst [c] (ROLQconst [d] x)) => (ROLQconst [(c+d)&63] x) +(ROLLconst [c] (ROLLconst [d] x)) => (ROLLconst [(c+d)&31] x) +(ROLWconst [c] (ROLWconst [d] x)) => (ROLWconst [(c+d)&15] x) +(ROLBconst [c] (ROLBconst [d] x)) => (ROLBconst [(c+d)& 7] x) -(RotateLeft8 ...) -> (ROLB ...) -(RotateLeft16 ...) -> (ROLW ...) -(RotateLeft32 ...) -> (ROLL ...) -(RotateLeft64 ...) -> (ROLQ ...) +(RotateLeft8 ...) => (ROLB ...) +(RotateLeft16 ...) => (ROLW ...) +(RotateLeft32 ...) => (ROLL ...) +(RotateLeft64 ...) => (ROLQ ...) // Non-constant rotates. // We want to issue a rotate when the Go source contains code like @@ -837,15 +839,15 @@ // But x >> 64 is 0, not x. So there's an additional mask that is ANDed in // to force the second term to 0. We don't need that mask, but we must match // it in order to strip it out. -(ORQ (SHLQ x y) (ANDQ (SHRQ x (NEG(Q|L) y)) (SBBQcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [63]) [-64])) [64])))) -> (ROLQ x y) -(ORQ (SHRQ x y) (ANDQ (SHLQ x (NEG(Q|L) y)) (SBBQcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [63]) [-64])) [64])))) -> (RORQ x y) +(ORQ (SHLQ x y) (ANDQ (SHRQ x (NEG(Q|L) y)) (SBBQcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [63]) [-64])) [64])))) => (ROLQ x y) +(ORQ (SHRQ x y) (ANDQ (SHLQ x (NEG(Q|L) y)) (SBBQcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [63]) [-64])) [64])))) => (RORQ x y) -(ORL (SHLL x y) (ANDL (SHRL x (NEG(Q|L) y)) (SBBLcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [31]) [-32])) [32])))) -> (ROLL x y) -(ORL (SHRL x y) (ANDL (SHLL x (NEG(Q|L) y)) (SBBLcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [31]) [-32])) [32])))) -> (RORL x y) +(ORL (SHLL x y) (ANDL (SHRL x (NEG(Q|L) y)) (SBBLcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [31]) [-32])) [32])))) => (ROLL x y) +(ORL (SHRL x y) (ANDL (SHLL x (NEG(Q|L) y)) (SBBLcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [31]) [-32])) [32])))) => (RORL x y) // Help with rotate detection -(CMPQconst (NEGQ (ADDQconst [-16] (ANDQconst [15] _))) [32]) -> (FlagLT_ULT) -(CMPQconst (NEGQ (ADDQconst [ -8] (ANDQconst [7] _))) [32]) -> (FlagLT_ULT) +(CMPQconst (NEGQ (ADDQconst [-16] (ANDQconst [15] _))) [32]) => (FlagLT_ULT) +(CMPQconst (NEGQ (ADDQconst [ -8] (ANDQconst [7] _))) [32]) => (FlagLT_ULT) (ORL (SHLL x (AND(Q|L)const y [15])) (ANDL (SHRW x (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [15]) [-16]))) @@ -855,69 +857,74 @@ (ORL (SHRW x (AND(Q|L)const y [15])) (SHLL x (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [15]) [-16])))) && v.Type.Size() == 2 - -> (RORW x y) + => (RORW x y) (ORL (SHLL x (AND(Q|L)const y [ 7])) (ANDL (SHRB x (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [ 7]) [ -8]))) (SBBLcarrymask (CMP(Q|L)const (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [ 7]) [ -8])) [ 8])))) && v.Type.Size() == 1 - -> (ROLB x y) + => (ROLB x y) (ORL (SHRB x (AND(Q|L)const y [ 7])) (SHLL x (NEG(Q|L) (ADD(Q|L)const (AND(Q|L)const y [ 7]) [ -8])))) && v.Type.Size() == 1 - -> (RORB x y) + => (RORB x y) // rotate left negative = rotate right -(ROLQ x (NEG(Q|L) y)) -> (RORQ x y) -(ROLL x (NEG(Q|L) y)) -> (RORL x y) -(ROLW x (NEG(Q|L) y)) -> (RORW x y) -(ROLB x (NEG(Q|L) y)) -> (RORB x y) +(ROLQ x (NEG(Q|L) y)) => (RORQ x y) +(ROLL x (NEG(Q|L) y)) => (RORL x y) +(ROLW x (NEG(Q|L) y)) => (RORW x y) +(ROLB x (NEG(Q|L) y)) => (RORB x y) // rotate right negative = rotate left -(RORQ x (NEG(Q|L) y)) -> (ROLQ x y) -(RORL x (NEG(Q|L) y)) -> (ROLL x y) -(RORW x (NEG(Q|L) y)) -> (ROLW x y) -(RORB x (NEG(Q|L) y)) -> (ROLB x y) +(RORQ x (NEG(Q|L) y)) => (ROLQ x y) +(RORL x (NEG(Q|L) y)) => (ROLL x y) +(RORW x (NEG(Q|L) y)) => (ROLW x y) +(RORB x (NEG(Q|L) y)) => (ROLB x y) // rotate by constants -(ROLQ x (MOV(Q|L)const [c])) -> (ROLQconst [c&63] x) -(ROLL x (MOV(Q|L)const [c])) -> (ROLLconst [c&31] x) -(ROLW x (MOV(Q|L)const [c])) -> (ROLWconst [c&15] x) -(ROLB x (MOV(Q|L)const [c])) -> (ROLBconst [c&7 ] x) +(ROLQ x (MOV(Q|L)const [c])) => (ROLQconst [int8(c&63)] x) +(ROLL x (MOV(Q|L)const [c])) => (ROLLconst [int8(c&31)] x) +(ROLW x (MOV(Q|L)const [c])) => (ROLWconst [int8(c&15)] x) +(ROLB x (MOV(Q|L)const [c])) => (ROLBconst [int8(c&7) ] x) -(RORQ x (MOV(Q|L)const [c])) -> (ROLQconst [(-c)&63] x) -(RORL x (MOV(Q|L)const [c])) -> (ROLLconst [(-c)&31] x) -(RORW x (MOV(Q|L)const [c])) -> (ROLWconst [(-c)&15] x) -(RORB x (MOV(Q|L)const [c])) -> (ROLBconst [(-c)&7 ] x) +(RORQ x (MOV(Q|L)const [c])) => (ROLQconst [int8((-c)&63)] x) +(RORL x (MOV(Q|L)const [c])) => (ROLLconst [int8((-c)&31)] x) +(RORW x (MOV(Q|L)const [c])) => (ROLWconst [int8((-c)&15)] x) +(RORB x (MOV(Q|L)const [c])) => (ROLBconst [int8((-c)&7) ] x) // Constant shift simplifications -((SHLQ|SHRQ|SARQ)const x [0]) -> x -((SHLL|SHRL|SARL)const x [0]) -> x -((SHRW|SARW)const x [0]) -> x -((SHRB|SARB)const x [0]) -> x -((ROLQ|ROLL|ROLW|ROLB)const x [0]) -> x +((SHLQ|SHRQ|SARQ)const x [0]) => x +((SHLL|SHRL|SARL)const x [0]) => x +((SHRW|SARW)const x [0]) => x +((SHRB|SARB)const x [0]) => x +((ROLQ|ROLL|ROLW|ROLB)const x [0]) => x // Note: the word and byte shifts keep the low 5 bits (not the low 4 or 3 bits) // because the x86 instructions are defined to use all 5 bits of the shift even // for the small shifts. I don't think we'll ever generate a weird shift (e.g. // (SHRW x (MOVLconst [24])), but just in case. -(CMPQ x (MOVQconst [c])) && is32Bit(c) -> (CMPQconst x [c]) -(CMPQ (MOVQconst [c]) x) && is32Bit(c) -> (InvertFlags (CMPQconst x [c])) -(CMPL x (MOVLconst [c])) -> (CMPLconst x [c]) -(CMPL (MOVLconst [c]) x) -> (InvertFlags (CMPLconst x [c])) -(CMPW x (MOVLconst [c])) -> (CMPWconst x [int64(int16(c))]) -(CMPW (MOVLconst [c]) x) -> (InvertFlags (CMPWconst x [int64(int16(c))])) -(CMPB x (MOVLconst [c])) -> (CMPBconst x [int64(int8(c))]) -(CMPB (MOVLconst [c]) x) -> (InvertFlags (CMPBconst x [int64(int8(c))])) +(CMPQ x (MOVQconst [c])) && is32Bit(c) => (CMPQconst x [int32(c)]) +(CMPQ (MOVQconst [c]) x) && is32Bit(c) => (InvertFlags (CMPQconst x [int32(c)])) +(CMPL x (MOVLconst [c])) => (CMPLconst x [c]) +(CMPL (MOVLconst [c]) x) => (InvertFlags (CMPLconst x [c])) +(CMPW x (MOVLconst [c])) => (CMPWconst x [int16(c)]) +(CMPW (MOVLconst [c]) x) => (InvertFlags (CMPWconst x [int16(c)])) +(CMPB x (MOVLconst [c])) => (CMPBconst x [int8(c)]) +(CMPB (MOVLconst [c]) x) => (InvertFlags (CMPBconst x [int8(c)])) // Canonicalize the order of arguments to comparisons - helps with CSE. -(CMP(Q|L|W|B) x y) && x.ID > y.ID -> (InvertFlags (CMP(Q|L|W|B) y x)) +(CMP(Q|L|W|B) x y) && x.ID > y.ID => (InvertFlags (CMP(Q|L|W|B) y x)) // Using MOVZX instead of AND is cheaper. -(AND(Q|L)const [ 0xFF] x) -> (MOVBQZX x) -(AND(Q|L)const [0xFFFF] x) -> (MOVWQZX x) -(ANDQconst [0xFFFFFFFF] x) -> (MOVLQZX x) +(AND(Q|L)const [ 0xFF] x) => (MOVBQZX x) +(AND(Q|L)const [0xFFFF] x) => (MOVWQZX x) +// This rule is currently invalid because 0xFFFFFFFF is not representable by a signed int32. +// Commenting out for now, because it also can't trigger because of the is32bit guard on the +// ANDQconst lowering-rule, above, prevents 0xFFFFFFFF from matching (for the same reason) +// Using an alternate form of this rule segfaults some binaries because of +// adverse interactions with other passes. +// (ANDQconst [0xFFFFFFFF] x) => (MOVLQZX x) // strength reduction // Assumes that the following costs from https://gmplib.org/~tege/x86-timing.pdf: @@ -928,98 +935,98 @@ // which can require a register-register move // to preserve the original value, // so it must be used with care. -(MUL(Q|L)const [-9] x) -> (NEG(Q|L) (LEA(Q|L)8 x x)) -(MUL(Q|L)const [-5] x) -> (NEG(Q|L) (LEA(Q|L)4 x x)) -(MUL(Q|L)const [-3] x) -> (NEG(Q|L) (LEA(Q|L)2 x x)) -(MUL(Q|L)const [-1] x) -> (NEG(Q|L) x) -(MUL(Q|L)const [ 0] _) -> (MOV(Q|L)const [0]) -(MUL(Q|L)const [ 1] x) -> x -(MUL(Q|L)const [ 3] x) -> (LEA(Q|L)2 x x) -(MUL(Q|L)const [ 5] x) -> (LEA(Q|L)4 x x) -(MUL(Q|L)const [ 7] x) -> (LEA(Q|L)2 x (LEA(Q|L)2 x x)) -(MUL(Q|L)const [ 9] x) -> (LEA(Q|L)8 x x) -(MUL(Q|L)const [11] x) -> (LEA(Q|L)2 x (LEA(Q|L)4 x x)) -(MUL(Q|L)const [13] x) -> (LEA(Q|L)4 x (LEA(Q|L)2 x x)) -(MUL(Q|L)const [19] x) -> (LEA(Q|L)2 x (LEA(Q|L)8 x x)) -(MUL(Q|L)const [21] x) -> (LEA(Q|L)4 x (LEA(Q|L)4 x x)) -(MUL(Q|L)const [25] x) -> (LEA(Q|L)8 x (LEA(Q|L)2 x x)) -(MUL(Q|L)const [27] x) -> (LEA(Q|L)8 (LEA(Q|L)2 x x) (LEA(Q|L)2 x x)) -(MUL(Q|L)const [37] x) -> (LEA(Q|L)4 x (LEA(Q|L)8 x x)) -(MUL(Q|L)const [41] x) -> (LEA(Q|L)8 x (LEA(Q|L)4 x x)) -(MUL(Q|L)const [45] x) -> (LEA(Q|L)8 (LEA(Q|L)4 x x) (LEA(Q|L)4 x x)) -(MUL(Q|L)const [73] x) -> (LEA(Q|L)8 x (LEA(Q|L)8 x x)) -(MUL(Q|L)const [81] x) -> (LEA(Q|L)8 (LEA(Q|L)8 x x) (LEA(Q|L)8 x x)) - -(MUL(Q|L)const [c] x) && isPowerOfTwo(c+1) && c >= 15 -> (SUB(Q|L) (SHL(Q|L)const [log2(c+1)] x) x) -(MUL(Q|L)const [c] x) && isPowerOfTwo(c-1) && c >= 17 -> (LEA(Q|L)1 (SHL(Q|L)const [log2(c-1)] x) x) -(MUL(Q|L)const [c] x) && isPowerOfTwo(c-2) && c >= 34 -> (LEA(Q|L)2 (SHL(Q|L)const [log2(c-2)] x) x) -(MUL(Q|L)const [c] x) && isPowerOfTwo(c-4) && c >= 68 -> (LEA(Q|L)4 (SHL(Q|L)const [log2(c-4)] x) x) -(MUL(Q|L)const [c] x) && isPowerOfTwo(c-8) && c >= 136 -> (LEA(Q|L)8 (SHL(Q|L)const [log2(c-8)] x) x) -(MUL(Q|L)const [c] x) && c%3 == 0 && isPowerOfTwo(c/3) -> (SHL(Q|L)const [log2(c/3)] (LEA(Q|L)2 x x)) -(MUL(Q|L)const [c] x) && c%5 == 0 && isPowerOfTwo(c/5) -> (SHL(Q|L)const [log2(c/5)] (LEA(Q|L)4 x x)) -(MUL(Q|L)const [c] x) && c%9 == 0 && isPowerOfTwo(c/9) -> (SHL(Q|L)const [log2(c/9)] (LEA(Q|L)8 x x)) +(MUL(Q|L)const [-9] x) => (NEG(Q|L) (LEA(Q|L)8 x x)) +(MUL(Q|L)const [-5] x) => (NEG(Q|L) (LEA(Q|L)4 x x)) +(MUL(Q|L)const [-3] x) => (NEG(Q|L) (LEA(Q|L)2 x x)) +(MUL(Q|L)const [-1] x) => (NEG(Q|L) x) +(MUL(Q|L)const [ 0] _) => (MOV(Q|L)const [0]) +(MUL(Q|L)const [ 1] x) => x +(MUL(Q|L)const [ 3] x) => (LEA(Q|L)2 x x) +(MUL(Q|L)const [ 5] x) => (LEA(Q|L)4 x x) +(MUL(Q|L)const [ 7] x) => (LEA(Q|L)2 x (LEA(Q|L)2 x x)) +(MUL(Q|L)const [ 9] x) => (LEA(Q|L)8 x x) +(MUL(Q|L)const [11] x) => (LEA(Q|L)2 x (LEA(Q|L)4 x x)) +(MUL(Q|L)const [13] x) => (LEA(Q|L)4 x (LEA(Q|L)2 x x)) +(MUL(Q|L)const [19] x) => (LEA(Q|L)2 x (LEA(Q|L)8 x x)) +(MUL(Q|L)const [21] x) => (LEA(Q|L)4 x (LEA(Q|L)4 x x)) +(MUL(Q|L)const [25] x) => (LEA(Q|L)8 x (LEA(Q|L)2 x x)) +(MUL(Q|L)const [27] x) => (LEA(Q|L)8 (LEA(Q|L)2 x x) (LEA(Q|L)2 x x)) +(MUL(Q|L)const [37] x) => (LEA(Q|L)4 x (LEA(Q|L)8 x x)) +(MUL(Q|L)const [41] x) => (LEA(Q|L)8 x (LEA(Q|L)4 x x)) +(MUL(Q|L)const [45] x) => (LEA(Q|L)8 (LEA(Q|L)4 x x) (LEA(Q|L)4 x x)) +(MUL(Q|L)const [73] x) => (LEA(Q|L)8 x (LEA(Q|L)8 x x)) +(MUL(Q|L)const [81] x) => (LEA(Q|L)8 (LEA(Q|L)8 x x) (LEA(Q|L)8 x x)) + +(MUL(Q|L)const [c] x) && isPowerOfTwo(int64(c)+1) && c >= 15 => (SUB(Q|L) (SHL(Q|L)const [int8(log2(int64(c)+1))] x) x) +(MUL(Q|L)const [c] x) && isPowerOfTwo32(c-1) && c >= 17 => (LEA(Q|L)1 (SHL(Q|L)const [int8(log32(c-1))] x) x) +(MUL(Q|L)const [c] x) && isPowerOfTwo32(c-2) && c >= 34 => (LEA(Q|L)2 (SHL(Q|L)const [int8(log32(c-2))] x) x) +(MUL(Q|L)const [c] x) && isPowerOfTwo32(c-4) && c >= 68 => (LEA(Q|L)4 (SHL(Q|L)const [int8(log32(c-4))] x) x) +(MUL(Q|L)const [c] x) && isPowerOfTwo32(c-8) && c >= 136 => (LEA(Q|L)8 (SHL(Q|L)const [int8(log32(c-8))] x) x) +(MUL(Q|L)const [c] x) && c%3 == 0 && isPowerOfTwo32(c/3) => (SHL(Q|L)const [int8(log32(c/3))] (LEA(Q|L)2 x x)) +(MUL(Q|L)const [c] x) && c%5 == 0 && isPowerOfTwo32(c/5) => (SHL(Q|L)const [int8(log32(c/5))] (LEA(Q|L)4 x x)) +(MUL(Q|L)const [c] x) && c%9 == 0 && isPowerOfTwo32(c/9) => (SHL(Q|L)const [int8(log32(c/9))] (LEA(Q|L)8 x x)) // combine add/shift into LEAQ/LEAL -(ADD(L|Q) x (SHL(L|Q)const [3] y)) -> (LEA(L|Q)8 x y) -(ADD(L|Q) x (SHL(L|Q)const [2] y)) -> (LEA(L|Q)4 x y) -(ADD(L|Q) x (SHL(L|Q)const [1] y)) -> (LEA(L|Q)2 x y) -(ADD(L|Q) x (ADD(L|Q) y y)) -> (LEA(L|Q)2 x y) -(ADD(L|Q) x (ADD(L|Q) x y)) -> (LEA(L|Q)2 y x) +(ADD(L|Q) x (SHL(L|Q)const [3] y)) => (LEA(L|Q)8 x y) +(ADD(L|Q) x (SHL(L|Q)const [2] y)) => (LEA(L|Q)4 x y) +(ADD(L|Q) x (SHL(L|Q)const [1] y)) => (LEA(L|Q)2 x y) +(ADD(L|Q) x (ADD(L|Q) y y)) => (LEA(L|Q)2 x y) +(ADD(L|Q) x (ADD(L|Q) x y)) => (LEA(L|Q)2 y x) // combine ADDQ/ADDQconst into LEAQ1/LEAL1 -(ADD(Q|L)const [c] (ADD(Q|L) x y)) -> (LEA(Q|L)1 [c] x y) -(ADD(Q|L) (ADD(Q|L)const [c] x) y) -> (LEA(Q|L)1 [c] x y) -(ADD(Q|L)const [c] (SHL(Q|L)const [1] x)) -> (LEA(Q|L)1 [c] x x) +(ADD(Q|L)const [c] (ADD(Q|L) x y)) => (LEA(Q|L)1 [c] x y) +(ADD(Q|L) (ADD(Q|L)const [c] x) y) => (LEA(Q|L)1 [c] x y) +(ADD(Q|L)const [c] (SHL(Q|L)const [1] x)) => (LEA(Q|L)1 [c] x x) // fold ADDQ/ADDL into LEAQ/LEAL -(ADD(Q|L)const [c] (LEA(Q|L) [d] {s} x)) && is32Bit(c+d) -> (LEA(Q|L) [c+d] {s} x) -(LEA(Q|L) [c] {s} (ADD(Q|L)const [d] x)) && is32Bit(c+d) -> (LEA(Q|L) [c+d] {s} x) -(LEA(Q|L) [c] {s} (ADD(Q|L) x y)) && x.Op != OpSB && y.Op != OpSB -> (LEA(Q|L)1 [c] {s} x y) -(ADD(Q|L) x (LEA(Q|L) [c] {s} y)) && x.Op != OpSB && y.Op != OpSB -> (LEA(Q|L)1 [c] {s} x y) +(ADD(Q|L)const [c] (LEA(Q|L) [d] {s} x)) && is32Bit(int64(c)+int64(d)) => (LEA(Q|L) [c+d] {s} x) +(LEA(Q|L) [c] {s} (ADD(Q|L)const [d] x)) && is32Bit(int64(c)+int64(d)) => (LEA(Q|L) [c+d] {s} x) +(LEA(Q|L) [c] {s} (ADD(Q|L) x y)) && x.Op != OpSB && y.Op != OpSB => (LEA(Q|L)1 [c] {s} x y) +(ADD(Q|L) x (LEA(Q|L) [c] {s} y)) && x.Op != OpSB && y.Op != OpSB => (LEA(Q|L)1 [c] {s} x y) // fold ADDQconst/ADDLconst into LEAQx/LEALx -(ADD(Q|L)const [c] (LEA(Q|L)1 [d] {s} x y)) && is32Bit(c+d) -> (LEA(Q|L)1 [c+d] {s} x y) -(ADD(Q|L)const [c] (LEA(Q|L)2 [d] {s} x y)) && is32Bit(c+d) -> (LEA(Q|L)2 [c+d] {s} x y) -(ADD(Q|L)const [c] (LEA(Q|L)4 [d] {s} x y)) && is32Bit(c+d) -> (LEA(Q|L)4 [c+d] {s} x y) -(ADD(Q|L)const [c] (LEA(Q|L)8 [d] {s} x y)) && is32Bit(c+d) -> (LEA(Q|L)8 [c+d] {s} x y) -(LEA(Q|L)1 [c] {s} (ADD(Q|L)const [d] x) y) && is32Bit(c+d) && x.Op != OpSB -> (LEA(Q|L)1 [c+d] {s} x y) -(LEA(Q|L)2 [c] {s} (ADD(Q|L)const [d] x) y) && is32Bit(c+d) && x.Op != OpSB -> (LEA(Q|L)2 [c+d] {s} x y) -(LEA(Q|L)2 [c] {s} x (ADD(Q|L)const [d] y)) && is32Bit(c+2*d) && y.Op != OpSB -> (LEA(Q|L)2 [c+2*d] {s} x y) -(LEA(Q|L)4 [c] {s} (ADD(Q|L)const [d] x) y) && is32Bit(c+d) && x.Op != OpSB -> (LEA(Q|L)4 [c+d] {s} x y) -(LEA(Q|L)4 [c] {s} x (ADD(Q|L)const [d] y)) && is32Bit(c+4*d) && y.Op != OpSB -> (LEA(Q|L)4 [c+4*d] {s} x y) -(LEA(Q|L)8 [c] {s} (ADD(Q|L)const [d] x) y) && is32Bit(c+d) && x.Op != OpSB -> (LEA(Q|L)8 [c+d] {s} x y) -(LEA(Q|L)8 [c] {s} x (ADD(Q|L)const [d] y)) && is32Bit(c+8*d) && y.Op != OpSB -> (LEA(Q|L)8 [c+8*d] {s} x y) +(ADD(Q|L)const [c] (LEA(Q|L)1 [d] {s} x y)) && is32Bit(int64(c)+int64(d)) => (LEA(Q|L)1 [c+d] {s} x y) +(ADD(Q|L)const [c] (LEA(Q|L)2 [d] {s} x y)) && is32Bit(int64(c)+int64(d)) => (LEA(Q|L)2 [c+d] {s} x y) +(ADD(Q|L)const [c] (LEA(Q|L)4 [d] {s} x y)) && is32Bit(int64(c)+int64(d)) => (LEA(Q|L)4 [c+d] {s} x y) +(ADD(Q|L)const [c] (LEA(Q|L)8 [d] {s} x y)) && is32Bit(int64(c)+int64(d)) => (LEA(Q|L)8 [c+d] {s} x y) +(LEA(Q|L)1 [c] {s} (ADD(Q|L)const [d] x) y) && is32Bit(int64(c)+int64(d)) && x.Op != OpSB => (LEA(Q|L)1 [c+d] {s} x y) +(LEA(Q|L)2 [c] {s} (ADD(Q|L)const [d] x) y) && is32Bit(int64(c)+int64(d)) && x.Op != OpSB => (LEA(Q|L)2 [c+d] {s} x y) +(LEA(Q|L)2 [c] {s} x (ADD(Q|L)const [d] y)) && is32Bit(int64(c)+2*int64(d)) && y.Op != OpSB => (LEA(Q|L)2 [c+2*d] {s} x y) +(LEA(Q|L)4 [c] {s} (ADD(Q|L)const [d] x) y) && is32Bit(int64(c)+int64(d)) && x.Op != OpSB => (LEA(Q|L)4 [c+d] {s} x y) +(LEA(Q|L)4 [c] {s} x (ADD(Q|L)const [d] y)) && is32Bit(int64(c)+4*int64(d)) && y.Op != OpSB => (LEA(Q|L)4 [c+4*d] {s} x y) +(LEA(Q|L)8 [c] {s} (ADD(Q|L)const [d] x) y) && is32Bit(int64(c)+int64(d)) && x.Op != OpSB => (LEA(Q|L)8 [c+d] {s} x y) +(LEA(Q|L)8 [c] {s} x (ADD(Q|L)const [d] y)) && is32Bit(int64(c)+8*int64(d)) && y.Op != OpSB => (LEA(Q|L)8 [c+8*d] {s} x y) // fold shifts into LEAQx/LEALx -(LEA(Q|L)1 [c] {s} x (SHL(Q|L)const [1] y)) -> (LEA(Q|L)2 [c] {s} x y) -(LEA(Q|L)1 [c] {s} x (SHL(Q|L)const [2] y)) -> (LEA(Q|L)4 [c] {s} x y) -(LEA(Q|L)1 [c] {s} x (SHL(Q|L)const [3] y)) -> (LEA(Q|L)8 [c] {s} x y) -(LEA(Q|L)2 [c] {s} x (SHL(Q|L)const [1] y)) -> (LEA(Q|L)4 [c] {s} x y) -(LEA(Q|L)2 [c] {s} x (SHL(Q|L)const [2] y)) -> (LEA(Q|L)8 [c] {s} x y) -(LEA(Q|L)4 [c] {s} x (SHL(Q|L)const [1] y)) -> (LEA(Q|L)8 [c] {s} x y) +(LEA(Q|L)1 [c] {s} x (SHL(Q|L)const [1] y)) => (LEA(Q|L)2 [c] {s} x y) +(LEA(Q|L)1 [c] {s} x (SHL(Q|L)const [2] y)) => (LEA(Q|L)4 [c] {s} x y) +(LEA(Q|L)1 [c] {s} x (SHL(Q|L)const [3] y)) => (LEA(Q|L)8 [c] {s} x y) +(LEA(Q|L)2 [c] {s} x (SHL(Q|L)const [1] y)) => (LEA(Q|L)4 [c] {s} x y) +(LEA(Q|L)2 [c] {s} x (SHL(Q|L)const [2] y)) => (LEA(Q|L)8 [c] {s} x y) +(LEA(Q|L)4 [c] {s} x (SHL(Q|L)const [1] y)) => (LEA(Q|L)8 [c] {s} x y) // reverse ordering of compare instruction -(SETL (InvertFlags x)) -> (SETG x) -(SETG (InvertFlags x)) -> (SETL x) -(SETB (InvertFlags x)) -> (SETA x) -(SETA (InvertFlags x)) -> (SETB x) -(SETLE (InvertFlags x)) -> (SETGE x) -(SETGE (InvertFlags x)) -> (SETLE x) -(SETBE (InvertFlags x)) -> (SETAE x) -(SETAE (InvertFlags x)) -> (SETBE x) -(SETEQ (InvertFlags x)) -> (SETEQ x) -(SETNE (InvertFlags x)) -> (SETNE x) - -(SETLstore [off] {sym} ptr (InvertFlags x) mem) -> (SETGstore [off] {sym} ptr x mem) -(SETGstore [off] {sym} ptr (InvertFlags x) mem) -> (SETLstore [off] {sym} ptr x mem) -(SETBstore [off] {sym} ptr (InvertFlags x) mem) -> (SETAstore [off] {sym} ptr x mem) -(SETAstore [off] {sym} ptr (InvertFlags x) mem) -> (SETBstore [off] {sym} ptr x mem) -(SETLEstore [off] {sym} ptr (InvertFlags x) mem) -> (SETGEstore [off] {sym} ptr x mem) -(SETGEstore [off] {sym} ptr (InvertFlags x) mem) -> (SETLEstore [off] {sym} ptr x mem) -(SETBEstore [off] {sym} ptr (InvertFlags x) mem) -> (SETAEstore [off] {sym} ptr x mem) -(SETAEstore [off] {sym} ptr (InvertFlags x) mem) -> (SETBEstore [off] {sym} ptr x mem) -(SETEQstore [off] {sym} ptr (InvertFlags x) mem) -> (SETEQstore [off] {sym} ptr x mem) -(SETNEstore [off] {sym} ptr (InvertFlags x) mem) -> (SETNEstore [off] {sym} ptr x mem) +(SETL (InvertFlags x)) => (SETG x) +(SETG (InvertFlags x)) => (SETL x) +(SETB (InvertFlags x)) => (SETA x) +(SETA (InvertFlags x)) => (SETB x) +(SETLE (InvertFlags x)) => (SETGE x) +(SETGE (InvertFlags x)) => (SETLE x) +(SETBE (InvertFlags x)) => (SETAE x) +(SETAE (InvertFlags x)) => (SETBE x) +(SETEQ (InvertFlags x)) => (SETEQ x) +(SETNE (InvertFlags x)) => (SETNE x) + +(SETLstore [off] {sym} ptr (InvertFlags x) mem) => (SETGstore [off] {sym} ptr x mem) +(SETGstore [off] {sym} ptr (InvertFlags x) mem) => (SETLstore [off] {sym} ptr x mem) +(SETBstore [off] {sym} ptr (InvertFlags x) mem) => (SETAstore [off] {sym} ptr x mem) +(SETAstore [off] {sym} ptr (InvertFlags x) mem) => (SETBstore [off] {sym} ptr x mem) +(SETLEstore [off] {sym} ptr (InvertFlags x) mem) => (SETGEstore [off] {sym} ptr x mem) +(SETGEstore [off] {sym} ptr (InvertFlags x) mem) => (SETLEstore [off] {sym} ptr x mem) +(SETBEstore [off] {sym} ptr (InvertFlags x) mem) => (SETAEstore [off] {sym} ptr x mem) +(SETAEstore [off] {sym} ptr (InvertFlags x) mem) => (SETBEstore [off] {sym} ptr x mem) +(SETEQstore [off] {sym} ptr (InvertFlags x) mem) => (SETEQstore [off] {sym} ptr x mem) +(SETNEstore [off] {sym} ptr (InvertFlags x) mem) => (SETNEstore [off] {sym} ptr x mem) // sign extended loads // Note: The combined instruction must end up in the same block @@ -1029,100 +1036,100 @@ // Make sure we don't combine these ops if the load has another use. // This prevents a single load from being split into multiple loads // which then might return different values. See test/atomicload.go. -(MOVBQSX x:(MOVBload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVBQSXload [off] {sym} ptr mem) -(MOVBQSX x:(MOVWload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVBQSXload [off] {sym} ptr mem) -(MOVBQSX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVBQSXload [off] {sym} ptr mem) -(MOVBQSX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVBQSXload [off] {sym} ptr mem) -(MOVBQZX x:(MOVBload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVBload [off] {sym} ptr mem) -(MOVBQZX x:(MOVWload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVBload [off] {sym} ptr mem) -(MOVBQZX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVBload [off] {sym} ptr mem) -(MOVBQZX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVBload [off] {sym} ptr mem) -(MOVWQSX x:(MOVWload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVWQSXload [off] {sym} ptr mem) -(MOVWQSX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVWQSXload [off] {sym} ptr mem) -(MOVWQSX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVWQSXload [off] {sym} ptr mem) -(MOVWQZX x:(MOVWload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVWload [off] {sym} ptr mem) -(MOVWQZX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVWload [off] {sym} ptr mem) -(MOVWQZX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVWload [off] {sym} ptr mem) -(MOVLQSX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVLQSXload [off] {sym} ptr mem) -(MOVLQSX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVLQSXload [off] {sym} ptr mem) -(MOVLQZX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVLload [off] {sym} ptr mem) -(MOVLQZX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) -> @x.Block (MOVLload [off] {sym} ptr mem) - -(MOVLQZX x) && zeroUpper32Bits(x,3) -> x -(MOVWQZX x) && zeroUpper48Bits(x,3) -> x -(MOVBQZX x) && zeroUpper56Bits(x,3) -> x +(MOVBQSX x:(MOVBload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVBQSXload [off] {sym} ptr mem) +(MOVBQSX x:(MOVWload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVBQSXload [off] {sym} ptr mem) +(MOVBQSX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVBQSXload [off] {sym} ptr mem) +(MOVBQSX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVBQSXload [off] {sym} ptr mem) +(MOVBQZX x:(MOVBload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVBload [off] {sym} ptr mem) +(MOVBQZX x:(MOVWload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVBload [off] {sym} ptr mem) +(MOVBQZX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVBload [off] {sym} ptr mem) +(MOVBQZX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVBload [off] {sym} ptr mem) +(MOVWQSX x:(MOVWload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVWQSXload [off] {sym} ptr mem) +(MOVWQSX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVWQSXload [off] {sym} ptr mem) +(MOVWQSX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVWQSXload [off] {sym} ptr mem) +(MOVWQZX x:(MOVWload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVWload [off] {sym} ptr mem) +(MOVWQZX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVWload [off] {sym} ptr mem) +(MOVWQZX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVWload [off] {sym} ptr mem) +(MOVLQSX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVLQSXload [off] {sym} ptr mem) +(MOVLQSX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVLQSXload [off] {sym} ptr mem) +(MOVLQZX x:(MOVLload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVLload [off] {sym} ptr mem) +(MOVLQZX x:(MOVQload [off] {sym} ptr mem)) && x.Uses == 1 && clobber(x) => @x.Block (MOVLload [off] {sym} ptr mem) + +(MOVLQZX x) && zeroUpper32Bits(x,3) => x +(MOVWQZX x) && zeroUpper48Bits(x,3) => x +(MOVBQZX x) && zeroUpper56Bits(x,3) => x // replace load from same location as preceding store with zero/sign extension (or copy in case of full width) -(MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVBQZX x) -(MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVWQZX x) -(MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVLQZX x) -(MOVQload [off] {sym} ptr (MOVQstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> x -(MOVBQSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVBQSX x) -(MOVWQSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVWQSX x) -(MOVLQSXload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) -> (MOVLQSX x) +(MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVBQZX x) +(MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVWQZX x) +(MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVLQZX x) +(MOVQload [off] {sym} ptr (MOVQstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => x +(MOVBQSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVBQSX x) +(MOVWQSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVWQSX x) +(MOVLQSXload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) && sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) => (MOVLQSX x) // Fold extensions and ANDs together. -(MOVBQZX (ANDLconst [c] x)) -> (ANDLconst [c & 0xff] x) -(MOVWQZX (ANDLconst [c] x)) -> (ANDLconst [c & 0xffff] x) -(MOVLQZX (ANDLconst [c] x)) -> (ANDLconst [c] x) -(MOVBQSX (ANDLconst [c] x)) && c & 0x80 == 0 -> (ANDLconst [c & 0x7f] x) -(MOVWQSX (ANDLconst [c] x)) && c & 0x8000 == 0 -> (ANDLconst [c & 0x7fff] x) -(MOVLQSX (ANDLconst [c] x)) && c & 0x80000000 == 0 -> (ANDLconst [c & 0x7fffffff] x) +(MOVBQZX (ANDLconst [c] x)) => (ANDLconst [c & 0xff] x) +(MOVWQZX (ANDLconst [c] x)) => (ANDLconst [c & 0xffff] x) +(MOVLQZX (ANDLconst [c] x)) => (ANDLconst [c] x) +(MOVBQSX (ANDLconst [c] x)) && c & 0x80 == 0 => (ANDLconst [c & 0x7f] x) +(MOVWQSX (ANDLconst [c] x)) && c & 0x8000 == 0 => (ANDLconst [c & 0x7fff] x) +(MOVLQSX (ANDLconst [c] x)) && uint32(c) & 0x80000000 == 0 => (ANDLconst [c & 0x7fffffff] x) // Don't extend before storing -(MOVLstore [off] {sym} ptr (MOVLQSX x) mem) -> (MOVLstore [off] {sym} ptr x mem) -(MOVWstore [off] {sym} ptr (MOVWQSX x) mem) -> (MOVWstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr (MOVBQSX x) mem) -> (MOVBstore [off] {sym} ptr x mem) -(MOVLstore [off] {sym} ptr (MOVLQZX x) mem) -> (MOVLstore [off] {sym} ptr x mem) -(MOVWstore [off] {sym} ptr (MOVWQZX x) mem) -> (MOVWstore [off] {sym} ptr x mem) -(MOVBstore [off] {sym} ptr (MOVBQZX x) mem) -> (MOVBstore [off] {sym} ptr x mem) +(MOVLstore [off] {sym} ptr (MOVLQSX x) mem) => (MOVLstore [off] {sym} ptr x mem) +(MOVWstore [off] {sym} ptr (MOVWQSX x) mem) => (MOVWstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr (MOVBQSX x) mem) => (MOVBstore [off] {sym} ptr x mem) +(MOVLstore [off] {sym} ptr (MOVLQZX x) mem) => (MOVLstore [off] {sym} ptr x mem) +(MOVWstore [off] {sym} ptr (MOVWQZX x) mem) => (MOVWstore [off] {sym} ptr x mem) +(MOVBstore [off] {sym} ptr (MOVBQZX x) mem) => (MOVBstore [off] {sym} ptr x mem) // fold constants into memory operations // Note that this is not always a good idea because if not all the uses of // the ADDQconst get eliminated, we still have to compute the ADDQconst and we now // have potentially two live values (ptr and (ADDQconst [off] ptr)) instead of one. // Nevertheless, let's do it! -(MOV(Q|L|W|B|SS|SD|O)load [off1] {sym} (ADDQconst [off2] ptr) mem) && is32Bit(off1+off2) -> +(MOV(Q|L|W|B|SS|SD|O)load [off1] {sym} (ADDQconst [off2] ptr) mem) && is32Bit(int64(off1)+int64(off2)) => (MOV(Q|L|W|B|SS|SD|O)load [off1+off2] {sym} ptr mem) -(MOV(Q|L|W|B|SS|SD|O)store [off1] {sym} (ADDQconst [off2] ptr) val mem) && is32Bit(off1+off2) -> +(MOV(Q|L|W|B|SS|SD|O)store [off1] {sym} (ADDQconst [off2] ptr) val mem) && is32Bit(int64(off1)+int64(off2)) => (MOV(Q|L|W|B|SS|SD|O)store [off1+off2] {sym} ptr val mem) -(SET(L|G|B|A|LE|GE|BE|AE|EQ|NE)store [off1] {sym} (ADDQconst [off2] base) val mem) && is32Bit(off1+off2) -> +(SET(L|G|B|A|LE|GE|BE|AE|EQ|NE)store [off1] {sym} (ADDQconst [off2] base) val mem) && is32Bit(int64(off1)+int64(off2)) => (SET(L|G|B|A|LE|GE|BE|AE|EQ|NE)store [off1+off2] {sym} base val mem) -((ADD|SUB|AND|OR|XOR)Qload [off1] {sym} val (ADDQconst [off2] base) mem) && is32Bit(off1+off2) -> +((ADD|SUB|AND|OR|XOR)Qload [off1] {sym} val (ADDQconst [off2] base) mem) && is32Bit(int64(off1)+int64(off2)) => ((ADD|SUB|AND|OR|XOR)Qload [off1+off2] {sym} val base mem) -((ADD|SUB|AND|OR|XOR)Lload [off1] {sym} val (ADDQconst [off2] base) mem) && is32Bit(off1+off2) -> +((ADD|SUB|AND|OR|XOR)Lload [off1] {sym} val (ADDQconst [off2] base) mem) && is32Bit(int64(off1)+int64(off2)) => ((ADD|SUB|AND|OR|XOR)Lload [off1+off2] {sym} val base mem) -(CMP(Q|L|W|B)load [off1] {sym} (ADDQconst [off2] base) val mem) && is32Bit(off1+off2) -> +(CMP(Q|L|W|B)load [off1] {sym} (ADDQconst [off2] base) val mem) && is32Bit(int64(off1)+int64(off2)) => (CMP(Q|L|W|B)load [off1+off2] {sym} base val mem) -(CMP(Q|L|W|B)constload [valoff1] {sym} (ADDQconst [off2] base) mem) && ValAndOff(valoff1).canAdd(off2) -> - (CMP(Q|L|W|B)constload [ValAndOff(valoff1).add(off2)] {sym} base mem) +(CMP(Q|L|W|B)constload [valoff1] {sym} (ADDQconst [off2] base) mem) && ValAndOff(valoff1).canAdd32(off2) => + (CMP(Q|L|W|B)constload [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) -((ADD|SUB|MUL|DIV)SSload [off1] {sym} val (ADDQconst [off2] base) mem) && is32Bit(off1+off2) -> +((ADD|SUB|MUL|DIV)SSload [off1] {sym} val (ADDQconst [off2] base) mem) && is32Bit(int64(off1)+int64(off2)) => ((ADD|SUB|MUL|DIV)SSload [off1+off2] {sym} val base mem) -((ADD|SUB|MUL|DIV)SDload [off1] {sym} val (ADDQconst [off2] base) mem) && is32Bit(off1+off2) -> +((ADD|SUB|MUL|DIV)SDload [off1] {sym} val (ADDQconst [off2] base) mem) && is32Bit(int64(off1)+int64(off2)) => ((ADD|SUB|MUL|DIV)SDload [off1+off2] {sym} val base mem) -((ADD|AND|OR|XOR|BTC|BTR|BTS)Qconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) && ValAndOff(valoff1).canAdd(off2) -> - ((ADD|AND|OR|XOR|BTC|BTR|BTS)Qconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) -((ADD|AND|OR|XOR|BTC|BTR|BTS)Lconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) && ValAndOff(valoff1).canAdd(off2) -> - ((ADD|AND|OR|XOR|BTC|BTR|BTS)Lconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) -((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Qmodify [off1] {sym} (ADDQconst [off2] base) val mem) && is32Bit(off1+off2) -> +((ADD|AND|OR|XOR|BTC|BTR|BTS)Qconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) && ValAndOff(valoff1).canAdd32(off2) => + ((ADD|AND|OR|XOR|BTC|BTR|BTS)Qconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) +((ADD|AND|OR|XOR|BTC|BTR|BTS)Lconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) && ValAndOff(valoff1).canAdd32(off2) => + ((ADD|AND|OR|XOR|BTC|BTR|BTS)Lconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) +((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Qmodify [off1] {sym} (ADDQconst [off2] base) val mem) && is32Bit(int64(off1)+int64(off2)) => ((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Qmodify [off1+off2] {sym} base val mem) -((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Lmodify [off1] {sym} (ADDQconst [off2] base) val mem) && is32Bit(off1+off2) -> +((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Lmodify [off1] {sym} (ADDQconst [off2] base) val mem) && is32Bit(int64(off1)+int64(off2)) => ((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Lmodify [off1+off2] {sym} base val mem) // Fold constants into stores. -(MOVQstore [off] {sym} ptr (MOVQconst [c]) mem) && validValAndOff(c,off) -> - (MOVQstoreconst [makeValAndOff(c,off)] {sym} ptr mem) -(MOVLstore [off] {sym} ptr (MOV(L|Q)const [c]) mem) && validOff(off) -> - (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) -(MOVWstore [off] {sym} ptr (MOV(L|Q)const [c]) mem) && validOff(off) -> - (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) -(MOVBstore [off] {sym} ptr (MOV(L|Q)const [c]) mem) && validOff(off) -> - (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) +(MOVQstore [off] {sym} ptr (MOVQconst [c]) mem) && validVal(c) => + (MOVQstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) +(MOVLstore [off] {sym} ptr (MOV(L|Q)const [c]) mem) => + (MOVLstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) +(MOVWstore [off] {sym} ptr (MOV(L|Q)const [c]) mem) => + (MOVWstoreconst [makeValAndOff32(int32(int16(c)),off)] {sym} ptr mem) +(MOVBstore [off] {sym} ptr (MOV(L|Q)const [c]) mem) => + (MOVBstoreconst [makeValAndOff32(int32(int8(c)),off)] {sym} ptr mem) // Fold address offsets into constant stores. -(MOV(Q|L|W|B)storeconst [sc] {s} (ADDQconst [off] ptr) mem) && ValAndOff(sc).canAdd(off) -> - (MOV(Q|L|W|B)storeconst [ValAndOff(sc).add(off)] {s} ptr mem) +(MOV(Q|L|W|B)storeconst [sc] {s} (ADDQconst [off] ptr) mem) && ValAndOff(sc).canAdd32(off) => + (MOV(Q|L|W|B)storeconst [ValAndOff(sc).addOffset32(off)] {s} ptr mem) // We need to fold LEAQ into the MOVx ops so that the live variable analysis knows // what variables are being read/written by the ops. diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index cda9df56f4..89d64052fe 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -1245,9 +1245,9 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { continue } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ADDLconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -1261,17 +1261,17 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRLconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 32-c) { continue } v.reset(OpAMD64ROLLconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -1286,17 +1286,17 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRWconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { continue } v.reset(OpAMD64ROLWconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -1311,17 +1311,17 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRBconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { continue } v.reset(OpAMD64ROLBconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -1332,7 +1332,7 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 3 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 3 { continue } y := v_1.Args[0] @@ -1347,7 +1347,7 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 2 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 2 { continue } y := v_1.Args[0] @@ -1362,7 +1362,7 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 1 { continue } y := v_1.Args[0] @@ -1420,11 +1420,11 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { if v_0.Op != OpAMD64ADDLconst { continue } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 v.reset(OpAMD64LEAL1) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg2(x, y) return true } @@ -1439,15 +1439,15 @@ func rewriteValueAMD64_OpAMD64ADDL(v *Value) bool { if v_1.Op != OpAMD64LEAL { continue } - c := v_1.AuxInt - s := v_1.Aux + c := auxIntToInt32(v_1.AuxInt) + s := auxToSym(v_1.Aux) y := v_1.Args[0] if !(x.Op != OpSB && y.Op != OpSB) { continue } v.reset(OpAMD64LEAL1) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -1500,131 +1500,131 @@ func rewriteValueAMD64_OpAMD64ADDLconst(v *Value) bool { // match: (ADDLconst [c] (ADDL x y)) // result: (LEAL1 [c] x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64ADDL { break } y := v_0.Args[1] x := v_0.Args[0] v.reset(OpAMD64LEAL1) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg2(x, y) return true } // match: (ADDLconst [c] (SHLLconst [1] x)) // result: (LEAL1 [c] x x) for { - c := v.AuxInt - if v_0.Op != OpAMD64SHLLconst || v_0.AuxInt != 1 { + c := auxIntToInt32(v.AuxInt) + if v_0.Op != OpAMD64SHLLconst || auxIntToInt8(v_0.AuxInt) != 1 { break } x := v_0.Args[0] v.reset(OpAMD64LEAL1) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg2(x, x) return true } // match: (ADDLconst [c] (LEAL [d] {s} x)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAL [c+d] {s} x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAL { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAL) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg(x) return true } // match: (ADDLconst [c] (LEAL1 [d] {s} x y)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAL1 [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAL1 { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAL1) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (ADDLconst [c] (LEAL2 [d] {s} x y)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAL2 [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAL2 { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAL2) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (ADDLconst [c] (LEAL4 [d] {s} x y)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAL4 [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAL4 { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAL4) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (ADDLconst [c] (LEAL8 [d] {s} x y)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAL8 [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAL8 { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAL8) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -1685,23 +1685,23 @@ func rewriteValueAMD64_OpAMD64ADDLconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ADDLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ADDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (ADDLconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64ADDLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -1736,24 +1736,24 @@ func rewriteValueAMD64_OpAMD64ADDLload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ADDLload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ADDLload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ADDLload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -1807,24 +1807,24 @@ func rewriteValueAMD64_OpAMD64ADDLmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ADDLmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ADDLmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ADDLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -1858,39 +1858,35 @@ func rewriteValueAMD64_OpAMD64ADDQ(v *Value) bool { v_0 := v.Args[0] // match: (ADDQ x (MOVQconst [c])) // cond: is32Bit(c) - // result: (ADDQconst [c] x) + // result: (ADDQconst [int32(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 != OpAMD64MOVQconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { continue } v.reset(OpAMD64ADDQconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } break } // match: (ADDQ x (MOVLconst [c])) - // cond: is32Bit(c) - // result: (ADDQconst [int64(int32(c))] x) + // result: (ADDQconst [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 != OpAMD64MOVLconst { continue } - c := v_1.AuxInt - if !(is32Bit(c)) { - continue - } + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ADDQconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -1904,17 +1900,17 @@ func rewriteValueAMD64_OpAMD64ADDQ(v *Value) bool { if v_0.Op != OpAMD64SHLQconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRQconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 64-c) { continue } v.reset(OpAMD64ROLQconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -1925,7 +1921,7 @@ func rewriteValueAMD64_OpAMD64ADDQ(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 3 { continue } y := v_1.Args[0] @@ -1940,7 +1936,7 @@ func rewriteValueAMD64_OpAMD64ADDQ(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 2 { continue } y := v_1.Args[0] @@ -1955,7 +1951,7 @@ func rewriteValueAMD64_OpAMD64ADDQ(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 1 { continue } y := v_1.Args[0] @@ -2013,11 +2009,11 @@ func rewriteValueAMD64_OpAMD64ADDQ(v *Value) bool { if v_0.Op != OpAMD64ADDQconst { continue } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 v.reset(OpAMD64LEAQ1) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg2(x, y) return true } @@ -2032,15 +2028,15 @@ func rewriteValueAMD64_OpAMD64ADDQ(v *Value) bool { if v_1.Op != OpAMD64LEAQ { continue } - c := v_1.AuxInt - s := v_1.Aux + c := auxIntToInt32(v_1.AuxInt) + s := auxToSym(v_1.Aux) y := v_1.Args[0] if !(x.Op != OpSB && y.Op != OpSB) { continue } v.reset(OpAMD64LEAQ1) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -2118,131 +2114,131 @@ func rewriteValueAMD64_OpAMD64ADDQconst(v *Value) bool { // match: (ADDQconst [c] (ADDQ x y)) // result: (LEAQ1 [c] x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64ADDQ { break } y := v_0.Args[1] x := v_0.Args[0] v.reset(OpAMD64LEAQ1) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg2(x, y) return true } // match: (ADDQconst [c] (SHLQconst [1] x)) // result: (LEAQ1 [c] x x) for { - c := v.AuxInt - if v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 1 { + c := auxIntToInt32(v.AuxInt) + if v_0.Op != OpAMD64SHLQconst || auxIntToInt8(v_0.AuxInt) != 1 { break } x := v_0.Args[0] v.reset(OpAMD64LEAQ1) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg2(x, x) return true } // match: (ADDQconst [c] (LEAQ [d] {s} x)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAQ [c+d] {s} x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAQ { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAQ) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg(x) return true } // match: (ADDQconst [c] (LEAQ1 [d] {s} x y)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAQ1 [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAQ1 { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAQ1) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (ADDQconst [c] (LEAQ2 [d] {s} x y)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAQ2 [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAQ2 { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAQ2) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (ADDQconst [c] (LEAQ4 [d] {s} x y)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAQ4 [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAQ4 { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAQ4) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (ADDQconst [c] (LEAQ8 [d] {s} x y)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAQ8 [c+d] {s} x y) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64LEAQ8 { break } - d := v_0.AuxInt - s := v_0.Aux + d := auxIntToInt32(v_0.AuxInt) + s := auxToSym(v_0.Aux) y := v_0.Args[1] x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAQ8) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -2305,23 +2301,23 @@ func rewriteValueAMD64_OpAMD64ADDQconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ADDQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ADDQconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (ADDQconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64ADDQconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -2356,24 +2352,24 @@ func rewriteValueAMD64_OpAMD64ADDQload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ADDQload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ADDQload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ADDQload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -2427,24 +2423,24 @@ func rewriteValueAMD64_OpAMD64ADDQmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ADDQmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ADDQmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ADDQmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -2510,24 +2506,24 @@ func rewriteValueAMD64_OpAMD64ADDSDload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ADDSDload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ADDSDload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ADDSDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -2613,24 +2609,24 @@ func rewriteValueAMD64_OpAMD64ADDSSload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ADDSSload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ADDSSload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ADDSSload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -2695,7 +2691,7 @@ func rewriteValueAMD64_OpAMD64ANDL(v *Value) bool { } y := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_0_0_0.AuxInt) != 1 { continue } x := v_1 @@ -2706,20 +2702,20 @@ func rewriteValueAMD64_OpAMD64ANDL(v *Value) bool { break } // match: (ANDL (MOVLconst [c]) x) - // cond: isUint32PowerOfTwo(^c) && uint64(^c) >= 128 - // result: (BTRLconst [log2uint32(^c)] x) + // cond: isUint32PowerOfTwo(int64(^c)) && uint64(^c) >= 128 + // result: (BTRLconst [int8(log32(^c))] x) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpAMD64MOVLconst { continue } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_1 - if !(isUint32PowerOfTwo(^c) && uint64(^c) >= 128) { + if !(isUint32PowerOfTwo(int64(^c)) && uint64(^c) >= 128) { continue } v.reset(OpAMD64BTRLconst) - v.AuxInt = log2uint32(^c) + v.AuxInt = int8ToAuxInt(int8(log32(^c))) v.AddArg(x) return true } @@ -2733,9 +2729,9 @@ func rewriteValueAMD64_OpAMD64ANDL(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { continue } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ANDLconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -2781,16 +2777,16 @@ func rewriteValueAMD64_OpAMD64ANDL(v *Value) bool { func rewriteValueAMD64_OpAMD64ANDLconst(v *Value) bool { v_0 := v.Args[0] // match: (ANDLconst [c] x) - // cond: isUint32PowerOfTwo(^c) && uint64(^c) >= 128 - // result: (BTRLconst [log2uint32(^c)] x) + // cond: isUint32PowerOfTwo(int64(^c)) && uint64(^c) >= 128 + // result: (BTRLconst [int8(log32(^c))] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isUint32PowerOfTwo(^c) && uint64(^c) >= 128) { + if !(isUint32PowerOfTwo(int64(^c)) && uint64(^c) >= 128) { break } v.reset(OpAMD64BTRLconst) - v.AuxInt = log2uint32(^c) + v.AuxInt = int8ToAuxInt(int8(log32(^c))) v.AddArg(x) return true } @@ -2825,7 +2821,7 @@ func rewriteValueAMD64_OpAMD64ANDLconst(v *Value) bool { // match: (ANDLconst [ 0xFF] x) // result: (MOVBQZX x) for { - if v.AuxInt != 0xFF { + if auxIntToInt32(v.AuxInt) != 0xFF { break } x := v_0 @@ -2836,7 +2832,7 @@ func rewriteValueAMD64_OpAMD64ANDLconst(v *Value) bool { // match: (ANDLconst [0xFFFF] x) // result: (MOVWQZX x) for { - if v.AuxInt != 0xFFFF { + if auxIntToInt32(v.AuxInt) != 0xFFFF { break } x := v_0 @@ -2886,23 +2882,23 @@ func rewriteValueAMD64_OpAMD64ANDLconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ANDLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ANDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (ANDLconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64ANDLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -2937,24 +2933,24 @@ func rewriteValueAMD64_OpAMD64ANDLload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ANDLload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ANDLload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ANDLload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -3008,24 +3004,24 @@ func rewriteValueAMD64_OpAMD64ANDLmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ANDLmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ANDLmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ANDLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -3070,7 +3066,7 @@ func rewriteValueAMD64_OpAMD64ANDQ(v *Value) bool { } y := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { continue } x := v_1 @@ -3082,19 +3078,19 @@ func rewriteValueAMD64_OpAMD64ANDQ(v *Value) bool { } // match: (ANDQ (MOVQconst [c]) x) // cond: isUint64PowerOfTwo(^c) && uint64(^c) >= 128 - // result: (BTRQconst [log2(^c)] x) + // result: (BTRQconst [int8(log2(^c))] x) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpAMD64MOVQconst { continue } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 if !(isUint64PowerOfTwo(^c) && uint64(^c) >= 128) { continue } v.reset(OpAMD64BTRQconst) - v.AuxInt = log2(^c) + v.AuxInt = int8ToAuxInt(int8(log2(^c))) v.AddArg(x) return true } @@ -3102,19 +3098,19 @@ func rewriteValueAMD64_OpAMD64ANDQ(v *Value) bool { } // match: (ANDQ x (MOVQconst [c])) // cond: is32Bit(c) - // result: (ANDQconst [c] x) + // result: (ANDQconst [int32(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 != OpAMD64MOVQconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { continue } v.reset(OpAMD64ANDQconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -3160,16 +3156,16 @@ func rewriteValueAMD64_OpAMD64ANDQ(v *Value) bool { func rewriteValueAMD64_OpAMD64ANDQconst(v *Value) bool { v_0 := v.Args[0] // match: (ANDQconst [c] x) - // cond: isUint64PowerOfTwo(^c) && uint64(^c) >= 128 - // result: (BTRQconst [log2(^c)] x) + // cond: isUint64PowerOfTwo(int64(^c)) && uint64(^c) >= 128 + // result: (BTRQconst [int8(log32(^c))] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isUint64PowerOfTwo(^c) && uint64(^c) >= 128) { + if !(isUint64PowerOfTwo(int64(^c)) && uint64(^c) >= 128) { break } v.reset(OpAMD64BTRQconst) - v.AuxInt = log2(^c) + v.AuxInt = int8ToAuxInt(int8(log32(^c))) v.AddArg(x) return true } @@ -3208,7 +3204,7 @@ func rewriteValueAMD64_OpAMD64ANDQconst(v *Value) bool { // match: (ANDQconst [ 0xFF] x) // result: (MOVBQZX x) for { - if v.AuxInt != 0xFF { + if auxIntToInt32(v.AuxInt) != 0xFF { break } x := v_0 @@ -3219,7 +3215,7 @@ func rewriteValueAMD64_OpAMD64ANDQconst(v *Value) bool { // match: (ANDQconst [0xFFFF] x) // result: (MOVWQZX x) for { - if v.AuxInt != 0xFFFF { + if auxIntToInt32(v.AuxInt) != 0xFFFF { break } x := v_0 @@ -3227,17 +3223,6 @@ func rewriteValueAMD64_OpAMD64ANDQconst(v *Value) bool { v.AddArg(x) return true } - // match: (ANDQconst [0xFFFFFFFF] x) - // result: (MOVLQZX x) - for { - if v.AuxInt != 0xFFFFFFFF { - break - } - x := v_0 - v.reset(OpAMD64MOVLQZX) - v.AddArg(x) - return true - } // match: (ANDQconst [0] _) // result: (MOVQconst [0]) for { @@ -3276,23 +3261,23 @@ func rewriteValueAMD64_OpAMD64ANDQconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ANDQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ANDQconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (ANDQconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64ANDQconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -3327,24 +3312,24 @@ func rewriteValueAMD64_OpAMD64ANDQload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ANDQload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ANDQload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ANDQload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -3398,24 +3383,24 @@ func rewriteValueAMD64_OpAMD64ANDQmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ANDQmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ANDQmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ANDQmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -3541,23 +3526,23 @@ func rewriteValueAMD64_OpAMD64BTCLconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTCLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (BTCLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (BTCLconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64BTCLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -3590,24 +3575,24 @@ func rewriteValueAMD64_OpAMD64BTCLmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTCLmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (BTCLmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64BTCLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -3692,23 +3677,23 @@ func rewriteValueAMD64_OpAMD64BTCQconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTCQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (BTCQconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (BTCQconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64BTCQconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -3741,24 +3726,24 @@ func rewriteValueAMD64_OpAMD64BTCQmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTCQmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (BTCQmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64BTCQmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -3793,17 +3778,17 @@ func rewriteValueAMD64_OpAMD64BTLconst(v *Value) bool { // cond: (c+d)<64 // result: (BTQconst [c+d] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64SHRQconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if !((c + d) < 64) { break } v.reset(OpAMD64BTQconst) - v.AuxInt = c + d + v.AuxInt = int8ToAuxInt(c + d) v.AddArg(x) return true } @@ -3811,24 +3796,24 @@ func rewriteValueAMD64_OpAMD64BTLconst(v *Value) bool { // cond: c>d // result: (BTLconst [c-d] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64SHLQconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if !(c > d) { break } v.reset(OpAMD64BTLconst) - v.AuxInt = c - d + v.AuxInt = int8ToAuxInt(c - d) v.AddArg(x) return true } // match: (BTLconst [0] s:(SHRQ x y)) // result: (BTQ y x) for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } s := v_0 @@ -3845,17 +3830,17 @@ func rewriteValueAMD64_OpAMD64BTLconst(v *Value) bool { // cond: (c+d)<32 // result: (BTLconst [c+d] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64SHRLconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if !((c + d) < 32) { break } v.reset(OpAMD64BTLconst) - v.AuxInt = c + d + v.AuxInt = int8ToAuxInt(c + d) v.AddArg(x) return true } @@ -3863,24 +3848,24 @@ func rewriteValueAMD64_OpAMD64BTLconst(v *Value) bool { // cond: c>d // result: (BTLconst [c-d] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64SHLLconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if !(c > d) { break } v.reset(OpAMD64BTLconst) - v.AuxInt = c - d + v.AuxInt = int8ToAuxInt(c - d) v.AddArg(x) return true } // match: (BTLconst [0] s:(SHRL x y)) // result: (BTL y x) for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } s := v_0 @@ -3901,17 +3886,17 @@ func rewriteValueAMD64_OpAMD64BTQconst(v *Value) bool { // cond: (c+d)<64 // result: (BTQconst [c+d] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64SHRQconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if !((c + d) < 64) { break } v.reset(OpAMD64BTQconst) - v.AuxInt = c + d + v.AuxInt = int8ToAuxInt(c + d) v.AddArg(x) return true } @@ -3919,24 +3904,24 @@ func rewriteValueAMD64_OpAMD64BTQconst(v *Value) bool { // cond: c>d // result: (BTQconst [c-d] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64SHLQconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if !(c > d) { break } v.reset(OpAMD64BTQconst) - v.AuxInt = c - d + v.AuxInt = int8ToAuxInt(c - d) v.AddArg(x) return true } // match: (BTQconst [0] s:(SHRQ x y)) // result: (BTQ y x) for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } s := v_0 @@ -3956,26 +3941,26 @@ func rewriteValueAMD64_OpAMD64BTRLconst(v *Value) bool { // match: (BTRLconst [c] (BTSLconst [c] x)) // result: (BTRLconst [c] x) for { - c := v.AuxInt - if v_0.Op != OpAMD64BTSLconst || v_0.AuxInt != c { + c := auxIntToInt8(v.AuxInt) + if v_0.Op != OpAMD64BTSLconst || auxIntToInt8(v_0.AuxInt) != c { break } x := v_0.Args[0] v.reset(OpAMD64BTRLconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } // match: (BTRLconst [c] (BTCLconst [c] x)) // result: (BTRLconst [c] x) for { - c := v.AuxInt - if v_0.Op != OpAMD64BTCLconst || v_0.AuxInt != c { + c := auxIntToInt8(v.AuxInt) + if v_0.Op != OpAMD64BTCLconst || auxIntToInt8(v_0.AuxInt) != c { break } x := v_0.Args[0] v.reset(OpAMD64BTRLconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -4025,23 +4010,23 @@ func rewriteValueAMD64_OpAMD64BTRLconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTRLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (BTRLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (BTRLconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64BTRLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -4074,24 +4059,24 @@ func rewriteValueAMD64_OpAMD64BTRLmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTRLmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (BTRLmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64BTRLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -4125,26 +4110,26 @@ func rewriteValueAMD64_OpAMD64BTRQconst(v *Value) bool { // match: (BTRQconst [c] (BTSQconst [c] x)) // result: (BTRQconst [c] x) for { - c := v.AuxInt - if v_0.Op != OpAMD64BTSQconst || v_0.AuxInt != c { + c := auxIntToInt8(v.AuxInt) + if v_0.Op != OpAMD64BTSQconst || auxIntToInt8(v_0.AuxInt) != c { break } x := v_0.Args[0] v.reset(OpAMD64BTRQconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } // match: (BTRQconst [c] (BTCQconst [c] x)) // result: (BTRQconst [c] x) for { - c := v.AuxInt - if v_0.Op != OpAMD64BTCQconst || v_0.AuxInt != c { + c := auxIntToInt8(v.AuxInt) + if v_0.Op != OpAMD64BTCQconst || auxIntToInt8(v_0.AuxInt) != c { break } x := v_0.Args[0] v.reset(OpAMD64BTRQconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -4202,23 +4187,23 @@ func rewriteValueAMD64_OpAMD64BTRQconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTRQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (BTRQconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (BTRQconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64BTRQconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -4251,24 +4236,24 @@ func rewriteValueAMD64_OpAMD64BTRQmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTRQmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (BTRQmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64BTRQmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -4302,26 +4287,26 @@ func rewriteValueAMD64_OpAMD64BTSLconst(v *Value) bool { // match: (BTSLconst [c] (BTRLconst [c] x)) // result: (BTSLconst [c] x) for { - c := v.AuxInt - if v_0.Op != OpAMD64BTRLconst || v_0.AuxInt != c { + c := auxIntToInt8(v.AuxInt) + if v_0.Op != OpAMD64BTRLconst || auxIntToInt8(v_0.AuxInt) != c { break } x := v_0.Args[0] v.reset(OpAMD64BTSLconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } // match: (BTSLconst [c] (BTCLconst [c] x)) // result: (BTSLconst [c] x) for { - c := v.AuxInt - if v_0.Op != OpAMD64BTCLconst || v_0.AuxInt != c { + c := auxIntToInt8(v.AuxInt) + if v_0.Op != OpAMD64BTCLconst || auxIntToInt8(v_0.AuxInt) != c { break } x := v_0.Args[0] v.reset(OpAMD64BTSLconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -4371,23 +4356,23 @@ func rewriteValueAMD64_OpAMD64BTSLconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTSLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (BTSLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (BTSLconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64BTSLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -4420,24 +4405,24 @@ func rewriteValueAMD64_OpAMD64BTSLmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTSLmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (BTSLmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64BTSLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -4471,26 +4456,26 @@ func rewriteValueAMD64_OpAMD64BTSQconst(v *Value) bool { // match: (BTSQconst [c] (BTRQconst [c] x)) // result: (BTSQconst [c] x) for { - c := v.AuxInt - if v_0.Op != OpAMD64BTRQconst || v_0.AuxInt != c { + c := auxIntToInt8(v.AuxInt) + if v_0.Op != OpAMD64BTRQconst || auxIntToInt8(v_0.AuxInt) != c { break } x := v_0.Args[0] v.reset(OpAMD64BTSQconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } // match: (BTSQconst [c] (BTCQconst [c] x)) // result: (BTSQconst [c] x) for { - c := v.AuxInt - if v_0.Op != OpAMD64BTCQconst || v_0.AuxInt != c { + c := auxIntToInt8(v.AuxInt) + if v_0.Op != OpAMD64BTCQconst || auxIntToInt8(v_0.AuxInt) != c { break } x := v_0.Args[0] v.reset(OpAMD64BTSQconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -4548,23 +4533,23 @@ func rewriteValueAMD64_OpAMD64BTSQconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTSQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (BTSQconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (BTSQconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64BTSQconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -4597,24 +4582,24 @@ func rewriteValueAMD64_OpAMD64BTSQmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (BTSQmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (BTSQmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64BTSQmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -6741,29 +6726,29 @@ func rewriteValueAMD64_OpAMD64CMPB(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (CMPB x (MOVLconst [c])) - // result: (CMPBconst x [int64(int8(c))]) + // result: (CMPBconst x [int8(c)]) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64CMPBconst) - v.AuxInt = int64(int8(c)) + v.AuxInt = int8ToAuxInt(int8(c)) v.AddArg(x) return true } // match: (CMPB (MOVLconst [c]) x) - // result: (InvertFlags (CMPBconst x [int64(int8(c))])) + // result: (InvertFlags (CMPBconst x [int8(c)])) for { if v_0.Op != OpAMD64MOVLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_1 v.reset(OpAMD64InvertFlags) v0 := b.NewValue0(v.Pos, OpAMD64CMPBconst, types.TypeFlags) - v0.AuxInt = int64(int8(c)) + v0.AuxInt = int8ToAuxInt(int8(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -7006,23 +6991,23 @@ func rewriteValueAMD64_OpAMD64CMPBconstload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMPBconstload [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (CMPBconstload [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (CMPBconstload [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64CMPBconstload) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -7055,24 +7040,24 @@ func rewriteValueAMD64_OpAMD64CMPBload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMPBload [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (CMPBload [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64CMPBload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -7133,9 +7118,9 @@ func rewriteValueAMD64_OpAMD64CMPL(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64CMPLconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -7145,11 +7130,11 @@ func rewriteValueAMD64_OpAMD64CMPL(v *Value) bool { if v_0.Op != OpAMD64MOVLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_1 v.reset(OpAMD64InvertFlags) v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int32ToAuxInt(c) v0.AddArg(x) v.AddArg(v0) return true @@ -7407,23 +7392,23 @@ func rewriteValueAMD64_OpAMD64CMPLconstload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMPLconstload [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (CMPLconstload [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (CMPLconstload [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64CMPLconstload) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -7456,24 +7441,24 @@ func rewriteValueAMD64_OpAMD64CMPLload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMPLload [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (CMPLload [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64CMPLload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -7529,36 +7514,36 @@ func rewriteValueAMD64_OpAMD64CMPQ(v *Value) bool { b := v.Block // match: (CMPQ x (MOVQconst [c])) // cond: is32Bit(c) - // result: (CMPQconst x [c]) + // result: (CMPQconst x [int32(c)]) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { break } v.reset(OpAMD64CMPQconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } // match: (CMPQ (MOVQconst [c]) x) // cond: is32Bit(c) - // result: (InvertFlags (CMPQconst x [c])) + // result: (InvertFlags (CMPQconst x [int32(c)])) for { if v_0.Op != OpAMD64MOVQconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 if !(is32Bit(c)) { break } v.reset(OpAMD64InvertFlags) v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -7722,15 +7707,15 @@ func rewriteValueAMD64_OpAMD64CMPQconst(v *Value) bool { // match: (CMPQconst (NEGQ (ADDQconst [-16] (ANDQconst [15] _))) [32]) // result: (FlagLT_ULT) for { - if v.AuxInt != 32 || v_0.Op != OpAMD64NEGQ { + if auxIntToInt32(v.AuxInt) != 32 || v_0.Op != OpAMD64NEGQ { break } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64ADDQconst || v_0_0.AuxInt != -16 { + if v_0_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_0_0.AuxInt) != -16 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64ANDQconst || v_0_0_0.AuxInt != 15 { + if v_0_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_0_0_0.AuxInt) != 15 { break } v.reset(OpAMD64FlagLT_ULT) @@ -7739,15 +7724,15 @@ func rewriteValueAMD64_OpAMD64CMPQconst(v *Value) bool { // match: (CMPQconst (NEGQ (ADDQconst [ -8] (ANDQconst [7] _))) [32]) // result: (FlagLT_ULT) for { - if v.AuxInt != 32 || v_0.Op != OpAMD64NEGQ { + if auxIntToInt32(v.AuxInt) != 32 || v_0.Op != OpAMD64NEGQ { break } v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64ADDQconst || v_0_0.AuxInt != -8 { + if v_0_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_0_0.AuxInt) != -8 { break } v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64ANDQconst || v_0_0_0.AuxInt != 7 { + if v_0_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_0_0_0.AuxInt) != 7 { break } v.reset(OpAMD64FlagLT_ULT) @@ -7988,23 +7973,23 @@ func rewriteValueAMD64_OpAMD64CMPQconstload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMPQconstload [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (CMPQconstload [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (CMPQconstload [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64CMPQconstload) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -8037,24 +8022,24 @@ func rewriteValueAMD64_OpAMD64CMPQload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMPQload [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (CMPQload [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64CMPQload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -8109,29 +8094,29 @@ func rewriteValueAMD64_OpAMD64CMPW(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (CMPW x (MOVLconst [c])) - // result: (CMPWconst x [int64(int16(c))]) + // result: (CMPWconst x [int16(c)]) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64CMPWconst) - v.AuxInt = int64(int16(c)) + v.AuxInt = int16ToAuxInt(int16(c)) v.AddArg(x) return true } // match: (CMPW (MOVLconst [c]) x) - // result: (InvertFlags (CMPWconst x [int64(int16(c))])) + // result: (InvertFlags (CMPWconst x [int16(c)])) for { if v_0.Op != OpAMD64MOVLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_1 v.reset(OpAMD64InvertFlags) v0 := b.NewValue0(v.Pos, OpAMD64CMPWconst, types.TypeFlags) - v0.AuxInt = int64(int16(c)) + v0.AuxInt = int16ToAuxInt(int16(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -8374,23 +8359,23 @@ func rewriteValueAMD64_OpAMD64CMPWconstload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMPWconstload [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (CMPWconstload [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (CMPWconstload [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64CMPWconstload) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -8423,24 +8408,24 @@ func rewriteValueAMD64_OpAMD64CMPWload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMPWload [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (CMPWload [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64CMPWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -8582,24 +8567,24 @@ func rewriteValueAMD64_OpAMD64DIVSDload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (DIVSDload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (DIVSDload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64DIVSDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -8660,24 +8645,24 @@ func rewriteValueAMD64_OpAMD64DIVSSload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (DIVSSload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (DIVSSload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64DIVSSload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -8781,22 +8766,22 @@ func rewriteValueAMD64_OpAMD64HMULQU(v *Value) bool { func rewriteValueAMD64_OpAMD64LEAL(v *Value) bool { v_0 := v.Args[0] // match: (LEAL [c] {s} (ADDLconst [d] x)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAL [c+d] {s} x) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDLconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAL) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg(x) return true } @@ -8804,8 +8789,8 @@ func rewriteValueAMD64_OpAMD64LEAL(v *Value) bool { // cond: x.Op != OpSB && y.Op != OpSB // result: (LEAL1 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDL { break } @@ -8819,8 +8804,8 @@ func rewriteValueAMD64_OpAMD64LEAL(v *Value) bool { continue } v.reset(OpAMD64LEAL1) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -8832,24 +8817,24 @@ func rewriteValueAMD64_OpAMD64LEAL1(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (LEAL1 [c] {s} (ADDLconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB + // cond: is32Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (LEAL1 [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpAMD64ADDLconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is32Bit(c+d) && x.Op != OpSB) { + if !(is32Bit(int64(c)+int64(d)) && x.Op != OpSB) { continue } v.reset(OpAMD64LEAL1) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -8858,17 +8843,17 @@ func rewriteValueAMD64_OpAMD64LEAL1(v *Value) bool { // match: (LEAL1 [c] {s} x (SHLLconst [1] y)) // result: (LEAL2 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + 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 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 1 { continue } y := v_1.Args[0] v.reset(OpAMD64LEAL2) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -8877,17 +8862,17 @@ func rewriteValueAMD64_OpAMD64LEAL1(v *Value) bool { // match: (LEAL1 [c] {s} x (SHLLconst [2] y)) // result: (LEAL4 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + 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 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 2 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 2 { continue } y := v_1.Args[0] v.reset(OpAMD64LEAL4) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -8896,17 +8881,17 @@ func rewriteValueAMD64_OpAMD64LEAL1(v *Value) bool { // match: (LEAL1 [c] {s} x (SHLLconst [3] y)) // result: (LEAL8 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + 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 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 3 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 3 { continue } y := v_1.Args[0] v.reset(OpAMD64LEAL8) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -8918,76 +8903,76 @@ func rewriteValueAMD64_OpAMD64LEAL2(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (LEAL2 [c] {s} (ADDLconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB + // cond: is32Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (LEAL2 [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDLconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is32Bit(c+d) && x.Op != OpSB) { + if !(is32Bit(int64(c)+int64(d)) && x.Op != OpSB) { break } v.reset(OpAMD64LEAL2) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAL2 [c] {s} x (ADDLconst [d] y)) - // cond: is32Bit(c+2*d) && y.Op != OpSB + // cond: is32Bit(int64(c)+2*int64(d)) && y.Op != OpSB // result: (LEAL2 [c+2*d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 if v_1.Op != OpAMD64ADDLconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] - if !(is32Bit(c+2*d) && y.Op != OpSB) { + if !(is32Bit(int64(c)+2*int64(d)) && y.Op != OpSB) { break } v.reset(OpAMD64LEAL2) - v.AuxInt = c + 2*d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + 2*d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAL2 [c] {s} x (SHLLconst [1] y)) // result: (LEAL4 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 1 { break } y := v_1.Args[0] v.reset(OpAMD64LEAL4) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAL2 [c] {s} x (SHLLconst [2] y)) // result: (LEAL8 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 2 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 2 { break } y := v_1.Args[0] v.reset(OpAMD64LEAL8) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -8997,60 +8982,60 @@ func rewriteValueAMD64_OpAMD64LEAL4(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (LEAL4 [c] {s} (ADDLconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB + // cond: is32Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (LEAL4 [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDLconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is32Bit(c+d) && x.Op != OpSB) { + if !(is32Bit(int64(c)+int64(d)) && x.Op != OpSB) { break } v.reset(OpAMD64LEAL4) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAL4 [c] {s} x (ADDLconst [d] y)) - // cond: is32Bit(c+4*d) && y.Op != OpSB + // cond: is32Bit(int64(c)+4*int64(d)) && y.Op != OpSB // result: (LEAL4 [c+4*d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 if v_1.Op != OpAMD64ADDLconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] - if !(is32Bit(c+4*d) && y.Op != OpSB) { + if !(is32Bit(int64(c)+4*int64(d)) && y.Op != OpSB) { break } v.reset(OpAMD64LEAL4) - v.AuxInt = c + 4*d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + 4*d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAL4 [c] {s} x (SHLLconst [1] y)) // result: (LEAL8 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 - if v_1.Op != OpAMD64SHLLconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64SHLLconst || auxIntToInt8(v_1.AuxInt) != 1 { break } y := v_1.Args[0] v.reset(OpAMD64LEAL8) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9060,44 +9045,44 @@ func rewriteValueAMD64_OpAMD64LEAL8(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (LEAL8 [c] {s} (ADDLconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB + // cond: is32Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (LEAL8 [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDLconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is32Bit(c+d) && x.Op != OpSB) { + if !(is32Bit(int64(c)+int64(d)) && x.Op != OpSB) { break } v.reset(OpAMD64LEAL8) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAL8 [c] {s} x (ADDLconst [d] y)) - // cond: is32Bit(c+8*d) && y.Op != OpSB + // cond: is32Bit(int64(c)+8*int64(d)) && y.Op != OpSB // result: (LEAL8 [c+8*d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 if v_1.Op != OpAMD64ADDLconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] - if !(is32Bit(c+8*d) && y.Op != OpSB) { + if !(is32Bit(int64(c)+8*int64(d)) && y.Op != OpSB) { break } v.reset(OpAMD64LEAL8) - v.AuxInt = c + 8*d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + 8*d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9106,22 +9091,22 @@ func rewriteValueAMD64_OpAMD64LEAL8(v *Value) bool { func rewriteValueAMD64_OpAMD64LEAQ(v *Value) bool { v_0 := v.Args[0] // match: (LEAQ [c] {s} (ADDQconst [d] x)) - // cond: is32Bit(c+d) + // cond: is32Bit(int64(c)+int64(d)) // result: (LEAQ [c+d] {s} x) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(is32Bit(c + d)) { + if !(is32Bit(int64(c) + int64(d))) { break } v.reset(OpAMD64LEAQ) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg(x) return true } @@ -9129,8 +9114,8 @@ func rewriteValueAMD64_OpAMD64LEAQ(v *Value) bool { // cond: x.Op != OpSB && y.Op != OpSB // result: (LEAQ1 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQ { break } @@ -9144,8 +9129,8 @@ func rewriteValueAMD64_OpAMD64LEAQ(v *Value) bool { continue } v.reset(OpAMD64LEAQ1) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9266,24 +9251,24 @@ func rewriteValueAMD64_OpAMD64LEAQ1(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (LEAQ1 [c] {s} (ADDQconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB + // cond: is32Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (LEAQ1 [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpAMD64ADDQconst { continue } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is32Bit(c+d) && x.Op != OpSB) { + if !(is32Bit(int64(c)+int64(d)) && x.Op != OpSB) { continue } v.reset(OpAMD64LEAQ1) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9292,17 +9277,17 @@ func rewriteValueAMD64_OpAMD64LEAQ1(v *Value) bool { // match: (LEAQ1 [c] {s} x (SHLQconst [1] y)) // result: (LEAQ2 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + 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 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 1 { continue } y := v_1.Args[0] v.reset(OpAMD64LEAQ2) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9311,17 +9296,17 @@ func rewriteValueAMD64_OpAMD64LEAQ1(v *Value) bool { // match: (LEAQ1 [c] {s} x (SHLQconst [2] y)) // result: (LEAQ4 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + 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 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 2 { continue } y := v_1.Args[0] v.reset(OpAMD64LEAQ4) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9330,17 +9315,17 @@ func rewriteValueAMD64_OpAMD64LEAQ1(v *Value) bool { // match: (LEAQ1 [c] {s} x (SHLQconst [3] y)) // result: (LEAQ8 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + 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 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 3 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 3 { continue } y := v_1.Args[0] v.reset(OpAMD64LEAQ8) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9451,76 +9436,76 @@ func rewriteValueAMD64_OpAMD64LEAQ2(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (LEAQ2 [c] {s} (ADDQconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB + // cond: is32Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (LEAQ2 [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is32Bit(c+d) && x.Op != OpSB) { + if !(is32Bit(int64(c)+int64(d)) && x.Op != OpSB) { break } v.reset(OpAMD64LEAQ2) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAQ2 [c] {s} x (ADDQconst [d] y)) - // cond: is32Bit(c+2*d) && y.Op != OpSB + // cond: is32Bit(int64(c)+2*int64(d)) && y.Op != OpSB // result: (LEAQ2 [c+2*d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 if v_1.Op != OpAMD64ADDQconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] - if !(is32Bit(c+2*d) && y.Op != OpSB) { + if !(is32Bit(int64(c)+2*int64(d)) && y.Op != OpSB) { break } v.reset(OpAMD64LEAQ2) - v.AuxInt = c + 2*d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + 2*d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAQ2 [c] {s} x (SHLQconst [1] y)) // result: (LEAQ4 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 1 { break } y := v_1.Args[0] v.reset(OpAMD64LEAQ4) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAQ2 [c] {s} x (SHLQconst [2] y)) // result: (LEAQ8 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 2 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 2 { break } y := v_1.Args[0] v.reset(OpAMD64LEAQ8) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9614,60 +9599,60 @@ func rewriteValueAMD64_OpAMD64LEAQ4(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (LEAQ4 [c] {s} (ADDQconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB + // cond: is32Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (LEAQ4 [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is32Bit(c+d) && x.Op != OpSB) { + if !(is32Bit(int64(c)+int64(d)) && x.Op != OpSB) { break } v.reset(OpAMD64LEAQ4) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAQ4 [c] {s} x (ADDQconst [d] y)) - // cond: is32Bit(c+4*d) && y.Op != OpSB + // cond: is32Bit(int64(c)+4*int64(d)) && y.Op != OpSB // result: (LEAQ4 [c+4*d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 if v_1.Op != OpAMD64ADDQconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] - if !(is32Bit(c+4*d) && y.Op != OpSB) { + if !(is32Bit(int64(c)+4*int64(d)) && y.Op != OpSB) { break } v.reset(OpAMD64LEAQ4) - v.AuxInt = c + 4*d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + 4*d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAQ4 [c] {s} x (SHLQconst [1] y)) // result: (LEAQ8 [c] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 - if v_1.Op != OpAMD64SHLQconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64SHLQconst || auxIntToInt8(v_1.AuxInt) != 1 { break } y := v_1.Args[0] v.reset(OpAMD64LEAQ8) - v.AuxInt = c - v.Aux = s + v.AuxInt = int32ToAuxInt(c) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9761,44 +9746,44 @@ func rewriteValueAMD64_OpAMD64LEAQ8(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (LEAQ8 [c] {s} (ADDQconst [d] x) y) - // cond: is32Bit(c+d) && x.Op != OpSB + // cond: is32Bit(int64(c)+int64(d)) && x.Op != OpSB // result: (LEAQ8 [c+d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] y := v_1 - if !(is32Bit(c+d) && x.Op != OpSB) { + if !(is32Bit(int64(c)+int64(d)) && x.Op != OpSB) { break } v.reset(OpAMD64LEAQ8) - v.AuxInt = c + d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } // match: (LEAQ8 [c] {s} x (ADDQconst [d] y)) - // cond: is32Bit(c+8*d) && y.Op != OpSB + // cond: is32Bit(int64(c)+8*int64(d)) && y.Op != OpSB // result: (LEAQ8 [c+8*d] {s} x y) for { - c := v.AuxInt - s := v.Aux + c := auxIntToInt32(v.AuxInt) + s := auxToSym(v.Aux) x := v_0 if v_1.Op != OpAMD64ADDQconst { break } - d := v_1.AuxInt + d := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] - if !(is32Bit(c+8*d) && y.Op != OpSB) { + if !(is32Bit(int64(c)+8*int64(d)) && y.Op != OpSB) { break } v.reset(OpAMD64LEAQ8) - v.AuxInt = c + 8*d - v.Aux = s + v.AuxInt = int32ToAuxInt(c + 8*d) + v.Aux = symToAux(s) v.AddArg2(x, y) return true } @@ -9877,8 +9862,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { if x.Op != OpAMD64MOVBload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -9887,8 +9872,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVBQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -9900,8 +9885,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { if x.Op != OpAMD64MOVWload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -9910,8 +9895,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVBQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -9923,8 +9908,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { if x.Op != OpAMD64MOVLload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -9933,8 +9918,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVBQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -9946,8 +9931,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { if x.Op != OpAMD64MOVQload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -9956,8 +9941,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVBQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -9968,13 +9953,13 @@ func rewriteValueAMD64_OpAMD64MOVBQSX(v *Value) bool { if v_0.Op != OpAMD64ANDLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] if !(c&0x80 == 0) { break } v.reset(OpAMD64ANDLconst) - v.AuxInt = c & 0x7f + v.AuxInt = int32ToAuxInt(c & 0x7f) v.AddArg(x) return true } @@ -9998,14 +9983,14 @@ func rewriteValueAMD64_OpAMD64MOVBQSXload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVBQSX x) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVBstore { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) x := v_1.Args[1] ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { @@ -10050,8 +10035,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { if x.Op != OpAMD64MOVBload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -10060,8 +10045,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVBload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -10073,8 +10058,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { if x.Op != OpAMD64MOVWload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -10083,8 +10068,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVBload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -10096,8 +10081,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { if x.Op != OpAMD64MOVLload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -10106,8 +10091,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVBload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -10119,8 +10104,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { if x.Op != OpAMD64MOVQload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -10129,8 +10114,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVBload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -10151,10 +10136,10 @@ func rewriteValueAMD64_OpAMD64MOVBQZX(v *Value) bool { if v_0.Op != OpAMD64ANDLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] v.reset(OpAMD64ANDLconst) - v.AuxInt = c & 0xff + v.AuxInt = int32ToAuxInt(c & 0xff) v.AddArg(x) return true } @@ -10226,14 +10211,14 @@ func rewriteValueAMD64_OpAMD64MOVBload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVBQZX x) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVBstore { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) x := v_1.Args[1] ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { @@ -10244,23 +10229,23 @@ func rewriteValueAMD64_OpAMD64MOVBload(v *Value) bool { return true } // match: (MOVBload [off1] {sym} (ADDQconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVBload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVBload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -10354,8 +10339,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETLstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETL { @@ -10367,8 +10352,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETLstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10376,8 +10361,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETLEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETLE { @@ -10389,8 +10374,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETLEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10398,8 +10383,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETGstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETG { @@ -10411,8 +10396,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETGstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10420,8 +10405,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETGEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETGE { @@ -10433,8 +10418,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETGEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10442,8 +10427,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETEQstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETEQ { @@ -10455,8 +10440,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETEQstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10464,8 +10449,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETNEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETNE { @@ -10477,8 +10462,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETNEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10486,8 +10471,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETB { @@ -10499,8 +10484,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10508,8 +10493,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETBEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETBE { @@ -10521,8 +10506,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETBEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10530,8 +10515,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETAstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETA { @@ -10543,8 +10528,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETAstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } @@ -10552,8 +10537,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { // cond: y.Uses == 1 // result: (SETAEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 y := v_1 if y.Op != OpAMD64SETAE { @@ -10565,16 +10550,16 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { break } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVBQSX x) mem) // result: (MOVBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVBQSX { break @@ -10582,16 +10567,16 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVBQZX x) mem) // result: (MOVBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVBQZX { break @@ -10599,72 +10584,64 @@ func rewriteValueAMD64_OpAMD64MOVBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64MOVBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVBstore [off1] {sym} (ADDQconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVBstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVBstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVLconst [c]) mem) - // cond: validOff(off) - // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) + // result: (MOVBstoreconst [makeValAndOff32(int32(int8(c)),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) mem := v_2 - if !(validOff(off)) { - break - } v.reset(OpAMD64MOVBstoreconst) - v.AuxInt = makeValAndOff(int64(int8(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(int8(c)), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVBstore [off] {sym} ptr (MOVQconst [c]) mem) - // cond: validOff(off) - // result: (MOVBstoreconst [makeValAndOff(int64(int8(c)),off)] {sym} ptr mem) + // result: (MOVBstoreconst [makeValAndOff32(int32(int8(c)),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 - if !(validOff(off)) { - break - } v.reset(OpAMD64MOVBstoreconst) - v.AuxInt = makeValAndOff(int64(int8(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(int8(c)), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -11542,23 +11519,23 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVBstoreconst [sc] {s} (ADDQconst [off] ptr) mem) - // cond: ValAndOff(sc).canAdd(off) - // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // cond: ValAndOff(sc).canAdd32(off) + // result: (MOVBstoreconst [ValAndOff(sc).addOffset32(off)] {s} ptr mem) for { - sc := v.AuxInt - s := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off := v_0.AuxInt + off := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(ValAndOff(sc).canAdd(off)) { + if !(ValAndOff(sc).canAdd32(off)) { break } v.reset(OpAMD64MOVBstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(ValAndOff(sc).addOffset32(off)) + v.Aux = symToAux(s) v.AddArg2(ptr, mem) return true } @@ -11690,8 +11667,8 @@ func rewriteValueAMD64_OpAMD64MOVLQSX(v *Value) bool { if x.Op != OpAMD64MOVLload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -11700,8 +11677,8 @@ func rewriteValueAMD64_OpAMD64MOVLQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVLQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -11713,8 +11690,8 @@ func rewriteValueAMD64_OpAMD64MOVLQSX(v *Value) bool { if x.Op != OpAMD64MOVQload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -11723,25 +11700,25 @@ func rewriteValueAMD64_OpAMD64MOVLQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVLQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } // match: (MOVLQSX (ANDLconst [c] x)) - // cond: c & 0x80000000 == 0 + // cond: uint32(c) & 0x80000000 == 0 // result: (ANDLconst [c & 0x7fffffff] x) for { if v_0.Op != OpAMD64ANDLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(c&0x80000000 == 0) { + if !(uint32(c)&0x80000000 == 0) { break } v.reset(OpAMD64ANDLconst) - v.AuxInt = c & 0x7fffffff + v.AuxInt = int32ToAuxInt(c & 0x7fffffff) v.AddArg(x) return true } @@ -11787,14 +11764,14 @@ func rewriteValueAMD64_OpAMD64MOVLQSXload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVLQSX x) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVLstore { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) x := v_1.Args[1] ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { @@ -11839,8 +11816,8 @@ func rewriteValueAMD64_OpAMD64MOVLQZX(v *Value) bool { if x.Op != OpAMD64MOVLload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -11849,8 +11826,8 @@ func rewriteValueAMD64_OpAMD64MOVLQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVLload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -11862,8 +11839,8 @@ func rewriteValueAMD64_OpAMD64MOVLQZX(v *Value) bool { if x.Op != OpAMD64MOVQload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -11872,8 +11849,8 @@ func rewriteValueAMD64_OpAMD64MOVLQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVLload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -11894,10 +11871,10 @@ func rewriteValueAMD64_OpAMD64MOVLQZX(v *Value) bool { if v_0.Op != OpAMD64ANDLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] v.reset(OpAMD64ANDLconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -12045,14 +12022,14 @@ func rewriteValueAMD64_OpAMD64MOVLload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVLQZX x) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVLstore { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) x := v_1.Args[1] ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { @@ -12063,23 +12040,23 @@ func rewriteValueAMD64_OpAMD64MOVLload(v *Value) bool { return true } // match: (MOVLload [off1] {sym} (ADDQconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVLload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVLload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -12189,8 +12166,8 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { // match: (MOVLstore [off] {sym} ptr (MOVLQSX x) mem) // result: (MOVLstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVLQSX { break @@ -12198,16 +12175,16 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64MOVLstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVLstore [off] {sym} ptr (MOVLQZX x) mem) // result: (MOVLstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVLQZX { break @@ -12215,72 +12192,64 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64MOVLstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVLstore [off1] {sym} (ADDQconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVLstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVLstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVLstore [off] {sym} ptr (MOVLconst [c]) mem) - // cond: validOff(off) - // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) + // result: (MOVLstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) mem := v_2 - if !(validOff(off)) { - break - } v.reset(OpAMD64MOVLstoreconst) - v.AuxInt = makeValAndOff(int64(int32(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(c), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVLstore [off] {sym} ptr (MOVQconst [c]) mem) - // cond: validOff(off) - // result: (MOVLstoreconst [makeValAndOff(int64(int32(c)),off)] {sym} ptr mem) + // result: (MOVLstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 - if !(validOff(off)) { - break - } v.reset(OpAMD64MOVLstoreconst) - v.AuxInt = makeValAndOff(int64(int32(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(c), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -13048,23 +13017,23 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (MOVLstoreconst [sc] {s} (ADDQconst [off] ptr) mem) - // cond: ValAndOff(sc).canAdd(off) - // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // cond: ValAndOff(sc).canAdd32(off) + // result: (MOVLstoreconst [ValAndOff(sc).addOffset32(off)] {s} ptr mem) for { - sc := v.AuxInt - s := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off := v_0.AuxInt + off := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(ValAndOff(sc).canAdd(off)) { + if !(ValAndOff(sc).canAdd32(off)) { break } v.reset(OpAMD64MOVLstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(ValAndOff(sc).addOffset32(off)) + v.Aux = symToAux(s) v.AddArg2(ptr, mem) return true } @@ -13193,23 +13162,23 @@ func rewriteValueAMD64_OpAMD64MOVOload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVOload [off1] {sym} (ADDQconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVOload [off1+off2] {sym} ptr mem) - for { - off1 := v.AuxInt - sym := v.Aux + for { + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVOload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -13245,24 +13214,24 @@ func rewriteValueAMD64_OpAMD64MOVOstore(v *Value) bool { config := b.Func.Config typ := &b.Func.Config.Types // match: (MOVOstore [off1] {sym} (ADDQconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVOstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVOstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } @@ -13434,14 +13403,14 @@ func rewriteValueAMD64_OpAMD64MOVQload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: x for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVQstore { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) x := v_1.Args[1] ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { @@ -13451,23 +13420,23 @@ func rewriteValueAMD64_OpAMD64MOVQload(v *Value) bool { return true } // match: (MOVQload [off1] {sym} (ADDQconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVQload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVQload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -13573,45 +13542,45 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVQstore [off1] {sym} (ADDQconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVQstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVQstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVQstore [off] {sym} ptr (MOVQconst [c]) mem) - // cond: validValAndOff(c,off) - // result: (MOVQstoreconst [makeValAndOff(c,off)] {sym} ptr mem) + // cond: validVal(c) + // result: (MOVQstoreconst [makeValAndOff32(int32(c),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 - if !(validValAndOff(c, off)) { + if !(validVal(c)) { break } v.reset(OpAMD64MOVQstoreconst) - v.AuxInt = makeValAndOff(c, off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(c), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -14229,23 +14198,23 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst(v *Value) bool { b := v.Block config := b.Func.Config // match: (MOVQstoreconst [sc] {s} (ADDQconst [off] ptr) mem) - // cond: ValAndOff(sc).canAdd(off) - // result: (MOVQstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // cond: ValAndOff(sc).canAdd32(off) + // result: (MOVQstoreconst [ValAndOff(sc).addOffset32(off)] {s} ptr mem) for { - sc := v.AuxInt - s := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off := v_0.AuxInt + off := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(ValAndOff(sc).canAdd(off)) { + if !(ValAndOff(sc).canAdd32(off)) { break } v.reset(OpAMD64MOVQstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(ValAndOff(sc).addOffset32(off)) + v.Aux = symToAux(s) v.AddArg2(ptr, mem) return true } @@ -14347,23 +14316,23 @@ func rewriteValueAMD64_OpAMD64MOVSDload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVSDload [off1] {sym} (ADDQconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVSDload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVSDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -14413,24 +14382,24 @@ func rewriteValueAMD64_OpAMD64MOVSDstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVSDstore [off1] {sym} (ADDQconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVSDstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVSDstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } @@ -14480,23 +14449,23 @@ func rewriteValueAMD64_OpAMD64MOVSSload(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVSSload [off1] {sym} (ADDQconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVSSload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVSSload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -14546,24 +14515,24 @@ func rewriteValueAMD64_OpAMD64MOVSSstore(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVSSstore [off1] {sym} (ADDQconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVSSstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVSSstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } @@ -14620,8 +14589,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX(v *Value) bool { if x.Op != OpAMD64MOVWload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -14630,8 +14599,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVWQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -14643,8 +14612,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX(v *Value) bool { if x.Op != OpAMD64MOVLload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -14653,8 +14622,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVWQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -14666,8 +14635,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX(v *Value) bool { if x.Op != OpAMD64MOVQload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -14676,8 +14645,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVWQSXload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -14688,13 +14657,13 @@ func rewriteValueAMD64_OpAMD64MOVWQSX(v *Value) bool { if v_0.Op != OpAMD64ANDLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] if !(c&0x8000 == 0) { break } v.reset(OpAMD64ANDLconst) - v.AuxInt = c & 0x7fff + v.AuxInt = int32ToAuxInt(c & 0x7fff) v.AddArg(x) return true } @@ -14729,14 +14698,14 @@ func rewriteValueAMD64_OpAMD64MOVWQSXload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVWQSX x) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVWstore { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) x := v_1.Args[1] ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { @@ -14781,8 +14750,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX(v *Value) bool { if x.Op != OpAMD64MOVWload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -14791,8 +14760,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVWload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -14804,8 +14773,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX(v *Value) bool { if x.Op != OpAMD64MOVLload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -14814,8 +14783,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVWload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -14827,8 +14796,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX(v *Value) bool { if x.Op != OpAMD64MOVQload { break } - off := x.AuxInt - sym := x.Aux + off := auxIntToInt32(x.AuxInt) + sym := auxToSym(x.Aux) mem := x.Args[1] ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { @@ -14837,8 +14806,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX(v *Value) bool { b = x.Block v0 := b.NewValue0(x.Pos, OpAMD64MOVWload, v.Type) v.copyOf(v0) - v0.AuxInt = off - v0.Aux = sym + v0.AuxInt = int32ToAuxInt(off) + v0.Aux = symToAux(sym) v0.AddArg2(ptr, mem) return true } @@ -14859,10 +14828,10 @@ func rewriteValueAMD64_OpAMD64MOVWQZX(v *Value) bool { if v_0.Op != OpAMD64ANDLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] v.reset(OpAMD64ANDLconst) - v.AuxInt = c & 0xffff + v.AuxInt = int32ToAuxInt(c & 0xffff) v.AddArg(x) return true } @@ -14899,14 +14868,14 @@ func rewriteValueAMD64_OpAMD64MOVWload(v *Value) bool { // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVWQZX x) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVWstore { break } - off2 := v_1.AuxInt - sym2 := v_1.Aux + off2 := auxIntToInt32(v_1.AuxInt) + sym2 := auxToSym(v_1.Aux) x := v_1.Args[1] ptr2 := v_1.Args[0] if !(sym == sym2 && off == off2 && isSamePtr(ptr, ptr2)) { @@ -14917,23 +14886,23 @@ func rewriteValueAMD64_OpAMD64MOVWload(v *Value) bool { return true } // match: (MOVWload [off1] {sym} (ADDQconst [off2] ptr) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVWload [off1+off2] {sym} ptr mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVWload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -15026,8 +14995,8 @@ func rewriteValueAMD64_OpAMD64MOVWstore(v *Value) bool { // match: (MOVWstore [off] {sym} ptr (MOVWQSX x) mem) // result: (MOVWstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVWQSX { break @@ -15035,16 +15004,16 @@ func rewriteValueAMD64_OpAMD64MOVWstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64MOVWstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVWstore [off] {sym} ptr (MOVWQZX x) mem) // result: (MOVWstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVWQZX { break @@ -15052,72 +15021,64 @@ func rewriteValueAMD64_OpAMD64MOVWstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64MOVWstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (MOVWstore [off1] {sym} (ADDQconst [off2] ptr) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVWstore [off1+off2] {sym} ptr val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MOVWstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(ptr, val, mem) return true } // match: (MOVWstore [off] {sym} ptr (MOVLconst [c]) mem) - // cond: validOff(off) - // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) + // result: (MOVWstoreconst [makeValAndOff32(int32(int16(c)),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) mem := v_2 - if !(validOff(off)) { - break - } v.reset(OpAMD64MOVWstoreconst) - v.AuxInt = makeValAndOff(int64(int16(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(int16(c)), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } // match: (MOVWstore [off] {sym} ptr (MOVQconst [c]) mem) - // cond: validOff(off) - // result: (MOVWstoreconst [makeValAndOff(int64(int16(c)),off)] {sym} ptr mem) + // result: (MOVWstoreconst [makeValAndOff32(int32(int16(c)),off)] {sym} ptr mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) mem := v_2 - if !(validOff(off)) { - break - } v.reset(OpAMD64MOVWstoreconst) - v.AuxInt = makeValAndOff(int64(int16(c)), off) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(makeValAndOff32(int32(int16(c)), off)) + v.Aux = symToAux(sym) v.AddArg2(ptr, mem) return true } @@ -15454,23 +15415,23 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (MOVWstoreconst [sc] {s} (ADDQconst [off] ptr) mem) - // cond: ValAndOff(sc).canAdd(off) - // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) + // cond: ValAndOff(sc).canAdd32(off) + // result: (MOVWstoreconst [ValAndOff(sc).addOffset32(off)] {s} ptr mem) for { - sc := v.AuxInt - s := v.Aux + sc := auxIntToValAndOff(v.AuxInt) + s := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off := v_0.AuxInt + off := auxIntToInt32(v_0.AuxInt) ptr := v_0.Args[0] mem := v_1 - if !(ValAndOff(sc).canAdd(off)) { + if !(ValAndOff(sc).canAdd32(off)) { break } v.reset(OpAMD64MOVWstoreconst) - v.AuxInt = ValAndOff(sc).add(off) - v.Aux = s + v.AuxInt = valAndOffToAuxInt(ValAndOff(sc).addOffset32(off)) + v.Aux = symToAux(s) v.AddArg2(ptr, mem) return true } @@ -15602,9 +15563,9 @@ func rewriteValueAMD64_OpAMD64MULL(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { continue } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64MULLconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -15616,23 +15577,23 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (MULLconst [c] (MULLconst [d] x)) - // result: (MULLconst [int64(int32(c * d))] x) + // result: (MULLconst [c * d] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64MULLconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] v.reset(OpAMD64MULLconst) - v.AuxInt = int64(int32(c * d)) + v.AuxInt = int32ToAuxInt(c * d) v.AddArg(x) return true } // match: (MULLconst [-9] x) // result: (NEGL (LEAL8 x x)) for { - if v.AuxInt != -9 { + if auxIntToInt32(v.AuxInt) != -9 { break } x := v_0 @@ -15645,7 +15606,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [-5] x) // result: (NEGL (LEAL4 x x)) for { - if v.AuxInt != -5 { + if auxIntToInt32(v.AuxInt) != -5 { break } x := v_0 @@ -15658,7 +15619,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [-3] x) // result: (NEGL (LEAL2 x x)) for { - if v.AuxInt != -3 { + if auxIntToInt32(v.AuxInt) != -3 { break } x := v_0 @@ -15671,7 +15632,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [-1] x) // result: (NEGL x) for { - if v.AuxInt != -1 { + if auxIntToInt32(v.AuxInt) != -1 { break } x := v_0 @@ -15682,17 +15643,17 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [ 0] _) // result: (MOVLconst [0]) for { - if v.AuxInt != 0 { + if auxIntToInt32(v.AuxInt) != 0 { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = int32ToAuxInt(0) return true } // match: (MULLconst [ 1] x) // result: x for { - if v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } x := v_0 @@ -15702,7 +15663,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [ 3] x) // result: (LEAL2 x x) for { - if v.AuxInt != 3 { + if auxIntToInt32(v.AuxInt) != 3 { break } x := v_0 @@ -15713,7 +15674,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [ 5] x) // result: (LEAL4 x x) for { - if v.AuxInt != 5 { + if auxIntToInt32(v.AuxInt) != 5 { break } x := v_0 @@ -15724,7 +15685,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [ 7] x) // result: (LEAL2 x (LEAL2 x x)) for { - if v.AuxInt != 7 { + if auxIntToInt32(v.AuxInt) != 7 { break } x := v_0 @@ -15737,7 +15698,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [ 9] x) // result: (LEAL8 x x) for { - if v.AuxInt != 9 { + if auxIntToInt32(v.AuxInt) != 9 { break } x := v_0 @@ -15748,7 +15709,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [11] x) // result: (LEAL2 x (LEAL4 x x)) for { - if v.AuxInt != 11 { + if auxIntToInt32(v.AuxInt) != 11 { break } x := v_0 @@ -15761,7 +15722,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [13] x) // result: (LEAL4 x (LEAL2 x x)) for { - if v.AuxInt != 13 { + if auxIntToInt32(v.AuxInt) != 13 { break } x := v_0 @@ -15774,7 +15735,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [19] x) // result: (LEAL2 x (LEAL8 x x)) for { - if v.AuxInt != 19 { + if auxIntToInt32(v.AuxInt) != 19 { break } x := v_0 @@ -15787,7 +15748,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [21] x) // result: (LEAL4 x (LEAL4 x x)) for { - if v.AuxInt != 21 { + if auxIntToInt32(v.AuxInt) != 21 { break } x := v_0 @@ -15800,7 +15761,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [25] x) // result: (LEAL8 x (LEAL2 x x)) for { - if v.AuxInt != 25 { + if auxIntToInt32(v.AuxInt) != 25 { break } x := v_0 @@ -15813,7 +15774,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [27] x) // result: (LEAL8 (LEAL2 x x) (LEAL2 x x)) for { - if v.AuxInt != 27 { + if auxIntToInt32(v.AuxInt) != 27 { break } x := v_0 @@ -15826,7 +15787,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [37] x) // result: (LEAL4 x (LEAL8 x x)) for { - if v.AuxInt != 37 { + if auxIntToInt32(v.AuxInt) != 37 { break } x := v_0 @@ -15839,7 +15800,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [41] x) // result: (LEAL8 x (LEAL4 x x)) for { - if v.AuxInt != 41 { + if auxIntToInt32(v.AuxInt) != 41 { break } x := v_0 @@ -15852,7 +15813,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [45] x) // result: (LEAL8 (LEAL4 x x) (LEAL4 x x)) for { - if v.AuxInt != 45 { + if auxIntToInt32(v.AuxInt) != 45 { break } x := v_0 @@ -15865,7 +15826,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [73] x) // result: (LEAL8 x (LEAL8 x x)) for { - if v.AuxInt != 73 { + if auxIntToInt32(v.AuxInt) != 73 { break } x := v_0 @@ -15878,7 +15839,7 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { // match: (MULLconst [81] x) // result: (LEAL8 (LEAL8 x x) (LEAL8 x x)) for { - if v.AuxInt != 81 { + if auxIntToInt32(v.AuxInt) != 81 { break } x := v_0 @@ -15889,128 +15850,128 @@ func rewriteValueAMD64_OpAMD64MULLconst(v *Value) bool { return true } // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c+1) && c >= 15 - // result: (SUBL (SHLLconst [log2(c+1)] x) x) + // cond: isPowerOfTwo(int64(c)+1) && c >= 15 + // result: (SUBL (SHLLconst [int8(log2(int64(c)+1))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c+1) && c >= 15) { + if !(isPowerOfTwo(int64(c)+1) && c >= 15) { break } v.reset(OpAMD64SUBL) v0 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int8ToAuxInt(int8(log2(int64(c) + 1))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c-1) && c >= 17 - // result: (LEAL1 (SHLLconst [log2(c-1)] x) x) + // cond: isPowerOfTwo32(c-1) && c >= 17 + // result: (LEAL1 (SHLLconst [int8(log32(c-1))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-1) && c >= 17) { + if !(isPowerOfTwo32(c-1) && c >= 17) { break } v.reset(OpAMD64LEAL1) v0 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int8ToAuxInt(int8(log32(c - 1))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c-2) && c >= 34 - // result: (LEAL2 (SHLLconst [log2(c-2)] x) x) + // cond: isPowerOfTwo32(c-2) && c >= 34 + // result: (LEAL2 (SHLLconst [int8(log32(c-2))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-2) && c >= 34) { + if !(isPowerOfTwo32(c-2) && c >= 34) { break } v.reset(OpAMD64LEAL2) v0 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v0.AuxInt = log2(c - 2) + v0.AuxInt = int8ToAuxInt(int8(log32(c - 2))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c-4) && c >= 68 - // result: (LEAL4 (SHLLconst [log2(c-4)] x) x) + // cond: isPowerOfTwo32(c-4) && c >= 68 + // result: (LEAL4 (SHLLconst [int8(log32(c-4))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-4) && c >= 68) { + if !(isPowerOfTwo32(c-4) && c >= 68) { break } v.reset(OpAMD64LEAL4) v0 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v0.AuxInt = log2(c - 4) + v0.AuxInt = int8ToAuxInt(int8(log32(c - 4))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULLconst [c] x) - // cond: isPowerOfTwo(c-8) && c >= 136 - // result: (LEAL8 (SHLLconst [log2(c-8)] x) x) + // cond: isPowerOfTwo32(c-8) && c >= 136 + // result: (LEAL8 (SHLLconst [int8(log32(c-8))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-8) && c >= 136) { + if !(isPowerOfTwo32(c-8) && c >= 136) { break } v.reset(OpAMD64LEAL8) v0 := b.NewValue0(v.Pos, OpAMD64SHLLconst, v.Type) - v0.AuxInt = log2(c - 8) + v0.AuxInt = int8ToAuxInt(int8(log32(c - 8))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULLconst [c] x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (SHLLconst [log2(c/3)] (LEAL2 x x)) + // cond: c%3 == 0 && isPowerOfTwo32(c/3) + // result: (SHLLconst [int8(log32(c/3))] (LEAL2 x x)) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(c%3 == 0 && isPowerOfTwo(c/3)) { + if !(c%3 == 0 && isPowerOfTwo32(c/3)) { break } v.reset(OpAMD64SHLLconst) - v.AuxInt = log2(c / 3) + v.AuxInt = int8ToAuxInt(int8(log32(c / 3))) v0 := b.NewValue0(v.Pos, OpAMD64LEAL2, v.Type) v0.AddArg2(x, x) v.AddArg(v0) return true } // match: (MULLconst [c] x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (SHLLconst [log2(c/5)] (LEAL4 x x)) + // cond: c%5 == 0 && isPowerOfTwo32(c/5) + // result: (SHLLconst [int8(log32(c/5))] (LEAL4 x x)) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(c%5 == 0 && isPowerOfTwo(c/5)) { + if !(c%5 == 0 && isPowerOfTwo32(c/5)) { break } v.reset(OpAMD64SHLLconst) - v.AuxInt = log2(c / 5) + v.AuxInt = int8ToAuxInt(int8(log32(c / 5))) v0 := b.NewValue0(v.Pos, OpAMD64LEAL4, v.Type) v0.AddArg2(x, x) v.AddArg(v0) return true } // match: (MULLconst [c] x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (SHLLconst [log2(c/9)] (LEAL8 x x)) + // cond: c%9 == 0 && isPowerOfTwo32(c/9) + // result: (SHLLconst [int8(log32(c/9))] (LEAL8 x x)) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(c%9 == 0 && isPowerOfTwo(c/9)) { + if !(c%9 == 0 && isPowerOfTwo32(c/9)) { break } v.reset(OpAMD64SHLLconst) - v.AuxInt = log2(c / 9) + v.AuxInt = int8ToAuxInt(int8(log32(c / 9))) v0 := b.NewValue0(v.Pos, OpAMD64LEAL8, v.Type) v0.AddArg2(x, x) v.AddArg(v0) @@ -16035,19 +15996,19 @@ func rewriteValueAMD64_OpAMD64MULQ(v *Value) bool { v_0 := v.Args[0] // match: (MULQ x (MOVQconst [c])) // cond: is32Bit(c) - // result: (MULQconst [c] x) + // result: (MULQconst [int32(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 != OpAMD64MOVQconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { continue } v.reset(OpAMD64MULQconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -16059,27 +16020,27 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (MULQconst [c] (MULQconst [d] x)) - // cond: is32Bit(c*d) + // cond: is32Bit(int64(c)*int64(d)) // result: (MULQconst [c * d] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) if v_0.Op != OpAMD64MULQconst { break } - d := v_0.AuxInt + d := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(is32Bit(c * d)) { + if !(is32Bit(int64(c) * int64(d))) { break } v.reset(OpAMD64MULQconst) - v.AuxInt = c * d + v.AuxInt = int32ToAuxInt(c * d) v.AddArg(x) return true } // match: (MULQconst [-9] x) // result: (NEGQ (LEAQ8 x x)) for { - if v.AuxInt != -9 { + if auxIntToInt32(v.AuxInt) != -9 { break } x := v_0 @@ -16092,7 +16053,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [-5] x) // result: (NEGQ (LEAQ4 x x)) for { - if v.AuxInt != -5 { + if auxIntToInt32(v.AuxInt) != -5 { break } x := v_0 @@ -16105,7 +16066,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [-3] x) // result: (NEGQ (LEAQ2 x x)) for { - if v.AuxInt != -3 { + if auxIntToInt32(v.AuxInt) != -3 { break } x := v_0 @@ -16118,7 +16079,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [-1] x) // result: (NEGQ x) for { - if v.AuxInt != -1 { + if auxIntToInt32(v.AuxInt) != -1 { break } x := v_0 @@ -16129,17 +16090,17 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [ 0] _) // result: (MOVQconst [0]) for { - if v.AuxInt != 0 { + if auxIntToInt32(v.AuxInt) != 0 { break } v.reset(OpAMD64MOVQconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (MULQconst [ 1] x) // result: x for { - if v.AuxInt != 1 { + if auxIntToInt32(v.AuxInt) != 1 { break } x := v_0 @@ -16149,7 +16110,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [ 3] x) // result: (LEAQ2 x x) for { - if v.AuxInt != 3 { + if auxIntToInt32(v.AuxInt) != 3 { break } x := v_0 @@ -16160,7 +16121,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [ 5] x) // result: (LEAQ4 x x) for { - if v.AuxInt != 5 { + if auxIntToInt32(v.AuxInt) != 5 { break } x := v_0 @@ -16171,7 +16132,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [ 7] x) // result: (LEAQ2 x (LEAQ2 x x)) for { - if v.AuxInt != 7 { + if auxIntToInt32(v.AuxInt) != 7 { break } x := v_0 @@ -16184,7 +16145,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [ 9] x) // result: (LEAQ8 x x) for { - if v.AuxInt != 9 { + if auxIntToInt32(v.AuxInt) != 9 { break } x := v_0 @@ -16195,7 +16156,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [11] x) // result: (LEAQ2 x (LEAQ4 x x)) for { - if v.AuxInt != 11 { + if auxIntToInt32(v.AuxInt) != 11 { break } x := v_0 @@ -16208,7 +16169,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [13] x) // result: (LEAQ4 x (LEAQ2 x x)) for { - if v.AuxInt != 13 { + if auxIntToInt32(v.AuxInt) != 13 { break } x := v_0 @@ -16221,7 +16182,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [19] x) // result: (LEAQ2 x (LEAQ8 x x)) for { - if v.AuxInt != 19 { + if auxIntToInt32(v.AuxInt) != 19 { break } x := v_0 @@ -16234,7 +16195,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [21] x) // result: (LEAQ4 x (LEAQ4 x x)) for { - if v.AuxInt != 21 { + if auxIntToInt32(v.AuxInt) != 21 { break } x := v_0 @@ -16247,7 +16208,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [25] x) // result: (LEAQ8 x (LEAQ2 x x)) for { - if v.AuxInt != 25 { + if auxIntToInt32(v.AuxInt) != 25 { break } x := v_0 @@ -16260,7 +16221,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [27] x) // result: (LEAQ8 (LEAQ2 x x) (LEAQ2 x x)) for { - if v.AuxInt != 27 { + if auxIntToInt32(v.AuxInt) != 27 { break } x := v_0 @@ -16273,7 +16234,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [37] x) // result: (LEAQ4 x (LEAQ8 x x)) for { - if v.AuxInt != 37 { + if auxIntToInt32(v.AuxInt) != 37 { break } x := v_0 @@ -16286,7 +16247,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [41] x) // result: (LEAQ8 x (LEAQ4 x x)) for { - if v.AuxInt != 41 { + if auxIntToInt32(v.AuxInt) != 41 { break } x := v_0 @@ -16299,7 +16260,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [45] x) // result: (LEAQ8 (LEAQ4 x x) (LEAQ4 x x)) for { - if v.AuxInt != 45 { + if auxIntToInt32(v.AuxInt) != 45 { break } x := v_0 @@ -16312,7 +16273,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [73] x) // result: (LEAQ8 x (LEAQ8 x x)) for { - if v.AuxInt != 73 { + if auxIntToInt32(v.AuxInt) != 73 { break } x := v_0 @@ -16325,7 +16286,7 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { // match: (MULQconst [81] x) // result: (LEAQ8 (LEAQ8 x x) (LEAQ8 x x)) for { - if v.AuxInt != 81 { + if auxIntToInt32(v.AuxInt) != 81 { break } x := v_0 @@ -16336,128 +16297,128 @@ func rewriteValueAMD64_OpAMD64MULQconst(v *Value) bool { return true } // match: (MULQconst [c] x) - // cond: isPowerOfTwo(c+1) && c >= 15 - // result: (SUBQ (SHLQconst [log2(c+1)] x) x) + // cond: isPowerOfTwo(int64(c)+1) && c >= 15 + // result: (SUBQ (SHLQconst [int8(log2(int64(c)+1))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c+1) && c >= 15) { + if !(isPowerOfTwo(int64(c)+1) && c >= 15) { break } v.reset(OpAMD64SUBQ) v0 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int8ToAuxInt(int8(log2(int64(c) + 1))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULQconst [c] x) - // cond: isPowerOfTwo(c-1) && c >= 17 - // result: (LEAQ1 (SHLQconst [log2(c-1)] x) x) + // cond: isPowerOfTwo32(c-1) && c >= 17 + // result: (LEAQ1 (SHLQconst [int8(log32(c-1))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-1) && c >= 17) { + if !(isPowerOfTwo32(c-1) && c >= 17) { break } v.reset(OpAMD64LEAQ1) v0 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int8ToAuxInt(int8(log32(c - 1))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULQconst [c] x) - // cond: isPowerOfTwo(c-2) && c >= 34 - // result: (LEAQ2 (SHLQconst [log2(c-2)] x) x) + // cond: isPowerOfTwo32(c-2) && c >= 34 + // result: (LEAQ2 (SHLQconst [int8(log32(c-2))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-2) && c >= 34) { + if !(isPowerOfTwo32(c-2) && c >= 34) { break } v.reset(OpAMD64LEAQ2) v0 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v0.AuxInt = log2(c - 2) + v0.AuxInt = int8ToAuxInt(int8(log32(c - 2))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULQconst [c] x) - // cond: isPowerOfTwo(c-4) && c >= 68 - // result: (LEAQ4 (SHLQconst [log2(c-4)] x) x) + // cond: isPowerOfTwo32(c-4) && c >= 68 + // result: (LEAQ4 (SHLQconst [int8(log32(c-4))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-4) && c >= 68) { + if !(isPowerOfTwo32(c-4) && c >= 68) { break } v.reset(OpAMD64LEAQ4) v0 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v0.AuxInt = log2(c - 4) + v0.AuxInt = int8ToAuxInt(int8(log32(c - 4))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULQconst [c] x) - // cond: isPowerOfTwo(c-8) && c >= 136 - // result: (LEAQ8 (SHLQconst [log2(c-8)] x) x) + // cond: isPowerOfTwo32(c-8) && c >= 136 + // result: (LEAQ8 (SHLQconst [int8(log32(c-8))] x) x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isPowerOfTwo(c-8) && c >= 136) { + if !(isPowerOfTwo32(c-8) && c >= 136) { break } v.reset(OpAMD64LEAQ8) v0 := b.NewValue0(v.Pos, OpAMD64SHLQconst, v.Type) - v0.AuxInt = log2(c - 8) + v0.AuxInt = int8ToAuxInt(int8(log32(c - 8))) v0.AddArg(x) v.AddArg2(v0, x) return true } // match: (MULQconst [c] x) - // cond: c%3 == 0 && isPowerOfTwo(c/3) - // result: (SHLQconst [log2(c/3)] (LEAQ2 x x)) + // cond: c%3 == 0 && isPowerOfTwo32(c/3) + // result: (SHLQconst [int8(log32(c/3))] (LEAQ2 x x)) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(c%3 == 0 && isPowerOfTwo(c/3)) { + if !(c%3 == 0 && isPowerOfTwo32(c/3)) { break } v.reset(OpAMD64SHLQconst) - v.AuxInt = log2(c / 3) + v.AuxInt = int8ToAuxInt(int8(log32(c / 3))) v0 := b.NewValue0(v.Pos, OpAMD64LEAQ2, v.Type) v0.AddArg2(x, x) v.AddArg(v0) return true } // match: (MULQconst [c] x) - // cond: c%5 == 0 && isPowerOfTwo(c/5) - // result: (SHLQconst [log2(c/5)] (LEAQ4 x x)) + // cond: c%5 == 0 && isPowerOfTwo32(c/5) + // result: (SHLQconst [int8(log32(c/5))] (LEAQ4 x x)) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(c%5 == 0 && isPowerOfTwo(c/5)) { + if !(c%5 == 0 && isPowerOfTwo32(c/5)) { break } v.reset(OpAMD64SHLQconst) - v.AuxInt = log2(c / 5) + v.AuxInt = int8ToAuxInt(int8(log32(c / 5))) v0 := b.NewValue0(v.Pos, OpAMD64LEAQ4, v.Type) v0.AddArg2(x, x) v.AddArg(v0) return true } // match: (MULQconst [c] x) - // cond: c%9 == 0 && isPowerOfTwo(c/9) - // result: (SHLQconst [log2(c/9)] (LEAQ8 x x)) + // cond: c%9 == 0 && isPowerOfTwo32(c/9) + // result: (SHLQconst [int8(log32(c/9))] (LEAQ8 x x)) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(c%9 == 0 && isPowerOfTwo(c/9)) { + if !(c%9 == 0 && isPowerOfTwo32(c/9)) { break } v.reset(OpAMD64SHLQconst) - v.AuxInt = log2(c / 9) + v.AuxInt = int8ToAuxInt(int8(log32(c / 9))) v0 := b.NewValue0(v.Pos, OpAMD64LEAQ8, v.Type) v0.AddArg2(x, x) v.AddArg(v0) @@ -16531,24 +16492,24 @@ func rewriteValueAMD64_OpAMD64MULSDload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (MULSDload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MULSDload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MULSDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -16634,24 +16595,24 @@ func rewriteValueAMD64_OpAMD64MULSSload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (MULSSload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (MULSSload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64MULSSload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -16849,7 +16810,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { } y := v_0.Args[1] v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVLconst || v_0_0.AuxInt != 1 { + if v_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_0_0.AuxInt) != 1 { continue } x := v_1 @@ -16860,20 +16821,20 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { break } // match: (ORL (MOVLconst [c]) x) - // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTSLconst [log2uint32(c)] x) + // cond: isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128 + // result: (BTSLconst [int8(log32(c))] x) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpAMD64MOVLconst { continue } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_1 - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { + if !(isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128) { continue } v.reset(OpAMD64BTSLconst) - v.AuxInt = log2uint32(c) + v.AuxInt = int8ToAuxInt(int8(log32(c))) v.AddArg(x) return true } @@ -16887,9 +16848,9 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { continue } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ORLconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -16903,17 +16864,17 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRLconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 32-c) { continue } v.reset(OpAMD64ROLLconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -16928,17 +16889,17 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRWconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { continue } v.reset(OpAMD64ROLWconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -16953,17 +16914,17 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRBconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { continue } v.reset(OpAMD64ROLBconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -16997,7 +16958,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 32 { + if v_1_1_0.Op != OpAMD64CMPQconst || auxIntToInt32(v_1_1_0.AuxInt) != 32 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -17005,11 +16966,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -32 { + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -32 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 31 || y != v_1_1_0_0_0_0.Args[0] { continue } v.reset(OpAMD64ROLL) @@ -17047,7 +17008,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 32 { + if v_1_1_0.Op != OpAMD64CMPLconst || auxIntToInt32(v_1_1_0.AuxInt) != 32 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -17055,11 +17016,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -32 { + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -32 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 31 || y != v_1_1_0_0_0_0.Args[0] { continue } v.reset(OpAMD64ROLL) @@ -17097,7 +17058,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 32 { + if v_1_1_0.Op != OpAMD64CMPQconst || auxIntToInt32(v_1_1_0.AuxInt) != 32 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -17105,11 +17066,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -32 { + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -32 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 31 || y != v_1_1_0_0_0_0.Args[0] { continue } v.reset(OpAMD64RORL) @@ -17147,7 +17108,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 32 { + if v_1_1_0.Op != OpAMD64CMPLconst || auxIntToInt32(v_1_1_0.AuxInt) != 32 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -17155,11 +17116,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -32 { + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -32 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 31 || y != v_1_1_0_0_0_0.Args[0] { + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 31 || y != v_1_1_0_0_0_0.Args[0] { continue } v.reset(OpAMD64RORL) @@ -17308,7 +17269,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { _ = v_0.Args[1] x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 15 { + if v_0_1.Op != OpAMD64ANDQconst || auxIntToInt32(v_0_1.AuxInt) != 15 { continue } y := v_0_1.Args[0] @@ -17324,11 +17285,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64ADDQconst || v_1_1_0.AuxInt != -16 { + if v_1_1_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_1_1_0.AuxInt) != -16 { continue } v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0.AuxInt != 15 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 2) { + if v_1_1_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_1_1_0_0.AuxInt) != 15 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 2) { continue } v.reset(OpAMD64RORW) @@ -17348,7 +17309,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { _ = v_0.Args[1] x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 15 { + if v_0_1.Op != OpAMD64ANDLconst || auxIntToInt32(v_0_1.AuxInt) != 15 { continue } y := v_0_1.Args[0] @@ -17364,11 +17325,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64ADDLconst || v_1_1_0.AuxInt != -16 { + if v_1_1_0.Op != OpAMD64ADDLconst || auxIntToInt32(v_1_1_0.AuxInt) != -16 { continue } v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0.AuxInt != 15 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 2) { + if v_1_1_0_0.Op != OpAMD64ANDLconst || auxIntToInt32(v_1_1_0_0.AuxInt) != 15 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 2) { continue } v.reset(OpAMD64RORW) @@ -17388,7 +17349,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { _ = v_0.Args[1] x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 7 { + if v_0_1.Op != OpAMD64ANDQconst || auxIntToInt32(v_0_1.AuxInt) != 7 { continue } y := v_0_1.Args[0] @@ -17411,15 +17372,15 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpAMD64ADDQconst || v_1_0_1_0.AuxInt != -8 { + if v_1_0_1_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_1_0_1_0.AuxInt) != -8 { continue } v_1_0_1_0_0 := v_1_0_1_0.Args[0] - if v_1_0_1_0_0.Op != OpAMD64ANDQconst || v_1_0_1_0_0.AuxInt != 7 || y != v_1_0_1_0_0.Args[0] || v_1_1.Op != OpAMD64SBBLcarrymask { + if v_1_0_1_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_1_0_1_0_0.AuxInt) != 7 || y != v_1_0_1_0_0.Args[0] || v_1_1.Op != OpAMD64SBBLcarrymask { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 8 { + if v_1_1_0.Op != OpAMD64CMPQconst || auxIntToInt32(v_1_1_0.AuxInt) != 8 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -17427,11 +17388,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -8 { + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -8 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 7 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 1) { + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 7 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 1) { continue } v.reset(OpAMD64ROLB) @@ -17452,7 +17413,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { _ = v_0.Args[1] x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 7 { + if v_0_1.Op != OpAMD64ANDLconst || auxIntToInt32(v_0_1.AuxInt) != 7 { continue } y := v_0_1.Args[0] @@ -17475,15 +17436,15 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_0_1_0 := v_1_0_1.Args[0] - if v_1_0_1_0.Op != OpAMD64ADDLconst || v_1_0_1_0.AuxInt != -8 { + if v_1_0_1_0.Op != OpAMD64ADDLconst || auxIntToInt32(v_1_0_1_0.AuxInt) != -8 { continue } v_1_0_1_0_0 := v_1_0_1_0.Args[0] - if v_1_0_1_0_0.Op != OpAMD64ANDLconst || v_1_0_1_0_0.AuxInt != 7 || y != v_1_0_1_0_0.Args[0] || v_1_1.Op != OpAMD64SBBLcarrymask { + if v_1_0_1_0_0.Op != OpAMD64ANDLconst || auxIntToInt32(v_1_0_1_0_0.AuxInt) != 7 || y != v_1_0_1_0_0.Args[0] || v_1_1.Op != OpAMD64SBBLcarrymask { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 8 { + if v_1_1_0.Op != OpAMD64CMPLconst || auxIntToInt32(v_1_1_0.AuxInt) != 8 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -17491,11 +17452,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -8 { + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -8 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 7 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 1) { + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 7 || y != v_1_1_0_0_0_0.Args[0] || !(v.Type.Size() == 1) { continue } v.reset(OpAMD64ROLB) @@ -17516,7 +17477,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { _ = v_0.Args[1] x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDQconst || v_0_1.AuxInt != 7 { + if v_0_1.Op != OpAMD64ANDQconst || auxIntToInt32(v_0_1.AuxInt) != 7 { continue } y := v_0_1.Args[0] @@ -17532,11 +17493,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64ADDQconst || v_1_1_0.AuxInt != -8 { + if v_1_1_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_1_1_0.AuxInt) != -8 { continue } v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0.AuxInt != 7 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 1) { + if v_1_1_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_1_1_0_0.AuxInt) != 7 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 1) { continue } v.reset(OpAMD64RORB) @@ -17556,7 +17517,7 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { _ = v_0.Args[1] x := v_0.Args[0] v_0_1 := v_0.Args[1] - if v_0_1.Op != OpAMD64ANDLconst || v_0_1.AuxInt != 7 { + if v_0_1.Op != OpAMD64ANDLconst || auxIntToInt32(v_0_1.AuxInt) != 7 { continue } y := v_0_1.Args[0] @@ -17572,11 +17533,11 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64ADDLconst || v_1_1_0.AuxInt != -8 { + if v_1_1_0.Op != OpAMD64ADDLconst || auxIntToInt32(v_1_1_0.AuxInt) != -8 { continue } v_1_1_0_0 := v_1_1_0.Args[0] - if v_1_1_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0.AuxInt != 7 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 1) { + if v_1_1_0_0.Op != OpAMD64ANDLconst || auxIntToInt32(v_1_1_0_0.AuxInt) != 7 || y != v_1_1_0_0.Args[0] || !(v.Type.Size() == 1) { continue } v.reset(OpAMD64RORB) @@ -18203,16 +18164,16 @@ func rewriteValueAMD64_OpAMD64ORL(v *Value) bool { func rewriteValueAMD64_OpAMD64ORLconst(v *Value) bool { v_0 := v.Args[0] // match: (ORLconst [c] x) - // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTSLconst [log2uint32(c)] x) + // cond: isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128 + // result: (BTSLconst [int8(log32(c))] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { + if !(isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128) { break } v.reset(OpAMD64BTSLconst) - v.AuxInt = log2uint32(c) + v.AuxInt = int8ToAuxInt(int8(log32(c))) v.AddArg(x) return true } @@ -18286,23 +18247,23 @@ func rewriteValueAMD64_OpAMD64ORLconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ORLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ORLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (ORLconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64ORLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -18337,24 +18298,24 @@ func rewriteValueAMD64_OpAMD64ORLload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ORLload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ORLload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ORLload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -18408,24 +18369,24 @@ func rewriteValueAMD64_OpAMD64ORLmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ORLmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ORLmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ORLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -18468,7 +18429,7 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { } y := v_0.Args[1] v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVQconst || v_0_0.AuxInt != 1 { + if v_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_0_0.AuxInt) != 1 { continue } x := v_1 @@ -18480,19 +18441,19 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { } // match: (ORQ (MOVQconst [c]) x) // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTSQconst [log2(c)] x) + // result: (BTSQconst [int8(log2(c))] x) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpAMD64MOVQconst { continue } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { continue } v.reset(OpAMD64BTSQconst) - v.AuxInt = log2(c) + v.AuxInt = int8ToAuxInt(int8(log2(c))) v.AddArg(x) return true } @@ -18500,19 +18461,19 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { } // match: (ORQ x (MOVQconst [c])) // cond: is32Bit(c) - // result: (ORQconst [c] x) + // result: (ORQconst [int32(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 != OpAMD64MOVQconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { continue } v.reset(OpAMD64ORQconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -18526,9 +18487,9 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { continue } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ORQconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -18542,17 +18503,17 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { if v_0.Op != OpAMD64SHLQconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRQconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 64-c) { continue } v.reset(OpAMD64ROLQconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -18586,7 +18547,7 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 64 { + if v_1_1_0.Op != OpAMD64CMPQconst || auxIntToInt32(v_1_1_0.AuxInt) != 64 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -18594,11 +18555,11 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -64 { + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -64 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 63 || y != v_1_1_0_0_0_0.Args[0] { continue } v.reset(OpAMD64ROLQ) @@ -18636,7 +18597,7 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 64 { + if v_1_1_0.Op != OpAMD64CMPLconst || auxIntToInt32(v_1_1_0.AuxInt) != 64 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -18644,11 +18605,11 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -64 { + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -64 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 63 || y != v_1_1_0_0_0_0.Args[0] { continue } v.reset(OpAMD64ROLQ) @@ -18686,7 +18647,7 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPQconst || v_1_1_0.AuxInt != 64 { + if v_1_1_0.Op != OpAMD64CMPQconst || auxIntToInt32(v_1_1_0.AuxInt) != 64 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -18694,11 +18655,11 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDQconst || v_1_1_0_0_0.AuxInt != -64 { + if v_1_1_0_0_0.Op != OpAMD64ADDQconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -64 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { + if v_1_1_0_0_0_0.Op != OpAMD64ANDQconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 63 || y != v_1_1_0_0_0_0.Args[0] { continue } v.reset(OpAMD64RORQ) @@ -18736,7 +18697,7 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { continue } v_1_1_0 := v_1_1.Args[0] - if v_1_1_0.Op != OpAMD64CMPLconst || v_1_1_0.AuxInt != 64 { + if v_1_1_0.Op != OpAMD64CMPLconst || auxIntToInt32(v_1_1_0.AuxInt) != 64 { continue } v_1_1_0_0 := v_1_1_0.Args[0] @@ -18744,11 +18705,11 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { continue } v_1_1_0_0_0 := v_1_1_0_0.Args[0] - if v_1_1_0_0_0.Op != OpAMD64ADDLconst || v_1_1_0_0_0.AuxInt != -64 { + if v_1_1_0_0_0.Op != OpAMD64ADDLconst || auxIntToInt32(v_1_1_0_0_0.AuxInt) != -64 { continue } v_1_1_0_0_0_0 := v_1_1_0_0_0.Args[0] - if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || v_1_1_0_0_0_0.AuxInt != 63 || y != v_1_1_0_0_0_0.Args[0] { + if v_1_1_0_0_0_0.Op != OpAMD64ANDLconst || auxIntToInt32(v_1_1_0_0_0_0.AuxInt) != 63 || y != v_1_1_0_0_0_0.Args[0] { continue } v.reset(OpAMD64RORQ) @@ -19830,16 +19791,16 @@ func rewriteValueAMD64_OpAMD64ORQ(v *Value) bool { func rewriteValueAMD64_OpAMD64ORQconst(v *Value) bool { v_0 := v.Args[0] // match: (ORQconst [c] x) - // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTSQconst [log2(c)] x) + // cond: isUint64PowerOfTwo(int64(c)) && uint64(c) >= 128 + // result: (BTSQconst [int8(log32(c))] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { + if !(isUint64PowerOfTwo(int64(c)) && uint64(c) >= 128) { break } v.reset(OpAMD64BTSQconst) - v.AuxInt = log2(c) + v.AuxInt = int8ToAuxInt(int8(log32(c))) v.AddArg(x) return true } @@ -19913,23 +19874,23 @@ func rewriteValueAMD64_OpAMD64ORQconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ORQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (ORQconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (ORQconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64ORQconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -19964,24 +19925,24 @@ func rewriteValueAMD64_OpAMD64ORQload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (ORQload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ORQload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ORQload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -20035,24 +19996,24 @@ func rewriteValueAMD64_OpAMD64ORQmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (ORQmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (ORQmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64ORQmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -20109,28 +20070,28 @@ func rewriteValueAMD64_OpAMD64ROLB(v *Value) bool { return true } // match: (ROLB x (MOVQconst [c])) - // result: (ROLBconst [c&7 ] x) + // result: (ROLBconst [int8(c&7) ] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64ROLBconst) - v.AuxInt = c & 7 + v.AuxInt = int8ToAuxInt(int8(c & 7)) v.AddArg(x) return true } // match: (ROLB x (MOVLconst [c])) - // result: (ROLBconst [c&7 ] x) + // result: (ROLBconst [int8(c&7) ] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ROLBconst) - v.AuxInt = c & 7 + v.AuxInt = int8ToAuxInt(int8(c & 7)) v.AddArg(x) return true } @@ -20141,21 +20102,21 @@ func rewriteValueAMD64_OpAMD64ROLBconst(v *Value) bool { // match: (ROLBconst [c] (ROLBconst [d] x)) // result: (ROLBconst [(c+d)& 7] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64ROLBconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] v.reset(OpAMD64ROLBconst) - v.AuxInt = (c + d) & 7 + v.AuxInt = int8ToAuxInt((c + d) & 7) v.AddArg(x) return true } // match: (ROLBconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -20192,28 +20153,28 @@ func rewriteValueAMD64_OpAMD64ROLL(v *Value) bool { return true } // match: (ROLL x (MOVQconst [c])) - // result: (ROLLconst [c&31] x) + // result: (ROLLconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64ROLLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } // match: (ROLL x (MOVLconst [c])) - // result: (ROLLconst [c&31] x) + // result: (ROLLconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ROLLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } @@ -20224,21 +20185,21 @@ func rewriteValueAMD64_OpAMD64ROLLconst(v *Value) bool { // match: (ROLLconst [c] (ROLLconst [d] x)) // result: (ROLLconst [(c+d)&31] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64ROLLconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] v.reset(OpAMD64ROLLconst) - v.AuxInt = (c + d) & 31 + v.AuxInt = int8ToAuxInt((c + d) & 31) v.AddArg(x) return true } // match: (ROLLconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -20275,28 +20236,28 @@ func rewriteValueAMD64_OpAMD64ROLQ(v *Value) bool { return true } // match: (ROLQ x (MOVQconst [c])) - // result: (ROLQconst [c&63] x) + // result: (ROLQconst [int8(c&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64ROLQconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (ROLQ x (MOVLconst [c])) - // result: (ROLQconst [c&63] x) + // result: (ROLQconst [int8(c&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ROLQconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } @@ -20307,21 +20268,21 @@ func rewriteValueAMD64_OpAMD64ROLQconst(v *Value) bool { // match: (ROLQconst [c] (ROLQconst [d] x)) // result: (ROLQconst [(c+d)&63] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64ROLQconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] v.reset(OpAMD64ROLQconst) - v.AuxInt = (c + d) & 63 + v.AuxInt = int8ToAuxInt((c + d) & 63) v.AddArg(x) return true } // match: (ROLQconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -20358,28 +20319,28 @@ func rewriteValueAMD64_OpAMD64ROLW(v *Value) bool { return true } // match: (ROLW x (MOVQconst [c])) - // result: (ROLWconst [c&15] x) + // result: (ROLWconst [int8(c&15)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64ROLWconst) - v.AuxInt = c & 15 + v.AuxInt = int8ToAuxInt(int8(c & 15)) v.AddArg(x) return true } // match: (ROLW x (MOVLconst [c])) - // result: (ROLWconst [c&15] x) + // result: (ROLWconst [int8(c&15)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ROLWconst) - v.AuxInt = c & 15 + v.AuxInt = int8ToAuxInt(int8(c & 15)) v.AddArg(x) return true } @@ -20390,21 +20351,21 @@ func rewriteValueAMD64_OpAMD64ROLWconst(v *Value) bool { // match: (ROLWconst [c] (ROLWconst [d] x)) // result: (ROLWconst [(c+d)&15] x) for { - c := v.AuxInt + c := auxIntToInt8(v.AuxInt) if v_0.Op != OpAMD64ROLWconst { break } - d := v_0.AuxInt + d := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] v.reset(OpAMD64ROLWconst) - v.AuxInt = (c + d) & 15 + v.AuxInt = int8ToAuxInt((c + d) & 15) v.AddArg(x) return true } // match: (ROLWconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -20441,28 +20402,28 @@ func rewriteValueAMD64_OpAMD64RORB(v *Value) bool { return true } // match: (RORB x (MOVQconst [c])) - // result: (ROLBconst [(-c)&7 ] x) + // result: (ROLBconst [int8((-c)&7) ] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64ROLBconst) - v.AuxInt = (-c) & 7 + v.AuxInt = int8ToAuxInt(int8((-c) & 7)) v.AddArg(x) return true } // match: (RORB x (MOVLconst [c])) - // result: (ROLBconst [(-c)&7 ] x) + // result: (ROLBconst [int8((-c)&7) ] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ROLBconst) - v.AuxInt = (-c) & 7 + v.AuxInt = int8ToAuxInt(int8((-c) & 7)) v.AddArg(x) return true } @@ -20496,28 +20457,28 @@ func rewriteValueAMD64_OpAMD64RORL(v *Value) bool { return true } // match: (RORL x (MOVQconst [c])) - // result: (ROLLconst [(-c)&31] x) + // result: (ROLLconst [int8((-c)&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64ROLLconst) - v.AuxInt = (-c) & 31 + v.AuxInt = int8ToAuxInt(int8((-c) & 31)) v.AddArg(x) return true } // match: (RORL x (MOVLconst [c])) - // result: (ROLLconst [(-c)&31] x) + // result: (ROLLconst [int8((-c)&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ROLLconst) - v.AuxInt = (-c) & 31 + v.AuxInt = int8ToAuxInt(int8((-c) & 31)) v.AddArg(x) return true } @@ -20551,28 +20512,28 @@ func rewriteValueAMD64_OpAMD64RORQ(v *Value) bool { return true } // match: (RORQ x (MOVQconst [c])) - // result: (ROLQconst [(-c)&63] x) + // result: (ROLQconst [int8((-c)&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64ROLQconst) - v.AuxInt = (-c) & 63 + v.AuxInt = int8ToAuxInt(int8((-c) & 63)) v.AddArg(x) return true } // match: (RORQ x (MOVLconst [c])) - // result: (ROLQconst [(-c)&63] x) + // result: (ROLQconst [int8((-c)&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ROLQconst) - v.AuxInt = (-c) & 63 + v.AuxInt = int8ToAuxInt(int8((-c) & 63)) v.AddArg(x) return true } @@ -20606,28 +20567,28 @@ func rewriteValueAMD64_OpAMD64RORW(v *Value) bool { return true } // match: (RORW x (MOVQconst [c])) - // result: (ROLWconst [(-c)&15] x) + // result: (ROLWconst [int8((-c)&15)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64ROLWconst) - v.AuxInt = (-c) & 15 + v.AuxInt = int8ToAuxInt(int8((-c) & 15)) v.AddArg(x) return true } // match: (RORW x (MOVLconst [c])) - // result: (ROLWconst [(-c)&15] x) + // result: (ROLWconst [int8((-c)&15)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64ROLWconst) - v.AuxInt = (-c) & 15 + v.AuxInt = int8ToAuxInt(int8((-c) & 15)) v.AddArg(x) return true } @@ -20637,28 +20598,28 @@ func rewriteValueAMD64_OpAMD64SARB(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (SARB x (MOVQconst [c])) - // result: (SARBconst [min(c&31,7)] x) + // result: (SARBconst [int8(min(int64(c)&31,7))] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64SARBconst) - v.AuxInt = min(c&31, 7) + v.AuxInt = int8ToAuxInt(int8(min(int64(c)&31, 7))) v.AddArg(x) return true } // match: (SARB x (MOVLconst [c])) - // result: (SARBconst [min(c&31,7)] x) + // result: (SARBconst [int8(min(int64(c)&31,7))] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SARBconst) - v.AuxInt = min(c&31, 7) + v.AuxInt = int8ToAuxInt(int8(min(int64(c)&31, 7))) v.AddArg(x) return true } @@ -20669,7 +20630,7 @@ func rewriteValueAMD64_OpAMD64SARBconst(v *Value) bool { // match: (SARBconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -20695,28 +20656,28 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (SARL x (MOVQconst [c])) - // result: (SARLconst [c&31] x) + // result: (SARLconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64SARLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } // match: (SARL x (MOVLconst [c])) - // result: (SARLconst [c&31] x) + // result: (SARLconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SARLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } @@ -20728,7 +20689,7 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { if v_1.Op != OpAMD64ADDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 0) { break @@ -20750,7 +20711,7 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { if v_1_0.Op != OpAMD64ADDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 0) { break @@ -20769,7 +20730,7 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { if v_1.Op != OpAMD64ANDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 31) { break @@ -20791,7 +20752,7 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { if v_1_0.Op != OpAMD64ANDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 31) { break @@ -20810,7 +20771,7 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { if v_1.Op != OpAMD64ADDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 0) { break @@ -20832,7 +20793,7 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { if v_1_0.Op != OpAMD64ADDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 0) { break @@ -20851,7 +20812,7 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { if v_1.Op != OpAMD64ANDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 31) { break @@ -20873,7 +20834,7 @@ func rewriteValueAMD64_OpAMD64SARL(v *Value) bool { if v_1_0.Op != OpAMD64ANDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 31) { break @@ -20891,7 +20852,7 @@ func rewriteValueAMD64_OpAMD64SARLconst(v *Value) bool { // match: (SARLconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -20917,28 +20878,28 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (SARQ x (MOVQconst [c])) - // result: (SARQconst [c&63] x) + // result: (SARQconst [int8(c&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64SARQconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SARQ x (MOVLconst [c])) - // result: (SARQconst [c&63] x) + // result: (SARQconst [int8(c&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SARQconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } @@ -20950,7 +20911,7 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { if v_1.Op != OpAMD64ADDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 0) { break @@ -20972,7 +20933,7 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { if v_1_0.Op != OpAMD64ADDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 0) { break @@ -20991,7 +20952,7 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { if v_1.Op != OpAMD64ANDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 63) { break @@ -21013,7 +20974,7 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { if v_1_0.Op != OpAMD64ANDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 63) { break @@ -21032,7 +20993,7 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { if v_1.Op != OpAMD64ADDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 0) { break @@ -21054,7 +21015,7 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { if v_1_0.Op != OpAMD64ADDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 0) { break @@ -21073,7 +21034,7 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { if v_1.Op != OpAMD64ANDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 63) { break @@ -21095,7 +21056,7 @@ func rewriteValueAMD64_OpAMD64SARQ(v *Value) bool { if v_1_0.Op != OpAMD64ANDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 63) { break @@ -21113,7 +21074,7 @@ func rewriteValueAMD64_OpAMD64SARQconst(v *Value) bool { // match: (SARQconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -21138,28 +21099,28 @@ func rewriteValueAMD64_OpAMD64SARW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (SARW x (MOVQconst [c])) - // result: (SARWconst [min(c&31,15)] x) + // result: (SARWconst [int8(min(int64(c)&31,15))] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64SARWconst) - v.AuxInt = min(c&31, 15) + v.AuxInt = int8ToAuxInt(int8(min(int64(c)&31, 15))) v.AddArg(x) return true } // match: (SARW x (MOVLconst [c])) - // result: (SARWconst [min(c&31,15)] x) + // result: (SARWconst [int8(min(int64(c)&31,15))] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SARWconst) - v.AuxInt = min(c&31, 15) + v.AuxInt = int8ToAuxInt(int8(min(int64(c)&31, 15))) v.AddArg(x) return true } @@ -21170,7 +21131,7 @@ func rewriteValueAMD64_OpAMD64SARWconst(v *Value) bool { // match: (SARWconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -21421,7 +21382,7 @@ func rewriteValueAMD64_OpAMD64SETA(v *Value) bool { func rewriteValueAMD64_OpAMD64SETAE(v *Value) bool { v_0 := v.Args[0] // match: (SETAE (TESTQ x x)) - // result: (ConstBool [1]) + // result: (ConstBool [true]) for { if v_0.Op != OpAMD64TESTQ { break @@ -21431,11 +21392,11 @@ func rewriteValueAMD64_OpAMD64SETAE(v *Value) bool { break } v.reset(OpConstBool) - v.AuxInt = 1 + v.AuxInt = boolToAuxInt(true) return true } // match: (SETAE (TESTL x x)) - // result: (ConstBool [1]) + // result: (ConstBool [true]) for { if v_0.Op != OpAMD64TESTL { break @@ -21445,11 +21406,11 @@ func rewriteValueAMD64_OpAMD64SETAE(v *Value) bool { break } v.reset(OpConstBool) - v.AuxInt = 1 + v.AuxInt = boolToAuxInt(true) return true } // match: (SETAE (TESTW x x)) - // result: (ConstBool [1]) + // result: (ConstBool [true]) for { if v_0.Op != OpAMD64TESTW { break @@ -21459,11 +21420,11 @@ func rewriteValueAMD64_OpAMD64SETAE(v *Value) bool { break } v.reset(OpConstBool) - v.AuxInt = 1 + v.AuxInt = boolToAuxInt(true) return true } // match: (SETAE (TESTB x x)) - // result: (ConstBool [1]) + // result: (ConstBool [true]) for { if v_0.Op != OpAMD64TESTB { break @@ -21473,7 +21434,7 @@ func rewriteValueAMD64_OpAMD64SETAE(v *Value) bool { break } v.reset(OpConstBool) - v.AuxInt = 1 + v.AuxInt = boolToAuxInt(true) return true } // match: (SETAE (InvertFlags x)) @@ -21548,8 +21509,8 @@ func rewriteValueAMD64_OpAMD64SETAEstore(v *Value) bool { // match: (SETAEstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETBEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -21557,30 +21518,30 @@ func rewriteValueAMD64_OpAMD64SETAEstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETBEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETAEstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETAEstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETAEstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -21708,8 +21669,8 @@ func rewriteValueAMD64_OpAMD64SETAstore(v *Value) bool { // match: (SETAstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETBstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -21717,30 +21678,30 @@ func rewriteValueAMD64_OpAMD64SETAstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETAstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETAstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETAstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -21862,7 +21823,7 @@ func rewriteValueAMD64_OpAMD64SETAstore(v *Value) bool { func rewriteValueAMD64_OpAMD64SETB(v *Value) bool { v_0 := v.Args[0] // match: (SETB (TESTQ x x)) - // result: (ConstBool [0]) + // result: (ConstBool [false]) for { if v_0.Op != OpAMD64TESTQ { break @@ -21872,11 +21833,11 @@ func rewriteValueAMD64_OpAMD64SETB(v *Value) bool { break } v.reset(OpConstBool) - v.AuxInt = 0 + v.AuxInt = boolToAuxInt(false) return true } // match: (SETB (TESTL x x)) - // result: (ConstBool [0]) + // result: (ConstBool [false]) for { if v_0.Op != OpAMD64TESTL { break @@ -21886,11 +21847,11 @@ func rewriteValueAMD64_OpAMD64SETB(v *Value) bool { break } v.reset(OpConstBool) - v.AuxInt = 0 + v.AuxInt = boolToAuxInt(false) return true } // match: (SETB (TESTW x x)) - // result: (ConstBool [0]) + // result: (ConstBool [false]) for { if v_0.Op != OpAMD64TESTW { break @@ -21900,11 +21861,11 @@ func rewriteValueAMD64_OpAMD64SETB(v *Value) bool { break } v.reset(OpConstBool) - v.AuxInt = 0 + v.AuxInt = boolToAuxInt(false) return true } // match: (SETB (TESTB x x)) - // result: (ConstBool [0]) + // result: (ConstBool [false]) for { if v_0.Op != OpAMD64TESTB { break @@ -21914,7 +21875,7 @@ func rewriteValueAMD64_OpAMD64SETB(v *Value) bool { break } v.reset(OpConstBool) - v.AuxInt = 0 + v.AuxInt = boolToAuxInt(false) return true } // match: (SETB (BTLconst [0] x)) @@ -22078,8 +22039,8 @@ func rewriteValueAMD64_OpAMD64SETBEstore(v *Value) bool { // match: (SETBEstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETAEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -22087,30 +22048,30 @@ func rewriteValueAMD64_OpAMD64SETBEstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETBEstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETBEstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETBEstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -22238,8 +22199,8 @@ func rewriteValueAMD64_OpAMD64SETBstore(v *Value) bool { // match: (SETBstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETAstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -22247,30 +22208,30 @@ func rewriteValueAMD64_OpAMD64SETBstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETAstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETBstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETBstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETBstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -22407,7 +22368,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { } x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_0_0_0.AuxInt) != 1 { continue } y := v_0_1 @@ -22434,7 +22395,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { } x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { continue } y := v_0_1 @@ -22447,46 +22408,46 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { break } // match: (SETEQ (TESTLconst [c] x)) - // cond: isUint32PowerOfTwo(c) - // result: (SETAE (BTLconst [log2uint32(c)] x)) + // cond: isUint32PowerOfTwo(int64(c)) + // result: (SETAE (BTLconst [int8(log32(c))] x)) for { if v_0.Op != OpAMD64TESTLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(isUint32PowerOfTwo(c)) { + if !(isUint32PowerOfTwo(int64(c))) { break } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) v.AddArg(v0) return true } // match: (SETEQ (TESTQconst [c] x)) - // cond: isUint64PowerOfTwo(c) - // result: (SETAE (BTQconst [log2(c)] x)) + // cond: isUint64PowerOfTwo(int64(c)) + // result: (SETAE (BTQconst [int8(log32(c))] x)) for { if v_0.Op != OpAMD64TESTQconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(isUint64PowerOfTwo(c)) { + if !(isUint64PowerOfTwo(int64(c))) { break } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) v.AddArg(v0) return true } // match: (SETEQ (TESTQ (MOVQconst [c]) x)) // cond: isUint64PowerOfTwo(c) - // result: (SETAE (BTQconst [log2(c)] x)) + // result: (SETAE (BTQconst [int8(log2(c))] x)) for { if v_0.Op != OpAMD64TESTQ { break @@ -22498,14 +22459,14 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { if v_0_0.Op != OpAMD64MOVQconst { continue } - c := v_0_0.AuxInt + c := auxIntToInt64(v_0_0.AuxInt) x := v_0_1 if !(isUint64PowerOfTwo(c)) { continue } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log2(c))) v0.AddArg(x) v.AddArg(v0) return true @@ -22515,16 +22476,16 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { // match: (SETEQ (CMPLconst [1] s:(ANDLconst [1] _))) // result: (SETNE (CMPLconst [0] s)) for { - if v_0.Op != OpAMD64CMPLconst || v_0.AuxInt != 1 { + if v_0.Op != OpAMD64CMPLconst || auxIntToInt32(v_0.AuxInt) != 1 { break } s := v_0.Args[0] - if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + if s.Op != OpAMD64ANDLconst || auxIntToInt32(s.AuxInt) != 1 { break } v.reset(OpAMD64SETNE) v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v0.AddArg(s) v.AddArg(v0) return true @@ -22532,16 +22493,16 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { // match: (SETEQ (CMPQconst [1] s:(ANDQconst [1] _))) // result: (SETNE (CMPQconst [0] s)) for { - if v_0.Op != OpAMD64CMPQconst || v_0.AuxInt != 1 { + if v_0.Op != OpAMD64CMPQconst || auxIntToInt32(v_0.AuxInt) != 1 { break } s := v_0.Args[0] - if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + if s.Op != OpAMD64ANDQconst || auxIntToInt32(s.AuxInt) != 1 { break } v.reset(OpAMD64SETNE) v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v0.AddArg(s) v.AddArg(v0) return true @@ -22558,11 +22519,11 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHLQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -22572,7 +22533,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) v.AddArg(v0) return true @@ -22591,11 +22552,11 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHLLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -22605,7 +22566,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) v.AddArg(v0) return true @@ -22624,11 +22585,11 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHLQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -22638,7 +22599,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) v.AddArg(v0) return true @@ -22657,11 +22618,11 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHLLconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -22671,7 +22632,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) v.AddArg(v0) return true @@ -22690,7 +22651,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } x := z1.Args[0] @@ -22700,7 +22661,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) v.AddArg(v0) return true @@ -22719,7 +22680,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } x := z1.Args[0] @@ -22729,7 +22690,7 @@ func rewriteValueAMD64_OpAMD64SETEQ(v *Value) bool { } v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) v.AddArg(v0) return true @@ -22808,8 +22769,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // match: (SETEQstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) // result: (SETAEstore [off] {sym} ptr (BTL x y) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTL { break @@ -22823,14 +22784,14 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { } x := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVLconst || v_1_0_0.AuxInt != 1 { + if v_1_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_1_0_0.AuxInt) != 1 { continue } y := v_1_1 mem := v_2 v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) v0.AddArg2(x, y) v.AddArg3(ptr, v0, mem) @@ -22841,8 +22802,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // match: (SETEQstore [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem) // result: (SETAEstore [off] {sym} ptr (BTQ x y) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -22856,14 +22817,14 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { } x := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVQconst || v_1_0_0.AuxInt != 1 { + if v_1_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_1_0_0.AuxInt) != 1 { continue } y := v_1_1 mem := v_2 v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) v0.AddArg2(x, y) v.AddArg3(ptr, v0, mem) @@ -22872,61 +22833,61 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { break } // match: (SETEQstore [off] {sym} ptr (TESTLconst [c] x) mem) - // cond: isUint32PowerOfTwo(c) - // result: (SETAEstore [off] {sym} ptr (BTLconst [log2uint32(c)] x) mem) + // cond: isUint32PowerOfTwo(int64(c)) + // result: (SETAEstore [off] {sym} ptr (BTLconst [int8(log32(c))] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) x := v_1.Args[0] mem := v_2 - if !(isUint32PowerOfTwo(c)) { + if !(isUint32PowerOfTwo(int64(c))) { break } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true } // match: (SETEQstore [off] {sym} ptr (TESTQconst [c] x) mem) - // cond: isUint64PowerOfTwo(c) - // result: (SETAEstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + // cond: isUint64PowerOfTwo(int64(c)) + // result: (SETAEstore [off] {sym} ptr (BTQconst [int8(log32(c))] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) x := v_1.Args[0] mem := v_2 - if !(isUint64PowerOfTwo(c)) { + if !(isUint64PowerOfTwo(int64(c))) { break } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true } // match: (SETEQstore [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem) // cond: isUint64PowerOfTwo(c) - // result: (SETAEstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + // result: (SETAEstore [off] {sym} ptr (BTQconst [int8(log2(c))] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -22938,17 +22899,17 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { if v_1_0.Op != OpAMD64MOVQconst { continue } - c := v_1_0.AuxInt + c := auxIntToInt64(v_1_0.AuxInt) x := v_1_1 mem := v_2 if !(isUint64PowerOfTwo(c)) { continue } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log2(c))) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -22958,22 +22919,22 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // match: (SETEQstore [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem) // result: (SETNEstore [off] {sym} ptr (CMPLconst [0] s) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 - if v_1.Op != OpAMD64CMPLconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64CMPLconst || auxIntToInt32(v_1.AuxInt) != 1 { break } s := v_1.Args[0] - if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + if s.Op != OpAMD64ANDLconst || auxIntToInt32(s.AuxInt) != 1 { break } mem := v_2 v.reset(OpAMD64SETNEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v0.AddArg(s) v.AddArg3(ptr, v0, mem) return true @@ -22981,22 +22942,22 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // match: (SETEQstore [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem) // result: (SETNEstore [off] {sym} ptr (CMPQconst [0] s) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 - if v_1.Op != OpAMD64CMPQconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64CMPQconst || auxIntToInt32(v_1.AuxInt) != 1 { break } s := v_1.Args[0] - if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + if s.Op != OpAMD64ANDQconst || auxIntToInt32(s.AuxInt) != 1 { break } mem := v_2 v.reset(OpAMD64SETNEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v0.AddArg(s) v.AddArg3(ptr, v0, mem) return true @@ -23005,8 +22966,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // cond: z1==z2 // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -23016,11 +22977,11 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHLQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -23030,10 +22991,10 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { continue } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -23044,8 +23005,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // cond: z1==z2 // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTL { break @@ -23055,11 +23016,11 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHLLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRLconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHRLconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -23069,10 +23030,10 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { continue } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -23083,8 +23044,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // cond: z1==z2 // result: (SETAEstore [off] {sym} ptr (BTQconst [0] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -23094,11 +23055,11 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHLQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -23108,10 +23069,10 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { continue } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -23122,8 +23083,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // cond: z1==z2 // result: (SETAEstore [off] {sym} ptr (BTLconst [0] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTL { break @@ -23133,11 +23094,11 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHLLconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -23147,10 +23108,10 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { continue } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -23161,8 +23122,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // cond: z1==z2 // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -23172,7 +23133,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } x := z1.Args[0] @@ -23182,10 +23143,10 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { continue } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -23196,8 +23157,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // cond: z1==z2 // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTL { break @@ -23207,7 +23168,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } x := z1.Args[0] @@ -23217,10 +23178,10 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { continue } v.reset(OpAMD64SETAEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -23230,8 +23191,8 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { // match: (SETEQstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETEQstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -23239,30 +23200,30 @@ func rewriteValueAMD64_OpAMD64SETEQstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETEQstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETEQstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETEQstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETEQstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -23520,8 +23481,8 @@ func rewriteValueAMD64_OpAMD64SETGEstore(v *Value) bool { // match: (SETGEstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETLEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -23529,30 +23490,30 @@ func rewriteValueAMD64_OpAMD64SETGEstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETLEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETGEstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETGEstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETGEstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -23680,8 +23641,8 @@ func rewriteValueAMD64_OpAMD64SETGstore(v *Value) bool { // match: (SETGstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETLstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -23689,30 +23650,30 @@ func rewriteValueAMD64_OpAMD64SETGstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETLstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETGstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETGstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETGstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -23970,8 +23931,8 @@ func rewriteValueAMD64_OpAMD64SETLEstore(v *Value) bool { // match: (SETLEstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETGEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -23979,30 +23940,30 @@ func rewriteValueAMD64_OpAMD64SETLEstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETGEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETLEstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETLEstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETLEstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -24130,8 +24091,8 @@ func rewriteValueAMD64_OpAMD64SETLstore(v *Value) bool { // match: (SETLstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETGstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -24139,30 +24100,30 @@ func rewriteValueAMD64_OpAMD64SETLstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETGstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETLstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETLstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETLstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -24323,7 +24284,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { } x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_0_0_0.AuxInt) != 1 { continue } y := v_0_1 @@ -24350,7 +24311,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { } x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { continue } y := v_0_1 @@ -24363,46 +24324,46 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { break } // match: (SETNE (TESTLconst [c] x)) - // cond: isUint32PowerOfTwo(c) - // result: (SETB (BTLconst [log2uint32(c)] x)) + // cond: isUint32PowerOfTwo(int64(c)) + // result: (SETB (BTLconst [int8(log32(c))] x)) for { if v_0.Op != OpAMD64TESTLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(isUint32PowerOfTwo(c)) { + if !(isUint32PowerOfTwo(int64(c))) { break } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) v.AddArg(v0) return true } // match: (SETNE (TESTQconst [c] x)) - // cond: isUint64PowerOfTwo(c) - // result: (SETB (BTQconst [log2(c)] x)) + // cond: isUint64PowerOfTwo(int64(c)) + // result: (SETB (BTQconst [int8(log32(c))] x)) for { if v_0.Op != OpAMD64TESTQconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(isUint64PowerOfTwo(c)) { + if !(isUint64PowerOfTwo(int64(c))) { break } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) v.AddArg(v0) return true } // match: (SETNE (TESTQ (MOVQconst [c]) x)) // cond: isUint64PowerOfTwo(c) - // result: (SETB (BTQconst [log2(c)] x)) + // result: (SETB (BTQconst [int8(log2(c))] x)) for { if v_0.Op != OpAMD64TESTQ { break @@ -24414,14 +24375,14 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { if v_0_0.Op != OpAMD64MOVQconst { continue } - c := v_0_0.AuxInt + c := auxIntToInt64(v_0_0.AuxInt) x := v_0_1 if !(isUint64PowerOfTwo(c)) { continue } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log2(c))) v0.AddArg(x) v.AddArg(v0) return true @@ -24431,16 +24392,16 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { // match: (SETNE (CMPLconst [1] s:(ANDLconst [1] _))) // result: (SETEQ (CMPLconst [0] s)) for { - if v_0.Op != OpAMD64CMPLconst || v_0.AuxInt != 1 { + if v_0.Op != OpAMD64CMPLconst || auxIntToInt32(v_0.AuxInt) != 1 { break } s := v_0.Args[0] - if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + if s.Op != OpAMD64ANDLconst || auxIntToInt32(s.AuxInt) != 1 { break } v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v0.AddArg(s) v.AddArg(v0) return true @@ -24448,16 +24409,16 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { // match: (SETNE (CMPQconst [1] s:(ANDQconst [1] _))) // result: (SETEQ (CMPQconst [0] s)) for { - if v_0.Op != OpAMD64CMPQconst || v_0.AuxInt != 1 { + if v_0.Op != OpAMD64CMPQconst || auxIntToInt32(v_0.AuxInt) != 1 { break } s := v_0.Args[0] - if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + if s.Op != OpAMD64ANDQconst || auxIntToInt32(s.AuxInt) != 1 { break } v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v0.AddArg(s) v.AddArg(v0) return true @@ -24474,11 +24435,11 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHLQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -24488,7 +24449,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) v.AddArg(v0) return true @@ -24507,11 +24468,11 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHLLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -24521,7 +24482,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) v.AddArg(v0) return true @@ -24540,11 +24501,11 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHLQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -24554,7 +24515,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) v.AddArg(v0) return true @@ -24573,11 +24534,11 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHLLconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -24587,7 +24548,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) v.AddArg(v0) return true @@ -24606,7 +24567,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } x := z1.Args[0] @@ -24616,7 +24577,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) v.AddArg(v0) return true @@ -24635,7 +24596,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } x := z1.Args[0] @@ -24645,7 +24606,7 @@ func rewriteValueAMD64_OpAMD64SETNE(v *Value) bool { } v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) v.AddArg(v0) return true @@ -24724,8 +24685,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // match: (SETNEstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) // result: (SETBstore [off] {sym} ptr (BTL x y) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTL { break @@ -24739,14 +24700,14 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { } x := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVLconst || v_1_0_0.AuxInt != 1 { + if v_1_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_1_0_0.AuxInt) != 1 { continue } y := v_1_1 mem := v_2 v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTL, types.TypeFlags) v0.AddArg2(x, y) v.AddArg3(ptr, v0, mem) @@ -24757,8 +24718,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // match: (SETNEstore [off] {sym} ptr (TESTQ (SHLQ (MOVQconst [1]) x) y) mem) // result: (SETBstore [off] {sym} ptr (BTQ x y) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -24772,14 +24733,14 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { } x := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] - if v_1_0_0.Op != OpAMD64MOVQconst || v_1_0_0.AuxInt != 1 { + if v_1_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_1_0_0.AuxInt) != 1 { continue } y := v_1_1 mem := v_2 v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQ, types.TypeFlags) v0.AddArg2(x, y) v.AddArg3(ptr, v0, mem) @@ -24788,61 +24749,61 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { break } // match: (SETNEstore [off] {sym} ptr (TESTLconst [c] x) mem) - // cond: isUint32PowerOfTwo(c) - // result: (SETBstore [off] {sym} ptr (BTLconst [log2uint32(c)] x) mem) + // cond: isUint32PowerOfTwo(int64(c)) + // result: (SETBstore [off] {sym} ptr (BTLconst [int8(log32(c))] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) x := v_1.Args[0] mem := v_2 - if !(isUint32PowerOfTwo(c)) { + if !(isUint32PowerOfTwo(int64(c))) { break } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true } // match: (SETNEstore [off] {sym} ptr (TESTQconst [c] x) mem) - // cond: isUint64PowerOfTwo(c) - // result: (SETBstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + // cond: isUint64PowerOfTwo(int64(c)) + // result: (SETBstore [off] {sym} ptr (BTQconst [int8(log32(c))] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) x := v_1.Args[0] mem := v_2 - if !(isUint64PowerOfTwo(c)) { + if !(isUint64PowerOfTwo(int64(c))) { break } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true } // match: (SETNEstore [off] {sym} ptr (TESTQ (MOVQconst [c]) x) mem) // cond: isUint64PowerOfTwo(c) - // result: (SETBstore [off] {sym} ptr (BTQconst [log2(c)] x) mem) + // result: (SETBstore [off] {sym} ptr (BTQconst [int8(log2(c))] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -24854,17 +24815,17 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { if v_1_0.Op != OpAMD64MOVQconst { continue } - c := v_1_0.AuxInt + c := auxIntToInt64(v_1_0.AuxInt) x := v_1_1 mem := v_2 if !(isUint64PowerOfTwo(c)) { continue } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log2(c))) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -24874,22 +24835,22 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // match: (SETNEstore [off] {sym} ptr (CMPLconst [1] s:(ANDLconst [1] _)) mem) // result: (SETEQstore [off] {sym} ptr (CMPLconst [0] s) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 - if v_1.Op != OpAMD64CMPLconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64CMPLconst || auxIntToInt32(v_1.AuxInt) != 1 { break } s := v_1.Args[0] - if s.Op != OpAMD64ANDLconst || s.AuxInt != 1 { + if s.Op != OpAMD64ANDLconst || auxIntToInt32(s.AuxInt) != 1 { break } mem := v_2 v.reset(OpAMD64SETEQstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v0.AddArg(s) v.AddArg3(ptr, v0, mem) return true @@ -24897,22 +24858,22 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // match: (SETNEstore [off] {sym} ptr (CMPQconst [1] s:(ANDQconst [1] _)) mem) // result: (SETEQstore [off] {sym} ptr (CMPQconst [0] s) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 - if v_1.Op != OpAMD64CMPQconst || v_1.AuxInt != 1 { + if v_1.Op != OpAMD64CMPQconst || auxIntToInt32(v_1.AuxInt) != 1 { break } s := v_1.Args[0] - if s.Op != OpAMD64ANDQconst || s.AuxInt != 1 { + if s.Op != OpAMD64ANDQconst || auxIntToInt32(s.AuxInt) != 1 { break } mem := v_2 v.reset(OpAMD64SETEQstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v0.AddArg(s) v.AddArg3(ptr, v0, mem) return true @@ -24921,8 +24882,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // cond: z1==z2 // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -24932,11 +24893,11 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHLQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -24946,10 +24907,10 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { continue } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -24960,8 +24921,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // cond: z1==z2 // result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTL { break @@ -24971,11 +24932,11 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHLLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRLconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHRLconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -24985,10 +24946,10 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { continue } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -24999,8 +24960,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // cond: z1==z2 // result: (SETBstore [off] {sym} ptr (BTQconst [0] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -25010,11 +24971,11 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHLQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -25024,10 +24985,10 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { continue } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -25038,8 +24999,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // cond: z1==z2 // result: (SETBstore [off] {sym} ptr (BTLconst [0] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTL { break @@ -25049,11 +25010,11 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHLLconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -25063,10 +25024,10 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { continue } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -25077,8 +25038,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // cond: z1==z2 // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTQ { break @@ -25088,7 +25049,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } x := z1.Args[0] @@ -25098,10 +25059,10 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { continue } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -25112,8 +25073,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // cond: z1==z2 // result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64TESTL { break @@ -25123,7 +25084,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { v_1_1 := v_1.Args[1] for _i0 := 0; _i0 <= 1; _i0, v_1_0, v_1_1 = _i0+1, v_1_1, v_1_0 { z1 := v_1_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } x := z1.Args[0] @@ -25133,10 +25094,10 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { continue } v.reset(OpAMD64SETBstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v0 := b.NewValue0(v.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) v.AddArg3(ptr, v0, mem) return true @@ -25146,8 +25107,8 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { // match: (SETNEstore [off] {sym} ptr (InvertFlags x) mem) // result: (SETNEstore [off] {sym} ptr x mem) for { - off := v.AuxInt - sym := v.Aux + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) ptr := v_0 if v_1.Op != OpAMD64InvertFlags { break @@ -25155,30 +25116,30 @@ func rewriteValueAMD64_OpAMD64SETNEstore(v *Value) bool { x := v_1.Args[0] mem := v_2 v.reset(OpAMD64SETNEstore) - v.AuxInt = off - v.Aux = sym + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) v.AddArg3(ptr, x, mem) return true } // match: (SETNEstore [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SETNEstore [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SETNEstore) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -25302,28 +25263,28 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (SHLL x (MOVQconst [c])) - // result: (SHLLconst [c&31] x) + // result: (SHLLconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64SHLLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } // match: (SHLL x (MOVLconst [c])) - // result: (SHLLconst [c&31] x) + // result: (SHLLconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SHLLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } @@ -25335,7 +25296,7 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { if v_1.Op != OpAMD64ADDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 0) { break @@ -25357,7 +25318,7 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { if v_1_0.Op != OpAMD64ADDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 0) { break @@ -25376,7 +25337,7 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { if v_1.Op != OpAMD64ANDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 31) { break @@ -25398,7 +25359,7 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { if v_1_0.Op != OpAMD64ANDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 31) { break @@ -25417,7 +25378,7 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { if v_1.Op != OpAMD64ADDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 0) { break @@ -25439,7 +25400,7 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { if v_1_0.Op != OpAMD64ADDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 0) { break @@ -25458,7 +25419,7 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { if v_1.Op != OpAMD64ANDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 31) { break @@ -25480,7 +25441,7 @@ func rewriteValueAMD64_OpAMD64SHLL(v *Value) bool { if v_1_0.Op != OpAMD64ANDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 31) { break @@ -25498,19 +25459,19 @@ func rewriteValueAMD64_OpAMD64SHLLconst(v *Value) bool { // match: (SHLLconst [1] (SHRLconst [1] x)) // result: (BTRLconst [0] x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SHRLconst || v_0.AuxInt != 1 { + if auxIntToInt8(v.AuxInt) != 1 || v_0.Op != OpAMD64SHRLconst || auxIntToInt8(v_0.AuxInt) != 1 { break } x := v_0.Args[0] v.reset(OpAMD64BTRLconst) - v.AuxInt = 0 + v.AuxInt = int8ToAuxInt(0) v.AddArg(x) return true } // match: (SHLLconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -25536,28 +25497,28 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (SHLQ x (MOVQconst [c])) - // result: (SHLQconst [c&63] x) + // result: (SHLQconst [int8(c&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64SHLQconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SHLQ x (MOVLconst [c])) - // result: (SHLQconst [c&63] x) + // result: (SHLQconst [int8(c&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SHLQconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } @@ -25569,7 +25530,7 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { if v_1.Op != OpAMD64ADDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 0) { break @@ -25591,7 +25552,7 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { if v_1_0.Op != OpAMD64ADDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 0) { break @@ -25610,7 +25571,7 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { if v_1.Op != OpAMD64ANDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 63) { break @@ -25632,7 +25593,7 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { if v_1_0.Op != OpAMD64ANDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 63) { break @@ -25651,7 +25612,7 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { if v_1.Op != OpAMD64ADDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 0) { break @@ -25673,7 +25634,7 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { if v_1_0.Op != OpAMD64ADDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 0) { break @@ -25692,7 +25653,7 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { if v_1.Op != OpAMD64ANDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 63) { break @@ -25714,7 +25675,7 @@ func rewriteValueAMD64_OpAMD64SHLQ(v *Value) bool { if v_1_0.Op != OpAMD64ANDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 63) { break @@ -25732,19 +25693,19 @@ func rewriteValueAMD64_OpAMD64SHLQconst(v *Value) bool { // match: (SHLQconst [1] (SHRQconst [1] x)) // result: (BTRQconst [0] x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SHRQconst || v_0.AuxInt != 1 { + if auxIntToInt8(v.AuxInt) != 1 || v_0.Op != OpAMD64SHRQconst || auxIntToInt8(v_0.AuxInt) != 1 { break } x := v_0.Args[0] v.reset(OpAMD64BTRQconst) - v.AuxInt = 0 + v.AuxInt = int8ToAuxInt(0) v.AddArg(x) return true } // match: (SHLQconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -25782,35 +25743,35 @@ func rewriteValueAMD64_OpAMD64SHRB(v *Value) bool { v_0 := v.Args[0] // match: (SHRB x (MOVQconst [c])) // cond: c&31 < 8 - // result: (SHRBconst [c&31] x) + // result: (SHRBconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c&31 < 8) { break } v.reset(OpAMD64SHRBconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } // match: (SHRB x (MOVLconst [c])) // cond: c&31 < 8 - // result: (SHRBconst [c&31] x) + // result: (SHRBconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) if !(c&31 < 8) { break } v.reset(OpAMD64SHRBconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } @@ -25821,12 +25782,12 @@ func rewriteValueAMD64_OpAMD64SHRB(v *Value) bool { if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c&31 >= 8) { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = int32ToAuxInt(0) return true } // match: (SHRB _ (MOVLconst [c])) @@ -25836,12 +25797,12 @@ func rewriteValueAMD64_OpAMD64SHRB(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) if !(c&31 >= 8) { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = int32ToAuxInt(0) return true } return false @@ -25851,7 +25812,7 @@ func rewriteValueAMD64_OpAMD64SHRBconst(v *Value) bool { // match: (SHRBconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -25865,28 +25826,28 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (SHRL x (MOVQconst [c])) - // result: (SHRLconst [c&31] x) + // result: (SHRLconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64SHRLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } // match: (SHRL x (MOVLconst [c])) - // result: (SHRLconst [c&31] x) + // result: (SHRLconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SHRLconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } @@ -25898,7 +25859,7 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { if v_1.Op != OpAMD64ADDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 0) { break @@ -25920,7 +25881,7 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { if v_1_0.Op != OpAMD64ADDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 0) { break @@ -25939,7 +25900,7 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { if v_1.Op != OpAMD64ANDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 31) { break @@ -25961,7 +25922,7 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { if v_1_0.Op != OpAMD64ANDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 31) { break @@ -25980,7 +25941,7 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { if v_1.Op != OpAMD64ADDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 0) { break @@ -26002,7 +25963,7 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { if v_1_0.Op != OpAMD64ADDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 0) { break @@ -26021,7 +25982,7 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { if v_1.Op != OpAMD64ANDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&31 == 31) { break @@ -26043,7 +26004,7 @@ func rewriteValueAMD64_OpAMD64SHRL(v *Value) bool { if v_1_0.Op != OpAMD64ANDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&31 == 31) { break @@ -26061,19 +26022,19 @@ func rewriteValueAMD64_OpAMD64SHRLconst(v *Value) bool { // match: (SHRLconst [1] (SHLLconst [1] x)) // result: (BTRLconst [31] x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SHLLconst || v_0.AuxInt != 1 { + if auxIntToInt8(v.AuxInt) != 1 || v_0.Op != OpAMD64SHLLconst || auxIntToInt8(v_0.AuxInt) != 1 { break } x := v_0.Args[0] v.reset(OpAMD64BTRLconst) - v.AuxInt = 31 + v.AuxInt = int8ToAuxInt(31) v.AddArg(x) return true } // match: (SHRLconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -26087,28 +26048,28 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (SHRQ x (MOVQconst [c])) - // result: (SHRQconst [c&63] x) + // result: (SHRQconst [int8(c&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpAMD64SHRQconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } // match: (SHRQ x (MOVLconst [c])) - // result: (SHRQconst [c&63] x) + // result: (SHRQconst [int8(c&63)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SHRQconst) - v.AuxInt = c & 63 + v.AuxInt = int8ToAuxInt(int8(c & 63)) v.AddArg(x) return true } @@ -26120,7 +26081,7 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { if v_1.Op != OpAMD64ADDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 0) { break @@ -26142,7 +26103,7 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { if v_1_0.Op != OpAMD64ADDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 0) { break @@ -26161,7 +26122,7 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { if v_1.Op != OpAMD64ANDQconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 63) { break @@ -26183,7 +26144,7 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { if v_1_0.Op != OpAMD64ANDQconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 63) { break @@ -26202,7 +26163,7 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { if v_1.Op != OpAMD64ADDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 0) { break @@ -26224,7 +26185,7 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { if v_1_0.Op != OpAMD64ADDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 0) { break @@ -26243,7 +26204,7 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { if v_1.Op != OpAMD64ANDLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) y := v_1.Args[0] if !(c&63 == 63) { break @@ -26265,7 +26226,7 @@ func rewriteValueAMD64_OpAMD64SHRQ(v *Value) bool { if v_1_0.Op != OpAMD64ANDLconst { break } - c := v_1_0.AuxInt + c := auxIntToInt32(v_1_0.AuxInt) y := v_1_0.Args[0] if !(c&63 == 63) { break @@ -26283,19 +26244,19 @@ func rewriteValueAMD64_OpAMD64SHRQconst(v *Value) bool { // match: (SHRQconst [1] (SHLQconst [1] x)) // result: (BTRQconst [63] x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SHLQconst || v_0.AuxInt != 1 { + if auxIntToInt8(v.AuxInt) != 1 || v_0.Op != OpAMD64SHLQconst || auxIntToInt8(v_0.AuxInt) != 1 { break } x := v_0.Args[0] v.reset(OpAMD64BTRQconst) - v.AuxInt = 63 + v.AuxInt = int8ToAuxInt(63) v.AddArg(x) return true } // match: (SHRQconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -26309,35 +26270,35 @@ func rewriteValueAMD64_OpAMD64SHRW(v *Value) bool { v_0 := v.Args[0] // match: (SHRW x (MOVQconst [c])) // cond: c&31 < 16 - // result: (SHRWconst [c&31] x) + // result: (SHRWconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c&31 < 16) { break } v.reset(OpAMD64SHRWconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } // match: (SHRW x (MOVLconst [c])) // cond: c&31 < 16 - // result: (SHRWconst [c&31] x) + // result: (SHRWconst [int8(c&31)] x) for { x := v_0 if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) if !(c&31 < 16) { break } v.reset(OpAMD64SHRWconst) - v.AuxInt = c & 31 + v.AuxInt = int8ToAuxInt(int8(c & 31)) v.AddArg(x) return true } @@ -26348,12 +26309,12 @@ func rewriteValueAMD64_OpAMD64SHRW(v *Value) bool { if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c&31 >= 16) { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = int32ToAuxInt(0) return true } // match: (SHRW _ (MOVLconst [c])) @@ -26363,12 +26324,12 @@ func rewriteValueAMD64_OpAMD64SHRW(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) if !(c&31 >= 16) { break } v.reset(OpAMD64MOVLconst) - v.AuxInt = 0 + v.AuxInt = int32ToAuxInt(0) return true } return false @@ -26378,7 +26339,7 @@ func rewriteValueAMD64_OpAMD64SHRWconst(v *Value) bool { // match: (SHRWconst x [0]) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt8(v.AuxInt) != 0 { break } x := v_0 @@ -26398,9 +26359,9 @@ func rewriteValueAMD64_OpAMD64SUBL(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { break } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64SUBLconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -26410,11 +26371,11 @@ func rewriteValueAMD64_OpAMD64SUBL(v *Value) bool { if v_0.Op != OpAMD64MOVLconst { break } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_1 v.reset(OpAMD64NEGL) v0 := b.NewValue0(v.Pos, OpAMD64SUBLconst, v.Type) - v0.AuxInt = c + v0.AuxInt = int32ToAuxInt(c) v0.AddArg(x) v.AddArg(v0) return true @@ -26486,24 +26447,24 @@ func rewriteValueAMD64_OpAMD64SUBLload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SUBLload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SUBLload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SUBLload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -26557,24 +26518,24 @@ func rewriteValueAMD64_OpAMD64SUBLmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (SUBLmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SUBLmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SUBLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -26609,36 +26570,36 @@ func rewriteValueAMD64_OpAMD64SUBQ(v *Value) bool { b := v.Block // match: (SUBQ x (MOVQconst [c])) // cond: is32Bit(c) - // result: (SUBQconst x [c]) + // result: (SUBQconst x [int32(c)]) for { x := v_0 if v_1.Op != OpAMD64MOVQconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { break } v.reset(OpAMD64SUBQconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } // match: (SUBQ (MOVQconst [c]) x) // cond: is32Bit(c) - // result: (NEGQ (SUBQconst x [c])) + // result: (NEGQ (SUBQconst x [int32(c)])) for { if v_0.Op != OpAMD64MOVQconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 if !(is32Bit(c)) { break } v.reset(OpAMD64NEGQ) v0 := b.NewValue0(v.Pos, OpAMD64SUBQconst, v.Type) - v0.AuxInt = c + v0.AuxInt = int32ToAuxInt(int32(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -26765,24 +26726,24 @@ func rewriteValueAMD64_OpAMD64SUBQload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SUBQload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SUBQload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SUBQload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -26836,24 +26797,24 @@ func rewriteValueAMD64_OpAMD64SUBQmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (SUBQmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SUBQmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SUBQmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -26916,24 +26877,24 @@ func rewriteValueAMD64_OpAMD64SUBSDload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SUBSDload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SUBSDload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SUBSDload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -27016,24 +26977,24 @@ func rewriteValueAMD64_OpAMD64SUBSSload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (SUBSSload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (SUBSSload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64SUBSSload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -27594,7 +27555,7 @@ func rewriteValueAMD64_OpAMD64XORL(v *Value) bool { } y := v_0.Args[1] v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVLconst || v_0_0.AuxInt != 1 { + if v_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_0_0.AuxInt) != 1 { continue } x := v_1 @@ -27605,20 +27566,20 @@ func rewriteValueAMD64_OpAMD64XORL(v *Value) bool { break } // match: (XORL (MOVLconst [c]) x) - // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTCLconst [log2uint32(c)] x) + // cond: isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128 + // result: (BTCLconst [int8(log32(c))] x) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpAMD64MOVLconst { continue } - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_1 - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { + if !(isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128) { continue } v.reset(OpAMD64BTCLconst) - v.AuxInt = log2uint32(c) + v.AuxInt = int8ToAuxInt(int8(log32(c))) v.AddArg(x) return true } @@ -27632,9 +27593,9 @@ func rewriteValueAMD64_OpAMD64XORL(v *Value) bool { if v_1.Op != OpAMD64MOVLconst { continue } - c := v_1.AuxInt + c := auxIntToInt32(v_1.AuxInt) v.reset(OpAMD64XORLconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(c) v.AddArg(x) return true } @@ -27648,17 +27609,17 @@ func rewriteValueAMD64_OpAMD64XORL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRLconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 32-c) { continue } v.reset(OpAMD64ROLLconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -27673,17 +27634,17 @@ func rewriteValueAMD64_OpAMD64XORL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRWconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 16-c && c < 16 && t.Size() == 2) { continue } v.reset(OpAMD64ROLWconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -27698,17 +27659,17 @@ func rewriteValueAMD64_OpAMD64XORL(v *Value) bool { if v_0.Op != OpAMD64SHLLconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRBconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 8-c && c < 8 && t.Size() == 1) { continue } v.reset(OpAMD64ROLBconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -27755,23 +27716,23 @@ func rewriteValueAMD64_OpAMD64XORL(v *Value) bool { func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { v_0 := v.Args[0] // match: (XORLconst [c] x) - // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTCLconst [log2uint32(c)] x) + // cond: isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128 + // result: (BTCLconst [int8(log32(c))] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isUint32PowerOfTwo(c) && uint64(c) >= 128) { + if !(isUint32PowerOfTwo(int64(c)) && uint64(c) >= 128) { break } v.reset(OpAMD64BTCLconst) - v.AuxInt = log2uint32(c) + v.AuxInt = int8ToAuxInt(int8(log32(c))) v.AddArg(x) return true } // match: (XORLconst [1] (SETNE x)) // result: (SETEQ x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETNE { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETNE { break } x := v_0.Args[0] @@ -27782,7 +27743,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETEQ x)) // result: (SETNE x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETEQ { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETEQ { break } x := v_0.Args[0] @@ -27793,7 +27754,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETL x)) // result: (SETGE x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETL { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETL { break } x := v_0.Args[0] @@ -27804,7 +27765,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETGE x)) // result: (SETL x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETGE { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETGE { break } x := v_0.Args[0] @@ -27815,7 +27776,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETLE x)) // result: (SETG x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETLE { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETLE { break } x := v_0.Args[0] @@ -27826,7 +27787,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETG x)) // result: (SETLE x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETG { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETG { break } x := v_0.Args[0] @@ -27837,7 +27798,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETB x)) // result: (SETAE x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETB { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETB { break } x := v_0.Args[0] @@ -27848,7 +27809,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETAE x)) // result: (SETB x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETAE { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETAE { break } x := v_0.Args[0] @@ -27859,7 +27820,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETBE x)) // result: (SETA x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETBE { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETBE { break } x := v_0.Args[0] @@ -27870,7 +27831,7 @@ func rewriteValueAMD64_OpAMD64XORLconst(v *Value) bool { // match: (XORLconst [1] (SETA x)) // result: (SETBE x) for { - if v.AuxInt != 1 || v_0.Op != OpAMD64SETA { + if auxIntToInt32(v.AuxInt) != 1 || v_0.Op != OpAMD64SETA { break } x := v_0.Args[0] @@ -27936,23 +27897,23 @@ func rewriteValueAMD64_OpAMD64XORLconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (XORLconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (XORLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (XORLconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64XORLconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -27987,24 +27948,24 @@ func rewriteValueAMD64_OpAMD64XORLload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (XORLload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (XORLload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64XORLload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -28058,24 +28019,24 @@ func rewriteValueAMD64_OpAMD64XORLmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (XORLmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (XORLmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64XORLmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -28116,7 +28077,7 @@ func rewriteValueAMD64_OpAMD64XORQ(v *Value) bool { } y := v_0.Args[1] v_0_0 := v_0.Args[0] - if v_0_0.Op != OpAMD64MOVQconst || v_0_0.AuxInt != 1 { + if v_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_0_0.AuxInt) != 1 { continue } x := v_1 @@ -28128,19 +28089,19 @@ func rewriteValueAMD64_OpAMD64XORQ(v *Value) bool { } // match: (XORQ (MOVQconst [c]) x) // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTCQconst [log2(c)] x) + // result: (BTCQconst [int8(log2(c))] x) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { if v_0.Op != OpAMD64MOVQconst { continue } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { continue } v.reset(OpAMD64BTCQconst) - v.AuxInt = log2(c) + v.AuxInt = int8ToAuxInt(int8(log2(c))) v.AddArg(x) return true } @@ -28148,19 +28109,19 @@ func rewriteValueAMD64_OpAMD64XORQ(v *Value) bool { } // match: (XORQ x (MOVQconst [c])) // cond: is32Bit(c) - // result: (XORQconst [c] x) + // result: (XORQconst [int32(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 != OpAMD64MOVQconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(is32Bit(c)) { continue } v.reset(OpAMD64XORQconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -28174,17 +28135,17 @@ func rewriteValueAMD64_OpAMD64XORQ(v *Value) bool { if v_0.Op != OpAMD64SHLQconst { continue } - c := v_0.AuxInt + c := auxIntToInt8(v_0.AuxInt) x := v_0.Args[0] if v_1.Op != OpAMD64SHRQconst { continue } - d := v_1.AuxInt + d := auxIntToInt8(v_1.AuxInt) if x != v_1.Args[0] || !(d == 64-c) { continue } v.reset(OpAMD64ROLQconst) - v.AuxInt = c + v.AuxInt = int8ToAuxInt(c) v.AddArg(x) return true } @@ -28231,16 +28192,16 @@ func rewriteValueAMD64_OpAMD64XORQ(v *Value) bool { func rewriteValueAMD64_OpAMD64XORQconst(v *Value) bool { v_0 := v.Args[0] // match: (XORQconst [c] x) - // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 - // result: (BTCQconst [log2(c)] x) + // cond: isUint64PowerOfTwo(int64(c)) && uint64(c) >= 128 + // result: (BTCQconst [int8(log32(c))] x) for { - c := v.AuxInt + c := auxIntToInt32(v.AuxInt) x := v_0 - if !(isUint64PowerOfTwo(c) && uint64(c) >= 128) { + if !(isUint64PowerOfTwo(int64(c)) && uint64(c) >= 128) { break } v.reset(OpAMD64BTCQconst) - v.AuxInt = log2(c) + v.AuxInt = int8ToAuxInt(int8(log32(c))) v.AddArg(x) return true } @@ -28304,23 +28265,23 @@ func rewriteValueAMD64_OpAMD64XORQconstmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (XORQconstmodify [valoff1] {sym} (ADDQconst [off2] base) mem) - // cond: ValAndOff(valoff1).canAdd(off2) - // result: (XORQconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) + // cond: ValAndOff(valoff1).canAdd32(off2) + // result: (XORQconstmodify [ValAndOff(valoff1).addOffset32(off2)] {sym} base mem) for { - valoff1 := v.AuxInt - sym := v.Aux + valoff1 := auxIntToValAndOff(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] mem := v_1 - if !(ValAndOff(valoff1).canAdd(off2)) { + if !(ValAndOff(valoff1).canAdd32(off2)) { break } v.reset(OpAMD64XORQconstmodify) - v.AuxInt = ValAndOff(valoff1).add(off2) - v.Aux = sym + v.AuxInt = valAndOffToAuxInt(ValAndOff(valoff1).addOffset32(off2)) + v.Aux = symToAux(sym) v.AddArg2(base, mem) return true } @@ -28355,24 +28316,24 @@ func rewriteValueAMD64_OpAMD64XORQload(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (XORQload [off1] {sym} val (ADDQconst [off2] base) mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (XORQload [off1+off2] {sym} val base mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) val := v_0 if v_1.Op != OpAMD64ADDQconst { break } - off2 := v_1.AuxInt + off2 := auxIntToInt32(v_1.AuxInt) base := v_1.Args[0] mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64XORQload) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(val, base, mem) return true } @@ -28426,24 +28387,24 @@ func rewriteValueAMD64_OpAMD64XORQmodify(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (XORQmodify [off1] {sym} (ADDQconst [off2] base) val mem) - // cond: is32Bit(off1+off2) + // cond: is32Bit(int64(off1)+int64(off2)) // result: (XORQmodify [off1+off2] {sym} base val mem) for { - off1 := v.AuxInt - sym := v.Aux + off1 := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) if v_0.Op != OpAMD64ADDQconst { break } - off2 := v_0.AuxInt + off2 := auxIntToInt32(v_0.AuxInt) base := v_0.Args[0] val := v_1 mem := v_2 - if !(is32Bit(off1 + off2)) { + if !(is32Bit(int64(off1) + int64(off2))) { break } v.reset(OpAMD64XORQmodify) - v.AuxInt = off1 + off2 - v.Aux = sym + v.AuxInt = int32ToAuxInt(off1 + off2) + v.Aux = symToAux(sym) v.AddArg3(base, val, mem) return true } @@ -30018,12 +29979,12 @@ func rewriteValueAMD64_OpHasCPUFeature(v *Value) bool { // match: (HasCPUFeature {s}) // result: (SETNE (CMPQconst [0] (LoweredHasCPUFeature {s}))) for { - s := v.Aux + s := auxToSym(v.Aux) v.reset(OpAMD64SETNE) v0 := b.NewValue0(v.Pos, OpAMD64CMPQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int32ToAuxInt(0) v1 := b.NewValue0(v.Pos, OpAMD64LoweredHasCPUFeature, typ.UInt64) - v1.Aux = s + v1.Aux = symToAux(s) v0.AddArg(v1) v.AddArg(v0) return true @@ -30489,10 +30450,10 @@ func rewriteValueAMD64_OpLocalAddr(v *Value) bool { // match: (LocalAddr {sym} base _) // result: (LEAQ {sym} base) for { - sym := v.Aux + sym := auxToSym(v.Aux) base := v_0 v.reset(OpAMD64LEAQ) - v.Aux = sym + v.Aux = symToAux(sym) v.AddArg(base) return true } @@ -31982,7 +31943,7 @@ func rewriteValueAMD64_OpPanicBounds(v *Value) bool { // cond: boundsABI(kind) == 0 // result: (LoweredPanicBoundsA [kind] x y mem) for { - kind := v.AuxInt + kind := auxIntToInt64(v.AuxInt) x := v_0 y := v_1 mem := v_2 @@ -31990,7 +31951,7 @@ func rewriteValueAMD64_OpPanicBounds(v *Value) bool { break } v.reset(OpAMD64LoweredPanicBoundsA) - v.AuxInt = kind + v.AuxInt = int64ToAuxInt(kind) v.AddArg3(x, y, mem) return true } @@ -31998,7 +31959,7 @@ func rewriteValueAMD64_OpPanicBounds(v *Value) bool { // cond: boundsABI(kind) == 1 // result: (LoweredPanicBoundsB [kind] x y mem) for { - kind := v.AuxInt + kind := auxIntToInt64(v.AuxInt) x := v_0 y := v_1 mem := v_2 @@ -32006,7 +31967,7 @@ func rewriteValueAMD64_OpPanicBounds(v *Value) bool { break } v.reset(OpAMD64LoweredPanicBoundsB) - v.AuxInt = kind + v.AuxInt = int64ToAuxInt(kind) v.AddArg3(x, y, mem) return true } @@ -32014,7 +31975,7 @@ func rewriteValueAMD64_OpPanicBounds(v *Value) bool { // cond: boundsABI(kind) == 2 // result: (LoweredPanicBoundsC [kind] x y mem) for { - kind := v.AuxInt + kind := auxIntToInt64(v.AuxInt) x := v_0 y := v_1 mem := v_2 @@ -32022,7 +31983,7 @@ func rewriteValueAMD64_OpPanicBounds(v *Value) bool { break } v.reset(OpAMD64LoweredPanicBoundsC) - v.AuxInt = kind + v.AuxInt = int64ToAuxInt(kind) v.AddArg3(x, y, mem) return true } @@ -34243,7 +34204,7 @@ func rewriteBlockAMD64(b *Block) bool { } x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_0_0_0.AuxInt) != 1 { continue } y := v_0_1 @@ -34267,7 +34228,7 @@ func rewriteBlockAMD64(b *Block) bool { } x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { continue } y := v_0_1 @@ -34279,40 +34240,40 @@ func rewriteBlockAMD64(b *Block) bool { break } // match: (EQ (TESTLconst [c] x)) - // cond: isUint32PowerOfTwo(c) - // result: (UGE (BTLconst [log2uint32(c)] x)) + // cond: isUint32PowerOfTwo(int64(c)) + // result: (UGE (BTLconst [int8(log32(c))] x)) for b.Controls[0].Op == OpAMD64TESTLconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(isUint32PowerOfTwo(c)) { + if !(isUint32PowerOfTwo(int64(c))) { break } v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true } // match: (EQ (TESTQconst [c] x)) - // cond: isUint64PowerOfTwo(c) - // result: (UGE (BTQconst [log2(c)] x)) + // cond: isUint64PowerOfTwo(int64(c)) + // result: (UGE (BTQconst [int8(log32(c))] x)) for b.Controls[0].Op == OpAMD64TESTQconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(isUint64PowerOfTwo(c)) { + if !(isUint64PowerOfTwo(int64(c))) { break } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true } // match: (EQ (TESTQ (MOVQconst [c]) x)) // cond: isUint64PowerOfTwo(c) - // result: (UGE (BTQconst [log2(c)] x)) + // result: (UGE (BTQconst [int8(log2(c))] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] @@ -34322,13 +34283,13 @@ func rewriteBlockAMD64(b *Block) bool { if v_0_0.Op != OpAMD64MOVQconst { continue } - c := v_0_0.AuxInt + c := auxIntToInt64(v_0_0.AuxInt) x := v_0_1 if !(isUint64PowerOfTwo(c)) { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log2(c))) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true @@ -34345,11 +34306,11 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHLQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -34358,7 +34319,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true @@ -34375,11 +34336,11 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHLLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -34388,7 +34349,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true @@ -34405,11 +34366,11 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHLQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -34418,7 +34379,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true @@ -34435,11 +34396,11 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHLLconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -34448,7 +34409,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true @@ -34465,7 +34426,7 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } x := z1.Args[0] @@ -34474,7 +34435,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true @@ -34491,7 +34452,7 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } x := z1.Args[0] @@ -34500,7 +34461,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) b.resetWithControl(BlockAMD64UGE, v0) return true @@ -35046,7 +35007,7 @@ func rewriteBlockAMD64(b *Block) bool { } x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVLconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVLconst || auxIntToInt32(v_0_0_0.AuxInt) != 1 { continue } y := v_0_1 @@ -35070,7 +35031,7 @@ func rewriteBlockAMD64(b *Block) bool { } x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpAMD64MOVQconst || v_0_0_0.AuxInt != 1 { + if v_0_0_0.Op != OpAMD64MOVQconst || auxIntToInt64(v_0_0_0.AuxInt) != 1 { continue } y := v_0_1 @@ -35082,40 +35043,40 @@ func rewriteBlockAMD64(b *Block) bool { break } // match: (NE (TESTLconst [c] x)) - // cond: isUint32PowerOfTwo(c) - // result: (ULT (BTLconst [log2uint32(c)] x)) + // cond: isUint32PowerOfTwo(int64(c)) + // result: (ULT (BTLconst [int8(log32(c))] x)) for b.Controls[0].Op == OpAMD64TESTLconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(isUint32PowerOfTwo(c)) { + if !(isUint32PowerOfTwo(int64(c))) { break } v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = log2uint32(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true } // match: (NE (TESTQconst [c] x)) - // cond: isUint64PowerOfTwo(c) - // result: (ULT (BTQconst [log2(c)] x)) + // cond: isUint64PowerOfTwo(int64(c)) + // result: (ULT (BTQconst [int8(log32(c))] x)) for b.Controls[0].Op == OpAMD64TESTQconst { v_0 := b.Controls[0] - c := v_0.AuxInt + c := auxIntToInt32(v_0.AuxInt) x := v_0.Args[0] - if !(isUint64PowerOfTwo(c)) { + if !(isUint64PowerOfTwo(int64(c))) { break } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log32(c))) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true } // match: (NE (TESTQ (MOVQconst [c]) x)) // cond: isUint64PowerOfTwo(c) - // result: (ULT (BTQconst [log2(c)] x)) + // result: (ULT (BTQconst [int8(log2(c))] x)) for b.Controls[0].Op == OpAMD64TESTQ { v_0 := b.Controls[0] _ = v_0.Args[1] @@ -35125,13 +35086,13 @@ func rewriteBlockAMD64(b *Block) bool { if v_0_0.Op != OpAMD64MOVQconst { continue } - c := v_0_0.AuxInt + c := auxIntToInt64(v_0_0.AuxInt) x := v_0_1 if !(isUint64PowerOfTwo(c)) { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = log2(c) + v0.AuxInt = int8ToAuxInt(int8(log2(c))) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true @@ -35148,11 +35109,11 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHLQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHLQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -35161,7 +35122,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true @@ -35178,11 +35139,11 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHLLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHLLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHRQconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHRQconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -35191,7 +35152,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true @@ -35208,11 +35169,11 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLQconst || z1_0.AuxInt != 63 { + if z1_0.Op != OpAMD64SHLQconst || auxIntToInt8(z1_0.AuxInt) != 63 { continue } x := z1_0.Args[0] @@ -35221,7 +35182,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true @@ -35238,11 +35199,11 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } z1_0 := z1.Args[0] - if z1_0.Op != OpAMD64SHLLconst || z1_0.AuxInt != 31 { + if z1_0.Op != OpAMD64SHLLconst || auxIntToInt8(z1_0.AuxInt) != 31 { continue } x := z1_0.Args[0] @@ -35251,7 +35212,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 0 + v0.AuxInt = int8ToAuxInt(0) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true @@ -35268,7 +35229,7 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRQconst || z1.AuxInt != 63 { + if z1.Op != OpAMD64SHRQconst || auxIntToInt8(z1.AuxInt) != 63 { continue } x := z1.Args[0] @@ -35277,7 +35238,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTQconst, types.TypeFlags) - v0.AuxInt = 63 + v0.AuxInt = int8ToAuxInt(63) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true @@ -35294,7 +35255,7 @@ func rewriteBlockAMD64(b *Block) bool { 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 { z1 := v_0_0 - if z1.Op != OpAMD64SHRLconst || z1.AuxInt != 31 { + if z1.Op != OpAMD64SHRLconst || auxIntToInt8(z1.AuxInt) != 31 { continue } x := z1.Args[0] @@ -35303,7 +35264,7 @@ func rewriteBlockAMD64(b *Block) bool { continue } v0 := b.NewValue0(v_0.Pos, OpAMD64BTLconst, types.TypeFlags) - v0.AuxInt = 31 + v0.AuxInt = int8ToAuxInt(31) v0.AddArg(x) b.resetWithControl(BlockAMD64ULT, v0) return true -- GitLab From e01a226fadcac721e26c12921ca54388c7244d03 Mon Sep 17 00:00:00 2001 From: Victor Michel Date: Sun, 30 Aug 2020 20:43:39 +0000 Subject: [PATCH 0387/1792] debug/elf: support relocations relative to sections with non-zero addresses commit 72ec930fa70c20ce69b21bf32a7916c04c2e9c2f added basic support for relocations, but assumed that the symbol value would be 0, likely because .debug_info always has address == 0 in the ELF section headers. CL 195679 added further support for relocations, but explicitly encoded the original assumption that section addresses would be 0. This change removes that assumption: all relocations will now be properly computed based on the target symbol value even when that symbol is a section with a non-zero address. Typically, sections that are part of a LOAD program segment have non-zero addresses. For example, .debug_ranges relocations could be relative to .text, which usually has an address > 0. Fixes #40879 Change-Id: Ib0a616bb8b05d6c96d179b03ca33a10946fc5d59 GitHub-Last-Rev: 4200de732641995f3a4958a13a5c78f65b7eae50 GitHub-Pull-Request: golang/go#41038 Reviewed-on: https://go-review.googlesource.com/c/go/+/250559 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/debug/elf/file.go | 77 +++++++---------- src/debug/elf/file_test.go | 81 +++++++++++++++++- ...location-test-gcc930-ranges-no-rela-x86-64 | Bin 0 -> 5696 bytes ...cation-test-gcc930-ranges-with-rela-x86-64 | Bin 0 -> 7680 bytes .../elf/testdata/multiple-code-sections.c | 28 ++++++ 5 files changed, 135 insertions(+), 51 deletions(-) create mode 100644 src/debug/elf/testdata/go-relocation-test-gcc930-ranges-no-rela-x86-64 create mode 100644 src/debug/elf/testdata/go-relocation-test-gcc930-ranges-with-rela-x86-64 create mode 100644 src/debug/elf/testdata/multiple-code-sections.c diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go index 1e863ef78e..cd5bf8fab0 100644 --- a/src/debug/elf/file.go +++ b/src/debug/elf/file.go @@ -628,23 +628,14 @@ func (f *File) applyRelocations(dst []byte, rels []byte) error { } } -// relocSymbolTargetOK decides whether we should try to apply a +// canApplyRelocation reports whether we should try to apply a // relocation to a DWARF data section, given a pointer to the symbol -// targeted by the relocation. Most relocations in DWARF data tend to -// be section-relative, but some target non-section symbols (for -// example, low_PC attrs on subprogram or compilation unit DIEs that -// target function symbols), and we need to include these as well. -// Return value is a pair (X,Y) where X is a boolean indicating -// whether the relocation is needed, and Y is the symbol value in the -// case of a non-section relocation that needs to be applied. -func relocSymbolTargetOK(sym *Symbol) (bool, uint64) { - if ST_TYPE(sym.Info) == STT_SECTION { - return true, 0 - } - if sym.Section != SHN_UNDEF && sym.Section < SHN_LORESERVE { - return true, sym.Value - } - return false, 0 +// targeted by the relocation. +// Most relocations in DWARF data tend to be section-relative, but +// some target non-section symbols (for example, low_PC attrs on +// subprogram or compilation unit DIEs that target function symbols). +func canApplyRelocation(sym *Symbol) bool { + return sym.Section != SHN_UNDEF && sym.Section < SHN_LORESERVE } func (f *File) applyRelocationsAMD64(dst []byte, rels []byte) error { @@ -670,8 +661,7 @@ func (f *File) applyRelocationsAMD64(dst []byte, rels []byte) error { continue } sym := &symbols[symNo-1] - needed, val := relocSymbolTargetOK(sym) - if !needed { + if !canApplyRelocation(sym) { continue } @@ -684,13 +674,13 @@ func (f *File) applyRelocationsAMD64(dst []byte, rels []byte) error { if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val64 := val + uint64(rela.Addend) + val64 := sym.Value + uint64(rela.Addend) f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], val64) case R_X86_64_32: if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val32 := uint32(val) + uint32(rela.Addend) + val32 := uint32(sym.Value) + uint32(rela.Addend) f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], val32) } } @@ -796,8 +786,7 @@ func (f *File) applyRelocationsARM64(dst []byte, rels []byte) error { continue } sym := &symbols[symNo-1] - needed, val := relocSymbolTargetOK(sym) - if !needed { + if !canApplyRelocation(sym) { continue } @@ -810,13 +799,13 @@ func (f *File) applyRelocationsARM64(dst []byte, rels []byte) error { if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val64 := uint64(val) + uint64(rela.Addend) + val64 := sym.Value + uint64(rela.Addend) f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], val64) case R_AARCH64_ABS32: if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val32 := uint32(val) + uint32(rela.Addend) + val32 := uint32(sym.Value) + uint32(rela.Addend) f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], val32) } } @@ -847,8 +836,7 @@ func (f *File) applyRelocationsPPC(dst []byte, rels []byte) error { continue } sym := &symbols[symNo-1] - needed, val := relocSymbolTargetOK(sym) - if !needed { + if !canApplyRelocation(sym) { continue } @@ -857,7 +845,7 @@ func (f *File) applyRelocationsPPC(dst []byte, rels []byte) error { if rela.Off+4 >= uint32(len(dst)) || rela.Addend < 0 { continue } - val32 := uint32(val) + uint32(rela.Addend) + val32 := uint32(sym.Value) + uint32(rela.Addend) f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], val32) } } @@ -888,8 +876,7 @@ func (f *File) applyRelocationsPPC64(dst []byte, rels []byte) error { continue } sym := &symbols[symNo-1] - needed, val := relocSymbolTargetOK(sym) - if !needed { + if !canApplyRelocation(sym) { continue } @@ -898,13 +885,13 @@ func (f *File) applyRelocationsPPC64(dst []byte, rels []byte) error { if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val64 := val + uint64(rela.Addend) + val64 := sym.Value + uint64(rela.Addend) f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], val64) case R_PPC64_ADDR32: if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val32 := uint32(val) + uint32(rela.Addend) + val32 := uint32(sym.Value) + uint32(rela.Addend) f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], val32) } } @@ -980,8 +967,7 @@ func (f *File) applyRelocationsMIPS64(dst []byte, rels []byte) error { continue } sym := &symbols[symNo-1] - needed, val := relocSymbolTargetOK(sym) - if !needed { + if !canApplyRelocation(sym) { continue } @@ -990,13 +976,13 @@ func (f *File) applyRelocationsMIPS64(dst []byte, rels []byte) error { if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val64 := val + uint64(rela.Addend) + val64 := sym.Value + uint64(rela.Addend) f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], val64) case R_MIPS_32: if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val32 := uint32(val) + uint32(rela.Addend) + val32 := uint32(sym.Value) + uint32(rela.Addend) f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], val32) } } @@ -1027,8 +1013,7 @@ func (f *File) applyRelocationsRISCV64(dst []byte, rels []byte) error { continue } sym := &symbols[symNo-1] - needed, val := relocSymbolTargetOK(sym) - if !needed { + if !canApplyRelocation(sym) { continue } @@ -1037,13 +1022,13 @@ func (f *File) applyRelocationsRISCV64(dst []byte, rels []byte) error { if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val64 := val + uint64(rela.Addend) + val64 := sym.Value + uint64(rela.Addend) f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], val64) case R_RISCV_32: if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val32 := uint32(val) + uint32(rela.Addend) + val32 := uint32(sym.Value) + uint32(rela.Addend) f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], val32) } } @@ -1074,8 +1059,7 @@ func (f *File) applyRelocationss390x(dst []byte, rels []byte) error { continue } sym := &symbols[symNo-1] - needed, val := relocSymbolTargetOK(sym) - if !needed { + if !canApplyRelocation(sym) { continue } @@ -1084,13 +1068,13 @@ func (f *File) applyRelocationss390x(dst []byte, rels []byte) error { if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val64 := val + uint64(rela.Addend) + val64 := sym.Value + uint64(rela.Addend) f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], val64) case R_390_32: if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val32 := uint32(val) + uint32(rela.Addend) + val32 := uint32(sym.Value) + uint32(rela.Addend) f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], val32) } } @@ -1121,8 +1105,7 @@ func (f *File) applyRelocationsSPARC64(dst []byte, rels []byte) error { continue } sym := &symbols[symNo-1] - needed, val := relocSymbolTargetOK(sym) - if !needed { + if !canApplyRelocation(sym) { continue } @@ -1131,13 +1114,13 @@ func (f *File) applyRelocationsSPARC64(dst []byte, rels []byte) error { if rela.Off+8 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val64 := val + uint64(rela.Addend) + val64 := sym.Value + uint64(rela.Addend) f.ByteOrder.PutUint64(dst[rela.Off:rela.Off+8], val64) case R_SPARC_32, R_SPARC_UA32: if rela.Off+4 >= uint64(len(dst)) || rela.Addend < 0 { continue } - val32 := uint32(val) + uint32(rela.Addend) + val32 := uint32(sym.Value) + uint32(rela.Addend) f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], val32) } } diff --git a/src/debug/elf/file_test.go b/src/debug/elf/file_test.go index 4da580da5a..24948e696a 100644 --- a/src/debug/elf/file_test.go +++ b/src/debug/elf/file_test.go @@ -293,6 +293,7 @@ func decompress(gz string) (io.ReaderAt, error) { type relocationTestEntry struct { entryNumber int entry *dwarf.Entry + pcRanges [][2]uint64 } type relocationTest struct { @@ -319,6 +320,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x6}}, }, }, }, @@ -340,6 +342,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x5}}, }, }, }, @@ -361,6 +364,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x6}}, }, }, }, @@ -382,6 +386,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x24}}, }, }, }, @@ -403,6 +408,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x28}}, }, }, }, @@ -421,9 +427,10 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0x0), Class: dwarf.ClassLinePtr}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(48), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrHighpc, Val: int64(0x30), Class: dwarf.ClassConstant}, }, }, + pcRanges: [][2]uint64{{0x0, 0x30}}, }, }, }, @@ -445,6 +452,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x44}}, }, }, }, @@ -466,6 +474,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x24}}, }, }, }, @@ -483,10 +492,11 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(100), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrHighpc, Val: int64(0x64), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x64}}, }, }, }, @@ -504,10 +514,11 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(58), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrHighpc, Val: int64(0x3a), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x3a}}, }, }, }, @@ -529,6 +540,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x2c}}, }, }, }, @@ -550,6 +562,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x58}}, }, }, }, @@ -571,6 +584,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x5c}}, }, }, }, @@ -588,10 +602,11 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrName, Val: "hello.c", Class: dwarf.ClassString}, {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, {Attr: dwarf.AttrLowpc, Val: uint64(0x0), Class: dwarf.ClassAddress}, - {Attr: dwarf.AttrHighpc, Val: int64(100), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrHighpc, Val: int64(0x64), Class: dwarf.ClassConstant}, {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x64}}, }, }, }, @@ -613,6 +628,7 @@ var relocationTests = []relocationTest{ {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, }, }, + pcRanges: [][2]uint64{{0x0, 0x2c}}, }, }, }, @@ -670,6 +686,56 @@ var relocationTests = []relocationTest{ }, }, }, + { + "testdata/go-relocation-test-gcc930-ranges-no-rela-x86-64", + []relocationTestEntry{ + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C17 9.3.0 -mtune=generic -march=x86-64 -g -fno-asynchronous-unwind-tables", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "multiple-code-sections.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrRanges, Val: int64(0), Class: dwarf.ClassRangeListPtr}, + {Attr: dwarf.AttrLowpc, Val: uint64(0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, + }, + pcRanges: [][2]uint64{ + {0x765, 0x777}, + {0x7e1, 0x7ec}, + }, + }, + }, + }, + { + "testdata/go-relocation-test-gcc930-ranges-with-rela-x86-64", + []relocationTestEntry{ + { + entry: &dwarf.Entry{ + Offset: 0xb, + Tag: dwarf.TagCompileUnit, + Children: true, + Field: []dwarf.Field{ + {Attr: dwarf.AttrProducer, Val: "GNU C17 9.3.0 -mtune=generic -march=x86-64 -g -fno-asynchronous-unwind-tables", Class: dwarf.ClassString}, + {Attr: dwarf.AttrLanguage, Val: int64(12), Class: dwarf.ClassConstant}, + {Attr: dwarf.AttrName, Val: "multiple-code-sections.c", Class: dwarf.ClassString}, + {Attr: dwarf.AttrCompDir, Val: "/tmp", Class: dwarf.ClassString}, + {Attr: dwarf.AttrRanges, Val: int64(0), Class: dwarf.ClassRangeListPtr}, + {Attr: dwarf.AttrLowpc, Val: uint64(0), Class: dwarf.ClassAddress}, + {Attr: dwarf.AttrStmtList, Val: int64(0), Class: dwarf.ClassLinePtr}, + }, + }, + pcRanges: [][2]uint64{ + {0x765, 0x777}, + {0x7e1, 0x7ec}, + }, + }, + }, + }, } func TestDWARFRelocations(t *testing.T) { @@ -705,6 +771,13 @@ func TestDWARFRelocations(t *testing.T) { if !reflect.DeepEqual(testEntry.entry, entry) { t.Errorf("entry %d mismatch: got:%#v want:%#v", testEntry.entryNumber, entry, testEntry.entry) } + pcRanges, err := dwarf.Ranges(entry) + if err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(testEntry.pcRanges, pcRanges) { + t.Errorf("entry %d: PC range mismatch: got:%#v want:%#v", testEntry.entryNumber, pcRanges, testEntry.pcRanges) + } } }) } diff --git a/src/debug/elf/testdata/go-relocation-test-gcc930-ranges-no-rela-x86-64 b/src/debug/elf/testdata/go-relocation-test-gcc930-ranges-no-rela-x86-64 new file mode 100644 index 0000000000000000000000000000000000000000..c013f3e081c7ecf1056be3457332be97ffa0f31c GIT binary patch literal 5696 zcmb<-^>JfjWMqH=W(GS35U+s^BH{p{7#R3r3RuA!+WgvDUPz`y_s z09dk2g*rwEYT836pBu_Yr{*&-FhD%R!3atuJP`~G48iECK$cW9FfcHRv1TzaFrZt) zI0q!kTnJXd2Vyf#%mIfcqnH#(lxboD0}BglW?l&cD@Qp40|P5ZEdv7s8zWl-0|Ntl z8AziL*l2Y3GR|RO6l7H86Xs^-ljaK*7i1I=XJBB`W3-oK=Ck6q=CGe56bFBu$s ztO5+2Ofc^-3o^3uc(XD_GBGhQGO{W$a5BLHky(_Hm2)jjih+Sagn@zK|NsC085tNW z1bEmvCP4F-3fNc%2AG+!D0So$Xk&8bWpm?U2PYYrI+z8pqySUr3ssj`lwQW*?iZ@y zY-kQiO$xfXC8c?(w&|&PsYRK|3c9(8Madbq6&7Z?W+n={=?c1OdHK4D#g%!<8AbVd z`K86WrFrFFDrN>AjB*pC zhnazwK>NW>Do0E7(B-P|VCAz#xHDT#!Knt2itbLJfdY%nZU% z7AnOI&IPDqARaS=D2T$q%nV`}Vjux#cx?#cAuuz%wnK=4Sj-HPAPNP8vL6e>$NwmT z43K)AiGh=016n+Sf)^zI08LyGREjciGAN)WZF5lB!hi@jkbNM#+`!_P@s$fTCjrfz zO0as&c%K0-;xXM1vIm>LKz3sj-w2Xm;K4{ghoIu<_4HM+d-xFz1F$*MxM{Kw5q?Ffb^97--m@5hRY84#gQkRtjLG!>=IonK1K<93#kHG{YGf z7;K^Dpr>;$u)Ub-BN-VO1epXF6wuOt8rXb9{)Ls>*PHIVN zik`WNsS$QX@oAZPnemB5MTwR1sd*(ul?-V`iMgrqDW$o&l??ImNWA#Wyv!05r8sNl zcvQ713@8G{C5c5P4Ds$h{!WfQ@&0aZ!LA|kA&yQyuJH`<@j01E$??g>rC^sa#CwML z#v}Y3;_D3ZaR{gqWQb2qNi0c(X#txW5327R9Nc|8ot)#1^o;aOLEcU*NsI?eGsMTI z=jP`@IPoCcQi}8AGZOPsa#A7nC6fIh?=r;4Clwb%)I;jh`1lZC=Xh5?7m#+4<6zN& z>a_UeibRkP5_2-EQc)empjTX(TauW>pjTW{1fervtdz>U;>uhGJrG?|#Gsd+SE^T* zT2!2wpNGPUFJjOuO3g_GDP+(CyHu|rr$jG3zl1@rB(1gLxfnF%r4&w$CV+b;pgIDi3xQ$9EsPFF(+_K}!Suu23o`-6htUaW`eE%lnEphV z$Dszm?1gd}($Mt7n#M5wuzCch9?dw03N-z&b|OqaCrl%hMi0L_sD5a0!P}Ft@Q3*m zsvSNq0u%2-(+_KR601KNO+T!C3e&FvvlvRl?1jEhe52H6j z^@HS)@lvRVVB>HwIhZ~eAJncx7X!&Xh3a1n;vivkwdZiy-vLc%p!9{L9Xz&(%)f&} zKO40Fm5;0#i`o}h#6Vgqp!zdF93+e$AE5Rk$WQ3u{{X7L6-h6M2~vwpgFFNi1Bt_M zDzrdDHy2$khz}}TVftY745)rsc?zm$G@)q?qz0C*LHQdRRUlzFR)7}#=Rg*~MM2{k aNE`+R20`%12dWr|_l_4tGBEHF&<_At*50T9 literal 0 HcmV?d00001 diff --git a/src/debug/elf/testdata/go-relocation-test-gcc930-ranges-with-rela-x86-64 b/src/debug/elf/testdata/go-relocation-test-gcc930-ranges-with-rela-x86-64 new file mode 100644 index 0000000000000000000000000000000000000000..51e03aa7b0d6010410a31d6594540b07c0b3b6c5 GIT binary patch literal 7680 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 Date: Tue, 1 Sep 2020 00:38:01 +0000 Subject: [PATCH 0388/1792] net/http: refactor ResponseWriter.ReadFrom to permit splice on Linux Rather than probe and guess if sendfile will work inside ResponseWriter.ReadFrom(src), this change fixes the underlying issue of starting to respond before src is readable We'll no longer send a status OK if a header has not yet been written and reading from src is destined to fail. This small change implicitly takes care of the need for the server to sniff the response body to determine the Content-Type. This allows splice to work on Linux when src is a socket or any non-regular file that's spliceable. The extra read of 512 bytes may raise an objection, and that's fair, but we're already swapping some syscall prep work for another and a read of 512 probably will not impact the overall performance. For shorter bodies, there's likely less setup time. A little initial slop is not too unusual in zero copy network code, and sometimes actually helps. Fixes #40888 Change-Id: I4a8e2ad0ace1318bae66dae5671d06ea6d4838ed GitHub-Last-Rev: 097364ea866613d103a31e2247b44f4a12077f9e GitHub-Pull-Request: golang/go#40903 Reviewed-on: https://go-review.googlesource.com/c/go/+/249238 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/net/http/fs_test.go | 12 +++++-- src/net/http/server.go | 70 +++++++++++++++++++++-------------------- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go index c082ceee71..245d9ce65c 100644 --- a/src/net/http/fs_test.go +++ b/src/net/http/fs_test.go @@ -1136,6 +1136,14 @@ func TestLinuxSendfile(t *testing.T) { t.Skipf("skipping; failed to run strace: %v", err) } + filename := fmt.Sprintf("1kb-%d", os.Getpid()) + filepath := path.Join(os.TempDir(), filename) + + if err := ioutil.WriteFile(filepath, bytes.Repeat([]byte{'a'}, 1<<10), 0755); err != nil { + t.Fatal(err) + } + defer os.Remove(filepath) + var buf bytes.Buffer child := exec.Command("strace", "-f", "-q", os.Args[0], "-test.run=TestLinuxSendfileChild") child.ExtraFiles = append(child.ExtraFiles, lnf) @@ -1146,7 +1154,7 @@ func TestLinuxSendfile(t *testing.T) { t.Skipf("skipping; failed to start straced child: %v", err) } - res, err := Get(fmt.Sprintf("http://%s/", ln.Addr())) + res, err := Get(fmt.Sprintf("http://%s/%s", ln.Addr(), filename)) if err != nil { t.Fatalf("http client error: %v", err) } @@ -1192,7 +1200,7 @@ func TestLinuxSendfileChild(*testing.T) { panic(err) } mux := NewServeMux() - mux.Handle("/", FileServer(Dir("testdata"))) + mux.Handle("/", FileServer(Dir(os.TempDir()))) mux.HandleFunc("/quit", func(ResponseWriter, *Request) { os.Exit(0) }) diff --git a/src/net/http/server.go b/src/net/http/server.go index ed5de350a9..9124903b89 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -561,51 +561,53 @@ type writerOnly struct { io.Writer } -func srcIsRegularFile(src io.Reader) (isRegular bool, err error) { - switch v := src.(type) { - case *os.File: - fi, err := v.Stat() - if err != nil { - return false, err - } - return fi.Mode().IsRegular(), nil - case *io.LimitedReader: - return srcIsRegularFile(v.R) - default: - return - } -} - // ReadFrom is here to optimize copying from an *os.File regular file -// to a *net.TCPConn with sendfile. +// to a *net.TCPConn with sendfile, or from a supported src type such +// as a *net.TCPConn on Linux with splice. func (w *response) ReadFrom(src io.Reader) (n int64, err error) { + bufp := copyBufPool.Get().(*[]byte) + buf := *bufp + defer copyBufPool.Put(bufp) + // Our underlying w.conn.rwc is usually a *TCPConn (with its - // own ReadFrom method). If not, or if our src isn't a regular - // file, just fall back to the normal copy method. + // own ReadFrom method). If not, just fall back to the normal + // copy method. rf, ok := w.conn.rwc.(io.ReaderFrom) - regFile, err := srcIsRegularFile(src) - if err != nil { - return 0, err - } - if !ok || !regFile { - bufp := copyBufPool.Get().(*[]byte) - defer copyBufPool.Put(bufp) - return io.CopyBuffer(writerOnly{w}, src, *bufp) + if !ok { + return io.CopyBuffer(writerOnly{w}, src, buf) } // sendfile path: - if !w.wroteHeader { - w.WriteHeader(StatusOK) - } + // Do not start actually writing response until src is readable. + // If body length is <= sniffLen, sendfile/splice path will do + // little anyway. This small read also satisfies sniffing the + // body in case Content-Type is missing. + nr, er := src.Read(buf[:sniffLen]) + atEOF := errors.Is(er, io.EOF) + n += int64(nr) - if w.needsSniff() { - n0, err := io.Copy(writerOnly{w}, io.LimitReader(src, sniffLen)) - n += n0 - if err != nil { - return n, err + if nr > 0 { + // Write the small amount read normally. + nw, ew := w.Write(buf[:nr]) + if ew != nil { + err = ew + } else if nr != nw { + err = io.ErrShortWrite } } + if err == nil && er != nil && !atEOF { + err = er + } + + // Do not send StatusOK in the error case where nothing has been written. + if err == nil && !w.wroteHeader { + w.WriteHeader(StatusOK) // nr == 0, no error (or EOF) + } + + if err != nil || atEOF { + return n, err + } w.w.Flush() // get rid of any previous writes w.cw.flush() // make sure Header is written; flush data to rwc -- GitLab From 4d89b3231d590284e35bff647e597e93fdf41dae Mon Sep 17 00:00:00 2001 From: Heisenberg Date: Mon, 31 Aug 2020 19:22:36 +0800 Subject: [PATCH 0389/1792] runtime: remove remnants of signal stack workaround Updates #35979 Change-Id: Ic3a6e1b5e9d544979a3c8d909a36a55efa3b9c9d Reviewed-on: https://go-review.googlesource.com/c/go/+/251757 Reviewed-by: Keith Randall Reviewed-by: Austin Clements --- src/runtime/os_linux.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index 9702920bcf..371db73502 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -5,7 +5,6 @@ package runtime import ( - "runtime/internal/atomic" "runtime/internal/sys" "unsafe" ) @@ -476,21 +475,7 @@ func rt_sigaction(sig uintptr, new, old *sigactiont, size uintptr) int32 func getpid() int func tgkill(tgid, tid, sig int) -// touchStackBeforeSignal stores an errno value. If non-zero, it means -// that we should touch the signal stack before sending a signal. -// This is used on systems that have a bug when the signal stack must -// be faulted in. See #35777 and #37436. -// -// This is accessed atomically as it is set and read in different threads. -// -// TODO(austin): Remove this after Go 1.15 when we remove the -// mlockGsignal workaround. -var touchStackBeforeSignal uint32 - // signalM sends a signal to mp. func signalM(mp *m, sig int) { - if atomic.Load(&touchStackBeforeSignal) != 0 { - atomic.Cas((*uint32)(unsafe.Pointer(mp.gsignal.stack.hi-4)), 0, 0) - } tgkill(getpid(), int(mp.procid), sig) } -- GitLab From d7a6a44deb3a56aa3f94b75f7ab4ffa1a0fa8cef Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Tue, 25 Aug 2020 10:38:50 +0300 Subject: [PATCH 0390/1792] doc/asm: add BP is callee-save paragraph Change-Id: Id38e639c66a42acf0b1c4488cdfd0b7b6cf71c78 Reviewed-on: https://go-review.googlesource.com/c/go/+/250397 Reviewed-by: Keith Randall --- doc/asm.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/asm.html b/doc/asm.html index dbbe8f2cd1..cc8598aeff 100644 --- a/doc/asm.html +++ b/doc/asm.html @@ -687,6 +687,13 @@ MOVQ g(CX), AX // Move g into AX. MOVQ g_m(AX), BX // Move g.m into BX. +

+Register BP is callee-save. +The assembler automatically inserts BP save/restore when frame size is larger than zero. +Using BP as a general purpose register is allowed, +however it can interfere with sampling-based profiling. +

+

ARM

-- GitLab From ab88d97deb216cdd93712dedca3be4d7a561743e Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Mon, 31 Aug 2020 16:29:13 -0400 Subject: [PATCH 0391/1792] cmd: update vendored golang.org/x/mod This pulls in golang.org/cl/250920 which rejects Windows shortnames as path components in module.CheckImportPath (as is already done in cmd/go/internal/get's copy of CheckImportPath). This will allow us to replace the copy of CheckImportPath with the original. This also pulls in golang.org/cl/250919 which rejects + in CheckPath and CheckImportPath, and golang.org/cl/235597, which adds methods to the zip package for gorelease, but shouldn't affect cmd. This change also updates the cmd/go test case TestScript/mod_bad_filenames to reflect that golang.org/x/mod/zip error messages now include filenames for bad file names that can't be included in zip archives. Updates #29101 Change-Id: I7f654325dc33b19bc9c6f77a56546747add5a47f Reviewed-on: https://go-review.googlesource.com/c/go/+/251877 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- .../go/testdata/script/mod_bad_filenames.txt | 6 +- .../vendor/golang.org/x/mod/module/module.go | 33 +- src/cmd/vendor/golang.org/x/mod/zip/zip.go | 621 +++++++++++++----- src/cmd/vendor/modules.txt | 2 +- 6 files changed, 477 insertions(+), 191 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 5c5c99e3cd..68ce1705e4 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -7,7 +7,7 @@ require ( github.com/ianlancetaylor/demangle v0.0.0-20200414190113-039b1ae3a340 // indirect golang.org/x/arch v0.0.0-20200511175325-f7c78586839d golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 - golang.org/x/mod v0.3.1-0.20200824162228-c0d644d00ab8 + golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 // indirect golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316 // indirect diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 69cebe1b23..cb64a5d475 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -14,8 +14,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200824162228-c0d644d00ab8 h1:Qbq3laTJZip3mEOreFwHF81RGkkhIvmraRMINHNyWHE= -golang.org/x/mod v0.3.1-0.20200824162228-c0d644d00ab8/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 h1:xUIPaMhvROX9dhPvRCenIJtU78+lbEenGbgqB5hfHCQ= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= diff --git a/src/cmd/go/testdata/script/mod_bad_filenames.txt b/src/cmd/go/testdata/script/mod_bad_filenames.txt index 6e0c8bd302..eb556f4c7c 100644 --- a/src/cmd/go/testdata/script/mod_bad_filenames.txt +++ b/src/cmd/go/testdata/script/mod_bad_filenames.txt @@ -3,9 +3,9 @@ env GO111MODULE=on ! go get rsc.io/badfile1 rsc.io/badfile2 rsc.io/badfile3 rsc.io/badfile4 rsc.io/badfile5 ! stderr 'unzip.*badfile1' stderr 'unzip.*badfile2[\\/]@v[\\/]v1.0.0.zip:.*malformed file path "☺.go": invalid char ''☺''' -stderr 'unzip.*badfile3[\\/]@v[\\/]v1.0.0.zip: malformed file path "x\?y.go": invalid char ''\?''' -stderr 'unzip.*badfile4[\\/]@v[\\/]v1.0.0.zip: case-insensitive file name collision: "x/Y.go" and "x/y.go"' -stderr 'unzip.*badfile5[\\/]@v[\\/]v1.0.0.zip: case-insensitive file name collision: "x/y" and "x/Y"' +stderr 'unzip.*badfile3[\\/]@v[\\/]v1.0.0.zip: rsc.io[\\/]badfile3@v1.0.0[\\/]x\?y.go: malformed file path "x\?y.go": invalid char ''\?''' +stderr 'unzip.*badfile4[\\/]@v[\\/]v1.0.0.zip: rsc.io[\\/]badfile4@v1.0.0[\\/]x[\\/]y.go: case-insensitive file name collision: "x/Y.go" and "x/y.go"' +stderr 'unzip.*badfile5[\\/]@v[\\/]v1.0.0.zip: rsc.io[\\/]badfile5@v1.0.0[\\/]x[\\/]Y[\\/]zz[\\/]ww.go: case-insensitive file name collision: "x/y" and "x/Y"' -- go.mod -- module x 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 3a8b080c7b..c1c5263c42 100644 --- a/src/cmd/vendor/golang.org/x/mod/module/module.go +++ b/src/cmd/vendor/golang.org/x/mod/module/module.go @@ -225,13 +225,13 @@ func firstPathOK(r rune) bool { } // pathOK reports whether r can appear in an import path element. -// Paths can be ASCII letters, ASCII digits, and limited ASCII punctuation: + - . _ and ~. +// Paths can be ASCII letters, ASCII digits, and limited ASCII punctuation: - . _ and ~. // This matches what "go get" has historically recognized in import paths. // TODO(rsc): We would like to allow Unicode letters, but that requires additional // care in the safe encoding (see "escaped paths" above). func pathOK(r rune) bool { if r < utf8.RuneSelf { - return r == '+' || r == '-' || r == '.' || r == '_' || r == '~' || + return r == '-' || r == '.' || r == '_' || r == '~' || '0' <= r && r <= '9' || 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' @@ -314,11 +314,13 @@ func CheckPath(path string) error { // separated by slashes (U+002F). (It must not begin with nor end in a slash.) // // A valid path element is a non-empty string made up of -// ASCII letters, ASCII digits, and limited ASCII punctuation: + - . _ and ~. +// ASCII letters, ASCII digits, and limited ASCII punctuation: - . _ and ~. // It must not begin or end with a dot (U+002E), nor contain two dots in a row. // // The element prefix up to the first dot must not be a reserved file name -// on Windows, regardless of case (CON, com1, NuL, and so on). +// on Windows, regardless of case (CON, com1, NuL, and so on). The element +// must not have a suffix of a tilde followed by one or more ASCII digits +// (to exclude paths elements that look like Windows short-names). // // CheckImportPath may be less restrictive in the future, but see the // top-level package documentation for additional information about @@ -403,6 +405,29 @@ func checkElem(elem string, fileName bool) error { return fmt.Errorf("%q disallowed as path element component on Windows", short) } } + + if fileName { + // don't check for Windows short-names in file names. They're + // only an issue for import paths. + return nil + } + + // Reject path components that look like Windows short-names. + // Those usually end in a tilde followed by one or more ASCII digits. + if tilde := strings.LastIndexByte(short, '~'); tilde >= 0 && tilde < len(short)-1 { + suffix := short[tilde+1:] + suffixIsDigits := true + for _, r := range suffix { + if r < '0' || r > '9' { + suffixIsDigits = false + break + } + } + if suffixIsDigits { + return fmt.Errorf("trailing tilde and digits in path element") + } + } + return nil } 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 6865895b3d..5b401ad4d8 100644 --- a/src/cmd/vendor/golang.org/x/mod/zip/zip.go +++ b/src/cmd/vendor/golang.org/x/mod/zip/zip.go @@ -48,6 +48,7 @@ package zip import ( "archive/zip" "bytes" + "errors" "fmt" "io" "io/ioutil" @@ -92,40 +93,134 @@ type File interface { Open() (io.ReadCloser, error) } -// Create builds a zip archive for module m from an abstract list of files -// and writes it to w. +// CheckedFiles reports whether a set of files satisfy the name and size +// constraints required by module zip files. The constraints are listed in the +// package documentation. // -// Create verifies the restrictions described in the package documentation -// 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 -// as symbolic links) in the output archive. -func Create(w io.Writer, m module.Version, files []File) (err error) { - defer func() { - if err != nil { - err = &zipError{verb: "create zip", err: err} - } - }() +// Functions that produce this report may include slightly different sets of +// files. See documentation for CheckFiles, CheckDir, and CheckZip for details. +type CheckedFiles struct { + // Valid is a list of file paths that should be included in a zip file. + Valid []string + + // Omitted is a list of files that are ignored when creating a module zip + // file, along with the reason each file is ignored. + Omitted []FileError + + // Invalid is a list of files that should not be included in a module zip + // file, along with the reason each file is invalid. + Invalid []FileError + + // SizeError is non-nil if the total uncompressed size of the valid files + // exceeds the module zip size limit or if the zip file itself exceeds the + // limit. + SizeError error +} - // Check that the version is canonical, the module path is well-formed, and - // the major version suffix matches the major version. - if vers := module.CanonicalVersion(m.Version); vers != m.Version { - return fmt.Errorf("version %q is not canonical (should be %q)", m.Version, vers) +// 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 +// if there are one or more invalid files. Other errors may be returned in the +// future. +func (cf CheckedFiles) Err() error { + if cf.SizeError != nil { + return cf.SizeError } - if err := module.Check(m.Path, m.Version); err != nil { - return err + if len(cf.Invalid) > 0 { + return FileErrorList(cf.Invalid) + } + return nil +} + +type FileErrorList []FileError + +func (el FileErrorList) Error() string { + buf := &strings.Builder{} + sep := "" + for _, e := range el { + buf.WriteString(sep) + buf.WriteString(e.Error()) + sep = "\n" + } + return buf.String() +} + +type FileError struct { + Path string + Err error +} + +func (e FileError) Error() string { + return fmt.Sprintf("%s: %s", e.Path, e.Err) +} + +func (e FileError) Unwrap() error { + return e.Err +} + +var ( + // Predefined error messages for invalid files. Not exhaustive. + errPathNotClean = errors.New("file path is not clean") + errPathNotRelative = errors.New("file path is not relative") + errGoModCase = errors.New("go.mod files must have lowercase names") + errGoModSize = fmt.Errorf("go.mod file too large (max size is %d bytes)", MaxGoMod) + errLICENSESize = fmt.Errorf("LICENSE file too large (max size is %d bytes)", MaxLICENSE) + + // Predefined error messages for omitted files. Not exhaustive. + errVCS = errors.New("directory is a version control repository") + errVendored = errors.New("file is in vendor directory") + errSubmoduleFile = errors.New("file is in another module") + errSubmoduleDir = errors.New("directory is in another module") + errHgArchivalTxt = errors.New("file is inserted by 'hg archive' and is always omitted") + errSymlink = errors.New("file is a symbolic link") + errNotRegular = errors.New("not a regular file") +) + +// CheckFiles reports whether a list of files satisfy the name and size +// constraints listed in the package documentation. The returned CheckedFiles +// record contains lists of valid, invalid, and omitted files. Every file in +// the given list will be included in exactly one of those lists. +// +// CheckFiles 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. +// +// Note that CheckFiles will not open any files, so Create may still fail when +// CheckFiles is successful due to I/O errors and reported size differences. +func CheckFiles(files []File) (CheckedFiles, error) { + cf, _, _ := checkFiles(files) + return cf, cf.Err() +} + +// checkFiles implements CheckFiles and also returns lists of valid files and +// their sizes, corresponding to cf.Valid. These lists are used in Crewate to +// avoid repeated calls to File.Lstat. +func checkFiles(files []File) (cf CheckedFiles, validFiles []File, validSizes []int64) { + errPaths := make(map[string]struct{}) + addError := func(path string, omitted bool, err error) { + if _, ok := errPaths[path]; ok { + return + } + errPaths[path] = struct{}{} + fe := FileError{Path: path, Err: err} + if omitted { + cf.Omitted = append(cf.Omitted, fe) + } else { + cf.Invalid = append(cf.Invalid, fe) + } } // Find directories containing go.mod files (other than the root). + // Files in these directories will be omitted. // These directories will not be included in the output zip. haveGoMod := make(map[string]bool) for _, f := range files { - dir, base := path.Split(f.Path()) + p := f.Path() + dir, base := path.Split(p) if strings.EqualFold(base, "go.mod") { info, err := f.Lstat() if err != nil { - return err + addError(p, false, err) + continue } if info.Mode().IsRegular() { haveGoMod[dir] = true @@ -146,77 +241,292 @@ func Create(w io.Writer, m module.Version, files []File) (err error) { } } - // Create the module zip file. - zw := zip.NewWriter(w) - prefix := fmt.Sprintf("%s@%s/", m.Path, m.Version) - - addFile := func(f File, path string, size int64) error { - rc, err := f.Open() - if err != nil { - return err - } - defer rc.Close() - w, err := zw.Create(prefix + path) - if err != nil { - return err - } - lr := &io.LimitedReader{R: rc, N: size + 1} - if _, err := io.Copy(w, lr); err != nil { - return err - } - if lr.N <= 0 { - return fmt.Errorf("file %q is larger than declared size", path) - } - return nil - } - collisions := make(collisionChecker) maxSize := int64(MaxZipFile) for _, f := range files { p := f.Path() if p != path.Clean(p) { - return fmt.Errorf("file path %s is not clean", p) + addError(p, false, errPathNotClean) + continue } if path.IsAbs(p) { - return fmt.Errorf("file path %s is not relative", p) + addError(p, false, errPathNotRelative) + continue + } + if isVendoredPackage(p) { + addError(p, true, errVendored) + continue } - if isVendoredPackage(p) || inSubmodule(p) { + if inSubmodule(p) { + addError(p, true, errSubmoduleFile) continue } if p == ".hg_archival.txt" { // Inserted by hg archive. // The go command drops this regardless of the VCS being used. + addError(p, true, errHgArchivalTxt) continue } if err := module.CheckFilePath(p); err != nil { - return err + addError(p, false, err) + continue } if strings.ToLower(p) == "go.mod" && p != "go.mod" { - return fmt.Errorf("found file named %s, want all lower-case go.mod", p) + addError(p, false, errGoModCase) + continue } info, err := f.Lstat() if err != nil { - return err + addError(p, false, err) + continue } if err := collisions.check(p, info.IsDir()); err != nil { - return err + addError(p, false, err) + continue } - if !info.Mode().IsRegular() { + if info.Mode()&os.ModeType == os.ModeSymlink { // Skip symbolic links (golang.org/issue/27093). + addError(p, true, errSymlink) + continue + } + if !info.Mode().IsRegular() { + addError(p, true, errNotRegular) continue } size := info.Size() - if size < 0 || maxSize < size { - return fmt.Errorf("module source tree too large (max size is %d bytes)", MaxZipFile) + if size >= 0 && size <= maxSize { + maxSize -= size + } else if cf.SizeError == nil { + cf.SizeError = fmt.Errorf("module source tree too large (max size is %d bytes)", MaxZipFile) } - maxSize -= size if p == "go.mod" && size > MaxGoMod { - return fmt.Errorf("go.mod file too large (max size is %d bytes)", MaxGoMod) + addError(p, false, errGoModSize) + continue } if p == "LICENSE" && size > MaxLICENSE { - return fmt.Errorf("LICENSE file too large (max size is %d bytes)", MaxLICENSE) + addError(p, false, errLICENSESize) + continue + } + + cf.Valid = append(cf.Valid, p) + validFiles = append(validFiles, f) + validSizes = append(validSizes, info.Size()) + } + + return cf, validFiles, validSizes +} + +// CheckDir reports whether the files in dir satisfy the name and size +// 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 +// an error is returned. +// +// 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 + // or invalid. + files, omitted, err := listFilesInDir(dir) + if err != nil { + return CheckedFiles{}, err + } + cf, cfErr := CheckFiles(files) + _ = cfErr // ignore this error; we'll generate our own after rewriting paths. + + // Replace all paths with file system paths. + // Paths returned by CheckFiles will be slash-separated paths relative to dir. + // That's probably not appropriate for error messages. + for i := range cf.Valid { + cf.Valid[i] = filepath.Join(dir, cf.Valid[i]) + } + cf.Omitted = append(cf.Omitted, omitted...) + for i := range cf.Omitted { + cf.Omitted[i].Path = filepath.Join(dir, cf.Omitted[i].Path) + } + for i := range cf.Invalid { + cf.Invalid[i].Path = filepath.Join(dir, cf.Invalid[i].Path) + } + return cf, cf.Err() +} + +// 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 +// 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 +// when CheckZip is successful due to I/O errors. +func CheckZip(m module.Version, zipFile string) (CheckedFiles, error) { + f, err := os.Open(zipFile) + if err != nil { + return CheckedFiles{}, err + } + defer f.Close() + _, cf, err := checkZip(m, f) + return cf, err +} + +// checkZip implements checkZip and also returns the *zip.Reader. This is +// used in Unzip to avoid redundant I/O. +func checkZip(m module.Version, f *os.File) (*zip.Reader, CheckedFiles, error) { + // Make sure the module path and version are valid. + if vers := module.CanonicalVersion(m.Version); vers != m.Version { + return nil, CheckedFiles{}, fmt.Errorf("version %q is not canonical (should be %q)", m.Version, vers) + } + if err := module.Check(m.Path, m.Version); err != nil { + return nil, CheckedFiles{}, err + } + + // Check the total file size. + info, err := f.Stat() + if err != nil { + return nil, CheckedFiles{}, err + } + zipSize := info.Size() + if zipSize > MaxZipFile { + cf := CheckedFiles{SizeError: fmt.Errorf("module zip file is too large (%d bytes; limit is %d bytes)", zipSize, MaxZipFile)} + return nil, cf, cf.Err() + } + + // Check for valid file names, collisions. + var cf CheckedFiles + addError := func(zf *zip.File, err error) { + cf.Invalid = append(cf.Invalid, FileError{Path: zf.Name, Err: err}) + } + z, err := zip.NewReader(f, zipSize) + if err != nil { + return nil, CheckedFiles{}, err + } + prefix := fmt.Sprintf("%s@%s/", m.Path, m.Version) + collisions := make(collisionChecker) + var size int64 + for _, zf := range z.File { + if !strings.HasPrefix(zf.Name, prefix) { + addError(zf, fmt.Errorf("path does not have prefix %q", prefix)) + continue } + name := zf.Name[len(prefix):] + if name == "" { + continue + } + isDir := strings.HasSuffix(name, "/") + if isDir { + name = name[:len(name)-1] + } + if path.Clean(name) != name { + addError(zf, errPathNotClean) + continue + } + if err := module.CheckFilePath(name); err != nil { + addError(zf, err) + continue + } + if err := collisions.check(name, isDir); err != nil { + addError(zf, err) + continue + } + if isDir { + continue + } + if base := path.Base(name); strings.EqualFold(base, "go.mod") { + if base != name { + addError(zf, fmt.Errorf("go.mod file not in module root directory")) + continue + } + if name != "go.mod" { + addError(zf, errGoModCase) + continue + } + } + sz := int64(zf.UncompressedSize64) + if sz >= 0 && MaxZipFile-size >= sz { + size += sz + } else if cf.SizeError == nil { + cf.SizeError = fmt.Errorf("total uncompressed size of module contents too large (max size is %d bytes)", MaxZipFile) + } + if name == "go.mod" && sz > MaxGoMod { + addError(zf, fmt.Errorf("go.mod file too large (max size is %d bytes)", MaxGoMod)) + continue + } + if name == "LICENSE" && sz > MaxLICENSE { + addError(zf, fmt.Errorf("LICENSE file too large (max size is %d bytes)", MaxLICENSE)) + continue + } + cf.Valid = append(cf.Valid, zf.Name) + } + return z, cf, cf.Err() +} + +// Create builds a zip archive for module m from an abstract list of files +// 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 +// 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 +// as symbolic links) in the output archive. +func Create(w io.Writer, m module.Version, files []File) (err error) { + defer func() { + if err != nil { + err = &zipError{verb: "create zip", err: err} + } + }() + + // Check that the version is canonical, the module path is well-formed, and + // the major version suffix matches the major version. + if vers := module.CanonicalVersion(m.Version); vers != m.Version { + return fmt.Errorf("version %q is not canonical (should be %q)", m.Version, vers) + } + if err := module.Check(m.Path, m.Version); err != nil { + return err + } + + // Check whether files are valid, not valid, or should be omitted. + // Also check that the valid files don't exceed the maximum size. + cf, validFiles, validSizes := checkFiles(files) + if err := cf.Err(); err != nil { + return err + } + + // Create the module zip file. + zw := zip.NewWriter(w) + prefix := fmt.Sprintf("%s@%s/", m.Path, m.Version) + + addFile := func(f File, path string, size int64) error { + rc, err := f.Open() + if err != nil { + return err + } + defer rc.Close() + w, err := zw.Create(prefix + path) + if err != nil { + return err + } + lr := &io.LimitedReader{R: rc, N: size + 1} + if _, err := io.Copy(w, lr); err != nil { + return err + } + if lr.N <= 0 { + return fmt.Errorf("file %q is larger than declared size", path) + } + return nil + } + + for i, f := range validFiles { + p := f.Path() + size := validSizes[i] if err := addFile(f, p, size); err != nil { return err } @@ -245,61 +555,7 @@ func CreateFromDir(w io.Writer, m module.Version, dir string) (err error) { } }() - var files []File - err = filepath.Walk(dir, func(filePath string, info os.FileInfo, err error) error { - if err != nil { - return err - } - relPath, err := filepath.Rel(dir, filePath) - if err != nil { - return err - } - slashPath := filepath.ToSlash(relPath) - - if info.IsDir() { - if filePath == dir { - // Don't skip the top-level directory. - return nil - } - - // Skip VCS directories. - // fossil repos are regular files with arbitrary names, so we don't try - // to exclude them. - switch filepath.Base(filePath) { - case ".bzr", ".git", ".hg", ".svn": - return filepath.SkipDir - } - - // Skip some subdirectories inside vendor, but maintain bug - // golang.org/issue/31562, described in isVendoredPackage. - // We would like Create and CreateFromDir to produce the same result - // for a set of files, whether expressed as a directory tree or zip. - if isVendoredPackage(slashPath) { - return filepath.SkipDir - } - - // Skip submodules (directories containing go.mod files). - if goModInfo, err := os.Lstat(filepath.Join(filePath, "go.mod")); err == nil && !goModInfo.IsDir() { - return filepath.SkipDir - } - return nil - } - - if info.Mode().IsRegular() { - if !isVendoredPackage(slashPath) { - files = append(files, dirFile{ - filePath: filePath, - slashPath: slashPath, - info: info, - }) - } - return nil - } - - // Not a regular file or a directory. Probably a symbolic link. - // Irregular files are ignored, so skip it. - return nil - }) + files, _, err := listFilesInDir(dir) if err != nil { return err } @@ -356,89 +612,28 @@ func Unzip(dir string, m module.Version, zipFile string) (err error) { } }() - if vers := module.CanonicalVersion(m.Version); vers != m.Version { - return fmt.Errorf("version %q is not canonical (should be %q)", m.Version, vers) - } - if err := module.Check(m.Path, m.Version); err != nil { - return err - } - // Check that the directory is empty. Don't create it yet in case there's // an error reading the zip. - files, _ := ioutil.ReadDir(dir) - if len(files) > 0 { + if files, _ := ioutil.ReadDir(dir); len(files) > 0 { return fmt.Errorf("target directory %v exists and is not empty", dir) } - // Open the zip file and ensure it's under the size limit. + // Open the zip and check that it satisfies all restrictions. f, err := os.Open(zipFile) if err != nil { return err } defer f.Close() - info, err := f.Stat() + z, cf, err := checkZip(m, f) if err != nil { return err } - zipSize := info.Size() - if zipSize > MaxZipFile { - return fmt.Errorf("module zip file is too large (%d bytes; limit is %d bytes)", zipSize, MaxZipFile) - } - - z, err := zip.NewReader(f, zipSize) - if err != nil { + if err := cf.Err(); err != nil { return err } - // Check total size, valid file names. - collisions := make(collisionChecker) + // Unzip, enforcing sizes declared in the zip file. prefix := fmt.Sprintf("%s@%s/", m.Path, m.Version) - var size int64 - for _, zf := range z.File { - if !strings.HasPrefix(zf.Name, prefix) { - return fmt.Errorf("unexpected file name %s", zf.Name) - } - name := zf.Name[len(prefix):] - if name == "" { - continue - } - isDir := strings.HasSuffix(name, "/") - if isDir { - name = name[:len(name)-1] - } - if path.Clean(name) != name { - return fmt.Errorf("invalid file name %s", zf.Name) - } - if err := module.CheckFilePath(name); err != nil { - return err - } - if err := collisions.check(name, isDir); err != nil { - return err - } - if isDir { - continue - } - if base := path.Base(name); strings.EqualFold(base, "go.mod") { - if base != name { - return fmt.Errorf("found go.mod file not in module root directory (%s)", zf.Name) - } else if name != "go.mod" { - return fmt.Errorf("found file named %s, want all lower-case go.mod", zf.Name) - } - } - s := int64(zf.UncompressedSize64) - if s < 0 || MaxZipFile-size < s { - return fmt.Errorf("total uncompressed size of module contents too large (max size is %d bytes)", MaxZipFile) - } - size += s - if name == "go.mod" && s > MaxGoMod { - return fmt.Errorf("go.mod file too large (max size is %d bytes)", MaxGoMod) - } - if name == "LICENSE" && s > MaxLICENSE { - return fmt.Errorf("LICENSE file too large (max size is %d bytes)", MaxLICENSE) - } - } - - // Unzip, enforcing sizes checked earlier. if err := os.MkdirAll(dir, 0777); err != nil { return err } @@ -515,6 +710,72 @@ func (cc collisionChecker) check(p string, isDir bool) error { return nil } +// listFilesInDir walks the directory tree rooted at dir and returns a list of +// files, as well as a list of directories and files that were skipped (for +// example, nested modules and symbolic links). +func listFilesInDir(dir string) (files []File, omitted []FileError, err error) { + err = filepath.Walk(dir, func(filePath string, info os.FileInfo, err error) error { + if err != nil { + return err + } + relPath, err := filepath.Rel(dir, filePath) + if err != nil { + return err + } + slashPath := filepath.ToSlash(relPath) + + // Skip some subdirectories inside vendor, but maintain bug + // golang.org/issue/31562, described in isVendoredPackage. + // We would like Create and CreateFromDir to produce the same result + // for a set of files, whether expressed as a directory tree or zip. + if isVendoredPackage(slashPath) { + omitted = append(omitted, FileError{Path: slashPath, Err: errVendored}) + return nil + } + + if info.IsDir() { + if filePath == dir { + // Don't skip the top-level directory. + return nil + } + + // Skip VCS directories. + // fossil repos are regular files with arbitrary names, so we don't try + // to exclude them. + switch filepath.Base(filePath) { + case ".bzr", ".git", ".hg", ".svn": + omitted = append(omitted, FileError{Path: slashPath, Err: errVCS}) + return filepath.SkipDir + } + + // Skip submodules (directories containing go.mod files). + if goModInfo, err := os.Lstat(filepath.Join(filePath, "go.mod")); err == nil && !goModInfo.IsDir() { + omitted = append(omitted, FileError{Path: slashPath, Err: errSubmoduleDir}) + return filepath.SkipDir + } + return nil + } + + // Skip irregular files and files in vendor directories. + // Irregular files are ignored. They're typically symbolic links. + if !info.Mode().IsRegular() { + omitted = append(omitted, FileError{Path: slashPath, Err: errNotRegular}) + return nil + } + + files = append(files, dirFile{ + filePath: filePath, + slashPath: slashPath, + info: info, + }) + return nil + }) + if err != nil { + return nil, nil, err + } + return files, omitted, nil +} + type zipError struct { verb, path string err error diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index ab2f81a66b..c0c008e038 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -29,7 +29,7 @@ golang.org/x/arch/x86/x86asm golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ssh/terminal -# golang.org/x/mod v0.3.1-0.20200824162228-c0d644d00ab8 +# golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 ## explicit golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile -- GitLab From 829ca10f9205ee57158062de823121624deb8988 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Mon, 31 Aug 2020 16:12:35 -0400 Subject: [PATCH 0392/1792] cmd/go/internal/get: disallow non-ASCII unicode letters from import paths The copy of CheckImportPath in path.go and the regular expression for github repos in vcsPaths together allow import paths with unicode letters with import paths. These all come from github repos with non-ASCII unicode letters with paths in directories. This mainly shows up in GOPATH mode, but could also show up in Module mode when getting a module in GOPROXY=direct mode. We expect there to not be any significant affected users of this change-- an investingation of github repos that would produce import paths that would comply with the copy CheckImportPaths that's being removed, but not modload.CheckImportPaths only surfaced a handful of cases, all of which seemed to be small test or demonstation repos. But this CL is being submitted early in the cycle so that it can be backed out if need be. Updates #29101 Change-Id: I719df4af5b318e1330e90d8a0bffe5bb8d816f4f Reviewed-on: https://go-review.googlesource.com/c/go/+/251878 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/go/internal/get/get.go | 4 +- src/cmd/go/internal/get/path.go | 192 -------------------------------- src/cmd/go/internal/get/vcs.go | 2 +- 3 files changed, 4 insertions(+), 194 deletions(-) delete mode 100644 src/cmd/go/internal/get/path.go diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index e5bacadaa3..d1f032a167 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -20,6 +20,8 @@ import ( "cmd/go/internal/str" "cmd/go/internal/web" "cmd/go/internal/work" + + "golang.org/x/mod/module" ) var CmdGet = &base.Command{ @@ -427,7 +429,7 @@ func downloadPackage(p *load.Package) error { } importPrefix = importPrefix[:slash] } - if err := CheckImportPath(importPrefix); err != nil { + if err := module.CheckImportPath(importPrefix); err != nil { return fmt.Errorf("%s: invalid import path: %v", p.ImportPath, err) } diff --git a/src/cmd/go/internal/get/path.go b/src/cmd/go/internal/get/path.go deleted file mode 100644 index ce2e0cdd70..0000000000 --- a/src/cmd/go/internal/get/path.go +++ /dev/null @@ -1,192 +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 get - -import ( - "fmt" - "strings" - "unicode" - "unicode/utf8" -) - -// The following functions are copied verbatim from golang.org/x/mod/module/module.go, -// with a change to additionally reject Windows short-names, -// and one to accept arbitrary letters (golang.org/issue/29101). -// -// TODO(bcmills): After the call site for this function is backported, -// consolidate this back down to a single copy. -// -// NOTE: DO NOT MERGE THESE UNTIL WE DECIDE ABOUT ARBITRARY LETTERS IN MODULE MODE. - -// CheckImportPath checks that an import path is valid. -func CheckImportPath(path string) error { - if err := checkPath(path, false); err != nil { - return fmt.Errorf("malformed import path %q: %v", path, err) - } - return nil -} - -// checkPath checks that a general path is valid. -// It returns an error describing why but not mentioning path. -// Because these checks apply to both module paths and import paths, -// the caller is expected to add the "malformed ___ path %q: " prefix. -// fileName indicates whether the final element of the path is a file name -// (as opposed to a directory name). -func checkPath(path string, fileName bool) error { - if !utf8.ValidString(path) { - return fmt.Errorf("invalid UTF-8") - } - if path == "" { - return fmt.Errorf("empty string") - } - if path[0] == '-' { - return fmt.Errorf("leading dash") - } - if strings.Contains(path, "//") { - return fmt.Errorf("double slash") - } - if path[len(path)-1] == '/' { - return fmt.Errorf("trailing slash") - } - elemStart := 0 - for i, r := range path { - if r == '/' { - if err := checkElem(path[elemStart:i], fileName); err != nil { - return err - } - elemStart = i + 1 - } - } - if err := checkElem(path[elemStart:], fileName); err != nil { - return err - } - return nil -} - -// checkElem checks whether an individual path element is valid. -// fileName indicates whether the element is a file name (not a directory name). -func checkElem(elem string, fileName bool) error { - if elem == "" { - return fmt.Errorf("empty path element") - } - if strings.Count(elem, ".") == len(elem) { - return fmt.Errorf("invalid path element %q", elem) - } - if elem[0] == '.' && !fileName { - return fmt.Errorf("leading dot in path element") - } - if elem[len(elem)-1] == '.' { - return fmt.Errorf("trailing dot in path element") - } - - charOK := pathOK - if fileName { - charOK = fileNameOK - } - for _, r := range elem { - if !charOK(r) { - return fmt.Errorf("invalid char %q", r) - } - } - - // Windows disallows a bunch of path elements, sadly. - // See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file - short := elem - if i := strings.Index(short, "."); i >= 0 { - short = short[:i] - } - for _, bad := range badWindowsNames { - if strings.EqualFold(bad, short) { - return fmt.Errorf("disallowed path element %q", elem) - } - } - - // Reject path components that look like Windows short-names. - // Those usually end in a tilde followed by one or more ASCII digits. - if tilde := strings.LastIndexByte(short, '~'); tilde >= 0 && tilde < len(short)-1 { - suffix := short[tilde+1:] - suffixIsDigits := true - for _, r := range suffix { - if r < '0' || r > '9' { - suffixIsDigits = false - break - } - } - if suffixIsDigits { - return fmt.Errorf("trailing tilde and digits in path element") - } - } - - return nil -} - -// pathOK reports whether r can appear in an import path element. -// -// NOTE: This function DIVERGES from module mode pathOK by accepting Unicode letters. -func pathOK(r rune) bool { - if r < utf8.RuneSelf { - return r == '+' || r == '-' || r == '.' || r == '_' || r == '~' || - '0' <= r && r <= '9' || - 'A' <= r && r <= 'Z' || - 'a' <= r && r <= 'z' - } - return unicode.IsLetter(r) -} - -// fileNameOK reports whether r can appear in a file name. -// For now we allow all Unicode letters but otherwise limit to pathOK plus a few more punctuation characters. -// If we expand the set of allowed characters here, we have to -// work harder at detecting potential case-folding and normalization collisions. -// See note about "safe encoding" below. -func fileNameOK(r rune) bool { - if r < utf8.RuneSelf { - // Entire set of ASCII punctuation, from which we remove characters: - // ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ - // We disallow some shell special characters: " ' * < > ? ` | - // (Note that some of those are disallowed by the Windows file system as well.) - // We also disallow path separators / : and \ (fileNameOK is only called on path element characters). - // We allow spaces (U+0020) in file names. - const allowed = "!#$%&()+,-.=@[]^_{}~ " - if '0' <= r && r <= '9' || 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' { - return true - } - for i := 0; i < len(allowed); i++ { - if rune(allowed[i]) == r { - return true - } - } - return false - } - // It may be OK to add more ASCII punctuation here, but only carefully. - // For example Windows disallows < > \, and macOS disallows :, so we must not allow those. - return unicode.IsLetter(r) -} - -// badWindowsNames are the reserved file path elements on Windows. -// See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file -var badWindowsNames = []string{ - "CON", - "PRN", - "AUX", - "NUL", - "COM1", - "COM2", - "COM3", - "COM4", - "COM5", - "COM6", - "COM7", - "COM8", - "COM9", - "LPT1", - "LPT2", - "LPT3", - "LPT4", - "LPT5", - "LPT6", - "LPT7", - "LPT8", - "LPT9", -} diff --git a/src/cmd/go/internal/get/vcs.go b/src/cmd/go/internal/get/vcs.go index fd37fcb76f..24c32935d0 100644 --- a/src/cmd/go/internal/get/vcs.go +++ b/src/cmd/go/internal/get/vcs.go @@ -1027,7 +1027,7 @@ var vcsPaths = []*vcsPath{ // Github { prefix: "github.com/", - regexp: lazyregexp.New(`^(?Pgithub\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[\p{L}0-9_.\-]+)*$`), + regexp: lazyregexp.New(`^(?Pgithub\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`), vcs: "git", repo: "https://{root}", check: noVCSSuffix, -- GitLab From ac55d58fca4312fe4f84fa3a4761800803bc25e0 Mon Sep 17 00:00:00 2001 From: witchard Date: Sun, 30 Aug 2020 18:15:03 +0000 Subject: [PATCH 0393/1792] cmd/go/internal/get: add GOINSECURE support Adds support for the GOINSECURE environment variable to GOPATH mode. Updates #37519. Change-Id: Ibe3f52b7f30b1395edb000998905ee93abe6cada GitHub-Last-Rev: e298c0009eb5eba537bb00185a8778d2aab696ba GitHub-Pull-Request: golang/go#38628 Reviewed-on: https://go-review.googlesource.com/c/go/+/229758 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 5 +++- src/cmd/go/internal/get/get.go | 16 +++++----- .../go/testdata/script/get_insecure_env.txt | 29 +++++++++++++++++++ 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 src/cmd/go/testdata/script/get_insecure_env.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 98861c8a0d..8ad4f66d09 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -2172,7 +2172,10 @@ // before resolving dependencies or building the code. // // The -insecure flag permits fetching from repositories and resolving -// custom domains using insecure schemes such as HTTP. Use with caution. +// custom domains using insecure schemes such as HTTP. Use with caution. The +// GOINSECURE environment variable is usually a better alternative, since it +// provides control over which modules may be retrieved using an insecure scheme. +// See 'go help environment' for details. // // The -t flag instructs get to also download the packages required to build // the tests for the specified packages. diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index d1f032a167..d0be3fe1e7 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -43,7 +43,10 @@ The -fix flag instructs get to run the fix tool on the downloaded packages before resolving dependencies or building the code. The -insecure flag permits fetching from repositories and resolving -custom domains using insecure schemes such as HTTP. Use with caution. +custom domains using insecure schemes such as HTTP. Use with caution. The +GOINSECURE environment variable is usually a better alternative, since it +provides control over which modules may be retrieved using an insecure scheme. +See 'go help environment' for details. The -t flag instructs get to also download the packages required to build the tests for the specified packages. @@ -411,11 +414,6 @@ func downloadPackage(p *load.Package) error { blindRepo bool // set if the repo has unusual configuration ) - security := web.SecureOnly - if Insecure { - security = web.Insecure - } - // p can be either a real package, or a pseudo-package whose “import path” is // actually a wildcard pattern. // Trim the path at the element containing the first wildcard, @@ -432,6 +430,10 @@ func downloadPackage(p *load.Package) error { if err := module.CheckImportPath(importPrefix); err != nil { return fmt.Errorf("%s: invalid import path: %v", p.ImportPath, err) } + security := web.SecureOnly + if Insecure || module.MatchPrefixPatterns(cfg.GOINSECURE, importPrefix) { + security = web.Insecure + } if p.Internal.Build.SrcRoot != "" { // Directory exists. Look for checkout along path to src. @@ -475,7 +477,7 @@ func downloadPackage(p *load.Package) error { } vcs, repo, rootPath = rr.vcs, rr.Repo, rr.Root } - if !blindRepo && !vcs.isSecure(repo) && !Insecure { + if !blindRepo && !vcs.isSecure(repo) && security != web.Insecure { return fmt.Errorf("cannot download, %v uses insecure protocol", repo) } diff --git a/src/cmd/go/testdata/script/get_insecure_env.txt b/src/cmd/go/testdata/script/get_insecure_env.txt new file mode 100644 index 0000000000..8d88427c31 --- /dev/null +++ b/src/cmd/go/testdata/script/get_insecure_env.txt @@ -0,0 +1,29 @@ +[!net] skip +[!exec:git] skip + +# GOPATH: Set up +env GO111MODULE=off + +# GOPATH: Try go get -d of HTTP-only repo (should fail). +! go get -d insecure.go-get-issue-15410.appspot.com/pkg/p + +# GOPATH: Try again with invalid GOINSECURE (should fail). +env GOINSECURE=insecure.go-get-issue-15410.appspot.com/pkg/q +! go get -d insecure.go-get-issue-15410.appspot.com/pkg/p + +# GOPATH: Try with correct GOINSECURE (should succeed). +env GOINSECURE=insecure.go-get-issue-15410.appspot.com/pkg/p +go get -d insecure.go-get-issue-15410.appspot.com/pkg/p + +# GOPATH: Try updating without GOINSECURE (should fail). +env GOINSECURE= +! go get -d -u -f insecure.go-get-issue-15410.appspot.com/pkg/p + +# GOPATH: Try updating with GOINSECURE glob (should succeed). +env GOINSECURE=*.go-get-*.appspot.com +go get -d -u -f insecure.go-get-issue-15410.appspot.com/pkg/p + +# GOPATH: Try updating with GOINSECURE base URL (should succeed). +env GOINSECURE=insecure.go-get-issue-15410.appspot.com +go get -d -u -f insecure.go-get-issue-15410.appspot.com/pkg/p + -- GitLab From afa150c2ea1b121c7727c12ab3615fcc173d0d15 Mon Sep 17 00:00:00 2001 From: Changkun Ou Date: Mon, 31 Aug 2020 20:54:17 +0200 Subject: [PATCH 0394/1792] testing: fail Example tests that invoke runtime.Goexit Previously, if an example test invoked runtime.Goexit, it would pass yet hang until a timeout, while regular tests that invoke runtime.Goexit do fail. This change removes that inconsistent behavior and makes such example tests fail, and panic with an indication of having invoked runtime.Goexit. Fixes #41084 Change-Id: I0ffa152204f2b1580f4d5d6961ba1ce6b13fc022 Reviewed-on: https://go-review.googlesource.com/c/go/+/251857 Reviewed-by: Emmanuel Odeke Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- .../testdata/script/test_example_goexit.txt | 25 +++++++++++++++++++ src/testing/example.go | 11 +++++--- src/testing/run_example.go | 4 ++- src/testing/run_example_js.go | 4 ++- 4 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 src/cmd/go/testdata/script/test_example_goexit.txt diff --git a/src/cmd/go/testdata/script/test_example_goexit.txt b/src/cmd/go/testdata/script/test_example_goexit.txt new file mode 100644 index 0000000000..59219e3366 --- /dev/null +++ b/src/cmd/go/testdata/script/test_example_goexit.txt @@ -0,0 +1,25 @@ +# For issue golang.org/issue/41084 +[short] skip + +! go test -v examplegoexit +stdout '(?s)--- PASS.*--- FAIL.*' +stdout 'panic: test executed panic\(nil\) or runtime\.Goexit' + +-- examplegoexit/example_test.go -- +package main + +import ( + "fmt" + "runtime" +) + +func ExamplePass() { + fmt.Println("pass") + // Output: + // pass +} + +func ExampleGoexit() { + runtime.Goexit() + // Output: +} diff --git a/src/testing/example.go b/src/testing/example.go index adc91d5faf..0217c5d242 100644 --- a/src/testing/example.go +++ b/src/testing/example.go @@ -62,9 +62,10 @@ func sortLines(output string) string { // If stdout doesn't match the expected output or if recovered is non-nil, it'll print the cause of failure to stdout. // If the test is chatty/verbose, it'll print a success message to stdout. // If recovered is non-nil, it'll panic with that value. -func (eg *InternalExample) processRunResult(stdout string, timeSpent time.Duration, recovered interface{}) (passed bool) { +// If the test panicked with nil, or invoked runtime.Goexit, it'll be +// made to fail and panic with errNilPanicOrGoexit +func (eg *InternalExample) processRunResult(stdout string, timeSpent time.Duration, finished bool, recovered interface{}) (passed bool) { passed = true - dstr := fmtDuration(timeSpent) var fail string got := strings.TrimSpace(stdout) @@ -78,16 +79,20 @@ func (eg *InternalExample) processRunResult(stdout string, timeSpent time.Durati fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", got, want) } } - if fail != "" || recovered != nil { + if fail != "" || !finished || recovered != nil { fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail) passed = false } else if *chatty { fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr) } + if recovered != nil { // Propagate the previously recovered result, by panicking. panic(recovered) } + if !finished && recovered == nil { + panic(errNilPanicOrGoexit) + } return } diff --git a/src/testing/run_example.go b/src/testing/run_example.go index 10bde49e5b..4dc83f7d32 100644 --- a/src/testing/run_example.go +++ b/src/testing/run_example.go @@ -43,6 +43,7 @@ func runExample(eg InternalExample) (ok bool) { outC <- buf.String() }() + finished := false start := time.Now() // Clean up in a deferred call so we can recover if the example panics. @@ -55,10 +56,11 @@ func runExample(eg InternalExample) (ok bool) { out := <-outC err := recover() - ok = eg.processRunResult(out, timeSpent, err) + ok = eg.processRunResult(out, timeSpent, finished, err) }() // Run example. eg.F() + finished = true return } diff --git a/src/testing/run_example_js.go b/src/testing/run_example_js.go index 472e0c57fa..1d4164b61f 100644 --- a/src/testing/run_example_js.go +++ b/src/testing/run_example_js.go @@ -26,6 +26,7 @@ func runExample(eg InternalExample) (ok bool) { 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. @@ -50,11 +51,12 @@ func runExample(eg InternalExample) (ok bool) { } err := recover() - ok = eg.processRunResult(out, timeSpent, err) + ok = eg.processRunResult(out, timeSpent, finished, err) }() // Run example. eg.F() + finished = true return } -- GitLab From 971203cad3c4a5cdfd196a7ad5ce76b550d2ff9f Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Tue, 1 Sep 2020 15:41:36 -0400 Subject: [PATCH 0395/1792] cmd/go: remove TestScript/get_unicode and an internal get test case That test tested that import paths with non-ASCII unicode paths were allowed by the Go command. Remove this test case because golang.org/cl/251878 removes that support. Also rewrite a test case in TestRepoRootForImportPath in the test for cmd/go/internal/get to reflect that unicode directory names are now disallowed. Updates #29101 Change-Id: I669e220facd04fc82ccd05dd08e8f1ff4d48b1fd Reviewed-on: https://go-review.googlesource.com/c/go/+/252297 Run-TryBot: Michael Matloob TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/get/vcs_test.go | 7 ++-- src/cmd/go/testdata/script/get_unicode.txt | 40 ---------------------- 2 files changed, 2 insertions(+), 45 deletions(-) delete mode 100644 src/cmd/go/testdata/script/get_unicode.txt diff --git a/src/cmd/go/internal/get/vcs_test.go b/src/cmd/go/internal/get/vcs_test.go index 91800baa83..195bc231eb 100644 --- a/src/cmd/go/internal/get/vcs_test.go +++ b/src/cmd/go/internal/get/vcs_test.go @@ -32,13 +32,10 @@ func TestRepoRootForImportPath(t *testing.T) { Repo: "https://github.com/golang/groupcache", }, }, - // Unicode letters in directories (issue 18660). + // Unicode letters in directories are not valid. { "github.com/user/unicode/испытание", - &RepoRoot{ - vcs: vcsGit, - Repo: "https://github.com/user/unicode", - }, + nil, }, // IBM DevOps Services tests { diff --git a/src/cmd/go/testdata/script/get_unicode.txt b/src/cmd/go/testdata/script/get_unicode.txt deleted file mode 100644 index d3b82bdf25..0000000000 --- a/src/cmd/go/testdata/script/get_unicode.txt +++ /dev/null @@ -1,40 +0,0 @@ -env GO111MODULE=off - -[!exec:git] skip -[short] skip - -# Construct a repository that imports a non-ASCII path. -cd $WORK/_origin/example.com/unicode -exec git init -exec git config user.name 'Nameless Gopher' -exec git config user.email 'nobody@golang.org' -exec git add unicode.go -exec git commit -m 'add unicode.go' - -# Clone the repo into GOPATH so that 'go get -u' can find it. -mkdir $GOPATH/src/example.com/unicode -cd $GOPATH/src/example.com/unicode -exec git clone $WORK/_origin/example.com/unicode . - -# Construct the imported repository. -cd $WORK/_origin/example.com/испытание -exec git init -exec git config user.name 'Nameless Gopher' -exec git config user.email 'nobody@golang.org' -exec git add испытание.go -exec git commit -m 'add испытание.go' - -# Clone that repo into GOPATH too. -mkdir $GOPATH/src/example.com/испытание -cd $GOPATH/src/example.com/испытание -exec git clone $WORK/_origin/example.com/испытание . - -# Upgrading the importer should pull from the non-ASCII repo. -cd $GOPATH -go get -u example.com/unicode - --- $WORK/_origin/example.com/unicode/unicode.go -- -package unicode -import _ "example.com/испытание" --- $WORK/_origin/example.com/испытание/испытание.go -- -package испытание -- GitLab From 6fc329bb7fbb78315e2f53895a9fc6cbed63c1d7 Mon Sep 17 00:00:00 2001 From: Marco Date: Sun, 24 May 2020 14:58:51 +0200 Subject: [PATCH 0396/1792] net/http/cgi: don't pass nil Body to the child handler For server requests, the http.Request Body should not be nil. Fixes #39190 Change-Id: I32de7b6c0f6ca55008fea9fd86089cda0a2dea62 Reviewed-on: https://go-review.googlesource.com/c/go/+/235137 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/net/http/cgi/child.go | 3 +++ src/net/http/cgi/integration_test.go | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/net/http/cgi/child.go b/src/net/http/cgi/child.go index 9474175f17..d7d813e68a 100644 --- a/src/net/http/cgi/child.go +++ b/src/net/http/cgi/child.go @@ -146,6 +146,9 @@ func Serve(handler http.Handler) error { if err != nil { return err } + if req.Body == nil { + req.Body = http.NoBody + } if handler == nil { handler = http.DefaultServeMux } diff --git a/src/net/http/cgi/integration_test.go b/src/net/http/cgi/integration_test.go index 32d59c09a3..eaa090f6fe 100644 --- a/src/net/http/cgi/integration_test.go +++ b/src/net/http/cgi/integration_test.go @@ -152,6 +152,23 @@ func TestChildOnlyHeaders(t *testing.T) { } } +// Test that a child handler does not receive a nil Request Body. +// golang.org/issue/39190 +func TestNilRequestBody(t *testing.T) { + testenv.MustHaveExec(t) + + h := &Handler{ + Path: os.Args[0], + Root: "/test.go", + Args: []string{"-test.run=TestBeChildCGIProcess"}, + } + expectedMap := map[string]string{ + "nil-request-body": "false", + } + _ = runCgiTest(t, h, "POST /test.go?nil-request-body=1 HTTP/1.0\nHost: example.com\n\n", expectedMap) + _ = runCgiTest(t, h, "POST /test.go?nil-request-body=1 HTTP/1.0\nHost: example.com\nContent-Length: 0\n\n", expectedMap) +} + // golang.org/issue/7198 func Test500WithNoHeaders(t *testing.T) { want500Test(t, "/immediate-disconnect") } func Test500WithNoContentType(t *testing.T) { want500Test(t, "/no-content-type") } @@ -198,6 +215,10 @@ func TestBeChildCGIProcess(t *testing.T) { os.Exit(0) } Serve(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + if req.FormValue("nil-request-body") == "1" { + fmt.Fprintf(rw, "nil-request-body=%v\n", req.Body == nil) + return + } rw.Header().Set("X-Test-Header", "X-Test-Value") req.ParseForm() if req.FormValue("no-body") == "1" { -- GitLab From b0369225ebfdc355c61abbbb2663316388c60895 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 31 Aug 2020 23:15:05 -0400 Subject: [PATCH 0397/1792] cmd/go: simplify and document lazy-loading test cases I decided to add package and module diagrams to the test cases to make them easier to follow. While adding those diagrams, I noticed some strong similarities among a couple of the graphs, so I consolidated those cases (and deleted the redundant tests). For #36460 Change-Id: Id6cd04fc871379b83851c2d1af89ea9296a0f3e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/251997 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/testdata/script/mod_all.txt | 72 +++++++- .../script/mod_lazy_import_allmod.txt | 19 ++- .../script/mod_lazy_import_test_dep.txt | 159 ------------------ .../testdata/script/mod_lazy_new_import.txt | 28 ++- .../go/testdata/script/mod_lazy_test_all.txt | 125 -------------- .../testdata/script/mod_lazy_test_horizon.txt | 20 ++- .../script/mod_lazy_test_of_test_dep.txt | 77 ++++++--- 7 files changed, 177 insertions(+), 323 deletions(-) delete mode 100644 src/cmd/go/testdata/script/mod_lazy_import_test_dep.txt delete mode 100644 src/cmd/go/testdata/script/mod_lazy_test_all.txt diff --git a/src/cmd/go/testdata/script/mod_all.txt b/src/cmd/go/testdata/script/mod_all.txt index a219913094..9f4b0a4e4d 100644 --- a/src/cmd/go/testdata/script/mod_all.txt +++ b/src/cmd/go/testdata/script/mod_all.txt @@ -1,6 +1,38 @@ # This test illustrates the relationship between the 'all' pattern and # the dependencies of the main module. +# The package import graph used in this test looks like: +# +# main --------- a --------- b +# | | +# | a_test ---- c +# | | +# | c_test ---- d +# | +# main_test ---- t --------- u +# | +# t_test ---- w +# | +# w_test ---- x +# +# main/testonly_test ---- q --------- r +# | +# q_test ---- s +# +# And the module dependency graph looks like: +# +# main --- a.1 ---- b.1 +# \ \ \ +# \ \ c.1 -- d.1 +# \ \ +# \ t.1 ---- u.1 +# \ \ +# \ w.1 -- x.1 +# \ +# q.1 ---- r.1 +# \ +# s.1 + env PKGFMT='{{if .Module}}{{.ImportPath}}{{end}}' env MODFMT='{{.Path}}' @@ -41,10 +73,11 @@ stdout '^example.com/u$' # variants of those packages. go list -f $PKGFMT all -stdout -count=11 '^.' +stdout -count=13 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/c$' +stdout '^example.com/d$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' @@ -53,20 +86,22 @@ stdout '^example.com/s$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/w$' +stdout '^example.com/x$' # 'go list -test all' is equivalent to 'go list -test $(go list all)' # and both should include tests for every package in 'all'. -go list -test -f $PKGFMT example.com/a example.com/b example.com/c example.com/main example.com/main/testonly example.com/q example.com/r example.com/s example.com/t example.com/u example.com/w +go list -test -f $PKGFMT example.com/a example.com/b example.com/c example.com/d example.com/main example.com/main/testonly example.com/q example.com/r example.com/s example.com/t example.com/u example.com/w example.com/x cp stdout list-test-explicit.txt go list -test -f $PKGFMT all cmp stdout list-test-explicit.txt -stdout -count=34 '^.' +stdout -count=36 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/c$' +stdout '^example.com/d$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' @@ -75,6 +110,7 @@ stdout '^example.com/s$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/w$' +stdout '^example.com/x$' stdout '^example.com/a.test$' stdout '^example.com/a_test \[example.com/a.test\]$' stdout '^example.com/b.test$' @@ -103,10 +139,11 @@ stdout '^example.com/w_test \[example.com/w.test\]$' # 'go list -m all' covers the packages in 'go list -test -deps all'. go list -m -f $MODFMT all -stdout -count=10 '^.' +stdout -count=12 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/c$' +stdout '^example.com/d$' stdout '^example.com/main$' stdout '^example.com/q$' stdout '^example.com/r$' @@ -114,6 +151,7 @@ stdout '^example.com/s$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/w$' +stdout '^example.com/x$' # 'go mod vendor' copies in only the packages transitively imported by the main @@ -176,12 +214,14 @@ replace ( example.com/a v0.1.0 => ./a example.com/b v0.1.0 => ./b example.com/c v0.1.0 => ./c + example.com/d v0.1.0 => ./d example.com/q v0.1.0 => ./q example.com/r v0.1.0 => ./r example.com/s v0.1.0 => ./s example.com/t v0.1.0 => ./t example.com/u v0.1.0 => ./u example.com/w v0.1.0 => ./w + example.com/x v0.1.0 => ./x ) -- main.go -- package main @@ -207,11 +247,11 @@ require ( example.com/c v0.1.0 ) -- a/a.go -- -package x +package a import _ "example.com/b" -- a/a_test.go -- -package x_test +package a_test import _ "example.com/c" -- b/go.mod -- @@ -226,10 +266,20 @@ package b_test module example.com/c go 1.15 + +require example.com/d v0.1.0 -- c/c.go -- package c -- c/c_test.go -- package c_test + +import _ "example.com/d" +-- d/go.mod -- +module example.com/d + +go 1.15 +-- d/d.go -- +package d -- q/go.mod -- module example.com/q @@ -290,7 +340,17 @@ package u_test module example.com/w go 1.15 + +require example.com/x v0.1.0 -- w/w.go -- package w -- w/w_test.go -- package w_test + +import _ "example.com/x" +-- x/go.mod -- +module example.com/x + +go 1.15 +-- x/x.go -- +package x diff --git a/src/cmd/go/testdata/script/mod_lazy_import_allmod.txt b/src/cmd/go/testdata/script/mod_lazy_import_allmod.txt index aade00d602..4ad8cbf8ee 100644 --- a/src/cmd/go/testdata/script/mod_lazy_import_allmod.txt +++ b/src/cmd/go/testdata/script/mod_lazy_import_allmod.txt @@ -1,4 +1,4 @@ -# This file demonstrates dependency resolution when the main module imports a +# This test demonstrates dependency resolution when the main module imports a # new package from a previously-test-only dependency. # # When lazy loading is active, the loader will not load dependencies of any @@ -6,6 +6,23 @@ # the main module is changed to import a package from such a module, the # dependencies of that module will need to be reloaded. +# The import graph used in this test looks like: +# +# m ---- a +# \ | +# \ a_test ---- b/x +# \ +# --------------b/y (new) ---- c +# +# Where b/x and b/y are disjoint packages, but both contained in module b. +# +# The module dependency graph initially looks like: +# +# m ---- a.1 ---- b.1 ---- c.1 +# +# This configuration is similar to that used in mod_lazy_new_import, +# but the new import is from what is initially a test-only dependency. + # Control case: in Go 1.14, the original go.mod is tidy, # and the dependency on c is eagerly loaded. diff --git a/src/cmd/go/testdata/script/mod_lazy_import_test_dep.txt b/src/cmd/go/testdata/script/mod_lazy_import_test_dep.txt deleted file mode 100644 index b7e3e6cb08..0000000000 --- a/src/cmd/go/testdata/script/mod_lazy_import_test_dep.txt +++ /dev/null @@ -1,159 +0,0 @@ -# This file demonstrates the go.mod changes needed to ensure reproducibility -# when running 'go test' on a sequence of packages for which each package in the -# sequence is a test-only dependency of the previous package, as a user might do -# if they encounter a test failure while fixing a bug found in one of their -# dependencies. - -cp go.mod go.mod.old -cp lazy.go lazy.go.old -go mod tidy -cmp go.mod go.mod.old - -# Before adding a new import, the go.mod file should -# enumerate modules for all packages already imported. -go list -m all -stdout '^example.com/d v0.1.0' # not v0.2.0 as would be resolved by 'latest' -cp stdout list.old -cmp go.mod go.mod.old - -# Following the chain of dependencies by listing test dependencies -# or running tests should not change the go.mod file. -go list -test -deps example.com/a -stdout '^example.com/a' -stdout '^example.com/b' -! stdout '^example.com/c' -[!short] go test -c example.com/a -cmp go.mod go.mod.old - -go list -test -deps example.com/b -stdout '^example.com/b' -stdout '^example.com/c' -! stdout '^example.com/d' -[!short] go test -c example.com/b -cmp go.mod go.mod.old - -go list -test -deps example.com/c -stdout '^example.com/c' -stdout '^example.com/d' -[!short] go test -c example.com/c -cmp go.mod go.mod.old - -# When we add a new import of a package already imported by a test of a test of -# a dependency, and that dependency is already tidy, its transitive dependencies -# should already be present. -cp lazy.go.new lazy.go -go list all -go list -m all -cmp stdout list.old -cmp go.mod go.mod.new # Indirect dependency promoted to direct. - -# TODO(#36460): - -cp lazy.go.old lazy.go -cp go.mod.old go.mod -go mod edit -go=1.16 - -# If we reach d by running successive tests, we should end up with exactly the -# version required by c, with an update to the go.mod file as soon as we load a -# dependency not found in the deepening scan. - -# However, if we skip directly to adding a new import of d, the dependency is -# too far away for a deepening scan to find, which is fine because the package -# whose test imported it wasn't even in "all". It should resolve from the latest -# version of its module. - --- go.mod -- -module example.com/lazy - -go 1.14 - -require example.com/a v0.1.0 - -replace ( - example.com/a v0.1.0 => ./a - example.com/b v0.1.0 => ./b - example.com/c v0.1.0 => ./c - example.com/d v0.1.0 => ./d1 - example.com/d v0.2.0 => ./d2 -) --- go.mod.new -- -module example.com/lazy - -go 1.14 - -require ( - example.com/a v0.1.0 - example.com/d v0.1.0 -) - -replace ( - example.com/a v0.1.0 => ./a - example.com/b v0.1.0 => ./b - example.com/c v0.1.0 => ./c - example.com/d v0.1.0 => ./d1 - example.com/d v0.2.0 => ./d2 -) --- lazy.go -- -package lazy - -import ( - _ "example.com/a" -) - -func main() {} --- lazy.go.new -- -package lazy - -import ( - _ "example.com/a" - "example.com/d" -) - -func main() { - println(d.Version) -} --- a/go.mod -- -module example.com/a - -go 1.14 - -require example.com/b v0.1.0 --- a/a.go -- -package a -import _ "example.com/b" --- b/go.mod -- -module example.com/b - -go 1.16 - -require example.com/c v0.1.0 --- b/b.go -- -package b --- b/b_test.go -- -package b -import _ "example.com/c" --- c/go.mod -- -module example.com/c - -go 1.16 - -require example.com/d v0.1.0 --- c/c.go -- -package c --- c/c_test.go -- -package c -import _ "example.com/d" --- d1/go.mod -- -module example.com/d - -go 1.16 --- d1/d.go -- -package d -const Version = "v0.1.0" --- d2/go.mod -- -module example.com/d - -go 1.16 --- d2/d.go -- -package d -const Version = "v0.2.0" diff --git a/src/cmd/go/testdata/script/mod_lazy_new_import.txt b/src/cmd/go/testdata/script/mod_lazy_new_import.txt index 76b915afaa..02935bf236 100644 --- a/src/cmd/go/testdata/script/mod_lazy_new_import.txt +++ b/src/cmd/go/testdata/script/mod_lazy_new_import.txt @@ -1,3 +1,21 @@ +# This test illustrates the use of a deepening scan to resolve transitive +# imports of imports of new packages from within existing dependencies. + +# The package import graph used in this test looks like: +# +# lazy ---- a/x ---- b +# \ +# ---- a/y ---- c +# +# Where a/x and x/y are disjoint packages, but both contained in module a. +# +# The module dependency graph initially looks like: +# +# lazy ---- a.1 ---- b.1 +# \ +# c.1 + + cp go.mod go.mod.old cp lazy.go lazy.go.old go mod tidy @@ -30,7 +48,7 @@ go mod edit -go=1.16 -- go.mod -- module example.com/lazy -go 1.14 +go 1.15 require example.com/a v0.1.0 @@ -56,7 +74,7 @@ import ( -- a/go.mod -- module example.com/a -go 1.14 +go 1.15 require ( example.com/b v0.1.0 @@ -71,19 +89,19 @@ import _ "example.com/c" -- b/go.mod -- module example.com/b -go 1.14 +go 1.15 -- b/b.go -- package b -- c1/go.mod -- module example.com/c -go 1.14 +go 1.15 -- c1/c.go -- package c -- c2/go.mod -- module example.com/c -go 1.14 +go 1.15 -- c2/c.go -- package c This file should not be used, so this syntax error should be ignored. diff --git a/src/cmd/go/testdata/script/mod_lazy_test_all.txt b/src/cmd/go/testdata/script/mod_lazy_test_all.txt deleted file mode 100644 index 4ce9fb167b..0000000000 --- a/src/cmd/go/testdata/script/mod_lazy_test_all.txt +++ /dev/null @@ -1,125 +0,0 @@ -cp go.mod go.mod.old -go mod tidy -cmp go.mod go.mod.old - -# 'go list -m all' includes modules that cover the test dependencies of -# the packages imported by the main module. - -go list -m all -stdout 'example.com/b v0.1.0' -stdout 'example.com/c v0.1.0' -cmp go.mod go.mod.old - -# 'go test' (or equivalent) of any package in 'all' should use its existing -# dependencies without updating the go.mod file. - -go list all # Control case: example.com/b really is in 'all'. -stdout '^example.com/b$' -cmp go.mod go.mod.old # Already tidy, so dependencies shouldn't change. - -go list -test -deps example.com/b -stdout '^example.com/b$' -stdout '^example.com/c$' -! stdout '^example.com/d$' - -[!short] go test -c example.com/b - -cmp go.mod go.mod.old # Should have resolved the above without modifying go.mod. - - -# TODO(#36460): - -# 'go list -m all' should include modules that cover the test dependencies of -# the packages imported by the main module, found via a deepening scan. - -# 'go test' of any package in 'all' should use its existing dependencies without -# updating the go.mod file. This requires that we consider _dependencies of_ the -# explicit dependencies of the main module, and that we not record those -# dependencies explicitly after loading them. - - --- go.mod -- -module example.com/lazy - -go 1.14 - -require example.com/a v0.1.0 - -replace ( - example.com/a v0.1.0 => ./a - example.com/b v0.1.0 => ./b1 - example.com/b v0.2.0 => ./b2 - example.com/c v0.1.0 => ./c - example.com/d v0.1.0 => ./d -) --- lazy.go -- -package lazy - -import ( - _ "example.com/a/x" -) --- a/go.mod -- -module example.com/a - -go 1.14 - -require example.com/b v0.1.0 --- a/x/x.go -- -package x --- a/x/x_test.go -- -package x - -import ( - "testing" - - _ "example.com/b" -) - -func TestUsingB(t *testing.T) { - // … -} --- b1/go.mod -- -module example.com/b - -go 1.14 - -require example.com/c v0.1.0 --- b1/b.go -- -package b --- b1/b_test.go -- -package b - -import _ "example.com/c" --- b2/go.mod -- -module example.com/b - -go 1.14 - -require example.com/c v0.1.0 --- b2/b.go -- -package b --- b2/b_test.go -- -package b - -import _ "example.com/c" - -This file should not be used, so this syntax error should be ignored. --- c/go.mod -- -module example.com/c - -go 1.14 - -require example.com/d v0.1.0 --- c/c.go -- -package c --- c/c_test.go -- -package c -import _ "example.com/d" -This file should not be used, so this syntax error should be ignored. --- d/go.mod -- -module example.com/d - -go 1.14 --- d/d.go -- -package d -This file should not be used, so this syntax error should be ignored. diff --git a/src/cmd/go/testdata/script/mod_lazy_test_horizon.txt b/src/cmd/go/testdata/script/mod_lazy_test_horizon.txt index 29fc0aaa74..9cdfad79f6 100644 --- a/src/cmd/go/testdata/script/mod_lazy_test_horizon.txt +++ b/src/cmd/go/testdata/script/mod_lazy_test_horizon.txt @@ -1,7 +1,23 @@ # This file demonstrates the effect of lazy loading on the selected # versions of test dependencies. -# Control case: in Go 1.14, the version of c imported by 'go test x' is the +# The package import graph used in this test looks like: +# +# m ---- a +# \ | +# \ a_test ---- b +# \ | +# x b_test +# | \ +# x_test -------------- c +# +# And the module dependency graph looks like: +# +# m -- a.1 -- b.1 -- c.2 +# \ +# x.1 ------------ c.1 + +# Control case: in Go 1.15, the version of c imported by 'go test x' is the # version required by module b, even though b_test is not relevant to the main # module. (The main module imports a, and a_test imports b, but all of the # packages and tests in the main module can be built without b.) @@ -33,7 +49,7 @@ import ( -- go.mod -- module m -go 1.14 +go 1.15 require ( a v0.1.0 diff --git a/src/cmd/go/testdata/script/mod_lazy_test_of_test_dep.txt b/src/cmd/go/testdata/script/mod_lazy_test_of_test_dep.txt index bbb0772303..ca6c55040e 100644 --- a/src/cmd/go/testdata/script/mod_lazy_test_of_test_dep.txt +++ b/src/cmd/go/testdata/script/mod_lazy_test_of_test_dep.txt @@ -1,8 +1,27 @@ +# This file demonstrates the effect of lazy loading on the reproducibility of +# tests (and tests of test dependencies) outside the main module. +# +# It is similar to the cases in mod_all.txt and mod_lazy_test_horizon.txt, but +# focuses on the effect of "go test" on specific packages instead of the "all" +# pattern. + +# The package import graph used in this test looks like: +# +# lazy ---- a +# | +# a_test ---- b +# | +# b_test ---- c +# +# And the non-lazy module dependency graph looks like: +# +# lazy ---- a.1 ---- b.1 ---- c.1 + cp go.mod go.mod.old go mod tidy cmp go.mod go.mod.old -# In Go 1.14 mode, 'go list -m all' includes modules needed by the +# In Go 1.15 mode, 'go list -m all' includes modules needed by the # transitive closure of tests of dependencies of tests of dependencies of …. go list -m all @@ -13,36 +32,44 @@ cmp go.mod go.mod.old # 'go test' (or equivalent) of any such dependency, no matter how remote, does # not update the go.mod file. -go list all -stdout example.com/a/x -stdout example.com/b # Test dependency of example.com/a/x. -stdout example.com/c # Test dependency of example.com/b. - -go list -test -deps all +go list -test -deps example.com/a stdout example.com/b -stdout example.com/c -cmp go.mod go.mod.old +! stdout example.com/c -[!short] go test example.com/a/x +[!short] go test -c example.com/a [!short] cmp go.mod go.mod.old -[!short] go test example.com/b +go list -test -deps example.com/b +stdout example.com/c + +[!short] go test -c example.com/b [!short] cmp go.mod go.mod.old # TODO(#36460): -# After changing to 'go 1.15` uniformly, 'go list -m all' should prune out +# After changing to 'go 1.16` uniformly, 'go list -m all' should prune out # example.com/c, because it is not imported by any package (or test of a package) # transitively imported by the main module. -# example.com/a/x is transitively imported, -# and example.com/b is needed in order to run 'go test example.com/a/x', +# +# example.com/a is imported, +# and example.com/b is needed in order to run 'go test example.com/a', # but example.com/c is not needed because we don't expect the user to need to run # 'go test example.com/b'. +# If we skip directly to adding a new import of c, the dependency is too far +# away for a deepening scan to find, which is fine because the package whose +# test imported it wasn't even it "all". It should resolve from the latest +# version of its module. + +# However, if we reach c by running successive tests starting from the main +# module, we should end up with exactly the version require by c, with an update +# to the go.mod file as soon as we test a test dependency that is not itself in +# "all". + -- go.mod -- module example.com/lazy -go 1.14 +go 1.15 require example.com/a v0.1.0 @@ -57,18 +84,18 @@ replace ( package lazy import ( - _ "example.com/a/x" + _ "example.com/a" ) -- a/go.mod -- module example.com/a -go 1.14 +go 1.15 require example.com/b v0.1.0 --- a/x/x.go -- -package x --- a/x/x_test.go -- -package x +-- a/a.go -- +package a +-- a/a_test.go -- +package a import ( "testing" @@ -82,7 +109,7 @@ func TestUsingB(t *testing.T) { -- b1/go.mod -- module example.com/b -go 1.14 +go 1.15 require example.com/c v0.1.0 -- b1/b.go -- @@ -94,7 +121,7 @@ import _ "example.com/c" -- b2/go.mod -- module example.com/b -go 1.14 +go 1.15 require example.com/c v0.1.0 -- b2/b.go -- @@ -106,13 +133,13 @@ This file should not be used, so this syntax error should be ignored. -- c1/go.mod -- module example.com/c -go 1.14 +go 1.15 -- c1/c.go -- package c -- c2/go.mod -- module example.com/c -go 1.14 +go 1.15 -- c2/c.go -- package c This file should not be used, so this syntax error should be ignored. -- GitLab From 717266b4c2bd178dcbd49f31048f216d8799e697 Mon Sep 17 00:00:00 2001 From: Daniel Cormier Date: Tue, 1 Sep 2020 21:13:01 +0000 Subject: [PATCH 0398/1792] net/smtp: adds support for the SMTPUTF8 extension If the SMTP server supports the SMTPUTF8 extension, the SMTPUTF8 parameter is added to the MAIL FROM command by the (*Client).Mail method. Fixes #19860 Change-Id: I3287faf114ee514e5faa815a6bbc1bf04cf60b0f GitHub-Last-Rev: d6338bb802da7537223f1ec6eda960606febefb8 GitHub-Pull-Request: golang/go#40627 Reviewed-on: https://go-review.googlesource.com/c/go/+/247257 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/net/smtp/smtp.go | 6 +- src/net/smtp/smtp_test.go | 213 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 218 insertions(+), 1 deletion(-) diff --git a/src/net/smtp/smtp.go b/src/net/smtp/smtp.go index e4e12ae5ee..1a6864a0f2 100644 --- a/src/net/smtp/smtp.go +++ b/src/net/smtp/smtp.go @@ -241,7 +241,8 @@ func (c *Client) Auth(a Auth) error { // Mail issues a MAIL command to the server using the provided email address. // If the server supports the 8BITMIME extension, Mail adds the BODY=8BITMIME -// parameter. +// parameter. If the server supports the SMTPUTF8 extension, Mail adds the +// SMTPUTF8 parameter. // This initiates a mail transaction and is followed by one or more Rcpt calls. func (c *Client) Mail(from string) error { if err := validateLine(from); err != nil { @@ -255,6 +256,9 @@ func (c *Client) Mail(from string) error { if _, ok := c.ext["8BITMIME"]; ok { cmdStr += " BODY=8BITMIME" } + if _, ok := c.ext["SMTPUTF8"]; ok { + cmdStr += " SMTPUTF8" + } } _, _, err := c.cmd(250, cmdStr, from) return err diff --git a/src/net/smtp/smtp_test.go b/src/net/smtp/smtp_test.go index cfda0790e9..55219372d2 100644 --- a/src/net/smtp/smtp_test.go +++ b/src/net/smtp/smtp_test.go @@ -288,6 +288,219 @@ Goodbye. QUIT ` +func TestExtensions(t *testing.T) { + fake := func(server string) (c *Client, bcmdbuf *bufio.Writer, cmdbuf *strings.Builder) { + server = strings.Join(strings.Split(server, "\n"), "\r\n") + + cmdbuf = &strings.Builder{} + bcmdbuf = bufio.NewWriter(cmdbuf) + var fake faker + fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(server)), bcmdbuf) + c = &Client{Text: textproto.NewConn(fake), localName: "localhost"} + + return c, bcmdbuf, cmdbuf + } + + t.Run("helo", func(t *testing.T) { + const ( + basicServer = `250 mx.google.com at your service +250 Sender OK +221 Goodbye +` + + basicClient = `HELO localhost +MAIL FROM: +QUIT +` + ) + + c, bcmdbuf, cmdbuf := fake(basicServer) + + if err := c.helo(); err != nil { + t.Fatalf("HELO failed: %s", err) + } + c.didHello = true + if err := c.Mail("user@gmail.com"); err != nil { + t.Fatalf("MAIL FROM failed: %s", err) + } + if err := c.Quit(); err != nil { + t.Fatalf("QUIT failed: %s", err) + } + + bcmdbuf.Flush() + actualcmds := cmdbuf.String() + client := strings.Join(strings.Split(basicClient, "\n"), "\r\n") + if client != actualcmds { + t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client) + } + }) + + t.Run("ehlo", func(t *testing.T) { + const ( + basicServer = `250-mx.google.com at your service +250 SIZE 35651584 +250 Sender OK +221 Goodbye +` + + basicClient = `EHLO localhost +MAIL FROM: +QUIT +` + ) + + c, bcmdbuf, cmdbuf := fake(basicServer) + + if err := c.Hello("localhost"); err != nil { + t.Fatalf("EHLO failed: %s", err) + } + if ok, _ := c.Extension("8BITMIME"); ok { + t.Fatalf("Shouldn't support 8BITMIME") + } + if ok, _ := c.Extension("SMTPUTF8"); ok { + t.Fatalf("Shouldn't support SMTPUTF8") + } + if err := c.Mail("user@gmail.com"); err != nil { + t.Fatalf("MAIL FROM failed: %s", err) + } + if err := c.Quit(); err != nil { + t.Fatalf("QUIT failed: %s", err) + } + + bcmdbuf.Flush() + actualcmds := cmdbuf.String() + client := strings.Join(strings.Split(basicClient, "\n"), "\r\n") + if client != actualcmds { + t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client) + } + }) + + t.Run("ehlo 8bitmime", func(t *testing.T) { + const ( + basicServer = `250-mx.google.com at your service +250-SIZE 35651584 +250 8BITMIME +250 Sender OK +221 Goodbye +` + + basicClient = `EHLO localhost +MAIL FROM: BODY=8BITMIME +QUIT +` + ) + + c, bcmdbuf, cmdbuf := fake(basicServer) + + if err := c.Hello("localhost"); err != nil { + t.Fatalf("EHLO failed: %s", err) + } + if ok, _ := c.Extension("8BITMIME"); !ok { + t.Fatalf("Should support 8BITMIME") + } + if ok, _ := c.Extension("SMTPUTF8"); ok { + t.Fatalf("Shouldn't support SMTPUTF8") + } + if err := c.Mail("user@gmail.com"); err != nil { + t.Fatalf("MAIL FROM failed: %s", err) + } + if err := c.Quit(); err != nil { + t.Fatalf("QUIT failed: %s", err) + } + + bcmdbuf.Flush() + actualcmds := cmdbuf.String() + client := strings.Join(strings.Split(basicClient, "\n"), "\r\n") + if client != actualcmds { + t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client) + } + }) + + t.Run("ehlo smtputf8", func(t *testing.T) { + const ( + basicServer = `250-mx.google.com at your service +250-SIZE 35651584 +250 SMTPUTF8 +250 Sender OK +221 Goodbye +` + + basicClient = `EHLO localhost +MAIL FROM: SMTPUTF8 +QUIT +` + ) + + c, bcmdbuf, cmdbuf := fake(basicServer) + + if err := c.Hello("localhost"); err != nil { + t.Fatalf("EHLO failed: %s", err) + } + if ok, _ := c.Extension("8BITMIME"); ok { + t.Fatalf("Shouldn't support 8BITMIME") + } + if ok, _ := c.Extension("SMTPUTF8"); !ok { + t.Fatalf("Should support SMTPUTF8") + } + if err := c.Mail("user+📧@gmail.com"); err != nil { + t.Fatalf("MAIL FROM failed: %s", err) + } + if err := c.Quit(); err != nil { + t.Fatalf("QUIT failed: %s", err) + } + + bcmdbuf.Flush() + actualcmds := cmdbuf.String() + client := strings.Join(strings.Split(basicClient, "\n"), "\r\n") + if client != actualcmds { + t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client) + } + }) + + t.Run("ehlo 8bitmime smtputf8", func(t *testing.T) { + const ( + basicServer = `250-mx.google.com at your service +250-SIZE 35651584 +250-8BITMIME +250 SMTPUTF8 +250 Sender OK +221 Goodbye + ` + + basicClient = `EHLO localhost +MAIL FROM: BODY=8BITMIME SMTPUTF8 +QUIT +` + ) + + c, bcmdbuf, cmdbuf := fake(basicServer) + + if err := c.Hello("localhost"); err != nil { + t.Fatalf("EHLO failed: %s", err) + } + c.didHello = true + if ok, _ := c.Extension("8BITMIME"); !ok { + t.Fatalf("Should support 8BITMIME") + } + if ok, _ := c.Extension("SMTPUTF8"); !ok { + t.Fatalf("Should support SMTPUTF8") + } + if err := c.Mail("user+📧@gmail.com"); err != nil { + t.Fatalf("MAIL FROM failed: %s", err) + } + if err := c.Quit(); err != nil { + t.Fatalf("QUIT failed: %s", err) + } + + bcmdbuf.Flush() + actualcmds := cmdbuf.String() + client := strings.Join(strings.Split(basicClient, "\n"), "\r\n") + if client != actualcmds { + t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, client) + } + }) +} + func TestNewClient(t *testing.T) { server := strings.Join(strings.Split(newClientServer, "\n"), "\r\n") client := strings.Join(strings.Split(newClientClient, "\n"), "\r\n") -- GitLab From 786120b55db5c3567d8c353fc399e9339c7406dd Mon Sep 17 00:00:00 2001 From: KJ Tsanaktsidis Date: Tue, 1 Sep 2020 10:00:23 +1000 Subject: [PATCH 0399/1792] cmd/cgo: document #include <> search path behaviour cgo effectively prepends -I${SRCDIR} to the header include path of all preambles it processes, so when an #include <> matches a header file both in the source directory and also another include directory, the local copy will be used in preference. This behaviour is surprising but unfortunately also longstanding and relied upon by packages in the wild, so the best we can do is to document it. Fixes #41059 Change-Id: If6d2818294b2bd94ea0fe5fd6ce77e54b3e167a6 Reviewed-on: https://go-review.googlesource.com/c/go/+/251758 Reviewed-by: Ian Lance Taylor --- misc/cgo/test/test.go | 1 + src/cmd/cgo/doc.go | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/misc/cgo/test/test.go b/misc/cgo/test/test.go index 35bc3a1447..05fa52b381 100644 --- a/misc/cgo/test/test.go +++ b/misc/cgo/test/test.go @@ -319,6 +319,7 @@ typedef enum { // issue 4339 // We've historically permitted #include <>, so test it here. Issue 29333. +// Also see issue 41059. #include // issue 4417 diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go index ca18c45d9d..b3f371b08c 100644 --- a/src/cmd/cgo/doc.go +++ b/src/cmd/cgo/doc.go @@ -112,6 +112,13 @@ The default C and C++ compilers may be changed by the CC and CXX environment variables, respectively; those environment variables may include command line options. +The cgo tool will always invoke the C compiler with the source file's +directory in the include path; i.e. -I${SRCDIR} is always implied. This +means that if a header file foo/bar.h exists both in the source +directory and also in the system include directory (or some other place +specified by a -I flag), then "#include " will always find the +local version in preference to any other version. + The cgo tool is enabled by default for native builds on systems where it is expected to work. It is disabled by default when cross-compiling. You can control this by setting the CGO_ENABLED -- GitLab From b246c0e12fd41caf45a0f81eaa4f8fe249fbbc01 Mon Sep 17 00:00:00 2001 From: chainhelen Date: Fri, 21 Aug 2020 16:44:52 +0000 Subject: [PATCH 0400/1792] runtime: fix panic if newstack at runtime.acquireLockRank Process may crash becaues acquireLockRank and releaseLockRank may be called in nosplit context. With optimizations and inlining disabled, these functions won't get inlined or have their morestack calls eliminated. Nosplit is not strictly required for lockWithRank, unlockWithRank and lockWithRankMayAcquire, just keep consistency with lockrank_on.go here. Fixes #40843 Change-Id: I5824119f98a1da66d767cdb9a60dffe768f13c81 GitHub-Last-Rev: 38fd3ccf6ea03b670c7561c060ccdbccc42fff40 GitHub-Pull-Request: golang/go#40844 Reviewed-on: https://go-review.googlesource.com/c/go/+/248878 Reviewed-by: Dan Scales Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/runtime/lockrank_off.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/runtime/lockrank_off.go b/src/runtime/lockrank_off.go index 425ca8dd93..32378a9627 100644 --- a/src/runtime/lockrank_off.go +++ b/src/runtime/lockrank_off.go @@ -18,19 +18,29 @@ func getLockRank(l *mutex) lockRank { return 0 } +// The following functions may be called in nosplit context. +// Nosplit is not strictly required for lockWithRank, unlockWithRank +// and lockWithRankMayAcquire, but these nosplit annotations must +// be kept consistent with the equivalent functions in lockrank_on.go. + +//go:nosplit func lockWithRank(l *mutex, rank lockRank) { lock2(l) } +//go:nosplit func acquireLockRank(rank lockRank) { } +//go:nosplit func unlockWithRank(l *mutex) { unlock2(l) } +//go:nosplit func releaseLockRank(rank lockRank) { } +//go:nosplit func lockWithRankMayAcquire(l *mutex, rank lockRank) { } -- GitLab From 7432bee7b372efbbd09b16c4e3176b69fbb6878a Mon Sep 17 00:00:00 2001 From: Tzu-Chiao Yeh Date: Wed, 2 Sep 2020 10:53:39 +0800 Subject: [PATCH 0401/1792] net/http/fcgi: fix race in child.serve connection read Guards the connection read with a mutex, because typeStdin asynchronously and concurrently writes to the underlying conn. Fixes #41167 Change-Id: Ia2610f4fde0bd4b108c54164095ea293980b0301 Reviewed-on: https://go-review.googlesource.com/c/go/+/252417 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/net/http/fcgi/child.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/net/http/fcgi/child.go b/src/net/http/fcgi/child.go index 30a6b2ce2d..0e91042543 100644 --- a/src/net/http/fcgi/child.go +++ b/src/net/http/fcgi/child.go @@ -155,9 +155,12 @@ func (c *child) serve() { defer c.cleanUp() var rec record for { + c.conn.mutex.Lock() if err := rec.read(c.conn.rwc); err != nil { + c.conn.mutex.Unlock() return } + c.conn.mutex.Unlock() if err := c.handleRecord(&rec); err != nil { return } -- GitLab From e6583dc95375c4e266bffab6f8888e8e557b6355 Mon Sep 17 00:00:00 2001 From: Heisenberg Date: Mon, 3 Aug 2020 15:33:47 +0800 Subject: [PATCH 0402/1792] runtime: add file copyright header declaration Some files have no copyright notice. The copyright time is the earliest modification record of the file. Change-Id: I5698bae16b6b73543e074415877a03348f792951 Reviewed-on: https://go-review.googlesource.com/c/go/+/246378 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/runtime/defs_linux_arm.go | 4 ++++ src/runtime/defs_linux_mips64x.go | 4 ++++ src/runtime/defs_openbsd_arm64.go | 4 ++++ src/runtime/defs_plan9_386.go | 4 ++++ src/runtime/defs_plan9_amd64.go | 4 ++++ src/runtime/rt0_linux_ppc64.s | 4 ++++ src/runtime/rt0_linux_ppc64le.s | 4 ++++ src/runtime/trace/annotation.go | 4 ++++ src/runtime/trace/annotation_test.go | 4 ++++ 9 files changed, 36 insertions(+) diff --git a/src/runtime/defs_linux_arm.go b/src/runtime/defs_linux_arm.go index ea29fd9d98..5bc0916f8b 100644 --- a/src/runtime/defs_linux_arm.go +++ b/src/runtime/defs_linux_arm.go @@ -1,3 +1,7 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + package runtime // Constants diff --git a/src/runtime/defs_linux_mips64x.go b/src/runtime/defs_linux_mips64x.go index 0fb53d5737..1fb423b198 100644 --- a/src/runtime/defs_linux_mips64x.go +++ b/src/runtime/defs_linux_mips64x.go @@ -1,3 +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. + // +build mips64 mips64le // +build linux diff --git a/src/runtime/defs_openbsd_arm64.go b/src/runtime/defs_openbsd_arm64.go index 8b8d5cddf2..628f4bc5a5 100644 --- a/src/runtime/defs_openbsd_arm64.go +++ b/src/runtime/defs_openbsd_arm64.go @@ -1,3 +1,7 @@ +// 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 import "unsafe" diff --git a/src/runtime/defs_plan9_386.go b/src/runtime/defs_plan9_386.go index 220169d280..49129b3c3f 100644 --- a/src/runtime/defs_plan9_386.go +++ b/src/runtime/defs_plan9_386.go @@ -1,3 +1,7 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + package runtime const _PAGESIZE = 0x1000 diff --git a/src/runtime/defs_plan9_amd64.go b/src/runtime/defs_plan9_amd64.go index 29a2643c3a..0099563034 100644 --- a/src/runtime/defs_plan9_amd64.go +++ b/src/runtime/defs_plan9_amd64.go @@ -1,3 +1,7 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + package runtime const _PAGESIZE = 0x1000 diff --git a/src/runtime/rt0_linux_ppc64.s b/src/runtime/rt0_linux_ppc64.s index 1265b15853..897d61052a 100644 --- a/src/runtime/rt0_linux_ppc64.s +++ b/src/runtime/rt0_linux_ppc64.s @@ -1,3 +1,7 @@ +// 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" // actually a function descriptor for _main<>(SB) diff --git a/src/runtime/rt0_linux_ppc64le.s b/src/runtime/rt0_linux_ppc64le.s index 54ea9d58f7..4f7c6e6c99 100644 --- a/src/runtime/rt0_linux_ppc64le.s +++ b/src/runtime/rt0_linux_ppc64le.s @@ -1,3 +1,7 @@ +// 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 "go_asm.h" #include "textflag.h" diff --git a/src/runtime/trace/annotation.go b/src/runtime/trace/annotation.go index 82cb232dba..6e18bfb755 100644 --- a/src/runtime/trace/annotation.go +++ b/src/runtime/trace/annotation.go @@ -1,3 +1,7 @@ +// 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 trace import ( diff --git a/src/runtime/trace/annotation_test.go b/src/runtime/trace/annotation_test.go index 71abbfcfa6..31fccef206 100644 --- a/src/runtime/trace/annotation_test.go +++ b/src/runtime/trace/annotation_test.go @@ -1,3 +1,7 @@ +// 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 trace_test import ( -- GitLab From 51c0bdc6d15dcd7f753c25896039ab41ac787ebb Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 18 Aug 2020 22:47:12 -0400 Subject: [PATCH 0403/1792] testing: flush test summaries to stdout atomically when streaming output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While debugging #40771, I realized that the chatty printer should only ever print to a single io.Writer (normally os.Stdout). The other Writer implementations in the chain write to local buffers, but if we wrote a test's output to a local buffer, then we did *not* write it to stdout and we should not store it as the most recently logged test. Because the chatty printer should only ever print to one place, it shouldn't receive an io.Writer as an argument — rather, it shouldn't be used at all for destinations other than the main output stream. On the other hand, when we flush the output buffer to stdout in the top-level flushToParent call, it is important that we not allow some other test's output to intrude between the test summary header and the remainder of the test's output. cmd/test2json doesn't know how to parse such an intrusion, and it's confusing to humans too. No test because I couldn't reproduce the user-reported error without modifying the testing package. (This behavior seems to be very sensitive to output size and/or goroutine scheduling.) Fixes #40771 Updates #38458 Change-Id: Ic19bf1d535672b096ba1c8583a3b74aab6d6d766 Reviewed-on: https://go-review.googlesource.com/c/go/+/249026 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Ian Lance Taylor --- src/testing/benchmark.go | 18 ++--- src/testing/sub_test.go | 19 ++++-- src/testing/testing.go | 138 ++++++++++++++++++--------------------- 3 files changed, 88 insertions(+), 87 deletions(-) diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go index 52766005bf..e9687bf26d 100644 --- a/src/testing/benchmark.go +++ b/src/testing/benchmark.go @@ -242,7 +242,7 @@ func (b *B) run1() bool { if b.skipped { tag = "SKIP" } - if b.chatty && (len(b.output) > 0 || b.finished) { + if b.chatty != nil && (len(b.output) > 0 || b.finished) { b.trimOutput() fmt.Fprintf(b.w, "--- %s: %s\n%s", tag, b.name, b.output) } @@ -523,10 +523,9 @@ func runBenchmarks(importPath string, matchString func(pat, str string) (bool, e } main := &B{ common: common{ - name: "Main", - w: os.Stdout, - chatty: *chatty, - bench: true, + name: "Main", + w: os.Stdout, + bench: true, }, importPath: importPath, benchFunc: func(b *B) { @@ -537,6 +536,9 @@ func runBenchmarks(importPath string, matchString func(pat, str string) (bool, e benchTime: benchTime, context: ctx, } + if Verbose() { + main.chatty = newChattyPrinter(main.w) + } main.runN(1) return !main.failed } @@ -549,7 +551,7 @@ func (ctx *benchContext) processBench(b *B) { benchName := benchmarkName(b.name, procs) // If it's chatty, we've already printed this information. - if !b.chatty { + if b.chatty == nil { fmt.Fprintf(b.w, "%-*s\t", ctx.maxLen, benchName) } // Recompute the running time for all but the first iteration. @@ -576,7 +578,7 @@ func (ctx *benchContext) processBench(b *B) { continue } results := r.String() - if b.chatty { + if b.chatty != nil { fmt.Fprintf(b.w, "%-*s\t", ctx.maxLen, benchName) } if *benchmarkMemory || b.showAllocResult { @@ -639,7 +641,7 @@ func (b *B) Run(name string, f func(b *B)) bool { atomic.StoreInt32(&sub.hasSub, 1) } - if b.chatty { + if b.chatty != nil { labelsOnce.Do(func() { fmt.Printf("goos: %s\n", runtime.GOOS) fmt.Printf("goarch: %s\n", runtime.GOARCH) diff --git a/src/testing/sub_test.go b/src/testing/sub_test.go index 51fc0ccc39..5b226f85ad 100644 --- a/src/testing/sub_test.go +++ b/src/testing/sub_test.go @@ -483,10 +483,12 @@ func TestTRun(t *T) { signal: make(chan bool), name: "Test", w: buf, - chatty: tc.chatty, }, context: ctx, } + if tc.chatty { + root.chatty = newChattyPrinter(root.w) + } ok := root.Run(tc.desc, tc.f) ctx.release() @@ -665,11 +667,13 @@ func TestBRun(t *T) { signal: make(chan bool), name: "root", w: buf, - chatty: tc.chatty, }, benchFunc: func(b *B) { ok = b.Run("test", tc.f) }, // Use Run to catch failure. benchTime: benchTimeFlag{d: 1 * time.Microsecond}, } + if tc.chatty { + root.chatty = newChattyPrinter(root.w) + } root.runN(1) if ok != !tc.failed { t.Errorf("%s:ok: got %v; want %v", tc.desc, ok, !tc.failed) @@ -741,9 +745,13 @@ func TestParallelSub(t *T) { } } -type funcWriter func([]byte) (int, error) +type funcWriter struct { + write func([]byte) (int, error) +} -func (fw funcWriter) Write(b []byte) (int, error) { return fw(b) } +func (fw *funcWriter) Write(b []byte) (int, error) { + return fw.write(b) +} func TestRacyOutput(t *T) { var runs int32 // The number of running Writes @@ -761,9 +769,10 @@ func TestRacyOutput(t *T) { var wg sync.WaitGroup root := &T{ - common: common{w: funcWriter(raceDetector), chatty: true}, + common: common{w: &funcWriter{raceDetector}}, context: newTestContext(1, newMatcher(regexp.MatchString, "", "")), } + root.chatty = newChattyPrinter(root.w) root.Run("", func(t *T) { for i := 0; i < 100; i++ { wg.Add(1) diff --git a/src/testing/testing.go b/src/testing/testing.go index f4f0060523..a64206f349 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -327,7 +327,6 @@ var ( cpuListStr *string parallel *int testlog *string - printer *testPrinter haveExamples bool // are there examples? @@ -337,55 +336,45 @@ var ( numFailed uint32 // number of test failures ) -type testPrinter struct { - chatty bool - +type chattyPrinter struct { + w io.Writer lastNameMu sync.Mutex // guards lastName lastName string // last printed test name in chatty mode } -func newTestPrinter(chatty bool) *testPrinter { - return &testPrinter{ - chatty: chatty, - } +func newChattyPrinter(w io.Writer) *chattyPrinter { + return &chattyPrinter{w: w} } -func (p *testPrinter) Print(testName, out string) { - p.Fprint(os.Stdout, testName, out) +// Updatef prints a message about the status of the named test to w. +// +// The formatted message must include the test name itself. +func (p *chattyPrinter) Updatef(testName, format string, args ...interface{}) { + p.lastNameMu.Lock() + defer p.lastNameMu.Unlock() + + // Since the message already implies an association with a specific new test, + // we don't need to check what the old test name was or log an extra CONT line + // for it. (We're updating it anyway, and the current message already includes + // the test name.) + p.lastName = testName + fmt.Fprintf(p.w, format, args...) } -func (p *testPrinter) Fprint(w io.Writer, testName, out string) { +// Printf prints a message, generated by the named test, that does not +// necessarily mention that tests's name itself. +func (p *chattyPrinter) Printf(testName, format string, args ...interface{}) { p.lastNameMu.Lock() defer p.lastNameMu.Unlock() - if !p.chatty || - strings.HasPrefix(out, "--- PASS: ") || - strings.HasPrefix(out, "--- FAIL: ") || - strings.HasPrefix(out, "--- SKIP: ") || - strings.HasPrefix(out, "=== RUN ") || - strings.HasPrefix(out, "=== CONT ") || - strings.HasPrefix(out, "=== PAUSE ") { - // If we're buffering test output (!p.chatty), we don't really care which - // test is emitting which line so long as they are serialized. - // - // If the message already implies an association with a specific new test, - // we don't need to check what the old test name was or log an extra CONT - // line for it. (We're updating it anyway, and the current message already - // includes the test name.) - p.lastName = testName - fmt.Fprint(w, out) - return - } - if p.lastName == "" { p.lastName = testName } else if p.lastName != testName { - // Always printed as-is, with 0 decoration or indentation. So, we skip - // printing to w. - fmt.Printf("=== CONT %s\n", testName) + fmt.Fprintf(p.w, "=== CONT %s\n", testName) p.lastName = testName } - fmt.Fprint(w, out) + + fmt.Fprintf(p.w, format, args...) } // The maximum number of stack frames to go through when skipping helper functions for @@ -407,12 +396,12 @@ type common struct { cleanupName string // Name of the cleanup function. cleanupPc []uintptr // The stack trace at the point where Cleanup was called. - chatty bool // A copy of the chatty flag. - bench bool // Whether the current test is a benchmark. - finished bool // Test function has completed. - hasSub int32 // Written atomically. - raceErrors int // Number of races detected during test. - runner string // Function name of tRunner running the test. + chatty *chattyPrinter // A copy of chattyPrinter, if the chatty flag is set. + bench bool // Whether the current test is a benchmark. + finished bool // Test function has completed. + hasSub int32 // Written atomically. + raceErrors int // Number of races detected during test. + runner string // Function name of tRunner running the test. parent *common level int // Nesting depth of test or benchmark. @@ -574,12 +563,31 @@ func (c *common) flushToParent(testName, format string, args ...interface{}) { p.mu.Lock() defer p.mu.Unlock() - printer.Fprint(p.w, testName, fmt.Sprintf(format, args...)) - c.mu.Lock() defer c.mu.Unlock() - io.Copy(p.w, bytes.NewReader(c.output)) - c.output = c.output[:0] + + if len(c.output) > 0 { + format += "%s" + args = append(args[:len(args):len(args)], c.output) + c.output = c.output[:0] // but why? + } + + if c.chatty != nil && p.w == c.chatty.w { + // We're flushing to the actual output, so track that this output is + // associated with a specific test (and, specifically, that the next output + // is *not* associated with that test). + // + // Moreover, if c.output is non-empty it is important that this write be + // atomic with respect to the output of other tests, so that we don't end up + // with confusing '=== CONT' lines in the middle of our '--- PASS' block. + // Neither humans nor cmd/test2json can parse those easily. + // (See https://golang.org/issue/40771.) + c.chatty.Updatef(testName, format, args...) + } else { + // We're flushing to the output buffer of the parent test, which will + // itself follow a test-name header when it is finally flushed to stdout. + fmt.Fprintf(p.w, format, args...) + } } type indenter struct { @@ -748,13 +756,13 @@ func (c *common) logDepth(s string, depth int) { } panic("Log in goroutine after " + c.name + " has completed") } else { - if c.chatty { + if c.chatty != nil { if c.bench { // Benchmarks don't print === CONT, so we should skip the test // printer and just print straight to stdout. fmt.Print(c.decorate(s, depth+1)) } else { - printer.Print(c.name, c.decorate(s, depth+1)) + c.chatty.Printf(c.name, "%s", c.decorate(s, depth+1)) } return @@ -1003,34 +1011,22 @@ func (t *T) Parallel() { t.parent.sub = append(t.parent.sub, t) t.raceErrors += race.Errors() - if t.chatty { - // Print directly to root's io.Writer so there is no delay. - root := t.parent - for ; root.parent != nil; root = root.parent { - } - root.mu.Lock() + if t.chatty != nil { // Unfortunately, even though PAUSE indicates that the named test is *no // longer* running, cmd/test2json interprets it as changing the active test // for the purpose of log parsing. We could fix cmd/test2json, but that // won't fix existing deployments of third-party tools that already shell // out to older builds of cmd/test2json — so merely fixing cmd/test2json // isn't enough for now. - printer.Fprint(root.w, t.name, fmt.Sprintf("=== PAUSE %s\n", t.name)) - root.mu.Unlock() + t.chatty.Updatef(t.name, "=== PAUSE %s\n", t.name) } t.signal <- true // Release calling test. <-t.parent.barrier // Wait for the parent test to complete. t.context.waitParallel() - if t.chatty { - // Print directly to root's io.Writer so there is no delay. - root := t.parent - for ; root.parent != nil; root = root.parent { - } - root.mu.Lock() - printer.Fprint(root.w, t.name, fmt.Sprintf("=== CONT %s\n", t.name)) - root.mu.Unlock() + if t.chatty != nil { + t.chatty.Updatef(t.name, "=== CONT %s\n", t.name) } t.start = time.Now() @@ -1181,14 +1177,8 @@ func (t *T) Run(name string, f func(t *T)) bool { } t.w = indenter{&t.common} - if t.chatty { - // Print directly to root's io.Writer so there is no delay. - root := t.parent - for ; root.parent != nil; root = root.parent { - } - root.mu.Lock() - printer.Fprint(root.w, t.name, fmt.Sprintf("=== RUN %s\n", t.name)) - root.mu.Unlock() + if t.chatty != nil { + t.chatty.Updatef(t.name, "=== RUN %s\n", t.name) } // Instead of reducing the running count of this test before calling the // tRunner and increasing it afterwards, we rely on tRunner keeping the @@ -1355,8 +1345,6 @@ func (m *M) Run() (code int) { flag.Parse() } - printer = newTestPrinter(Verbose()) - if *parallel < 1 { fmt.Fprintln(os.Stderr, "testing: -parallel can only be given a positive integer") flag.Usage() @@ -1401,7 +1389,7 @@ func (t *T) report() { format := "--- %s: %s (%s)\n" if t.Failed() { t.flushToParent(t.name, format, "FAIL", t.name, dstr) - } else if t.chatty { + } else if t.chatty != nil { if t.Skipped() { t.flushToParent(t.name, format, "SKIP", t.name, dstr) } else { @@ -1462,10 +1450,12 @@ func runTests(matchString func(pat, str string) (bool, error), tests []InternalT signal: make(chan bool), barrier: make(chan bool), w: os.Stdout, - chatty: *chatty, }, context: ctx, } + if Verbose() { + t.chatty = newChattyPrinter(t.w) + } tRunner(t, func(t *T) { for _, test := range tests { t.Run(test.Name, test.F) -- GitLab From be9ed03f1aa5f348aa836c4ffe1904d8e37a629a Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 2 Sep 2020 22:10:15 +0700 Subject: [PATCH 0404/1792] cmd/compile/internal/gc: remove unparen CL 197120 removed the last use of it. Change-Id: I5fe4f57a47acc712208d831e72cd79205a534c28 Reviewed-on: https://go-review.googlesource.com/c/go/+/252697 Reviewed-by: Matthew Dempsky Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/noder.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/cmd/compile/internal/gc/noder.go b/src/cmd/compile/internal/gc/noder.go index 590c1a16de..5dce533e4b 100644 --- a/src/cmd/compile/internal/gc/noder.go +++ b/src/cmd/compile/internal/gc/noder.go @@ -1641,10 +1641,3 @@ func mkname(sym *types.Sym) *Node { } return n } - -func unparen(x *Node) *Node { - for x.Op == OPAREN { - x = x.Left - } - return x -} -- GitLab From ef20f76b8bc4e082d5f81fd818890d707751475b Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Wed, 2 Sep 2020 01:08:02 -0700 Subject: [PATCH 0405/1792] net/http: reject negative suffix-length Range:bytes=--N with 416 status code Fixes the file server to reject requests of the form: "Range": "bytes=--N" where "-N" is a negative suffix-length as designated by the grammar in RFC 7233 Section 2.1, "Byte-Ranges", which specifies that suffix-length MUST be of the form 1*DIGIT aka a non-negative digit. Thus requests such as: "Range": "bytes=--2" will be rejected with a "416 Range Not Satisfiable" response. Fixes #40940 Change-Id: I3e89f8326c14af30d8bdb126998a50e02ba002d9 Reviewed-on: https://go-review.googlesource.com/c/go/+/252497 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- doc/go1.16.html | 6 +++++ src/net/http/fs.go | 10 +++++-- src/net/http/fs_test.go | 58 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 7738cbdada..8dd806e9f2 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -167,3 +167,9 @@ Do not send CLs removing the interior tags from such phrases. handler serves a 404 instead of its previous behavior of invoking the underlying handler with a mismatched Path/RawPath pair.

+ +

+ The net/http package now rejects HTTP range requests + of the form "Range": "bytes=--N" where "-N" is a negative suffix length, for + example "Range": "bytes=--2". It now replies with a 416 "Range Not Satisfiable" response. +

diff --git a/src/net/http/fs.go b/src/net/http/fs.go index 922706ada1..d718fffba0 100644 --- a/src/net/http/fs.go +++ b/src/net/http/fs.go @@ -771,9 +771,15 @@ func parseRange(s string, size int64) ([]httpRange, error) { var r httpRange if start == "" { // If no start is specified, end specifies the - // range start relative to the end of the file. + // range start relative to the end of the file, + // and we are dealing with + // which has to be a non-negative integer as per + // RFC 7233 Section 2.1 "Byte-Ranges". + if end == "" || end[0] == '-' { + return nil, errors.New("invalid range") + } i, err := strconv.ParseInt(end, 10, 64) - if err != nil { + if i < 0 || err != nil { return nil, errors.New("invalid range") } if i > size { diff --git a/src/net/http/fs_test.go b/src/net/http/fs_test.go index 245d9ce65c..4ac73b728f 100644 --- a/src/net/http/fs_test.go +++ b/src/net/http/fs_test.go @@ -1316,3 +1316,61 @@ func Test_scanETag(t *testing.T) { } } } + +// Issue 40940: Ensure that we only accept non-negative suffix-lengths +// in "Range": "bytes=-N", and should reject "bytes=--2". +func TestServeFileRejectsInvalidSuffixLengths_h1(t *testing.T) { + testServeFileRejectsInvalidSuffixLengths(t, h1Mode) +} +func TestServeFileRejectsInvalidSuffixLengths_h2(t *testing.T) { + testServeFileRejectsInvalidSuffixLengths(t, h2Mode) +} + +func testServeFileRejectsInvalidSuffixLengths(t *testing.T, h2 bool) { + defer afterTest(t) + cst := httptest.NewUnstartedServer(FileServer(Dir("testdata"))) + cst.EnableHTTP2 = h2 + cst.StartTLS() + defer cst.Close() + + tests := []struct { + r string + wantCode int + wantBody string + }{ + {"bytes=--6", 416, "invalid range\n"}, + {"bytes=--0", 416, "invalid range\n"}, + {"bytes=---0", 416, "invalid range\n"}, + {"bytes=-6", 206, "hello\n"}, + {"bytes=6-", 206, "html says hello\n"}, + {"bytes=-6-", 416, "invalid range\n"}, + {"bytes=-0", 206, ""}, + {"bytes=", 200, "index.html says hello\n"}, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.r, func(t *testing.T) { + req, err := NewRequest("GET", cst.URL+"/index.html", nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Range", tt.r) + res, err := cst.Client().Do(req) + if err != nil { + t.Fatal(err) + } + if g, w := res.StatusCode, tt.wantCode; g != w { + t.Errorf("StatusCode mismatch: got %d want %d", g, w) + } + slurp, err := ioutil.ReadAll(res.Body) + res.Body.Close() + if err != nil { + t.Fatal(err) + } + if g, w := string(slurp), tt.wantBody; g != w { + t.Fatalf("Content mismatch:\nGot: %q\nWant: %q", g, w) + } + }) + } +} -- GitLab From 0e48c674f5f8e906c03d1ea0055eb74959d149cc Mon Sep 17 00:00:00 2001 From: Dan Kortschak Date: Thu, 3 Sep 2020 08:27:34 +0930 Subject: [PATCH 0406/1792] cmd/go: add -Wl,-Bsymbolic-functions to cgo flags whitelist Closes #41199 Change-Id: Iab69358e8c39e6d2b2797c7ce750df63aa7e96b0 Reviewed-on: https://go-review.googlesource.com/c/go/+/252698 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/work/security.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/go/internal/work/security.go b/src/cmd/go/internal/work/security.go index 3ee68ac1b4..d2a2697f0f 100644 --- a/src/cmd/go/internal/work/security.go +++ b/src/cmd/go/internal/work/security.go @@ -177,6 +177,7 @@ var validLinkerFlags = []*lazyregexp.Regexp{ re(`-Wl,-Bdynamic`), re(`-Wl,-berok`), re(`-Wl,-Bstatic`), + re(`-Wl,-Bsymbolic-functions`), re(`-WL,-O([^@,\-][^,]*)?`), re(`-Wl,-d[ny]`), re(`-Wl,--disable-new-dtags`), -- GitLab From ace37d35f18675ac935dc2c6b534dda32ebe84e5 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 2 Sep 2020 12:45:07 +0700 Subject: [PATCH 0407/1792] cmd/compile: do not push functions literal node to Func.Dcl They are skipped while processing Func.Dcl anyway. This CL does not pass toolstash-check, because it reduces the length of Func.Dcl length, while that length is used to generate autotmp variables name. Change-Id: I408183e62ce6c34e5f04c89814ebb9570957e37b Reviewed-on: https://go-review.googlesource.com/c/go/+/252418 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/dcl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index 4f6fddd089..6dc6f4db70 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -90,7 +90,7 @@ func declare(n *Node, ctxt Class) { lineno = n.Pos Fatalf("automatic outside function") } - if Curfn != nil { + if Curfn != nil && ctxt != PFUNC { Curfn.Func.Dcl = append(Curfn.Func.Dcl, n) } if n.Op == OTYPE { -- GitLab From a4171d85d7328ef1ff317d0838fef3b6e623bbc3 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 19 Aug 2020 16:05:02 +0700 Subject: [PATCH 0408/1792] cmd/compile: do not declare func nodes The primary responsibility of declare() to associate a symbol (Sym) with a declaration (Node), so "oldname" will work. Function literals are anonymous, so their symbols does not need to be declared. Passes toolstash-check. Change-Id: I739b1054e3953e85fbd74a99148b9cfd7e5a57eb Reviewed-on: https://go-review.googlesource.com/c/go/+/249078 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/alg.go | 3 +-- src/cmd/compile/internal/gc/closure.go | 14 +------------- src/cmd/compile/internal/gc/dcl.go | 14 +++++++++----- src/cmd/compile/internal/gc/init.go | 1 - src/cmd/compile/internal/gc/subr.go | 4 +--- src/cmd/compile/internal/gc/walk.go | 3 +-- 6 files changed, 13 insertions(+), 26 deletions(-) diff --git a/src/cmd/compile/internal/gc/alg.go b/src/cmd/compile/internal/gc/alg.go index 2b63700569..c9d71ea00b 100644 --- a/src/cmd/compile/internal/gc/alg.go +++ b/src/cmd/compile/internal/gc/alg.go @@ -429,8 +429,7 @@ func hashfor(t *types.Type) *Node { } n := newname(sym) - n.SetClass(PFUNC) - n.Sym.SetFunc(true) + setNodeNameFunc(n) n.Type = functype(nil, []*Node{ anonfield(types.NewPtr(t)), anonfield(types.Types[TUINTPTR]), diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index 23e48939b4..250be38e5b 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -107,18 +107,7 @@ func typecheckclosure(clo *Node, top int) { } xfunc.Func.Nname.Sym = closurename(Curfn) - disableExport(xfunc.Func.Nname.Sym) - if xfunc.Func.Nname.Sym.Def != nil { - // The only case we can reach here is when the outer function was redeclared. - // In that case, don't bother to redeclare the closure. Otherwise, we will get - // a spurious error message, see #17758. While we are here, double check that - // we already reported other error. - if nsavederrors+nerrors == 0 { - Fatalf("unexpected symbol collision %v", xfunc.Func.Nname.Sym) - } - } else { - declare(xfunc.Func.Nname, PFUNC) - } + setNodeNameFunc(xfunc.Func.Nname) xfunc = typecheck(xfunc, ctxStmt) // Type check the body now, but only if we're inside a function. @@ -473,7 +462,6 @@ func makepartialcall(fn *Node, t0 *types.Type, meth *types.Sym) *Node { tfn.List.Set(structargs(t0.Params(), true)) tfn.Rlist.Set(structargs(t0.Results(), false)) - disableExport(sym) xfunc := dclfunc(sym, tfn) xfunc.Func.SetDupok(true) xfunc.Func.SetNeedctxt(true) diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index 6dc6f4db70..69eb13f607 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -985,10 +985,14 @@ func makefuncsym(s *types.Sym) { } } -// disableExport prevents sym from being included in package export -// data. To be effectual, it must be called before declare. -func disableExport(sym *types.Sym) { - sym.SetOnExportList(true) +// setNodeNameFunc marks a node as a function. +func setNodeNameFunc(n *Node) { + if n.Op != ONAME || n.Class() != Pxxx { + Fatalf("expected ONAME/Pxxx node, got %v", n) + } + + n.SetClass(PFUNC) + n.Sym.SetFunc(true) } func dclfunc(sym *types.Sym, tfn *Node) *Node { @@ -1000,7 +1004,7 @@ func dclfunc(sym *types.Sym, tfn *Node) *Node { fn.Func.Nname = newfuncnamel(lineno, sym) fn.Func.Nname.Name.Defn = fn fn.Func.Nname.Name.Param.Ntype = tfn - declare(fn.Func.Nname, PFUNC) + setNodeNameFunc(fn.Func.Nname) funchdr(fn) fn.Func.Nname.Name.Param.Ntype = typecheck(fn.Func.Nname.Name.Param.Ntype, ctxType) return fn diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go index 03e475e85a..94cbcf9846 100644 --- a/src/cmd/compile/internal/gc/init.go +++ b/src/cmd/compile/internal/gc/init.go @@ -45,7 +45,6 @@ func fninit(n []*Node) { if len(nf) > 0 { lineno = nf[0].Pos // prolog/epilog gets line number of first init stmt initializers := lookup("init") - disableExport(initializers) fn := dclfunc(initializers, nod(OTFUNC, nil, nil)) for _, dcl := range dummyInitFn.Func.Dcl { dcl.Name.Curfn = fn diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 9c6cd24eb7..8fa3fca50f 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -1543,7 +1543,6 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym) { tfn.List.Set(structargs(method.Type.Params(), true)) tfn.Rlist.Set(structargs(method.Type.Results(), false)) - disableExport(newnam) fn := dclfunc(newnam, tfn) fn.Func.SetDupok(true) @@ -1631,8 +1630,7 @@ func hashmem(t *types.Type) *Node { sym := Runtimepkg.Lookup("memhash") n := newname(sym) - n.SetClass(PFUNC) - n.Sym.SetFunc(true) + setNodeNameFunc(n) n.Type = functype(nil, []*Node{ anonfield(types.NewPtr(t)), anonfield(types.Types[TUINTPTR]), diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 90ecb50d6a..0158af8700 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -3166,8 +3166,7 @@ func eqfor(t *types.Type) (n *Node, needsize bool) { case ASPECIAL: sym := typesymprefix(".eq", t) n := newname(sym) - n.SetClass(PFUNC) - n.Sym.SetFunc(true) + setNodeNameFunc(n) n.Type = functype(nil, []*Node{ anonfield(types.NewPtr(t)), anonfield(types.NewPtr(t)), -- GitLab From 6c76edeb1b67a5751dff215aaa712572d87a4ce8 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Wed, 2 Sep 2020 21:49:30 +1000 Subject: [PATCH 0409/1792] image/gif: have BenchmarkEncodeRealisticRGBA convert to RGBA Change-Id: I98f5d987b92a29dcff06ae23b92f293cc7d6c02f Reviewed-on: https://go-review.googlesource.com/c/go/+/252597 Reviewed-by: David Symonds --- src/image/gif/writer_test.go | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/image/gif/writer_test.go b/src/image/gif/writer_test.go index 5d1b2c439e..1e622b3674 100644 --- a/src/image/gif/writer_test.go +++ b/src/image/gif/writer_test.go @@ -658,27 +658,27 @@ func TestEncodeWrappedImage(t *testing.T) { } func BenchmarkEncodeRandomPaletted(b *testing.B) { - img := image.NewPaletted(image.Rect(0, 0, 640, 480), palette.Plan9) + paletted := image.NewPaletted(image.Rect(0, 0, 640, 480), palette.Plan9) rnd := rand.New(rand.NewSource(123)) - for i := range img.Pix { - img.Pix[i] = uint8(rnd.Intn(256)) + for i := range paletted.Pix { + paletted.Pix[i] = uint8(rnd.Intn(256)) } b.SetBytes(640 * 480 * 1) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { - Encode(ioutil.Discard, img, nil) + Encode(ioutil.Discard, paletted, nil) } } func BenchmarkEncodeRandomRGBA(b *testing.B) { - img := image.NewRGBA(image.Rect(0, 0, 640, 480)) - bo := img.Bounds() + rgba := image.NewRGBA(image.Rect(0, 0, 640, 480)) + bo := rgba.Bounds() rnd := rand.New(rand.NewSource(123)) for y := bo.Min.Y; y < bo.Max.Y; y++ { for x := bo.Min.X; x < bo.Max.X; x++ { - img.SetRGBA(x, y, color.RGBA{ + rgba.SetRGBA(x, y, color.RGBA{ uint8(rnd.Intn(256)), uint8(rnd.Intn(256)), uint8(rnd.Intn(256)), @@ -691,24 +691,24 @@ func BenchmarkEncodeRandomRGBA(b *testing.B) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { - Encode(ioutil.Discard, img, nil) + Encode(ioutil.Discard, rgba, nil) } } func BenchmarkEncodeRealisticPaletted(b *testing.B) { - rgba, err := readImg("../testdata/video-001.png") + img, err := readImg("../testdata/video-001.png") if err != nil { b.Fatalf("readImg: %v", err) } - bo := rgba.Bounds() - img := image.NewPaletted(bo, palette.Plan9) - draw.Draw(img, bo, rgba, bo.Min, draw.Src) + bo := img.Bounds() + paletted := image.NewPaletted(bo, palette.Plan9) + draw.Draw(paletted, bo, img, bo.Min, draw.Src) b.SetBytes(int64(bo.Dx() * bo.Dy() * 1)) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { - Encode(ioutil.Discard, img, nil) + Encode(ioutil.Discard, paletted, nil) } } @@ -718,11 +718,17 @@ func BenchmarkEncodeRealisticRGBA(b *testing.B) { b.Fatalf("readImg: %v", err) } bo := img.Bounds() + // Converting img to rgba is redundant for video-001.png, which is already + // in the RGBA format, but for those copy/pasting this benchmark (but + // changing the source image), the conversion ensures that we're still + // benchmarking encoding an RGBA image. + rgba := image.NewRGBA(bo) + draw.Draw(rgba, bo, img, bo.Min, draw.Src) b.SetBytes(int64(bo.Dx() * bo.Dy() * 4)) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { - Encode(ioutil.Discard, img, nil) + Encode(ioutil.Discard, rgba, nil) } } -- GitLab From 2b8b06ebbf0198d3c7a9b4d839bc05d9b13ecbe7 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Tue, 1 Sep 2020 11:16:33 -0400 Subject: [PATCH 0410/1792] cmd/internal/objabi: add regabi GOEXPERIMENT This is the "feature flag" for the register calling convention work (though since this work is expected to extend over a few releases, it's not version-prefixed). This will let us develop the register calling convention on the main branch while maintaining an easy toggle between the old and new ABIs. Updates #40724. Change-Id: I129c8d87d34e6fa0910b6fa43efb35b706021637 Reviewed-on: https://go-review.googlesource.com/c/go/+/252257 Reviewed-by: Cherry Zhang Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot --- src/cmd/internal/objabi/util.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index 6c5a9ba441..d2d6fdbda8 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -131,6 +131,11 @@ func init() { addexp(f) } } + + // regabi is only supported on amd64. + if GOARCH != "amd64" { + Regabi_enabled = 0 + } } // Note: must agree with runtime.framepointer_enabled. @@ -161,6 +166,7 @@ var ( Fieldtrack_enabled int Preemptibleloops_enabled int Staticlockranking_enabled int + Regabi_enabled int ) // Toolchain experiments. @@ -174,6 +180,7 @@ var exper = []struct { {"fieldtrack", &Fieldtrack_enabled}, {"preemptibleloops", &Preemptibleloops_enabled}, {"staticlockranking", &Staticlockranking_enabled}, + {"regabi", &Regabi_enabled}, } var defaultExpstring = Expstring() -- GitLab From a538b59fd2428ba4d13f296d7483febf2fc05f97 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Tue, 1 Sep 2020 11:21:50 -0400 Subject: [PATCH 0411/1792] cmd/go: define an asm macro for GOEXPERIMENT=regabi This defines a macro for the regabi GOEXPERIMENT when assembling runtime assembly code. In general, assembly code will be shielded from the calling convention change, but there is a small amount of runtime assembly that is going to have to change. By defining a macro, we can easily make the small necessary changes. The other option is to use build tags, but that would require duplicating nontrivial amounts of unaffected code, leading to potential divergence issues. (And unlike Go code, assembly code can't depend on the compiler optimizing away branches on a feature constant.) We consider the macro preferable, especially since this is expected to be temporary as we transition to the new calling convention. Updates #40724. Change-Id: I73984065123968337ec10b47bb12c4a1cbc07dc5 Reviewed-on: https://go-review.googlesource.com/c/go/+/252258 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/go/internal/work/gc.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go index f1d08e0268..6031897f88 100644 --- a/src/cmd/go/internal/work/gc.go +++ b/src/cmd/go/internal/work/gc.go @@ -259,6 +259,15 @@ func asmArgs(a *Action, p *load.Package) []interface{} { } } } + if p.ImportPath == "runtime" && objabi.Regabi_enabled != 0 { + // In order to make it easier to port runtime assembly + // to the register ABI, we introduce a macro + // indicating the experiment is enabled. + // + // TODO(austin): Remove this once we commit to the + // register ABI (#40724). + args = append(args, "-D=GOEXPERIMENT_REGABI=1") + } if cfg.Goarch == "mips" || cfg.Goarch == "mipsle" { // Define GOMIPS_value from cfg.GOMIPS. -- GitLab From ae658cb19a265f3f4694cd4aec508b4565bda6aa Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Thu, 27 Aug 2020 17:34:59 +0800 Subject: [PATCH 0412/1792] cmd/compile: store the comparison pseudo-ops of arm64 conditional instructions in AuxInt The current implementation stores the comparison pseudo-ops of arm64 conditional instructions (CSEL/CSEL0) in Aux, this patch modifies it and stores it in AuxInt, which can avoid the allocation. Change-Id: I0b69e51f63acd84c6878c6a59ccf6417501a8cfc Reviewed-on: https://go-review.googlesource.com/c/go/+/252517 Run-TryBot: fannie zhang TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/arm64/ssa.go | 2 +- src/cmd/compile/internal/ssa/check.go | 6 +- src/cmd/compile/internal/ssa/gen/ARM64.rules | 162 ++++----- src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 4 +- src/cmd/compile/internal/ssa/gen/rulegen.go | 7 +- src/cmd/compile/internal/ssa/rewrite.go | 15 +- src/cmd/compile/internal/ssa/rewriteARM64.go | 332 +++++++++---------- src/cmd/compile/internal/ssa/value.go | 2 +- 8 files changed, 265 insertions(+), 265 deletions(-) diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index b6bb81a847..1d6ea6b9d8 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -816,7 +816,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { } p := s.Prog(v.Op.Asm()) p.From.Type = obj.TYPE_REG // assembler encodes conditional bits in Reg - p.From.Reg = condBits[v.Aux.(ssa.Op)] + p.From.Reg = condBits[ssa.Op(v.AuxInt)] p.Reg = v.Args[0].Reg() p.SetFrom3(obj.Addr{Type: obj.TYPE_REG, Reg: r1}) p.To.Type = obj.TYPE_REG diff --git a/src/cmd/compile/internal/ssa/check.go b/src/cmd/compile/internal/ssa/check.go index 98e1b79334..828f645b39 100644 --- a/src/cmd/compile/internal/ssa/check.go +++ b/src/cmd/compile/internal/ssa/check.go @@ -171,10 +171,10 @@ func checkFunc(f *Func) { canHaveAuxInt = true canHaveAux = true case auxCCop: - if _, ok := v.Aux.(Op); !ok { - f.Fatalf("bad type %T for CCop in %v", v.Aux, v) + if opcodeTable[Op(v.AuxInt)].name == "OpInvalid" { + f.Fatalf("value %v has an AuxInt value that is a valid opcode", v) } - canHaveAux = true + canHaveAuxInt = true case auxS390XCCMask: if _, ok := v.Aux.(s390x.CCMask); !ok { f.Fatalf("bad type %T for S390XCCMask in %v", v.Aux, v) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index c29e7f7edf..311067e87a 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -132,65 +132,65 @@ // we compare to 64 to ensure Go semantics for large shifts // Rules about rotates with non-const shift are based on the following rules, // if the following rules change, please also modify the rules based on them. -(Lsh64x64 x y) => (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) -(Lsh64x32 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) -(Lsh64x16 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) -(Lsh64x8 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) - -(Lsh32x64 x y) => (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) -(Lsh32x32 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) -(Lsh32x16 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) -(Lsh32x8 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) - -(Lsh16x64 x y) => (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) -(Lsh16x32 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) -(Lsh16x16 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) -(Lsh16x8 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) - -(Lsh8x64 x y) => (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) -(Lsh8x32 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) -(Lsh8x16 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) -(Lsh8x8 x y) => (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) - -(Rsh64Ux64 x y) => (CSEL {OpARM64LessThanU} (SRL x y) (Const64 [0]) (CMPconst [64] y)) -(Rsh64Ux32 x y) => (CSEL {OpARM64LessThanU} (SRL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) -(Rsh64Ux16 x y) => (CSEL {OpARM64LessThanU} (SRL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) -(Rsh64Ux8 x y) => (CSEL {OpARM64LessThanU} (SRL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) - -(Rsh32Ux64 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) y) (Const64 [0]) (CMPconst [64] y)) -(Rsh32Ux32 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) -(Rsh32Ux16 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) -(Rsh32Ux8 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) - -(Rsh16Ux64 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) y) (Const64 [0]) (CMPconst [64] y)) -(Rsh16Ux32 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) -(Rsh16Ux16 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) -(Rsh16Ux8 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) - -(Rsh8Ux64 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) y) (Const64 [0]) (CMPconst [64] y)) -(Rsh8Ux32 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) -(Rsh8Ux16 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) -(Rsh8Ux8 x y) => (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) - -(Rsh64x64 x y) => (SRA x (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) -(Rsh64x32 x y) => (SRA x (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) -(Rsh64x16 x y) => (SRA x (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) -(Rsh64x8 x y) => (SRA x (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) - -(Rsh32x64 x y) => (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) -(Rsh32x32 x y) => (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) -(Rsh32x16 x y) => (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) -(Rsh32x8 x y) => (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) - -(Rsh16x64 x y) => (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) -(Rsh16x32 x y) => (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) -(Rsh16x16 x y) => (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) -(Rsh16x8 x y) => (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) - -(Rsh8x64 x y) => (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) -(Rsh8x32 x y) => (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) -(Rsh8x16 x y) => (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) -(Rsh8x8 x y) => (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) +(Lsh64x64 x y) => (CSEL [OpARM64LessThanU] (SLL x y) (Const64 [0]) (CMPconst [64] y)) +(Lsh64x32 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) +(Lsh64x16 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) +(Lsh64x8 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + +(Lsh32x64 x y) => (CSEL [OpARM64LessThanU] (SLL x y) (Const64 [0]) (CMPconst [64] y)) +(Lsh32x32 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) +(Lsh32x16 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) +(Lsh32x8 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + +(Lsh16x64 x y) => (CSEL [OpARM64LessThanU] (SLL x y) (Const64 [0]) (CMPconst [64] y)) +(Lsh16x32 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) +(Lsh16x16 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) +(Lsh16x8 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + +(Lsh8x64 x y) => (CSEL [OpARM64LessThanU] (SLL x y) (Const64 [0]) (CMPconst [64] y)) +(Lsh8x32 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) +(Lsh8x16 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) +(Lsh8x8 x y) => (CSEL [OpARM64LessThanU] (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + +(Rsh64Ux64 x y) => (CSEL [OpARM64LessThanU] (SRL x y) (Const64 [0]) (CMPconst [64] y)) +(Rsh64Ux32 x y) => (CSEL [OpARM64LessThanU] (SRL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) +(Rsh64Ux16 x y) => (CSEL [OpARM64LessThanU] (SRL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) +(Rsh64Ux8 x y) => (CSEL [OpARM64LessThanU] (SRL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + +(Rsh32Ux64 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt32to64 x) y) (Const64 [0]) (CMPconst [64] y)) +(Rsh32Ux32 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) +(Rsh32Ux16 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) +(Rsh32Ux8 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + +(Rsh16Ux64 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt16to64 x) y) (Const64 [0]) (CMPconst [64] y)) +(Rsh16Ux32 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) +(Rsh16Ux16 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) +(Rsh16Ux8 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + +(Rsh8Ux64 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt8to64 x) y) (Const64 [0]) (CMPconst [64] y)) +(Rsh8Ux32 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) +(Rsh8Ux16 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) +(Rsh8Ux8 x y) => (CSEL [OpARM64LessThanU] (SRL (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + +(Rsh64x64 x y) => (SRA x (CSEL [OpARM64LessThanU] y (Const64 [63]) (CMPconst [64] y))) +(Rsh64x32 x y) => (SRA x (CSEL [OpARM64LessThanU] (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) +(Rsh64x16 x y) => (SRA x (CSEL [OpARM64LessThanU] (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) +(Rsh64x8 x y) => (SRA x (CSEL [OpARM64LessThanU] (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) + +(Rsh32x64 x y) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] y (Const64 [63]) (CMPconst [64] y))) +(Rsh32x32 x y) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) +(Rsh32x16 x y) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) +(Rsh32x8 x y) => (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) + +(Rsh16x64 x y) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] y (Const64 [63]) (CMPconst [64] y))) +(Rsh16x32 x y) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) +(Rsh16x16 x y) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) +(Rsh16x8 x y) => (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) + +(Rsh8x64 x y) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] y (Const64 [63]) (CMPconst [64] y))) +(Rsh8x32 x y) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) +(Rsh8x16 x y) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) +(Rsh8x8 x y) => (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) // constants (Const(64|32|16|8) [val]) => (MOVDconst [int64(val)]) @@ -315,8 +315,8 @@ (FCMPD (FMOVDconst [0]) x) => (InvertFlags (FCMPD0 x)) // CSEL needs a flag-generating argument. Synthesize a CMPW if necessary. -(CondSelect x y boolval) && flagArg(boolval) != nil => (CSEL {boolval.Op} x y flagArg(boolval)) -(CondSelect x y boolval) && flagArg(boolval) == nil => (CSEL {OpARM64NotEqual} x y (CMPWconst [0] boolval)) +(CondSelect x y boolval) && flagArg(boolval) != nil => (CSEL [boolval.Op] x y flagArg(boolval)) +(CondSelect x y boolval) && flagArg(boolval) == nil => (CSEL [OpARM64NotEqual] x y (CMPWconst [0] boolval)) (OffPtr [off] ptr:(SP)) && is32Bit(off) => (MOVDaddr [int32(off)] ptr) (OffPtr [off] ptr) => (ADDconst [off] ptr) @@ -1324,8 +1324,8 @@ (XOR x (MVN y)) -> (EON x y) (OR x (MVN y)) -> (ORN x y) (MVN (XOR x y)) -> (EON x y) -(CSEL {cc} x (MOVDconst [0]) flag) -> (CSEL0 {cc} x flag) -(CSEL {cc} (MOVDconst [0]) y flag) -> (CSEL0 {arm64Negate(cc.(Op))} y flag) +(CSEL [cc] x (MOVDconst [0]) flag) => (CSEL0 [cc] x flag) +(CSEL [cc] (MOVDconst [0]) y flag) => (CSEL0 [arm64Negate(cc)] y flag) (SUB x (SUB y z)) -> (SUB (ADD x z) y) (SUB (SUB x y) z) -> (SUB x (ADD y z)) @@ -1481,8 +1481,8 @@ (GTnoov (InvertFlags cmp) yes no) => (LTnoov cmp yes no) // absorb InvertFlags into CSEL(0) -(CSEL {cc} x y (InvertFlags cmp)) => (CSEL {arm64Invert(cc)} x y cmp) -(CSEL0 {cc} x (InvertFlags cmp)) => (CSEL0 {arm64Invert(cc)} x cmp) +(CSEL [cc] x y (InvertFlags cmp)) => (CSEL [arm64Invert(cc)] x y cmp) +(CSEL0 [cc] x (InvertFlags cmp)) => (CSEL0 [arm64Invert(cc)] x cmp) // absorb flag constants into boolean values (Equal (FlagConstant [fc])) => (MOVDconst [b2i(fc.eq())]) @@ -1517,20 +1517,20 @@ (MOVBUreg x) && x.Type.IsBoolean() => (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]) // absorb flags back into boolean CSEL -(CSEL {cc} x y (CMPWconst [0] boolval)) && cc == OpARM64NotEqual && flagArg(boolval) != nil => - (CSEL {boolval.Op} x y flagArg(boolval)) -(CSEL {cc} x y (CMPWconst [0] boolval)) && cc == OpARM64Equal && flagArg(boolval) != nil => - (CSEL {arm64Negate(boolval.Op)} x y flagArg(boolval)) -(CSEL0 {cc} x (CMPWconst [0] boolval)) && cc == OpARM64NotEqual && flagArg(boolval) != nil => - (CSEL0 {boolval.Op} x flagArg(boolval)) -(CSEL0 {cc} x (CMPWconst [0] boolval)) && cc == OpARM64Equal && flagArg(boolval) != nil => - (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) +(CSEL [cc] x y (CMPWconst [0] boolval)) && cc == OpARM64NotEqual && flagArg(boolval) != nil => + (CSEL [boolval.Op] x y flagArg(boolval)) +(CSEL [cc] x y (CMPWconst [0] boolval)) && cc == OpARM64Equal && flagArg(boolval) != nil => + (CSEL [arm64Negate(boolval.Op)] x y flagArg(boolval)) +(CSEL0 [cc] x (CMPWconst [0] boolval)) && cc == OpARM64NotEqual && flagArg(boolval) != nil => + (CSEL0 [boolval.Op] x flagArg(boolval)) +(CSEL0 [cc] x (CMPWconst [0] boolval)) && cc == OpARM64Equal && flagArg(boolval) != nil => + (CSEL0 [arm64Negate(boolval.Op)] x flagArg(boolval)) // absorb shifts into ops (NEG x:(SLLconst [c] y)) && clobberIfDead(x) => (NEGshiftLL [c] y) @@ -1691,11 +1691,11 @@ // "|" can also be "^" or "+". // As arm64 does not have a ROL instruction, so ROL(x, y) is replaced by ROR(x, -y). ((ADD|OR|XOR) (SLL x (ANDconst [63] y)) - (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) + (CSEL0 [cc] (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) && cc == OpARM64LessThanU => (ROR x (NEG y)) ((ADD|OR|XOR) (SRL x (ANDconst [63] y)) - (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) + (CSEL0 [cc] (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) && cc == OpARM64LessThanU => (ROR x y) @@ -1705,11 +1705,11 @@ // "|" can also be "^" or "+". // As arm64 does not have a ROLW instruction, so ROLW(x, y) is replaced by RORW(x, -y). ((ADD|OR|XOR) (SLL x (ANDconst [31] y)) - (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) + (CSEL0 [cc] (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc == OpARM64LessThanU => (RORW x (NEG y)) ((ADD|OR|XOR) (SRL (MOVWUreg x) (ANDconst [31] y)) - (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) + (CSEL0 [cc] (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc == OpARM64LessThanU => (RORW x y) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index 2424e67e20..e9af261a6a 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -467,8 +467,8 @@ func init() { // conditional instructions; auxint is // one of the arm64 comparison pseudo-ops (LessThan, LessThanU, etc.) - {name: "CSEL", argLength: 3, reg: gp2flags1, asm: "CSEL", aux: "CCop"}, // aux(flags) ? arg0 : arg1 - {name: "CSEL0", argLength: 2, reg: gp1flags1, asm: "CSEL", aux: "CCop"}, // aux(flags) ? arg0 : 0 + {name: "CSEL", argLength: 3, reg: gp2flags1, asm: "CSEL", aux: "CCop"}, // auxint(flags) ? arg0 : arg1 + {name: "CSEL0", argLength: 2, reg: gp1flags1, asm: "CSEL", aux: "CCop"}, // auxint(flags) ? arg0 : 0 // function calls {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index e520503ab1..9e2e112cd7 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -1423,7 +1423,8 @@ func parseValue(val string, arch arch, loc string) (op opData, oparch, typ, auxi func opHasAuxInt(op opData) bool { switch op.aux { - case "Bool", "Int8", "Int16", "Int32", "Int64", "Int128", "Float32", "Float64", "SymOff", "SymValAndOff", "TypSize", "ARM64BitField", "FlagConstant": + case "Bool", "Int8", "Int16", "Int32", "Int64", "Int128", "Float32", "Float64", + "SymOff", "SymValAndOff", "TypSize", "ARM64BitField", "FlagConstant", "CCop": return true } return false @@ -1431,7 +1432,7 @@ func opHasAuxInt(op opData) bool { func opHasAux(op opData) bool { switch op.aux { - case "String", "Sym", "SymOff", "SymValAndOff", "Typ", "TypSize", "CCop", + case "String", "Sym", "SymOff", "SymValAndOff", "Typ", "TypSize", "S390XCCMask", "S390XRotateParams": return true } @@ -1784,8 +1785,6 @@ func (op opData) auxType() string { return "s390x.CCMask" case "S390XRotateParams": return "s390x.RotateParams" - case "CCop": - return "CCop" default: return "invalid" } diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 3df9ad24f9..09f94ef53e 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -651,6 +651,10 @@ func auxIntToFlagConstant(x int64) flagConstant { return flagConstant(x) } +func auxIntToOp(cc int64) Op { + return Op(cc) +} + func boolToAuxInt(b bool) int64 { if b { return 1 @@ -694,6 +698,10 @@ func flagConstantToAuxInt(x flagConstant) int64 { return int64(x) } +func opToAuxInt(o Op) int64 { + return int64(o) +} + func auxToString(i interface{}) string { return i.(string) } @@ -727,13 +735,6 @@ func s390xCCMaskToAux(c s390x.CCMask) interface{} { func s390xRotateParamsToAux(r s390x.RotateParams) interface{} { return r } -func cCopToAux(o Op) interface{} { - return o -} - -func auxToCCop(cc interface{}) Op { - return cc.(Op) -} // uaddOvf reports whether unsigned a+b would overflow. func uaddOvf(a, b int64) bool { diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 453578aa9a..0fb86b6bdd 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -1285,7 +1285,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } break } - // match: (ADD (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // match: (ADD (SLL x (ANDconst [63] y)) (CSEL0 [cc] (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) // cond: cc == OpARM64LessThanU // result: (ROR x (NEG y)) for { @@ -1307,7 +1307,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { @@ -1355,7 +1355,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } break } - // match: (ADD (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // match: (ADD (SRL x (ANDconst [63] y)) (CSEL0 [cc] (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) // cond: cc == OpARM64LessThanU // result: (ROR x y) for { @@ -1377,7 +1377,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -1423,7 +1423,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } break } - // match: (ADD (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // match: (ADD (SLL x (ANDconst [31] y)) (CSEL0 [cc] (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) // cond: cc == OpARM64LessThanU // result: (RORW x (NEG y)) for { @@ -1445,7 +1445,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { @@ -1494,7 +1494,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { } break } - // match: (ADD (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // match: (ADD (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 [cc] (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) // cond: cc == OpARM64LessThanU // result: (RORW x y) for { @@ -1520,7 +1520,7 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -3178,38 +3178,38 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] - // match: (CSEL {cc} x (MOVDconst [0]) flag) - // result: (CSEL0 {cc} x flag) + // match: (CSEL [cc] x (MOVDconst [0]) flag) + // result: (CSEL0 [cc] x flag) for { - cc := v.Aux + cc := auxIntToOp(v.AuxInt) x := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 { break } flag := v_2 v.reset(OpARM64CSEL0) - v.Aux = cc + v.AuxInt = opToAuxInt(cc) v.AddArg2(x, flag) return true } - // match: (CSEL {cc} (MOVDconst [0]) y flag) - // result: (CSEL0 {arm64Negate(cc.(Op))} y flag) + // match: (CSEL [cc] (MOVDconst [0]) y flag) + // result: (CSEL0 [arm64Negate(cc)] y flag) for { - cc := v.Aux - if v_0.Op != OpARM64MOVDconst || v_0.AuxInt != 0 { + cc := auxIntToOp(v.AuxInt) + if v_0.Op != OpARM64MOVDconst || auxIntToInt64(v_0.AuxInt) != 0 { break } y := v_1 flag := v_2 v.reset(OpARM64CSEL0) - v.Aux = arm64Negate(cc.(Op)) + v.AuxInt = opToAuxInt(arm64Negate(cc)) v.AddArg2(y, flag) return true } - // match: (CSEL {cc} x y (InvertFlags cmp)) - // result: (CSEL {arm64Invert(cc)} x y cmp) + // match: (CSEL [cc] x y (InvertFlags cmp)) + // result: (CSEL [arm64Invert(cc)] x y cmp) for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) x := v_0 y := v_1 if v_2.Op != OpARM64InvertFlags { @@ -3217,15 +3217,15 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { } cmp := v_2.Args[0] v.reset(OpARM64CSEL) - v.Aux = cCopToAux(arm64Invert(cc)) + v.AuxInt = opToAuxInt(arm64Invert(cc)) v.AddArg3(x, y, cmp) return true } - // match: (CSEL {cc} x _ flag) + // match: (CSEL [cc] x _ flag) // cond: ccARM64Eval(cc, flag) > 0 // result: x for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) x := v_0 flag := v_2 if !(ccARM64Eval(cc, flag) > 0) { @@ -3234,11 +3234,11 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { v.copyOf(x) return true } - // match: (CSEL {cc} _ y flag) + // match: (CSEL [cc] _ y flag) // cond: ccARM64Eval(cc, flag) < 0 // result: y for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) y := v_1 flag := v_2 if !(ccARM64Eval(cc, flag) < 0) { @@ -3247,11 +3247,11 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { v.copyOf(y) return true } - // match: (CSEL {cc} x y (CMPWconst [0] boolval)) + // match: (CSEL [cc] x y (CMPWconst [0] boolval)) // cond: cc == OpARM64NotEqual && flagArg(boolval) != nil - // result: (CSEL {boolval.Op} x y flagArg(boolval)) + // result: (CSEL [boolval.Op] x y flagArg(boolval)) for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) x := v_0 y := v_1 if v_2.Op != OpARM64CMPWconst || auxIntToInt32(v_2.AuxInt) != 0 { @@ -3262,15 +3262,15 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { break } v.reset(OpARM64CSEL) - v.Aux = cCopToAux(boolval.Op) + v.AuxInt = opToAuxInt(boolval.Op) v.AddArg3(x, y, flagArg(boolval)) return true } - // match: (CSEL {cc} x y (CMPWconst [0] boolval)) + // match: (CSEL [cc] x y (CMPWconst [0] boolval)) // cond: cc == OpARM64Equal && flagArg(boolval) != nil - // result: (CSEL {arm64Negate(boolval.Op)} x y flagArg(boolval)) + // result: (CSEL [arm64Negate(boolval.Op)] x y flagArg(boolval)) for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) x := v_0 y := v_1 if v_2.Op != OpARM64CMPWconst || auxIntToInt32(v_2.AuxInt) != 0 { @@ -3281,7 +3281,7 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { break } v.reset(OpARM64CSEL) - v.Aux = cCopToAux(arm64Negate(boolval.Op)) + v.AuxInt = opToAuxInt(arm64Negate(boolval.Op)) v.AddArg3(x, y, flagArg(boolval)) return true } @@ -3290,25 +3290,25 @@ func rewriteValueARM64_OpARM64CSEL(v *Value) bool { func rewriteValueARM64_OpARM64CSEL0(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] - // match: (CSEL0 {cc} x (InvertFlags cmp)) - // result: (CSEL0 {arm64Invert(cc)} x cmp) + // match: (CSEL0 [cc] x (InvertFlags cmp)) + // result: (CSEL0 [arm64Invert(cc)] x cmp) for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) x := v_0 if v_1.Op != OpARM64InvertFlags { break } cmp := v_1.Args[0] v.reset(OpARM64CSEL0) - v.Aux = cCopToAux(arm64Invert(cc)) + v.AuxInt = opToAuxInt(arm64Invert(cc)) v.AddArg2(x, cmp) return true } - // match: (CSEL0 {cc} x flag) + // match: (CSEL0 [cc] x flag) // cond: ccARM64Eval(cc, flag) > 0 // result: x for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) x := v_0 flag := v_1 if !(ccARM64Eval(cc, flag) > 0) { @@ -3317,11 +3317,11 @@ func rewriteValueARM64_OpARM64CSEL0(v *Value) bool { v.copyOf(x) return true } - // match: (CSEL0 {cc} _ flag) + // match: (CSEL0 [cc] _ flag) // cond: ccARM64Eval(cc, flag) < 0 // result: (MOVDconst [0]) for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) flag := v_1 if !(ccARM64Eval(cc, flag) < 0) { break @@ -3330,11 +3330,11 @@ func rewriteValueARM64_OpARM64CSEL0(v *Value) bool { v.AuxInt = int64ToAuxInt(0) return true } - // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) + // match: (CSEL0 [cc] x (CMPWconst [0] boolval)) // cond: cc == OpARM64NotEqual && flagArg(boolval) != nil - // result: (CSEL0 {boolval.Op} x flagArg(boolval)) + // result: (CSEL0 [boolval.Op] x flagArg(boolval)) for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) x := v_0 if v_1.Op != OpARM64CMPWconst || auxIntToInt32(v_1.AuxInt) != 0 { break @@ -3344,15 +3344,15 @@ func rewriteValueARM64_OpARM64CSEL0(v *Value) bool { break } v.reset(OpARM64CSEL0) - v.Aux = cCopToAux(boolval.Op) + v.AuxInt = opToAuxInt(boolval.Op) v.AddArg2(x, flagArg(boolval)) return true } - // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) + // match: (CSEL0 [cc] x (CMPWconst [0] boolval)) // cond: cc == OpARM64Equal && flagArg(boolval) != nil - // result: (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) + // result: (CSEL0 [arm64Negate(boolval.Op)] x flagArg(boolval)) for { - cc := auxToCCop(v.Aux) + cc := auxIntToOp(v.AuxInt) x := v_0 if v_1.Op != OpARM64CMPWconst || auxIntToInt32(v_1.AuxInt) != 0 { break @@ -3362,7 +3362,7 @@ func rewriteValueARM64_OpARM64CSEL0(v *Value) bool { break } v.reset(OpARM64CSEL0) - v.Aux = cCopToAux(arm64Negate(boolval.Op)) + v.AuxInt = opToAuxInt(arm64Negate(boolval.Op)) v.AddArg2(x, flagArg(boolval)) return true } @@ -15043,7 +15043,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } break } - // match: (OR (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // match: (OR (SLL x (ANDconst [63] y)) (CSEL0 [cc] (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) // cond: cc == OpARM64LessThanU // result: (ROR x (NEG y)) for { @@ -15065,7 +15065,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { @@ -15113,7 +15113,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } break } - // match: (OR (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // match: (OR (SRL x (ANDconst [63] y)) (CSEL0 [cc] (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) // cond: cc == OpARM64LessThanU // result: (ROR x y) for { @@ -15135,7 +15135,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -15181,7 +15181,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } break } - // match: (OR (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // match: (OR (SLL x (ANDconst [31] y)) (CSEL0 [cc] (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) // cond: cc == OpARM64LessThanU // result: (RORW x (NEG y)) for { @@ -15203,7 +15203,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { @@ -15252,7 +15252,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { } break } - // match: (OR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // match: (OR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 [cc] (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) // cond: cc == OpARM64LessThanU // result: (RORW x y) for { @@ -15278,7 +15278,7 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -20713,7 +20713,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } break } - // match: (XOR (SLL x (ANDconst [63] y)) (CSEL0 {cc} (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // match: (XOR (SLL x (ANDconst [63] y)) (CSEL0 [cc] (SRL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) // cond: cc == OpARM64LessThanU // result: (ROR x (NEG y)) for { @@ -20735,7 +20735,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt64 { @@ -20783,7 +20783,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } break } - // match: (XOR (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) + // match: (XOR (SRL x (ANDconst [63] y)) (CSEL0 [cc] (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) // cond: cc == OpARM64LessThanU // result: (ROR x y) for { @@ -20805,7 +20805,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt64 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -20851,7 +20851,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } break } - // match: (XOR (SLL x (ANDconst [31] y)) (CSEL0 {cc} (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // match: (XOR (SLL x (ANDconst [31] y)) (CSEL0 [cc] (SRL (MOVWUreg x) (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) // cond: cc == OpARM64LessThanU // result: (RORW x (NEG y)) for { @@ -20873,7 +20873,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SRL || v_1_0.Type != typ.UInt32 { @@ -20922,7 +20922,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { } break } - // match: (XOR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) + // match: (XOR (SRL (MOVWUreg x) (ANDconst [31] y)) (CSEL0 [cc] (SLL x (SUB (MOVDconst [32]) (ANDconst [31] y))) (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) // cond: cc == OpARM64LessThanU // result: (RORW x y) for { @@ -20948,7 +20948,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { if v_1.Op != OpARM64CSEL0 || v_1.Type != typ.UInt32 { continue } - cc := auxToCCop(v_1.Aux) + cc := auxIntToOp(v_1.AuxInt) _ = v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpARM64SLL { @@ -21471,7 +21471,7 @@ func rewriteValueARM64_OpCondSelect(v *Value) bool { b := v.Block // match: (CondSelect x y boolval) // cond: flagArg(boolval) != nil - // result: (CSEL {boolval.Op} x y flagArg(boolval)) + // result: (CSEL [boolval.Op] x y flagArg(boolval)) for { x := v_0 y := v_1 @@ -21480,13 +21480,13 @@ func rewriteValueARM64_OpCondSelect(v *Value) bool { break } v.reset(OpARM64CSEL) - v.Aux = cCopToAux(boolval.Op) + v.AuxInt = opToAuxInt(boolval.Op) v.AddArg3(x, y, flagArg(boolval)) return true } // match: (CondSelect x y boolval) // cond: flagArg(boolval) == nil - // result: (CSEL {OpARM64NotEqual} x y (CMPWconst [0] boolval)) + // result: (CSEL [OpARM64NotEqual] x y (CMPWconst [0] boolval)) for { x := v_0 y := v_1 @@ -21495,7 +21495,7 @@ func rewriteValueARM64_OpCondSelect(v *Value) bool { break } v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64NotEqual) + v.AuxInt = opToAuxInt(OpARM64NotEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPWconst, types.TypeFlags) v0.AuxInt = int32ToAuxInt(0) v0.AddArg(boolval) @@ -22734,13 +22734,13 @@ func rewriteValueARM64_OpLsh16x16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh16x16 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(y) @@ -22760,13 +22760,13 @@ func rewriteValueARM64_OpLsh16x32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh16x32 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(y) @@ -22785,13 +22785,13 @@ func rewriteValueARM64_OpLsh16x64(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (Lsh16x64 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) + // result: (CSEL [OpARM64LessThanU] (SLL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v0.AddArg2(x, y) v1 := b.NewValue0(v.Pos, OpConst64, t) @@ -22809,13 +22809,13 @@ func rewriteValueARM64_OpLsh16x8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh16x8 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(y) @@ -22835,13 +22835,13 @@ func rewriteValueARM64_OpLsh32x16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh32x16 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(y) @@ -22861,13 +22861,13 @@ func rewriteValueARM64_OpLsh32x32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh32x32 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(y) @@ -22886,13 +22886,13 @@ func rewriteValueARM64_OpLsh32x64(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (Lsh32x64 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) + // result: (CSEL [OpARM64LessThanU] (SLL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v0.AddArg2(x, y) v1 := b.NewValue0(v.Pos, OpConst64, t) @@ -22910,13 +22910,13 @@ func rewriteValueARM64_OpLsh32x8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh32x8 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(y) @@ -22936,13 +22936,13 @@ func rewriteValueARM64_OpLsh64x16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh64x16 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(y) @@ -22962,13 +22962,13 @@ func rewriteValueARM64_OpLsh64x32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh64x32 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(y) @@ -22987,13 +22987,13 @@ func rewriteValueARM64_OpLsh64x64(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (Lsh64x64 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) + // result: (CSEL [OpARM64LessThanU] (SLL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v0.AddArg2(x, y) v1 := b.NewValue0(v.Pos, OpConst64, t) @@ -23011,13 +23011,13 @@ func rewriteValueARM64_OpLsh64x8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh64x8 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(y) @@ -23037,13 +23037,13 @@ func rewriteValueARM64_OpLsh8x16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh8x16 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(y) @@ -23063,13 +23063,13 @@ func rewriteValueARM64_OpLsh8x32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh8x32 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(y) @@ -23088,13 +23088,13 @@ func rewriteValueARM64_OpLsh8x64(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (Lsh8x64 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) + // result: (CSEL [OpARM64LessThanU] (SLL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v0.AddArg2(x, y) v1 := b.NewValue0(v.Pos, OpConst64, t) @@ -23112,13 +23112,13 @@ func rewriteValueARM64_OpLsh8x8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Lsh8x8 x y) - // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + // result: (CSEL [OpARM64LessThanU] (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SLL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(y) @@ -23932,13 +23932,13 @@ func rewriteValueARM64_OpRsh16Ux16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh16Ux16 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(x) @@ -23960,13 +23960,13 @@ func rewriteValueARM64_OpRsh16Ux32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh16Ux32 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(x) @@ -23988,13 +23988,13 @@ func rewriteValueARM64_OpRsh16Ux64(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh16Ux64 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) y) (Const64 [0]) (CMPconst [64] y)) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt16to64 x) y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(x) @@ -24014,13 +24014,13 @@ func rewriteValueARM64_OpRsh16Ux8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh16Ux8 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(x) @@ -24042,7 +24042,7 @@ func rewriteValueARM64_OpRsh16x16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh16x16 x y) - // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) + // result: (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) for { x := v_0 y := v_1 @@ -24050,7 +24050,7 @@ func rewriteValueARM64_OpRsh16x16(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24069,7 +24069,7 @@ func rewriteValueARM64_OpRsh16x32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh16x32 x y) - // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) + // result: (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) for { x := v_0 y := v_1 @@ -24077,7 +24077,7 @@ func rewriteValueARM64_OpRsh16x32(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24096,7 +24096,7 @@ func rewriteValueARM64_OpRsh16x64(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh16x64 x y) - // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) + // result: (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] y (Const64 [63]) (CMPconst [64] y))) for { x := v_0 y := v_1 @@ -24104,7 +24104,7 @@ func rewriteValueARM64_OpRsh16x64(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpConst64, y.Type) v2.AuxInt = int64ToAuxInt(63) v3 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) @@ -24121,7 +24121,7 @@ func rewriteValueARM64_OpRsh16x8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh16x8 x y) - // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) + // result: (SRA (SignExt16to64 x) (CSEL [OpARM64LessThanU] (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) for { x := v_0 y := v_1 @@ -24129,7 +24129,7 @@ func rewriteValueARM64_OpRsh16x8(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24148,13 +24148,13 @@ func rewriteValueARM64_OpRsh32Ux16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh32Ux16 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(x) @@ -24176,13 +24176,13 @@ func rewriteValueARM64_OpRsh32Ux32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh32Ux32 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(x) @@ -24204,13 +24204,13 @@ func rewriteValueARM64_OpRsh32Ux64(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh32Ux64 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) y) (Const64 [0]) (CMPconst [64] y)) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt32to64 x) y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(x) @@ -24230,13 +24230,13 @@ func rewriteValueARM64_OpRsh32Ux8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh32Ux8 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(x) @@ -24258,7 +24258,7 @@ func rewriteValueARM64_OpRsh32x16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh32x16 x y) - // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) + // result: (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) for { x := v_0 y := v_1 @@ -24266,7 +24266,7 @@ func rewriteValueARM64_OpRsh32x16(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24285,7 +24285,7 @@ func rewriteValueARM64_OpRsh32x32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh32x32 x y) - // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) + // result: (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) for { x := v_0 y := v_1 @@ -24293,7 +24293,7 @@ func rewriteValueARM64_OpRsh32x32(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24312,7 +24312,7 @@ func rewriteValueARM64_OpRsh32x64(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh32x64 x y) - // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) + // result: (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] y (Const64 [63]) (CMPconst [64] y))) for { x := v_0 y := v_1 @@ -24320,7 +24320,7 @@ func rewriteValueARM64_OpRsh32x64(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpConst64, y.Type) v2.AuxInt = int64ToAuxInt(63) v3 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) @@ -24337,7 +24337,7 @@ func rewriteValueARM64_OpRsh32x8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh32x8 x y) - // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) + // result: (SRA (SignExt32to64 x) (CSEL [OpARM64LessThanU] (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) for { x := v_0 y := v_1 @@ -24345,7 +24345,7 @@ func rewriteValueARM64_OpRsh32x8(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24364,13 +24364,13 @@ func rewriteValueARM64_OpRsh64Ux16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh64Ux16 x y) - // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(y) @@ -24390,13 +24390,13 @@ func rewriteValueARM64_OpRsh64Ux32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh64Ux32 x y) - // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(y) @@ -24415,13 +24415,13 @@ func rewriteValueARM64_OpRsh64Ux64(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (Rsh64Ux64 x y) - // result: (CSEL {OpARM64LessThanU} (SRL x y) (Const64 [0]) (CMPconst [64] y)) + // result: (CSEL [OpARM64LessThanU] (SRL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v0.AddArg2(x, y) v1 := b.NewValue0(v.Pos, OpConst64, t) @@ -24439,13 +24439,13 @@ func rewriteValueARM64_OpRsh64Ux8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh64Ux8 x y) - // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(y) @@ -24465,13 +24465,13 @@ func rewriteValueARM64_OpRsh64x16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh64x16 x y) - // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) + // result: (SRA x (CSEL [OpARM64LessThanU] (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) for { x := v_0 y := v_1 v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v0.Aux = cCopToAux(OpARM64LessThanU) + v0.AuxInt = opToAuxInt(OpARM64LessThanU) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v1.AddArg(y) v2 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24490,13 +24490,13 @@ func rewriteValueARM64_OpRsh64x32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh64x32 x y) - // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) + // result: (SRA x (CSEL [OpARM64LessThanU] (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) for { x := v_0 y := v_1 v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v0.Aux = cCopToAux(OpARM64LessThanU) + v0.AuxInt = opToAuxInt(OpARM64LessThanU) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(y) v2 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24514,13 +24514,13 @@ func rewriteValueARM64_OpRsh64x64(v *Value) bool { v_0 := v.Args[0] b := v.Block // match: (Rsh64x64 x y) - // result: (SRA x (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) + // result: (SRA x (CSEL [OpARM64LessThanU] y (Const64 [63]) (CMPconst [64] y))) for { x := v_0 y := v_1 v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v0.Aux = cCopToAux(OpARM64LessThanU) + v0.AuxInt = opToAuxInt(OpARM64LessThanU) v1 := b.NewValue0(v.Pos, OpConst64, y.Type) v1.AuxInt = int64ToAuxInt(63) v2 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) @@ -24537,13 +24537,13 @@ func rewriteValueARM64_OpRsh64x8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh64x8 x y) - // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) + // result: (SRA x (CSEL [OpARM64LessThanU] (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) for { x := v_0 y := v_1 v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v0.Aux = cCopToAux(OpARM64LessThanU) + v0.AuxInt = opToAuxInt(OpARM64LessThanU) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(y) v2 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24562,13 +24562,13 @@ func rewriteValueARM64_OpRsh8Ux16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh8Ux16 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(x) @@ -24590,13 +24590,13 @@ func rewriteValueARM64_OpRsh8Ux32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh8Ux32 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(x) @@ -24618,13 +24618,13 @@ func rewriteValueARM64_OpRsh8Ux64(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh8Ux64 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) y) (Const64 [0]) (CMPconst [64] y)) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt8to64 x) y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(x) @@ -24644,13 +24644,13 @@ func rewriteValueARM64_OpRsh8Ux8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh8Ux8 x y) - // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) + // result: (CSEL [OpARM64LessThanU] (SRL (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type x := v_0 y := v_1 v.reset(OpARM64CSEL) - v.Aux = cCopToAux(OpARM64LessThanU) + v.AuxInt = opToAuxInt(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64SRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v1.AddArg(x) @@ -24672,7 +24672,7 @@ func rewriteValueARM64_OpRsh8x16(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh8x16 x y) - // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) + // result: (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) for { x := v_0 y := v_1 @@ -24680,7 +24680,7 @@ func rewriteValueARM64_OpRsh8x16(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24699,7 +24699,7 @@ func rewriteValueARM64_OpRsh8x32(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh8x32 x y) - // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) + // result: (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) for { x := v_0 y := v_1 @@ -24707,7 +24707,7 @@ func rewriteValueARM64_OpRsh8x32(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) @@ -24726,7 +24726,7 @@ func rewriteValueARM64_OpRsh8x64(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh8x64 x y) - // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) + // result: (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] y (Const64 [63]) (CMPconst [64] y))) for { x := v_0 y := v_1 @@ -24734,7 +24734,7 @@ func rewriteValueARM64_OpRsh8x64(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpConst64, y.Type) v2.AuxInt = int64ToAuxInt(63) v3 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) @@ -24751,7 +24751,7 @@ func rewriteValueARM64_OpRsh8x8(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Rsh8x8 x y) - // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) + // result: (SRA (SignExt8to64 x) (CSEL [OpARM64LessThanU] (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) for { x := v_0 y := v_1 @@ -24759,7 +24759,7 @@ func rewriteValueARM64_OpRsh8x8(v *Value) bool { v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) v1 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) - v1.Aux = cCopToAux(OpARM64LessThanU) + v1.AuxInt = opToAuxInt(OpARM64LessThanU) v2 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v2.AddArg(y) v3 := b.NewValue0(v.Pos, OpConst64, y.Type) diff --git a/src/cmd/compile/internal/ssa/value.go b/src/cmd/compile/internal/ssa/value.go index 7fc33772d3..090745def7 100644 --- a/src/cmd/compile/internal/ssa/value.go +++ b/src/cmd/compile/internal/ssa/value.go @@ -210,7 +210,7 @@ func (v *Value) auxString() string { } return s + fmt.Sprintf(" [%s]", v.AuxValAndOff()) case auxCCop: - return fmt.Sprintf(" {%s}", v.Aux.(Op)) + return fmt.Sprintf(" {%s}", Op(v.AuxInt)) case auxS390XCCMask, auxS390XRotateParams: return fmt.Sprintf(" {%v}", v.Aux) case auxFlagConstant: -- GitLab From 5402d40d5b041399392b29e4543f5fc4506197bd Mon Sep 17 00:00:00 2001 From: Jeremy Faller Date: Tue, 18 Aug 2020 16:35:26 -0400 Subject: [PATCH 0413/1792] [dev.link] cmd/link: fix memory growth on dev.link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CL 247399 caused memory growth in the linker. Fix this by adjusting how we preallocate the number of symbols we'll need. cmd/compile (Darwin), alloc/op: Loadlib_GC 33.5MB ± 0% 27.3MB ± 0% Change-Id: I34997329ea4412716114df97fc9dad6ad0c171ee Reviewed-on: https://go-review.googlesource.com/c/go/+/249024 Run-TryBot: Jeremy Faller Reviewed-by: Cherry Zhang Reviewed-by: Austin Clements TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/lib.go | 2 +- src/cmd/link/internal/loader/loader.go | 36 +++++++++++++++++--------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index caa4566190..a01bdefa37 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -543,7 +543,7 @@ func (ctxt *Link) loadlib() { } // Add non-package symbols and references of externally defined symbols. - ctxt.loader.LoadNonpkgSyms(ctxt.Arch) + ctxt.loader.LoadSyms(ctxt.Arch) // Load symbols from shared libraries, after all Go object symbols are loaded. for _, lib := range ctxt.Library { diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index f149e3c831..ea9cd1bd2e 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -328,7 +328,7 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor ldr := &Loader{ start: make(map[*oReader]Sym), objs: []objIdx{{}, {extReader, 0}}, // reserve index 0 for nil symbol, 1 for external symbols - objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol + objSyms: make([]objSym, 1, 1), // This will get overwritten later. 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]*oReader), @@ -2016,8 +2016,9 @@ func (l *Loader) FuncInfo(i Sym) FuncInfo { return FuncInfo{} } -// Preload a package: add autolibs, add defined package symbols to the symbol table. -// Does not add non-package symbols yet, which will be done in LoadNonpkgSyms. +// Preload a package: adds autolib. +// Does not add defined package or non-packaged symbols to the symbol table. +// These are done in LoadSyms. // Does not read symbol data. // Returns the fingerprint of the object. func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, unit *sym.CompilationUnit, length int64) goobj.FingerprintType { @@ -2060,8 +2061,6 @@ func (l *Loader) Preload(localSymVersion int, f *bio.Reader, lib *sym.Library, u } l.addObj(lib.Pkg, or) - st := loadState{l: l} - st.preloadSyms(or, pkgDef) // The caller expects us consuming all the data f.MustSeek(length, os.SEEK_CUR) @@ -2144,17 +2143,30 @@ func (st *loadState) preloadSyms(r *oReader, kind int) { } } -// Add hashed (content-addressable) symbols, non-package symbols, and +// Add syms, hashed (content-addressable) symbols, non-package symbols, and // references to external symbols (which are always named). -func (l *Loader) LoadNonpkgSyms(arch *sys.Arch) { +func (l *Loader) LoadSyms(arch *sys.Arch) { + // Allocate space for symbols, making a guess as to how much space we need. + // This function was determined empirically by looking at the cmd/compile on + // Darwin, and picking factors for hashed and hashed64 syms. + var symSize, hashedSize, hashed64Size int + for _, o := range l.objs[goObjStart:] { + symSize += o.r.ndef + o.r.nhasheddef/2 + o.r.nhashed64def/2 + o.r.NNonpkgdef() + hashedSize += o.r.nhasheddef / 2 + hashed64Size += o.r.nhashed64def / 2 + } + // Index 0 is invalid for symbols. + l.objSyms = make([]objSym, 1, symSize) + l.npkgsyms = l.NSym() - // Preallocate some space (a few hundreds KB) for some symbols. - // As of Go 1.15, linking cmd/compile has ~8000 hashed64 symbols and - // ~13000 hashed symbols. st := loadState{ l: l, - hashed64Syms: make(map[uint64]symAndSize, 10000), - hashedSyms: make(map[goobj.HashType]symAndSize, 15000), + hashed64Syms: make(map[uint64]symAndSize, hashed64Size), + hashedSyms: make(map[goobj.HashType]symAndSize, hashedSize), + } + + for _, o := range l.objs[goObjStart:] { + st.preloadSyms(o.r, pkgDef) } for _, o := range l.objs[goObjStart:] { st.preloadSyms(o.r, hashed64Def) -- GitLab From e61d17d3b9ccf4c3e8ac87add9d74da7afa76488 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 3 Sep 2020 12:26:10 -0400 Subject: [PATCH 0414/1792] cmd/link: MACHOPLT is executable The PLT stubs are executable. Put it together with executable sections, instead of read-only data sections. Change-Id: I3818414aa0b87c6968c6c7eccce19b0db7c43193 Reviewed-on: https://go-review.googlesource.com/c/go/+/253018 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data.go | 2 +- src/cmd/link/internal/sym/symkind.go | 2 +- src/cmd/link/internal/sym/symkind_string.go | 24 ++++++++++----------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index dc7096ea8c..85ce7d8fb7 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1787,6 +1787,7 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { Errorf(nil, "dodata found an sym.STEXT symbol: %s", culprit) } state.allocateSingleSymSections(&Segtext, sym.SELFRXSECT, sym.SRODATA, 04) + state.allocateSingleSymSections(&Segtext, sym.SMACHOPLT, sym.SRODATA, 05) /* read-only data */ sect = state.allocateNamedDataSection(segro, ".rodata", sym.ReadOnly, 04) @@ -1810,7 +1811,6 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { /* read-only ELF, Mach-O sections */ state.allocateSingleSymSections(segro, sym.SELFROSECT, sym.SRODATA, 04) - state.allocateSingleSymSections(segro, sym.SMACHOPLT, sym.SRODATA, 04) // There is some data that are conceptually read-only but are written to by // relocations. On GNU systems, we can arrange for the dynamic linker to diff --git a/src/cmd/link/internal/sym/symkind.go b/src/cmd/link/internal/sym/symkind.go index 3e47d9a8e4..c176d5e208 100644 --- a/src/cmd/link/internal/sym/symkind.go +++ b/src/cmd/link/internal/sym/symkind.go @@ -41,6 +41,7 @@ const ( Sxxx SymKind = iota STEXT SELFRXSECT + SMACHOPLT // Read-only sections. STYPE @@ -52,7 +53,6 @@ const ( SFUNCTAB SELFROSECT - SMACHOPLT // Read-only sections with relocations. // diff --git a/src/cmd/link/internal/sym/symkind_string.go b/src/cmd/link/internal/sym/symkind_string.go index 47b2406e28..34cb314bd5 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=SymKindstringer -type=SymKind"; DO NOT EDIT. +// Code generated by "stringer -type=SymKind"; DO NOT EDIT. package sym @@ -11,15 +11,15 @@ func _() { _ = x[Sxxx-0] _ = x[STEXT-1] _ = x[SELFRXSECT-2] - _ = x[STYPE-3] - _ = x[SSTRING-4] - _ = x[SGOSTRING-5] - _ = x[SGOFUNC-6] - _ = x[SGCBITS-7] - _ = x[SRODATA-8] - _ = x[SFUNCTAB-9] - _ = x[SELFROSECT-10] - _ = x[SMACHOPLT-11] + _ = x[SMACHOPLT-3] + _ = x[STYPE-4] + _ = x[SSTRING-5] + _ = x[SGOSTRING-6] + _ = x[SGOFUNC-7] + _ = x[SGCBITS-8] + _ = x[SRODATA-9] + _ = x[SFUNCTAB-10] + _ = x[SELFROSECT-11] _ = x[STYPERELRO-12] _ = x[SSTRINGRELRO-13] _ = x[SGOSTRINGRELRO-14] @@ -68,9 +68,9 @@ func _() { _ = x[SABIALIAS-57] } -const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_EXTRA_COUNTERSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS" +const _SymKind_name = "SxxxSTEXTSELFRXSECTSMACHOPLTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSFirstWritableSBUILDINFOSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_EXTRA_COUNTERSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILEPATHSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSABIALIAS" -var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 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, 337, 344, 349, 361, 373, 390, 407, 416, 426, 434, 443, 453, 465, 476, 485, 497, 507, 516, 527, 536, 547, 556} +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, 337, 344, 349, 361, 373, 390, 407, 416, 426, 434, 443, 453, 465, 476, 485, 497, 507, 516, 527, 536, 547, 556} func (i SymKind) String() string { if i >= SymKind(len(_SymKind_index)-1) { -- GitLab From 612b1194475a23760ec502b48a93fea7237f3ae6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 2 Sep 2020 21:04:12 -0400 Subject: [PATCH 0415/1792] cmd/link: pass darwin/amd64-specific flags only on AMD64 The linker assumed macOS is AMD64 (and 386 in the past). It passes darwin/amd64-specific flags to the external linker when building for macOS. They don't work for ARM64-based macOS. So only pass them on AMD64. Disable DWARF combining for macOS ARM64 for now. The generated binary doesn't run. (TODO: fix.) For macOS ARM64 port. External linking now works. Change-Id: Iab53bc48f4fadd9b91de8898b4b450ea442667a2 Reviewed-on: https://go-review.googlesource.com/c/go/+/253019 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/lib.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d6ee437bca..702c902142 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1240,7 +1240,8 @@ func (ctxt *Link) hostlink() { switch ctxt.HeadType { case objabi.Hdarwin: - if machoPlatform == PLATFORM_MACOS { + if machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() { + // Leave room for DWARF combining. // -headerpad is incompatible with -fembed-bitcode. argv = append(argv, "-Wl,-headerpad,1144") } @@ -1280,7 +1281,7 @@ func (ctxt *Link) hostlink() { switch ctxt.BuildMode { case BuildModeExe: if ctxt.HeadType == objabi.Hdarwin { - if machoPlatform == PLATFORM_MACOS { + if machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() { argv = append(argv, "-Wl,-no_pie") argv = append(argv, "-Wl,-pagezero_size,4000000") } @@ -1517,7 +1518,7 @@ func (ctxt *Link) hostlink() { // does not work, the resulting programs will not run. See // issue #17847. To avoid this problem pass -no-pie to the // toolchain if it is supported. - if ctxt.BuildMode == BuildModeExe && !ctxt.linkShared { + if ctxt.BuildMode == BuildModeExe && !ctxt.linkShared && !(ctxt.IsDarwin() && ctxt.IsARM64()) { // GCC uses -no-pie, clang uses -nopie. for _, nopie := range []string{"-no-pie", "-nopie"} { if linkerFlagSupported(argv[0], altLinker, nopie) { @@ -1607,7 +1608,7 @@ func (ctxt *Link) hostlink() { Exitf("%s: parsing Mach-O header failed: %v", os.Args[0], err) } // Only macOS supports unmapped segments such as our __DWARF segment. - if machoPlatform == PLATFORM_MACOS { + if machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() { if err := machoCombineDwarf(ctxt, exef, exem, dsym, combinedOutput); err != nil { Exitf("%s: combining dwarf failed: %v", os.Args[0], err) } -- GitLab From 93810ac1f4574e1e2a79ea156781bafaf8b8ebe0 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Thu, 3 Sep 2020 16:36:38 -0400 Subject: [PATCH 0416/1792] runtime: opportunistically rotate map key seed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When clearing a map, reinitialize the hash seed with random data. This makes it more difficult for attackers to trigger pathological performance via repeated hash collisions. The extra reinitialization causes no statistically significant slowdown: name old time/op new time/op delta GoMapClear/Reflexive/1-12 18.3ns ± 0% 20.0ns ± 0% ~ (p=1.000 n=1+1) GoMapClear/Reflexive/10-12 18.2ns ± 0% 19.8ns ± 0% ~ (p=1.000 n=1+1) GoMapClear/Reflexive/100-12 44.6ns ± 0% 46.1ns ± 0% ~ (p=1.000 n=1+1) GoMapClear/Reflexive/1000-12 592ns ± 0% 592ns ± 0% ~ (all samples are equal) GoMapClear/Reflexive/10000-12 3.88µs ± 0% 3.88µs ± 0% ~ (p=1.000 n=1+1) GoMapClear/NonReflexive/1-12 62.7ns ± 0% 63.9ns ± 0% ~ (p=1.000 n=1+1) GoMapClear/NonReflexive/10-12 75.0ns ± 0% 76.1ns ± 0% ~ (p=1.000 n=1+1) GoMapClear/NonReflexive/100-12 203ns ± 0% 206ns ± 0% ~ (p=1.000 n=1+1) GoMapClear/NonReflexive/1000-12 2.33µs ± 0% 2.33µs ± 0% ~ (all samples are equal) GoMapClear/NonReflexive/10000-12 18.1µs ± 0% 18.1µs ± 0% ~ (p=1.000 n=1+1) Fixes #25237 Change-Id: I629a79dd7c562ba18bd94159673c3b9b653da643 Reviewed-on: https://go-review.googlesource.com/c/go/+/253020 Reviewed-by: Keith Randall --- src/runtime/map.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/runtime/map.go b/src/runtime/map.go index 399c1b071f..22a0241f56 100644 --- a/src/runtime/map.go +++ b/src/runtime/map.go @@ -993,6 +993,10 @@ func mapclear(t *maptype, h *hmap) { h.noverflow = 0 h.count = 0 + // Reset the hash seed to make it more difficult for attackers to + // repeatedly trigger hash collisions. See issue 25237. + h.hash0 = fastrand() + // Keep the mapextra allocation but clear any extra information. if h.extra != nil { *h.extra = mapextra{} -- GitLab From 721819e7bad078ac350bdebebb28793e13081e82 Mon Sep 17 00:00:00 2001 From: Changkun Ou Date: Fri, 28 Aug 2020 12:13:37 +0200 Subject: [PATCH 0417/1792] testing: make TempDir idempotent for both Cleanup and Benchmark Ensures that calling TempDir() in either of Cleanup or Benchmark doesn't cause test failures which were previously caused by the created directory having been deleted after the first run, yet we prevented the recreation of the directory due to our selection of concurrency primitive sync.Once. This change recreates the temporary directory if it doesn't exist, regardless of how many times Cleanup and Benchmark are invoked. Fixes #41062 Change-Id: I925d9f7207d7c369a193d1e17da7a59a586244a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/251297 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/testing/testing.go | 26 ++++++++++++++++++++------ src/testing/testing_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/testing/testing.go b/src/testing/testing.go index a64206f349..66f296234a 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -413,10 +413,10 @@ type common struct { signal chan bool // To signal a test is done. sub []*T // Queue of subtests to be run in parallel. - tempDirOnce sync.Once - tempDir string - tempDirErr error - tempDirSeq int32 + tempDirMu sync.Mutex + tempDir string + tempDirErr error + tempDirSeq int32 } // Short reports whether the -test.short flag is set. @@ -903,7 +903,19 @@ var tempDirReplacer struct { func (c *common) TempDir() string { // Use a single parent directory for all the temporary directories // created by a test, each numbered sequentially. - c.tempDirOnce.Do(func() { + c.tempDirMu.Lock() + var nonExistent bool + if c.tempDir == "" { // Usually the case with js/wasm + nonExistent = true + } else { + _, err := os.Stat(c.tempDir) + nonExistent = os.IsNotExist(err) + if err != nil && !nonExistent { + c.Fatalf("TempDir: %v", err) + } + } + + if nonExistent { c.Helper() // ioutil.TempDir doesn't like path separators in its pattern, @@ -921,7 +933,9 @@ func (c *common) TempDir() string { } }) } - }) + } + c.tempDirMu.Unlock() + if c.tempDirErr != nil { c.Fatalf("TempDir: %v", c.tempDirErr) } diff --git a/src/testing/testing_test.go b/src/testing/testing_test.go index dbef7066e0..d665a334e4 100644 --- a/src/testing/testing_test.go +++ b/src/testing/testing_test.go @@ -19,6 +19,38 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } +func TestTempDirInCleanup(t *testing.T) { + var dir string + + t.Run("test", func(t *testing.T) { + t.Cleanup(func() { + dir = t.TempDir() + }) + _ = t.TempDir() + }) + + fi, err := os.Stat(dir) + if fi != nil { + t.Fatalf("Directory %q from user Cleanup still exists", dir) + } + if !os.IsNotExist(err) { + t.Fatalf("Unexpected error: %v", err) + } +} + +func TestTempDirInBenchmark(t *testing.T) { + testing.Benchmark(func(b *testing.B) { + if !b.Run("test", func(b *testing.B) { + // Add a loop so that the test won't fail. See issue 38677. + for i := 0; i < b.N; i++ { + _ = b.TempDir() + } + }) { + t.Fatal("Sub test failure in a benchmark") + } + }) +} + func TestTempDir(t *testing.T) { testTempDir(t) t.Run("InSubtest", testTempDir) -- GitLab From bf833ead6250290dce039ffeee88f20a086b5dbe Mon Sep 17 00:00:00 2001 From: David Chase Date: Fri, 28 Aug 2020 14:32:15 -0400 Subject: [PATCH 0418/1792] cmd/compile: ensure that ssa.Func constant cache is consistent It was not necessarily consistent before, we were just lucky. Change-Id: I3a92dc724e0af7b4d810a6a0b7b1d58844eb8f87 Reviewed-on: https://go-review.googlesource.com/c/go/+/251440 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssa/func.go | 59 ++++++++++++++++++----- src/cmd/compile/internal/ssa/softfloat.go | 1 + src/cmd/compile/internal/ssa/value.go | 9 ++++ 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go index 6718b778e1..32df0c06f3 100644 --- a/src/cmd/compile/internal/ssa/func.go +++ b/src/cmd/compile/internal/ssa/func.go @@ -257,6 +257,49 @@ func (f *Func) LogStat(key string, args ...interface{}) { f.Warnl(f.Entry.Pos, "\t%s\t%s%s\t%s", n, key, value, f.Name) } +// unCacheLine removes v from f's constant cache "line" for aux, +// resets v.InCache when it is found (and removed), +// and returns whether v was found in that line. +func (f *Func) unCacheLine(v *Value, aux int64) bool { + vv := f.constants[aux] + for i, cv := range vv { + if v == cv { + vv[i] = vv[len(vv)-1] + vv[len(vv)-1] = nil + f.constants[aux] = vv[0 : len(vv)-1] + v.InCache = false + return true + } + } + return false +} + +// unCache removes v from f's constant cache. +func (f *Func) unCache(v *Value) { + if v.InCache { + aux := v.AuxInt + if f.unCacheLine(v, aux) { + return + } + if aux == 0 { + switch v.Op { + case OpConstNil: + aux = constNilMagic + case OpConstSlice: + aux = constSliceMagic + case OpConstString: + aux = constEmptyStringMagic + case OpConstInterface: + aux = constInterfaceMagic + } + if aux != 0 && f.unCacheLine(v, aux) { + return + } + } + f.Fatalf("unCached value %s not found in cache, auxInt=0x%x, adjusted aux=0x%x", v.LongString(), v.AuxInt, aux) + } +} + // freeValue frees a value. It must no longer be referenced or have any args. func (f *Func) freeValue(v *Value) { if v.Block == nil { @@ -270,19 +313,8 @@ func (f *Func) freeValue(v *Value) { } // Clear everything but ID (which we reuse). id := v.ID - - // Values with zero arguments and OpOffPtr values might be cached, so remove them there. - nArgs := opcodeTable[v.Op].argLen - if nArgs == 0 || v.Op == OpOffPtr { - vv := f.constants[v.AuxInt] - for i, cv := range vv { - if v == cv { - vv[i] = vv[len(vv)-1] - vv[len(vv)-1] = nil - f.constants[v.AuxInt] = vv[0 : len(vv)-1] - break - } - } + if v.InCache { + f.unCache(v) } *v = Value{} v.ID = id @@ -548,6 +580,7 @@ func (f *Func) constVal(op Op, t *types.Type, c int64, setAuxInt bool) *Value { v = f.Entry.NewValue0(src.NoXPos, op, t) } f.constants[c] = append(vv, v) + v.InCache = true return v } diff --git a/src/cmd/compile/internal/ssa/softfloat.go b/src/cmd/compile/internal/ssa/softfloat.go index 8db4334fef..a8a8f83629 100644 --- a/src/cmd/compile/internal/ssa/softfloat.go +++ b/src/cmd/compile/internal/ssa/softfloat.go @@ -18,6 +18,7 @@ func softfloat(f *Func) { for _, b := range f.Blocks { for _, v := range b.Values { if v.Type.IsFloat() { + f.unCache(v) switch v.Op { case OpPhi, OpLoad, OpArg: if v.Type.Size() == 4 { diff --git a/src/cmd/compile/internal/ssa/value.go b/src/cmd/compile/internal/ssa/value.go index 090745def7..6692df7921 100644 --- a/src/cmd/compile/internal/ssa/value.go +++ b/src/cmd/compile/internal/ssa/value.go @@ -54,6 +54,9 @@ type Value struct { // nor a slot on Go stack, and the generation of this value is delayed to its use time. OnWasmStack bool + // Is this value in the per-function constant cache? If so, remove from cache before changing it or recycling it. + InCache bool + // Storage for the first three args argstorage [3]*Value } @@ -332,6 +335,9 @@ func (v *Value) resetArgs() { // of cmd/compile by almost 10%, and slows it down. //go:noinline func (v *Value) reset(op Op) { + if v.InCache { + v.Block.Func.unCache(v) + } v.Op = op v.resetArgs() v.AuxInt = 0 @@ -342,6 +348,9 @@ func (v *Value) reset(op Op) { // It modifies v to be (Copy a). //go:noinline func (v *Value) copyOf(a *Value) { + if v.InCache { + v.Block.Func.unCache(v) + } v.Op = OpCopy v.resetArgs() v.AddArg(a) -- GitLab From 62fe10bf4e62c97af3bb8eb2ef72d9224a8752ba Mon Sep 17 00:00:00 2001 From: Paschalis Tsilias Date: Sat, 5 Sep 2020 15:01:19 +0300 Subject: [PATCH 0419/1792] src/go.mod, net/http: update bundled and latest golang.org/x/net Updates x/net/http2 to git rev 62affa334b73ec65ed44a326519ac12c421905e3 x/net/http2: reject HTTP/2 Content-Length headers containing a sign https://go-review.googlesource.com/c/net/+/236098/ (fixes #39017) also updates the vendored version of golang.org/x/net by running go get golang.org/x/net@62affa334b73ec65ed44a326519ac12c421905e3 go mod tidy go mod vendor go generate -run bundle net/http Change-Id: I7ecfdb7644574c44c3616e3b47664eefd4c926f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/253238 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/go.mod | 2 +- src/go.sum | 4 ++-- src/net/http/h2_bundle.go | 15 +++++++++------ src/vendor/modules.txt | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/go.mod b/src/go.mod index c75f74b916..0d5892f178 100644 --- a/src/go.mod +++ b/src/go.mod @@ -4,7 +4,7 @@ go 1.15 require ( golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 - golang.org/x/net v0.0.0-20200822124328-c89045814202 + golang.org/x/net v0.0.0-20200904194848-62affa334b73 golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 // indirect golang.org/x/text v0.3.3-0.20200430171850-afb9336c4530 // indirect ) diff --git a/src/go.sum b/src/go.sum index dc9641be1a..52907d313f 100644 --- a/src/go.sum +++ b/src/go.sum @@ -2,8 +2,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go index 463e7e8ce9..458e0b7646 100644 --- a/src/net/http/h2_bundle.go +++ b/src/net/http/h2_bundle.go @@ -5591,7 +5591,11 @@ func (sc *http2serverConn) newWriterAndRequest(st *http2stream, f *http2MetaHead } if bodyOpen { if vv, ok := rp.header["Content-Length"]; ok { - req.ContentLength, _ = strconv.ParseInt(vv[0], 10, 64) + if cl, err := strconv.ParseUint(vv[0], 10, 63); err == nil { + req.ContentLength = int64(cl) + } else { + req.ContentLength = 0 + } } else { req.ContentLength = -1 } @@ -5974,9 +5978,8 @@ func (rws *http2responseWriterState) writeChunk(p []byte) (n int, err error) { var ctype, clen string if clen = rws.snapHeader.Get("Content-Length"); clen != "" { rws.snapHeader.Del("Content-Length") - clen64, err := strconv.ParseInt(clen, 10, 64) - if err == nil && clen64 >= 0 { - rws.sentContentLen = clen64 + if cl, err := strconv.ParseUint(clen, 10, 63); err == nil { + rws.sentContentLen = int64(cl) } else { clen = "" } @@ -8505,8 +8508,8 @@ func (rl *http2clientConnReadLoop) handleResponse(cs *http2clientStream, f *http if !streamEnded || isHead { res.ContentLength = -1 if clens := res.Header["Content-Length"]; len(clens) == 1 { - if clen64, err := strconv.ParseInt(clens[0], 10, 64); err == nil { - res.ContentLength = clen64 + if cl, err := strconv.ParseUint(clens[0], 10, 63); err == nil { + res.ContentLength = int64(cl) } else { // TODO: care? unlike http/1, it won't mess up our framing, so it's // more safe smuggling-wise to ignore. diff --git a/src/vendor/modules.txt b/src/vendor/modules.txt index d1e4f28e21..faf95b871e 100644 --- a/src/vendor/modules.txt +++ b/src/vendor/modules.txt @@ -8,7 +8,7 @@ golang.org/x/crypto/curve25519 golang.org/x/crypto/hkdf golang.org/x/crypto/internal/subtle golang.org/x/crypto/poly1305 -# golang.org/x/net v0.0.0-20200822124328-c89045814202 +# golang.org/x/net v0.0.0-20200904194848-62affa334b73 ## explicit golang.org/x/net/dns/dnsmessage golang.org/x/net/http/httpguts -- GitLab From c489330987eca992cee0bb018a6fdb7ff5401704 Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Wed, 26 Aug 2020 23:55:09 +0300 Subject: [PATCH 0420/1792] doc/go1.16: reformat the minor changes section as a definition list Change the section to use
,
, and
tags to match previous documents. Change-Id: Ide0bea698a84ed6b61b364ef9e2f3801ebb8d4d6 Reviewed-on: https://go-review.googlesource.com/c/go/+/250897 Reviewed-by: Ian Lance Taylor --- doc/go1.16.html | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 8dd806e9f2..0ffaecc5a9 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -154,22 +154,26 @@ Do not send CLs removing the interior tags from such phrases. TODO

-

- In the net/http package, the - behavior of StripPrefix - has been changed to strip the prefix from the request URL's - RawPath field in addition to its Path field. - In past releases, only the Path field was trimmed, and so if the - request URL contained any escaped characters the URL would be modified to - have mismatched Path and RawPath fields. - In Go 1.16, StripPrefix trims both fields. - If there are escaped characters in the prefix part of the request URL the - handler serves a 404 instead of its previous behavior of invoking the - underlying handler with a mismatched Path/RawPath pair. -

- -

- The net/http package now rejects HTTP range requests - of the form "Range": "bytes=--N" where "-N" is a negative suffix length, for - example "Range": "bytes=--2". It now replies with a 416 "Range Not Satisfiable" response. -

+
net/http
+
+

+ In the net/http package, the + behavior of StripPrefix + has been changed to strip the prefix from the request URL's + RawPath field in addition to its Path field. + In past releases, only the Path field was trimmed, and so if the + request URL contained any escaped characters the URL would be modified to + have mismatched Path and RawPath fields. + In Go 1.16, StripPrefix trims both fields. + If there are escaped characters in the prefix part of the request URL the + handler serves a 404 instead of its previous behavior of invoking the + underlying handler with a mismatched Path/RawPath pair. +

+ +

+ The net/http package now rejects HTTP range requests + of the form "Range": "bytes=--N" where "-N" is a negative suffix length, for + example "Range": "bytes=--2". It now replies with a 416 "Range Not Satisfiable" response. +

+
+
-- GitLab From b60ec4cc4b230f4d0787acf82057947b8bf80cea Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Sat, 5 Sep 2020 14:24:28 +0300 Subject: [PATCH 0421/1792] mime: add examples for FormatMediaType and ParseMediaType Change-Id: Ic129c58784ad1f0b8b90fc9d33e52bee61bdf0eb Reviewed-on: https://go-review.googlesource.com/c/go/+/253237 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/mime/example_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/mime/example_test.go b/src/mime/example_test.go index c7d13cdcdb..85795976f0 100644 --- a/src/mime/example_test.go +++ b/src/mime/example_test.go @@ -96,3 +96,29 @@ func ExampleWordDecoder_DecodeHeader() { // ¡Hola, señor! // HELLO WORLD! } + +func ExampleFormatMediaType() { + mediatype := "text/html" + params := map[string]string{ + "charset": "utf-8", + } + + result := mime.FormatMediaType(mediatype, params) + + fmt.Println("result:", result) + // Output: + // result: text/html; charset=utf-8 +} + +func ExampleParseMediaType() { + mediatype, params, err := mime.ParseMediaType("text/html; charset=utf-8") + if err != nil { + panic(err) + } + + fmt.Println("type:", mediatype) + fmt.Println("charset:", params["charset"]) + // Output: + // type: text/html + // charset: utf-8 +} -- GitLab From 617f2c3e35cdc8483b950aa3ef18d92965d63197 Mon Sep 17 00:00:00 2001 From: Michael Fraenkel Date: Sat, 27 Jun 2020 13:31:34 -0600 Subject: [PATCH 0422/1792] net/http: mark http/2 connections active On Server.Shutdown, all idle connections are closed. A caveat for new connections is that they are marked idle after 5 seconds. Previously new HTTP/2 connections were marked New, and after 5 seconds, they would then become idle. With this change, we now mark HTTP/2 connections as Active to allow the proper shutdown sequence to occur. Fixes #36946 Fixes #39776 Change-Id: I31efbf64b9a2850ca544da797f86d7e1b3378e8b Reviewed-on: https://go-review.googlesource.com/c/go/+/240278 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/net/http/export_test.go | 11 +++++++++++ src/net/http/serve_test.go | 18 ++++++++++++++++-- src/net/http/server.go | 24 ++++++++++++++++++------ 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/net/http/export_test.go b/src/net/http/export_test.go index 657ff9dba4..67a74ae19f 100644 --- a/src/net/http/export_test.go +++ b/src/net/http/export_test.go @@ -274,6 +274,17 @@ func (s *Server) ExportAllConnsIdle() bool { return true } +func (s *Server) ExportAllConnsByState() map[ConnState]int { + states := map[ConnState]int{} + s.mu.Lock() + defer s.mu.Unlock() + for c := range s.activeConn { + st, _ := c.getState() + states[st] += 1 + } + return states +} + func (r *Request) WithT(t *testing.T) *Request { return r.WithContext(context.WithValue(r.Context(), tLogKey{}, t.Logf)) } diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 635bf5dfc9..6d3317fb0c 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -5537,16 +5537,23 @@ func TestServerSetKeepAlivesEnabledClosesConns(t *testing.T) { } } -func TestServerShutdown_h1(t *testing.T) { testServerShutdown(t, h1Mode) } -func TestServerShutdown_h2(t *testing.T) { testServerShutdown(t, h2Mode) } +func TestServerShutdown_h1(t *testing.T) { + testServerShutdown(t, h1Mode) +} +func TestServerShutdown_h2(t *testing.T) { + testServerShutdown(t, h2Mode) +} func testServerShutdown(t *testing.T, h2 bool) { setParallel(t) defer afterTest(t) 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) 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 @@ -5563,6 +5570,9 @@ func testServerShutdown(t *testing.T, h2 bool) { 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 if err := <-shutdownRes; err != nil { @@ -5574,6 +5584,10 @@ func testServerShutdown(t *testing.T, h2 bool) { t.Errorf("onShutdown callback not called, RegisterOnShutdown 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() diff --git a/src/net/http/server.go b/src/net/http/server.go index 9124903b89..25fab288f2 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -324,7 +324,7 @@ func (c *conn) hijackLocked() (rwc net.Conn, buf *bufio.ReadWriter, err error) { return nil, nil, fmt.Errorf("unexpected Peek failure reading buffered byte: %v", err) } } - c.setState(rwc, StateHijacked) + c.setState(rwc, StateHijacked, runHooks) return } @@ -1739,7 +1739,12 @@ func validNextProto(proto string) bool { return true } -func (c *conn) setState(nc net.Conn, state ConnState) { +const ( + runHooks = true + skipHooks = false +) + +func (c *conn) setState(nc net.Conn, state ConnState, runHook bool) { srv := c.server switch state { case StateNew: @@ -1752,6 +1757,9 @@ func (c *conn) setState(nc net.Conn, state ConnState) { } packedState := uint64(time.Now().Unix()<<8) | uint64(state) atomic.StoreUint64(&c.curState.atomic, packedState) + if !runHook { + return + } if hook := srv.ConnState; hook != nil { hook(nc, state) } @@ -1805,7 +1813,7 @@ func (c *conn) serve(ctx context.Context) { } if !c.hijacked() { c.close() - c.setState(c.rwc, StateClosed) + c.setState(c.rwc, StateClosed, runHooks) } }() @@ -1833,6 +1841,10 @@ func (c *conn) serve(ctx context.Context) { if proto := c.tlsState.NegotiatedProtocol; validNextProto(proto) { if fn := c.server.TLSNextProto[proto]; fn != nil { h := initALPNRequest{ctx, tlsConn, serverHandler{c.server}} + // Mark freshly created HTTP/2 as active and prevent any server state hooks + // from being run on these connections. This prevents closeIdleConns from + // closing such connections. See issue https://golang.org/issue/39776. + c.setState(c.rwc, StateActive, skipHooks) fn(c.server, tlsConn, h) } return @@ -1853,7 +1865,7 @@ func (c *conn) serve(ctx context.Context) { w, err := c.readRequest(ctx) if c.r.remain != c.server.initialReadLimitSize() { // If we read any bytes off the wire, we're active. - c.setState(c.rwc, StateActive) + c.setState(c.rwc, StateActive, runHooks) } if err != nil { const errorHeaders = "\r\nContent-Type: text/plain; charset=utf-8\r\nConnection: close\r\n\r\n" @@ -1936,7 +1948,7 @@ func (c *conn) serve(ctx context.Context) { } return } - c.setState(c.rwc, StateIdle) + c.setState(c.rwc, StateIdle, runHooks) c.curReq.Store((*response)(nil)) if !w.conn.server.doKeepAlives() { @@ -2971,7 +2983,7 @@ func (srv *Server) Serve(l net.Listener) error { } tempDelay = 0 c := srv.newConn(rw) - c.setState(c.rwc, StateNew) // before Serve can return + c.setState(c.rwc, StateNew, runHooks) // before Serve can return go c.serve(connCtx) } } -- GitLab From 5cc030aa1996762e48ce446001078ce6447f105e Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Mon, 27 Jul 2020 14:42:06 +0200 Subject: [PATCH 0423/1792] go/ast: note that in BasicLit CHARs and STRINGs are quoted MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Value field of ast.BasicLit is a string field holding the literal string. For CHARs and STRINGs, the BasicLit.Value literal includes quotes, so to use the value in practise one will often need to Unquote it. Since this is a common gotcha (I've been bitten by this a few times), document it, and suggest the use of the strconv.Unquote functions. Fixes #39590 Change-Id: Ie3e13f5a2a71bb1b59e03bc5b3a16d8e2e7c01d4 Reviewed-on: https://go-review.googlesource.com/c/go/+/244960 Reviewed-by: Daniel Martí --- src/go/ast/ast.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/go/ast/ast.go b/src/go/ast/ast.go index 81c64589d0..1061f1d3ce 100644 --- a/src/go/ast/ast.go +++ b/src/go/ast/ast.go @@ -285,6 +285,12 @@ type ( } // A BasicLit node represents a literal of basic type. + // + // Note that for the CHAR and STRING kinds, the literal is stored + // with its quotes. For example, for a double-quoted STRING, the + // first and the last rune in the Value field will be ". The + // Unquote and UnquoteChar functions in the strconv package can be + // used to unquote STRING and CHAR values, respectively. BasicLit struct { ValuePos token.Pos // literal position Kind token.Token // token.INT, token.FLOAT, token.IMAG, token.CHAR, or token.STRING -- GitLab From 1a119edd8b4364a8c8342194648166ca5851f061 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Fri, 4 Sep 2020 17:47:44 +0700 Subject: [PATCH 0424/1792] runtime: rotate map key seed on clearing up maps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same thing as CL 253020 did for map clear idiom. name old time/op new time/op delta MapDelete/Int32/100-12 30.0ns ± 1% 30.7ns ± 3% ~ (p=0.400 n=3+3) MapDelete/Int32/1000-12 26.6ns ± 2% 28.1ns ± 3% ~ (p=0.100 n=3+3) MapDelete/Int32/10000-12 28.6ns ± 1% 31.9ns ± 1% ~ (p=0.100 n=3+3) MapDelete/Int64/100-12 30.2ns ± 0% 32.1ns ± 3% ~ (p=0.100 n=3+3) MapDelete/Int64/1000-12 26.5ns ± 1% 27.5ns ± 3% ~ (p=0.100 n=3+3) MapDelete/Int64/10000-12 29.6ns ± 1% 29.3ns ± 1% ~ (p=0.300 n=3+3) MapDelete/Str/100-12 19.5ns ± 3% 19.6ns ± 2% ~ (p=0.800 n=3+3) MapDelete/Str/1000-12 31.6ns ± 1% 31.4ns ± 1% ~ (p=0.500 n=3+3) MapDelete/Str/10000-12 37.8ns ± 1% 37.1ns ± 1% ~ (p=0.100 n=3+3) MapDelete/Pointer/100-12 15.9ns ± 1% 16.8ns ± 9% ~ (p=0.200 n=3+3) MapDelete/Pointer/1000-12 26.9ns ± 1% 26.2ns ± 2% ~ (p=0.200 n=3+3) MapDelete/Pointer/10000-12 30.6ns ± 1% 30.7ns ± 4% ~ (p=0.700 n=3+3) Fixes #25237 Change-Id: I353cf44a2f6158549f0ef563d867f0844fec7095 Reviewed-on: https://go-review.googlesource.com/c/go/+/252940 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke Reviewed-by: Keith Randall --- src/runtime/map.go | 5 +++++ src/runtime/map_fast32.go | 5 +++++ src/runtime/map_fast64.go | 5 +++++ src/runtime/map_faststr.go | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/src/runtime/map.go b/src/runtime/map.go index 22a0241f56..8be1d3991d 100644 --- a/src/runtime/map.go +++ b/src/runtime/map.go @@ -780,6 +780,11 @@ search: } notLast: h.count-- + // Reset the hash seed to make it more difficult for attackers to + // repeatedly trigger hash collisions. See issue 25237. + if h.count == 0 { + h.hash0 = fastrand() + } break search } } diff --git a/src/runtime/map_fast32.go b/src/runtime/map_fast32.go index d035ed0386..d80f5eac78 100644 --- a/src/runtime/map_fast32.go +++ b/src/runtime/map_fast32.go @@ -344,6 +344,11 @@ search: } notLast: h.count-- + // Reset the hash seed to make it more difficult for attackers to + // repeatedly trigger hash collisions. See issue 25237. + if h.count == 0 { + h.hash0 = fastrand() + } break search } } diff --git a/src/runtime/map_fast64.go b/src/runtime/map_fast64.go index f1f3927598..3bc84bbdd3 100644 --- a/src/runtime/map_fast64.go +++ b/src/runtime/map_fast64.go @@ -346,6 +346,11 @@ search: } notLast: h.count-- + // Reset the hash seed to make it more difficult for attackers to + // repeatedly trigger hash collisions. See issue 25237. + if h.count == 0 { + h.hash0 = fastrand() + } break search } } diff --git a/src/runtime/map_faststr.go b/src/runtime/map_faststr.go index 069cda6554..108c502394 100644 --- a/src/runtime/map_faststr.go +++ b/src/runtime/map_faststr.go @@ -369,6 +369,11 @@ search: } notLast: h.count-- + // Reset the hash seed to make it more difficult for attackers to + // repeatedly trigger hash collisions. See issue 25237. + if h.count == 0 { + h.hash0 = fastrand() + } break search } } -- GitLab From 0e19aaabc052f858beed7d174a55d4110c8d66a0 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Thu, 20 Aug 2020 18:39:46 +0800 Subject: [PATCH 0425/1792] cmd/asm: fix the error of checking the post-index offset of VLD[1-4]R instructions of arm64 The post-index offset of VLD[1-4]R instructions is decided by the "size" field not "Q" field, the current assembler uses "Q" fileld to check the correctness of post-index offset which is not correct. This patch fixes it. Fixes #40725 Change-Id: If1cde7f21c6b3ee0e491649eb567700bd1475c84 Reviewed-on: https://go-review.googlesource.com/c/go/+/249757 Reviewed-by: Cherry Zhang --- src/cmd/asm/internal/asm/testdata/arm64.s | 28 +++++++++++-------- .../asm/internal/asm/testdata/arm64error.s | 1 + src/cmd/internal/obj/arm64/asm7.go | 13 +++++++-- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index 5a6db05074..f0c716a2b5 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -359,18 +359,22 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8 VLD4 (R15), [V10.H4, V11.H4, V12.H4, V13.H4] // ea05400c VLD4.P 32(R24), [V31.B8, V0.B8, V1.B8, V2.B8] // 1f03df0c VLD4.P (R13)(R9), [V14.S2, V15.S2, V16.S2, V17.S2] // VLD4.P (R13)(R9*1), [V14.S2,V15.S2,V16.S2,V17.S2] // ae09c90c - VLD1R (R0), [V0.B16] // 00c0404d - VLD1R.P 16(R0), [V0.B16] // 00c0df4d - VLD1R.P (R15)(R1), [V15.H4] // VLD1R.P (R15)(R1*1), [V15.H4] // efc5c10d - VLD2R (R15), [V15.H4, V16.H4] // efc5600d - VLD2R.P 32(R0), [V0.D2, V1.D2] // 00ccff4d - VLD2R.P (R0)(R5), [V31.D1, V0.D1] // VLD2R.P (R0)(R5*1), [V31.D1, V0.D1] // 1fcce50d - VLD3R (RSP), [V31.S2, V0.S2, V1.S2] // ffeb400d - VLD3R.P 24(R15), [V15.H4, V16.H4, V17.H4] // efe5df0d - VLD3R.P (R15)(R6), [V15.H8, V16.H8, V17.H8] // VLD3R.P (R15)(R6*1), [V15.H8, V16.H8, V17.H8] // efe5c64d - VLD4R (R0), [V0.B8, V1.B8, V2.B8, V3.B8] // 00e0600d - VLD4R.P 64(RSP), [V31.S4, V0.S4, V1.S4, V2.S4] // ffebff4d - VLD4R.P (R15)(R9), [V15.H4, V16.H4, V17.H4, V18.H4] // VLD4R.P (R15)(R9*1), [V15.H4, V16.H4, V17.H4, V18.H4] // efe5e90d + VLD1R (R1), [V9.B8] // 29c0400d + VLD1R.P (R1), [V9.B8] // 29c0df0d + VLD1R.P 1(R1), [V2.B8] // 22c0df0d + VLD1R.P 2(R1), [V2.H4] // 22c4df0d + VLD1R (R0), [V0.B16] // 00c0404d + VLD1R.P (R0), [V0.B16] // 00c0df4d + VLD1R.P (R15)(R1), [V15.H4] // VLD1R.P (R15)(R1*1), [V15.H4] // efc5c10d + VLD2R (R15), [V15.H4, V16.H4] // efc5600d + VLD2R.P 16(R0), [V0.D2, V1.D2] // 00ccff4d + VLD2R.P (R0)(R5), [V31.D1, V0.D1] // VLD2R.P (R0)(R5*1), [V31.D1, V0.D1] // 1fcce50d + VLD3R (RSP), [V31.S2, V0.S2, V1.S2] // ffeb400d + VLD3R.P 6(R15), [V15.H4, V16.H4, V17.H4] // efe5df0d + VLD3R.P (R15)(R6), [V15.H8, V16.H8, V17.H8] // VLD3R.P (R15)(R6*1), [V15.H8, V16.H8, V17.H8] // efe5c64d + VLD4R (R0), [V0.B8, V1.B8, V2.B8, V3.B8] // 00e0600d + VLD4R.P 16(RSP), [V31.S4, V0.S4, V1.S4, V2.S4] // ffebff4d + VLD4R.P (R15)(R9), [V15.H4, V16.H4, V17.H4, V18.H4] // VLD4R.P (R15)(R9*1), [V15.H4, V16.H4, V17.H4, V18.H4] // efe5e90d VST1.P [V24.S2], 8(R2) // 58789f0c VST1 [V29.S2, V30.S2], (R29) // bdab000c VST1 [V14.H4, V15.H4, V16.H4], (R27) // 6e67000c diff --git a/src/cmd/asm/internal/asm/testdata/arm64error.s b/src/cmd/asm/internal/asm/testdata/arm64error.s index 0661a474b4..9f377817a9 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64error.s +++ b/src/cmd/asm/internal/asm/testdata/arm64error.s @@ -339,4 +339,5 @@ TEXT errors(SB),$0 MRS ICV_EOIR1_EL1, R3 // ERROR "system register is not readable" MRS PMSWINC_EL0, R3 // ERROR "system register is not readable" MRS OSLAR_EL1, R3 // ERROR "system register is not readable" + VLD3R.P 24(R15), [V15.H4,V16.H4,V17.H4] // ERROR "invalid post-increment offset" RET diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 65f7898332..0b90e31392 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -2898,6 +2898,7 @@ func (c *ctxt7) checkoffset(p *obj.Prog, as obj.As) { } opcode := (list >> 12) & 15 q := (list >> 30) & 1 + size := (list >> 10) & 3 if offset == 0 { return } @@ -2913,8 +2914,16 @@ func (c *ctxt7) checkoffset(p *obj.Prog, as obj.As) { default: c.ctxt.Diag("invalid register numbers in ARM64 register list: %v", p) } - if !(q == 0 && offset == n*8) && !(q == 1 && offset == n*16) { - c.ctxt.Diag("invalid post-increment offset: %v", p) + + switch as { + case AVLD1R, AVLD2R, AVLD3R, AVLD4R: + if offset != n*(1< Date: Mon, 7 Sep 2020 12:14:30 +0700 Subject: [PATCH 0426/1792] cmd/compile: handle ODDD in exprformat Fixes #41247 Change-Id: Iaa9502cc610e2cc64be5dfd91ba3187f86f87cbd Reviewed-on: https://go-review.googlesource.com/c/go/+/252942 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/cmd/compile/internal/gc/fmt.go | 3 ++- test/fixedbugs/issue41247.go | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue41247.go diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go index d6cc9fa4cf..866cd0a714 100644 --- a/src/cmd/compile/internal/gc/fmt.go +++ b/src/cmd/compile/internal/gc/fmt.go @@ -1616,7 +1616,8 @@ func (n *Node) exprfmt(s fmt.State, prec int, mode fmtMode) { } n1.exprfmt(s, nprec, mode) } - + case ODDD: + mode.Fprintf(s, "...") default: mode.Fprintf(s, "", n.Op) } diff --git a/test/fixedbugs/issue41247.go b/test/fixedbugs/issue41247.go new file mode 100644 index 0000000000..2df919c9e6 --- /dev/null +++ b/test/fixedbugs/issue41247.go @@ -0,0 +1,11 @@ +// errorcheck + +// 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 p + +func f() [2]int { + return [...]int{2: 0} // ERROR "cannot use \[\.\.\.\]int literal \(type \[3\]int\)" +} -- GitLab From f98f3b0c306634e850975c5972ceb8519404edae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20M=C3=B6hrmann?= Date: Mon, 7 Sep 2020 20:39:48 +0200 Subject: [PATCH 0427/1792] runtime: remove outdated comment in mkduff.go about usage of STOSQ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I71966cc5def4615d64876165872e5e7f2956b270 Reviewed-on: https://go-review.googlesource.com/c/go/+/253397 Run-TryBot: Martin Möhrmann Reviewed-by: Keith Randall TryBot-Result: Gobot Gobot --- src/runtime/mkduff.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/runtime/mkduff.go b/src/runtime/mkduff.go index 6c7a4cf8dc..8859ed68cc 100644 --- a/src/runtime/mkduff.go +++ b/src/runtime/mkduff.go @@ -83,7 +83,6 @@ func copyAMD64(w io.Writer) { // // This is equivalent to a sequence of MOVSQ but // for some reason that is 3.5x slower than this code. - // The STOSQ in duffzero seem fine, though. fmt.Fprintln(w, "TEXT runtime·duffcopy(SB), NOSPLIT, $0-0") for i := 0; i < 64; i++ { fmt.Fprintln(w, "\tMOVUPS\t(SI), X0") -- GitLab From 565ad134c994b7a831e1bea336fdc64f0aeefc85 Mon Sep 17 00:00:00 2001 From: chainhelen Date: Tue, 8 Sep 2020 03:36:19 +0000 Subject: [PATCH 0428/1792] runtime: make PCDATA_RegMapUnsafe more clear and remove magic number Change-Id: Ibf3ee755c3fbec03a9396840dc92ce148c49d9f7 GitHub-Last-Rev: 945d8aaa136003dc381c6aa48bff9ea7ca2c6991 GitHub-Pull-Request: golang/go#41262 Reviewed-on: https://go-review.googlesource.com/c/go/+/253377 Reviewed-by: Austin Clements Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot --- src/cmd/internal/objabi/funcdata.go | 2 +- src/runtime/debugcall.go | 2 +- src/runtime/preempt.go | 2 +- src/runtime/symtab.go | 3 +++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cmd/internal/objabi/funcdata.go b/src/cmd/internal/objabi/funcdata.go index d5bacb5900..c9480bf2f0 100644 --- a/src/cmd/internal/objabi/funcdata.go +++ b/src/cmd/internal/objabi/funcdata.go @@ -35,7 +35,7 @@ const ( // PCDATA_RegMapIndex values. // // Only if !go115ReduceLiveness. - PCDATA_RegMapUnsafe = -2 // Unsafe for async preemption + PCDATA_RegMapUnsafe = PCDATA_UnsafePointUnsafe // Unsafe for async preemption // PCDATA_UnsafePoint values. PCDATA_UnsafePointSafe = -1 // Safe for async preemption diff --git a/src/runtime/debugcall.go b/src/runtime/debugcall.go index 6c285ec829..b5480c73ae 100644 --- a/src/runtime/debugcall.go +++ b/src/runtime/debugcall.go @@ -87,7 +87,7 @@ func debugCallCheck(pc uintptr) string { pcdata = 0 // in prologue } stkmap := (*stackmap)(funcdata(f, _FUNCDATA_RegPointerMaps)) - if pcdata == -2 || stkmap == nil { + if pcdata == _PCDATA_RegMapUnsafe || stkmap == nil { // Not at a safe point. ret = debugCallUnsafePoint return diff --git a/src/runtime/preempt.go b/src/runtime/preempt.go index 761856576a..17ef2c90d3 100644 --- a/src/runtime/preempt.go +++ b/src/runtime/preempt.go @@ -406,7 +406,7 @@ func isAsyncSafePoint(gp *g, pc, sp, lr uintptr) (bool, uintptr) { var startpc uintptr if !go115ReduceLiveness { smi := pcdatavalue(f, _PCDATA_RegMapIndex, pc, nil) - if smi == -2 { + if smi == _PCDATA_RegMapUnsafe { // Unsafe-point marked by compiler. This includes // atomic sequences (e.g., write barrier) and nosplit // functions (except at calls). diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index ddb5ea82b4..fa8d17035e 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -284,6 +284,9 @@ const ( ) const ( + // Only if !go115ReduceLiveness. + _PCDATA_RegMapUnsafe = _PCDATA_UnsafePointUnsafe // Unsafe for async preemption + // PCDATA_UnsafePoint values. _PCDATA_UnsafePointSafe = -1 // Safe for async preemption _PCDATA_UnsafePointUnsafe = -2 // Unsafe for async preemption -- GitLab From e8f918535e6c9fc7b85a9dadc9e8035a2e1d1fa4 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 26 Aug 2020 18:19:03 -0400 Subject: [PATCH 0429/1792] cmd/link: strip STAB (symbolic debugging) symbols on darwin On darwin, with external linking, the system linker produces STAB (symbolic debugging) symbols in the binary's symbol table. These include paths of the intermediate object files, like /go.o, which changes from run to run, making the build non-reproducible. Since we run dsymutil to produce debug info and combine them back into the binary, we don't need those STAB symbols anymore. Strip them after running dsymutil. If DWARF is not enabled, we don't run dsymutil. We can pass "-Wl,-S" to let the system linker not generate those symbols. While here, also make it more consistent about DWARF combining. Currently we only do DWARF combining on macOS/AMD64, when DWARF is enabled. On ARM64, we run dsymutil, but then throw the result away. This CL changes it to not run dsymutil (and strip) on ARM64. TODO: add a test. We don't do it here as it fails on some (non-darwin) platforms. Fixes #40979. Change-Id: If770f7828cdb858857d6079e0585bf067f8f7a92 Reviewed-on: https://go-review.googlesource.com/c/go/+/250944 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/lib.go | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 702c902142..54ac109b20 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1238,6 +1238,10 @@ func (ctxt *Link) hostlink() { } } + // On darwin, whether to combine DWARF into executable. + // Only macOS supports unmapped segments such as our __DWARF segment. + combineDwarf := ctxt.IsDarwin() && !*FlagS && !*FlagW && !debug_s && machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() + switch ctxt.HeadType { case objabi.Hdarwin: if machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() { @@ -1248,6 +1252,9 @@ func (ctxt *Link) hostlink() { if ctxt.DynlinkingGo() && !ctxt.Arch.InFamily(sys.ARM, sys.ARM64) { argv = append(argv, "-Wl,-flat_namespace") } + if !combineDwarf { + argv = append(argv, "-Wl,-S") // suppress STAB (symbolic debugging) symbols + } case objabi.Hopenbsd: argv = append(argv, "-Wl,-nopie") case objabi.Hwindows: @@ -1587,11 +1594,16 @@ func (ctxt *Link) hostlink() { ctxt.Logf("%s", out) } - if !*FlagS && !*FlagW && !debug_s && ctxt.HeadType == objabi.Hdarwin { + if combineDwarf { dsym := filepath.Join(*flagTmpdir, "go.dwarf") if out, err := exec.Command("dsymutil", "-f", *flagOutfile, "-o", dsym).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). + // They contain temporary file paths and make the build not reproducible. + if out, err := exec.Command("strip", "-S", *flagOutfile).CombinedOutput(); err != nil { + Exitf("%s: running strip failed: %v\n%s", os.Args[0], err, out) + } // Skip combining if `dsymutil` didn't generate a file. See #11994. if _, err := os.Stat(dsym); os.IsNotExist(err) { return @@ -1607,15 +1619,12 @@ func (ctxt *Link) hostlink() { if err != nil { Exitf("%s: parsing Mach-O header failed: %v", os.Args[0], err) } - // Only macOS supports unmapped segments such as our __DWARF segment. - if machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() { - if err := machoCombineDwarf(ctxt, exef, exem, dsym, combinedOutput); err != nil { - Exitf("%s: combining dwarf failed: %v", os.Args[0], err) - } - os.Remove(*flagOutfile) - if err := os.Rename(combinedOutput, *flagOutfile); err != nil { - Exitf("%s: %v", os.Args[0], err) - } + if err := machoCombineDwarf(ctxt, exef, exem, dsym, combinedOutput); err != nil { + Exitf("%s: combining dwarf failed: %v", os.Args[0], err) + } + os.Remove(*flagOutfile) + if err := os.Rename(combinedOutput, *flagOutfile); err != nil { + Exitf("%s: %v", os.Args[0], err) } } } -- GitLab From ae3680b30b81162da3ae0ea248eea502e8ca2195 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 4 Sep 2020 13:01:08 -0400 Subject: [PATCH 0430/1792] cmd/link: rewrite some code without using reflection In Mach-O DWARF combining, some code was written using reflection, so it could support both 32-bit and 64-bit Mach-O files without duplicating code. We no longer support 32-bit darwin platforms now. 32-bit support can go. Rewrite it with direct field access, for 64-bit only. Change-Id: If1338c3cd37cecf603f4df0c6eb0c890eaebfe5f Reviewed-on: https://go-review.googlesource.com/c/go/+/253557 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- .../link/internal/ld/macho_combine_dwarf.go | 95 ++++++++----------- 1 file changed, 38 insertions(+), 57 deletions(-) diff --git a/src/cmd/link/internal/ld/macho_combine_dwarf.go b/src/cmd/link/internal/ld/macho_combine_dwarf.go index 9d9f916b8e..e43aeb1eb7 100644 --- a/src/cmd/link/internal/ld/macho_combine_dwarf.go +++ b/src/cmd/link/internal/ld/macho_combine_dwarf.go @@ -217,9 +217,9 @@ func machoCombineDwarf(ctxt *Link, exef *os.File, exem *macho.File, dsym, outexe linkoffset := uint64(linkstart) - linkseg.Offset switch cmd.Cmd { case macho.LoadCmdSegment64: - err = machoUpdateSegment(reader, linkseg, linkoffset, &macho.Segment64{}, &macho.Section64{}) + err = machoUpdateSegment(reader, linkseg, linkoffset) case macho.LoadCmdSegment: - err = machoUpdateSegment(reader, linkseg, linkoffset, &macho.Segment32{}, &macho.Section32{}) + panic("unexpected 32-bit segment") case LC_DYLD_INFO, LC_DYLD_INFO_ONLY: err = machoUpdateLoadCommand(reader, linkseg, linkoffset, &dyldInfoCmd{}, "RebaseOff", "BindOff", "WeakBindOff", "LazyBindOff", "ExportOff") case macho.LoadCmdSymtab: @@ -313,70 +313,56 @@ func machoCompressSection(sectBytes []byte) (compressed bool, contents []byte, e // machoUpdateSegment updates the load command for a moved segment. // Only the linkedit segment should move, and it should have 0 sections. -// seg should be a macho.Segment32 or macho.Segment64 as appropriate. -// sect should be a macho.Section32 or macho.Section64 as appropriate. -func machoUpdateSegment(r loadCmdReader, linkseg *macho.Segment, linkoffset uint64, seg, sect interface{}) error { - if err := r.ReadAt(0, seg); err != nil { +func machoUpdateSegment(r loadCmdReader, linkseg *macho.Segment, linkoffset uint64) error { + var seg macho.Segment64 + if err := r.ReadAt(0, &seg); err != nil { return err } - segValue := reflect.ValueOf(seg) - offset := reflect.Indirect(segValue).FieldByName("Offset") // Only the linkedit segment moved, anything before that is fine. - if offset.Uint() < linkseg.Offset { + if seg.Offset < linkseg.Offset { return nil } - offset.SetUint(offset.Uint() + linkoffset) - if err := r.WriteAt(0, seg); err != nil { + seg.Offset += linkoffset + if err := r.WriteAt(0, &seg); err != nil { return err } // There shouldn't be any sections, but just to make sure... - return machoUpdateSections(r, segValue, reflect.ValueOf(sect), linkoffset, nil) + return machoUpdateSections(r, &seg, linkoffset, nil) } -func machoUpdateSections(r loadCmdReader, seg, sect reflect.Value, deltaOffset uint64, compressedSects []*macho.Section) error { - iseg := reflect.Indirect(seg) - nsect := iseg.FieldByName("Nsect").Uint() +func machoUpdateSections(r loadCmdReader, seg *macho.Segment64, deltaOffset uint64, compressedSects []*macho.Section) error { + nsect := seg.Nsect if nsect == 0 { return nil } - sectOffset := int64(iseg.Type().Size()) - - isect := reflect.Indirect(sect) - offsetField := isect.FieldByName("Offset") - reloffField := isect.FieldByName("Reloff") - addrField := isect.FieldByName("Addr") - nameField := isect.FieldByName("Name") - sizeField := isect.FieldByName("Size") - sectSize := int64(isect.Type().Size()) - for i := uint64(0); i < nsect; i++ { - if err := r.ReadAt(sectOffset, sect.Interface()); err != nil { + sectOffset := int64(unsafe.Sizeof(*seg)) + + var sect macho.Section64 + sectSize := int64(unsafe.Sizeof(sect)) + for i := uint32(0); i < nsect; i++ { + if err := r.ReadAt(sectOffset, §); err != nil { return err } if compressedSects != nil { cSect := compressedSects[i] - var name [16]byte - copy(name[:], []byte(cSect.Name)) - nameField.Set(reflect.ValueOf(name)) - sizeField.SetUint(cSect.Size) + copy(sect.Name[:], cSect.Name) + sect.Size = cSect.Size if cSect.Offset != 0 { - offsetField.SetUint(uint64(cSect.Offset) + deltaOffset) + sect.Offset = cSect.Offset + uint32(deltaOffset) } if cSect.Addr != 0 { - addrField.SetUint(cSect.Addr) + sect.Addr = cSect.Addr } } else { - if offsetField.Uint() != 0 { - offsetField.SetUint(offsetField.Uint() + deltaOffset) - } - if reloffField.Uint() != 0 { - reloffField.SetUint(reloffField.Uint() + deltaOffset) + if sect.Offset != 0 { + sect.Offset += uint32(deltaOffset) } - if addrField.Uint() != 0 { - addrField.SetUint(addrField.Uint()) + if sect.Reloff != 0 { + sect.Reloff += uint32(deltaOffset) } } - if err := r.WriteAt(sectOffset, sect.Interface()); err != nil { + if err := r.WriteAt(sectOffset, §); err != nil { return err } sectOffset += sectSize @@ -386,32 +372,27 @@ func machoUpdateSections(r loadCmdReader, seg, sect reflect.Value, deltaOffset u // machoUpdateDwarfHeader updates the DWARF segment load command. func machoUpdateDwarfHeader(r *loadCmdReader, compressedSects []*macho.Section, dwarfsize uint64, dwarfstart int64, realdwarf *macho.Segment) error { - var seg, sect interface{} cmd, err := r.Next() if err != nil { return err } - if cmd.Cmd == macho.LoadCmdSegment64 { - seg = new(macho.Segment64) - sect = new(macho.Section64) - } else { - seg = new(macho.Segment32) - sect = new(macho.Section32) + if cmd.Cmd != macho.LoadCmdSegment64 { + panic("not a Segment64") } - if err := r.ReadAt(0, seg); err != nil { + var seg macho.Segment64 + if err := r.ReadAt(0, &seg); err != nil { return err } - segv := reflect.ValueOf(seg).Elem() - segv.FieldByName("Offset").SetUint(uint64(dwarfstart)) + seg.Offset = uint64(dwarfstart) if compressedSects != nil { var segSize uint64 for _, newSect := range compressedSects { segSize += newSect.Size } - segv.FieldByName("Filesz").SetUint(segSize) + seg.Filesz = segSize } else { - segv.FieldByName("Filesz").SetUint(dwarfsize) + seg.Filesz = dwarfsize } // We want the DWARF segment to be considered non-loadable, so @@ -424,14 +405,14 @@ func machoUpdateDwarfHeader(r *loadCmdReader, compressedSects []*macho.Section, // in ImageLoaderMachO.cpp (various versions can be found online, see // https://opensource.apple.com/source/dyld/dyld-519.2.2/src/ImageLoaderMachO.cpp.auto.html // as one example). - segv.FieldByName("Addr").SetUint(0) - segv.FieldByName("Memsz").SetUint(0) - segv.FieldByName("Prot").SetUint(0) + seg.Addr = 0 + seg.Memsz = 0 + seg.Prot = 0 - if err := r.WriteAt(0, seg); err != nil { + if err := r.WriteAt(0, &seg); err != nil { return err } - return machoUpdateSections(*r, segv, reflect.ValueOf(sect), uint64(dwarfstart)-realdwarf.Offset, compressedSects) + return machoUpdateSections(*r, &seg, uint64(dwarfstart)-realdwarf.Offset, compressedSects) } func machoUpdateLoadCommand(r loadCmdReader, linkseg *macho.Segment, linkoffset uint64, cmd interface{}, fields ...string) error { -- GitLab From a52a5d8a43ac23c34231e92da3aba61cd8cf7d97 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 3 Sep 2020 17:51:01 -0400 Subject: [PATCH 0431/1792] cmd/link: mark ELF PLT sections executable Change-Id: Ie0316a06c30485f783c2175590d7e9fc4fa3e0cd Reviewed-on: https://go-review.googlesource.com/c/go/+/253021 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 85ce7d8fb7..8324a98a26 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1786,7 +1786,7 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { culprit := ldr.SymName(state.data[sym.STEXT][0]) Errorf(nil, "dodata found an sym.STEXT symbol: %s", culprit) } - state.allocateSingleSymSections(&Segtext, sym.SELFRXSECT, sym.SRODATA, 04) + state.allocateSingleSymSections(&Segtext, sym.SELFRXSECT, sym.SRODATA, 05) state.allocateSingleSymSections(&Segtext, sym.SMACHOPLT, sym.SRODATA, 05) /* read-only data */ -- GitLab From 1e6ad65b43ee392676a69f769b1942edd8af0e86 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 4 Sep 2020 14:35:57 -0400 Subject: [PATCH 0432/1792] cmd/link: enable DWARF combining on macOS ARM64 It appears the machoCalcStart function is meant to align the segment, but it doesn't. Replace it with an actual alignment calculation. Also, use the alignment from the configuration, instead of hardcode. With this fix we could enable DWARF combining on macOS ARM64. Change-Id: I19ec771b77d752b83a54c53b6ee65af78a31b8ae Reviewed-on: https://go-review.googlesource.com/c/go/+/253558 Reviewed-by: Than McIntosh --- src/cmd/link/internal/arm64/obj.go | 2 +- src/cmd/link/internal/ld/lib.go | 4 ++-- src/cmd/link/internal/ld/macho_combine_dwarf.go | 17 ++--------------- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 37b72b6c37..a980cfee52 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -105,7 +105,7 @@ func archinit(ctxt *ld.Link) { *ld.FlagTextAddr = 4096 + int64(ld.HEADR) } if *ld.FlagRound == -1 { - *ld.FlagRound = 4096 + *ld.FlagRound = 16384 // 16K page alignment } } } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 54ac109b20..4295b2a660 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1240,11 +1240,11 @@ func (ctxt *Link) hostlink() { // On darwin, whether to combine DWARF into executable. // Only macOS supports unmapped segments such as our __DWARF segment. - combineDwarf := ctxt.IsDarwin() && !*FlagS && !*FlagW && !debug_s && machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() + combineDwarf := ctxt.IsDarwin() && !*FlagS && !*FlagW && !debug_s && machoPlatform == PLATFORM_MACOS switch ctxt.HeadType { case objabi.Hdarwin: - if machoPlatform == PLATFORM_MACOS && ctxt.IsAMD64() { + if combineDwarf { // Leave room for DWARF combining. // -headerpad is incompatible with -fembed-bitcode. argv = append(argv, "-Wl,-headerpad,1144") diff --git a/src/cmd/link/internal/ld/macho_combine_dwarf.go b/src/cmd/link/internal/ld/macho_combine_dwarf.go index e43aeb1eb7..77ee8a4d62 100644 --- a/src/cmd/link/internal/ld/macho_combine_dwarf.go +++ b/src/cmd/link/internal/ld/macho_combine_dwarf.go @@ -16,10 +16,6 @@ import ( "unsafe" ) -const ( - pageAlign = 12 // 4096 = 1 << 12 -) - type loadCmd struct { Cmd macho.LoadCmd Len uint32 @@ -138,7 +134,7 @@ func machoCombineDwarf(ctxt *Link, exef *os.File, exem *macho.File, dsym, outexe // Now copy the dwarf data into the output. // Kernel requires all loaded segments to be page-aligned in the file, // even though we mark this one as being 0 bytes of virtual address space. - dwarfstart := machoCalcStart(realdwarf.Offset, linkseg.Offset, pageAlign) + dwarfstart := Rnd(int64(linkseg.Offset), int64(*FlagRound)) if _, err := outf.Seek(dwarfstart, 0); err != nil { return err } @@ -166,7 +162,7 @@ func machoCombineDwarf(ctxt *Link, exef *os.File, exem *macho.File, dsym, outexe if _, err := exef.Seek(int64(linkseg.Offset), 0); err != nil { return err } - linkstart := machoCalcStart(linkseg.Offset, uint64(dwarfstart)+dwarfsize, pageAlign) + linkstart := Rnd(dwarfstart+int64(dwarfsize), int64(*FlagRound)) if _, err := outf.Seek(linkstart, 0); err != nil { return err } @@ -432,12 +428,3 @@ func machoUpdateLoadCommand(r loadCmdReader, linkseg *macho.Segment, linkoffset } return nil } - -func machoCalcStart(origAddr, newAddr uint64, alignExp uint32) int64 { - align := uint64(1 << alignExp) - origMod, newMod := origAddr%align, newAddr%align - if origMod == newMod { - return int64(newAddr) - } - return int64(newAddr + align + origMod - newMod) -} -- GitLab From bdb480fd623e58d0d1d0689a3755367379ea57bc Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Tue, 8 Sep 2020 15:28:43 +0700 Subject: [PATCH 0433/1792] cmd/compile: fix mishandling of unsafe-uintptr arguments in go/defer Currently, the statement: go g(uintptr(f())) gets rewritten into: tmp := f() newproc(8, g, uintptr(tmp)) runtime.KeepAlive(tmp) which doesn't guarantee that tmp is still alive by time the g call is scheduled to run. This CL fixes the issue, by wrapping g call in a closure: go func(p unsafe.Pointer) { g(uintptr(p)) }(f()) then this will be rewritten into: tmp := f() go func(p unsafe.Pointer) { g(uintptr(p)) runtime.KeepAlive(p) }(tmp) runtime.KeepAlive(tmp) // superfluous, but harmless So the unsafe.Pointer p will be kept alive at the time g call runs. Updates #24491 Change-Id: Ic10821251cbb1b0073daec92b82a866c6ebaf567 Reviewed-on: https://go-review.googlesource.com/c/go/+/253457 Run-TryBot: Cuong Manh Le Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/order.go | 1 + src/cmd/compile/internal/gc/syntax.go | 41 +++++++++++++------- src/cmd/compile/internal/gc/walk.go | 54 +++++++++++++++++++++------ test/fixedbugs/issue24491.go | 45 ++++++++++++++++++++++ 4 files changed, 117 insertions(+), 24 deletions(-) create mode 100644 test/fixedbugs/issue24491.go diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index aa91160e5c..412f073a8d 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -502,6 +502,7 @@ func (o *Order) call(n *Node) { x := o.copyExpr(arg.Left, arg.Left.Type, false) x.Name.SetKeepalive(true) arg.Left = x + n.SetNeedsWrapper(true) } } diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index 47e5e59156..5580f789c5 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -141,19 +141,20 @@ const ( nodeInitorder, _ // tracks state during init1; two bits _, _ // second nodeInitorder bit _, nodeHasBreak - _, nodeNoInline // used internally by inliner to indicate that a function call should not be inlined; set for OCALLFUNC and OCALLMETH only - _, nodeImplicit // implicit OADDR or ODEREF; ++/-- statement represented as OASOP; or ANDNOT lowered to OAND - _, nodeIsDDD // is the argument variadic - _, nodeDiag // already printed error about this - _, nodeColas // OAS resulting from := - _, nodeNonNil // guaranteed to be non-nil - _, nodeTransient // storage can be reused immediately after this statement - _, nodeBounded // bounds check unnecessary - _, nodeHasCall // expression contains a function call - _, nodeLikely // if statement condition likely - _, nodeHasVal // node.E contains a Val - _, nodeHasOpt // node.E contains an Opt - _, nodeEmbedded // ODCLFIELD embedded type + _, nodeNoInline // used internally by inliner to indicate that a function call should not be inlined; set for OCALLFUNC and OCALLMETH only + _, nodeImplicit // implicit OADDR or ODEREF; ++/-- statement represented as OASOP; or ANDNOT lowered to OAND + _, nodeIsDDD // is the argument variadic + _, nodeDiag // already printed error about this + _, nodeColas // OAS resulting from := + _, nodeNonNil // guaranteed to be non-nil + _, nodeTransient // storage can be reused immediately after this statement + _, nodeBounded // bounds check unnecessary + _, nodeHasCall // expression contains a function call + _, nodeLikely // if statement condition likely + _, nodeHasVal // node.E contains a Val + _, nodeHasOpt // node.E contains an Opt + _, nodeEmbedded // ODCLFIELD embedded type + _, nodeNeedsWrapper // OCALLxxx node that needs to be wrapped ) func (n *Node) Class() Class { return Class(n.flags.get3(nodeClass)) } @@ -286,6 +287,20 @@ func (n *Node) SetIota(x int64) { n.Xoffset = x } +func (n *Node) NeedsWrapper() bool { + return n.flags&nodeNeedsWrapper != 0 +} + +// SetNeedsWrapper indicates that OCALLxxx node needs to be wrapped by a closure. +func (n *Node) SetNeedsWrapper(b bool) { + switch n.Op { + case OCALLFUNC, OCALLMETH, OCALLINTER: + default: + Fatalf("Node.SetNeedsWrapper %v", n.Op) + } + n.flags.set(nodeNeedsWrapper, b) +} + // mayBeShared reports whether n may occur in multiple places in the AST. // Extra care must be taken when mutating such a node. func (n *Node) mayBeShared() bool { diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 0158af8700..ab7f857031 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -232,7 +232,11 @@ func walkstmt(n *Node) *Node { n.Left = copyany(n.Left, &n.Ninit, true) default: - n.Left = walkexpr(n.Left, &n.Ninit) + if n.Left.NeedsWrapper() { + n.Left = wrapCall(n.Left, &n.Ninit) + } else { + n.Left = walkexpr(n.Left, &n.Ninit) + } } case OFOR, OFORUNTIL: @@ -3857,6 +3861,14 @@ func candiscard(n *Node) bool { // builtin(a1, a2, a3) // }(x, y, z) // for print, println, and delete. +// +// Rewrite +// go f(x, y, uintptr(unsafe.Pointer(z))) +// into +// go func(a1, a2, a3) { +// builtin(a1, a2, uintptr(a3)) +// }(x, y, unsafe.Pointer(z)) +// for function contains unsafe-uintptr arguments. var wrapCall_prgen int @@ -3868,9 +3880,17 @@ func wrapCall(n *Node, init *Nodes) *Node { init.AppendNodes(&n.Ninit) } + isBuiltinCall := n.Op != OCALLFUNC && n.Op != OCALLMETH && n.Op != OCALLINTER + // origArgs keeps track of what argument is uintptr-unsafe/unsafe-uintptr conversion. + origArgs := make([]*Node, n.List.Len()) t := nod(OTFUNC, nil, nil) for i, arg := range n.List.Slice() { s := lookupN("a", i) + if !isBuiltinCall && arg.Op == OCONVNOP && arg.Type.Etype == TUINTPTR && arg.Left.Type.Etype == TUNSAFEPTR { + origArgs[i] = arg + arg = arg.Left + n.List.SetIndex(i, arg) + } t.List.Append(symfield(s, arg.Type)) } @@ -3878,10 +3898,22 @@ func wrapCall(n *Node, init *Nodes) *Node { sym := lookupN("wrap·", wrapCall_prgen) fn := dclfunc(sym, t) - a := nod(n.Op, nil, nil) - a.List.Set(paramNnames(t.Type)) - a = typecheck(a, ctxStmt) - fn.Nbody.Set1(a) + args := paramNnames(t.Type) + for i, origArg := range origArgs { + if origArg == nil { + continue + } + arg := nod(origArg.Op, args[i], nil) + arg.Type = origArg.Type + args[i] = arg + } + call := nod(n.Op, nil, nil) + if !isBuiltinCall { + call.Op = OCALL + call.Left = n.Left + } + call.List.Set(args) + fn.Nbody.Set1(call) funcbody() @@ -3889,12 +3921,12 @@ func wrapCall(n *Node, init *Nodes) *Node { typecheckslice(fn.Nbody.Slice(), ctxStmt) xtop = append(xtop, fn) - a = nod(OCALL, nil, nil) - a.Left = fn.Func.Nname - a.List.Set(n.List.Slice()) - a = typecheck(a, ctxStmt) - a = walkexpr(a, init) - return a + call = nod(OCALL, nil, nil) + call.Left = fn.Func.Nname + call.List.Set(n.List.Slice()) + call = typecheck(call, ctxStmt) + call = walkexpr(call, init) + return call } // substArgTypes substitutes the given list of types for diff --git a/test/fixedbugs/issue24491.go b/test/fixedbugs/issue24491.go new file mode 100644 index 0000000000..4703368793 --- /dev/null +++ b/test/fixedbugs/issue24491.go @@ -0,0 +1,45 @@ +// run + +// 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 test makes sure unsafe-uintptr arguments are handled correctly. + +package main + +import ( + "runtime" + "unsafe" +) + +var done = make(chan bool, 1) + +func setup() unsafe.Pointer { + s := "ok" + runtime.SetFinalizer(&s, func(p *string) { *p = "FAIL" }) + return unsafe.Pointer(&s) +} + +//go:noinline +//go:uintptrescapes +func test(s string, p uintptr) { + runtime.GC() + if *(*string)(unsafe.Pointer(p)) != "ok" { + panic(s + " return unexpected result") + } + done <- true +} + +func main() { + test("normal", uintptr(setup())) + <-done + + go test("go", uintptr(setup())) + <-done + + func() { + defer test("defer", uintptr(setup())) + }() + <-done +} -- GitLab From 9cf88333e8255155be4e136c572883bb5ad546bd Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 9 Sep 2020 12:06:18 +0700 Subject: [PATCH 0434/1792] cmd/compile: consistently use Type.IsUnsafePtr() Passes toolstash-check. Change-Id: Iaeae7cc20e26af733642c7c8c7ca0a059e5b07b2 Reviewed-on: https://go-review.googlesource.com/c/go/+/253657 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/escape.go | 6 +++--- src/cmd/compile/internal/gc/ssa.go | 2 +- src/cmd/compile/internal/gc/subr.go | 4 ++-- src/cmd/compile/internal/gc/walk.go | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/cmd/compile/internal/gc/escape.go b/src/cmd/compile/internal/gc/escape.go index d5cca4a38b..dc469e276c 100644 --- a/src/cmd/compile/internal/gc/escape.go +++ b/src/cmd/compile/internal/gc/escape.go @@ -485,7 +485,7 @@ func (e *Escape) exprSkipInit(k EscHole, n *Node) { e.discard(max) case OCONV, OCONVNOP: - if checkPtr(e.curfn, 2) && n.Type.Etype == TUNSAFEPTR && n.Left.Type.IsPtr() { + if checkPtr(e.curfn, 2) && n.Type.IsUnsafePtr() && n.Left.Type.IsPtr() { // When -d=checkptr=2 is enabled, treat // conversions to unsafe.Pointer as an // escaping operation. This allows better @@ -493,7 +493,7 @@ func (e *Escape) exprSkipInit(k EscHole, n *Node) { // easily detect object boundaries on the heap // than the stack. e.assignHeap(n.Left, "conversion to unsafe.Pointer", n) - } else if n.Type.Etype == TUNSAFEPTR && n.Left.Type.Etype == TUINTPTR { + } else if n.Type.IsUnsafePtr() && n.Left.Type.Etype == TUINTPTR { e.unsafeValue(k, n.Left) } else { e.expr(k, n.Left) @@ -625,7 +625,7 @@ func (e *Escape) unsafeValue(k EscHole, n *Node) { switch n.Op { case OCONV, OCONVNOP: - if n.Left.Type.Etype == TUNSAFEPTR { + if n.Left.Type.IsUnsafePtr() { e.expr(k, n.Left) } else { e.discard(n.Left) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 52083d999e..89644cd3f2 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -2113,7 +2113,7 @@ func (s *state) expr(n *Node) *ssa.Value { } // unsafe.Pointer <--> *T - if to.Etype == TUNSAFEPTR && from.IsPtrShaped() || from.Etype == TUNSAFEPTR && to.IsPtrShaped() { + if to.IsUnsafePtr() && from.IsPtrShaped() || from.IsUnsafePtr() && to.IsPtrShaped() { return v } diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 8fa3fca50f..6d0a40c287 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -781,12 +781,12 @@ func convertop(srcConstant bool, src, dst *types.Type, why *string) Op { } // 8. src is a pointer or uintptr and dst is unsafe.Pointer. - if (src.IsPtr() || src.Etype == TUINTPTR) && dst.Etype == TUNSAFEPTR { + if (src.IsPtr() || src.Etype == TUINTPTR) && dst.IsUnsafePtr() { return OCONVNOP } // 9. src is unsafe.Pointer and dst is a pointer or uintptr. - if src.Etype == TUNSAFEPTR && (dst.IsPtr() || dst.Etype == TUINTPTR) { + if src.IsUnsafePtr() && (dst.IsPtr() || dst.Etype == TUINTPTR) { return OCONVNOP } diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index ab7f857031..a9fefb3ddd 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -958,11 +958,11 @@ opswitch: case OCONV, OCONVNOP: n.Left = walkexpr(n.Left, init) if n.Op == OCONVNOP && checkPtr(Curfn, 1) { - if n.Type.IsPtr() && n.Left.Type.Etype == TUNSAFEPTR { // unsafe.Pointer to *T + if n.Type.IsPtr() && n.Left.Type.IsUnsafePtr() { // unsafe.Pointer to *T n = walkCheckPtrAlignment(n, init, nil) break } - if n.Type.Etype == TUNSAFEPTR && n.Left.Type.Etype == TUINTPTR { // uintptr to unsafe.Pointer + if n.Type.IsUnsafePtr() && n.Left.Type.Etype == TUINTPTR { // uintptr to unsafe.Pointer n = walkCheckPtrArithmetic(n, init) break } @@ -1127,7 +1127,7 @@ opswitch: n.List.SetSecond(walkexpr(n.List.Second(), init)) case OSLICE, OSLICEARR, OSLICESTR, OSLICE3, OSLICE3ARR: - checkSlice := checkPtr(Curfn, 1) && n.Op == OSLICE3ARR && n.Left.Op == OCONVNOP && n.Left.Left.Type.Etype == TUNSAFEPTR + checkSlice := checkPtr(Curfn, 1) && n.Op == OSLICE3ARR && n.Left.Op == OCONVNOP && n.Left.Left.Type.IsUnsafePtr() if checkSlice { n.Left.Left = walkexpr(n.Left.Left, init) } else { @@ -3886,7 +3886,7 @@ func wrapCall(n *Node, init *Nodes) *Node { t := nod(OTFUNC, nil, nil) for i, arg := range n.List.Slice() { s := lookupN("a", i) - if !isBuiltinCall && arg.Op == OCONVNOP && arg.Type.Etype == TUINTPTR && arg.Left.Type.Etype == TUNSAFEPTR { + if !isBuiltinCall && arg.Op == OCONVNOP && arg.Type.Etype == TUINTPTR && arg.Left.Type.IsUnsafePtr() { origArgs[i] = arg arg = arg.Left n.List.SetIndex(i, arg) @@ -4041,7 +4041,7 @@ func walkCheckPtrArithmetic(n *Node, init *Nodes) *Node { walk(n.Left) } case OCONVNOP: - if n.Left.Type.Etype == TUNSAFEPTR { + if n.Left.Type.IsUnsafePtr() { n.Left = cheapexpr(n.Left, init) originals = append(originals, convnop(n.Left, types.Types[TUNSAFEPTR])) } -- GitLab From 518369601ca2499cea68af86451f17d2856895f8 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 9 Sep 2020 12:09:26 +0700 Subject: [PATCH 0435/1792] cmd/compile: add Type.IsUintptr() to detect type is an uintptr Passes toolstash-check. Change-Id: I7051d45eafbfd4dea73a3d4b5ea6cff39d76cbc1 Reviewed-on: https://go-review.googlesource.com/c/go/+/253658 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/esc.go | 6 +++--- src/cmd/compile/internal/gc/escape.go | 2 +- src/cmd/compile/internal/gc/subr.go | 4 ++-- src/cmd/compile/internal/gc/walk.go | 4 ++-- src/cmd/compile/internal/types/type.go | 5 +++++ 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 4b843aba35..375331d1f5 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -377,7 +377,7 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string { // This really doesn't have much to do with escape analysis per se, // but we are reusing the ability to annotate an individual function // argument and pass those annotations along to importing code. - if f.Type.Etype == TUINTPTR { + if f.Type.IsUintptr() { if Debug['m'] != 0 { Warnl(f.Pos, "assuming %v is unsafe uintptr", name()) } @@ -407,13 +407,13 @@ func (e *Escape) paramTag(fn *Node, narg int, f *types.Field) string { } if fn.Func.Pragma&UintptrEscapes != 0 { - if f.Type.Etype == TUINTPTR { + if f.Type.IsUintptr() { if Debug['m'] != 0 { Warnl(f.Pos, "marking %v as escaping uintptr", name()) } return uintptrEscapesTag } - if f.IsDDD() && f.Type.Elem().Etype == TUINTPTR { + if f.IsDDD() && f.Type.Elem().IsUintptr() { // final argument is ...uintptr. if Debug['m'] != 0 { Warnl(f.Pos, "marking %v as escaping ...uintptr", name()) diff --git a/src/cmd/compile/internal/gc/escape.go b/src/cmd/compile/internal/gc/escape.go index dc469e276c..75da439bb7 100644 --- a/src/cmd/compile/internal/gc/escape.go +++ b/src/cmd/compile/internal/gc/escape.go @@ -493,7 +493,7 @@ func (e *Escape) exprSkipInit(k EscHole, n *Node) { // easily detect object boundaries on the heap // than the stack. e.assignHeap(n.Left, "conversion to unsafe.Pointer", n) - } else if n.Type.IsUnsafePtr() && n.Left.Type.Etype == TUINTPTR { + } else if n.Type.IsUnsafePtr() && n.Left.Type.IsUintptr() { e.unsafeValue(k, n.Left) } else { e.expr(k, n.Left) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 6d0a40c287..d3ba53ff0c 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -781,12 +781,12 @@ func convertop(srcConstant bool, src, dst *types.Type, why *string) Op { } // 8. src is a pointer or uintptr and dst is unsafe.Pointer. - if (src.IsPtr() || src.Etype == TUINTPTR) && dst.IsUnsafePtr() { + if (src.IsPtr() || src.IsUintptr()) && dst.IsUnsafePtr() { return OCONVNOP } // 9. src is unsafe.Pointer and dst is a pointer or uintptr. - if src.IsUnsafePtr() && (dst.IsPtr() || dst.Etype == TUINTPTR) { + if src.IsUnsafePtr() && (dst.IsPtr() || dst.IsUintptr()) { return OCONVNOP } diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index a9fefb3ddd..361de7e0f3 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -962,7 +962,7 @@ opswitch: n = walkCheckPtrAlignment(n, init, nil) break } - if n.Type.IsUnsafePtr() && n.Left.Type.Etype == TUINTPTR { // uintptr to unsafe.Pointer + if n.Type.IsUnsafePtr() && n.Left.Type.IsUintptr() { // uintptr to unsafe.Pointer n = walkCheckPtrArithmetic(n, init) break } @@ -3886,7 +3886,7 @@ func wrapCall(n *Node, init *Nodes) *Node { t := nod(OTFUNC, nil, nil) for i, arg := range n.List.Slice() { s := lookupN("a", i) - if !isBuiltinCall && arg.Op == OCONVNOP && arg.Type.Etype == TUINTPTR && arg.Left.Type.IsUnsafePtr() { + if !isBuiltinCall && arg.Op == OCONVNOP && arg.Type.IsUintptr() && arg.Left.Type.IsUnsafePtr() { origArgs[i] = arg arg = arg.Left n.List.SetIndex(i, arg) diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go index e4b3d885d9..a777a5fd90 100644 --- a/src/cmd/compile/internal/types/type.go +++ b/src/cmd/compile/internal/types/type.go @@ -1230,6 +1230,11 @@ func (t *Type) IsUnsafePtr() bool { return t.Etype == TUNSAFEPTR } +// IsUintptr reports whether t is an uintptr. +func (t *Type) IsUintptr() bool { + return t.Etype == TUINTPTR +} + // IsPtrShaped reports whether t is represented by a single machine pointer. // In addition to regular Go pointer types, this includes map, channel, and // function types and unsafe.Pointer. It does not include array or struct types -- GitLab From bdad4285709d1c5e04458268880775087be63027 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 28 Aug 2020 15:05:44 -0400 Subject: [PATCH 0436/1792] cmd/go: make 'go get' preserve sums for content of new requirements This preserves zip sums when 'go get' is run on a module that does not have a package in the root directory. The zip must be fetched to determine whether the package should be loaded, so we already load and verify the sum. Note that 'go mod tidy' may still remove these sums, since they aren't needed to load packages. Fixes #41103 Change-Id: I78f10a25f0392461fdc98518a7c92a38ee3233c3 Reviewed-on: https://go-review.googlesource.com/c/go/+/251880 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/init.go | 38 ++++++++++++++----- .../go/testdata/script/mod_get_sum_noroot.txt | 11 ++++++ 2 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_get_sum_noroot.txt diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 6f93b88eab..8e8fb9e6a1 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -862,14 +862,11 @@ func WriteGoMod() { } } - // Always update go.sum, even if we didn't change go.mod: we may have - // downloaded modules that we didn't have before. - modfetch.WriteGoSum(keepSums()) - if !dirty && cfg.CmdName != "mod tidy" { // The go.mod file has the same semantic content that it had before // (but not necessarily the same exact bytes). - // Ignore any intervening edits. + // Don't write go.mod, but write go.sum in case we added or trimmed sums. + modfetch.WriteGoSum(keepSums(true)) return } @@ -880,6 +877,9 @@ func WriteGoMod() { defer func() { // At this point we have determined to make the go.mod file on disk equal to new. index = indexModFile(new, modFile, false) + + // Update go.sum after releasing the side lock and refreshing the index. + modfetch.WriteGoSum(keepSums(true)) }() // Make a best-effort attempt to acquire the side lock, only to exclude @@ -920,7 +920,10 @@ func WriteGoMod() { // the last load function like ImportPaths, LoadALL, etc.). It also contains // entries for go.mod files needed for MVS (the version of these entries // ends with "/go.mod"). -func keepSums() map[module.Version]bool { +// +// If addDirect is true, the set also includes sums for modules directly +// required by go.mod, as represented by the index, with replacements applied. +func keepSums(addDirect bool) map[module.Version]bool { // Walk the module graph and keep sums needed by MVS. modkey := func(m module.Version) module.Version { return module.Version{Path: m.Path, Version: m.Version + "/go.mod"} @@ -932,9 +935,6 @@ func keepSums() map[module.Version]bool { walk = func(m module.Version) { // If we build using a replacement module, keep the sum for the replacement, // since that's the code we'll actually use during a build. - // - // TODO(golang.org/issue/29182): Perhaps we should keep both sums, and the - // sums for both sets of transitive requirements. r := Replacement(m) if r.Path == "" { keep[modkey(m)] = true @@ -964,9 +964,27 @@ func keepSums() map[module.Version]bool { } } + // Add entries for modules directly required by go.mod. + if addDirect { + for m := range index.require { + var kept module.Version + if r := Replacement(m); r.Path != "" { + kept = r + } else { + kept = m + } + keep[kept] = true + keep[module.Version{Path: kept.Path, Version: kept.Version + "/go.mod"}] = true + } + } + return keep } func TrimGoSum() { - modfetch.TrimGoSum(keepSums()) + // Don't retain sums for direct requirements in go.mod. When TrimGoSum is + // called, go.mod has not been updated, and it may contain requirements on + // modules deleted from the build list. + addDirect := false + modfetch.TrimGoSum(keepSums(addDirect)) } diff --git a/src/cmd/go/testdata/script/mod_get_sum_noroot.txt b/src/cmd/go/testdata/script/mod_get_sum_noroot.txt new file mode 100644 index 0000000000..0d9a840e77 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_sum_noroot.txt @@ -0,0 +1,11 @@ +# When 'go get' is invoked on a module without a package in the root directory, +# it should add sums for the module's go.mod file and its content to go.sum. +# Verifies golang.org/issue/41103. +go mod init m +go get rsc.io/QUOTE +grep '^rsc.io/QUOTE v1.5.2/go.mod ' go.sum +grep '^rsc.io/QUOTE v1.5.2 ' go.sum + +# Double-check rsc.io/QUOTE does not have a root package. +! go list -mod=readonly rsc.io/QUOTE +stderr '^cannot find module providing package rsc.io/QUOTE: import lookup disabled by -mod=readonly$' -- GitLab From 83ed734df03fd11d71f06bc02906a723afaf3936 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 11 Aug 2020 19:57:50 -0400 Subject: [PATCH 0437/1792] cmd/link: pre-resolve package reference Pre-resolve package index references, so it doesn't need to do a map lookup in every cross-package symbol reference resolution. It increases the memory usage very slightly (O(# imported packages)). Change-Id: Ia76c97ac51f1c2c2d5ea7ae34853850ec69ef0a8 Reviewed-on: https://go-review.googlesource.com/c/go/+/253604 Run-TryBot: Cherry Zhang Reviewed-by: Than McIntosh TryBot-Result: Gobot Gobot --- src/cmd/link/internal/loader/loader.go | 36 ++++++++++++++++---------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go index 8fd10b0848..43a0352e0b 100644 --- a/src/cmd/link/internal/loader/loader.go +++ b/src/cmd/link/internal/loader/loader.go @@ -93,11 +93,12 @@ type oReader struct { version int // version of static symbol flags uint32 // read from object file pkgprefix string - syms []Sym // Sym's global index, indexed by local index - ndef int // cache goobj.Reader.NSym() - nhashed64def int // cache goobj.Reader.NHashed64Def() - nhasheddef int // cache goobj.Reader.NHashedDef() - objidx uint32 // index of this reader in the objs slice + syms []Sym // Sym's global index, indexed by local index + pkg []uint32 // indices of referenced package by PkgIdx (index into loader.objs array) + ndef int // cache goobj.Reader.NSym() + nhashed64def int // cache goobj.Reader.NHashed64Def() + nhasheddef int // cache goobj.Reader.NHashedDef() + objidx uint32 // index of this reader in the objs slice } // Total number of defined symbols (package symbols, hashed symbols, and @@ -219,7 +220,7 @@ type Loader struct { deferReturnTramp map[Sym]bool // whether the symbol is a trampoline of a deferreturn call - objByPkg map[string]*oReader // map package path to its Go object reader + objByPkg map[string]uint32 // map package path to the index of its Go object reader anonVersion int // most recently assigned ext static sym pseudo-version @@ -331,7 +332,7 @@ func NewLoader(flags uint32, elfsetstring elfsetstringFunc, reporter *ErrorRepor objSyms: make([]objSym, 1, 100000), // reserve index 0 for nil symbol 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]*oReader), + objByPkg: make(map[string]uint32), outer: make(map[Sym]Sym), sub: make(map[Sym]Sym), dynimplib: make(map[Sym]string), @@ -370,7 +371,7 @@ func (l *Loader) addObj(pkg string, r *oReader) Sym { } pkg = objabi.PathToPrefix(pkg) // the object file contains escaped package path if _, ok := l.objByPkg[pkg]; !ok { - l.objByPkg[pkg] = r + l.objByPkg[pkg] = r.objidx } i := Sym(len(l.objSyms)) l.start[r] = i @@ -635,12 +636,7 @@ func (l *Loader) resolve(r *oReader, s goobj.SymRef) Sym { case goobj.PkgIdxSelf: rr = r default: - pkg := r.Pkg(int(p)) - var ok bool - rr, ok = l.objByPkg[pkg] - if !ok { - log.Fatalf("reference of nonexisted package %s, from %v", pkg, r.unit.Lib) - } + rr = l.objs[r.pkg[p]].r } return l.toGlobal(rr, s.SymIdx) } @@ -2195,6 +2191,18 @@ func loadObjRefs(l *Loader, r *oReader, arch *sys.Arch) { } } + // referenced packages + npkg := r.NPkg() + r.pkg = make([]uint32, npkg) + for i := 1; i < npkg; i++ { // PkgIdx 0 is a dummy invalid package + pkg := r.Pkg(i) + objidx, ok := l.objByPkg[pkg] + if !ok { + log.Fatalf("reference of nonexisted package %s, from %v", pkg, r.unit.Lib) + } + r.pkg[i] = objidx + } + // load flags of package refs for i, n := 0, r.NRefFlags(); i < n; i++ { rf := r.RefFlags(i) -- GitLab From 9ef3ee339634d1a349e7b9bb4cae32aacc326f61 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 9 Sep 2020 23:47:41 +0700 Subject: [PATCH 0438/1792] cmd/link: remove unnecessary type conversion for nitablinks It's already an uint64. Change-Id: Ic4cdb957aa4f9245c1ea3f946bcb740f116dd04b Reviewed-on: https://go-review.googlesource.com/c/go/+/253679 Run-TryBot: Cuong Manh Le Reviewed-by: Than McIntosh TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/symtab.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index bc880955b8..56363cdaae 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -681,8 +681,8 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind { itablinkSym := ldr.Lookup("runtime.itablink", 0) nitablinks := uint64(ldr.SymSize(itablinkSym)) / uint64(ctxt.Arch.PtrSize) moduledata.AddAddr(ctxt.Arch, itablinkSym) - moduledata.AddUint(ctxt.Arch, uint64(nitablinks)) - moduledata.AddUint(ctxt.Arch, uint64(nitablinks)) + moduledata.AddUint(ctxt.Arch, nitablinks) + moduledata.AddUint(ctxt.Arch, nitablinks) // The ptab slice if ptab := ldr.Lookup("go.plugin.tabs", 0); ptab != 0 && ldr.AttrReachable(ptab) { ldr.SetAttrLocal(ptab, true) -- GitLab From 34835df04891a1d54394888b763af88f9476101d Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 9 Sep 2020 16:52:18 +0000 Subject: [PATCH 0439/1792] runtime: fix ReadMemStatsSlow's and CheckScavengedBits' chunk iteration Both ReadMemStatsSlow and CheckScavengedBits iterate over the page allocator's chunks but don't actually check if they exist. During the development process the chunks index became sparse, so now this was a possibility. If the runtime tests' heap is sparse we might end up segfaulting in either one of these functions, though this will generally be very rare. The pattern here to return nil for a nonexistent chunk is also useful elsewhere, so this change introduces tryChunkOf which won't throw, but might return nil. It also updates the documentation of chunkOf. Fixes #41296. Change-Id: Id5ae0ca3234480de1724fdf2e3677eeedcf76fa0 Reviewed-on: https://go-review.googlesource.com/c/go/+/253777 Run-TryBot: Michael Knyszek Reviewed-by: Keith Randall TryBot-Result: Gobot Gobot --- src/runtime/export_test.go | 17 ++++++++++------- src/runtime/mpagealloc.go | 13 +++++++++++++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 3307000c51..929bb35db6 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -358,7 +358,11 @@ func ReadMemStatsSlow() (base, slow MemStats) { } for i := mheap_.pages.start; i < mheap_.pages.end; i++ { - pg := mheap_.pages.chunkOf(i).scavenged.popcntRange(0, pallocChunkPages) + chunk := mheap_.pages.tryChunkOf(i) + if chunk == nil { + continue + } + pg := chunk.scavenged.popcntRange(0, pallocChunkPages) slow.HeapReleased += uint64(pg) * pageSize } for _, p := range allp { @@ -756,11 +760,7 @@ func (p *PageAlloc) InUse() []AddrRange { // Returns nil if the PallocData's L2 is missing. func (p *PageAlloc) PallocData(i ChunkIdx) *PallocData { ci := chunkIdx(i) - l2 := (*pageAlloc)(p).chunks[ci.l1()] - if l2 == nil { - return nil - } - return (*PallocData)(&l2[ci.l2()]) + return (*PallocData)((*pageAlloc)(p).tryChunkOf(ci)) } // AddrRange represents a range over addresses. @@ -900,7 +900,10 @@ func CheckScavengedBitsCleared(mismatches []BitsMismatch) (n int, ok bool) { lock(&mheap_.lock) chunkLoop: for i := mheap_.pages.start; i < mheap_.pages.end; i++ { - chunk := mheap_.pages.chunkOf(i) + chunk := mheap_.pages.tryChunkOf(i) + if chunk == nil { + continue + } for j := 0; j < pallocChunkPages/64; j++ { // Run over each 64-bit bitmap section and ensure // scavenged is being cleared properly on allocation. diff --git a/src/runtime/mpagealloc.go b/src/runtime/mpagealloc.go index 8b3c62c375..c90a6378bd 100644 --- a/src/runtime/mpagealloc.go +++ b/src/runtime/mpagealloc.go @@ -326,7 +326,20 @@ func (s *pageAlloc) init(mheapLock *mutex, sysStat *uint64) { s.scav.scavLWM = maxSearchAddr } +// tryChunkOf returns the bitmap data for the given chunk. +// +// Returns nil if the chunk data has not been mapped. +func (s *pageAlloc) tryChunkOf(ci chunkIdx) *pallocData { + l2 := s.chunks[ci.l1()] + if l2 == nil { + return nil + } + return &l2[ci.l2()] +} + // chunkOf returns the chunk at the given chunk index. +// +// The chunk index must be valid or this method may throw. func (s *pageAlloc) chunkOf(ci chunkIdx) *pallocData { return &s.chunks[ci.l1()][ci.l2()] } -- GitLab From 2556eb76c8e752907600274d323a52e97418d14f Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 9 Sep 2020 10:40:11 -0700 Subject: [PATCH 0440/1792] runtime: ignore SIGPROF if profiling disable for thread This avoids a deadlock on prof.signalLock between setcpuprofilerate and cpuprof.add if a SIGPROF is delivered to the thread between the call to setThreadCPUProfiler and acquiring prof.signalLock. Fixes #41014 Change-Id: Ie825e8594f93a19fb1a6320ed640f4e631553596 Reviewed-on: https://go-review.googlesource.com/c/go/+/253758 Run-TryBot: Ian Lance Taylor Reviewed-by: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/runtime/proc.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 341d52aea8..739745aa26 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -3928,6 +3928,13 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) { return } + // If mp.profilehz is 0, then profiling is not enabled for this thread. + // We must check this to avoid a deadlock between setcpuprofilerate + // and the call to cpuprof.add, below. + if mp != nil && mp.profilehz == 0 { + return + } + // On mips{,le}, 64bit atomics are emulated with spinlocks, in // runtime/internal/atomic. If SIGPROF arrives while the program is inside // the critical section, it creates a deadlock (when writing the sample). -- GitLab From b96d32bd92087470f85cfab99e289e609a593d03 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 1 Jul 2020 00:45:34 -0400 Subject: [PATCH 0441/1792] cmd/go/internal/modload: track which packages are in 'all' during loading If the user requests the 'all' pattern in addition to explicit roots outside of 'all', we should not load the transitive dependencies of those explicit roots as if they were *in* 'all'. Without the '-test' flag, we should not load test dependencies of any package outside of 'all'. Even *with* the '-test' flag, we should only load test dependencies of the requested roots, not test dependencies of other packages that happen to be imported by those roots. More precise tracking of membership in 'all' will be important when we implement lazy loading, because membership in 'all' determines which module dependencies we will record in the main module's go.mod file. This change also reduces reliance on global state, factors out the loading process into several smaller functions, and sets us up to reuse the 'go mod vendor' version of the 'all' pattern for lazy loading. For #36460 Fixes #40799 Change-Id: I5ca21c86a860daee1316f732cea131a331d8ddf9 Reviewed-on: https://go-review.googlesource.com/c/go/+/240505 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/load.go | 727 ++++++++++++++++------ src/cmd/go/testdata/script/mod_notall.txt | 4 +- 2 files changed, 525 insertions(+), 206 deletions(-) diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 2a37f1d874..64ef60230e 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -4,6 +4,95 @@ package modload +// This file contains the module-mode package loader, as well as some accessory +// functions pertaining to the package import graph. +// +// There are several exported entry points into package loading (such as +// ImportPathsQuiet and LoadALL), but they are all implemented in terms of +// loadFromRoots, which itself manipulates an instance of the loader struct. +// +// Although most of the loading state is maintained in the loader struct, +// one key piece - the build list - is a global, so that it can be modified +// separate from the loading operation, such as during "go get" +// upgrades/downgrades or in "go mod" operations. +// TODO(#40775): It might be nice to make the loader take and return +// a buildList rather than hard-coding use of the global. +// +// Loading is an iterative process. On each iteration, we try to load the +// requested packages and their transitive imports, then try to resolve modules +// for any imported packages that are still missing. +// +// The first step of each iteration identifies a set of “root” packages. +// Normally the root packages are exactly those matching the named pattern +// arguments. However, for the "all" meta-pattern and related functions +// (LoadALL, LoadVendor), the final set of packages is computed from the package +// import graph, and therefore cannot be an initial input to loading that graph. +// Instead, the root packages for the "all" pattern are those contained in the +// main module, and allPatternIsRoot parameter to the loader instructs it to +// dynamically expand those roots to the full "all" pattern as loading +// progresses. +// +// The pkgInAll flag on each loadPkg instance tracks whether that +// package is known to match the "all" meta-pattern. +// A package matches the "all" pattern if: +// - it is in the main module, or +// - it is imported by any test in the main module, or +// - it is imported by another package in "all", or +// - the main module specifies a go version ≤ 1.15, and the package is imported +// by a *test of* another package in "all". +// +// When we implement lazy loading, we will record the modules providing packages +// in "all" even when we are only loading individual packages, so we set the +// pkgInAll flag regardless of the whether the "all" pattern is a root. +// (This is necessary to maintain the “import invariant” described in +// https://golang.org/design/36460-lazy-module-loading.) +// +// Because "go mod vendor" prunes out the tests of vendored packages, the +// behavior of the "all" pattern with -mod=vendor in Go 1.11–1.15 is the same +// as the "all" pattern (regardless of the -mod flag) in 1.16+. +// The allClosesOverTests parameter to the loader indicates whether the "all" +// pattern should close over tests (as in Go 1.11–1.15) or stop at only those +// packages transitively imported by the packages and tests in the main module +// ("all" in Go 1.16+ and "go mod vendor" in Go 1.11+). +// +// Note that it is possible for a loaded package NOT to be in "all" even when we +// are loading the "all" pattern. For example, packages that are transitive +// dependencies of other roots named on the command line must be loaded, but are +// not in "all". (The mod_notall test illustrates this behavior.) +// Similarly, if the LoadTests flag is set but the "all" pattern does not close +// over test dependencies, then when we load the test of a package that is in +// "all" but outside the main module, the dependencies of that test will not +// necessarily themselves be in "all". That configuration does not arise in Go +// 1.11–1.15, but it will be possible with lazy loading in Go 1.16+. +// +// Loading proceeds from the roots, using a parallel work-queue with a limit on +// the amount of active work (to avoid saturating disks, CPU cores, and/or +// network connections). Each package is added to the queue the first time it is +// imported by another package. When we have finished identifying the imports of +// a package, we add the test for that package if it is needed. A test may be +// needed if: +// - the package matches a root pattern and tests of the roots were requested, or +// - the package is in the main module and the "all" pattern is requested +// (because the "all" pattern includes the dependencies of tests in the main +// module), or +// - the package is in "all" and the definition of "all" we are using includes +// dependencies of tests (as is the case in Go ≤1.15). +// +// After all available packages have been loaded, we examine the results to +// identify any requested or imported packages that are still missing, and if +// so, which modules we could add to the module graph in order to make the +// missing packages available. We add those to the module graph and iterate, +// until either all packages resolve successfully or we cannot identify any +// module that would resolve any remaining missing package. +// +// If the main module is “tidy” (that is, if "go mod tidy" is a no-op for it) +// and all requested packages are in "all", then loading completes in a single +// iteration. +// TODO(bcmills): We should also be able to load in a single iteration if the +// requested packages all come from modules that are themselves tidy, regardless +// of whether those packages are in "all". Today, that requires two iterations +// if those packages are not found in existing dependencies of the main module. + import ( "bytes" "context" @@ -14,8 +103,12 @@ import ( "path" pathpkg "path" "path/filepath" + "reflect" + "runtime" "sort" "strings" + "sync" + "sync/atomic" "cmd/go/internal/base" "cmd/go/internal/cfg" @@ -43,10 +136,6 @@ var buildList []module.Version // loaded is the most recently-used package loader. // It holds details about individual packages. -// -// Note that loaded.buildList is only valid during a load operation; -// afterward, it is copied back into the global buildList, -// which should be used instead. var loaded *loader // ImportPaths returns the set of packages matching the args (patterns), @@ -63,7 +152,18 @@ func ImportPaths(ctx context.Context, patterns []string) []*search.Match { // packages. The build tags should typically be imports.Tags() or // imports.AnyTags(); a nil map has no special meaning. func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bool) []*search.Match { - updateMatches := func(matches []*search.Match, iterating bool) { + InitMod(ctx) + + allPatternIsRoot := false + var matches []*search.Match + for _, pattern := range search.CleanPatterns(patterns) { + matches = append(matches, search.NewMatch(pattern)) + if pattern == "all" { + allPatternIsRoot = true + } + } + + updateMatches := func(ld *loader) { for _, m := range matches { switch { case m.IsLocal(): @@ -90,7 +190,7 @@ func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bo // indicates that. ModRoot() - if !iterating { + if ld != nil { m.AddError(err) } continue @@ -103,19 +203,18 @@ func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bo case strings.Contains(m.Pattern(), "..."): m.Errs = m.Errs[:0] - matchPackages(ctx, m, loaded.tags, includeStd, buildList) + matchPackages(ctx, m, tags, includeStd, buildList) case m.Pattern() == "all": - loaded.testAll = true - if iterating { - // Enumerate the packages in the main module. - // We'll load the dependencies as we find them. + if ld == nil { + // The initial roots are the packages in the main module. + // loadFromRoots will expand that to "all". m.Errs = m.Errs[:0] - matchPackages(ctx, m, loaded.tags, omitStd, []module.Version{Target}) + matchPackages(ctx, m, tags, omitStd, []module.Version{Target}) } else { // Starting with the packages in the main module, // enumerate the full list of "all". - m.Pkgs = loaded.computePatternAll(m.Pkgs) + m.Pkgs = ld.computePatternAll() } case m.Pattern() == "std" || m.Pattern() == "cmd": @@ -129,25 +228,22 @@ func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bo } } - InitMod(ctx) - - var matches []*search.Match - for _, pattern := range search.CleanPatterns(patterns) { - matches = append(matches, search.NewMatch(pattern)) - } + loaded = loadFromRoots(loaderParams{ + tags: tags, + allPatternIsRoot: allPatternIsRoot, + allClosesOverTests: true, // until lazy loading in Go 1.16+ - loaded = newLoader(tags) - loaded.load(func() []string { - var roots []string - updateMatches(matches, true) - for _, m := range matches { - roots = append(roots, m.Pkgs...) - } - return roots + listRoots: func() (roots []string) { + updateMatches(nil) + for _, m := range matches { + roots = append(roots, m.Pkgs...) + } + return roots + }, }) // One last pass to finalize wildcards. - updateMatches(matches, false) + updateMatches(loaded) checkMultiplePaths() WriteGoMod() @@ -347,12 +443,14 @@ func ImportFromFiles(ctx context.Context, gofiles []string) { base.Fatalf("go: %v", err) } - loaded = newLoader(tags) - loaded.load(func() []string { - var roots []string - roots = append(roots, imports...) - roots = append(roots, testImports...) - return roots + loaded = loadFromRoots(loaderParams{ + tags: tags, + listRoots: func() (roots []string) { + roots = append(roots, imports...) + roots = append(roots, testImports...) + return roots + }, + allClosesOverTests: true, // until lazy loading. }) WriteGoMod() } @@ -397,9 +495,14 @@ func LoadBuildList(ctx context.Context) []module.Version { return buildList } +// ReloadBuildList resets the state of loaded packages, then loads and returns +// the build list set in SetBuildList. func ReloadBuildList() []module.Version { - loaded = newLoader(imports.Tags()) - loaded.load(func() []string { return nil }) + loaded = loadFromRoots(loaderParams{ + tags: imports.Tags(), + listRoots: func() []string { return nil }, + allClosesOverTests: true, // until lazy loading, but doesn't matter because the root list is empty. + }) return buildList } @@ -410,6 +513,7 @@ func ReloadBuildList() []module.Version { // This set is useful for deciding whether a particular import is needed // anywhere in a module. func LoadALL(ctx context.Context) []string { + InitMod(ctx) return loadAll(ctx, true) } @@ -418,20 +522,18 @@ func LoadALL(ctx context.Context) []string { // ignored completely. // This set is useful for identifying the which packages to include in a vendor directory. func LoadVendor(ctx context.Context) []string { + InitMod(ctx) return loadAll(ctx, false) } -func loadAll(ctx context.Context, testAll bool) []string { - InitMod(ctx) - - loaded = newLoader(imports.AnyTags()) - loaded.isALL = true - loaded.testAll = testAll - if !testAll { - loaded.testRoots = true - } - all := TargetPackages(ctx, "...") - loaded.load(func() []string { return all.Pkgs }) +func loadAll(ctx context.Context, closeOverTests bool) []string { + inTarget := TargetPackages(ctx, "...") + loaded = loadFromRoots(loaderParams{ + tags: imports.AnyTags(), + listRoots: func() []string { return inTarget.Pkgs }, + allPatternIsRoot: true, + allClosesOverTests: closeOverTests, + }) checkMultiplePaths() WriteGoMod() @@ -443,7 +545,7 @@ func loadAll(ctx context.Context, testAll bool) []string { } paths = append(paths, pkg.path) } - for _, err := range all.Errs { + for _, err := range inTarget.Errs { base.Errorf("%v", err) } base.ExitIfErrors() @@ -604,75 +706,157 @@ func Lookup(parentPath string, parentIsStd bool, path string) (dir, realPath str // the required packages for a particular build, // checking that the packages are available in the module set, // and updating the module set if needed. -// Loading is an iterative process: try to load all the needed packages, -// but if imports are missing, try to resolve those imports, and repeat. -// -// Although most of the loading state is maintained in the loader struct, -// one key piece - the build list - is a global, so that it can be modified -// separate from the loading operation, such as during "go get" -// upgrades/downgrades or in "go mod" operations. -// TODO(rsc): It might be nice to make the loader take and return -// a buildList rather than hard-coding use of the global. type loader struct { - tags map[string]bool // tags for scanDir - testRoots bool // include tests for roots - isALL bool // created with LoadALL - testAll bool // include tests for all packages - forceStdVendor bool // if true, load standard-library dependencies from the vendor subtree + loaderParams + + forceStdVendor bool // if true, load standard-library dependencies from the vendor subtree + + work *par.Queue // reset on each iteration roots []*loadPkg - pkgs []*loadPkg - work *par.Work // current work queue - pkgCache *par.Cache // map from string to *loadPkg + pkgCache *par.Cache // package path (string) → *loadPkg + pkgs []*loadPkg // transitive closure of loaded packages and tests; populated in buildStacks // computed at end of iterations direct map[string]bool // imported directly by main module } +type loaderParams struct { + tags map[string]bool // tags for scanDir + listRoots func() []string + allPatternIsRoot bool // Is the "all" pattern an additional root? + allClosesOverTests bool // Does the "all" pattern include the transitive closure of tests of packages in "all"? +} + // LoadTests controls whether the loaders load tests of the root packages. var LoadTests bool -func newLoader(tags map[string]bool) *loader { - ld := new(loader) - ld.tags = tags - ld.testRoots = LoadTests - - // Inside the "std" and "cmd" modules, we prefer to use the vendor directory - // unless the command explicitly changes the module graph. - if !targetInGorootSrc || (cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ")) { - ld.forceStdVendor = true +func (ld *loader) reset() { + select { + case <-ld.work.Idle(): + default: + panic("loader.reset when not idle") } - return ld -} - -func (ld *loader) reset() { ld.roots = nil - ld.pkgs = nil - ld.work = new(par.Work) ld.pkgCache = new(par.Cache) + ld.pkgs = nil } // A loadPkg records information about a single loaded package. type loadPkg struct { - path string // import path + // Populated at construction time: + path string // import path + testOf *loadPkg + + // Populated at construction time and updated by (*loader).applyPkgFlags: + flags atomicLoadPkgFlags + + // Populated by (*loader).load: mod module.Version // module providing package dir string // directory containing source code - imports []*loadPkg // packages imported by this one err error // error loading package - stack *loadPkg // package importing this one in minimal import stack for this pkg - test *loadPkg // package with test imports, if we need test - testOf *loadPkg - testImports []string // test-only imports, saved for use by pkg.test. + imports []*loadPkg // packages imported by this one + testImports []string // test-only imports, saved for use by pkg.test. + inStd bool + + // Populated by (*loader).pkgTest: + testOnce sync.Once + test *loadPkg + + // Populated by postprocessing in (*loader).buildStacks: + stack *loadPkg // package importing this one in minimal import stack for this pkg +} + +// loadPkgFlags is a set of flags tracking metadata about a package. +type loadPkgFlags int8 + +const ( + // pkgInAll indicates that the package is in the "all" package pattern, + // regardless of whether we are loading the "all" package pattern. + // + // When the pkgInAll flag and pkgImportsLoaded flags are both set, the caller + // who set the last of those flags must propagate the pkgInAll marking to all + // of the imports of the marked package. + // + // A test is marked with pkgInAll if that test would promote the packages it + // imports to be in "all" (such as when the test is itself within the main + // module, or when ld.allClosesOverTests is true). + pkgInAll loadPkgFlags = 1 << iota + + // pkgIsRoot indicates that the package matches one of the root package + // patterns requested by the caller. + // + // If LoadTests is set, then when pkgIsRoot and pkgImportsLoaded are both set, + // the caller who set the last of those flags must populate a test for the + // package (in the pkg.test field). + // + // If the "all" pattern is included as a root, then non-test packages in "all" + // are also roots (and must be marked pkgIsRoot). + pkgIsRoot + + // pkgImportsLoaded indicates that the imports and testImports fields of a + // loadPkg have been populated. + pkgImportsLoaded +) + +// has reports whether all of the flags in cond are set in f. +func (f loadPkgFlags) has(cond loadPkgFlags) bool { + return f&cond == cond +} + +// An atomicLoadPkgFlags stores a loadPkgFlags for which individual flags can be +// added atomically. +type atomicLoadPkgFlags struct { + bits int32 +} + +// update sets the given flags in af (in addition to any flags already set). +// +// update returns the previous flag state so that the caller may determine which +// flags were newly-set. +func (af *atomicLoadPkgFlags) update(flags loadPkgFlags) (old loadPkgFlags) { + for { + old := atomic.LoadInt32(&af.bits) + new := old | int32(flags) + if new == old || atomic.CompareAndSwapInt32(&af.bits, old, new) { + return loadPkgFlags(old) + } + } +} + +// has reports whether all of the flags in cond are set in af. +func (af *atomicLoadPkgFlags) has(cond loadPkgFlags) bool { + return loadPkgFlags(atomic.LoadInt32(&af.bits))&cond == cond +} + +// isTest reports whether pkg is a test of another package. +func (pkg *loadPkg) isTest() bool { + return pkg.testOf != nil } var errMissing = errors.New("cannot find package") -// load attempts to load the build graph needed to process a set of root packages. -// The set of root packages is defined by the addRoots function, -// which must call add(path) with the import path of each root package. -func (ld *loader) load(roots func() []string) { +// loadFromRoots attempts to load the build graph needed to process a set of +// root packages and their dependencies. +// +// The set of root packages is returned by the params.listRoots function, and +// expanded to the full set of packages by tracing imports (and possibly tests) +// as needed. +func loadFromRoots(params loaderParams) *loader { + ld := &loader{ + loaderParams: params, + work: par.NewQueue(runtime.GOMAXPROCS(0)), + } + + // Inside the "std" and "cmd" modules, we prefer to use the vendor directory + // unless the command explicitly changes the module graph. + // TODO(bcmills): Is this still needed now that we have automatic vendoring? + if !targetInGorootSrc || (cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ")) { + ld.forceStdVendor = true + } + var err error reqs := Reqs() buildList, err = mvs.BuildList(Target, reqs) @@ -680,47 +864,34 @@ func (ld *loader) load(roots func() []string) { base.Fatalf("go: %v", err) } - added := make(map[string]bool) + addedModuleFor := make(map[string]bool) for { ld.reset() - if roots != nil { - // Note: the returned roots can change on each iteration, - // since the expansion of package patterns depends on the - // build list we're using. - for _, path := range roots() { - ld.work.Add(ld.pkg(path, true)) + + // Load the root packages and their imports. + // Note: the returned roots can change on each iteration, + // since the expansion of package patterns depends on the + // build list we're using. + inRoots := map[*loadPkg]bool{} + for _, path := range ld.listRoots() { + root := ld.pkg(path, pkgIsRoot) + if !inRoots[root] { + ld.roots = append(ld.roots, root) + inRoots[root] = true } } - ld.work.Do(10, ld.doPkg) + + // ld.pkg adds imported packages to the work queue and calls applyPkgFlags, + // which adds tests (and test dependencies) as needed. + // + // When all of the work in the queue has completed, we'll know that the + // transitive closure of dependencies has been loaded. + <-ld.work.Idle() + ld.buildStacks() - numAdded := 0 - haveMod := make(map[module.Version]bool) - for _, m := range buildList { - haveMod[m] = true - } - modAddedBy := make(map[module.Version]*loadPkg) - for _, pkg := range ld.pkgs { - if err, ok := pkg.err.(*ImportMissingError); ok && err.Module.Path != "" { - if err.newMissingVersion != "" { - base.Fatalf("go: %s: package provided by %s at latest version %s but not at required version %s", pkg.stackText(), err.Module.Path, err.Module.Version, err.newMissingVersion) - } - fmt.Fprintf(os.Stderr, "go: found %s in %s %s\n", pkg.path, err.Module.Path, err.Module.Version) - if added[pkg.path] { - base.Fatalf("go: %s: looping trying to add package", pkg.stackText()) - } - added[pkg.path] = true - numAdded++ - if !haveMod[err.Module] { - haveMod[err.Module] = true - modAddedBy[err.Module] = pkg - buildList = append(buildList, err.Module) - } - continue - } - // Leave other errors for Import or load.Packages to report. - } - base.ExitIfErrors() - if numAdded == 0 { + + modAddedBy := resolveMissingImports(addedModuleFor, ld.pkgs) + if len(modAddedBy) == 0 { break } @@ -753,92 +924,257 @@ func (ld *loader) load(roots func() []string) { } } - // Mix in direct markings (really, lack of indirect markings) - // from go.mod, unless we scanned the whole module - // and can therefore be sure we know better than go.mod. - if !ld.isALL && modFile != nil { + // If we didn't scan all of the imports from the main module, or didn't use + // imports.AnyTags, then we didn't necessarily load every package that + // contributes “direct” imports — so we can't safely mark existing + // dependencies as indirect-only. + // Conservatively mark those dependencies as direct. + if modFile != nil && (!ld.allPatternIsRoot || !reflect.DeepEqual(ld.tags, imports.AnyTags())) { for _, r := range modFile.Require { if !r.Indirect { ld.direct[r.Mod.Path] = true } } } + + return ld } -// pkg returns the *loadPkg for path, creating and queuing it if needed. -// If the package should be tested, its test is created but not queued -// (the test is queued after processing pkg). -// If isRoot is true, the pkg is being queued as one of the roots of the work graph. -func (ld *loader) pkg(path string, isRoot bool) *loadPkg { - return ld.pkgCache.Do(path, func() interface{} { - pkg := &loadPkg{ - path: path, +// resolveMissingImports adds module dependencies to the global build list +// in order to resolve missing packages from pkgs. +// +// The newly-resolved packages are added to the addedModuleFor map, and +// resolveMissingImports returns a map from each newly-added module version to +// the first package for which that module was added. +func resolveMissingImports(addedModuleFor map[string]bool, pkgs []*loadPkg) (modAddedBy map[module.Version]*loadPkg) { + haveMod := make(map[module.Version]bool) + for _, m := range buildList { + haveMod[m] = true + } + + modAddedBy = make(map[module.Version]*loadPkg) + for _, pkg := range pkgs { + if pkg.isTest() { + // If we are missing a test, we are also missing its non-test version, and + // we should only add the missing import once. + continue } - if ld.testRoots && isRoot || ld.testAll { - test := &loadPkg{ - path: path, - testOf: pkg, + if err, ok := pkg.err.(*ImportMissingError); ok && err.Module.Path != "" { + if err.newMissingVersion != "" { + base.Fatalf("go: %s: package provided by %s at latest version %s but not at required version %s", pkg.stackText(), err.Module.Path, err.Module.Version, err.newMissingVersion) } - pkg.test = test + fmt.Fprintf(os.Stderr, "go: found %s in %s %s\n", pkg.path, err.Module.Path, err.Module.Version) + if addedModuleFor[pkg.path] { + base.Fatalf("go: %s: looping trying to add package", pkg.stackText()) + } + addedModuleFor[pkg.path] = true + if !haveMod[err.Module] { + haveMod[err.Module] = true + modAddedBy[err.Module] = pkg + buildList = append(buildList, err.Module) + } + continue } - if isRoot { - ld.roots = append(ld.roots, pkg) + // Leave other errors for Import or load.Packages to report. + } + base.ExitIfErrors() + + return modAddedBy +} + +// pkg locates the *loadPkg for path, creating and queuing it for loading if +// needed, and updates its state to reflect the given flags. +// +// The imports of the returned *loadPkg will be loaded asynchronously in the +// ld.work queue, and its test (if requested) will also be populated once +// imports have been resolved. When ld.work goes idle, all transitive imports of +// the requested package (and its test, if requested) will have been loaded. +func (ld *loader) pkg(path string, flags loadPkgFlags) *loadPkg { + if flags.has(pkgImportsLoaded) { + panic("internal error: (*loader).pkg called with pkgImportsLoaded flag set") + } + + pkg := ld.pkgCache.Do(path, func() interface{} { + pkg := &loadPkg{ + path: path, } - ld.work.Add(pkg) + ld.applyPkgFlags(pkg, flags) + + ld.work.Add(func() { ld.load(pkg) }) return pkg }).(*loadPkg) + + ld.applyPkgFlags(pkg, flags) + return pkg } -// doPkg processes a package on the work queue. -func (ld *loader) doPkg(item interface{}) { - // TODO: what about replacements? - pkg := item.(*loadPkg) - var imports []string - if pkg.testOf != nil { - pkg.dir = pkg.testOf.dir - pkg.mod = pkg.testOf.mod - imports = pkg.testOf.testImports - } else { - if strings.Contains(pkg.path, "@") { - // Leave for error during load. - return - } - if build.IsLocalImport(pkg.path) || filepath.IsAbs(pkg.path) { - // Leave for error during load. - // (Module mode does not allow local imports.) - return - } +// applyPkgFlags updates pkg.flags to set the given flags and propagate the +// (transitive) effects of those flags, possibly loading or enqueueing further +// packages as a result. +func (ld *loader) applyPkgFlags(pkg *loadPkg, flags loadPkgFlags) { + if flags == 0 { + return + } - // TODO(matloob): Handle TODO context. This needs to be threaded through Do. - pkg.mod, pkg.dir, pkg.err = Import(context.TODO(), pkg.path) - if pkg.dir == "" { - return + if flags.has(pkgInAll) && ld.allPatternIsRoot && !pkg.isTest() { + // This package matches a root pattern by virtue of being in "all". + flags |= pkgIsRoot + } + + old := pkg.flags.update(flags) + new := old | flags + if new == old || !new.has(pkgImportsLoaded) { + // We either didn't change the state of pkg, or we don't know anything about + // its dependencies yet. Either way, we can't usefully load its test or + // update its dependencies. + return + } + + if !pkg.isTest() { + // Check whether we should add (or update the flags for) a test for pkg. + // ld.pkgTest is idempotent and extra invocations are inexpensive, + // so it's ok if we call it more than is strictly necessary. + wantTest := false + switch { + case ld.allPatternIsRoot && pkg.mod == Target: + // We are loading the "all" pattern, which includes packages imported by + // tests in the main module. This package is in the main module, so we + // need to identify the imports of its test even if LoadTests is not set. + // + // (We will filter out the extra tests explicitly in computePatternAll.) + wantTest = true + + case ld.allPatternIsRoot && ld.allClosesOverTests && new.has(pkgInAll): + // This variant of the "all" pattern includes imports of tests of every + // package that is itself in "all", and pkg is in "all", so its test is + // also in "all" (as above). + wantTest = true + + case LoadTests && new.has(pkgIsRoot): + // LoadTest explicitly requests tests of “the root packages”. + wantTest = true } - var testImports []string - var err error - imports, testImports, err = scanDir(pkg.dir, ld.tags) - if err != nil { - pkg.err = err - return + + if wantTest { + var testFlags loadPkgFlags + if pkg.mod == Target || (ld.allClosesOverTests && new.has(pkgInAll)) { + // Tests of packages in the main module are in "all", in the sense that + // they cause the packages they import to also be in "all". So are tests + // of packages in "all" if "all" closes over test dependencies. + testFlags |= pkgInAll + } + ld.pkgTest(pkg, testFlags) } - if pkg.test != nil { - pkg.testImports = testImports + } + + if new.has(pkgInAll) && !old.has(pkgInAll|pkgImportsLoaded) { + // We have just marked pkg with pkgInAll, or we have just loaded its + // imports, or both. Now is the time to propagate pkgInAll to the imports. + for _, dep := range pkg.imports { + ld.applyPkgFlags(dep, pkgInAll) } } +} + +// load loads an individual package. +func (ld *loader) load(pkg *loadPkg) { + if strings.Contains(pkg.path, "@") { + // Leave for error during load. + return + } + if build.IsLocalImport(pkg.path) || filepath.IsAbs(pkg.path) { + // Leave for error during load. + // (Module mode does not allow local imports.) + return + } + + pkg.mod, pkg.dir, pkg.err = Import(context.TODO(), pkg.path) + if pkg.dir == "" { + return + } + if pkg.mod == Target { + // Go ahead and mark pkg as in "all". This provides the invariant that a + // package that is *only* imported by other packages in "all" is always + // marked as such before loading its imports. + // + // We don't actually rely on that invariant at the moment, but it may + // improve efficiency somewhat and makes the behavior a bit easier to reason + // about (by reducing churn on the flag bits of dependencies), and costs + // essentially nothing (these atomic flag ops are essentially free compared + // to scanning source code for imports). + ld.applyPkgFlags(pkg, pkgInAll) + } + + imports, testImports, err := scanDir(pkg.dir, ld.tags) + if err != nil { + pkg.err = err + return + } + + pkg.inStd = (search.IsStandardImportPath(pkg.path) && search.InDir(pkg.dir, cfg.GOROOTsrc) != "") - inStd := (search.IsStandardImportPath(pkg.path) && search.InDir(pkg.dir, cfg.GOROOTsrc) != "") + pkg.imports = make([]*loadPkg, 0, len(imports)) + var importFlags loadPkgFlags + if pkg.flags.has(pkgInAll) { + importFlags = pkgInAll + } for _, path := range imports { - if inStd { + if pkg.inStd { + // Imports from packages in "std" should resolve using GOROOT/src/vendor + // even when "std" is not the main module. path = ld.stdVendor(pkg.path, path) } - pkg.imports = append(pkg.imports, ld.pkg(path, false)) + pkg.imports = append(pkg.imports, ld.pkg(path, importFlags)) } + pkg.testImports = testImports - // Now that pkg.dir, pkg.mod, pkg.testImports are set, we can queue pkg.test. - // TODO: All that's left is creating new imports. Why not just do it now? - if pkg.test != nil { - ld.work.Add(pkg.test) + ld.applyPkgFlags(pkg, pkgImportsLoaded) +} + +// pkgTest locates the test of pkg, creating it if needed, and updates its state +// to reflect the given flags. +// +// pkgTest requires that the imports of pkg have already been loaded (flagged +// with pkgImportsLoaded). +func (ld *loader) pkgTest(pkg *loadPkg, testFlags loadPkgFlags) *loadPkg { + if pkg.isTest() { + panic("pkgTest called on a test package") + } + + createdTest := false + pkg.testOnce.Do(func() { + pkg.test = &loadPkg{ + path: pkg.path, + testOf: pkg, + mod: pkg.mod, + dir: pkg.dir, + err: pkg.err, + inStd: pkg.inStd, + } + ld.applyPkgFlags(pkg.test, testFlags) + createdTest = true + }) + + test := pkg.test + if createdTest { + test.imports = make([]*loadPkg, 0, len(pkg.testImports)) + var importFlags loadPkgFlags + if test.flags.has(pkgInAll) { + importFlags = pkgInAll + } + for _, path := range pkg.testImports { + if pkg.inStd { + path = ld.stdVendor(test.path, path) + } + test.imports = append(test.imports, ld.pkg(path, importFlags)) + } + pkg.testImports = nil + ld.applyPkgFlags(test, pkgImportsLoaded) + } else { + ld.applyPkgFlags(test, testFlags) } + + return test } // stdVendor returns the canonical import path for the package with the given @@ -868,30 +1204,13 @@ func (ld *loader) stdVendor(parentPath, path string) string { // computePatternAll returns the list of packages matching pattern "all", // starting with a list of the import paths for the packages in the main module. -func (ld *loader) computePatternAll(paths []string) []string { - seen := make(map[*loadPkg]bool) - var all []string - var walk func(*loadPkg) - walk = func(pkg *loadPkg) { - if seen[pkg] { - return - } - seen[pkg] = true - if pkg.testOf == nil { +func (ld *loader) computePatternAll() (all []string) { + for _, pkg := range ld.pkgs { + if pkg.flags.has(pkgInAll) && !pkg.isTest() { all = append(all, pkg.path) } - for _, p := range pkg.imports { - walk(p) - } - if p := pkg.test; p != nil { - walk(p) - } - } - for _, path := range paths { - walk(ld.pkg(path, false)) } sort.Strings(all) - return all } diff --git a/src/cmd/go/testdata/script/mod_notall.txt b/src/cmd/go/testdata/script/mod_notall.txt index 72a02485a4..29ca6066fa 100644 --- a/src/cmd/go/testdata/script/mod_notall.txt +++ b/src/cmd/go/testdata/script/mod_notall.txt @@ -18,7 +18,7 @@ stdout '^x/otherdep$' ! stdout '^x/fromotherroottest$' ! stdout '^y/fromotherdeptest$' -# TODO(#40799): cmp go.mod go.mod.orig +cmp go.mod go.mod.orig # With -deps -test, test dependencies of other roots should be included, # but test dependencies of non-roots should not. @@ -33,7 +33,7 @@ stdout '^x/otherdep$' stdout '^x/fromotherroottest$' ! stdout '^y/fromotherdeptest$' -# TODO(#40799): cmp go.mod go.mod.orig +cmp go.mod go.mod.orig -- m.go -- package m -- GitLab From 26d27f96fec733fe09751b49b47282c9109fb8ad Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 27 Aug 2020 16:34:59 -0400 Subject: [PATCH 0442/1792] cmd/go/internal/modload: remove (*loader).forceStdVendor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit forceStdVendor was a special-case mechanism to allow Go contributors to use vendored dependencies by default when working in GOROOT/src. As of Go 1.14,¹ the 'go' command uses vendored dependencies by default within all modules, so the 'std' and 'cmd' modules no longer need to be special cases, and we can remove this special-case code. ¹ https://golang.org/doc/go1.14#vendor Updates #33848 Updates #30241 Change-Id: Ib2fb5841c253113b17fa86a086ce85a22ac3d121 Reviewed-on: https://go-review.googlesource.com/c/go/+/251159 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/load.go | 25 ++++---- src/cmd/go/testdata/script/mod_list_std.txt | 64 +++++++++++++------ src/cmd/go/testdata/script/mod_std_vendor.txt | 6 +- 3 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 64ef60230e..8a3af534a5 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -709,8 +709,6 @@ func Lookup(parentPath string, parentIsStd bool, path string) (dir, realPath str type loader struct { loaderParams - forceStdVendor bool // if true, load standard-library dependencies from the vendor subtree - work *par.Queue // reset on each iteration @@ -850,13 +848,6 @@ func loadFromRoots(params loaderParams) *loader { work: par.NewQueue(runtime.GOMAXPROCS(0)), } - // Inside the "std" and "cmd" modules, we prefer to use the vendor directory - // unless the command explicitly changes the module graph. - // TODO(bcmills): Is this still needed now that we have automatic vendoring? - if !targetInGorootSrc || (cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ")) { - ld.forceStdVendor = true - } - var err error reqs := Reqs() buildList, err = mvs.BuildList(Target, reqs) @@ -1120,8 +1111,8 @@ func (ld *loader) load(pkg *loadPkg) { } for _, path := range imports { if pkg.inStd { - // Imports from packages in "std" should resolve using GOROOT/src/vendor - // even when "std" is not the main module. + // Imports from packages in "std" and "cmd" should resolve using + // GOROOT/src/vendor even when "std" is not the main module. path = ld.stdVendor(pkg.path, path) } pkg.imports = append(pkg.imports, ld.pkg(path, importFlags)) @@ -1185,13 +1176,21 @@ func (ld *loader) stdVendor(parentPath, path string) string { } if str.HasPathPrefix(parentPath, "cmd") { - if ld.forceStdVendor || Target.Path != "cmd" { + if Target.Path != "cmd" { vendorPath := pathpkg.Join("cmd", "vendor", path) if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil { return vendorPath } } - } else if ld.forceStdVendor || Target.Path != "std" { + } else if Target.Path != "std" || str.HasPathPrefix(parentPath, "vendor") { + // If we are outside of the 'std' module, resolve imports from within 'std' + // to the vendor directory. + // + // Do the same for importers beginning with the prefix 'vendor/' even if we + // are *inside* of the 'std' module: the 'vendor/' packages that resolve + // globally from GOROOT/src/vendor (and are listed as part of 'go list std') + // are distinct from the real module dependencies, and cannot import internal + // packages from the real module. vendorPath := pathpkg.Join("vendor", path) if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil { return vendorPath diff --git a/src/cmd/go/testdata/script/mod_list_std.txt b/src/cmd/go/testdata/script/mod_list_std.txt index 76a3b00d1c..baf7908ab9 100644 --- a/src/cmd/go/testdata/script/mod_list_std.txt +++ b/src/cmd/go/testdata/script/mod_list_std.txt @@ -6,8 +6,13 @@ env GOPROXY=off # Outside of GOROOT, our vendored packages should be reported as part of the standard library. go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' std cmd -stdout ^vendor/golang.org/x/net/http2/hpack +stdout ^vendor/golang\.org/x/net/http2/hpack stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm +! stdout ^golang\.org/x/ + +# The dependencies of those packages should also be vendored. +go list -deps vendor/golang.org/x/crypto/chacha20 +stdout ^vendor/golang\.org/x/crypto/internal/subtle # cmd/... should match the same packages it used to match in GOPATH mode. go list cmd/... @@ -23,40 +28,57 @@ stdout ^bytes$ ! stdout ^builtin$ ! stdout ^cmd/ ! stdout ^vendor/ +! stdout ^golang\.org/x/ + +# Vendored dependencies should appear with their 'vendor/' paths in std (they're +# in GOROOT/src, but not in the 'std' module following the usual module-boundary +# rules). -# Within the std module, listing ./... should omit the 'std' prefix: -# the package paths should be the same via ./... or the 'std' meta-pattern. -# TODO(golang.org/issue/30241): Make that work. -# Today, they are listed in 'std' but not './...'. cd $GOROOT/src -go list ./... -! stdout ^vendor/golang.org/x # TODO: should be included, or should be omitted from 'std'. -cp stdout $WORK/listdot.txt go list std -stdout ^vendor/golang.org/x # TODO: remove vendor/ prefix -# TODO: cmp stdout $WORK/listdot.txt +stdout ^vendor/golang.org/x/net/http2/hpack +! stdout ^golang\.org/x + +# The dependencies of packages with an explicit 'vendor/' prefix should +# still themselves resolve to vendored packages. +go list -deps vendor/golang.org/x/crypto/chacha20 +stdout ^vendor/golang.org/x/crypto/internal/subtle +! stdout ^golang\.org/x + +# Within the std module, the dependencies of the non-vendored packages within +# std should appear to come from modules, but they should be loaded from the +# vendor directory (just like ordinary vendored module dependencies). go list all -stdout ^vendor/golang.org/x # TODO: remove vendor/ prefix. +stdout ^golang.org/x/ ! stdout ^std/ +! stdout ^cmd/ +! stdout ^vendor/ +go list -deps -f '{{if not .Standard}}{{.ImportPath}}{{end}}' std +! stdout ^vendor/golang.org/x/net/http2/hpack +stdout ^golang.org/x/net/http2/hpack -# Within the std module, the vendored dependencies of std should appear -# to come from the actual modules. -# TODO(golang.org/issue/30241): Make that work. -# Today, they still have the vendor/ prefix. -go list std -stdout ^vendor/golang.org/x/net/http2/hpack # TODO -! stdout ^golang.org/x/net/http2/hpack # TODO +go list -f '{{.Dir}}' golang.org/x/net/http2/hpack +stdout $GOROOT[/\\]src[/\\]vendor -go list -deps -f '{{if not .Standard}}{{.ImportPath}}{{end}}' std -# ! stdout ^vendor/golang.org/x/net/http2/hpack # TODO -! stdout ^golang.org/x/net/http2/hpack # TODO +# Within the std module, the packages within the module should omit the 'std/' +# prefix (they retain their own identities), but should respect normal module +# boundaries (vendored packages are not included in the module, even though they +# are included in the 'std' pattern). + +go list ./... +stdout ^bytes$ +! stdout ^builtin$ +! stdout ^cmd/ +! stdout ^vendor/ +! stdout ^golang\.org/x/ # Within std, the vendored dependencies of cmd should still appear to be part of cmd. + go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' cmd stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm diff --git a/src/cmd/go/testdata/script/mod_std_vendor.txt b/src/cmd/go/testdata/script/mod_std_vendor.txt index 5986cff594..fb954d74ed 100644 --- a/src/cmd/go/testdata/script/mod_std_vendor.txt +++ b/src/cmd/go/testdata/script/mod_std_vendor.txt @@ -37,12 +37,10 @@ stderr 'use of vendored package' # When run within the 'std' module, 'go list -test' should report vendored # transitive dependencies at their original module paths. -# TODO(golang.org/issue/30241): Make that work. -# Today, they're standard packages as long as they exist. cd $GOROOT/src go list -test -f '{{range .Deps}}{{.}}{{"\n"}}{{end}}' net/http -stdout ^vendor/golang.org/x/net/http2/hpack # TODO: remove vendor/ prefix -! stdout ^golang.org/x/net/http2/hpack +stdout ^golang.org/x/net/http2/hpack +! stdout ^vendor/golang.org/x/net/http2/hpack -- go.mod -- module m -- GitLab From 015a5a5c5c4b4ce4dce55601032b8e2f5fbcca9a Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 28 Aug 2020 18:19:22 -0400 Subject: [PATCH 0443/1792] cmd/go/internal/modload: rework import resolution modload.Import previously performed two otherwise-separable tasks: 1. Identify which module in the build list contains the requested package. 2. If no such module exists, search available modules to try to find the missing package. This change splits those two tasks into two separate unexported functions, and reports import-resolution errors by attaching them to the package rather than emitting them directly to stderr. That allows 'list' to report the errors, but 'list -e' to ignore them. With the two tasks now separate, it will be easier to avoid the overhead of resolving missing packages during lazy loading if we discover that some existing dependency needs to be promoted to the top level (potentially altering the main module's selected versions, and thus suppling packages that were previously missing). For #36460 Updates #26909 Change-Id: I32bd853b266d7cd231d1f45f92b0650d95c4bcbd Reviewed-on: https://go-review.googlesource.com/c/go/+/251445 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/list/list.go | 21 +++++- src/cmd/go/internal/modload/import.go | 71 ++++++++++++------- src/cmd/go/internal/modload/import_test.go | 44 +++++++++--- src/cmd/go/internal/modload/load.go | 59 ++++++++------- .../go/testdata/script/list_bad_import.txt | 18 ++--- src/cmd/go/testdata/script/list_test_err.txt | 3 + .../testdata/script/mod_list_bad_import.txt | 18 ++--- .../script/mod_missingpkg_prerelease.txt | 4 +- 8 files changed, 158 insertions(+), 80 deletions(-) diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 6d81c1cad1..65003dc883 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -545,7 +545,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { // Note that -deps is applied after -test, // so that you only get descriptions of tests for the things named // explicitly on the command line, not for all dependencies. - pkgs = load.PackageList(pkgs) + pkgs = loadPackageList(pkgs) } // Do we need to run a build to gather information? @@ -580,7 +580,7 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { if *listTest { all := pkgs if !*listDeps { - all = load.PackageList(pkgs) + all = loadPackageList(pkgs) } // Update import paths to distinguish the real package p // from p recompiled for q.test. @@ -697,6 +697,23 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { } } +// loadPackageList is like load.PackageList, but prints error messages and exits +// with nonzero status if listE is not set and any package in the expanded list +// has errors. +func loadPackageList(roots []*load.Package) []*load.Package { + pkgs := load.PackageList(roots) + + if !*listE { + for _, pkg := range pkgs { + if pkg.Error != nil { + base.Errorf("%v", pkg.Error) + } + } + } + + return pkgs +} + // 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/modload/import.go b/src/cmd/go/internal/modload/import.go index 6459e716b7..e04d66c5b1 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -26,6 +26,8 @@ import ( "golang.org/x/mod/semver" ) +var errImportMissing = errors.New("import missing") + type ImportMissingError struct { Path string Module module.Version @@ -48,6 +50,11 @@ func (e *ImportMissingError) Error() string { } return "cannot find module providing package " + e.Path } + + if e.newMissingVersion != "" { + return fmt.Sprintf("package %s provided by %s at latest version %s but not at required version %s", e.Path, e.Module.Path, e.Module.Version, e.newMissingVersion) + } + return fmt.Sprintf("missing module for import: %s@%s provides %s", e.Module.Path, e.Module.Version, e.Path) } @@ -100,18 +107,20 @@ func (e *AmbiguousImportError) Error() string { var _ load.ImportPathError = &AmbiguousImportError{} -// Import finds the module and directory in the build list -// containing the package with the given import path. -// The answer must be unique: Import returns an error -// if multiple modules attempt to provide the same package. -// Import can return a module with an empty m.Path, for packages in the standard library. -// Import can return an empty directory string, for fake packages like "C" and "unsafe". +// importFromBuildList finds the module and directory in the build list +// containing the package with the given import path. The answer must be unique: +// importFromBuildList returns an error if multiple modules attempt to provide +// the same package. +// +// importFromBuildList can return a module with an empty m.Path, for packages in +// the standard library. +// +// importFromBuildList can return an empty directory string, for fake packages +// like "C" and "unsafe". // // If the package cannot be found in the current build list, -// Import returns an ImportMissingError as the error. -// If Import can identify a module that could be added to supply the package, -// the ImportMissingError records that module. -func Import(ctx context.Context, path string) (m module.Version, dir string, err error) { +// importFromBuildList returns errImportMissing as the error. +func importFromBuildList(ctx context.Context, path string) (m module.Version, dir string, err error) { if strings.Contains(path, "@") { return module.Version{}, "", fmt.Errorf("import path should not have @version") } @@ -190,8 +199,14 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err return module.Version{}, "", &AmbiguousImportError{importPath: path, Dirs: dirs, Modules: mods} } - // 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, ErrMissing. + return module.Version{}, "", errImportMissing +} + +// queryImport attempts to locate a module that can be added to the current +// build list to provide the package with the given import path. +func queryImport(ctx context.Context, path string) (module.Version, error) { + pathIsStd := search.IsStandardImportPath(path) + if cfg.BuildMod == "readonly" { var queryErr error if !pathIsStd { @@ -201,10 +216,10 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err queryErr = fmt.Errorf("import lookup disabled by -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason) } } - return module.Version{}, "", &ImportMissingError{Path: path, QueryErr: queryErr} + return module.Version{}, &ImportMissingError{Path: path, QueryErr: queryErr} } if modRoot == "" && !allowMissingModuleImports { - return module.Version{}, "", &ImportMissingError{ + return module.Version{}, &ImportMissingError{ Path: path, QueryErr: errors.New("working directory is not part of a module"), } @@ -226,7 +241,7 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err } } - mods = make([]module.Version, 0, len(latest)) + mods := make([]module.Version, 0, len(latest)) for p, v := range latest { // If the replacement didn't specify a version, synthesize a // pseudo-version with an appropriate major version and a timestamp below @@ -252,19 +267,19 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err root, isLocal, err := fetch(ctx, m) if err != nil { // Report fetch error as above. - return module.Version{}, "", err + return module.Version{}, err } if _, ok, err := dirInModule(path, m.Path, root, isLocal); err != nil { - return m, "", err + return m, err } else if ok { - return m, "", &ImportMissingError{Path: path, Module: m} + return m, nil } } if len(mods) > 0 && module.CheckPath(path) != nil { // The package path is not valid to fetch remotely, // so it can only exist if in a replaced module, // and we know from the above loop that it is not. - return module.Version{}, "", &PackageNotInModuleError{ + return module.Version{}, &PackageNotInModuleError{ Mod: mods[0], Query: "latest", Pattern: path, @@ -281,7 +296,7 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err // QueryPackage cannot possibly find a module containing this package. // // Instead of trying QueryPackage, report an ImportMissingError immediately. - return module.Version{}, "", &ImportMissingError{Path: path} + return module.Version{}, &ImportMissingError{Path: path} } fmt.Fprintf(os.Stderr, "go: finding module for package %s\n", path) @@ -291,12 +306,13 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err if errors.Is(err, os.ErrNotExist) { // Return "cannot find module providing package […]" instead of whatever // low-level error QueryPackage produced. - return module.Version{}, "", &ImportMissingError{Path: path, QueryErr: err} + return module.Version{}, &ImportMissingError{Path: path, QueryErr: err} } else { - return module.Version{}, "", err + return module.Version{}, err } } - m = candidates[0].Mod + + m := candidates[0].Mod newMissingVersion := "" for _, c := range candidates { cm := c.Mod @@ -310,13 +326,20 @@ func Import(ctx context.Context, path string) (m module.Version, dir string, err // version (e.g., v1.0.0) of a module, but we have a newer version // of the same module in the build list (e.g., v1.0.1-beta), and // the package is not present there. + // + // TODO(#41113): This is probably incorrect when there are multiple + // candidates, such as when a nested module is split out but only one + // half of the split is tagged. m = cm newMissingVersion = bm.Version break } } } - return m, "", &ImportMissingError{Path: path, Module: m, newMissingVersion: newMissingVersion} + if newMissingVersion != "" { + return m, &ImportMissingError{Path: path, Module: m, newMissingVersion: newMissingVersion} + } + return m, nil } // maybeInModule reports whether, syntactically, diff --git a/src/cmd/go/internal/modload/import_test.go b/src/cmd/go/internal/modload/import_test.go index 47ce89a084..22d5b82e21 100644 --- a/src/cmd/go/internal/modload/import_test.go +++ b/src/cmd/go/internal/modload/import_test.go @@ -10,15 +10,20 @@ import ( "regexp" "strings" "testing" + + "golang.org/x/mod/module" ) var importTests = []struct { path string + m module.Version err string }{ { path: "golang.org/x/net/context", - err: "missing module for import: golang.org/x/net@.* provides golang.org/x/net/context", + m: module.Version{ + Path: "golang.org/x/net", + }, }, { path: "golang.org/x/net", @@ -26,15 +31,23 @@ var importTests = []struct { }, { path: "golang.org/x/text", - err: "missing module for import: golang.org/x/text@.* provides golang.org/x/text", + m: module.Version{ + Path: "golang.org/x/text", + }, }, { path: "github.com/rsc/quote/buggy", - err: "missing module for import: github.com/rsc/quote@v1.5.2 provides github.com/rsc/quote/buggy", + m: module.Version{ + Path: "github.com/rsc/quote", + Version: "v1.5.2", + }, }, { path: "github.com/rsc/quote", - err: "missing module for import: github.com/rsc/quote@v1.5.2 provides github.com/rsc/quote", + m: module.Version{ + Path: "github.com/rsc/quote", + Version: "v1.5.2", + }, }, { path: "golang.org/x/foo/bar", @@ -42,7 +55,7 @@ var importTests = []struct { }, } -func TestImport(t *testing.T) { +func TestQueryImport(t *testing.T) { testenv.MustHaveExternalNetwork(t) testenv.MustHaveExecPath(t, "git") defer func(old bool) { @@ -55,12 +68,23 @@ func TestImport(t *testing.T) { for _, tt := range importTests { t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) { // Note that there is no build list, so Import should always fail. - m, dir, err := Import(ctx, tt.path) - if err == nil { - t.Fatalf("Import(%q) = %v, %v, nil; expected error", tt.path, m, dir) + m, err := queryImport(ctx, tt.path) + + if tt.err == "" { + if err != nil { + t.Fatalf("queryImport(_, %q): %v", tt.path, err) + } + } else { + if err == nil { + t.Fatalf("queryImport(_, %q) = %v, nil; expected error", tt.path, m) + } + if !regexp.MustCompile(tt.err).MatchString(err.Error()) { + t.Fatalf("queryImport(_, %q): error %q, want error matching %#q", tt.path, err, tt.err) + } } - if !regexp.MustCompile(tt.err).MatchString(err.Error()) { - t.Fatalf("Import(%q): error %q, want error matching %#q", tt.path, err, tt.err) + + if m.Path != tt.m.Path || (tt.m.Version != "" && m.Version != tt.m.Version) { + t.Errorf("queryImport(_, %q) = %v, _; want %v", tt.path, m, tt.m) } }) } diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 8a3af534a5..2096dfb636 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -881,7 +881,7 @@ func loadFromRoots(params loaderParams) *loader { ld.buildStacks() - modAddedBy := resolveMissingImports(addedModuleFor, ld.pkgs) + modAddedBy := ld.resolveMissingImports(addedModuleFor) if len(modAddedBy) == 0 { break } @@ -937,38 +937,45 @@ func loadFromRoots(params loaderParams) *loader { // The newly-resolved packages are added to the addedModuleFor map, and // resolveMissingImports returns a map from each newly-added module version to // the first package for which that module was added. -func resolveMissingImports(addedModuleFor map[string]bool, pkgs []*loadPkg) (modAddedBy map[module.Version]*loadPkg) { - haveMod := make(map[module.Version]bool) - for _, m := range buildList { - haveMod[m] = true - } - - modAddedBy = make(map[module.Version]*loadPkg) - for _, pkg := range pkgs { +func (ld *loader) resolveMissingImports(addedModuleFor map[string]bool) (modAddedBy map[module.Version]*loadPkg) { + var needPkgs []*loadPkg + for _, pkg := range ld.pkgs { if pkg.isTest() { // If we are missing a test, we are also missing its non-test version, and // we should only add the missing import once. continue } - if err, ok := pkg.err.(*ImportMissingError); ok && err.Module.Path != "" { - if err.newMissingVersion != "" { - base.Fatalf("go: %s: package provided by %s at latest version %s but not at required version %s", pkg.stackText(), err.Module.Path, err.Module.Version, err.newMissingVersion) - } - fmt.Fprintf(os.Stderr, "go: found %s in %s %s\n", pkg.path, err.Module.Path, err.Module.Version) - if addedModuleFor[pkg.path] { - base.Fatalf("go: %s: looping trying to add package", pkg.stackText()) - } - addedModuleFor[pkg.path] = true - if !haveMod[err.Module] { - haveMod[err.Module] = true - modAddedBy[err.Module] = pkg - buildList = append(buildList, err.Module) - } + if pkg.err != errImportMissing { + // Leave other errors for Import or load.Packages to report. continue } - // Leave other errors for Import or load.Packages to report. + + needPkgs = append(needPkgs, pkg) + + pkg := pkg + ld.work.Add(func() { + pkg.mod, pkg.err = queryImport(context.TODO(), pkg.path) + }) + } + <-ld.work.Idle() + + modAddedBy = map[module.Version]*loadPkg{} + for _, pkg := range needPkgs { + if pkg.err != nil { + continue + } + + fmt.Fprintf(os.Stderr, "go: found %s in %s %s\n", pkg.path, pkg.mod.Path, pkg.mod.Version) + if addedModuleFor[pkg.path] { + // TODO(bcmills): This should only be an error if pkg.mod is the same + // version we already tried to add previously. + base.Fatalf("go: %s: looping trying to add package", pkg.stackText()) + } + if modAddedBy[pkg.mod] == nil { + modAddedBy[pkg.mod] = pkg + buildList = append(buildList, pkg.mod) + } } - base.ExitIfErrors() return modAddedBy } @@ -1079,7 +1086,7 @@ func (ld *loader) load(pkg *loadPkg) { return } - pkg.mod, pkg.dir, pkg.err = Import(context.TODO(), pkg.path) + pkg.mod, pkg.dir, pkg.err = importFromBuildList(context.TODO(), pkg.path) if pkg.dir == "" { return } diff --git a/src/cmd/go/testdata/script/list_bad_import.txt b/src/cmd/go/testdata/script/list_bad_import.txt index b8f9d586f3..dbec35069c 100644 --- a/src/cmd/go/testdata/script/list_bad_import.txt +++ b/src/cmd/go/testdata/script/list_bad_import.txt @@ -15,10 +15,11 @@ stdout 'incomplete' stdout 'bad dep: .*example.com[/\\]notfound' # Listing with -deps should also fail. -# BUG: Today, it does not. -# ! go list -deps example.com/direct -# stderr example.com[/\\]notfound -go list -deps example.com/direct +! go list -deps example.com/direct +stderr example.com[/\\]notfound + +# But -e -deps should succeed. +go list -e -deps example.com/direct stdout example.com/notfound @@ -31,10 +32,11 @@ stdout incomplete stdout 'bad dep: .*example.com[/\\]notfound' # Again, -deps should fail. -# BUG: Again, it does not. -# ! go list -deps example.com/indirect -# stderr example.com[/\\]notfound -go list -deps example.com/indirect +! go list -deps example.com/indirect +stderr example.com[/\\]notfound + +# But -deps -e should succeed. +go list -e -deps example.com/indirect stdout example.com/notfound diff --git a/src/cmd/go/testdata/script/list_test_err.txt b/src/cmd/go/testdata/script/list_test_err.txt index a174b5e9ad..c6f1ecf400 100644 --- a/src/cmd/go/testdata/script/list_test_err.txt +++ b/src/cmd/go/testdata/script/list_test_err.txt @@ -22,6 +22,9 @@ go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' syntaxerr stdout 'pkgdep ' stdout 'testdep_a ' stdout 'testdep_b ' +stdout 'syntaxerr ' +stdout 'syntaxerr \[syntaxerr.test\] ' +stdout 'syntaxerr_test \[syntaxerr.test\] ' stdout 'syntaxerr\.test "[^"]*expected declaration' ! stderr 'expected declaration' diff --git a/src/cmd/go/testdata/script/mod_list_bad_import.txt b/src/cmd/go/testdata/script/mod_list_bad_import.txt index 8a66e0b72a..b3e2fff67d 100644 --- a/src/cmd/go/testdata/script/mod_list_bad_import.txt +++ b/src/cmd/go/testdata/script/mod_list_bad_import.txt @@ -12,10 +12,11 @@ stdout 'incomplete' stdout 'bad dep: .*example.com/notfound' # Listing with -deps should also fail. -# BUG: Today, it does not. -# ! go list -deps example.com/direct -# stderr example.com/notfound -go list -deps example.com/direct +! go list -deps example.com/direct +stderr example.com/notfound + +# But -e -deps should succeed. +go list -e -deps example.com/direct stdout example.com/notfound @@ -28,10 +29,11 @@ stdout incomplete stdout 'bad dep: .*example.com/notfound' # Again, -deps should fail. -# BUG: Again, it does not. -# ! go list -deps example.com/indirect -# stderr example.com/notfound -go list -deps example.com/indirect +! go list -deps example.com/indirect +stderr example.com/notfound + +# But -e -deps should succeed. +go list -e -deps example.com/indirect stdout example.com/notfound diff --git a/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt b/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt index 319ff85587..1ba8d3d22a 100644 --- a/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt +++ b/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt @@ -1,7 +1,7 @@ env GO111MODULE=on -! go list use.go -stderr 'example.com/missingpkg/deprecated: package provided by example.com/missingpkg at latest version v1.0.0 but not at required version v1.0.1-beta' +! go list -deps use.go +stderr '^use.go:4:2: 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 -- module m -- GitLab From 2c8d2a0c51f4085e56b5ab05ed9fb17fc6d08261 Mon Sep 17 00:00:00 2001 From: Steven Hartland Date: Mon, 31 Aug 2020 21:37:40 +0100 Subject: [PATCH 0444/1792] net/http: fix data race due to writeLoop goroutine left running Fix a data race for clients that mutate requests after receiving a response error which is caused by the writeLoop goroutine left running, this can be seen on cancelled requests. Fixes #37669 Change-Id: Ia4743c6b8abde3a7503de362cc6a3782e19e7f60 Reviewed-on: https://go-review.googlesource.com/c/go/+/251858 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/net/http/transport.go | 10 +++- src/net/http/transport_test.go | 99 ++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index c23042b1e3..b97c4268b5 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -1967,6 +1967,15 @@ func (pc *persistConn) mapRoundTripError(req *transportRequest, startBytesWritte return nil } + // Wait for the writeLoop goroutine to terminate to avoid data + // races on callers who mutate the request on failure. + // + // When resc in pc.roundTrip and hence rc.ch receives a responseAndError + // with a non-nil error it implies that the persistConn is either closed + // or closing. Waiting on pc.writeLoopDone is hence safe as all callers + // close closech which in turn ensures writeLoop returns. + <-pc.writeLoopDone + // If the request was canceled, that's better than network // failures that were likely the result of tearing down the // connection. @@ -1992,7 +2001,6 @@ func (pc *persistConn) mapRoundTripError(req *transportRequest, startBytesWritte return err } if pc.isBroken() { - <-pc.writeLoopDone if pc.nwrite == startBytesWritten { return nothingWrittenError{err} } diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 2d9ca10bf0..f4b7623630 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -25,6 +25,7 @@ import ( "io" "io/ioutil" "log" + mrand "math/rand" "net" . "net/http" "net/http/httptest" @@ -6284,3 +6285,101 @@ func TestTransportRejectsSignInContentLength(t *testing.T) { t.Fatalf("Error mismatch\nGot: %q\nWanted substring: %q", got, want) } } + +// dumpConn is a net.Conn which writes to Writer and reads from Reader +type dumpConn struct { + io.Writer + io.Reader +} + +func (c *dumpConn) Close() error { return nil } +func (c *dumpConn) LocalAddr() net.Addr { return nil } +func (c *dumpConn) RemoteAddr() net.Addr { return nil } +func (c *dumpConn) SetDeadline(t time.Time) error { return nil } +func (c *dumpConn) SetReadDeadline(t time.Time) error { return nil } +func (c *dumpConn) SetWriteDeadline(t time.Time) error { return nil } + +// delegateReader is a reader that delegates to another reader, +// once it arrives on a channel. +type delegateReader struct { + c chan io.Reader + r io.Reader // nil until received from c +} + +func (r *delegateReader) Read(p []byte) (int, error) { + if r.r == nil { + var ok bool + if r.r, ok = <-r.c; !ok { + return 0, errors.New("delegate closed") + } + } + return r.r.Read(p) +} + +func testTransportRace(req *Request) { + save := req.Body + pr, pw := io.Pipe() + defer pr.Close() + defer pw.Close() + dr := &delegateReader{c: make(chan io.Reader)} + + t := &Transport{ + Dial: func(net, addr string) (net.Conn, error) { + return &dumpConn{pw, dr}, nil + }, + } + defer t.CloseIdleConnections() + + quitReadCh := make(chan struct{}) + // Wait for the request before replying with a dummy response: + go func() { + defer close(quitReadCh) + + req, err := ReadRequest(bufio.NewReader(pr)) + if err == nil { + // Ensure all the body is read; otherwise + // we'll get a partial dump. + io.Copy(ioutil.Discard, req.Body) + req.Body.Close() + } + select { + case dr.c <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n"): + case quitReadCh <- struct{}{}: + // Ensure delegate is closed so Read doesn't block forever. + close(dr.c) + } + }() + + t.RoundTrip(req) + + // Ensure the reader returns before we reset req.Body to prevent + // a data race on req.Body. + pw.Close() + <-quitReadCh + + req.Body = save +} + +// Issue 37669 +// Test that a cancellation doesn't result in a data race due to the writeLoop +// goroutine being left running, if the caller mutates the processed Request +// upon completion. +func TestErrorWriteLoopRace(t *testing.T) { + if testing.Short() { + return + } + t.Parallel() + for i := 0; i < 1000; i++ { + delay := time.Duration(mrand.Intn(5)) * time.Millisecond + ctx, cancel := context.WithTimeout(context.Background(), delay) + defer cancel() + + r := bytes.NewBuffer(make([]byte, 10000)) + req, err := NewRequestWithContext(ctx, MethodPost, "http://example.com", r) + if err != nil { + t.Fatal(err) + } + + testTransportRace(req) + } +} -- GitLab From cd91ab5d9601c975286f1ac83cd289e34aa117f8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 28 Aug 2020 21:32:05 -0400 Subject: [PATCH 0445/1792] cmd/go/internal/modload: fix spurious import resolution error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Due to a bug in CL 173017, if QueryPackages found multiple candidates for the given package and *at least* one of those candidates was not available to add, we would reject *all* such candidates — even those that were still viable. Now, we return the first viable candidate, and only return an error if *no* candidate is viable given the current build list. Fixes #41113 Change-Id: Idb2e77244be7c0f5dd511efb142c3059925d7336 Reviewed-on: https://go-review.googlesource.com/c/go/+/251446 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/import.go | 26 +++++++++-------- ...e.com_split-incompatible_subpkg_v0.1.0.txt | 14 ++++++++++ ...split-incompatible_v2.0.0+incompatible.txt | 10 +++++++ ...t-incompatible_v2.1.0-pre+incompatible.txt | 10 +++++++ .../testdata/script/mod_import_issue41113.txt | 28 +++++++++++++++++++ 5 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 src/cmd/go/testdata/mod/example.com_split-incompatible_subpkg_v0.1.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_split-incompatible_v2.0.0+incompatible.txt create mode 100644 src/cmd/go/testdata/mod/example.com_split-incompatible_v2.1.0-pre+incompatible.txt create mode 100644 src/cmd/go/testdata/script/mod_import_issue41113.txt diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index e04d66c5b1..c625184b8b 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -312,10 +312,10 @@ func queryImport(ctx context.Context, path string) (module.Version, error) { } } - m := candidates[0].Mod - newMissingVersion := "" - for _, c := range candidates { + candidate0MissingVersion := "" + for i, c := range candidates { cm := c.Mod + canAdd := true for _, bm := range buildList { if bm.Path == cm.Path && semver.Compare(bm.Version, cm.Version) > 0 { // QueryPackage proposed that we add module cm to provide the package, @@ -326,20 +326,22 @@ func queryImport(ctx context.Context, path string) (module.Version, error) { // version (e.g., v1.0.0) of a module, but we have a newer version // of the same module in the build list (e.g., v1.0.1-beta), and // the package is not present there. - // - // TODO(#41113): This is probably incorrect when there are multiple - // candidates, such as when a nested module is split out but only one - // half of the split is tagged. - m = cm - newMissingVersion = bm.Version + canAdd = false + if i == 0 { + candidate0MissingVersion = bm.Version + } break } } + if canAdd { + return cm, nil + } } - if newMissingVersion != "" { - return m, &ImportMissingError{Path: path, Module: m, newMissingVersion: newMissingVersion} + return module.Version{}, &ImportMissingError{ + Path: path, + Module: candidates[0].Mod, + newMissingVersion: candidate0MissingVersion, } - return m, nil } // maybeInModule reports whether, syntactically, diff --git a/src/cmd/go/testdata/mod/example.com_split-incompatible_subpkg_v0.1.0.txt b/src/cmd/go/testdata/mod/example.com_split-incompatible_subpkg_v0.1.0.txt new file mode 100644 index 0000000000..8f9e49176c --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_split-incompatible_subpkg_v0.1.0.txt @@ -0,0 +1,14 @@ +Written by hand. +Test case for getting a package that has been moved to a nested module, +with a +incompatible verison (and thus no go.mod file) at the root module. + +-- .mod -- +module example.com/split-incompatible/subpkg +-- .info -- +{"Version": "v0.1.0"} +-- go.mod -- +module example.com/split-incompatible/subpkg + +go 1.16 +-- subpkg.go -- +package subpkg diff --git a/src/cmd/go/testdata/mod/example.com_split-incompatible_v2.0.0+incompatible.txt b/src/cmd/go/testdata/mod/example.com_split-incompatible_v2.0.0+incompatible.txt new file mode 100644 index 0000000000..35c3f27710 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_split-incompatible_v2.0.0+incompatible.txt @@ -0,0 +1,10 @@ +Written by hand. +Test case for getting a package that has been moved to a nested module, +with a +incompatible verison (and thus no go.mod file) at the root module. + +-- .mod -- +module example.com/split-incompatible +-- .info -- +{"Version": "v2.0.0+incompatible"} +-- subpkg/subpkg.go -- +package subpkg diff --git a/src/cmd/go/testdata/mod/example.com_split-incompatible_v2.1.0-pre+incompatible.txt b/src/cmd/go/testdata/mod/example.com_split-incompatible_v2.1.0-pre+incompatible.txt new file mode 100644 index 0000000000..917fc0f559 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_split-incompatible_v2.1.0-pre+incompatible.txt @@ -0,0 +1,10 @@ +Written by hand. +Test case for getting a package that has been moved to a nested module, +with a +incompatible verison (and thus no go.mod file) at the root module. + +-- .mod -- +module example.com/split-incompatible +-- .info -- +{"Version": "v2.1.0-pre+incompatible"} +-- README.txt -- +subpkg has moved to module example.com/split-incompatible/subpkg diff --git a/src/cmd/go/testdata/script/mod_import_issue41113.txt b/src/cmd/go/testdata/script/mod_import_issue41113.txt new file mode 100644 index 0000000000..e98ac63d48 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_import_issue41113.txt @@ -0,0 +1,28 @@ +# Regression test for https://golang.org/issue/41113. +# +# When resolving a missing import path, the inability to add the package from +# one module path should not interfere with adding a nested path. + +# Initially, our module depends on split-incompatible v2.1.0-pre+incompatible, +# from which an imported package has been removed (and relocated to the nested +# split-incompatible/subpkg module). modload.QueryPackage will suggest +# split-incompatible v2.0.0+incompatible, which we cannot use (because it would +# be an implicit downgrade), and split-incompatible/subpkg v0.1.0, which we +# *should* use. + +go mod tidy + +go list -m all +stdout '^example.com/split-incompatible/subpkg v0\.1\.0$' +! stdout '^example.com/split-incompatible .*' + +-- go.mod -- +module golang.org/issue/41113 + +go 1.16 + +require example.com/split-incompatible v2.1.0-pre+incompatible +-- x.go -- +package issue41113 + +import _ "example.com/split-incompatible/subpkg" -- GitLab From b4944ef310ed43fad53c6128344e4bed2b346c88 Mon Sep 17 00:00:00 2001 From: Tzu-Chiao Yeh Date: Sun, 6 Sep 2020 09:43:34 +0800 Subject: [PATCH 0446/1792] cmd: update golang.org/x/tools to v0.0.0-20200901153117-6e59e24738da Includes the latest fix on vet to warn unused context.WithValue result. Fixes #41149 Change-Id: I06c204f40ef12b0f62f59b1bbdf1fe06ccd6565d Reviewed-on: https://go-review.googlesource.com/c/go/+/252941 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 15 +- .../go/analysis/passes/structtag/structtag.go | 6 +- .../go/analysis/passes/unmarshal/unmarshal.go | 7 +- .../passes/unusedresult/unusedresult.go | 2 +- .../internal/analysisinternal/analysis.go | 343 ++++++++++++++- .../x/tools/internal/lsp/fuzzy/input.go | 168 ++++++++ .../x/tools/internal/lsp/fuzzy/matcher.go | 398 ++++++++++++++++++ src/cmd/vendor/modules.txt | 3 +- 9 files changed, 912 insertions(+), 32 deletions(-) create mode 100644 src/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy/input.go create mode 100644 src/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy/matcher.go diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 68ce1705e4..0952dbb84c 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -9,6 +9,6 @@ require ( golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 // indirect - golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 + golang.org/x/tools v0.0.0-20200901153117-6e59e24738da golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316 // indirect ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index cb64a5d475..adbc5a96ac 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -6,33 +6,34 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200414190113-039b1ae3a340 h1:S1+yTUaFPXuDZnPDbO+TrDFIjPzQraYH8/CwSlu9Fac= github.com/ianlancetaylor/demangle v0.0.0-20200414190113-039b1ae3a340/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/arch v0.0.0-20200511175325-f7c78586839d h1:YvwchuJby5xEAPdBGmdAVSiVME50C+RJfJJwJJsGEV8= golang.org/x/arch v0.0.0-20200511175325-f7c78586839d/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449 h1:xUIPaMhvROX9dhPvRCenIJtU78+lbEenGbgqB5hfHCQ= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 h1:5B6i6EAiSYyejWfvc5Rc9BbI3rzIsrrXfAQBWnYfn+w= golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 h1:HHeAlu5H9b71C+Fx0K+1dGgVFN1DM1/wz4aoGOA5qS8= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200901153117-6e59e24738da h1:8nFbt74voFOsM+Hb5XtF+1SNbbf3dzikH5osZO1hyyo= +golang.org/x/tools v0.0.0-20200901153117-6e59e24738da/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316 h1:Jhw4VC65LaKnpq9FvcK+a8ZzrFm3D+UygvMMrhkOw70= golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 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 e09160379f..f0b15051c5 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 @@ -116,7 +116,11 @@ func checkCanonicalFieldTag(pass *analysis.Pass, field *types.Var, tag string, s } for _, enc := range [...]string{"json", "xml"} { - if reflect.StructTag(tag).Get(enc) != "" { + switch reflect.StructTag(tag).Get(enc) { + // Ignore warning if the field not exported and the tag is marked as + // ignored. + case "", "-": + default: pass.Reportf(field.Pos(), "struct field %s has %s tag but is not exported", field.Name(), enc) return } 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 f9cc993cbb..92b37caff9 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 @@ -30,7 +30,7 @@ var Analyzer = &analysis.Analyzer{ func run(pass *analysis.Pass) (interface{}, error) { switch pass.Pkg.Path() { - case "encoding/gob", "encoding/json", "encoding/xml": + case "encoding/gob", "encoding/json", "encoding/xml", "encoding/asn1": // These packages know how to use their own APIs. // Sometimes they are testing what happens to incorrect programs. return nil, nil @@ -53,9 +53,10 @@ func run(pass *analysis.Pass) (interface{}, error) { recv := fn.Type().(*types.Signature).Recv() if fn.Name() == "Unmarshal" && recv == nil { // "encoding/json".Unmarshal - // "encoding/xml".Unmarshal + // "encoding/xml".Unmarshal + // "encoding/asn1".Unmarshal switch fn.Pkg().Path() { - case "encoding/json", "encoding/xml": + case "encoding/json", "encoding/xml", "encoding/asn1": argidx = 1 // func([]byte, interface{}) } } else if fn.Name() == "Decode" && recv != nil { 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 76d4ab2382..bececee7e9 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 @@ -44,7 +44,7 @@ var funcs, stringMethods stringSetFlag func init() { // TODO(adonovan): provide a comment syntax to allow users to // add their functions to this set using facts. - funcs.Set("errors.New,fmt.Errorf,fmt.Sprintf,fmt.Sprint,sort.Reverse") + 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") 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 index 26586810c7..01f6e829f7 100644 --- a/src/cmd/vendor/golang.org/x/tools/internal/analysisinternal/analysis.go +++ b/src/cmd/vendor/golang.org/x/tools/internal/analysisinternal/analysis.go @@ -14,6 +14,12 @@ import ( "strings" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/internal/lsp/fuzzy" +) + +var ( + GetTypeErrors func(p interface{}) []types.Error + SetTypeErrors func(p interface{}, errors []types.Error) ) func TypeErrorEndPos(fset *token.FileSet, src []byte, start token.Pos) token.Pos { @@ -45,32 +51,34 @@ func ZeroValue(fset *token.FileSet, f *ast.File, pkg *types.Package, typ types.T default: panic("unknown basic type") } - case *types.Chan, *types.Interface, *types.Map, *types.Pointer, *types.Signature, *types.Slice: + case *types.Chan, *types.Interface, *types.Map, *types.Pointer, *types.Signature, *types.Slice, *types.Array: return ast.NewIdent("nil") case *types.Struct: - texpr := typeExpr(fset, f, pkg, typ) // typ because we want the name here. + texpr := TypeExpr(fset, f, pkg, typ) // typ because we want the name here. if texpr == nil { return nil } return &ast.CompositeLit{ Type: texpr, } - case *types.Array: - texpr := typeExpr(fset, f, pkg, u.Elem()) - if texpr == nil { - return nil - } - return &ast.CompositeLit{ - Type: &ast.ArrayType{ - Elt: texpr, - Len: &ast.BasicLit{Kind: token.INT, Value: fmt.Sprintf("%v", u.Len())}, - }, - } } return nil } -func typeExpr(fset *token.FileSet, f *ast.File, pkg *types.Package, typ types.Type) ast.Expr { +// 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 + } +} + +func TypeExpr(fset *token.FileSet, f *ast.File, pkg *types.Package, typ types.Type) ast.Expr { switch t := typ.(type) { case *types.Basic: switch t.Kind() { @@ -79,7 +87,96 @@ func typeExpr(fset *token.FileSet, f *ast.File, pkg *types.Package, typ types.Ty default: return ast.NewIdent(t.Name()) } + case *types.Pointer: + x := TypeExpr(fset, f, pkg, t.Elem()) + if x == nil { + return nil + } + return &ast.UnaryExpr{ + Op: token.MUL, + X: x, + } + case *types.Array: + elt := TypeExpr(fset, 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(fset, f, pkg, t.Elem()) + if elt == nil { + return nil + } + return &ast.ArrayType{ + Elt: elt, + } + case *types.Map: + key := TypeExpr(fset, f, pkg, t.Key()) + value := TypeExpr(fset, 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(fset, 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(fset, 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(fset, 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()) } @@ -101,14 +198,15 @@ func typeExpr(fset *token.FileSet, f *ast.File, pkg *types.Package, typ types.Ty 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 // TODO: anonymous structs, but who does that + return nil } } -var GetTypeErrors = func(p interface{}) []types.Error { return nil } -var SetTypeErrors = func(p interface{}, errors []types.Error) {} - type TypeErrorPass string const ( @@ -116,3 +214,212 @@ const ( NoResultValues TypeErrorPass = "noresultvalues" UndeclaredName TypeErrorPass = "undeclaredname" ) + +// 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) + }) +} + +// FindMatchingIdents finds 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 FindMatchingIdents(typs []types.Type, node ast.Node, pos token.Pos, info *types.Info, pkg *types.Package) map[types.Type][]*ast.Ident { + matches := map[types.Type][]*ast.Ident{} + // Initialize matches to contain the variable types we are searching for. + for _, typ := range typs { + if typ == nil { + continue + } + matches[typ] = []*ast.Ident{} + } + 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} + // + assignment, ok := n.(*ast.AssignStmt) + if ok && pos > assignment.Pos() && pos <= assignment.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. + if idents, ok := matches[obj.Type()]; ok { + matches[obj.Type()] = append(idents, ast.NewIdent(ident.Name)) + } + // 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 obj.Type() == typ { + continue + } + if equivalentTypes(obj.Type(), typ) { + matches[typ] = append(matches[typ], ast.NewIdent(ident.Name)) + } + } + return true + }) + return matches +} + +func equivalentTypes(want, got types.Type) bool { + if want == got || 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) +} + +// FindBestMatch employs fuzzy matching to evaluate the similarity of each given identifier to the +// given pattern. We return the identifier whose name is most similar to the pattern. +func FindBestMatch(pattern string, idents []*ast.Ident) ast.Expr { + fuzz := fuzzy.NewMatcher(pattern) + var bestFuzz ast.Expr + highScore := float32(0) // minimum score is 0 (no match) + for _, ident := range idents { + // TODO: Improve scoring algorithm. + score := fuzz.Score(ident.Name) + if score > highScore { + highScore = score + bestFuzz = ident + } else if score == 0 { + // Order matters in the fuzzy matching algorithm. If we find no match + // when matching the target to the identifier, try matching the identifier + // to the target. + revFuzz := fuzzy.NewMatcher(ident.Name) + revScore := revFuzz.Score(pattern) + if revScore > highScore { + highScore = revScore + bestFuzz = ident + } + } + } + return bestFuzz +} diff --git a/src/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy/input.go b/src/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy/input.go new file mode 100644 index 0000000000..ac377035ec --- /dev/null +++ b/src/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy/input.go @@ -0,0 +1,168 @@ +// 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 fuzzy + +import ( + "unicode" +) + +// RuneRole specifies the role of a rune in the context of an input. +type RuneRole byte + +const ( + // RNone specifies a rune without any role in the input (i.e., whitespace/non-ASCII). + RNone RuneRole = iota + // RSep specifies a rune with the role of segment separator. + RSep + // RTail specifies a rune which is a lower-case tail in a word in the input. + RTail + // RUCTail specifies a rune which is an upper-case tail in a word in the input. + RUCTail + // RHead specifies a rune which is the first character in a word in the input. + RHead +) + +// RuneRoles detects the roles of each byte rune in an input string and stores it in the output +// slice. The rune role depends on the input type. Stops when it parsed all the runes in the string +// or when it filled the output. If output is nil, then it gets created. +func RuneRoles(str string, reuse []RuneRole) []RuneRole { + var output []RuneRole + if cap(reuse) < len(str) { + output = make([]RuneRole, 0, len(str)) + } else { + output = reuse[:0] + } + + prev, prev2 := rtNone, rtNone + for i := 0; i < len(str); i++ { + r := rune(str[i]) + + role := RNone + + curr := rtLower + if str[i] <= unicode.MaxASCII { + curr = runeType(rt[str[i]] - '0') + } + + if curr == rtLower { + if prev == rtNone || prev == rtPunct { + role = RHead + } else { + role = RTail + } + } else if curr == rtUpper { + role = RHead + + if prev == rtUpper { + // This and previous characters are both upper case. + + if i+1 == len(str) { + // This is last character, previous was also uppercase -> this is UCTail + // i.e., (current char is C): aBC / BC / ABC + role = RUCTail + } + } + } else if curr == rtPunct { + switch r { + case '.', ':': + role = RSep + } + } + if curr != rtLower { + if i > 1 && output[i-1] == RHead && prev2 == rtUpper && (output[i-2] == RHead || output[i-2] == RUCTail) { + // The previous two characters were uppercase. The current one is not a lower case, so the + // previous one can't be a HEAD. Make it a UCTail. + // i.e., (last char is current char - B must be a UCTail): ABC / ZABC / AB. + output[i-1] = RUCTail + } + } + + output = append(output, role) + prev2 = prev + prev = curr + } + return output +} + +type runeType byte + +const ( + rtNone runeType = iota + rtPunct + rtLower + rtUpper +) + +const rt = "00000000000000000000000000000000000000000000001122222222221000000333333333333333333333333330000002222222222222222222222222200000" + +// LastSegment returns the substring representing the last segment from the input, where each +// byte has an associated RuneRole in the roles slice. This makes sense only for inputs of Symbol +// or Filename type. +func LastSegment(input string, roles []RuneRole) string { + // Exclude ending separators. + end := len(input) - 1 + for end >= 0 && roles[end] == RSep { + end-- + } + if end < 0 { + return "" + } + + start := end - 1 + for start >= 0 && roles[start] != RSep { + start-- + } + + return input[start+1 : end+1] +} + +// ToLower transforms the input string to lower case, which is stored in the output byte slice. +// The lower casing considers only ASCII values - non ASCII values are left unmodified. +// Stops when parsed all input or when it filled the output slice. If output is nil, then it gets +// created. +func ToLower(input string, reuse []byte) []byte { + output := reuse + if cap(reuse) < len(input) { + output = make([]byte, len(input)) + } + + for i := 0; i < len(input); i++ { + r := rune(input[i]) + if r <= unicode.MaxASCII { + if 'A' <= r && r <= 'Z' { + r += 'a' - 'A' + } + } + output[i] = byte(r) + } + return output[:len(input)] +} + +// WordConsumer defines a consumer for a word delimited by the [start,end) byte offsets in an input +// (start is inclusive, end is exclusive). +type WordConsumer func(start, end int) + +// Words find word delimiters in an input based on its bytes' mappings to rune roles. The offset +// delimiters for each word are fed to the provided consumer function. +func Words(roles []RuneRole, consume WordConsumer) { + var wordStart int + for i, r := range roles { + switch r { + case RUCTail, RTail: + case RHead, RNone, RSep: + if i != wordStart { + consume(wordStart, i) + } + wordStart = i + if r != RHead { + // Skip this character. + wordStart = i + 1 + } + } + } + if wordStart != len(roles) { + consume(wordStart, len(roles)) + } +} diff --git a/src/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy/matcher.go b/src/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy/matcher.go new file mode 100644 index 0000000000..16a643097d --- /dev/null +++ b/src/cmd/vendor/golang.org/x/tools/internal/lsp/fuzzy/matcher.go @@ -0,0 +1,398 @@ +// 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 fuzzy implements a fuzzy matching algorithm. +package fuzzy + +import ( + "bytes" + "fmt" +) + +const ( + // MaxInputSize is the maximum size of the input scored against the fuzzy matcher. Longer inputs + // will be truncated to this size. + MaxInputSize = 127 + // MaxPatternSize is the maximum size of the pattern used to construct the fuzzy matcher. Longer + // inputs are truncated to this size. + MaxPatternSize = 63 +) + +type scoreVal int + +func (s scoreVal) val() int { + return int(s) >> 1 +} + +func (s scoreVal) prevK() int { + return int(s) & 1 +} + +func score(val int, prevK int /*0 or 1*/) scoreVal { + return scoreVal(val<<1 + prevK) +} + +// Matcher implements a fuzzy matching algorithm for scoring candidates against a pattern. +// The matcher does not support parallel usage. +type Matcher struct { + pattern string + patternLower []byte // lower-case version of the pattern + patternShort []byte // first characters of the pattern + caseSensitive bool // set if the pattern is mix-cased + + patternRoles []RuneRole // the role of each character in the pattern + roles []RuneRole // the role of each character in the tested string + + scores [MaxInputSize + 1][MaxPatternSize + 1][2]scoreVal + + scoreScale float32 + + lastCandidateLen int // in bytes + lastCandidateMatched bool + + // Here we save the last candidate in lower-case. This is basically a byte slice we reuse for + // performance reasons, so the slice is not reallocated for every candidate. + lowerBuf [MaxInputSize]byte + rolesBuf [MaxInputSize]RuneRole +} + +func (m *Matcher) bestK(i, j int) int { + if m.scores[i][j][0].val() < m.scores[i][j][1].val() { + return 1 + } + return 0 +} + +// NewMatcher returns a new fuzzy matcher for scoring candidates against the provided pattern. +func NewMatcher(pattern string) *Matcher { + if len(pattern) > MaxPatternSize { + pattern = pattern[:MaxPatternSize] + } + + m := &Matcher{ + pattern: pattern, + patternLower: ToLower(pattern, nil), + } + + for i, c := range m.patternLower { + if pattern[i] != c { + m.caseSensitive = true + break + } + } + + if len(pattern) > 3 { + m.patternShort = m.patternLower[:3] + } else { + m.patternShort = m.patternLower + } + + m.patternRoles = RuneRoles(pattern, nil) + + if len(pattern) > 0 { + maxCharScore := 4 + m.scoreScale = 1 / float32(maxCharScore*len(pattern)) + } + + return m +} + +// Score returns the score returned by matching the candidate to the pattern. +// This is not designed for parallel use. Multiple candidates must be scored sequentially. +// Returns a score between 0 and 1 (0 - no match, 1 - perfect match). +func (m *Matcher) Score(candidate string) float32 { + if len(candidate) > MaxInputSize { + candidate = candidate[:MaxInputSize] + } + lower := ToLower(candidate, m.lowerBuf[:]) + m.lastCandidateLen = len(candidate) + + if len(m.pattern) == 0 { + // Empty patterns perfectly match candidates. + return 1 + } + + if m.match(candidate, lower) { + sc := m.computeScore(candidate, lower) + if sc > minScore/2 && !m.poorMatch() { + m.lastCandidateMatched = true + if len(m.pattern) == len(candidate) { + // Perfect match. + return 1 + } + + if sc < 0 { + sc = 0 + } + normalizedScore := float32(sc) * m.scoreScale + if normalizedScore > 1 { + normalizedScore = 1 + } + + return normalizedScore + } + } + + m.lastCandidateMatched = false + return 0 +} + +const minScore = -10000 + +// MatchedRanges returns matches ranges for the last scored string as a flattened array of +// [begin, end) byte offset pairs. +func (m *Matcher) MatchedRanges() []int { + if len(m.pattern) == 0 || !m.lastCandidateMatched { + return nil + } + i, j := m.lastCandidateLen, len(m.pattern) + if m.scores[i][j][0].val() < minScore/2 && m.scores[i][j][1].val() < minScore/2 { + return nil + } + + var ret []int + k := m.bestK(i, j) + for i > 0 { + take := (k == 1) + k = m.scores[i][j][k].prevK() + if take { + if len(ret) == 0 || ret[len(ret)-1] != i { + ret = append(ret, i) + ret = append(ret, i-1) + } else { + ret[len(ret)-1] = i - 1 + } + j-- + } + i-- + } + // Reverse slice. + for i := 0; i < len(ret)/2; i++ { + ret[i], ret[len(ret)-1-i] = ret[len(ret)-1-i], ret[i] + } + return ret +} + +func (m *Matcher) match(candidate string, candidateLower []byte) bool { + i, j := 0, 0 + for ; i < len(candidateLower) && j < len(m.patternLower); i++ { + if candidateLower[i] == m.patternLower[j] { + j++ + } + } + if j != len(m.patternLower) { + return false + } + + // The input passes the simple test against pattern, so it is time to classify its characters. + // Character roles are used below to find the last segment. + m.roles = RuneRoles(candidate, m.rolesBuf[:]) + + return true +} + +func (m *Matcher) computeScore(candidate string, candidateLower []byte) int { + pattLen, candLen := len(m.pattern), len(candidate) + + for j := 0; j <= len(m.pattern); j++ { + m.scores[0][j][0] = minScore << 1 + m.scores[0][j][1] = minScore << 1 + } + m.scores[0][0][0] = score(0, 0) // Start with 0. + + segmentsLeft, lastSegStart := 1, 0 + for i := 0; i < candLen; i++ { + if m.roles[i] == RSep { + segmentsLeft++ + lastSegStart = i + 1 + } + } + + // A per-character bonus for a consecutive match. + consecutiveBonus := 2 + wordIdx := 0 // Word count within segment. + for i := 1; i <= candLen; i++ { + + role := m.roles[i-1] + isHead := role == RHead + + if isHead { + wordIdx++ + } else if role == RSep && segmentsLeft > 1 { + wordIdx = 0 + segmentsLeft-- + } + + var skipPenalty int + if i == 1 || (i-1) == lastSegStart { + // Skipping the start of first or last segment. + skipPenalty++ + } + + for j := 0; j <= pattLen; j++ { + // By default, we don't have a match. Fill in the skip data. + m.scores[i][j][1] = minScore << 1 + + // Compute the skip score. + k := 0 + if m.scores[i-1][j][0].val() < m.scores[i-1][j][1].val() { + k = 1 + } + + skipScore := m.scores[i-1][j][k].val() + // Do not penalize missing characters after the last matched segment. + if j != pattLen { + skipScore -= skipPenalty + } + m.scores[i][j][0] = score(skipScore, k) + + if j == 0 || candidateLower[i-1] != m.patternLower[j-1] { + // Not a match. + continue + } + pRole := m.patternRoles[j-1] + + if role == RTail && pRole == RHead { + if j > 1 { + // Not a match: a head in the pattern matches a tail character in the candidate. + continue + } + // Special treatment for the first character of the pattern. We allow + // matches in the middle of a word if they are long enough, at least + // min(3, pattern.length) characters. + if !bytes.HasPrefix(candidateLower[i-1:], m.patternShort) { + continue + } + } + + // Compute the char score. + var charScore int + // Bonus 1: the char is in the candidate's last segment. + if segmentsLeft <= 1 { + charScore++ + } + // Bonus 2: Case match or a Head in the pattern aligns with one in the word. + // Single-case patterns lack segmentation signals and we assume any character + // can be a head of a segment. + if candidate[i-1] == m.pattern[j-1] || role == RHead && (!m.caseSensitive || pRole == RHead) { + charScore++ + } + + // Penalty 1: pattern char is Head, candidate char is Tail. + if role == RTail && pRole == RHead { + charScore-- + } + // Penalty 2: first pattern character matched in the middle of a word. + if j == 1 && role == RTail { + charScore -= 4 + } + + // Third dimension encodes whether there is a gap between the previous match and the current + // one. + for k := 0; k < 2; k++ { + sc := m.scores[i-1][j-1][k].val() + charScore + + isConsecutive := k == 1 || i-1 == 0 || i-1 == lastSegStart + if isConsecutive { + // Bonus 3: a consecutive match. First character match also gets a bonus to + // ensure prefix final match score normalizes to 1.0. + // Logically, this is a part of charScore, but we have to compute it here because it + // only applies for consecutive matches (k == 1). + sc += consecutiveBonus + } + if k == 0 { + // Penalty 3: Matching inside a segment (and previous char wasn't matched). Penalize for the lack + // of alignment. + if role == RTail || role == RUCTail { + sc -= 3 + } + } + + if sc > m.scores[i][j][1].val() { + m.scores[i][j][1] = score(sc, k) + } + } + } + } + + result := m.scores[len(candidate)][len(m.pattern)][m.bestK(len(candidate), len(m.pattern))].val() + + return result +} + +// ScoreTable returns the score table computed for the provided candidate. Used only for debugging. +func (m *Matcher) ScoreTable(candidate string) string { + var buf bytes.Buffer + + var line1, line2, separator bytes.Buffer + line1.WriteString("\t") + line2.WriteString("\t") + for j := 0; j < len(m.pattern); j++ { + line1.WriteString(fmt.Sprintf("%c\t\t", m.pattern[j])) + separator.WriteString("----------------") + } + + buf.WriteString(line1.String()) + buf.WriteString("\n") + buf.WriteString(separator.String()) + buf.WriteString("\n") + + for i := 1; i <= len(candidate); i++ { + line1.Reset() + line2.Reset() + + line1.WriteString(fmt.Sprintf("%c\t", candidate[i-1])) + line2.WriteString("\t") + + for j := 1; j <= len(m.pattern); j++ { + line1.WriteString(fmt.Sprintf("M%6d(%c)\t", m.scores[i][j][0].val(), dir(m.scores[i][j][0].prevK()))) + line2.WriteString(fmt.Sprintf("H%6d(%c)\t", m.scores[i][j][1].val(), dir(m.scores[i][j][1].prevK()))) + } + buf.WriteString(line1.String()) + buf.WriteString("\n") + buf.WriteString(line2.String()) + buf.WriteString("\n") + buf.WriteString(separator.String()) + buf.WriteString("\n") + } + + return buf.String() +} + +func dir(prevK int) rune { + if prevK == 0 { + return 'M' + } + return 'H' +} + +func (m *Matcher) poorMatch() bool { + if len(m.pattern) < 2 { + return false + } + + i, j := m.lastCandidateLen, len(m.pattern) + k := m.bestK(i, j) + + var counter, len int + for i > 0 { + take := (k == 1) + k = m.scores[i][j][k].prevK() + if take { + len++ + if k == 0 && len < 3 && m.roles[i-1] == RTail { + // Short match in the middle of a word + counter++ + if counter > 1 { + return true + } + } + j-- + } else { + len = 0 + } + i-- + } + return false +} diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index c0c008e038..c827365400 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -45,7 +45,7 @@ golang.org/x/mod/zip golang.org/x/sys/internal/unsafeheader golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/tools v0.0.0-20200616133436-c1934b75d054 +# golang.org/x/tools v0.0.0-20200901153117-6e59e24738da ## explicit golang.org/x/tools/go/analysis golang.org/x/tools/go/analysis/internal/analysisflags @@ -84,6 +84,7 @@ 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/lsp/fuzzy # golang.org/x/xerrors v0.0.0-20200806184451-1a77d5e9f316 ## explicit golang.org/x/xerrors -- GitLab From d27ebc7b8630993269c36e7728a7f30543ffa048 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 13 Mar 2020 16:32:37 -0400 Subject: [PATCH 0447/1792] cmd/go/internal/modload: implement the "all" pattern for lazy loading The new semantics of the "all" package pattern can be implemented without actually changing module loading per se. This change implements those semantics, so that the change can be decoupled from the changes to the module requirement graph. For #36460 Change-Id: I0ee8b17afa8b728dc470a42a540fcc01764a4442 Reviewed-on: https://go-review.googlesource.com/c/go/+/240623 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- doc/go1.16.html | 14 +++- src/cmd/go/internal/modcmd/tidy.go | 12 +++ src/cmd/go/internal/modcmd/why.go | 2 + src/cmd/go/internal/modload/load.go | 16 ++-- src/cmd/go/internal/modload/modfile.go | 22 ++++++ src/cmd/go/testdata/script/mod_all.txt | 100 +++++++++++++++++++++++-- 6 files changed, 154 insertions(+), 12 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 0ffaecc5a9..95e63d0d5a 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -52,7 +52,7 @@ Do not send CLs removing the interior tags from such phrases. TODO: write and link to tutorial or blog post

-

+

When using go test, a test that calls os.Exit(0) during execution of a test function will now be considered to fail. @@ -62,6 +62,18 @@ Do not send CLs removing the interior tags from such phrases. that is still considered to be a passing test.

+

The all pattern

+ +

+ When the main module's go.mod file + declares go 1.16 or higher, the all + package pattern now matches only those packages that are transitively imported + by a package or test found in the main module. (Packages imported by tests + of packages imported by the main module are no longer included.) This is + the same set of packages retained + by go mod vendor since Go 1.11. +

+

TODO

diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index c7c53d7c0c..4dcb62e02f 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -40,6 +40,18 @@ func runTidy(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go mod tidy: no arguments allowed") } + // Tidy aims to make 'go test' reproducible for any package in 'all', so we + // need to include test dependencies. For modules that specify go 1.15 or + // earlier this is a no-op (because 'all' saturates transitive test + // dependencies). + // + // However, with lazy loading (go 1.16+) 'all' includes only the packages that + // are transitively imported by the main module, not the test dependencies of + // those packages. In order to make 'go test' reproducible for the packages + // that are in 'all' but outside of the main module, we must explicitly + // request that their test dependencies be included. + modload.LoadTests = true + modload.LoadALL(ctx) modload.TidyBuildList() modload.TrimGoSum() diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index b16887d318..30b15fc153 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -65,6 +65,8 @@ func runWhy(ctx context.Context, cmd *base.Command, args []string) { loadALL := modload.LoadALL if *whyVendor { loadALL = modload.LoadVendor + } else { + modload.LoadTests = true } if *whyM { listU := false diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 2096dfb636..9cedc219b6 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -231,7 +231,7 @@ func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bo loaded = loadFromRoots(loaderParams{ tags: tags, allPatternIsRoot: allPatternIsRoot, - allClosesOverTests: true, // until lazy loading in Go 1.16+ + allClosesOverTests: index.allPatternClosesOverTests(), listRoots: func() (roots []string) { updateMatches(nil) @@ -450,7 +450,7 @@ func ImportFromFiles(ctx context.Context, gofiles []string) { roots = append(roots, testImports...) return roots }, - allClosesOverTests: true, // until lazy loading. + allClosesOverTests: index.allPatternClosesOverTests(), }) WriteGoMod() } @@ -501,7 +501,7 @@ func ReloadBuildList() []module.Version { loaded = loadFromRoots(loaderParams{ tags: imports.Tags(), listRoots: func() []string { return nil }, - allClosesOverTests: true, // until lazy loading, but doesn't matter because the root list is empty. + allClosesOverTests: index.allPatternClosesOverTests(), // but doesn't matter because the root list is empty. }) return buildList } @@ -512,9 +512,13 @@ func ReloadBuildList() []module.Version { // It adds modules to the build list as needed to satisfy new imports. // This set is useful for deciding whether a particular import is needed // anywhere in a module. +// +// In modules that specify "go 1.16" or higher, ALL follows only one layer of +// test dependencies. In "go 1.15" or lower, ALL follows the imports of tests of +// dependencies of tests. func LoadALL(ctx context.Context) []string { InitMod(ctx) - return loadAll(ctx, true) + return loadAll(ctx, index.allPatternClosesOverTests()) } // LoadVendor is like LoadALL but only follows test dependencies @@ -523,7 +527,9 @@ func LoadALL(ctx context.Context) []string { // This set is useful for identifying the which packages to include in a vendor directory. func LoadVendor(ctx context.Context) []string { InitMod(ctx) - return loadAll(ctx, false) + // 'go mod vendor' has never followed test dependencies since Go 1.11. + const closeOverTests = false + return loadAll(ctx, closeOverTests) } func loadAll(ctx context.Context, closeOverTests bool) []string { diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index a45c4a63be..18dd293ac9 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -25,6 +25,11 @@ import ( "golang.org/x/mod/semver" ) +// lazyLoadingVersion is the Go version (plus leading "v") at which lazy module +// loading takes effect. +const lazyLoadingVersionV = "v1.16" +const go116EnableLazyLoading = true + var modFile *modfile.File // A modFileIndex is an index of data corresponding to a modFile @@ -249,6 +254,23 @@ func indexModFile(data []byte, modFile *modfile.File, needsFix bool) *modFileInd return i } +// allPatternClosesOverTests reports whether the "all" pattern includes +// dependencies of tests outside the main module (as in Go 1.11–1.15). +// (Otherwise — as in Go 1.16+ — the "all" pattern includes only the packages +// transitively *imported by* the packages and tests in the main module.) +func (i *modFileIndex) allPatternClosesOverTests() bool { + if !go116EnableLazyLoading { + return true + } + if i != nil && semver.Compare(i.goVersionV, lazyLoadingVersionV) < 0 { + // The module explicitly predates the change in "all" for lazy loading, so + // continue to use the older interpretation. (If i == nil, we not in any + // module at all and should use the latest semantics.) + return true + } + return false +} + // modFileIsDirty reports whether the go.mod file differs meaningfully // from what was indexed. // If modFile has been changed (even cosmetically) since it was first read, diff --git a/src/cmd/go/testdata/script/mod_all.txt b/src/cmd/go/testdata/script/mod_all.txt index 9f4b0a4e4d..aac66292d6 100644 --- a/src/cmd/go/testdata/script/mod_all.txt +++ b/src/cmd/go/testdata/script/mod_all.txt @@ -187,17 +187,105 @@ stdout '^example.com/main_test \[example.com/main.test\]$' stdout '^example.com/main/testonly.test$' stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' -# TODO(#36460): +rm vendor + +# Convert all modules to go 1.16 to enable lazy loading. +go mod edit -go=1.16 a/go.mod +go mod edit -go=1.16 b/go.mod +go mod edit -go=1.16 c/go.mod +go mod edit -go=1.16 d/go.mod +go mod edit -go=1.16 q/go.mod +go mod edit -go=1.16 r/go.mod +go mod edit -go=1.16 s/go.mod +go mod edit -go=1.16 t/go.mod +go mod edit -go=1.16 u/go.mod +go mod edit -go=1.16 w/go.mod +go mod edit -go=1.16 x/go.mod +go mod edit -go=1.16 + +# With lazy loading, 'go list all' with neither -mod=vendor nor -test should +# match -mod=vendor without -test in 1.15. -# With lazy loading, 'go list all' without -mod=vendor should match -# 'go mod vendor'. +go list -f $PKGFMT all +stdout -count=8 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/main$' +stdout '^example.com/main/testonly$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/t$' +stdout '^example.com/u$' -# 'go list -test all' should expand that to cover test dependencies -# of packages imported by the main module. +# 'go list -test all' should expand that to include the test variants of the +# packages in 'all', but not the dependencies of outside tests. -# 'go list -m all' should cover the packages in 'go list -test all'. +go list -test -f $PKGFMT all +stdout -count=25 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/main$' +stdout '^example.com/main/testonly$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/t$' +stdout '^example.com/u$' +stdout '^example.com/a.test$' +stdout '^example.com/a_test \[example.com/a.test\]$' +stdout '^example.com/b.test$' +stdout '^example.com/b_test \[example.com/b.test\]$' +stdout '^example.com/main.test$' +stdout '^example.com/main \[example.com/main.test\]$' +stdout '^example.com/main_test \[example.com/main.test\]$' +stdout '^example.com/main/testonly.test$' +stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' +stdout '^example.com/q.test$' +stdout '^example.com/q_test \[example.com/q.test\]$' +stdout '^example.com/r.test$' +stdout '^example.com/r_test \[example.com/r.test\]$' +stdout '^example.com/t.test$' +stdout '^example.com/t_test \[example.com/t.test\]$' +stdout '^example.com/u.test$' +stdout '^example.com/u_test \[example.com/u.test\]$' + +# 'go list -test -deps all' should include the dependencies of those tests, +# but not the tests of the dependencies of outside tests. + +go list -test -deps -f $PKGFMT all +stdout -count=28 '^.' +stdout '^example.com/a$' +stdout '^example.com/b$' +stdout '^example.com/c$' +stdout '^example.com/main$' +stdout '^example.com/main/testonly$' +stdout '^example.com/q$' +stdout '^example.com/r$' +stdout '^example.com/s$' +stdout '^example.com/t$' +stdout '^example.com/u$' +stdout '^example.com/w$' +stdout '^example.com/a.test$' +stdout '^example.com/a_test \[example.com/a.test\]$' +stdout '^example.com/b.test$' +stdout '^example.com/b_test \[example.com/b.test\]$' +stdout '^example.com/main.test$' +stdout '^example.com/main \[example.com/main.test\]$' +stdout '^example.com/main_test \[example.com/main.test\]$' +stdout '^example.com/main/testonly.test$' +stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' +stdout '^example.com/q.test$' +stdout '^example.com/q_test \[example.com/q.test\]$' +stdout '^example.com/r.test$' +stdout '^example.com/r_test \[example.com/r.test\]$' +stdout '^example.com/t.test$' +stdout '^example.com/t_test \[example.com/t.test\]$' +stdout '^example.com/u.test$' +stdout '^example.com/u_test \[example.com/u.test\]$' +# TODO(#36460): +# 'go list -m all' should exactly cover the packages in 'go list -test all'. + -- go.mod -- module example.com/main -- GitLab From 363fb4bcc814069e3d80e22bd022599179ec1c62 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 1 Jul 2020 22:38:45 -0400 Subject: [PATCH 0448/1792] cmd/go/internal/modload: consolidate buildList and associated functions into one file Change-Id: I310c37c7f0ce5581f07cf6e27d1f6361d03b92ef Reviewed-on: https://go-review.googlesource.com/c/go/+/244077 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- src/cmd/go/internal/modget/get.go | 4 + src/cmd/go/internal/modload/buildlist.go | 117 +++++++++++++++++++++++ src/cmd/go/internal/modload/load.go | 103 -------------------- 3 files changed, 121 insertions(+), 103 deletions(-) create mode 100644 src/cmd/go/internal/modload/buildlist.go diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 4ca7f5b529..126b1f4bd4 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -628,6 +628,10 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { if err != nil { base.Fatalf("go: %v", err) } + + // TODO(bcmills) What should happen here under lazy loading? + // Downgrading may intentionally violate the lazy-loading invariants. + modload.SetBuildList(buildList) modload.ReloadBuildList() // note: does not update go.mod base.ExitIfErrors() diff --git a/src/cmd/go/internal/modload/buildlist.go b/src/cmd/go/internal/modload/buildlist.go new file mode 100644 index 0000000000..2302b044e8 --- /dev/null +++ b/src/cmd/go/internal/modload/buildlist.go @@ -0,0 +1,117 @@ +// 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 modload + +import ( + "cmd/go/internal/base" + "cmd/go/internal/cfg" + "cmd/go/internal/imports" + "cmd/go/internal/mvs" + "context" + "fmt" + "os" + + "golang.org/x/mod/module" +) + +// buildList is the list of modules to use for building packages. +// It is initialized by calling ImportPaths, ImportFromFiles, +// LoadALL, or LoadBuildList, each of which uses loaded.load. +// +// Ideally, exactly ONE of those functions would be called, +// and exactly once. Most of the time, that's true. +// During "go get" it may not be. TODO(rsc): Figure out if +// that restriction can be established, or else document why not. +// +var buildList []module.Version + +// LoadBuildList loads and returns the build list from go.mod. +// The loading of the build list happens automatically in ImportPaths: +// LoadBuildList need only be called if ImportPaths is not +// (typically in commands that care about the module but +// no particular package). +func LoadBuildList(ctx context.Context) []module.Version { + InitMod(ctx) + ReloadBuildList() + WriteGoMod() + return buildList +} + +// ReloadBuildList resets the state of loaded packages, then loads and returns +// the build list set in SetBuildList. +func ReloadBuildList() []module.Version { + loaded = loadFromRoots(loaderParams{ + tags: imports.Tags(), + listRoots: func() []string { return nil }, + allClosesOverTests: index.allPatternClosesOverTests(), // but doesn't matter because the root list is empty. + }) + return buildList +} + +// BuildList returns the module build list, +// typically constructed by a previous call to +// LoadBuildList or ImportPaths. +// The caller must not modify the returned list. +func BuildList() []module.Version { + return buildList +} + +// SetBuildList sets the module build list. +// The caller is responsible for ensuring that the list is valid. +// SetBuildList does not retain a reference to the original list. +func SetBuildList(list []module.Version) { + buildList = append([]module.Version{}, list...) +} + +// TidyBuildList trims the build list to the minimal requirements needed to +// retain the same versions of all packages from the preceding Load* or +// ImportPaths* call. +func TidyBuildList() { + used := map[module.Version]bool{Target: true} + for _, pkg := range loaded.pkgs { + used[pkg.mod] = true + } + + keep := []module.Version{Target} + var direct []string + for _, m := range buildList[1:] { + if used[m] { + keep = append(keep, m) + if loaded.direct[m.Path] { + direct = append(direct, m.Path) + } + } else if cfg.BuildV { + if _, ok := index.require[m]; ok { + fmt.Fprintf(os.Stderr, "unused %s\n", m.Path) + } + } + } + + min, err := mvs.Req(Target, direct, &mvsReqs{buildList: keep}) + if err != nil { + base.Fatalf("go: %v", err) + } + buildList = append([]module.Version{Target}, min...) +} + +// checkMultiplePaths verifies that a given module path is used as itself +// or as a replacement for another module, but not both at the same time. +// +// (See https://golang.org/issue/26607 and https://golang.org/issue/34650.) +func checkMultiplePaths() { + firstPath := make(map[module.Version]string, len(buildList)) + for _, mod := range buildList { + src := mod + if rep := Replacement(mod); rep.Path != "" { + src = rep + } + if prev, ok := firstPath[src]; !ok { + firstPath[src] = mod.Path + } else if prev != mod.Path { + base.Errorf("go: %s@%s used for two different module paths (%s and %s)", src.Path, src.Version, prev, mod.Path) + } + } + base.ExitIfErrors() +} diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 9cedc219b6..6050646594 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -118,22 +118,10 @@ import ( "cmd/go/internal/par" "cmd/go/internal/search" "cmd/go/internal/str" - "cmd/go/internal/trace" "golang.org/x/mod/module" ) -// buildList is the list of modules to use for building packages. -// It is initialized by calling ImportPaths, ImportFromFiles, -// LoadALL, or LoadBuildList, each of which uses loaded.load. -// -// Ideally, exactly ONE of those functions would be called, -// and exactly once. Most of the time, that's true. -// During "go get" it may not be. TODO(rsc): Figure out if -// that restriction can be established, or else document why not. -// -var buildList []module.Version - // loaded is the most recently-used package loader. // It holds details about individual packages. var loaded *loader @@ -250,26 +238,6 @@ func ImportPathsQuiet(ctx context.Context, patterns []string, tags map[string]bo return matches } -// checkMultiplePaths verifies that a given module path is used as itself -// or as a replacement for another module, but not both at the same time. -// -// (See https://golang.org/issue/26607 and https://golang.org/issue/34650.) -func checkMultiplePaths() { - firstPath := make(map[module.Version]string, len(buildList)) - for _, mod := range buildList { - src := mod - if rep := Replacement(mod); rep.Path != "" { - src = rep - } - if prev, ok := firstPath[src]; !ok { - firstPath[src] = mod.Path - } else if prev != mod.Path { - base.Errorf("go: %s@%s used for two different module paths (%s and %s)", src.Path, src.Version, prev, mod.Path) - } - } - base.ExitIfErrors() -} - // matchLocalDirs is like m.MatchDirs, but tries to avoid scanning directories // outside of the standard library and active modules. func matchLocalDirs(m *search.Match) { @@ -481,31 +449,6 @@ func DirImportPath(dir string) string { return "." } -// LoadBuildList loads and returns the build list from go.mod. -// The loading of the build list happens automatically in ImportPaths: -// LoadBuildList need only be called if ImportPaths is not -// (typically in commands that care about the module but -// no particular package). -func LoadBuildList(ctx context.Context) []module.Version { - ctx, span := trace.StartSpan(ctx, "LoadBuildList") - defer span.Done() - InitMod(ctx) - ReloadBuildList() - WriteGoMod() - return buildList -} - -// ReloadBuildList resets the state of loaded packages, then loads and returns -// the build list set in SetBuildList. -func ReloadBuildList() []module.Version { - loaded = loadFromRoots(loaderParams{ - tags: imports.Tags(), - listRoots: func() []string { return nil }, - allClosesOverTests: index.allPatternClosesOverTests(), // but doesn't matter because the root list is empty. - }) - return buildList -} - // LoadALL returns the set of all packages in the current module // and their dependencies in any other modules, without filtering // due to build tags, except "+build ignore". @@ -571,52 +514,6 @@ func TargetPackages(ctx context.Context, pattern string) *search.Match { return m } -// BuildList returns the module build list, -// typically constructed by a previous call to -// LoadBuildList or ImportPaths. -// The caller must not modify the returned list. -func BuildList() []module.Version { - return buildList -} - -// SetBuildList sets the module build list. -// The caller is responsible for ensuring that the list is valid. -// SetBuildList does not retain a reference to the original list. -func SetBuildList(list []module.Version) { - buildList = append([]module.Version{}, list...) -} - -// TidyBuildList trims the build list to the minimal requirements needed to -// retain the same versions of all packages from the preceding Load* or -// ImportPaths* call. -func TidyBuildList() { - used := map[module.Version]bool{Target: true} - for _, pkg := range loaded.pkgs { - used[pkg.mod] = true - } - - keep := []module.Version{Target} - var direct []string - for _, m := range buildList[1:] { - if used[m] { - keep = append(keep, m) - if loaded.direct[m.Path] { - direct = append(direct, m.Path) - } - } else if cfg.BuildV { - if _, ok := index.require[m]; ok { - fmt.Fprintf(os.Stderr, "unused %s\n", m.Path) - } - } - } - - min, err := mvs.Req(Target, direct, &mvsReqs{buildList: keep}) - if err != nil { - base.Fatalf("go: %v", err) - } - buildList = append([]module.Version{Target}, min...) -} - // ImportMap returns the actual package import path // for an import path found in source code. // If the given import path does not appear in the source code -- GitLab From 521393e7e05cd9272ae6023387fa92839d72eb4f Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 27 Jul 2020 13:57:12 -0400 Subject: [PATCH 0449/1792] cmd/go/internal/modget: move MVS code to a separate file For #36460 Change-Id: Ie81c03df18c6987527da765d5f6575556340cb01 Reviewed-on: https://go-review.googlesource.com/c/go/+/249877 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- src/cmd/go/internal/modget/get.go | 188 +-------------------------- src/cmd/go/internal/modget/mvs.go | 202 ++++++++++++++++++++++++++++++ 2 files changed, 203 insertions(+), 187 deletions(-) create mode 100644 src/cmd/go/internal/modget/mvs.go diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 126b1f4bd4..cf9ad66b3d 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -290,7 +290,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // what was requested. modload.DisallowWriteGoMod() - // Allow looking up modules for import paths outside of a module. + // Allow looking up modules for import paths when outside of a module. // 'go get' is expected to do this, unlike other commands. modload.AllowMissingModuleImports() @@ -885,192 +885,6 @@ func getQuery(ctx context.Context, path, vers string, prevM module.Version, forc return m, nil } -// An upgrader adapts an underlying mvs.Reqs to apply an -// upgrade policy to a list of targets and their dependencies. -type upgrader struct { - mvs.Reqs - - // cmdline maps a module path to a query made for that module at a - // specific target version. Each query corresponds to a module - // matched by a command line argument. - cmdline map[string]*query - - // upgrade is a set of modules providing dependencies of packages - // matched by command line arguments. If -u or -u=patch is set, - // these modules are upgraded accordingly. - upgrade map[string]bool -} - -// newUpgrader creates an upgrader. cmdline contains queries made at -// specific versions for modules matched by command line arguments. pkgs -// is the set of packages matched by command line arguments. If -u or -u=patch -// is set, modules providing dependencies of pkgs are upgraded accordingly. -func newUpgrader(cmdline map[string]*query, pkgs map[string]bool) *upgrader { - u := &upgrader{ - Reqs: modload.Reqs(), - cmdline: cmdline, - } - if getU != "" { - u.upgrade = make(map[string]bool) - - // Traverse package import graph. - // Initialize work queue with root packages. - seen := make(map[string]bool) - var work []string - add := func(path string) { - if !seen[path] { - seen[path] = true - work = append(work, path) - } - } - for pkg := range pkgs { - add(pkg) - } - for len(work) > 0 { - pkg := work[0] - work = work[1:] - m := modload.PackageModule(pkg) - u.upgrade[m.Path] = true - - // testImports is empty unless test imports were actually loaded, - // i.e., -t was set or "all" was one of the arguments. - imports, testImports := modload.PackageImports(pkg) - for _, imp := range imports { - add(imp) - } - for _, imp := range testImports { - add(imp) - } - } - } - return u -} - -// Required returns the requirement list for m. -// For the main module, we override requirements with the modules named -// one the command line, and we include new requirements. Otherwise, -// we defer to u.Reqs. -func (u *upgrader) Required(m module.Version) ([]module.Version, error) { - rs, err := u.Reqs.Required(m) - if err != nil { - return nil, err - } - if m != modload.Target { - return rs, nil - } - - overridden := make(map[string]bool) - for i, m := range rs { - if q := u.cmdline[m.Path]; q != nil && q.m.Version != "none" { - rs[i] = q.m - overridden[q.m.Path] = true - } - } - for _, q := range u.cmdline { - if !overridden[q.m.Path] && q.m.Path != modload.Target.Path && q.m.Version != "none" { - rs = append(rs, q.m) - } - } - return rs, nil -} - -// Upgrade returns the desired upgrade for m. -// -// If m was requested at a specific version on the command line, then -// Upgrade returns that version. -// -// If -u is set and m provides a dependency of a package matched by -// command line arguments, then Upgrade may provider a newer tagged version. -// If m is a tagged version, then Upgrade will return the latest tagged -// version (with the same minor version number if -u=patch). -// If m is a pseudo-version, then Upgrade returns the latest tagged version -// only if that version has a time-stamp newer than m. This special case -// prevents accidental downgrades when already using a pseudo-version -// newer than the latest tagged version. -// -// If none of the above cases apply, then Upgrade returns m. -func (u *upgrader) Upgrade(m module.Version) (module.Version, error) { - // Allow pkg@vers on the command line to override the upgrade choice v. - // If q's version is < m.Version, then we're going to downgrade anyway, - // and it's cleaner to avoid moving back and forth and picking up - // extraneous other newer dependencies. - // If q's version is > m.Version, then we're going to upgrade past - // m.Version anyway, and again it's cleaner to avoid moving back and forth - // picking up extraneous other newer dependencies. - if q := u.cmdline[m.Path]; q != nil { - return q.m, nil - } - - if !u.upgrade[m.Path] { - // Not involved in upgrade. Leave alone. - return m, nil - } - - // Run query required by upgrade semantics. - // Note that Query "latest" is not the same as using repo.Latest, - // which may return a pseudoversion for the latest commit. - // Query "latest" returns the newest tagged version or the newest - // prerelease version if there are no non-prereleases, or repo.Latest - // if there aren't any tagged versions. - // If we're querying "upgrade" or "patch", Query will compare the current - // version against the chosen version and will return the current version - // if it is newer. - info, err := modload.Query(context.TODO(), m.Path, string(getU), m.Version, modload.CheckAllowed) - if err != nil { - // Report error but return m, to let version selection continue. - // (Reporting the error will fail the command at the next base.ExitIfErrors.) - - // Special case: if the error is for m.Version itself and m.Version has a - // replacement, then keep it and don't report the error: the fact that the - // version is invalid is likely the reason it was replaced to begin with. - var vErr *module.InvalidVersionError - if errors.As(err, &vErr) && vErr.Version == m.Version && modload.Replacement(m).Path != "" { - return m, nil - } - - // Special case: if the error is "no matching versions" then don't - // even report the error. Because Query does not consider pseudo-versions, - // it may happen that we have a pseudo-version but during -u=patch - // the query v0.0 matches no versions (not even the one we're using). - var noMatch *modload.NoMatchingVersionError - if !errors.As(err, &noMatch) { - base.Errorf("go get: upgrading %s@%s: %v", m.Path, m.Version, err) - } - return m, nil - } - - if info.Version != m.Version { - logOncef("go: %s %s => %s", m.Path, getU, info.Version) - } - return module.Version{Path: m.Path, Version: info.Version}, nil -} - -// buildListForLostUpgrade returns the build list for the module graph -// rooted at lost. Unlike mvs.BuildList, the target module (lost) is not -// treated specially. The returned build list may contain a newer version -// of lost. -// -// buildListForLostUpgrade is used after a downgrade has removed a module -// requested at a specific version. This helps us understand the requirements -// implied by each downgrade. -func buildListForLostUpgrade(lost module.Version, reqs mvs.Reqs) ([]module.Version, error) { - return mvs.BuildList(lostUpgradeRoot, &lostUpgradeReqs{Reqs: reqs, lost: lost}) -} - -var lostUpgradeRoot = module.Version{Path: "lost-upgrade-root", Version: ""} - -type lostUpgradeReqs struct { - mvs.Reqs - lost module.Version -} - -func (r *lostUpgradeReqs) Required(mod module.Version) ([]module.Version, error) { - if mod == lostUpgradeRoot { - return []module.Version{r.lost}, nil - } - return r.Reqs.Required(mod) -} - // reportRetractions prints warnings if any modules in the build list are // retracted. func reportRetractions(ctx context.Context) { diff --git a/src/cmd/go/internal/modget/mvs.go b/src/cmd/go/internal/modget/mvs.go new file mode 100644 index 0000000000..19fffd2947 --- /dev/null +++ b/src/cmd/go/internal/modget/mvs.go @@ -0,0 +1,202 @@ +// 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 modget + +import ( + "context" + "errors" + + "cmd/go/internal/base" + "cmd/go/internal/modload" + "cmd/go/internal/mvs" + + "golang.org/x/mod/module" +) + +// An upgrader adapts an underlying mvs.Reqs to apply an +// upgrade policy to a list of targets and their dependencies. +type upgrader struct { + mvs.Reqs + + // cmdline maps a module path to a query made for that module at a + // specific target version. Each query corresponds to a module + // matched by a command line argument. + cmdline map[string]*query + + // upgrade is a set of modules providing dependencies of packages + // matched by command line arguments. If -u or -u=patch is set, + // these modules are upgraded accordingly. + upgrade map[string]bool +} + +// newUpgrader creates an upgrader. cmdline contains queries made at +// specific versions for modules matched by command line arguments. pkgs +// is the set of packages matched by command line arguments. If -u or -u=patch +// is set, modules providing dependencies of pkgs are upgraded accordingly. +func newUpgrader(cmdline map[string]*query, pkgs map[string]bool) *upgrader { + u := &upgrader{ + Reqs: modload.Reqs(), + cmdline: cmdline, + } + if getU != "" { + u.upgrade = make(map[string]bool) + + // Traverse package import graph. + // Initialize work queue with root packages. + seen := make(map[string]bool) + var work []string + add := func(path string) { + if !seen[path] { + seen[path] = true + work = append(work, path) + } + } + for pkg := range pkgs { + add(pkg) + } + for len(work) > 0 { + pkg := work[0] + work = work[1:] + m := modload.PackageModule(pkg) + u.upgrade[m.Path] = true + + // testImports is empty unless test imports were actually loaded, + // i.e., -t was set or "all" was one of the arguments. + imports, testImports := modload.PackageImports(pkg) + for _, imp := range imports { + add(imp) + } + for _, imp := range testImports { + add(imp) + } + } + } + return u +} + +// Required returns the requirement list for m. +// For the main module, we override requirements with the modules named +// one the command line, and we include new requirements. Otherwise, +// we defer to u.Reqs. +func (u *upgrader) Required(m module.Version) ([]module.Version, error) { + rs, err := u.Reqs.Required(m) + if err != nil { + return nil, err + } + if m != modload.Target { + return rs, nil + } + + overridden := make(map[string]bool) + for i, m := range rs { + if q := u.cmdline[m.Path]; q != nil && q.m.Version != "none" { + rs[i] = q.m + overridden[q.m.Path] = true + } + } + for _, q := range u.cmdline { + if !overridden[q.m.Path] && q.m.Path != modload.Target.Path && q.m.Version != "none" { + rs = append(rs, q.m) + } + } + return rs, nil +} + +// Upgrade returns the desired upgrade for m. +// +// If m was requested at a specific version on the command line, then +// Upgrade returns that version. +// +// If -u is set and m provides a dependency of a package matched by +// command line arguments, then Upgrade may provider a newer tagged version. +// If m is a tagged version, then Upgrade will return the latest tagged +// version (with the same minor version number if -u=patch). +// If m is a pseudo-version, then Upgrade returns the latest tagged version +// only if that version has a time-stamp newer than m. This special case +// prevents accidental downgrades when already using a pseudo-version +// newer than the latest tagged version. +// +// If none of the above cases apply, then Upgrade returns m. +func (u *upgrader) Upgrade(m module.Version) (module.Version, error) { + // Allow pkg@vers on the command line to override the upgrade choice v. + // If q's version is < m.Version, then we're going to downgrade anyway, + // and it's cleaner to avoid moving back and forth and picking up + // extraneous other newer dependencies. + // If q's version is > m.Version, then we're going to upgrade past + // m.Version anyway, and again it's cleaner to avoid moving back and forth + // picking up extraneous other newer dependencies. + if q := u.cmdline[m.Path]; q != nil { + return q.m, nil + } + + if !u.upgrade[m.Path] { + // Not involved in upgrade. Leave alone. + return m, nil + } + + // Run query required by upgrade semantics. + // Note that Query "latest" is not the same as using repo.Latest, + // which may return a pseudoversion for the latest commit. + // Query "latest" returns the newest tagged version or the newest + // prerelease version if there are no non-prereleases, or repo.Latest + // if there aren't any tagged versions. + // If we're querying "upgrade" or "patch", Query will compare the current + // version against the chosen version and will return the current version + // if it is newer. + info, err := modload.Query(context.TODO(), m.Path, string(getU), m.Version, modload.CheckAllowed) + if err != nil { + // Report error but return m, to let version selection continue. + // (Reporting the error will fail the command at the next base.ExitIfErrors.) + + // Special case: if the error is for m.Version itself and m.Version has a + // replacement, then keep it and don't report the error: the fact that the + // version is invalid is likely the reason it was replaced to begin with. + var vErr *module.InvalidVersionError + if errors.As(err, &vErr) && vErr.Version == m.Version && modload.Replacement(m).Path != "" { + return m, nil + } + + // Special case: if the error is "no matching versions" then don't + // even report the error. Because Query does not consider pseudo-versions, + // it may happen that we have a pseudo-version but during -u=patch + // the query v0.0 matches no versions (not even the one we're using). + var noMatch *modload.NoMatchingVersionError + if !errors.As(err, &noMatch) { + base.Errorf("go get: upgrading %s@%s: %v", m.Path, m.Version, err) + } + return m, nil + } + + if info.Version != m.Version { + logOncef("go: %s %s => %s", m.Path, getU, info.Version) + } + return module.Version{Path: m.Path, Version: info.Version}, nil +} + +// buildListForLostUpgrade returns the build list for the module graph +// rooted at lost. Unlike mvs.BuildList, the target module (lost) is not +// treated specially. The returned build list may contain a newer version +// of lost. +// +// buildListForLostUpgrade is used after a downgrade has removed a module +// requested at a specific version. This helps us understand the requirements +// implied by each downgrade. +func buildListForLostUpgrade(lost module.Version, reqs mvs.Reqs) ([]module.Version, error) { + return mvs.BuildList(lostUpgradeRoot, &lostUpgradeReqs{Reqs: reqs, lost: lost}) +} + +var lostUpgradeRoot = module.Version{Path: "lost-upgrade-root", Version: ""} + +type lostUpgradeReqs struct { + mvs.Reqs + lost module.Version +} + +func (r *lostUpgradeReqs) Required(mod module.Version) ([]module.Version, error) { + if mod == lostUpgradeRoot { + return []module.Version{r.lost}, nil + } + return r.Reqs.Required(mod) +} -- GitLab From 564b350c08a1906e8f6a876fef4cca71f6516d4c Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 27 Jul 2020 12:57:36 -0400 Subject: [PATCH 0450/1792] cmd/go/internal/modload: rename LoadBuildList and BuildList MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With lazy loading, the “build list” can be refined as packages are loaded. Rename functions that return the build list to more precisely describe the set of modules returned by the call. Also eliminate a redundant call to LoadBuildList (right before ListModules, which itself begins with the same call). For #36460 Change-Id: I0fc4f9dd7602e0df5e166e329ee5d516d810ca53 Reviewed-on: https://go-review.googlesource.com/c/go/+/249878 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/list/list.go | 2 - src/cmd/go/internal/modcmd/graph.go | 2 +- src/cmd/go/internal/modcmd/vendor.go | 2 +- src/cmd/go/internal/modcmd/verify.go | 2 +- src/cmd/go/internal/modget/get.go | 10 ++--- src/cmd/go/internal/modload/build.go | 2 +- src/cmd/go/internal/modload/buildlist.go | 47 +++++++++++++----------- src/cmd/go/internal/modload/list.go | 2 +- 8 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 65003dc883..23500dd9d8 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -437,8 +437,6 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { } } - modload.LoadBuildList(ctx) - mods := modload.ListModules(ctx, args, *listU, *listVersions, *listRetracted) if !*listE { for _, m := range mods { diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index 6da12b9cab..513536a010 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -48,7 +48,7 @@ func runGraph(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go: cannot find main module; see 'go help modules'") } } - modload.LoadBuildList(ctx) + modload.LoadAllModules(ctx) reqs := modload.MinReqs() format := func(m module.Version) string { diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index e5353b5c7f..30334f3a42 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -77,7 +77,7 @@ func runVendor(ctx context.Context, cmd *base.Command, args []string) { } var buf bytes.Buffer - for _, m := range modload.BuildList()[1:] { + for _, m := range modload.LoadedModules()[1:] { if pkgs := modpkgs[m]; len(pkgs) > 0 || isExplicit[m] { line := moduleLine(m, modload.Replacement(m)) buf.WriteString(line) diff --git a/src/cmd/go/internal/modcmd/verify.go b/src/cmd/go/internal/modcmd/verify.go index 73ab714d10..d542825823 100644 --- a/src/cmd/go/internal/modcmd/verify.go +++ b/src/cmd/go/internal/modcmd/verify.go @@ -60,7 +60,7 @@ func runVerify(ctx context.Context, cmd *base.Command, args []string) { sem := make(chan token, runtime.GOMAXPROCS(0)) // Use a slice of result channels, so that the output is deterministic. - mods := modload.LoadBuildList(ctx)[1:] + mods := modload.LoadAllModules(ctx)[1:] errsChans := make([]<-chan []error, len(mods)) for i, mod := range mods { diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index cf9ad66b3d..a2a8287d84 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -278,7 +278,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { } modload.LoadTests = *getT - buildList := modload.LoadBuildList(ctx) + buildList := modload.LoadAllModules(ctx) buildList = buildList[:len(buildList):len(buildList)] // copy on append versionByPath := make(map[string]string) for _, m := range buildList { @@ -599,7 +599,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { base.ExitIfErrors() // Stop if no changes have been made to the build list. - buildList = modload.BuildList() + buildList = modload.LoadedModules() eq := len(buildList) == len(prevBuildList) for i := 0; eq && i < len(buildList); i++ { eq = buildList[i] == prevBuildList[i] @@ -617,7 +617,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // Handle downgrades. var down []module.Version - for _, m := range modload.BuildList() { + for _, m := range modload.LoadedModules() { q := byPath[m.Path] if q != nil && semver.Compare(m.Version, q.m.Version) > 0 { down = append(down, module.Version{Path: m.Path, Version: q.m.Version}) @@ -641,7 +641,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { var lostUpgrades []*query if len(down) > 0 { versionByPath = make(map[string]string) - for _, m := range modload.BuildList() { + for _, m := range modload.LoadedModules() { versionByPath[m.Path] = m.Version } for _, q := range byPath { @@ -892,7 +892,7 @@ func reportRetractions(ctx context.Context) { // Use modload.ListModules, since that provides information in the same format // as 'go list -m'. Don't query for "all", since that's not allowed outside a // module. - buildList := modload.BuildList() + buildList := modload.LoadedModules() args := make([]string, 0, len(buildList)) for _, m := range buildList { if m.Version == "" { diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index e9f9a82fab..9ca6230500 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -76,7 +76,7 @@ func ModuleInfo(ctx context.Context, path string) *modinfo.ModulePublic { return moduleInfo(ctx, m, fromBuildList, listRetracted) } - for _, m := range BuildList() { + for _, m := range LoadedModules() { if m.Path == path { fromBuildList := true return moduleInfo(ctx, m, fromBuildList, listRetracted) diff --git a/src/cmd/go/internal/modload/buildlist.go b/src/cmd/go/internal/modload/buildlist.go index 2302b044e8..581a1b944a 100644 --- a/src/cmd/go/internal/modload/buildlist.go +++ b/src/cmd/go/internal/modload/buildlist.go @@ -27,34 +27,28 @@ import ( // var buildList []module.Version -// LoadBuildList loads and returns the build list from go.mod. -// The loading of the build list happens automatically in ImportPaths: -// LoadBuildList need only be called if ImportPaths is not -// (typically in commands that care about the module but -// no particular package). -func LoadBuildList(ctx context.Context) []module.Version { +// LoadAllModules loads and returns the list of modules matching the "all" +// module pattern, starting with the Target module and in a deterministic +// (stable) order, without loading any packages. +// +// Modules are loaded automatically (and lazily) in ImportPaths: +// LoadAllModules need only be called if ImportPaths is not, +// typically in commands that care about modules but no particular package. +// +// The caller must not modify the returned list. +func LoadAllModules(ctx context.Context) []module.Version { InitMod(ctx) ReloadBuildList() WriteGoMod() return buildList } -// ReloadBuildList resets the state of loaded packages, then loads and returns -// the build list set in SetBuildList. -func ReloadBuildList() []module.Version { - loaded = loadFromRoots(loaderParams{ - tags: imports.Tags(), - listRoots: func() []string { return nil }, - allClosesOverTests: index.allPatternClosesOverTests(), // but doesn't matter because the root list is empty. - }) - return buildList -} - -// BuildList returns the module build list, -// typically constructed by a previous call to -// LoadBuildList or ImportPaths. +// LoadedModules returns the list of module requirements loaded or set by a +// previous call (typically LoadAllModules or ImportPaths), starting with the +// Target module and in a deterministic (stable) order. +// // The caller must not modify the returned list. -func BuildList() []module.Version { +func LoadedModules() []module.Version { return buildList } @@ -65,6 +59,17 @@ func SetBuildList(list []module.Version) { buildList = append([]module.Version{}, list...) } +// ReloadBuildList resets the state of loaded packages, then loads and returns +// the build list set in SetBuildList. +func ReloadBuildList() []module.Version { + loaded = loadFromRoots(loaderParams{ + tags: imports.Tags(), + listRoots: func() []string { return nil }, + allClosesOverTests: index.allPatternClosesOverTests(), // but doesn't matter because the root list is empty. + }) + return buildList +} + // TidyBuildList trims the build list to the minimal requirements needed to // retain the same versions of all packages from the preceding Load* or // ImportPaths* call. diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 8c7b9a3950..3491f941cd 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -58,7 +58,7 @@ func ListModules(ctx context.Context, args []string, listU, listVersions, listRe } func listModules(ctx context.Context, args []string, listVersions, listRetracted bool) []*modinfo.ModulePublic { - LoadBuildList(ctx) + LoadAllModules(ctx) if len(args) == 0 { return []*modinfo.ModulePublic{moduleInfo(ctx, buildList[0], true, listRetracted)} } -- GitLab From aa476ba6f43ebc4e7ddb6599a7ad35d9fbf1ec6d Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 1 Sep 2020 00:34:03 -0400 Subject: [PATCH 0451/1792] cmd/go/internal/modload: refactor pathInModuleCache I found the control flow of this function a bit tricky to reason about due to nesting and interaction between conditions and iteration. This change factors out a helper function that can return early instead of mixing conditionals and 'continue' statements. Also remove the (unused) ModuleUsedDirectly function. For #36460 Change-Id: I60a2a5a1b32989e5a17a14e1a8c858b280cda8f2 Reviewed-on: https://go-review.googlesource.com/c/go/+/251998 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/load.go | 33 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 6050646594..1664d8c5be 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -374,7 +374,7 @@ var ( // pathInModuleCache returns the import path of the directory dir, // if dir is in the module cache copy of a module in our build list. func pathInModuleCache(dir string) string { - for _, m := range buildList[1:] { + tryMod := func(m module.Version) (string, bool) { var root string var err error if repl := Replacement(m); repl.Path != "" && repl.Version == "" { @@ -388,13 +388,26 @@ func pathInModuleCache(dir string) string { root, err = modfetch.DownloadDir(m) } if err != nil { - continue + return "", false } - if sub := search.InDir(dir, root); sub != "" { - sub = filepath.ToSlash(sub) - if !strings.Contains(sub, "/vendor/") && !strings.HasPrefix(sub, "vendor/") && !strings.Contains(sub, "@") { - return path.Join(m.Path, filepath.ToSlash(sub)) - } + + sub := search.InDir(dir, root) + if sub == "" { + return "", false + } + sub = filepath.ToSlash(sub) + if strings.Contains(sub, "/vendor/") || strings.HasPrefix(sub, "vendor/") || strings.Contains(sub, "@") { + return "", false + } + + return path.Join(m.Path, filepath.ToSlash(sub)), true + } + + for _, m := range buildList[1:] { + if importPath, ok := tryMod(m); ok { + // checkMultiplePaths ensures that a module can be used for at most one + // requirement, so this must be it. + return importPath } } return "" @@ -568,12 +581,6 @@ func PackageImports(path string) (imports, testImports []string) { return imports, testImports } -// ModuleUsedDirectly reports whether the main module directly imports -// some package in the module with the given path. -func ModuleUsedDirectly(path string) bool { - return loaded.direct[path] -} - // Lookup returns the source directory, import path, and any loading error for // the package at path as imported from the package in parentDir. // Lookup requires that one of the Load functions in this package has already -- GitLab From dfdc3880b01d46d1d8125ab9eea0606b2fa5b819 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Thu, 20 Aug 2020 17:02:18 +0800 Subject: [PATCH 0452/1792] cmd/internal/obj/arm64: enable some SIMD instructions Enable VBSL, VBIT, VCMTST, VUXTL VUXTL2 and FMOVQ SIMD instructions required by the issue #40725. And FMOVQ instrucion is used to move a large constant to a Vn register. Add test cases. Fixes #40725 Change-Id: I1cac1922a0a0165d698a4b73a41f7a5f0a0ad549 Reviewed-on: https://go-review.googlesource.com/c/go/+/249758 Reviewed-by: Cherry Zhang --- src/cmd/asm/internal/asm/testdata/arm64.s | 15 +++ .../asm/internal/asm/testdata/arm64error.s | 5 + src/cmd/internal/obj/arm64/a.out.go | 6 + src/cmd/internal/obj/arm64/anames.go | 6 + src/cmd/internal/obj/arm64/asm7.go | 121 ++++++++++++++++-- 5 files changed, 139 insertions(+), 14 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index f0c716a2b5..451ca749ba 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -145,6 +145,17 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8 VZIP2 V10.D2, V13.D2, V3.D2 // a379ca4e VZIP1 V17.S2, V4.S2, V26.S2 // 9a38910e VZIP2 V25.S2, V14.S2, V25.S2 // d979990e + VUXTL V30.B8, V30.H8 // dea7082f + VUXTL V30.H4, V29.S4 // dda7102f + VUXTL V29.S2, V2.D2 // a2a7202f + VUXTL2 V30.H8, V30.S4 // dea7106f + VUXTL2 V29.S4, V2.D2 // a2a7206f + VUXTL2 V30.B16, V2.H8 // c2a7086f + VBIT V21.B16, V25.B16, V4.B16 // 241fb56e + VBSL V23.B16, V3.B16, V7.B16 // 671c776e + VCMTST V2.B8, V29.B8, V2.B8 // a28f220e + VCMTST V2.D2, V23.D2, V3.D2 // e38ee24e + VSUB V2.B8, V30.B8, V30.B8 // de87222e MOVD (R2)(R6.SXTW), R4 // 44c866f8 MOVD (R3)(R6), R5 // MOVD (R3)(R6*1), R5 // 656866f8 MOVD (R2)(R6), R4 // MOVD (R2)(R6*1), R4 // 446866f8 @@ -186,6 +197,10 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8 FMOVS $(0.96875), F3 // 03f02d1e FMOVD $(28.0), F4 // 0490671e +// move a large constant to a Vd. + FMOVD $0x8040201008040201, V20 // FMOVD $-9205322385119247871, V20 + FMOVQ $0x8040201008040202, V29 // FMOVQ $-9205322385119247870, V29 + FMOVS (R2)(R6), F4 // FMOVS (R2)(R6*1), F4 // 446866bc FMOVS (R2)(R6<<2), F4 // 447866bc FMOVD (R2)(R6), F4 // FMOVD (R2)(R6*1), F4 // 446866fc diff --git a/src/cmd/asm/internal/asm/testdata/arm64error.s b/src/cmd/asm/internal/asm/testdata/arm64error.s index 9f377817a9..2a911b4cce 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64error.s +++ b/src/cmd/asm/internal/asm/testdata/arm64error.s @@ -340,4 +340,9 @@ TEXT errors(SB),$0 MRS PMSWINC_EL0, R3 // ERROR "system register is not readable" MRS OSLAR_EL1, R3 // ERROR "system register is not readable" VLD3R.P 24(R15), [V15.H4,V16.H4,V17.H4] // ERROR "invalid post-increment offset" + VBIT V1.H4, V12.H4, V3.H4 // ERROR "invalid arrangement" + VBSL V1.D2, V12.D2, V3.D2 // ERROR "invalid arrangement" + VUXTL V30.D2, V30.H8 // ERROR "operand mismatch" + VUXTL2 V20.B8, V21.H8 // ERROR "operand mismatch" + VUXTL V3.D2, V4.B8 // ERROR "operand mismatch" RET diff --git a/src/cmd/internal/obj/arm64/a.out.go b/src/cmd/internal/obj/arm64/a.out.go index 03e0278a33..ab065e07e5 100644 --- a/src/cmd/internal/obj/arm64/a.out.go +++ b/src/cmd/internal/obj/arm64/a.out.go @@ -874,6 +874,7 @@ const ( AFLDPS AFMOVD AFMOVS + AFMOVQ AFMULD AFMULS AFNEGD @@ -987,9 +988,14 @@ const ( AVUSHR AVSHL AVSRI + AVBSL + AVBIT AVTBL AVZIP1 AVZIP2 + AVCMTST + AVUXTL + AVUXTL2 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 65ecd007ea..8961f04b0c 100644 --- a/src/cmd/internal/obj/arm64/anames.go +++ b/src/cmd/internal/obj/arm64/anames.go @@ -381,6 +381,7 @@ var Anames = []string{ "FLDPS", "FMOVD", "FMOVS", + "FMOVQ", "FMULD", "FMULS", "FNEGD", @@ -494,8 +495,13 @@ var Anames = []string{ "VUSHR", "VSHL", "VSRI", + "VBSL", + "VBIT", "VTBL", "VZIP1", "VZIP2", + "VCMTST", + "VUXTL", + "VUXTL2", "LAST", } diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 0b90e31392..7ce18d0f13 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -393,6 +393,11 @@ var optab = []Optab{ {AMOVK, C_VCON, C_NONE, C_NONE, C_REG, 33, 4, 0, 0, 0}, {AMOVD, C_AACON, C_NONE, C_NONE, C_REG, 4, 4, REGFROM, 0, 0}, + // Move a large constant to a Vn. + {AFMOVQ, C_VCON, C_NONE, C_NONE, C_VREG, 101, 4, 0, LFROM, 0}, + {AFMOVD, C_VCON, C_NONE, C_NONE, C_VREG, 101, 4, 0, LFROM, 0}, + {AFMOVS, C_LCON, C_NONE, C_NONE, C_VREG, 101, 4, 0, LFROM, 0}, + /* jump operations */ {AB, C_NONE, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0}, {ABL, C_NONE, C_NONE, C_NONE, C_SBRA, 5, 4, 0, 0, 0}, @@ -403,12 +408,14 @@ var optab = []Optab{ {obj.ARET, C_NONE, C_NONE, C_NONE, C_REG, 6, 4, 0, 0, 0}, {obj.ARET, C_NONE, C_NONE, C_NONE, C_ZOREG, 6, 4, 0, 0, 0}, {ABEQ, C_NONE, C_NONE, C_NONE, C_SBRA, 7, 4, 0, 0, 0}, - {AADRP, C_SBRA, C_NONE, C_NONE, C_REG, 60, 4, 0, 0, 0}, - {AADR, C_SBRA, C_NONE, C_NONE, C_REG, 61, 4, 0, 0, 0}, {ACBZ, C_REG, C_NONE, C_NONE, C_SBRA, 39, 4, 0, 0, 0}, {ATBZ, C_VCON, C_REG, C_NONE, C_SBRA, 40, 4, 0, 0, 0}, {AERET, C_NONE, C_NONE, C_NONE, C_NONE, 41, 4, 0, 0, 0}, + // get a PC-relative address + {AADRP, C_SBRA, C_NONE, C_NONE, C_REG, 60, 4, 0, 0, 0}, + {AADR, C_SBRA, C_NONE, C_NONE, C_REG, 61, 4, 0, 0, 0}, + {ACLREX, C_NONE, C_NONE, C_NONE, C_VCON, 38, 4, 0, 0, 0}, {ACLREX, C_NONE, C_NONE, C_NONE, C_NONE, 38, 4, 0, 0, 0}, {ABFM, C_VCON, C_REG, C_VCON, C_REG, 42, 4, 0, 0, 0}, @@ -473,6 +480,7 @@ var optab = []Optab{ {AVTBL, C_ARNG, C_NONE, C_LIST, C_ARNG, 100, 4, 0, 0, 0}, {AVUSHR, C_VCON, C_ARNG, C_NONE, C_ARNG, 95, 4, 0, 0, 0}, {AVZIP1, C_ARNG, C_ARNG, C_NONE, C_ARNG, 72, 4, 0, 0, 0}, + {AVUXTL, C_ARNG, C_NONE, C_NONE, C_ARNG, 102, 4, 0, 0, 0}, /* conditional operations */ {ACSEL, C_COND, C_REG, C_REG, C_REG, 18, 4, 0, 0, 0}, @@ -2657,7 +2665,7 @@ func buildop(ctxt *obj.Link) { case AFCSELD: oprangeset(AFCSELS, t) - case AFMOVS, AFMOVD: + case AFMOVS, AFMOVD, AFMOVQ: break case AFCVTZSD: @@ -2740,6 +2748,9 @@ func buildop(ctxt *obj.Link) { oprangeset(AVCMEQ, t) oprangeset(AVORR, t) oprangeset(AVEOR, t) + oprangeset(AVBSL, t) + oprangeset(AVBIT, t) + oprangeset(AVCMTST, t) case AVADD: oprangeset(AVSUB, t) @@ -2787,6 +2798,9 @@ func buildop(ctxt *obj.Link) { case AVZIP1: oprangeset(AVZIP2, t) + case AVUXTL: + oprangeset(AVUXTL2, t) + case AVLD1R: oprangeset(AVLD2, t) oprangeset(AVLD2R, t) @@ -4163,7 +4177,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { rel.Add = 0 rel.Type = objabi.R_ARM64_GOTPCREL - case 72: /* vaddp/vand/vcmeq/vorr/vadd/veor/vfmla/vfmls Vm., Vn., Vd. */ + case 72: /* vaddp/vand/vcmeq/vorr/vadd/veor/vfmla/vfmls/vbit/vbsl/vcmtst/vsub Vm., Vn., Vd. */ af := int((p.From.Reg >> 5) & 15) af3 := int((p.Reg >> 5) & 15) at := int((p.To.Reg >> 5) & 15) @@ -4204,17 +4218,24 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { c.ctxt.Diag("invalid arrangement: %v", p) } - if (p.As == AVORR || p.As == AVAND || p.As == AVEOR) && - (af != ARNG_16B && af != ARNG_8B) { - c.ctxt.Diag("invalid arrangement: %v", p) - } else if (p.As == AVFMLA || p.As == AVFMLS) && - (af != ARNG_2D && af != ARNG_2S && af != ARNG_4S) { - c.ctxt.Diag("invalid arrangement: %v", p) - } else if p.As == AVORR { - size = 2 - } else if p.As == AVAND || p.As == AVEOR { + switch p.As { + case AVORR, AVAND, AVEOR, AVBIT, AVBSL: + if af != ARNG_16B && af != ARNG_8B { + c.ctxt.Diag("invalid arrangement: %v", p) + } + case AVFMLA, AVFMLS: + if af != ARNG_2D && af != ARNG_2S && af != ARNG_4S { + c.ctxt.Diag("invalid arrangement: %v", p) + } + } + switch p.As { + case AVAND, AVEOR: size = 0 - } else if p.As == AVFMLA || p.As == AVFMLS { + case AVBSL: + size = 1 + case AVORR, AVBIT: + size = 2 + case AVFMLA, AVFMLS: if af == ARNG_2D { size = 1 } else { @@ -5096,6 +5117,59 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { o1 = q<<30 | 0xe<<24 | len<<13 o1 |= (uint32(rf&31) << 16) | uint32(offset&31)<<5 | uint32(rt&31) + case 101: // FOMVQ/FMOVD $vcon, Vd -> load from constant pool. + o1 = c.omovlit(p.As, p, &p.From, int(p.To.Reg)) + + case 102: // VUXTL{2} Vn., Vd. + af := int((p.From.Reg >> 5) & 15) + at := int((p.To.Reg >> 5) & 15) + var Q, immh uint32 + switch at { + case ARNG_8H: + if af == ARNG_8B { + immh = 1 + Q = 0 + } else if af == ARNG_16B { + immh = 1 + Q = 1 + } else { + c.ctxt.Diag("operand mismatch: %v\n", p) + } + case ARNG_4S: + if af == ARNG_4H { + immh = 2 + Q = 0 + } else if af == ARNG_8H { + immh = 2 + Q = 1 + } else { + c.ctxt.Diag("operand mismatch: %v\n", p) + } + case ARNG_2D: + if af == ARNG_2S { + immh = 4 + Q = 0 + } else if af == ARNG_4S { + immh = 4 + Q = 1 + } else { + c.ctxt.Diag("operand mismatch: %v\n", p) + } + default: + c.ctxt.Diag("operand mismatch: %v\n", p) + } + + if p.As == AVUXTL && Q == 1 { + c.ctxt.Diag("operand mismatch: %v\n", p) + } + if p.As == AVUXTL2 && Q == 0 { + c.ctxt.Diag("operand mismatch: %v\n", p) + } + + o1 = c.oprrr(p, p.As) + rf := int((p.From.Reg) & 31) + rt := int((p.To.Reg) & 31) + o1 |= Q<<30 | immh<<19 | uint32((rf&31)<<5) | uint32(rt&31) } out[0] = o1 out[1] = o2 @@ -5662,6 +5736,9 @@ func (c *ctxt7) oprrr(p *obj.Prog, a obj.As) uint32 { case AVADD: return 7<<25 | 1<<21 | 1<<15 | 1<<10 + case AVSUB: + return 0x17<<25 | 1<<21 | 1<<15 | 1<<10 + case AVADDP: return 7<<25 | 1<<21 | 1<<15 | 15<<10 @@ -5724,6 +5801,18 @@ func (c *ctxt7) oprrr(p *obj.Prog, a obj.As) uint32 { case AVLD2R, AVLD4R: return 0xD<<24 | 3<<21 + + case AVBIT: + return 1<<29 | 0x75<<21 | 7<<10 + + case AVBSL: + return 1<<29 | 0x73<<21 | 7<<10 + + case AVCMTST: + return 0xE<<24 | 1<<21 | 0x23<<10 + + case AVUXTL, AVUXTL2: + return 0x5e<<23 | 0x29<<10 } c.ctxt.Diag("%v: bad rrr %d %v", p, a, a) @@ -6566,6 +6655,10 @@ func (c *ctxt7) omovlit(as obj.As, p *obj.Prog, a *obj.Addr, dr int) uint32 { fp = 1 w = 1 /* 64-bit SIMD/FP */ + case AFMOVQ: + fp = 1 + w = 2 /* 128-bit SIMD/FP */ + case AMOVD: if p.Pool.As == ADWORD { w = 1 /* 64-bit */ -- GitLab From 07d19b2597af253ed78ef43ba6e7a49db9a8f4ba Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 10 Sep 2020 13:21:41 +0700 Subject: [PATCH 0453/1792] all: check GOROOT_BOOTSTRAP executable before bootsrappping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Otherwise we’d still be writing that we're building cmd/dist even if GOROOT_BOOTSTRAP we’re wrongly set. Change-Id: I940e18c3cebae5664f85babc9919e9eb215d5093 Reviewed-on: https://go-review.googlesource.com/c/go/+/253877 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/make.bash | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/make.bash b/src/make.bash index 880a0f43d5..3a84658c72 100755 --- a/src/make.bash +++ b/src/make.bash @@ -162,16 +162,16 @@ IFS=$'\n'; for go_exe in $(type -ap go); do fi fi done; unset IFS -GOROOT_BOOTSTRAP_VERSION=$($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 -fi if [ ! -x "$GOROOT_BOOTSTRAP/bin/go" ]; then echo "ERROR: Cannot find $GOROOT_BOOTSTRAP/bin/go." >&2 echo "Set \$GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4." >&2 exit 1 fi +GOROOT_BOOTSTRAP_VERSION=$($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 +fi if [ "$GOROOT_BOOTSTRAP" = "$GOROOT" ]; then echo "ERROR: \$GOROOT_BOOTSTRAP must not be set to \$GOROOT" >&2 echo "Set \$GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4." >&2 -- GitLab From 8098dbb30e3d0d0b4d467f823c4bbdb8dcefc92f Mon Sep 17 00:00:00 2001 From: ipriver Date: Thu, 10 Sep 2020 10:08:21 +0000 Subject: [PATCH 0454/1792] runtime: update docs for GOMAXPROCS https://github.com/golang/go/blob/master/doc/effective_go.html#L3211 is used to update the docs comment for `GOMAXPROCS` function. Fixes #41275 Change-Id: I39f58e93a267c6e9f3ac6638ed51acbe5284ada2 GitHub-Last-Rev: e45c8ac5873979397d747838fd8d41e252aec489 GitHub-Pull-Request: golang/go#41276 Reviewed-on: https://go-review.googlesource.com/c/go/+/253537 Reviewed-by: Keith Randall --- src/runtime/debug.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/runtime/debug.go b/src/runtime/debug.go index 76eeb2e41a..f411b22676 100644 --- a/src/runtime/debug.go +++ b/src/runtime/debug.go @@ -10,9 +10,8 @@ import ( ) // GOMAXPROCS sets the maximum number of CPUs that can be executing -// simultaneously and returns the previous setting. If n < 1, it does not -// change the current setting. -// The number of logical CPUs on the local machine can be queried with NumCPU. +// simultaneously and returns the previous setting. It defaults to +// the value of runtime.NumCPU. If n < 1, it does not change the current setting. // This call will go away when the scheduler improves. func GOMAXPROCS(n int) int { if GOARCH == "wasm" && n > 1 { -- GitLab From 9b2df72b63ff977004756e9b847f926b4fb8d8a8 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 10 Sep 2020 11:07:48 -0400 Subject: [PATCH 0455/1792] cmd/link: add copyright header Change-Id: I44f57019bb8e659d4aa3da8b13e8bd9a20b9d2e1 Reviewed-on: https://go-review.googlesource.com/c/go/+/253920 Reviewed-by: Than McIntosh --- src/cmd/link/link_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 72ff01c932..98798be465 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -1,3 +1,7 @@ +// 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 main import ( -- GitLab From d7ab277eed4d2e5ede4f3361adf42d4ad76ced8f Mon Sep 17 00:00:00 2001 From: Junchen Li Date: Mon, 31 Aug 2020 13:32:33 +0800 Subject: [PATCH 0456/1792] cmd/asm: add more SIMD instructions on arm64 This CL adds USHLL, USHLL2, UZP1, UZP2, and BIF instructions requested by #40725. And since UXTL* are aliases of USHLL*, this CL also merges them into one case. Updates #40725 Change-Id: I404a4fdaf953319f72eea548175bec1097a2a816 Reviewed-on: https://go-review.googlesource.com/c/go/+/253659 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/asm/internal/asm/testdata/arm64.s | 20 ++++ .../asm/internal/asm/testdata/arm64error.s | 8 ++ src/cmd/internal/obj/arm64/a.out.go | 9 +- src/cmd/internal/obj/arm64/anames.go | 9 +- src/cmd/internal/obj/arm64/asm7.go | 109 ++++++++++-------- 5 files changed, 100 insertions(+), 55 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index 451ca749ba..e106ff2ae1 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -156,6 +156,26 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8 VCMTST V2.B8, V29.B8, V2.B8 // a28f220e VCMTST V2.D2, V23.D2, V3.D2 // e38ee24e VSUB V2.B8, V30.B8, V30.B8 // de87222e + VUZP1 V0.B8, V30.B8, V1.B8 // c11b000e + VUZP1 V1.B16, V29.B16, V2.B16 // a21b014e + VUZP1 V2.H4, V28.H4, V3.H4 // 831b420e + VUZP1 V3.H8, V27.H8, V4.H8 // 641b434e + VUZP1 V28.S2, V2.S2, V5.S2 // 45189c0e + VUZP1 V29.S4, V1.S4, V6.S4 // 26189d4e + VUZP1 V30.D2, V0.D2, V7.D2 // 0718de4e + VUZP2 V0.D2, V30.D2, V1.D2 // c15bc04e + VUZP2 V30.D2, V0.D2, V29.D2 // 1d58de4e + VUSHLL $0, V30.B8, V30.H8 // dea7082f + VUSHLL $0, V30.H4, V29.S4 // dda7102f + VUSHLL $0, V29.S2, V2.D2 // a2a7202f + VUSHLL2 $0, V30.B16, V2.H8 // c2a7086f + VUSHLL2 $0, V30.H8, V30.S4 // dea7106f + VUSHLL2 $0, V29.S4, V2.D2 // a2a7206f + VUSHLL $7, V30.B8, V30.H8 // dea70f2f + VUSHLL $15, V30.H4, V29.S4 // dda71f2f + VUSHLL2 $31, V30.S4, V2.D2 // c2a73f6f + VBIF V0.B8, V30.B8, V1.B8 // c11fe02e + VBIF V30.B16, V0.B16, V2.B16 // 021cfe6e MOVD (R2)(R6.SXTW), R4 // 44c866f8 MOVD (R3)(R6), R5 // MOVD (R3)(R6*1), R5 // 656866f8 MOVD (R2)(R6), R4 // MOVD (R2)(R6*1), R4 // 446866f8 diff --git a/src/cmd/asm/internal/asm/testdata/arm64error.s b/src/cmd/asm/internal/asm/testdata/arm64error.s index 2a911b4cce..20b1f3e9f0 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64error.s +++ b/src/cmd/asm/internal/asm/testdata/arm64error.s @@ -345,4 +345,12 @@ TEXT errors(SB),$0 VUXTL V30.D2, V30.H8 // ERROR "operand mismatch" VUXTL2 V20.B8, V21.H8 // ERROR "operand mismatch" VUXTL V3.D2, V4.B8 // ERROR "operand mismatch" + VUZP1 V0.B8, V30.B8, V1.B16 // ERROR "operand mismatch" + VUZP2 V0.Q1, V30.Q1, V1.Q1 // ERROR "invalid arrangement" + VUSHLL $0, V30.D2, V30.H8 // ERROR "operand mismatch" + VUSHLL2 $0, V20.B8, V21.H8 // ERROR "operand mismatch" + VUSHLL $8, V30.B8, V30.H8 // ERROR "shift amount out of range" + VUSHLL2 $32, V30.S4, V2.D2 // ERROR "shift amount out of range" + VBIF V0.B8, V1.B8, V2.B16 // ERROR "operand mismatch" + VBIF V0.D2, V1.D2, V2.D2 // ERROR "invalid arrangement" RET diff --git a/src/cmd/internal/obj/arm64/a.out.go b/src/cmd/internal/obj/arm64/a.out.go index ab065e07e5..2839da1437 100644 --- a/src/cmd/internal/obj/arm64/a.out.go +++ b/src/cmd/internal/obj/arm64/a.out.go @@ -954,6 +954,7 @@ const ( AVADD AVADDP AVAND + AVBIF AVCMEQ AVCNT AVEOR @@ -986,6 +987,12 @@ const ( AVEXT AVRBIT AVUSHR + AVUSHLL + AVUSHLL2 + AVUXTL + AVUXTL2 + AVUZP1 + AVUZP2 AVSHL AVSRI AVBSL @@ -994,8 +1001,6 @@ const ( AVZIP1 AVZIP2 AVCMTST - AVUXTL - AVUXTL2 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 8961f04b0c..48c066abfd 100644 --- a/src/cmd/internal/obj/arm64/anames.go +++ b/src/cmd/internal/obj/arm64/anames.go @@ -461,6 +461,7 @@ var Anames = []string{ "VADD", "VADDP", "VAND", + "VBIF", "VCMEQ", "VCNT", "VEOR", @@ -493,6 +494,12 @@ var Anames = []string{ "VEXT", "VRBIT", "VUSHR", + "VUSHLL", + "VUSHLL2", + "VUXTL", + "VUXTL2", + "VUZP1", + "VUZP2", "VSHL", "VSRI", "VBSL", @@ -501,7 +508,5 @@ var Anames = []string{ "VZIP1", "VZIP2", "VCMTST", - "VUXTL", - "VUXTL2", "LAST", } diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 7ce18d0f13..df4bbbbd35 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -480,6 +480,7 @@ var optab = []Optab{ {AVTBL, C_ARNG, C_NONE, C_LIST, C_ARNG, 100, 4, 0, 0, 0}, {AVUSHR, C_VCON, C_ARNG, C_NONE, C_ARNG, 95, 4, 0, 0, 0}, {AVZIP1, C_ARNG, C_ARNG, C_NONE, C_ARNG, 72, 4, 0, 0, 0}, + {AVUSHLL, C_VCON, C_ARNG, C_NONE, C_ARNG, 102, 4, 0, 0, 0}, {AVUXTL, C_ARNG, C_NONE, C_NONE, C_ARNG, 102, 4, 0, 0, 0}, /* conditional operations */ @@ -2751,6 +2752,9 @@ func buildop(ctxt *obj.Link) { oprangeset(AVBSL, t) oprangeset(AVBIT, t) oprangeset(AVCMTST, t) + oprangeset(AVUZP1, t) + oprangeset(AVUZP2, t) + oprangeset(AVBIF, t) case AVADD: oprangeset(AVSUB, t) @@ -2801,6 +2805,9 @@ func buildop(ctxt *obj.Link) { case AVUXTL: oprangeset(AVUXTL2, t) + case AVUSHLL: + oprangeset(AVUSHLL2, t) + case AVLD1R: oprangeset(AVLD2, t) oprangeset(AVLD2R, t) @@ -4177,7 +4184,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { rel.Add = 0 rel.Type = objabi.R_ARM64_GOTPCREL - case 72: /* vaddp/vand/vcmeq/vorr/vadd/veor/vfmla/vfmls/vbit/vbsl/vcmtst/vsub Vm., Vn., Vd. */ + case 72: /* vaddp/vand/vcmeq/vorr/vadd/veor/vfmla/vfmls/vbit/vbsl/vcmtst/vsub/vbif/vuzip1/vuzip2 Vm., Vn., Vd. */ af := int((p.From.Reg >> 5) & 15) af3 := int((p.Reg >> 5) & 15) at := int((p.To.Reg >> 5) & 15) @@ -4219,7 +4226,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { } switch p.As { - case AVORR, AVAND, AVEOR, AVBIT, AVBSL: + case AVORR, AVAND, AVEOR, AVBIT, AVBSL, AVBIF: if af != ARNG_16B && af != ARNG_8B { c.ctxt.Diag("invalid arrangement: %v", p) } @@ -4233,7 +4240,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { size = 0 case AVBSL: size = 1 - case AVORR, AVBIT: + case AVORR, AVBIT, AVBIF: size = 2 case AVFMLA, AVFMLS: if af == ARNG_2D { @@ -5120,56 +5127,44 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { case 101: // FOMVQ/FMOVD $vcon, Vd -> load from constant pool. o1 = c.omovlit(p.As, p, &p.From, int(p.To.Reg)) - case 102: // VUXTL{2} Vn., Vd. - af := int((p.From.Reg >> 5) & 15) - at := int((p.To.Reg >> 5) & 15) - var Q, immh uint32 - switch at { - case ARNG_8H: - if af == ARNG_8B { - immh = 1 - Q = 0 - } else if af == ARNG_16B { - immh = 1 - Q = 1 - } else { - c.ctxt.Diag("operand mismatch: %v\n", p) - } - case ARNG_4S: - if af == ARNG_4H { - immh = 2 - Q = 0 - } else if af == ARNG_8H { - immh = 2 - Q = 1 - } else { - c.ctxt.Diag("operand mismatch: %v\n", p) - } - case ARNG_2D: - if af == ARNG_2S { - immh = 4 - Q = 0 - } else if af == ARNG_4S { - immh = 4 - Q = 1 - } else { - c.ctxt.Diag("operand mismatch: %v\n", p) - } + case 102: /* vushll, vushll2, vuxtl, vuxtl2 */ + o1 = c.opirr(p, p.As) + rf := p.Reg + af := uint8((p.Reg >> 5) & 15) + at := uint8((p.To.Reg >> 5) & 15) + shift := int(p.From.Offset) + if p.As == AVUXTL || p.As == AVUXTL2 { + rf = p.From.Reg + af = uint8((p.From.Reg >> 5) & 15) + shift = 0 + } + + pack := func(q, x, y uint8) uint32 { + return uint32(q)<<16 | uint32(x)<<8 | uint32(y) + } + + var Q uint8 = uint8(o1>>30) & 1 + var immh, width uint8 + switch pack(Q, af, at) { + case pack(0, ARNG_8B, ARNG_8H): + immh, width = 1, 8 + case pack(1, ARNG_16B, ARNG_8H): + immh, width = 1, 8 + case pack(0, ARNG_4H, ARNG_4S): + immh, width = 2, 16 + case pack(1, ARNG_8H, ARNG_4S): + immh, width = 2, 16 + case pack(0, ARNG_2S, ARNG_2D): + immh, width = 4, 32 + case pack(1, ARNG_4S, ARNG_2D): + immh, width = 4, 32 default: c.ctxt.Diag("operand mismatch: %v\n", p) } - - if p.As == AVUXTL && Q == 1 { - c.ctxt.Diag("operand mismatch: %v\n", p) + if !(0 <= shift && shift <= int(width-1)) { + c.ctxt.Diag("shift amount out of range: %v\n", p) } - if p.As == AVUXTL2 && Q == 0 { - c.ctxt.Diag("operand mismatch: %v\n", p) - } - - o1 = c.oprrr(p, p.As) - rf := int((p.From.Reg) & 31) - rt := int((p.To.Reg) & 31) - o1 |= Q<<30 | immh<<19 | uint32((rf&31)<<5) | uint32(rt&31) + o1 |= uint32(immh)<<19 | uint32(shift)<<16 | uint32(rf&31)<<5 | uint32(p.To.Reg&31) } out[0] = o1 out[1] = o2 @@ -5802,6 +5797,9 @@ func (c *ctxt7) oprrr(p *obj.Prog, a obj.As) uint32 { case AVLD2R, AVLD4R: return 0xD<<24 | 3<<21 + case AVBIF: + return 1<<29 | 7<<25 | 7<<21 | 7<<10 + case AVBIT: return 1<<29 | 0x75<<21 | 7<<10 @@ -5811,8 +5809,11 @@ func (c *ctxt7) oprrr(p *obj.Prog, a obj.As) uint32 { case AVCMTST: return 0xE<<24 | 1<<21 | 0x23<<10 - case AVUXTL, AVUXTL2: - return 0x5e<<23 | 0x29<<10 + case AVUZP1: + return 7<<25 | 3<<11 + + case AVUZP2: + return 7<<25 | 1<<14 | 3<<11 } c.ctxt.Diag("%v: bad rrr %d %v", p, a, a) @@ -6011,6 +6012,12 @@ func (c *ctxt7) opirr(p *obj.Prog, a obj.As) uint32 { case AVSRI: return 0x5E<<23 | 17<<10 + + case AVUSHLL, AVUXTL: + return 1<<29 | 15<<24 | 0x29<<10 + + case AVUSHLL2, AVUXTL2: + return 3<<29 | 15<<24 | 0x29<<10 } c.ctxt.Diag("%v: bad irr %v", p, a) -- GitLab From a1762c2cc67822d86cb37747a56f0d4a07d24ced Mon Sep 17 00:00:00 2001 From: eric fang Date: Wed, 13 May 2020 06:38:39 +0000 Subject: [PATCH 0457/1792] unicode/utf8: refactor benchmarks for FullRune function BenchmarkFullASCIIRune tests the performance of function utf8.FullRune, which will be inlined in BenchmarkFullASCIIRune. Since the return value of FullRune is not referenced, it will be removed as dead code. This CL makes the FullRune functions return value referenced by a global variable to avoid this point. In addition, this CL adds one more benchmark to cover more code paths, and puts them together as sub benchmarks of BenchmarkFullRune. Change-Id: I6e79f4c087adf70e351498a4b58d7482dcd1ec4a Reviewed-on: https://go-review.googlesource.com/c/go/+/233979 Run-TryBot: eric fang TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/unicode/utf8/utf8_test.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/unicode/utf8/utf8_test.go b/src/unicode/utf8/utf8_test.go index 359461bd05..eaf1b5ffee 100644 --- a/src/unicode/utf8/utf8_test.go +++ b/src/unicode/utf8/utf8_test.go @@ -597,16 +597,24 @@ func BenchmarkDecodeJapaneseRune(b *testing.B) { } } -func BenchmarkFullASCIIRune(b *testing.B) { - a := []byte{'a'} - for i := 0; i < b.N; i++ { - FullRune(a) - } -} - -func BenchmarkFullJapaneseRune(b *testing.B) { - nihon := []byte("本") - for i := 0; i < b.N; i++ { - FullRune(nihon) +// boolSink is used to reference the return value of benchmarked +// functions to avoid dead code elimination. +var boolSink bool + +func BenchmarkFullRune(b *testing.B) { + benchmarks := []struct { + name string + data []byte + }{ + {"ASCII", []byte("a")}, + {"Incomplete", []byte("\xf0\x90\x80")}, + {"Japanese", []byte("本")}, + } + for _, bm := range benchmarks { + b.Run(bm.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + boolSink = FullRune(bm.data) + } + }) } } -- GitLab From d277a361231485999cc2b7433e3244e559c7d7da Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 10 Sep 2020 17:18:57 -0400 Subject: [PATCH 0458/1792] runtime: remove darwin/arm specifc code That port is gone. Change-Id: I212d435e290d1890d6cd5531be98bb692650595e Reviewed-on: https://go-review.googlesource.com/c/go/+/254077 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/stack.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/stack.go b/src/runtime/stack.go index 403b3c313e..821c2e8436 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -66,7 +66,7 @@ const ( // 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 = sys.GoosWindows*512*sys.PtrSize + sys.GoosPlan9*512 + sys.GoosDarwin*sys.GoarchArm*1024 + sys.GoosDarwin*sys.GoarchArm64*1024 + _StackSystem = sys.GoosWindows*512*sys.PtrSize + sys.GoosPlan9*512 + sys.GoosDarwin*sys.GoarchArm64*1024 // The minimum size of stack used by Go code _StackMin = 2048 -- GitLab From 03a686069191e3515c7f27f6d90b66d272e0e3a2 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 9 Sep 2020 15:58:05 -0400 Subject: [PATCH 0459/1792] cmd/go: update tests to work with -mod=readonly on by default For #40728 Change-Id: Ic2b025ff75c6e73c0cb58c1737e44e2a41c71571 Reviewed-on: https://go-review.googlesource.com/c/go/+/253837 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- .../example.com_retract_missingmod_v1.0.0.txt | 2 ++ src/cmd/go/testdata/script/mod_auth.txt | 2 +- src/cmd/go/testdata/script/mod_case.txt | 7 ++++++- src/cmd/go/testdata/script/mod_concurrent.txt | 1 + src/cmd/go/testdata/script/mod_doc.txt | 2 ++ .../go/testdata/script/mod_domain_root.txt | 2 +- src/cmd/go/testdata/script/mod_download.txt | 2 +- .../testdata/script/mod_download_partial.txt | 9 ++++++-- .../testdata/script/mod_get_incompatible.txt | 2 +- .../go/testdata/script/mod_get_indirect.txt | 2 +- .../testdata/script/mod_get_latest_pseudo.txt | 2 +- .../script/mod_get_trailing_slash.txt | 3 +++ src/cmd/go/testdata/script/mod_import.txt | 2 +- .../testdata/script/mod_in_testdata_dir.txt | 6 +++--- src/cmd/go/testdata/script/mod_init_dep.txt | 21 ++++--------------- .../testdata/script/mod_install_versioned.txt | 2 ++ src/cmd/go/testdata/script/mod_internal.txt | 14 +++++++++---- .../testdata/script/mod_invalid_version.txt | 1 + src/cmd/go/testdata/script/mod_list.txt | 8 +++---- src/cmd/go/testdata/script/mod_list_dir.txt | 5 +++++ .../go/testdata/script/mod_list_direct.txt | 2 +- .../testdata/script/mod_list_replace_dir.txt | 12 +++++++++-- .../go/testdata/script/mod_list_upgrade.txt | 4 ++++ .../go/testdata/script/mod_load_badchain.txt | 4 ++-- .../go/testdata/script/mod_load_badmod.txt | 7 +++---- .../go/testdata/script/mod_load_badzip.txt | 4 +--- .../script/mod_missingpkg_prerelease.txt | 2 +- src/cmd/go/testdata/script/mod_modinfo.txt | 1 + src/cmd/go/testdata/script/mod_multirepo.txt | 1 + src/cmd/go/testdata/script/mod_notall.txt | 1 + .../go/testdata/script/mod_permissions.txt | 2 +- src/cmd/go/testdata/script/mod_query.txt | 10 +++++++++ src/cmd/go/testdata/script/mod_replace.txt | 4 ++-- .../testdata/script/mod_replace_gopkgin.txt | 1 + .../go/testdata/script/mod_replace_import.txt | 1 + .../testdata/script/mod_require_exclude.txt | 8 +++---- src/cmd/go/testdata/script/mod_retention.txt | 6 +++--- src/cmd/go/testdata/script/mod_retract.txt | 5 ++++- .../testdata/script/mod_retract_replace.txt | 14 +++++++++++-- src/cmd/go/testdata/script/mod_sum_lookup.txt | 5 +++-- .../go/testdata/script/mod_sumdb_golang.txt | 4 ++-- src/cmd/go/testdata/script/mod_symlink.txt | 5 ++++- src/cmd/go/testdata/script/mod_test.txt | 1 + .../go/testdata/script/mod_tidy_replace.txt | 1 + .../go/testdata/script/mod_upgrade_patch.txt | 1 + .../go/testdata/script/mod_vcs_missing.txt | 4 ++-- .../go/testdata/script/mod_vendor_build.txt | 3 +++ src/cmd/go/testdata/script/mod_verify.txt | 2 +- src/cmd/go/testdata/script/mod_why.txt | 3 +++ src/cmd/go/testdata/script/modfile_flag.txt | 6 +++--- src/cmd/go/testdata/script/version.txt | 1 + .../go/testdata/script/version_replace.txt | 2 +- 52 files changed, 146 insertions(+), 76 deletions(-) diff --git a/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.0.0.txt index 2023c7b096..1d8d81071e 100644 --- a/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.0.0.txt +++ b/src/cmd/go/testdata/mod/example.com_retract_missingmod_v1.0.0.txt @@ -6,3 +6,5 @@ module example.com/retract/missingmod go 1.14 -- .info -- {"Version":"v1.0.0"} +-- missingmod.go -- +package missingmod diff --git a/src/cmd/go/testdata/script/mod_auth.txt b/src/cmd/go/testdata/script/mod_auth.txt index 5bcbcd1a18..544acbc1f8 100644 --- a/src/cmd/go/testdata/script/mod_auth.txt +++ b/src/cmd/go/testdata/script/mod_auth.txt @@ -7,7 +7,7 @@ env GOSUMDB=off # Without credentials, downloading a module from a path that requires HTTPS # basic auth should fail. env NETRC=$WORK/empty -! go list all +! go mod tidy stderr '^\tserver response: ACCESS DENIED, buddy$' stderr '^\tserver response: File\? What file\?$' diff --git a/src/cmd/go/testdata/script/mod_case.txt b/src/cmd/go/testdata/script/mod_case.txt index ee818c2c07..6f8d869c44 100644 --- a/src/cmd/go/testdata/script/mod_case.txt +++ b/src/cmd/go/testdata/script/mod_case.txt @@ -1,6 +1,6 @@ env GO111MODULE=on -go get rsc.io/QUOTE +go get -d go list -m all stdout '^rsc.io/quote v1.5.2' stdout '^rsc.io/QUOTE v1.5.2' @@ -18,3 +18,8 @@ stdout '!q!u!o!t!e@v1.5.3-!p!r!e' -- go.mod -- module x + +-- use.go -- +package use + +import _ "rsc.io/QUOTE/QUOTE" diff --git a/src/cmd/go/testdata/script/mod_concurrent.txt b/src/cmd/go/testdata/script/mod_concurrent.txt index e03e5e5edb..8c21525158 100644 --- a/src/cmd/go/testdata/script/mod_concurrent.txt +++ b/src/cmd/go/testdata/script/mod_concurrent.txt @@ -1,6 +1,7 @@ env GO111MODULE=on # Concurrent builds should succeed, even if they need to download modules. +go get -d ./x ./y go build ./x & go build ./y wait diff --git a/src/cmd/go/testdata/script/mod_doc.txt b/src/cmd/go/testdata/script/mod_doc.txt index aac3db00be..595ad679fc 100644 --- a/src/cmd/go/testdata/script/mod_doc.txt +++ b/src/cmd/go/testdata/script/mod_doc.txt @@ -1,6 +1,7 @@ # go doc should find module documentation env GO111MODULE=on +env GOFLAGS=-mod=mod [short] skip # Check when module x is inside GOPATH/src. @@ -48,6 +49,7 @@ stderr '^doc: cannot find module providing package example.com/hello: module loo # path used in source code, not to the absolute path relative to GOROOT. cd $GOROOT/src +env GOFLAGS= go doc cryptobyte stdout '// import "golang.org/x/crypto/cryptobyte"' diff --git a/src/cmd/go/testdata/script/mod_domain_root.txt b/src/cmd/go/testdata/script/mod_domain_root.txt index e34cc29fa6..14745b5812 100644 --- a/src/cmd/go/testdata/script/mod_domain_root.txt +++ b/src/cmd/go/testdata/script/mod_domain_root.txt @@ -2,7 +2,7 @@ # (example.com not example.com/something) env GO111MODULE=on -go build +go get -d -- go.mod -- module x diff --git a/src/cmd/go/testdata/script/mod_download.txt b/src/cmd/go/testdata/script/mod_download.txt index 5acb83266b..b9bf67cad5 100644 --- a/src/cmd/go/testdata/script/mod_download.txt +++ b/src/cmd/go/testdata/script/mod_download.txt @@ -46,7 +46,7 @@ go mod edit -require rsc.io/quote@v1.5.3-pre1 ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip # module loading will page in the info and mod files -go list -m all +go list -m -mod=mod all exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.info exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.mod ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.3-pre1.zip diff --git a/src/cmd/go/testdata/script/mod_download_partial.txt b/src/cmd/go/testdata/script/mod_download_partial.txt index 4978982dab..8d31970160 100644 --- a/src/cmd/go/testdata/script/mod_download_partial.txt +++ b/src/cmd/go/testdata/script/mod_download_partial.txt @@ -1,5 +1,5 @@ -# Download a module -go mod download -modcacherw rsc.io/quote +# Download modules and populate go.sum. +go get -d -modcacherw exists $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/go.mod # 'go mod verify' should fail if we delete a file. @@ -61,4 +61,9 @@ go 1.14 require rsc.io/quote v1.5.2 +-- use.go -- +package use + +import _ "rsc.io/quote" + -- empty -- diff --git a/src/cmd/go/testdata/script/mod_get_incompatible.txt b/src/cmd/go/testdata/script/mod_get_incompatible.txt index b210715a5d..b28718a694 100644 --- a/src/cmd/go/testdata/script/mod_get_incompatible.txt +++ b/src/cmd/go/testdata/script/mod_get_incompatible.txt @@ -1,6 +1,6 @@ env GO111MODULE=on -go list x +go get -d x go list -m all stdout 'rsc.io/breaker v2.0.0\+incompatible' diff --git a/src/cmd/go/testdata/script/mod_get_indirect.txt b/src/cmd/go/testdata/script/mod_get_indirect.txt index f25e170a49..e1cc1ab411 100644 --- a/src/cmd/go/testdata/script/mod_get_indirect.txt +++ b/src/cmd/go/testdata/script/mod_get_indirect.txt @@ -27,7 +27,7 @@ grep 'golang.org/x/text v0.3.0 // indirect$' go.mod # indirect tag should be removed upon seeing direct import. cp $WORK/tmp/uselang.go x.go -go list +go get -d grep 'rsc.io/quote v1.5.2$' go.mod grep 'golang.org/x/text [v0-9a-f\.-]+$' go.mod diff --git a/src/cmd/go/testdata/script/mod_get_latest_pseudo.txt b/src/cmd/go/testdata/script/mod_get_latest_pseudo.txt index 825ee8cf89..241a0c2f0d 100644 --- a/src/cmd/go/testdata/script/mod_get_latest_pseudo.txt +++ b/src/cmd/go/testdata/script/mod_get_latest_pseudo.txt @@ -5,6 +5,6 @@ env GO111MODULE=on go mod init m -go list example.com/notags +go get -d example.com/notags go list -m all stdout '^example.com/notags v0.0.0-20190507143103-cc8cbe209b64$' diff --git a/src/cmd/go/testdata/script/mod_get_trailing_slash.txt b/src/cmd/go/testdata/script/mod_get_trailing_slash.txt index 7b5d90c50b..3b38d8ba7d 100644 --- a/src/cmd/go/testdata/script/mod_get_trailing_slash.txt +++ b/src/cmd/go/testdata/script/mod_get_trailing_slash.txt @@ -1,3 +1,6 @@ +# Populate go.sum +go mod download + # go list should succeed to load a package ending with ".go" if the path does # not correspond to an existing local file. Listing a pattern ending with # ".go/" should try to list a package regardless of whether a file exists at the diff --git a/src/cmd/go/testdata/script/mod_import.txt b/src/cmd/go/testdata/script/mod_import.txt index 3985b43144..28358b5b0c 100644 --- a/src/cmd/go/testdata/script/mod_import.txt +++ b/src/cmd/go/testdata/script/mod_import.txt @@ -1,7 +1,7 @@ env GO111MODULE=on # latest rsc.io/quote should be v1.5.2 not v1.5.3-pre1 -go list +go get -d go list -m all stdout 'rsc.io/quote v1.5.2' diff --git a/src/cmd/go/testdata/script/mod_in_testdata_dir.txt b/src/cmd/go/testdata/script/mod_in_testdata_dir.txt index f582569798..66f79faa6d 100644 --- a/src/cmd/go/testdata/script/mod_in_testdata_dir.txt +++ b/src/cmd/go/testdata/script/mod_in_testdata_dir.txt @@ -8,8 +8,8 @@ env GO111MODULE=on cd $WORK/testdata go mod init testdata.tld/foo -# Building a package within that module should resolve its dependencies. -go build +# Getting a package within that module should resolve its dependencies. +go get -d grep 'rsc.io/quote' go.mod # Tidying the module should preserve those dependencies. @@ -26,7 +26,7 @@ exists vendor/rsc.io/quote cd $WORK/_ignored go mod init testdata.tld/foo -go build +go get grep 'rsc.io/quote' go.mod go mod tidy diff --git a/src/cmd/go/testdata/script/mod_init_dep.txt b/src/cmd/go/testdata/script/mod_init_dep.txt index 755076eae8..f8cf1d563a 100644 --- a/src/cmd/go/testdata/script/mod_init_dep.txt +++ b/src/cmd/go/testdata/script/mod_init_dep.txt @@ -1,24 +1,14 @@ env GO111MODULE=on +env GOFLAGS=-mod=mod # modconv uses git directly to examine what old 'go get' would [!net] skip [!exec:git] skip -# go build should populate go.mod from Gopkg.lock -cp go.mod1 go.mod -go build +# go mod init should populate go.mod from Gopkg.lock +go mod init x stderr 'copying requirements from Gopkg.lock' go list -m all -! stderr 'copying requirements from Gopkg.lock' -stdout 'rsc.io/sampler v1.0.0' - -# go list should populate go.mod from Gopkg.lock -cp go.mod1 go.mod -go list -stderr 'copying requirements from Gopkg.lock' -go list -! stderr 'copying requirements from Gopkg.lock' -go list -m all stdout 'rsc.io/sampler v1.0.0' # test dep replacement @@ -26,9 +16,6 @@ cd y go mod init cmpenv go.mod go.mod.replace --- go.mod1 -- -module x - -- x.go -- package x @@ -54,4 +41,4 @@ go $goversion replace z v1.0.0 => rsc.io/quote v1.0.0 -require rsc.io/quote v1.0.0 \ No newline at end of file +require rsc.io/quote v1.0.0 diff --git a/src/cmd/go/testdata/script/mod_install_versioned.txt b/src/cmd/go/testdata/script/mod_install_versioned.txt index 03986d06a0..c6bce418b4 100644 --- a/src/cmd/go/testdata/script/mod_install_versioned.txt +++ b/src/cmd/go/testdata/script/mod_install_versioned.txt @@ -1,9 +1,11 @@ env GO111MODULE=on +go get -d rsc.io/fortune go list -f '{{.Target}}' rsc.io/fortune ! stdout fortune@v1 stdout 'fortune(\.exe)?$' +go get -d rsc.io/fortune/v2 go list -f '{{.Target}}' rsc.io/fortune/v2 ! stdout v2 stdout 'fortune(\.exe)?$' diff --git a/src/cmd/go/testdata/script/mod_internal.txt b/src/cmd/go/testdata/script/mod_internal.txt index 1193d528ec..687269d18f 100644 --- a/src/cmd/go/testdata/script/mod_internal.txt +++ b/src/cmd/go/testdata/script/mod_internal.txt @@ -3,30 +3,34 @@ env GO111MODULE=on # golang.org/x/internal should be importable from other golang.org/x modules. go mod edit -module=golang.org/x/anything -go build . +go get -d . # ...and their tests... go test stdout PASS # ...but that should not leak into other modules. +go get -d ./baddep ! go build ./baddep stderr golang.org[/\\]notx[/\\]useinternal stderr 'use of internal package golang.org/x/.* not allowed' # Internal packages in the standard library should not leak into modules. +go get -d ./fromstd ! go build ./fromstd stderr 'use of internal package internal/testenv not allowed' # Dependencies should be able to use their own internal modules... go mod edit -module=golang.org/notx -go build ./throughdep +go get -d ./throughdep # ... but other modules should not, even if they have transitive dependencies. +go get -d . ! go build . stderr 'use of internal package golang.org/x/.* not allowed' # And transitive dependencies still should not leak. +go get -d ./baddep ! go build ./baddep stderr golang.org[/\\]notx[/\\]useinternal stderr 'use of internal package golang.org/x/.* not allowed' @@ -34,15 +38,17 @@ stderr 'use of internal package golang.org/x/.* not allowed' # Replacing an internal module should keep it internal to the same paths. go mod edit -module=golang.org/notx go mod edit -replace golang.org/x/internal=./replace/golang.org/notx/internal -go build ./throughdep +go get -d ./throughdep +go get -d ./baddep ! go build ./baddep stderr golang.org[/\\]notx[/\\]useinternal stderr 'use of internal package golang.org/x/.* not allowed' go mod edit -replace golang.org/x/internal=./vendor/golang.org/x/internal -go build ./throughdep +go get -d ./throughdep +go get -d ./baddep ! go build ./baddep stderr golang.org[/\\]notx[/\\]useinternal stderr 'use of internal package golang.org/x/.* not allowed' diff --git a/src/cmd/go/testdata/script/mod_invalid_version.txt b/src/cmd/go/testdata/script/mod_invalid_version.txt index 6dddd4b036..f9dfdd6346 100644 --- a/src/cmd/go/testdata/script/mod_invalid_version.txt +++ b/src/cmd/go/testdata/script/mod_invalid_version.txt @@ -4,6 +4,7 @@ env GO111MODULE=on env GOPROXY=direct env GOSUMDB=off +env GOFLAGS=-mod=mod # Regression test for golang.org/issue/27173: if the user (or go.mod file) # requests a pseudo-version that does not match both the module path and commit diff --git a/src/cmd/go/testdata/script/mod_list.txt b/src/cmd/go/testdata/script/mod_list.txt index 17b33fcc7b..1ba6d7c910 100644 --- a/src/cmd/go/testdata/script/mod_list.txt +++ b/src/cmd/go/testdata/script/mod_list.txt @@ -2,12 +2,12 @@ env GO111MODULE=on [short] skip # list {{.Dir}} shows main module and go.mod but not not-yet-downloaded dependency dir. -go list -m -f '{{.Path}} {{.Main}} {{.GoMod}} {{.Dir}}' all +go list -mod=mod -m -f '{{.Path}} {{.Main}} {{.GoMod}} {{.Dir}}' all stdout '^x true .*[\\/]src[\\/]go.mod .*[\\/]src$' stdout '^rsc.io/quote false .*[\\/]v1.5.2.mod $' # list {{.Dir}} shows dependency after download (and go list without -m downloads it) -go list -f '{{.Dir}}' rsc.io/quote +go list -mod=mod -f '{{.Dir}}' rsc.io/quote stdout '.*mod[\\/]rsc.io[\\/]quote@v1.5.2$' # downloaded dependencies are read-only @@ -20,7 +20,7 @@ go clean -modcache # list {{.Dir}} shows replaced directories cp go.mod2 go.mod -go list -f {{.Dir}} rsc.io/quote +go list -mod=mod -f {{.Dir}} rsc.io/quote go list -m -f '{{.Path}} {{.Version}} {{.Dir}}{{with .Replace}} {{.GoMod}} => {{.Version}} {{.Dir}} {{.GoMod}}{{end}}' all stdout 'mod[\\/]rsc.io[\\/]quote@v1.5.1' stdout 'v1.3.0.*mod[\\/]rsc.io[\\/]sampler@v1.3.1 .*[\\/]v1.3.1.mod => v1.3.1.*sampler@v1.3.1 .*[\\/]v1.3.1.mod' @@ -30,7 +30,7 @@ go list std stdout ^math/big # rsc.io/quote/buggy should be listable as a package -go list rsc.io/quote/buggy +go list -mod=mod rsc.io/quote/buggy # rsc.io/quote/buggy should not be listable as a module go list -m -e -f '{{.Error.Err}}' nonexist rsc.io/quote/buggy diff --git a/src/cmd/go/testdata/script/mod_list_dir.txt b/src/cmd/go/testdata/script/mod_list_dir.txt index 6653435a06..1adab8f027 100644 --- a/src/cmd/go/testdata/script/mod_list_dir.txt +++ b/src/cmd/go/testdata/script/mod_list_dir.txt @@ -2,6 +2,9 @@ # go list with path to directory should work +# populate go.sum +go get -d + env GO111MODULE=off go list -f '{{.ImportPath}}' $GOROOT/src/math stdout ^math$ @@ -29,3 +32,5 @@ require rsc.io/quote v1.5.2 -- x.go -- package x + +import _ "rsc.io/quote" diff --git a/src/cmd/go/testdata/script/mod_list_direct.txt b/src/cmd/go/testdata/script/mod_list_direct.txt index 8f85871189..62a472f475 100644 --- a/src/cmd/go/testdata/script/mod_list_direct.txt +++ b/src/cmd/go/testdata/script/mod_list_direct.txt @@ -10,7 +10,7 @@ env GOSUMDB=off # For a while, (*modfetch.codeRepo).Stat was not checking for a go.mod file, # which would produce a hard error at the subsequent call to GoMod. -go list all +go get -d -- go.mod -- module example.com diff --git a/src/cmd/go/testdata/script/mod_list_replace_dir.txt b/src/cmd/go/testdata/script/mod_list_replace_dir.txt index cad7fe2528..f2f2d2b2bb 100644 --- a/src/cmd/go/testdata/script/mod_list_replace_dir.txt +++ b/src/cmd/go/testdata/script/mod_list_replace_dir.txt @@ -2,8 +2,11 @@ # module within the module cache. # Verifies golang.org/issue/29548 -env GO111MODULE=on -go mod download rsc.io/quote@v1.5.1 rsc.io/quote@v1.5.2 +# Populate go.sum and download dependencies. +go get -d + +# Ensure v1.5.2 is also in the cache so we can list it. +go mod download rsc.io/quote@v1.5.2 ! go list $GOPATH/pkg/mod/rsc.io/quote@v1.5.2 stderr '^directory ..[/\\]pkg[/\\]mod[/\\]rsc.io[/\\]quote@v1.5.2 outside available modules$' @@ -17,3 +20,8 @@ module example.com/quoter require rsc.io/quote v1.5.2 replace rsc.io/quote => rsc.io/quote v1.5.1 + +-- use.go -- +package use + +import _ "rsc.io/quote" diff --git a/src/cmd/go/testdata/script/mod_list_upgrade.txt b/src/cmd/go/testdata/script/mod_list_upgrade.txt index 474df0dc26..0cef04b89a 100644 --- a/src/cmd/go/testdata/script/mod_list_upgrade.txt +++ b/src/cmd/go/testdata/script/mod_list_upgrade.txt @@ -1,5 +1,9 @@ env GO111MODULE=on +# Populate go.sum +go list -m -mod=mod all + +# Check for upgrades. go list -m -u all stdout 'rsc.io/quote v1.2.0 \[v1\.5\.2\]' diff --git a/src/cmd/go/testdata/script/mod_load_badchain.txt b/src/cmd/go/testdata/script/mod_load_badchain.txt index 67d9a1584f..e943179c54 100644 --- a/src/cmd/go/testdata/script/mod_load_badchain.txt +++ b/src/cmd/go/testdata/script/mod_load_badchain.txt @@ -28,10 +28,10 @@ cmp stderr list-expected # Try listing a package that imports a package # in a module without a requirement. go mod edit -droprequire example.com/badchain/a -! go list m/use +! go list -mod=mod m/use cmp stderr list-missing-expected -! go list -test m/testuse +! go list -mod=mod -test m/testuse cmp stderr list-missing-test-expected -- go.mod.orig -- diff --git a/src/cmd/go/testdata/script/mod_load_badmod.txt b/src/cmd/go/testdata/script/mod_load_badmod.txt index 68c8b3792b..fa22e1808b 100644 --- a/src/cmd/go/testdata/script/mod_load_badmod.txt +++ b/src/cmd/go/testdata/script/mod_load_badmod.txt @@ -1,14 +1,13 @@ # Unknown lines should be ignored in dependency go.mod files. -env GO111MODULE=on -go list -m all +go list -m -mod=mod all # ... and in replaced dependency go.mod files. cp go.mod go.mod.usesub -go list -m all +go list -m -mod=mod all # ... but not in the main module. cp go.mod.bad go.mod -! go list -m all +! go list -m -mod=mod all stderr 'unknown directive: hello' -- go.mod -- diff --git a/src/cmd/go/testdata/script/mod_load_badzip.txt b/src/cmd/go/testdata/script/mod_load_badzip.txt index c5ba18e9f0..65374d2a6d 100644 --- a/src/cmd/go/testdata/script/mod_load_badzip.txt +++ b/src/cmd/go/testdata/script/mod_load_badzip.txt @@ -5,10 +5,8 @@ env GO111MODULE=on stderr 'zip for rsc.io/badzip@v1.0.0 has unexpected file rsc.io/badzip@v1.0.0.txt' ! grep rsc.io/badzip go.mod -# TODO(golang.org/issue/31730): 'go build' should print the error below if the -# requirement is not present. go mod edit -require rsc.io/badzip@v1.0.0 -! go build rsc.io/badzip +! go build -mod=mod rsc.io/badzip stderr 'zip for rsc.io/badzip@v1.0.0 has unexpected file rsc.io/badzip@v1.0.0.txt' -- go.mod -- diff --git a/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt b/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt index 1ba8d3d22a..9c250e7d1c 100644 --- a/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt +++ b/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt @@ -1,6 +1,6 @@ env GO111MODULE=on -! go list -deps use.go +! go list -mod=mod -deps use.go stderr '^use.go:4:2: 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 -- diff --git a/src/cmd/go/testdata/script/mod_modinfo.txt b/src/cmd/go/testdata/script/mod_modinfo.txt index fb31f9e43b..d9e9fdec21 100644 --- a/src/cmd/go/testdata/script/mod_modinfo.txt +++ b/src/cmd/go/testdata/script/mod_modinfo.txt @@ -6,6 +6,7 @@ env GO111MODULE=on cd x go mod edit -require=rsc.io/quote@v1.5.2 go mod edit -replace=rsc.io/quote@v1.5.2=rsc.io/quote@v1.0.0 +go mod tidy # populate go.sum # Build a binary and ensure that it can output its own debug info. # The debug info should be accessible before main starts (golang.org/issue/29628). diff --git a/src/cmd/go/testdata/script/mod_multirepo.txt b/src/cmd/go/testdata/script/mod_multirepo.txt index 7f977e80f6..0f335a11f0 100644 --- a/src/cmd/go/testdata/script/mod_multirepo.txt +++ b/src/cmd/go/testdata/script/mod_multirepo.txt @@ -7,6 +7,7 @@ go list -deps -f {{.Dir}} # v2 import should use a downloaded module # both without an explicit go.mod entry ... cp tmp/use_v2.go x.go +go get -d . go list -deps -f {{.Dir}} stdout 'pkg[\\/]mod[\\/]rsc.io[\\/]quote[\\/]v2@v2.0.1$' diff --git a/src/cmd/go/testdata/script/mod_notall.txt b/src/cmd/go/testdata/script/mod_notall.txt index 29ca6066fa..1657c8d2d0 100644 --- a/src/cmd/go/testdata/script/mod_notall.txt +++ b/src/cmd/go/testdata/script/mod_notall.txt @@ -5,6 +5,7 @@ # module, but not should not include test dependencies of packages imported only # by other root patterns. +env GOFLAGS=-mod=mod cp go.mod go.mod.orig go list -deps all x/otherroot diff --git a/src/cmd/go/testdata/script/mod_permissions.txt b/src/cmd/go/testdata/script/mod_permissions.txt index 11fb4754f8..2d32dcd10f 100644 --- a/src/cmd/go/testdata/script/mod_permissions.txt +++ b/src/cmd/go/testdata/script/mod_permissions.txt @@ -12,7 +12,7 @@ chmod 0640 go.mod chmod 0604 go.sum go mod edit -module=golang.org/issue/34634 -go build . +go get -d cmp go.mod go.mod.want cmp go.sum go.sum.want diff --git a/src/cmd/go/testdata/script/mod_query.txt b/src/cmd/go/testdata/script/mod_query.txt index e87ca302f0..e10185709d 100644 --- a/src/cmd/go/testdata/script/mod_query.txt +++ b/src/cmd/go/testdata/script/mod_query.txt @@ -1,5 +1,10 @@ env GO111MODULE=on +# Populate go.sum. +# TODO(golang.org/issue/41297): we shouldn't need go.sum. None of the commands +# below depend on the build list. +go mod download + go list -m -versions rsc.io/quote stdout '^rsc.io/quote v1.0.0 v1.1.0 v1.2.0 v1.2.1 v1.3.0 v1.4.0 v1.5.0 v1.5.1 v1.5.2 v1.5.3-pre1$' @@ -30,3 +35,8 @@ stdout 'no matching versions for query ">v1.5.3"' -- go.mod -- module x require rsc.io/quote v1.0.0 + +-- use.go -- +package use + +import _ "rsc.io/quote" diff --git a/src/cmd/go/testdata/script/mod_replace.txt b/src/cmd/go/testdata/script/mod_replace.txt index c21f172002..dc9667f1d0 100644 --- a/src/cmd/go/testdata/script/mod_replace.txt +++ b/src/cmd/go/testdata/script/mod_replace.txt @@ -4,7 +4,7 @@ env GO111MODULE=on cp go.mod go.mod.orig # Make sure the test builds without replacement. -go build -o a1.exe . +go build -mod=mod -o a1.exe . exec ./a1.exe stdout 'Don''t communicate by sharing memory' @@ -32,7 +32,7 @@ stderr 'rsc.io/quote/v3@v3.0.0 used for two different module paths \(not-rsc.io/ # Modules that do not (yet) exist upstream can be replaced too. cp go.mod.orig go.mod go mod edit -replace=not-rsc.io/quote/v3@v3.1.0=./local/rsc.io/quote/v3 -go build -o a5.exe ./usenewmodule +go build -mod=mod -o a5.exe ./usenewmodule ! stderr 'finding not-rsc.io/quote/v3' grep 'not-rsc.io/quote/v3 v3.1.0' go.mod exec ./a5.exe diff --git a/src/cmd/go/testdata/script/mod_replace_gopkgin.txt b/src/cmd/go/testdata/script/mod_replace_gopkgin.txt index 674c99cb0c..df752d9716 100644 --- a/src/cmd/go/testdata/script/mod_replace_gopkgin.txt +++ b/src/cmd/go/testdata/script/mod_replace_gopkgin.txt @@ -11,6 +11,7 @@ env GO111MODULE=on env GOPROXY=direct env GOSUMDB=off +env GOFLAGS=-mod=mod # Replacing gopkg.in/[…].vN with a repository with a root go.mod file # specifying […].vN and a compatible version should succeed, even if diff --git a/src/cmd/go/testdata/script/mod_replace_import.txt b/src/cmd/go/testdata/script/mod_replace_import.txt index 54b1a12448..b4de5c50f7 100644 --- a/src/cmd/go/testdata/script/mod_replace_import.txt +++ b/src/cmd/go/testdata/script/mod_replace_import.txt @@ -7,6 +7,7 @@ cp go.mod go.mod.orig cmp go.mod go.mod.orig # 'go list' should resolve imports using replacements. +go get -d go list all stdout 'example.com/a/b$' stdout 'example.com/x/v3$' diff --git a/src/cmd/go/testdata/script/mod_require_exclude.txt b/src/cmd/go/testdata/script/mod_require_exclude.txt index 1a0fc3097b..9156d4ce5d 100644 --- a/src/cmd/go/testdata/script/mod_require_exclude.txt +++ b/src/cmd/go/testdata/script/mod_require_exclude.txt @@ -20,7 +20,7 @@ cmp go.mod go.mod.orig # With the selected version excluded, commands that load only modules should # drop the excluded module. -go list -m all +go list -m -mod=mod all stderr '^go: dropping requirement on excluded version rsc.io/sampler v1\.99\.99$' stdout '^x$' ! stdout '^rsc.io/sampler' @@ -30,7 +30,7 @@ cmp go.mod go.moddrop # from the next-highest version. cp go.mod.orig go.mod -go list -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all +go list -mod=mod -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all stderr '^go: dropping requirement on excluded version rsc.io/sampler v1\.99\.99$' stdout '^x $' ! stdout '^rsc.io/sampler v1.99.99' @@ -38,13 +38,13 @@ stdout '^rsc.io/sampler v1.3.0' # build with newer version available cp go.mod2 go.mod -go list -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all +go list -mod=mod -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all stderr '^go: dropping requirement on excluded version rsc.io/quote v1\.5\.1$' stdout 'rsc.io/quote v1.5.2' # build with excluded newer version cp go.mod3 go.mod -go list -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all +go list -mod=mod -f '{{with .Module}}{{.Path}} {{.Version}}{{end}}' all ! stderr '^go: dropping requirement' stdout 'rsc.io/quote v1.5.1' diff --git a/src/cmd/go/testdata/script/mod_retention.txt b/src/cmd/go/testdata/script/mod_retention.txt index 1d83e6c07e..a4441c4b3c 100644 --- a/src/cmd/go/testdata/script/mod_retention.txt +++ b/src/cmd/go/testdata/script/mod_retention.txt @@ -7,7 +7,7 @@ env GO111MODULE=on # Control case: verify that go.mod.tidy is actually tidy. cp go.mod.tidy go.mod -go list all +go list -mod=mod all cmp go.mod go.mod.tidy @@ -35,7 +35,7 @@ cmp go.mod go.mod.tidy # "// indirect" comments should be removed if direct dependencies are seen. # changes. cp go.mod.indirect go.mod -go list all +go list -mod=mod all cmp go.mod go.mod.tidy # "// indirect" comments should be added if appropriate. @@ -63,7 +63,7 @@ cmp go.mod go.mod.tidy # A missing "go" version directive should be added. # However, that should not remove other redundant requirements. cp go.mod.nogo go.mod -go list all +go list -mod=mod all cmpenv go.mod go.mod.currentgo diff --git a/src/cmd/go/testdata/script/mod_retract.txt b/src/cmd/go/testdata/script/mod_retract.txt index 5d21902043..a52e05bc72 100644 --- a/src/cmd/go/testdata/script/mod_retract.txt +++ b/src/cmd/go/testdata/script/mod_retract.txt @@ -1,5 +1,8 @@ cp go.mod go.mod.orig +# Populate go.sum. +go mod download + # 'go list pkg' does not report an error when a retracted version is used. go list -e -f '{{if .Error}}{{.Error}}{{end}}' ./use ! stdout . @@ -17,7 +20,7 @@ exists $GOPATH/pkg/mod/cache/download/example.com/retract/@v/v1.0.0-bad.mod # Importing a package from a module with a retracted latest version will # select the latest non-retracted version. -go list ./use_self_prev +go get -d ./use_self_prev go list -m example.com/retract/self/prev stdout '^example.com/retract/self/prev v1.1.0$' exists $GOPATH/pkg/mod/cache/download/example.com/retract/self/prev/@v/v1.9.0.mod diff --git a/src/cmd/go/testdata/script/mod_retract_replace.txt b/src/cmd/go/testdata/script/mod_retract_replace.txt index b710485fa7..7aec438dda 100644 --- a/src/cmd/go/testdata/script/mod_retract_replace.txt +++ b/src/cmd/go/testdata/script/mod_retract_replace.txt @@ -1,6 +1,9 @@ # If the latest unretracted version of a module is replaced, 'go list' should # obtain retractions from the replacement. +# Populate go.sum. +go get -d + # The latest version, v1.9.0, is not available on the proxy. ! go list -m -retracted example.com/retract/missingmod stderr '^go list -m: loading module retractions: example.com/retract/missingmod@v1.9.0:.*404 Not Found$' @@ -24,9 +27,9 @@ go list -m -retracted -f '{{range .Retracted}}{{.}}{{end}}' example.com/retract go list -m -retracted -f '{{if .Replace}}replaced{{end}}' example.com/retract ! stdout . go mod edit -replace example.com/retract@v1.0.0-good=example.com/retract@v1.0.0-bad -go list -m -retracted -f '{{range .Retracted}}{{.}}{{end}}' example.com/retract +go list -m -mod=mod -retracted -f '{{range .Retracted}}{{.}}{{end}}' example.com/retract stdout '^bad$' -go list -m -retracted -f '{{with .Replace}}{{range .Retracted}}{{.}}{{end}}{{end}}' example.com/retract +go list -m -mod=mod -retracted -f '{{with .Replace}}{{range .Retracted}}{{.}}{{end}}{{end}}' example.com/retract stdout '^bad$' -- go.mod -- @@ -38,6 +41,13 @@ require ( example.com/retract v1.0.0-good example.com/retract/missingmod v1.0.0 ) +-- use.go -- +package use + +import ( + _ "example.com/retract" + _ "example.com/retract/missingmod" +) -- missingmod-v1.0.0/go.mod -- module example.com/retract/missingmod diff --git a/src/cmd/go/testdata/script/mod_sum_lookup.txt b/src/cmd/go/testdata/script/mod_sum_lookup.txt index ed80a44984..e021921380 100644 --- a/src/cmd/go/testdata/script/mod_sum_lookup.txt +++ b/src/cmd/go/testdata/script/mod_sum_lookup.txt @@ -1,13 +1,14 @@ # When we attempt to resolve an import that doesn't exist, we should not save # hashes for downloaded modules. # Verifies golang.org/issue/36260. -go list -e -tags=ignore ./noexist +# TODO(golang.org/issue/26603): use 'go mod tidy -e' when implemented. +go list -e -mod=mod -tags=ignore ./noexist ! exists go.sum # When an import is resolved successfully, we should only save hashes for # the module that provides the package, not for other modules looked up. # Verifies golang.org/issue/31580. -go list ./exist +go get -d ./exist grep '^example.com/join v1.1.0 h1:' go.sum ! grep '^example.com/join/subpkg' go.sum cp go.sum go.list.sum diff --git a/src/cmd/go/testdata/script/mod_sumdb_golang.txt b/src/cmd/go/testdata/script/mod_sumdb_golang.txt index d9fb63acb0..cc0b0da474 100644 --- a/src/cmd/go/testdata/script/mod_sumdb_golang.txt +++ b/src/cmd/go/testdata/script/mod_sumdb_golang.txt @@ -34,7 +34,7 @@ cmp go.sum saved.sum # Should use the checksum database to validate new go.sum lines, # but not need to fetch any new data from the proxy. rm go.sum -go list -x rsc.io/quote +go list -mod=mod -x rsc.io/quote ! stderr github ! stderr proxy.golang.org/rsc.io/quote stderr sum.golang.org/tile @@ -45,7 +45,7 @@ cmp go.sum saved.sum env TESTGOPROXY404=1 go clean -modcache rm go.sum -go list -x rsc.io/quote +go list -mod=mod -x rsc.io/quote stderr 'proxy.golang.org.*404 testing' stderr github.com/rsc cmp go.sum saved.sum diff --git a/src/cmd/go/testdata/script/mod_symlink.txt b/src/cmd/go/testdata/script/mod_symlink.txt index 49bece2b84..dbc23fb8f0 100644 --- a/src/cmd/go/testdata/script/mod_symlink.txt +++ b/src/cmd/go/testdata/script/mod_symlink.txt @@ -1,16 +1,19 @@ env GO111MODULE=on [!symlink] skip -# 'go list' should resolve modules of imported packages. +# 'go get -d' should resolve modules of imported packages. +go get -d go list -deps -f '{{.Module}}' . stdout golang.org/x/text +go get -d ./subpkg go list -deps -f '{{.Module}}' ./subpkg stdout golang.org/x/text # Create a copy of the module using symlinks in src/links. mkdir links symlink links/go.mod -> $GOPATH/src/go.mod +symlink links/go.sum -> $GOPATH/src/go.sum symlink links/issue.go -> $GOPATH/src/issue.go mkdir links/subpkg symlink links/subpkg/issue.go -> $GOPATH/src/subpkg/issue.go diff --git a/src/cmd/go/testdata/script/mod_test.txt b/src/cmd/go/testdata/script/mod_test.txt index 8f2da2f2a5..50f00355c1 100644 --- a/src/cmd/go/testdata/script/mod_test.txt +++ b/src/cmd/go/testdata/script/mod_test.txt @@ -1,4 +1,5 @@ env GO111MODULE=on +env GOFLAGS=-mod=mod [short] skip # TODO(bcmills): Convert the 'go test' calls below to 'go list -test' once 'go diff --git a/src/cmd/go/testdata/script/mod_tidy_replace.txt b/src/cmd/go/testdata/script/mod_tidy_replace.txt index c3158f8610..7b00bf1384 100644 --- a/src/cmd/go/testdata/script/mod_tidy_replace.txt +++ b/src/cmd/go/testdata/script/mod_tidy_replace.txt @@ -1,4 +1,5 @@ env GO111MODULE=on +env GOFLAGS=-mod=mod [short] skip # golang.org/issue/30166: 'go mod tidy' should not crash if a replaced module is diff --git a/src/cmd/go/testdata/script/mod_upgrade_patch.txt b/src/cmd/go/testdata/script/mod_upgrade_patch.txt index 3939e54c1b..1ef25b9aef 100644 --- a/src/cmd/go/testdata/script/mod_upgrade_patch.txt +++ b/src/cmd/go/testdata/script/mod_upgrade_patch.txt @@ -2,6 +2,7 @@ env GO111MODULE=on [short] skip # Initially, we are at v1.0.0 for all dependencies. +go get -d cp go.mod go.mod.orig go list -m all stdout '^patch.example.com/direct v1.0.0' diff --git a/src/cmd/go/testdata/script/mod_vcs_missing.txt b/src/cmd/go/testdata/script/mod_vcs_missing.txt index a755935b53..f8be43cf4c 100644 --- a/src/cmd/go/testdata/script/mod_vcs_missing.txt +++ b/src/cmd/go/testdata/script/mod_vcs_missing.txt @@ -5,14 +5,14 @@ env GO111MODULE=on env GOPROXY=direct cd empty -! go list launchpad.net/gocheck +! go get -d launchpad.net/gocheck stderr '"bzr": executable file not found' cd .. # 1.11 used to give the cryptic error "cannot find module for path" here, but # only for a main package. cd main -! go build +! go build -mod=mod stderr '"bzr": executable file not found' cd .. diff --git a/src/cmd/go/testdata/script/mod_vendor_build.txt b/src/cmd/go/testdata/script/mod_vendor_build.txt index 0c359cea6e..4efda55e08 100644 --- a/src/cmd/go/testdata/script/mod_vendor_build.txt +++ b/src/cmd/go/testdata/script/mod_vendor_build.txt @@ -1,6 +1,9 @@ env GO111MODULE=on [short] skip +# Populate go.mod and go.sum. +go mod tidy + # initial conditions: using sampler v1.3.0, not listed in go.mod. go list -deps stdout rsc.io/sampler diff --git a/src/cmd/go/testdata/script/mod_verify.txt b/src/cmd/go/testdata/script/mod_verify.txt index 3918400435..43812d069f 100644 --- a/src/cmd/go/testdata/script/mod_verify.txt +++ b/src/cmd/go/testdata/script/mod_verify.txt @@ -56,7 +56,7 @@ go mod tidy # Packages below module root should not be mentioned in go.sum. rm go.sum go mod edit -droprequire rsc.io/quote -go list rsc.io/quote/buggy # re-resolves import path and updates go.mod +go get -d rsc.io/quote/buggy grep '^rsc.io/quote v1.5.2/go.mod ' go.sum ! grep buggy go.sum diff --git a/src/cmd/go/testdata/script/mod_why.txt b/src/cmd/go/testdata/script/mod_why.txt index 10a4f9fbea..c0ff4647a7 100644 --- a/src/cmd/go/testdata/script/mod_why.txt +++ b/src/cmd/go/testdata/script/mod_why.txt @@ -1,6 +1,9 @@ env GO111MODULE=on [short] skip +# Populate go.sum. +go mod tidy + go list -test all stdout rsc.io/quote stdout golang.org/x/text/language diff --git a/src/cmd/go/testdata/script/modfile_flag.txt b/src/cmd/go/testdata/script/modfile_flag.txt index f05bf03fbf..0ad0880817 100644 --- a/src/cmd/go/testdata/script/modfile_flag.txt +++ b/src/cmd/go/testdata/script/modfile_flag.txt @@ -37,10 +37,10 @@ go mod why rsc.io/quote # 'go list' and other commands with build flags should work. # They should update the alternate go.mod when a dependency is missing. go mod edit -droprequire rsc.io/quote -go list . +go list -mod=mod . grep rsc.io/quote go.alt.mod -go build -n . -go test -n . +go build -n -mod=mod . +go test -n -mod=mod . go get -d rsc.io/quote diff --git a/src/cmd/go/testdata/script/version.txt b/src/cmd/go/testdata/script/version.txt index 0123ac6d53..81ca698620 100644 --- a/src/cmd/go/testdata/script/version.txt +++ b/src/cmd/go/testdata/script/version.txt @@ -14,6 +14,7 @@ env GO111MODULE=on [short] skip # Check that 'go version' and 'go version -m' work on a binary built in module mode. +go get -d rsc.io/fortune go build -o fortune.exe rsc.io/fortune go version fortune.exe stdout '^fortune.exe: .+' diff --git a/src/cmd/go/testdata/script/version_replace.txt b/src/cmd/go/testdata/script/version_replace.txt index b657086f09..ec98f4e3f3 100644 --- a/src/cmd/go/testdata/script/version_replace.txt +++ b/src/cmd/go/testdata/script/version_replace.txt @@ -1,7 +1,7 @@ [short] skip go mod download example.com/printversion@v0.1.0 example.com/printversion@v1.0.0 - +go get -d example.com/printversion@v0.1.0 go install example.com/printversion go run example.com/printversion -- GitLab From b22af9b407dc29d1a733976484904ad0ab168466 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 10 Sep 2020 22:41:29 -0400 Subject: [PATCH 0460/1792] cmd/link: record only the first occurance in Reachparent graph In the deadcode pass, a type symbol may be marked twice, one without UsedInIface, one with. For the second time, don't update the Reachparent graph, so it only records the path of the first time the symbol is reached. This ensures the Reachparent graph is acyclic. TODO: add a test. (This only affects GOEXPERIMENT=fieldtrack) Change-Id: I68e8a1a69c3830bc8aee5df946151dc22dcb2b29 Reviewed-on: https://go-review.googlesource.com/c/go/+/254297 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/deadcode.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 0269429723..35545f950e 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -209,7 +209,7 @@ func (d *deadcodePass) mark(symIdx, parent loader.Sym) { if symIdx != 0 && !d.ldr.AttrReachable(symIdx) { d.wq.push(symIdx) d.ldr.SetAttrReachable(symIdx, true) - if objabi.Fieldtrack_enabled != 0 { + if objabi.Fieldtrack_enabled != 0 && d.ldr.Reachparent[symIdx] == 0 { d.ldr.Reachparent[symIdx] = parent } if *flagDumpDep { -- GitLab From 6e3df749b1058ecfaf5f6601f6f8678c0971da8e Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 9 Sep 2020 16:35:56 -0400 Subject: [PATCH 0461/1792] cmd/go: refactor -mod flag parsing Keep track of whether the -mod flag was set explicitly. When -mod=readonly is the default, we'll want to adjust our error messages if it's set explicitly. Also, register the -mod, -modcacherw, and -modfile flags in functions in internal/base instead of internal/work. 'go mod' commands that don't load packages shouldn't depend on internal/work. For #40728 Change-Id: I272aea9e19908ba37e151baac4ea8630e90f241f Reviewed-on: https://go-review.googlesource.com/c/go/+/253744 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/base/flag.go | 35 +++++++++++++++++++++++--- src/cmd/go/internal/cfg/cfg.go | 3 ++- src/cmd/go/internal/fmtcmd/fmt.go | 3 ++- src/cmd/go/internal/modcmd/download.go | 3 +-- src/cmd/go/internal/modcmd/edit.go | 3 +-- src/cmd/go/internal/modcmd/graph.go | 3 +-- src/cmd/go/internal/modcmd/init.go | 3 +-- src/cmd/go/internal/modcmd/tidy.go | 3 +-- src/cmd/go/internal/modcmd/vendor.go | 3 +-- src/cmd/go/internal/modcmd/verify.go | 3 +-- src/cmd/go/internal/modcmd/why.go | 3 +-- src/cmd/go/internal/modload/init.go | 23 +++++++++-------- src/cmd/go/internal/work/build.go | 14 +++-------- src/cmd/go/internal/work/init.go | 2 +- 14 files changed, 61 insertions(+), 43 deletions(-) diff --git a/src/cmd/go/internal/base/flag.go b/src/cmd/go/internal/base/flag.go index 6727196816..c97c744520 100644 --- a/src/cmd/go/internal/base/flag.go +++ b/src/cmd/go/internal/base/flag.go @@ -28,13 +28,42 @@ func (v *StringsFlag) String() string { return "" } +// explicitStringFlag is like a regular string flag, but it also tracks whether +// the string was set explicitly to a non-empty value. +type explicitStringFlag struct { + value *string + explicit *bool +} + +func (f explicitStringFlag) String() string { + if f.value == nil { + return "" + } + return *f.value +} + +func (f explicitStringFlag) Set(v string) error { + *f.value = v + if v != "" { + *f.explicit = true + } + return nil +} + // AddBuildFlagsNX adds the -n and -x build flags to the flag set. func AddBuildFlagsNX(flags *flag.FlagSet) { flags.BoolVar(&cfg.BuildN, "n", false, "") flags.BoolVar(&cfg.BuildX, "x", false, "") } -// AddLoadFlags adds the -mod build flag to the flag set. -func AddLoadFlags(flags *flag.FlagSet) { - flags.StringVar(&cfg.BuildMod, "mod", "", "") +// AddModFlag adds the -mod build flag to the flag set. +func AddModFlag(flags *flag.FlagSet) { + flags.Var(explicitStringFlag{value: &cfg.BuildMod, explicit: &cfg.BuildModExplicit}, "mod", "") +} + +// AddModCommonFlags adds the module-related flags common to build commands +// and 'go mod' subcommands. +func AddModCommonFlags(flags *flag.FlagSet) { + flags.BoolVar(&cfg.ModCacheRW, "modcacherw", false, "") + flags.StringVar(&cfg.ModFile, "modfile", "", "") } diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go index f9bbcd9180..f874b880a6 100644 --- a/src/cmd/go/internal/cfg/cfg.go +++ b/src/cmd/go/internal/cfg/cfg.go @@ -27,7 +27,8 @@ var ( BuildBuildmode string // -buildmode flag BuildContext = defaultContext() BuildMod string // -mod flag - BuildModReason string // reason -mod flag is set, if set by default + BuildModExplicit bool // whether -mod was set explicitly + BuildModReason string // reason -mod was set, if set by default BuildI bool // -i flag BuildLinkshared bool // -linkshared flag BuildMSan bool // -msan flag diff --git a/src/cmd/go/internal/fmtcmd/fmt.go b/src/cmd/go/internal/fmtcmd/fmt.go index f96cff429c..b0c1c59b40 100644 --- a/src/cmd/go/internal/fmtcmd/fmt.go +++ b/src/cmd/go/internal/fmtcmd/fmt.go @@ -23,7 +23,8 @@ import ( func init() { base.AddBuildFlagsNX(&CmdFmt.Flag) - base.AddLoadFlags(&CmdFmt.Flag) + base.AddModFlag(&CmdFmt.Flag) + base.AddModCommonFlags(&CmdFmt.Flag) } var CmdFmt = &base.Command{ diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 41f294d475..0ea5638e70 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -14,7 +14,6 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/modfetch" "cmd/go/internal/modload" - "cmd/go/internal/work" "golang.org/x/mod/module" ) @@ -64,7 +63,7 @@ func init() { // TODO(jayconrod): https://golang.org/issue/35849 Apply -x to other 'go mod' commands. cmdDownload.Flag.BoolVar(&cfg.BuildX, "x", false, "") - work.AddModCommonFlags(cmdDownload) + base.AddModCommonFlags(&cmdDownload.Flag) } type moduleJSON struct { diff --git a/src/cmd/go/internal/modcmd/edit.go b/src/cmd/go/internal/modcmd/edit.go index 18bdd34cd0..03a774b824 100644 --- a/src/cmd/go/internal/modcmd/edit.go +++ b/src/cmd/go/internal/modcmd/edit.go @@ -19,7 +19,6 @@ import ( "cmd/go/internal/lockedfile" "cmd/go/internal/modfetch" "cmd/go/internal/modload" - "cmd/go/internal/work" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -154,7 +153,7 @@ func init() { cmdEdit.Flag.Var(flagFunc(flagRetract), "retract", "") cmdEdit.Flag.Var(flagFunc(flagDropRetract), "dropretract", "") - work.AddModCommonFlags(cmdEdit) + base.AddModCommonFlags(&cmdEdit.Flag) base.AddBuildFlagsNX(&cmdEdit.Flag) } diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index 513536a010..a149b65605 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -15,7 +15,6 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modload" - "cmd/go/internal/work" "golang.org/x/mod/module" ) @@ -33,7 +32,7 @@ path@version, except for the main module, which has no @version suffix. } func init() { - work.AddModCommonFlags(cmdGraph) + base.AddModCommonFlags(&cmdGraph.Flag) } func runGraph(ctx context.Context, cmd *base.Command, args []string) { diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index b6cffd332d..21b235653e 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -9,7 +9,6 @@ package modcmd import ( "cmd/go/internal/base" "cmd/go/internal/modload" - "cmd/go/internal/work" "context" "os" "strings" @@ -30,7 +29,7 @@ To override this guess, supply the module path as an argument. } func init() { - work.AddModCommonFlags(cmdInit) + base.AddModCommonFlags(&cmdInit.Flag) } func runInit(ctx context.Context, cmd *base.Command, args []string) { diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index 4dcb62e02f..30df674ef6 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -10,7 +10,6 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modload" - "cmd/go/internal/work" "context" ) @@ -32,7 +31,7 @@ to standard error. func init() { cmdTidy.Run = runTidy // break init cycle cmdTidy.Flag.BoolVar(&cfg.BuildV, "v", false, "") - work.AddModCommonFlags(cmdTidy) + base.AddModCommonFlags(&cmdTidy.Flag) } func runTidy(ctx context.Context, cmd *base.Command, args []string) { diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index 30334f3a42..91d2509452 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -19,7 +19,6 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/imports" "cmd/go/internal/modload" - "cmd/go/internal/work" "golang.org/x/mod/module" "golang.org/x/mod/semver" @@ -41,7 +40,7 @@ modules and packages to standard error. func init() { cmdVendor.Flag.BoolVar(&cfg.BuildV, "v", false, "") - work.AddModCommonFlags(cmdVendor) + base.AddModCommonFlags(&cmdVendor.Flag) } func runVendor(ctx context.Context, cmd *base.Command, args []string) { diff --git a/src/cmd/go/internal/modcmd/verify.go b/src/cmd/go/internal/modcmd/verify.go index d542825823..7700588bde 100644 --- a/src/cmd/go/internal/modcmd/verify.go +++ b/src/cmd/go/internal/modcmd/verify.go @@ -17,7 +17,6 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/modfetch" "cmd/go/internal/modload" - "cmd/go/internal/work" "golang.org/x/mod/module" "golang.org/x/mod/sumdb/dirhash" @@ -38,7 +37,7 @@ non-zero status. } func init() { - work.AddModCommonFlags(cmdVerify) + base.AddModCommonFlags(&cmdVerify.Flag) } func runVerify(ctx context.Context, cmd *base.Command, args []string) { diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index 30b15fc153..8454fdfec6 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -11,7 +11,6 @@ import ( "cmd/go/internal/base" "cmd/go/internal/modload" - "cmd/go/internal/work" "golang.org/x/mod/module" ) @@ -58,7 +57,7 @@ var ( func init() { cmdWhy.Run = runWhy // break init cycle - work.AddModCommonFlags(cmdWhy) + base.AddModCommonFlags(&cmdWhy.Flag) } func runWhy(ctx context.Context, cmd *base.Command, args []string) { diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 8e8fb9e6a1..1f50dcb11c 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -518,17 +518,20 @@ func modFileToBuildList() { // setDefaultBuildMod sets a default value for cfg.BuildMod // if it is currently empty. func setDefaultBuildMod() { - if cfg.BuildMod != "" { + if cfg.BuildModExplicit { // Don't override an explicit '-mod=' argument. return } - cfg.BuildMod = "mod" + if cfg.CmdName == "get" || strings.HasPrefix(cfg.CmdName, "mod ") { - // Don't set -mod implicitly for commands whose purpose is to - // manipulate the build list. + // 'get' and 'go mod' commands may update go.mod automatically. + // TODO(jayconrod): should this narrower? Should 'go mod download' or + // 'go mod graph' update go.mod by default? + cfg.BuildMod = "mod" return } if modRoot == "" { + cfg.BuildMod = "mod" return } @@ -546,18 +549,18 @@ func setDefaultBuildMod() { } } - // Since a vendor directory exists, we have a non-trivial reason for - // choosing -mod=mod, although it probably won't be used for anything. - // Record the reason anyway for consistency. - // It may be overridden if we switch to mod=readonly below. - cfg.BuildModReason = fmt.Sprintf("Go version in go.mod is %s.", modGo) + // Since a vendor directory exists, we should record why we didn't use it. + // This message won't normally be shown, but it may appear with import errors. + cfg.BuildModReason = fmt.Sprintf("Go version in go.mod is %s, so vendor directory was not used.", modGo) } p := ModFilePath() if fi, err := os.Stat(p); err == nil && !hasWritePerm(p, fi) { cfg.BuildMod = "readonly" cfg.BuildModReason = "go.mod file is read-only." + return } + cfg.BuildMod = "mod" } func legacyModInit() { @@ -857,7 +860,7 @@ func WriteGoMod() { // prefer to report a dirty go.mod over a dirty go.sum if cfg.BuildModReason != "" { base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly\n\t(%s)", cfg.BuildModReason) - } else { + } else if cfg.BuildModExplicit { base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly") } } diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index d020aa6e9f..e99982ed36 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -240,13 +240,12 @@ const ( // AddBuildFlags adds the flags common to the build, clean, get, // install, list, run, and test commands. func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) { + base.AddBuildFlagsNX(&cmd.Flag) cmd.Flag.BoolVar(&cfg.BuildA, "a", false, "") - cmd.Flag.BoolVar(&cfg.BuildN, "n", false, "") cmd.Flag.IntVar(&cfg.BuildP, "p", cfg.BuildP, "") if mask&OmitVFlag == 0 { cmd.Flag.BoolVar(&cfg.BuildV, "v", false, "") } - cmd.Flag.BoolVar(&cfg.BuildX, "x", false, "") cmd.Flag.Var(&load.BuildAsmflags, "asmflags", "") cmd.Flag.Var(buildCompiler{}, "compiler", "") @@ -254,10 +253,10 @@ func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) { cmd.Flag.Var(&load.BuildGcflags, "gcflags", "") cmd.Flag.Var(&load.BuildGccgoflags, "gccgoflags", "") if mask&OmitModFlag == 0 { - cmd.Flag.StringVar(&cfg.BuildMod, "mod", "", "") + base.AddModFlag(&cmd.Flag) } if mask&OmitModCommonFlags == 0 { - AddModCommonFlags(cmd) + base.AddModCommonFlags(&cmd.Flag) } cmd.Flag.StringVar(&cfg.BuildContext.InstallSuffix, "installsuffix", "", "") cmd.Flag.Var(&load.BuildLdflags, "ldflags", "") @@ -275,13 +274,6 @@ func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) { cmd.Flag.StringVar(&cfg.DebugTrace, "debug-trace", "", "") } -// AddModCommonFlags adds the module-related flags common to build commands -// and 'go mod' subcommands. -func AddModCommonFlags(cmd *base.Command) { - cmd.Flag.BoolVar(&cfg.ModCacheRW, "modcacherw", false, "") - cmd.Flag.StringVar(&cfg.ModFile, "modfile", "", "") -} - // tagsFlag is the implementation of the -tags flag. type tagsFlag []string diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go index dad3b10111..f78020032c 100644 --- a/src/cmd/go/internal/work/init.go +++ b/src/cmd/go/internal/work/init.go @@ -252,7 +252,7 @@ func buildModeInit() { switch cfg.BuildMod { case "": - // ok + // Behavior will be determined automatically, as if no flag were passed. case "readonly", "vendor", "mod": if !cfg.ModulesEnabled && !inGOFLAGS("-mod") { base.Fatalf("build flag -mod=%s only valid when using modules", cfg.BuildMod) -- GitLab From 9214677e7df1e6130249bc83d721130b00d829c4 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 9 Sep 2020 16:41:55 -0400 Subject: [PATCH 0462/1792] cmd/go: refactor modload.Import for better -mod=readonly errors When -mod=readonly is set, Import will now allow imports from replacements without explicit requirements. With -mod=mod, this would add a new requirement but does not trigger a module lookup, so it's determinisitic. Before reporting an error for an unknown import with -mod=readonly, check whether the import is valid. If there's a typo in the import, that's more relevant. For #40728 Change-Id: I05e138ff76ba3d0eb2e3010c15589fa363deb8d3 Reviewed-on: https://go-review.googlesource.com/c/go/+/253745 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/import.go | 53 ++++++++++++++----- .../go/testdata/script/mod_build_info_err.txt | 2 +- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index c625184b8b..10b1e7f4b8 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -107,6 +107,25 @@ func (e *AmbiguousImportError) Error() string { var _ load.ImportPathError = &AmbiguousImportError{} +type invalidImportError struct { + importPath string + err error +} + +func (e *invalidImportError) ImportPath() string { + return e.importPath +} + +func (e *invalidImportError) Error() string { + return e.err.Error() +} + +func (e *invalidImportError) Unwrap() error { + return e.err +} + +var _ load.ImportPathError = &invalidImportError{} + // importFromBuildList finds the module and directory in the build list // containing the package with the given import path. The answer must be unique: // importFromBuildList returns an error if multiple modules attempt to provide @@ -207,17 +226,6 @@ func importFromBuildList(ctx context.Context, path string) (m module.Version, di func queryImport(ctx context.Context, path string) (module.Version, error) { pathIsStd := search.IsStandardImportPath(path) - if cfg.BuildMod == "readonly" { - var queryErr error - if !pathIsStd { - if cfg.BuildModReason == "" { - queryErr = fmt.Errorf("import lookup disabled by -mod=%s", cfg.BuildMod) - } else { - queryErr = fmt.Errorf("import lookup disabled by -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason) - } - } - return module.Version{}, &ImportMissingError{Path: path, QueryErr: queryErr} - } if modRoot == "" && !allowMissingModuleImports { return module.Version{}, &ImportMissingError{ Path: path, @@ -226,8 +234,9 @@ func queryImport(ctx context.Context, path string) (module.Version, error) { } // Not on build list. - // To avoid spurious remote fetches, next try the latest replacement for each module. - // (golang.org/issue/26241) + // To avoid spurious remote fetches, next try the latest replacement for each + // module (golang.org/issue/26241). This should give a useful message + // in -mod=readonly, and it will allow us to add a requirement with -mod=mod. if modFile != nil { latest := map[string]string{} // path -> version for _, r := range modFile.Replace { @@ -288,6 +297,11 @@ func queryImport(ctx context.Context, path string) (module.Version, error) { } } + // Before any further lookup, check that the path is valid. + if err := module.CheckImportPath(path); err != nil { + return module.Version{}, &invalidImportError{importPath: path, err: err} + } + if pathIsStd { // This package isn't in the standard library, isn't in any module already // in the build list, and isn't in any other module that the user has @@ -299,6 +313,19 @@ func queryImport(ctx context.Context, path string) (module.Version, error) { return module.Version{}, &ImportMissingError{Path: path} } + if cfg.BuildMod == "readonly" { + var queryErr error + if cfg.BuildModExplicit { + queryErr = fmt.Errorf("import lookup disabled by -mod=%s", cfg.BuildMod) + } else if cfg.BuildModReason != "" { + queryErr = fmt.Errorf("import lookup disabled by -mod=%s\n\t(%s)", cfg.BuildMod, cfg.BuildModReason) + } + return module.Version{}, &ImportMissingError{Path: path, QueryErr: queryErr} + } + + // 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. fmt.Fprintf(os.Stderr, "go: finding module for package %s\n", path) candidates, err := QueryPackage(ctx, path, "latest", CheckAllowed) 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 87a099b219..a6853b5c86 100644 --- a/src/cmd/go/testdata/script/mod_build_info_err.txt +++ b/src/cmd/go/testdata/script/mod_build_info_err.txt @@ -2,7 +2,7 @@ # Verifies golang.org/issue/34393. go list -e -deps -f '{{with .Error}}{{.Pos}}: {{.Err}}{{end}}' ./main -stdout 'bad[/\\]bad.go:3:8: malformed module path "🐧.example.com/string": invalid char ''🐧''' +stdout 'bad[/\\]bad.go:3:8: malformed import path "🐧.example.com/string": invalid char ''🐧''' -- go.mod -- module m -- GitLab From a531bd5a59177dfef354df8b5b5b529a2a55d015 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 8 Sep 2020 20:41:51 -0400 Subject: [PATCH 0463/1792] cmd/internal/objfile: recognize Mach-O __DATA_CONST segment as read-only data Updates #38830. Change-Id: I826c6b0a42bc8e48fcda556250ca4a95c73987eb Reviewed-on: https://go-review.googlesource.com/c/go/+/253918 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/internal/objfile/macho.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/internal/objfile/macho.go b/src/cmd/internal/objfile/macho.go index fdb7e76dfc..1d6963f7c4 100644 --- a/src/cmd/internal/objfile/macho.go +++ b/src/cmd/internal/objfile/macho.go @@ -60,7 +60,7 @@ func (f *machoFile) symbols() ([]Sym, error) { } else if int(s.Sect) <= len(f.macho.Sections) { sect := f.macho.Sections[s.Sect-1] switch sect.Seg { - case "__TEXT": + case "__TEXT", "__DATA_CONST": sym.Code = 'R' case "__DATA": sym.Code = 'D' -- GitLab From ffd95aadcddc34ec2c83971346f04cf7234e0fca Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 3 Sep 2020 12:59:09 -0400 Subject: [PATCH 0464/1792] cmd/link: put read-only data in __DATA_CONST segment On darwin, we put read-only data in __TEXT segment on AMD64 in exe (non-PIE) buildmode, and in __DATA on everywhere else. This is not ideal: things in __DATA segment are not read-only, and being mapped R/W may use more run-time resources. In fact, newer darwin systems support a __DATA_CONST segment, which the dynamic linker will map it read-only after applying relocations. Use that. Fixes #38830. Change-Id: Ic281e6c6ca8ef5fec4bb7c5b71c50dd5393e78ae Reviewed-on: https://go-review.googlesource.com/c/go/+/253919 Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/data.go | 20 ++++++++++----- src/cmd/link/internal/ld/macho.go | 41 ++++++++++++++++++------------ src/cmd/link/internal/ld/target.go | 6 ++++- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 8324a98a26..a730125cf2 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -930,7 +930,7 @@ func writeBlock(ctxt *Link, out *OutBuf, ldr *loader.Loader, syms []loader.Sym, break } if val < addr { - ldr.Errorf(s, "phase error: addr=%#x but sym=%#x type=%d", addr, val, ldr.SymType(s)) + ldr.Errorf(s, "phase error: addr=%#x but sym=%#x type=%v sect=%v", addr, val, ldr.SymType(s), ldr.SymSect(s).Name) errorexit() } if addr < val { @@ -1308,9 +1308,9 @@ func (state *dodataState) makeRelroForSharedLib(target *Link) { // relro Type before it reaches here. isRelro = true case sym.SFUNCTAB: - if target.IsAIX() && ldr.SymName(s) == "runtime.etypes" { + if ldr.SymName(s) == "runtime.etypes" { // runtime.etypes must be at the end of - // the relro datas. + // the relro data. isRelro = true } } @@ -1706,7 +1706,7 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.ebss", 0), sect) bssGcEnd := state.datsize - int64(sect.Vaddr) - // Emit gcdata for bcc symbols now that symbol values have been assigned. + // Emit gcdata for bss symbols now that symbol values have been assigned. gcsToEmit := []struct { symName string symKind sym.SymKind @@ -1826,13 +1826,16 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { const fallbackPerm = 04 relroSecPerm := fallbackPerm genrelrosecname := func(suffix string) string { + if suffix == "" { + return ".rodata" + } return suffix } seg := segro if ctxt.UseRelro() { segrelro := &Segrelrodata - if ctxt.LinkMode == LinkExternal && ctxt.HeadType != objabi.Haix { + if ctxt.LinkMode == LinkExternal && !ctxt.IsAIX() && !ctxt.IsDarwin() { // Using a separate segment with an external // linker results in some programs moving // their data sections unexpectedly, which @@ -1845,9 +1848,12 @@ func (state *dodataState) allocateDataSections(ctxt *Link) { state.datsize = 0 } - genrelrosecname = func(suffix string) string { - return ".data.rel.ro" + suffix + if !ctxt.IsDarwin() { // We don't need the special names on darwin. + genrelrosecname = func(suffix string) string { + return ".data.rel.ro" + suffix + } } + relroReadOnly := []sym.SymKind{} for _, symnro := range sym.ReadOnly { symn := sym.RelROMap[symnro] diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index f6356729a6..9765ce18d3 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -499,16 +499,7 @@ func machoadddynlib(lib string, linkmode LinkMode) { func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string) { buf := "__" + strings.Replace(sect.Name[1:], ".", "_", -1) - var msect *MachoSect - if sect.Rwx&1 == 0 && segname != "__DWARF" && (ctxt.Arch.Family == sys.ARM64 || - (ctxt.Arch.Family == sys.AMD64 && ctxt.BuildMode != BuildModeExe)) { - // Darwin external linker on arm64, and on amd64 in c-shared/c-archive buildmode - // complains about absolute relocs in __TEXT, so if the section is not - // executable, put it in __DATA segment. - msect = newMachoSect(mseg, buf, "__DATA") - } else { - msect = newMachoSect(mseg, buf, segname) - } + msect := newMachoSect(mseg, buf, segname) if sect.Rellen > 0 { msect.reloc = uint32(sect.Reloff) @@ -633,13 +624,28 @@ func asmbMacho(ctxt *Link) { machoshbits(ctxt, ms, sect, "__TEXT") } + /* rodata */ + if ctxt.LinkMode != LinkExternal && Segrelrodata.Length > 0 { + ms = newMachoSeg("__DATA_CONST", 20) + ms.vaddr = Segrelrodata.Vaddr + ms.vsize = Segrelrodata.Length + ms.fileoffset = Segrelrodata.Fileoff + ms.filesize = Segrelrodata.Filelen + ms.prot1 = 3 + ms.prot2 = 3 + ms.flag = 0x10 // SG_READ_ONLY + } + + for _, sect := range Segrelrodata.Sections { + machoshbits(ctxt, ms, sect, "__DATA_CONST") + } + /* data */ if ctxt.LinkMode != LinkExternal { - w := int64(Segdata.Length) ms = newMachoSeg("__DATA", 20) - ms.vaddr = uint64(va) + uint64(v) - ms.vsize = uint64(w) - ms.fileoffset = uint64(v) + ms.vaddr = Segdata.Vaddr + ms.vsize = Segdata.Length + ms.fileoffset = Segdata.Fileoff ms.filesize = Segdata.Filelen ms.prot1 = 3 ms.prot2 = 3 @@ -695,7 +701,7 @@ func asmbMacho(ctxt *Link) { if ctxt.LinkMode != LinkExternal { ms := newMachoSeg("__LINKEDIT", 0) - ms.vaddr = uint64(va) + uint64(v) + uint64(Rnd(int64(Segdata.Length), int64(*FlagRound))) + ms.vaddr = uint64(Rnd(int64(Segdata.Vaddr+Segdata.Length), int64(*FlagRound))) ms.vsize = uint64(s1) + uint64(s2) + uint64(s3) + uint64(s4) ms.fileoffset = uint64(linkoff) ms.filesize = ms.vsize @@ -1008,7 +1014,7 @@ func doMachoLink(ctxt *Link) int64 { size := int(ldr.SymSize(s1) + ldr.SymSize(s2) + ldr.SymSize(s3) + ldr.SymSize(s4)) if size > 0 { - linkoff = Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound)) + Rnd(int64(Segdata.Filelen), int64(*FlagRound)) + Rnd(int64(Segdwarf.Filelen), int64(*FlagRound)) + linkoff = Rnd(int64(uint64(HEADR)+Segtext.Length), int64(*FlagRound)) + Rnd(int64(Segrelrodata.Filelen), int64(*FlagRound)) + Rnd(int64(Segdata.Filelen), int64(*FlagRound)) + Rnd(int64(Segdwarf.Filelen), int64(*FlagRound)) ctxt.Out.SeekSet(linkoff) ctxt.Out.Write(ldr.Data(s1)) @@ -1086,6 +1092,9 @@ func machoEmitReloc(ctxt *Link) { for _, sect := range Segtext.Sections[1:] { relocSect(ctxt, sect, ctxt.datap) } + for _, sect := range Segrelrodata.Sections { + relocSect(ctxt, sect, ctxt.datap) + } for _, sect := range Segdata.Sections { relocSect(ctxt, sect, ctxt.datap) } diff --git a/src/cmd/link/internal/ld/target.go b/src/cmd/link/internal/ld/target.go index 102b6c5436..f68de8fff1 100644 --- a/src/cmd/link/internal/ld/target.go +++ b/src/cmd/link/internal/ld/target.go @@ -74,8 +74,12 @@ func (t *Target) IsDynlinkingGo() bool { func (t *Target) UseRelro() bool { switch t.BuildMode { case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePIE, BuildModePlugin: - return t.IsELF || t.HeadType == objabi.Haix + return t.IsELF || t.HeadType == objabi.Haix || t.HeadType == objabi.Hdarwin default: + if t.HeadType == objabi.Hdarwin && t.IsARM64() { + // On darwin/ARM64, everything is PIE. + return true + } return t.linkShared || (t.HeadType == objabi.Haix && t.LinkMode == LinkExternal) } } -- GitLab From 1ed4f12f4a6b9d783cf9a6fc3a292a433b8539c6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 10 Sep 2020 11:14:27 -0400 Subject: [PATCH 0465/1792] cmd/link: add a test to test RODATA is indeed read-only Updates #38830. Change-Id: Ie1f6ccef40a773f038aac587dfc26bf70a1a8536 Reviewed-on: https://go-review.googlesource.com/c/go/+/253921 Run-TryBot: Cherry Zhang Reviewed-by: Than McIntosh TryBot-Result: Gobot Gobot --- src/cmd/link/link_test.go | 14 ++++++++++++++ src/cmd/link/testdata/testRO/x.go | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/cmd/link/testdata/testRO/x.go diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 98798be465..4e60996d8e 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -800,3 +800,17 @@ func TestContentAddressableSymbols(t *testing.T) { t.Errorf("command %s failed: %v\n%s", cmd, err, out) } } + +func TestReadOnly(t *testing.T) { + // Test that read-only data is indeed read-only. + testenv.MustHaveGoBuild(t) + + t.Parallel() + + src := filepath.Join("testdata", "testRO", "x.go") + cmd := exec.Command(testenv.GoToolPath(t), "run", src) + out, err := cmd.CombinedOutput() + if err == nil { + t.Errorf("running test program did not fail. output:\n%s", out) + } +} diff --git a/src/cmd/link/testdata/testRO/x.go b/src/cmd/link/testdata/testRO/x.go new file mode 100644 index 0000000000..d77db6d563 --- /dev/null +++ b/src/cmd/link/testdata/testRO/x.go @@ -0,0 +1,22 @@ +// 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. + +// Test that read-only data is indeed read-only. This +// program attempts to modify read-only data, and it +// should fail. + +package main + +import "unsafe" + +var s = "hello" + +func main() { + println(s) + *(*struct { + p *byte + l int + })(unsafe.Pointer(&s)).p = 'H' + println(s) +} -- GitLab From b459bc8152210c14b66e23351690ff774cd68d2c Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 11 Sep 2020 09:31:30 -0400 Subject: [PATCH 0466/1792] cmd/go: make 'go mod download' update go.sum after downloads are complete 'go mod download' calls WriteGoMod once via modload.ListModules when it loads the build list. This saves sums for go.mod files needed by MVS, but the write occurs before any zip files are downloaded. With this change, 'go mod download' calls WriteGoMod again (and thus, modfetch.WriteGoSum) after downloading and verifying module zip files, so the sums of the zip files will be saved, too. Fixes #41341 Change-Id: I7d56754aa255256ed45fd93cb154c2e6ea5f45a9 Reviewed-on: https://go-review.googlesource.com/c/go/+/254357 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modcmd/download.go | 3 +++ src/cmd/go/testdata/script/mod_download.txt | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 0ea5638e70..6227fd9f33 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -187,4 +187,7 @@ func runDownload(ctx context.Context, cmd *base.Command, args []string) { } base.ExitIfErrors() } + + // Update go.mod and especially go.sum if needed. + modload.WriteGoMod() } diff --git a/src/cmd/go/testdata/script/mod_download.txt b/src/cmd/go/testdata/script/mod_download.txt index b9bf67cad5..c53bbe4567 100644 --- a/src/cmd/go/testdata/script/mod_download.txt +++ b/src/cmd/go/testdata/script/mod_download.txt @@ -107,6 +107,14 @@ stderr '^go mod download: skipping argument m that resolves to the main module\n go mod download m@latest stderr '^go mod download: skipping argument m@latest that resolves to the main module\n' +# download updates go.mod and populates go.sum +cd update +! exists go.sum +go mod download +grep '^rsc.io/sampler v1.3.0 ' go.sum +go list -m rsc.io/sampler +stdout '^rsc.io/sampler v1.3.0$' + # allow go mod download without go.mod env GO111MODULE=auto rm go.mod @@ -122,3 +130,13 @@ stderr 'get '$GOPROXY -- go.mod -- module m + +-- update/go.mod -- +module m + +go 1.16 + +require ( + rsc.io/quote v1.5.2 + rsc.io/sampler v1.2.1 // older version than in build list +) -- GitLab From 86ee84c40e2770ff189b6a4d835849107d9c749a Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 2 Sep 2020 13:25:11 -0400 Subject: [PATCH 0467/1792] cmd/go: move get.Insecure to cfg.Insecure to break dependency cycle Change-Id: If9c73ff5adc7e080a48ecc6b35ce40822193d66f Reviewed-on: https://go-review.googlesource.com/c/go/+/254363 Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills Reviewed-by: Michael Matloob TryBot-Result: Gobot Gobot --- src/cmd/go/internal/cfg/cfg.go | 2 ++ src/cmd/go/internal/get/get.go | 6 ++---- src/cmd/go/internal/modfetch/insecure.go | 3 +-- src/cmd/go/internal/modfetch/sumdb.go | 3 +-- src/cmd/go/internal/modget/get.go | 6 +++--- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go index f874b880a6..9bf1db73ef 100644 --- a/src/cmd/go/internal/cfg/cfg.go +++ b/src/cmd/go/internal/cfg/cfg.go @@ -49,6 +49,8 @@ var ( ModCacheRW bool // -modcacherw flag ModFile string // -modfile flag + Insecure bool // -insecure flag + CmdName string // "build", "install", "list", "mod tidy", etc. DebugActiongraph string // -debug-actiongraph flag (undocumented, unstable) diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index d0be3fe1e7..9e4825eb37 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -108,14 +108,12 @@ var ( getT = CmdGet.Flag.Bool("t", false, "") getU = CmdGet.Flag.Bool("u", false, "") getFix = CmdGet.Flag.Bool("fix", false, "") - - Insecure bool ) func init() { work.AddBuildFlags(CmdGet, work.OmitModFlag|work.OmitModCommonFlags) CmdGet.Run = runGet // break init loop - CmdGet.Flag.BoolVar(&Insecure, "insecure", Insecure, "") + CmdGet.Flag.BoolVar(&cfg.Insecure, "insecure", cfg.Insecure, "") } func runGet(ctx context.Context, cmd *base.Command, args []string) { @@ -431,7 +429,7 @@ func downloadPackage(p *load.Package) error { return fmt.Errorf("%s: invalid import path: %v", p.ImportPath, err) } security := web.SecureOnly - if Insecure || module.MatchPrefixPatterns(cfg.GOINSECURE, importPrefix) { + if cfg.Insecure || module.MatchPrefixPatterns(cfg.GOINSECURE, importPrefix) { security = web.Insecure } diff --git a/src/cmd/go/internal/modfetch/insecure.go b/src/cmd/go/internal/modfetch/insecure.go index b692669cba..012d05f29d 100644 --- a/src/cmd/go/internal/modfetch/insecure.go +++ b/src/cmd/go/internal/modfetch/insecure.go @@ -6,12 +6,11 @@ package modfetch import ( "cmd/go/internal/cfg" - "cmd/go/internal/get" "golang.org/x/mod/module" ) // allowInsecure reports whether we are allowed to fetch this path in an insecure manner. func allowInsecure(path string) bool { - return get.Insecure || module.MatchPrefixPatterns(cfg.GOINSECURE, path) + return cfg.Insecure || module.MatchPrefixPatterns(cfg.GOINSECURE, path) } diff --git a/src/cmd/go/internal/modfetch/sumdb.go b/src/cmd/go/internal/modfetch/sumdb.go index 783c4a433b..47a2571531 100644 --- a/src/cmd/go/internal/modfetch/sumdb.go +++ b/src/cmd/go/internal/modfetch/sumdb.go @@ -22,7 +22,6 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" - "cmd/go/internal/get" "cmd/go/internal/lockedfile" "cmd/go/internal/web" @@ -33,7 +32,7 @@ import ( // useSumDB reports whether to use the Go checksum database for the given module. func useSumDB(mod module.Version) bool { - return cfg.GOSUMDB != "off" && !get.Insecure && !module.MatchPrefixPatterns(cfg.GONOSUMDB, mod.Path) + return cfg.GOSUMDB != "off" && !cfg.Insecure && !module.MatchPrefixPatterns(cfg.GONOSUMDB, mod.Path) } // lookupSumDB returns the Go checksum database's go.sum lines for the given module, diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index a2a8287d84..829cfe055a 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -17,7 +17,7 @@ import ( "sync" "cmd/go/internal/base" - "cmd/go/internal/get" + "cmd/go/internal/cfg" "cmd/go/internal/imports" "cmd/go/internal/load" "cmd/go/internal/modload" @@ -181,7 +181,7 @@ var ( getM = CmdGet.Flag.Bool("m", false, "") getT = CmdGet.Flag.Bool("t", false, "") getU upgradeFlag - // -insecure is get.Insecure + // -insecure is cfg.Insecure // -v is cfg.BuildV ) @@ -206,7 +206,7 @@ func (v *upgradeFlag) String() string { return "" } func init() { work.AddBuildFlags(CmdGet, work.OmitModFlag) CmdGet.Run = runGet // break init loop - CmdGet.Flag.BoolVar(&get.Insecure, "insecure", get.Insecure, "") + CmdGet.Flag.BoolVar(&cfg.Insecure, "insecure", cfg.Insecure, "") CmdGet.Flag.Var(&getU, "u", "") } -- GitLab From 07c1788357cfe6a4ee5f6f6a54d4fe9f579fa844 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 2 Sep 2020 14:53:02 -0400 Subject: [PATCH 0468/1792] cmd/go: move repository resolution from internal/get to internal/vcs This is a refactoring intended to break the dependency from internal/modfetch to internal/get. No change in functionality is intended. Change-Id: If51aba7139cc0b62ecc9ba454c055c99e8f36f0f Reviewed-on: https://go-review.googlesource.com/c/go/+/254364 Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills Reviewed-by: Michael Matloob TryBot-Result: Gobot Gobot --- src/cmd/go/internal/get/get.go | 35 +-- src/cmd/go/internal/modfetch/repo.go | 12 +- src/cmd/go/internal/str/str_test.go | 27 ++ src/cmd/go/internal/{get => vcs}/discovery.go | 2 +- .../pkg_test.go => vcs/discovery_test.go} | 23 +- src/cmd/go/internal/{get => vcs}/vcs.go | 277 +++++++++--------- src/cmd/go/internal/{get => vcs}/vcs_test.go | 46 +-- 7 files changed, 217 insertions(+), 205 deletions(-) create mode 100644 src/cmd/go/internal/str/str_test.go rename src/cmd/go/internal/{get => vcs}/discovery.go (99%) rename src/cmd/go/internal/{get/pkg_test.go => vcs/discovery_test.go} (85%) rename src/cmd/go/internal/{get => vcs}/vcs.go (83%) rename src/cmd/go/internal/{get => vcs}/vcs_test.go (94%) diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index 9e4825eb37..3f7a66384a 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -18,6 +18,7 @@ import ( "cmd/go/internal/load" "cmd/go/internal/search" "cmd/go/internal/str" + "cmd/go/internal/vcs" "cmd/go/internal/web" "cmd/go/internal/work" @@ -406,7 +407,7 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int) // to make the first copy of or update a copy of the given package. func downloadPackage(p *load.Package) error { var ( - vcs *vcsCmd + vcsCmd *vcs.Cmd repo, rootPath string err error blindRepo bool // set if the repo has unusual configuration @@ -435,16 +436,16 @@ func downloadPackage(p *load.Package) error { if p.Internal.Build.SrcRoot != "" { // Directory exists. Look for checkout along path to src. - vcs, rootPath, err = vcsFromDir(p.Dir, p.Internal.Build.SrcRoot) + vcsCmd, rootPath, err = vcs.FromDir(p.Dir, p.Internal.Build.SrcRoot) if err != nil { return err } repo = "" // should be unused; make distinctive // Double-check where it came from. - if *getU && vcs.remoteRepo != nil { + if *getU && vcsCmd.RemoteRepo != nil { dir := filepath.Join(p.Internal.Build.SrcRoot, filepath.FromSlash(rootPath)) - remote, err := vcs.remoteRepo(vcs, dir) + remote, err := vcsCmd.RemoteRepo(vcsCmd, dir) if err != nil { // Proceed anyway. The package is present; we likely just don't understand // the repo configuration (e.g. unusual remote protocol). @@ -452,10 +453,10 @@ func downloadPackage(p *load.Package) error { } repo = remote if !*getF && err == nil { - if rr, err := RepoRootForImportPath(importPrefix, IgnoreMod, security); err == nil { + if rr, err := vcs.RepoRootForImportPath(importPrefix, vcs.IgnoreMod, security); err == nil { repo := rr.Repo - if rr.vcs.resolveRepo != nil { - resolved, err := rr.vcs.resolveRepo(rr.vcs, dir, repo) + if rr.VCS.ResolveRepo != nil { + resolved, err := rr.VCS.ResolveRepo(rr.VCS, dir, repo) if err == nil { repo = resolved } @@ -469,13 +470,13 @@ func downloadPackage(p *load.Package) error { } else { // Analyze the import path to determine the version control system, // repository, and the import path for the root of the repository. - rr, err := RepoRootForImportPath(importPrefix, IgnoreMod, security) + rr, err := vcs.RepoRootForImportPath(importPrefix, vcs.IgnoreMod, security) if err != nil { return err } - vcs, repo, rootPath = rr.vcs, rr.Repo, rr.Root + vcsCmd, repo, rootPath = rr.VCS, rr.Repo, rr.Root } - if !blindRepo && !vcs.isSecure(repo) && security != web.Insecure { + if !blindRepo && !vcsCmd.IsSecure(repo) && security != web.Insecure { return fmt.Errorf("cannot download, %v uses insecure protocol", repo) } @@ -498,7 +499,7 @@ func downloadPackage(p *load.Package) error { } root := filepath.Join(p.Internal.Build.SrcRoot, filepath.FromSlash(rootPath)) - if err := checkNestedVCS(vcs, root, p.Internal.Build.SrcRoot); err != nil { + if err := vcs.CheckNested(vcsCmd, root, p.Internal.Build.SrcRoot); err != nil { return err } @@ -514,7 +515,7 @@ func downloadPackage(p *load.Package) error { // Check that this is an appropriate place for the repo to be checked out. // The target directory must either not exist or have a repo checked out already. - meta := filepath.Join(root, "."+vcs.cmd) + meta := filepath.Join(root, "."+vcsCmd.Cmd) if _, err := os.Stat(meta); err != nil { // Metadata file or directory does not exist. Prepare to checkout new copy. // Some version control tools require the target directory not to exist. @@ -535,12 +536,12 @@ func downloadPackage(p *load.Package) error { fmt.Fprintf(os.Stderr, "created GOPATH=%s; see 'go help gopath'\n", p.Internal.Build.Root) } - if err = vcs.create(root, repo); err != nil { + if err = vcsCmd.Create(root, repo); err != nil { return err } } else { // Metadata directory does exist; download incremental updates. - if err = vcs.download(root); err != nil { + if err = vcsCmd.Download(root); err != nil { return err } } @@ -549,12 +550,12 @@ func downloadPackage(p *load.Package) error { // Do not show tag sync in -n; it's noise more than anything, // and since we're not running commands, no tag will be found. // But avoid printing nothing. - fmt.Fprintf(os.Stderr, "# cd %s; %s sync/update\n", root, vcs.cmd) + fmt.Fprintf(os.Stderr, "# cd %s; %s sync/update\n", root, vcsCmd.Cmd) return nil } // Select and sync to appropriate version of the repository. - tags, err := vcs.tags(root) + tags, err := vcsCmd.Tags(root) if err != nil { return err } @@ -562,7 +563,7 @@ func downloadPackage(p *load.Package) error { if i := strings.Index(vers, " "); i >= 0 { vers = vers[:i] } - if err := vcs.tagSync(root, selectTag(vers, tags)); err != nil { + if err := vcsCmd.TagSync(root, selectTag(vers, tags)); err != nil { return err } diff --git a/src/cmd/go/internal/modfetch/repo.go b/src/cmd/go/internal/modfetch/repo.go index 34f805d58a..eed4dd4258 100644 --- a/src/cmd/go/internal/modfetch/repo.go +++ b/src/cmd/go/internal/modfetch/repo.go @@ -13,9 +13,9 @@ import ( "time" "cmd/go/internal/cfg" - "cmd/go/internal/get" "cmd/go/internal/modfetch/codehost" "cmd/go/internal/par" + "cmd/go/internal/vcs" web "cmd/go/internal/web" "golang.org/x/mod/module" @@ -261,13 +261,13 @@ func lookupDirect(path string) (Repo, error) { if allowInsecure(path) { security = web.Insecure } - rr, err := get.RepoRootForImportPath(path, get.PreferMod, security) + rr, err := vcs.RepoRootForImportPath(path, vcs.PreferMod, security) if err != nil { // We don't know where to find code for a module with this path. return nil, notExistError{err: err} } - if rr.VCS == "mod" { + if rr.VCS.Name == "mod" { // Fetch module from proxy with base URL rr.Repo. return newProxyRepo(rr.Repo, path) } @@ -279,8 +279,8 @@ func lookupDirect(path string) (Repo, error) { return newCodeRepo(code, rr.Root, path) } -func lookupCodeRepo(rr *get.RepoRoot) (codehost.Repo, error) { - code, err := codehost.NewRepo(rr.VCS, rr.Repo) +func lookupCodeRepo(rr *vcs.RepoRoot) (codehost.Repo, error) { + code, err := codehost.NewRepo(rr.VCS.Cmd, rr.Repo) if err != nil { if _, ok := err.(*codehost.VCSError); ok { return nil, err @@ -306,7 +306,7 @@ func ImportRepoRev(path, rev string) (Repo, *RevInfo, error) { if allowInsecure(path) { security = web.Insecure } - rr, err := get.RepoRootForImportPath(path, get.IgnoreMod, security) + rr, err := vcs.RepoRootForImportPath(path, vcs.IgnoreMod, security) if err != nil { return nil, nil, err } diff --git a/src/cmd/go/internal/str/str_test.go b/src/cmd/go/internal/str/str_test.go new file mode 100644 index 0000000000..147ce1a63e --- /dev/null +++ b/src/cmd/go/internal/str/str_test.go @@ -0,0 +1,27 @@ +// 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 str + +import "testing" + +var foldDupTests = []struct { + list []string + f1, f2 string +}{ + {StringList("math/rand", "math/big"), "", ""}, + {StringList("math", "strings"), "", ""}, + {StringList("strings"), "", ""}, + {StringList("strings", "strings"), "strings", "strings"}, + {StringList("Rand", "rand", "math", "math/rand", "math/Rand"), "Rand", "rand"}, +} + +func TestFoldDup(t *testing.T) { + for _, tt := range foldDupTests { + f1, f2 := FoldDup(tt.list) + if f1 != tt.f1 || f2 != tt.f2 { + t.Errorf("foldDup(%q) = %q, %q, want %q, %q", tt.list, f1, f2, tt.f1, tt.f2) + } + } +} diff --git a/src/cmd/go/internal/get/discovery.go b/src/cmd/go/internal/vcs/discovery.go similarity index 99% rename from src/cmd/go/internal/get/discovery.go rename to src/cmd/go/internal/vcs/discovery.go index afa6ef455f..327b44cb9a 100644 --- a/src/cmd/go/internal/get/discovery.go +++ b/src/cmd/go/internal/vcs/discovery.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 get +package vcs import ( "encoding/xml" diff --git a/src/cmd/go/internal/get/pkg_test.go b/src/cmd/go/internal/vcs/discovery_test.go similarity index 85% rename from src/cmd/go/internal/get/pkg_test.go rename to src/cmd/go/internal/vcs/discovery_test.go index fc6a179c2e..eb99fdf64c 100644 --- a/src/cmd/go/internal/get/pkg_test.go +++ b/src/cmd/go/internal/vcs/discovery_test.go @@ -2,35 +2,14 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package get +package vcs import ( - "cmd/go/internal/str" "reflect" "strings" "testing" ) -var foldDupTests = []struct { - list []string - f1, f2 string -}{ - {str.StringList("math/rand", "math/big"), "", ""}, - {str.StringList("math", "strings"), "", ""}, - {str.StringList("strings"), "", ""}, - {str.StringList("strings", "strings"), "strings", "strings"}, - {str.StringList("Rand", "rand", "math", "math/rand", "math/Rand"), "Rand", "rand"}, -} - -func TestFoldDup(t *testing.T) { - for _, tt := range foldDupTests { - f1, f2 := str.FoldDup(tt.list) - if f1 != tt.f1 || f2 != tt.f2 { - t.Errorf("foldDup(%q) = %q, %q, want %q, %q", tt.list, f1, f2, tt.f1, tt.f2) - } - } -} - var parseMetaGoImportsTests = []struct { in string mod ModuleMode diff --git a/src/cmd/go/internal/get/vcs.go b/src/cmd/go/internal/vcs/vcs.go similarity index 83% rename from src/cmd/go/internal/get/vcs.go rename to src/cmd/go/internal/vcs/vcs.go index 24c32935d0..e535998d89 100644 --- a/src/cmd/go/internal/get/vcs.go +++ b/src/cmd/go/internal/vcs/vcs.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 get +package vcs import ( "encoding/json" @@ -27,23 +27,23 @@ import ( // A vcsCmd describes how to use a version control system // like Mercurial, Git, or Subversion. -type vcsCmd struct { - name string - cmd string // name of binary to invoke command +type Cmd struct { + Name string + Cmd string // name of binary to invoke command - createCmd []string // commands to download a fresh copy of a repository - downloadCmd []string // commands to download updates into an existing repository + CreateCmd []string // commands to download a fresh copy of a repository + DownloadCmd []string // commands to download updates into an existing repository - tagCmd []tagCmd // commands to list tags - tagLookupCmd []tagCmd // commands to lookup tags before running tagSyncCmd - tagSyncCmd []string // commands to sync to specific tag - tagSyncDefault []string // commands to sync to default tag + TagCmd []tagCmd // commands to list tags + TagLookupCmd []tagCmd // commands to lookup tags before running tagSyncCmd + TagSyncCmd []string // commands to sync to specific tag + TagSyncDefault []string // commands to sync to default tag - scheme []string - pingCmd string + Scheme []string + PingCmd string - remoteRepo func(v *vcsCmd, rootDir string) (remoteRepo string, err error) - resolveRepo func(v *vcsCmd, rootDir, remoteRepo string) (realRepo string, err error) + RemoteRepo func(v *Cmd, rootDir string) (remoteRepo string, err error) + ResolveRepo func(v *Cmd, rootDir, remoteRepo string) (realRepo string, err error) } var defaultSecureScheme = map[string]bool{ @@ -54,7 +54,7 @@ var defaultSecureScheme = map[string]bool{ "ssh": true, } -func (v *vcsCmd) isSecure(repo string) bool { +func (v *Cmd) IsSecure(repo string) bool { u, err := urlpkg.Parse(repo) if err != nil { // If repo is not a URL, it's not secure. @@ -63,8 +63,8 @@ func (v *vcsCmd) isSecure(repo string) bool { return v.isSecureScheme(u.Scheme) } -func (v *vcsCmd) isSecureScheme(scheme string) bool { - switch v.cmd { +func (v *Cmd) isSecureScheme(scheme string) bool { + switch v.Cmd { case "git": // GIT_ALLOW_PROTOCOL is an environment variable defined by Git. It is a // colon-separated list of schemes that are allowed to be used with git @@ -89,7 +89,7 @@ type tagCmd struct { } // vcsList lists the known version control systems -var vcsList = []*vcsCmd{ +var vcsList = []*Cmd{ vcsHg, vcsGit, vcsSvn, @@ -97,11 +97,15 @@ var vcsList = []*vcsCmd{ vcsFossil, } +// vcsMod is a stub for the "mod" scheme. It's returned by +// repoRootForImportPathDynamic, but is otherwise not treated as a VCS command. +var vcsMod = &Cmd{Name: "mod"} + // vcsByCmd returns the version control system for the given // command name (hg, git, svn, bzr). -func vcsByCmd(cmd string) *vcsCmd { +func vcsByCmd(cmd string) *Cmd { for _, vcs := range vcsList { - if vcs.cmd == cmd { + if vcs.Cmd == cmd { return vcs } } @@ -109,31 +113,31 @@ func vcsByCmd(cmd string) *vcsCmd { } // vcsHg describes how to use Mercurial. -var vcsHg = &vcsCmd{ - name: "Mercurial", - cmd: "hg", +var vcsHg = &Cmd{ + Name: "Mercurial", + Cmd: "hg", - createCmd: []string{"clone -U -- {repo} {dir}"}, - downloadCmd: []string{"pull"}, + CreateCmd: []string{"clone -U -- {repo} {dir}"}, + DownloadCmd: []string{"pull"}, // We allow both tag and branch names as 'tags' // for selecting a version. This lets people have // a go.release.r60 branch and a go1 branch // and make changes in both, without constantly // editing .hgtags. - tagCmd: []tagCmd{ + TagCmd: []tagCmd{ {"tags", `^(\S+)`}, {"branches", `^(\S+)`}, }, - tagSyncCmd: []string{"update -r {tag}"}, - tagSyncDefault: []string{"update default"}, + TagSyncCmd: []string{"update -r {tag}"}, + TagSyncDefault: []string{"update default"}, - scheme: []string{"https", "http", "ssh"}, - pingCmd: "identify -- {scheme}://{repo}", - remoteRepo: hgRemoteRepo, + Scheme: []string{"https", "http", "ssh"}, + PingCmd: "identify -- {scheme}://{repo}", + RemoteRepo: hgRemoteRepo, } -func hgRemoteRepo(vcsHg *vcsCmd, rootDir string) (remoteRepo string, err error) { +func hgRemoteRepo(vcsHg *Cmd, rootDir string) (remoteRepo string, err error) { out, err := vcsHg.runOutput(rootDir, "paths default") if err != nil { return "", err @@ -142,45 +146,45 @@ func hgRemoteRepo(vcsHg *vcsCmd, rootDir string) (remoteRepo string, err error) } // vcsGit describes how to use Git. -var vcsGit = &vcsCmd{ - name: "Git", - cmd: "git", +var vcsGit = &Cmd{ + Name: "Git", + Cmd: "git", - createCmd: []string{"clone -- {repo} {dir}", "-go-internal-cd {dir} submodule update --init --recursive"}, - downloadCmd: []string{"pull --ff-only", "submodule update --init --recursive"}, + CreateCmd: []string{"clone -- {repo} {dir}", "-go-internal-cd {dir} submodule update --init --recursive"}, + DownloadCmd: []string{"pull --ff-only", "submodule update --init --recursive"}, - tagCmd: []tagCmd{ + TagCmd: []tagCmd{ // tags/xxx matches a git tag named xxx // origin/xxx matches a git branch named xxx on the default remote repository {"show-ref", `(?:tags|origin)/(\S+)$`}, }, - tagLookupCmd: []tagCmd{ + TagLookupCmd: []tagCmd{ {"show-ref tags/{tag} origin/{tag}", `((?:tags|origin)/\S+)$`}, }, - tagSyncCmd: []string{"checkout {tag}", "submodule update --init --recursive"}, + TagSyncCmd: []string{"checkout {tag}", "submodule update --init --recursive"}, // both createCmd and downloadCmd update the working dir. // No need to do more here. We used to 'checkout master' // but that doesn't work if the default branch is not named master. // DO NOT add 'checkout master' here. // See golang.org/issue/9032. - tagSyncDefault: []string{"submodule update --init --recursive"}, + TagSyncDefault: []string{"submodule update --init --recursive"}, - scheme: []string{"git", "https", "http", "git+ssh", "ssh"}, + Scheme: []string{"git", "https", "http", "git+ssh", "ssh"}, // Leave out the '--' separator in the ls-remote command: git 2.7.4 does not // support such a separator for that command, and this use should be safe // without it because the {scheme} value comes from the predefined list above. // See golang.org/issue/33836. - pingCmd: "ls-remote {scheme}://{repo}", + PingCmd: "ls-remote {scheme}://{repo}", - remoteRepo: gitRemoteRepo, + RemoteRepo: gitRemoteRepo, } // scpSyntaxRe matches the SCP-like addresses used by Git to access // repositories by SSH. var scpSyntaxRe = lazyregexp.New(`^([a-zA-Z0-9_]+)@([a-zA-Z0-9._-]+):(.*)$`) -func gitRemoteRepo(vcsGit *vcsCmd, rootDir string) (remoteRepo string, err error) { +func gitRemoteRepo(vcsGit *Cmd, rootDir string) (remoteRepo string, err error) { cmd := "config remote.origin.url" errParse := errors.New("unable to parse output of git " + cmd) errRemoteOriginNotFound := errors.New("remote origin not found") @@ -216,7 +220,7 @@ func gitRemoteRepo(vcsGit *vcsCmd, rootDir string) (remoteRepo string, err error // Iterate over insecure schemes too, because this function simply // reports the state of the repo. If we can't see insecure schemes then // we can't report the actual repo URL. - for _, s := range vcsGit.scheme { + for _, s := range vcsGit.Scheme { if repoURL.Scheme == s { return repoURL.String(), nil } @@ -225,27 +229,27 @@ func gitRemoteRepo(vcsGit *vcsCmd, rootDir string) (remoteRepo string, err error } // vcsBzr describes how to use Bazaar. -var vcsBzr = &vcsCmd{ - name: "Bazaar", - cmd: "bzr", +var vcsBzr = &Cmd{ + Name: "Bazaar", + Cmd: "bzr", - createCmd: []string{"branch -- {repo} {dir}"}, + CreateCmd: []string{"branch -- {repo} {dir}"}, // Without --overwrite bzr will not pull tags that changed. // Replace by --overwrite-tags after http://pad.lv/681792 goes in. - downloadCmd: []string{"pull --overwrite"}, + DownloadCmd: []string{"pull --overwrite"}, - tagCmd: []tagCmd{{"tags", `^(\S+)`}}, - tagSyncCmd: []string{"update -r {tag}"}, - tagSyncDefault: []string{"update -r revno:-1"}, + TagCmd: []tagCmd{{"tags", `^(\S+)`}}, + TagSyncCmd: []string{"update -r {tag}"}, + TagSyncDefault: []string{"update -r revno:-1"}, - scheme: []string{"https", "http", "bzr", "bzr+ssh"}, - pingCmd: "info -- {scheme}://{repo}", - remoteRepo: bzrRemoteRepo, - resolveRepo: bzrResolveRepo, + Scheme: []string{"https", "http", "bzr", "bzr+ssh"}, + PingCmd: "info -- {scheme}://{repo}", + RemoteRepo: bzrRemoteRepo, + ResolveRepo: bzrResolveRepo, } -func bzrRemoteRepo(vcsBzr *vcsCmd, rootDir string) (remoteRepo string, err error) { +func bzrRemoteRepo(vcsBzr *Cmd, rootDir string) (remoteRepo string, err error) { outb, err := vcsBzr.runOutput(rootDir, "config parent_location") if err != nil { return "", err @@ -253,7 +257,7 @@ func bzrRemoteRepo(vcsBzr *vcsCmd, rootDir string) (remoteRepo string, err error return strings.TrimSpace(string(outb)), nil } -func bzrResolveRepo(vcsBzr *vcsCmd, rootDir, remoteRepo string) (realRepo string, err error) { +func bzrResolveRepo(vcsBzr *Cmd, rootDir, remoteRepo string) (realRepo string, err error) { outb, err := vcsBzr.runOutput(rootDir, "info "+remoteRepo) if err != nil { return "", err @@ -287,22 +291,22 @@ func bzrResolveRepo(vcsBzr *vcsCmd, rootDir, remoteRepo string) (realRepo string } // vcsSvn describes how to use Subversion. -var vcsSvn = &vcsCmd{ - name: "Subversion", - cmd: "svn", +var vcsSvn = &Cmd{ + Name: "Subversion", + Cmd: "svn", - createCmd: []string{"checkout -- {repo} {dir}"}, - downloadCmd: []string{"update"}, + CreateCmd: []string{"checkout -- {repo} {dir}"}, + DownloadCmd: []string{"update"}, // There is no tag command in subversion. // The branch information is all in the path names. - scheme: []string{"https", "http", "svn", "svn+ssh"}, - pingCmd: "info -- {scheme}://{repo}", - remoteRepo: svnRemoteRepo, + Scheme: []string{"https", "http", "svn", "svn+ssh"}, + PingCmd: "info -- {scheme}://{repo}", + RemoteRepo: svnRemoteRepo, } -func svnRemoteRepo(vcsSvn *vcsCmd, rootDir string) (remoteRepo string, err error) { +func svnRemoteRepo(vcsSvn *Cmd, rootDir string) (remoteRepo string, err error) { outb, err := vcsSvn.runOutput(rootDir, "info") if err != nil { return "", err @@ -337,22 +341,22 @@ func svnRemoteRepo(vcsSvn *vcsCmd, rootDir string) (remoteRepo string, err error const fossilRepoName = ".fossil" // vcsFossil describes how to use Fossil (fossil-scm.org) -var vcsFossil = &vcsCmd{ - name: "Fossil", - cmd: "fossil", +var vcsFossil = &Cmd{ + Name: "Fossil", + Cmd: "fossil", - createCmd: []string{"-go-internal-mkdir {dir} clone -- {repo} " + filepath.Join("{dir}", fossilRepoName), "-go-internal-cd {dir} open .fossil"}, - downloadCmd: []string{"up"}, + CreateCmd: []string{"-go-internal-mkdir {dir} clone -- {repo} " + filepath.Join("{dir}", fossilRepoName), "-go-internal-cd {dir} open .fossil"}, + DownloadCmd: []string{"up"}, - tagCmd: []tagCmd{{"tag ls", `(.*)`}}, - tagSyncCmd: []string{"up tag:{tag}"}, - tagSyncDefault: []string{"up trunk"}, + TagCmd: []tagCmd{{"tag ls", `(.*)`}}, + TagSyncCmd: []string{"up tag:{tag}"}, + TagSyncDefault: []string{"up trunk"}, - scheme: []string{"https", "http"}, - remoteRepo: fossilRemoteRepo, + Scheme: []string{"https", "http"}, + RemoteRepo: fossilRemoteRepo, } -func fossilRemoteRepo(vcsFossil *vcsCmd, rootDir string) (remoteRepo string, err error) { +func fossilRemoteRepo(vcsFossil *Cmd, rootDir string) (remoteRepo string, err error) { out, err := vcsFossil.runOutput(rootDir, "remote-url") if err != nil { return "", err @@ -360,8 +364,8 @@ func fossilRemoteRepo(vcsFossil *vcsCmd, rootDir string) (remoteRepo string, err return strings.TrimSpace(string(out)), nil } -func (v *vcsCmd) String() string { - return v.name +func (v *Cmd) String() string { + return v.Name } // run runs the command line cmd in the given directory. @@ -371,24 +375,24 @@ func (v *vcsCmd) String() string { // If an error occurs, run prints the command line and the // command's combined stdout+stderr to standard error. // Otherwise run discards the command's output. -func (v *vcsCmd) run(dir string, cmd string, keyval ...string) error { +func (v *Cmd) run(dir string, cmd string, keyval ...string) error { _, err := v.run1(dir, cmd, keyval, true) return err } // runVerboseOnly is like run but only generates error output to standard error in verbose mode. -func (v *vcsCmd) runVerboseOnly(dir string, cmd string, keyval ...string) error { +func (v *Cmd) runVerboseOnly(dir string, cmd string, keyval ...string) error { _, err := v.run1(dir, cmd, keyval, false) return err } // runOutput is like run but returns the output of the command. -func (v *vcsCmd) runOutput(dir string, cmd string, keyval ...string) ([]byte, error) { +func (v *Cmd) runOutput(dir string, cmd string, keyval ...string) ([]byte, error) { return v.run1(dir, cmd, keyval, true) } // run1 is the generalized implementation of run and runOutput. -func (v *vcsCmd) run1(dir string, cmdline string, keyval []string, verbose bool) ([]byte, error) { +func (v *Cmd) run1(dir string, cmdline string, keyval []string, verbose bool) ([]byte, error) { m := make(map[string]string) for i := 0; i < len(keyval); i += 2 { m[keyval[i]] = keyval[i+1] @@ -420,25 +424,25 @@ func (v *vcsCmd) run1(dir string, cmdline string, keyval []string, verbose bool) args = args[2:] } - _, err := exec.LookPath(v.cmd) + _, err := exec.LookPath(v.Cmd) if err != nil { fmt.Fprintf(os.Stderr, "go: missing %s command. See https://golang.org/s/gogetcmd\n", - v.name) + v.Name) return nil, err } - cmd := exec.Command(v.cmd, args...) + cmd := exec.Command(v.Cmd, args...) cmd.Dir = dir cmd.Env = base.AppendPWD(os.Environ(), cmd.Dir) if cfg.BuildX { fmt.Fprintf(os.Stderr, "cd %s\n", dir) - fmt.Fprintf(os.Stderr, "%s %s\n", v.cmd, strings.Join(args, " ")) + fmt.Fprintf(os.Stderr, "%s %s\n", v.Cmd, strings.Join(args, " ")) } out, err := cmd.Output() if err != nil { if verbose || cfg.BuildV { - fmt.Fprintf(os.Stderr, "# cd %s; %s %s\n", dir, v.cmd, strings.Join(args, " ")) + fmt.Fprintf(os.Stderr, "# cd %s; %s %s\n", dir, v.Cmd, strings.Join(args, " ")) if ee, ok := err.(*exec.ExitError); ok && len(ee.Stderr) > 0 { os.Stderr.Write(ee.Stderr) } else { @@ -449,15 +453,15 @@ func (v *vcsCmd) run1(dir string, cmdline string, keyval []string, verbose bool) return out, err } -// ping pings to determine scheme to use. -func (v *vcsCmd) ping(scheme, repo string) error { - return v.runVerboseOnly(".", v.pingCmd, "scheme", scheme, "repo", repo) +// Ping pings to determine scheme to use. +func (v *Cmd) Ping(scheme, repo string) error { + return v.runVerboseOnly(".", v.PingCmd, "scheme", scheme, "repo", repo) } -// create creates a new copy of repo in dir. +// Create creates a new copy of repo in dir. // The parent of dir must exist; dir must not. -func (v *vcsCmd) create(dir, repo string) error { - for _, cmd := range v.createCmd { +func (v *Cmd) Create(dir, repo string) error { + for _, cmd := range v.CreateCmd { if err := v.run(".", cmd, "dir", dir, "repo", repo); err != nil { return err } @@ -465,9 +469,9 @@ func (v *vcsCmd) create(dir, repo string) error { return nil } -// download downloads any new changes for the repo in dir. -func (v *vcsCmd) download(dir string) error { - for _, cmd := range v.downloadCmd { +// Download downloads any new changes for the repo in dir. +func (v *Cmd) Download(dir string) error { + for _, cmd := range v.DownloadCmd { if err := v.run(dir, cmd); err != nil { return err } @@ -475,10 +479,10 @@ func (v *vcsCmd) download(dir string) error { return nil } -// tags returns the list of available tags for the repo in dir. -func (v *vcsCmd) tags(dir string) ([]string, error) { +// Tags returns the list of available tags for the repo in dir. +func (v *Cmd) Tags(dir string) ([]string, error) { var tags []string - for _, tc := range v.tagCmd { + for _, tc := range v.TagCmd { out, err := v.runOutput(dir, tc.cmd) if err != nil { return nil, err @@ -493,12 +497,12 @@ func (v *vcsCmd) tags(dir string) ([]string, error) { // tagSync syncs the repo in dir to the named tag, // which either is a tag returned by tags or is v.tagDefault. -func (v *vcsCmd) tagSync(dir, tag string) error { - if v.tagSyncCmd == nil { +func (v *Cmd) TagSync(dir, tag string) error { + if v.TagSyncCmd == nil { return nil } if tag != "" { - for _, tc := range v.tagLookupCmd { + for _, tc := range v.TagLookupCmd { out, err := v.runOutput(dir, tc.cmd, "tag", tag) if err != nil { return err @@ -512,8 +516,8 @@ func (v *vcsCmd) tagSync(dir, tag string) error { } } - if tag == "" && v.tagSyncDefault != nil { - for _, cmd := range v.tagSyncDefault { + if tag == "" && v.TagSyncDefault != nil { + for _, cmd := range v.TagSyncDefault { if err := v.run(dir, cmd); err != nil { return err } @@ -521,7 +525,7 @@ func (v *vcsCmd) tagSync(dir, tag string) error { return nil } - for _, cmd := range v.tagSyncCmd { + for _, cmd := range v.TagSyncCmd { if err := v.run(dir, cmd, "tag", tag); err != nil { return err } @@ -540,11 +544,11 @@ type vcsPath struct { schemelessRepo bool // if true, the repo pattern lacks a scheme } -// vcsFromDir inspects dir and its parents to determine the +// FromDir inspects dir and its parents to determine the // version control system and code repository to use. // On return, root is the import path // corresponding to the root of the repository. -func vcsFromDir(dir, srcRoot string) (vcs *vcsCmd, root string, err error) { +func FromDir(dir, srcRoot string) (vcs *Cmd, root string, err error) { // Clean and double-check that dir is in (a subdirectory of) srcRoot. dir = filepath.Clean(dir) srcRoot = filepath.Clean(srcRoot) @@ -552,13 +556,13 @@ func vcsFromDir(dir, srcRoot string) (vcs *vcsCmd, root string, err error) { return nil, "", fmt.Errorf("directory %q is outside source root %q", dir, srcRoot) } - var vcsRet *vcsCmd + var vcsRet *Cmd var rootRet string origDir := dir for len(dir) > len(srcRoot) { for _, vcs := range vcsList { - if _, err := os.Stat(filepath.Join(dir, "."+vcs.cmd)); err == nil { + if _, err := os.Stat(filepath.Join(dir, "."+vcs.Cmd)); err == nil { root := filepath.ToSlash(dir[len(srcRoot)+1:]) // Record first VCS we find, but keep looking, // to detect mistakes like one kind of VCS inside another. @@ -568,12 +572,12 @@ func vcsFromDir(dir, srcRoot string) (vcs *vcsCmd, root string, err error) { continue } // Allow .git inside .git, which can arise due to submodules. - if vcsRet == vcs && vcs.cmd == "git" { + if vcsRet == vcs && vcs.Cmd == "git" { continue } // Otherwise, we have one VCS inside a different VCS. return nil, "", fmt.Errorf("directory %q uses %s, but parent %q uses %s", - filepath.Join(srcRoot, rootRet), vcsRet.cmd, filepath.Join(srcRoot, root), vcs.cmd) + filepath.Join(srcRoot, rootRet), vcsRet.Cmd, filepath.Join(srcRoot, root), vcs.Cmd) } } @@ -593,9 +597,9 @@ func vcsFromDir(dir, srcRoot string) (vcs *vcsCmd, root string, err error) { return nil, "", fmt.Errorf("directory %q is not using a known version control system", origDir) } -// checkNestedVCS checks for an incorrectly-nested VCS-inside-VCS +// CheckNested checks for an incorrectly-nested VCS-inside-VCS // situation for dir, checking parents up until srcRoot. -func checkNestedVCS(vcs *vcsCmd, dir, srcRoot string) error { +func CheckNested(vcs *Cmd, dir, srcRoot string) error { if len(dir) <= len(srcRoot) || dir[len(srcRoot)] != filepath.Separator { return fmt.Errorf("directory %q is outside source root %q", dir, srcRoot) } @@ -603,17 +607,17 @@ func checkNestedVCS(vcs *vcsCmd, dir, srcRoot string) error { otherDir := dir for len(otherDir) > len(srcRoot) { for _, otherVCS := range vcsList { - if _, err := os.Stat(filepath.Join(otherDir, "."+otherVCS.cmd)); err == nil { + if _, err := os.Stat(filepath.Join(otherDir, "."+otherVCS.Cmd)); err == nil { // Allow expected vcs in original dir. if otherDir == dir && otherVCS == vcs { continue } // Allow .git inside .git, which can arise due to submodules. - if otherVCS == vcs && vcs.cmd == "git" { + if otherVCS == vcs && vcs.Cmd == "git" { continue } // Otherwise, we have one VCS inside a different VCS. - return fmt.Errorf("directory %q uses %s, but parent %q uses %s", dir, vcs.cmd, otherDir, otherVCS.cmd) + return fmt.Errorf("directory %q uses %s, but parent %q uses %s", dir, vcs.Cmd, otherDir, otherVCS.Cmd) } } // Move to parent. @@ -633,9 +637,7 @@ type RepoRoot struct { Repo string // repository URL, including scheme Root string // import path corresponding to root of repo IsCustom bool // defined by served tags (as opposed to hard-coded pattern) - VCS string // vcs type ("mod", "git", ...) - - vcs *vcsCmd // internal: vcs command access + VCS *Cmd } func httpPrefix(s string) string { @@ -735,15 +737,15 @@ func repoRootFromVCSPaths(importPath string, security web.SecurityMode, vcsPaths if !srv.schemelessRepo { repoURL = match["repo"] } else { - scheme := vcs.scheme[0] // default to first scheme + scheme := vcs.Scheme[0] // default to first scheme repo := match["repo"] - if vcs.pingCmd != "" { + if vcs.PingCmd != "" { // If we know how to test schemes, scan to find one. - for _, s := range vcs.scheme { + for _, s := range vcs.Scheme { if security == web.SecureOnly && !vcs.isSecureScheme(s) { continue } - if vcs.ping(s, repo) == nil { + if vcs.Ping(s, repo) == nil { scheme = s break } @@ -754,8 +756,7 @@ func repoRootFromVCSPaths(importPath string, security web.SecurityMode, vcsPaths rr := &RepoRoot{ Repo: repoURL, Root: match["root"], - VCS: vcs.cmd, - vcs: vcs, + VCS: vcs, } return rr, nil } @@ -846,17 +847,21 @@ func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.Se if err := validateRepoRoot(mmi.RepoRoot); err != nil { return nil, fmt.Errorf("%s: invalid repo root %q: %v", resp.URL, mmi.RepoRoot, err) } - vcs := vcsByCmd(mmi.VCS) - if vcs == nil && mmi.VCS != "mod" { - return nil, fmt.Errorf("%s: unknown vcs %q", resp.URL, mmi.VCS) + var vcs *Cmd + if mmi.VCS == "mod" { + vcs = vcsMod + } else { + vcs = vcsByCmd(mmi.VCS) + if vcs == nil { + return nil, fmt.Errorf("%s: unknown vcs %q", resp.URL, mmi.VCS) + } } rr := &RepoRoot{ Repo: mmi.RepoRoot, Root: mmi.Prefix, IsCustom: true, - VCS: mmi.VCS, - vcs: vcs, + VCS: vcs, } return rr, nil } @@ -1103,7 +1108,7 @@ var vcsPathsAfterDynamic = []*vcsPath{ func noVCSSuffix(match map[string]string) error { repo := match["repo"] for _, vcs := range vcsList { - if strings.HasSuffix(repo, "."+vcs.cmd) { + if strings.HasSuffix(repo, "."+vcs.Cmd) { return fmt.Errorf("invalid version control suffix in %s path", match["prefix"]) } } @@ -1133,7 +1138,7 @@ func bitbucketVCS(match map[string]string) error { // VCS it uses. See issue 5375. root := match["root"] for _, vcs := range []string{"git", "hg"} { - if vcsByCmd(vcs).ping("https", root) == nil { + if vcsByCmd(vcs).Ping("https", root) == nil { resp.SCM = vcs break } diff --git a/src/cmd/go/internal/get/vcs_test.go b/src/cmd/go/internal/vcs/vcs_test.go similarity index 94% rename from src/cmd/go/internal/get/vcs_test.go rename to src/cmd/go/internal/vcs/vcs_test.go index 195bc231eb..5b874204f1 100644 --- a/src/cmd/go/internal/get/vcs_test.go +++ b/src/cmd/go/internal/vcs/vcs_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 get +package vcs import ( "errors" @@ -28,7 +28,7 @@ func TestRepoRootForImportPath(t *testing.T) { { "github.com/golang/groupcache", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://github.com/golang/groupcache", }, }, @@ -41,14 +41,14 @@ func TestRepoRootForImportPath(t *testing.T) { { "hub.jazz.net/git/user1/pkgname", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://hub.jazz.net/git/user1/pkgname", }, }, { "hub.jazz.net/git/user1/pkgname/submodule/submodule/submodule", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://hub.jazz.net/git/user1/pkgname", }, }, @@ -89,7 +89,7 @@ func TestRepoRootForImportPath(t *testing.T) { { "hub.jazz.net/git/user/pkg.name", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://hub.jazz.net/git/user/pkg.name", }, }, @@ -102,7 +102,7 @@ func TestRepoRootForImportPath(t *testing.T) { { "git.openstack.org/openstack/swift", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://git.openstack.org/openstack/swift", }, }, @@ -112,14 +112,14 @@ func TestRepoRootForImportPath(t *testing.T) { { "git.openstack.org/openstack/swift.git", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://git.openstack.org/openstack/swift.git", }, }, { "git.openstack.org/openstack/swift/go/hummingbird", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://git.openstack.org/openstack/swift", }, }, @@ -148,21 +148,21 @@ func TestRepoRootForImportPath(t *testing.T) { { "git.apache.org/package-name.git", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://git.apache.org/package-name.git", }, }, { "git.apache.org/package-name_2.x.git/path/to/lib", &RepoRoot{ - vcs: vcsGit, + VCS: vcsGit, Repo: "https://git.apache.org/package-name_2.x.git", }, }, { "chiselapp.com/user/kyle/repository/fossilgg", &RepoRoot{ - vcs: vcsFossil, + VCS: vcsFossil, Repo: "https://chiselapp.com/user/kyle/repository/fossilgg", }, }, @@ -191,8 +191,8 @@ func TestRepoRootForImportPath(t *testing.T) { t.Errorf("RepoRootForImportPath(%q): %v", test.path, err) continue } - if got.vcs.name != want.vcs.name || got.Repo != want.Repo { - t.Errorf("RepoRootForImportPath(%q) = VCS(%s) Repo(%s), want VCS(%s) Repo(%s)", test.path, got.vcs, got.Repo, want.vcs, want.Repo) + if got.VCS.Name != want.VCS.Name || got.Repo != want.Repo { + t.Errorf("RepoRootForImportPath(%q) = VCS(%s) Repo(%s), want VCS(%s) Repo(%s)", test.path, got.VCS, got.Repo, want.VCS, want.Repo) } } } @@ -206,7 +206,7 @@ func TestFromDir(t *testing.T) { defer os.RemoveAll(tempDir) for j, vcs := range vcsList { - dir := filepath.Join(tempDir, "example.com", vcs.name, "."+vcs.cmd) + dir := filepath.Join(tempDir, "example.com", vcs.Name, "."+vcs.Cmd) if j&1 == 0 { err := os.MkdirAll(dir, 0755) if err != nil { @@ -225,24 +225,24 @@ func TestFromDir(t *testing.T) { } want := RepoRoot{ - vcs: vcs, - Root: path.Join("example.com", vcs.name), + VCS: vcs, + Root: path.Join("example.com", vcs.Name), } var got RepoRoot - got.vcs, got.Root, err = vcsFromDir(dir, tempDir) + got.VCS, got.Root, err = FromDir(dir, tempDir) if err != nil { t.Errorf("FromDir(%q, %q): %v", dir, tempDir, err) continue } - if got.vcs.name != want.vcs.name || got.Root != want.Root { - t.Errorf("FromDir(%q, %q) = VCS(%s) Root(%s), want VCS(%s) Root(%s)", dir, tempDir, got.vcs, got.Root, want.vcs, want.Root) + if got.VCS.Name != want.VCS.Name || got.Root != want.Root { + t.Errorf("FromDir(%q, %q) = VCS(%s) Root(%s), want VCS(%s) Root(%s)", dir, tempDir, got.VCS, got.Root, want.VCS, want.Root) } } } func TestIsSecure(t *testing.T) { tests := []struct { - vcs *vcsCmd + vcs *Cmd url string secure bool }{ @@ -267,7 +267,7 @@ func TestIsSecure(t *testing.T) { } for _, test := range tests { - secure := test.vcs.isSecure(test.url) + secure := test.vcs.IsSecure(test.url) if secure != test.secure { t.Errorf("%s isSecure(%q) = %t; want %t", test.vcs, test.url, secure, test.secure) } @@ -276,7 +276,7 @@ func TestIsSecure(t *testing.T) { func TestIsSecureGitAllowProtocol(t *testing.T) { tests := []struct { - vcs *vcsCmd + vcs *Cmd url string secure bool }{ @@ -307,7 +307,7 @@ func TestIsSecureGitAllowProtocol(t *testing.T) { defer os.Unsetenv("GIT_ALLOW_PROTOCOL") os.Setenv("GIT_ALLOW_PROTOCOL", "https:foo") for _, test := range tests { - secure := test.vcs.isSecure(test.url) + secure := test.vcs.IsSecure(test.url) if secure != test.secure { t.Errorf("%s isSecure(%q) = %t; want %t", test.vcs, test.url, secure, test.secure) } -- GitLab From d7384f36121d52191097af50d6dc12c0eb08fd75 Mon Sep 17 00:00:00 2001 From: Constantin Konstantinidis Date: Sun, 16 Aug 2020 13:48:09 +0200 Subject: [PATCH 0469/1792] os: implement File.Chmod on Windows Fixes: #39606 Change-Id: I4def67ef18bd3ff866b140f6e76cdabe5d51a1c5 Reviewed-on: https://go-review.googlesource.com/c/go/+/250077 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Alex Brainman --- src/internal/poll/fd_posix.go | 11 -------- src/internal/poll/fd_unix.go | 11 ++++++++ src/internal/poll/fd_windows.go | 27 +++++++++++++++++++ .../syscall/windows/syscall_windows.go | 9 +++++++ .../syscall/windows/zsyscall_windows.go | 13 +++++++++ src/os/os_test.go | 27 +++++++++++-------- 6 files changed, 76 insertions(+), 22 deletions(-) diff --git a/src/internal/poll/fd_posix.go b/src/internal/poll/fd_posix.go index e5fb05c9c2..4edfa953a4 100644 --- a/src/internal/poll/fd_posix.go +++ b/src/internal/poll/fd_posix.go @@ -29,17 +29,6 @@ func (fd *FD) Shutdown(how int) error { return syscall.Shutdown(fd.Sysfd, how) } -// Fchmod wraps syscall.Fchmod. -func (fd *FD) Fchmod(mode uint32) error { - if err := fd.incref(); err != nil { - return err - } - defer fd.decref() - return ignoringEINTR(func() error { - return syscall.Fchmod(fd.Sysfd, mode) - }) -} - // Fchown wraps syscall.Fchown. func (fd *FD) Fchown(uid, gid int) error { if err := fd.incref(); err != nil { diff --git a/src/internal/poll/fd_unix.go b/src/internal/poll/fd_unix.go index 1d5101eac3..f6f6c52f31 100644 --- a/src/internal/poll/fd_unix.go +++ b/src/internal/poll/fd_unix.go @@ -437,6 +437,17 @@ func (fd *FD) ReadDirent(buf []byte) (int, error) { } } +// Fchmod wraps syscall.Fchmod. +func (fd *FD) Fchmod(mode uint32) error { + if err := fd.incref(); err != nil { + return err + } + defer fd.decref() + return ignoringEINTR(func() error { + return syscall.Fchmod(fd.Sysfd, mode) + }) +} + // Fchdir wraps syscall.Fchdir. func (fd *FD) Fchdir() error { if err := fd.incref(); err != nil { diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index e1ef6199b3..d8c834f929 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -886,6 +886,33 @@ func (fd *FD) FindNextFile(data *syscall.Win32finddata) error { return syscall.FindNextFile(fd.Sysfd, data) } +// Fchmod updates syscall.ByHandleFileInformation.Fileattributes when needed. +func (fd *FD) Fchmod(mode uint32) error { + if err := fd.incref(); err != nil { + return err + } + defer fd.decref() + + var d syscall.ByHandleFileInformation + if err := syscall.GetFileInformationByHandle(fd.Sysfd, &d); err != nil { + return err + } + attrs := d.FileAttributes + if mode&syscall.S_IWRITE != 0 { + attrs &^= syscall.FILE_ATTRIBUTE_READONLY + } else { + attrs |= syscall.FILE_ATTRIBUTE_READONLY + } + if attrs == d.FileAttributes { + return nil + } + + var du windows.FILE_BASIC_INFO + du.FileAttributes = attrs + l := uint32(unsafe.Sizeof(d)) + return windows.SetFileInformationByHandle(fd.Sysfd, windows.FileBasicInfo, uintptr(unsafe.Pointer(&du)), l) +} + // Fchdir wraps syscall.Fchdir. func (fd *FD) Fchdir() error { if err := fd.incref(); err != nil { diff --git a/src/internal/syscall/windows/syscall_windows.go b/src/internal/syscall/windows/syscall_windows.go index edf0b5a40b..1f40c11820 100644 --- a/src/internal/syscall/windows/syscall_windows.go +++ b/src/internal/syscall/windows/syscall_windows.go @@ -131,6 +131,14 @@ type IpAdapterAddresses struct { /* more fields might be present here. */ } +type FILE_BASIC_INFO struct { + CreationTime syscall.Filetime + LastAccessTime syscall.Filetime + LastWriteTime syscall.Filetime + ChangedTime syscall.Filetime + FileAttributes uint32 +} + const ( IfOperStatusUp = 1 IfOperStatusDown = 2 @@ -145,6 +153,7 @@ const ( //sys GetComputerNameEx(nameformat uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW //sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW //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 const ( WSA_FLAG_OVERLAPPED = 0x01 diff --git a/src/internal/syscall/windows/zsyscall_windows.go b/src/internal/syscall/windows/zsyscall_windows.go index ca5b4e6f16..0840dc283a 100644 --- a/src/internal/syscall/windows/zsyscall_windows.go +++ b/src/internal/syscall/windows/zsyscall_windows.go @@ -71,6 +71,7 @@ var ( procNetUserGetLocalGroups = modnetapi32.NewProc("NetUserGetLocalGroups") procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") procGetFileInformationByHandleEx = modkernel32.NewProc("GetFileInformationByHandleEx") + procSetFileInformationByHandle = modkernel32.NewProc("SetFileInformationByHandle") ) func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { @@ -81,6 +82,18 @@ func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapter 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 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func GetComputerNameEx(nameformat uint32, buf *uint16, n *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nameformat), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n))) if r1 == 0 { diff --git a/src/os/os_test.go b/src/os/os_test.go index 520916d880..3359301316 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -1099,29 +1099,34 @@ func checkMode(t *testing.T, path string, mode FileMode) { if err != nil { t.Fatalf("Stat %q (looking for mode %#o): %s", path, mode, err) } - if dir.Mode()&0777 != mode { + if dir.Mode()&ModePerm != mode { t.Errorf("Stat %q: mode %#o want %#o", path, dir.Mode(), mode) } } func TestChmod(t *testing.T) { - // Chmod is not supported under windows. - if runtime.GOOS == "windows" { - return - } f := newFile("TestChmod", t) defer Remove(f.Name()) defer f.Close() + // Creation mode is read write - if err := Chmod(f.Name(), 0456); err != nil { - t.Fatalf("chmod %s 0456: %s", f.Name(), err) + fm := FileMode(0456) + if runtime.GOOS == "windows" { + fm = FileMode(0444) // read-only file } - checkMode(t, f.Name(), 0456) + if err := Chmod(f.Name(), fm); err != nil { + t.Fatalf("chmod %s %#o: %s", f.Name(), fm, err) + } + checkMode(t, f.Name(), fm) - if err := f.Chmod(0123); err != nil { - t.Fatalf("chmod %s 0123: %s", f.Name(), err) + fm = FileMode(0123) + if runtime.GOOS == "windows" { + fm = FileMode(0666) // read-write file + } + if err := f.Chmod(fm); err != nil { + t.Fatalf("chmod %s %#o: %s", f.Name(), fm, err) } - checkMode(t, f.Name(), 0123) + checkMode(t, f.Name(), fm) } func checkSize(t *testing.T, f *File, size int64) { -- GitLab From 2c95e3a6a8377ca9c72608c25b4cf2506baf782f Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 9 Sep 2020 11:09:01 +0700 Subject: [PATCH 0470/1792] cmd/compile: use clearer error message for stuct literal This CL changes "T literal.M" error message to "T{...}.M". It's clearer expression and focusing user on actual issue. Updates #38745 Change-Id: I84b455a86742f37e0bde5bf390aa02984eecc3c9 Reviewed-on: https://go-review.googlesource.com/c/go/+/253677 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/fmt.go | 11 +- test/alias2.go | 10 +- test/ddd1.go | 2 +- test/escape2.go | 56 +++++----- test/escape2n.go | 56 +++++----- test/escape_calls.go | 2 +- test/escape_field.go | 6 +- test/escape_iface.go | 50 ++++----- test/escape_indir.go | 34 +++---- test/escape_map.go | 26 ++--- test/escape_param.go | 60 +++++------ test/escape_slice.go | 14 +-- test/escape_struct_param1.go | 158 ++++++++++++++--------------- test/escape_struct_param2.go | 158 ++++++++++++++--------------- test/fixedbugs/issue12006.go | 4 +- test/fixedbugs/issue13799.go | 4 +- test/fixedbugs/issue17645.go | 2 +- test/fixedbugs/issue21709.go | 4 +- test/fixedbugs/issue23732.go | 6 +- test/fixedbugs/issue26855.go | 4 +- test/fixedbugs/issue30898.go | 2 +- test/fixedbugs/issue31573.go | 24 ++--- test/fixedbugs/issue38745.go | 19 ++++ test/fixedbugs/issue39292.go | 6 +- test/fixedbugs/issue41247.go | 2 +- test/fixedbugs/issue7921.go | 10 +- test/inline_variadic.go | 2 +- 27 files changed, 379 insertions(+), 353 deletions(-) create mode 100644 test/fixedbugs/issue38745.go diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go index 866cd0a714..43e501deaf 100644 --- a/src/cmd/compile/internal/gc/fmt.go +++ b/src/cmd/compile/internal/gc/fmt.go @@ -1407,7 +1407,7 @@ func (n *Node) exprfmt(s fmt.State, prec int, mode fmtMode) { return } if n.Right != nil { - mode.Fprintf(s, "%v literal", n.Right) + mode.Fprintf(s, "%v{%s}", n.Right, ellipsisIf(n.List.Len() != 0)) return } @@ -1421,7 +1421,7 @@ func (n *Node) exprfmt(s fmt.State, prec int, mode fmtMode) { case OSTRUCTLIT, OARRAYLIT, OSLICELIT, OMAPLIT: if mode == FErr { - mode.Fprintf(s, "%v literal", n.Type) + mode.Fprintf(s, "%v{%s}", n.Type, ellipsisIf(n.List.Len() != 0)) return } mode.Fprintf(s, "(%v{ %.v })", n.Type, n.List) @@ -1934,3 +1934,10 @@ func indent(s fmt.State) { fmt.Fprint(s, ". ") } } + +func ellipsisIf(b bool) string { + if b { + return "..." + } + return "" +} diff --git a/test/alias2.go b/test/alias2.go index 7ea1b2908d..1c141ac490 100644 --- a/test/alias2.go +++ b/test/alias2.go @@ -46,8 +46,8 @@ var _ A0 = T0{} var _ T0 = A0{} // But aliases and original types cannot be used with new types based on them. -var _ N0 = T0{} // ERROR "cannot use T0 literal \(type T0\) as type N0 in assignment|incompatible type" -var _ N0 = A0{} // ERROR "cannot use T0 literal \(type T0\) as type N0 in assignment|incompatible type" +var _ N0 = T0{} // ERROR "cannot use T0{} \(type T0\) as type N0 in assignment|incompatible type" +var _ N0 = A0{} // ERROR "cannot use T0{} \(type T0\) as type N0 in assignment|incompatible type" var _ A5 = Value{} @@ -82,10 +82,10 @@ func _() { var _ A0 = T0{} var _ T0 = A0{} - var _ N0 = T0{} // ERROR "cannot use T0 literal \(type T0\) as type N0 in assignment|incompatible type" - var _ N0 = A0{} // ERROR "cannot use T0 literal \(type T0\) as type N0 in assignment|incompatible type" + var _ N0 = T0{} // ERROR "cannot use T0{} \(type T0\) as type N0 in assignment|incompatible type" + var _ N0 = A0{} // ERROR "cannot use T0{} \(type T0\) as type N0 in assignment|incompatible type" - var _ A5 = Value{} // ERROR "cannot use reflect\.Value literal \(type reflect.Value\) as type A5 in assignment|incompatible type" + var _ A5 = Value{} // ERROR "cannot use reflect\.Value{} \(type reflect.Value\) as type A5 in assignment|incompatible type" } // Invalid type alias declarations. diff --git a/test/ddd1.go b/test/ddd1.go index b582f221b7..2c7e83e374 100644 --- a/test/ddd1.go +++ b/test/ddd1.go @@ -19,7 +19,7 @@ var ( _ = sum(1.0, 2.0) _ = sum(1.5) // ERROR "integer" _ = sum("hello") // ERROR ".hello. .type untyped string. as type int|incompatible" - _ = sum([]int{1}) // ERROR "\[\]int literal.*as type int|incompatible" + _ = sum([]int{1}) // ERROR "\[\]int{...}.*as type int|incompatible" ) func sum3(int, int, int) int { return 0 } diff --git a/test/escape2.go b/test/escape2.go index cf24f4bebc..5c6eb559fa 100644 --- a/test/escape2.go +++ b/test/escape2.go @@ -118,15 +118,15 @@ type Bar struct { } func NewBar() *Bar { - return &Bar{42, nil} // ERROR "&Bar literal escapes to heap$" + return &Bar{42, nil} // ERROR "&Bar{...} escapes to heap$" } func NewBarp(x *int) *Bar { // ERROR "leaking param: x$" - return &Bar{42, x} // ERROR "&Bar literal escapes to heap$" + return &Bar{42, x} // ERROR "&Bar{...} escapes to heap$" } func NewBarp2(x *int) *Bar { // ERROR "x does not escape$" - return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap$" + return &Bar{*x, nil} // ERROR "&Bar{...} escapes to heap$" } func (b *Bar) NoLeak() int { // ERROR "b does not escape$" @@ -173,7 +173,7 @@ type Bar2 struct { } func NewBar2() *Bar2 { - return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap$" + return &Bar2{[12]int{42}, nil} // ERROR "&Bar2{...} escapes to heap$" } func (b *Bar2) NoLeak() int { // ERROR "b does not escape$" @@ -539,7 +539,7 @@ func foo72b() [10]*int { // issue 2145 func foo73() { - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for _, v := range s { vv := v // actually just escapes its scope @@ -550,7 +550,7 @@ func foo73() { } func foo731() { - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for _, v := range s { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope @@ -562,7 +562,7 @@ func foo731() { } func foo74() { - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for _, v := range s { vv := v // actually just escapes its scope @@ -574,7 +574,7 @@ func foo74() { } func foo74a() { - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for _, v := range s { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope @@ -589,7 +589,7 @@ func foo74a() { // issue 3975 func foo74b() { var array [3]func() - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for i, v := range s { vv := v // actually just escapes its scope @@ -601,7 +601,7 @@ func foo74b() { func foo74c() { var array [3]func() - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for i, v := range s { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope @@ -759,15 +759,15 @@ type LimitedFooer struct { } func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r$" - return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap$" + return &LimitedFooer{r, n} // ERROR "&LimitedFooer{...} escapes to heap$" } func foo90(x *int) map[*int]*int { // ERROR "leaking param: x$" - return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$" + return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int{...} escapes to heap$" } func foo91(x *int) map[*int]*int { // ERROR "leaking param: x$" - return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$" + return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int{...} escapes to heap$" } func foo92(x *int) [2]*int { // ERROR "leaking param: x to result ~r1 level=0$" @@ -870,15 +870,15 @@ func foo106(x *int) { // ERROR "leaking param: x$" } func foo107(x *int) map[*int]*int { // ERROR "leaking param: x$" - return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$" + return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int{...} escapes to heap$" } func foo108(x *int) map[*int]*int { // ERROR "leaking param: x$" - return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$" + return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int{...} escapes to heap$" } func foo109(x *int) *int { // ERROR "leaking param: x$" - m := map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal does not escape$" + m := map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int{...} does not escape$" for k, _ := range m { return k } @@ -886,12 +886,12 @@ func foo109(x *int) *int { // ERROR "leaking param: x$" } func foo110(x *int) *int { // ERROR "leaking param: x$" - m := map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal does not escape$" + m := map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int{...} does not escape$" return m[nil] } func foo111(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0" - m := []*int{x} // ERROR "\[\]\*int literal does not escape$" + m := []*int{x} // ERROR "\[\]\*int{...} does not escape$" return m[0] } @@ -906,7 +906,7 @@ func foo113(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" } func foo114(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" - m := &Bar{ii: x} // ERROR "&Bar literal does not escape$" + m := &Bar{ii: x} // ERROR "&Bar{...} does not escape$" return m.ii } @@ -1343,8 +1343,8 @@ func foo140() interface{} { X string T *T } - t := &T{} // ERROR "&T literal escapes to heap$" - return U{ // ERROR "U literal escapes to heap$" + t := &T{} // ERROR "&T{} escapes to heap$" + return U{ // ERROR "U{...} escapes to heap$" X: t.X, T: t, } @@ -1530,7 +1530,7 @@ type V struct { } func NewV(u U) *V { // ERROR "leaking param: u$" - return &V{u.String()} // ERROR "&V literal escapes to heap$" + return &V{u.String()} // ERROR "&V{...} escapes to heap$" } func foo152() { @@ -1571,21 +1571,21 @@ type Lit struct { func ptrlitNoescape() { // Both literal and element do not escape. i := 0 - x := &Lit{&i} // ERROR "&Lit literal does not escape$" + x := &Lit{&i} // ERROR "&Lit{...} does not escape$" _ = x } func ptrlitNoEscape2() { // Literal does not escape, but element does. i := 0 // ERROR "moved to heap: i$" - x := &Lit{&i} // ERROR "&Lit literal does not escape$" + x := &Lit{&i} // ERROR "&Lit{...} does not escape$" sink = *x } func ptrlitEscape() { // Both literal and element escape. i := 0 // ERROR "moved to heap: i$" - x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" + x := &Lit{&i} // ERROR "&Lit{...} escapes to heap$" sink = x } @@ -1760,18 +1760,18 @@ func stringtoslicerune2() { } func slicerunetostring0() { - r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape$" + r := []rune{1, 2, 3} // ERROR "\[\]rune{...} does not escape$" s := string(r) // ERROR "string\(r\) does not escape$" _ = s } func slicerunetostring1() string { - r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape$" + r := []rune{1, 2, 3} // ERROR "\[\]rune{...} does not escape$" return string(r) // ERROR "string\(r\) escapes to heap$" } func slicerunetostring2() { - r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape$" + r := []rune{1, 2, 3} // ERROR "\[\]rune{...} does not escape$" sink = string(r) // ERROR "string\(r\) escapes to heap$" } diff --git a/test/escape2n.go b/test/escape2n.go index f771e0aef2..46e58f8566 100644 --- a/test/escape2n.go +++ b/test/escape2n.go @@ -118,15 +118,15 @@ type Bar struct { } func NewBar() *Bar { - return &Bar{42, nil} // ERROR "&Bar literal escapes to heap$" + return &Bar{42, nil} // ERROR "&Bar{...} escapes to heap$" } func NewBarp(x *int) *Bar { // ERROR "leaking param: x$" - return &Bar{42, x} // ERROR "&Bar literal escapes to heap$" + return &Bar{42, x} // ERROR "&Bar{...} escapes to heap$" } func NewBarp2(x *int) *Bar { // ERROR "x does not escape$" - return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap$" + return &Bar{*x, nil} // ERROR "&Bar{...} escapes to heap$" } func (b *Bar) NoLeak() int { // ERROR "b does not escape$" @@ -173,7 +173,7 @@ type Bar2 struct { } func NewBar2() *Bar2 { - return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap$" + return &Bar2{[12]int{42}, nil} // ERROR "&Bar2{...} escapes to heap$" } func (b *Bar2) NoLeak() int { // ERROR "b does not escape$" @@ -539,7 +539,7 @@ func foo72b() [10]*int { // issue 2145 func foo73() { - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for _, v := range s { vv := v // actually just escapes its scope @@ -550,7 +550,7 @@ func foo73() { } func foo731() { - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for _, v := range s { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope @@ -562,7 +562,7 @@ func foo731() { } func foo74() { - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for _, v := range s { vv := v // actually just escapes its scope @@ -574,7 +574,7 @@ func foo74() { } func foo74a() { - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for _, v := range s { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope @@ -589,7 +589,7 @@ func foo74a() { // issue 3975 func foo74b() { var array [3]func() - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for i, v := range s { vv := v // actually just escapes its scope @@ -601,7 +601,7 @@ func foo74b() { func foo74c() { var array [3]func() - s := []int{3, 2, 1} // ERROR "\[\]int literal does not escape$" + s := []int{3, 2, 1} // ERROR "\[\]int{...} does not escape$" for i, v := range s { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope @@ -759,15 +759,15 @@ type LimitedFooer struct { } func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r$" - return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap$" + return &LimitedFooer{r, n} // ERROR "&LimitedFooer{...} escapes to heap$" } func foo90(x *int) map[*int]*int { // ERROR "leaking param: x$" - return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$" + return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int{...} escapes to heap$" } func foo91(x *int) map[*int]*int { // ERROR "leaking param: x$" - return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$" + return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int{...} escapes to heap$" } func foo92(x *int) [2]*int { // ERROR "leaking param: x to result ~r1 level=0$" @@ -870,15 +870,15 @@ func foo106(x *int) { // ERROR "leaking param: x$" } func foo107(x *int) map[*int]*int { // ERROR "leaking param: x$" - return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$" + return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int{...} escapes to heap$" } func foo108(x *int) map[*int]*int { // ERROR "leaking param: x$" - return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$" + return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int{...} escapes to heap$" } func foo109(x *int) *int { // ERROR "leaking param: x$" - m := map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal does not escape$" + m := map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int{...} does not escape$" for k, _ := range m { return k } @@ -886,12 +886,12 @@ func foo109(x *int) *int { // ERROR "leaking param: x$" } func foo110(x *int) *int { // ERROR "leaking param: x$" - m := map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal does not escape$" + m := map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int{...} does not escape$" return m[nil] } func foo111(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0" - m := []*int{x} // ERROR "\[\]\*int literal does not escape$" + m := []*int{x} // ERROR "\[\]\*int{...} does not escape$" return m[0] } @@ -906,7 +906,7 @@ func foo113(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" } func foo114(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" - m := &Bar{ii: x} // ERROR "&Bar literal does not escape$" + m := &Bar{ii: x} // ERROR "&Bar{...} does not escape$" return m.ii } @@ -1343,8 +1343,8 @@ func foo140() interface{} { X string T *T } - t := &T{} // ERROR "&T literal escapes to heap$" - return U{ // ERROR "U literal escapes to heap$" + t := &T{} // ERROR "&T{} escapes to heap$" + return U{ // ERROR "U{...} escapes to heap$" X: t.X, T: t, } @@ -1530,7 +1530,7 @@ type V struct { } func NewV(u U) *V { // ERROR "leaking param: u$" - return &V{u.String()} // ERROR "&V literal escapes to heap$" + return &V{u.String()} // ERROR "&V{...} escapes to heap$" } func foo152() { @@ -1571,21 +1571,21 @@ type Lit struct { func ptrlitNoescape() { // Both literal and element do not escape. i := 0 - x := &Lit{&i} // ERROR "&Lit literal does not escape$" + x := &Lit{&i} // ERROR "&Lit{...} does not escape$" _ = x } func ptrlitNoEscape2() { // Literal does not escape, but element does. i := 0 // ERROR "moved to heap: i$" - x := &Lit{&i} // ERROR "&Lit literal does not escape$" + x := &Lit{&i} // ERROR "&Lit{...} does not escape$" sink = *x } func ptrlitEscape() { // Both literal and element escape. i := 0 // ERROR "moved to heap: i$" - x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" + x := &Lit{&i} // ERROR "&Lit{...} escapes to heap$" sink = x } @@ -1760,18 +1760,18 @@ func stringtoslicerune2() { } func slicerunetostring0() { - r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape$" + r := []rune{1, 2, 3} // ERROR "\[\]rune{...} does not escape$" s := string(r) // ERROR "string\(r\) does not escape$" _ = s } func slicerunetostring1() string { - r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape$" + r := []rune{1, 2, 3} // ERROR "\[\]rune{...} does not escape$" return string(r) // ERROR "string\(r\) escapes to heap$" } func slicerunetostring2() { - r := []rune{1, 2, 3} // ERROR "\[\]rune literal does not escape$" + r := []rune{1, 2, 3} // ERROR "\[\]rune{...} does not escape$" sink = string(r) // ERROR "string\(r\) escapes to heap$" } diff --git a/test/escape_calls.go b/test/escape_calls.go index 2dbfee1558..9e1db5426e 100644 --- a/test/escape_calls.go +++ b/test/escape_calls.go @@ -50,5 +50,5 @@ func bar() { f := prototype f = func(ss []string) { got = append(got, ss) } // ERROR "leaking param: ss" "func literal does not escape" s := "string" - f([]string{s}) // ERROR "\[\]string literal escapes to heap" + f([]string{s}) // ERROR "\[\]string{...} escapes to heap" } diff --git a/test/escape_field.go b/test/escape_field.go index bf1dfb18ff..95d0784d91 100644 --- a/test/escape_field.go +++ b/test/escape_field.go @@ -127,20 +127,20 @@ func field12() { func field13() { i := 0 // ERROR "moved to heap: i$" - x := &X{p1: &i} // ERROR "&X literal does not escape$" + x := &X{p1: &i} // ERROR "&X{...} does not escape$" sink = x.p1 } func field14() { i := 0 // ERROR "moved to heap: i$" // BAD: &i should not escape - x := &X{p1: &i} // ERROR "&X literal does not escape$" + x := &X{p1: &i} // ERROR "&X{...} does not escape$" sink = x.p2 } func field15() { i := 0 // ERROR "moved to heap: i$" - x := &X{p1: &i} // ERROR "&X literal escapes to heap$" + x := &X{p1: &i} // ERROR "&X{...} escapes to heap$" sink = x } diff --git a/test/escape_iface.go b/test/escape_iface.go index 118ed3c56f..7b0914cadb 100644 --- a/test/escape_iface.go +++ b/test/escape_iface.go @@ -37,7 +37,7 @@ func efaceEscape0() { _ = x } { - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" v := M0{&i} var x M = v sink = x @@ -50,7 +50,7 @@ func efaceEscape0() { _ = v1 } { - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" v := M0{&i} // BAD: v does not escape to heap here var x M = v @@ -58,14 +58,14 @@ func efaceEscape0() { sink = v1 } { - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" v := M0{&i} // BAD: v does not escape to heap here var x M = v x.M() } { - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" v := M0{&i} var x M = v mescapes(x) @@ -91,46 +91,46 @@ func efaceEscape1() { { i := 0 v := M1{&i, 0} - var x M = v // ERROR "v does not escape" + var x M = v // ERROR "v does not escape" _ = x } { - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" v := M1{&i, 0} - var x M = v // ERROR "v escapes to heap" + var x M = v // ERROR "v escapes to heap" sink = x } { i := 0 v := M1{&i, 0} - var x M = v // ERROR "v does not escape" + var x M = v // ERROR "v does not escape" v1 := x.(M1) _ = v1 } { - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" v := M1{&i, 0} var x M = v // ERROR "v does not escape" v1 := x.(M1) sink = v1 // ERROR "v1 escapes to heap" } { - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" v := M1{&i, 0} // BAD: v does not escape to heap here var x M = v // ERROR "v escapes to heap" x.M() } { - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" v := M1{&i, 0} - var x M = v // ERROR "v escapes to heap" + var x M = v // ERROR "v escapes to heap" mescapes(x) } { i := 0 v := M1{&i, 0} - var x M = v // ERROR "v does not escape" + var x M = v // ERROR "v does not escape" mdoesnotescape(x) } } @@ -146,26 +146,26 @@ func (*M2) M() { func efaceEscape2() { { i := 0 - v := &M2{&i} // ERROR "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2{...} does not escape" var x M = v _ = x } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&M2 literal escapes to heap" + v := &M2{&i} // ERROR "&M2{...} escapes to heap" var x M = v sink = x } { i := 0 - v := &M2{&i} // ERROR "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2{...} does not escape" var x M = v v1 := x.(*M2) _ = v1 } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&M2 literal escapes to heap" + v := &M2{&i} // ERROR "&M2{...} escapes to heap" // BAD: v does not escape to heap here var x M = v v1 := x.(*M2) @@ -173,7 +173,7 @@ func efaceEscape2() { } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2{...} does not escape" // BAD: v does not escape to heap here var x M = v v1 := x.(*M2) @@ -181,7 +181,7 @@ func efaceEscape2() { } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2{...} does not escape" // BAD: v does not escape to heap here var x M = v v1, ok := x.(*M2) @@ -190,20 +190,20 @@ func efaceEscape2() { } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&M2 literal escapes to heap" + v := &M2{&i} // ERROR "&M2{...} escapes to heap" // BAD: v does not escape to heap here var x M = v x.M() } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&M2 literal escapes to heap" + v := &M2{&i} // ERROR "&M2{...} escapes to heap" var x M = v mescapes(x) } { i := 0 - v := &M2{&i} // ERROR "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2{...} does not escape" var x M = v mdoesnotescape(x) } @@ -219,8 +219,8 @@ type T2 struct { func dotTypeEscape() *T2 { // #11931 var x interface{} - x = &T1{p: new(int)} // ERROR "new\(int\) escapes to heap" "&T1 literal does not escape" - return &T2{ // ERROR "&T2 literal escapes to heap" + x = &T1{p: new(int)} // ERROR "new\(int\) escapes to heap" "&T1{...} does not escape" + return &T2{ // ERROR "&T2{...} escapes to heap" T1: *(x.(*T1)), } } @@ -244,7 +244,7 @@ func dotTypeEscape2() { // #13805, #15796 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 = x.(int) // ERROR "x.\(int\) escapes to heap" sink, *(&ok) = y.(int) } { diff --git a/test/escape_indir.go b/test/escape_indir.go index 19889f259f..12005e35f9 100644 --- a/test/escape_indir.go +++ b/test/escape_indir.go @@ -23,7 +23,7 @@ type ConstPtr2 struct { func constptr0() { i := 0 // ERROR "moved to heap: i" - x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + x := &ConstPtr{} // ERROR "&ConstPtr{} does not escape" // BAD: i should not escape here x.p = &i _ = x @@ -31,55 +31,55 @@ func constptr0() { func constptr01() *ConstPtr { i := 0 // ERROR "moved to heap: i" - x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" + x := &ConstPtr{} // ERROR "&ConstPtr{} escapes to heap" x.p = &i return x } func constptr02() ConstPtr { i := 0 // ERROR "moved to heap: i" - x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + x := &ConstPtr{} // ERROR "&ConstPtr{} does not escape" x.p = &i return *x } func constptr03() **ConstPtr { i := 0 // ERROR "moved to heap: i" - x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" "moved to heap: x" + x := &ConstPtr{} // ERROR "&ConstPtr{} escapes to heap" "moved to heap: x" x.p = &i return &x } func constptr1() { i := 0 // ERROR "moved to heap: i" - x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" + x := &ConstPtr{} // ERROR "&ConstPtr{} escapes to heap" x.p = &i sink = x } func constptr2() { i := 0 // ERROR "moved to heap: i" - x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + x := &ConstPtr{} // ERROR "&ConstPtr{} does not escape" x.p = &i - sink = *x // ERROR "\*x escapes to heap" + sink = *x // ERROR "\*x escapes to heap" } func constptr4() *ConstPtr { p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" - *p = *&ConstPtr{} // ERROR "&ConstPtr literal does not escape" + *p = *&ConstPtr{} // ERROR "&ConstPtr{} does not escape" return p } func constptr5() *ConstPtr { p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" - p1 := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + p1 := &ConstPtr{} // ERROR "&ConstPtr{} does not escape" *p = *p1 return p } // BAD: p should not escape here func constptr6(p *ConstPtr) { // ERROR "leaking param content: p" - p1 := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + p1 := &ConstPtr{} // ERROR "&ConstPtr{} does not escape" *p1 = *p _ = p1 } @@ -102,17 +102,17 @@ func constptr8() *ConstPtr { func constptr9() ConstPtr { p := new(ConstPtr) // ERROR "new\(ConstPtr\) does not escape" var p1 ConstPtr2 - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" p1.p = &i p.c = p1 return *p } func constptr10() ConstPtr { - x := &ConstPtr{} // ERROR "moved to heap: x" "&ConstPtr literal escapes to heap" + x := &ConstPtr{} // ERROR "moved to heap: x" "&ConstPtr{} escapes to heap" i := 0 // ERROR "moved to heap: i" var p *ConstPtr - p = &ConstPtr{p: &i, x: &x} // ERROR "&ConstPtr literal does not escape" + p = &ConstPtr{p: &i, x: &x} // ERROR "&ConstPtr{...} does not escape" var pp **ConstPtr pp = &p return **pp @@ -121,7 +121,7 @@ func constptr10() ConstPtr { func constptr11() *ConstPtr { i := 0 // ERROR "moved to heap: i" p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" - p1 := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" + p1 := &ConstPtr{} // ERROR "&ConstPtr{} does not escape" p1.p = &i *p = *p1 return p @@ -134,7 +134,7 @@ func foo(p **int) { // ERROR "p does not escape" } func foo1(p *int) { // ERROR "p does not escape" - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" y := &p *y = &i } @@ -148,13 +148,13 @@ func foo2() { var z Z z.f = &x p := z.f - i := 0 // ERROR "moved to heap: i" + i := 0 // ERROR "moved to heap: i" *p = &i } var global *byte func f() { - var x byte // ERROR "moved to heap: x" + var x byte // ERROR "moved to heap: x" global = &*&x } diff --git a/test/escape_map.go b/test/escape_map.go index 0e9896a9fc..23abaa1e0c 100644 --- a/test/escape_map.go +++ b/test/escape_map.go @@ -15,7 +15,7 @@ func map0() { // BAD: i should not escape i := 0 // ERROR "moved to heap: i" // BAD: j should not escape - j := 0 // ERROR "moved to heap: j" + j := 0 // ERROR "moved to heap: j" m[&i] = &j _ = m } @@ -23,8 +23,8 @@ func map0() { func map1() *int { m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" // BAD: i should not escape - i := 0 // ERROR "moved to heap: i" - j := 0 // ERROR "moved to heap: j" + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" m[&i] = &j return m[&i] } @@ -41,7 +41,7 @@ func map3() []*int { m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" i := 0 // ERROR "moved to heap: i" // BAD: j should not escape - j := 0 // ERROR "moved to heap: j" + j := 0 // ERROR "moved to heap: j" m[&i] = &j var r []*int for k := range m { @@ -53,8 +53,8 @@ func map3() []*int { func map4() []*int { m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" // BAD: i should not escape - i := 0 // ERROR "moved to heap: i" - j := 0 // ERROR "moved to heap: j" + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" m[&i] = &j var r []*int for k, v := range m { @@ -68,8 +68,8 @@ func map4() []*int { } func map5(m map[*int]*int) { // ERROR "m does not escape" - i := 0 // ERROR "moved to heap: i" - j := 0 // ERROR "moved to heap: j" + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" m[&i] = &j } @@ -77,8 +77,8 @@ func map6(m map[*int]*int) { // ERROR "m does not escape" if m != nil { m = make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) does not escape" } - i := 0 // ERROR "moved to heap: i" - j := 0 // ERROR "moved to heap: j" + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" m[&i] = &j } @@ -87,14 +87,14 @@ func map7() { i := 0 // ERROR "moved to heap: i" // BAD: j should not escape j := 0 // ERROR "moved to heap: j" - m := map[*int]*int{&i: &j} // ERROR "literal does not escape" + m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} does not escape" _ = m } func map8() { i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m := map[*int]*int{&i: &j} // ERROR "literal escapes to heap" + m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} escapes to heap" sink = m } @@ -102,6 +102,6 @@ func map9() *int { // BAD: i should not escape i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m := map[*int]*int{&i: &j} // ERROR "literal does not escape" + m := map[*int]*int{&i: &j} // ERROR "map\[\*int\]\*int{...} does not escape" return m[nil] } diff --git a/test/escape_param.go b/test/escape_param.go index d8fafc53f8..993e914e1d 100644 --- a/test/escape_param.go +++ b/test/escape_param.go @@ -26,7 +26,7 @@ func caller0a() { } func caller0b() { - i := 0 // ERROR "moved to heap: i$" + i := 0 // ERROR "moved to heap: i$" sink = param0(&i) } @@ -150,11 +150,11 @@ func caller3a() { } func caller3b() { - i := 0 // ERROR "moved to heap: i$" - j := 0 // ERROR "moved to heap: j$" + i := 0 // ERROR "moved to heap: i$" + j := 0 // ERROR "moved to heap: j$" p := Pair{&i, &j} param3(&p) - sink = p // ERROR "p escapes to heap$" + sink = p // ERROR "p escapes to heap$" } // in -> rcvr @@ -173,7 +173,7 @@ func caller4b() { i := 0 // ERROR "moved to heap: i$" p := Pair{} p.param4(&i) - sink = p // ERROR "p escapes to heap$" + sink = p // ERROR "p escapes to heap$" } // in -> heap @@ -182,7 +182,7 @@ func param5(i *int) { // ERROR "leaking param: i$" } func caller5() { - i := 0 // ERROR "moved to heap: i$" + i := 0 // ERROR "moved to heap: i$" param5(&i) } @@ -192,8 +192,8 @@ func param6(i ***int) { // ERROR "leaking param content: i$" } func caller6a() { - i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "moved to heap: p$" + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" p2 := &p param6(&p2) } @@ -204,7 +204,7 @@ func param7(i ***int) { // ERROR "leaking param content: i$" } func caller7() { - i := 0 // ERROR "moved to heap: i$" + i := 0 // ERROR "moved to heap: i$" p := &i p2 := &p param7(&p2) @@ -234,8 +234,8 @@ func caller9a() { } func caller9b() { - i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "moved to heap: p$" + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" p2 := &p sink = param9(&p2) } @@ -253,7 +253,7 @@ func caller10a() { } func caller10b() { - i := 0 // ERROR "moved to heap: i$" + i := 0 // ERROR "moved to heap: i$" p := &i p2 := &p sink = param10(&p2) @@ -265,26 +265,26 @@ func param11(i **int) ***int { // ERROR "moved to heap: i$" } func caller11a() { - i := 0 // ERROR "moved to heap: i" - p := &i // ERROR "moved to heap: p" + i := 0 // ERROR "moved to heap: i" + p := &i // ERROR "moved to heap: p" _ = param11(&p) } func caller11b() { - i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "moved to heap: p$" + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" sink = param11(&p) } func caller11c() { // GOOD - i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "moved to heap: p" + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p" sink = *param11(&p) } func caller11d() { - i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "moved to heap: p" + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p" p2 := &p sink = param11(p2) } @@ -309,7 +309,7 @@ func caller12a() { func caller12b() { i := 0 // ERROR "moved to heap: i$" p := &i // ERROR "moved to heap: p$" - r := &Indir{} // ERROR "&Indir literal does not escape$" + r := &Indir{} // ERROR "&Indir{} does not escape$" r.param12(&p) _ = r } @@ -359,7 +359,7 @@ func caller13b() { func caller13c() { i := 0 // ERROR "moved to heap: i$" var p *int - v := &Val{&p} // ERROR "&Val literal does not escape$" + v := &Val{&p} // ERROR "&Val{...} does not escape$" v.param13(&i) _ = v } @@ -374,8 +374,8 @@ func caller13d() { } func caller13e() { - i := 0 // ERROR "moved to heap: i$" - var p *int // ERROR "moved to heap: p$" + i := 0 // ERROR "moved to heap: i$" + var p *int // ERROR "moved to heap: p$" v := Val{&p} v.param13(&i) sink = v @@ -384,7 +384,7 @@ func caller13e() { func caller13f() { i := 0 // ERROR "moved to heap: i$" var p *int // ERROR "moved to heap: p$" - v := &Val{&p} // ERROR "&Val literal escapes to heap$" + v := &Val{&p} // ERROR "&Val{...} escapes to heap$" v.param13(&i) sink = v } @@ -400,9 +400,9 @@ func caller13g() { func caller13h() { i := 0 // ERROR "moved to heap: i$" var p *int - v := &Val{&p} // ERROR "&Val literal does not escape$" + v := &Val{&p} // ERROR "&Val{...} does not escape$" v.param13(&i) - sink = **v.p // ERROR "\* \(\*v\.p\) escapes to heap" + sink = **v.p // ERROR "\* \(\*v\.p\) escapes to heap" } type Node struct { @@ -412,15 +412,15 @@ type Node struct { var Sink *Node func f(x *Node) { // ERROR "leaking param content: x" - Sink = &Node{x.p} // ERROR "&Node literal escapes to heap" + Sink = &Node{x.p} // ERROR "&Node{...} escapes to heap" } func g(x *Node) *Node { // ERROR "leaking param content: x" - return &Node{x.p} // ERROR "&Node literal escapes to heap" + return &Node{x.p} // ERROR "&Node{...} escapes to heap" } func h(x *Node) { // ERROR "leaking param: x" - y := &Node{x} // ERROR "&Node literal does not escape" + y := &Node{x} // ERROR "&Node{...} does not escape" Sink = g(y) f(y) } diff --git a/test/escape_slice.go b/test/escape_slice.go index d2cdaa6a01..6ce852e9c5 100644 --- a/test/escape_slice.go +++ b/test/escape_slice.go @@ -77,19 +77,19 @@ func slice7() *int { func slice8() { i := 0 - s := []*int{&i} // ERROR "literal does not escape" + s := []*int{&i} // ERROR "\[\]\*int{...} does not escape" _ = s } func slice9() *int { i := 0 // ERROR "moved to heap: i" - s := []*int{&i} // ERROR "literal does not escape" + s := []*int{&i} // ERROR "\[\]\*int{...} does not escape" return s[0] } func slice10() []*int { i := 0 // ERROR "moved to heap: i" - s := []*int{&i} // ERROR "literal escapes to heap" + s := []*int{&i} // ERROR "\[\]\*int{...} escapes to heap" return s } @@ -103,7 +103,7 @@ func slice11() { func envForDir(dir string) []string { // ERROR "dir does not escape" env := os.Environ() - return mergeEnvLists([]string{"PWD=" + dir}, env) // ERROR ".PWD=. \+ dir escapes to heap" "\[\]string literal does not escape" + return mergeEnvLists([]string{"PWD=" + dir}, env) // ERROR ".PWD=. \+ dir escapes to heap" "\[\]string{...} does not escape" } func mergeEnvLists(in, out []string) []string { // ERROR "leaking param content: in" "leaking param content: out" "leaking param: out to result ~r2 level=0" @@ -160,14 +160,14 @@ var resolveIPAddrTests = []resolveIPAddrTest{ func setupTestData() { resolveIPAddrTests = append(resolveIPAddrTests, - []resolveIPAddrTest{ // ERROR "\[\]resolveIPAddrTest literal does not escape" + []resolveIPAddrTest{ // ERROR "\[\]resolveIPAddrTest{...} does not escape" {"ip", "localhost", - &IPAddr{IP: IPv4(127, 0, 0, 1)}, // ERROR "&IPAddr literal escapes to heap" + &IPAddr{IP: IPv4(127, 0, 0, 1)}, // ERROR "&IPAddr{...} escapes to heap" nil}, {"ip4", "localhost", - &IPAddr{IP: IPv4(127, 0, 0, 1)}, // ERROR "&IPAddr literal escapes to heap" + &IPAddr{IP: IPv4(127, 0, 0, 1)}, // ERROR "&IPAddr{...} escapes to heap" nil}, }...) } diff --git a/test/escape_struct_param1.go b/test/escape_struct_param1.go index 70b36191ab..496172c166 100644 --- a/test/escape_struct_param1.go +++ b/test/escape_struct_param1.go @@ -35,27 +35,27 @@ func (u *U) SPPi() *string { // ERROR "leaking param: u to result ~r0 level=2$" } func tSPPi() { - s := "cat" // ERROR "moved to heap: s$" + s := "cat" // ERROR "moved to heap: s$" ps := &s pps := &ps - pu := &U{ps, pps} // ERROR "&U literal does not escape$" + pu := &U{ps, pps} // ERROR "&U{...} does not escape$" Ssink = pu.SPPi() } func tiSPP() { - s := "cat" // ERROR "moved to heap: s$" + s := "cat" // ERROR "moved to heap: s$" ps := &s pps := &ps - pu := &U{ps, pps} // ERROR "&U literal does not escape$" + pu := &U{ps, pps} // ERROR "&U{...} does not escape$" Ssink = *pu.SPP() } // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of ps func tSP() { - s := "cat" // ERROR "moved to heap: s$" - ps := &s // ERROR "moved to heap: ps$" + s := "cat" // ERROR "moved to heap: s$" + ps := &s // ERROR "moved to heap: ps$" pps := &ps - pu := &U{ps, pps} // ERROR "&U literal does not escape$" + pu := &U{ps, pps} // ERROR "&U{...} does not escape$" Ssink = pu.SP() } @@ -114,72 +114,72 @@ func (v *V) UPiSPd() *string { // ERROR "leaking param: v to result ~r0 level=2$ // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s3 func tUPiSPa() { s1 := "ant" - s2 := "bat" // ERROR "moved to heap: s2$" - s3 := "cat" // ERROR "moved to heap: s3$" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s2 := "bat" // ERROR "moved to heap: s2$" + s3 := "cat" // ERROR "moved to heap: s3$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 - ps4 := &s4 // ERROR "moved to heap: ps4$" - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPa() // Ssink = &s3 (only &s3 really escapes) } // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s3 func tUPiSPb() { s1 := "ant" - s2 := "bat" // ERROR "moved to heap: s2$" - s3 := "cat" // ERROR "moved to heap: s3$" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s2 := "bat" // ERROR "moved to heap: s2$" + s3 := "cat" // ERROR "moved to heap: s3$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 - ps4 := &s4 // ERROR "moved to heap: ps4$" - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPb() // Ssink = &s3 (only &s3 really escapes) } // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s3 func tUPiSPc() { s1 := "ant" - s2 := "bat" // ERROR "moved to heap: s2$" - s3 := "cat" // ERROR "moved to heap: s3$" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s2 := "bat" // ERROR "moved to heap: s2$" + s3 := "cat" // ERROR "moved to heap: s3$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 - ps4 := &s4 // ERROR "moved to heap: ps4$" - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPc() // Ssink = &s3 (only &s3 really escapes) } // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s3 func tUPiSPd() { s1 := "ant" - s2 := "bat" // ERROR "moved to heap: s2$" - s3 := "cat" // ERROR "moved to heap: s3$" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s2 := "bat" // ERROR "moved to heap: s2$" + s3 := "cat" // ERROR "moved to heap: s3$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 - ps4 := &s4 // ERROR "moved to heap: ps4$" - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPd() // Ssink = &s3 (only &s3 really escapes) } @@ -204,16 +204,16 @@ func tUPiSPPia() { s1 := "ant" s2 := "bat" s3 := "cat" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPPia() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -222,16 +222,16 @@ func tUPiSPPib() { s1 := "ant" s2 := "bat" s3 := "cat" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPPib() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -240,16 +240,16 @@ func tUPiSPPic() { s1 := "ant" s2 := "bat" s3 := "cat" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPPic() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -258,16 +258,16 @@ func tUPiSPPid() { s1 := "ant" s2 := "bat" s3 := "cat" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPPid() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -286,13 +286,13 @@ func tUPPiSPPia() { s3 := "cat" s4 := "dog" s5 := "emu" - s6 := "fox" // ERROR "moved to heap: s6$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 ps6 := &s6 u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPPiSPPia() // Ssink = *&ps6 = &s6 (only &s6 really escapes) } diff --git a/test/escape_struct_param2.go b/test/escape_struct_param2.go index e42be79793..946397ea9f 100644 --- a/test/escape_struct_param2.go +++ b/test/escape_struct_param2.go @@ -35,27 +35,27 @@ func (u U) SPPi() *string { // ERROR "leaking param: u to result ~r0 level=1$" } func tSPPi() { - s := "cat" // ERROR "moved to heap: s$" + s := "cat" // ERROR "moved to heap: s$" ps := &s pps := &ps - pu := &U{ps, pps} // ERROR "&U literal does not escape$" + pu := &U{ps, pps} // ERROR "&U{...} does not escape$" Ssink = pu.SPPi() } func tiSPP() { - s := "cat" // ERROR "moved to heap: s$" + s := "cat" // ERROR "moved to heap: s$" ps := &s pps := &ps - pu := &U{ps, pps} // ERROR "&U literal does not escape$" + pu := &U{ps, pps} // ERROR "&U{...} does not escape$" Ssink = *pu.SPP() } // BAD: need fine-grained analysis to avoid spurious escape of ps func tSP() { - s := "cat" // ERROR "moved to heap: s$" - ps := &s // ERROR "moved to heap: ps$" + s := "cat" // ERROR "moved to heap: s$" + ps := &s // ERROR "moved to heap: ps$" pps := &ps - pu := &U{ps, pps} // ERROR "&U literal does not escape$" + pu := &U{ps, pps} // ERROR "&U{...} does not escape$" Ssink = pu.SP() } @@ -114,72 +114,72 @@ func (v V) UPiSPd() *string { // ERROR "leaking param: v to result ~r0 level=1$" // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s3 func tUPiSPa() { s1 := "ant" - s2 := "bat" // ERROR "moved to heap: s2$" - s3 := "cat" // ERROR "moved to heap: s3$" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s2 := "bat" // ERROR "moved to heap: s2$" + s3 := "cat" // ERROR "moved to heap: s3$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 - ps4 := &s4 // ERROR "moved to heap: ps4$" - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPa() // Ssink = &s3 (only &s3 really escapes) } // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s3 func tUPiSPb() { s1 := "ant" - s2 := "bat" // ERROR "moved to heap: s2$" - s3 := "cat" // ERROR "moved to heap: s3$" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s2 := "bat" // ERROR "moved to heap: s2$" + s3 := "cat" // ERROR "moved to heap: s3$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 - ps4 := &s4 // ERROR "moved to heap: ps4$" - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPb() // Ssink = &s3 (only &s3 really escapes) } // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s3 func tUPiSPc() { s1 := "ant" - s2 := "bat" // ERROR "moved to heap: s2$" - s3 := "cat" // ERROR "moved to heap: s3$" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s2 := "bat" // ERROR "moved to heap: s2$" + s3 := "cat" // ERROR "moved to heap: s3$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 - ps4 := &s4 // ERROR "moved to heap: ps4$" - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPc() // Ssink = &s3 (only &s3 really escapes) } // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s3 func tUPiSPd() { s1 := "ant" - s2 := "bat" // ERROR "moved to heap: s2$" - s3 := "cat" // ERROR "moved to heap: s3$" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s2 := "bat" // ERROR "moved to heap: s2$" + s3 := "cat" // ERROR "moved to heap: s3$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 - ps4 := &s4 // ERROR "moved to heap: ps4$" - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPd() // Ssink = &s3 (only &s3 really escapes) } @@ -204,16 +204,16 @@ func tUPiSPPia() { s1 := "ant" s2 := "bat" s3 := "cat" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPPia() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -222,16 +222,16 @@ func tUPiSPPib() { s1 := "ant" s2 := "bat" s3 := "cat" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPPib() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -240,16 +240,16 @@ func tUPiSPPic() { s1 := "ant" s2 := "bat" s3 := "cat" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPPic() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -258,16 +258,16 @@ func tUPiSPPid() { s1 := "ant" s2 := "bat" s3 := "cat" - s4 := "dog" // ERROR "moved to heap: s4$" - s5 := "emu" // ERROR "moved to heap: s5$" - s6 := "fox" // ERROR "moved to heap: s6$" + s4 := "dog" // ERROR "moved to heap: s4$" + s5 := "emu" // ERROR "moved to heap: s5$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 - ps6 := &s6 // ERROR "moved to heap: ps6$" + ps6 := &s6 // ERROR "moved to heap: ps6$" u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPiSPPid() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -286,13 +286,13 @@ func tUPPiSPPia() { // This test is sensitive to the level cap in function summa s3 := "cat" s4 := "dog" s5 := "emu" - s6 := "fox" // ERROR "moved to heap: s6$" + s6 := "fox" // ERROR "moved to heap: s6$" ps2 := &s2 ps4 := &s4 ps6 := &s6 u1 := U{&s1, &ps2} - u2 := &U{&s3, &ps4} // ERROR "&U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "&V literal does not escape$" + u2 := &U{&s3, &ps4} // ERROR "&U{...} does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U{...} does not escape$" + v := &V{u1, u2, &u3} // ERROR "&V{...} does not escape$" Ssink = v.UPPiSPPia() // Ssink = *&ps6 = &s6 (only &s6 really escapes) } diff --git a/test/fixedbugs/issue12006.go b/test/fixedbugs/issue12006.go index c44f2e5547..0a2ef8dad0 100644 --- a/test/fixedbugs/issue12006.go +++ b/test/fixedbugs/issue12006.go @@ -144,7 +144,7 @@ func TFooK2() { a := int32(1) // ERROR "moved to heap: a" b := "cat" c := &a - fs := fakeSlice{3, &[4]interface{}{a, b, c, nil}} // ERROR "a escapes to heap" "b escapes to heap" "&\[4\]interface {} literal does not escape" + fs := fakeSlice{3, &[4]interface{}{a, b, c, nil}} // ERROR "a escapes to heap" "b escapes to heap" "&\[4\]interface {}{...} does not escape" isink = FooK(fs) } @@ -169,6 +169,6 @@ func TFooL2() { a := int32(1) // ERROR "moved to heap: a" b := "cat" c := &a - s := []interface{}{a, b, c} // ERROR "a escapes to heap" "b escapes to heap" "\[\]interface {} literal does not escape" + s := []interface{}{a, b, c} // ERROR "a escapes to heap" "b escapes to heap" "\[\]interface {}{...} does not escape" isink = FooL(s) } diff --git a/test/fixedbugs/issue13799.go b/test/fixedbugs/issue13799.go index 5c57494777..fbdd4c32bc 100644 --- a/test/fixedbugs/issue13799.go +++ b/test/fixedbugs/issue13799.go @@ -162,7 +162,7 @@ func test5(iter int) { var fn *str for i := 0; i < maxI; i++ { // var fn *str // this makes it work, because fn stays off heap - fn = &str{m} // ERROR "&str literal escapes to heap" + fn = &str{m} // ERROR "&str{...} escapes to heap" recur1(0, fn) } @@ -180,7 +180,7 @@ func test6(iter int) { // var fn *str for i := 0; i < maxI; i++ { var fn *str // this makes it work, because fn stays off heap - fn = &str{m} // ERROR "&str literal does not escape" + fn = &str{m} // ERROR "&str{...} does not escape" recur1(0, fn) } diff --git a/test/fixedbugs/issue17645.go b/test/fixedbugs/issue17645.go index af785eae2a..95fcecd1e0 100644 --- a/test/fixedbugs/issue17645.go +++ b/test/fixedbugs/issue17645.go @@ -12,5 +12,5 @@ type Foo struct { func main() { var s []int - var _ string = append(s, Foo{""}) // ERROR "cannot use .. \(type untyped string\) as type int in field value" "cannot use Foo literal \(type Foo\) as type int in append" "cannot use append\(s\, Foo literal\) \(type \[\]int\) as type string in assignment" + var _ string = append(s, Foo{""}) // ERROR "cannot use .. \(type untyped string\) as type int in field value" "cannot use Foo{...} \(type Foo\) as type int in append" "cannot use append\(s\, Foo{...}\) \(type \[\]int\) as type string in assignment" } diff --git a/test/fixedbugs/issue21709.go b/test/fixedbugs/issue21709.go index cc5896ab53..20be10e792 100644 --- a/test/fixedbugs/issue21709.go +++ b/test/fixedbugs/issue21709.go @@ -16,7 +16,7 @@ var N int func F1() { var s S for i := 0; i < N; i++ { - fs := []func(){ // ERROR "\[\]func\(\) literal does not escape" + fs := []func(){ // ERROR "\[\]func\(\){...} does not escape" s.Inc, // ERROR "s.Inc does not escape" } for _, f := range fs { @@ -28,7 +28,7 @@ func F1() { func F2() { var s S for i := 0; i < N; i++ { - for _, f := range []func(){ // ERROR "\[\]func\(\) literal does not escape" + for _, f := range []func(){ // ERROR "\[\]func\(\){...} does not escape" s.Inc, // ERROR "s.Inc does not escape" } { f() diff --git a/test/fixedbugs/issue23732.go b/test/fixedbugs/issue23732.go index be17bf4f61..5e63eb2074 100644 --- a/test/fixedbugs/issue23732.go +++ b/test/fixedbugs/issue23732.go @@ -24,19 +24,19 @@ func main() { _ = Foo{ 1, 2, - 3, // ERROR "too few values in Foo literal" + 3, // ERROR "too few values in Foo{...}" } _ = Foo{ 1, 2, 3, - Bar{"A", "B"}, // ERROR "too many values in Bar literal" + Bar{"A", "B"}, // ERROR "too many values in Bar{...}" } _ = Foo{ 1, 2, - Bar{"A", "B"}, // ERROR "too many values in Bar literal" "too few values in Foo literal" + Bar{"A", "B"}, // ERROR "too many values in Bar{...}" "too few values in Foo{...}" } } diff --git a/test/fixedbugs/issue26855.go b/test/fixedbugs/issue26855.go index d5b95ddbf1..144e4415f7 100644 --- a/test/fixedbugs/issue26855.go +++ b/test/fixedbugs/issue26855.go @@ -20,9 +20,9 @@ type P struct { type T struct{} var _ = S{ - f: &T{}, // ERROR "cannot use &T literal" + f: &T{}, // ERROR "cannot use &T{}" } var _ = P{ - f: T{}, // ERROR "cannot use T literal" + f: T{}, // ERROR "cannot use T{}" } diff --git a/test/fixedbugs/issue30898.go b/test/fixedbugs/issue30898.go index 012d5a2634..b6376d3f9e 100644 --- a/test/fixedbugs/issue30898.go +++ b/test/fixedbugs/issue30898.go @@ -15,5 +15,5 @@ func debugf(format string, args ...interface{}) { // ERROR "can inline debugf" " func bar() { // ERROR "can inline bar" value := 10 - debugf("value is %d", value) // ERROR "inlining call to debugf" "value does not escape" "\[\]interface {} literal does not escape" + debugf("value is %d", value) // ERROR "inlining call to debugf" "value does not escape" "\[\]interface {}{...} does not escape" } diff --git a/test/fixedbugs/issue31573.go b/test/fixedbugs/issue31573.go index c9ea84bbae..005910e00d 100644 --- a/test/fixedbugs/issue31573.go +++ b/test/fixedbugs/issue31573.go @@ -14,18 +14,18 @@ func g() { defer f(new(int), new(int)) // ERROR "... argument does not escape$" "new\(int\) does not escape$" defer f(nil...) - defer f([]*int{}...) // ERROR "\[\]\*int literal does not escape$" - defer f([]*int{new(int)}...) // ERROR "\[\]\*int literal does not escape$" "new\(int\) does not escape$" - defer f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int literal does not escape$" "new\(int\) does not escape$" + defer f([]*int{}...) // ERROR "\[\]\*int{} does not escape$" + defer f([]*int{new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) does not escape$" + defer f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int{...} does not escape$" "new\(int\) does not escape$" go f() go f(new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" go f(new(int), new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" go f(nil...) - go f([]*int{}...) // ERROR "\[\]\*int literal escapes to heap$" - go f([]*int{new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" - go f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + go f([]*int{}...) // ERROR "\[\]\*int{} escapes to heap$" + go f([]*int{new(int)}...) // ERROR "\[\]\*int{...} escapes to heap$" "new\(int\) escapes to heap$" + go f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int{...} escapes to heap$" "new\(int\) escapes to heap$" for { defer f() @@ -33,17 +33,17 @@ func g() { defer f(new(int), new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" defer f(nil...) - defer f([]*int{}...) // ERROR "\[\]\*int literal escapes to heap$" - defer f([]*int{new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" - defer f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + defer f([]*int{}...) // ERROR "\[\]\*int{} escapes to heap$" + defer f([]*int{new(int)}...) // ERROR "\[\]\*int{...} escapes to heap$" "new\(int\) escapes to heap$" + defer f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int{...} escapes to heap$" "new\(int\) escapes to heap$" go f() go f(new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" go f(new(int), new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" go f(nil...) - go f([]*int{}...) // ERROR "\[\]\*int literal escapes to heap$" - go f([]*int{new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" - go f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + go f([]*int{}...) // ERROR "\[\]\*int{} escapes to heap$" + go f([]*int{new(int)}...) // ERROR "\[\]\*int{...} escapes to heap$" "new\(int\) escapes to heap$" + go f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int{...} escapes to heap$" "new\(int\) escapes to heap$" } } diff --git a/test/fixedbugs/issue38745.go b/test/fixedbugs/issue38745.go new file mode 100644 index 0000000000..21bd1ff3a7 --- /dev/null +++ b/test/fixedbugs/issue38745.go @@ -0,0 +1,19 @@ +// errorcheck + +// 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 p + +type t struct{ x int } + +func f1() { + t{}.M() // ERROR "t{}.M undefined \(type t has no field or method M\)" + t{x: 1}.M() // ERROR "t{...}.M undefined \(type t has no field or method M\)" +} + +func f2() (*t, error) { + // BAD: should report undefined error only. + return t{}.M() // ERROR "t{}.M undefined \(type t has no field or method M\)" "not enough arguments to return" +} diff --git a/test/fixedbugs/issue39292.go b/test/fixedbugs/issue39292.go index 1be88653e9..7dac2e5fc6 100644 --- a/test/fixedbugs/issue39292.go +++ b/test/fixedbugs/issue39292.go @@ -12,18 +12,18 @@ func (t) f() { } func x() { - x := t{}.f // ERROR "t literal.f escapes to heap" + x := t{}.f // ERROR "t{}.f escapes to heap" x() } func y() { var i int // ERROR "moved to heap: i" - y := (&t{&i}).f // ERROR "\(&t literal\).f escapes to heap" "&t literal escapes to heap" + y := (&t{&i}).f // ERROR "\(&t{...}\).f escapes to heap" "&t{...} escapes to heap" y() } func z() { var i int // ERROR "moved to heap: i" - z := t{&i}.f // ERROR "t literal.f escapes to heap" + z := t{&i}.f // ERROR "t{...}.f escapes to heap" z() } diff --git a/test/fixedbugs/issue41247.go b/test/fixedbugs/issue41247.go index 2df919c9e6..b8bd81274f 100644 --- a/test/fixedbugs/issue41247.go +++ b/test/fixedbugs/issue41247.go @@ -7,5 +7,5 @@ package p func f() [2]int { - return [...]int{2: 0} // ERROR "cannot use \[\.\.\.\]int literal \(type \[3\]int\)" + return [...]int{2: 0} // ERROR "cannot use \[\.\.\.\]int{...} \(type \[3\]int\)" } diff --git a/test/fixedbugs/issue7921.go b/test/fixedbugs/issue7921.go index a8efc8dd9e..5dce557ca3 100644 --- a/test/fixedbugs/issue7921.go +++ b/test/fixedbugs/issue7921.go @@ -18,12 +18,12 @@ func bufferNotEscape() string { // can be stack-allocated. var b bytes.Buffer b.WriteString("123") - b.Write([]byte{'4'}) // ERROR "\[\]byte literal does not escape$" + b.Write([]byte{'4'}) // ERROR "\[\]byte{...} does not escape$" return b.String() // ERROR "inlining call to bytes.\(\*Buffer\).String$" "string\(bytes.b.buf\[bytes.b.off:\]\) escapes to heap$" } func bufferNoEscape2(xs []string) int { // ERROR "xs does not escape$" - b := bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "&bytes.Buffer literal does not escape$" "make\(\[\]byte, 0, 64\) does not escape$" "inlining call to bytes.NewBuffer$" + b := bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "&bytes.Buffer{...} does not escape$" "make\(\[\]byte, 0, 64\) does not escape$" "inlining call to bytes.NewBuffer$" for _, x := range xs { b.WriteString(x) } @@ -31,7 +31,7 @@ func bufferNoEscape2(xs []string) int { // ERROR "xs does not escape$" } func bufferNoEscape3(xs []string) string { // ERROR "xs does not escape$" - b := bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "&bytes.Buffer literal does not escape$" "make\(\[\]byte, 0, 64\) does not escape$" "inlining call to bytes.NewBuffer$" + b := bytes.NewBuffer(make([]byte, 0, 64)) // ERROR "&bytes.Buffer{...} does not escape$" "make\(\[\]byte, 0, 64\) does not escape$" "inlining call to bytes.NewBuffer$" for _, x := range xs { b.WriteString(x) b.WriteByte(',') @@ -41,13 +41,13 @@ func bufferNoEscape3(xs []string) string { // ERROR "xs does not escape$" func bufferNoEscape4() []byte { var b bytes.Buffer - b.Grow(64) // ERROR "bufferNoEscape4 ignoring self-assignment in bytes.b.buf = bytes.b.buf\[:bytes.m·3\]$" "inlining call to bytes.\(\*Buffer\).Grow$" + b.Grow(64) // ERROR "bufferNoEscape4 ignoring self-assignment in bytes.b.buf = bytes.b.buf\[:bytes.m·3\]$" "inlining call to bytes.\(\*Buffer\).Grow$" useBuffer(&b) return b.Bytes() // ERROR "inlining call to bytes.\(\*Buffer\).Bytes$" } func bufferNoEscape5() { // ERROR "can inline bufferNoEscape5$" - b := bytes.NewBuffer(make([]byte, 0, 128)) // ERROR "&bytes.Buffer literal does not escape$" "make\(\[\]byte, 0, 128\) does not escape$" "inlining call to bytes.NewBuffer$" + b := bytes.NewBuffer(make([]byte, 0, 128)) // ERROR "&bytes.Buffer{...} does not escape$" "make\(\[\]byte, 0, 128\) does not escape$" "inlining call to bytes.NewBuffer$" useBuffer(b) } diff --git a/test/inline_variadic.go b/test/inline_variadic.go index fcc1cff1e8..687048a192 100644 --- a/test/inline_variadic.go +++ b/test/inline_variadic.go @@ -14,6 +14,6 @@ func head(xs ...string) string { // ERROR "can inline head" "leaking param: xs t } func f() string { // ERROR "can inline f" - x := head("hello", "world") // ERROR "inlining call to head" "\[\]string literal does not escape" + x := head("hello", "world") // ERROR "inlining call to head" "\[\]string{...} does not escape" return x } -- GitLab From 806f478499b57c5167fb5301101961b7563903d2 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 9 Sep 2020 16:25:48 +0700 Subject: [PATCH 0471/1792] cmd/compile: don't report not enough args error if call is undefined Fixes #38745 Change-Id: I2fbd8b512a8cf911b81a087162c74416116efea5 Reviewed-on: https://go-review.googlesource.com/c/go/+/253678 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/typecheck.go | 2 +- test/ddd1.go | 2 +- test/fixedbugs/issue38745.go | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index dec4b96fc4..fb169cfec8 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -2667,7 +2667,7 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, return notenough: - if n == nil || !n.Diag() { + if n == nil || (!n.Diag() && n.Type != nil) { details := errorDetails(nl, tstruct, isddd) if call != nil { // call is the expression being called, not the overall call. diff --git a/test/ddd1.go b/test/ddd1.go index 2c7e83e374..9857814648 100644 --- a/test/ddd1.go +++ b/test/ddd1.go @@ -29,7 +29,7 @@ var ( _ = sum(tuple()) _ = sum(tuple()...) // ERROR "multiple-value" _ = sum3(tuple()) - _ = sum3(tuple()...) // ERROR "multiple-value" "not enough" + _ = sum3(tuple()...) // ERROR "multiple-value" ) type T []T diff --git a/test/fixedbugs/issue38745.go b/test/fixedbugs/issue38745.go index 21bd1ff3a7..83a3bc6fad 100644 --- a/test/fixedbugs/issue38745.go +++ b/test/fixedbugs/issue38745.go @@ -14,6 +14,5 @@ func f1() { } func f2() (*t, error) { - // BAD: should report undefined error only. - return t{}.M() // ERROR "t{}.M undefined \(type t has no field or method M\)" "not enough arguments to return" + return t{}.M() // ERROR "t{}.M undefined \(type t has no field or method M\)" } -- GitLab From 92b2b8860dcc28461198c6125fbae2383161d2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 15 Aug 2020 16:20:50 +0200 Subject: [PATCH 0472/1792] cmd/go: avoid flag.FlagSet.VisitAll at init time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We want to error early if GOFLAGS contains any flag that isn't known to any cmd/go command. Thus, at init time we would recursively use VisitAll on each of the flagsets to populate a map of all registered flags. This was unfortunate, as populating said map constituted a whole 5% of the run-time of 'go env GOARCH'. This is because VisitAll is pretty expensive; it copies all the maps from the flagset's map to a slice, sorts the slice, then does one callback per flag. First, this was a bit wasteful. We only ever needed to query the knownFlag map if GOFLAGS wasn't empty. If it's empty, there's no work to do, thus we can skip the map populating work. Second and most important, we don't actually need the map at all. A flag.FlagSet already has a Lookup method, so we can simply recursively call those methods for each flag in GOFLAGS. Add a hasFlag func to make that evident. This mechanism is different; its upfront cost is none, but it will likely mean a handful of map lookups for each flag in GOFLAGS. However, that tradeoff is worth it; we don't expect GOFLAGS to contain thousands of flags. The most likely scenario is less than a dozen flags, in which case constructing a "unified" map is not at all a net win. One possible reason the previous mechanism was that way could be AddKnownFlag. Thankfully, the one and only use of that API was removed last year when Bryan cleaned up flag parsing in cmd/go. The wins for the existing benchmark with an empty GOFLAGS are significant: name old time/op new time/op delta ExecGoEnv-8 575µs ± 1% 549µs ± 2% -4.44% (p=0.000 n=7+8) name old sys-time/op new sys-time/op delta ExecGoEnv-8 1.69ms ± 1% 1.68ms ± 2% ~ (p=0.281 n=7+8) name old user-time/op new user-time/op delta ExecGoEnv-8 1.80ms ± 1% 1.66ms ± 2% -8.09% (p=0.000 n=7+8) To prove that a relatively large number of GOFLAGS isn't getting noticeably slower, we measured that as well, via benchcmd and GOFLAGS containing 50 valid flags: GOFLAGS=$(yes -- -race | sed 50q) benchcmd -n 500 GoEnvGOFLAGS go env GOARCH And the result, while noisy, shows no noticeable difference (note that it measures 3ms instead of 0.6ms since it's sequential): name old time/op new time/op delta GoEnvGOFLAGS 3.04ms ±32% 3.03ms ±35% ~ (p=0.156 n=487+481) Finally, we've improved the existing Go benchmark. Now it's parallel, and it also reports sys-time and user-time, which are useful metrics. Change-Id: I9b4551415cedf2f819eb184a02324b8bd919e2bd Reviewed-on: https://go-review.googlesource.com/c/go/+/248757 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/init_test.go | 26 +++++++++++++------- src/cmd/go/internal/base/base.go | 14 +++++++++++ src/cmd/go/internal/base/goflags.go | 37 ++++++----------------------- 3 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/cmd/go/init_test.go b/src/cmd/go/init_test.go index ed90a77841..5a5cbe5293 100644 --- a/src/cmd/go/init_test.go +++ b/src/cmd/go/init_test.go @@ -7,6 +7,7 @@ package main_test import ( "internal/testenv" "os/exec" + "sync/atomic" "testing" ) @@ -15,20 +16,27 @@ import ( // the benchmark if any changes were done. func BenchmarkExecGoEnv(b *testing.B) { testenv.MustHaveExec(b) - b.StopTimer() gotool, err := testenv.GoTool() if err != nil { b.Fatal(err) } - for i := 0; i < b.N; i++ { - cmd := exec.Command(gotool, "env", "GOARCH") - b.StartTimer() - err := cmd.Run() - b.StopTimer() + // We collect extra metrics. + var n, userTime, systemTime int64 - if err != nil { - b.Fatal(err) + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + cmd := exec.Command(gotool, "env", "GOARCH") + + if err := cmd.Run(); err != nil { + b.Fatal(err) + } + atomic.AddInt64(&n, 1) + atomic.AddInt64(&userTime, int64(cmd.ProcessState.UserTime())) + atomic.AddInt64(&systemTime, int64(cmd.ProcessState.SystemTime())) } - } + }) + b.ReportMetric(float64(userTime)/float64(n), "user-ns/op") + b.ReportMetric(float64(systemTime)/float64(n), "sys-ns/op") } diff --git a/src/cmd/go/internal/base/base.go b/src/cmd/go/internal/base/base.go index db3ebef933..004588c732 100644 --- a/src/cmd/go/internal/base/base.go +++ b/src/cmd/go/internal/base/base.go @@ -56,6 +56,20 @@ var Go = &Command{ // Commands initialized in package main } +// hasFlag reports whether a command or any of its subcommands contain the given +// flag. +func hasFlag(c *Command, name string) bool { + if f := c.Flag.Lookup(name); f != nil { + return true + } + for _, sub := range c.Commands { + if hasFlag(sub, name) { + return true + } + } + return false +} + // LongName returns the command's long name: all the words in the usage line between "go" and a flag or argument, func (c *Command) LongName() string { name := c.UsageLine diff --git a/src/cmd/go/internal/base/goflags.go b/src/cmd/go/internal/base/goflags.go index 34766134b0..f11f9a5d33 100644 --- a/src/cmd/go/internal/base/goflags.go +++ b/src/cmd/go/internal/base/goflags.go @@ -13,15 +13,7 @@ import ( "cmd/go/internal/cfg" ) -var ( - goflags []string // cached $GOFLAGS list; can be -x or --x form - knownFlag = make(map[string]bool) // flags allowed to appear in $GOFLAGS; no leading dashes -) - -// AddKnownFlag adds name to the list of known flags for use in $GOFLAGS. -func AddKnownFlag(name string) { - knownFlag[name] = true -} +var goflags []string // cached $GOFLAGS list; can be -x or --x form // GOFLAGS returns the flags from $GOFLAGS. // The list can be assumed to contain one string per flag, @@ -38,22 +30,12 @@ func InitGOFLAGS() { return } - // Build list of all flags for all commands. - // If no command has that flag, then we report the problem. - // This catches typos while still letting users record flags in GOFLAGS - // that only apply to a subset of go commands. - // Commands using CustomFlags can report their flag names - // by calling AddKnownFlag instead. - var walkFlags func(*Command) - walkFlags = func(cmd *Command) { - for _, sub := range cmd.Commands { - walkFlags(sub) - } - cmd.Flag.VisitAll(func(f *flag.Flag) { - knownFlag[f.Name] = true - }) + goflags = strings.Fields(cfg.Getenv("GOFLAGS")) + if len(goflags) == 0 { + // nothing to do; avoid work on later InitGOFLAGS call + goflags = []string{} + return } - walkFlags(Go) // Ignore bad flag in go env and go bug, because // they are what people reach for when debugging @@ -61,11 +43,6 @@ func InitGOFLAGS() { // (Both will show the GOFLAGS setting if let succeed.) hideErrors := cfg.CmdName == "env" || cfg.CmdName == "bug" - goflags = strings.Fields(cfg.Getenv("GOFLAGS")) - if goflags == nil { - goflags = []string{} // avoid work on later InitGOFLAGS call - } - // Each of the words returned by strings.Fields must be its own flag. // To set flag arguments use -x=value instead of -x value. // For boolean flags, -x is fine instead of -x=true. @@ -85,7 +62,7 @@ func InitGOFLAGS() { if i := strings.Index(name, "="); i >= 0 { name = name[:i] } - if !knownFlag[name] { + if !hasFlag(Go, name) { if hideErrors { continue } -- GitLab From b3ef90ec7304a28b89f616ced20b09f56be30cc4 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Fri, 11 Sep 2020 22:16:47 +0000 Subject: [PATCH 0473/1792] encoding/json: implement Is on SyntaxError Allows users to check: errors.Is(err, &json.SyntaxError{}) which is the recommended way of checking for kinds of errors. Change-Id: I20dc805f20212765e9936a82d9cb7822e73ec4ef GitHub-Last-Rev: e2627ccf8e2a00cc3459bb9fee86c3c8675a33af GitHub-Pull-Request: golang/go#41210 Reviewed-on: https://go-review.googlesource.com/c/go/+/253037 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/encoding/json/scanner.go | 6 ++++++ src/encoding/json/scanner_test.go | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/src/encoding/json/scanner.go b/src/encoding/json/scanner.go index 9dc1903e2d..05218f9cc3 100644 --- a/src/encoding/json/scanner.go +++ b/src/encoding/json/scanner.go @@ -49,6 +49,12 @@ type SyntaxError struct { func (e *SyntaxError) Error() string { return e.msg } +// Is returns true if target is a SyntaxError. +func (e *SyntaxError) Is(target error) bool { + _, ok := target.(*SyntaxError) + return ok +} + // A scanner is a JSON scanning state machine. // Callers call scan.reset and then pass bytes in one at a time // by calling scan.step(&scan, c) for each byte. diff --git a/src/encoding/json/scanner_test.go b/src/encoding/json/scanner_test.go index 3737516a45..c12d9bf3d7 100644 --- a/src/encoding/json/scanner_test.go +++ b/src/encoding/json/scanner_test.go @@ -6,6 +6,8 @@ package json import ( "bytes" + "errors" + "fmt" "math" "math/rand" "reflect" @@ -201,6 +203,13 @@ func TestIndentErrors(t *testing.T) { } } +func TestSyntaxErrorIs(t *testing.T) { + err := fmt.Errorf("apackage: %w: failed to parse struct", &SyntaxError{"some error", 43}) + if !errors.Is(err, &SyntaxError{}) { + t.Fatalf("%v should be unwrapped to a SyntaxError", err) + } +} + func diff(t *testing.T, a, b []byte) { for i := 0; ; i++ { if i >= len(a) || i >= len(b) || a[i] != b[i] { -- GitLab From 95bb00d1088767ed14e3bd1a5f533a690d619a5f Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Sun, 13 Sep 2020 02:12:02 +0000 Subject: [PATCH 0474/1792] encoding/json: implement Is on all errors Allows users to check: errors.Is(err, &UnmarshalTypeError{}) errors.Is(err, &UnmarshalFieldError{}) errors.Is(err, &InvalidUnmarshalError{}) errors.Is(err, &UnsupportedValueError{}) errors.Is(err, &MarshalerError{}) which is the recommended way of checking for kinds of errors. SyntaxError.Is was implemented in CL 253037. As and Unwrap relevant methods will be added in future CLs. Change-Id: I1f8a503b8fdc0f3afdfe9669a91f3af8d960e028 GitHub-Last-Rev: 930cda5384c987a0b31f277ba3b4ab690ea74ac3 GitHub-Pull-Request: golang/go#41360 Reviewed-on: https://go-review.googlesource.com/c/go/+/254537 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke Trust: Emmanuel Odeke --- src/encoding/json/decode.go | 18 ++++++++++++++++++ src/encoding/json/decode_test.go | 31 +++++++++++++++++++++++++++++++ src/encoding/json/encode.go | 12 ++++++++++++ src/encoding/json/encode_test.go | 24 +++++++++++++++++++++++- 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 86d8a69db7..1b006ffb17 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -136,6 +136,12 @@ func (e *UnmarshalTypeError) Error() string { return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String() } +// Is returns true if target is a UnmarshalTypeError. +func (e *UnmarshalTypeError) Is(target error) bool { + _, ok := target.(*UnmarshalTypeError) + return ok +} + // An UnmarshalFieldError describes a JSON object key that // led to an unexported (and therefore unwritable) struct field. // @@ -150,12 +156,24 @@ func (e *UnmarshalFieldError) Error() string { return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String() } +// Is returns true if target is a UnmarshalFieldError. +func (e *UnmarshalFieldError) Is(target error) bool { + _, ok := target.(*UnmarshalFieldError) + return ok +} + // An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. // (The argument to Unmarshal must be a non-nil pointer.) type InvalidUnmarshalError struct { Type reflect.Type } +// Is returns true if target is a InvalidUnmarshalError. +func (e *InvalidUnmarshalError) Is(target error) bool { + _, ok := target.(*InvalidUnmarshalError) + return ok +} + func (e *InvalidUnmarshalError) Error() string { if e.Type == nil { return "json: Unmarshal(nil)" diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index 219e845c7b..b707dcfa99 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -2572,3 +2572,34 @@ func TestUnmarshalMaxDepth(t *testing.T) { } } } + +func TestInvalidUnmarshalErrorIs(t *testing.T) { + err := fmt.Errorf("apackage: %w: failed to parse struct", &InvalidUnmarshalError{reflect.TypeOf("a")}) + if !errors.Is(err, &InvalidUnmarshalError{}) { + t.Fatalf("%v should be unwrapped to a InvalidUnmarshalError", err) + } +} + +func TestUnmarshalFieldErrorIs(t *testing.T) { + err := fmt.Errorf("apackage: %w: failed to parse struct", &UnmarshalFieldError{ + Key: "foo", + Type: reflect.TypeOf("a"), + Field: reflect.StructField{Name: "b"}, + }) + if !errors.Is(err, &UnmarshalFieldError{}) { + t.Fatalf("%v should be unwrapped to a UnmarshalFieldError", err) + } +} + +func TestUnmarshalTypeErrorIs(t *testing.T) { + err := fmt.Errorf("apackage: %w: failed to parse struct", &UnmarshalTypeError{ + Value: "foo", + Type: reflect.TypeOf("a"), + Offset: 1, + Struct: "Foo", + Field: "Bar", + }) + if !errors.Is(err, &UnmarshalTypeError{}) { + t.Fatalf("%v should be unwrapped to a UnmarshalTypeError", err) + } +} diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index 578d551102..8e6b342b59 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -245,6 +245,12 @@ func (e *UnsupportedValueError) Error() string { return "json: unsupported value: " + e.Str } +// Is returns true if target is a UnsupportedValueError. +func (e *UnsupportedValueError) Is(target error) bool { + _, ok := target.(*UnsupportedValueError) + return ok +} + // Before Go 1.2, an InvalidUTF8Error was returned by Marshal when // attempting to encode a string value with invalid UTF-8 sequences. // As of Go 1.2, Marshal instead coerces the string to valid UTF-8 by @@ -279,6 +285,12 @@ func (e *MarshalerError) Error() string { // Unwrap returns the underlying error. func (e *MarshalerError) Unwrap() error { return e.Err } +// Is returns true if target is a MarshalerError. +func (e *MarshalerError) Is(target error) bool { + _, ok := target.(*MarshalerError) + return ok +} + var hex = "0123456789abcdef" // An encodeState encodes JSON into a bytes.Buffer. diff --git a/src/encoding/json/encode_test.go b/src/encoding/json/encode_test.go index 7290eca06f..90826a7f47 100644 --- a/src/encoding/json/encode_test.go +++ b/src/encoding/json/encode_test.go @@ -7,6 +7,7 @@ package json import ( "bytes" "encoding" + "errors" "fmt" "log" "math" @@ -211,7 +212,7 @@ var unsupportedValues = []interface{}{ func TestUnsupportedValues(t *testing.T) { for _, v := range unsupportedValues { if _, err := Marshal(v); err != nil { - if _, ok := err.(*UnsupportedValueError); !ok { + if !errors.Is(err, &UnsupportedValueError{}) { t.Errorf("for %v, got %T want UnsupportedValueError", v, err) } } else { @@ -1155,3 +1156,24 @@ func TestMarshalerError(t *testing.T) { } } } + +func TestMarshalerErrorIs(t *testing.T) { + err := fmt.Errorf("apackage: %w: failed to parse struct", &MarshalerError{ + reflect.TypeOf("a"), + fmt.Errorf("something"), + "TestMarshalerErrorIs", + }) + if !errors.Is(err, &MarshalerError{}) { + t.Fatalf("%v should be unwrapped to a MarshalerError", err) + } +} + +func TestUnsupportedValueErrorIs(t *testing.T) { + err := fmt.Errorf("apackage: %w: failed to parse struct", &UnsupportedValueError{ + Value: reflect.Value{}, + Str: "Foo", + }) + if !errors.Is(err, &UnsupportedValueError{}) { + t.Fatalf("%v should be unwrapped to a UnsupportedValueError", err) + } +} -- GitLab From 1f4521669416a2e14fb0b84481447f4a93f19878 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 12 Sep 2020 01:57:27 +0700 Subject: [PATCH 0475/1792] cmd/compile: attach OVARLIVE nodes to OCALLxxx So we can insert theses OVARLIVE nodes right after OpStaticCall in SSA. This helps fixing issue that unsafe-uintptr arguments are not kept alive during return statement, or can be kept alive longer than expected. Fixes #24491 Change-Id: Ic04a5d1bbb5c90dcfae65bd95cdd1da393a66800 Reviewed-on: https://go-review.googlesource.com/c/go/+/254397 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/order.go | 14 ++---- src/cmd/compile/internal/gc/ssa.go | 2 + src/cmd/compile/internal/gc/syntax.go | 4 +- .../{issue24491.go => issue24491a.go} | 11 ++++- test/fixedbugs/issue24491b.go | 46 +++++++++++++++++++ 5 files changed, 63 insertions(+), 14 deletions(-) rename test/fixedbugs/{issue24491.go => issue24491a.go} (85%) create mode 100644 test/fixedbugs/issue24491b.go diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 412f073a8d..341f4ee66f 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -288,20 +288,13 @@ func (o *Order) popTemp(mark ordermarker) { o.temp = o.temp[:mark] } -// cleanTempNoPop emits VARKILL and if needed VARLIVE instructions -// to *out for each temporary above the mark on the temporary stack. +// cleanTempNoPop emits VARKILL instructions to *out +// for each temporary above the mark on the temporary stack. // It does not pop the temporaries from the stack. func (o *Order) cleanTempNoPop(mark ordermarker) []*Node { var out []*Node for i := len(o.temp) - 1; i >= int(mark); i-- { n := o.temp[i] - if n.Name.Keepalive() { - n.Name.SetKeepalive(false) - n.Name.SetAddrtaken(true) // ensure SSA keeps the n variable - live := nod(OVARLIVE, n, nil) - live = typecheck(live, ctxStmt) - out = append(out, live) - } kill := nod(OVARKILL, n, nil) kill = typecheck(kill, ctxStmt) out = append(out, kill) @@ -500,8 +493,9 @@ func (o *Order) call(n *Node) { // still alive when we pop the temp stack. if arg.Op == OCONVNOP && arg.Left.Type.IsUnsafePtr() { x := o.copyExpr(arg.Left, arg.Left.Type, false) - x.Name.SetKeepalive(true) arg.Left = x + x.Name.SetAddrtaken(true) // ensure SSA keeps the x variable + n.Nbody.Append(typecheck(nod(OVARLIVE, x, nil), ctxStmt)) n.SetNeedsWrapper(true) } } diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 89644cd3f2..3bdb5b0b9f 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -4498,6 +4498,8 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { call.AuxInt = stksize // Call operations carry the argsize of the callee along with them } s.vars[&memVar] = call + // Insert OVARLIVE nodes + s.stmtList(n.Nbody) // Finish block for defers if k == callDefer || k == callDeferStack { diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index 5580f789c5..9592b7484c 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -374,7 +374,6 @@ const ( nameReadonly nameByval // is the variable captured by value or by reference nameNeedzero // if it contains pointers, needs to be zeroed on function entry - nameKeepalive // mark value live across unknown assembly call nameAutoTemp // is the variable a temporary (implies no dwarf info. reset if escapes to heap) nameUsed // for variable declared and not used error nameIsClosureVar // PAUTOHEAP closure pseudo-variable; original at n.Name.Defn @@ -391,7 +390,6 @@ func (n *Name) Captured() bool { return n.flags&nameCaptured != 0 } func (n *Name) Readonly() bool { return n.flags&nameReadonly != 0 } func (n *Name) Byval() bool { return n.flags&nameByval != 0 } func (n *Name) Needzero() bool { return n.flags&nameNeedzero != 0 } -func (n *Name) Keepalive() bool { return n.flags&nameKeepalive != 0 } func (n *Name) AutoTemp() bool { return n.flags&nameAutoTemp != 0 } func (n *Name) Used() bool { return n.flags&nameUsed != 0 } func (n *Name) IsClosureVar() bool { return n.flags&nameIsClosureVar != 0 } @@ -407,7 +405,6 @@ func (n *Name) SetCaptured(b bool) { n.flags.set(nameCaptured, b) } func (n *Name) SetReadonly(b bool) { n.flags.set(nameReadonly, b) } func (n *Name) SetByval(b bool) { n.flags.set(nameByval, b) } func (n *Name) SetNeedzero(b bool) { n.flags.set(nameNeedzero, b) } -func (n *Name) SetKeepalive(b bool) { n.flags.set(nameKeepalive, b) } func (n *Name) SetAutoTemp(b bool) { n.flags.set(nameAutoTemp, b) } func (n *Name) SetUsed(b bool) { n.flags.set(nameUsed, b) } func (n *Name) SetIsClosureVar(b bool) { n.flags.set(nameIsClosureVar, b) } @@ -707,6 +704,7 @@ const ( // Prior to walk, they are: Left(List), where List is all regular arguments. // After walk, List is a series of assignments to temporaries, // and Rlist is an updated set of arguments. + // Nbody is all OVARLIVE nodes that are attached to OCALLxxx. // TODO(josharian/khr): Use Ninit instead of List for the assignments to temporaries. See CL 114797. OCALLFUNC // Left(List/Rlist) (function call f(args)) OCALLMETH // Left(List/Rlist) (direct method call x.Method(args)) diff --git a/test/fixedbugs/issue24491.go b/test/fixedbugs/issue24491a.go similarity index 85% rename from test/fixedbugs/issue24491.go rename to test/fixedbugs/issue24491a.go index 4703368793..148134d187 100644 --- a/test/fixedbugs/issue24491.go +++ b/test/fixedbugs/issue24491a.go @@ -23,12 +23,18 @@ func setup() unsafe.Pointer { //go:noinline //go:uintptrescapes -func test(s string, p uintptr) { +func test(s string, p uintptr) int { runtime.GC() if *(*string)(unsafe.Pointer(p)) != "ok" { panic(s + " return unexpected result") } done <- true + return 0 +} + +//go:noinline +func f() int { + return test("return", uintptr(setup())) } func main() { @@ -42,4 +48,7 @@ func main() { defer test("defer", uintptr(setup())) }() <-done + + f() + <-done } diff --git a/test/fixedbugs/issue24491b.go b/test/fixedbugs/issue24491b.go new file mode 100644 index 0000000000..5f4a2f233e --- /dev/null +++ b/test/fixedbugs/issue24491b.go @@ -0,0 +1,46 @@ +// run + +// 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 test makes sure unsafe-uintptr arguments are not +// kept alive longer than expected. + +package main + +import ( + "runtime" + "sync/atomic" + "unsafe" +) + +var done uint32 + +func setup() unsafe.Pointer { + s := "ok" + runtime.SetFinalizer(&s, func(p *string) { atomic.StoreUint32(&done, 1) }) + return unsafe.Pointer(&s) +} + +//go:noinline +//go:uintptrescapes +func before(p uintptr) int { + runtime.GC() + if atomic.LoadUint32(&done) != 0 { + panic("GC early") + } + return 0 +} + +func after() int { + runtime.GC() + if atomic.LoadUint32(&done) == 0 { + panic("GC late") + } + return 0 +} + +func main() { + _ = before(uintptr(setup())) + after() +} -- GitLab From 5f1b12bfbeb04ca6dbecbf064f5e5a42d8ba4b5a Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sat, 12 Sep 2020 07:19:22 +0700 Subject: [PATCH 0476/1792] cmd/compile: remove nodeNeedsWrapper flag CL 254397 attached OVARLIVE nodes to OCALLxxx nodes Nbody. The NeedsWrapper flag is now redundant with n.Nbody.Len() > 0 condition, so use that condition instead and remove the flag. Passes toolstash-check. Change-Id: Iebc3e674d3c0040a876ca4be05025943d2b4fb31 Reviewed-on: https://go-review.googlesource.com/c/go/+/254398 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/order.go | 1 - src/cmd/compile/internal/gc/syntax.go | 41 +++++++++------------------ src/cmd/compile/internal/gc/walk.go | 7 +++-- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 341f4ee66f..75da154fe2 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -496,7 +496,6 @@ func (o *Order) call(n *Node) { arg.Left = x x.Name.SetAddrtaken(true) // ensure SSA keeps the x variable n.Nbody.Append(typecheck(nod(OVARLIVE, x, nil), ctxStmt)) - n.SetNeedsWrapper(true) } } diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index 9592b7484c..14d2710da4 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -141,20 +141,19 @@ const ( nodeInitorder, _ // tracks state during init1; two bits _, _ // second nodeInitorder bit _, nodeHasBreak - _, nodeNoInline // used internally by inliner to indicate that a function call should not be inlined; set for OCALLFUNC and OCALLMETH only - _, nodeImplicit // implicit OADDR or ODEREF; ++/-- statement represented as OASOP; or ANDNOT lowered to OAND - _, nodeIsDDD // is the argument variadic - _, nodeDiag // already printed error about this - _, nodeColas // OAS resulting from := - _, nodeNonNil // guaranteed to be non-nil - _, nodeTransient // storage can be reused immediately after this statement - _, nodeBounded // bounds check unnecessary - _, nodeHasCall // expression contains a function call - _, nodeLikely // if statement condition likely - _, nodeHasVal // node.E contains a Val - _, nodeHasOpt // node.E contains an Opt - _, nodeEmbedded // ODCLFIELD embedded type - _, nodeNeedsWrapper // OCALLxxx node that needs to be wrapped + _, nodeNoInline // used internally by inliner to indicate that a function call should not be inlined; set for OCALLFUNC and OCALLMETH only + _, nodeImplicit // implicit OADDR or ODEREF; ++/-- statement represented as OASOP; or ANDNOT lowered to OAND + _, nodeIsDDD // is the argument variadic + _, nodeDiag // already printed error about this + _, nodeColas // OAS resulting from := + _, nodeNonNil // guaranteed to be non-nil + _, nodeTransient // storage can be reused immediately after this statement + _, nodeBounded // bounds check unnecessary + _, nodeHasCall // expression contains a function call + _, nodeLikely // if statement condition likely + _, nodeHasVal // node.E contains a Val + _, nodeHasOpt // node.E contains an Opt + _, nodeEmbedded // ODCLFIELD embedded type ) func (n *Node) Class() Class { return Class(n.flags.get3(nodeClass)) } @@ -287,20 +286,6 @@ func (n *Node) SetIota(x int64) { n.Xoffset = x } -func (n *Node) NeedsWrapper() bool { - return n.flags&nodeNeedsWrapper != 0 -} - -// SetNeedsWrapper indicates that OCALLxxx node needs to be wrapped by a closure. -func (n *Node) SetNeedsWrapper(b bool) { - switch n.Op { - case OCALLFUNC, OCALLMETH, OCALLINTER: - default: - Fatalf("Node.SetNeedsWrapper %v", n.Op) - } - n.flags.set(nodeNeedsWrapper, b) -} - // mayBeShared reports whether n may occur in multiple places in the AST. // Extra care must be taken when mutating such a node. func (n *Node) mayBeShared() bool { diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 361de7e0f3..2d29366880 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -231,12 +231,15 @@ func walkstmt(n *Node) *Node { case OCOPY: n.Left = copyany(n.Left, &n.Ninit, true) - default: - if n.Left.NeedsWrapper() { + case OCALLFUNC, OCALLMETH, OCALLINTER: + if n.Left.Nbody.Len() > 0 { n.Left = wrapCall(n.Left, &n.Ninit) } else { n.Left = walkexpr(n.Left, &n.Ninit) } + + default: + n.Left = walkexpr(n.Left, &n.Ninit) } case OFOR, OFORUNTIL: -- GitLab From afb5fca25a6f59e9045317727f6899a58471d5f0 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Sun, 13 Sep 2020 13:22:42 +0700 Subject: [PATCH 0477/1792] test: fix flaky test for issue24491 runtime.GC() doesn't guarantee the finalizer has run, so use a channel instead to make sure finalizer was run in call to "after()". Fixes #41361 Change-Id: I69c801e29aea49757ea72c52e8db13239de19ddc Reviewed-on: https://go-review.googlesource.com/c/go/+/254401 Run-TryBot: Cuong Manh Le TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky Trust: Cuong Manh Le --- test/fixedbugs/issue24491b.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/fixedbugs/issue24491b.go b/test/fixedbugs/issue24491b.go index 5f4a2f233e..142d798500 100644 --- a/test/fixedbugs/issue24491b.go +++ b/test/fixedbugs/issue24491b.go @@ -11,15 +11,14 @@ package main import ( "runtime" - "sync/atomic" "unsafe" ) -var done uint32 +var done = make(chan bool) func setup() unsafe.Pointer { s := "ok" - runtime.SetFinalizer(&s, func(p *string) { atomic.StoreUint32(&done, 1) }) + runtime.SetFinalizer(&s, func(p *string) { close(done) }) return unsafe.Pointer(&s) } @@ -27,17 +26,18 @@ func setup() unsafe.Pointer { //go:uintptrescapes func before(p uintptr) int { runtime.GC() - if atomic.LoadUint32(&done) != 0 { + select { + case <-done: panic("GC early") + default: } return 0 } func after() int { runtime.GC() - if atomic.LoadUint32(&done) == 0 { - panic("GC late") - } + runtime.GC() + <-done return 0 } -- GitLab From 66e66e71132034aa620ffbae9008f951da0f9f27 Mon Sep 17 00:00:00 2001 From: Dominic Della Valle Date: Sun, 13 Sep 2020 17:03:48 +0000 Subject: [PATCH 0478/1792] make.bat: fix compare between GOROOT and srcdir paths, when either contains whitespace. CL 96455 brings CL 57753 to Windows However, a path comparison within it was left unquoted. If the Go source directory resides in a path containing whitespace, the interpreter will compare against the first portion of the path string, and treat the remainder as an expression. This patch amends that. For example, consider the path `C:\Users\Dominic Della Valle\Projects\Go\goroot\src` Issuing `make.bat` will print out `'Della' is not recognized as an internal or external command, operable program or batch file.` before proceeding. Change-Id: Ifcec159baeec940c29c61aa721c64c13c6fd8c14 GitHub-Last-Rev: 809ddbb4dbc80d834f8108ca44c2826016d78d1c GitHub-Pull-Request: golang/go#41319 Reviewed-on: https://go-review.googlesource.com/c/go/+/253898 Run-TryBot: Giovanni Bajo TryBot-Result: Gobot Gobot Reviewed-by: Giovanni Bajo Trust: Giovanni Bajo --- src/make.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/make.bat b/src/make.bat index 277a34d5d7..b4a8e70849 100644 --- a/src/make.bat +++ b/src/make.bat @@ -77,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 ( - if /I not %%i==%GOROOT_TEMP% ( + if /I not "%%i"=="%GOROOT_TEMP%" ( set GOROOT_BOOTSTRAP=%%i ) ) -- GitLab From 4f5cd0c0331943c7ec72df3b827d972584f77833 Mon Sep 17 00:00:00 2001 From: Roberto Clapis Date: Wed, 26 Aug 2020 08:53:03 +0200 Subject: [PATCH 0479/1792] net/http/cgi,net/http/fcgi: add Content-Type detection This CL ensures that responses served via CGI and FastCGI have a Content-Type header based on the content of the response if not explicitly set by handlers. If the implementers of the handler did not explicitly specify a Content-Type both CGI implementations would default to "text/html", potentially causing cross-site scripting. Thanks to RedTeam Pentesting GmbH for reporting this. Fixes #40928 Fixes CVE-2020-24553 Change-Id: I82cfc396309b5ab2e8d6e9a87eda8ea7e3799473 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/823217 Reviewed-by: Russ Cox Reviewed-on: https://go-review.googlesource.com/c/go/+/252179 Run-TryBot: Filippo Valsorda TryBot-Result: Go Bot Reviewed-by: Katie Hockman --- src/net/http/cgi/child.go | 36 +++++++++++------ src/net/http/cgi/child_test.go | 58 ++++++++++++++++++++++++++++ src/net/http/cgi/integration_test.go | 53 ++++++++++++++++++++++++- src/net/http/fcgi/child.go | 39 ++++++++++++++----- src/net/http/fcgi/fcgi_test.go | 52 +++++++++++++++++++++++++ 5 files changed, 216 insertions(+), 22 deletions(-) diff --git a/src/net/http/cgi/child.go b/src/net/http/cgi/child.go index d7d813e68a..690986335c 100644 --- a/src/net/http/cgi/child.go +++ b/src/net/http/cgi/child.go @@ -166,10 +166,12 @@ func Serve(handler http.Handler) error { } type response struct { - req *http.Request - header http.Header - bufw *bufio.Writer - headerSent bool + req *http.Request + header http.Header + code int + wroteHeader bool + wroteCGIHeader bool + bufw *bufio.Writer } func (r *response) Flush() { @@ -181,26 +183,38 @@ func (r *response) Header() http.Header { } func (r *response) Write(p []byte) (n int, err error) { - if !r.headerSent { + if !r.wroteHeader { r.WriteHeader(http.StatusOK) } + if !r.wroteCGIHeader { + r.writeCGIHeader(p) + } return r.bufw.Write(p) } func (r *response) WriteHeader(code int) { - if r.headerSent { + if r.wroteHeader { // Note: explicitly using Stderr, as Stdout is our HTTP output. fmt.Fprintf(os.Stderr, "CGI attempted to write header twice on request for %s", r.req.URL) return } - r.headerSent = true - fmt.Fprintf(r.bufw, "Status: %d %s\r\n", code, http.StatusText(code)) + r.wroteHeader = true + r.code = code +} - // Set a default Content-Type +// writeCGIHeader finalizes the header sent to the client and writes it to the output. +// p is not written by writeHeader, but is the first chunk of the body +// that will be written. It is sniffed for a Content-Type if none is +// set explicitly. +func (r *response) writeCGIHeader(p []byte) { + if r.wroteCGIHeader { + return + } + r.wroteCGIHeader = true + fmt.Fprintf(r.bufw, "Status: %d %s\r\n", r.code, http.StatusText(r.code)) if _, hasType := r.header["Content-Type"]; !hasType { - r.header.Add("Content-Type", "text/html; charset=utf-8") + r.header.Set("Content-Type", http.DetectContentType(p)) } - r.header.Write(r.bufw) r.bufw.WriteString("\r\n") r.bufw.Flush() diff --git a/src/net/http/cgi/child_test.go b/src/net/http/cgi/child_test.go index 14e0af475f..18cf789bd5 100644 --- a/src/net/http/cgi/child_test.go +++ b/src/net/http/cgi/child_test.go @@ -7,6 +7,11 @@ package cgi import ( + "bufio" + "bytes" + "net/http" + "net/http/httptest" + "strings" "testing" ) @@ -148,3 +153,56 @@ func TestRequestWithoutRemotePort(t *testing.T) { t.Errorf("RemoteAddr: got %q; want %q", g, e) } } + +func TestResponse(t *testing.T) { + var tests = []struct { + name string + body string + wantCT string + }{ + { + name: "no body", + wantCT: "text/plain; charset=utf-8", + }, + { + name: "html", + body: "test pageThis is a body", + wantCT: "text/html; charset=utf-8", + }, + { + name: "text", + body: strings.Repeat("gopher", 86), + wantCT: "text/plain; charset=utf-8", + }, + { + name: "jpg", + body: "\xFF\xD8\xFF" + strings.Repeat("B", 1024), + wantCT: "image/jpeg", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var buf bytes.Buffer + resp := response{ + req: httptest.NewRequest("GET", "/", nil), + header: http.Header{}, + bufw: bufio.NewWriter(&buf), + } + n, err := resp.Write([]byte(tt.body)) + if err != nil { + t.Errorf("Write: unexpected %v", err) + } + if want := len(tt.body); n != want { + t.Errorf("reported short Write: got %v want %v", n, want) + } + resp.writeCGIHeader(nil) + resp.Flush() + if got := resp.Header().Get("Content-Type"); got != tt.wantCT { + t.Errorf("wrong content-type: got %q, want %q", got, tt.wantCT) + } + if !bytes.HasSuffix(buf.Bytes(), []byte(tt.body)) { + t.Errorf("body was not correctly written") + } + }) + } +} diff --git a/src/net/http/cgi/integration_test.go b/src/net/http/cgi/integration_test.go index eaa090f6fe..76cbca8e60 100644 --- a/src/net/http/cgi/integration_test.go +++ b/src/net/http/cgi/integration_test.go @@ -16,7 +16,9 @@ import ( "io" "net/http" "net/http/httptest" + "net/url" "os" + "strings" "testing" "time" ) @@ -52,7 +54,7 @@ func TestHostingOurselves(t *testing.T) { } replay := runCgiTest(t, h, "GET /test.go?foo=bar&a=b HTTP/1.0\nHost: example.com\n\n", expectedMap) - if expected, got := "text/html; charset=utf-8", replay.Header().Get("Content-Type"); got != expected { + if expected, got := "text/plain; charset=utf-8", replay.Header().Get("Content-Type"); got != expected { t.Errorf("got a Content-Type of %q; expected %q", got, expected) } if expected, got := "X-Test-Value", replay.Header().Get("X-Test-Header"); got != expected { @@ -169,6 +171,51 @@ func TestNilRequestBody(t *testing.T) { _ = runCgiTest(t, h, "POST /test.go?nil-request-body=1 HTTP/1.0\nHost: example.com\nContent-Length: 0\n\n", expectedMap) } +func TestChildContentType(t *testing.T) { + testenv.MustHaveExec(t) + + h := &Handler{ + Path: os.Args[0], + Root: "/test.go", + Args: []string{"-test.run=TestBeChildCGIProcess"}, + } + var tests = []struct { + name string + body string + wantCT string + }{ + { + name: "no body", + wantCT: "text/plain; charset=utf-8", + }, + { + name: "html", + body: "test pageThis is a body", + wantCT: "text/html; charset=utf-8", + }, + { + name: "text", + body: strings.Repeat("gopher", 86), + wantCT: "text/plain; charset=utf-8", + }, + { + name: "jpg", + body: "\xFF\xD8\xFF" + strings.Repeat("B", 1024), + wantCT: "image/jpeg", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + expectedMap := map[string]string{"_body": tt.body} + req := fmt.Sprintf("GET /test.go?exact-body=%s HTTP/1.0\nHost: example.com\n\n", url.QueryEscape(tt.body)) + replay := runCgiTest(t, h, req, expectedMap) + if got := replay.Header().Get("Content-Type"); got != tt.wantCT { + t.Errorf("got a Content-Type of %q; expected it to start with %q", got, tt.wantCT) + } + }) + } +} + // golang.org/issue/7198 func Test500WithNoHeaders(t *testing.T) { want500Test(t, "/immediate-disconnect") } func Test500WithNoContentType(t *testing.T) { want500Test(t, "/no-content-type") } @@ -224,6 +271,10 @@ func TestBeChildCGIProcess(t *testing.T) { if req.FormValue("no-body") == "1" { return } + if eb, ok := req.Form["exact-body"]; ok { + io.WriteString(rw, eb[0]) + return + } if req.FormValue("write-forever") == "1" { io.Copy(rw, neverEnding('a')) for { diff --git a/src/net/http/fcgi/child.go b/src/net/http/fcgi/child.go index 0e91042543..34761f32ee 100644 --- a/src/net/http/fcgi/child.go +++ b/src/net/http/fcgi/child.go @@ -74,10 +74,12 @@ func (r *request) parseParams() { // response implements http.ResponseWriter. type response struct { - req *request - header http.Header - w *bufWriter - wroteHeader bool + req *request + header http.Header + code int + wroteHeader bool + wroteCGIHeader bool + w *bufWriter } func newResponse(c *child, req *request) *response { @@ -92,11 +94,14 @@ func (r *response) Header() http.Header { return r.header } -func (r *response) Write(data []byte) (int, error) { +func (r *response) Write(p []byte) (n int, err error) { if !r.wroteHeader { r.WriteHeader(http.StatusOK) } - return r.w.Write(data) + if !r.wroteCGIHeader { + r.writeCGIHeader(p) + } + return r.w.Write(p) } func (r *response) WriteHeader(code int) { @@ -104,22 +109,34 @@ func (r *response) WriteHeader(code int) { return } r.wroteHeader = true + r.code = code if code == http.StatusNotModified { // Must not have body. r.header.Del("Content-Type") r.header.Del("Content-Length") r.header.Del("Transfer-Encoding") - } else if r.header.Get("Content-Type") == "" { - r.header.Set("Content-Type", "text/html; charset=utf-8") } - if r.header.Get("Date") == "" { r.header.Set("Date", time.Now().UTC().Format(http.TimeFormat)) } +} - fmt.Fprintf(r.w, "Status: %d %s\r\n", code, http.StatusText(code)) +// writeCGIHeader finalizes the header sent to the client and writes it to the output. +// p is not written by writeHeader, but is the first chunk of the body +// that will be written. It is sniffed for a Content-Type if none is +// set explicitly. +func (r *response) writeCGIHeader(p []byte) { + if r.wroteCGIHeader { + return + } + r.wroteCGIHeader = true + fmt.Fprintf(r.w, "Status: %d %s\r\n", r.code, http.StatusText(r.code)) + if _, hasType := r.header["Content-Type"]; r.code != http.StatusNotModified && !hasType { + r.header.Set("Content-Type", http.DetectContentType(p)) + } r.header.Write(r.w) r.w.WriteString("\r\n") + r.w.Flush() } func (r *response) Flush() { @@ -293,6 +310,8 @@ func (c *child) serveRequest(req *request, body io.ReadCloser) { httpReq = httpReq.WithContext(envVarCtx) c.handler.ServeHTTP(r, httpReq) } + // Make sure we serve something even if nothing was written to r + r.Write(nil) r.Close() c.mu.Lock() delete(c.requests, req.reqId) diff --git a/src/net/http/fcgi/fcgi_test.go b/src/net/http/fcgi/fcgi_test.go index e9d2b34023..4a27a12c35 100644 --- a/src/net/http/fcgi/fcgi_test.go +++ b/src/net/http/fcgi/fcgi_test.go @@ -10,6 +10,7 @@ import ( "io" "io/ioutil" "net/http" + "strings" "testing" ) @@ -344,3 +345,54 @@ func TestChildServeReadsEnvVars(t *testing.T) { <-done } } + +func TestResponseWriterSniffsContentType(t *testing.T) { + var tests = []struct { + name string + body string + wantCT string + }{ + { + name: "no body", + wantCT: "text/plain; charset=utf-8", + }, + { + name: "html", + body: "test pageThis is a body", + wantCT: "text/html; charset=utf-8", + }, + { + name: "text", + body: strings.Repeat("gopher", 86), + wantCT: "text/plain; charset=utf-8", + }, + { + name: "jpg", + body: "\xFF\xD8\xFF" + strings.Repeat("B", 1024), + wantCT: "image/jpeg", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + input := make([]byte, len(streamFullRequestStdin)) + copy(input, streamFullRequestStdin) + rc := nopWriteCloser{bytes.NewBuffer(input)} + done := make(chan bool) + var resp *response + c := newChild(rc, http.HandlerFunc(func( + w http.ResponseWriter, + r *http.Request, + ) { + io.WriteString(w, tt.body) + resp = w.(*response) + done <- true + })) + defer c.cleanUp() + go 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) + } + }) + } +} -- GitLab From 86dbeefe1f2770daad3c8d8b46a8b7f21b2c69e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Mon, 14 Sep 2020 13:06:40 +0200 Subject: [PATCH 0480/1792] syscall: fix fsync for read-only files on aix AIX fsync syscall doesn't work on read-only files. Using fsync_range instead allows syscall.Fsync to work on any files. Fixes #41372 Change-Id: I66d33e847875496af53da60828c1bddf6c2b76b7 Reviewed-on: https://go-review.googlesource.com/c/go/+/254657 Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Tobias Klauser Reviewed-by: Ian Lance Taylor --- src/syscall/syscall_aix.go | 6 +++++- src/syscall/zsyscall_aix_ppc64.go | 26 +++++++++++++------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go index 8bb5fa9ead..8837dd5a7f 100644 --- a/src/syscall/syscall_aix.go +++ b/src/syscall/syscall_aix.go @@ -214,6 +214,11 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, return } +//sys fsyncRange(fd int, how int, start int64, length int64) (err error) = fsync_range +func Fsync(fd int) error { + return fsyncRange(fd, O_SYNC, 0, 0) +} + /* * Socket */ @@ -600,7 +605,6 @@ func PtraceDetach(pid int) (err error) { return ptrace64(PT_DETACH, int64(pid), //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, buf *Statfs_t) (err error) //sys Ftruncate(fd int, length int64) (err error) -//sys Fsync(fd int) (err error) //sysnb Getgid() (gid int) //sysnb Getpid() (pid int) //sys Geteuid() (euid int) diff --git a/src/syscall/zsyscall_aix_ppc64.go b/src/syscall/zsyscall_aix_ppc64.go index 384fead4d2..20625c1a3e 100644 --- a/src/syscall/zsyscall_aix_ppc64.go +++ b/src/syscall/zsyscall_aix_ppc64.go @@ -19,6 +19,7 @@ import "unsafe" //go:cgo_import_dynamic libc_setgroups setgroups "libc.a/shr_64.o" //go:cgo_import_dynamic libc_getdirent getdirent "libc.a/shr_64.o" //go:cgo_import_dynamic libc_wait4 wait4 "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fsync_range fsync_range "libc.a/shr_64.o" //go:cgo_import_dynamic libc_bind bind "libc.a/shr_64.o" //go:cgo_import_dynamic libc_connect connect "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Getkerninfo getkerninfo "libc.a/shr_64.o" @@ -54,7 +55,6 @@ import "unsafe" //go:cgo_import_dynamic libc_Fstat fstat "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Fstatfs fstatfs "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Ftruncate ftruncate "libc.a/shr_64.o" -//go:cgo_import_dynamic libc_Fsync fsync "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Getgid getgid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Getpid getpid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Geteuid geteuid "libc.a/shr_64.o" @@ -111,6 +111,7 @@ import "unsafe" //go:linkname libc_setgroups libc_setgroups //go:linkname libc_getdirent libc_getdirent //go:linkname libc_wait4 libc_wait4 +//go:linkname libc_fsync_range libc_fsync_range //go:linkname libc_bind libc_bind //go:linkname libc_connect libc_connect //go:linkname libc_Getkerninfo libc_Getkerninfo @@ -146,7 +147,6 @@ import "unsafe" //go:linkname libc_Fstat libc_Fstat //go:linkname libc_Fstatfs libc_Fstatfs //go:linkname libc_Ftruncate libc_Ftruncate -//go:linkname libc_Fsync libc_Fsync //go:linkname libc_Getgid libc_Getgid //go:linkname libc_Getpid libc_Getpid //go:linkname libc_Geteuid libc_Geteuid @@ -206,6 +206,7 @@ var ( libc_setgroups, libc_getdirent, libc_wait4, + libc_fsync_range, libc_bind, libc_connect, libc_Getkerninfo, @@ -241,7 +242,6 @@ var ( libc_Fstat, libc_Fstatfs, libc_Ftruncate, - libc_Fsync, libc_Getgid, libc_Getpid, libc_Geteuid, @@ -442,6 +442,16 @@ func wait4(pid _Pid_t, status *_C_int, options int, rusage *Rusage) (wpid _Pid_t // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fsyncRange(fd int, how int, start int64, length int64) (err error) { + _, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_fsync_range)), 4, uintptr(fd), uintptr(how), uintptr(start), uintptr(length), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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 := syscall6(uintptr(unsafe.Pointer(&libc_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) if e1 != 0 { @@ -854,16 +864,6 @@ func Ftruncate(fd int, length int64) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fsync(fd int) (err error) { - _, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_Fsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getgid() (gid int) { r0, _, _ := rawSyscall6(uintptr(unsafe.Pointer(&libc_Getgid)), 0, 0, 0, 0, 0, 0, 0) gid = int(r0) -- GitLab From c0c396bd6ad2aea40f7f302711c8b89e20feb371 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 11 Sep 2020 20:09:40 -0400 Subject: [PATCH 0481/1792] misc/ios: quote paths The paths may contain spaces. Quote them. Change-Id: I1f67085a1e7c40f60282c2fea7104fb44a01e310 Reviewed-on: https://go-review.googlesource.com/c/go/+/254739 Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov Trust: Dmitri Shuralyov --- misc/ios/clangwrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/ios/clangwrap.sh b/misc/ios/clangwrap.sh index 5fdbb6db4a..1d6dee28a8 100755 --- a/misc/ios/clangwrap.sh +++ b/misc/ios/clangwrap.sh @@ -15,4 +15,4 @@ else exit 1 fi -exec $CLANG -arch $CLANGARCH -isysroot $SDK_PATH -mios-version-min=10.0 "$@" +exec "$CLANG" -arch $CLANGARCH -isysroot "$SDK_PATH" -mios-version-min=10.0 "$@" -- GitLab From 14c7caae5074fdf0d97a3ad995e20c63e4065cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20M=C3=B6hrmann?= Date: Mon, 13 Jul 2020 18:12:20 +0200 Subject: [PATCH 0482/1792] runtime: add 24 byte allocation size class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL introduces a 24 byte allocation size class which fits 3 pointers on 64 bit and 6 pointers on 32 bit architectures. Notably this new size class fits a slice header on 64 bit architectures exactly while previously a 32 byte size class would have been used for allocating a slice header on the heap. The main complexity added with this CL is that heapBitsSetType needs to handle objects that aren't 16-byte aligned but contain more than a single pointer on 64-bit architectures. Due to having a non 16 byte aligned size class on 32 bit a h.shift of 2 is now possible which means a heap bitmap byte might only be partially written. Due to this already having been possible on 64 bit before the heap bitmap code only needed minor adjustments for 32 bit doublecheck code paths. Note that this CL changes the slice capacity allocated by append for slice growth to a target capacity of 17 to 24 bytes. On 64 bit architectures the capacity of the slice returned by append([]byte{}, make([]byte, 24)...)) is 32 bytes before and 24 bytes after this CL. Depending on allocation patterns of the specific Go program this can increase the number of total alloctions as subsequent appends to the slice can trigger slice growth earlier than before. On the other side if the slice is never appended to again above its capacity this will lower heap usage by 8 bytes. This CL changes the set of size classes reported in the runtime.MemStats.BySize array due to it being limited to a total of 61 size classes. The new 24 byte size class is now included and the 20480 byte size class is not included anymore. Fixes #8885 name old time/op new time/op delta Template 196ms ± 3% 194ms ± 2% ~ (p=0.247 n=10+10) Unicode 85.6ms ±16% 88.1ms ± 1% ~ (p=0.165 n=10+10) GoTypes 673ms ± 2% 668ms ± 2% ~ (p=0.258 n=9+9) Compiler 3.14s ± 6% 3.08s ± 1% ~ (p=0.243 n=10+9) SSA 6.82s ± 1% 6.76s ± 1% -0.87% (p=0.006 n=9+10) Flate 128ms ± 7% 127ms ± 3% ~ (p=0.739 n=10+10) GoParser 154ms ± 3% 153ms ± 4% ~ (p=0.730 n=9+9) Reflect 404ms ± 1% 412ms ± 4% +1.99% (p=0.022 n=9+10) Tar 172ms ± 4% 170ms ± 4% ~ (p=0.065 n=10+9) XML 231ms ± 4% 230ms ± 3% ~ (p=0.912 n=10+10) LinkCompiler 341ms ± 1% 339ms ± 1% ~ (p=0.243 n=9+10) ExternalLinkCompiler 1.72s ± 1% 1.72s ± 1% ~ (p=0.661 n=9+10) LinkWithoutDebugCompiler 221ms ± 2% 221ms ± 2% ~ (p=0.529 n=10+10) StdCmd 18.4s ± 3% 18.2s ± 1% ~ (p=0.515 n=10+8) name old user-time/op new user-time/op delta Template 238ms ± 4% 243ms ± 6% ~ (p=0.661 n=9+10) Unicode 116ms ± 6% 113ms ± 3% -3.37% (p=0.035 n=9+10) GoTypes 854ms ± 2% 848ms ± 2% ~ (p=0.604 n=9+10) Compiler 4.10s ± 1% 4.11s ± 1% ~ (p=0.481 n=8+9) SSA 9.49s ± 1% 9.41s ± 1% -0.92% (p=0.001 n=9+10) Flate 149ms ± 6% 151ms ± 7% ~ (p=0.481 n=10+10) GoParser 189ms ± 2% 190ms ± 2% ~ (p=0.497 n=9+10) Reflect 511ms ± 2% 508ms ± 2% ~ (p=0.211 n=9+10) Tar 215ms ± 4% 212ms ± 3% ~ (p=0.105 n=10+10) XML 288ms ± 2% 288ms ± 2% ~ (p=0.971 n=10+10) LinkCompiler 559ms ± 4% 557ms ± 1% ~ (p=0.968 n=9+10) ExternalLinkCompiler 1.78s ± 1% 1.77s ± 1% ~ (p=0.055 n=8+10) LinkWithoutDebugCompiler 245ms ± 3% 245ms ± 2% ~ (p=0.684 n=10+10) name old alloc/op new alloc/op delta Template 34.8MB ± 0% 34.4MB ± 0% -0.95% (p=0.000 n=9+10) Unicode 28.6MB ± 0% 28.3MB ± 0% -0.95% (p=0.000 n=10+10) GoTypes 115MB ± 0% 114MB ± 0% -1.02% (p=0.000 n=10+9) Compiler 554MB ± 0% 549MB ± 0% -0.86% (p=0.000 n=9+10) SSA 1.28GB ± 0% 1.27GB ± 0% -0.83% (p=0.000 n=10+10) Flate 21.8MB ± 0% 21.6MB ± 0% -0.87% (p=0.000 n=8+10) GoParser 26.7MB ± 0% 26.4MB ± 0% -0.97% (p=0.000 n=10+9) Reflect 75.0MB ± 0% 74.1MB ± 0% -1.18% (p=0.000 n=10+10) Tar 32.6MB ± 0% 32.3MB ± 0% -0.94% (p=0.000 n=10+7) XML 41.5MB ± 0% 41.2MB ± 0% -0.90% (p=0.000 n=10+8) LinkCompiler 105MB ± 0% 104MB ± 0% -0.94% (p=0.000 n=10+10) ExternalLinkCompiler 153MB ± 0% 152MB ± 0% -0.69% (p=0.000 n=10+10) LinkWithoutDebugCompiler 63.7MB ± 0% 63.6MB ± 0% -0.13% (p=0.000 n=10+10) name old allocs/op new allocs/op delta Template 336k ± 0% 336k ± 0% +0.02% (p=0.002 n=10+10) Unicode 332k ± 0% 332k ± 0% ~ (p=0.447 n=10+10) GoTypes 1.16M ± 0% 1.16M ± 0% +0.01% (p=0.001 n=10+10) Compiler 4.92M ± 0% 4.92M ± 0% +0.01% (p=0.000 n=10+10) SSA 11.9M ± 0% 11.9M ± 0% +0.02% (p=0.000 n=9+10) Flate 214k ± 0% 214k ± 0% +0.02% (p=0.032 n=10+8) GoParser 270k ± 0% 270k ± 0% +0.02% (p=0.004 n=10+9) Reflect 877k ± 0% 877k ± 0% +0.01% (p=0.000 n=10+10) Tar 313k ± 0% 313k ± 0% ~ (p=0.075 n=9+10) XML 387k ± 0% 387k ± 0% +0.02% (p=0.007 n=10+10) LinkCompiler 455k ± 0% 456k ± 0% +0.08% (p=0.000 n=10+9) ExternalLinkCompiler 670k ± 0% 671k ± 0% +0.06% (p=0.000 n=10+10) LinkWithoutDebugCompiler 113k ± 0% 113k ± 0% ~ (p=0.149 n=10+10) name old maxRSS/op new maxRSS/op delta Template 34.1M ± 1% 34.1M ± 1% ~ (p=0.853 n=10+10) Unicode 35.1M ± 1% 34.6M ± 1% -1.43% (p=0.000 n=10+10) GoTypes 72.8M ± 3% 73.3M ± 2% ~ (p=0.724 n=10+10) Compiler 288M ± 3% 295M ± 4% ~ (p=0.393 n=10+10) SSA 630M ± 1% 622M ± 1% -1.18% (p=0.001 n=10+10) Flate 26.0M ± 1% 26.2M ± 2% ~ (p=0.493 n=10+10) GoParser 28.6M ± 1% 28.5M ± 2% ~ (p=0.256 n=10+10) Reflect 55.5M ± 2% 55.4M ± 1% ~ (p=0.436 n=10+10) Tar 33.0M ± 1% 32.8M ± 2% ~ (p=0.075 n=10+10) XML 38.7M ± 1% 39.0M ± 1% ~ (p=0.053 n=9+10) LinkCompiler 164M ± 1% 164M ± 1% -0.27% (p=0.029 n=10+10) ExternalLinkCompiler 174M ± 0% 173M ± 0% -0.33% (p=0.002 n=9+10) LinkWithoutDebugCompiler 137M ± 0% 136M ± 2% ~ (p=0.825 n=9+10) Change-Id: I9ecf2a10024513abef8fbfbe519e44e0b29b6167 Reviewed-on: https://go-review.googlesource.com/c/go/+/242258 Trust: Martin Möhrmann Trust: Michael Knyszek Run-TryBot: Martin Möhrmann TryBot-Result: Go Bot Reviewed-by: Michael Knyszek Reviewed-by: Keith Randall --- src/runtime/mbitmap.go | 112 ++++++++++++++++++++++++---- src/runtime/mksizeclasses.go | 6 +- src/runtime/mstats.go | 4 + src/runtime/sizeclasses.go | 141 ++++++++++++++++++----------------- 4 files changed, 174 insertions(+), 89 deletions(-) diff --git a/src/runtime/mbitmap.go b/src/runtime/mbitmap.go index 8de44c14b9..51c3625c3d 100644 --- a/src/runtime/mbitmap.go +++ b/src/runtime/mbitmap.go @@ -30,10 +30,9 @@ // indicates scanning can ignore the rest of the allocation. // // The 2-bit entries are split when written into the byte, so that the top half -// of the byte contains 4 high bits and the bottom half contains 4 low (pointer) -// bits. -// This form allows a copy from the 1-bit to the 4-bit form to keep the -// pointer bits contiguous, instead of having to space them out. +// of the byte contains 4 high (scan) bits and the bottom half contains 4 low +// (pointer) bits. This form allows a copy from the 1-bit to the 4-bit form to +// keep the pointer bits contiguous, instead of having to space them out. // // The code makes use of the fact that the zero value for a heap // bitmap means scalar/dead. This property must be preserved when @@ -816,6 +815,12 @@ func (s *mspan) countAlloc() int { func heapBitsSetType(x, size, dataSize uintptr, typ *_type) { const doubleCheck = false // slow but helpful; enable to test modifications to this code + const ( + mask1 = bitPointer | bitScan // 00010001 + mask2 = bitPointer | bitScan | mask1<> 1 + + // For h.shift > 1 heap bits cross a byte boundary and need to be written part + // to h.bitp and part to the next h.bitp. + switch h.shift { + case 0: + *h.bitp &^= mask3 << 0 + *h.bitp |= hb << 0 + case 1: + *h.bitp &^= mask3 << 1 + *h.bitp |= hb << 1 + case 2: + *h.bitp &^= mask2 << 2 + *h.bitp |= (hb & mask2) << 2 + // Two words written to the first byte. + // Advance two words to get to the next byte. + h = h.next().next() + *h.bitp &^= mask1 + *h.bitp |= (hb >> 2) & mask1 + case 3: + *h.bitp &^= mask1 << 3 + *h.bitp |= (hb & mask1) << 3 + // One word written to the first byte. + // Advance one word to get to the next byte. + h = h.next() + *h.bitp &^= mask2 + *h.bitp |= (hb >> 1) & mask2 + } + return } // Copy from 1-bit ptrmask into 2-bit bitmap. @@ -1079,7 +1149,7 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) { // word must be set to scan since there are pointers // somewhere in the object. // In all following words, we set the scan/dead - // appropriately to indicate that the object contains + // appropriately to indicate that the object continues // to the next 2-bit entry in the bitmap. // // We set four bits at a time here, but if the object @@ -1095,12 +1165,22 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) { b >>= 4 nb -= 4 - case sys.PtrSize == 8 && h.shift == 2: + case h.shift == 2: // Ptrmask and heap bitmap are misaligned. + // + // On 32 bit architectures only the 6-word object that corresponds + // to a 24 bytes size class can start with h.shift of 2 here since + // all other non 16 byte aligned size classes have been handled by + // special code paths at the beginning of heapBitsSetType on 32 bit. + // + // Many size classes are only 16 byte aligned. On 64 bit architectures + // this results in a heap bitmap position starting with a h.shift of 2. + // // The bits for the first two words are in a byte shared // with another object, so we must be careful with the bits // already there. - // We took care of 1-word and 2-word objects above, + // + // We took care of 1-word, 2-word, and 3-word objects above, // so this is at least a 6-word object. hb = (b & (bitPointer | bitPointer<= nw { - // We know that there is more data, because we handled 2-word objects above. + // We know that there is more data, because we handled 2-word and 3-word objects above. // This must be at least a 6-word object. If we're out of pointer words, // mark no scan in next bitmap byte and finish. hb = 0 @@ -1248,12 +1328,12 @@ Phase4: // Handle the first byte specially if it's shared. See // Phase 1 for why this is the only special case we need. if doubleCheck { - if !(h.shift == 0 || (sys.PtrSize == 8 && h.shift == 2)) { + if !(h.shift == 0 || h.shift == 2) { print("x=", x, " size=", size, " cnw=", h.shift, "\n") throw("bad start shift") } } - if sys.PtrSize == 8 && h.shift == 2 { + if h.shift == 2 { *h.bitp = *h.bitp&^((bitPointer|bitScan|(bitPointer|bitScan)<= 128 { align = size / 8 - } else if size >= 16 { - align = 16 // required for x86 SSE instructions, if we want to use them + } else if size >= 32 { + align = 16 // heap bitmaps assume 16 byte alignment for allocations >= 32 bytes. } } if !powerOfTwo(align) { @@ -157,7 +157,7 @@ func makeClasses() []class { } } - if len(classes) != 67 { + if len(classes) != 68 { panic("number of size classes has changed") } diff --git a/src/runtime/mstats.go b/src/runtime/mstats.go index 6a8a34d1ed..b95b332134 100644 --- a/src/runtime/mstats.go +++ b/src/runtime/mstats.go @@ -78,6 +78,10 @@ type mstats struct { nfree uint64 } + // Add an uint32 for even number of size classes to align below fields + // to 64 bits for atomic operations on 32 bit platforms. + _ [1 - _NumSizeClasses%2]uint32 + // Statistics below here are not exported to MemStats directly. last_gc_nanotime uint64 // last gc (monotonic time) diff --git a/src/runtime/sizeclasses.go b/src/runtime/sizeclasses.go index 9c1b44fe0b..c5521ce1bd 100644 --- a/src/runtime/sizeclasses.go +++ b/src/runtime/sizeclasses.go @@ -6,82 +6,83 @@ package runtime // class bytes/obj bytes/span objects tail waste max waste // 1 8 8192 1024 0 87.50% // 2 16 8192 512 0 43.75% -// 3 32 8192 256 0 46.88% -// 4 48 8192 170 32 31.52% -// 5 64 8192 128 0 23.44% -// 6 80 8192 102 32 19.07% -// 7 96 8192 85 32 15.95% -// 8 112 8192 73 16 13.56% -// 9 128 8192 64 0 11.72% -// 10 144 8192 56 128 11.82% -// 11 160 8192 51 32 9.73% -// 12 176 8192 46 96 9.59% -// 13 192 8192 42 128 9.25% -// 14 208 8192 39 80 8.12% -// 15 224 8192 36 128 8.15% -// 16 240 8192 34 32 6.62% -// 17 256 8192 32 0 5.86% -// 18 288 8192 28 128 12.16% -// 19 320 8192 25 192 11.80% -// 20 352 8192 23 96 9.88% -// 21 384 8192 21 128 9.51% -// 22 416 8192 19 288 10.71% -// 23 448 8192 18 128 8.37% -// 24 480 8192 17 32 6.82% -// 25 512 8192 16 0 6.05% -// 26 576 8192 14 128 12.33% -// 27 640 8192 12 512 15.48% -// 28 704 8192 11 448 13.93% -// 29 768 8192 10 512 13.94% -// 30 896 8192 9 128 15.52% -// 31 1024 8192 8 0 12.40% -// 32 1152 8192 7 128 12.41% -// 33 1280 8192 6 512 15.55% -// 34 1408 16384 11 896 14.00% -// 35 1536 8192 5 512 14.00% -// 36 1792 16384 9 256 15.57% -// 37 2048 8192 4 0 12.45% -// 38 2304 16384 7 256 12.46% -// 39 2688 8192 3 128 15.59% -// 40 3072 24576 8 0 12.47% -// 41 3200 16384 5 384 6.22% -// 42 3456 24576 7 384 8.83% -// 43 4096 8192 2 0 15.60% -// 44 4864 24576 5 256 16.65% -// 45 5376 16384 3 256 10.92% -// 46 6144 24576 4 0 12.48% -// 47 6528 32768 5 128 6.23% -// 48 6784 40960 6 256 4.36% -// 49 6912 49152 7 768 3.37% -// 50 8192 8192 1 0 15.61% -// 51 9472 57344 6 512 14.28% -// 52 9728 49152 5 512 3.64% -// 53 10240 40960 4 0 4.99% -// 54 10880 32768 3 128 6.24% -// 55 12288 24576 2 0 11.45% -// 56 13568 40960 3 256 9.99% -// 57 14336 57344 4 0 5.35% -// 58 16384 16384 1 0 12.49% -// 59 18432 73728 4 0 11.11% -// 60 19072 57344 3 128 3.57% -// 61 20480 40960 2 0 6.87% -// 62 21760 65536 3 256 6.25% -// 63 24576 24576 1 0 11.45% -// 64 27264 81920 3 128 10.00% -// 65 28672 57344 2 0 4.91% -// 66 32768 32768 1 0 12.50% +// 3 24 8192 341 8 29.24% +// 4 32 8192 256 0 21.88% +// 5 48 8192 170 32 31.52% +// 6 64 8192 128 0 23.44% +// 7 80 8192 102 32 19.07% +// 8 96 8192 85 32 15.95% +// 9 112 8192 73 16 13.56% +// 10 128 8192 64 0 11.72% +// 11 144 8192 56 128 11.82% +// 12 160 8192 51 32 9.73% +// 13 176 8192 46 96 9.59% +// 14 192 8192 42 128 9.25% +// 15 208 8192 39 80 8.12% +// 16 224 8192 36 128 8.15% +// 17 240 8192 34 32 6.62% +// 18 256 8192 32 0 5.86% +// 19 288 8192 28 128 12.16% +// 20 320 8192 25 192 11.80% +// 21 352 8192 23 96 9.88% +// 22 384 8192 21 128 9.51% +// 23 416 8192 19 288 10.71% +// 24 448 8192 18 128 8.37% +// 25 480 8192 17 32 6.82% +// 26 512 8192 16 0 6.05% +// 27 576 8192 14 128 12.33% +// 28 640 8192 12 512 15.48% +// 29 704 8192 11 448 13.93% +// 30 768 8192 10 512 13.94% +// 31 896 8192 9 128 15.52% +// 32 1024 8192 8 0 12.40% +// 33 1152 8192 7 128 12.41% +// 34 1280 8192 6 512 15.55% +// 35 1408 16384 11 896 14.00% +// 36 1536 8192 5 512 14.00% +// 37 1792 16384 9 256 15.57% +// 38 2048 8192 4 0 12.45% +// 39 2304 16384 7 256 12.46% +// 40 2688 8192 3 128 15.59% +// 41 3072 24576 8 0 12.47% +// 42 3200 16384 5 384 6.22% +// 43 3456 24576 7 384 8.83% +// 44 4096 8192 2 0 15.60% +// 45 4864 24576 5 256 16.65% +// 46 5376 16384 3 256 10.92% +// 47 6144 24576 4 0 12.48% +// 48 6528 32768 5 128 6.23% +// 49 6784 40960 6 256 4.36% +// 50 6912 49152 7 768 3.37% +// 51 8192 8192 1 0 15.61% +// 52 9472 57344 6 512 14.28% +// 53 9728 49152 5 512 3.64% +// 54 10240 40960 4 0 4.99% +// 55 10880 32768 3 128 6.24% +// 56 12288 24576 2 0 11.45% +// 57 13568 40960 3 256 9.99% +// 58 14336 57344 4 0 5.35% +// 59 16384 16384 1 0 12.49% +// 60 18432 73728 4 0 11.11% +// 61 19072 57344 3 128 3.57% +// 62 20480 40960 2 0 6.87% +// 63 21760 65536 3 256 6.25% +// 64 24576 24576 1 0 11.45% +// 65 27264 81920 3 128 10.00% +// 66 28672 57344 2 0 4.91% +// 67 32768 32768 1 0 12.50% const ( _MaxSmallSize = 32768 smallSizeDiv = 8 smallSizeMax = 1024 largeSizeDiv = 128 - _NumSizeClasses = 67 + _NumSizeClasses = 68 _PageShift = 13 ) -var class_to_size = [_NumSizeClasses]uint16{0, 8, 16, 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} -var class_to_allocnpages = [_NumSizeClasses]uint8{0, 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, 2, 1, 2, 1, 2, 1, 3, 2, 3, 1, 3, 2, 3, 4, 5, 6, 1, 7, 6, 5, 4, 3, 5, 7, 2, 9, 7, 5, 8, 3, 10, 7, 4} +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} +var class_to_allocnpages = [_NumSizeClasses]uint8{0, 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, 2, 1, 2, 1, 2, 1, 3, 2, 3, 1, 3, 2, 3, 4, 5, 6, 1, 7, 6, 5, 4, 3, 5, 7, 2, 9, 7, 5, 8, 3, 10, 7, 4} type divMagic struct { shift uint8 @@ -90,6 +91,6 @@ type divMagic struct { baseMask uint16 } -var class_to_divmagic = [_NumSizeClasses]divMagic{{0, 0, 0, 0}, {3, 0, 1, 65528}, {4, 0, 1, 65520}, {5, 0, 1, 65504}, {4, 11, 683, 0}, {6, 0, 1, 65472}, {4, 10, 205, 0}, {5, 9, 171, 0}, {4, 11, 293, 0}, {7, 0, 1, 65408}, {4, 13, 911, 0}, {5, 10, 205, 0}, {4, 12, 373, 0}, {6, 9, 171, 0}, {4, 13, 631, 0}, {5, 11, 293, 0}, {4, 13, 547, 0}, {8, 0, 1, 65280}, {5, 9, 57, 0}, {6, 9, 103, 0}, {5, 12, 373, 0}, {7, 7, 43, 0}, {5, 10, 79, 0}, {6, 10, 147, 0}, {5, 11, 137, 0}, {9, 0, 1, 65024}, {6, 9, 57, 0}, {7, 9, 103, 0}, {6, 11, 187, 0}, {8, 7, 43, 0}, {7, 8, 37, 0}, {10, 0, 1, 64512}, {7, 9, 57, 0}, {8, 6, 13, 0}, {7, 11, 187, 0}, {9, 5, 11, 0}, {8, 8, 37, 0}, {11, 0, 1, 63488}, {8, 9, 57, 0}, {7, 10, 49, 0}, {10, 5, 11, 0}, {7, 10, 41, 0}, {7, 9, 19, 0}, {12, 0, 1, 61440}, {8, 9, 27, 0}, {8, 10, 49, 0}, {11, 5, 11, 0}, {7, 13, 161, 0}, {7, 13, 155, 0}, {8, 9, 19, 0}, {13, 0, 1, 57344}, {8, 12, 111, 0}, {9, 9, 27, 0}, {11, 6, 13, 0}, {7, 14, 193, 0}, {12, 3, 3, 0}, {8, 13, 155, 0}, {11, 8, 37, 0}, {14, 0, 1, 49152}, {11, 8, 29, 0}, {7, 13, 55, 0}, {12, 5, 7, 0}, {8, 14, 193, 0}, {13, 3, 3, 0}, {7, 14, 77, 0}, {12, 7, 19, 0}, {15, 0, 1, 32768}} -var size_to_class8 = [smallSizeMax/smallSizeDiv + 1]uint8{0, 1, 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, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31} -var size_to_class128 = [(_MaxSmallSize-smallSizeMax)/largeSizeDiv + 1]uint8{31, 32, 33, 34, 35, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 47, 47, 47, 48, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66} +var class_to_divmagic = [_NumSizeClasses]divMagic{{0, 0, 0, 0}, {3, 0, 1, 65528}, {4, 0, 1, 65520}, {3, 11, 683, 0}, {5, 0, 1, 65504}, {4, 11, 683, 0}, {6, 0, 1, 65472}, {4, 10, 205, 0}, {5, 9, 171, 0}, {4, 11, 293, 0}, {7, 0, 1, 65408}, {4, 13, 911, 0}, {5, 10, 205, 0}, {4, 12, 373, 0}, {6, 9, 171, 0}, {4, 13, 631, 0}, {5, 11, 293, 0}, {4, 13, 547, 0}, {8, 0, 1, 65280}, {5, 9, 57, 0}, {6, 9, 103, 0}, {5, 12, 373, 0}, {7, 7, 43, 0}, {5, 10, 79, 0}, {6, 10, 147, 0}, {5, 11, 137, 0}, {9, 0, 1, 65024}, {6, 9, 57, 0}, {7, 9, 103, 0}, {6, 11, 187, 0}, {8, 7, 43, 0}, {7, 8, 37, 0}, {10, 0, 1, 64512}, {7, 9, 57, 0}, {8, 6, 13, 0}, {7, 11, 187, 0}, {9, 5, 11, 0}, {8, 8, 37, 0}, {11, 0, 1, 63488}, {8, 9, 57, 0}, {7, 10, 49, 0}, {10, 5, 11, 0}, {7, 10, 41, 0}, {7, 9, 19, 0}, {12, 0, 1, 61440}, {8, 9, 27, 0}, {8, 10, 49, 0}, {11, 5, 11, 0}, {7, 13, 161, 0}, {7, 13, 155, 0}, {8, 9, 19, 0}, {13, 0, 1, 57344}, {8, 12, 111, 0}, {9, 9, 27, 0}, {11, 6, 13, 0}, {7, 14, 193, 0}, {12, 3, 3, 0}, {8, 13, 155, 0}, {11, 8, 37, 0}, {14, 0, 1, 49152}, {11, 8, 29, 0}, {7, 13, 55, 0}, {12, 5, 7, 0}, {8, 14, 193, 0}, {13, 3, 3, 0}, {7, 14, 77, 0}, {12, 7, 19, 0}, {15, 0, 1, 32768}} +var size_to_class8 = [smallSizeMax/smallSizeDiv + 1]uint8{0, 1, 2, 3, 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, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32} +var size_to_class128 = [(_MaxSmallSize-smallSizeMax)/largeSizeDiv + 1]uint8{32, 33, 34, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 48, 48, 48, 49, 49, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67} -- GitLab From 57646534297a9bd193e6aaa4239c98984f371b97 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 14 Sep 2020 10:19:47 -0400 Subject: [PATCH 0483/1792] cmd/api: omit outside dependencies when listing the packages in "std" As of CL 251159, when 'go list -deps std' is run within GOROOT/src, it treats the vendored external dependencies as real module dependencies, not standard-library "vendor/" packages (which still exist in that case, but are treated as distinct packages outside the "std" module). Fixes #41358 Updates #30241 Change-Id: Ic23eae9829d90e74a340d49ca9052e9191597410 Reviewed-on: https://go-review.googlesource.com/c/go/+/254738 Run-TryBot: Bryan C. Mills Trust: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- src/cmd/api/goapi.go | 17 +++++++++++++---- src/cmd/api/goapi_test.go | 13 +++++++++++++ src/cmd/go/internal/modload/load.go | 8 ++++++-- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index 01b17b8839..6a80ed269b 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -87,7 +87,10 @@ var contexts = []*build.Context{ func contextName(c *build.Context) string { s := c.GOOS + "-" + c.GOARCH if c.CgoEnabled { - return s + "-cgo" + s += "-cgo" + } + if c.Dir != "" { + s += fmt.Sprintf(" [%s]", c.Dir) } return s } @@ -478,6 +481,9 @@ func (w *Walker) loadImports() { 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) @@ -491,6 +497,7 @@ func (w *Walker) loadImports() { var pkg struct { ImportPath, Dir string ImportMap map[string]string + Standard bool } err := dec.Decode(&pkg) if err == io.EOF { @@ -503,11 +510,13 @@ func (w *Walker) loadImports() { // - 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. + // - 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; ip != "unsafe" && !strings.HasPrefix(ip, "vendor/") && !internalPkg.MatchString(ip) { + if ip := pkg.ImportPath; pkg.Standard && ip != "unsafe" && !strings.HasPrefix(ip, "vendor/") && !internalPkg.MatchString(ip) { stdPackages = append(stdPackages, ip) } importDir[pkg.ImportPath] = pkg.Dir diff --git a/src/cmd/api/goapi_test.go b/src/cmd/api/goapi_test.go index eaccc5ceb5..24620a94af 100644 --- a/src/cmd/api/goapi_test.go +++ b/src/cmd/api/goapi_test.go @@ -216,3 +216,16 @@ func TestIssue29837(t *testing.T) { } } } + +func TestIssue41358(t *testing.T) { + context := new(build.Context) + *context = build.Default + context.Dir = filepath.Join(context.GOROOT, "src") + + w := NewWalker(context, context.Dir) + for _, pkg := range w.stdPackages { + if strings.HasPrefix(pkg, "vendor/") || strings.HasPrefix(pkg, "golang.org/x/") { + t.Fatalf("stdPackages contains unexpected package %s", pkg) + } + } +} diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 1664d8c5be..2fe68e6f88 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -1106,8 +1106,12 @@ func (ld *loader) stdVendor(parentPath, path string) string { // Do the same for importers beginning with the prefix 'vendor/' even if we // are *inside* of the 'std' module: the 'vendor/' packages that resolve // globally from GOROOT/src/vendor (and are listed as part of 'go list std') - // are distinct from the real module dependencies, and cannot import internal - // packages from the real module. + // are distinct from the real module dependencies, and cannot import + // internal packages from the real module. + // + // (Note that although the 'vendor/' packages match the 'std' *package* + // pattern, they are not part of the std *module*, and do not affect + // 'go mod tidy' and similar module commands when working within std.) vendorPath := pathpkg.Join("vendor", path) if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil { return vendorPath -- GitLab From a408139bb0166f6e0a5d9fd17fc934da960c354e Mon Sep 17 00:00:00 2001 From: Changkun Ou Date: Mon, 14 Sep 2020 10:24:59 +0200 Subject: [PATCH 0484/1792] testing: fix panicking tests hang if Cleanup calls FailNow Previously, it was impossible to call FailNow in a Cleanup. Because it can terminate a panicking goroutine and cause its parent hangs on t.signal channel. This CL sends the signal in a deferred call to prevent the hang. Fixes #41355 Change-Id: I4552d3a7ea763ef86817bf9b50c0e37fb34bf20f Reviewed-on: https://go-review.googlesource.com/c/go/+/254637 Reviewed-by: Ian Lance Taylor Reviewed-by: Emmanuel Odeke Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Trust: Emmanuel Odeke --- .../testdata/script/test_cleanup_failnow.txt | 33 +++++++++++++++++++ src/testing/testing.go | 12 ++++++- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/script/test_cleanup_failnow.txt diff --git a/src/cmd/go/testdata/script/test_cleanup_failnow.txt b/src/cmd/go/testdata/script/test_cleanup_failnow.txt new file mode 100644 index 0000000000..5ad4185fc1 --- /dev/null +++ b/src/cmd/go/testdata/script/test_cleanup_failnow.txt @@ -0,0 +1,33 @@ +# For issue 41355 +[short] skip + +! go test -v cleanup_failnow/panic_nocleanup_test.go +stdout '(?s)panic: die \[recovered\].*panic: die' +! stdout '(?s)panic: die \[recovered\].*panic: die.*panic: die' + +! go test -v cleanup_failnow/panic_withcleanup_test.go +stdout '(?s)panic: die \[recovered\].*panic: die' +! stdout '(?s)panic: die \[recovered\].*panic: die.*panic: die' + +-- cleanup_failnow/panic_nocleanup_test.go -- +package panic_nocleanup_test +import "testing" +func TestX(t *testing.T) { + t.Run("x", func(t *testing.T) { + panic("die") + }) +} + +-- cleanup_failnow/panic_withcleanup_test.go -- +package panic_withcleanup_test +import "testing" +func TestCleanupWithFailNow(t *testing.T) { + t.Cleanup(func() { + t.FailNow() + }) + t.Run("x", func(t *testing.T) { + t.Run("y", func(t *testing.T) { + panic("die") + }) + }) +} \ No newline at end of file diff --git a/src/testing/testing.go b/src/testing/testing.go index 66f296234a..d86354093a 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -1075,6 +1075,7 @@ func tRunner(t *T, fn func(t *T)) { // If the test panicked, print any test output before dying. err := recover() signal := true + if !t.finished && err == nil { err = errNilPanicOrGoexit for p := t.parent; p != nil; p = p.parent { @@ -1086,6 +1087,15 @@ func tRunner(t *T, fn func(t *T)) { } } } + // Use a deferred call to ensure that we report that the test is + // complete even if a cleanup function calls t.FailNow. See issue 41355. + didPanic := false + defer func() { + t.signal <- signal + if err != nil && !didPanic { + panic(err) + } + }() doPanic := func(err interface{}) { t.Fail() @@ -1103,6 +1113,7 @@ func tRunner(t *T, fn func(t *T)) { fmt.Fprintf(root.parent.w, "cleanup panicked with %v", r) } } + didPanic = true panic(err) } if err != nil { @@ -1144,7 +1155,6 @@ func tRunner(t *T, fn func(t *T)) { if t.parent != nil && atomic.LoadInt32(&t.hasSub) == 0 { t.setRan() } - t.signal <- signal }() defer func() { if len(t.sub) == 0 { -- GitLab From 114719e16e9681bd1001326598ededa719c17944 Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Mon, 14 Sep 2020 21:00:52 +0000 Subject: [PATCH 0485/1792] Revert "encoding/json: implement Is on all errors" This reverts CL 254537. Reason for revert: Reason for revert: The recommended way to check for a type of error is errors.As. API changes should also start with a proposal. Change-Id: I07c37428575e99c80b17525833a61831d10963bb Reviewed-on: https://go-review.googlesource.com/c/go/+/254857 Trust: Damien Neil Reviewed-by: Emmanuel Odeke --- src/encoding/json/decode.go | 18 ------------------ src/encoding/json/decode_test.go | 31 ------------------------------- src/encoding/json/encode.go | 12 ------------ src/encoding/json/encode_test.go | 24 +----------------------- 4 files changed, 1 insertion(+), 84 deletions(-) diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 1b006ffb17..86d8a69db7 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -136,12 +136,6 @@ func (e *UnmarshalTypeError) Error() string { return "json: cannot unmarshal " + e.Value + " into Go value of type " + e.Type.String() } -// Is returns true if target is a UnmarshalTypeError. -func (e *UnmarshalTypeError) Is(target error) bool { - _, ok := target.(*UnmarshalTypeError) - return ok -} - // An UnmarshalFieldError describes a JSON object key that // led to an unexported (and therefore unwritable) struct field. // @@ -156,24 +150,12 @@ func (e *UnmarshalFieldError) Error() string { return "json: cannot unmarshal object key " + strconv.Quote(e.Key) + " into unexported field " + e.Field.Name + " of type " + e.Type.String() } -// Is returns true if target is a UnmarshalFieldError. -func (e *UnmarshalFieldError) Is(target error) bool { - _, ok := target.(*UnmarshalFieldError) - return ok -} - // An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. // (The argument to Unmarshal must be a non-nil pointer.) type InvalidUnmarshalError struct { Type reflect.Type } -// Is returns true if target is a InvalidUnmarshalError. -func (e *InvalidUnmarshalError) Is(target error) bool { - _, ok := target.(*InvalidUnmarshalError) - return ok -} - func (e *InvalidUnmarshalError) Error() string { if e.Type == nil { return "json: Unmarshal(nil)" diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index b707dcfa99..219e845c7b 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -2572,34 +2572,3 @@ func TestUnmarshalMaxDepth(t *testing.T) { } } } - -func TestInvalidUnmarshalErrorIs(t *testing.T) { - err := fmt.Errorf("apackage: %w: failed to parse struct", &InvalidUnmarshalError{reflect.TypeOf("a")}) - if !errors.Is(err, &InvalidUnmarshalError{}) { - t.Fatalf("%v should be unwrapped to a InvalidUnmarshalError", err) - } -} - -func TestUnmarshalFieldErrorIs(t *testing.T) { - err := fmt.Errorf("apackage: %w: failed to parse struct", &UnmarshalFieldError{ - Key: "foo", - Type: reflect.TypeOf("a"), - Field: reflect.StructField{Name: "b"}, - }) - if !errors.Is(err, &UnmarshalFieldError{}) { - t.Fatalf("%v should be unwrapped to a UnmarshalFieldError", err) - } -} - -func TestUnmarshalTypeErrorIs(t *testing.T) { - err := fmt.Errorf("apackage: %w: failed to parse struct", &UnmarshalTypeError{ - Value: "foo", - Type: reflect.TypeOf("a"), - Offset: 1, - Struct: "Foo", - Field: "Bar", - }) - if !errors.Is(err, &UnmarshalTypeError{}) { - t.Fatalf("%v should be unwrapped to a UnmarshalTypeError", err) - } -} diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index 8e6b342b59..578d551102 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -245,12 +245,6 @@ func (e *UnsupportedValueError) Error() string { return "json: unsupported value: " + e.Str } -// Is returns true if target is a UnsupportedValueError. -func (e *UnsupportedValueError) Is(target error) bool { - _, ok := target.(*UnsupportedValueError) - return ok -} - // Before Go 1.2, an InvalidUTF8Error was returned by Marshal when // attempting to encode a string value with invalid UTF-8 sequences. // As of Go 1.2, Marshal instead coerces the string to valid UTF-8 by @@ -285,12 +279,6 @@ func (e *MarshalerError) Error() string { // Unwrap returns the underlying error. func (e *MarshalerError) Unwrap() error { return e.Err } -// Is returns true if target is a MarshalerError. -func (e *MarshalerError) Is(target error) bool { - _, ok := target.(*MarshalerError) - return ok -} - var hex = "0123456789abcdef" // An encodeState encodes JSON into a bytes.Buffer. diff --git a/src/encoding/json/encode_test.go b/src/encoding/json/encode_test.go index 90826a7f47..7290eca06f 100644 --- a/src/encoding/json/encode_test.go +++ b/src/encoding/json/encode_test.go @@ -7,7 +7,6 @@ package json import ( "bytes" "encoding" - "errors" "fmt" "log" "math" @@ -212,7 +211,7 @@ var unsupportedValues = []interface{}{ func TestUnsupportedValues(t *testing.T) { for _, v := range unsupportedValues { if _, err := Marshal(v); err != nil { - if !errors.Is(err, &UnsupportedValueError{}) { + if _, ok := err.(*UnsupportedValueError); !ok { t.Errorf("for %v, got %T want UnsupportedValueError", v, err) } } else { @@ -1156,24 +1155,3 @@ func TestMarshalerError(t *testing.T) { } } } - -func TestMarshalerErrorIs(t *testing.T) { - err := fmt.Errorf("apackage: %w: failed to parse struct", &MarshalerError{ - reflect.TypeOf("a"), - fmt.Errorf("something"), - "TestMarshalerErrorIs", - }) - if !errors.Is(err, &MarshalerError{}) { - t.Fatalf("%v should be unwrapped to a MarshalerError", err) - } -} - -func TestUnsupportedValueErrorIs(t *testing.T) { - err := fmt.Errorf("apackage: %w: failed to parse struct", &UnsupportedValueError{ - Value: reflect.Value{}, - Str: "Foo", - }) - if !errors.Is(err, &UnsupportedValueError{}) { - t.Fatalf("%v should be unwrapped to a UnsupportedValueError", err) - } -} -- GitLab From 506eb0a9b1a7051f64788f330ea26722fa293f3c Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Mon, 14 Sep 2020 20:59:50 +0000 Subject: [PATCH 0486/1792] Revert "encoding/json: implement Is on SyntaxError" This reverts CL 253037. Reason for revert: The recommended way to check for a type of error is errors.As. API changes should also start with a proposal. Change-Id: I62896717aa47ed491c2c4775d2b05d80e5e9cde3 Reviewed-on: https://go-review.googlesource.com/c/go/+/254837 Trust: Damien Neil Reviewed-by: Emmanuel Odeke --- src/encoding/json/scanner.go | 6 ------ src/encoding/json/scanner_test.go | 9 --------- 2 files changed, 15 deletions(-) diff --git a/src/encoding/json/scanner.go b/src/encoding/json/scanner.go index 05218f9cc3..9dc1903e2d 100644 --- a/src/encoding/json/scanner.go +++ b/src/encoding/json/scanner.go @@ -49,12 +49,6 @@ type SyntaxError struct { func (e *SyntaxError) Error() string { return e.msg } -// Is returns true if target is a SyntaxError. -func (e *SyntaxError) Is(target error) bool { - _, ok := target.(*SyntaxError) - return ok -} - // A scanner is a JSON scanning state machine. // Callers call scan.reset and then pass bytes in one at a time // by calling scan.step(&scan, c) for each byte. diff --git a/src/encoding/json/scanner_test.go b/src/encoding/json/scanner_test.go index c12d9bf3d7..3737516a45 100644 --- a/src/encoding/json/scanner_test.go +++ b/src/encoding/json/scanner_test.go @@ -6,8 +6,6 @@ package json import ( "bytes" - "errors" - "fmt" "math" "math/rand" "reflect" @@ -203,13 +201,6 @@ func TestIndentErrors(t *testing.T) { } } -func TestSyntaxErrorIs(t *testing.T) { - err := fmt.Errorf("apackage: %w: failed to parse struct", &SyntaxError{"some error", 43}) - if !errors.Is(err, &SyntaxError{}) { - t.Fatalf("%v should be unwrapped to a SyntaxError", err) - } -} - func diff(t *testing.T, a, b []byte) { for i := 0; ; i++ { if i >= len(a) || i >= len(b) || a[i] != b[i] { -- GitLab From 237410547bb81ae3c58e9c5bf0cf59edc989e243 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 14 Sep 2020 12:53:36 -0700 Subject: [PATCH 0487/1792] cmd/compile: better dclcontext handling in func{hdr,body} funchdr and funcbody currently assume that either (1) Curfn == nil && dclcontext == PEXTERN, or (2) Curfn != nil && dclcontext == PAUTO. This is a reasonable assumption during parsing. However, these functions end up getting used in other contexts, and not all callers are so disciplined about Curfn/dclcontext handling. This CL changes them to save/restore arbitrary Curfn/dclcontext pairs instead. This is necessary for the followup CL, which pushes fninit earlier. Otherwise, Curfn/dclcontext fall out of sync, and funchdr panics. Passes toolstash-check. Updates #33485. Change-Id: I19b1be23db1bad6475345ae5c81bbdc66291a3a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/254838 Run-TryBot: Matthew Dempsky TryBot-Result: Go Bot Reviewed-by: Keith Randall Trust: Matthew Dempsky --- src/cmd/compile/internal/gc/dcl.go | 28 +++++++++++++--------------- src/cmd/compile/internal/gc/main.go | 3 +++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index 69eb13f607..a362d1a643 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -382,14 +382,11 @@ func ifacedcl(n *Node) { // returns in auto-declaration context. func funchdr(n *Node) { // change the declaration context from extern to auto - if Curfn == nil && dclcontext != PEXTERN { - Fatalf("funchdr: dclcontext = %d", dclcontext) - } - + funcStack = append(funcStack, funcStackEnt{Curfn, dclcontext}) + Curfn = n dclcontext = PAUTO + types.Markdcl() - funcstack = append(funcstack, Curfn) - Curfn = n if n.Func.Nname != nil { funcargs(n.Func.Nname.Name.Param.Ntype) @@ -497,21 +494,22 @@ func funcarg2(f *types.Field, ctxt Class) { declare(n, ctxt) } -var funcstack []*Node // stack of previous values of Curfn +var funcStack []funcStackEnt // stack of previous values of Curfn/dclcontext + +type funcStackEnt struct { + curfn *Node + dclcontext Class +} // finish the body. // called in auto-declaration context. // returns in extern-declaration context. func funcbody() { - // change the declaration context from auto to extern - if dclcontext != PAUTO { - Fatalf("funcbody: unexpected dclcontext %d", dclcontext) - } + // change the declaration context from auto to previous context types.Popdcl() - funcstack, Curfn = funcstack[:len(funcstack)-1], funcstack[len(funcstack)-1] - if Curfn == nil { - dclcontext = PEXTERN - } + var e funcStackEnt + funcStack, e = funcStack[:len(funcStack)-1], funcStack[len(funcStack)-1] + Curfn, dclcontext = e.curfn, e.dclcontext } // structs, functions, and methods. diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index eedfc4bb25..9bce6cf8cb 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -809,6 +809,9 @@ func Main(archInit func(*Arch)) { } } + if len(funcStack) != 0 { + Fatalf("funcStack is non-empty: %v", len(funcStack)) + } if len(compilequeue) != 0 { Fatalf("%d uncompiled functions", len(compilequeue)) } -- GitLab From f4936d09fd5a1fff890d63ee2ab9543243dc4da6 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 14 Sep 2020 12:56:37 -0700 Subject: [PATCH 0488/1792] cmd/compile: call fninit earlier This allows the global initializers function to go through normal mid-end optimizations (e.g., inlining, escape analysis) like any other function. Updates #33485. Change-Id: I9bcfe98b8628d1aca09b4c238d8d3b74c69010a5 Reviewed-on: https://go-review.googlesource.com/c/go/+/254839 Reviewed-by: Keith Randall Trust: Matthew Dempsky --- src/cmd/compile/internal/gc/init.go | 8 +++----- src/cmd/compile/internal/gc/main.go | 6 ++---- test/inline.go | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go index 94cbcf9846..ec9cc4bddc 100644 --- a/src/cmd/compile/internal/gc/init.go +++ b/src/cmd/compile/internal/gc/init.go @@ -59,7 +59,7 @@ func fninit(n []*Node) { Curfn = fn typecheckslice(nf, ctxStmt) Curfn = nil - funccompile(fn) + xtop = append(xtop, fn) fns = append(fns, initializers.Linksym()) } if dummyInitFn.Func.Dcl != nil { @@ -68,16 +68,14 @@ func fninit(n []*Node) { // something's weird if we get here. Fatalf("dummyInitFn still has declarations") } + dummyInitFn = nil // Record user init functions. for i := 0; i < renameinitgen; i++ { s := lookupN("init.", i) fn := asNode(s.Def).Name.Defn // Skip init functions with empty bodies. - // noder.go doesn't allow external init functions, and - // order.go has already removed any OEMPTY nodes, so - // checking Len() == 0 is sufficient here. - if fn.Nbody.Len() == 0 { + if fn.Nbody.Len() == 1 && fn.Nbody.First().Op == OEMPTY { continue } fns = append(fns, s.Linksym()) diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 9bce6cf8cb..8783cb4e46 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -642,6 +642,8 @@ func Main(archInit func(*Arch)) { errorexit() } + fninit(xtop) + // Phase 4: Decide how to capture closed variables. // This needs to run before escape analysis, // because variables captured by value do not escape. @@ -751,10 +753,6 @@ func Main(archInit func(*Arch)) { } timings.AddEvent(fcount, "funcs") - if nsavederrors+nerrors == 0 { - fninit(xtop) - } - compileFunctions() if nowritebarrierrecCheck != nil { diff --git a/test/inline.go b/test/inline.go index 0b3ad55d46..1c5c1bc8d3 100644 --- a/test/inline.go +++ b/test/inline.go @@ -50,7 +50,7 @@ func j(x int) int { // ERROR "can inline j" } } -var somethingWrong error = errors.New("something went wrong") +var somethingWrong error = errors.New("something went wrong") // ERROR "can inline init" "inlining call to errors.New" "errors.errorString.* escapes to heap" // local closures can be inlined func l(x, y int) (int, int, error) { -- GitLab From d20298e1c7d1df794a11ce7768e027c6759df2a4 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Mon, 14 Sep 2020 10:38:45 +0700 Subject: [PATCH 0489/1792] cmd/compile: make funccompile non-reentrant Currently, there's awkward reentrancy issue with funccompile: funccompile -> compile -> dtypesym -> geneq/genhash/genwrapper -> funccompile Though it's not a problem at this moment, some attempts by @mdempsky to move order/walk/instrument into buildssa was failed, due to SSA cache corruption. This commit fixes that reentrancy issue, by making generated functions to be pumped through the same compile workqueue that normal functions are compiled. We do this by adding them to xtop, instead of calling funccompile directly in geneq/genhash/genwrapper. In dumpdata, we look for uncompiled functions in xtop instead of compilequeue, then finish compiling them. Updates #38463 Fixes #33485 Change-Id: Ic9f0ce45b56ae2ff3862f17fd979253ddc144bb5 Reviewed-on: https://go-review.googlesource.com/c/go/+/254617 Run-TryBot: Cuong Manh Le Reviewed-by: Matthew Dempsky TryBot-Result: Go Bot Trust: Keith Randall Trust: Cuong Manh Le --- src/cmd/compile/internal/gc/alg.go | 4 ++-- src/cmd/compile/internal/gc/obj.go | 26 +++++++++++++++++++++++++- src/cmd/compile/internal/gc/subr.go | 2 +- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/alg.go b/src/cmd/compile/internal/gc/alg.go index c9d71ea00b..6302b88f59 100644 --- a/src/cmd/compile/internal/gc/alg.go +++ b/src/cmd/compile/internal/gc/alg.go @@ -392,7 +392,7 @@ func genhash(t *types.Type) *obj.LSym { } fn.Func.SetNilCheckDisabled(true) - funccompile(fn) + xtop = append(xtop, fn) // Build closure. It doesn't close over any variables, so // it contains just the function pointer. @@ -754,7 +754,7 @@ func geneq(t *types.Type) *obj.LSym { // neither of which can be nil, and our comparisons // are shallow. fn.Func.SetNilCheckDisabled(true) - funccompile(fn) + xtop = append(xtop, fn) // Generate a closure which points at the function we just generated. dsymptr(closure, 0, sym.Linksym(), 0) diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index af5037c5a8..b55331a948 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -113,12 +113,16 @@ func dumpCompilerObj(bout *bio.Writer) { func dumpdata() { externs := len(externdcl) + xtops := len(xtop) dumpglobls() addptabs() + exportlistLen := len(exportlist) addsignats(externdcl) dumpsignats() dumptabs() + ptabsLen := len(ptabs) + itabsLen := len(itabs) dumpimportstrings() dumpbasictypes() @@ -129,9 +133,19 @@ func dumpdata() { // number of types in a finite amount of code. // In the typical case, we loop 0 or 1 times. // It was not until issue 24761 that we found any code that required a loop at all. - for len(compilequeue) > 0 { + for { + for i := xtops; i < len(xtop); i++ { + n := xtop[i] + if n.Op == ODCLFUNC { + funccompile(n) + } + } + xtops = len(xtop) compileFunctions() dumpsignats() + if xtops == len(xtop) { + break + } } // Dump extra globals. @@ -149,6 +163,16 @@ func dumpdata() { } addGCLocals() + + if exportlistLen != len(exportlist) { + Fatalf("exportlist changed after compile functions loop") + } + if ptabsLen != len(ptabs) { + Fatalf("ptabs changed after compile functions loop") + } + if itabsLen != len(itabs) { + Fatalf("itabs changed after compile functions loop") + } } func dumpLinkerObj(bout *bio.Writer) { diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index d3ba53ff0c..5a5833d19f 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -1615,7 +1615,7 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym) { escapeFuncs([]*Node{fn}, false) Curfn = nil - funccompile(fn) + xtop = append(xtop, fn) } func paramNnames(ft *types.Type) []*Node { -- GitLab From bae9cf651796db898b1e4bd77a1a47c5f2d7b04d Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 14 Sep 2020 19:24:55 -0700 Subject: [PATCH 0490/1792] test: fix inline.go to pass linux-amd64-noopt Updates #33485. Change-Id: I3330860cdff1e9797466a7630bcdb7792c465b06 Reviewed-on: https://go-review.googlesource.com/c/go/+/254938 Run-TryBot: Matthew Dempsky Reviewed-by: Cuong Manh Le TryBot-Result: Go Bot Trust: Matthew Dempsky --- test/inline.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/inline.go b/test/inline.go index 1c5c1bc8d3..3edcf2edfd 100644 --- a/test/inline.go +++ b/test/inline.go @@ -10,7 +10,6 @@ package foo import ( - "errors" "runtime" "unsafe" ) @@ -50,7 +49,7 @@ func j(x int) int { // ERROR "can inline j" } } -var somethingWrong error = errors.New("something went wrong") // ERROR "can inline init" "inlining call to errors.New" "errors.errorString.* escapes to heap" +var somethingWrong error // local closures can be inlined func l(x, y int) (int, int, error) { -- GitLab From 3b64e6b010775839f2daef4ac3fb607bf1519e05 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 14 Sep 2020 11:06:39 +0200 Subject: [PATCH 0491/1792] internal/poll, internal/syscall/unix, net: enable writev on illumos Illumos supports iovec read/write. Add the writev wrapper to internal/syscall/unix and use it to implement internal/poll.writev for net.(*netFD).writeBuffers. Change-Id: Ie256c2f96aba8e61fb21991788789a049425f792 Reviewed-on: https://go-review.googlesource.com/c/go/+/254638 Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Tobias Klauser --- src/internal/poll/fd_writev_illumos.go | 16 +++++++++++ src/internal/poll/iovec_illumos.go | 16 +++++++++++ src/internal/poll/iovec_unix.go | 13 +++++++++ src/internal/poll/writev.go | 4 +-- src/internal/syscall/unix/writev_illumos.go | 30 +++++++++++++++++++++ src/net/writev_test.go | 2 +- src/net/writev_unix.go | 2 +- 7 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 src/internal/poll/fd_writev_illumos.go create mode 100644 src/internal/poll/iovec_illumos.go create mode 100644 src/internal/poll/iovec_unix.go create mode 100644 src/internal/syscall/unix/writev_illumos.go diff --git a/src/internal/poll/fd_writev_illumos.go b/src/internal/poll/fd_writev_illumos.go new file mode 100644 index 0000000000..1fa47ab1a3 --- /dev/null +++ b/src/internal/poll/fd_writev_illumos.go @@ -0,0 +1,16 @@ +// 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 illumos + +package poll + +import ( + "internal/syscall/unix" + "syscall" +) + +func writev(fd int, iovecs []syscall.Iovec) (uintptr, error) { + return unix.Writev(fd, iovecs) +} diff --git a/src/internal/poll/iovec_illumos.go b/src/internal/poll/iovec_illumos.go new file mode 100644 index 0000000000..057067465b --- /dev/null +++ b/src/internal/poll/iovec_illumos.go @@ -0,0 +1,16 @@ +// 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 illumos + +package poll + +import ( + "syscall" + "unsafe" +) + +func newIovecWithBase(base *byte) syscall.Iovec { + return syscall.Iovec{Base: (*int8)(unsafe.Pointer(base))} +} diff --git a/src/internal/poll/iovec_unix.go b/src/internal/poll/iovec_unix.go new file mode 100644 index 0000000000..6f98947866 --- /dev/null +++ b/src/internal/poll/iovec_unix.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. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package poll + +import "syscall" + +func newIovecWithBase(base *byte) syscall.Iovec { + return syscall.Iovec{Base: base} +} diff --git a/src/internal/poll/writev.go b/src/internal/poll/writev.go index 305e2fd209..0123fc33de 100644 --- a/src/internal/poll/writev.go +++ b/src/internal/poll/writev.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. -// +build darwin dragonfly freebsd linux netbsd openbsd +// +build darwin dragonfly freebsd illumos linux netbsd openbsd package poll @@ -38,7 +38,7 @@ func (fd *FD) Writev(v *[][]byte) (int64, error) { if len(chunk) == 0 { continue } - iovecs = append(iovecs, syscall.Iovec{Base: &chunk[0]}) + iovecs = append(iovecs, newIovecWithBase(&chunk[0])) if fd.IsStream && len(chunk) > 1<<30 { iovecs[len(iovecs)-1].SetLen(1 << 30) break // continue chunk on next writev diff --git a/src/internal/syscall/unix/writev_illumos.go b/src/internal/syscall/unix/writev_illumos.go new file mode 100644 index 0000000000..eb7973d65b --- /dev/null +++ b/src/internal/syscall/unix/writev_illumos.go @@ -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. + +// +build illumos + +package unix + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_writev writev "libc.so" + +//go:linkname procwritev libc_writev + +var procwritev uintptr + +func Writev(fd int, iovs []syscall.Iovec) (uintptr, error) { + var p *syscall.Iovec + if len(iovs) > 0 { + p = &iovs[0] + } + n, _, errno := syscall6(uintptr(unsafe.Pointer(&procwritev)), 3, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(len(iovs)), 0, 0, 0) + if errno != 0 { + return 0, errno + } + return n, nil +} diff --git a/src/net/writev_test.go b/src/net/writev_test.go index c43be84418..d6dce3cc69 100644 --- a/src/net/writev_test.go +++ b/src/net/writev_test.go @@ -154,7 +154,7 @@ func testBuffer_writeTo(t *testing.T, chunks int, useCopy bool) { var wantSum int switch runtime.GOOS { - case "android", "darwin", "dragonfly", "freebsd", "linux", "netbsd", "openbsd": + case "android", "darwin", "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd": var wantMinCalls int wantSum = want.Len() v := chunks diff --git a/src/net/writev_unix.go b/src/net/writev_unix.go index bf0fbf8a13..8b20f42b34 100644 --- a/src/net/writev_unix.go +++ b/src/net/writev_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. -// +build darwin dragonfly freebsd linux netbsd openbsd +// +build darwin dragonfly freebsd illumos linux netbsd openbsd package net -- GitLab From ea33523877e4c7a136f2db94a8b5bc4e40220be2 Mon Sep 17 00:00:00 2001 From: Xiangdong Ji Date: Tue, 8 Sep 2020 09:55:20 +0000 Subject: [PATCH 0492/1792] cmd/compile: rewrite some ARM64 rules to use typed aux Passes toolstash-check -all. Change-Id: I7ec36bc048f3031c8201107e6fc5d1257271dbf1 Reviewed-on: https://go-review.googlesource.com/c/go/+/234379 Run-TryBot: Alberto Donizetti TryBot-Result: Go Bot Trust: Alberto Donizetti Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/ARM64.rules | 496 +++++----- src/cmd/compile/internal/ssa/rewriteARM64.go | 912 +++++++++---------- 2 files changed, 704 insertions(+), 704 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 311067e87a..c4a3532632 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -1116,280 +1116,280 @@ // if a register move has only 1 use, just use the same register without emitting instruction // MOVDnop doesn't emit instruction, only for ensuring the type. -(MOVDreg x) && x.Uses == 1 -> (MOVDnop x) +(MOVDreg x) && x.Uses == 1 => (MOVDnop x) // fold constant into arithmatic 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) -(TSTW x (MOVDconst [c])) -> (TSTWconst [c] x) -(CMN x (MOVDconst [c])) -> (CMNconst [c] x) -(CMNW x (MOVDconst [c])) -> (CMNWconst [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]) // Note: I don't think we ever generate bad constant shifts (i.e. c>=64) -(SRL x (MOVDconst [c])) -> (SRLconst x [c&63]) -(SRA x (MOVDconst [c])) -> (SRAconst x [c&63]) - -(CMP x (MOVDconst [c])) -> (CMPconst [c] x) -(CMP (MOVDconst [c]) x) -> (InvertFlags (CMPconst [c] x)) +(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) +(TSTW x (MOVDconst [c])) => (TSTWconst [int32(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) + +(SLL x (MOVDconst [c])) => (SLLconst x [c&63]) // Note: I don't think we ever generate bad constant shifts (i.e. c>=64) +(SRL x (MOVDconst [c])) => (SRLconst x [c&63]) +(SRA x (MOVDconst [c])) => (SRAconst x [c&63]) + +(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)) // Canonicalize the order of arguments to comparisons - helps with CSE. -((CMP|CMPW) x y) && x.ID > y.ID -> (InvertFlags ((CMP|CMPW) y x)) +((CMP|CMPW) x y) && x.ID > y.ID => (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) +// 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) // madd/msub -(ADD a l:(MUL x y)) && l.Uses==1 && clobber(l) -> (MADD a x y) -(SUB a l:(MUL x y)) && l.Uses==1 && clobber(l) -> (MSUB a x y) -(ADD a l:(MNEG x y)) && l.Uses==1 && clobber(l) -> (MSUB a x y) -(SUB a l:(MNEG x y)) && l.Uses==1 && clobber(l) -> (MADD a x y) +(ADD a l:(MUL x y)) && l.Uses==1 && clobber(l) => (MADD a x y) +(SUB a l:(MUL x y)) && l.Uses==1 && clobber(l) => (MSUB a x y) +(ADD a l:(MNEG x y)) && l.Uses==1 && clobber(l) => (MSUB a x y) +(SUB a l:(MNEG x y)) && l.Uses==1 && clobber(l) => (MADD a x y) -(ADD a l:(MULW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) -> (MADDW a x y) -(SUB a l:(MULW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) -> (MSUBW a x y) -(ADD a l:(MNEGW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) -> (MSUBW a x y) -(SUB a l:(MNEGW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) -> (MADDW a x y) +(ADD a l:(MULW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) => (MADDW a x y) +(SUB a l:(MULW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) => (MSUBW a x y) +(ADD a l:(MNEGW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) => (MSUBW a x y) +(SUB a l:(MNEGW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) => (MADDW a x y) // optimize ADCSflags, SBCSflags and friends -(ADCSflags x y (Select1 (ADDSconstflags [-1] (ADCzerocarry c)))) -> (ADCSflags x y c) -(ADCSflags x y (Select1 (ADDSconstflags [-1] (MOVDconst [0])))) -> (ADDSflags x y) -(SBCSflags x y (Select1 (NEGSflags (NEG (NGCzerocarry bo))))) -> (SBCSflags x y bo) -(SBCSflags x y (Select1 (NEGSflags (MOVDconst [0])))) -> (SUBSflags x y) +(ADCSflags x y (Select1 (ADDSconstflags [-1] (ADCzerocarry c)))) => (ADCSflags x y c) +(ADCSflags x y (Select1 (ADDSconstflags [-1] (MOVDconst [0])))) => (ADDSflags x y) +(SBCSflags x y (Select1 (NEGSflags (NEG (NGCzerocarry bo))))) => (SBCSflags x y bo) +(SBCSflags x y (Select1 (NEGSflags (MOVDconst [0])))) => (SUBSflags x y) // mul by constant -(MUL x (MOVDconst [-1])) -> (NEG x) -(MUL _ (MOVDconst [0])) -> (MOVDconst [0]) -(MUL x (MOVDconst [1])) -> x -(MUL x (MOVDconst [c])) && isPowerOfTwo(c) -> (SLLconst [log2(c)] x) -(MUL x (MOVDconst [c])) && isPowerOfTwo(c-1) && c >= 3 -> (ADDshiftLL x x [log2(c-1)]) -(MUL x (MOVDconst [c])) && isPowerOfTwo(c+1) && c >= 7 -> (ADDshiftLL (NEG x) x [log2(c+1)]) -(MUL x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) -> (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) -(MUL x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) -> (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) -(MUL x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) -> (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) -(MUL x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) -> (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) - -(MULW x (MOVDconst [c])) && int32(c)==-1 -> (NEG x) -(MULW _ (MOVDconst [c])) && int32(c)==0 -> (MOVDconst [0]) -(MULW x (MOVDconst [c])) && int32(c)==1 -> x -(MULW x (MOVDconst [c])) && isPowerOfTwo(c) -> (SLLconst [log2(c)] x) -(MULW x (MOVDconst [c])) && isPowerOfTwo(c-1) && int32(c) >= 3 -> (ADDshiftLL x x [log2(c-1)]) -(MULW x (MOVDconst [c])) && isPowerOfTwo(c+1) && int32(c) >= 7 -> (ADDshiftLL (NEG x) x [log2(c+1)]) -(MULW x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) -> (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) -(MULW x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) -> (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) -(MULW x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) -> (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) -(MULW x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) -> (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) +(MUL x (MOVDconst [-1])) => (NEG x) +(MUL _ (MOVDconst [0])) => (MOVDconst [0]) +(MUL x (MOVDconst [1])) => x +(MUL x (MOVDconst [c])) && isPowerOfTwo(c) => (SLLconst [log2(c)] x) +(MUL x (MOVDconst [c])) && isPowerOfTwo(c-1) && c >= 3 => (ADDshiftLL x x [log2(c-1)]) +(MUL x (MOVDconst [c])) && isPowerOfTwo(c+1) && c >= 7 => (ADDshiftLL (NEG x) x [log2(c+1)]) +(MUL x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) => (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) +(MUL x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) => (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) +(MUL x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) => (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) +(MUL x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) => (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) + +(MULW x (MOVDconst [c])) && int32(c)==-1 => (NEG x) +(MULW _ (MOVDconst [c])) && int32(c)==0 => (MOVDconst [0]) +(MULW x (MOVDconst [c])) && int32(c)==1 => x +(MULW x (MOVDconst [c])) && isPowerOfTwo(c) => (SLLconst [log2(c)] x) +(MULW x (MOVDconst [c])) && isPowerOfTwo(c-1) && int32(c) >= 3 => (ADDshiftLL x x [log2(c-1)]) +(MULW x (MOVDconst [c])) && isPowerOfTwo(c+1) && int32(c) >= 7 => (ADDshiftLL (NEG x) x [log2(c+1)]) +(MULW x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) => (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) +(MULW x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) => (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) +(MULW x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) => (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) +(MULW x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) => (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) // mneg by constant -(MNEG x (MOVDconst [-1])) -> x -(MNEG _ (MOVDconst [0])) -> (MOVDconst [0]) -(MNEG x (MOVDconst [1])) -> (NEG x) -(MNEG x (MOVDconst [c])) && isPowerOfTwo(c) -> (NEG (SLLconst [log2(c)] x)) -(MNEG x (MOVDconst [c])) && isPowerOfTwo(c-1) && c >= 3 -> (NEG (ADDshiftLL x x [log2(c-1)])) -(MNEG x (MOVDconst [c])) && isPowerOfTwo(c+1) && c >= 7 -> (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) -(MNEG x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) -> (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) -(MNEG x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) -> (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) -(MNEG x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) -> (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) -(MNEG x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) -> (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) - -(MNEGW x (MOVDconst [c])) && int32(c)==-1 -> x -(MNEGW _ (MOVDconst [c])) && int32(c)==0 -> (MOVDconst [0]) -(MNEGW x (MOVDconst [c])) && int32(c)==1 -> (NEG x) -(MNEGW x (MOVDconst [c])) && isPowerOfTwo(c) -> (NEG (SLLconst [log2(c)] x)) -(MNEGW x (MOVDconst [c])) && isPowerOfTwo(c-1) && int32(c) >= 3 -> (NEG (ADDshiftLL x x [log2(c-1)])) -(MNEGW x (MOVDconst [c])) && isPowerOfTwo(c+1) && int32(c) >= 7 -> (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) -(MNEGW x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) -> (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) -(MNEGW x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) -> (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) -(MNEGW x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) -> (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) -(MNEGW x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) -> (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) - -(MADD a x (MOVDconst [-1])) -> (SUB a x) -(MADD a _ (MOVDconst [0])) -> a -(MADD a x (MOVDconst [1])) -> (ADD a x) -(MADD a x (MOVDconst [c])) && isPowerOfTwo(c) -> (ADDshiftLL a x [log2(c)]) -(MADD a x (MOVDconst [c])) && isPowerOfTwo(c-1) && c>=3 -> (ADD a (ADDshiftLL x x [log2(c-1)])) -(MADD a x (MOVDconst [c])) && isPowerOfTwo(c+1) && c>=7 -> (SUB a (SUBshiftLL x x [log2(c+1)])) -(MADD a x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) -> (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) -(MADD a x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) -> (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) -(MADD a x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) -> (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) -(MADD a x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) -> (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - -(MADD a (MOVDconst [-1]) x) -> (SUB a x) -(MADD a (MOVDconst [0]) _) -> a -(MADD a (MOVDconst [1]) x) -> (ADD a x) -(MADD a (MOVDconst [c]) x) && isPowerOfTwo(c) -> (ADDshiftLL a x [log2(c)]) -(MADD a (MOVDconst [c]) x) && isPowerOfTwo(c-1) && c>=3 -> (ADD a (ADDshiftLL x x [log2(c-1)])) -(MADD a (MOVDconst [c]) x) && isPowerOfTwo(c+1) && c>=7 -> (SUB a (SUBshiftLL x x [log2(c+1)])) -(MADD a (MOVDconst [c]) x) && c%3 == 0 && isPowerOfTwo(c/3) -> (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) -(MADD a (MOVDconst [c]) x) && c%5 == 0 && isPowerOfTwo(c/5) -> (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) -(MADD a (MOVDconst [c]) x) && c%7 == 0 && isPowerOfTwo(c/7) -> (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) -(MADD a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo(c/9) -> (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - -(MADDW a x (MOVDconst [c])) && int32(c)==-1 -> (SUB a x) -(MADDW a _ (MOVDconst [c])) && int32(c)==0 -> a -(MADDW a x (MOVDconst [c])) && int32(c)==1 -> (ADD a x) -(MADDW a x (MOVDconst [c])) && isPowerOfTwo(c) -> (ADDshiftLL a x [log2(c)]) -(MADDW a x (MOVDconst [c])) && isPowerOfTwo(c-1) && int32(c)>=3 -> (ADD a (ADDshiftLL x x [log2(c-1)])) -(MADDW a x (MOVDconst [c])) && isPowerOfTwo(c+1) && int32(c)>=7 -> (SUB a (SUBshiftLL x x [log2(c+1)])) -(MADDW a x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) -> (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) -(MADDW a x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) -> (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) -(MADDW a x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) -> (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) -(MADDW a x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) -> (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - -(MADDW a (MOVDconst [c]) x) && int32(c)==-1 -> (SUB a x) -(MADDW a (MOVDconst [c]) _) && int32(c)==0 -> a -(MADDW a (MOVDconst [c]) x) && int32(c)==1 -> (ADD a x) -(MADDW a (MOVDconst [c]) x) && isPowerOfTwo(c) -> (ADDshiftLL a x [log2(c)]) -(MADDW a (MOVDconst [c]) x) && isPowerOfTwo(c-1) && int32(c)>=3 -> (ADD a (ADDshiftLL x x [log2(c-1)])) -(MADDW a (MOVDconst [c]) x) && isPowerOfTwo(c+1) && int32(c)>=7 -> (SUB a (SUBshiftLL x x [log2(c+1)])) -(MADDW a (MOVDconst [c]) x) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) -> (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) -(MADDW a (MOVDconst [c]) x) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) -> (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) -(MADDW a (MOVDconst [c]) x) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) -> (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) -(MADDW a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) -> (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - -(MSUB a x (MOVDconst [-1])) -> (ADD a x) -(MSUB a _ (MOVDconst [0])) -> a -(MSUB a x (MOVDconst [1])) -> (SUB a x) -(MSUB a x (MOVDconst [c])) && isPowerOfTwo(c) -> (SUBshiftLL a x [log2(c)]) -(MSUB a x (MOVDconst [c])) && isPowerOfTwo(c-1) && c>=3 -> (SUB a (ADDshiftLL x x [log2(c-1)])) -(MSUB a x (MOVDconst [c])) && isPowerOfTwo(c+1) && c>=7 -> (ADD a (SUBshiftLL x x [log2(c+1)])) -(MSUB a x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) -> (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) -(MSUB a x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) -> (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) -(MSUB a x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) -> (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) -(MSUB a x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) -> (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - -(MSUB a (MOVDconst [-1]) x) -> (ADD a x) -(MSUB a (MOVDconst [0]) _) -> a -(MSUB a (MOVDconst [1]) x) -> (SUB a x) -(MSUB a (MOVDconst [c]) x) && isPowerOfTwo(c) -> (SUBshiftLL a x [log2(c)]) -(MSUB a (MOVDconst [c]) x) && isPowerOfTwo(c-1) && c>=3 -> (SUB a (ADDshiftLL x x [log2(c-1)])) -(MSUB a (MOVDconst [c]) x) && isPowerOfTwo(c+1) && c>=7 -> (ADD a (SUBshiftLL x x [log2(c+1)])) -(MSUB a (MOVDconst [c]) x) && c%3 == 0 && isPowerOfTwo(c/3) -> (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) -(MSUB a (MOVDconst [c]) x) && c%5 == 0 && isPowerOfTwo(c/5) -> (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) -(MSUB a (MOVDconst [c]) x) && c%7 == 0 && isPowerOfTwo(c/7) -> (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) -(MSUB a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo(c/9) -> (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - -(MSUBW a x (MOVDconst [c])) && int32(c)==-1 -> (ADD a x) -(MSUBW a _ (MOVDconst [c])) && int32(c)==0 -> a -(MSUBW a x (MOVDconst [c])) && int32(c)==1 -> (SUB a x) -(MSUBW a x (MOVDconst [c])) && isPowerOfTwo(c) -> (SUBshiftLL a x [log2(c)]) -(MSUBW a x (MOVDconst [c])) && isPowerOfTwo(c-1) && int32(c)>=3 -> (SUB a (ADDshiftLL x x [log2(c-1)])) -(MSUBW a x (MOVDconst [c])) && isPowerOfTwo(c+1) && int32(c)>=7 -> (ADD a (SUBshiftLL x x [log2(c+1)])) -(MSUBW a x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) -> (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) -(MSUBW a x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) -> (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) -(MSUBW a x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) -> (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) -(MSUBW a x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) -> (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) - -(MSUBW a (MOVDconst [c]) x) && int32(c)==-1 -> (ADD a x) -(MSUBW a (MOVDconst [c]) _) && int32(c)==0 -> a -(MSUBW a (MOVDconst [c]) x) && int32(c)==1 -> (SUB a x) -(MSUBW a (MOVDconst [c]) x) && isPowerOfTwo(c) -> (SUBshiftLL a x [log2(c)]) -(MSUBW a (MOVDconst [c]) x) && isPowerOfTwo(c-1) && int32(c)>=3 -> (SUB a (ADDshiftLL x x [log2(c-1)])) -(MSUBW a (MOVDconst [c]) x) && isPowerOfTwo(c+1) && int32(c)>=7 -> (ADD a (SUBshiftLL x x [log2(c+1)])) -(MSUBW a (MOVDconst [c]) x) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) -> (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) -(MSUBW a (MOVDconst [c]) x) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) -> (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) -(MSUBW a (MOVDconst [c]) x) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) -> (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) -(MSUBW a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) -> (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) +(MNEG x (MOVDconst [-1])) => x +(MNEG _ (MOVDconst [0])) => (MOVDconst [0]) +(MNEG x (MOVDconst [1])) => (NEG x) +(MNEG x (MOVDconst [c])) && isPowerOfTwo(c) => (NEG (SLLconst [log2(c)] x)) +(MNEG x (MOVDconst [c])) && isPowerOfTwo(c-1) && c >= 3 => (NEG (ADDshiftLL x x [log2(c-1)])) +(MNEG x (MOVDconst [c])) && isPowerOfTwo(c+1) && c >= 7 => (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) +(MNEG x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) => (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) +(MNEG x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) => (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) +(MNEG x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) => (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) +(MNEG x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) => (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) + +(MNEGW x (MOVDconst [c])) && int32(c)==-1 => x +(MNEGW _ (MOVDconst [c])) && int32(c)==0 => (MOVDconst [0]) +(MNEGW x (MOVDconst [c])) && int32(c)==1 => (NEG x) +(MNEGW x (MOVDconst [c])) && isPowerOfTwo(c) => (NEG (SLLconst [log2(c)] x)) +(MNEGW x (MOVDconst [c])) && isPowerOfTwo(c-1) && int32(c) >= 3 => (NEG (ADDshiftLL x x [log2(c-1)])) +(MNEGW x (MOVDconst [c])) && isPowerOfTwo(c+1) && int32(c) >= 7 => (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) +(MNEGW x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) => (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) +(MNEGW x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) => (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) +(MNEGW x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) => (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) +(MNEGW x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) => (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) + +(MADD a x (MOVDconst [-1])) => (SUB a x) +(MADD a _ (MOVDconst [0])) => a +(MADD a x (MOVDconst [1])) => (ADD a x) +(MADD a x (MOVDconst [c])) && isPowerOfTwo(c) => (ADDshiftLL a x [log2(c)]) +(MADD a x (MOVDconst [c])) && isPowerOfTwo(c-1) && c>=3 => (ADD a (ADDshiftLL x x [log2(c-1)])) +(MADD a x (MOVDconst [c])) && isPowerOfTwo(c+1) && c>=7 => (SUB a (SUBshiftLL x x [log2(c+1)])) +(MADD a x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) => (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) +(MADD a x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) => (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) +(MADD a x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) => (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) +(MADD a x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) => (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + +(MADD a (MOVDconst [-1]) x) => (SUB a x) +(MADD a (MOVDconst [0]) _) => a +(MADD a (MOVDconst [1]) x) => (ADD a x) +(MADD a (MOVDconst [c]) x) && isPowerOfTwo(c) => (ADDshiftLL a x [log2(c)]) +(MADD a (MOVDconst [c]) x) && isPowerOfTwo(c-1) && c>=3 => (ADD a (ADDshiftLL x x [log2(c-1)])) +(MADD a (MOVDconst [c]) x) && isPowerOfTwo(c+1) && c>=7 => (SUB a (SUBshiftLL x x [log2(c+1)])) +(MADD a (MOVDconst [c]) x) && c%3 == 0 && isPowerOfTwo(c/3) => (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) +(MADD a (MOVDconst [c]) x) && c%5 == 0 && isPowerOfTwo(c/5) => (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) +(MADD a (MOVDconst [c]) x) && c%7 == 0 && isPowerOfTwo(c/7) => (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) +(MADD a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo(c/9) => (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + +(MADDW a x (MOVDconst [c])) && int32(c)==-1 => (SUB a x) +(MADDW a _ (MOVDconst [c])) && int32(c)==0 => a +(MADDW a x (MOVDconst [c])) && int32(c)==1 => (ADD a x) +(MADDW a x (MOVDconst [c])) && isPowerOfTwo(c) => (ADDshiftLL a x [log2(c)]) +(MADDW a x (MOVDconst [c])) && isPowerOfTwo(c-1) && int32(c)>=3 => (ADD a (ADDshiftLL x x [log2(c-1)])) +(MADDW a x (MOVDconst [c])) && isPowerOfTwo(c+1) && int32(c)>=7 => (SUB a (SUBshiftLL x x [log2(c+1)])) +(MADDW a x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) => (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) +(MADDW a x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) => (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) +(MADDW a x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) => (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) +(MADDW a x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) => (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + +(MADDW a (MOVDconst [c]) x) && int32(c)==-1 => (SUB a x) +(MADDW a (MOVDconst [c]) _) && int32(c)==0 => a +(MADDW a (MOVDconst [c]) x) && int32(c)==1 => (ADD a x) +(MADDW a (MOVDconst [c]) x) && isPowerOfTwo(c) => (ADDshiftLL a x [log2(c)]) +(MADDW a (MOVDconst [c]) x) && isPowerOfTwo(c-1) && int32(c)>=3 => (ADD a (ADDshiftLL x x [log2(c-1)])) +(MADDW a (MOVDconst [c]) x) && isPowerOfTwo(c+1) && int32(c)>=7 => (SUB a (SUBshiftLL x x [log2(c+1)])) +(MADDW a (MOVDconst [c]) x) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) => (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) +(MADDW a (MOVDconst [c]) x) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) => (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) +(MADDW a (MOVDconst [c]) x) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) => (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) +(MADDW a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) => (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + +(MSUB a x (MOVDconst [-1])) => (ADD a x) +(MSUB a _ (MOVDconst [0])) => a +(MSUB a x (MOVDconst [1])) => (SUB a x) +(MSUB a x (MOVDconst [c])) && isPowerOfTwo(c) => (SUBshiftLL a x [log2(c)]) +(MSUB a x (MOVDconst [c])) && isPowerOfTwo(c-1) && c>=3 => (SUB a (ADDshiftLL x x [log2(c-1)])) +(MSUB a x (MOVDconst [c])) && isPowerOfTwo(c+1) && c>=7 => (ADD a (SUBshiftLL x x [log2(c+1)])) +(MSUB a x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) => (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) +(MSUB a x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) => (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) +(MSUB a x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) => (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) +(MSUB a x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) => (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + +(MSUB a (MOVDconst [-1]) x) => (ADD a x) +(MSUB a (MOVDconst [0]) _) => a +(MSUB a (MOVDconst [1]) x) => (SUB a x) +(MSUB a (MOVDconst [c]) x) && isPowerOfTwo(c) => (SUBshiftLL a x [log2(c)]) +(MSUB a (MOVDconst [c]) x) && isPowerOfTwo(c-1) && c>=3 => (SUB a (ADDshiftLL x x [log2(c-1)])) +(MSUB a (MOVDconst [c]) x) && isPowerOfTwo(c+1) && c>=7 => (ADD a (SUBshiftLL x x [log2(c+1)])) +(MSUB a (MOVDconst [c]) x) && c%3 == 0 && isPowerOfTwo(c/3) => (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) +(MSUB a (MOVDconst [c]) x) && c%5 == 0 && isPowerOfTwo(c/5) => (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) +(MSUB a (MOVDconst [c]) x) && c%7 == 0 && isPowerOfTwo(c/7) => (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) +(MSUB a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo(c/9) => (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + +(MSUBW a x (MOVDconst [c])) && int32(c)==-1 => (ADD a x) +(MSUBW a _ (MOVDconst [c])) && int32(c)==0 => a +(MSUBW a x (MOVDconst [c])) && int32(c)==1 => (SUB a x) +(MSUBW a x (MOVDconst [c])) && isPowerOfTwo(c) => (SUBshiftLL a x [log2(c)]) +(MSUBW a x (MOVDconst [c])) && isPowerOfTwo(c-1) && int32(c)>=3 => (SUB a (ADDshiftLL x x [log2(c-1)])) +(MSUBW a x (MOVDconst [c])) && isPowerOfTwo(c+1) && int32(c)>=7 => (ADD a (SUBshiftLL x x [log2(c+1)])) +(MSUBW a x (MOVDconst [c])) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) => (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) +(MSUBW a x (MOVDconst [c])) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) => (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) +(MSUBW a x (MOVDconst [c])) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) => (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) +(MSUBW a x (MOVDconst [c])) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) => (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) + +(MSUBW a (MOVDconst [c]) x) && int32(c)==-1 => (ADD a x) +(MSUBW a (MOVDconst [c]) _) && int32(c)==0 => a +(MSUBW a (MOVDconst [c]) x) && int32(c)==1 => (SUB a x) +(MSUBW a (MOVDconst [c]) x) && isPowerOfTwo(c) => (SUBshiftLL a x [log2(c)]) +(MSUBW a (MOVDconst [c]) x) && isPowerOfTwo(c-1) && int32(c)>=3 => (SUB a (ADDshiftLL x x [log2(c-1)])) +(MSUBW a (MOVDconst [c]) x) && isPowerOfTwo(c+1) && int32(c)>=7 => (ADD a (SUBshiftLL x x [log2(c+1)])) +(MSUBW a (MOVDconst [c]) x) && c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) => (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) +(MSUBW a (MOVDconst [c]) x) && c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) => (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) +(MSUBW a (MOVDconst [c]) x) && c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) => (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) +(MSUBW a (MOVDconst [c]) x) && c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) => (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) // div by constant -(UDIV x (MOVDconst [1])) -> x -(UDIV x (MOVDconst [c])) && isPowerOfTwo(c) -> (SRLconst [log2(c)] x) -(UDIVW x (MOVDconst [c])) && uint32(c)==1 -> x -(UDIVW x (MOVDconst [c])) && isPowerOfTwo(c) && is32Bit(c) -> (SRLconst [log2(c)] x) -(UMOD _ (MOVDconst [1])) -> (MOVDconst [0]) -(UMOD x (MOVDconst [c])) && isPowerOfTwo(c) -> (ANDconst [c-1] x) -(UMODW _ (MOVDconst [c])) && uint32(c)==1 -> (MOVDconst [0]) -(UMODW x (MOVDconst [c])) && isPowerOfTwo(c) && is32Bit(c) -> (ANDconst [c-1] x) +(UDIV x (MOVDconst [1])) => x +(UDIV x (MOVDconst [c])) && isPowerOfTwo(c) => (SRLconst [log2(c)] x) +(UDIVW x (MOVDconst [c])) && uint32(c)==1 => x +(UDIVW x (MOVDconst [c])) && isPowerOfTwo(c) && is32Bit(c) => (SRLconst [log2(c)] x) +(UMOD _ (MOVDconst [1])) => (MOVDconst [0]) +(UMOD x (MOVDconst [c])) && isPowerOfTwo(c) => (ANDconst [c-1] x) +(UMODW _ (MOVDconst [c])) && uint32(c)==1 => (MOVDconst [0]) +(UMODW x (MOVDconst [c])) && isPowerOfTwo(c) && is32Bit(c) => (ANDconst [c-1] x) // generic simplifications -(ADD x (NEG y)) -> (SUB x y) -(SUB x x) -> (MOVDconst [0]) -(AND x x) -> x -(OR x x) -> x -(XOR x x) -> (MOVDconst [0]) -(BIC x x) -> (MOVDconst [0]) -(EON x x) -> (MOVDconst [-1]) -(ORN x x) -> (MOVDconst [-1]) -(AND x (MVN y)) -> (BIC x y) -(XOR x (MVN y)) -> (EON x y) -(OR x (MVN y)) -> (ORN x y) -(MVN (XOR x y)) -> (EON x y) +(ADD x (NEG y)) => (SUB x y) +(SUB x x) => (MOVDconst [0]) +(AND x x) => x +(OR x x) => x +(XOR x x) => (MOVDconst [0]) +(BIC x x) => (MOVDconst [0]) +(EON x x) => (MOVDconst [-1]) +(ORN x x) => (MOVDconst [-1]) +(AND x (MVN y)) => (BIC x y) +(XOR x (MVN y)) => (EON x y) +(OR x (MVN y)) => (ORN x y) +(MVN (XOR x y)) => (EON x y) (CSEL [cc] x (MOVDconst [0]) flag) => (CSEL0 [cc] x flag) (CSEL [cc] (MOVDconst [0]) y flag) => (CSEL0 [arm64Negate(cc)] y flag) -(SUB x (SUB y z)) -> (SUB (ADD x z) y) -(SUB (SUB x y) z) -> (SUB x (ADD y z)) +(SUB x (SUB y z)) => (SUB (ADD x z) y) +(SUB (SUB x y) z) => (SUB x (ADD y z)) // remove redundant *const ops -(ADDconst [0] x) -> x -(SUBconst [0] x) -> x -(ANDconst [0] _) -> (MOVDconst [0]) -(ANDconst [-1] x) -> x -(ORconst [0] x) -> x -(ORconst [-1] _) -> (MOVDconst [-1]) -(XORconst [0] x) -> x -(XORconst [-1] x) -> (MVN x) +(ADDconst [0] x) => x +(SUBconst [0] x) => x +(ANDconst [0] _) => (MOVDconst [0]) +(ANDconst [-1] x) => x +(ORconst [0] x) => x +(ORconst [-1] _) => (MOVDconst [-1]) +(XORconst [0] x) => x +(XORconst [-1] x) => (MVN x) // generic constant folding -(ADDconst [c] (MOVDconst [d])) -> (MOVDconst [c+d]) -(ADDconst [c] (ADDconst [d] x)) -> (ADDconst [c+d] x) -(ADDconst [c] (SUBconst [d] x)) -> (ADDconst [c-d] x) -(SUBconst [c] (MOVDconst [d])) -> (MOVDconst [d-c]) -(SUBconst [c] (SUBconst [d] x)) -> (ADDconst [-c-d] x) -(SUBconst [c] (ADDconst [d] x)) -> (ADDconst [-c+d] x) -(SLLconst [c] (MOVDconst [d])) -> (MOVDconst [d< (MOVDconst [int64(uint64(d)>>uint64(c))]) -(SRAconst [c] (MOVDconst [d])) -> (MOVDconst [d>>uint64(c)]) -(MUL (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [c*d]) -(MULW (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [int64(int32(c)*int32(d))]) -(MNEG (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [-c*d]) -(MNEGW (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [-int64(int32(c)*int32(d))]) -(MADD (MOVDconst [c]) x y) -> (ADDconst [c] (MUL x y)) -(MADDW (MOVDconst [c]) x y) -> (ADDconst [c] (MULW x y)) -(MSUB (MOVDconst [c]) x y) -> (ADDconst [c] (MNEG x y)) -(MSUBW (MOVDconst [c]) x y) -> (ADDconst [c] (MNEGW x y)) -(MADD a (MOVDconst [c]) (MOVDconst [d])) -> (ADDconst [c*d] a) -(MADDW a (MOVDconst [c]) (MOVDconst [d])) -> (ADDconst [int64(int32(c)*int32(d))] a) -(MSUB a (MOVDconst [c]) (MOVDconst [d])) -> (SUBconst [c*d] a) -(MSUBW a (MOVDconst [c]) (MOVDconst [d])) -> (SUBconst [int64(int32(c)*int32(d))] a) -(DIV (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [c/d]) -(UDIV (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [int64(uint64(c)/uint64(d))]) -(DIVW (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [int64(int32(c)/int32(d))]) -(UDIVW (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [int64(uint32(c)/uint32(d))]) -(MOD (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [c%d]) -(UMOD (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [int64(uint64(c)%uint64(d))]) -(MODW (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [int64(int32(c)%int32(d))]) -(UMODW (MOVDconst [c]) (MOVDconst [d])) -> (MOVDconst [int64(uint32(c)%uint32(d))]) -(ANDconst [c] (MOVDconst [d])) -> (MOVDconst [c&d]) -(ANDconst [c] (ANDconst [d] x)) -> (ANDconst [c&d] x) -(ANDconst [c] (MOVWUreg x)) -> (ANDconst [c&(1<<32-1)] x) -(ANDconst [c] (MOVHUreg x)) -> (ANDconst [c&(1<<16-1)] x) -(ANDconst [c] (MOVBUreg x)) -> (ANDconst [c&(1<<8-1)] x) -(MOVWUreg (ANDconst [c] x)) -> (ANDconst [c&(1<<32-1)] x) -(MOVHUreg (ANDconst [c] x)) -> (ANDconst [c&(1<<16-1)] x) -(MOVBUreg (ANDconst [c] x)) -> (ANDconst [c&(1<<8-1)] x) -(ORconst [c] (MOVDconst [d])) -> (MOVDconst [c|d]) -(ORconst [c] (ORconst [d] x)) -> (ORconst [c|d] x) -(XORconst [c] (MOVDconst [d])) -> (MOVDconst [c^d]) -(XORconst [c] (XORconst [d] x)) -> (XORconst [c^d] x) -(MVN (MOVDconst [c])) -> (MOVDconst [^c]) -(NEG (MOVDconst [c])) -> (MOVDconst [-c]) -(MOVBreg (MOVDconst [c])) -> (MOVDconst [int64(int8(c))]) -(MOVBUreg (MOVDconst [c])) -> (MOVDconst [int64(uint8(c))]) -(MOVHreg (MOVDconst [c])) -> (MOVDconst [int64(int16(c))]) -(MOVHUreg (MOVDconst [c])) -> (MOVDconst [int64(uint16(c))]) -(MOVWreg (MOVDconst [c])) -> (MOVDconst [int64(int32(c))]) -(MOVWUreg (MOVDconst [c])) -> (MOVDconst [int64(uint32(c))]) -(MOVDreg (MOVDconst [c])) -> (MOVDconst [c]) +(ADDconst [c] (MOVDconst [d])) => (MOVDconst [c+d]) +(ADDconst [c] (ADDconst [d] x)) => (ADDconst [c+d] x) +(ADDconst [c] (SUBconst [d] x)) => (ADDconst [c-d] x) +(SUBconst [c] (MOVDconst [d])) => (MOVDconst [d-c]) +(SUBconst [c] (SUBconst [d] x)) => (ADDconst [-c-d] x) +(SUBconst [c] (ADDconst [d] x)) => (ADDconst [-c+d] x) +(SLLconst [c] (MOVDconst [d])) => (MOVDconst [d< (MOVDconst [int64(uint64(d)>>uint64(c))]) +(SRAconst [c] (MOVDconst [d])) => (MOVDconst [d>>uint64(c)]) +(MUL (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [c*d]) +(MULW (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [int64(int32(c)*int32(d))]) +(MNEG (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [-c*d]) +(MNEGW (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [-int64(int32(c)*int32(d))]) +(MADD (MOVDconst [c]) x y) => (ADDconst [c] (MUL x y)) +(MADDW (MOVDconst [c]) x y) => (ADDconst [c] (MULW x y)) +(MSUB (MOVDconst [c]) x y) => (ADDconst [c] (MNEG x y)) +(MSUBW (MOVDconst [c]) x y) => (ADDconst [c] (MNEGW x y)) +(MADD a (MOVDconst [c]) (MOVDconst [d])) => (ADDconst [c*d] a) +(MADDW a (MOVDconst [c]) (MOVDconst [d])) => (ADDconst [int64(int32(c)*int32(d))] a) +(MSUB a (MOVDconst [c]) (MOVDconst [d])) => (SUBconst [c*d] a) +(MSUBW a (MOVDconst [c]) (MOVDconst [d])) => (SUBconst [int64(int32(c)*int32(d))] a) +(DIV (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [c/d]) +(UDIV (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [int64(uint64(c)/uint64(d))]) +(DIVW (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [int64(int32(c)/int32(d))]) +(UDIVW (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [int64(uint32(c)/uint32(d))]) +(MOD (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [c%d]) +(UMOD (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [int64(uint64(c)%uint64(d))]) +(MODW (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [int64(int32(c)%int32(d))]) +(UMODW (MOVDconst [c]) (MOVDconst [d])) => (MOVDconst [int64(uint32(c)%uint32(d))]) +(ANDconst [c] (MOVDconst [d])) => (MOVDconst [c&d]) +(ANDconst [c] (ANDconst [d] x)) => (ANDconst [c&d] x) +(ANDconst [c] (MOVWUreg x)) => (ANDconst [c&(1<<32-1)] x) +(ANDconst [c] (MOVHUreg x)) => (ANDconst [c&(1<<16-1)] x) +(ANDconst [c] (MOVBUreg x)) => (ANDconst [c&(1<<8-1)] x) +(MOVWUreg (ANDconst [c] x)) => (ANDconst [c&(1<<32-1)] x) +(MOVHUreg (ANDconst [c] x)) => (ANDconst [c&(1<<16-1)] x) +(MOVBUreg (ANDconst [c] x)) => (ANDconst [c&(1<<8-1)] x) +(ORconst [c] (MOVDconst [d])) => (MOVDconst [c|d]) +(ORconst [c] (ORconst [d] x)) => (ORconst [c|d] x) +(XORconst [c] (MOVDconst [d])) => (MOVDconst [c^d]) +(XORconst [c] (XORconst [d] x)) => (XORconst [c^d] x) +(MVN (MOVDconst [c])) => (MOVDconst [^c]) +(NEG (MOVDconst [c])) => (MOVDconst [-c]) +(MOVBreg (MOVDconst [c])) => (MOVDconst [int64(int8(c))]) +(MOVBUreg (MOVDconst [c])) => (MOVDconst [int64(uint8(c))]) +(MOVHreg (MOVDconst [c])) => (MOVDconst [int64(int16(c))]) +(MOVHUreg (MOVDconst [c])) => (MOVDconst [int64(uint16(c))]) +(MOVWreg (MOVDconst [c])) => (MOVDconst [int64(int32(c))]) +(MOVWUreg (MOVDconst [c])) => (MOVDconst [int64(uint32(c))]) +(MOVDreg (MOVDconst [c])) => (MOVDconst [c]) // constant comparisons (CMPconst (MOVDconst [x]) [y]) => (FlagConstant [subFlags64(x,y)]) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 0fb86b6bdd..6c48812121 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -1065,7 +1065,7 @@ func rewriteValueARM64_OpARM64ADCSflags(v *Value) bool { break } v_2_0 := v_2.Args[0] - if v_2_0.Op != OpARM64ADDSconstflags || v_2_0.AuxInt != -1 { + if v_2_0.Op != OpARM64ADDSconstflags || auxIntToInt64(v_2_0.AuxInt) != -1 { break } v_2_0_0 := v_2_0.Args[0] @@ -1086,11 +1086,11 @@ func rewriteValueARM64_OpARM64ADCSflags(v *Value) bool { break } v_2_0 := v_2.Args[0] - if v_2_0.Op != OpARM64ADDSconstflags || v_2_0.AuxInt != -1 { + if v_2_0.Op != OpARM64ADDSconstflags || auxIntToInt64(v_2_0.AuxInt) != -1 { break } v_2_0_0 := v_2_0.Args[0] - if v_2_0_0.Op != OpARM64MOVDconst || v_2_0_0.AuxInt != 0 { + if v_2_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_2_0_0.AuxInt) != 0 { break } v.reset(OpARM64ADDSflags) @@ -1112,9 +1112,9 @@ func rewriteValueARM64_OpARM64ADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ADDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -1593,7 +1593,7 @@ func rewriteValueARM64_OpARM64ADDconst(v *Value) bool { // match: (ADDconst [0] x) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt64(v.AuxInt) != 0 { break } x := v_0 @@ -1603,40 +1603,40 @@ func rewriteValueARM64_OpARM64ADDconst(v *Value) bool { // match: (ADDconst [c] (MOVDconst [d])) // result: (MOVDconst [c+d]) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = c + d + v.AuxInt = int64ToAuxInt(c + d) return true } // match: (ADDconst [c] (ADDconst [d] x)) // result: (ADDconst [c+d] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64ADDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ADDconst) - v.AuxInt = c + d + v.AuxInt = int64ToAuxInt(c + d) v.AddArg(x) return true } // match: (ADDconst [c] (SUBconst [d] x)) // result: (ADDconst [c-d] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SUBconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ADDconst) - v.AuxInt = c - d + v.AuxInt = int64ToAuxInt(c - d) v.AddArg(x) return true } @@ -1882,9 +1882,9 @@ func rewriteValueARM64_OpARM64AND(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ANDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -1988,17 +1988,17 @@ func rewriteValueARM64_OpARM64ANDconst(v *Value) bool { // match: (ANDconst [0] _) // result: (MOVDconst [0]) for { - if v.AuxInt != 0 { + if auxIntToInt64(v.AuxInt) != 0 { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (ANDconst [-1] x) // result: x for { - if v.AuxInt != -1 { + if auxIntToInt64(v.AuxInt) != -1 { break } x := v_0 @@ -2008,65 +2008,65 @@ func rewriteValueARM64_OpARM64ANDconst(v *Value) bool { // match: (ANDconst [c] (MOVDconst [d])) // result: (MOVDconst [c&d]) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = c & d + v.AuxInt = int64ToAuxInt(c & d) return true } // match: (ANDconst [c] (ANDconst [d] x)) // result: (ANDconst [c&d] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64ANDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ANDconst) - v.AuxInt = c & d + v.AuxInt = int64ToAuxInt(c & d) v.AddArg(x) return true } // match: (ANDconst [c] (MOVWUreg x)) // result: (ANDconst [c&(1<<32-1)] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVWUreg { break } x := v_0.Args[0] v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<32 - 1) + v.AuxInt = int64ToAuxInt(c & (1<<32 - 1)) v.AddArg(x) return true } // match: (ANDconst [c] (MOVHUreg x)) // result: (ANDconst [c&(1<<16-1)] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVHUreg { break } x := v_0.Args[0] v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<16 - 1) + v.AuxInt = int64ToAuxInt(c & (1<<16 - 1)) v.AddArg(x) return true } // match: (ANDconst [c] (MOVBUreg x)) // result: (ANDconst [c&(1<<8-1)] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVBUreg { break } x := v_0.Args[0] v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<8 - 1) + v.AuxInt = int64ToAuxInt(c & (1<<8 - 1)) v.AddArg(x) return true } @@ -2280,9 +2280,9 @@ func rewriteValueARM64_OpARM64BIC(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ANDconst) - v.AuxInt = ^c + v.AuxInt = int64ToAuxInt(^c) v.AddArg(x) return true } @@ -2294,7 +2294,7 @@ func rewriteValueARM64_OpARM64BIC(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (BIC x0 x1:(SLLconst [c] y)) @@ -2475,9 +2475,9 @@ func rewriteValueARM64_OpARM64CMN(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64CMNconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -2555,16 +2555,16 @@ func rewriteValueARM64_OpARM64CMNW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (CMNW x (MOVDconst [c])) - // result: (CMNWconst [c] x) + // result: (CMNWconst [int32(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 != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64CMNWconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -2726,9 +2726,9 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64CMPconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -2738,11 +2738,11 @@ func rewriteValueARM64_OpARM64CMP(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) - v0.AuxInt = c + v0.AuxInt = int64ToAuxInt(c) v0.AddArg(x) v.AddArg(v0) return true @@ -3377,13 +3377,13 @@ func rewriteValueARM64_OpARM64DIV(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = c / d + v.AuxInt = int64ToAuxInt(c / d) return true } return false @@ -3397,13 +3397,13 @@ func rewriteValueARM64_OpARM64DIVW(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c) / int32(d)) + v.AuxInt = int64ToAuxInt(int64(int32(c) / int32(d))) return true } return false @@ -3418,9 +3418,9 @@ func rewriteValueARM64_OpARM64EON(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64XORconst) - v.AuxInt = ^c + v.AuxInt = int64ToAuxInt(^c) v.AddArg(x) return true } @@ -3432,7 +3432,7 @@ func rewriteValueARM64_OpARM64EON(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.AuxInt = int64ToAuxInt(-1) return true } // match: (EON x0 x1:(SLLconst [c] y)) @@ -4858,7 +4858,7 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { for { a := v_0 x := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != -1 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != -1 { break } v.reset(OpARM64SUB) @@ -4869,7 +4869,7 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { // result: a for { a := v_0 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } v.copyOf(a) @@ -4880,7 +4880,7 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { for { a := v_0 x := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 1 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 1 { break } v.reset(OpARM64ADD) @@ -4896,12 +4896,12 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg2(a, x) return true } @@ -4914,13 +4914,13 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c-1) && c >= 3) { break } v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -4934,13 +4934,13 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c+1) && c >= 7) { break } v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -4954,14 +4954,14 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -4975,14 +4975,14 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -4996,14 +4996,14 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5017,14 +5017,14 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5033,7 +5033,7 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { // result: (SUB a x) for { a := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != -1 { break } x := v_2 @@ -5045,7 +5045,7 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { // result: a for { a := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 { break } v.copyOf(a) @@ -5055,7 +5055,7 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { // result: (ADD a x) for { a := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { break } x := v_2 @@ -5071,13 +5071,13 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg2(a, x) return true } @@ -5089,14 +5089,14 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c-1) && c >= 3) { break } v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5109,14 +5109,14 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c+1) && c >= 7) { break } v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5129,15 +5129,15 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5150,15 +5150,15 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5171,15 +5171,15 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5192,15 +5192,15 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5211,11 +5211,11 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 y := v_2 v.reset(OpARM64ADDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64MUL, x.Type) v0.AddArg2(x, y) v.AddArg(v0) @@ -5228,13 +5228,13 @@ func rewriteValueARM64_OpARM64MADD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if v_2.Op != OpARM64MOVDconst { break } - d := v_2.AuxInt + d := auxIntToInt64(v_2.AuxInt) v.reset(OpARM64ADDconst) - v.AuxInt = c * d + v.AuxInt = int64ToAuxInt(c * d) v.AddArg(a) return true } @@ -5254,7 +5254,7 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(int32(c) == -1) { break } @@ -5270,7 +5270,7 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(int32(c) == 0) { break } @@ -5286,7 +5286,7 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(int32(c) == 1) { break } @@ -5303,12 +5303,12 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg2(a, x) return true } @@ -5321,13 +5321,13 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5341,13 +5341,13 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5361,14 +5361,14 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5382,14 +5382,14 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5403,14 +5403,14 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5424,14 +5424,14 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5444,7 +5444,7 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(int32(c) == -1) { break @@ -5461,7 +5461,7 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(int32(c) == 0) { break } @@ -5476,7 +5476,7 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(int32(c) == 1) { break @@ -5493,13 +5493,13 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg2(a, x) return true } @@ -5511,14 +5511,14 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5531,14 +5531,14 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5551,15 +5551,15 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5572,15 +5572,15 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5593,15 +5593,15 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5614,15 +5614,15 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -5633,11 +5633,11 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 y := v_2 v.reset(OpARM64ADDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64MULW, x.Type) v0.AddArg2(x, y) v.AddArg(v0) @@ -5650,13 +5650,13 @@ func rewriteValueARM64_OpARM64MADDW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if v_2.Op != OpARM64MOVDconst { break } - d := v_2.AuxInt + d := auxIntToInt64(v_2.AuxInt) v.reset(OpARM64ADDconst) - v.AuxInt = int64(int32(c) * int32(d)) + v.AuxInt = int64ToAuxInt(int64(int32(c) * int32(d))) v.AddArg(a) return true } @@ -5671,7 +5671,7 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != -1 { continue } v.copyOf(x) @@ -5683,11 +5683,11 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { // result: (MOVDconst [0]) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 { continue } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } break @@ -5697,7 +5697,7 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { continue } v.reset(OpARM64NEG) @@ -5715,13 +5715,13 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c)) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c) + v0.AuxInt = int64ToAuxInt(log2(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -5737,13 +5737,13 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c-1) && c >= 3) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -5759,13 +5759,13 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c+1) && c >= 7) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) v1.AddArg(x) v0.AddArg2(v1, x) @@ -5783,15 +5783,15 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%3 == 0 && isPowerOfTwo(c/3)) { continue } v.reset(OpARM64SLLconst) v.Type = x.Type - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -5807,15 +5807,15 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%5 == 0 && isPowerOfTwo(c/5)) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 5) + v0.AuxInt = int64ToAuxInt(log2(c / 5)) v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 2 + v1.AuxInt = int64ToAuxInt(2) v1.AddArg2(x, x) v0.AddArg(v1) v.AddArg(v0) @@ -5832,15 +5832,15 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%7 == 0 && isPowerOfTwo(c/7)) { continue } v.reset(OpARM64SLLconst) v.Type = x.Type - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -5856,15 +5856,15 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%9 == 0 && isPowerOfTwo(c/9)) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 9) + v0.AuxInt = int64ToAuxInt(log2(c / 9)) v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 3 + v1.AuxInt = int64ToAuxInt(3) v1.AddArg2(x, x) v0.AddArg(v1) v.AddArg(v0) @@ -5879,13 +5879,13 @@ func rewriteValueARM64_OpARM64MNEG(v *Value) bool { if v_0.Op != OpARM64MOVDconst { continue } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { continue } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = -c * d + v.AuxInt = int64ToAuxInt(-c * d) return true } break @@ -5905,7 +5905,7 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(int32(c) == -1) { continue } @@ -5922,12 +5922,12 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(int32(c) == 0) { continue } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } break @@ -5941,7 +5941,7 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(int32(c) == 1) { continue } @@ -5960,13 +5960,13 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c)) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c) + v0.AuxInt = int64ToAuxInt(log2(c)) v0.AddArg(x) v.AddArg(v0) return true @@ -5982,13 +5982,13 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c-1) && int32(c) >= 3) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -6004,13 +6004,13 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c+1) && int32(c) >= 7) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) v1.AddArg(x) v0.AddArg2(v1, x) @@ -6028,15 +6028,15 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { continue } v.reset(OpARM64SLLconst) v.Type = x.Type - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -6052,15 +6052,15 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 5) + v0.AuxInt = int64ToAuxInt(log2(c / 5)) v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 2 + v1.AuxInt = int64ToAuxInt(2) v1.AddArg2(x, x) v0.AddArg(v1) v.AddArg(v0) @@ -6077,15 +6077,15 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { continue } v.reset(OpARM64SLLconst) v.Type = x.Type - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -6101,15 +6101,15 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { continue } v.reset(OpARM64NEG) v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) - v0.AuxInt = log2(c / 9) + v0.AuxInt = int64ToAuxInt(log2(c / 9)) v1 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v1.AuxInt = 3 + v1.AuxInt = int64ToAuxInt(3) v1.AddArg2(x, x) v0.AddArg(v1) v.AddArg(v0) @@ -6124,13 +6124,13 @@ func rewriteValueARM64_OpARM64MNEGW(v *Value) bool { if v_0.Op != OpARM64MOVDconst { continue } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { continue } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = -int64(int32(c) * int32(d)) + v.AuxInt = int64ToAuxInt(-int64(int32(c) * int32(d))) return true } break @@ -6146,13 +6146,13 @@ func rewriteValueARM64_OpARM64MOD(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = c % d + v.AuxInt = int64ToAuxInt(c % d) return true } return false @@ -6166,13 +6166,13 @@ func rewriteValueARM64_OpARM64MODW(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c) % int32(d)) + v.AuxInt = int64ToAuxInt(int64(int32(c) % int32(d))) return true } return false @@ -6380,10 +6380,10 @@ func rewriteValueARM64_OpARM64MOVBUreg(v *Value) bool { if v_0.Op != OpARM64ANDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<8 - 1) + v.AuxInt = int64ToAuxInt(c & (1<<8 - 1)) v.AddArg(x) return true } @@ -6393,9 +6393,9 @@ func rewriteValueARM64_OpARM64MOVBUreg(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint8(c)) + v.AuxInt = int64ToAuxInt(int64(uint8(c))) return true } // match: (MOVBUreg x) @@ -6636,9 +6636,9 @@ func rewriteValueARM64_OpARM64MOVBreg(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int8(c)) + v.AuxInt = int64ToAuxInt(int64(int8(c))) return true } // match: (MOVBreg (SLLconst [lc] x)) @@ -8991,9 +8991,9 @@ func rewriteValueARM64_OpARM64MOVDreg(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) return true } return false @@ -9874,10 +9874,10 @@ func rewriteValueARM64_OpARM64MOVHUreg(v *Value) bool { if v_0.Op != OpARM64ANDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<16 - 1) + v.AuxInt = int64ToAuxInt(c & (1<<16 - 1)) v.AddArg(x) return true } @@ -9887,9 +9887,9 @@ func rewriteValueARM64_OpARM64MOVHUreg(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint16(c)) + v.AuxInt = int64ToAuxInt(int64(uint16(c))) return true } // match: (MOVHUreg (SLLconst [sc] x)) @@ -10301,9 +10301,9 @@ func rewriteValueARM64_OpARM64MOVHreg(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int16(c)) + v.AuxInt = int64ToAuxInt(int64(int16(c))) return true } // match: (MOVHreg (SLLconst [lc] x)) @@ -11971,10 +11971,10 @@ func rewriteValueARM64_OpARM64MOVWUreg(v *Value) bool { if v_0.Op != OpARM64ANDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ANDconst) - v.AuxInt = c & (1<<32 - 1) + v.AuxInt = int64ToAuxInt(c & (1<<32 - 1)) v.AddArg(x) return true } @@ -11984,9 +11984,9 @@ func rewriteValueARM64_OpARM64MOVWUreg(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint32(c)) + v.AuxInt = int64ToAuxInt(int64(uint32(c))) return true } // match: (MOVWUreg (SLLconst [sc] x)) @@ -12456,9 +12456,9 @@ func rewriteValueARM64_OpARM64MOVWreg(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c)) + v.AuxInt = int64ToAuxInt(int64(int32(c))) return true } // match: (MOVWreg (SLLconst [lc] x)) @@ -13346,7 +13346,7 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { for { a := v_0 x := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != -1 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != -1 { break } v.reset(OpARM64ADD) @@ -13357,7 +13357,7 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { // result: a for { a := v_0 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 0 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 0 { break } v.copyOf(a) @@ -13368,7 +13368,7 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { for { a := v_0 x := v_1 - if v_2.Op != OpARM64MOVDconst || v_2.AuxInt != 1 { + if v_2.Op != OpARM64MOVDconst || auxIntToInt64(v_2.AuxInt) != 1 { break } v.reset(OpARM64SUB) @@ -13384,12 +13384,12 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg2(a, x) return true } @@ -13402,13 +13402,13 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c-1) && c >= 3) { break } v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13422,13 +13422,13 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c+1) && c >= 7) { break } v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13442,14 +13442,14 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13463,14 +13463,14 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13484,14 +13484,14 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13505,14 +13505,14 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13521,7 +13521,7 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { // result: (ADD a x) for { a := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != -1 { break } x := v_2 @@ -13533,7 +13533,7 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { // result: a for { a := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 { break } v.copyOf(a) @@ -13543,7 +13543,7 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { // result: (SUB a x) for { a := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { break } x := v_2 @@ -13559,13 +13559,13 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg2(a, x) return true } @@ -13577,14 +13577,14 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c-1) && c >= 3) { break } v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13597,14 +13597,14 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c+1) && c >= 7) { break } v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13617,15 +13617,15 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13638,15 +13638,15 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13659,15 +13659,15 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13680,15 +13680,15 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13699,11 +13699,11 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 y := v_2 v.reset(OpARM64ADDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64MNEG, x.Type) v0.AddArg2(x, y) v.AddArg(v0) @@ -13716,13 +13716,13 @@ func rewriteValueARM64_OpARM64MSUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if v_2.Op != OpARM64MOVDconst { break } - d := v_2.AuxInt + d := auxIntToInt64(v_2.AuxInt) v.reset(OpARM64SUBconst) - v.AuxInt = c * d + v.AuxInt = int64ToAuxInt(c * d) v.AddArg(a) return true } @@ -13742,7 +13742,7 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(int32(c) == -1) { break } @@ -13758,7 +13758,7 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(int32(c) == 0) { break } @@ -13774,7 +13774,7 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(int32(c) == 1) { break } @@ -13791,12 +13791,12 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg2(a, x) return true } @@ -13809,13 +13809,13 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13829,13 +13829,13 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13849,14 +13849,14 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13870,14 +13870,14 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13891,14 +13891,14 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13912,14 +13912,14 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_2.Op != OpARM64MOVDconst { break } - c := v_2.AuxInt + c := auxIntToInt64(v_2.AuxInt) if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -13932,7 +13932,7 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(int32(c) == -1) { break @@ -13949,7 +13949,7 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(int32(c) == 0) { break } @@ -13964,7 +13964,7 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(int32(c) == 1) { break @@ -13981,13 +13981,13 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg2(a, x) return true } @@ -13999,14 +13999,14 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = log2(c - 1) + v0.AuxInt = int64ToAuxInt(log2(c - 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -14019,14 +14019,14 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = log2(c + 1) + v0.AuxInt = int64ToAuxInt(log2(c + 1)) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -14039,15 +14039,15 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -14060,15 +14060,15 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -14081,15 +14081,15 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64SUBshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -14102,15 +14102,15 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) x := v_2 if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } v.reset(OpARM64SUBshiftLL) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg2(a, v0) return true @@ -14121,11 +14121,11 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) x := v_1 y := v_2 v.reset(OpARM64ADDconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v0 := b.NewValue0(v.Pos, OpARM64MNEGW, x.Type) v0.AddArg2(x, y) v.AddArg(v0) @@ -14138,13 +14138,13 @@ func rewriteValueARM64_OpARM64MSUBW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if v_2.Op != OpARM64MOVDconst { break } - d := v_2.AuxInt + d := auxIntToInt64(v_2.AuxInt) v.reset(OpARM64SUBconst) - v.AuxInt = int64(int32(c) * int32(d)) + v.AuxInt = int64ToAuxInt(int64(int32(c) * int32(d))) v.AddArg(a) return true } @@ -14174,7 +14174,7 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != -1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != -1 { continue } v.reset(OpARM64NEG) @@ -14187,11 +14187,11 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { // result: (MOVDconst [0]) for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 0 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 0 { continue } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } break @@ -14201,7 +14201,7 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { for { for _i0 := 0; _i0 <= 1; _i0, v_0, v_1 = _i0+1, v_1, v_0 { x := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { continue } v.copyOf(x) @@ -14218,12 +14218,12 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg(x) return true } @@ -14238,12 +14238,12 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c-1) && c >= 3) { continue } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c - 1) + v.AuxInt = int64ToAuxInt(log2(c - 1)) v.AddArg2(x, x) return true } @@ -14258,12 +14258,12 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c+1) && c >= 7) { continue } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c + 1) + v.AuxInt = int64ToAuxInt(log2(c + 1)) v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) v0.AddArg(x) v.AddArg2(v0, x) @@ -14280,14 +14280,14 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%3 == 0 && isPowerOfTwo(c/3)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 1 + v0.AuxInt = int64ToAuxInt(1) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -14303,14 +14303,14 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%5 == 0 && isPowerOfTwo(c/5)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -14326,14 +14326,14 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%7 == 0 && isPowerOfTwo(c/7)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) v1.AddArg(x) v0.AddArg2(v1, x) @@ -14351,14 +14351,14 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%9 == 0 && isPowerOfTwo(c/9)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -14372,13 +14372,13 @@ func rewriteValueARM64_OpARM64MUL(v *Value) bool { if v_0.Op != OpARM64MOVDconst { continue } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { continue } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = c * d + v.AuxInt = int64ToAuxInt(c * d) return true } break @@ -14413,7 +14413,7 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(int32(c) == -1) { continue } @@ -14431,12 +14431,12 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(int32(c) == 0) { continue } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } break @@ -14450,7 +14450,7 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(int32(c) == 1) { continue } @@ -14468,12 +14468,12 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg(x) return true } @@ -14488,12 +14488,12 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c-1) && int32(c) >= 3) { continue } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c - 1) + v.AuxInt = int64ToAuxInt(log2(c - 1)) v.AddArg2(x, x) return true } @@ -14508,12 +14508,12 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c+1) && int32(c) >= 7) { continue } v.reset(OpARM64ADDshiftLL) - v.AuxInt = log2(c + 1) + v.AuxInt = int64ToAuxInt(log2(c + 1)) v0 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) v0.AddArg(x) v.AddArg2(v0, x) @@ -14530,14 +14530,14 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 3) + v.AuxInt = int64ToAuxInt(log2(c / 3)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 1 + v0.AuxInt = int64ToAuxInt(1) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -14553,14 +14553,14 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 5) + v.AuxInt = int64ToAuxInt(log2(c / 5)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 2 + v0.AuxInt = int64ToAuxInt(2) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -14576,14 +14576,14 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 7) + v.AuxInt = int64ToAuxInt(log2(c / 7)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v1 := b.NewValue0(v.Pos, OpARM64NEG, x.Type) v1.AddArg(x) v0.AddArg2(v1, x) @@ -14601,14 +14601,14 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { continue } v.reset(OpARM64SLLconst) - v.AuxInt = log2(c / 9) + v.AuxInt = int64ToAuxInt(log2(c / 9)) v0 := b.NewValue0(v.Pos, OpARM64ADDshiftLL, x.Type) - v0.AuxInt = 3 + v0.AuxInt = int64ToAuxInt(3) v0.AddArg2(x, x) v.AddArg(v0) return true @@ -14622,13 +14622,13 @@ func rewriteValueARM64_OpARM64MULW(v *Value) bool { if v_0.Op != OpARM64MOVDconst { continue } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { continue } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(int32(c) * int32(d)) + v.AuxInt = int64ToAuxInt(int64(int32(c) * int32(d))) return true } break @@ -14655,9 +14655,9 @@ func rewriteValueARM64_OpARM64MVN(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = ^c + v.AuxInt = int64ToAuxInt(^c) return true } // match: (MVN x:(SLLconst [c] y)) @@ -14796,9 +14796,9 @@ func rewriteValueARM64_OpARM64NEG(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = -c + v.AuxInt = int64ToAuxInt(-c) return true } // match: (NEG x:(SLLconst [c] y)) @@ -14944,9 +14944,9 @@ func rewriteValueARM64_OpARM64OR(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -16938,9 +16938,9 @@ func rewriteValueARM64_OpARM64ORN(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64ORconst) - v.AuxInt = ^c + v.AuxInt = int64ToAuxInt(^c) v.AddArg(x) return true } @@ -16952,7 +16952,7 @@ func rewriteValueARM64_OpARM64ORN(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.AuxInt = int64ToAuxInt(-1) return true } // match: (ORN x0 x1:(SLLconst [c] y)) @@ -17127,7 +17127,7 @@ func rewriteValueARM64_OpARM64ORconst(v *Value) bool { // match: (ORconst [0] x) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt64(v.AuxInt) != 0 { break } x := v_0 @@ -17137,36 +17137,36 @@ func rewriteValueARM64_OpARM64ORconst(v *Value) bool { // match: (ORconst [-1] _) // result: (MOVDconst [-1]) for { - if v.AuxInt != -1 { + if auxIntToInt64(v.AuxInt) != -1 { break } v.reset(OpARM64MOVDconst) - v.AuxInt = -1 + v.AuxInt = int64ToAuxInt(-1) return true } // match: (ORconst [c] (MOVDconst [d])) // result: (MOVDconst [c|d]) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = c | d + v.AuxInt = int64ToAuxInt(c | d) return true } // match: (ORconst [c] (ORconst [d] x)) // result: (ORconst [c|d] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64ORconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ORconst) - v.AuxInt = c | d + v.AuxInt = int64ToAuxInt(c | d) v.AddArg(x) return true } @@ -19064,7 +19064,7 @@ func rewriteValueARM64_OpARM64SBCSflags(v *Value) bool { break } v_2_0_0 := v_2_0.Args[0] - if v_2_0_0.Op != OpARM64MOVDconst || v_2_0_0.AuxInt != 0 { + if v_2_0_0.Op != OpARM64MOVDconst || auxIntToInt64(v_2_0_0.AuxInt) != 0 { break } v.reset(OpARM64SUBSflags) @@ -19083,9 +19083,9 @@ func rewriteValueARM64_OpARM64SLL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64SLLconst) - v.AuxInt = c & 63 + v.AuxInt = int64ToAuxInt(c & 63) v.AddArg(x) return true } @@ -19096,13 +19096,13 @@ func rewriteValueARM64_OpARM64SLLconst(v *Value) bool { // match: (SLLconst [c] (MOVDconst [d])) // result: (MOVDconst [d<>uint64(c)]) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = d >> uint64(c) + v.AuxInt = int64ToAuxInt(d >> uint64(c)) return true } // match: (SRAconst [rc] (SLLconst [lc] x)) @@ -19378,9 +19378,9 @@ func rewriteValueARM64_OpARM64SRL(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64SRLconst) - v.AuxInt = c & 63 + v.AuxInt = int64ToAuxInt(c & 63) v.AddArg(x) return true } @@ -19391,13 +19391,13 @@ func rewriteValueARM64_OpARM64SRLconst(v *Value) bool { // match: (SRLconst [c] (MOVDconst [d])) // result: (MOVDconst [int64(uint64(d)>>uint64(c))]) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint64(d) >> uint64(c)) + v.AuxInt = int64ToAuxInt(int64(uint64(d) >> uint64(c))) return true } // match: (SRLconst [c] (SLLconst [c] x)) @@ -19679,9 +19679,9 @@ func rewriteValueARM64_OpARM64SUB(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64SUBconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -19765,7 +19765,7 @@ func rewriteValueARM64_OpARM64SUB(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (SUB x (SUB y z)) @@ -19862,7 +19862,7 @@ func rewriteValueARM64_OpARM64SUBconst(v *Value) bool { // match: (SUBconst [0] x) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt64(v.AuxInt) != 0 { break } x := v_0 @@ -19872,40 +19872,40 @@ func rewriteValueARM64_OpARM64SUBconst(v *Value) bool { // match: (SUBconst [c] (MOVDconst [d])) // result: (MOVDconst [d-c]) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = d - c + v.AuxInt = int64ToAuxInt(d - c) return true } // match: (SUBconst [c] (SUBconst [d] x)) // result: (ADDconst [-c-d] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64SUBconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ADDconst) - v.AuxInt = -c - d + v.AuxInt = int64ToAuxInt(-c - d) v.AddArg(x) return true } // match: (SUBconst [c] (ADDconst [d] x)) // result: (ADDconst [-c+d] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64ADDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64ADDconst) - v.AuxInt = -c + d + v.AuxInt = int64ToAuxInt(-c + d) v.AddArg(x) return true } @@ -20030,9 +20030,9 @@ func rewriteValueARM64_OpARM64TST(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64TSTconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -20110,16 +20110,16 @@ func rewriteValueARM64_OpARM64TSTW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] // match: (TSTW x (MOVDconst [c])) - // result: (TSTWconst [c] x) + // result: (TSTWconst [int32(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 != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64TSTWconst) - v.AuxInt = c + v.AuxInt = int32ToAuxInt(int32(c)) v.AddArg(x) return true } @@ -20375,7 +20375,7 @@ func rewriteValueARM64_OpARM64UDIV(v *Value) bool { // result: x for { x := v_0 - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { break } v.copyOf(x) @@ -20389,12 +20389,12 @@ func rewriteValueARM64_OpARM64UDIV(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c)) { break } v.reset(OpARM64SRLconst) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg(x) return true } @@ -20404,13 +20404,13 @@ func rewriteValueARM64_OpARM64UDIV(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint64(c) / uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) / uint64(d))) return true } return false @@ -20426,7 +20426,7 @@ func rewriteValueARM64_OpARM64UDIVW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(uint32(c) == 1) { break } @@ -20441,12 +20441,12 @@ func rewriteValueARM64_OpARM64UDIVW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c) && is32Bit(c)) { break } v.reset(OpARM64SRLconst) - v.AuxInt = log2(c) + v.AuxInt = int64ToAuxInt(log2(c)) v.AddArg(x) return true } @@ -20456,13 +20456,13 @@ func rewriteValueARM64_OpARM64UDIVW(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint32(c) / uint32(d)) + v.AuxInt = int64ToAuxInt(int64(uint32(c) / uint32(d))) return true } return false @@ -20490,11 +20490,11 @@ func rewriteValueARM64_OpARM64UMOD(v *Value) bool { // match: (UMOD _ (MOVDconst [1])) // result: (MOVDconst [0]) for { - if v_1.Op != OpARM64MOVDconst || v_1.AuxInt != 1 { + if v_1.Op != OpARM64MOVDconst || auxIntToInt64(v_1.AuxInt) != 1 { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (UMOD x (MOVDconst [c])) @@ -20505,12 +20505,12 @@ func rewriteValueARM64_OpARM64UMOD(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c)) { break } v.reset(OpARM64ANDconst) - v.AuxInt = c - 1 + v.AuxInt = int64ToAuxInt(c - 1) v.AddArg(x) return true } @@ -20520,13 +20520,13 @@ func rewriteValueARM64_OpARM64UMOD(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint64(c) % uint64(d)) + v.AuxInt = int64ToAuxInt(int64(uint64(c) % uint64(d))) return true } return false @@ -20558,12 +20558,12 @@ func rewriteValueARM64_OpARM64UMODW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(uint32(c) == 1) { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (UMODW x (MOVDconst [c])) @@ -20574,12 +20574,12 @@ func rewriteValueARM64_OpARM64UMODW(v *Value) bool { if v_1.Op != OpARM64MOVDconst { break } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) if !(isPowerOfTwo(c) && is32Bit(c)) { break } v.reset(OpARM64ANDconst) - v.AuxInt = c - 1 + v.AuxInt = int64ToAuxInt(c - 1) v.AddArg(x) return true } @@ -20589,13 +20589,13 @@ func rewriteValueARM64_OpARM64UMODW(v *Value) bool { if v_0.Op != OpARM64MOVDconst { break } - c := v_0.AuxInt + c := auxIntToInt64(v_0.AuxInt) if v_1.Op != OpARM64MOVDconst { break } - d := v_1.AuxInt + d := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = int64(uint32(c) % uint32(d)) + v.AuxInt = int64ToAuxInt(int64(uint32(c) % uint32(d))) return true } return false @@ -20613,9 +20613,9 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { if v_1.Op != OpARM64MOVDconst { continue } - c := v_1.AuxInt + c := auxIntToInt64(v_1.AuxInt) v.reset(OpARM64XORconst) - v.AuxInt = c + v.AuxInt = int64ToAuxInt(c) v.AddArg(x) return true } @@ -20629,7 +20629,7 @@ func rewriteValueARM64_OpARM64XOR(v *Value) bool { break } v.reset(OpARM64MOVDconst) - v.AuxInt = 0 + v.AuxInt = int64ToAuxInt(0) return true } // match: (XOR x (MVN y)) @@ -21001,7 +21001,7 @@ func rewriteValueARM64_OpARM64XORconst(v *Value) bool { // match: (XORconst [0] x) // result: x for { - if v.AuxInt != 0 { + if auxIntToInt64(v.AuxInt) != 0 { break } x := v_0 @@ -21011,7 +21011,7 @@ func rewriteValueARM64_OpARM64XORconst(v *Value) bool { // match: (XORconst [-1] x) // result: (MVN x) for { - if v.AuxInt != -1 { + if auxIntToInt64(v.AuxInt) != -1 { break } x := v_0 @@ -21022,26 +21022,26 @@ func rewriteValueARM64_OpARM64XORconst(v *Value) bool { // match: (XORconst [c] (MOVDconst [d])) // result: (MOVDconst [c^d]) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64MOVDconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) v.reset(OpARM64MOVDconst) - v.AuxInt = c ^ d + v.AuxInt = int64ToAuxInt(c ^ d) return true } // match: (XORconst [c] (XORconst [d] x)) // result: (XORconst [c^d] x) for { - c := v.AuxInt + c := auxIntToInt64(v.AuxInt) if v_0.Op != OpARM64XORconst { break } - d := v_0.AuxInt + d := auxIntToInt64(v_0.AuxInt) x := v_0.Args[0] v.reset(OpARM64XORconst) - v.AuxInt = c ^ d + v.AuxInt = int64ToAuxInt(c ^ d) v.AddArg(x) return true } -- GitLab From e3063636124d0e5b2d0fad7912a9c6810629f486 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 2 Sep 2020 13:14:36 -0400 Subject: [PATCH 0493/1792] cmd/go: implement 'go install pkg@version' With this change, 'go install' will install executables in module mode without using or modifying the module in the current directory, if there is one. For #40276 Change-Id: I922e71719b3a4e0c779ce7a30429355fc29930bf Reviewed-on: https://go-review.googlesource.com/c/go/+/254365 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Reviewed-by: Michael Matloob --- doc/go1.16.html | 12 ++ src/cmd/go/alldocs.go | 27 +++ src/cmd/go/internal/modload/init.go | 46 ++++- src/cmd/go/internal/work/build.go | 192 ++++++++++++++++++ .../mod/example.com_cmd_v1.0.0-exclude.txt | 28 +++ .../mod/example.com_cmd_v1.0.0-newerself.txt | 28 +++ .../mod/example.com_cmd_v1.0.0-replace.txt | 28 +++ .../testdata/mod/example.com_cmd_v1.0.0.txt | 27 +++ .../testdata/mod/example.com_cmd_v1.9.0.txt | 30 +++ .../script/mod_install_pkg_version.txt | 187 +++++++++++++++++ src/cmd/go/testdata/script/mod_outside.txt | 8 +- 11 files changed, 605 insertions(+), 8 deletions(-) create mode 100644 src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-exclude.txt create mode 100644 src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-newerself.txt create mode 100644 src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-replace.txt create mode 100644 src/cmd/go/testdata/mod/example.com_cmd_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_cmd_v1.9.0.txt create mode 100644 src/cmd/go/testdata/script/mod_install_pkg_version.txt diff --git a/doc/go1.16.html b/doc/go1.16.html index 95e63d0d5a..f177226269 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -43,6 +43,18 @@ Do not send CLs removing the interior tags from such phrases.

Go command

+

+ go install now accepts arguments with + version suffixes (for example, go install + example.com/cmd@v1.0.0). This causes go + install to build and install packages in module-aware mode, + ignoring the go.mod file in the current directory or any parent + directory, if there is one. This is useful for installing executables without + affecting the dependencies of the main module.
+ TODO: write and link to section in golang.org/ref/mod
+ TODO: write and link to blog post +

+

retract directives may now be used in a go.mod file to indicate that certain published versions of the module should not be used diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 8ad4f66d09..104aea6c7f 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -715,6 +715,33 @@ // environment variable is not set. Executables in $GOROOT // are installed in $GOROOT/bin or $GOTOOLDIR instead of $GOBIN. // +// If the arguments have version suffixes (like @latest or @v1.0.0), "go install" +// builds packages in module-aware mode, ignoring the go.mod file in the current +// directory or any parent directory, if there is one. This is useful for +// installing executables without affecting the dependencies of the main module. +// To eliminate ambiguity about which module versions are used in the build, the +// arguments must satisfy the following constraints: +// +// - Arguments must be package paths or package patterns (with "..." wildcards). +// They must not be standard packages (like fmt), meta-patterns (std, cmd, +// all), or relative or absolute file paths. +// - All arguments must have the same version suffix. Different queries are not +// allowed, even if they refer to the same version. +// - All arguments must refer to packages in the same module at the same version. +// - No module is considered the "main" module. If the module containing +// packages named on the command line has a go.mod file, it must not contain +// directives (replace and exclude) that would cause it to be interpreted +// differently than if it were the main module. The module must not require +// a higher version of itself. +// - Package path arguments must refer to main packages. Pattern arguments +// will only match main packages. +// +// If the arguments don't have version suffixes, "go install" may run in +// module-aware mode or GOPATH mode, depending on the GO111MODULE environment +// variable and the presence of a go.mod file. See 'go help modules' for details. +// If module-aware mode is enabled, "go install" runs in the context of the main +// module. +// // When module-aware mode is disabled, other packages are installed in the // directory $GOPATH/pkg/$GOOS_$GOARCH. When module-aware mode is enabled, // other packages are built and cached but not installed. diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 1f50dcb11c..2f0f60b263 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -35,8 +35,7 @@ import ( ) var ( - mustUseModules = false - initialized bool + initialized bool modRoot string Target module.Version @@ -55,9 +54,33 @@ var ( CmdModInit bool // running 'go mod init' CmdModModule string // module argument for 'go mod init' + // RootMode determines whether a module root is needed. + RootMode Root + + // ForceUseModules may be set to force modules to be enabled when + // GO111MODULE=auto or to report an error when GO111MODULE=off. + ForceUseModules bool + allowMissingModuleImports bool ) +type Root int + +const ( + // AutoRoot is the default for most commands. modload.Init will look for + // a go.mod file in the current directory or any parent. If none is found, + // modules may be disabled (GO111MODULE=on) or commands may run in a + // limited module mode. + AutoRoot Root = iota + + // NoRoot is used for commands that run in module mode and ignore any go.mod + // file the current directory or in parent directories. + NoRoot + + // TODO(jayconrod): add NeedRoot for commands like 'go mod vendor' that + // don't make sense without a main module. +) + // ModFile returns the parsed go.mod file. // // Note that after calling ImportPaths or LoadBuildList, @@ -92,15 +115,19 @@ func Init() { // Keep in sync with WillBeEnabled. We perform extra validation here, and // there are lots of diagnostics and side effects, so we can't use // WillBeEnabled directly. + var mustUseModules bool env := cfg.Getenv("GO111MODULE") switch env { default: base.Fatalf("go: unknown environment setting GO111MODULE=%s", env) case "auto", "": - mustUseModules = false + mustUseModules = ForceUseModules case "on": mustUseModules = true case "off": + if ForceUseModules { + base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") + } mustUseModules = false return } @@ -135,6 +162,10 @@ func Init() { if CmdModInit { // Running 'go mod init': go.mod will be created in current directory. modRoot = base.Cwd + } else if RootMode == NoRoot { + // TODO(jayconrod): report an error if -mod -modfile is explicitly set on + // the command line. Ignore those flags if they come from GOFLAGS. + modRoot = "" } else { modRoot = findModuleRoot(base.Cwd) if modRoot == "" { @@ -154,6 +185,9 @@ func Init() { // when it happens. See golang.org/issue/26708. modRoot = "" fmt.Fprintf(os.Stderr, "go: warning: ignoring go.mod in system temp root %v\n", os.TempDir()) + if !mustUseModules { + return + } } } if cfg.ModFile != "" && !strings.HasSuffix(cfg.ModFile, ".mod") { @@ -219,10 +253,12 @@ func init() { // be called until the command is installed and flags are parsed. Instead of // calling Init and Enabled, the main package can call this function. func WillBeEnabled() bool { - if modRoot != "" || mustUseModules { + if modRoot != "" || cfg.ModulesEnabled { + // Already enabled. return true } if initialized { + // Initialized, not enabled. return false } @@ -263,7 +299,7 @@ func WillBeEnabled() bool { // (usually through MustModRoot). func Enabled() bool { Init() - return modRoot != "" || mustUseModules + return modRoot != "" || cfg.ModulesEnabled } // ModRoot returns the root of the main module. diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index e99982ed36..990e5d9ecd 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -9,8 +9,10 @@ import ( "errors" "fmt" "go/build" + "internal/goroot" "os" "os/exec" + "path" "path/filepath" "runtime" "strings" @@ -18,8 +20,13 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/load" + "cmd/go/internal/modfetch" + "cmd/go/internal/modload" "cmd/go/internal/search" "cmd/go/internal/trace" + + "golang.org/x/mod/modfile" + "golang.org/x/mod/module" ) var CmdBuild = &base.Command{ @@ -440,6 +447,33 @@ variable, which defaults to $GOPATH/bin or $HOME/go/bin if the GOPATH environment variable is not set. Executables in $GOROOT are installed in $GOROOT/bin or $GOTOOLDIR instead of $GOBIN. +If the arguments have version suffixes (like @latest or @v1.0.0), "go install" +builds packages in module-aware mode, ignoring the go.mod file in the current +directory or any parent directory, if there is one. This is useful for +installing executables without affecting the dependencies of the main module. +To eliminate ambiguity about which module versions are used in the build, the +arguments must satisfy the following constraints: + +- Arguments must be package paths or package patterns (with "..." wildcards). + They must not be standard packages (like fmt), meta-patterns (std, cmd, + all), or relative or absolute file paths. +- All arguments must have the same version suffix. Different queries are not + allowed, even if they refer to the same version. +- All arguments must refer to packages in the same module at the same version. +- No module is considered the "main" module. If the module containing + packages named on the command line has a go.mod file, it must not contain + directives (replace and exclude) that would cause it to be interpreted + differently than if it were the main module. The module must not require + a higher version of itself. +- Package path arguments must refer to main packages. Pattern arguments + will only match main packages. + +If the arguments don't have version suffixes, "go install" may run in +module-aware mode or GOPATH mode, depending on the GO111MODULE environment +variable and the presence of a go.mod file. See 'go help modules' for details. +If module-aware mode is enabled, "go install" runs in the context of the main +module. + When module-aware mode is disabled, other packages are installed in the directory $GOPATH/pkg/$GOOS_$GOARCH. When module-aware mode is enabled, other packages are built and cached but not installed. @@ -510,6 +544,12 @@ func libname(args []string, pkgs []*load.Package) (string, error) { } func runInstall(ctx context.Context, cmd *base.Command, args []string) { + for _, arg := range args { + if strings.Contains(arg, "@") && !build.IsLocalImport(arg) && !filepath.IsAbs(arg) { + installOutsideModule(ctx, args) + return + } + } BuildInit() InstallPackages(ctx, args, load.PackagesForBuild(ctx, args)) } @@ -634,6 +674,158 @@ func InstallPackages(ctx context.Context, patterns []string, pkgs []*load.Packag } } +// installOutsideModule implements 'go install pkg@version'. It builds and +// installs one or more main packages in module mode while ignoring any go.mod +// in the current directory or parent directories. +// +// See golang.org/issue/40276 for details and rationale. +func installOutsideModule(ctx context.Context, args []string) { + modload.ForceUseModules = true + modload.RootMode = modload.NoRoot + modload.AllowMissingModuleImports() + modload.Init() + + // Check that the arguments satisfy syntactic constraints. + var version string + for _, arg := range args { + if i := strings.Index(arg, "@"); i >= 0 { + version = arg[i+1:] + if version == "" { + base.Fatalf("go install %s: version must not be empty", arg) + } + break + } + } + patterns := make([]string, len(args)) + for i, arg := range args { + if !strings.HasSuffix(arg, "@"+version) { + base.Errorf("go install %s: all arguments must have the same version (@%s)", arg, version) + continue + } + p := arg[:len(arg)-len(version)-1] + switch { + case build.IsLocalImport(p): + base.Errorf("go install %s: argument must be a package path, not a relative path", arg) + case filepath.IsAbs(p): + base.Errorf("go install %s: argument must be a package path, not an absolute path", arg) + case search.IsMetaPackage(p): + base.Errorf("go install %s: argument must be a package path, not a meta-package", arg) + case path.Clean(p) != p: + base.Errorf("go install %s: argument must be a clean package path", arg) + case !strings.Contains(p, "...") && search.IsStandardImportPath(p) && goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, p): + base.Errorf("go install %s: argument must not be a package in the standard library", arg) + default: + patterns[i] = p + } + } + base.ExitIfErrors() + BuildInit() + + // Query the module providing the first argument, load its go.mod file, and + // check that it doesn't contain directives that would cause it to be + // interpreted differently if it were the main module. + // + // If multiple modules match the first argument, accept the longest match + // (first result). It's possible this module won't provide packages named by + // later arguments, and other modules would. Let's not try to be too + // magical though. + allowed := modload.CheckAllowed + if modload.IsRevisionQuery(version) { + // Don't check for retractions if a specific revision is requested. + allowed = nil + } + qrs, err := modload.QueryPattern(ctx, patterns[0], version, allowed) + if err != nil { + base.Fatalf("go install %s: %v", args[0], err) + } + installMod := qrs[0].Mod + data, err := modfetch.GoMod(installMod.Path, installMod.Version) + if err != nil { + base.Fatalf("go install %s: %v", args[0], err) + } + f, err := modfile.Parse("go.mod", data, nil) + if err != nil { + base.Fatalf("go install %s: %s: %v", args[0], installMod, err) + } + directiveFmt := "go install %s: %s\n" + + "\tThe go.mod file for the module providing named packages contains one or\n" + + "\tmore %s directives. It must not contain directives that would cause\n" + + "\tit to be interpreted differently than if it were the main module." + if len(f.Replace) > 0 { + base.Fatalf(directiveFmt, args[0], installMod, "replace") + } + if len(f.Exclude) > 0 { + base.Fatalf(directiveFmt, args[0], installMod, "exclude") + } + + // Initialize the build list using a dummy main module that requires the + // module providing the packages on the command line. + target := module.Version{Path: "go-install-target"} + modload.SetBuildList([]module.Version{target, installMod}) + + // Load packages for all arguments. Ignore non-main packages. + // Print a warning if an argument contains "..." and matches no main packages. + // PackagesForBuild already prints warnings for patterns that don't match any + // packages, so be careful not to double print. + matchers := make([]func(string) bool, len(patterns)) + for i, p := range patterns { + if strings.Contains(p, "...") { + matchers[i] = search.MatchPattern(p) + } + } + + // TODO(golang.org/issue/40276): don't report errors loading non-main packages + // matched by a pattern. + pkgs := load.PackagesForBuild(ctx, patterns) + mainPkgs := make([]*load.Package, 0, len(pkgs)) + mainCount := make([]int, len(patterns)) + nonMainCount := make([]int, len(patterns)) + for _, pkg := range pkgs { + if pkg.Name == "main" { + mainPkgs = append(mainPkgs, pkg) + for i := range patterns { + if matchers[i] != nil && matchers[i](pkg.ImportPath) { + mainCount[i]++ + } + } + } else { + for i := range patterns { + if matchers[i] == nil && patterns[i] == pkg.ImportPath { + base.Errorf("go install: package %s is not a main package", pkg.ImportPath) + } else if matchers[i] != nil && matchers[i](pkg.ImportPath) { + nonMainCount[i]++ + } + } + } + } + base.ExitIfErrors() + for i, p := range patterns { + if matchers[i] != nil && mainCount[i] == 0 && nonMainCount[i] > 0 { + fmt.Fprintf(os.Stderr, "go: warning: %q matched no main packages\n", p) + } + } + + // Check that named packages are all provided by the same module. + for _, mod := range modload.LoadedModules() { + if mod.Path == installMod.Path && mod.Version != installMod.Version { + base.Fatalf("go install: %s: module requires a higher version of itself (%s)", installMod, mod.Version) + } + } + for _, pkg := range mainPkgs { + if pkg.Module == nil { + // Packages in std, cmd, and their vendored dependencies + // don't have this field set. + base.Errorf("go install: package %s not provided by module %s", pkg.ImportPath, installMod) + } else if pkg.Module.Path != installMod.Path || pkg.Module.Version != installMod.Version { + base.Errorf("go install: package %s provided by module %s@%s\n\tAll packages must be provided by the same module (%s).", pkg.ImportPath, pkg.Module.Path, pkg.Module.Version, installMod) + } + } + base.ExitIfErrors() + + // Build and install the packages. + InstallPackages(ctx, patterns, mainPkgs) +} + // ExecCmd is the command to use to run user binaries. // Normally it is empty, meaning run the binaries directly. // If cross-compiling and running on a remote system or diff --git a/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-exclude.txt b/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-exclude.txt new file mode 100644 index 0000000000..c883d8a774 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-exclude.txt @@ -0,0 +1,28 @@ +example.com/cmd contains main packages. + +-- .info -- +{"Version":"v1.0.0-exclude"} +-- .mod -- +module example.com/cmd + +go 1.16 + +exclude rsc.io/quote v1.5.2 +-- go.mod -- +module example.com/cmd + +go 1.16 + +exclude rsc.io/quote v1.5.2 +-- a/a.go -- +package main + +func main() {} +-- b/b.go -- +package main + +func main() {} +-- err/err.go -- +package err + +var X = DoesNotCompile diff --git a/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-newerself.txt b/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-newerself.txt new file mode 100644 index 0000000000..7670f29ffd --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-newerself.txt @@ -0,0 +1,28 @@ +example.com/cmd contains main packages. + +-- .info -- +{"Version":"v1.0.0-newerself"} +-- .mod -- +module example.com/cmd + +go 1.16 + +require example.com/cmd v1.0.0 +-- go.mod -- +module example.com/cmd + +go 1.16 + +require example.com/cmd v1.0.0 +-- a/a.go -- +package main + +func main() {} +-- b/b.go -- +package main + +func main() {} +-- err/err.go -- +package err + +var X = DoesNotCompile diff --git a/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-replace.txt b/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-replace.txt new file mode 100644 index 0000000000..581a496035 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0-replace.txt @@ -0,0 +1,28 @@ +example.com/cmd contains main packages. + +-- .info -- +{"Version":"v1.0.0-replace"} +-- .mod -- +module example.com/cmd + +go 1.16 + +replace rsc.io/quote => rsc.io/quote v1.5.2 +-- go.mod -- +module example.com/cmd + +go 1.16 + +replace rsc.io/quote => rsc.io/quote v1.5.2 +-- a/a.go -- +package main + +func main() {} +-- b/b.go -- +package main + +func main() {} +-- err/err.go -- +package err + +var X = DoesNotCompile diff --git a/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0.txt new file mode 100644 index 0000000000..ee439384d2 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_cmd_v1.0.0.txt @@ -0,0 +1,27 @@ +example.com/cmd contains main packages. + +v1.0.0 is the latest non-retracted version. Other versions contain errors or +detectable problems. + +-- .info -- +{"Version":"v1.0.0"} +-- .mod -- +module example.com/cmd + +go 1.16 +-- go.mod -- +module example.com/cmd + +go 1.16 +-- a/a.go -- +package main + +func main() {} +-- b/b.go -- +package main + +func main() {} +-- err/err.go -- +package err + +var X = DoesNotCompile diff --git a/src/cmd/go/testdata/mod/example.com_cmd_v1.9.0.txt b/src/cmd/go/testdata/mod/example.com_cmd_v1.9.0.txt new file mode 100644 index 0000000000..9298afb1fb --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_cmd_v1.9.0.txt @@ -0,0 +1,30 @@ +example.com/cmd contains main packages. + +-- .info -- +{"Version":"v1.9.0"} +-- .mod -- +module example.com/cmd + +go 1.16 + +// this is a bad version +retract v1.9.0 +-- go.mod -- +module example.com/cmd + +go 1.16 + +// this is a bad version +retract v1.9.0 +-- a/a.go -- +package main + +func main() {} +-- b/b.go -- +package main + +func main() {} +-- err/err.go -- +package err + +var X = DoesNotCompile diff --git a/src/cmd/go/testdata/script/mod_install_pkg_version.txt b/src/cmd/go/testdata/script/mod_install_pkg_version.txt new file mode 100644 index 0000000000..7e6d4e8e7c --- /dev/null +++ b/src/cmd/go/testdata/script/mod_install_pkg_version.txt @@ -0,0 +1,187 @@ +# 'go install pkg@version' works outside a module. +env GO111MODULE=auto +go install example.com/cmd/a@v1.0.0 +exists $GOPATH/bin/a$GOEXE +rm $GOPATH/bin + + +# 'go install pkg@version' reports an error if modules are disabled. +env GO111MODULE=off +! go install example.com/cmd/a@v1.0.0 +stderr '^go: modules disabled by GO111MODULE=off; see ''go help modules''$' +env GO111MODULE=auto + + +# 'go install pkg@version' ignores go.mod in current directory. +cd m +cp go.mod go.mod.orig +! go list -m all +stderr 'example.com/cmd@v1.1.0-doesnotexist:.*404 Not Found' +go install example.com/cmd/a@latest +cmp go.mod go.mod.orig +exists $GOPATH/bin/a$GOEXE +go version -m $GOPATH/bin/a$GOEXE +stdout '^\tmod\texample.com/cmd\tv1.0.0\t' # "latest", not from go.mod +rm $GOPATH/bin/a +cd .. + + +# Every test case requires linking, so we only cover the most important cases +# when -short is set. +[short] stop + + +# 'go install pkg@version' works on a module that doesn't have a go.mod file +# and with a module whose go.mod file has missing requirements. +# With a proxy, the two cases are indistinguishable. +go install rsc.io/fortune@v1.0.0 +stderr '^go: found rsc.io/quote in rsc.io/quote v1.5.2$' +exists $GOPATH/bin/fortune$GOEXE +! exists $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0/go.mod # no go.mod file +go version -m $GOPATH/bin/fortune$GOEXE +stdout '^\tdep\trsc.io/quote\tv1.5.2\t' # latest version of fortune's dependency +rm $GOPATH/bin + + +# 'go install dir@version' works like a normal 'go install' command if +# dir is a relative or absolute path. +env GO111MODULE=on +go mod download rsc.io/fortune@v1.0.0 +! go install $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0 +stderr '^go: cannot find main module; see ''go help modules''$' +! go install ../pkg/mod/rsc.io/fortune@v1.0.0 +stderr '^go: cannot find main module; see ''go help modules''$' +mkdir tmp +cd tmp +go mod init tmp +go mod edit -require=rsc.io/fortune@v1.0.0 +! go install -mod=readonly $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0 +stderr '^go: updates to go.sum needed, disabled by -mod=readonly$' +! go install -mod=readonly ../../pkg/mod/rsc.io/fortune@v1.0.0 +stderr '^go: updates to go.sum needed, disabled by -mod=readonly$' +go get -d rsc.io/fortune@v1.0.0 +go install -mod=readonly $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0 +exists $GOPATH/bin/fortune$GOEXE +cd .. +rm tmp +rm $GOPATH/bin +env GO111MODULE=auto + +# 'go install pkg@version' reports errors for meta packages, std packages, +# and directories. +! go install std@v1.0.0 +stderr '^go install std@v1.0.0: argument must be a package path, not a meta-package$' +! go install fmt@v1.0.0 +stderr '^go install fmt@v1.0.0: argument must not be a package in the standard library$' +! go install example.com//cmd/a@v1.0.0 +stderr '^go install example.com//cmd/a@v1.0.0: argument must be a clean package path$' +! go install example.com/cmd/a@v1.0.0 ./x@v1.0.0 +stderr '^go install ./x@v1.0.0: argument must be a package path, not a relative path$' +! go install example.com/cmd/a@v1.0.0 $GOPATH/src/x@v1.0.0 +stderr '^go install '$WORK'[/\\]gopath/src/x@v1.0.0: argument must be a package path, not an absolute path$' +! go install example.com/cmd/a@v1.0.0 cmd/...@v1.0.0 +stderr '^go install: package cmd/go not provided by module example.com/cmd@v1.0.0$' + +# 'go install pkg@version' should accept multiple arguments but report an error +# if the version suffixes are different, even if they refer to the same version. +go install example.com/cmd/a@v1.0.0 example.com/cmd/b@v1.0.0 +exists $GOPATH/bin/a$GOEXE +exists $GOPATH/bin/b$GOEXE +rm $GOPATH/bin + +env GO111MODULE=on +go list -m example.com/cmd@latest +stdout '^example.com/cmd v1.0.0$' +env GO111MODULE=auto + +! go install example.com/cmd/a@v1.0.0 example.com/cmd/b@latest +stderr '^go install example.com/cmd/b@latest: all arguments must have the same version \(@v1.0.0\)$' + + +# 'go install pkg@version' should report an error if the arguments are in +# different modules. +! go install example.com/cmd/a@v1.0.0 rsc.io/fortune@v1.0.0 +stderr '^go install: package rsc.io/fortune provided by module rsc.io/fortune@v1.0.0\n\tAll packages must be provided by the same module \(example.com/cmd@v1.0.0\).$' + + +# 'go install pkg@version' should report an error if an argument is not +# a main package. +! go install example.com/cmd/a@v1.0.0 example.com/cmd/err@v1.0.0 +stderr '^go install: package example.com/cmd/err is not a main package$' + +# Wildcards should match only main packages. This module has a non-main package +# with an error, so we'll know if that gets built. +mkdir tmp +cd tmp +go mod init m +go get -d example.com/cmd@v1.0.0 +! go build example.com/cmd/... +stderr 'err[/\\]err.go:3:9: undefined: DoesNotCompile$' +cd .. + +go install example.com/cmd/...@v1.0.0 +exists $GOPATH/bin/a$GOEXE +exists $GOPATH/bin/b$GOEXE +rm $GOPATH/bin + +# If a wildcard matches no packages, we should see a warning. +! go install example.com/cmd/nomatch...@v1.0.0 +stderr '^go install example.com/cmd/nomatch\.\.\.@v1.0.0: module example.com/cmd@v1.0.0 found, but does not contain packages matching example.com/cmd/nomatch\.\.\.$' +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. +go install example.com/cmd/err...@v1.0.0 +stderr '^go: warning: "example.com/cmd/err\.\.\." matched no main packages$' + + +# 'go install pkg@version' should report errors if the module contains +# replace or exclude directives. +go mod download example.com/cmd@v1.0.0-replace +! go install example.com/cmd/a@v1.0.0-replace +cmp stderr replace-err + +go mod download example.com/cmd@v1.0.0-exclude +! go install example.com/cmd/a@v1.0.0-exclude +cmp stderr exclude-err + +# '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 install: example.com/cmd@v1.0.0-newerself: module requires a higher version of itself \(v1.0.0\)$' + + +# 'go install pkg@version' will only match a retracted version if it's +# explicitly requested. +env GO111MODULE=on +go list -m -versions example.com/cmd +! stdout v1.9.0 +go list -m -versions -retracted example.com/cmd +stdout v1.9.0 +go install example.com/cmd/a@latest +go version -m $GOPATH/bin/a$GOEXE +stdout '^\tmod\texample.com/cmd\tv1.0.0\t' +go install example.com/cmd/a@v1.9.0 +go version -m $GOPATH/bin/a$GOEXE +stdout '^\tmod\texample.com/cmd\tv1.9.0\t' + +-- m/go.mod -- +module m + +go 1.16 + +require example.com/cmd v1.1.0-doesnotexist +-- x/x.go -- +package main + +func main() {} +-- replace-err -- +go install example.com/cmd/a@v1.0.0-replace: example.com/cmd@v1.0.0-replace + The go.mod file for the module providing named packages contains one or + more replace directives. It must not contain directives that would cause + it to be interpreted differently than if it were the main module. +-- exclude-err -- +go install example.com/cmd/a@v1.0.0-exclude: example.com/cmd@v1.0.0-exclude + The go.mod file for the module providing named packages contains one or + more exclude directives. It must not contain directives that would cause + it to be interpreted differently than if it were the main module. diff --git a/src/cmd/go/testdata/script/mod_outside.txt b/src/cmd/go/testdata/script/mod_outside.txt index 03ef576168..2001c45c3c 100644 --- a/src/cmd/go/testdata/script/mod_outside.txt +++ b/src/cmd/go/testdata/script/mod_outside.txt @@ -177,9 +177,11 @@ go doc fmt ! go doc example.com/version stderr 'doc: cannot find module providing package example.com/version: working directory is not part of a module' -# 'go install' with a version should fail due to syntax. -! go install example.com/printversion@v1.0.0 -stderr 'can only use path@version syntax with' +# 'go install' with a version should succeed if all constraints are met. +# See mod_install_pkg_version. +rm $GOPATH/bin +go install example.com/printversion@v0.1.0 +exists $GOPATH/bin/printversion$GOEXE # 'go install' should fail if a package argument must be resolved to a module. ! go install example.com/printversion -- GitLab From 03875bd9bc112d25a4496f7ff22888f23a26baea Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 11 Sep 2020 13:30:43 -0400 Subject: [PATCH 0494/1792] cmd/go: add modload.NeedRoot mode for commands that need module root This makes error reporting a bit more consistent for 'go mod' subcommands. Most of these commands only work in module mode when a go.mod file is present. Setting modload.ForceUseModules reports an error when GO111MODULE=off. Setting modload.RootMode to modload.NeedRoot reports an error when no go.mod file is present. Change-Id: I1daa8d2971cb8658e0c804765839d903734a412e Reviewed-on: https://go-review.googlesource.com/c/go/+/254369 Reviewed-by: Bryan C. Mills Reviewed-by: Michael Matloob --- src/cmd/go/internal/modcmd/download.go | 4 +--- src/cmd/go/internal/modcmd/graph.go | 11 ++--------- src/cmd/go/internal/modcmd/init.go | 4 +--- src/cmd/go/internal/modcmd/tidy.go | 2 ++ src/cmd/go/internal/modcmd/vendor.go | 2 ++ src/cmd/go/internal/modcmd/verify.go | 11 ++--------- src/cmd/go/internal/modcmd/why.go | 2 ++ src/cmd/go/internal/modload/init.go | 8 ++++++-- src/cmd/go/testdata/script/mod_off.txt | 4 ++-- src/cmd/go/testdata/script/mod_off_init.txt | 2 +- 10 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index 6227fd9f33..050a2e0e12 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -80,9 +80,7 @@ type moduleJSON struct { func runDownload(ctx context.Context, cmd *base.Command, args []string) { // Check whether modules are enabled and whether we're in a module. - if cfg.Getenv("GO111MODULE") == "off" { - base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") - } + modload.ForceUseModules = true if !modload.HasModRoot() && len(args) == 0 { base.Fatalf("go mod download: no modules specified (see 'go help mod download')") } diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index a149b65605..3277548c23 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -13,7 +13,6 @@ import ( "sort" "cmd/go/internal/base" - "cmd/go/internal/cfg" "cmd/go/internal/modload" "golang.org/x/mod/module" @@ -39,14 +38,8 @@ func runGraph(ctx context.Context, cmd *base.Command, args []string) { if len(args) > 0 { base.Fatalf("go mod graph: graph takes no arguments") } - // Checks go mod expected behavior - if !modload.Enabled() { - if cfg.Getenv("GO111MODULE") == "off" { - base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") - } else { - base.Fatalf("go: cannot find main module; see 'go help modules'") - } - } + modload.ForceUseModules = true + modload.RootMode = modload.NeedRoot modload.LoadAllModules(ctx) reqs := modload.MinReqs() diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index 21b235653e..7cfc0e6f5b 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -40,9 +40,7 @@ func runInit(ctx context.Context, cmd *base.Command, args []string) { if len(args) == 1 { modload.CmdModModule = args[0] } - if os.Getenv("GO111MODULE") == "off" { - base.Fatalf("go mod init: modules disabled by GO111MODULE=off; see 'go help modules'") - } + modload.ForceUseModules = true modFilePath := modload.ModFilePath() if _, err := os.Stat(modFilePath); err == nil { base.Fatalf("go mod init: go.mod already exists") diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index 30df674ef6..cbe3ded5f8 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -50,6 +50,8 @@ func runTidy(ctx context.Context, cmd *base.Command, args []string) { // that are in 'all' but outside of the main module, we must explicitly // request that their test dependencies be included. modload.LoadTests = true + modload.ForceUseModules = true + modload.RootMode = modload.NeedRoot modload.LoadALL(ctx) modload.TidyBuildList() diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index 91d2509452..44094b7252 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -47,6 +47,8 @@ func runVendor(ctx context.Context, cmd *base.Command, args []string) { if len(args) != 0 { base.Fatalf("go mod vendor: vendor takes no arguments") } + modload.ForceUseModules = true + modload.RootMode = modload.NeedRoot pkgs := modload.LoadVendor(ctx) vdir := filepath.Join(modload.ModRoot(), "vendor") diff --git a/src/cmd/go/internal/modcmd/verify.go b/src/cmd/go/internal/modcmd/verify.go index 7700588bde..bd591d3f32 100644 --- a/src/cmd/go/internal/modcmd/verify.go +++ b/src/cmd/go/internal/modcmd/verify.go @@ -14,7 +14,6 @@ import ( "runtime" "cmd/go/internal/base" - "cmd/go/internal/cfg" "cmd/go/internal/modfetch" "cmd/go/internal/modload" @@ -45,14 +44,8 @@ func runVerify(ctx context.Context, cmd *base.Command, args []string) { // NOTE(rsc): Could take a module pattern. base.Fatalf("go mod verify: verify takes no arguments") } - // Checks go mod expected behavior - if !modload.Enabled() || !modload.HasModRoot() { - if cfg.Getenv("GO111MODULE") == "off" { - base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") - } else { - base.Fatalf("go: cannot find main module; see 'go help modules'") - } - } + modload.ForceUseModules = true + modload.RootMode = modload.NeedRoot // Only verify up to GOMAXPROCS zips at once. type token struct{} diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index 8454fdfec6..ea7c28e0b8 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -61,6 +61,8 @@ func init() { } func runWhy(ctx context.Context, cmd *base.Command, args []string) { + modload.ForceUseModules = true + modload.RootMode = modload.NeedRoot loadALL := modload.LoadALL if *whyVendor { loadALL = modload.LoadVendor diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 2f0f60b263..f93abee96d 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -77,8 +77,9 @@ const ( // file the current directory or in parent directories. NoRoot - // TODO(jayconrod): add NeedRoot for commands like 'go mod vendor' that - // don't make sense without a main module. + // NeedRoot is used for commands that must run in module mode and don't + // make sense without a main module. + NeedRoot ) // ModFile returns the parsed go.mod file. @@ -172,6 +173,9 @@ func Init() { 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: cannot find main module; see 'go help modules'") + } if !mustUseModules { // GO111MODULE is 'auto', and we can't find a module root. // Stay in GOPATH mode. diff --git a/src/cmd/go/testdata/script/mod_off.txt b/src/cmd/go/testdata/script/mod_off.txt index cada6deb1d..a73a58d4d0 100644 --- a/src/cmd/go/testdata/script/mod_off.txt +++ b/src/cmd/go/testdata/script/mod_off.txt @@ -4,7 +4,7 @@ env GO111MODULE=off # GO111MODULE=off when outside of GOPATH will fatal # with an error message, even with some source code in the directory and a go.mod. ! go mod init -stderr 'go mod init: modules disabled by GO111MODULE=off; see ''go help modules''' +stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules''' ! go mod graph stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules''' ! go mod verify @@ -16,7 +16,7 @@ stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules''' mkdir z cd z ! go mod init -stderr 'go mod init: modules disabled by GO111MODULE=off; see ''go help modules''' +stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules''' ! go mod graph stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules''' ! go mod verify diff --git a/src/cmd/go/testdata/script/mod_off_init.txt b/src/cmd/go/testdata/script/mod_off_init.txt index 1339c8aef9..2aec0b3ed5 100644 --- a/src/cmd/go/testdata/script/mod_off_init.txt +++ b/src/cmd/go/testdata/script/mod_off_init.txt @@ -2,4 +2,4 @@ # ignored anyway due to GO111MODULE=off. env GO111MODULE=off ! go mod init -stderr 'go mod init: modules disabled by GO111MODULE=off; see ''go help modules''' +stderr 'go: modules disabled by GO111MODULE=off; see ''go help modules''' -- GitLab From f1c400a06393aad55cd4758fc78ccd7aec379ec0 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 15 Sep 2020 10:14:15 -0400 Subject: [PATCH 0495/1792] cmd/go: fix broken mod_outside test Since CL 254369, 'go mod graph' now reports an error when invoked outside a module. This broke the mod_outside test, which expected 'go mod graph' to succeed with no output. Change-Id: Ic30ee68f1f4c4d33795bdf7df70a7631fb9395e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/255017 Trust: Jay Conrod Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills TryBot-Result: Go Bot --- src/cmd/go/testdata/script/mod_outside.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cmd/go/testdata/script/mod_outside.txt b/src/cmd/go/testdata/script/mod_outside.txt index 2001c45c3c..e398f7bc40 100644 --- a/src/cmd/go/testdata/script/mod_outside.txt +++ b/src/cmd/go/testdata/script/mod_outside.txt @@ -69,10 +69,9 @@ go clean -n ! stdout . ! stderr . -# 'go mod graph' should not display anything, since there are no active modules. -go mod graph -! stdout . -! stderr . +# 'go mod graph' should fail, since there's no module graph. +! go mod graph +stderr 'cannot find main module' # 'go mod why' should fail, since there is no main module to depend on anything. ! go mod why -m example.com/version -- GitLab From de0957dc081e1ec49c99a0f37403ceadbaaedf85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Thu, 10 Sep 2020 22:53:59 +0100 Subject: [PATCH 0496/1792] cmd/go: relax version's error on unexpected flags MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In https://golang.org/cl/221397 we made commands like "go version -v" error, since both of the command's flags only make sense when arguments follow them. Without arguments, the command only reports Go's own version, and the flags are most likely a mistake. However, the script below is entirely reasonable: export GOFLAGS=-v # make all Go commands verbose go version go build After the previous CL, "go version" would error. Instead, only error if the flag was passed explicitly, and not via GOFLAGS. The patch does mean that we won't error on "GOFLAGS=-v go version -v", but that very unlikely false negative is okay. The error is only meant to help the user not misuse the flags, anyway - it's not a critical error of any sort. To reuse inGOFLAGS, we move it to the base package and export it there, since it's where the rest of the GOFLAGS funcs are. Fixes #41264. Change-Id: I74003dd25d94bacf9ac507b5cad778fd65233321 Reviewed-on: https://go-review.googlesource.com/c/go/+/254157 Trust: Daniel Martí Run-TryBot: Daniel Martí TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/base/goflags.go | 17 +++++++++++++++++ src/cmd/go/internal/version/version.go | 9 ++++++++- src/cmd/go/internal/work/init.go | 22 +++------------------- src/cmd/go/testdata/script/version.txt | 6 ++++++ 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/cmd/go/internal/base/goflags.go b/src/cmd/go/internal/base/goflags.go index f11f9a5d33..4da27550fd 100644 --- a/src/cmd/go/internal/base/goflags.go +++ b/src/cmd/go/internal/base/goflags.go @@ -130,3 +130,20 @@ func SetFromGOFLAGS(flags *flag.FlagSet) { } } } + +// InGOFLAGS returns whether GOFLAGS contains the given flag, such as "-mod". +func InGOFLAGS(flag string) bool { + for _, goflag := range GOFLAGS() { + name := goflag + if strings.HasPrefix(name, "--") { + name = name[1:] + } + if i := strings.Index(name, "="); i >= 0 { + name = name[:i] + } + if name == flag { + return true + } + } + return false +} diff --git a/src/cmd/go/internal/version/version.go b/src/cmd/go/internal/version/version.go index c2de8d326d..5aa0f8e7ed 100644 --- a/src/cmd/go/internal/version/version.go +++ b/src/cmd/go/internal/version/version.go @@ -54,7 +54,14 @@ var ( func runVersion(ctx context.Context, cmd *base.Command, args []string) { if len(args) == 0 { - if *versionM || *versionV { + // If any of this command's flags were passed explicitly, error + // out, because they only make sense with arguments. + // + // Don't error if the flags came from GOFLAGS, since that can be + // a reasonable use case. For example, imagine GOFLAGS=-v to + // turn "verbose mode" on for all Go commands, which should not + // break "go version". + if (!base.InGOFLAGS("-m") && *versionM) || (!base.InGOFLAGS("-v") && *versionV) { fmt.Fprintf(os.Stderr, "go version: flags can only be used with arguments\n") base.SetExitStatus(2) return diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go index f78020032c..d71387d323 100644 --- a/src/cmd/go/internal/work/init.go +++ b/src/cmd/go/internal/work/init.go @@ -254,34 +254,18 @@ func buildModeInit() { case "": // Behavior will be determined automatically, as if no flag were passed. case "readonly", "vendor", "mod": - if !cfg.ModulesEnabled && !inGOFLAGS("-mod") { + if !cfg.ModulesEnabled && !base.InGOFLAGS("-mod") { base.Fatalf("build flag -mod=%s only valid when using modules", cfg.BuildMod) } default: base.Fatalf("-mod=%s not supported (can be '', 'mod', 'readonly', or 'vendor')", cfg.BuildMod) } if !cfg.ModulesEnabled { - if cfg.ModCacheRW && !inGOFLAGS("-modcacherw") { + if cfg.ModCacheRW && !base.InGOFLAGS("-modcacherw") { base.Fatalf("build flag -modcacherw only valid when using modules") } - if cfg.ModFile != "" && !inGOFLAGS("-mod") { + if cfg.ModFile != "" && !base.InGOFLAGS("-mod") { base.Fatalf("build flag -modfile only valid when using modules") } } } - -func inGOFLAGS(flag string) bool { - for _, goflag := range base.GOFLAGS() { - name := goflag - if strings.HasPrefix(name, "--") { - name = name[1:] - } - if i := strings.Index(name, "="); i >= 0 { - name = name[:i] - } - if name == flag { - return true - } - } - return false -} diff --git a/src/cmd/go/testdata/script/version.txt b/src/cmd/go/testdata/script/version.txt index 81ca698620..8615a4aac5 100644 --- a/src/cmd/go/testdata/script/version.txt +++ b/src/cmd/go/testdata/script/version.txt @@ -9,6 +9,12 @@ stderr 'with arguments' ! go version -v stderr 'with arguments' +# Neither of the two flags above should be an issue via GOFLAGS. +env GOFLAGS='-m -v' +go version +stdout '^go version' +env GOFLAGS= + env GO111MODULE=on # Skip the builds below if we are running in short mode. [short] skip -- GitLab From 3ab825de9d50b24e2b97267a5d66dadb66399180 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 10 Sep 2020 09:34:15 -0400 Subject: [PATCH 0497/1792] cmd/go/internal/modget: warn about unmatched packages exactly once Due to an inverted condition, we were emitting a "matched no packages" warning twice in some cases and not at all in others. For #41315 Change-Id: I472cd2d4f75811c8734852f2bdd7346f4c612816 Reviewed-on: https://go-review.googlesource.com/c/go/+/254819 Trust: Bryan C. Mills Trust: Michael Matloob Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modget/get.go | 9 +++-- src/cmd/go/testdata/script/mod_get_nopkgs.txt | 40 +++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_get_nopkgs.txt diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 829cfe055a..1b5cf68840 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -609,9 +609,12 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { } prevBuildList = buildList } - if !*getD { - // Only print warnings after the last iteration, - // and only if we aren't going to build. + if *getD { + // Only print warnings after the last iteration, and only if we aren't going + // to build (to avoid doubled warnings). + // + // Only local patterns in the main module, such as './...', can be unmatched. + // (See the mod_get_nopkgs test for more detail.) search.WarnUnmatched(matches) } diff --git a/src/cmd/go/testdata/script/mod_get_nopkgs.txt b/src/cmd/go/testdata/script/mod_get_nopkgs.txt new file mode 100644 index 0000000000..078e71a041 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_nopkgs.txt @@ -0,0 +1,40 @@ +cd subdir + +# 'go get' on empty patterns that are necessarily local to the module +# should warn that the patterns are empty, exactly once. + +go get ./... +stderr -count=1 'matched no packages' + +go get -d ./... +stderr -count=1 'matched no packages' + +# 'go get' on patterns that could conceivably match nested modules +# should report a module resolution error. + +go get -d example.net/emptysubdir/... # control case + +! go get -d example.net/emptysubdir/subdir/... +! stderr 'matched no packages' +stderr '^go get example\.net/emptysubdir/subdir/\.\.\.: module example\.net/emptysubdir/subdir: reading http://.*: 404 Not Found\n\tserver response: 404 page not found\n\z' + +# It doesn't make sense to 'go get' a path in the standard library, +# since the standard library necessarily can't have unresolved imports. +# +# TODO(#30241): Maybe that won't always be the case? +# +# For that case, we emit a "malformed module path" error message, +# which isn't ideal either. + +! go get -d builtin/... # in GOROOT/src, but contains no packages +stderr '^go get builtin/...: malformed module path "builtin": missing dot in first path element$' + +-- go.mod -- +module example.net/emptysubdir + +go 1.16 +-- emptysubdir.go -- +// Package emptysubdir has a subdirectory containing no packages. +package emptysubdir +-- subdir/README.txt -- +This module intentionally does not contain any p -- GitLab From dbde566219336e84360b4a38da10b5f63b19021e Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 9 Sep 2020 16:53:08 -0400 Subject: [PATCH 0498/1792] cmd/go: default to -mod=readonly in most commands For #40728 Change-Id: I6618f1b5a632e8b353a483a83bb0cdf4ef6df72c Reviewed-on: https://go-review.googlesource.com/c/go/+/251881 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Michael Matloob Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 85 +++++++++---------- src/cmd/go/internal/modload/help.go | 85 +++++++++---------- src/cmd/go/internal/modload/init.go | 18 ++-- src/cmd/go/testdata/script/mod_readonly.txt | 15 +++- .../go/testdata/script/mod_replace_import.txt | 5 +- 5 files changed, 96 insertions(+), 112 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 104aea6c7f..b7e5bbed2d 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -2613,72 +2613,63 @@ // // Maintaining module requirements // -// The go.mod file is meant to be readable and editable by both -// programmers and tools. The go command itself automatically updates the go.mod file -// to maintain a standard formatting and the accuracy of require statements. -// -// Any go command that finds an unfamiliar import will look up the module -// containing that import and add the latest version of that module -// to go.mod automatically. In most cases, therefore, it suffices to -// add an import to source code and run 'go build', 'go test', or even 'go list': -// as part of analyzing the package, the go command will discover -// and resolve the import and update the go.mod file. -// -// Any go command can determine that a module requirement is -// missing and must be added, even when considering only a single -// package from the module. On the other hand, determining that a module requirement -// is no longer necessary and can be deleted requires a full view of -// all packages in the module, across all possible build configurations -// (architectures, operating systems, build tags, and so on). -// The 'go mod tidy' command builds that view and then -// adds any missing module requirements and removes unnecessary ones. +// The go.mod file is meant to be readable and editable by both programmers and +// tools. Most updates to dependencies can be performed using "go get" and +// "go mod tidy". Other module-aware build commands may be invoked using the +// -mod=mod flag to automatically add missing requirements and fix inconsistencies. +// +// The "go get" command updates go.mod to change the module versions used in a +// build. An upgrade of one module may imply upgrading others, and similarly a +// downgrade of one module may imply downgrading others. The "go get" command +// makes these implied changes as well. See "go help module-get". +// +// The "go mod" command provides other functionality for use in maintaining +// and understanding modules and go.mod files. See "go help mod", particularly +// "go help mod tidy" and "go help mod edit". // // As part of maintaining the require statements in go.mod, the go command // tracks which ones provide packages imported directly by the current module // and which ones provide packages only used indirectly by other module // dependencies. Requirements needed only for indirect uses are marked with a -// "// indirect" comment in the go.mod file. Indirect requirements are +// "// indirect" comment in the go.mod file. Indirect requirements may be // automatically removed from the go.mod file once they are implied by other // direct requirements. Indirect requirements only arise when using modules // that fail to state some of their own dependencies or when explicitly // upgrading a module's dependencies ahead of its own stated requirements. // -// Because of this automatic maintenance, the information in go.mod is an -// up-to-date, readable description of the build. -// -// The 'go get' command updates go.mod to change the module versions used in a -// build. An upgrade of one module may imply upgrading others, and similarly a -// downgrade of one module may imply downgrading others. The 'go get' command -// makes these implied changes as well. If go.mod is edited directly, commands -// like 'go build' or 'go list' will assume that an upgrade is intended and -// automatically make any implied upgrades and update go.mod to reflect them. -// -// The 'go mod' command provides other functionality for use in maintaining -// and understanding modules and go.mod files. See 'go help mod'. -// -// The -mod build flag provides additional control over updating and use of go.mod. -// -// If invoked with -mod=readonly, the go command is disallowed from the implicit -// automatic updating of go.mod described above. Instead, it fails when any changes -// to go.mod are needed. This setting is most useful to check that go.mod does -// not need updates, such as in a continuous integration and testing system. -// The "go get" command remains permitted to update go.mod even with -mod=readonly, -// and the "go mod" commands do not take the -mod flag (or any other build flags). +// The -mod build flag provides additional control over the updating and use of +// go.mod for commands that build packages like "go build" and "go test". +// +// If invoked with -mod=readonly (the default in most situations), the go command +// reports an error if a package named on the command line or an imported package +// is not provided by any module in the build list computed from the main module's +// requirements. The go command also reports an error if a module's checksum is +// missing from go.sum (see Module downloading and verification). Either go.mod or +// go.sum must be updated in these situations. +// +// If invoked with -mod=mod, the go command automatically updates go.mod and +// go.sum, fixing inconsistencies and adding missing requirements and checksums +// as needed. If the go command finds an unfamiliar import, it looks up the +// module containing that import and adds a requirement for the latest version +// of that module to go.mod. In most cases, therefore, one may add an import to +// source code and run "go build", "go test", or even "go list" with -mod=mod: +// as part of analyzing the package, the go command will resolve the import and +// update the go.mod file. // // If invoked with -mod=vendor, the go command loads packages from the main // module's vendor directory instead of downloading modules to and loading packages // from the module cache. The go command assumes the vendor directory holds // correct copies of dependencies, and it does not compute the set of required // module versions from go.mod files. However, the go command does check that -// vendor/modules.txt (generated by 'go mod vendor') contains metadata consistent +// vendor/modules.txt (generated by "go mod vendor") contains metadata consistent // with go.mod. // -// If invoked with -mod=mod, the go command loads modules from the module cache -// even if there is a vendor directory present. +// If the go command is not invoked with a -mod flag, and the vendor directory +// is present, and the "go" version in go.mod is 1.14 or higher, the go command +// will act as if it were invoked with -mod=vendor. Otherwise, the -mod flag +// defaults to -mod=readonly. // -// If the go command is not invoked with a -mod flag and the vendor directory -// is present and the "go" version in go.mod is 1.14 or higher, the go command -// will act as if it were invoked with -mod=vendor. +// Note that neither "go get" nor the "go mod" subcommands accept the -mod flag. // // Pseudo-versions // diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go index 37f23d967f..56920c28b9 100644 --- a/src/cmd/go/internal/modload/help.go +++ b/src/cmd/go/internal/modload/help.go @@ -124,72 +124,63 @@ and the build list. For example: Maintaining module requirements -The go.mod file is meant to be readable and editable by both -programmers and tools. The go command itself automatically updates the go.mod file -to maintain a standard formatting and the accuracy of require statements. - -Any go command that finds an unfamiliar import will look up the module -containing that import and add the latest version of that module -to go.mod automatically. In most cases, therefore, it suffices to -add an import to source code and run 'go build', 'go test', or even 'go list': -as part of analyzing the package, the go command will discover -and resolve the import and update the go.mod file. - -Any go command can determine that a module requirement is -missing and must be added, even when considering only a single -package from the module. On the other hand, determining that a module requirement -is no longer necessary and can be deleted requires a full view of -all packages in the module, across all possible build configurations -(architectures, operating systems, build tags, and so on). -The 'go mod tidy' command builds that view and then -adds any missing module requirements and removes unnecessary ones. +The go.mod file is meant to be readable and editable by both programmers and +tools. Most updates to dependencies can be performed using "go get" and +"go mod tidy". Other module-aware build commands may be invoked using the +-mod=mod flag to automatically add missing requirements and fix inconsistencies. + +The "go get" command updates go.mod to change the module versions used in a +build. An upgrade of one module may imply upgrading others, and similarly a +downgrade of one module may imply downgrading others. The "go get" command +makes these implied changes as well. See "go help module-get". + +The "go mod" command provides other functionality for use in maintaining +and understanding modules and go.mod files. See "go help mod", particularly +"go help mod tidy" and "go help mod edit". As part of maintaining the require statements in go.mod, the go command tracks which ones provide packages imported directly by the current module and which ones provide packages only used indirectly by other module dependencies. Requirements needed only for indirect uses are marked with a -"// indirect" comment in the go.mod file. Indirect requirements are +"// indirect" comment in the go.mod file. Indirect requirements may be automatically removed from the go.mod file once they are implied by other direct requirements. Indirect requirements only arise when using modules that fail to state some of their own dependencies or when explicitly upgrading a module's dependencies ahead of its own stated requirements. -Because of this automatic maintenance, the information in go.mod is an -up-to-date, readable description of the build. - -The 'go get' command updates go.mod to change the module versions used in a -build. An upgrade of one module may imply upgrading others, and similarly a -downgrade of one module may imply downgrading others. The 'go get' command -makes these implied changes as well. If go.mod is edited directly, commands -like 'go build' or 'go list' will assume that an upgrade is intended and -automatically make any implied upgrades and update go.mod to reflect them. - -The 'go mod' command provides other functionality for use in maintaining -and understanding modules and go.mod files. See 'go help mod'. - -The -mod build flag provides additional control over updating and use of go.mod. - -If invoked with -mod=readonly, the go command is disallowed from the implicit -automatic updating of go.mod described above. Instead, it fails when any changes -to go.mod are needed. This setting is most useful to check that go.mod does -not need updates, such as in a continuous integration and testing system. -The "go get" command remains permitted to update go.mod even with -mod=readonly, -and the "go mod" commands do not take the -mod flag (or any other build flags). +The -mod build flag provides additional control over the updating and use of +go.mod for commands that build packages like "go build" and "go test". + +If invoked with -mod=readonly (the default in most situations), the go command +reports an error if a package named on the command line or an imported package +is not provided by any module in the build list computed from the main module's +requirements. The go command also reports an error if a module's checksum is +missing from go.sum (see Module downloading and verification). Either go.mod or +go.sum must be updated in these situations. + +If invoked with -mod=mod, the go command automatically updates go.mod and +go.sum, fixing inconsistencies and adding missing requirements and checksums +as needed. If the go command finds an unfamiliar import, it looks up the +module containing that import and adds a requirement for the latest version +of that module to go.mod. In most cases, therefore, one may add an import to +source code and run "go build", "go test", or even "go list" with -mod=mod: +as part of analyzing the package, the go command will resolve the import and +update the go.mod file. If invoked with -mod=vendor, the go command loads packages from the main module's vendor directory instead of downloading modules to and loading packages from the module cache. The go command assumes the vendor directory holds correct copies of dependencies, and it does not compute the set of required module versions from go.mod files. However, the go command does check that -vendor/modules.txt (generated by 'go mod vendor') contains metadata consistent +vendor/modules.txt (generated by "go mod vendor") contains metadata consistent with go.mod. -If invoked with -mod=mod, the go command loads modules from the module cache -even if there is a vendor directory present. +If the go command is not invoked with a -mod flag, and the vendor directory +is present, and the "go" version in go.mod is 1.14 or higher, the go command +will act as if it were invoked with -mod=vendor. Otherwise, the -mod flag +defaults to -mod=readonly. -If the go command is not invoked with a -mod flag and the vendor directory -is present and the "go" version in go.mod is 1.14 or higher, the go command -will act as if it were invoked with -mod=vendor. +Note that neither "go get" nor the "go mod" subcommands accept the -mod flag. Pseudo-versions diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index f93abee96d..60aadf23ea 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -571,7 +571,7 @@ func setDefaultBuildMod() { return } if modRoot == "" { - cfg.BuildMod = "mod" + cfg.BuildMod = "readonly" return } @@ -594,13 +594,7 @@ func setDefaultBuildMod() { cfg.BuildModReason = fmt.Sprintf("Go version in go.mod is %s, so vendor directory was not used.", modGo) } - p := ModFilePath() - if fi, err := os.Stat(p); err == nil && !hasWritePerm(p, fi) { - cfg.BuildMod = "readonly" - cfg.BuildModReason = "go.mod file is read-only." - return - } - cfg.BuildMod = "mod" + cfg.BuildMod = "readonly" } func legacyModInit() { @@ -898,10 +892,12 @@ func WriteGoMod() { if dirty && cfg.BuildMod == "readonly" { // If we're about to fail due to -mod=readonly, // prefer to report a dirty go.mod over a dirty go.sum - if cfg.BuildModReason != "" { - base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly\n\t(%s)", cfg.BuildModReason) - } else if cfg.BuildModExplicit { + if cfg.BuildModExplicit { base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly") + } else if cfg.BuildModReason != "" { + base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly\n\t(%s)", cfg.BuildModReason) + } else { + base.Fatalf("go: updates to go.mod needed; try 'go mod tidy' first") } } diff --git a/src/cmd/go/testdata/script/mod_readonly.txt b/src/cmd/go/testdata/script/mod_readonly.txt index ac581264f1..a8458fdea3 100644 --- a/src/cmd/go/testdata/script/mod_readonly.txt +++ b/src/cmd/go/testdata/script/mod_readonly.txt @@ -10,13 +10,12 @@ stderr '^x.go:2:8: cannot find module providing package rsc\.io/quote: import lo ! stderr '\(\)' # If we don't have a reason for -mod=readonly, don't log an empty one. cmp go.mod go.mod.empty -# -mod=readonly should be set implicitly if the go.mod file is read-only -chmod 0400 go.mod +# -mod=readonly should be set by default. env GOFLAGS= ! go list all -stderr '^x.go:2:8: cannot find module providing package rsc\.io/quote: import lookup disabled by -mod=readonly\n\t\(go.mod file is read-only\.\)$' +stderr '^x.go:2:8: cannot find module providing package rsc\.io/quote$' +cmp go.mod go.mod.empty -chmod 0600 go.mod env GOFLAGS=-mod=readonly # update go.mod - go get allowed @@ -48,18 +47,26 @@ cp go.mod go.mod.inconsistent stderr 'go: updates to go.mod needed, disabled by -mod=readonly' cmp go.mod go.mod.inconsistent +# We get a different message when -mod=readonly is used by default. +env GOFLAGS= +! go list +stderr '^go: updates to go.mod needed; try ''go mod tidy'' first$' + # However, it should not reject files missing a 'go' directive, # since that was not always required. cp go.mod.nogo go.mod go list all +cmp go.mod go.mod.nogo # Nor should it reject files with redundant (not incorrect) # requirements. cp go.mod.redundant go.mod go list all +cmp go.mod go.mod.redundant cp go.mod.indirect go.mod go list all +cmp go.mod go.mod.indirect -- go.mod -- module m diff --git a/src/cmd/go/testdata/script/mod_replace_import.txt b/src/cmd/go/testdata/script/mod_replace_import.txt index b4de5c50f7..407a6cef7d 100644 --- a/src/cmd/go/testdata/script/mod_replace_import.txt +++ b/src/cmd/go/testdata/script/mod_replace_import.txt @@ -1,9 +1,8 @@ env GO111MODULE=on -# 'go list -mod=readonly' should not add requirements even if they can be -# resolved locally. +# 'go list' should not add requirements even if they can be resolved locally. cp go.mod go.mod.orig -! go list -mod=readonly all +! go list all cmp go.mod go.mod.orig # 'go list' should resolve imports using replacements. -- GitLab From 8248b5791cd825f80c55e972c1e96c6fadf5885e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 14 Sep 2020 15:56:59 -0400 Subject: [PATCH 0499/1792] cmd/go/internal/modget: factor out functions for argument resolution For #37438 For #41315 For #36460 Change-Id: I17041c35ec91ff6ffb547e0f32572673d191b1ed Reviewed-on: https://go-review.googlesource.com/c/go/+/254820 Trust: Bryan C. Mills Trust: Jay Conrod Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- src/cmd/go/internal/modget/get.go | 340 ++++++++++++++++-------------- 1 file changed, 184 insertions(+), 156 deletions(-) diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 1b5cf68840..0c501e3885 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -225,6 +225,8 @@ type getArg struct { vers string } +func (arg getArg) String() string { return arg.raw } + // querySpec describes a query for a specific module. path may be a // module path, package path, or package pattern. vers is a version // query string from a command line argument. @@ -278,13 +280,6 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { } modload.LoadTests = *getT - buildList := modload.LoadAllModules(ctx) - buildList = buildList[:len(buildList):len(buildList)] // copy on append - versionByPath := make(map[string]string) - for _, m := range buildList { - versionByPath[m.Path] = m.Version - } - // Do not allow any updating of go.mod until we've applied // all the requested changes and checked that the result matches // what was requested. @@ -294,150 +289,15 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // 'go get' is expected to do this, unlike other commands. modload.AllowMissingModuleImports() - // Parse command-line arguments and report errors. The command-line - // arguments are of the form path@version or simply path, with implicit - // @upgrade. path@none is "downgrade away". - var gets []getArg - var queries []*query - for _, arg := range search.CleanPatterns(args) { - // Argument is path or path@vers. - path := arg - vers := "" - if i := strings.Index(arg, "@"); i >= 0 { - path, vers = arg[:i], arg[i+1:] - } - if strings.Contains(vers, "@") || arg != path && vers == "" { - base.Errorf("go get %s: invalid module version syntax", arg) - continue - } - - // Guard against 'go get x.go', a common mistake. - // Note that package and module paths may end with '.go', so only print an error - // if the argument has no version and either has no slash or refers to an existing file. - if strings.HasSuffix(arg, ".go") && vers == "" { - if !strings.Contains(arg, "/") { - base.Errorf("go get %s: arguments must be package or module paths", arg) - continue - } - if fi, err := os.Stat(arg); err == nil && !fi.IsDir() { - base.Errorf("go get: %s exists as a file, but 'go get' requires package arguments", arg) - continue - } - } - - // If no version suffix is specified, assume @upgrade. - // If -u=patch was specified, assume @patch instead. - if vers == "" { - if getU != "" { - vers = string(getU) - } else { - vers = "upgrade" - } - } - - gets = append(gets, getArg{raw: arg, path: path, vers: vers}) - - // Determine the modules that path refers to, and create queries - // to lookup modules at target versions before loading packages. - // This is an imprecise process, but it helps reduce unnecessary - // queries and package loading. It's also necessary for handling - // patterns like golang.org/x/tools/..., which can't be expanded - // during package loading until they're in the build list. - switch { - case filepath.IsAbs(path) || search.IsRelativePath(path): - // Absolute paths like C:\foo and relative paths like ../foo... - // are restricted to matching packages in the main module. If the path - // is explicit and contains no wildcards (...), check that it is a - // package in the main module. If the path contains wildcards but - // matches no packages, we'll warn after package loading. - if !strings.Contains(path, "...") { - m := search.NewMatch(path) - if pkgPath := modload.DirImportPath(path); pkgPath != "." { - m = modload.TargetPackages(ctx, pkgPath) - } - if len(m.Pkgs) == 0 { - for _, err := range m.Errs { - base.Errorf("go get %s: %v", arg, err) - } - - abs, err := filepath.Abs(path) - if err != nil { - abs = path - } - base.Errorf("go get %s: path %s is not a package in module rooted at %s", arg, abs, modload.ModRoot()) - continue - } - } - - if path != arg { - base.Errorf("go get %s: can't request explicit version of path in main module", arg) - continue - } + getArgs := parseArgs(args) - case strings.Contains(path, "..."): - // Wait until we load packages to look up modules. - // We don't know yet whether any modules in the build list provide - // packages matching the pattern. For example, suppose - // golang.org/x/tools and golang.org/x/tools/playground are separate - // modules, and only golang.org/x/tools is in the build list. If the - // user runs 'go get golang.org/x/tools/playground/...', we should - // add a requirement for golang.org/x/tools/playground. We should not - // upgrade golang.org/x/tools. - - case path == "all": - // If there is no main module, "all" is not meaningful. - if !modload.HasModRoot() { - base.Errorf(`go get %s: cannot match "all": working directory is not part of a module`, arg) - } - // Don't query modules until we load packages. We'll automatically - // look up any missing modules. - - case search.IsMetaPackage(path): - base.Errorf("go get %s: explicit requirement on standard-library module %s not allowed", path, path) - continue - - default: - // The argument is a package or module path. - if modload.HasModRoot() { - if m := modload.TargetPackages(ctx, path); len(m.Pkgs) != 0 { - // The path is in the main module. Nothing to query. - if vers != "upgrade" && vers != "patch" { - base.Errorf("go get %s: can't request explicit version of path in main module", arg) - } - continue - } - } - - first := path - if i := strings.IndexByte(first, '/'); i >= 0 { - first = path - } - if !strings.Contains(first, ".") { - // The path doesn't have a dot in the first component and cannot be - // queried as a module. It may be a package in the standard library, - // which is fine, so don't report an error unless we encounter - // a problem loading packages below. - continue - } - - // If we're querying "upgrade" or "patch", we need to know the current - // version of the module. For "upgrade", we want to avoid accidentally - // downgrading from a newer prerelease. For "patch", we need to query - // the correct minor version. - // Here, we check if "path" is the name of a module in the build list - // (other than the main module) and set prevM if so. If "path" isn't - // a module in the build list, the current version doesn't matter - // since it's either an unknown module or a package within a module - // that we'll discover later. - q := &query{querySpec: querySpec{path: path, vers: vers}, arg: arg} - if v, ok := versionByPath[path]; ok && path != modload.Target.Path { - q.prevM = module.Version{Path: path, Version: v} - q.forceModulePath = true - } - queries = append(queries, q) - } + buildList := modload.LoadAllModules(ctx) + buildList = buildList[:len(buildList):len(buildList)] // copy on append + selectedVersion := make(map[string]string) + for _, m := range buildList { + selectedVersion[m.Path] = m.Version } - base.ExitIfErrors() + queries := classifyArgs(ctx, selectedVersion, getArgs) // Query modules referenced by command line arguments at requested versions. // We need to do this before loading packages since patterns that refer to @@ -450,11 +310,11 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // We call SetBuildList here and elsewhere, since newUpgrader, // ImportPathsQuiet, and other functions read the global build list. for _, q := range queries { - if _, ok := versionByPath[q.m.Path]; !ok && q.m.Version != "none" { + if _, ok := selectedVersion[q.m.Path]; !ok && q.m.Version != "none" { buildList = append(buildList, q.m) } } - versionByPath = nil // out of date now; rebuilt later when needed + selectedVersion = nil // out of date now; rebuilt later when needed modload.SetBuildList(buildList) // Upgrade modules specifically named on the command line. This is our only @@ -508,7 +368,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // Build a list of arguments that may refer to packages. var pkgPatterns []string var pkgGets []getArg - for _, arg := range gets { + for _, arg := range getArgs { if modOnly[arg.path] == nil && arg.vers != "none" { pkgPatterns = append(pkgPatterns, arg.path) pkgGets = append(pkgGets, arg) @@ -643,12 +503,12 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { // Scan for any upgrades lost by the downgrades. var lostUpgrades []*query if len(down) > 0 { - versionByPath = make(map[string]string) + selectedVersion = make(map[string]string) for _, m := range modload.LoadedModules() { - versionByPath[m.Path] = m.Version + selectedVersion[m.Path] = m.Version } for _, q := range byPath { - if v, ok := versionByPath[q.m.Path]; q.m.Version != "none" && (!ok || semver.Compare(v, q.m.Version) != 0) { + if v, ok := selectedVersion[q.m.Path]; q.m.Version != "none" && (!ok || semver.Compare(v, q.m.Version) != 0) { lostUpgrades = append(lostUpgrades, q) } } @@ -695,7 +555,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { if sep != "," { // We have no idea why this happened. // At least report the problem. - if v := versionByPath[q.m.Path]; v == "" { + if v := selectedVersion[q.m.Path]; v == "" { fmt.Fprintf(&buf, " removed unexpectedly") } else { fmt.Fprintf(&buf, " ended up at %s unexpectedly", v) @@ -735,6 +595,174 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { work.InstallPackages(ctx, pkgPatterns, pkgs) } +// 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(rawArgs []string) []getArg { + defer base.ExitIfErrors() + + var gets []getArg + for _, raw := range search.CleanPatterns(rawArgs) { + // Argument is path or path@vers. + path := raw + vers := "" + if i := strings.Index(raw, "@"); i >= 0 { + path, vers = raw[:i], raw[i+1:] + } + if strings.Contains(vers, "@") || raw != path && vers == "" { + base.Errorf("go get %s: invalid module version syntax", raw) + continue + } + + // Guard against 'go get x.go', a common mistake. + // Note that package and module paths may end with '.go', so only print an error + // if the argument has no version and either has no slash or refers to an existing file. + if strings.HasSuffix(raw, ".go") && vers == "" { + if !strings.Contains(raw, "/") { + base.Errorf("go get %s: arguments must be package or module paths", raw) + continue + } + if fi, err := os.Stat(raw); err == nil && !fi.IsDir() { + base.Errorf("go get: %s exists as a file, but 'go get' requires package arguments", raw) + continue + } + } + + // If no version suffix is specified, assume @upgrade. + // If -u=patch was specified, assume @patch instead. + if vers == "" { + if getU != "" { + vers = string(getU) + } else { + vers = "upgrade" + } + } + + gets = append(gets, getArg{raw: raw, path: path, vers: vers}) + } + + return gets +} + +// classifyArgs determines which arguments refer to packages and which refer to +// modules, and creates queries to look up modules at target versions before +// loading packages. +// +// This is an imprecise process, but it helps reduce unnecessary +// queries and package loading. It's also necessary for handling +// patterns like golang.org/x/tools/..., which can't be expanded +// during package loading until they're in the build list. +func classifyArgs(ctx context.Context, selectedVersion map[string]string, args []getArg) []*query { + defer base.ExitIfErrors() + + queries := make([]*query, 0, len(args)) + + for _, arg := range args { + path := arg.path + switch { + case filepath.IsAbs(path) || search.IsRelativePath(path): + // Absolute paths like C:\foo and relative paths like ../foo... + // are restricted to matching packages in the main module. If the path + // is explicit and contains no wildcards (...), check that it is a + // package in the main module. If the path contains wildcards but + // matches no packages, we'll warn after package loading. + if !strings.Contains(path, "...") { + m := search.NewMatch(path) + if pkgPath := modload.DirImportPath(path); pkgPath != "." { + m = modload.TargetPackages(ctx, pkgPath) + } + if len(m.Pkgs) == 0 { + for _, err := range m.Errs { + base.Errorf("go get %s: %v", arg, err) + } + + abs, err := filepath.Abs(path) + if err != nil { + abs = path + } + base.Errorf("go get %s: path %s is not a package in module rooted at %s", arg, abs, modload.ModRoot()) + continue + } + } + + if arg.path != arg.raw { + base.Errorf("go get %s: can't request explicit version of path in main module", arg) + continue + } + + case strings.Contains(path, "..."): + // Wait until we load packages to look up modules. + // We don't know yet whether any modules in the build list provide + // packages matching the pattern. For example, suppose + // golang.org/x/tools and golang.org/x/tools/playground are separate + // modules, and only golang.org/x/tools is in the build list. If the + // user runs 'go get golang.org/x/tools/playground/...', we should + // add a requirement for golang.org/x/tools/playground. We should not + // upgrade golang.org/x/tools. + + case path == "all": + // If there is no main module, "all" is not meaningful. + if !modload.HasModRoot() { + base.Errorf(`go get %s: cannot match "all": working directory is not part of a module`, arg) + } + // Don't query modules until we load packages. We'll automatically + // look up any missing modules. + + case search.IsMetaPackage(path): + base.Errorf("go get %s: explicit requirement on standard-library module %s not allowed", path, path) + continue + + default: + // The argument is a package or module path. + if modload.HasModRoot() { + if m := modload.TargetPackages(ctx, path); len(m.Pkgs) != 0 { + // The path is in the main module. Nothing to query. + if arg.vers != "upgrade" && arg.vers != "patch" { + base.Errorf("go get %s: can't request explicit version of path in main module", arg) + } + continue + } + } + + first := path + if i := strings.IndexByte(first, '/'); i >= 0 { + first = path + } + if !strings.Contains(first, ".") { + // The path doesn't have a dot in the first component and cannot be + // queried as a module. It may be a package in the standard library, + // which is fine, so don't report an error unless we encounter + // a problem loading packages. + continue + } + + // If we're querying "upgrade" or "patch", we need to know the current + // version of the module. For "upgrade", we want to avoid accidentally + // downgrading from a newer prerelease. For "patch", we need to query + // the correct minor version. + // Here, we check if "path" is the name of a module in the build list + // (other than the main module) and set prevM if so. If "path" isn't + // a module in the build list, the current version doesn't matter + // since it's either an unknown module or a package within a module + // that we'll discover later. + q := &query{querySpec: querySpec{path: arg.path, vers: arg.vers}, arg: arg.raw} + if v, ok := selectedVersion[path]; ok { + if path == modload.Target.Path { + // TODO(bcmills): This is held over from a previous version of the get + // implementation. Why was it a special case? + } else { + q.prevM = module.Version{Path: path, Version: v} + q.forceModulePath = true + } + } + queries = append(queries, q) + } + } + + return queries +} + // runQueries looks up modules at target versions in parallel. Results will be // cached. If the same module is referenced by multiple queries at different // versions (including earlier queries in the modOnly map), an error will be -- GitLab From b6dbaef68fdbb3f14387e4c32a8890144220f54e Mon Sep 17 00:00:00 2001 From: Henrique Vicente Date: Mon, 17 Feb 2020 02:22:47 +0100 Subject: [PATCH 0500/1792] os/signal: add NotifyContext to cancel context using system signals Fixes #37255 Change-Id: Ic0fde3498afefed6e4447f8476e4da7c1faa7145 Reviewed-on: https://go-review.googlesource.com/c/go/+/219640 Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Trust: Giovanni Bajo Reviewed-by: Ian Lance Taylor --- src/os/signal/example_unix_test.go | 47 +++++++++ src/os/signal/signal.go | 75 +++++++++++++ src/os/signal/signal_test.go | 162 +++++++++++++++++++++++++++++ 3 files changed, 284 insertions(+) create mode 100644 src/os/signal/example_unix_test.go diff --git a/src/os/signal/example_unix_test.go b/src/os/signal/example_unix_test.go new file mode 100644 index 0000000000..a0af37a5bb --- /dev/null +++ b/src/os/signal/example_unix_test.go @@ -0,0 +1,47 @@ +// 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 aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package signal_test + +import ( + "context" + "fmt" + "log" + "os" + "os/signal" + "time" +) + +// This example passes a context with a signal to tell a blocking function that +// it should abandon its work after a signal is received. +func ExampleNotifyContext() { + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) + defer stop() + + p, err := os.FindProcess(os.Getpid()) + if err != nil { + log.Fatal(err) + } + + // On a Unix-like system, pressing Ctrl+C on a keyboard sends a + // SIGINT signal to the process of the program in execution. + // + // This example simulates that by sending a SIGINT signal to itself. + if err := p.Signal(os.Interrupt); err != nil { + log.Fatal(err) + } + + select { + case <-time.After(time.Second): + fmt.Println("missed signal") + case <-ctx.Done(): + fmt.Println(ctx.Err()) // prints "context canceled" + stop() // stop receiving signal notifications as soon as possible. + } + + // Output: + // context canceled +} diff --git a/src/os/signal/signal.go b/src/os/signal/signal.go index 8e31aa2627..4250a7e0de 100644 --- a/src/os/signal/signal.go +++ b/src/os/signal/signal.go @@ -5,6 +5,7 @@ package signal import ( + "context" "os" "sync" ) @@ -257,3 +258,77 @@ func process(sig os.Signal) { } } } + +// NotifyContext returns a copy of the parent context that is marked done +// (its Done channel is closed) when one of the listed signals arrives, +// when the returned stop function is called, or when the parent context's +// Done channel is closed, whichever happens first. +// +// The stop function unregisters the signal behavior, which, like signal.Reset, +// may restore the default behavior for a given signal. For example, the default +// behavior of a Go program receiving os.Interrupt is to exit. Calling +// NotifyContext(parent, os.Interrupt) will change the behavior to cancel +// the returned context. Future interrupts received will not trigger the default +// (exit) behavior until the returned stop function is called. +// +// The stop function releases resources associated with it, so code should +// call stop as soon as the operations running in this Context complete and +// signals no longer need to be diverted to the context. +func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc) { + ctx, cancel := context.WithCancel(parent) + c := &signalCtx{ + Context: ctx, + cancel: cancel, + signals: signals, + } + c.ch = make(chan os.Signal, 1) + Notify(c.ch, c.signals...) + if ctx.Err() == nil { + go func() { + select { + case <-c.ch: + c.cancel() + case <-c.Done(): + } + }() + } + return c, c.stop +} + +type signalCtx struct { + context.Context + + cancel context.CancelFunc + signals []os.Signal + ch chan os.Signal +} + +func (c *signalCtx) stop() { + c.cancel() + Stop(c.ch) +} + +type stringer interface { + String() string +} + +func (c *signalCtx) String() string { + var buf []byte + // We know that the type of c.Context is context.cancelCtx, and we know that the + // String method of cancelCtx returns a string that ends with ".WithCancel". + name := c.Context.(stringer).String() + name = name[:len(name)-len(".WithCancel")] + buf = append(buf, "signal.NotifyContext("+name...) + if len(c.signals) != 0 { + buf = append(buf, ", ["...) + for i, s := range c.signals { + buf = append(buf, s.String()...) + if i != len(c.signals)-1 { + buf = append(buf, ' ') + } + } + buf = append(buf, ']') + } + buf = append(buf, ')') + return string(buf) +} diff --git a/src/os/signal/signal_test.go b/src/os/signal/signal_test.go index f0e06b8795..23e33fe82b 100644 --- a/src/os/signal/signal_test.go +++ b/src/os/signal/signal_test.go @@ -8,6 +8,7 @@ package signal import ( "bytes" + "context" "flag" "fmt" "internal/testenv" @@ -674,3 +675,164 @@ func TestTime(t *testing.T) { close(stop) <-done } + +func TestNotifyContext(t *testing.T) { + c, stop := NotifyContext(context.Background(), syscall.SIGINT) + defer stop() + + if want, got := "signal.NotifyContext(context.Background, [interrupt])", fmt.Sprint(c); want != got { + t.Errorf("c.String() = %q, want %q", got, want) + } + + syscall.Kill(syscall.Getpid(), syscall.SIGINT) + select { + case <-c.Done(): + if got := c.Err(); got != context.Canceled { + t.Errorf("c.Err() = %q, want %q", got, context.Canceled) + } + case <-time.After(time.Second): + t.Errorf("timed out waiting for context to be done after SIGINT") + } +} + +func TestNotifyContextStop(t *testing.T) { + Ignore(syscall.SIGHUP) + if !Ignored(syscall.SIGHUP) { + t.Errorf("expected SIGHUP to be ignored when explicitly ignoring it.") + } + + parent, cancelParent := context.WithCancel(context.Background()) + defer cancelParent() + c, stop := NotifyContext(parent, syscall.SIGHUP) + defer stop() + + // If we're being notified, then the signal should not be ignored. + if Ignored(syscall.SIGHUP) { + t.Errorf("expected SIGHUP to not be ignored.") + } + + if want, got := "signal.NotifyContext(context.Background.WithCancel, [hangup])", fmt.Sprint(c); want != got { + t.Errorf("c.String() = %q, wanted %q", got, want) + } + + stop() + select { + case <-c.Done(): + if got := c.Err(); got != context.Canceled { + t.Errorf("c.Err() = %q, want %q", got, context.Canceled) + } + case <-time.After(time.Second): + t.Errorf("timed out waiting for context to be done after calling stop") + } +} + +func TestNotifyContextCancelParent(t *testing.T) { + parent, cancelParent := context.WithCancel(context.Background()) + defer cancelParent() + c, stop := NotifyContext(parent, syscall.SIGINT) + defer stop() + + if want, got := "signal.NotifyContext(context.Background.WithCancel, [interrupt])", fmt.Sprint(c); want != got { + t.Errorf("c.String() = %q, want %q", got, want) + } + + cancelParent() + select { + case <-c.Done(): + if got := c.Err(); got != context.Canceled { + t.Errorf("c.Err() = %q, want %q", got, context.Canceled) + } + case <-time.After(time.Second): + t.Errorf("timed out waiting for parent context to be canceled") + } +} + +func TestNotifyContextPrematureCancelParent(t *testing.T) { + parent, cancelParent := context.WithCancel(context.Background()) + defer cancelParent() + + cancelParent() // Prematurely cancel context before calling NotifyContext. + c, stop := NotifyContext(parent, syscall.SIGINT) + defer stop() + + if want, got := "signal.NotifyContext(context.Background.WithCancel, [interrupt])", fmt.Sprint(c); want != got { + t.Errorf("c.String() = %q, want %q", got, want) + } + + select { + case <-c.Done(): + if got := c.Err(); got != context.Canceled { + t.Errorf("c.Err() = %q, want %q", got, context.Canceled) + } + case <-time.After(time.Second): + t.Errorf("timed out waiting for parent context to be canceled") + } +} + +func TestNotifyContextSimultaneousNotifications(t *testing.T) { + c, stop := NotifyContext(context.Background(), syscall.SIGINT) + defer stop() + + if want, got := "signal.NotifyContext(context.Background, [interrupt])", fmt.Sprint(c); want != got { + t.Errorf("c.String() = %q, want %q", got, want) + } + + var wg sync.WaitGroup + n := 10 + wg.Add(n) + for i := 0; i < n; i++ { + go func() { + syscall.Kill(syscall.Getpid(), syscall.SIGINT) + wg.Done() + }() + } + wg.Wait() + select { + case <-c.Done(): + if got := c.Err(); got != context.Canceled { + t.Errorf("c.Err() = %q, want %q", got, context.Canceled) + } + case <-time.After(time.Second): + t.Errorf("expected context to be canceled") + } +} + +func TestNotifyContextSimultaneousStop(t *testing.T) { + c, stop := NotifyContext(context.Background(), syscall.SIGINT) + defer stop() + + if want, got := "signal.NotifyContext(context.Background, [interrupt])", fmt.Sprint(c); want != got { + t.Errorf("c.String() = %q, want %q", got, want) + } + + var wg sync.WaitGroup + n := 10 + wg.Add(n) + for i := 0; i < n; i++ { + go func() { + stop() + wg.Done() + }() + } + wg.Wait() + select { + case <-c.Done(): + if got := c.Err(); got != context.Canceled { + t.Errorf("c.Err() = %q, want %q", got, context.Canceled) + } + case <-time.After(time.Second): + t.Errorf("expected context to be canceled") + } +} + +func TestNotifyContextStringer(t *testing.T) { + parent, cancelParent := context.WithCancel(context.Background()) + defer cancelParent() + c, stop := NotifyContext(parent, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) + defer stop() + + want := `signal.NotifyContext(context.Background.WithCancel, [hangup interrupt terminated])` + if got := fmt.Sprint(c); got != want { + t.Errorf("c.String() = %q, want %q", got, want) + } +} -- GitLab From eaa97fbf20baffac713ed1b780f864a6fee54ab6 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 1 Sep 2020 17:01:00 -0700 Subject: [PATCH 0501/1792] cmd/cgo: don't translate bitfields into Go fields The cgo tool would sometimes emit a bitfield at an offset that did not correspond to the C offset, such as for the example in the new test. Change-Id: I61b2ca10ee44a42f81c13ed12865f2060168fed5 Reviewed-on: https://go-review.googlesource.com/c/go/+/252378 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Matthew Dempsky TryBot-Result: Go Bot --- doc/go1.16.html | 10 ++++++++ misc/cgo/testgodefs/testdata/bitfields.go | 31 +++++++++++++++++++++++ misc/cgo/testgodefs/testdata/main.go | 28 ++++++++++++++++++++ misc/cgo/testgodefs/testgodefs_test.go | 1 + src/cmd/cgo/gcc.go | 20 ++++----------- 5 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 misc/cgo/testgodefs/testdata/bitfields.go diff --git a/doc/go1.16.html b/doc/go1.16.html index f177226269..0167030ef8 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -86,6 +86,16 @@ Do not send CLs removing the interior tags from such phrases. by go mod vendor since Go 1.11.

+

Cgo

+ +

+ The cgo tool will no longer try to translate + C struct bitfields into Go struct fields, even if their size can be + represented in Go. The order in which C bitfields appear in memory + is implementation dependent, so in some cases the cgo tool produced + results that were silently incorrect. +

+

TODO

diff --git a/misc/cgo/testgodefs/testdata/bitfields.go b/misc/cgo/testgodefs/testdata/bitfields.go new file mode 100644 index 0000000000..6a9724dcd1 --- /dev/null +++ b/misc/cgo/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. +// +// +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/main.go b/misc/cgo/testgodefs/testdata/main.go index 2e1ad3376a..4a3f6a701c 100644 --- a/misc/cgo/testgodefs/testdata/main.go +++ b/misc/cgo/testgodefs/testdata/main.go @@ -4,6 +4,12 @@ package main +import ( + "fmt" + "os" + "reflect" +) + // Test that the struct field in anonunion.go was promoted. var v1 T var v2 = v1.L @@ -23,4 +29,26 @@ var v7 = S{} var _ = issue38649{X: 0} func main() { + pass := true + + // The Go translation of bitfields should not have any of the + // bitfield types. The order in which bitfields are laid out + // in memory is implementation defined, so we can't easily + // know how a bitfield should correspond to a Go type, even if + // it appears to be aligned correctly. + bitfieldType := reflect.TypeOf(bitfields{}) + check := func(name string) { + _, ok := bitfieldType.FieldByName(name) + if ok { + fmt.Fprintf(os.Stderr, "found unexpected bitfields field %s\n", name) + pass = false + } + } + check("Short1") + check("Short2") + check("Short3") + + if !pass { + os.Exit(1) + } } diff --git a/misc/cgo/testgodefs/testgodefs_test.go b/misc/cgo/testgodefs/testgodefs_test.go index e4085f9ca8..4c2312c1c8 100644 --- a/misc/cgo/testgodefs/testgodefs_test.go +++ b/misc/cgo/testgodefs/testgodefs_test.go @@ -19,6 +19,7 @@ import ( // import "C" block. Add more tests here. var filePrefixes = []string{ "anonunion", + "bitfields", "issue8478", "fieldtypedef", "issue37479", diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 9179b5490e..eb6c1a5c89 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -2831,21 +2831,11 @@ func (c *typeConv) Struct(dt *dwarf.StructType, pos token.Pos) (expr *ast.Struct tgo := t.Go size := t.Size talign := t.Align - if f.BitSize > 0 { - switch f.BitSize { - case 8, 16, 32, 64: - default: - continue - } - size = f.BitSize / 8 - name := tgo.(*ast.Ident).String() - if strings.HasPrefix(name, "int") { - name = "int" - } else { - name = "uint" - } - tgo = ast.NewIdent(name + fmt.Sprint(f.BitSize)) - talign = size + if f.BitOffset > 0 || f.BitSize > 0 { + // The layout of bitfields is implementation defined, + // so we don't know how they correspond to Go fields + // even if they are aligned at byte boundaries. + continue } if talign > 0 && f.ByteOffset%talign != 0 { -- GitLab From 790fa1c546a05936406f6bbf24f6a6ddeb6ec6ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20M=C3=B6hrmann?= Date: Mon, 14 Sep 2020 16:30:43 +0200 Subject: [PATCH 0502/1792] cmd/compile: unify reflect, string and slice copy runtime functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a common runtime slicecopy function to copy strings or slices into slices. This deduplicates similar code previously used in reflect.slicecopy and runtime.stringslicecopy. Change-Id: I09572ff0647a9e12bb5c6989689ce1c43f16b7f1 Reviewed-on: https://go-review.googlesource.com/c/go/+/254658 Run-TryBot: Martin Möhrmann TryBot-Result: Go Bot Trust: Martin Möhrmann Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/builtin.go | 408 +++++++++--------- .../compile/internal/gc/builtin/runtime.go | 3 +- src/cmd/compile/internal/gc/subr.go | 12 +- src/cmd/compile/internal/gc/walk.go | 60 +-- src/runtime/mbarrier.go | 23 +- src/runtime/slice.go | 44 +- 6 files changed, 247 insertions(+), 303 deletions(-) diff --git a/src/cmd/compile/internal/gc/builtin.go b/src/cmd/compile/internal/gc/builtin.go index 861ffaaa5b..da7b107bfe 100644 --- a/src/cmd/compile/internal/gc/builtin.go +++ b/src/cmd/compile/internal/gc/builtin.go @@ -64,136 +64,135 @@ var runtimeDecls = [...]struct { {"stringtoslicebyte", funcTag, 49}, {"stringtoslicerune", funcTag, 52}, {"slicecopy", funcTag, 53}, - {"slicestringcopy", funcTag, 54}, - {"decoderune", funcTag, 55}, - {"countrunes", funcTag, 56}, - {"convI2I", funcTag, 57}, - {"convT16", funcTag, 58}, - {"convT32", funcTag, 58}, - {"convT64", funcTag, 58}, - {"convTstring", funcTag, 58}, - {"convTslice", funcTag, 58}, - {"convT2E", funcTag, 59}, - {"convT2Enoptr", funcTag, 59}, - {"convT2I", funcTag, 59}, - {"convT2Inoptr", funcTag, 59}, - {"assertE2I", funcTag, 57}, - {"assertE2I2", funcTag, 60}, - {"assertI2I", funcTag, 57}, - {"assertI2I2", funcTag, 60}, - {"panicdottypeE", funcTag, 61}, - {"panicdottypeI", funcTag, 61}, - {"panicnildottype", funcTag, 62}, - {"ifaceeq", funcTag, 64}, - {"efaceeq", funcTag, 64}, - {"fastrand", funcTag, 66}, - {"makemap64", funcTag, 68}, - {"makemap", funcTag, 69}, - {"makemap_small", funcTag, 70}, - {"mapaccess1", funcTag, 71}, - {"mapaccess1_fast32", funcTag, 72}, - {"mapaccess1_fast64", funcTag, 72}, - {"mapaccess1_faststr", funcTag, 72}, - {"mapaccess1_fat", funcTag, 73}, - {"mapaccess2", funcTag, 74}, - {"mapaccess2_fast32", funcTag, 75}, - {"mapaccess2_fast64", funcTag, 75}, - {"mapaccess2_faststr", funcTag, 75}, - {"mapaccess2_fat", funcTag, 76}, - {"mapassign", funcTag, 71}, - {"mapassign_fast32", funcTag, 72}, - {"mapassign_fast32ptr", funcTag, 72}, - {"mapassign_fast64", funcTag, 72}, - {"mapassign_fast64ptr", funcTag, 72}, - {"mapassign_faststr", funcTag, 72}, - {"mapiterinit", funcTag, 77}, - {"mapdelete", funcTag, 77}, - {"mapdelete_fast32", funcTag, 78}, - {"mapdelete_fast64", funcTag, 78}, - {"mapdelete_faststr", funcTag, 78}, - {"mapiternext", funcTag, 79}, - {"mapclear", funcTag, 80}, - {"makechan64", funcTag, 82}, - {"makechan", funcTag, 83}, - {"chanrecv1", funcTag, 85}, - {"chanrecv2", funcTag, 86}, - {"chansend1", funcTag, 88}, + {"decoderune", funcTag, 54}, + {"countrunes", funcTag, 55}, + {"convI2I", funcTag, 56}, + {"convT16", funcTag, 57}, + {"convT32", funcTag, 57}, + {"convT64", funcTag, 57}, + {"convTstring", funcTag, 57}, + {"convTslice", funcTag, 57}, + {"convT2E", funcTag, 58}, + {"convT2Enoptr", funcTag, 58}, + {"convT2I", funcTag, 58}, + {"convT2Inoptr", funcTag, 58}, + {"assertE2I", funcTag, 56}, + {"assertE2I2", funcTag, 59}, + {"assertI2I", funcTag, 56}, + {"assertI2I2", funcTag, 59}, + {"panicdottypeE", funcTag, 60}, + {"panicdottypeI", funcTag, 60}, + {"panicnildottype", funcTag, 61}, + {"ifaceeq", funcTag, 63}, + {"efaceeq", funcTag, 63}, + {"fastrand", funcTag, 65}, + {"makemap64", funcTag, 67}, + {"makemap", funcTag, 68}, + {"makemap_small", funcTag, 69}, + {"mapaccess1", funcTag, 70}, + {"mapaccess1_fast32", funcTag, 71}, + {"mapaccess1_fast64", funcTag, 71}, + {"mapaccess1_faststr", funcTag, 71}, + {"mapaccess1_fat", funcTag, 72}, + {"mapaccess2", funcTag, 73}, + {"mapaccess2_fast32", funcTag, 74}, + {"mapaccess2_fast64", funcTag, 74}, + {"mapaccess2_faststr", funcTag, 74}, + {"mapaccess2_fat", funcTag, 75}, + {"mapassign", funcTag, 70}, + {"mapassign_fast32", funcTag, 71}, + {"mapassign_fast32ptr", funcTag, 71}, + {"mapassign_fast64", funcTag, 71}, + {"mapassign_fast64ptr", funcTag, 71}, + {"mapassign_faststr", funcTag, 71}, + {"mapiterinit", funcTag, 76}, + {"mapdelete", funcTag, 76}, + {"mapdelete_fast32", funcTag, 77}, + {"mapdelete_fast64", funcTag, 77}, + {"mapdelete_faststr", funcTag, 77}, + {"mapiternext", funcTag, 78}, + {"mapclear", funcTag, 79}, + {"makechan64", funcTag, 81}, + {"makechan", funcTag, 82}, + {"chanrecv1", funcTag, 84}, + {"chanrecv2", funcTag, 85}, + {"chansend1", funcTag, 87}, {"closechan", funcTag, 30}, - {"writeBarrier", varTag, 90}, - {"typedmemmove", funcTag, 91}, - {"typedmemclr", funcTag, 92}, - {"typedslicecopy", funcTag, 93}, - {"selectnbsend", funcTag, 94}, - {"selectnbrecv", funcTag, 95}, - {"selectnbrecv2", funcTag, 97}, - {"selectsetpc", funcTag, 98}, - {"selectgo", funcTag, 99}, + {"writeBarrier", varTag, 89}, + {"typedmemmove", funcTag, 90}, + {"typedmemclr", funcTag, 91}, + {"typedslicecopy", funcTag, 92}, + {"selectnbsend", funcTag, 93}, + {"selectnbrecv", funcTag, 94}, + {"selectnbrecv2", funcTag, 96}, + {"selectsetpc", funcTag, 97}, + {"selectgo", funcTag, 98}, {"block", funcTag, 9}, - {"makeslice", funcTag, 100}, - {"makeslice64", funcTag, 101}, - {"makeslicecopy", funcTag, 102}, - {"growslice", funcTag, 104}, - {"memmove", funcTag, 105}, - {"memclrNoHeapPointers", funcTag, 106}, - {"memclrHasPointers", funcTag, 106}, - {"memequal", funcTag, 107}, - {"memequal0", funcTag, 108}, - {"memequal8", funcTag, 108}, - {"memequal16", funcTag, 108}, - {"memequal32", funcTag, 108}, - {"memequal64", funcTag, 108}, - {"memequal128", funcTag, 108}, - {"f32equal", funcTag, 109}, - {"f64equal", funcTag, 109}, - {"c64equal", funcTag, 109}, - {"c128equal", funcTag, 109}, - {"strequal", funcTag, 109}, - {"interequal", funcTag, 109}, - {"nilinterequal", funcTag, 109}, - {"memhash", funcTag, 110}, - {"memhash0", funcTag, 111}, - {"memhash8", funcTag, 111}, - {"memhash16", funcTag, 111}, - {"memhash32", funcTag, 111}, - {"memhash64", funcTag, 111}, - {"memhash128", funcTag, 111}, - {"f32hash", funcTag, 111}, - {"f64hash", funcTag, 111}, - {"c64hash", funcTag, 111}, - {"c128hash", funcTag, 111}, - {"strhash", funcTag, 111}, - {"interhash", funcTag, 111}, - {"nilinterhash", funcTag, 111}, - {"int64div", funcTag, 112}, - {"uint64div", funcTag, 113}, - {"int64mod", funcTag, 112}, - {"uint64mod", funcTag, 113}, - {"float64toint64", funcTag, 114}, - {"float64touint64", funcTag, 115}, - {"float64touint32", funcTag, 116}, - {"int64tofloat64", funcTag, 117}, - {"uint64tofloat64", funcTag, 118}, - {"uint32tofloat64", funcTag, 119}, - {"complex128div", funcTag, 120}, - {"racefuncenter", funcTag, 121}, + {"makeslice", funcTag, 99}, + {"makeslice64", funcTag, 100}, + {"makeslicecopy", funcTag, 101}, + {"growslice", funcTag, 103}, + {"memmove", funcTag, 104}, + {"memclrNoHeapPointers", funcTag, 105}, + {"memclrHasPointers", funcTag, 105}, + {"memequal", funcTag, 106}, + {"memequal0", funcTag, 107}, + {"memequal8", funcTag, 107}, + {"memequal16", funcTag, 107}, + {"memequal32", funcTag, 107}, + {"memequal64", funcTag, 107}, + {"memequal128", funcTag, 107}, + {"f32equal", funcTag, 108}, + {"f64equal", funcTag, 108}, + {"c64equal", funcTag, 108}, + {"c128equal", funcTag, 108}, + {"strequal", funcTag, 108}, + {"interequal", funcTag, 108}, + {"nilinterequal", funcTag, 108}, + {"memhash", funcTag, 109}, + {"memhash0", funcTag, 110}, + {"memhash8", funcTag, 110}, + {"memhash16", funcTag, 110}, + {"memhash32", funcTag, 110}, + {"memhash64", funcTag, 110}, + {"memhash128", funcTag, 110}, + {"f32hash", funcTag, 110}, + {"f64hash", funcTag, 110}, + {"c64hash", funcTag, 110}, + {"c128hash", funcTag, 110}, + {"strhash", funcTag, 110}, + {"interhash", funcTag, 110}, + {"nilinterhash", funcTag, 110}, + {"int64div", funcTag, 111}, + {"uint64div", funcTag, 112}, + {"int64mod", funcTag, 111}, + {"uint64mod", funcTag, 112}, + {"float64toint64", funcTag, 113}, + {"float64touint64", funcTag, 114}, + {"float64touint32", funcTag, 115}, + {"int64tofloat64", funcTag, 116}, + {"uint64tofloat64", funcTag, 117}, + {"uint32tofloat64", funcTag, 118}, + {"complex128div", funcTag, 119}, + {"racefuncenter", funcTag, 120}, {"racefuncenterfp", funcTag, 9}, {"racefuncexit", funcTag, 9}, - {"raceread", funcTag, 121}, - {"racewrite", funcTag, 121}, - {"racereadrange", funcTag, 122}, - {"racewriterange", funcTag, 122}, - {"msanread", funcTag, 122}, - {"msanwrite", funcTag, 122}, - {"checkptrAlignment", funcTag, 123}, - {"checkptrArithmetic", funcTag, 125}, - {"libfuzzerTraceCmp1", funcTag, 127}, - {"libfuzzerTraceCmp2", funcTag, 129}, - {"libfuzzerTraceCmp4", funcTag, 130}, - {"libfuzzerTraceCmp8", funcTag, 131}, - {"libfuzzerTraceConstCmp1", funcTag, 127}, - {"libfuzzerTraceConstCmp2", funcTag, 129}, - {"libfuzzerTraceConstCmp4", funcTag, 130}, - {"libfuzzerTraceConstCmp8", funcTag, 131}, + {"raceread", funcTag, 120}, + {"racewrite", funcTag, 120}, + {"racereadrange", funcTag, 121}, + {"racewriterange", funcTag, 121}, + {"msanread", funcTag, 121}, + {"msanwrite", funcTag, 121}, + {"checkptrAlignment", funcTag, 122}, + {"checkptrArithmetic", funcTag, 124}, + {"libfuzzerTraceCmp1", funcTag, 126}, + {"libfuzzerTraceCmp2", funcTag, 128}, + {"libfuzzerTraceCmp4", funcTag, 129}, + {"libfuzzerTraceCmp8", funcTag, 130}, + {"libfuzzerTraceConstCmp1", funcTag, 126}, + {"libfuzzerTraceConstCmp2", funcTag, 128}, + {"libfuzzerTraceConstCmp4", funcTag, 129}, + {"libfuzzerTraceConstCmp8", funcTag, 130}, {"x86HasPOPCNT", varTag, 6}, {"x86HasSSE41", varTag, 6}, {"x86HasFMA", varTag, 6}, @@ -202,7 +201,7 @@ var runtimeDecls = [...]struct { } func runtimeTypes() []*types.Type { - var typs [132]*types.Type + var typs [131]*types.Type typs[0] = types.Bytetype typs[1] = types.NewPtr(typs[0]) typs[2] = types.Types[TANY] @@ -257,83 +256,82 @@ func runtimeTypes() []*types.Type { typs[51] = types.NewPtr(typs[50]) typs[52] = functype(nil, []*Node{anonfield(typs[51]), anonfield(typs[28])}, []*Node{anonfield(typs[46])}) typs[53] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[15]), anonfield(typs[3]), anonfield(typs[15]), anonfield(typs[5])}, []*Node{anonfield(typs[15])}) - typs[54] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[28])}, []*Node{anonfield(typs[15])}) - typs[55] = functype(nil, []*Node{anonfield(typs[28]), anonfield(typs[15])}, []*Node{anonfield(typs[45]), anonfield(typs[15])}) - typs[56] = functype(nil, []*Node{anonfield(typs[28])}, []*Node{anonfield(typs[15])}) - typs[57] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2])}) - typs[58] = functype(nil, []*Node{anonfield(typs[2])}, []*Node{anonfield(typs[7])}) - typs[59] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, []*Node{anonfield(typs[2])}) - typs[60] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2]), anonfield(typs[6])}) - typs[61] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[1])}, nil) - typs[62] = functype(nil, []*Node{anonfield(typs[1])}, nil) - typs[63] = types.NewPtr(typs[5]) - typs[64] = functype(nil, []*Node{anonfield(typs[63]), anonfield(typs[7]), anonfield(typs[7])}, []*Node{anonfield(typs[6])}) - typs[65] = types.Types[TUINT32] - typs[66] = functype(nil, nil, []*Node{anonfield(typs[65])}) - typs[67] = types.NewMap(typs[2], typs[2]) - typs[68] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22]), anonfield(typs[3])}, []*Node{anonfield(typs[67])}) - typs[69] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[3])}, []*Node{anonfield(typs[67])}) - typs[70] = functype(nil, nil, []*Node{anonfield(typs[67])}) - typs[71] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67]), anonfield(typs[3])}, []*Node{anonfield(typs[3])}) - typs[72] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67]), anonfield(typs[2])}, []*Node{anonfield(typs[3])}) - typs[73] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3])}) - typs[74] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67]), anonfield(typs[3])}, []*Node{anonfield(typs[3]), anonfield(typs[6])}) - typs[75] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67]), anonfield(typs[2])}, []*Node{anonfield(typs[3]), anonfield(typs[6])}) - typs[76] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3]), anonfield(typs[6])}) - typs[77] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67]), anonfield(typs[3])}, nil) - typs[78] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67]), anonfield(typs[2])}, nil) - typs[79] = functype(nil, []*Node{anonfield(typs[3])}, nil) - typs[80] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[67])}, nil) - typs[81] = types.NewChan(typs[2], types.Cboth) - typs[82] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22])}, []*Node{anonfield(typs[81])}) - typs[83] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15])}, []*Node{anonfield(typs[81])}) - typs[84] = types.NewChan(typs[2], types.Crecv) - typs[85] = functype(nil, []*Node{anonfield(typs[84]), anonfield(typs[3])}, nil) - typs[86] = functype(nil, []*Node{anonfield(typs[84]), anonfield(typs[3])}, []*Node{anonfield(typs[6])}) - typs[87] = types.NewChan(typs[2], types.Csend) - typs[88] = functype(nil, []*Node{anonfield(typs[87]), anonfield(typs[3])}, nil) - typs[89] = types.NewArray(typs[0], 3) - typs[90] = tostruct([]*Node{namedfield("enabled", typs[6]), namedfield("pad", typs[89]), namedfield("needed", typs[6]), namedfield("cgo", typs[6]), namedfield("alignme", typs[24])}) - typs[91] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[3])}, nil) - typs[92] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, nil) - typs[93] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[15]), anonfield(typs[3]), anonfield(typs[15])}, []*Node{anonfield(typs[15])}) - typs[94] = functype(nil, []*Node{anonfield(typs[87]), anonfield(typs[3])}, []*Node{anonfield(typs[6])}) - typs[95] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[84])}, []*Node{anonfield(typs[6])}) - typs[96] = types.NewPtr(typs[6]) - typs[97] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[96]), anonfield(typs[84])}, []*Node{anonfield(typs[6])}) - typs[98] = functype(nil, []*Node{anonfield(typs[63])}, nil) - typs[99] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[15]), anonfield(typs[15]), anonfield(typs[6])}, []*Node{anonfield(typs[15]), anonfield(typs[6])}) - typs[100] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[7])}) - typs[101] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[7])}) - typs[102] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15]), anonfield(typs[7])}, []*Node{anonfield(typs[7])}) - typs[103] = types.NewSlice(typs[2]) - typs[104] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[103]), anonfield(typs[15])}, []*Node{anonfield(typs[103])}) - typs[105] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[5])}, nil) - typs[106] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5])}, nil) - typs[107] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[5])}, []*Node{anonfield(typs[6])}) - typs[108] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[6])}) - typs[109] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[7])}, []*Node{anonfield(typs[6])}) - typs[110] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5]), anonfield(typs[5])}, []*Node{anonfield(typs[5])}) - typs[111] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5])}, []*Node{anonfield(typs[5])}) - typs[112] = functype(nil, []*Node{anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[22])}) - typs[113] = functype(nil, []*Node{anonfield(typs[24]), anonfield(typs[24])}, []*Node{anonfield(typs[24])}) - typs[114] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[22])}) - typs[115] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[24])}) - typs[116] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[65])}) - typs[117] = functype(nil, []*Node{anonfield(typs[22])}, []*Node{anonfield(typs[20])}) - typs[118] = functype(nil, []*Node{anonfield(typs[24])}, []*Node{anonfield(typs[20])}) - typs[119] = functype(nil, []*Node{anonfield(typs[65])}, []*Node{anonfield(typs[20])}) - typs[120] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[26])}, []*Node{anonfield(typs[26])}) - typs[121] = functype(nil, []*Node{anonfield(typs[5])}, nil) - typs[122] = functype(nil, []*Node{anonfield(typs[5]), anonfield(typs[5])}, nil) - typs[123] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[1]), anonfield(typs[5])}, nil) - typs[124] = types.NewSlice(typs[7]) - typs[125] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[124])}, nil) - typs[126] = types.Types[TUINT8] - typs[127] = functype(nil, []*Node{anonfield(typs[126]), anonfield(typs[126])}, nil) - typs[128] = types.Types[TUINT16] - typs[129] = functype(nil, []*Node{anonfield(typs[128]), anonfield(typs[128])}, nil) - typs[130] = functype(nil, []*Node{anonfield(typs[65]), anonfield(typs[65])}, nil) - typs[131] = functype(nil, []*Node{anonfield(typs[24]), anonfield(typs[24])}, nil) + typs[54] = functype(nil, []*Node{anonfield(typs[28]), anonfield(typs[15])}, []*Node{anonfield(typs[45]), anonfield(typs[15])}) + typs[55] = functype(nil, []*Node{anonfield(typs[28])}, []*Node{anonfield(typs[15])}) + typs[56] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2])}) + typs[57] = functype(nil, []*Node{anonfield(typs[2])}, []*Node{anonfield(typs[7])}) + typs[58] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, []*Node{anonfield(typs[2])}) + typs[59] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2]), anonfield(typs[6])}) + typs[60] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[1])}, nil) + typs[61] = functype(nil, []*Node{anonfield(typs[1])}, nil) + typs[62] = types.NewPtr(typs[5]) + typs[63] = functype(nil, []*Node{anonfield(typs[62]), anonfield(typs[7]), anonfield(typs[7])}, []*Node{anonfield(typs[6])}) + typs[64] = types.Types[TUINT32] + typs[65] = functype(nil, nil, []*Node{anonfield(typs[64])}) + typs[66] = types.NewMap(typs[2], typs[2]) + typs[67] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22]), anonfield(typs[3])}, []*Node{anonfield(typs[66])}) + typs[68] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[3])}, []*Node{anonfield(typs[66])}) + typs[69] = functype(nil, nil, []*Node{anonfield(typs[66])}) + typs[70] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3])}, []*Node{anonfield(typs[3])}) + typs[71] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[2])}, []*Node{anonfield(typs[3])}) + typs[72] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3])}) + typs[73] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3])}, []*Node{anonfield(typs[3]), anonfield(typs[6])}) + typs[74] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[2])}, []*Node{anonfield(typs[3]), anonfield(typs[6])}) + typs[75] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3]), anonfield(typs[6])}) + typs[76] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3])}, nil) + typs[77] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[2])}, nil) + typs[78] = functype(nil, []*Node{anonfield(typs[3])}, nil) + typs[79] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66])}, nil) + typs[80] = types.NewChan(typs[2], types.Cboth) + typs[81] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22])}, []*Node{anonfield(typs[80])}) + typs[82] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15])}, []*Node{anonfield(typs[80])}) + typs[83] = types.NewChan(typs[2], types.Crecv) + typs[84] = functype(nil, []*Node{anonfield(typs[83]), anonfield(typs[3])}, nil) + typs[85] = functype(nil, []*Node{anonfield(typs[83]), anonfield(typs[3])}, []*Node{anonfield(typs[6])}) + typs[86] = types.NewChan(typs[2], types.Csend) + typs[87] = functype(nil, []*Node{anonfield(typs[86]), anonfield(typs[3])}, nil) + typs[88] = types.NewArray(typs[0], 3) + typs[89] = tostruct([]*Node{namedfield("enabled", typs[6]), namedfield("pad", typs[88]), namedfield("needed", typs[6]), namedfield("cgo", typs[6]), namedfield("alignme", typs[24])}) + typs[90] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[3])}, nil) + typs[91] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, nil) + typs[92] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[15]), anonfield(typs[3]), anonfield(typs[15])}, []*Node{anonfield(typs[15])}) + typs[93] = functype(nil, []*Node{anonfield(typs[86]), anonfield(typs[3])}, []*Node{anonfield(typs[6])}) + typs[94] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[83])}, []*Node{anonfield(typs[6])}) + typs[95] = types.NewPtr(typs[6]) + typs[96] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[95]), anonfield(typs[83])}, []*Node{anonfield(typs[6])}) + typs[97] = functype(nil, []*Node{anonfield(typs[62])}, nil) + typs[98] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[62]), anonfield(typs[15]), anonfield(typs[15]), anonfield(typs[6])}, []*Node{anonfield(typs[15]), anonfield(typs[6])}) + typs[99] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[7])}) + typs[100] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[7])}) + typs[101] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15]), anonfield(typs[7])}, []*Node{anonfield(typs[7])}) + typs[102] = types.NewSlice(typs[2]) + typs[103] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[102]), anonfield(typs[15])}, []*Node{anonfield(typs[102])}) + typs[104] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[5])}, nil) + typs[105] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5])}, nil) + typs[106] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[5])}, []*Node{anonfield(typs[6])}) + typs[107] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[6])}) + typs[108] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[7])}, []*Node{anonfield(typs[6])}) + typs[109] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5]), anonfield(typs[5])}, []*Node{anonfield(typs[5])}) + typs[110] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[5])}, []*Node{anonfield(typs[5])}) + typs[111] = functype(nil, []*Node{anonfield(typs[22]), anonfield(typs[22])}, []*Node{anonfield(typs[22])}) + typs[112] = functype(nil, []*Node{anonfield(typs[24]), anonfield(typs[24])}, []*Node{anonfield(typs[24])}) + typs[113] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[22])}) + typs[114] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[24])}) + typs[115] = functype(nil, []*Node{anonfield(typs[20])}, []*Node{anonfield(typs[64])}) + typs[116] = functype(nil, []*Node{anonfield(typs[22])}, []*Node{anonfield(typs[20])}) + typs[117] = functype(nil, []*Node{anonfield(typs[24])}, []*Node{anonfield(typs[20])}) + typs[118] = functype(nil, []*Node{anonfield(typs[64])}, []*Node{anonfield(typs[20])}) + typs[119] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[26])}, []*Node{anonfield(typs[26])}) + typs[120] = functype(nil, []*Node{anonfield(typs[5])}, nil) + typs[121] = functype(nil, []*Node{anonfield(typs[5]), anonfield(typs[5])}, nil) + typs[122] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[1]), anonfield(typs[5])}, nil) + typs[123] = types.NewSlice(typs[7]) + typs[124] = functype(nil, []*Node{anonfield(typs[7]), anonfield(typs[123])}, nil) + typs[125] = types.Types[TUINT8] + typs[126] = functype(nil, []*Node{anonfield(typs[125]), anonfield(typs[125])}, nil) + typs[127] = types.Types[TUINT16] + typs[128] = functype(nil, []*Node{anonfield(typs[127]), anonfield(typs[127])}, nil) + typs[129] = functype(nil, []*Node{anonfield(typs[64]), anonfield(typs[64])}, nil) + typs[130] = functype(nil, []*Node{anonfield(typs[24]), anonfield(typs[24])}, nil) return typs[:] } diff --git a/src/cmd/compile/internal/gc/builtin/runtime.go b/src/cmd/compile/internal/gc/builtin/runtime.go index 635da80f7c..02d6c7b7f5 100644 --- a/src/cmd/compile/internal/gc/builtin/runtime.go +++ b/src/cmd/compile/internal/gc/builtin/runtime.go @@ -75,8 +75,7 @@ func slicebytetostringtmp(ptr *byte, n int) string func slicerunetostring(*[32]byte, []rune) string func stringtoslicebyte(*[32]byte, string) []byte func stringtoslicerune(*[32]rune, string) []rune -func slicecopy(toPtr *any, toLen int, frPtr *any, frLen int, wid uintptr) int -func slicestringcopy(toPtr *byte, toLen int, fr string) int +func slicecopy(toPtr *any, toLen int, fromPtr *any, fromLen int, wid uintptr) int func decoderune(string, int) (retv rune, retk int) func countrunes(string) int diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 5a5833d19f..8883e75c49 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -928,16 +928,20 @@ func (o Op) IsSlice3() bool { return false } -// slicePtrLen extracts the pointer and length from a slice. +// backingArrayPtrLen extracts the pointer and length from a slice or string. // This constructs two nodes referring to n, so n must be a cheapexpr. -func (n *Node) slicePtrLen() (ptr, len *Node) { +func (n *Node) backingArrayPtrLen() (ptr, len *Node) { var init Nodes c := cheapexpr(n, &init) if c != n || init.Len() != 0 { - Fatalf("slicePtrLen not cheap: %v", n) + Fatalf("backingArrayPtrLen not cheap: %v", n) } ptr = nod(OSPTR, n, nil) - ptr.Type = n.Type.Elem().PtrTo() + if n.Type.IsString() { + ptr.Type = types.Types[TUINT8].PtrTo() + } else { + ptr.Type = n.Type.Elem().PtrTo() + } len = nod(OLEN, n, nil) len.Type = types.Types[TINT] return ptr, len diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 2d29366880..c3a740d4cc 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -1484,7 +1484,7 @@ opswitch: } else { // slicebytetostring(*[32]byte, ptr *byte, n int) string n.Left = cheapexpr(n.Left, init) - ptr, len := n.Left.slicePtrLen() + ptr, len := n.Left.backingArrayPtrLen() n = mkcall("slicebytetostring", n.Type, init, a, ptr, len) } @@ -1497,7 +1497,7 @@ opswitch: } // slicebytetostringtmp(ptr *byte, n int) string n.Left = cheapexpr(n.Left, init) - ptr, len := n.Left.slicePtrLen() + ptr, len := n.Left.backingArrayPtrLen() n = mkcall("slicebytetostringtmp", n.Type, init, ptr, len) case OSTR2BYTES: @@ -2764,36 +2764,25 @@ func appendslice(n *Node, init *Nodes) *Node { // instantiate typedslicecopy(typ *type, dstPtr *any, dstLen int, srcPtr *any, srcLen int) int fn := syslook("typedslicecopy") fn = substArgTypes(fn, l1.Type.Elem(), l2.Type.Elem()) - ptr1, len1 := nptr1.slicePtrLen() - ptr2, len2 := nptr2.slicePtrLen() + ptr1, len1 := nptr1.backingArrayPtrLen() + ptr2, len2 := nptr2.backingArrayPtrLen() ncopy = mkcall1(fn, types.Types[TINT], &nodes, typename(elemtype), ptr1, len1, ptr2, len2) - } else if instrumenting && !compiling_runtime { - // rely on runtime to instrument copy. - // copy(s[len(l1):], l2) + // rely on runtime to instrument: + // copy(s[len(l1):], l2) + // l2 can be a slice or string. nptr1 := nod(OSLICE, s, nil) nptr1.Type = s.Type nptr1.SetSliceBounds(nod(OLEN, l1, nil), nil, nil) nptr1 = cheapexpr(nptr1, &nodes) - nptr2 := l2 - if l2.Type.IsString() { - // instantiate func slicestringcopy(toPtr *byte, toLen int, fr string) int - fn := syslook("slicestringcopy") - ptr, len := nptr1.slicePtrLen() - str := nod(OCONVNOP, nptr2, nil) - str.Type = types.Types[TSTRING] - ncopy = mkcall1(fn, types.Types[TINT], &nodes, ptr, len, str) - } else { - // instantiate func slicecopy(to any, fr any, wid uintptr) int - fn := syslook("slicecopy") - fn = substArgTypes(fn, l1.Type.Elem(), l2.Type.Elem()) - ptr1, len1 := nptr1.slicePtrLen() - ptr2, len2 := nptr2.slicePtrLen() - ncopy = mkcall1(fn, types.Types[TINT], &nodes, ptr1, len1, ptr2, len2, nodintconst(elemtype.Width)) - } + ptr1, len1 := nptr1.backingArrayPtrLen() + ptr2, len2 := nptr2.backingArrayPtrLen() + fn := syslook("slicecopy") + fn = substArgTypes(fn, ptr1.Type.Elem(), ptr2.Type.Elem()) + ncopy = mkcall1(fn, types.Types[TINT], &nodes, ptr1, len1, ptr2, len2, nodintconst(elemtype.Width)) } else { // memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T)) nptr1 := nod(OINDEX, s, nod(OLEN, l1, nil)) @@ -3092,28 +3081,25 @@ func copyany(n *Node, init *Nodes, runtimecall bool) *Node { Curfn.Func.setWBPos(n.Pos) fn := writebarrierfn("typedslicecopy", n.Left.Type.Elem(), n.Right.Type.Elem()) n.Left = cheapexpr(n.Left, init) - ptrL, lenL := n.Left.slicePtrLen() + ptrL, lenL := n.Left.backingArrayPtrLen() n.Right = cheapexpr(n.Right, init) - ptrR, lenR := n.Right.slicePtrLen() + ptrR, lenR := n.Right.backingArrayPtrLen() return mkcall1(fn, n.Type, init, typename(n.Left.Type.Elem()), ptrL, lenL, ptrR, lenR) } if runtimecall { - if n.Right.Type.IsString() { - fn := syslook("slicestringcopy") - n.Left = cheapexpr(n.Left, init) - ptr, len := n.Left.slicePtrLen() - str := nod(OCONVNOP, n.Right, nil) - str.Type = types.Types[TSTRING] - return mkcall1(fn, n.Type, init, ptr, len, str) - } + // rely on runtime to instrument: + // copy(n.Left, n.Right) + // n.Right can be a slice or string. - fn := syslook("slicecopy") - fn = substArgTypes(fn, n.Left.Type.Elem(), n.Right.Type.Elem()) n.Left = cheapexpr(n.Left, init) - ptrL, lenL := n.Left.slicePtrLen() + ptrL, lenL := n.Left.backingArrayPtrLen() n.Right = cheapexpr(n.Right, init) - ptrR, lenR := n.Right.slicePtrLen() + ptrR, lenR := n.Right.backingArrayPtrLen() + + fn := syslook("slicecopy") + fn = substArgTypes(fn, ptrL.Type.Elem(), ptrR.Type.Elem()) + return mkcall1(fn, n.Type, init, ptrL, lenL, ptrR, lenR, nodintconst(n.Left.Type.Elem().Width)) } diff --git a/src/runtime/mbarrier.go b/src/runtime/mbarrier.go index f7875d327a..2b5affce52 100644 --- a/src/runtime/mbarrier.go +++ b/src/runtime/mbarrier.go @@ -281,28 +281,7 @@ func typedslicecopy(typ *_type, dstPtr unsafe.Pointer, dstLen int, srcPtr unsafe //go:linkname reflect_typedslicecopy reflect.typedslicecopy func reflect_typedslicecopy(elemType *_type, dst, src slice) int { if elemType.ptrdata == 0 { - n := dst.len - if n > src.len { - n = src.len - } - if n == 0 { - return 0 - } - - size := uintptr(n) * elemType.size - if raceenabled { - callerpc := getcallerpc() - pc := funcPC(reflect_typedslicecopy) - racewriterangepc(dst.array, size, callerpc, pc) - racereadrangepc(src.array, size, callerpc, pc) - } - if msanenabled { - msanwrite(dst.array, size) - msanread(src.array, size) - } - - memmove(dst.array, src.array, size) - return n + return slicecopy(dst.array, dst.len, src.array, src.len, elemType.size) } return typedslicecopy(elemType, dst.array, dst.len, src.array, src.len) } diff --git a/src/runtime/slice.go b/src/runtime/slice.go index 0418ace25a..82a45c78a9 100644 --- a/src/runtime/slice.go +++ b/src/runtime/slice.go @@ -243,12 +243,13 @@ func isPowerOfTwo(x uintptr) bool { return x&(x-1) == 0 } -func slicecopy(toPtr unsafe.Pointer, toLen int, fmPtr unsafe.Pointer, fmLen int, width uintptr) int { - if fmLen == 0 || toLen == 0 { +// slicecopy is used to copy from a string or slice of pointerless elements into a slice. +func slicecopy(toPtr unsafe.Pointer, toLen int, fromPtr unsafe.Pointer, fromLen int, width uintptr) int { + if fromLen == 0 || toLen == 0 { return 0 } - n := fmLen + n := fromLen if toLen < n { n = toLen } @@ -257,46 +258,23 @@ func slicecopy(toPtr unsafe.Pointer, toLen int, fmPtr unsafe.Pointer, fmLen int, return n } + size := uintptr(n) * width if raceenabled { callerpc := getcallerpc() pc := funcPC(slicecopy) - racereadrangepc(fmPtr, uintptr(n*int(width)), callerpc, pc) - racewriterangepc(toPtr, uintptr(n*int(width)), callerpc, pc) + racereadrangepc(fromPtr, size, callerpc, pc) + racewriterangepc(toPtr, size, callerpc, pc) } if msanenabled { - msanread(fmPtr, uintptr(n*int(width))) - msanwrite(toPtr, uintptr(n*int(width))) + msanread(fromPtr, size) + msanwrite(toPtr, size) } - size := uintptr(n) * width if size == 1 { // common case worth about 2x to do here // TODO: is this still worth it with new memmove impl? - *(*byte)(toPtr) = *(*byte)(fmPtr) // known to be a byte pointer + *(*byte)(toPtr) = *(*byte)(fromPtr) // known to be a byte pointer } else { - memmove(toPtr, fmPtr, size) - } - return n -} - -func slicestringcopy(toPtr *byte, toLen int, fm string) int { - if len(fm) == 0 || toLen == 0 { - return 0 - } - - n := len(fm) - if toLen < n { - n = toLen + memmove(toPtr, fromPtr, size) } - - if raceenabled { - callerpc := getcallerpc() - pc := funcPC(slicestringcopy) - racewriterangepc(unsafe.Pointer(toPtr), uintptr(n), callerpc, pc) - } - if msanenabled { - msanwrite(unsafe.Pointer(toPtr), uintptr(n)) - } - - memmove(unsafe.Pointer(toPtr), stringStructOf(&fm).str, uintptr(n)) return n } -- GitLab From e82c9bd81654dab14f786c26af2dd8ea3a7a1737 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 15 Sep 2020 13:49:45 +0200 Subject: [PATCH 0503/1792] os, internal/syscall/unix: use pipe2 instead of pipe on illumos Illumos provides the pipe2 syscall. Add a wrapper to internal/syscall/unix and use it to implement os.Pipe. Change-Id: I26ecdbcae1e8d51f80e2bc8a86fb129826387b1f Reviewed-on: https://go-review.googlesource.com/c/go/+/254981 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- src/internal/syscall/unix/pipe2_illumos.go | 34 ++++++++++++++++++++++ src/os/pipe2_illumos.go | 25 ++++++++++++++++ src/os/pipe_bsd.go | 2 +- 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/internal/syscall/unix/pipe2_illumos.go create mode 100644 src/os/pipe2_illumos.go diff --git a/src/internal/syscall/unix/pipe2_illumos.go b/src/internal/syscall/unix/pipe2_illumos.go new file mode 100644 index 0000000000..f3ac8d29df --- /dev/null +++ b/src/internal/syscall/unix/pipe2_illumos.go @@ -0,0 +1,34 @@ +// 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 illumos + +package unix + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + +//go:linkname procpipe2 libc_pipe2 + +var procpipe2 uintptr + +type _C_int int32 + +func Pipe2(p []int, flags int) error { + if len(p) != 2 { + return syscall.EINVAL + } + var pp [2]_C_int + _, _, errno := syscall6(uintptr(unsafe.Pointer(&procpipe2)), 2, uintptr(unsafe.Pointer(&pp)), uintptr(flags), 0, 0, 0, 0) + if errno != 0 { + return errno + } + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return nil +} diff --git a/src/os/pipe2_illumos.go b/src/os/pipe2_illumos.go new file mode 100644 index 0000000000..026ce62b9a --- /dev/null +++ b/src/os/pipe2_illumos.go @@ -0,0 +1,25 @@ +// 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 illumos + +package os + +import ( + "internal/syscall/unix" + "syscall" +) + +// Pipe returns a connected pair of Files; reads from r return bytes written to w. +// It returns the files and an error, if any. +func Pipe() (r *File, w *File, err error) { + var p [2]int + + e := unix.Pipe2(p[0:], syscall.O_CLOEXEC) + if e != nil { + return nil, nil, NewSyscallError("pipe", e) + } + + return newFile(uintptr(p[0]), "|0", kindPipe), newFile(uintptr(p[1]), "|1", kindPipe), nil +} diff --git a/src/os/pipe_bsd.go b/src/os/pipe_bsd.go index 0d2d82feb9..115d6baa19 100644 --- a/src/os/pipe_bsd.go +++ b/src/os/pipe_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. -// +build aix darwin dragonfly js,wasm solaris +// +build aix darwin dragonfly js,wasm solaris,!illumos package os -- GitLab From a86b6f23f08fd42154bc5bbfa417da6ee5ef48fb Mon Sep 17 00:00:00 2001 From: diaxu01 Date: Thu, 2 Apr 2020 02:39:28 +0000 Subject: [PATCH 0504/1792] cmd/internal/obj/arm64: optimize the instruction of moving long effective stack address Currently, when the offset of "MOVD $offset(Rn), Rd" is a large positive constant or a negative constant, the assembler will load this offset from the constant pool.This patch gets rid of the constant pool by encoding the offset into two ADD instructions if it's a large positive constant or one SUB instruction if negative. For very large negative offset, it is rarely used, here we don't optimize this case. Optimized case 1: MOVD $-0x100000(R7), R0 Before: LDR 0x67670(constant pool), R27; ADD R27.UXTX, R0, R7 After: SUB $0x100000, R7, R0 Optimized case 2: MOVD $0x123468(R7), R0 Before: LDR 0x67670(constant pool), R27; ADD R27.UXTX, R0, R7 After: ADD $0x123000, R7, R27; ADD $0x000468, R27, R0 1. Binary size before/after. binary size change pkg/linux_arm64 +4KB pkg/tool/linux_arm64 no change go no change gofmt no change 2. go1 benckmark. name old time/op new time/op delta pkg:test/bench/go1 goos:linux goarch:arm64 BinaryTree17-64 7335721401.800000ns +-40% 6264542009.800000ns +-14% ~ (p=0.421 n=5+5) Fannkuch11-64 3886551822.600000ns +- 0% 3875870590.200000ns +- 0% ~ (p=0.151 n=5+5) FmtFprintfEmpty-64 82.960000ns +- 1% 83.900000ns +- 2% +1.13% (p=0.048 n=5+5) FmtFprintfString-64 149.200000ns +- 1% 148.000000ns +- 0% -0.80% (p=0.016 n=5+4) FmtFprintfInt-64 177.000000ns +- 0% 178.400000ns +- 2% ~ (p=0.794 n=4+5) FmtFprintfIntInt-64 240.200000ns +- 2% 239.400000ns +- 4% ~ (p=0.302 n=5+5) FmtFprintfPrefixedInt-64 300.400000ns +- 0% 299.200000ns +- 1% ~ (p=0.119 n=5+5) FmtFprintfFloat-64 360.000000ns +- 0% 361.600000ns +- 3% ~ (p=0.349 n=4+5) FmtManyArgs-64 1064.400000ns +- 1% 1061.400000ns +- 0% ~ (p=0.087 n=5+5) GobDecode-64 12080404.400000ns +- 2% 11637601.000000ns +- 1% -3.67% (p=0.008 n=5+5) GobEncode-64 8474973.800000ns +- 2% 7977801.600000ns +- 2% -5.87% (p=0.008 n=5+5) Gzip-64 416501238.400000ns +- 0% 410463405.400000ns +- 0% -1.45% (p=0.008 n=5+5) Gunzip-64 58088415.200000ns +- 0% 58826209.600000ns +- 0% +1.27% (p=0.008 n=5+5) HTTPClientServer-64 128660.200000ns +-23% 117840.800000ns +- 8% ~ (p=0.222 n=5+5) JSONEncode-64 17547746.800000ns +- 4% 17216180.000000ns +- 1% ~ (p=0.222 n=5+5) JSONDecode-64 80879896.000000ns +- 1% 80063737.200000ns +- 0% -1.01% (p=0.008 n=5+5) Mandelbrot200-64 5484901.600000ns +- 0% 5483614.400000ns +- 0% ~ (p=0.310 n=5+5) GoParse-64 6201166.800000ns +- 6% 6150920.600000ns +- 1% ~ (p=0.548 n=5+5) RegexpMatchEasy0_32-64 135.000000ns +- 0% 139.200000ns +- 7% ~ (p=0.643 n=5+5) RegexpMatchEasy0_1K-64 484.600000ns +- 2% 483.800000ns +- 2% ~ (p=0.984 n=5+5) RegexpMatchEasy1_32-64 128.000000ns +- 1% 124.600000ns +- 1% -2.66% (p=0.008 n=5+5) RegexpMatchEasy1_1K-64 769.400000ns +- 2% 761.400000ns +- 1% ~ (p=0.460 n=5+5) RegexpMatchMedium_32-64 12.900000ns +- 0% 12.500000ns +- 0% -3.10% (p=0.008 n=5+5) RegexpMatchMedium_1K-64 57879.200000ns +- 1% 56512.200000ns +- 0% -2.36% (p=0.008 n=5+5) RegexpMatchHard_32-64 3091.600000ns +- 1% 3071.000000ns +- 0% -0.67% (p=0.048 n=5+5) RegexpMatchHard_1K-64 92941.200000ns +- 1% 92794.000000ns +- 0% ~ (p=1.000 n=5+5) Revcomp-64 1695605187.000000ns +-54% 1821697637.400000ns +-47% ~ (p=1.000 n=5+5) Template-64 112839686.800000ns +- 1% 109964069.200000ns +- 3% ~ (p=0.095 n=5+5) TimeParse-64 587.000000ns +- 0% 587.000000ns +- 0% ~ (all equal) TimeFormat-64 586.000000ns +- 1% 584.200000ns +- 1% ~ (p=0.659 n=5+5) [Geo mean] 81804.262218ns 80694.712973ns -1.36% name old speed new speed delta pkg:test/bench/go1 goos:linux goarch:arm64 GobDecode-64 63.6MB/s +- 2% 66.0MB/s +- 1% +3.78% (p=0.008 n=5+5) GobEncode-64 90.6MB/s +- 2% 96.2MB/s +- 2% +6.23% (p=0.008 n=5+5) Gzip-64 46.6MB/s +- 0% 47.3MB/s +- 0% +1.47% (p=0.008 n=5+5) Gunzip-64 334MB/s +- 0% 330MB/s +- 0% -1.25% (p=0.008 n=5+5) JSONEncode-64 111MB/s +- 4% 113MB/s +- 1% ~ (p=0.222 n=5+5) JSONDecode-64 24.0MB/s +- 1% 24.2MB/s +- 0% +1.02% (p=0.008 n=5+5) GoParse-64 9.35MB/s +- 6% 9.42MB/s +- 1% ~ (p=0.571 n=5+5) RegexpMatchEasy0_32-64 237MB/s +- 0% 231MB/s +- 7% ~ (p=0.690 n=5+5) RegexpMatchEasy0_1K-64 2.11GB/s +- 2% 2.12GB/s +- 2% ~ (p=1.000 n=5+5) RegexpMatchEasy1_32-64 250MB/s +- 1% 257MB/s +- 1% +2.63% (p=0.008 n=5+5) RegexpMatchEasy1_1K-64 1.33GB/s +- 2% 1.35GB/s +- 1% ~ (p=0.548 n=5+5) RegexpMatchMedium_32-64 77.6MB/s +- 0% 79.8MB/s +- 0% +2.80% (p=0.008 n=5+5) RegexpMatchMedium_1K-64 17.7MB/s +- 1% 18.1MB/s +- 0% +2.41% (p=0.008 n=5+5) RegexpMatchHard_32-64 10.4MB/s +- 1% 10.4MB/s +- 0% ~ (p=0.056 n=5+5) RegexpMatchHard_1K-64 11.0MB/s +- 1% 11.0MB/s +- 0% ~ (p=0.984 n=5+5) Revcomp-64 188MB/s +-71% 155MB/s +-71% ~ (p=1.000 n=5+5) Template-64 17.2MB/s +- 1% 17.7MB/s +- 3% ~ (p=0.095 n=5+5) [Geo mean] 79.2MB/s 79.3MB/s +0.24% Change-Id: I593ac3e7037afafc3605ad4b0cfb51d5dd88015d Reviewed-on: https://go-review.googlesource.com/c/go/+/232438 Trust: Alberto Donizetti Run-TryBot: Alberto Donizetti TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- src/cmd/asm/internal/asm/testdata/arm64.s | 15 +++++++- src/cmd/internal/obj/arm64/a.out.go | 7 ++-- src/cmd/internal/obj/arm64/anames7.go | 1 + src/cmd/internal/obj/arm64/asm7.go | 46 ++++++++++++++++------- 4 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index e106ff2ae1..acfb16b096 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -340,8 +340,19 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8 MOVD $0x1111ffff1111aaaa, R1 // MOVD $1230045644216969898, R1 // a1aa8a922122a2f22122e2f2 MOVD $0, R1 // 010080d2 MOVD $-1, R1 // 01008092 - MOVD $0x210000, R0 // MOVD $2162688, R0 // 2004a0d2 - MOVD $0xffffffffffffaaaa, R1 // MOVD $-21846, R1 // a1aa8a92 + MOVD $0x210000, R0 // MOVD $2162688, R0 // 2004a0d2 + MOVD $0xffffffffffffaaaa, R1 // MOVD $-21846, R1 // a1aa8a92 + + MOVD $0x1002(RSP), R1 // MOVD $4098(RSP), R1 // fb074091610b0091 + MOVD $0x1708(RSP), RSP // MOVD $5896(RSP), RSP // fb0740917f231c91 + MOVD $0x2001(R7), R1 // MOVD $8193(R7), R1 // fb08409161070091 + MOVD $0xffffff(R7), R1 // MOVD $16777215(R7), R1 // fbfc7f9161ff3f91 + + MOVD $-0x1(R7), R1 // MOVD $-1(R7), R1 // e10400d1 + MOVD $-0x30(R7), R1 // MOVD $-48(R7), R1 // e1c000d1 + MOVD $-0x708(R7), R1 // MOVD $-1800(R7), R1 // e1201cd1 + MOVD $-0x2000(RSP), R1 // MOVD $-8192(RSP), R1 // e10b40d1 + MOVD $-0x10000(RSP), RSP // MOVD $-65536(RSP), RSP // ff4340d1 // // CLS diff --git a/src/cmd/internal/obj/arm64/a.out.go b/src/cmd/internal/obj/arm64/a.out.go index 2839da1437..b3c9e9a18e 100644 --- a/src/cmd/internal/obj/arm64/a.out.go +++ b/src/cmd/internal/obj/arm64/a.out.go @@ -410,9 +410,10 @@ const ( C_FCON // floating-point constant C_VCONADDR // 64-bit memory address - C_AACON // ADDCON offset in auto constant $a(FP) - C_LACON // 32-bit offset in auto constant $a(FP) - C_AECON // ADDCON offset in extern constant $e(SB) + C_AACON // ADDCON offset in auto constant $a(FP) + C_AACON2 // 24-bit offset in auto constant $a(FP) + C_LACON // 32-bit offset in auto constant $a(FP) + C_AECON // ADDCON offset in extern constant $e(SB) // TODO(aram): only one branch class should be enough C_SBRA // for TYPE_BRANCH diff --git a/src/cmd/internal/obj/arm64/anames7.go b/src/cmd/internal/obj/arm64/anames7.go index e1703fc4ab..96c9f788d9 100644 --- a/src/cmd/internal/obj/arm64/anames7.go +++ b/src/cmd/internal/obj/arm64/anames7.go @@ -36,6 +36,7 @@ var cnames7 = []string{ "FCON", "VCONADDR", "AACON", + "AACON2", "LACON", "AECON", "SBRA", diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index df4bbbbd35..fc2033d689 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -391,7 +391,11 @@ var optab = []Optab{ {AMOVD, C_VCON, C_NONE, C_NONE, C_REG, 12, 16, 0, NOTUSETMP, 0}, {AMOVK, C_VCON, C_NONE, C_NONE, C_REG, 33, 4, 0, 0, 0}, - {AMOVD, C_AACON, C_NONE, C_NONE, C_REG, 4, 4, REGFROM, 0, 0}, + {AMOVD, C_AACON, C_NONE, C_NONE, C_RSP, 4, 4, REGFROM, 0, 0}, + {AMOVD, C_AACON2, C_NONE, C_NONE, C_RSP, 4, 8, REGFROM, 0, 0}, + + /* load long effective stack address (load int32 offset and add) */ + {AMOVD, C_LACON, C_NONE, C_NONE, C_RSP, 34, 8, REGSP, LFROM, 0}, // Move a large constant to a Vn. {AFMOVQ, C_VCON, C_NONE, C_NONE, C_VREG, 101, 4, 0, LFROM, 0}, @@ -594,9 +598,6 @@ var optab = []Optab{ {AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 31, 8, REGSP, LFROM, 0}, {AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 31, 8, 0, LFROM, 0}, - /* load long effective stack address (load int32 offset and add) */ - {AMOVD, C_LACON, C_NONE, C_NONE, C_REG, 34, 8, REGSP, LFROM, 0}, - /* pre/post-indexed load (unscaled, signed 9-bit offset) */ {AMOVD, C_LOREG, C_NONE, C_NONE, C_REG, 22, 4, 0, 0, C_XPOST}, {AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, 22, 4, 0, 0, C_XPOST}, @@ -1361,6 +1362,10 @@ func isaddcon(v int64) bool { return v <= 0xFFF } +func isaddcon2(v int64) bool { + return 0 <= v && v <= 0xFFFFFF +} + // isbitcon reports whether a constant can be encoded into a logical instruction. // bitcon has a binary form of repetition of a bit sequence of length 2, 4, 8, 16, 32, or 64, // which itself is a rotate (w.r.t. the length of the unit) of a sequence of ones. @@ -1889,10 +1894,14 @@ func (c *ctxt7) aclass(a *obj.Addr) int { default: return C_GOK } - - if isaddcon(c.instoffset) { + cf := c.instoffset + if isaddcon(cf) || isaddcon(-cf) { return C_AACON } + if isaddcon2(cf) { + return C_AACON2 + } + return C_LACON case obj.TYPE_BRANCH: @@ -2046,7 +2055,7 @@ func cmp(a int, b int) bool { return cmp(C_LCON, b) case C_LACON: - if b == C_AACON { + if b == C_AACON || b == C_AACON2 { return true } @@ -3062,11 +3071,10 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { } o1 |= (uint32(r&31) << 5) | uint32(rt&31) - case 4: /* mov $addcon, R; mov $recon, R; mov $racon, R */ - o1 = c.opirr(p, p.As) - + 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 { r = REGZERO } else if r == REGFROM { @@ -3075,13 +3083,23 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { if r == 0 { r = REGSP } + v := int32(c.regoff(&p.From)) - if (v & 0xFFF000) != 0 { - v >>= 12 - o1 |= 1 << 22 /* shift, by 12 */ + var op int32 + if v < 0 { + v = -v + op = int32(c.opirr(p, ASUB)) + } else { + op = int32(c.opirr(p, AADD)) + } + + if int(o.size) == 8 { + o1 = c.oaddi(p, op, v&0xfff000, r, REGTMP) + o2 = c.oaddi(p, op, v&0x000fff, REGTMP, rt) + break } - o1 |= ((uint32(v) & 0xFFF) << 10) | (uint32(r&31) << 5) | uint32(rt&31) + o1 = c.oaddi(p, op, v, r, rt) case 5: /* b s; bl s */ o1 = c.opbra(p, p.As) -- GitLab From 37aa65357007411d121fbdbaa5a340aba21ab40a Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Fri, 24 Jul 2020 03:38:38 +1000 Subject: [PATCH 0505/1792] cmd/link: make it easier to debug an elfrelocsect size mismatch Change-Id: I54976b004b4db006509f5e0781b1c2e46cfa09ab Reviewed-on: https://go-review.googlesource.com/c/go/+/244577 Run-TryBot: Than McIntosh TryBot-Result: Go Bot Reviewed-by: Cherry Zhang Trust: Joel Sing --- src/cmd/link/internal/ld/elf.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 2862f65f9f..f5a2f899fc 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -12,6 +12,7 @@ import ( "crypto/sha1" "encoding/binary" "encoding/hex" + "fmt" "path/filepath" "sort" "strings" @@ -1400,7 +1401,7 @@ func elfrelocsect(ctxt *Link, out *OutBuf, sect *sym.Section, syms []loader.Sym) // sanity check if uint64(out.Offset()) != sect.Reloff+sect.Rellen { - panic("elfrelocsect: size mismatch") + panic(fmt.Sprintf("elfrelocsect: size mismatch %d != %d + %d", out.Offset(), sect.Reloff, sect.Rellen)) } } -- GitLab From 2ae2a94857cb17a98a86a8332d6f76863982bf59 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 16 Sep 2020 16:22:28 +0000 Subject: [PATCH 0506/1792] runtime: fix leak and locking in BenchmarkMSpanCountAlloc CL 249917 made the mspan in MSpanCountAlloc no longer stack-allocated (for good reason), but then allocated an mspan on each call and did not free it, resulting in a leak. That allocation was also not protected by the heap lock, which could lead to data corruption of mheap fields and the spanalloc. To fix this, export some functions to allocate/free dummy mspans from spanalloc (with proper locking) and allocate just one up-front for the benchmark, freeing it at the end. Then, update MSpanCountAlloc to accept a dummy mspan. Note that we need to allocate the dummy mspan up-front otherwise we measure things like heap locking and fixalloc performance instead of what we actually want to measure: how fast we can do a popcount on the mark bits. Fixes #41391. Change-Id: If6629a6ec1ece639c7fb78532045837a8c872c04 Reviewed-on: https://go-review.googlesource.com/c/go/+/255297 Run-TryBot: Michael Knyszek Reviewed-by: Keith Randall TryBot-Result: Go Bot Trust: Michael Knyszek --- src/runtime/export_test.go | 28 +++++++++++++++++++++++++--- src/runtime/gc_test.go | 6 +++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 929bb35db6..e3d6441c18 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -983,9 +983,31 @@ func MapHashCheck(m interface{}, k interface{}) (uintptr, uintptr) { return x, y } -func MSpanCountAlloc(bits []byte) int { - s := (*mspan)(mheap_.spanalloc.alloc()) +// mspan wrapper for testing. +//go:notinheap +type MSpan mspan + +// Allocate an mspan for testing. +func AllocMSpan() *MSpan { + var s *mspan + systemstack(func() { + s = (*mspan)(mheap_.spanalloc.alloc()) + }) + return (*MSpan)(s) +} + +// Free an allocated mspan. +func FreeMSpan(s *MSpan) { + systemstack(func() { + mheap_.spanalloc.free(unsafe.Pointer(s)) + }) +} + +func MSpanCountAlloc(ms *MSpan, bits []byte) int { + s := (*mspan)(ms) s.nelems = uintptr(len(bits) * 8) s.gcmarkBits = (*gcBits)(unsafe.Pointer(&bits[0])) - return s.countAlloc() + result := s.countAlloc() + s.gcmarkBits = nil + return result } diff --git a/src/runtime/gc_test.go b/src/runtime/gc_test.go index c5c8a4cecf..9edebdada6 100644 --- a/src/runtime/gc_test.go +++ b/src/runtime/gc_test.go @@ -763,6 +763,10 @@ func BenchmarkScanStackNoLocals(b *testing.B) { } func BenchmarkMSpanCountAlloc(b *testing.B) { + // Allocate one dummy mspan for the whole benchmark. + s := runtime.AllocMSpan() + defer runtime.FreeMSpan(s) + // n is the number of bytes to benchmark against. // n must always be a multiple of 8, since gcBits is // always rounded up 8 bytes. @@ -774,7 +778,7 @@ func BenchmarkMSpanCountAlloc(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - runtime.MSpanCountAlloc(bits) + runtime.MSpanCountAlloc(s, bits) } }) } -- GitLab From 16328513bfb12d96e8f33fc37f816e1441027135 Mon Sep 17 00:00:00 2001 From: Carl Johnson Date: Thu, 27 Aug 2020 13:08:44 +0000 Subject: [PATCH 0507/1792] flag: add Func Fixes #39557 Change-Id: Ida578f7484335e8c6bf927255f75377eda63b563 GitHub-Last-Rev: b97294f7669c24011e5b093179d65636512a84cd GitHub-Pull-Request: golang/go#39880 Reviewed-on: https://go-review.googlesource.com/c/go/+/240014 Reviewed-by: Russ Cox Trust: Ian Lance Taylor --- src/flag/example_func_test.go | 41 ++++++++++++++++++++++++++++ src/flag/flag.go | 22 ++++++++++++++- src/flag/flag_test.go | 50 +++++++++++++++++++++++++++++++++-- 3 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/flag/example_func_test.go diff --git a/src/flag/example_func_test.go b/src/flag/example_func_test.go new file mode 100644 index 0000000000..7c30c5e713 --- /dev/null +++ b/src/flag/example_func_test.go @@ -0,0 +1,41 @@ +// 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 flag_test + +import ( + "errors" + "flag" + "fmt" + "net" + "os" +) + +func ExampleFunc() { + fs := flag.NewFlagSet("ExampleFunc", flag.ContinueOnError) + fs.SetOutput(os.Stdout) + var ip net.IP + fs.Func("ip", "`IP address` to parse", func(s string) error { + ip = net.ParseIP(s) + if ip == nil { + return errors.New("could not parse IP") + } + return nil + }) + fs.Parse([]string{"-ip", "127.0.0.1"}) + fmt.Printf("{ip: %v, loopback: %t}\n\n", ip, ip.IsLoopback()) + + // 256 is not a valid IPv4 component + fs.Parse([]string{"-ip", "256.0.0.1"}) + fmt.Printf("{ip: %v, loopback: %t}\n\n", ip, ip.IsLoopback()) + + // Output: + // {ip: 127.0.0.1, loopback: true} + // + // invalid value "256.0.0.1" for flag -ip: could not parse IP + // Usage of ExampleFunc: + // -ip IP address + // IP address to parse + // {ip: , loopback: false} +} diff --git a/src/flag/flag.go b/src/flag/flag.go index 286bba6873..a8485f034f 100644 --- a/src/flag/flag.go +++ b/src/flag/flag.go @@ -278,6 +278,12 @@ func (d *durationValue) Get() interface{} { return time.Duration(*d) } func (d *durationValue) String() string { return (*time.Duration)(d).String() } +type funcValue func(string) error + +func (f funcValue) Set(s string) error { return f(s) } + +func (f funcValue) String() string { return "" } + // Value is the interface to the dynamic value stored in a flag. // (The default value is represented as a string.) // @@ -296,7 +302,7 @@ type Value interface { // Getter is an interface that allows the contents of a Value to be retrieved. // It wraps the Value interface, rather than being part of it, because it // appeared after Go 1 and its compatibility rules. All Value types provided -// by this package satisfy the Getter interface. +// by this package satisfy the Getter interface, except the type used by Func. type Getter interface { Value Get() interface{} @@ -830,6 +836,20 @@ func Duration(name string, value time.Duration, usage string) *time.Duration { return CommandLine.Duration(name, value, usage) } +// Func defines a flag with the specified name and usage string. +// 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) Func(name, usage string, fn func(string) error) { + f.Var(funcValue(fn), name, usage) +} + +// Func defines a flag with the specified name and usage string. +// 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 Func(name, usage string, fn func(string) error) { + CommandLine.Func(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 diff --git a/src/flag/flag_test.go b/src/flag/flag_test.go index a01a5e4cea..2793064511 100644 --- a/src/flag/flag_test.go +++ b/src/flag/flag_test.go @@ -38,6 +38,7 @@ func TestEverything(t *testing.T) { String("test_string", "0", "string value") Float64("test_float64", 0, "float64 value") Duration("test_duration", 0, "time.Duration value") + Func("test_func", "func value", func(string) error { return nil }) m := make(map[string]*Flag) desired := "0" @@ -52,6 +53,8 @@ func TestEverything(t *testing.T) { ok = true case f.Name == "test_duration" && f.Value.String() == desired+"s": ok = true + case f.Name == "test_func" && f.Value.String() == "": + ok = true } if !ok { t.Error("Visit: bad value", f.Value.String(), "for", f.Name) @@ -59,7 +62,7 @@ func TestEverything(t *testing.T) { } } VisitAll(visitor) - if len(m) != 8 { + if len(m) != 9 { t.Error("VisitAll misses some flags") for k, v := range m { t.Log(k, *v) @@ -82,9 +85,10 @@ func TestEverything(t *testing.T) { Set("test_string", "1") Set("test_float64", "1") Set("test_duration", "1s") + Set("test_func", "1") desired = "1" Visit(visitor) - if len(m) != 8 { + if len(m) != 9 { t.Error("Visit fails after set") for k, v := range m { t.Log(k, *v) @@ -257,6 +261,48 @@ func TestUserDefined(t *testing.T) { } } +func TestUserDefinedFunc(t *testing.T) { + var flags FlagSet + flags.Init("test", ContinueOnError) + var ss []string + flags.Func("v", "usage", func(s string) error { + ss = append(ss, s) + return nil + }) + if err := flags.Parse([]string{"-v", "1", "-v", "2", "-v=3"}); err != nil { + t.Error(err) + } + if len(ss) != 3 { + t.Fatal("expected 3 args; got ", len(ss)) + } + expect := "[1 2 3]" + if got := fmt.Sprint(ss); got != expect { + t.Errorf("expected value %q got %q", expect, got) + } + // 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 Func error + flags = *NewFlagSet("test", ContinueOnError) + flags.Func("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", "1"}); err == nil { + t.Error("expected error; got none") + } else if errMsg := err.Error(); !strings.Contains(errMsg, "test error") { + t.Errorf(`error should contain "test error"; got %q`, errMsg) + } +} + func TestUserDefinedForCommandLine(t *testing.T) { const help = "HELP" var result string -- GitLab From 4f915911e84819b69329a224d5b646983ac9fed7 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 26 Aug 2020 14:07:35 -0700 Subject: [PATCH 0508/1792] cmd/compile: allow aliases to go:notinheap types The alias doesn't need to be marked go:notinheap. It gets its notinheap-ness from the target type. Without this change, the type alias test in the notinheap.go file generates these two errors: notinheap.go:62: misplaced compiler directive notinheap.go:63: type nih must be go:notinheap The first is a result of go:notinheap pragmas not applying to type alias declarations. The second is the result of then trying to match the notinheap-ness of the alias and the target type. Add a few more go:notinheap tests while we are here. Update #40954 Change-Id: I067ec47698df6e9e593e080d67796fd05a1d480f Reviewed-on: https://go-review.googlesource.com/c/go/+/250939 Run-TryBot: Keith Randall TryBot-Result: Go Bot Reviewed-by: Emmanuel Odeke Trust: Keith Randall --- src/cmd/compile/internal/gc/typecheck.go | 2 +- test/notinheap.go | 8 ++++++++ test/notinheap2.go | 10 +++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index fb169cfec8..9bb3c69cd0 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -2068,7 +2068,7 @@ func typecheck1(n *Node, top int) (res *Node) { ok |= ctxStmt n.Left = typecheck(n.Left, ctxType) checkwidth(n.Left.Type) - if n.Left.Type != nil && n.Left.Type.NotInHeap() && n.Left.Name.Param.Pragma&NotInHeap == 0 { + if n.Left.Type != nil && n.Left.Type.NotInHeap() && !n.Left.Name.Param.Alias && n.Left.Name.Param.Pragma&NotInHeap == 0 { // The type contains go:notinheap types, so it // must be marked as such (alternatively, we // could silently propagate go:notinheap). diff --git a/test/notinheap.go b/test/notinheap.go index 16c3f8faf0..a2284a5068 100644 --- a/test/notinheap.go +++ b/test/notinheap.go @@ -52,6 +52,14 @@ type t3 byte //go:notinheap type t4 rune +// Type aliases inherit the go:notinheap-ness of the type they alias. +type nihAlias = nih + +type embedAlias1 struct { // ERROR "must be go:notinheap" + x nihAlias +} +type embedAlias2 [1]nihAlias // ERROR "must be go:notinheap" + var sink interface{} func i() { diff --git a/test/notinheap2.go b/test/notinheap2.go index de1e6db1d3..09d0fc0b7b 100644 --- a/test/notinheap2.go +++ b/test/notinheap2.go @@ -27,14 +27,18 @@ func f() { // Heap allocation is not okay. var y *nih +var y2 *struct{ x nih } +var y3 *[1]nih var z []nih var w []nih var n int func g() { - y = new(nih) // ERROR "heap allocation disallowed" - z = make([]nih, 1) // ERROR "heap allocation disallowed" - z = append(z, x) // ERROR "heap allocation disallowed" + y = new(nih) // ERROR "heap allocation disallowed" + y2 = new(struct{ x nih }) // ERROR "heap allocation disallowed" + y3 = new([1]nih) // ERROR "heap allocation disallowed" + z = make([]nih, 1) // ERROR "heap allocation disallowed" + z = append(z, x) // ERROR "heap allocation disallowed" // Test for special case of OMAKESLICECOPY x := make([]nih, n) // ERROR "heap allocation disallowed" copy(x, z) -- GitLab From 42b023d7b9cb8229e3035fa3d36bce41a1ef0c43 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 26 Aug 2020 14:17:35 -0700 Subject: [PATCH 0509/1792] cmd/cgo: use go:notinheap for anonymous structs They can't reasonably be allocated on the heap. Not a huge deal, but it has an interesting and useful side effect. After CL 249917, the compiler and runtime treat pointers to go:notinheap types as uintptrs instead of real pointers (no write barrier, not processed during stack scanning, ...). That feature is exactly what we want for cgo to fix #40954. All the cases we have of pointers declared in C, but which might actually be filled with non-pointer data, are of this form (JNI's jobject heirarch, Darwin's CFType heirarchy, ...). Fixes #40954 Change-Id: I44a3b9bc2513d4287107e39d0cbbd0efd46a3aae Reviewed-on: https://go-review.googlesource.com/c/go/+/250940 Run-TryBot: Emmanuel Odeke TryBot-Result: Go Bot Trust: Keith Randall Reviewed-by: Ian Lance Taylor --- src/cmd/cgo/gcc.go | 15 +++++++++++++++ src/cmd/cgo/main.go | 3 ++- src/cmd/cgo/out.go | 3 +++ test/fixedbugs/issue40954.go | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue40954.go diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index eb6c1a5c89..730db44990 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -2448,6 +2448,18 @@ func (c *typeConv) loadType(dtype dwarf.Type, pos token.Pos, parent string) *Typ tt := *t tt.C = &TypeRepr{"%s %s", []interface{}{dt.Kind, tag}} tt.Go = c.Ident("struct{}") + if dt.Kind == "struct" { + // We don't know what the representation of this struct is, so don't let + // anyone allocate one on the Go side. As a side effect of this annotation, + // pointers to this type will not be considered pointers in Go. They won't + // get writebarrier-ed or adjusted during a stack copy. This should handle + // all the cases badPointerTypedef used to handle, but hopefully will + // continue to work going forward without any more need for cgo changes. + tt.NotInHeap = true + // TODO: we should probably do the same for unions. Unions can't live + // on the Go heap, right? It currently doesn't work for unions because + // they are defined as a type alias for struct{}, not a defined type. + } typedef[name.Name] = &tt break } @@ -2518,6 +2530,7 @@ func (c *typeConv) loadType(dtype dwarf.Type, pos token.Pos, parent string) *Typ } t.Go = name t.BadPointer = sub.BadPointer + t.NotInHeap = sub.NotInHeap if unionWithPointer[sub.Go] { unionWithPointer[t.Go] = true } @@ -2528,6 +2541,7 @@ func (c *typeConv) loadType(dtype dwarf.Type, pos token.Pos, parent string) *Typ tt := *t tt.Go = sub.Go tt.BadPointer = sub.BadPointer + tt.NotInHeap = sub.NotInHeap typedef[name.Name] = &tt } @@ -3026,6 +3040,7 @@ func (c *typeConv) anonymousStructTypedef(dt *dwarf.TypedefType) bool { // non-pointers in this type. // TODO: Currently our best solution is to find these manually and list them as // they come up. A better solution is desired. +// Note: DEPRECATED. There is now a better solution. Search for NotInHeap in this file. func (c *typeConv) badPointerTypedef(dt *dwarf.TypedefType) bool { if c.badCFType(dt) { return true diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go index 5a7bb3f87b..ef3ed968e4 100644 --- a/src/cmd/cgo/main.go +++ b/src/cmd/cgo/main.go @@ -151,7 +151,8 @@ type Type struct { Go ast.Expr EnumValues map[string]int64 Typedef string - BadPointer bool + BadPointer bool // this pointer type should be represented as a uintptr (deprecated) + NotInHeap bool // this type should have a go:notinheap annotation } // A FuncType collects information about a function type in both the C and Go worlds. diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 50d2811f1b..03b8333b10 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -108,6 +108,9 @@ func (p *Package) writeDefs() { sort.Strings(typedefNames) for _, name := range typedefNames { def := typedef[name] + if def.NotInHeap { + fmt.Fprintf(fgo2, "//go:notinheap\n") + } fmt.Fprintf(fgo2, "type %s ", name) // We don't have source info for these types, so write them out without source info. // Otherwise types would look like: diff --git a/test/fixedbugs/issue40954.go b/test/fixedbugs/issue40954.go new file mode 100644 index 0000000000..53e9ccf387 --- /dev/null +++ b/test/fixedbugs/issue40954.go @@ -0,0 +1,35 @@ +// run + +// 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 main + +import ( + "unsafe" +) + +//go:notinheap +type S struct{ x int } + +func main() { + var i int + p := (*S)(unsafe.Pointer(uintptr(unsafe.Pointer(&i)))) + v := uintptr(unsafe.Pointer(p)) + // p is a pointer to a go:notinheap type. Like some C libraries, + // we stored an integer in that pointer. That integer just happens + // to be the address of i. + // v is also the address of i. + // p has a base type which is marked go:notinheap, so it + // should not be adjusted when the stack is copied. + recurse(100, p, v) +} +func recurse(n int, p *S, v uintptr) { + if n > 0 { + recurse(n-1, p, v) + } + if uintptr(unsafe.Pointer(p)) != v { + panic("adjusted notinheap pointer") + } +} -- GitLab From 37f261010f837f945eaa2d33d90cd822b4e93459 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 27 Aug 2020 14:05:52 -0700 Subject: [PATCH 0510/1792] cmd/compile: make go:notinheap error message friendlier for cgo Update #40954 Change-Id: Ifaab7349631ccb12fc892882bbdf7f0ebf3d845f Reviewed-on: https://go-review.googlesource.com/c/go/+/251158 Run-TryBot: Keith Randall Reviewed-by: Ian Lance Taylor TryBot-Result: Go Bot Trust: Keith Randall --- src/cmd/compile/internal/gc/escape.go | 2 +- src/cmd/compile/internal/gc/subr.go | 4 ++-- src/cmd/compile/internal/gc/typecheck.go | 6 +++--- src/cmd/compile/internal/gc/walk.go | 8 ++++---- test/notinheap.go | 14 +++++++------- test/notinheap2.go | 14 +++++++------- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/cmd/compile/internal/gc/escape.go b/src/cmd/compile/internal/gc/escape.go index 75da439bb7..f435d8ff6a 100644 --- a/src/cmd/compile/internal/gc/escape.go +++ b/src/cmd/compile/internal/gc/escape.go @@ -1030,7 +1030,7 @@ func (e *Escape) newLoc(n *Node, transient bool) *EscLocation { Fatalf("e.curfn isn't set") } if n != nil && n.Type != nil && n.Type.NotInHeap() { - yyerrorl(n.Pos, "%v is go:notinheap; stack allocation disallowed", n.Type) + yyerrorl(n.Pos, "%v is incomplete (or unallocatable); stack allocation disallowed", n.Type) } n = canonicalNode(n) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 8883e75c49..b5527e2f83 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -689,14 +689,14 @@ func convertop(srcConstant bool, src, dst *types.Type, why *string) Op { // (a) Disallow (*T) to (*U) where T is go:notinheap but U isn't. if src.IsPtr() && dst.IsPtr() && dst.Elem().NotInHeap() && !src.Elem().NotInHeap() { if why != nil { - *why = fmt.Sprintf(":\n\t%v is go:notinheap, but %v is not", dst.Elem(), src.Elem()) + *why = fmt.Sprintf(":\n\t%v is incomplete (or unallocatable), but %v is not", dst.Elem(), src.Elem()) } return OXXX } // (b) Disallow string to []T where T is go:notinheap. if src.IsString() && dst.IsSlice() && dst.Elem().NotInHeap() && (dst.Elem().Etype == types.Bytetype.Etype || dst.Elem().Etype == types.Runetype.Etype) { if why != nil { - *why = fmt.Sprintf(":\n\t%v is go:notinheap", dst.Elem()) + *why = fmt.Sprintf(":\n\t%v is incomplete (or unallocatable)", dst.Elem()) } return OXXX } diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 9bb3c69cd0..8d777c399e 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -471,10 +471,10 @@ func typecheck1(n *Node, top int) (res *Node) { return n } if l.Type.NotInHeap() { - yyerror("go:notinheap map key not allowed") + yyerror("incomplete (or unallocatable) map key not allowed") } if r.Type.NotInHeap() { - yyerror("go:notinheap map value not allowed") + yyerror("incomplete (or unallocatable) map value not allowed") } setTypeNode(n, types.NewMap(l.Type, r.Type)) @@ -491,7 +491,7 @@ func typecheck1(n *Node, top int) (res *Node) { return n } if l.Type.NotInHeap() { - yyerror("chan of go:notinheap type not allowed") + yyerror("chan of incomplete (or unallocatable) type not allowed") } setTypeNode(n, types.NewChan(l.Type, n.TChanDir())) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index c3a740d4cc..2db352c8d5 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -648,7 +648,7 @@ opswitch: // x = append(...) r := n.Right if r.Type.Elem().NotInHeap() { - yyerror("%v is go:notinheap; heap allocation disallowed", r.Type.Elem()) + yyerror("%v can't be allocated in Go; it is incomplete (or unallocatable)", r.Type.Elem()) } switch { case isAppendOfMake(r): @@ -1164,7 +1164,7 @@ opswitch: case ONEW: if n.Type.Elem().NotInHeap() { - yyerror("%v is go:notinheap; heap allocation disallowed", n.Type.Elem()) + yyerror("%v can't be allocated in Go; it is incomplete (or unallocatable)", n.Type.Elem()) } if n.Esc == EscNone { if n.Type.Elem().Width >= maxImplicitStackVarSize { @@ -1335,7 +1335,7 @@ opswitch: } t := n.Type if t.Elem().NotInHeap() { - yyerror("%v is go:notinheap; heap allocation disallowed", t.Elem()) + yyerror("%v can't be allocated in Go; it is incomplete (or unallocatable)", t.Elem()) } if n.Esc == EscNone { if !isSmallMakeSlice(n) { @@ -1412,7 +1412,7 @@ opswitch: t := n.Type if t.Elem().NotInHeap() { - yyerror("%v is go:notinheap; heap allocation disallowed", t.Elem()) + yyerror("%v can't be allocated in Go; it is incomplete (or unallocatable)", t.Elem()) } length := conv(n.Left, types.Types[TINT]) diff --git a/test/notinheap.go b/test/notinheap.go index a2284a5068..5dd4997a65 100644 --- a/test/notinheap.go +++ b/test/notinheap.go @@ -23,11 +23,11 @@ type embed3 struct { // ERROR "must be go:notinheap" x [1]nih } -type embed4 map[nih]int // ERROR "go:notinheap map key not allowed" +type embed4 map[nih]int // ERROR "incomplete \(or unallocatable\) map key not allowed" -type embed5 map[int]nih // ERROR "go:notinheap map value not allowed" +type embed5 map[int]nih // ERROR "incomplete \(or unallocatable\) map value not allowed" -type emebd6 chan nih // ERROR "chan of go:notinheap type not allowed" +type emebd6 chan nih // ERROR "chan of incomplete \(or unallocatable\) type not allowed" type okay1 *nih @@ -64,8 +64,8 @@ var sink interface{} func i() { sink = new(t1) // no error - sink = (*t2)(new(t1)) // ERROR "cannot convert(.|\n)*t2 is go:notinheap" - sink = (*t2)(new(struct{ x int })) // ERROR "cannot convert(.|\n)*t2 is go:notinheap" - sink = []t3("foo") // ERROR "cannot convert(.|\n)*t3 is go:notinheap" - sink = []t4("bar") // ERROR "cannot convert(.|\n)*t4 is go:notinheap" + sink = (*t2)(new(t1)) // ERROR "cannot convert(.|\n)*t2 is incomplete \(or unallocatable\)" + sink = (*t2)(new(struct{ x int })) // ERROR "cannot convert(.|\n)*t2 is incomplete \(or unallocatable\)" + sink = []t3("foo") // ERROR "cannot convert(.|\n)*t3 is incomplete \(or unallocatable\)" + sink = []t4("bar") // ERROR "cannot convert(.|\n)*t4 is incomplete \(or unallocatable\)" } diff --git a/test/notinheap2.go b/test/notinheap2.go index 09d0fc0b7b..23d4b0ae77 100644 --- a/test/notinheap2.go +++ b/test/notinheap2.go @@ -20,7 +20,7 @@ var x nih // Stack variables are not okay. func f() { - var y nih // ERROR "nih is go:notinheap; stack allocation disallowed" + var y nih // ERROR "nih is incomplete \(or unallocatable\); stack allocation disallowed" x = y } @@ -34,13 +34,13 @@ var w []nih var n int func g() { - y = new(nih) // ERROR "heap allocation disallowed" - y2 = new(struct{ x nih }) // ERROR "heap allocation disallowed" - y3 = new([1]nih) // ERROR "heap allocation disallowed" - z = make([]nih, 1) // ERROR "heap allocation disallowed" - z = append(z, x) // ERROR "heap allocation disallowed" + y = new(nih) // ERROR "can't be allocated in Go" + y2 = new(struct{ x nih }) // ERROR "can't be allocated in Go" + y3 = new([1]nih) // ERROR "can't be allocated in Go" + z = make([]nih, 1) // ERROR "can't be allocated in Go" + z = append(z, x) // ERROR "can't be allocated in Go" // Test for special case of OMAKESLICECOPY - x := make([]nih, n) // ERROR "heap allocation disallowed" + x := make([]nih, n) // ERROR "can't be allocated in Go" copy(x, z) z = x } -- GitLab From 10dfb1dd3d1d26122cf18f29468ec17eb7222c3f Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 16 Sep 2020 17:08:55 +0000 Subject: [PATCH 0511/1792] runtime: actually fix locking in BenchmarkMSpanCountAlloc I just submitted CL 255297 which mostly fixed this problem, but totally forgot to actually acquire/release the heap lock. Oops. Updates #41391. Change-Id: I45b42f20a9fc765c4de52476db3654d4bfe9feb3 Reviewed-on: https://go-review.googlesource.com/c/go/+/255298 Trust: Michael Knyszek Run-TryBot: Michael Knyszek Reviewed-by: Keith Randall TryBot-Result: Go Bot --- src/runtime/export_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index e3d6441c18..f2fa11dc98 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -991,7 +991,9 @@ type MSpan mspan func AllocMSpan() *MSpan { var s *mspan systemstack(func() { + lock(&mheap_.lock) s = (*mspan)(mheap_.spanalloc.alloc()) + unlock(&mheap_.lock) }) return (*MSpan)(s) } @@ -999,7 +1001,9 @@ func AllocMSpan() *MSpan { // Free an allocated mspan. func FreeMSpan(s *MSpan) { systemstack(func() { + lock(&mheap_.lock) mheap_.spanalloc.free(unsafe.Pointer(s)) + unlock(&mheap_.lock) }) } -- GitLab From 7ee35cb301eddf4d53e7bb2d5bf0873922d63a6e Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Wed, 16 Sep 2020 13:13:50 +0200 Subject: [PATCH 0512/1792] cmd/compile: be more specific in cannot assign errors "cannot assign to" compiler errors are very laconic: they never explain why the lhs cannot be assigned to (with one exception, when assigning to a struct field in a map). This change makes them a little more specific, in two more cases: when assigning to a string, or to a const; by giving a very brief reason why the lhs cannot be assigned to. Change-Id: I244cca7fc3c3814e00e0ccadeec62f747c293979 Reviewed-on: https://go-review.googlesource.com/c/go/+/255199 Trust: Alberto Donizetti Run-TryBot: Alberto Donizetti TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/typecheck.go | 9 +++++-- test/cannotassign.go | 33 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 test/cannotassign.go diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 8d777c399e..55773641ed 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -3135,9 +3135,14 @@ func checkassign(stmt *Node, n *Node) { return } - if n.Op == ODOT && n.Left.Op == OINDEXMAP { + switch { + case n.Op == ODOT && n.Left.Op == OINDEXMAP: yyerror("cannot assign to struct field %v in map", n) - } else { + case (n.Op == OINDEX && n.Left.Type.IsString()) || n.Op == OSLICESTR: + yyerror("cannot assign to %v (strings are immutable)", n) + case n.Op == OLITERAL && n.Sym != nil && n.isGoConst(): + yyerror("cannot assign to %v (declared const)", n) + default: yyerror("cannot assign to %v", n) } n.Type = nil diff --git a/test/cannotassign.go b/test/cannotassign.go new file mode 100644 index 0000000000..0de04ecad0 --- /dev/null +++ b/test/cannotassign.go @@ -0,0 +1,33 @@ +// errorcheck + +// 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. + +// Test "cannot assign" errors + +package main + +func main() { + var s string = "hello" + s[1:2] = "a" // ERROR "cannot assign to .* \(strings are immutable\)" + s[3] = "b" // ERROR "cannot assign to .* \(strings are immutable\)" + + const n int = 1 + const cs string = "hello" + n = 2 // ERROR "cannot assign to .* \(declared const\)" + cs = "hi" // ERROR "cannot assign to .* \(declared const\)" + true = false // ERROR "cannot assign to .* \(declared const\)" + + var m map[int]struct{ n int } + m[0].n = 7 // ERROR "cannot assign to struct field .* in map$" + + 1 = 7 // ERROR "cannot assign to 1$" + "hi" = 7 // ERROR `cannot assign to "hi"$` + nil = 7 // ERROR "cannot assign to nil$" + len("") = 7 // ERROR `cannot assign to len\(""\)$` + []int{} = nil // ERROR "cannot assign to \[\]int\{\}$" + + var x int = 7 + x + 1 = 7 // ERROR "cannot assign to x \+ 1$" +} -- GitLab From b4ef49e527787ec932d0b371bb24c3fc370b1e8d Mon Sep 17 00:00:00 2001 From: David Chase Date: Fri, 12 Jun 2020 13:48:26 -0400 Subject: [PATCH 0513/1792] cmd/compile: introduce special ssa Aux type for calls This is prerequisite to moving call expansion later into SSA, and probably a good idea anyway. Passes tests. This is the first minimal CL that does a 1-for-1 substitution of *ssa.AuxCall for *obj.LSym. Next step (next CL) is to make this change for all calls so that additional information can be stored in AuxCall. Change-Id: Ia3a7715648fd9fb1a176850767a726e6f5b959eb Reviewed-on: https://go-review.googlesource.com/c/go/+/237680 Trust: David Chase Run-TryBot: David Chase TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/plive.go | 6 +-- src/cmd/compile/internal/gc/ssa.go | 40 ++++++++------ src/cmd/compile/internal/ssa/check.go | 12 +++++ src/cmd/compile/internal/ssa/func_test.go | 7 +++ src/cmd/compile/internal/ssa/fuse_test.go | 4 +- src/cmd/compile/internal/ssa/gen/386Ops.go | 2 +- src/cmd/compile/internal/ssa/gen/AMD64Ops.go | 2 +- src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 2 +- src/cmd/compile/internal/ssa/gen/ARMOps.go | 2 +- src/cmd/compile/internal/ssa/gen/MIPS64Ops.go | 2 +- src/cmd/compile/internal/ssa/gen/MIPSOps.go | 2 +- src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 2 +- .../compile/internal/ssa/gen/RISCV64Ops.go | 6 +-- src/cmd/compile/internal/ssa/gen/S390XOps.go | 2 +- src/cmd/compile/internal/ssa/gen/WasmOps.go | 2 +- .../compile/internal/ssa/gen/generic.rules | 12 ++--- .../compile/internal/ssa/gen/genericOps.go | 6 +-- src/cmd/compile/internal/ssa/gen/rulegen.go | 10 +++- .../compile/internal/ssa/loopreschedchecks.go | 2 +- src/cmd/compile/internal/ssa/op.go | 13 +++++ src/cmd/compile/internal/ssa/opGen.go | 53 ++++++++----------- src/cmd/compile/internal/ssa/regalloc_test.go | 12 ++--- src/cmd/compile/internal/ssa/rewrite.go | 33 ++++++------ .../compile/internal/ssa/rewritegeneric.go | 40 +++++++------- src/cmd/compile/internal/ssa/value.go | 4 +- src/cmd/compile/internal/ssa/writebarrier.go | 4 +- src/cmd/compile/internal/wasm/ssa.go | 5 +- 27 files changed, 164 insertions(+), 123 deletions(-) diff --git a/src/cmd/compile/internal/gc/plive.go b/src/cmd/compile/internal/gc/plive.go index 8976ed657a..a9ea37701e 100644 --- a/src/cmd/compile/internal/gc/plive.go +++ b/src/cmd/compile/internal/gc/plive.go @@ -861,7 +861,7 @@ func (lv *Liveness) hasStackMap(v *ssa.Value) bool { // typedmemclr and typedmemmove are write barriers and // deeply non-preemptible. They are unsafe points and // hence should not have liveness maps. - if sym, _ := v.Aux.(*obj.LSym); sym == typedmemclr || sym == typedmemmove { + if sym, ok := v.Aux.(*ssa.AuxCall); ok && (sym.Fn == typedmemclr || sym.Fn == typedmemmove) { return false } return true @@ -1231,8 +1231,8 @@ func (lv *Liveness) showlive(v *ssa.Value, live bvec) { s := "live at " if v == nil { s += fmt.Sprintf("entry to %s:", lv.fn.funcname()) - } else if sym, ok := v.Aux.(*obj.LSym); ok { - fn := sym.Name + } else if sym, ok := v.Aux.(*ssa.AuxCall); ok && sym.Fn != nil { + fn := sym.Fn.Name if pos := strings.Index(fn, "."); pos >= 0 { fn = fn[pos+1:] } diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 3bdb5b0b9f..0ee31bd9a3 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -805,6 +805,11 @@ func (s *state) newValue2(op ssa.Op, t *types.Type, arg0, arg1 *ssa.Value) *ssa. return s.curBlock.NewValue2(s.peekPos(), op, t, arg0, arg1) } +// newValue2A adds a new value with two arguments and an aux value to the current block. +func (s *state) newValue2A(op ssa.Op, t *types.Type, aux interface{}, arg0, arg1 *ssa.Value) *ssa.Value { + return s.curBlock.NewValue2A(s.peekPos(), op, t, aux, arg0, arg1) +} + // newValue2Apos adds a new value with two arguments and an aux value to the current block. // isStmt determines whether the created values may be a statement or not // (i.e., false means never, yes means maybe). @@ -4297,10 +4302,10 @@ func (s *state) openDeferExit() { v := s.load(r.closure.Type.Elem(), r.closure) s.maybeNilCheckClosure(v, callDefer) codeptr := s.rawLoad(types.Types[TUINTPTR], v) - call = s.newValue3(ssa.OpClosureCall, types.TypeMem, codeptr, v, s.mem()) + call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, nil, codeptr, v, s.mem()) } else { // Do a static call if the original call was a static function or method - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, fn.Sym.Linksym(), s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: fn.Sym.Linksym()}, s.mem()) } call.AuxInt = stksize s.vars[&memVar] = call @@ -4432,7 +4437,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // Call runtime.deferprocStack with pointer to _defer record. arg0 := s.constOffPtrSP(types.Types[TUINTPTR], Ctxt.FixedFrameSize()) s.store(types.Types[TUINTPTR], arg0, addr) - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, deferprocStack, s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: deferprocStack}, s.mem()) if stksize < int64(Widthptr) { // We need room for both the call to deferprocStack and the call to // the deferred function. @@ -4477,9 +4482,9 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // call target switch { case k == callDefer: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, deferproc, s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: deferproc}, s.mem()) case k == callGo: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, newproc, s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: newproc}, s.mem()) case closure != nil: // rawLoad because loading the code pointer from a // closure is always safe, but IsSanitizerSafeAddr @@ -4487,11 +4492,11 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // critical that we not clobber any arguments already // stored onto the stack. codeptr = s.rawLoad(types.Types[TUINTPTR], closure) - call = s.newValue3(ssa.OpClosureCall, types.TypeMem, codeptr, closure, s.mem()) + call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, nil, codeptr, closure, s.mem()) case codeptr != nil: - call = s.newValue2(ssa.OpInterCall, types.TypeMem, codeptr, s.mem()) + call = s.newValue2A(ssa.OpInterCall, types.TypeMem, nil, codeptr, s.mem()) case sym != nil: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, sym.Linksym(), s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: sym.Linksym()}, s.mem()) default: s.Fatalf("bad call type %v %v", n.Op, n) } @@ -4924,7 +4929,7 @@ func (s *state) rtcall(fn *obj.LSym, returns bool, results []*types.Type, args . off = Rnd(off, int64(Widthreg)) // Issue call - call := s.newValue1A(ssa.OpStaticCall, types.TypeMem, fn, s.mem()) + call := s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: fn}, s.mem()) s.vars[&memVar] = call if !returns { @@ -6355,6 +6360,9 @@ func AddAux2(a *obj.Addr, v *ssa.Value, offset int64) { } // Add symbol's offset from its base register. switch n := v.Aux.(type) { + case *ssa.AuxCall: + a.Name = obj.NAME_EXTERN + a.Sym = n.Fn case *obj.LSym: a.Name = obj.NAME_EXTERN a.Sym = n @@ -6541,10 +6549,10 @@ func (s *SSAGenState) Call(v *ssa.Value) *obj.Prog { } else { p.Pos = v.Pos.WithNotStmt() } - if sym, ok := v.Aux.(*obj.LSym); ok { + if sym, ok := v.Aux.(*ssa.AuxCall); ok && sym.Fn != nil { p.To.Type = obj.TYPE_MEM p.To.Name = obj.NAME_EXTERN - p.To.Sym = sym + p.To.Sym = sym.Fn } else { // TODO(mdempsky): Can these differences be eliminated? switch thearch.LinkArch.Family { @@ -6567,12 +6575,14 @@ func (s *SSAGenState) PrepareCall(v *ssa.Value) { idx := s.livenessMap.Get(v) if !idx.StackMapValid() { // See Liveness.hasStackMap. - if sym, _ := v.Aux.(*obj.LSym); !(sym == typedmemclr || sym == typedmemmove) { + if sym, ok := v.Aux.(*ssa.AuxCall); !ok || !(sym.Fn == typedmemclr || sym.Fn == typedmemmove) { Fatalf("missing stack map index for %v", v.LongString()) } } - if sym, _ := v.Aux.(*obj.LSym); sym == Deferreturn { + call, ok := v.Aux.(*ssa.AuxCall) + + if ok && call.Fn == Deferreturn { // Deferred calls will appear to be returning to // the CALL deferreturn(SB) that we are about to emit. // However, the stack trace code will show the line @@ -6584,11 +6594,11 @@ func (s *SSAGenState) PrepareCall(v *ssa.Value) { thearch.Ginsnopdefer(s.pp) } - if sym, ok := v.Aux.(*obj.LSym); ok { + if ok { // Record call graph information for nowritebarrierrec // analysis. if nowritebarrierrecCheck != nil { - nowritebarrierrecCheck.recordCall(s.pp.curfn, sym, v.Pos) + nowritebarrierrecCheck.recordCall(s.pp.curfn, call.Fn, v.Pos) } } diff --git a/src/cmd/compile/internal/ssa/check.go b/src/cmd/compile/internal/ssa/check.go index 828f645b39..9ce87e0aea 100644 --- a/src/cmd/compile/internal/ssa/check.go +++ b/src/cmd/compile/internal/ssa/check.go @@ -165,6 +165,18 @@ func checkFunc(f *Func) { f.Fatalf("value %v has Aux type %T, want string", v, v.Aux) } canHaveAux = true + case auxCallOff: + canHaveAuxInt = true + fallthrough + case auxCall: + if ac, ok := v.Aux.(*AuxCall); ok { + if v.Op == OpStaticCall && ac.Fn == nil { + f.Fatalf("value %v has *AuxCall with nil Fn", v) + } + } else { + f.Fatalf("value %v has Aux type %T, want *AuxCall", v, v.Aux) + } + canHaveAux = true case auxSym, auxTyp: canHaveAux = true case auxSymOff, auxSymValAndOff, auxTypSize: diff --git a/src/cmd/compile/internal/ssa/func_test.go b/src/cmd/compile/internal/ssa/func_test.go index 5f6f80f72a..568c6436f5 100644 --- a/src/cmd/compile/internal/ssa/func_test.go +++ b/src/cmd/compile/internal/ssa/func_test.go @@ -38,6 +38,7 @@ package ssa import ( "cmd/compile/internal/types" + "cmd/internal/obj" "cmd/internal/src" "fmt" "reflect" @@ -140,6 +141,12 @@ var emptyPass pass = pass{ name: "empty pass", } +// AuxCallLSym returns an AuxCall initialized with an LSym that should pass "check" +// as the Aux of a static call. +func AuxCallLSym(name string) *AuxCall { + return &AuxCall{Fn: &obj.LSym{}} +} + // Fun takes the name of an entry bloc and a series of Bloc calls, and // returns a fun containing the composed Func. entry must be a name // supplied to one of the Bloc functions. Each of the bloc names and diff --git a/src/cmd/compile/internal/ssa/fuse_test.go b/src/cmd/compile/internal/ssa/fuse_test.go index 5fe3da93ca..15190997f2 100644 --- a/src/cmd/compile/internal/ssa/fuse_test.go +++ b/src/cmd/compile/internal/ssa/fuse_test.go @@ -142,10 +142,10 @@ func TestFuseSideEffects(t *testing.T) { Valu("b", OpArg, c.config.Types.Bool, 0, nil), If("b", "then", "else")), Bloc("then", - Valu("call1", OpStaticCall, types.TypeMem, 0, nil, "mem"), + Valu("call1", OpStaticCall, types.TypeMem, 0, AuxCallLSym("_"), "mem"), Goto("empty")), Bloc("else", - Valu("call2", OpStaticCall, types.TypeMem, 0, nil, "mem"), + Valu("call2", OpStaticCall, types.TypeMem, 0, AuxCallLSym("_"), "mem"), Goto("empty")), Bloc("empty", Goto("loop")), diff --git a/src/cmd/compile/internal/ssa/gen/386Ops.go b/src/cmd/compile/internal/ssa/gen/386Ops.go index 1061e5579d..64a17cb7a3 100644 --- a/src/cmd/compile/internal/ssa/gen/386Ops.go +++ b/src/cmd/compile/internal/ssa/gen/386Ops.go @@ -463,7 +463,7 @@ func init() { faultOnNilArg0: true, }, - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("DX"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go index e6d66957dd..d267fe8753 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go @@ -767,7 +767,7 @@ func init() { faultOnNilArg0: true, }, - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("DX"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index e9af261a6a..f52d68dc33 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -471,7 +471,7 @@ func init() { {name: "CSEL0", argLength: 2, reg: gp1flags1, asm: "CSEL", aux: "CCop"}, // auxint(flags) ? arg0 : 0 // function calls - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R26"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/ARMOps.go b/src/cmd/compile/internal/ssa/gen/ARMOps.go index 068fecf74c..1e6b4546da 100644 --- a/src/cmd/compile/internal/ssa/gen/ARMOps.go +++ b/src/cmd/compile/internal/ssa/gen/ARMOps.go @@ -428,7 +428,7 @@ func init() { {name: "SRAcond", argLength: 3, reg: gp2flags1, asm: "SRA"}, // arg0 >> 31 if flags indicates HS, arg0 >> arg1 otherwise, signed shift, arg2=flags // function calls - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R7"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go b/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go index 5f00c080af..dc2e9d3ec9 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go @@ -273,7 +273,7 @@ func init() { {name: "MOVDF", argLength: 1, reg: fp11, asm: "MOVDF"}, // float64 -> float32 // function calls - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R22"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/MIPSOps.go b/src/cmd/compile/internal/ssa/gen/MIPSOps.go index a5f6c8df54..c66adcf93a 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPSOps.go +++ b/src/cmd/compile/internal/ssa/gen/MIPSOps.go @@ -255,7 +255,7 @@ func init() { {name: "MOVDF", argLength: 1, reg: fp11, asm: "MOVDF"}, // float64 -> float32 // function calls - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R22"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index 44f6a74c63..0c04e561ad 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -414,7 +414,7 @@ func init() { {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true}, {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true}, - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{callptr, ctxt, 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go b/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go index 8ab4abe04a..17970918e2 100644 --- a/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go @@ -224,9 +224,9 @@ func init() { {name: "MOVconvert", argLength: 2, reg: gp11, asm: "MOV"}, // arg0, but converted to int/ptr as appropriate; arg1=mem // Calls - {name: "CALLstatic", argLength: 1, reg: call, aux: "SymOff", call: true, symEffect: "None"}, // call static function aux.(*gc.Sym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: callClosure, aux: "Int64", call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: callInter, aux: "Int64", call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: call, aux: "CallOff", call: true}, // call static function aux.(*gc.Sym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: callClosure, aux: "Int64", call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: callInter, aux: "Int64", call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // Generic moves and zeros diff --git a/src/cmd/compile/internal/ssa/gen/S390XOps.go b/src/cmd/compile/internal/ssa/gen/S390XOps.go index 710beaddbb..eede8a654b 100644 --- a/src/cmd/compile/internal/ssa/gen/S390XOps.go +++ b/src/cmd/compile/internal/ssa/gen/S390XOps.go @@ -475,7 +475,7 @@ func init() { {name: "CLEAR", argLength: 2, reg: regInfo{inputs: []regMask{ptr, 0}}, asm: "CLEAR", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", clobberFlags: true, call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{ptrsp, buildReg("R12"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{ptr}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/WasmOps.go b/src/cmd/compile/internal/ssa/gen/WasmOps.go index e43eae17e9..3286a68fb0 100644 --- a/src/cmd/compile/internal/ssa/gen/WasmOps.go +++ b/src/cmd/compile/internal/ssa/gen/WasmOps.go @@ -122,7 +122,7 @@ func init() { ) var WasmOps = []opData{ - {name: "LoweredStaticCall", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "SymOff", call: true, symEffect: "None"}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "LoweredStaticCall", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem {name: "LoweredClosureCall", argLength: 3, reg: regInfo{inputs: []regMask{gp, gp, 0}, clobbers: callerSave}, aux: "Int64", call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem {name: "LoweredInterCall", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index f7e6bbebac..df70838aa9 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -1933,30 +1933,30 @@ // recognize runtime.newobject and don't Zero/Nilcheck it (Zero (Load (OffPtr [c] (SP)) mem) mem) && mem.Op == OpStaticCall - && isSameSym(mem.Aux, "runtime.newobject") + && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value => mem (Store (Load (OffPtr [c] (SP)) mem) x mem) && isConstZero(x) && mem.Op == OpStaticCall - && isSameSym(mem.Aux, "runtime.newobject") + && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value => mem (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) && isConstZero(x) && mem.Op == OpStaticCall - && isSameSym(mem.Aux, "runtime.newobject") + && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value => mem // nil checks just need to rewrite to something useless. // they will be deadcode eliminated soon afterwards. (NilCheck (Load (OffPtr [c] (SP)) (StaticCall {sym} _)) _) - && symNamed(sym, "runtime.newobject") + && isSameCall(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value && warnRule(fe.Debug_checknil(), v, "removed nil check") => (Invalid) (NilCheck (OffPtr (Load (OffPtr [c] (SP)) (StaticCall {sym} _))) _) - && symNamed(sym, "runtime.newobject") + && isSameCall(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // offset of return value && warnRule(fe.Debug_checknil(), v, "removed nil check") => (Invalid) @@ -2010,7 +2010,7 @@ // See the comment in op Move in genericOps.go for discussion of the type. (StaticCall {sym} s1:(Store _ (Const(64|32) [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) && sz >= 0 - && symNamed(sym, "runtime.memmove") + && isSameCall(sym, "runtime.memmove") && t.IsPtr() // avoids TUINTPTR, see issue 30061 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) diff --git a/src/cmd/compile/internal/ssa/gen/genericOps.go b/src/cmd/compile/internal/ssa/gen/genericOps.go index 5df0a164bf..acfe222089 100644 --- a/src/cmd/compile/internal/ssa/gen/genericOps.go +++ b/src/cmd/compile/internal/ssa/gen/genericOps.go @@ -387,9 +387,9 @@ var genericOps = []opData{ // as a phantom first argument. // TODO(josharian): ClosureCall and InterCall should have Int32 aux // to match StaticCall's 32 bit arg size limit. - {name: "ClosureCall", argLength: 3, aux: "Int64", call: true}, // arg0=code pointer, arg1=context ptr, arg2=memory. auxint=arg size. Returns memory. - {name: "StaticCall", argLength: 1, aux: "SymOff", call: true, symEffect: "None"}, // call function aux.(*obj.LSym), arg0=memory. auxint=arg size. Returns memory. - {name: "InterCall", argLength: 2, aux: "Int64", call: true}, // interface call. arg0=code pointer, arg1=memory, auxint=arg size. Returns memory. + {name: "ClosureCall", argLength: 3, aux: "Int64", call: true}, // arg0=code pointer, arg1=context ptr, arg2=memory. auxint=arg size. Returns memory. + {name: "StaticCall", argLength: 1, aux: "CallOff", call: true}, // call function aux.(*obj.LSym), arg0=memory. auxint=arg size. Returns memory. + {name: "InterCall", argLength: 2, aux: "Int64", call: true}, // interface call. arg0=code pointer, arg1=memory, auxint=arg size. Returns memory. // Conversions: signed extensions, zero (unsigned) extensions, truncations {name: "SignExt8to16", argLength: 1, typ: "Int16"}, diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index 9e2e112cd7..be51a7c5f8 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -1424,7 +1424,7 @@ func parseValue(val string, arch arch, loc string) (op opData, oparch, typ, auxi func opHasAuxInt(op opData) bool { switch op.aux { case "Bool", "Int8", "Int16", "Int32", "Int64", "Int128", "Float32", "Float64", - "SymOff", "SymValAndOff", "TypSize", "ARM64BitField", "FlagConstant", "CCop": + "SymOff", "CallOff", "SymValAndOff", "TypSize", "ARM64BitField", "FlagConstant", "CCop": return true } return false @@ -1432,7 +1432,7 @@ func opHasAuxInt(op opData) bool { func opHasAux(op opData) bool { switch op.aux { - case "String", "Sym", "SymOff", "SymValAndOff", "Typ", "TypSize", + case "String", "Sym", "SymOff", "Call", "CallOff", "SymValAndOff", "Typ", "TypSize", "S390XCCMask", "S390XRotateParams": return true } @@ -1775,6 +1775,10 @@ func (op opData) auxType() string { return "Sym" case "SymOff": return "Sym" + case "Call": + return "Call" + case "CallOff": + return "Call" case "SymValAndOff": return "Sym" case "Typ": @@ -1809,6 +1813,8 @@ func (op opData) auxIntType() string { return "float32" case "Float64": return "float64" + case "CallOff": + return "int32" case "SymOff": return "int32" case "SymValAndOff": diff --git a/src/cmd/compile/internal/ssa/loopreschedchecks.go b/src/cmd/compile/internal/ssa/loopreschedchecks.go index 1932f9d23a..4a720fdede 100644 --- a/src/cmd/compile/internal/ssa/loopreschedchecks.go +++ b/src/cmd/compile/internal/ssa/loopreschedchecks.go @@ -246,7 +246,7 @@ func insertLoopReschedChecks(f *Func) { // mem1 := call resched (mem0) // goto header resched := f.fe.Syslook("goschedguarded") - mem1 := sched.NewValue1A(bb.Pos, OpStaticCall, types.TypeMem, resched, mem0) + mem1 := sched.NewValue1A(bb.Pos, OpStaticCall, types.TypeMem, &AuxCall{resched}, mem0) sched.AddEdgeTo(h) headerMemPhi.AddArg(mem1) diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go index 063998c6a1..3aa506e3ab 100644 --- a/src/cmd/compile/internal/ssa/op.go +++ b/src/cmd/compile/internal/ssa/op.go @@ -67,6 +67,17 @@ type regInfo struct { type auxType int8 +type AuxCall struct { + Fn *obj.LSym +} + +func (a *AuxCall) String() string { + if a.Fn == nil { + return "AuxCall(nil)" + } + return fmt.Sprintf("AuxCall(%v)", a.Fn) +} + const ( auxNone auxType = iota auxBool // auxInt is 0/1 for false/true @@ -85,6 +96,8 @@ const ( auxTyp // aux is a type auxTypSize // aux is a type, auxInt is a size, must have Aux.(Type).Size() == AuxInt auxCCop // aux is a ssa.Op that represents a flags-to-bool conversion (e.g. LessThan) + auxCall // aux is a *ssa.AuxCall + auxCallOff // aux is a *ssa.AuxCall, AuxInt is int64 param (in+out) size // architecture specific aux types auxARM64BitField // aux is an arm64 bitfield lsb and width packed into auxInt diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 45401898c8..797d82f2d1 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -5816,11 +5816,10 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLstatic", - auxType: auxSymOff, + auxType: auxCallOff, argLen: 1, clobberFlags: true, call: true, - symEffect: SymNone, reg: regInfo{ clobbers: 65519, // AX CX DX BX BP SI DI X0 X1 X2 X3 X4 X5 X6 X7 }, @@ -13152,11 +13151,10 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLstatic", - auxType: auxSymOff, + auxType: auxCallOff, argLen: 1, clobberFlags: true, call: true, - symEffect: SymNone, reg: regInfo{ clobbers: 4294967279, // AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 }, @@ -16922,11 +16920,10 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLstatic", - auxType: auxSymOff, + auxType: auxCallOff, argLen: 1, clobberFlags: true, call: true, - symEffect: SymNone, reg: regInfo{ clobbers: 4294924287, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 g R12 R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 }, @@ -20556,11 +20553,10 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLstatic", - auxType: auxSymOff, + auxType: auxCallOff, argLen: 1, clobberFlags: true, call: true, - symEffect: SymNone, reg: regInfo{ clobbers: 9223372035512336383, // 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 g 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 }, @@ -22257,11 +22253,10 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLstatic", - auxType: auxSymOff, + auxType: auxCallOff, argLen: 1, clobberFlags: true, call: true, - symEffect: SymNone, reg: regInfo{ clobbers: 140737421246462, // 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 g R31 F0 F2 F4 F6 F8 F10 F12 F14 F16 F18 F20 F22 F24 F26 F28 F30 HI LO }, @@ -23804,11 +23799,10 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLstatic", - auxType: auxSymOff, + auxType: auxCallOff, argLen: 1, clobberFlags: true, call: true, - symEffect: SymNone, reg: regInfo{ clobbers: 4611686018393833470, // 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 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 }, @@ -26504,11 +26498,10 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLstatic", - auxType: auxSymOff, + auxType: auxCallOff, argLen: 1, clobberFlags: true, call: true, - symEffect: SymNone, reg: regInfo{ clobbers: 576460745860964344, // 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 g 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 }, @@ -27787,11 +27780,10 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "CALLstatic", - auxType: auxSymOff, - argLen: 1, - call: true, - symEffect: SymNone, + name: "CALLstatic", + auxType: auxCallOff, + argLen: 1, + call: true, reg: regInfo{ clobbers: 9223372035781033980, // X3 g X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30 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 }, @@ -31386,11 +31378,10 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLstatic", - auxType: auxSymOff, + auxType: auxCallOff, argLen: 1, clobberFlags: true, call: true, - symEffect: SymNone, reg: regInfo{ clobbers: 4294933503, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R11 R12 g R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 }, @@ -32031,11 +32022,10 @@ var opcodeTable = [...]opInfo{ }, { - name: "LoweredStaticCall", - auxType: auxSymOff, - argLen: 1, - call: true, - symEffect: SymNone, + name: "LoweredStaticCall", + auxType: auxCallOff, + argLen: 1, + call: true, reg: regInfo{ 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 }, @@ -34779,12 +34769,11 @@ var opcodeTable = [...]opInfo{ generic: true, }, { - name: "StaticCall", - auxType: auxSymOff, - argLen: 1, - call: true, - symEffect: SymNone, - generic: true, + name: "StaticCall", + auxType: auxCallOff, + argLen: 1, + call: true, + generic: true, }, { name: "InterCall", diff --git a/src/cmd/compile/internal/ssa/regalloc_test.go b/src/cmd/compile/internal/ssa/regalloc_test.go index bb8be5e7ac..d990cac47b 100644 --- a/src/cmd/compile/internal/ssa/regalloc_test.go +++ b/src/cmd/compile/internal/ssa/regalloc_test.go @@ -68,7 +68,7 @@ func TestNoGetgLoadReg(t *testing.T) { Exit("v16"), ), Bloc("b2", - Valu("v12", OpARM64CALLstatic, types.TypeMem, 0, nil, "v1"), + Valu("v12", OpARM64CALLstatic, types.TypeMem, 0, AuxCallLSym("_"), "v1"), Goto("b3"), ), ) @@ -99,7 +99,7 @@ func TestSpillWithLoop(t *testing.T) { ), Bloc("loop", Valu("memphi", OpPhi, types.TypeMem, 0, nil, "mem", "call"), - Valu("call", OpAMD64CALLstatic, types.TypeMem, 0, nil, "memphi"), + Valu("call", OpAMD64CALLstatic, types.TypeMem, 0, AuxCallLSym("_"), "memphi"), Valu("test", OpAMD64CMPBconst, types.TypeFlags, 0, nil, "cond"), Eq("test", "next", "exit"), ), @@ -140,12 +140,12 @@ func TestSpillMove1(t *testing.T) { Bloc("exit1", // store before call, y is available in a register Valu("mem2", OpAMD64MOVQstore, types.TypeMem, 0, nil, "p", "y", "mem"), - Valu("mem3", OpAMD64CALLstatic, types.TypeMem, 0, nil, "mem2"), + Valu("mem3", OpAMD64CALLstatic, types.TypeMem, 0, AuxCallLSym("_"), "mem2"), Exit("mem3"), ), Bloc("exit2", // store after call, y must be loaded from a spill location - Valu("mem4", OpAMD64CALLstatic, types.TypeMem, 0, nil, "mem"), + Valu("mem4", OpAMD64CALLstatic, types.TypeMem, 0, AuxCallLSym("_"), "mem"), Valu("mem5", OpAMD64MOVQstore, types.TypeMem, 0, nil, "p", "y", "mem4"), Exit("mem5"), ), @@ -188,13 +188,13 @@ func TestSpillMove2(t *testing.T) { ), Bloc("exit1", // store after call, y must be loaded from a spill location - Valu("mem2", OpAMD64CALLstatic, types.TypeMem, 0, nil, "mem"), + Valu("mem2", OpAMD64CALLstatic, types.TypeMem, 0, AuxCallLSym("_"), "mem"), Valu("mem3", OpAMD64MOVQstore, types.TypeMem, 0, nil, "p", "y", "mem2"), Exit("mem3"), ), Bloc("exit2", // store after call, y must be loaded from a spill location - Valu("mem4", OpAMD64CALLstatic, types.TypeMem, 0, nil, "mem"), + Valu("mem4", OpAMD64CALLstatic, types.TypeMem, 0, AuxCallLSym("_"), "mem"), Valu("mem5", OpAMD64MOVQstore, types.TypeMem, 0, nil, "p", "y", "mem4"), Exit("mem5"), ), diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 09f94ef53e..8195d407e0 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -393,15 +393,9 @@ func canMergeLoad(target, load *Value) bool { return true } -// symNamed reports whether sym's name is name. -func symNamed(sym Sym, name string) bool { - return sym.String() == name -} - -// isSameSym reports whether sym is the same as the given named symbol -func isSameSym(sym interface{}, name string) bool { - s, ok := sym.(fmt.Stringer) - return ok && s.String() == name +// isSameCall reports whether sym is the same as the given named symbol +func isSameCall(sym interface{}, name string) bool { + return sym.(*AuxCall).Fn.String() == name } // nlz returns the number of leading zeros. @@ -713,6 +707,9 @@ func auxToSym(i interface{}) Sym { func auxToType(i interface{}) *types.Type { return i.(*types.Type) } +func auxToCall(i interface{}) *AuxCall { + return i.(*AuxCall) +} func auxToS390xCCMask(i interface{}) s390x.CCMask { return i.(s390x.CCMask) } @@ -726,6 +723,9 @@ func stringToAux(s string) interface{} { func symToAux(s Sym) interface{} { return s } +func callToAux(s *AuxCall) interface{} { + return s +} func typeToAux(t *types.Type) interface{} { return t } @@ -743,7 +743,7 @@ func uaddOvf(a, b int64) bool { // de-virtualize an InterCall // 'sym' is the symbol for the itab -func devirt(v *Value, sym Sym, offset int64) *obj.LSym { +func devirt(v *Value, sym Sym, offset int64) *AuxCall { f := v.Block.Func n, ok := sym.(*obj.LSym) if !ok { @@ -757,7 +757,10 @@ func devirt(v *Value, sym Sym, offset int64) *obj.LSym { f.Warnl(v.Pos, "couldn't de-virtualize call") } } - return lsym + if lsym == nil { + return nil + } + return &AuxCall{Fn: lsym} } // isSamePtr reports whether p1 and p2 point to the same address. @@ -1377,12 +1380,12 @@ func registerizable(b *Block, typ *types.Type) bool { } // needRaceCleanup reports whether this call to racefuncenter/exit isn't needed. -func needRaceCleanup(sym Sym, v *Value) bool { +func needRaceCleanup(sym *AuxCall, v *Value) bool { f := v.Block.Func if !f.Config.Race { return false } - if !symNamed(sym, "runtime.racefuncenter") && !symNamed(sym, "runtime.racefuncexit") { + if !isSameCall(sym, "runtime.racefuncenter") && !isSameCall(sym, "runtime.racefuncexit") { return false } for _, b := range f.Blocks { @@ -1391,7 +1394,7 @@ func needRaceCleanup(sym Sym, v *Value) bool { case OpStaticCall: // Check for racefuncenter will encounter racefuncexit and vice versa. // Allow calls to panic* - s := v.Aux.(fmt.Stringer).String() + s := v.Aux.(*AuxCall).Fn.String() switch s { case "runtime.racefuncenter", "runtime.racefuncexit", "runtime.panicdivide", "runtime.panicwrap", @@ -1409,7 +1412,7 @@ func needRaceCleanup(sym Sym, v *Value) bool { } } } - if symNamed(sym, "runtime.racefuncenter") { + if isSameCall(sym, "runtime.racefuncenter") { // If we're removing racefuncenter, remove its argument as well. if v.Args[0].Op != OpStore { return false diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 180e48b34c..4b388a68cd 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -8515,7 +8515,7 @@ func rewriteValuegeneric_OpInterCall(v *Value) bool { } v.reset(OpStaticCall) v.AuxInt = int32ToAuxInt(int32(argsize)) - v.Aux = symToAux(devirt(v, itab, off)) + v.Aux = callToAux(devirt(v, itab, off)) v.AddArg(mem) return true } @@ -16022,7 +16022,7 @@ func rewriteValuegeneric_OpNilCheck(v *Value) bool { return true } // match: (NilCheck (Load (OffPtr [c] (SP)) (StaticCall {sym} _)) _) - // cond: symNamed(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check") + // cond: isSameCall(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check") // result: (Invalid) for { if v_0.Op != OpLoad { @@ -16042,15 +16042,15 @@ func rewriteValuegeneric_OpNilCheck(v *Value) bool { if v_0_1.Op != OpStaticCall { break } - sym := auxToSym(v_0_1.Aux) - if !(symNamed(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check")) { + sym := auxToCall(v_0_1.Aux) + if !(isSameCall(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check")) { break } v.reset(OpInvalid) return true } // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) (StaticCall {sym} _))) _) - // cond: symNamed(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check") + // cond: isSameCall(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check") // result: (Invalid) for { if v_0.Op != OpOffPtr { @@ -16074,8 +16074,8 @@ func rewriteValuegeneric_OpNilCheck(v *Value) bool { if v_0_0_1.Op != OpStaticCall { break } - sym := auxToSym(v_0_0_1.Aux) - if !(symNamed(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check")) { + sym := auxToCall(v_0_0_1.Aux) + if !(isSameCall(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil(), v, "removed nil check")) { break } v.reset(OpInvalid) @@ -21067,10 +21067,10 @@ func rewriteValuegeneric_OpStaticCall(v *Value) bool { b := v.Block config := b.Func.Config // match: (StaticCall {sym} s1:(Store _ (Const64 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) - // cond: sz >= 0 && symNamed(sym, "runtime.memmove") && t.IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3) + // cond: sz >= 0 && isSameCall(sym, "runtime.memmove") && t.IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3) // result: (Move {t.Elem()} [int64(sz)] dst src mem) for { - sym := auxToSym(v.Aux) + sym := auxToCall(v.Aux) s1 := v_0 if s1.Op != OpStore { break @@ -21094,7 +21094,7 @@ func rewriteValuegeneric_OpStaticCall(v *Value) bool { t := auxToType(s3.Aux) mem := s3.Args[2] dst := s3.Args[1] - if !(sz >= 0 && symNamed(sym, "runtime.memmove") && t.IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3)) { + if !(sz >= 0 && isSameCall(sym, "runtime.memmove") && t.IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3)) { break } v.reset(OpMove) @@ -21104,10 +21104,10 @@ func rewriteValuegeneric_OpStaticCall(v *Value) bool { return true } // match: (StaticCall {sym} s1:(Store _ (Const32 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) - // cond: sz >= 0 && symNamed(sym, "runtime.memmove") && t.IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3) + // cond: sz >= 0 && isSameCall(sym, "runtime.memmove") && t.IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3) // result: (Move {t.Elem()} [int64(sz)] dst src mem) for { - sym := auxToSym(v.Aux) + sym := auxToCall(v.Aux) s1 := v_0 if s1.Op != OpStore { break @@ -21131,7 +21131,7 @@ func rewriteValuegeneric_OpStaticCall(v *Value) bool { t := auxToType(s3.Aux) mem := s3.Args[2] dst := s3.Args[1] - if !(sz >= 0 && symNamed(sym, "runtime.memmove") && t.IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3)) { + if !(sz >= 0 && isSameCall(sym, "runtime.memmove") && t.IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, int64(sz), config) && clobber(s1, s2, s3)) { break } v.reset(OpMove) @@ -21144,7 +21144,7 @@ func rewriteValuegeneric_OpStaticCall(v *Value) bool { // cond: needRaceCleanup(sym, v) // result: x for { - sym := auxToSym(v.Aux) + sym := auxToCall(v.Aux) x := v_0 if !(needRaceCleanup(sym, v)) { break @@ -21608,7 +21608,7 @@ func rewriteValuegeneric_OpStore(v *Value) bool { return true } // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) - // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize + // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // result: mem for { if v_0.Op != OpLoad { @@ -21625,14 +21625,14 @@ func rewriteValuegeneric_OpStore(v *Value) bool { break } x := v_1 - if mem != v_2 || !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { + if mem != v_2 || !(isConstZero(x) && mem.Op == OpStaticCall && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { break } v.copyOf(mem) return true } // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) - // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize + // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // result: mem for { if v_0.Op != OpOffPtr { @@ -21653,7 +21653,7 @@ func rewriteValuegeneric_OpStore(v *Value) bool { break } x := v_1 - if mem != v_2 || !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { + if mem != v_2 || !(isConstZero(x) && mem.Op == OpStaticCall && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { break } v.copyOf(mem) @@ -24337,7 +24337,7 @@ func rewriteValuegeneric_OpZero(v *Value) bool { b := v.Block config := b.Func.Config // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) - // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize + // cond: mem.Op == OpStaticCall && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // result: mem for { if v_0.Op != OpLoad { @@ -24350,7 +24350,7 @@ func rewriteValuegeneric_OpZero(v *Value) bool { } c := auxIntToInt64(v_0_0.AuxInt) v_0_0_0 := v_0_0.Args[0] - if v_0_0_0.Op != OpSP || mem != v_1 || !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { + if v_0_0_0.Op != OpSP || mem != v_1 || !(mem.Op == OpStaticCall && isSameCall(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { break } v.copyOf(mem) diff --git a/src/cmd/compile/internal/ssa/value.go b/src/cmd/compile/internal/ssa/value.go index 6692df7921..94b8763d5d 100644 --- a/src/cmd/compile/internal/ssa/value.go +++ b/src/cmd/compile/internal/ssa/value.go @@ -193,11 +193,11 @@ func (v *Value) auxString() string { return fmt.Sprintf(" [%g]", v.AuxFloat()) case auxString: return fmt.Sprintf(" {%q}", v.Aux) - case auxSym, auxTyp: + case auxSym, auxCall, auxTyp: if v.Aux != nil { return fmt.Sprintf(" {%v}", v.Aux) } - case auxSymOff, auxTypSize: + case auxSymOff, auxCallOff, auxTypSize: s := "" if v.Aux != nil { s = fmt.Sprintf(" {%v}", v.Aux) diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index 214798a1ab..c358406862 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -523,7 +523,7 @@ func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Va off = round(off, config.PtrSize) // issue call - mem = b.NewValue1A(pos, OpStaticCall, types.TypeMem, fn, mem) + mem = b.NewValue1A(pos, OpStaticCall, types.TypeMem, &AuxCall{fn}, mem) mem.AuxInt = off - config.ctxt.FixedFrameSize() return mem } @@ -582,7 +582,7 @@ func IsNewObject(v *Value, mem *Value) bool { if mem.Op != OpStaticCall { return false } - if !isSameSym(mem.Aux, "runtime.newobject") { + if !isSameCall(mem.Aux, "runtime.newobject") { return false } if v.Args[0].Op != OpOffPtr { diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go index 7861667b88..a36fbca4e0 100644 --- a/src/cmd/compile/internal/wasm/ssa.go +++ b/src/cmd/compile/internal/wasm/ssa.go @@ -122,7 +122,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { switch v.Op { case ssa.OpWasmLoweredStaticCall, ssa.OpWasmLoweredClosureCall, ssa.OpWasmLoweredInterCall: s.PrepareCall(v) - if v.Aux == gc.Deferreturn { + if call, ok := v.Aux.(*ssa.AuxCall); ok && call.Fn == gc.Deferreturn { // add a resume point before call to deferreturn so it can be called again via jmpdefer s.Prog(wasm.ARESUMEPOINT) } @@ -130,7 +130,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { getValue64(s, v.Args[1]) setReg(s, wasm.REG_CTXT) } - if sym, ok := v.Aux.(*obj.LSym); ok { + if call, ok := v.Aux.(*ssa.AuxCall); ok && call.Fn != nil { + sym := call.Fn p := s.Prog(obj.ACALL) p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: sym} p.Pos = v.Pos -- GitLab From 3c85e995efd0c2adf8578ed27565ad3b427f1a43 Mon Sep 17 00:00:00 2001 From: David Chase Date: Mon, 15 Jun 2020 18:27:02 -0400 Subject: [PATCH 0514/1792] cmd/compile: extend ssa.AuxCall to closure and interface calls Also introduce helper methods. Change-Id: I11a744ed002bae0ca9ebabba3206e1c14147e03d Reviewed-on: https://go-review.googlesource.com/c/go/+/239080 Trust: David Chase Run-TryBot: David Chase TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 18 ++++---- src/cmd/compile/internal/ssa/gen/386Ops.go | 6 +-- src/cmd/compile/internal/ssa/gen/AMD64Ops.go | 6 +-- src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 6 +-- src/cmd/compile/internal/ssa/gen/ARMOps.go | 6 +-- src/cmd/compile/internal/ssa/gen/MIPS64Ops.go | 6 +-- src/cmd/compile/internal/ssa/gen/MIPSOps.go | 6 +-- src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 6 +-- .../compile/internal/ssa/gen/RISCV64Ops.go | 6 +-- src/cmd/compile/internal/ssa/gen/S390XOps.go | 6 +-- src/cmd/compile/internal/ssa/gen/WasmOps.go | 8 ++-- .../compile/internal/ssa/gen/genericOps.go | 6 +-- .../compile/internal/ssa/loopreschedchecks.go | 2 +- src/cmd/compile/internal/ssa/op.go | 15 +++++++ src/cmd/compile/internal/ssa/opGen.go | 44 +++++++++---------- src/cmd/compile/internal/ssa/rewrite.go | 2 +- .../compile/internal/ssa/rewritegeneric.go | 2 +- src/cmd/compile/internal/ssa/writebarrier.go | 2 +- 18 files changed, 84 insertions(+), 69 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 0ee31bd9a3..542b1b51c2 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -4302,10 +4302,10 @@ func (s *state) openDeferExit() { v := s.load(r.closure.Type.Elem(), r.closure) s.maybeNilCheckClosure(v, callDefer) codeptr := s.rawLoad(types.Types[TUINTPTR], v) - call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, nil, codeptr, v, s.mem()) + call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(), codeptr, v, s.mem()) } else { // Do a static call if the original call was a static function or method - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: fn.Sym.Linksym()}, s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(fn.Sym.Linksym()), s.mem()) } call.AuxInt = stksize s.vars[&memVar] = call @@ -4437,7 +4437,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // Call runtime.deferprocStack with pointer to _defer record. arg0 := s.constOffPtrSP(types.Types[TUINTPTR], Ctxt.FixedFrameSize()) s.store(types.Types[TUINTPTR], arg0, addr) - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: deferprocStack}, s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(deferprocStack), s.mem()) if stksize < int64(Widthptr) { // We need room for both the call to deferprocStack and the call to // the deferred function. @@ -4482,9 +4482,9 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // call target switch { case k == callDefer: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: deferproc}, s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(deferproc), s.mem()) case k == callGo: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: newproc}, s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(newproc), s.mem()) case closure != nil: // rawLoad because loading the code pointer from a // closure is always safe, but IsSanitizerSafeAddr @@ -4492,11 +4492,11 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // critical that we not clobber any arguments already // stored onto the stack. codeptr = s.rawLoad(types.Types[TUINTPTR], closure) - call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, nil, codeptr, closure, s.mem()) + call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(), codeptr, closure, s.mem()) case codeptr != nil: - call = s.newValue2A(ssa.OpInterCall, types.TypeMem, nil, codeptr, s.mem()) + call = s.newValue2A(ssa.OpInterCall, types.TypeMem, ssa.InterfaceAuxCall(), codeptr, s.mem()) case sym != nil: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: sym.Linksym()}, s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(sym.Linksym()), s.mem()) default: s.Fatalf("bad call type %v %v", n.Op, n) } @@ -4929,7 +4929,7 @@ func (s *state) rtcall(fn *obj.LSym, returns bool, results []*types.Type, args . off = Rnd(off, int64(Widthreg)) // Issue call - call := s.newValue1A(ssa.OpStaticCall, types.TypeMem, &ssa.AuxCall{Fn: fn}, s.mem()) + call := s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(fn), s.mem()) s.vars[&memVar] = call if !returns { diff --git a/src/cmd/compile/internal/ssa/gen/386Ops.go b/src/cmd/compile/internal/ssa/gen/386Ops.go index 64a17cb7a3..ddabde7d3d 100644 --- a/src/cmd/compile/internal/ssa/gen/386Ops.go +++ b/src/cmd/compile/internal/ssa/gen/386Ops.go @@ -463,9 +463,9 @@ func init() { faultOnNilArg0: true, }, - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("DX"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("DX"), 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // arg0 = destination pointer // arg1 = source pointer diff --git a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go index d267fe8753..2df5016d59 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go @@ -767,9 +767,9 @@ func init() { faultOnNilArg0: true, }, - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("DX"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("DX"), 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // arg0 = destination pointer // arg1 = source pointer diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index f52d68dc33..9ff53f7e4e 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -471,9 +471,9 @@ func init() { {name: "CSEL0", argLength: 2, reg: gp1flags1, asm: "CSEL", aux: "CCop"}, // auxint(flags) ? arg0 : 0 // function calls - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R26"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R26"), 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // pseudo-ops {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true, faultOnNilArg0: true}, // panic if arg0 is nil. arg1=mem. diff --git a/src/cmd/compile/internal/ssa/gen/ARMOps.go b/src/cmd/compile/internal/ssa/gen/ARMOps.go index 1e6b4546da..70c789937a 100644 --- a/src/cmd/compile/internal/ssa/gen/ARMOps.go +++ b/src/cmd/compile/internal/ssa/gen/ARMOps.go @@ -428,9 +428,9 @@ func init() { {name: "SRAcond", argLength: 3, reg: gp2flags1, asm: "SRA"}, // arg0 >> 31 if flags indicates HS, arg0 >> arg1 otherwise, signed shift, arg2=flags // function calls - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R7"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R7"), 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // pseudo-ops {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true, faultOnNilArg0: true}, // panic if arg0 is nil. arg1=mem. diff --git a/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go b/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go index dc2e9d3ec9..e1e3933502 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go @@ -273,9 +273,9 @@ func init() { {name: "MOVDF", argLength: 1, reg: fp11, asm: "MOVDF"}, // float64 -> float32 // function calls - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R22"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R22"), 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // duffzero // arg0 = address of memory to zero diff --git a/src/cmd/compile/internal/ssa/gen/MIPSOps.go b/src/cmd/compile/internal/ssa/gen/MIPSOps.go index c66adcf93a..cd7357f62b 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPSOps.go +++ b/src/cmd/compile/internal/ssa/gen/MIPSOps.go @@ -255,9 +255,9 @@ func init() { {name: "MOVDF", argLength: 1, reg: fp11, asm: "MOVDF"}, // float64 -> float32 // function calls - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R22"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{gpsp, buildReg("R22"), 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // atomic ops diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index 0c04e561ad..37706b2dd9 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -414,9 +414,9 @@ func init() { {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true}, {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true}, - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{callptr, ctxt, 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{callptr, ctxt, 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{callptr}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // large or unaligned zeroing // arg0 = address of memory to zero (in R3, changed as side effect) diff --git a/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go b/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go index 17970918e2..b06b86075e 100644 --- a/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/RISCV64Ops.go @@ -224,9 +224,9 @@ func init() { {name: "MOVconvert", argLength: 2, reg: gp11, asm: "MOV"}, // arg0, but converted to int/ptr as appropriate; arg1=mem // Calls - {name: "CALLstatic", argLength: 1, reg: call, aux: "CallOff", call: true}, // call static function aux.(*gc.Sym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: callClosure, aux: "Int64", call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: callInter, aux: "Int64", call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: call, aux: "CallOff", call: true}, // call static function aux.(*gc.Sym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: callClosure, aux: "CallOff", call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: callInter, aux: "CallOff", call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // Generic moves and zeros diff --git a/src/cmd/compile/internal/ssa/gen/S390XOps.go b/src/cmd/compile/internal/ssa/gen/S390XOps.go index eede8a654b..417b33cf91 100644 --- a/src/cmd/compile/internal/ssa/gen/S390XOps.go +++ b/src/cmd/compile/internal/ssa/gen/S390XOps.go @@ -475,9 +475,9 @@ func init() { {name: "CLEAR", argLength: 2, reg: regInfo{inputs: []regMask{ptr, 0}}, asm: "CLEAR", aux: "SymValAndOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Write"}, - {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{ptrsp, buildReg("R12"), 0}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{ptr}, clobbers: callerSave}, aux: "Int64", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "CALLstatic", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "CALLclosure", argLength: 3, reg: regInfo{inputs: []regMask{ptrsp, buildReg("R12"), 0}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "CALLinter", argLength: 2, reg: regInfo{inputs: []regMask{ptr}, clobbers: callerSave}, aux: "CallOff", clobberFlags: true, call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem // (InvertFlags (CMP a b)) == (CMP b a) // InvertFlags is a pseudo-op which can't appear in assembly output. diff --git a/src/cmd/compile/internal/ssa/gen/WasmOps.go b/src/cmd/compile/internal/ssa/gen/WasmOps.go index 3286a68fb0..36c53bc78c 100644 --- a/src/cmd/compile/internal/ssa/gen/WasmOps.go +++ b/src/cmd/compile/internal/ssa/gen/WasmOps.go @@ -122,9 +122,9 @@ func init() { ) var WasmOps = []opData{ - {name: "LoweredStaticCall", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem - {name: "LoweredClosureCall", argLength: 3, reg: regInfo{inputs: []regMask{gp, gp, 0}, clobbers: callerSave}, aux: "Int64", call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem - {name: "LoweredInterCall", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "Int64", call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem + {name: "LoweredStaticCall", argLength: 1, reg: regInfo{clobbers: callerSave}, aux: "CallOff", call: true}, // call static function aux.(*obj.LSym). arg0=mem, auxint=argsize, returns mem + {name: "LoweredClosureCall", argLength: 3, reg: regInfo{inputs: []regMask{gp, gp, 0}, clobbers: callerSave}, aux: "CallOff", call: true}, // call function via closure. arg0=codeptr, arg1=closure, arg2=mem, auxint=argsize, returns mem + {name: "LoweredInterCall", argLength: 2, reg: regInfo{inputs: []regMask{gp}, clobbers: callerSave}, aux: "CallOff", call: true}, // call fn by pointer. arg0=codeptr, arg1=mem, auxint=argsize, returns mem {name: "LoweredAddr", argLength: 1, reg: gp11, aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // returns base+aux+auxint, arg0=base {name: "LoweredMove", argLength: 3, reg: regInfo{inputs: []regMask{gp, gp}}, aux: "Int64"}, // large move. arg0=dst, arg1=src, arg2=mem, auxint=len/8, returns mem @@ -137,7 +137,7 @@ func init() { {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 // LoweredConvert converts between pointers and integers. - // We have a special op for this so as to not confuse GC + // We have a special op for this so as to not confuse GCCallOff // (particularly stack maps). It takes a memory arg so it // gets correctly ordered with respect to GC safepoints. // arg0=ptr/int arg1=mem, output=int/ptr diff --git a/src/cmd/compile/internal/ssa/gen/genericOps.go b/src/cmd/compile/internal/ssa/gen/genericOps.go index acfe222089..145ba2d50c 100644 --- a/src/cmd/compile/internal/ssa/gen/genericOps.go +++ b/src/cmd/compile/internal/ssa/gen/genericOps.go @@ -387,9 +387,9 @@ var genericOps = []opData{ // as a phantom first argument. // TODO(josharian): ClosureCall and InterCall should have Int32 aux // to match StaticCall's 32 bit arg size limit. - {name: "ClosureCall", argLength: 3, aux: "Int64", call: true}, // arg0=code pointer, arg1=context ptr, arg2=memory. auxint=arg size. Returns memory. - {name: "StaticCall", argLength: 1, aux: "CallOff", call: true}, // call function aux.(*obj.LSym), arg0=memory. auxint=arg size. Returns memory. - {name: "InterCall", argLength: 2, aux: "Int64", call: true}, // interface call. arg0=code pointer, arg1=memory, auxint=arg size. Returns memory. + {name: "ClosureCall", argLength: 3, aux: "CallOff", call: true}, // arg0=code pointer, arg1=context ptr, arg2=memory. auxint=arg size. Returns memory. + {name: "StaticCall", argLength: 1, aux: "CallOff", call: true}, // call function aux.(*obj.LSym), arg0=memory. auxint=arg size. Returns memory. + {name: "InterCall", argLength: 2, aux: "CallOff", call: true}, // interface call. arg0=code pointer, arg1=memory, auxint=arg size. Returns memory. // Conversions: signed extensions, zero (unsigned) extensions, truncations {name: "SignExt8to16", argLength: 1, typ: "Int16"}, diff --git a/src/cmd/compile/internal/ssa/loopreschedchecks.go b/src/cmd/compile/internal/ssa/loopreschedchecks.go index 4a720fdede..ebd23b34c7 100644 --- a/src/cmd/compile/internal/ssa/loopreschedchecks.go +++ b/src/cmd/compile/internal/ssa/loopreschedchecks.go @@ -246,7 +246,7 @@ func insertLoopReschedChecks(f *Func) { // mem1 := call resched (mem0) // goto header resched := f.fe.Syslook("goschedguarded") - mem1 := sched.NewValue1A(bb.Pos, OpStaticCall, types.TypeMem, &AuxCall{resched}, mem0) + mem1 := sched.NewValue1A(bb.Pos, OpStaticCall, types.TypeMem, StaticAuxCall(resched), mem0) sched.AddEdgeTo(h) headerMemPhi.AddArg(mem1) diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go index 3aa506e3ab..c498a288a1 100644 --- a/src/cmd/compile/internal/ssa/op.go +++ b/src/cmd/compile/internal/ssa/op.go @@ -78,6 +78,21 @@ func (a *AuxCall) String() string { return fmt.Sprintf("AuxCall(%v)", a.Fn) } +// StaticAuxCall returns an AuxCall for a static call. +func StaticAuxCall(sym *obj.LSym) *AuxCall { + return &AuxCall{Fn: sym} +} + +// InterfaceAuxCall returns an AuxCall for an interface call. +func InterfaceAuxCall() *AuxCall { + return &AuxCall{} +} + +// ClosureAuxCall returns an AuxCall for a closure call. +func ClosureAuxCall() *AuxCall { + return &AuxCall{} +} + const ( auxNone auxType = iota auxBool // auxInt is 0/1 for false/true diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 797d82f2d1..d95943231a 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -5826,7 +5826,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, clobberFlags: true, call: true, @@ -5840,7 +5840,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, clobberFlags: true, call: true, @@ -13161,7 +13161,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, clobberFlags: true, call: true, @@ -13175,7 +13175,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, clobberFlags: true, call: true, @@ -16930,7 +16930,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, clobberFlags: true, call: true, @@ -16944,7 +16944,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, clobberFlags: true, call: true, @@ -20563,7 +20563,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, clobberFlags: true, call: true, @@ -20577,7 +20577,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, clobberFlags: true, call: true, @@ -22263,7 +22263,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, clobberFlags: true, call: true, @@ -22277,7 +22277,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, clobberFlags: true, call: true, @@ -23809,7 +23809,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, clobberFlags: true, call: true, @@ -23823,7 +23823,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, clobberFlags: true, call: true, @@ -26508,7 +26508,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, clobberFlags: true, call: true, @@ -26522,7 +26522,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, clobberFlags: true, call: true, @@ -27790,7 +27790,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, call: true, reg: regInfo{ @@ -27803,7 +27803,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, call: true, reg: regInfo{ @@ -31388,7 +31388,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLclosure", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, clobberFlags: true, call: true, @@ -31402,7 +31402,7 @@ var opcodeTable = [...]opInfo{ }, { name: "CALLinter", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, clobberFlags: true, call: true, @@ -32032,7 +32032,7 @@ var opcodeTable = [...]opInfo{ }, { name: "LoweredClosureCall", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, call: true, reg: regInfo{ @@ -32045,7 +32045,7 @@ var opcodeTable = [...]opInfo{ }, { name: "LoweredInterCall", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, call: true, reg: regInfo{ @@ -34763,7 +34763,7 @@ var opcodeTable = [...]opInfo{ }, { name: "ClosureCall", - auxType: auxInt64, + auxType: auxCallOff, argLen: 3, call: true, generic: true, @@ -34777,7 +34777,7 @@ var opcodeTable = [...]opInfo{ }, { name: "InterCall", - auxType: auxInt64, + auxType: auxCallOff, argLen: 2, call: true, generic: true, diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 8195d407e0..eb371ce38b 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -760,7 +760,7 @@ func devirt(v *Value, sym Sym, offset int64) *AuxCall { if lsym == nil { return nil } - return &AuxCall{Fn: lsym} + return StaticAuxCall(lsym) } // isSamePtr reports whether p1 and p2 point to the same address. diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 4b388a68cd..1ecfabf7cb 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -8483,7 +8483,7 @@ func rewriteValuegeneric_OpInterCall(v *Value) bool { // cond: devirt(v, itab, off) != nil // result: (StaticCall [int32(argsize)] {devirt(v, itab, off)} mem) for { - argsize := auxIntToInt64(v.AuxInt) + argsize := auxIntToInt32(v.AuxInt) if v_0.Op != OpLoad { break } diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index c358406862..4322a85c90 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -523,7 +523,7 @@ func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Va off = round(off, config.PtrSize) // issue call - mem = b.NewValue1A(pos, OpStaticCall, types.TypeMem, &AuxCall{fn}, mem) + mem = b.NewValue1A(pos, OpStaticCall, types.TypeMem, StaticAuxCall(fn), mem) mem.AuxInt = off - config.ctxt.FixedFrameSize() return mem } -- GitLab From acde81e0a9c17ea23a6fc545b40bfabc80133f78 Mon Sep 17 00:00:00 2001 From: David Chase Date: Fri, 19 Jun 2020 15:29:51 -0400 Subject: [PATCH 0515/1792] cmd/compile: initialize ACArgs and ACResults AuxCall fields for static and interface calls. Extend use of AuxCall Change-Id: I68b6d9bad09506532e1415fd70d44cf6c15b4b93 Reviewed-on: https://go-review.googlesource.com/c/go/+/239081 Trust: David Chase Run-TryBot: David Chase TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 53 +++++++++++++++---- .../compile/internal/ssa/gen/generic.rules | 4 +- .../compile/internal/ssa/loopreschedchecks.go | 2 +- src/cmd/compile/internal/ssa/op.go | 50 ++++++++++++++--- src/cmd/compile/internal/ssa/rewrite.go | 5 +- .../compile/internal/ssa/rewritegeneric.go | 11 ++-- src/cmd/compile/internal/ssa/writebarrier.go | 6 ++- 7 files changed, 102 insertions(+), 29 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 542b1b51c2..6c0b027c17 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -4280,16 +4280,20 @@ func (s *state) openDeferExit() { argStart := Ctxt.FixedFrameSize() fn := r.n.Left stksize := fn.Type.ArgWidth() + var ACArgs []ssa.Param + var ACResults []ssa.Param if r.rcvr != nil { // rcvr in case of OCALLINTER v := s.load(r.rcvr.Type.Elem(), r.rcvr) addr := s.constOffPtrSP(s.f.Config.Types.UintptrPtr, argStart) + ACArgs = append(ACArgs, ssa.Param{Type: types.Types[TUINTPTR], Offset: int32(argStart)}) s.store(types.Types[TUINTPTR], addr, v) } for j, argAddrVal := range r.argVals { f := getParam(r.n, j) pt := types.NewPtr(f.Type) addr := s.constOffPtrSP(pt, argStart+f.Offset) + ACArgs = append(ACArgs, ssa.Param{Type: types.Types[TUINTPTR], Offset: int32(argStart + f.Offset)}) if !canSSAType(f.Type) { s.move(f.Type, addr, argAddrVal) } else { @@ -4305,7 +4309,7 @@ func (s *state) openDeferExit() { call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(), codeptr, v, s.mem()) } else { // Do a static call if the original call was a static function or method - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(fn.Sym.Linksym()), s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(fn.Sym.Linksym(), ACArgs, ACResults), s.mem()) } call.AuxInt = stksize s.vars[&memVar] = call @@ -4340,6 +4344,17 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { var codeptr *ssa.Value // ptr to target code (if dynamic) var rcvr *ssa.Value // receiver to set fn := n.Left + var ACArgs []ssa.Param + var ACResults []ssa.Param + res := n.Left.Type.Results() + if k == callNormal { + nf := res.NumFields() + for i := 0; i < nf; i++ { + fp := res.Field(i) + ACResults = append(ACResults, ssa.Param{Type: fp.Type, Offset: int32(fp.Offset + Ctxt.FixedFrameSize())}) + } + } + switch n.Op { case OCALLFUNC: if k == callNormal && fn.Op == ONAME && fn.Class() == PFUNC { @@ -4437,10 +4452,12 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // Call runtime.deferprocStack with pointer to _defer record. arg0 := s.constOffPtrSP(types.Types[TUINTPTR], Ctxt.FixedFrameSize()) s.store(types.Types[TUINTPTR], arg0, addr) - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(deferprocStack), s.mem()) + ACArgs = append(ACArgs, ssa.Param{Type: types.Types[TUINTPTR], Offset: int32(Ctxt.FixedFrameSize())}) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(deferprocStack, ACArgs, ACResults), s.mem()) if stksize < int64(Widthptr) { // We need room for both the call to deferprocStack and the call to // the deferred function. + // TODO Revisit this if/when we pass args in registers. stksize = int64(Widthptr) } call.AuxInt = stksize @@ -4453,8 +4470,10 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // Write argsize and closure (args to newproc/deferproc). argsize := s.constInt32(types.Types[TUINT32], int32(stksize)) addr := s.constOffPtrSP(s.f.Config.Types.UInt32Ptr, argStart) + ACArgs = append(ACArgs, ssa.Param{Type: types.Types[TUINT32], Offset: int32(argStart)}) s.store(types.Types[TUINT32], addr, argsize) addr = s.constOffPtrSP(s.f.Config.Types.UintptrPtr, argStart+int64(Widthptr)) + ACArgs = append(ACArgs, ssa.Param{Type: types.Types[TUINTPTR], Offset: int32(argStart) + int32(Widthptr)}) s.store(types.Types[TUINTPTR], addr, closure) stksize += 2 * int64(Widthptr) argStart += 2 * int64(Widthptr) @@ -4463,6 +4482,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // Set receiver (for interface calls). if rcvr != nil { addr := s.constOffPtrSP(s.f.Config.Types.UintptrPtr, argStart) + ACArgs = append(ACArgs, ssa.Param{Type: types.Types[TUINTPTR], Offset: int32(argStart)}) s.store(types.Types[TUINTPTR], addr, rcvr) } @@ -4471,20 +4491,20 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { args := n.Rlist.Slice() if n.Op == OCALLMETH { f := t.Recv() - s.storeArg(args[0], f.Type, argStart+f.Offset) + ACArgs = append(ACArgs, s.storeArg(args[0], f.Type, argStart+f.Offset)) args = args[1:] } for i, n := range args { f := t.Params().Field(i) - s.storeArg(n, f.Type, argStart+f.Offset) + ACArgs = append(ACArgs, s.storeArg(n, f.Type, argStart+f.Offset)) } // call target switch { case k == callDefer: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(deferproc), s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(deferproc, ACArgs, ACResults), s.mem()) case k == callGo: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(newproc), s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(newproc, ACArgs, ACResults), s.mem()) case closure != nil: // rawLoad because loading the code pointer from a // closure is always safe, but IsSanitizerSafeAddr @@ -4494,9 +4514,9 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { codeptr = s.rawLoad(types.Types[TUINTPTR], closure) call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(), codeptr, closure, s.mem()) case codeptr != nil: - call = s.newValue2A(ssa.OpInterCall, types.TypeMem, ssa.InterfaceAuxCall(), codeptr, s.mem()) + call = s.newValue2A(ssa.OpInterCall, types.TypeMem, ssa.InterfaceAuxCall(ACArgs, ACResults), codeptr, s.mem()) case sym != nil: - call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(sym.Linksym()), s.mem()) + call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(sym.Linksym(), ACArgs, ACResults), s.mem()) default: s.Fatalf("bad call type %v %v", n.Op, n) } @@ -4522,7 +4542,6 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { s.startBlock(bNext) } - res := n.Left.Type.Results() if res.NumFields() == 0 || k != callNormal { // call has no return value. Continue with the next statement. return nil @@ -4918,18 +4937,29 @@ func (s *state) intDivide(n *Node, a, b *ssa.Value) *ssa.Value { func (s *state) rtcall(fn *obj.LSym, returns bool, results []*types.Type, args ...*ssa.Value) []*ssa.Value { // Write args to the stack off := Ctxt.FixedFrameSize() + var ACArgs []ssa.Param + var ACResults []ssa.Param for _, arg := range args { t := arg.Type off = Rnd(off, t.Alignment()) ptr := s.constOffPtrSP(t.PtrTo(), off) size := t.Size() + ACArgs = append(ACArgs, ssa.Param{Type: t, Offset: int32(off)}) s.store(t, ptr, arg) off += size } off = Rnd(off, int64(Widthreg)) + // Accumulate results types and offsets + offR := off + for _, t := range results { + offR = Rnd(offR, t.Alignment()) + ACResults = append(ACResults, ssa.Param{Type: t, Offset: int32(offR)}) + offR += t.Size() + } + // Issue call - call := s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(fn), s.mem()) + call := s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(fn, ACArgs, ACResults), s.mem()) s.vars[&memVar] = call if !returns { @@ -5064,8 +5094,9 @@ func (s *state) storeTypePtrs(t *types.Type, left, right *ssa.Value) { } } -func (s *state) storeArg(n *Node, t *types.Type, off int64) { +func (s *state) storeArg(n *Node, t *types.Type, off int64) ssa.Param { s.storeArgWithBase(n, t, s.sp, off) + return ssa.Param{Type: t, Offset: int32(off)} } func (s *state) storeArgWithBase(n *Node, t *types.Type, base *ssa.Value, off int64) { diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index df70838aa9..39f8cc8889 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -2021,8 +2021,8 @@ // Note that (ITab (IMake)) doesn't get // rewritten until after the first opt pass, // so this rule should trigger reliably. -(InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) && devirt(v, itab, off) != nil => - (StaticCall [int32(argsize)] {devirt(v, itab, off)} mem) +(InterCall [argsize] {auxCall} (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) && devirt(v, auxCall, itab, off) != nil => + (StaticCall [int32(argsize)] {devirt(v, auxCall, itab, off)} mem) // Move and Zero optimizations. // Move source and destination may overlap. diff --git a/src/cmd/compile/internal/ssa/loopreschedchecks.go b/src/cmd/compile/internal/ssa/loopreschedchecks.go index ebd23b34c7..9c73bcff26 100644 --- a/src/cmd/compile/internal/ssa/loopreschedchecks.go +++ b/src/cmd/compile/internal/ssa/loopreschedchecks.go @@ -246,7 +246,7 @@ func insertLoopReschedChecks(f *Func) { // mem1 := call resched (mem0) // goto header resched := f.fe.Syslook("goschedguarded") - mem1 := sched.NewValue1A(bb.Pos, OpStaticCall, types.TypeMem, StaticAuxCall(resched), mem0) + mem1 := sched.NewValue1A(bb.Pos, OpStaticCall, types.TypeMem, StaticAuxCall(resched, nil, nil), mem0) sched.AddEdgeTo(h) headerMemPhi.AddArg(mem1) diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go index c498a288a1..f94399028a 100644 --- a/src/cmd/compile/internal/ssa/op.go +++ b/src/cmd/compile/internal/ssa/op.go @@ -5,6 +5,7 @@ package ssa import ( + "cmd/compile/internal/types" "cmd/internal/obj" "fmt" ) @@ -67,25 +68,60 @@ type regInfo struct { type auxType int8 +type Param struct { + Type *types.Type + Offset int32 // TODO someday this will be a register +} + type AuxCall struct { - Fn *obj.LSym + Fn *obj.LSym + args []Param // Includes receiver for method calls. Does NOT include hidden closure pointer. + results []Param } func (a *AuxCall) String() string { + var fn string if a.Fn == nil { - return "AuxCall(nil)" + fn = "AuxCall{nil" // could be interface/closure etc. + } else { + fn = fmt.Sprintf("AuxCall{%v", a.Fn) + } + + if len(a.args) == 0 { + fn += "()" + } else { + s := "(" + for _, arg := range a.args { + fn += fmt.Sprintf("%s[%v,%v]", s, arg.Type, arg.Offset) + s = "," + } + fn += ")" } - return fmt.Sprintf("AuxCall(%v)", a.Fn) + + if len(a.results) > 0 { // usual is zero or one; only some RT calls have more than one. + if len(a.results) == 1 { + fn += fmt.Sprintf("[%v,%v]", a.results[0].Type, a.results[0].Offset) + } else { + s := "(" + for _, result := range a.results { + fn += fmt.Sprintf("%s[%v,%v]", s, result.Type, result.Offset) + s = "," + } + fn += ")" + } + } + + return fn + "}" } // StaticAuxCall returns an AuxCall for a static call. -func StaticAuxCall(sym *obj.LSym) *AuxCall { - return &AuxCall{Fn: sym} +func StaticAuxCall(sym *obj.LSym, args []Param, results []Param) *AuxCall { + return &AuxCall{Fn: sym, args: args, results: results} } // InterfaceAuxCall returns an AuxCall for an interface call. -func InterfaceAuxCall() *AuxCall { - return &AuxCall{} +func InterfaceAuxCall(args []Param, results []Param) *AuxCall { + return &AuxCall{Fn: nil, args: args, results: results} } // ClosureAuxCall returns an AuxCall for a closure call. diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index eb371ce38b..2ab310ad85 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -743,7 +743,7 @@ func uaddOvf(a, b int64) bool { // de-virtualize an InterCall // 'sym' is the symbol for the itab -func devirt(v *Value, sym Sym, offset int64) *AuxCall { +func devirt(v *Value, aux interface{}, sym Sym, offset int64) *AuxCall { f := v.Block.Func n, ok := sym.(*obj.LSym) if !ok { @@ -760,7 +760,8 @@ func devirt(v *Value, sym Sym, offset int64) *AuxCall { if lsym == nil { return nil } - return StaticAuxCall(lsym) + va := aux.(*AuxCall) + return StaticAuxCall(lsym, va.args, va.results) } // isSamePtr reports whether p1 and p2 point to the same address. diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 1ecfabf7cb..925ff53fd1 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -8479,11 +8479,12 @@ func rewriteValuegeneric_OpIMake(v *Value) bool { func rewriteValuegeneric_OpInterCall(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] - // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) - // cond: devirt(v, itab, off) != nil - // result: (StaticCall [int32(argsize)] {devirt(v, itab, off)} mem) + // match: (InterCall [argsize] {auxCall} (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) + // cond: devirt(v, auxCall, itab, off) != nil + // result: (StaticCall [int32(argsize)] {devirt(v, auxCall, itab, off)} mem) for { argsize := auxIntToInt32(v.AuxInt) + auxCall := auxToCall(v.Aux) if v_0.Op != OpLoad { break } @@ -8510,12 +8511,12 @@ func rewriteValuegeneric_OpInterCall(v *Value) bool { break } mem := v_1 - if !(devirt(v, itab, off) != nil) { + if !(devirt(v, auxCall, itab, off) != nil) { break } v.reset(OpStaticCall) v.AuxInt = int32ToAuxInt(int32(argsize)) - v.Aux = callToAux(devirt(v, itab, off)) + v.Aux = callToAux(devirt(v, auxCall, itab, off)) v.AddArg(mem) return true } diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index 4322a85c90..7cc8bf7af9 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -501,29 +501,33 @@ func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Va // put arguments on stack off := config.ctxt.FixedFrameSize() + var ACArgs []Param if typ != nil { // for typedmemmove taddr := b.NewValue1A(pos, OpAddr, b.Func.Config.Types.Uintptr, typ, sb) off = round(off, taddr.Type.Alignment()) arg := b.NewValue1I(pos, OpOffPtr, taddr.Type.PtrTo(), off, sp) mem = b.NewValue3A(pos, OpStore, types.TypeMem, ptr.Type, arg, taddr, mem) + ACArgs = append(ACArgs, Param{Type: b.Func.Config.Types.Uintptr, Offset: int32(off)}) off += taddr.Type.Size() } off = round(off, ptr.Type.Alignment()) arg := b.NewValue1I(pos, OpOffPtr, ptr.Type.PtrTo(), off, sp) mem = b.NewValue3A(pos, OpStore, types.TypeMem, ptr.Type, arg, ptr, mem) + ACArgs = append(ACArgs, Param{Type: ptr.Type, Offset: int32(off)}) off += ptr.Type.Size() if val != nil { off = round(off, val.Type.Alignment()) arg = b.NewValue1I(pos, OpOffPtr, val.Type.PtrTo(), off, sp) mem = b.NewValue3A(pos, OpStore, types.TypeMem, val.Type, arg, val, mem) + ACArgs = append(ACArgs, Param{Type: val.Type, Offset: int32(off)}) off += val.Type.Size() } off = round(off, config.PtrSize) // issue call - mem = b.NewValue1A(pos, OpStaticCall, types.TypeMem, StaticAuxCall(fn), mem) + mem = b.NewValue1A(pos, OpStaticCall, types.TypeMem, StaticAuxCall(fn, ACArgs, nil), mem) mem.AuxInt = off - config.ctxt.FixedFrameSize() return mem } -- GitLab From 39da81da5e35e50da74ebb8c4fe12fd363bf41b9 Mon Sep 17 00:00:00 2001 From: David Chase Date: Wed, 24 Jun 2020 17:00:48 -0400 Subject: [PATCH 0516/1792] cmd/compile: populate AuxCall fields for OpClosureCall Change-Id: Ib5f62826d5249c1727b57d9f8ff2f3a1d6dc5032 Reviewed-on: https://go-review.googlesource.com/c/go/+/240185 Trust: David Chase Run-TryBot: David Chase TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 4 ++-- src/cmd/compile/internal/ssa/op.go | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 6c0b027c17..75fdbbae04 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -4306,7 +4306,7 @@ func (s *state) openDeferExit() { v := s.load(r.closure.Type.Elem(), r.closure) s.maybeNilCheckClosure(v, callDefer) codeptr := s.rawLoad(types.Types[TUINTPTR], v) - call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(), codeptr, v, s.mem()) + call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(ACArgs, ACResults), codeptr, v, s.mem()) } else { // Do a static call if the original call was a static function or method call = s.newValue1A(ssa.OpStaticCall, types.TypeMem, ssa.StaticAuxCall(fn.Sym.Linksym(), ACArgs, ACResults), s.mem()) @@ -4512,7 +4512,7 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { // critical that we not clobber any arguments already // stored onto the stack. codeptr = s.rawLoad(types.Types[TUINTPTR], closure) - call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(), codeptr, closure, s.mem()) + call = s.newValue3A(ssa.OpClosureCall, types.TypeMem, ssa.ClosureAuxCall(ACArgs, ACResults), codeptr, closure, s.mem()) case codeptr != nil: call = s.newValue2A(ssa.OpInterCall, types.TypeMem, ssa.InterfaceAuxCall(ACArgs, ACResults), codeptr, s.mem()) case sym != nil: diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go index f94399028a..02ecdef5e6 100644 --- a/src/cmd/compile/internal/ssa/op.go +++ b/src/cmd/compile/internal/ssa/op.go @@ -79,6 +79,10 @@ type AuxCall struct { results []Param } +// String returns +// "AuxCall{()}" if len(results) == 0; +// "AuxCall{()}" if len(results) == 1; +// "AuxCall{()()}" otherwise. func (a *AuxCall) String() string { var fn string if a.Fn == nil { @@ -125,8 +129,8 @@ func InterfaceAuxCall(args []Param, results []Param) *AuxCall { } // ClosureAuxCall returns an AuxCall for a closure call. -func ClosureAuxCall() *AuxCall { - return &AuxCall{} +func ClosureAuxCall(args []Param, results []Param) *AuxCall { + return &AuxCall{Fn: nil, args: args, results: results} } const ( -- GitLab From 396688af7ee121d478e9b8d2cc9d06999ba7fc6e Mon Sep 17 00:00:00 2001 From: David Chase Date: Fri, 26 Jun 2020 18:19:01 -0400 Subject: [PATCH 0517/1792] cmd/compile: make translation to calls for SSA look more "value-oriented" The existing translation assumes an in-memory return values, thus it returns the address of the result(s). Most consumers immediately load from the address to get the value, and in late call expansion that is the favored idiom, and it is also the favored idiom when arguments and results use registers instead of memory. Change-Id: Ie0ccc70f399682a42509d847b330ef3956462d56 Reviewed-on: https://go-review.googlesource.com/c/go/+/240186 Trust: David Chase Run-TryBot: David Chase TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 44 ++++++++++++++++-------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 75fdbbae04..c59945f206 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -1076,7 +1076,7 @@ func (s *state) stmt(n *Node) { fallthrough case OCALLMETH, OCALLINTER: - s.call(n, callNormal) + s.callAddr(n, callNormal) if n.Op == OCALLFUNC && n.Left.Op == ONAME && n.Left.Class() == PFUNC { if fn := n.Left.Sym.Name; compiling_runtime && fn == "throw" || n.Left.Sym.Pkg == Runtimepkg && (fn == "throwinit" || fn == "gopanic" || fn == "panicwrap" || fn == "block" || fn == "panicmakeslicelen" || fn == "panicmakeslicecap") { @@ -1108,10 +1108,10 @@ func (s *state) stmt(n *Node) { if n.Esc == EscNever { d = callDeferStack } - s.call(n.Left, d) + s.callAddr(n.Left, d) } case OGO: - s.call(n.Left, callGo) + s.callAddr(n.Left, callGo) case OAS2DOTTYPE: res, resok := s.dottype(n.Right, true) @@ -2715,8 +2715,7 @@ func (s *state) expr(n *Node) *ssa.Value { fallthrough case OCALLINTER, OCALLMETH: - a := s.call(n, callNormal) - return s.load(n.Type, a) + return s.callResult(n, callNormal) case OGETG: return s.newValue1(ssa.OpGetG, n.Type, s.mem()) @@ -3589,8 +3588,7 @@ func init() { addF("math", "FMA", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { if !s.config.UseFMA { - a := s.call(n, callNormal) - s.vars[n] = s.load(types.Types[TFLOAT64], a) + s.vars[n] = s.callResult(n, callNormal) // types.Types[TFLOAT64] return s.variable(n, types.Types[TFLOAT64]) } v := s.entryNewValue0A(ssa.OpHasCPUFeature, types.Types[TBOOL], x86HasFMA) @@ -3611,8 +3609,7 @@ func init() { // Call the pure Go version. s.startBlock(bFalse) - a := s.call(n, callNormal) - s.vars[n] = s.load(types.Types[TFLOAT64], a) + s.vars[n] = s.callResult(n, callNormal) // types.Types[TFLOAT64] s.endBlock().AddEdgeTo(bEnd) // Merge results. @@ -3623,8 +3620,7 @@ func init() { addF("math", "FMA", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { if !s.config.UseFMA { - a := s.call(n, callNormal) - s.vars[n] = s.load(types.Types[TFLOAT64], a) + s.vars[n] = s.callResult(n, callNormal) // types.Types[TFLOAT64] return s.variable(n, types.Types[TFLOAT64]) } addr := s.entryNewValue1A(ssa.OpAddr, types.Types[TBOOL].PtrTo(), armHasVFPv4, s.sb) @@ -3646,8 +3642,7 @@ func init() { // Call the pure Go version. s.startBlock(bFalse) - a := s.call(n, callNormal) - s.vars[n] = s.load(types.Types[TFLOAT64], a) + s.vars[n] = s.callResult(n, callNormal) // types.Types[TFLOAT64] s.endBlock().AddEdgeTo(bEnd) // Merge results. @@ -3676,8 +3671,7 @@ func init() { // Call the pure Go version. s.startBlock(bFalse) - a := s.call(n, callNormal) - s.vars[n] = s.load(types.Types[TFLOAT64], a) + s.vars[n] = s.callResult(n, callNormal) // types.Types[TFLOAT64] s.endBlock().AddEdgeTo(bEnd) // Merge results. @@ -3887,8 +3881,7 @@ func init() { // Call the pure Go version. s.startBlock(bFalse) - a := s.call(n, callNormal) - s.vars[n] = s.load(types.Types[TINT], a) + s.vars[n] = s.callResult(n, callNormal) // types.Types[TINT] s.endBlock().AddEdgeTo(bEnd) // Merge results. @@ -4336,9 +4329,17 @@ func (s *state) openDeferExit() { } } +func (s *state) callResult(n *Node, k callKind) *ssa.Value { + return s.call(n, k, false) +} + +func (s *state) callAddr(n *Node, k callKind) *ssa.Value { + return s.call(n, k, true) +} + // Calls the function n using the specified call type. // Returns the address of the return value (or nil if none). -func (s *state) call(n *Node, k callKind) *ssa.Value { +func (s *state) call(n *Node, k callKind, returnResultAddr bool) *ssa.Value { var sym *types.Sym // target symbol (if static) var closure *ssa.Value // ptr to closure to run (if dynamic) var codeptr *ssa.Value // ptr to target code (if dynamic) @@ -4547,7 +4548,10 @@ func (s *state) call(n *Node, k callKind) *ssa.Value { return nil } fp := res.Field(0) - return s.constOffPtrSP(types.NewPtr(fp.Type), fp.Offset+Ctxt.FixedFrameSize()) + if returnResultAddr { + return s.constOffPtrSP(types.NewPtr(fp.Type), fp.Offset+Ctxt.FixedFrameSize()) + } + return s.load(n.Type, s.constOffPtrSP(types.NewPtr(fp.Type), fp.Offset+Ctxt.FixedFrameSize())) } // maybeNilCheckClosure checks if a nil check of a closure is needed in some @@ -4676,7 +4680,7 @@ func (s *state) addr(n *Node) *ssa.Value { addr := s.addr(n.Left) return s.newValue1(ssa.OpCopy, t, addr) // ensure that addr has the right type case OCALLFUNC, OCALLINTER, OCALLMETH: - return s.call(n, callNormal) + return s.callAddr(n, callNormal) case ODOTTYPE: v, _ := s.dottype(n, false) if v.Op != ssa.OpLoad { -- GitLab From f5d59d0e382dc59195537a128fe9423a49a4cea8 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 16 Sep 2020 15:41:47 -0700 Subject: [PATCH 0518/1792] cmd/compile: skip looking for OCLOSURE nodes in xtop xtop holds package's top-level declaration statements, but OCLOSURE only appears in expression contexts. xtop will instead hold the synthetic ODCLFUNC representing OCLOSURE's function body. This CL makes the loop consistent with the later phases that only look for ODCLFUNC nodes in xtop. Passes toolstash-check. Change-Id: I852a10ef1bf75bb3351e3da0357ca8b2e26aec6e Reviewed-on: https://go-review.googlesource.com/c/go/+/255340 Trust: Matthew Dempsky Run-TryBot: Matthew Dempsky Reviewed-by: Cuong Manh Le TryBot-Result: Go Bot --- src/cmd/compile/internal/gc/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 8783cb4e46..7ad3bfe0c8 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -617,7 +617,7 @@ func Main(archInit func(*Arch)) { var fcount int64 for i := 0; i < len(xtop); i++ { n := xtop[i] - if op := n.Op; op == ODCLFUNC || op == OCLOSURE { + if n.Op == ODCLFUNC { Curfn = n decldepth = 1 saveerrors() -- GitLab From 7f24142b7b289df7e98ed3e1ccd673824dd1d0ee Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 16 Sep 2020 22:15:13 +0200 Subject: [PATCH 0519/1792] syscall, cmd/go/internal/lockedfile/internal/filelock: add and use Flock on illumos Copy the syscall wrapper from golang.org/x/sys/unix CL 255377 to provide Flock on illumos and switch cmd/go/internal/lockedfile/internal/filelock to use it. Fixes #35618 Change-Id: I876a2b782329a988fa85361fb1ea58eb6f329af1 Reviewed-on: https://go-review.googlesource.com/c/go/+/255258 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- .../internal/filelock/filelock_fcntl.go | 2 +- .../internal/filelock/filelock_test.go | 2 +- .../internal/filelock/filelock_unix.go | 2 +- src/syscall/syscall_illumos.go | 25 +++++++++++++++++++ src/syscall/types_illumos_amd64.go | 17 +++++++++++++ 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 src/syscall/syscall_illumos.go create mode 100644 src/syscall/types_illumos_amd64.go 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 c60a78ed92..dc7bbe263f 100644 --- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_fcntl.go +++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_fcntl.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. -// +build aix solaris +// +build aix solaris,!illumos // This code implements the filelock API using POSIX 'fcntl' locks, which attach // to an (inode, process) pair rather than a file descriptor. To avoid unlocking 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 faf73446f7..8301fb6b6e 100644 --- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go +++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_test.go @@ -161,7 +161,7 @@ func TestRLockExcludesOnlyLock(t *testing.T) { doUnlockTF := false switch runtime.GOOS { - case "aix", "illumos", "solaris": + case "aix", "solaris": // When using POSIX locks (as on Solaris), we can't safely read-lock the // same inode through two different descriptors at the same time: when the // first descriptor is closed, the second descriptor would still be open but 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 00c4262832..78f2c51129 100644 --- a/src/cmd/go/internal/lockedfile/internal/filelock/filelock_unix.go +++ b/src/cmd/go/internal/lockedfile/internal/filelock/filelock_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. -// +build darwin dragonfly freebsd linux netbsd openbsd +// +build darwin dragonfly freebsd illumos linux netbsd openbsd package filelock diff --git a/src/syscall/syscall_illumos.go b/src/syscall/syscall_illumos.go new file mode 100644 index 0000000000..1484337e1b --- /dev/null +++ b/src/syscall/syscall_illumos.go @@ -0,0 +1,25 @@ +// 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 illumos + +// Illumos system calls not present on Solaris. + +package syscall + +import "unsafe" + +//go:cgo_import_dynamic libc_flock flock "libc.so" + +//go:linkname procFlock libc_flock + +var procFlock libcFunc + +func Flock(fd int, how int) error { + _, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) + if errno != 0 { + return errno + } + return nil +} diff --git a/src/syscall/types_illumos_amd64.go b/src/syscall/types_illumos_amd64.go new file mode 100644 index 0000000000..abb282f3e4 --- /dev/null +++ b/src/syscall/types_illumos_amd64.go @@ -0,0 +1,17 @@ +// 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 illumos + +// Illumos consts not present on Solaris. These are added manually rather than +// auto-generated by mkerror.sh + +package syscall + +const ( + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 +) -- GitLab From 0dde60a5fefcb1447c97efa5c7bb4dbcf3575736 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Wed, 19 Aug 2020 03:07:26 +1000 Subject: [PATCH 0520/1792] cmd/internal/obj/riscv: clean up lowerJALR This cleans up the last of the direct obj.Prog rewriting, removing lowerJALR and replacing it with correct handling for AJALR during instruction encoding. Change-Id: Ieea125bde30d4c0edd2d9ed1e50160543aa8f330 Reviewed-on: https://go-review.googlesource.com/c/go/+/249077 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Trust: Joel Sing --- src/cmd/internal/obj/riscv/obj.go | 43 +++++++------------------------ 1 file changed, 9 insertions(+), 34 deletions(-) diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go index 77d383b290..841b30d85c 100644 --- a/src/cmd/internal/obj/riscv/obj.go +++ b/src/cmd/internal/obj/riscv/obj.go @@ -58,30 +58,14 @@ func jalrToSym(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc, lr int16) *ob p.As = AJALR p.From.Type = obj.TYPE_REG p.From.Reg = lr - p.From.Sym = to.Sym p.Reg = 0 p.To.Type = obj.TYPE_REG p.To.Reg = REG_TMP - lowerJALR(p) + p.To.Sym = to.Sym return p } -// lowerJALR normalizes a JALR instruction. -func lowerJALR(p *obj.Prog) { - if p.As != AJALR { - panic("lowerJALR: not a JALR") - } - - // JALR gets parsed like JAL - the linkage pointer goes in From, - // and the target is in To. However, we need to assemble it as an - // I-type instruction, so place the linkage pointer in To, the - // target register in Reg, and the offset in From. - p.Reg = p.To.Reg - p.From, p.To = p.To, p.From - p.From.Type, p.From.Reg = obj.TYPE_CONST, obj.REG_NONE -} - // progedit is called individually for each *obj.Prog. It normalizes instruction // formats and eliminates as many pseudo-instructions as possible. func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { @@ -125,7 +109,6 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { switch p.As { case obj.AJMP: // Turn JMP into JAL ZERO or JALR ZERO. - // p.From is actually an _output_ for this instruction. p.From.Type = obj.TYPE_REG p.From.Reg = REG_ZERO @@ -136,7 +119,6 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { switch p.To.Name { case obj.NAME_NONE: p.As = AJALR - lowerJALR(p) case obj.NAME_EXTERN: // Handled in preprocess. default: @@ -154,14 +136,10 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { p.As = AJALR p.From.Type = obj.TYPE_REG p.From.Reg = REG_LR - lowerJALR(p) default: ctxt.Diag("unknown destination type %+v in CALL: %v", p.To.Type, p) } - case AJALR: - lowerJALR(p) - case obj.AUNDEF: p.As = AEBREAK @@ -454,7 +432,7 @@ func containsCall(sym *obj.LSym) bool { case obj.ACALL: return true case AJAL, AJALR: - if p.To.Type == obj.TYPE_REG && p.To.Reg == REG_LR { + if p.From.Type == obj.TYPE_REG && p.From.Reg == REG_LR { return true } } @@ -731,11 +709,9 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { p = jalrToSym(ctxt, p, newprog, REG_ZERO) } else { p.As = AJALR - p.From.Type = obj.TYPE_CONST - p.From.Offset = 0 - p.Reg = REG_LR - p.To.Type = obj.TYPE_REG - p.To.Reg = REG_ZERO + p.From = obj.Addr{Type: obj.TYPE_REG, Reg: REG_ZERO} + p.Reg = 0 + p.To = obj.Addr{Type: obj.TYPE_REG, Reg: REG_LR} } // "Add back" the stack removed in the previous instruction. @@ -917,9 +893,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { // it is reserved by SSA. jmp := obj.Appendp(p, newprog) jmp.As = AJALR - jmp.From = obj.Addr{Type: obj.TYPE_CONST, Offset: 0} - jmp.To = p.From - jmp.Reg = REG_TMP + jmp.From = p.From + jmp.To = obj.Addr{Type: obj.TYPE_REG, Reg: REG_TMP} // p.From is not generally valid, however will be // fixed up in the next loop. @@ -1801,8 +1776,8 @@ func instructionsForProg(p *obj.Prog) []*instruction { inss := []*instruction{ins} switch ins.as { - case AJAL: - ins.rd, ins.rs2 = uint32(p.From.Reg), obj.REG_NONE + case AJAL, AJALR: + ins.rd, ins.rs1, ins.rs2 = uint32(p.From.Reg), uint32(p.To.Reg), obj.REG_NONE ins.imm = p.To.Offset case ABEQ, ABEQZ, ABGE, ABGEU, ABGEZ, ABGT, ABGTU, ABGTZ, ABLE, ABLEU, ABLEZ, ABLT, ABLTU, ABLTZ, ABNE, ABNEZ: -- GitLab From 967465da2975fe4322080703ce5a77ea90752829 Mon Sep 17 00:00:00 2001 From: Lynn Boger Date: Mon, 31 Aug 2020 09:43:40 -0400 Subject: [PATCH 0521/1792] cmd/compile: use combined shifts to improve array addressing on ppc64x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change adds rules to find pairs of instructions that can be combined into a single shifts. These instruction sequences are common in array addressing within loops. Improvements can be seen in many crypto packages and the hash packages. These are based on the extended mnemonics found in the ISA sections C.8.1 and C.8.2. Some rules in PPC64.rules were moved because the ordering prevented some matching. The following results were generated on power9. hash/crc32: CRC32/poly=Koopman/size=40/align=0 195ns ± 0% 163ns ± 0% -16.41% CRC32/poly=Koopman/size=40/align=1 200ns ± 0% 163ns ± 0% -18.50% CRC32/poly=Koopman/size=512/align=0 1.98µs ± 0% 1.67µs ± 0% -15.46% CRC32/poly=Koopman/size=512/align=1 1.98µs ± 0% 1.69µs ± 0% -14.80% CRC32/poly=Koopman/size=1kB/align=0 3.90µs ± 0% 3.31µs ± 0% -15.27% CRC32/poly=Koopman/size=1kB/align=1 3.85µs ± 0% 3.31µs ± 0% -14.15% CRC32/poly=Koopman/size=4kB/align=0 15.3µs ± 0% 13.1µs ± 0% -14.22% CRC32/poly=Koopman/size=4kB/align=1 15.4µs ± 0% 13.1µs ± 0% -14.79% CRC32/poly=Koopman/size=32kB/align=0 137µs ± 0% 105µs ± 0% -23.56% CRC32/poly=Koopman/size=32kB/align=1 137µs ± 0% 105µs ± 0% -23.53% crypto/rc4: RC4_128 733ns ± 0% 650ns ± 0% -11.32% (p=1.000 n=1+1) RC4_1K 5.80µs ± 0% 5.17µs ± 0% -10.89% (p=1.000 n=1+1) RC4_8K 45.7µs ± 0% 40.8µs ± 0% -10.73% (p=1.000 n=1+1) crypto/sha1: Hash8Bytes 635ns ± 0% 613ns ± 0% -3.46% (p=1.000 n=1+1) Hash320Bytes 2.30µs ± 0% 2.18µs ± 0% -5.38% (p=1.000 n=1+1) Hash1K 5.88µs ± 0% 5.38µs ± 0% -8.62% (p=1.000 n=1+1) Hash8K 42.0µs ± 0% 37.9µs ± 0% -9.75% (p=1.000 n=1+1) There are other improvements found in golang.org/x/crypto which are all in the range of 5-15%. Change-Id: I193471fbcf674151ffe2edab212799d9b08dfb8c Reviewed-on: https://go-review.googlesource.com/c/go/+/252097 Trust: Lynn Boger Run-TryBot: Lynn Boger TryBot-Result: Go Bot Reviewed-by: Carlos Eduardo Seo --- src/cmd/asm/internal/asm/testdata/ppc64enc.s | 4 + src/cmd/compile/internal/ppc64/ssa.go | 36 + src/cmd/compile/internal/ssa/gen/PPC64.rules | 63 +- src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 5 + src/cmd/compile/internal/ssa/opGen.go | 45 ++ src/cmd/compile/internal/ssa/rewrite.go | 38 + src/cmd/compile/internal/ssa/rewritePPC64.go | 787 +++++++++++++++++++ src/cmd/internal/obj/ppc64/a.out.go | 4 + src/cmd/internal/obj/ppc64/anames.go | 4 + src/cmd/internal/obj/ppc64/asm9.go | 74 +- test/codegen/shift.go | 55 ++ 11 files changed, 1087 insertions(+), 28 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/ppc64enc.s b/src/cmd/asm/internal/asm/testdata/ppc64enc.s index 10a05ec402..e26f6f8933 100644 --- a/src/cmd/asm/internal/asm/testdata/ppc64enc.s +++ b/src/cmd/asm/internal/asm/testdata/ppc64enc.s @@ -284,6 +284,10 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$0 RLDICLCC $0, R4, $15, R6 // 788603c1 RLDICR $0, R4, $15, R6 // 788603c4 RLDICRCC $0, R4, $15, R6 // 788603c5 + RLDIC $0, R4, $15, R6 // 788603c8 + RLDICCC $0, R4, $15, R6 // 788603c9 + CLRLSLWI $16, R5, $8, R4 // 54a4861e + CLRLSLDI $2, R4, $24, R3 // 78831588 BEQ 0(PC) // 41820000 BGE 0(PC) // 40800000 diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go index f8d9ac2379..4a83a0bdd7 100644 --- a/src/cmd/compile/internal/ppc64/ssa.go +++ b/src/cmd/compile/internal/ppc64/ssa.go @@ -565,6 +565,42 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p = s.Prog(obj.ANOP) gc.Patch(pbover, p) + case ssa.OpPPC64CLRLSLWI: + r := v.Reg() + r1 := v.Args[0].Reg() + shifts := v.AuxInt + p := s.Prog(v.Op.Asm()) + // clrlslwi ra,rs,sh,mb will become rlwinm ra,rs,sh,mb-sh,31-n as described in ISA + p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftsh(shifts)} + p.SetFrom3(obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftmb(shifts)}) + p.Reg = r1 + p.To.Type = obj.TYPE_REG + p.To.Reg = r + + case ssa.OpPPC64CLRLSLDI: + r := v.Reg() + r1 := v.Args[0].Reg() + shifts := v.AuxInt + p := s.Prog(v.Op.Asm()) + // clrlsldi ra,rs,sh,mb will become rldic ra,rs,sh,mb-sh + p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftsh(shifts)} + p.SetFrom3(obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftmb(shifts)}) + p.Reg = r1 + p.To.Type = obj.TYPE_REG + p.To.Reg = r + + // Mask has been set as sh + case ssa.OpPPC64RLDICL: + r := v.Reg() + r1 := v.Args[0].Reg() + shifts := v.AuxInt + p := s.Prog(v.Op.Asm()) + p.From = obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftsh(shifts)} + p.SetFrom3(obj.Addr{Type: obj.TYPE_CONST, Offset: ssa.GetPPC64Shiftmb(shifts)}) + p.Reg = r1 + p.To.Type = obj.TYPE_REG + p.To.Reg = r + case ssa.OpPPC64ADD, ssa.OpPPC64FADD, ssa.OpPPC64FADDS, ssa.OpPPC64SUB, ssa.OpPPC64FSUB, ssa.OpPPC64FSUBS, ssa.OpPPC64MULLD, ssa.OpPPC64MULLW, ssa.OpPPC64DIVDU, ssa.OpPPC64DIVWU, ssa.OpPPC64SRAD, ssa.OpPPC64SRAW, ssa.OpPPC64SRD, ssa.OpPPC64SRW, ssa.OpPPC64SLD, ssa.OpPPC64SLW, diff --git a/src/cmd/compile/internal/ssa/gen/PPC64.rules b/src/cmd/compile/internal/ssa/gen/PPC64.rules index e5fb1e98c2..774d5096de 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/gen/PPC64.rules @@ -79,6 +79,23 @@ (Abs ...) => (FABS ...) (FMA ...) => (FMADD ...) +// Lowering extension +// Note: we always extend to 64 bits even though some ops don't need that many result bits. +(SignExt8to(16|32|64) ...) => (MOVBreg ...) +(SignExt16to(32|64) ...) => (MOVHreg ...) +(SignExt32to64 ...) => (MOVWreg ...) + +(ZeroExt8to(16|32|64) ...) => (MOVBZreg ...) +(ZeroExt16to(32|64) ...) => (MOVHZreg ...) +(ZeroExt32to64 ...) => (MOVWZreg ...) + +(Trunc(16|32|64)to8 x) && isSigned(t) => (MOVBreg x) +(Trunc(16|32|64)to8 x) => (MOVBZreg x) +(Trunc(32|64)to16 x) && isSigned(t) => (MOVHreg x) +(Trunc(32|64)to16 x) => (MOVHZreg x) +(Trunc64to32 x) && isSigned(t) => (MOVWreg x) +(Trunc64to32 x) => (MOVWZreg x) + // Lowering constants (Const(64|32|16|8) [val]) => (MOVDconst [int64(val)]) (Const(32|64)F ...) => (FMOV(S|D)const ...) @@ -780,6 +797,21 @@ (MOVWreg y:(MOVWZreg x)) => (MOVWreg x) (MOVWZreg y:(MOVWreg x)) => (MOVWZreg x) +// Truncate then logical then truncate: omit first, lesser or equal truncate +(MOVWZreg ((OR|XOR|AND) x (MOVWZreg y))) => (MOVWZreg ((OR|XOR|AND) x y)) +(MOVHZreg ((OR|XOR|AND) x (MOVWZreg y))) => (MOVHZreg ((OR|XOR|AND) x y)) +(MOVHZreg ((OR|XOR|AND) x (MOVHZreg y))) => (MOVHZreg ((OR|XOR|AND) x y)) +(MOVBZreg ((OR|XOR|AND) x (MOVWZreg y))) => (MOVBZreg ((OR|XOR|AND) x y)) +(MOVBZreg ((OR|XOR|AND) x (MOVHZreg y))) => (MOVBZreg ((OR|XOR|AND) x y)) +(MOVBZreg ((OR|XOR|AND) x (MOVBZreg y))) => (MOVBZreg ((OR|XOR|AND) x y)) + +(MOV(B|H|W)Zreg z:(ANDconst [c] (MOVBZload ptr x))) => z +(MOVBZreg z:(AND y (MOVBZload ptr x))) => z +(MOV(H|W)Zreg z:(ANDconst [c] (MOVHZload ptr x))) => z +(MOVHZreg z:(AND y (MOVHZload ptr x))) => z +(MOVWZreg z:(ANDconst [c] (MOVWZload ptr x))) => z +(MOVWZreg z:(AND y (MOVWZload ptr x))) => z + // Arithmetic constant ops (ADD x (MOVDconst [c])) && is32Bit(c) => (ADDconst [c] x) @@ -949,23 +981,6 @@ (AtomicAnd8 ...) => (LoweredAtomicAnd8 ...) (AtomicOr8 ...) => (LoweredAtomicOr8 ...) -// Lowering extension -// Note: we always extend to 64 bits even though some ops don't need that many result bits. -(SignExt8to(16|32|64) ...) => (MOVBreg ...) -(SignExt16to(32|64) ...) => (MOVHreg ...) -(SignExt32to64 ...) => (MOVWreg ...) - -(ZeroExt8to(16|32|64) ...) => (MOVBZreg ...) -(ZeroExt16to(32|64) ...) => (MOVHZreg ...) -(ZeroExt32to64 ...) => (MOVWZreg ...) - -(Trunc(16|32|64)to8 x) && isSigned(t) => (MOVBreg x) -(Trunc(16|32|64)to8 x) => (MOVBZreg x) -(Trunc(32|64)to16 x) && isSigned(t) => (MOVHreg x) -(Trunc(32|64)to16 x) => (MOVHZreg x) -(Trunc64to32 x) && isSigned(t) => (MOVWreg x) -(Trunc64to32 x) => (MOVWZreg x) - (Slicemask x) => (SRADconst (NEG x) [63]) // Note that MOV??reg returns a 64-bit int, x is not necessarily that wide @@ -996,6 +1011,20 @@ (MOVWreg (MOVDconst [c])) => (MOVDconst [int64(int32(c))]) (MOVWZreg (MOVDconst [c])) => (MOVDconst [int64(uint32(c))]) +// Implement clrsldi and clrslwi extended mnemonics as described in +// ISA 3.0 section C.8. AuxInt field contains values needed for +// the instructions, packed together since there is only one available. +(SLDconst [c] z:(MOVBZreg x)) && c < 8 && z.Uses == 1 => (CLRLSLDI [newPPC64ShiftAuxInt(c,56,63,64)] x) +(SLDconst [c] z:(MOVHZreg x)) && c < 16 && z.Uses == 1 => (CLRLSLDI [newPPC64ShiftAuxInt(c,48,63,64)] x) +(SLDconst [c] z:(MOVWZreg x)) && c < 32 && z.Uses == 1 => (CLRLSLDI [newPPC64ShiftAuxInt(c,32,63,64)] x) + +(SLDconst [c] z:(ANDconst [d] x)) && z.Uses == 1 && isPPC64ValidShiftMask(d) => (CLRLSLDI [newPPC64ShiftAuxInt(c,64-getPPC64ShiftMaskLength(d),63,64)] x) +(SLDconst [c] z:(AND (MOVDconst [d]) x)) && z.Uses == 1 && isPPC64ValidShiftMask(d) => (CLRLSLDI [newPPC64ShiftAuxInt(c,64-getPPC64ShiftMaskLength(d),63,64)] x) +(SLWconst [c] z:(MOVBZreg x)) && z.Uses == 1 && c < 8 => (CLRLSLWI [newPPC64ShiftAuxInt(c,24,31,32)] x) +(SLWconst [c] z:(MOVHZreg x)) && z.Uses == 1 && c < 16 => (CLRLSLWI [newPPC64ShiftAuxInt(c,16,31,32)] x) +(SLWconst [c] z:(MOVWZreg x)) && z.Uses == 1 && c < 24 => (CLRLSLWI [newPPC64ShiftAuxInt(c,8,31,32)] x) +(SLWconst [c] z:(ANDconst [d] x)) && z.Uses == 1 && isPPC64ValidShiftMask(d) => (CLRLSLWI [newPPC64ShiftAuxInt(c,32-getPPC64ShiftMaskLength(d),31,32)] x) +(SLWconst [c] z:(AND (MOVDconst [d]) x)) && z.Uses == 1 && isPPC64ValidShiftMask(d) => (CLRLSLWI [newPPC64ShiftAuxInt(c,32-getPPC64ShiftMaskLength(d),31,32)] x) // Lose widening ops fed to stores (MOVBstore [off] {sym} ptr (MOV(B|BZ|H|HZ|W|WZ)reg x) mem) => (MOVBstore [off] {sym} ptr x mem) diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index 37706b2dd9..ed99c40cd2 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -206,6 +206,11 @@ func init() { {name: "ROTL", argLength: 2, reg: gp21, asm: "ROTL"}, // arg0 rotate left by arg1 mod 64 {name: "ROTLW", argLength: 2, reg: gp21, asm: "ROTLW"}, // uint32(arg0) rotate left by arg1 mod 32 + // The following are ops to implement the extended mnemonics for shifts as described in section C.8 of the ISA. + // The constant shift values are packed into the aux int32. + {name: "RLDICL", argLength: 1, reg: gp11, asm: "RLDICL", aux: "Int32"}, // arg0 extract bits identified by shift params" + {name: "CLRLSLWI", argLength: 1, reg: gp11, asm: "CLRLSLWI", aux: "Int32"}, // + {name: "CLRLSLDI", argLength: 1, reg: gp11, asm: "CLRLSLDI", aux: "Int32"}, // {name: "LoweredAdd64Carry", argLength: 3, reg: gp32, resultNotInArgs: true}, // arg0 + arg1 + carry, returns (sum, carry) diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index d95943231a..f00dc3f7f5 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -1853,6 +1853,9 @@ const ( OpPPC64SLW OpPPC64ROTL OpPPC64ROTLW + OpPPC64RLDICL + OpPPC64CLRLSLWI + OpPPC64CLRLSLDI OpPPC64LoweredAdd64Carry OpPPC64SRADconst OpPPC64SRAWconst @@ -24672,6 +24675,48 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "RLDICL", + auxType: auxInt32, + argLen: 1, + asm: ppc64.ARLDICL, + 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: "CLRLSLWI", + auxType: auxInt32, + argLen: 1, + asm: ppc64.ACLRLSLWI, + 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: "CLRLSLDI", + auxType: auxInt32, + argLen: 1, + asm: ppc64.ACLRLSLDI, + 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: "LoweredAdd64Carry", argLen: 3, diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 2ab310ad85..d9c3e455a0 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -1325,6 +1325,44 @@ func hasSmallRotate(c *Config) bool { } } +func newPPC64ShiftAuxInt(sh, mb, me, sz int64) int32 { + if sh < 0 || sh >= sz { + panic("PPC64 shift arg sh out of range") + } + if mb < 0 || mb >= sz { + panic("PPC64 shift arg mb out of range") + } + if me < 0 || me >= sz { + panic("PPC64 shift arg me out of range") + } + return int32(sh<<16 | mb<<8 | me) +} + +func GetPPC64Shiftsh(auxint int64) int64 { + return int64(int8(auxint >> 16)) +} + +func GetPPC64Shiftmb(auxint int64) int64 { + return int64(int8(auxint >> 8)) +} + +func GetPPC64Shiftme(auxint int64) int64 { + return int64(int8(auxint)) +} + +// Catch the simple ones first +// TODO: Later catch more cases +func isPPC64ValidShiftMask(v int64) bool { + if ((v + 1) & v) == 0 { + return true + } + return false +} + +func getPPC64ShiftMaskLength(v int64) int64 { + return int64(bits.Len64(uint64(v))) +} + // encodes the lsb and width for arm(64) bitfield ops into the expected auxInt format. func armBFAuxInt(lsb, width int64) arm64BitField { if lsb < 0 || lsb > 63 { diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 152cdfdf4d..12b08824b5 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -586,8 +586,12 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64ROTLW(v) case OpPPC64SLD: return rewriteValuePPC64_OpPPC64SLD(v) + case OpPPC64SLDconst: + return rewriteValuePPC64_OpPPC64SLDconst(v) case OpPPC64SLW: return rewriteValuePPC64_OpPPC64SLW(v) + case OpPPC64SLWconst: + return rewriteValuePPC64_OpPPC64SLWconst(v) case OpPPC64SRAD: return rewriteValuePPC64_OpPPC64SRAD(v) case OpPPC64SRAW: @@ -6565,6 +6569,255 @@ func rewriteValuePPC64_OpPPC64MOVBZreg(v *Value) bool { v.AddArg(x) return true } + // match: (MOVBZreg (OR x (MOVWZreg y))) + // result: (MOVBZreg (OR x y)) + for { + if v_0.Op != OpPPC64OR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64OR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg (XOR x (MOVWZreg y))) + // result: (MOVBZreg (XOR x y)) + for { + if v_0.Op != OpPPC64XOR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64XOR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg (AND x (MOVWZreg y))) + // result: (MOVBZreg (AND x y)) + for { + if v_0.Op != OpPPC64AND { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64AND, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg (OR x (MOVHZreg y))) + // result: (MOVBZreg (OR x y)) + for { + if v_0.Op != OpPPC64OR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVHZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64OR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg (XOR x (MOVHZreg y))) + // result: (MOVBZreg (XOR x y)) + for { + if v_0.Op != OpPPC64XOR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVHZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64XOR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg (AND x (MOVHZreg y))) + // result: (MOVBZreg (AND x y)) + for { + if v_0.Op != OpPPC64AND { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVHZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64AND, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg (OR x (MOVBZreg y))) + // result: (MOVBZreg (OR x y)) + for { + if v_0.Op != OpPPC64OR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVBZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64OR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg (XOR x (MOVBZreg y))) + // result: (MOVBZreg (XOR x y)) + for { + if v_0.Op != OpPPC64XOR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVBZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64XOR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg (AND x (MOVBZreg y))) + // result: (MOVBZreg (AND x y)) + for { + if v_0.Op != OpPPC64AND { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVBZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVBZreg) + v0 := b.NewValue0(v.Pos, OpPPC64AND, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVBZreg z:(ANDconst [c] (MOVBZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64ANDconst { + break + } + z_0 := z.Args[0] + if z_0.Op != OpPPC64MOVBZload { + break + } + v.copyOf(z) + return true + } + // match: (MOVBZreg z:(AND y (MOVBZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64AND { + break + } + _ = z.Args[1] + z_0 := z.Args[0] + z_1 := z.Args[1] + for _i0 := 0; _i0 <= 1; _i0, z_0, z_1 = _i0+1, z_1, z_0 { + if z_1.Op != OpPPC64MOVBZload { + continue + } + v.copyOf(z) + return true + } + break + } // match: (MOVBZreg x:(MOVBZload _ _)) // result: x for { @@ -8507,6 +8760,197 @@ func rewriteValuePPC64_OpPPC64MOVHZreg(v *Value) bool { v.AddArg(x) return true } + // match: (MOVHZreg (OR x (MOVWZreg y))) + // result: (MOVHZreg (OR x y)) + for { + if v_0.Op != OpPPC64OR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVHZreg) + v0 := b.NewValue0(v.Pos, OpPPC64OR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVHZreg (XOR x (MOVWZreg y))) + // result: (MOVHZreg (XOR x y)) + for { + if v_0.Op != OpPPC64XOR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVHZreg) + v0 := b.NewValue0(v.Pos, OpPPC64XOR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVHZreg (AND x (MOVWZreg y))) + // result: (MOVHZreg (AND x y)) + for { + if v_0.Op != OpPPC64AND { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVHZreg) + v0 := b.NewValue0(v.Pos, OpPPC64AND, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVHZreg (OR x (MOVHZreg y))) + // result: (MOVHZreg (OR x y)) + for { + if v_0.Op != OpPPC64OR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVHZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVHZreg) + v0 := b.NewValue0(v.Pos, OpPPC64OR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVHZreg (XOR x (MOVHZreg y))) + // result: (MOVHZreg (XOR x y)) + for { + if v_0.Op != OpPPC64XOR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVHZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVHZreg) + v0 := b.NewValue0(v.Pos, OpPPC64XOR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVHZreg (AND x (MOVHZreg y))) + // result: (MOVHZreg (AND x y)) + for { + if v_0.Op != OpPPC64AND { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVHZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVHZreg) + v0 := b.NewValue0(v.Pos, OpPPC64AND, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVHZreg z:(ANDconst [c] (MOVBZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64ANDconst { + break + } + z_0 := z.Args[0] + if z_0.Op != OpPPC64MOVBZload { + break + } + v.copyOf(z) + return true + } + // match: (MOVHZreg z:(ANDconst [c] (MOVHZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64ANDconst { + break + } + z_0 := z.Args[0] + if z_0.Op != OpPPC64MOVHZload { + break + } + v.copyOf(z) + return true + } + // match: (MOVHZreg z:(AND y (MOVHZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64AND { + break + } + _ = z.Args[1] + z_0 := z.Args[0] + z_1 := z.Args[1] + for _i0 := 0; _i0 <= 1; _i0, z_0, z_1 = _i0+1, z_1, z_0 { + if z_1.Op != OpPPC64MOVHZload { + continue + } + v.copyOf(z) + return true + } + break + } // match: (MOVHZreg x:(MOVBZload _ _)) // result: x for { @@ -9657,6 +10101,139 @@ func rewriteValuePPC64_OpPPC64MOVWZreg(v *Value) bool { v.AddArg(x) return true } + // match: (MOVWZreg (OR x (MOVWZreg y))) + // result: (MOVWZreg (OR x y)) + for { + if v_0.Op != OpPPC64OR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVWZreg) + v0 := b.NewValue0(v.Pos, OpPPC64OR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVWZreg (XOR x (MOVWZreg y))) + // result: (MOVWZreg (XOR x y)) + for { + if v_0.Op != OpPPC64XOR { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVWZreg) + v0 := b.NewValue0(v.Pos, OpPPC64XOR, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVWZreg (AND x (MOVWZreg y))) + // result: (MOVWZreg (AND x y)) + for { + if v_0.Op != OpPPC64AND { + break + } + t := v_0.Type + _ = 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 != OpPPC64MOVWZreg { + continue + } + y := v_0_1.Args[0] + v.reset(OpPPC64MOVWZreg) + v0 := b.NewValue0(v.Pos, OpPPC64AND, t) + v0.AddArg2(x, y) + v.AddArg(v0) + return true + } + break + } + // match: (MOVWZreg z:(ANDconst [c] (MOVBZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64ANDconst { + break + } + z_0 := z.Args[0] + if z_0.Op != OpPPC64MOVBZload { + break + } + v.copyOf(z) + return true + } + // match: (MOVWZreg z:(ANDconst [c] (MOVHZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64ANDconst { + break + } + z_0 := z.Args[0] + if z_0.Op != OpPPC64MOVHZload { + break + } + v.copyOf(z) + return true + } + // match: (MOVWZreg z:(ANDconst [c] (MOVWZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64ANDconst { + break + } + z_0 := z.Args[0] + if z_0.Op != OpPPC64MOVWZload { + break + } + v.copyOf(z) + return true + } + // match: (MOVWZreg z:(AND y (MOVWZload ptr x))) + // result: z + for { + z := v_0 + if z.Op != OpPPC64AND { + break + } + _ = z.Args[1] + z_0 := z.Args[0] + z_1 := z.Args[1] + for _i0 := 0; _i0 <= 1; _i0, z_0, z_1 = _i0+1, z_1, z_0 { + if z_1.Op != OpPPC64MOVWZload { + continue + } + v.copyOf(z) + return true + } + break + } // match: (MOVWZreg x:(MOVBZload _ _)) // result: x for { @@ -12197,6 +12774,111 @@ func rewriteValuePPC64_OpPPC64SLD(v *Value) bool { } return false } +func rewriteValuePPC64_OpPPC64SLDconst(v *Value) bool { + v_0 := v.Args[0] + // match: (SLDconst [c] z:(MOVBZreg x)) + // cond: c < 8 && z.Uses == 1 + // result: (CLRLSLDI [newPPC64ShiftAuxInt(c,56,63,64)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64MOVBZreg { + break + } + x := z.Args[0] + if !(c < 8 && z.Uses == 1) { + break + } + v.reset(OpPPC64CLRLSLDI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 56, 63, 64)) + v.AddArg(x) + return true + } + // match: (SLDconst [c] z:(MOVHZreg x)) + // cond: c < 16 && z.Uses == 1 + // result: (CLRLSLDI [newPPC64ShiftAuxInt(c,48,63,64)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64MOVHZreg { + break + } + x := z.Args[0] + if !(c < 16 && z.Uses == 1) { + break + } + v.reset(OpPPC64CLRLSLDI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 48, 63, 64)) + v.AddArg(x) + return true + } + // match: (SLDconst [c] z:(MOVWZreg x)) + // cond: c < 32 && z.Uses == 1 + // result: (CLRLSLDI [newPPC64ShiftAuxInt(c,32,63,64)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64MOVWZreg { + break + } + x := z.Args[0] + if !(c < 32 && z.Uses == 1) { + break + } + v.reset(OpPPC64CLRLSLDI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 32, 63, 64)) + v.AddArg(x) + return true + } + // match: (SLDconst [c] z:(ANDconst [d] x)) + // cond: z.Uses == 1 && isPPC64ValidShiftMask(d) + // result: (CLRLSLDI [newPPC64ShiftAuxInt(c,64-getPPC64ShiftMaskLength(d),63,64)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64ANDconst { + break + } + d := auxIntToInt64(z.AuxInt) + x := z.Args[0] + if !(z.Uses == 1 && isPPC64ValidShiftMask(d)) { + break + } + v.reset(OpPPC64CLRLSLDI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 64-getPPC64ShiftMaskLength(d), 63, 64)) + v.AddArg(x) + return true + } + // match: (SLDconst [c] z:(AND (MOVDconst [d]) x)) + // cond: z.Uses == 1 && isPPC64ValidShiftMask(d) + // result: (CLRLSLDI [newPPC64ShiftAuxInt(c,64-getPPC64ShiftMaskLength(d),63,64)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64AND { + break + } + _ = z.Args[1] + z_0 := z.Args[0] + z_1 := z.Args[1] + for _i0 := 0; _i0 <= 1; _i0, z_0, z_1 = _i0+1, z_1, z_0 { + if z_0.Op != OpPPC64MOVDconst { + continue + } + d := auxIntToInt64(z_0.AuxInt) + x := z_1 + if !(z.Uses == 1 && isPPC64ValidShiftMask(d)) { + continue + } + v.reset(OpPPC64CLRLSLDI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 64-getPPC64ShiftMaskLength(d), 63, 64)) + v.AddArg(x) + return true + } + break + } + return false +} func rewriteValuePPC64_OpPPC64SLW(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] @@ -12215,6 +12897,111 @@ func rewriteValuePPC64_OpPPC64SLW(v *Value) bool { } return false } +func rewriteValuePPC64_OpPPC64SLWconst(v *Value) bool { + v_0 := v.Args[0] + // match: (SLWconst [c] z:(MOVBZreg x)) + // cond: z.Uses == 1 && c < 8 + // result: (CLRLSLWI [newPPC64ShiftAuxInt(c,24,31,32)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64MOVBZreg { + break + } + x := z.Args[0] + if !(z.Uses == 1 && c < 8) { + break + } + v.reset(OpPPC64CLRLSLWI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 24, 31, 32)) + v.AddArg(x) + return true + } + // match: (SLWconst [c] z:(MOVHZreg x)) + // cond: z.Uses == 1 && c < 16 + // result: (CLRLSLWI [newPPC64ShiftAuxInt(c,16,31,32)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64MOVHZreg { + break + } + x := z.Args[0] + if !(z.Uses == 1 && c < 16) { + break + } + v.reset(OpPPC64CLRLSLWI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 16, 31, 32)) + v.AddArg(x) + return true + } + // match: (SLWconst [c] z:(MOVWZreg x)) + // cond: z.Uses == 1 && c < 24 + // result: (CLRLSLWI [newPPC64ShiftAuxInt(c,8,31,32)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64MOVWZreg { + break + } + x := z.Args[0] + if !(z.Uses == 1 && c < 24) { + break + } + v.reset(OpPPC64CLRLSLWI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 8, 31, 32)) + v.AddArg(x) + return true + } + // match: (SLWconst [c] z:(ANDconst [d] x)) + // cond: z.Uses == 1 && isPPC64ValidShiftMask(d) + // result: (CLRLSLWI [newPPC64ShiftAuxInt(c,32-getPPC64ShiftMaskLength(d),31,32)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64ANDconst { + break + } + d := auxIntToInt64(z.AuxInt) + x := z.Args[0] + if !(z.Uses == 1 && isPPC64ValidShiftMask(d)) { + break + } + v.reset(OpPPC64CLRLSLWI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 32-getPPC64ShiftMaskLength(d), 31, 32)) + v.AddArg(x) + return true + } + // match: (SLWconst [c] z:(AND (MOVDconst [d]) x)) + // cond: z.Uses == 1 && isPPC64ValidShiftMask(d) + // result: (CLRLSLWI [newPPC64ShiftAuxInt(c,32-getPPC64ShiftMaskLength(d),31,32)] x) + for { + c := auxIntToInt64(v.AuxInt) + z := v_0 + if z.Op != OpPPC64AND { + break + } + _ = z.Args[1] + z_0 := z.Args[0] + z_1 := z.Args[1] + for _i0 := 0; _i0 <= 1; _i0, z_0, z_1 = _i0+1, z_1, z_0 { + if z_0.Op != OpPPC64MOVDconst { + continue + } + d := auxIntToInt64(z_0.AuxInt) + x := z_1 + if !(z.Uses == 1 && isPPC64ValidShiftMask(d)) { + continue + } + v.reset(OpPPC64CLRLSLWI) + v.AuxInt = int32ToAuxInt(newPPC64ShiftAuxInt(c, 32-getPPC64ShiftMaskLength(d), 31, 32)) + v.AddArg(x) + return true + } + break + } + return false +} func rewriteValuePPC64_OpPPC64SRAD(v *Value) bool { v_1 := v.Args[1] v_0 := v.Args[0] diff --git a/src/cmd/internal/obj/ppc64/a.out.go b/src/cmd/internal/obj/ppc64/a.out.go index 8b32692778..f438803fb5 100644 --- a/src/cmd/internal/obj/ppc64/a.out.go +++ b/src/cmd/internal/obj/ppc64/a.out.go @@ -575,6 +575,7 @@ const ( ARLWMICC ARLWNM ARLWNMCC + ACLRLSLWI ASLW ASLWCC ASRW @@ -716,6 +717,9 @@ const ( ARLDCLCC ARLDICL ARLDICLCC + ARLDIC + ARLDICCC + ACLRLSLDI AROTL AROTLW ASLBIA diff --git a/src/cmd/internal/obj/ppc64/anames.go b/src/cmd/internal/obj/ppc64/anames.go index 287011877c..accd87fe00 100644 --- a/src/cmd/internal/obj/ppc64/anames.go +++ b/src/cmd/internal/obj/ppc64/anames.go @@ -180,6 +180,7 @@ var Anames = []string{ "RLWMICC", "RLWNM", "RLWNMCC", + "CLRLSLWI", "SLW", "SLWCC", "SRW", @@ -312,6 +313,9 @@ var Anames = []string{ "RLDCLCC", "RLDICL", "RLDICLCC", + "RLDIC", + "RLDICCC", + "CLRLSLDI", "ROTL", "ROTLW", "SLBIA", diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 98b453de6c..60dda72507 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -1904,6 +1904,7 @@ func buildop(ctxt *obj.Link) { opset(ARLWMICC, r0) opset(ARLWNM, r0) opset(ARLWNMCC, r0) + opset(ACLRLSLWI, r0) case ARLDMI: opset(ARLDMICC, r0) @@ -1922,6 +1923,9 @@ func buildop(ctxt *obj.Link) { opset(ARLDICLCC, r0) opset(ARLDICR, r0) opset(ARLDICRCC, r0) + opset(ARLDIC, r0) + opset(ARLDICCC, r0) + opset(ACLRLSLDI, r0) case AFMOVD: opset(AFMOVDCC, r0) @@ -2734,13 +2738,31 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { case ARLDICR, ARLDICRCC: me := int(d) sh := c.regoff(&p.From) + if me < 0 || me > 63 || sh > 63 { + c.ctxt.Diag("Invalid me or sh for RLDICR: %x %x\n%v", int(d), sh) + } o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(me)) - case ARLDICL, ARLDICLCC: + case ARLDICL, ARLDICLCC, ARLDIC, ARLDICCC: mb := int(d) sh := c.regoff(&p.From) + if mb < 0 || mb > 63 || sh > 63 { + c.ctxt.Diag("Invalid mb or sh for RLDIC, RLDICL: %x %x\n%v", mb, sh) + } o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(mb)) + case ACLRLSLDI: + // This is an extended mnemonic defined in the ISA section C.8.1 + // clrlsldi ra,rs,n,b --> rldic ra,rs,n,b-n + // It maps onto RLDIC so is directly generated here based on the operands from + // the clrlsldi. + b := int(d) + n := c.regoff(&p.From) + if n > int32(b) || b > 63 { + c.ctxt.Diag("Invalid n or b for CLRLSLDI: %x %x\n%v", n, b) + } + o1 = AOP_RLDIC(OP_RLDIC, uint32(p.To.Reg), uint32(r), uint32(n), uint32(b)-uint32(n)) + default: c.ctxt.Diag("unexpected op in rldc case\n%v", p) a = 0 @@ -3354,18 +3376,43 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { case 62: /* rlwmi $sh,s,$mask,a */ v := c.regoff(&p.From) - - var mask [2]uint8 - c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3()))) - o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v)) - o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1 + switch p.As { + case ACLRLSLWI: + b := c.regoff(p.GetFrom3()) + // This is an extended mnemonic described in the ISA C.8.2 + // clrlslwi ra,rs,n,b -> rlwinm ra,rs,n,b-n,31-n + // It maps onto rlwinm which is directly generated here. + if v < 0 || v > 32 || b > 32 { + c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, b) + } + o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(v), uint32(b-v), uint32(31-v)) + default: + var mask [2]uint8 + c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3()))) + o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v)) + o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1 + } case 63: /* rlwmi b,s,$mask,a */ - var mask [2]uint8 - c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3()))) - - o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(p.From.Reg)) - o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1 + v := c.regoff(&p.From) + switch p.As { + case ACLRLSLWI: + b := c.regoff(p.GetFrom3()) + if v > b || b > 32 { + // Message will match operands from the ISA even though in the + // code it uses 'v' + c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, b) + } + // This is an extended mnemonic described in the ISA C.8.2 + // clrlslwi ra,rs,n,b -> rlwinm ra,rs,n,b-n,31-n + // It generates the rlwinm directly here. + o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(v), uint32(b-v), uint32(31-v)) + default: + var mask [2]uint8 + c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3()))) + o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v)) + o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1 + } case 64: /* mtfsf fr[, $m] {,fpcsr} */ var v int32 @@ -4277,6 +4324,11 @@ func (c *ctxt9) oprrr(a obj.As) uint32 { case ARLDICRCC: return OPVCC(30, 0, 0, 1) | 2<<1 // rldicr. + case ARLDIC: + return OPVCC(30, 0, 0, 0) | 4<<1 // rldic + case ARLDICCC: + return OPVCC(30, 0, 0, 1) | 4<<1 // rldic. + case ASYSCALL: return OPVCC(17, 1, 0, 0) diff --git a/test/codegen/shift.go b/test/codegen/shift.go index 5e50ea6bff..32214851b5 100644 --- a/test/codegen/shift.go +++ b/test/codegen/shift.go @@ -150,6 +150,61 @@ func lshGuarded64(v int64, s uint) int64 { panic("shift too large") } +func checkUnneededTrunc(tab *[100000]uint32, d uint64, v uint32, h uint16, b byte) (uint32, uint64) { + + // ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + // ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + f := tab[byte(v)^b] + // ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + // ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + f += tab[byte(v)&b] + // ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + // ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + f += tab[byte(v)|b] + // ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + // ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + f += tab[uint16(v)&h] + // ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + // ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + f += tab[uint16(v)^h] + // ppc64le:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + // ppc64:-".*RLWINM",-".*RLDICR",".*CLRLSLDI" + f += tab[uint16(v)|h] + // ppc64le:-".*AND",-"RLDICR",".*CLRLSLDI" + // ppc64:-".*AND",-"RLDICR",".*CLRLSLDI" + f += tab[v&0xff] + // ppc64le:-".*AND",".*CLRLSLWI" + // ppc64:-".*AND",".*CLRLSLWI" + f += 2*uint32(uint16(d)) + // ppc64le:-".*AND",-"RLDICR",".*CLRLSLDI" + // ppc64:-".*AND",-"RLDICR",".*CLRLSLDI" + g := 2*uint64(uint32(d)) + return f, g +} + +func checkCombinedShifts(v8 uint8, v16 uint16, v32 uint32, v64 uint64) (uint8, uint16, uint32, uint64) { + + // ppc64le:-"AND","CLRLSLWI" + // ppc64:-"AND","CLRLSLWI" + f := (v8 &0xF) << 2 + // ppc64le:-"AND","CLRLSLWI" + // ppc64:-"AND","CLRLSLWI" + f += byte(v16)<<3 + // ppc64le:-"AND","CLRLSLWI" + // ppc64:-"AND","CLRLSLWI" + g := (v16 & 0xFF) << 3 + // ppc64le:-"AND","CLRLSLWI" + // ppc64:-"AND","CLRLSLWI" + h := (v32 & 0xFFFFF) << 2 + // ppc64le:-"AND","CLRLSLWI" + // ppc64:-"AND","CLRLSLWI" + h += uint32(v64)<<4 + // ppc64le:-"AND","CLRLSLDI" + // ppc64:-"AND","CLRLSLDI" + i := (v64 & 0xFFFFFFFF) << 5 + return f, g, h, i +} + func checkWidenAfterShift(v int64, u uint64) (int64, uint64) { // ppc64le:-".*MOVW" -- GitLab From 5abba0c73723a843315c0f7ed014617445af6243 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 15 Sep 2020 12:59:05 -0400 Subject: [PATCH 0522/1792] cmd/go: prepare tests for GO111MODULE=on by default Set GO111MODULE=off explicitly in tests specific to GOPATH mode. Added a go.mod file to other tests that assumed GOPATH mode. Fixed an issue in the build metadata file generated in modload/build.go, which did not end with a newline. This broke the build_dash_x test, which expects to be able to run the script printed by 'go build -x' to produce the same result. The script is broken if the build metadata file doesn't end with a newline. Change-Id: I59f2a492a9f5a66f6c4aa702f429909d5c5e815d Reviewed-on: https://go-review.googlesource.com/c/go/+/255051 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Trust: Jay Conrod --- src/cmd/go/internal/modload/build.go | 4 +- .../testdata/script/build_cache_arch_mode.txt | 10 ++-- .../testdata/script/build_cache_disabled.txt | 8 ++- .../script/build_cd_gopath_different.txt | 1 + .../script/build_cgo_consistent_results.txt | 6 +- src/cmd/go/testdata/script/build_dash_x.txt | 2 +- src/cmd/go/testdata/script/build_exe.txt | 12 ++-- .../go/testdata/script/build_gopath_order.txt | 3 +- .../testdata/script/build_import_comment.txt | 57 +++++++++++++------ .../go/testdata/script/build_import_cycle.txt | 3 + src/cmd/go/testdata/script/build_internal.txt | 45 ++++++++++----- .../go/testdata/script/build_issue6480.txt | 8 ++- .../build_link_x_import_path_escape.txt | 8 ++- src/cmd/go/testdata/script/build_n_cgo.txt | 4 ++ src/cmd/go/testdata/script/build_no_go.txt | 4 ++ src/cmd/go/testdata/script/build_output.txt | 8 ++- .../script/build_patterns_outside_gopath.txt | 9 ++- .../testdata/script/build_plugin_non_main.txt | 17 +++--- .../go/testdata/script/build_test_only.txt | 8 ++- src/cmd/go/testdata/script/build_vendor.txt | 1 + src/cmd/go/testdata/script/cgo_asm_error.txt | 8 ++- .../go/testdata/script/cgo_bad_directives.txt | 43 +++++++------- .../script/cgo_depends_on_syscall.txt | 6 +- src/cmd/go/testdata/script/cover_asm.txt | 10 +++- .../testdata/script/cover_blank_func_decl.txt | 10 +++- src/cmd/go/testdata/script/cover_cgo.txt | 8 ++- .../testdata/script/cover_cgo_extra_file.txt | 12 ++-- .../testdata/script/cover_cgo_extra_test.txt | 12 ++-- .../go/testdata/script/cover_cgo_xtest.txt | 10 +++- src/cmd/go/testdata/script/cover_dash_c.txt | 10 +++- src/cmd/go/testdata/script/cover_dep_loop.txt | 10 +++- .../go/testdata/script/cover_dot_import.txt | 20 ++++--- src/cmd/go/testdata/script/cover_error.txt | 18 ++++-- .../script/cover_import_main_loop.txt | 10 +++- src/cmd/go/testdata/script/cover_pattern.txt | 10 +++- .../go/testdata/script/cover_statements.txt | 4 ++ .../script/cover_sync_atomic_import.txt | 12 ++-- .../testdata/script/generate_bad_imports.txt | 6 +- .../go/testdata/script/generate_invalid.txt | 6 +- .../script/get_custom_domain_wildcard.txt | 3 +- src/cmd/go/testdata/script/get_dash_t.txt | 3 +- .../go/testdata/script/get_domain_root.txt | 3 +- .../script/get_dot_slash_download.txt | 3 +- src/cmd/go/testdata/script/get_goroot.txt | 3 +- .../script/get_insecure_custom_domain.txt | 3 +- .../testdata/script/get_insecure_update.txt | 3 +- .../testdata/script/get_internal_wildcard.txt | 3 +- src/cmd/go/testdata/script/get_issue11307.txt | 3 +- .../{mod_get_legacy.txt => get_legacy.txt} | 3 +- src/cmd/go/testdata/script/get_race.txt | 3 +- src/cmd/go/testdata/script/get_test_only.txt | 3 +- src/cmd/go/testdata/script/get_update.txt | 3 +- .../script/get_update_unknown_protocol.txt | 3 +- .../testdata/script/get_update_wildcard.txt | 3 +- .../testdata/script/get_vcs_error_message.txt | 1 + src/cmd/go/testdata/script/get_vendor.txt | 3 +- .../testdata/script/gopath_vendor_dup_err.txt | 1 + .../testdata/script/install_cgo_excluded.txt | 6 +- .../script/install_relative_gobin_fail.txt | 6 +- .../testdata/script/install_shadow_gopath.txt | 3 +- .../testdata/script/link_syso_issue33139.txt | 6 +- .../testdata/script/list_case_collision.txt | 22 ++++--- .../testdata/script/list_dedup_packages.txt | 1 + src/cmd/go/testdata/script/list_symlink.txt | 1 + .../testdata/script/list_symlink_internal.txt | 3 +- .../script/list_symlink_vendor_issue14054.txt | 3 +- .../script/list_symlink_vendor_issue15201.txt | 3 +- .../go/testdata/script/list_test_simple.txt | 20 ++++--- .../script/list_wildcard_skip_nonmatching.txt | 16 ++++-- .../go/testdata/script/load_test_pkg_err.txt | 12 ++-- src/cmd/go/testdata/script/run_hello_pkg.txt | 9 ++- src/cmd/go/testdata/script/run_vendor.txt | 1 + .../testdata/script/test_benchmark_fatal.txt | 6 +- .../testdata/script/test_benchmark_labels.txt | 6 +- .../go/testdata/script/test_build_failure.txt | 10 +++- src/cmd/go/testdata/script/test_deadline.txt | 4 ++ src/cmd/go/testdata/script/test_empty.txt | 4 ++ .../testdata/script/test_example_goexit.txt | 6 +- .../script/test_import_error_stack.txt | 11 ++++ src/cmd/go/testdata/script/test_json.txt | 18 +++--- .../go/testdata/script/test_main_twice.txt | 6 +- .../test_match_no_tests_build_failure.txt | 8 ++- .../testdata/script/test_no_run_example.txt | 8 ++- src/cmd/go/testdata/script/test_no_tests.txt | 6 +- src/cmd/go/testdata/script/test_race.txt | 6 +- .../test_race_cover_mode_issue20435.txt | 6 +- .../go/testdata/script/test_race_install.txt | 6 +- .../testdata/script/test_race_install_cgo.txt | 6 +- src/cmd/go/testdata/script/test_regexps.txt | 8 ++- .../testdata/script/test_relative_import.txt | 3 +- .../script/test_relative_import_dash_i.txt | 3 +- .../script/test_syntax_error_says_fail.txt | 11 ++++ src/cmd/go/testdata/script/test_vendor.txt | 12 +++- src/cmd/go/testdata/script/test_vet.txt | 16 ++++-- .../script/test_write_profiles_on_timeout.txt | 9 ++- .../testdata/script/test_xtestonly_works.txt | 8 ++- .../go/testdata/script/testing_issue40908.txt | 6 +- .../script/vendor_gopath_issue11409.txt | 1 + src/cmd/go/testdata/script/vendor_import.txt | 1 + .../testdata/script/vendor_import_wrong.txt | 11 ++++ .../go/testdata/script/vendor_issue12156.txt | 1 + .../script/vendor_list_issue11977.txt | 3 +- src/cmd/go/testdata/script/vendor_resolve.txt | 1 + .../script/vendor_test_issue11864.txt | 3 +- .../script/vendor_test_issue14613.txt | 1 + src/cmd/go/testdata/script/vet.txt | 18 +++--- 106 files changed, 596 insertions(+), 242 deletions(-) rename src/cmd/go/testdata/script/{mod_get_legacy.txt => get_legacy.txt} (97%) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 9ca6230500..2c7cfb732d 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -355,13 +355,13 @@ func ModInfoProg(info string, isgccgo bool) []byte { import _ "unsafe" //go:linkname __debug_modinfo__ runtime.modinfo var __debug_modinfo__ = %q - `, string(infoStart)+info+string(infoEnd))) +`, string(infoStart)+info+string(infoEnd))) } else { return []byte(fmt.Sprintf(`package main import _ "unsafe" //go:linkname __set_debug_modinfo__ runtime.setmodinfo func __set_debug_modinfo__(string) func init() { __set_debug_modinfo__(%q) } - `, string(infoStart)+info+string(infoEnd))) +`, string(infoStart)+info+string(infoEnd))) } } diff --git a/src/cmd/go/testdata/script/build_cache_arch_mode.txt b/src/cmd/go/testdata/script/build_cache_arch_mode.txt index 7e751d02b9..68e662555f 100644 --- a/src/cmd/go/testdata/script/build_cache_arch_mode.txt +++ b/src/cmd/go/testdata/script/build_cache_arch_mode.txt @@ -3,7 +3,6 @@ [short] skip # 386 -cd $GOPATH/src/mycmd env GOOS=linux env GOARCH=386 env GO386=387 @@ -12,7 +11,6 @@ env GO386=sse2 stale mycmd # arm -cd $GOPATH/src/mycmd env GOOS=linux env GOARCH=arm env GOARM=5 @@ -21,7 +19,11 @@ env GOARM=7 stale mycmd --- mycmd/x.go -- +-- go.mod -- +module mycmd + +go 1.16 +-- x.go -- package main -func main() {} \ No newline at end of file +func main() {} diff --git a/src/cmd/go/testdata/script/build_cache_disabled.txt b/src/cmd/go/testdata/script/build_cache_disabled.txt index 2e1327880b..8b005c857f 100644 --- a/src/cmd/go/testdata/script/build_cache_disabled.txt +++ b/src/cmd/go/testdata/script/build_cache_disabled.txt @@ -18,8 +18,6 @@ env GOCACHE=off go doc fmt stdout Printf -go fmt . - ! go tool compile -h stderr usage: @@ -40,6 +38,12 @@ stdout rsc.io/quote go mod verify + +# Commands that load but don't build packages should work. +go fmt . + +go doc . + -- main.go -- package main diff --git a/src/cmd/go/testdata/script/build_cd_gopath_different.txt b/src/cmd/go/testdata/script/build_cd_gopath_different.txt index 698b3d70f4..a7a4bf412d 100644 --- a/src/cmd/go/testdata/script/build_cd_gopath_different.txt +++ b/src/cmd/go/testdata/script/build_cd_gopath_different.txt @@ -1,4 +1,5 @@ [gccgo] skip 'gccgo does not support -ldflags -X' +env GO111MODULE=off go build run_go.go # Apply identity function to GOPATH diff --git a/src/cmd/go/testdata/script/build_cgo_consistent_results.txt b/src/cmd/go/testdata/script/build_cgo_consistent_results.txt index 42f1cc1a74..88a24de814 100644 --- a/src/cmd/go/testdata/script/build_cgo_consistent_results.txt +++ b/src/cmd/go/testdata/script/build_cgo_consistent_results.txt @@ -11,7 +11,11 @@ go build -x -o $WORK/exe2$GOEXE cgotest cmp $WORK/exe1$GOEXE $WORK/exe2$GOEXE --- cgotest/m.go -- +-- go.mod -- +module cgotest + +go 1.16 +-- m.go -- package cgotest import "C" diff --git a/src/cmd/go/testdata/script/build_dash_x.txt b/src/cmd/go/testdata/script/build_dash_x.txt index 3082095c5c..6fd5bbe182 100644 --- a/src/cmd/go/testdata/script/build_dash_x.txt +++ b/src/cmd/go/testdata/script/build_dash_x.txt @@ -46,4 +46,4 @@ func main() { -- header.txt -- set -e -- hello.txt -- -hello \ No newline at end of file +hello diff --git a/src/cmd/go/testdata/script/build_exe.txt b/src/cmd/go/testdata/script/build_exe.txt index fd13259fcc..a994d17088 100644 --- a/src/cmd/go/testdata/script/build_exe.txt +++ b/src/cmd/go/testdata/script/build_exe.txt @@ -1,12 +1,16 @@ -# go build with -o and -buildmode=exe should on a non-main package should throw an error +# go build with -o and -buildmode=exe should report an error on a non-main package. -! go build -buildmode=exe -o out$GOEXE not_main +! go build -buildmode=exe -o out$GOEXE ./not_main stderr '-buildmode=exe requires exactly one main package' ! exists out$GOEXE -! go build -buildmode=exe -o out$GOEXE main_one main_two +! go build -buildmode=exe -o out$GOEXE ./main_one ./main_two stderr '-buildmode=exe requires exactly one main package' ! exists out$GOEXE +-- go.mod -- +module m + +go 1.16 -- not_main/not_main.go -- package not_main @@ -18,4 +22,4 @@ func main() {} -- main_two/main_two.go -- package main -func main() {} \ No newline at end of file +func main() {} diff --git a/src/cmd/go/testdata/script/build_gopath_order.txt b/src/cmd/go/testdata/script/build_gopath_order.txt index ac26c28a9f..caf25022e4 100644 --- a/src/cmd/go/testdata/script/build_gopath_order.txt +++ b/src/cmd/go/testdata/script/build_gopath_order.txt @@ -3,6 +3,7 @@ # -I arguments to compiler could end up not in GOPATH order, # leading to unexpected import resolution in the compiler. +env GO111MODULE=off env GOPATH=$WORK/p1${:}$WORK/p2 mkdir $WORK/p1/src/foo $WORK/p2/src/baz mkdir $WORK/p2/pkg/${GOOS}_${GOARCH} $WORK/p1/src/bar @@ -32,4 +33,4 @@ bad -- bar.go -- package bar import _ "baz" -import _ "foo" \ No newline at end of file +import _ "foo" diff --git a/src/cmd/go/testdata/script/build_import_comment.txt b/src/cmd/go/testdata/script/build_import_comment.txt index 0ab643914d..b500340bfb 100644 --- a/src/cmd/go/testdata/script/build_import_comment.txt +++ b/src/cmd/go/testdata/script/build_import_comment.txt @@ -1,6 +1,6 @@ -# TODO: add a go.mod file and test with GO111MODULE explicitly on and off. -# We only report the 'expects import' error when modules are disabled. -# Do we report comment parse errors or conflicts in module mode? We shouldn't. +# Test in GOPATH mode first. +env GO111MODULE=off +cd m # Import comment matches go build -n works.go @@ -17,31 +17,52 @@ stderr 'cannot parse import comment' ! go build -n conflict.go stderr 'found import comments' --- bad.go -- + +# Test in module mode. +# We ignore import comments, so these commands should succeed. +env GO111MODULE=on + +# Import comment matches +go build -n works.go + +# Import comment mismatch +go build -n wrongplace.go + +# Import comment syntax error +go build -n bad.go + +# Import comment conflict +go build -n conflict.go + +-- m/go.mod -- +module m + +go 1.16 +-- m/bad.go -- package p -import "bad" --- conflict.go -- +import "m/bad" +-- m/conflict.go -- package p -import "conflict" --- works.go -- +import "m/conflict" +-- m/works.go -- package p -import _ "works/x" --- wrongplace.go -- +import _ "m/works/x" +-- m/wrongplace.go -- package p -import "wrongplace" --- bad/bad.go -- +import "m/wrongplace" +-- m/bad/bad.go -- package bad // import --- conflict/a.go -- +-- m/conflict/a.go -- package conflict // import "a" --- conflict/b.go -- +-- m/conflict/b.go -- package conflict /* import "b" */ --- works/x/x.go -- -package x // import "works/x" --- works/x/x1.go -- +-- m/works/x/x.go -- +package x // import "m/works/x" +-- m/works/x/x1.go -- package x // important! not an import comment --- wrongplace/x.go -- +-- m/wrongplace/x.go -- package x // import "my/x" diff --git a/src/cmd/go/testdata/script/build_import_cycle.txt b/src/cmd/go/testdata/script/build_import_cycle.txt index 0154305c27..16e4e87dae 100644 --- a/src/cmd/go/testdata/script/build_import_cycle.txt +++ b/src/cmd/go/testdata/script/build_import_cycle.txt @@ -1,3 +1,6 @@ +# mod_import_cycle covers this error in module mode. +env GO111MODULE=off + ! go build selfimport stderr -count=1 'import cycle not allowed' diff --git a/src/cmd/go/testdata/script/build_internal.txt b/src/cmd/go/testdata/script/build_internal.txt index 6fcc4e02aa..25aa18cfcb 100644 --- a/src/cmd/go/testdata/script/build_internal.txt +++ b/src/cmd/go/testdata/script/build_internal.txt @@ -1,44 +1,63 @@ # Test internal package errors are handled -go list ./testinternal3 +cd testinternal3 +go list . stdout 'testinternal3' # Test internal cache -env GOPATH=$WORK/gopath/src/testinternal4 -! go build p +cd ../testinternal4 +! go build testinternal4/p stderr 'internal' # Test internal packages outside GOROOT are respected -! go build -v ./testinternal2 -stderr 'testinternal2(\/|\\)p\.go\:3\:8\: use of internal package .*internal/w not allowed' +cd ../testinternal2 +! go build -v . +stderr 'p\.go:3:8: use of internal package .*internal/w not allowed' [gccgo] skip # gccgo does not have GOROOT -! go build -v ./testinternal -stderr 'testinternal(\/|\\)p\.go\:3\:8\: use of internal package net/http/internal not allowed' +cd ../testinternal +! go build -v . +stderr 'p\.go:3:8: use of internal package net/http/internal not allowed' +-- testinternal/go.mod -- +module testinternal + +go 1.16 -- testinternal/p.go -- package p import _ "net/http/internal" +-- testinternal2/go.mod -- +module testinternal2 + +go 1.16 -- testinternal2/p.go -- package p import _ "./x/y/z/internal/w" -- testinternal2/x/y/z/internal/w/w.go -- package w +-- testinternal3/go.mod -- +module testinternal3 + +go 1.16 -- testinternal3/t.go -- package t import _ "internal/does-not-exist" --- testinternal4/src/p/p.go -- +-- testinternal4/go.mod -- +module testinternal4 + +go 1.16 +-- testinternal4/p/p.go -- package p import ( - _ "q/internal/x" - _ "q/j" + _ "testinternal4/q/internal/x" + _ "testinternal4/q/j" ) --- testinternal4/src/q/internal/x/x.go -- +-- testinternal4/q/internal/x/x.go -- package x --- testinternal4/src/q/j/j.go -- +-- testinternal4/q/j/j.go -- package j -import _ "q/internal/x" +import _ "testinternal4/q/internal/x" diff --git a/src/cmd/go/testdata/script/build_issue6480.txt b/src/cmd/go/testdata/script/build_issue6480.txt index 857f364e81..ae99c60d99 100644 --- a/src/cmd/go/testdata/script/build_issue6480.txt +++ b/src/cmd/go/testdata/script/build_issue6480.txt @@ -8,7 +8,7 @@ # Install some commands to compare mtimes env GOBIN=$WORK/tmp/bin -go install now mtime before +go install m/now m/mtime m/before # Initial builds go test -c -test.bench=XXX errors @@ -34,6 +34,10 @@ exec $GOBIN/mtime errors2.test cp stdout errors2_mod_time.txt exec $GOBIN/before start_time.txt errors2_mod_time.txt +-- go.mod -- +module m + +go 1.16 -- now/now.go -- // Writes time.Now() to a file package main @@ -122,4 +126,4 @@ func main() { fmt.Fprintf(os.Stderr, "time in %v (%v) is not before time in %v (%v)", os.Args[1], t1, os.Args[2], t2) os.Exit(1) } -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/build_link_x_import_path_escape.txt b/src/cmd/go/testdata/script/build_link_x_import_path_escape.txt index daa544d3f0..f1de1e4c71 100644 --- a/src/cmd/go/testdata/script/build_link_x_import_path_escape.txt +++ b/src/cmd/go/testdata/script/build_link_x_import_path_escape.txt @@ -4,7 +4,11 @@ go build -o linkx$GOEXE -ldflags -X=my.pkg.Text=linkXworked my.pkg/main exec ./linkx$GOEXE stderr '^linkXworked$' --- my.pkg/main/main.go -- +-- go.mod -- +module my.pkg + +go 1.16 +-- main/main.go -- package main import "my.pkg" @@ -12,7 +16,7 @@ import "my.pkg" func main() { println(pkg.Text) } --- my.pkg/pkg.go -- +-- pkg.go -- package pkg var Text = "unset" diff --git a/src/cmd/go/testdata/script/build_n_cgo.txt b/src/cmd/go/testdata/script/build_n_cgo.txt index 200d13760e..7aa77aea42 100644 --- a/src/cmd/go/testdata/script/build_n_cgo.txt +++ b/src/cmd/go/testdata/script/build_n_cgo.txt @@ -5,6 +5,10 @@ go build -n ! stderr '[/\\]\$WORK' +-- go.mod -- +module m + +go 1.16 -- main.go -- package main diff --git a/src/cmd/go/testdata/script/build_no_go.txt b/src/cmd/go/testdata/script/build_no_go.txt index 3fd7739fbb..b61d752274 100644 --- a/src/cmd/go/testdata/script/build_no_go.txt +++ b/src/cmd/go/testdata/script/build_no_go.txt @@ -16,6 +16,10 @@ stderr 'no Go files in ' ! go build ./exclude/empty stderr 'no Go files in ' +-- go.mod -- +module m + +go 1.16 -- empty/test/test_test.go -- package p -- empty/testxtest/test_test.go -- diff --git a/src/cmd/go/testdata/script/build_output.txt b/src/cmd/go/testdata/script/build_output.txt index e5a4852346..ced7cf82a6 100644 --- a/src/cmd/go/testdata/script/build_output.txt +++ b/src/cmd/go/testdata/script/build_output.txt @@ -5,7 +5,7 @@ [windows] env NONEXE='' env GOBIN=$WORK/tmp/bin -go install isarchive & +go install m/isarchive & go build x.go exists -exec x$GOEXE @@ -55,6 +55,10 @@ exec $GOBIN/isarchive myatomic.a ! go build -o whatever cmd/gofmt sync/atomic stderr 'multiple packages' +-- go.mod -- +module m + +go 1.16 -- x.go -- package main @@ -84,4 +88,4 @@ func main() { fmt.Fprintf(os.Stderr, "file %s exists but is not an archive\n", os.Args[1]) os.Exit(1) } -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/build_patterns_outside_gopath.txt b/src/cmd/go/testdata/script/build_patterns_outside_gopath.txt index f36e90fea6..6a600cfb0a 100644 --- a/src/cmd/go/testdata/script/build_patterns_outside_gopath.txt +++ b/src/cmd/go/testdata/script/build_patterns_outside_gopath.txt @@ -1,6 +1,9 @@ # Tests issue #18778 +[short] skip cd pkgs + +env GO111MODULE=off go build ./... ! stdout . go test ./... @@ -9,6 +12,10 @@ go list ./... stdout 'pkgs$' stdout 'pkgs/a' +-- pkgs/go.mod -- +module pkgs + +go 1.16 -- pkgs/a.go -- package x -- pkgs/a_test.go -- @@ -26,4 +33,4 @@ package a_test import "testing" func TestA(t *testing.T) { -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/build_plugin_non_main.txt b/src/cmd/go/testdata/script/build_plugin_non_main.txt index 996d87d961..dba80c29ad 100644 --- a/src/cmd/go/testdata/script/build_plugin_non_main.txt +++ b/src/cmd/go/testdata/script/build_plugin_non_main.txt @@ -2,16 +2,13 @@ [!linux] [!darwin] skip [!cgo] skip -go build -n testdep/p2 -! go build -buildmode=plugin testdep/p2 +go build -n testdep +! go build -buildmode=plugin testdep stderr '-buildmode=plugin requires exactly one main package' --- testdep/p1/p1.go -- -package p1 --- testdep/p1/p1_test.go -- -package p1 - -import _ "testdep/p2" --- testdep/p2/p2.go -- -package p2 +-- go.mod -- +module testdep +go 1.16 +-- testdep.go -- +package p diff --git a/src/cmd/go/testdata/script/build_test_only.txt b/src/cmd/go/testdata/script/build_test_only.txt index 54dd59772a..8693a80a08 100644 --- a/src/cmd/go/testdata/script/build_test_only.txt +++ b/src/cmd/go/testdata/script/build_test_only.txt @@ -1,14 +1,18 @@ # Named explicitly, test-only packages should be reported as # unbuildable/uninstallable, even if there is a wildcard also matching. -! go build testonly testonly... +! go build m/testonly m/testonly... stderr 'no non-test Go files in' ! go install ./testonly stderr 'no non-test Go files in' # Named through a wildcard, the test-only packages should be silently ignored. -go build testonly... +go build m/testonly... go install ./testonly... +-- go.mod -- +module m + +go 1.16 -- testonly/t_test.go -- package testonly -- testonly2/t.go -- diff --git a/src/cmd/go/testdata/script/build_vendor.txt b/src/cmd/go/testdata/script/build_vendor.txt index 726ecd75b9..f430ff2c3e 100644 --- a/src/cmd/go/testdata/script/build_vendor.txt +++ b/src/cmd/go/testdata/script/build_vendor.txt @@ -1,4 +1,5 @@ # Build +env GO111MODULE=off go build vend/x ! stdout . ! stderr . diff --git a/src/cmd/go/testdata/script/cgo_asm_error.txt b/src/cmd/go/testdata/script/cgo_asm_error.txt index e656106940..7aaa713e24 100644 --- a/src/cmd/go/testdata/script/cgo_asm_error.txt +++ b/src/cmd/go/testdata/script/cgo_asm_error.txt @@ -6,7 +6,11 @@ ! go build cgoasm stderr 'package using cgo has Go assembly file' --- cgoasm/p.go -- +-- go.mod -- +module cgoasm + +go 1.16 +-- p.go -- package p /* @@ -15,7 +19,7 @@ package p import "C" func F() {} --- cgoasm/p.s -- +-- p.s -- TEXT asm(SB),$0 RET diff --git a/src/cmd/go/testdata/script/cgo_bad_directives.txt b/src/cmd/go/testdata/script/cgo_bad_directives.txt index 358284ffec..6bf3beb8e4 100644 --- a/src/cmd/go/testdata/script/cgo_bad_directives.txt +++ b/src/cmd/go/testdata/script/cgo_bad_directives.txt @@ -1,58 +1,57 @@ [!cgo] skip [short] skip -mkdir x -cp x.go.txt x/x.go +cp x.go.txt x.go # Only allow //go:cgo_ldflag .* in cgo-generated code -[gc] cp x_gc.go.txt x/x.go +[gc] cp x_gc.go.txt x.go [gc] ! go build x [gc] stderr '//go:cgo_ldflag .* only allowed in cgo-generated code' # Ignore _* files -rm x/x.go -! go build x +rm x.go +! go build . stderr 'no Go files' -cp cgo_yy.go.txt x/_cgo_yy.go -! go build x +cp cgo_yy.go.txt _cgo_yy.go +! go build . stderr 'no Go files' #_* files are ignored... -[gc] ! go build x/_cgo_yy.go # ... but if forced, the comment is rejected +[gc] ! go build _cgo_yy.go # ... but if forced, the comment is rejected # Actually, today there is a separate issue that _ files named # on the command line are ignored. Once that is fixed, # we want to see the cgo_ldflag error. [gc] stderr '//go:cgo_ldflag only allowed in cgo-generated code|no Go files' -rm x/_cgo_yy.go +rm _cgo_yy.go # Reject #cgo CFLAGS: -fplugin=foo.so -cp x.go.txt x/x.go -cp y_fplugin.go.txt x/y.go +cp x.go.txt x.go +cp y_fplugin.go.txt y.go ! go build x stderr 'invalid flag in #cgo CFLAGS: -fplugin=foo.so' # Reject #cgo CFLAGS: -lbar -fplugin=foo.so -cp y_lbar_fplugin.go.txt x/y.go +cp y_lbar_fplugin.go.txt y.go ! go build x stderr 'invalid flag in #cgo CFLAGS: -fplugin=foo.so' # Reject #cgo pkg-config: -foo -cp y_pkgconfig_dash_foo.txt x/y.go +cp y_pkgconfig_dash_foo.txt y.go ! go build x stderr 'invalid pkg-config package name: -foo' # Reject #cgo pkg-config: @foo -cp y_pkgconfig_at_foo.txt x/y.go +cp y_pkgconfig_at_foo.txt y.go ! go build x stderr 'invalid pkg-config package name: @foo' # Reject #cgo CFLAGS: @foo -cp y_cflags_at_foo.txt x/y.go +cp y_cflags_at_foo.txt y.go ! go build x stderr 'invalid flag in #cgo CFLAGS: @foo' # Reject #cgo CFLAGS: -D -cp y_cflags_dash_d.txt x/y.go +cp y_cflags_dash_d.txt y.go ! go build x stderr 'invalid flag in #cgo CFLAGS: -D without argument' @@ -60,21 +59,25 @@ stderr 'invalid flag in #cgo CFLAGS: -D without argument' # before the check is applied. There's no such rewrite for -D. # Reject #cgo CFLAGS: -D @foo -cp y_cflags_dash_d_space_at_foo.txt x/y.go +cp y_cflags_dash_d_space_at_foo.txt y.go ! go build x stderr 'invalid flag in #cgo CFLAGS: -D @foo' # Reject #cgo CFLAGS -D@foo -cp y_cflags_dash_d_at_foo.txt x/y.go +cp y_cflags_dash_d_at_foo.txt y.go ! go build x stderr 'invalid flag in #cgo CFLAGS: -D@foo' # Check for CFLAGS in commands env CGO_CFLAGS=-D@foo -cp y_no_cflags.txt x/y.go +cp y_no_cflags.txt y.go go build -n x stderr '-D@foo' +-- go.mod -- +module x + +go 1.16 -- x_gc.go.txt -- package x @@ -123,4 +126,4 @@ package x import "C" -- y_no_cflags.txt -- package x -import "C" \ No newline at end of file +import "C" diff --git a/src/cmd/go/testdata/script/cgo_depends_on_syscall.txt b/src/cmd/go/testdata/script/cgo_depends_on_syscall.txt index e5fa84fdbb..bd4777c821 100644 --- a/src/cmd/go/testdata/script/cgo_depends_on_syscall.txt +++ b/src/cmd/go/testdata/script/cgo_depends_on_syscall.txt @@ -4,7 +4,11 @@ go list -race -deps foo stdout syscall --- foo/foo.go -- +-- go.mod -- +module foo + +go 1.16 +-- foo.go -- package foo // #include diff --git a/src/cmd/go/testdata/script/cover_asm.txt b/src/cmd/go/testdata/script/cover_asm.txt index 5241c7f0df..57f76d6c02 100644 --- a/src/cmd/go/testdata/script/cover_asm.txt +++ b/src/cmd/go/testdata/script/cover_asm.txt @@ -8,7 +8,11 @@ go tool cover -func=$WORK/cover.out stdout '\tg\t*100.0%' # Check g is 100% covered. ! stdout '\tf\t*[0-9]' # Check for no coverage on the assembly function --- coverasm/p.go -- +-- go.mod -- +module coverasm + +go 1.16 +-- p.go -- package p func f() @@ -16,10 +20,10 @@ func f() func g() { println("g") } --- coverasm/p.s -- +-- p.s -- // empty asm file, // so go test doesn't complain about declaration of f in p.go. --- coverasm/p_test.go -- +-- p_test.go -- package p import "testing" diff --git a/src/cmd/go/testdata/script/cover_blank_func_decl.txt b/src/cmd/go/testdata/script/cover_blank_func_decl.txt index 6fac4f87ea..e7d5250468 100644 --- a/src/cmd/go/testdata/script/cover_blank_func_decl.txt +++ b/src/cmd/go/testdata/script/cover_blank_func_decl.txt @@ -1,9 +1,13 @@ [short] skip -go test -cover ./coverblank +go test -cover coverblank stdout 'coverage: 100.0% of statements' --- coverblank/a.go -- +-- go.mod -- +module coverblank + +go 1.16 +-- a.go -- package coverblank func _() { @@ -20,7 +24,7 @@ func (x X) _() { println("unreachable") } --- coverblank/a_test.go -- +-- a_test.go -- package coverblank import "testing" diff --git a/src/cmd/go/testdata/script/cover_cgo.txt b/src/cmd/go/testdata/script/cover_cgo.txt index fdd0191ee0..9cf78f71e9 100644 --- a/src/cmd/go/testdata/script/cover_cgo.txt +++ b/src/cmd/go/testdata/script/cover_cgo.txt @@ -8,7 +8,11 @@ go test -short -cover cgocover stdout 'coverage:.*[1-9][0-9.]+%' ! stderr '[^0-9]0\.0%' --- cgocover/p.go -- +-- go.mod -- +module cgocover + +go 1.16 +-- p.go -- package p /* @@ -28,7 +32,7 @@ func F() { } C.f() } --- cgocover/p_test.go -- +-- p_test.go -- package p import "testing" diff --git a/src/cmd/go/testdata/script/cover_cgo_extra_file.txt b/src/cmd/go/testdata/script/cover_cgo_extra_file.txt index 483813bd6a..c53b979f9f 100644 --- a/src/cmd/go/testdata/script/cover_cgo_extra_file.txt +++ b/src/cmd/go/testdata/script/cover_cgo_extra_file.txt @@ -9,9 +9,13 @@ go test -short -cover cgocover4 stdout 'coverage:.*[1-9][0-9.]+%' ! stderr '[^0-9]0\.0%' --- cgocover4/notcgo.go -- +-- go.mod -- +module cgocover4 + +go 1.16 +-- notcgo.go -- package p --- cgocover4/p.go -- +-- p.go -- package p /* @@ -31,7 +35,7 @@ func F() { } C.f() } --- cgocover4/x_test.go -- +-- x_test.go -- package p_test import ( @@ -41,4 +45,4 @@ import ( func TestF(t *testing.T) { F() -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/cover_cgo_extra_test.txt b/src/cmd/go/testdata/script/cover_cgo_extra_test.txt index 92fc1ebdda..b501ab02a5 100644 --- a/src/cmd/go/testdata/script/cover_cgo_extra_test.txt +++ b/src/cmd/go/testdata/script/cover_cgo_extra_test.txt @@ -10,7 +10,11 @@ go test -short -cover cgocover3 stdout 'coverage:.*[1-9][0-9.]+%' ! stderr '[^0-9]0\.0%' --- cgocover3/p.go -- +-- go.mod -- +module cgocover3 + +go 1.16 +-- p.go -- package p /* @@ -30,9 +34,9 @@ func F() { } C.f() } --- cgocover3/p_test.go -- +-- p_test.go -- package p --- cgocover3/x_test.go -- +-- x_test.go -- package p_test import ( @@ -42,4 +46,4 @@ import ( func TestF(t *testing.T) { F() -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/cover_cgo_xtest.txt b/src/cmd/go/testdata/script/cover_cgo_xtest.txt index edf8112728..79cc08c481 100644 --- a/src/cmd/go/testdata/script/cover_cgo_xtest.txt +++ b/src/cmd/go/testdata/script/cover_cgo_xtest.txt @@ -8,7 +8,11 @@ go test -short -cover cgocover2 stdout 'coverage:.*[1-9][0-9.]+%' ! stderr '[^0-9]0\.0%' --- cgocover2/p.go -- +-- go.mod -- +module cgocover2 + +go 1.16 +-- p.go -- package p /* @@ -28,7 +32,7 @@ func F() { } C.f() } --- cgocover2/x_test.go -- +-- x_test.go -- package p_test import ( @@ -38,4 +42,4 @@ import ( func TestF(t *testing.T) { F() -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/cover_dash_c.txt b/src/cmd/go/testdata/script/cover_dash_c.txt index 61793cec49..8950f8d088 100644 --- a/src/cmd/go/testdata/script/cover_dash_c.txt +++ b/src/cmd/go/testdata/script/cover_dash_c.txt @@ -6,18 +6,22 @@ go test -c -o $WORK/coverdep -coverprofile=$WORK/no/such/dir/cover.out coverdep exists -exec $WORK/coverdep --- coverdep/p.go -- +-- go.mod -- +module coverdep + +go 1.16 +-- p.go -- package p import _ "coverdep/p1" func F() { } --- coverdep/p1/p1.go -- +-- p1/p1.go -- package p1 import _ "errors" --- coverdep/p_test.go -- +-- p_test.go -- package p import "testing" diff --git a/src/cmd/go/testdata/script/cover_dep_loop.txt b/src/cmd/go/testdata/script/cover_dep_loop.txt index 20b0c15d18..36ea6e00b3 100644 --- a/src/cmd/go/testdata/script/cover_dep_loop.txt +++ b/src/cmd/go/testdata/script/cover_dep_loop.txt @@ -7,11 +7,15 @@ go test -short -cover coverdep2/p1 stdout 'coverage: 100.0% of statements' # expect 100.0% coverage --- coverdep2/p1/p.go -- +-- go.mod -- +module coverdep2 + +go 1.16 +-- p1/p.go -- package p1 func F() int { return 1 } --- coverdep2/p1/p_test.go -- +-- p1/p_test.go -- package p1_test import ( @@ -22,7 +26,7 @@ import ( func Test(t *testing.T) { p2.F() } --- coverdep2/p2/p2.go -- +-- p2/p2.go -- package p2 import "coverdep2/p1" diff --git a/src/cmd/go/testdata/script/cover_dot_import.txt b/src/cmd/go/testdata/script/cover_dot_import.txt index e07be22d6c..d492e42e2a 100644 --- a/src/cmd/go/testdata/script/cover_dot_import.txt +++ b/src/cmd/go/testdata/script/cover_dot_import.txt @@ -1,22 +1,26 @@ [short] skip [gccgo] skip # gccgo has no cover tool -go test -coverpkg=coverdot1,coverdot2 coverdot2 +go test -coverpkg=coverdot/a,coverdot/b coverdot/b ! stderr '[^0-9]0\.0%' ! stdout '[^0-9]0\.0%' --- coverdot1/p.go -- -package coverdot1 +-- go.mod -- +module coverdot + +go 1.16 +-- a/a.go -- +package a func F() {} --- coverdot2/p.go -- -package coverdot2 +-- b/b.go -- +package b -import . "coverdot1" +import . "coverdot/a" func G() { F() } --- coverdot2/p_test.go -- -package coverdot2 +-- b/b_test.go -- +package b import "testing" diff --git a/src/cmd/go/testdata/script/cover_error.txt b/src/cmd/go/testdata/script/cover_error.txt index 6ba0f08a2b..4abdf1137a 100644 --- a/src/cmd/go/testdata/script/cover_error.txt +++ b/src/cmd/go/testdata/script/cover_error.txt @@ -5,8 +5,8 @@ # Get errors from a go test into stderr.txt ! go test coverbad -stderr 'coverbad[\\/]p\.go:4' # look for error at coverbad/p.go:4 -[cgo] stderr 'coverbad[\\/]p1\.go:6' # look for error at coverbad/p.go:6 +stderr 'p\.go:4' # look for error at coverbad/p.go:4 +[cgo] stderr 'p1\.go:6' # look for error at coverbad/p.go:6 ! stderr $WORK # make sure temporary directory isn't in error cp stderr $WORK/stderr.txt @@ -24,13 +24,17 @@ wait # for go run above cmp $WORK/stderr.txt $WORK/stderr2.txt --- coverbad/p.go -- +-- go.mod -- +module coverbad + +go 1.16 +-- p.go -- package p func f() { g() } --- coverbad/p1.go -- +-- p1.go -- package p import "C" @@ -38,13 +42,15 @@ import "C" func h() { j() } --- coverbad/p_test.go -- +-- p_test.go -- package p import "testing" func Test(t *testing.T) {} -- clean_charpos.go -- +// +build ignore + package main import ( @@ -66,4 +72,4 @@ func main() { if err != nil { log.Fatal(err) } -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/cover_import_main_loop.txt b/src/cmd/go/testdata/script/cover_import_main_loop.txt index 83eef0c8a8..eb6de6778a 100644 --- a/src/cmd/go/testdata/script/cover_import_main_loop.txt +++ b/src/cmd/go/testdata/script/cover_import_main_loop.txt @@ -5,15 +5,19 @@ stderr 'not an importable package' # check that import main was detected ! go test -n -cover importmain/test stderr 'not an importable package' # check that import main was detected --- importmain/ismain/main.go -- +-- go.mod -- +module importmain + +go 1.16 +-- ismain/main.go -- package main import _ "importmain/test" func main() {} --- importmain/test/test.go -- +-- test/test.go -- package test --- importmain/test/test_test.go -- +-- test/test_test.go -- package test_test import "testing" diff --git a/src/cmd/go/testdata/script/cover_pattern.txt b/src/cmd/go/testdata/script/cover_pattern.txt index 0b7f2d70a2..ec0850c003 100644 --- a/src/cmd/go/testdata/script/cover_pattern.txt +++ b/src/cmd/go/testdata/script/cover_pattern.txt @@ -1,12 +1,16 @@ [gccgo] skip -# If coverpkg=sleepy... expands by package loading +# If coverpkg=m/sleepy... expands by package loading # (as opposed to pattern matching on deps) # then it will try to load sleepybad, which does not compile, # and the test command will fail. -! go list sleepy... -go test -c -n -coverprofile=$TMPDIR/cover.out -coverpkg=sleepy... -run=^$ sleepy1 +! go list m/sleepy... +go test -c -n -coverprofile=$TMPDIR/cover.out -coverpkg=m/sleepy... -run=^$ m/sleepy1 +-- go.mod -- +module m + +go 1.16 -- sleepy1/p_test.go -- package p diff --git a/src/cmd/go/testdata/script/cover_statements.txt b/src/cmd/go/testdata/script/cover_statements.txt index 314ea6bead..4f3c9ca2f2 100644 --- a/src/cmd/go/testdata/script/cover_statements.txt +++ b/src/cmd/go/testdata/script/cover_statements.txt @@ -5,6 +5,10 @@ stdout 'pkg2 \S+ coverage: 0.0% of statements \[no tests to run\]' stdout 'pkg3 \S+ coverage: 100.0% of statements' stdout 'pkg4 \S+ coverage: \[no statements\]' +-- go.mod -- +module m + +go 1.16 -- pkg1/a.go -- package pkg1 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 769c03ea83..433af9ab73 100644 --- a/src/cmd/go/testdata/script/cover_sync_atomic_import.txt +++ b/src/cmd/go/testdata/script/cover_sync_atomic_import.txt @@ -3,22 +3,26 @@ go test -short -cover -covermode=atomic -coverpkg=coverdep/p1 coverdep --- coverdep/p.go -- +-- go.mod -- +module coverdep + +go 1.16 +-- p.go -- package p import _ "coverdep/p1" func F() { } --- coverdep/p1/p1.go -- +-- p1/p1.go -- package p1 import _ "errors" --- coverdep/p_test.go -- +-- p_test.go -- package p import "testing" func Test(t *testing.T) { F() -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/generate_bad_imports.txt b/src/cmd/go/testdata/script/generate_bad_imports.txt index 59a2f5786b..4d31573d56 100644 --- a/src/cmd/go/testdata/script/generate_bad_imports.txt +++ b/src/cmd/go/testdata/script/generate_bad_imports.txt @@ -3,7 +3,11 @@ go generate gencycle stdout 'hello world' # check go generate gencycle ran the generator --- gencycle/gencycle.go -- +-- go.mod -- +module gencycle + +go 1.16 +-- gencycle.go -- //go:generate echo hello world package gencycle diff --git a/src/cmd/go/testdata/script/generate_invalid.txt b/src/cmd/go/testdata/script/generate_invalid.txt index 62aa9dd9ba..e18e62ccf3 100644 --- a/src/cmd/go/testdata/script/generate_invalid.txt +++ b/src/cmd/go/testdata/script/generate_invalid.txt @@ -54,6 +54,10 @@ func main() { fmt.Println() } +-- go.mod -- +module m + +go 1.16 -- nogo/foo.txt -- Text file in a directory without go files. Go generate should ignore this directory. @@ -196,4 +200,4 @@ import "bar" package importerr import "moo" -//go:generate echo Success c \ No newline at end of file +//go:generate echo Success c 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 743fbb3ea4..cda25e12b0 100644 --- a/src/cmd/go/testdata/script/get_custom_domain_wildcard.txt +++ b/src/cmd/go/testdata/script/get_custom_domain_wildcard.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off go get -u rsc.io/pdf/... -exists $GOPATH/bin/pdfpasswd$GOEXE \ No newline at end of file +exists $GOPATH/bin/pdfpasswd$GOEXE diff --git a/src/cmd/go/testdata/script/get_dash_t.txt b/src/cmd/go/testdata/script/get_dash_t.txt index be5c8dd5ca..baac916868 100644 --- a/src/cmd/go/testdata/script/get_dash_t.txt +++ b/src/cmd/go/testdata/script/get_dash_t.txt @@ -2,7 +2,8 @@ [!net] skip [!exec: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 ... -stdout 'x/build/gerrit' \ No newline at end of file +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 c2e9db35ec..918784869b 100644 --- a/src/cmd/go/testdata/script/get_domain_root.txt +++ b/src/cmd/go/testdata/script/get_domain_root.txt @@ -3,6 +3,7 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off # go-get-issue-9357.appspot.com is running # the code at github.com/rsc/go-get-issue-9357, @@ -16,4 +17,4 @@ rm $GOPATH/src/go-get-issue-9357.appspot.com go get go-get-issue-9357.appspot.com rm $GOPATH/src/go-get-issue-9357.appspot.com -go get -u go-get-issue-9357.appspot.com \ No newline at end of file +go get -u go-get-issue-9357.appspot.com 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 0396e1b278..dbaf46ced3 100644 --- a/src/cmd/go/testdata/script/get_dot_slash_download.txt +++ b/src/cmd/go/testdata/script/get_dot_slash_download.txt @@ -1,9 +1,10 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off # Tests Issues #9797 and #19769 mkdir $WORK/tmp/src/rsc.io env GOPATH=$WORK/tmp cd $WORK/tmp/src/rsc.io -go get ./pprof_mac_fix \ No newline at end of file +go get ./pprof_mac_fix diff --git a/src/cmd/go/testdata/script/get_goroot.txt b/src/cmd/go/testdata/script/get_goroot.txt index 49f1a174d0..929435ad70 100644 --- a/src/cmd/go/testdata/script/get_goroot.txt +++ b/src/cmd/go/testdata/script/get_goroot.txt @@ -1,4 +1,5 @@ [!net] skip +env GO111MODULE=off # Issue 4186. go get cannot be used to download packages to $GOROOT. # Test that without GOPATH set, go get should fail. @@ -49,4 +50,4 @@ stderr '\$GOPATH not set' env GOPATH= env GOROOT=$WORK/home/go/ ! go get -d github.com/golang/example/hello -stderr '\$GOPATH not set' \ No newline at end of file +stderr '\$GOPATH not set' 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 c0439fb037..a4a6fd428f 100644 --- a/src/cmd/go/testdata/script/get_insecure_custom_domain.txt +++ b/src/cmd/go/testdata/script/get_insecure_custom_domain.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off ! go get -d insecure.go-get-issue-15410.appspot.com/pkg/p -go get -d -insecure insecure.go-get-issue-15410.appspot.com/pkg/p \ No newline at end of file +go get -d -insecure insecure.go-get-issue-15410.appspot.com/pkg/p diff --git a/src/cmd/go/testdata/script/get_insecure_update.txt b/src/cmd/go/testdata/script/get_insecure_update.txt index 792c868151..4511c98c56 100644 --- a/src/cmd/go/testdata/script/get_insecure_update.txt +++ b/src/cmd/go/testdata/script/get_insecure_update.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off # Clone the repo via HTTP manually. exec git clone -q http://github.com/golang/example github.com/golang/example @@ -8,4 +9,4 @@ exec git clone -q http://github.com/golang/example github.com/golang/example # Update with -insecure should succeed. # We need -f to ignore import comments. ! go get -d -u -f github.com/golang/example/hello -go get -d -u -f -insecure github.com/golang/example/hello \ No newline at end of file +go get -d -u -f -insecure github.com/golang/example/hello diff --git a/src/cmd/go/testdata/script/get_internal_wildcard.txt b/src/cmd/go/testdata/script/get_internal_wildcard.txt index 82bb0d5ba5..ff20d4ba04 100644 --- a/src/cmd/go/testdata/script/get_internal_wildcard.txt +++ b/src/cmd/go/testdata/script/get_internal_wildcard.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off # This used to fail with errors about internal packages -go get github.com/rsc/go-get-issue-11960/... \ No newline at end of file +go get github.com/rsc/go-get-issue-11960/... diff --git a/src/cmd/go/testdata/script/get_issue11307.txt b/src/cmd/go/testdata/script/get_issue11307.txt index da7704dee5..9d6b7dde01 100644 --- a/src/cmd/go/testdata/script/get_issue11307.txt +++ b/src/cmd/go/testdata/script/get_issue11307.txt @@ -2,7 +2,8 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off env GOPATH=$WORK/tmp/gopath go get github.com/rsc/go-get-issue-11307 -go get -u github.com/rsc/go-get-issue-11307 # was failing \ No newline at end of file +go get -u github.com/rsc/go-get-issue-11307 # was failing diff --git a/src/cmd/go/testdata/script/mod_get_legacy.txt b/src/cmd/go/testdata/script/get_legacy.txt similarity index 97% rename from src/cmd/go/testdata/script/mod_get_legacy.txt rename to src/cmd/go/testdata/script/get_legacy.txt index 28a820e97b..938d42868a 100644 --- a/src/cmd/go/testdata/script/mod_get_legacy.txt +++ b/src/cmd/go/testdata/script/get_legacy.txt @@ -5,6 +5,7 @@ [short] skip [!exec:git] skip +env GO111MODULE=off env GOPATH=$WORK/tmp/d1 go get vcs-test.golang.org/git/modlegacy1-old.git/p1 @@ -54,4 +55,4 @@ rm $GOPATH go get github.com/rsc/vgotest5 github.com/myitcv/vgo_example_compat github.com/rsc/vgotest4 rm $GOPATH -go get github.com/rsc/vgotest5 github.com/rsc/vgotest4 github.com/myitcv/vgo_example_compat \ No newline at end of file +go get github.com/rsc/vgotest5 github.com/rsc/vgotest4 github.com/myitcv/vgo_example_compat diff --git a/src/cmd/go/testdata/script/get_race.txt b/src/cmd/go/testdata/script/get_race.txt index 8b34c9596c..16a560afca 100644 --- a/src/cmd/go/testdata/script/get_race.txt +++ b/src/cmd/go/testdata/script/get_race.txt @@ -3,5 +3,6 @@ [!net] skip [!exec:git] skip [!race] skip +env GO111MODULE=off -go get -race github.com/rsc/go-get-issue-9224-cmd \ No newline at end of file +go get -race github.com/rsc/go-get-issue-9224-cmd diff --git a/src/cmd/go/testdata/script/get_test_only.txt b/src/cmd/go/testdata/script/get_test_only.txt index 7437c30e77..a3f38ddbab 100644 --- a/src/cmd/go/testdata/script/get_test_only.txt +++ b/src/cmd/go/testdata/script/get_test_only.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off go get golang.org/x/tour/content... -go get -t golang.org/x/tour/content... \ No newline at end of file +go get -t golang.org/x/tour/content... diff --git a/src/cmd/go/testdata/script/get_update.txt b/src/cmd/go/testdata/script/get_update.txt index df889c49b0..9afce6a443 100644 --- a/src/cmd/go/testdata/script/get_update.txt +++ b/src/cmd/go/testdata/script/get_update.txt @@ -4,6 +4,7 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off # Rewind go get github.com/rsc/go-get-issue-9224-cmd @@ -21,4 +22,4 @@ exec git reset --hard HEAD~ cd $GOPATH/src # (Again with -d -u) Run get -go get -d -u 'github.com/rsc/go-get-issue-9224-cmd' \ No newline at end of file +go get -d -u 'github.com/rsc/go-get-issue-9224-cmd' 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 85c2e24bc8..b00adea70b 100644 --- a/src/cmd/go/testdata/script/get_update_unknown_protocol.txt +++ b/src/cmd/go/testdata/script/get_update_unknown_protocol.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off # Clone the repo via HTTPS manually. exec git clone -q https://github.com/golang/example github.com/golang/example @@ -10,4 +11,4 @@ cd github.com/golang/example exec git remote set-url origin xyz://github.com/golang/example exec git config --local url.https://github.com/.insteadOf xyz://github.com/ -go get -d -u -f github.com/golang/example/hello \ No newline at end of file +go get -d -u -f github.com/golang/example/hello diff --git a/src/cmd/go/testdata/script/get_update_wildcard.txt b/src/cmd/go/testdata/script/get_update_wildcard.txt index bfa47a2a4c..4e66004014 100644 --- a/src/cmd/go/testdata/script/get_update_wildcard.txt +++ b/src/cmd/go/testdata/script/get_update_wildcard.txt @@ -2,6 +2,7 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off go get github.com/tmwh/go-get-issue-14450/a ! go get -u .../ @@ -12,4 +13,4 @@ exists github.com/tmwh/go-get-issue-14450/b exists github.com/tmwh/go-get-issue-14450-b-dependency/c exists github.com/tmwh/go-get-issue-14450-b-dependency/d -! exists github.com/tmwh/go-get-issue-14450-c-dependency/e \ No newline at end of file +! exists github.com/tmwh/go-get-issue-14450-c-dependency/e diff --git a/src/cmd/go/testdata/script/get_vcs_error_message.txt b/src/cmd/go/testdata/script/get_vcs_error_message.txt index e2404cc8d9..8dc84fc727 100644 --- a/src/cmd/go/testdata/script/get_vcs_error_message.txt +++ b/src/cmd/go/testdata/script/get_vcs_error_message.txt @@ -1,4 +1,5 @@ # Test that the Version Control error message includes the correct directory +env GO111MODULE=off ! go get -u foo stderr gopath(\\\\|/)src(\\\\|/)foo diff --git a/src/cmd/go/testdata/script/get_vendor.txt b/src/cmd/go/testdata/script/get_vendor.txt index a6f0a70c48..4ebb8a26b6 100644 --- a/src/cmd/go/testdata/script/get_vendor.txt +++ b/src/cmd/go/testdata/script/get_vendor.txt @@ -1,4 +1,5 @@ [short] skip +env GO111MODULE=off cd $GOPATH/src/v go run m.go @@ -91,4 +92,4 @@ func TestNothing(t *testing.T) { } -- v/vendor/vendor.org/p/p.go -- package p -const C = 1 \ No newline at end of file +const C = 1 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 5096195c70..22e6048e96 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,5 @@ [!net] skip +env GO111MODULE=off # Issue 17119: Test more duplicate load errors. ! go build dupload diff --git a/src/cmd/go/testdata/script/install_cgo_excluded.txt b/src/cmd/go/testdata/script/install_cgo_excluded.txt index fa1fcd67a4..5a2b46030f 100644 --- a/src/cmd/go/testdata/script/install_cgo_excluded.txt +++ b/src/cmd/go/testdata/script/install_cgo_excluded.txt @@ -3,7 +3,11 @@ env CGO_ENABLED=0 ! go install cgotest stderr 'build constraints exclude all Go files' --- cgotest/m.go -- +-- go.mod -- +module cgotest + +go 1.16 +-- m.go -- package cgotest import "C" diff --git a/src/cmd/go/testdata/script/install_relative_gobin_fail.txt b/src/cmd/go/testdata/script/install_relative_gobin_fail.txt index e1e9ec7bdf..aa145249c5 100644 --- a/src/cmd/go/testdata/script/install_relative_gobin_fail.txt +++ b/src/cmd/go/testdata/script/install_relative_gobin_fail.txt @@ -2,7 +2,11 @@ env GOBIN=. ! go install stderr 'cannot install, GOBIN must be an absolute path' +-- go.mod -- +module triv + +go 1.16 -- triv.go -- package main -func main() {} \ No newline at end of file +func main() {} diff --git a/src/cmd/go/testdata/script/install_shadow_gopath.txt b/src/cmd/go/testdata/script/install_shadow_gopath.txt index 995162172e..2039d9e7f2 100644 --- a/src/cmd/go/testdata/script/install_shadow_gopath.txt +++ b/src/cmd/go/testdata/script/install_shadow_gopath.txt @@ -3,6 +3,7 @@ [!net] skip +env GO111MODULE=off env GOPATH=$WORK/gopath1${:}$WORK/gopath2 mkdir $WORK/gopath1/src/test @@ -16,4 +17,4 @@ stderr 'no install location for.*gopath2.src.test: hidden by .*gopath1.src.test' -- main.go -- package main -func main() {} \ No newline at end of file +func main() {} diff --git a/src/cmd/go/testdata/script/link_syso_issue33139.txt b/src/cmd/go/testdata/script/link_syso_issue33139.txt index 46b0ef4200..d4f0b87537 100644 --- a/src/cmd/go/testdata/script/link_syso_issue33139.txt +++ b/src/cmd/go/testdata/script/link_syso_issue33139.txt @@ -15,6 +15,10 @@ cc -c -o syso/objTestImpl.syso syso/src/objTestImpl.c go build -ldflags='-linkmode=external' ./cmd/main.go +-- go.mod -- +module m + +go 1.16 -- syso/objTest.s -- #include "textflag.h" @@ -36,7 +40,7 @@ void objTestImpl() { /* Empty */ } -- cmd/main.go -- package main -import "syso" +import "m/syso" func main() { syso.ObjTest() diff --git a/src/cmd/go/testdata/script/list_case_collision.txt b/src/cmd/go/testdata/script/list_case_collision.txt index 73f44b63a0..181a202989 100644 --- a/src/cmd/go/testdata/script/list_case_collision.txt +++ b/src/cmd/go/testdata/script/list_case_collision.txt @@ -8,30 +8,34 @@ stderr 'case-insensitive import collision' # List files explicitly on command line, to encounter case-checking # logic even on case-insensitive filesystems. -cp example/b/file.go example/b/FILE.go # no-op on case-insensitive filesystems -! go list example/b/file.go example/b/FILE.go +cp b/file.go b/FILE.go # no-op on case-insensitive filesystems +! go list b/file.go b/FILE.go stderr 'case-insensitive file name collision' -mkdir example/a/Pkg # no-op on case-insensitive filesystems -cp example/a/pkg/pkg.go example/a/Pkg/pkg.go # no-op on case-insensitive filesystems +mkdir a/Pkg # no-op on case-insensitive filesystems +cp a/pkg/pkg.go a/Pkg/pkg.go # no-op on case-insensitive filesystems ! go list example/a/pkg example/a/Pkg # Test that the path reported with an indirect import is correct. -cp example/b/file.go example/b/FILE.go +cp b/file.go b/FILE.go [case-sensitive] ! go build example/c [case-sensitive] stderr '^package example/c\n\timports example/b: case-insensitive file name collision: "FILE.go" and "file.go"$' --- example/a/a.go -- +-- go.mod -- +module example + +go 1.16 +-- a/a.go -- package p import ( _ "example/a/pkg" _ "example/a/Pkg" ) --- example/a/pkg/pkg.go -- +-- a/pkg/pkg.go -- package pkg --- example/b/file.go -- +-- b/file.go -- package b --- example/c/c.go -- +-- c/c.go -- package c import _ "example/b" diff --git a/src/cmd/go/testdata/script/list_dedup_packages.txt b/src/cmd/go/testdata/script/list_dedup_packages.txt index ebd497b7e5..30c68dd77f 100644 --- a/src/cmd/go/testdata/script/list_dedup_packages.txt +++ b/src/cmd/go/testdata/script/list_dedup_packages.txt @@ -1,4 +1,5 @@ # Setup +env GO111MODULE=off mkdir $WORK/tmp/testdata/src/xtestonly cp f.go $WORK/tmp/testdata/src/xtestonly/f.go cp f_test.go $WORK/tmp/testdata/src/xtestonly/f_test.go diff --git a/src/cmd/go/testdata/script/list_symlink.txt b/src/cmd/go/testdata/script/list_symlink.txt index 20c85b6453..f74ca86f37 100644 --- a/src/cmd/go/testdata/script/list_symlink.txt +++ b/src/cmd/go/testdata/script/list_symlink.txt @@ -1,4 +1,5 @@ [!symlink] skip +env GO111MODULE=off mkdir $WORK/tmp/src symlink $WORK/tmp/src/dir1 -> $WORK/tmp diff --git a/src/cmd/go/testdata/script/list_symlink_internal.txt b/src/cmd/go/testdata/script/list_symlink_internal.txt index e538072b33..f756a56a3f 100644 --- a/src/cmd/go/testdata/script/list_symlink_internal.txt +++ b/src/cmd/go/testdata/script/list_symlink_internal.txt @@ -1,4 +1,5 @@ [!symlink] skip +env GO111MODULE=off mkdir $WORK/tmp/gopath/src/dir1/internal/v cp p.go $WORK/tmp/gopath/src/dir1/p.go @@ -23,4 +24,4 @@ import _ `dir1/internal/v` func main() {} -- v.go -- -package v \ No newline at end of file +package v diff --git a/src/cmd/go/testdata/script/list_symlink_vendor_issue14054.txt b/src/cmd/go/testdata/script/list_symlink_vendor_issue14054.txt index 68b7fd948b..8e63a5a259 100644 --- a/src/cmd/go/testdata/script/list_symlink_vendor_issue14054.txt +++ b/src/cmd/go/testdata/script/list_symlink_vendor_issue14054.txt @@ -1,4 +1,5 @@ [!symlink] skip +env GO111MODULE=off mkdir $WORK/tmp/gopath/src/dir1/vendor/v cp p.go $WORK/tmp/gopath/src/dir1/p.go @@ -24,4 +25,4 @@ import _ `v` func main () {} -- v.go -- -package v \ No newline at end of file +package v diff --git a/src/cmd/go/testdata/script/list_symlink_vendor_issue15201.txt b/src/cmd/go/testdata/script/list_symlink_vendor_issue15201.txt index 98921614a9..19f2138250 100644 --- a/src/cmd/go/testdata/script/list_symlink_vendor_issue15201.txt +++ b/src/cmd/go/testdata/script/list_symlink_vendor_issue15201.txt @@ -1,4 +1,5 @@ [!symlink] skip +env GO111MODULE=off mkdir $WORK/tmp/gopath/src/x/y/_vendor/src/x symlink $WORK/tmp/gopath/src/x/y/_vendor/src/x/y -> ../../.. @@ -17,4 +18,4 @@ package w import "x/y/z" -- z.go -- -package z \ No newline at end of file +package z diff --git a/src/cmd/go/testdata/script/list_test_simple.txt b/src/cmd/go/testdata/script/list_test_simple.txt index 862b7a8fbb..954897c663 100644 --- a/src/cmd/go/testdata/script/list_test_simple.txt +++ b/src/cmd/go/testdata/script/list_test_simple.txt @@ -1,21 +1,23 @@ [short] skip -cd $WORK - # Test -go test './gopath/src/testlist/...' -list=Test +go test -list=Test stdout TestSimple # Benchmark -go test './gopath/src/testlist/...' -list=Benchmark +go test -list=Benchmark stdout BenchmarkSimple # Examples -go test './gopath/src/testlist/...' -list=Example +go test -list=Example stdout ExampleSimple stdout ExampleWithEmptyOutput --- testlist/bench_test.go -- +-- go.mod -- +module m + +go 1.16 +-- bench_test.go -- package testlist import ( @@ -30,7 +32,7 @@ func BenchmarkSimplefunc(b *testing.B) { _ = fmt.Sprint("Test for bench") } } --- testlist/example_test.go -- +-- example_test.go -- package testlist import ( @@ -52,7 +54,7 @@ func ExampleWithEmptyOutput() { func ExampleNoOutput() { _ = fmt.Sprint("Test with no output") } --- testlist/test_test.go -- +-- test_test.go -- package testlist import ( @@ -62,4 +64,4 @@ import ( func TestSimple(t *testing.T) { _ = fmt.Sprint("Test simple") -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/list_wildcard_skip_nonmatching.txt b/src/cmd/go/testdata/script/list_wildcard_skip_nonmatching.txt index 74ca315a72..02b1088297 100644 --- a/src/cmd/go/testdata/script/list_wildcard_skip_nonmatching.txt +++ b/src/cmd/go/testdata/script/list_wildcard_skip_nonmatching.txt @@ -1,13 +1,17 @@ # Test that wildcards don't look in useless directories. # First make sure that badpkg fails the list of '...'. -! go list ... +! go list ./... stderr badpkg -# Check that the list of 'm...' succeeds. That implies badpkg was skipped. -go list m... +# Check that the list of './goodpkg...' succeeds. That implies badpkg was skipped. +go list ./goodpkg... --- m/x.go -- -package m +-- go.mod -- +module m + +go 1.16 +-- goodpkg/x.go -- +package goodpkg -- badpkg/x.go -- -pkg badpkg \ No newline at end of file +pkg badpkg diff --git a/src/cmd/go/testdata/script/load_test_pkg_err.txt b/src/cmd/go/testdata/script/load_test_pkg_err.txt index b3065490de..d088ee40f3 100644 --- a/src/cmd/go/testdata/script/load_test_pkg_err.txt +++ b/src/cmd/go/testdata/script/load_test_pkg_err.txt @@ -10,17 +10,21 @@ stdout golang.org/fake/d d d.test d_test [d.test] --- d/d.go -- +-- go.mod -- +module d + +go 1.16 +-- d.go -- package d import "net/http" const d = http.MethodGet func Get() string { return d; } --- d/d2.go -- --- d/d_test.go -- +-- d2.go -- +-- d_test.go -- package d_test import "testing" import "golang.org/fake/d" -func TestD(t *testing.T) { d.Get(); } \ No newline at end of file +func TestD(t *testing.T) { d.Get(); } diff --git a/src/cmd/go/testdata/script/run_hello_pkg.txt b/src/cmd/go/testdata/script/run_hello_pkg.txt index 03fba13c77..ea2b4d7cde 100644 --- a/src/cmd/go/testdata/script/run_hello_pkg.txt +++ b/src/cmd/go/testdata/script/run_hello_pkg.txt @@ -1,11 +1,14 @@ -cd $GOPATH -go run hello +go run m/hello stderr 'hello, world' -cd src/hello +cd hello go run . stderr 'hello, world' +-- go.mod -- +module m + +go 1.16 -- hello/hello.go -- package main diff --git a/src/cmd/go/testdata/script/run_vendor.txt b/src/cmd/go/testdata/script/run_vendor.txt index 8544281db9..46cac06bf4 100644 --- a/src/cmd/go/testdata/script/run_vendor.txt +++ b/src/cmd/go/testdata/script/run_vendor.txt @@ -1,4 +1,5 @@ # Run +env GO111MODULE=off cd vend/hello go run hello.go stdout 'hello, world' diff --git a/src/cmd/go/testdata/script/test_benchmark_fatal.txt b/src/cmd/go/testdata/script/test_benchmark_fatal.txt index 1e20c4eb61..e281379ebd 100644 --- a/src/cmd/go/testdata/script/test_benchmark_fatal.txt +++ b/src/cmd/go/testdata/script/test_benchmark_fatal.txt @@ -5,7 +5,11 @@ ! stderr ^ok stdout FAIL.*benchfatal --- benchfatal/x_test.go -- +-- go.mod -- +module benchfatal + +go 1.16 +-- x_test.go -- package benchfatal import "testing" diff --git a/src/cmd/go/testdata/script/test_benchmark_labels.txt b/src/cmd/go/testdata/script/test_benchmark_labels.txt index affab6b806..6b424c1bd8 100644 --- a/src/cmd/go/testdata/script/test_benchmark_labels.txt +++ b/src/cmd/go/testdata/script/test_benchmark_labels.txt @@ -10,7 +10,11 @@ stdout '^pkg: bench' ! stdout 'pkg:.*pkg: ' ! stderr 'pkg:.*pkg:' --- bench/x_test.go -- +-- go.mod -- +module bench + +go 1.16 +-- x_test.go -- package bench import "testing" diff --git a/src/cmd/go/testdata/script/test_build_failure.txt b/src/cmd/go/testdata/script/test_build_failure.txt index 2ae448a566..8d13634c8c 100644 --- a/src/cmd/go/testdata/script/test_build_failure.txt +++ b/src/cmd/go/testdata/script/test_build_failure.txt @@ -5,13 +5,17 @@ stderr 'undefined: g' stderr 'undefined: j' --- coverbad/p.go -- +-- go.mod -- +module coverbad + +go 1.16 +-- p.go -- package p func f() { g() } --- coverbad/p1.go -- +-- p1.go -- package p import "C" @@ -19,7 +23,7 @@ import "C" func h() { j() } --- coverbad/p_test.go -- +-- p_test.go -- package p import "testing" diff --git a/src/cmd/go/testdata/script/test_deadline.txt b/src/cmd/go/testdata/script/test_deadline.txt index 5a19f6590f..06ae16ffd2 100644 --- a/src/cmd/go/testdata/script/test_deadline.txt +++ b/src/cmd/go/testdata/script/test_deadline.txt @@ -4,6 +4,10 @@ go test -timeout=0 -run=TestNoDeadline go test -timeout=1m -run=TestDeadlineWithinMinute go test -timeout=1m -run=TestSubtestDeadlineWithinMinute +-- go.mod -- +module m + +go 1.16 -- deadline_test.go -- package testing_test diff --git a/src/cmd/go/testdata/script/test_empty.txt b/src/cmd/go/testdata/script/test_empty.txt index f2c512e791..5ebbecd53d 100644 --- a/src/cmd/go/testdata/script/test_empty.txt +++ b/src/cmd/go/testdata/script/test_empty.txt @@ -23,6 +23,10 @@ go test -cover -coverpkg=. -race cd $GOPATH/src/empty/testxtest go test -cover -coverpkg=. -race +-- empty/go.mod -- +module empty + +go 1.16 -- empty/pkg/pkg.go -- package p -- empty/pkgtest/pkg.go -- diff --git a/src/cmd/go/testdata/script/test_example_goexit.txt b/src/cmd/go/testdata/script/test_example_goexit.txt index 59219e3366..984f4349f5 100644 --- a/src/cmd/go/testdata/script/test_example_goexit.txt +++ b/src/cmd/go/testdata/script/test_example_goexit.txt @@ -5,7 +5,11 @@ stdout '(?s)--- PASS.*--- FAIL.*' stdout 'panic: test executed panic\(nil\) or runtime\.Goexit' --- examplegoexit/example_test.go -- +-- go.mod -- +module examplegoexit + +go 1.16 +-- example_test.go -- package main import ( diff --git a/src/cmd/go/testdata/script/test_import_error_stack.txt b/src/cmd/go/testdata/script/test_import_error_stack.txt index c66c1213a4..6c60f3d2ab 100644 --- a/src/cmd/go/testdata/script/test_import_error_stack.txt +++ b/src/cmd/go/testdata/script/test_import_error_stack.txt @@ -1,9 +1,20 @@ +env GO111MODULE=off ! go test testdep/p1 stderr 'package testdep/p1 \(test\)\n\timports testdep/p2\n\timports testdep/p3: build constraints exclude all Go files ' # check for full import stack +! go vet testdep/p1 +stderr 'package testdep/p1 \(test\)\n\timports testdep/p2\n\timports testdep/p3: build constraints exclude all Go files ' # check for full import stack +env GO111MODULE=on +cd testdep +! go test testdep/p1 +stderr 'package testdep/p1 \(test\)\n\timports testdep/p2\n\timports testdep/p3: build constraints exclude all Go files ' # check for full import stack ! go vet testdep/p1 stderr 'package testdep/p1 \(test\)\n\timports testdep/p2\n\timports testdep/p3: build constraints exclude all Go files ' # check for full import stack +-- testdep/go.mod -- +module testdep + +go 1.16 -- testdep/p1/p1.go -- package p1 -- testdep/p1/p1_test.go -- diff --git a/src/cmd/go/testdata/script/test_json.txt b/src/cmd/go/testdata/script/test_json.txt index 1bd530514c..cd5b0b9d7a 100644 --- a/src/cmd/go/testdata/script/test_json.txt +++ b/src/cmd/go/testdata/script/test_json.txt @@ -3,23 +3,23 @@ env GOCACHE=$WORK/tmp -# Run go test -json on errors empty/pkg and skipper +# Run go test -json on errors m/empty/pkg and m/skipper # It would be nice to test that the output is interlaced # but it seems to be impossible to do that in a short test # that isn't also flaky. Just check that we get JSON output. -go test -json -short -v errors empty/pkg skipper +go test -json -short -v errors m/empty/pkg m/skipper # Check errors for run action stdout '"Package":"errors"' stdout '"Action":"run","Package":"errors"' -# Check empty/pkg for output and skip actions -stdout '"Action":"output","Package":"empty/pkg","Output":".*no test files' -stdout '"Action":"skip","Package":"empty/pkg"' +# Check m/empty/pkg for output and skip actions +stdout '"Action":"output","Package":"m/empty/pkg","Output":".*no test files' +stdout '"Action":"skip","Package":"m/empty/pkg"' # Check skipper for output and skip actions -stdout '"Action":"output","Package":"skipper","Test":"Test","Output":"--- SKIP:' -stdout '"Action":"skip","Package":"skipper","Test":"Test"' +stdout '"Action":"output","Package":"m/skipper","Test":"Test","Output":"--- SKIP:' +stdout '"Action":"skip","Package":"m/skipper","Test":"Test"' # Run go test -json on errors and check it's cached go test -json -short -v errors @@ -36,6 +36,10 @@ stdout '"Package":"errors"' stdout '"Action":"run"' stdout '\{"Action":"pass","Package":"errors"\}' +-- go.mod -- +module m + +go 1.16 -- skipper/skip_test.go -- package skipper diff --git a/src/cmd/go/testdata/script/test_main_twice.txt b/src/cmd/go/testdata/script/test_main_twice.txt index 1e68dabec0..f32d4fc3b5 100644 --- a/src/cmd/go/testdata/script/test_main_twice.txt +++ b/src/cmd/go/testdata/script/test_main_twice.txt @@ -4,7 +4,11 @@ env GOCACHE=$WORK/tmp go test -v multimain stdout -count=2 notwithstanding # check tests ran twice --- multimain/multimain_test.go -- +-- go.mod -- +module multimain + +go 1.16 +-- multimain_test.go -- package multimain_test import "testing" diff --git a/src/cmd/go/testdata/script/test_match_no_tests_build_failure.txt b/src/cmd/go/testdata/script/test_match_no_tests_build_failure.txt index 92cb690dcc..e1c96438c8 100644 --- a/src/cmd/go/testdata/script/test_match_no_tests_build_failure.txt +++ b/src/cmd/go/testdata/script/test_match_no_tests_build_failure.txt @@ -6,9 +6,13 @@ ! stderr '(?m)^ok.*\[no tests to run\]' stdout 'FAIL' --- syntaxerror/x.go -- +-- go.mod -- +module syntaxerror + +go 1.16 +-- x.go -- package p --- syntaxerror/x_test.go -- +-- x_test.go -- package p func f() (x.y, z int) { diff --git a/src/cmd/go/testdata/script/test_no_run_example.txt b/src/cmd/go/testdata/script/test_no_run_example.txt index 66daa310fa..53ac755902 100644 --- a/src/cmd/go/testdata/script/test_no_run_example.txt +++ b/src/cmd/go/testdata/script/test_no_run_example.txt @@ -1,7 +1,11 @@ go test -v norunexample stdout 'File with non-runnable example was built.' --- norunexample/example_test.go -- +-- go.mod -- +module norunexample + +go 1.16 +-- example_test.go -- package pkg_test import "os" @@ -13,7 +17,7 @@ func init() { func Example_test() { // This test will not be run, it has no "Output:" comment. } --- norunexample/test_test.go -- +-- test_test.go -- package pkg import ( diff --git a/src/cmd/go/testdata/script/test_no_tests.txt b/src/cmd/go/testdata/script/test_no_tests.txt index d75bcff934..2d624d1da6 100644 --- a/src/cmd/go/testdata/script/test_no_tests.txt +++ b/src/cmd/go/testdata/script/test_no_tests.txt @@ -3,7 +3,11 @@ go test testnorun stdout 'testnorun\t\[no test files\]' --- testnorun/p.go -- +-- go.mod -- +module testnorun + +go 1.16 +-- p.go -- package p func init() { diff --git a/src/cmd/go/testdata/script/test_race.txt b/src/cmd/go/testdata/script/test_race.txt index 5d15189e19..2ffea46092 100644 --- a/src/cmd/go/testdata/script/test_race.txt +++ b/src/cmd/go/testdata/script/test_race.txt @@ -13,7 +13,11 @@ stdout 'FAIL: BenchmarkRace' ! stdout 'PASS' ! stderr 'PASS' --- testrace/race_test.go -- +-- go.mod -- +module testrace + +go 1.16 +-- race_test.go -- package testrace import "testing" diff --git a/src/cmd/go/testdata/script/test_race_cover_mode_issue20435.txt b/src/cmd/go/testdata/script/test_race_cover_mode_issue20435.txt index bff9502ac7..eacc882091 100644 --- a/src/cmd/go/testdata/script/test_race_cover_mode_issue20435.txt +++ b/src/cmd/go/testdata/script/test_race_cover_mode_issue20435.txt @@ -10,7 +10,11 @@ stderr '-covermode must be "atomic", not "set", when -race is enabled' ! stdout PASS ! stderr PASS --- testrace/race_test.go -- +-- go.mod -- +module testrace + +go 1.16 +-- race_test.go -- package testrace import "testing" diff --git a/src/cmd/go/testdata/script/test_race_install.txt b/src/cmd/go/testdata/script/test_race_install.txt index 66dc19ebb6..d28809bfdc 100644 --- a/src/cmd/go/testdata/script/test_race_install.txt +++ b/src/cmd/go/testdata/script/test_race_install.txt @@ -8,6 +8,10 @@ go install -race -pkgdir=$WORKDIR/tmp/pkg std go test -race -pkgdir=$WORKDIR/tmp/pkg -i -v empty/pkg ! stderr . --- empty/pkg/pkg.go -- +-- go.mod -- +module empty + +go 1.16 +-- pkg/pkg.go -- package p diff --git a/src/cmd/go/testdata/script/test_race_install_cgo.txt b/src/cmd/go/testdata/script/test_race_install_cgo.txt index feddc8f922..82f00f2086 100644 --- a/src/cmd/go/testdata/script/test_race_install_cgo.txt +++ b/src/cmd/go/testdata/script/test_race_install_cgo.txt @@ -5,7 +5,7 @@ [!darwin] ! stale cmd/cgo # The darwin builders are spuriously stale; see #33598. env GOBIN=$WORK/bin -go install mtime sametime +go install m/mtime m/sametime go tool -n cgo cp stdout cgopath.txt @@ -21,6 +21,10 @@ exec $GOBIN/mtime cgopath.txt # get the mtime of the file whose name is in cgopa cp stdout cgotime_after.txt exec $GOBIN/sametime cgotime_before.txt cgotime_after.txt +-- go.mod -- +module m + +go 1.16 -- mtime/mtime.go -- package main diff --git a/src/cmd/go/testdata/script/test_regexps.txt b/src/cmd/go/testdata/script/test_regexps.txt index a616195cab..2f33080a00 100644 --- a/src/cmd/go/testdata/script/test_regexps.txt +++ b/src/cmd/go/testdata/script/test_regexps.txt @@ -35,7 +35,11 @@ stdout -count=1 '^ z_test.go:18: LOG: XX running N=1$' # a large number, and the last iteration count prints right before the results. stdout -count=2 '^ x_test.go:15: LOG: Y running N=[1-9]\d{4,}\nBenchmarkX/Y\s+\d+' --- testregexp/x_test.go -- +-- go.mod -- +module testregexp + +go 1.16 +-- x_test.go -- package x import "testing" @@ -53,7 +57,7 @@ func BenchmarkX(b *testing.B) { b.Logf("LOG: Y running N=%d", b.N) }) } --- testregexp/z_test.go -- +-- z_test.go -- package x import "testing" diff --git a/src/cmd/go/testdata/script/test_relative_import.txt b/src/cmd/go/testdata/script/test_relative_import.txt index 0d212b4924..938a875b55 100644 --- a/src/cmd/go/testdata/script/test_relative_import.txt +++ b/src/cmd/go/testdata/script/test_relative_import.txt @@ -1,4 +1,5 @@ # Relative imports in go test +env GO111MODULE=off # relative import not supported in module mode # Run tests outside GOPATH. env GOPATH=$WORK/tmp @@ -27,4 +28,4 @@ func TestF(t *testing.T) { if F() != p1.F() { t.Fatal(F()) } -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/test_relative_import_dash_i.txt b/src/cmd/go/testdata/script/test_relative_import_dash_i.txt index dafa04ef02..b2716d8403 100644 --- a/src/cmd/go/testdata/script/test_relative_import_dash_i.txt +++ b/src/cmd/go/testdata/script/test_relative_import_dash_i.txt @@ -1,4 +1,5 @@ # Relative imports in go test -i +env GO111MODULE=off # relative import not supported in module mode # Run tests outside GOPATH. env GOPATH=$WORK/tmp @@ -28,4 +29,4 @@ func TestF(t *testing.T) { if F() != p1.F() { t.Fatal(F()) } -} \ No newline at end of file +} diff --git a/src/cmd/go/testdata/script/test_syntax_error_says_fail.txt b/src/cmd/go/testdata/script/test_syntax_error_says_fail.txt index 29fa805b43..44ff6e2b39 100644 --- a/src/cmd/go/testdata/script/test_syntax_error_says_fail.txt +++ b/src/cmd/go/testdata/script/test_syntax_error_says_fail.txt @@ -1,10 +1,21 @@ # Test that the error message for a syntax error in a test go file # says FAIL. +env GO111MODULE=off ! go test syntaxerror stderr 'x_test.go:' # check that the error is diagnosed stdout 'FAIL' # check that go test says FAIL +env GO111MODULE=on +cd syntaxerror +! go test syntaxerror +stderr 'x_test.go:' # check that the error is diagnosed +stdout 'FAIL' # check that go test says FAIL + +-- syntaxerror/go.mod -- +module syntaxerror + +go 1.16 -- syntaxerror/x.go -- package p -- syntaxerror/x_test.go -- diff --git a/src/cmd/go/testdata/script/test_vendor.txt b/src/cmd/go/testdata/script/test_vendor.txt index d72d672827..c6a88b6fed 100644 --- a/src/cmd/go/testdata/script/test_vendor.txt +++ b/src/cmd/go/testdata/script/test_vendor.txt @@ -1,9 +1,19 @@ -# Test +# In GOPATH mode, vendored packages can replace std packages. +env GO111MODULE=off cd vend/hello go test -v stdout TestMsgInternal stdout TestMsgExternal +# In module mode, they cannot. +env GO111MODULE=on +! go test -mod=vendor +stderr 'undefined: strings.Msg' + +-- vend/hello/go.mod -- +module vend/hello + +go 1.16 -- vend/hello/hello.go -- package main diff --git a/src/cmd/go/testdata/script/test_vet.txt b/src/cmd/go/testdata/script/test_vet.txt index af26b4de79..5af26b54f9 100644 --- a/src/cmd/go/testdata/script/test_vet.txt +++ b/src/cmd/go/testdata/script/test_vet.txt @@ -17,20 +17,24 @@ go test -vet=off p1.go stdout '\[no test files\]' # Test issue #22890 -go test vetcycle -stdout 'vetcycle.*\[no test files\]' +go test m/vetcycle +stdout 'm/vetcycle.*\[no test files\]' # Test with ... -! go test vetfail/... +! go test ./vetfail/... stderr 'Printf format %d' -stdout 'ok\s+vetfail/p2' +stdout 'ok\s+m/vetfail/p2' # Check there's no diagnosis of a bad build constraint in vetxonly mode. # Use -a so that we need to recompute the vet-specific export data for # vetfail/p1. -go test -a vetfail/p2 +go test -a m/vetfail/p2 ! stderr 'invalid.*constraint' +-- go.mod -- +module m + +go 1.16 -- p1_test.go -- package p @@ -74,7 +78,7 @@ func F() { -- vetfail/p2/p2.go -- package p2 -import _ "vetfail/p1" +import _ "m/vetfail/p1" func F() { } diff --git a/src/cmd/go/testdata/script/test_write_profiles_on_timeout.txt b/src/cmd/go/testdata/script/test_write_profiles_on_timeout.txt index a6cb934709..08e67a429e 100644 --- a/src/cmd/go/testdata/script/test_write_profiles_on_timeout.txt +++ b/src/cmd/go/testdata/script/test_write_profiles_on_timeout.txt @@ -2,13 +2,16 @@ [short] skip -cd profiling ! go test -cpuprofile cpu.pprof -memprofile mem.pprof -timeout 1ms grep . cpu.pprof grep . mem.pprof --- profiling/timeout_test.go -- +-- go.mod -- +module profiling + +go 1.16 +-- timeout_test.go -- package timeouttest_test import "testing" import "time" -func TestSleep(t *testing.T) { time.Sleep(time.Second) } \ No newline at end of file +func TestSleep(t *testing.T) { time.Sleep(time.Second) } diff --git a/src/cmd/go/testdata/script/test_xtestonly_works.txt b/src/cmd/go/testdata/script/test_xtestonly_works.txt index 01bafb733b..8e150dbfc2 100644 --- a/src/cmd/go/testdata/script/test_xtestonly_works.txt +++ b/src/cmd/go/testdata/script/test_xtestonly_works.txt @@ -4,11 +4,15 @@ go test xtestonly ! stdout '^ok.*\[no tests to run\]' stdout '^ok' --- xtestonly/f.go -- +-- go.mod -- +module xtestonly + +go 1.16 +-- f.go -- package xtestonly func F() int { return 42 } --- xtestonly/f_test.go -- +-- f_test.go -- package xtestonly_test import ( diff --git a/src/cmd/go/testdata/script/testing_issue40908.txt b/src/cmd/go/testdata/script/testing_issue40908.txt index 4939de080c..839320e4e8 100644 --- a/src/cmd/go/testdata/script/testing_issue40908.txt +++ b/src/cmd/go/testdata/script/testing_issue40908.txt @@ -3,7 +3,11 @@ go test -race testrace --- testrace/race_test.go -- +-- go.mod -- +module testrace + +go 1.16 +-- race_test.go -- package testrace import "testing" diff --git a/src/cmd/go/testdata/script/vendor_gopath_issue11409.txt b/src/cmd/go/testdata/script/vendor_gopath_issue11409.txt index 746a34a744..da52f9acf2 100644 --- a/src/cmd/go/testdata/script/vendor_gopath_issue11409.txt +++ b/src/cmd/go/testdata/script/vendor_gopath_issue11409.txt @@ -1,4 +1,5 @@ [!windows] [short] stop 'this test only applies to Windows' +env GO111MODULE=off go build run_go.go exec ./run_go$GOEXE $GOPATH $GOPATH/src/vend/hello diff --git a/src/cmd/go/testdata/script/vendor_import.txt b/src/cmd/go/testdata/script/vendor_import.txt index 35419f36f1..df4c27df81 100644 --- a/src/cmd/go/testdata/script/vendor_import.txt +++ b/src/cmd/go/testdata/script/vendor_import.txt @@ -1,4 +1,5 @@ # Imports +env GO111MODULE=off go list -f '{{.ImportPath}} {{.Imports}}' 'vend/...' 'vend/vendor/...' 'vend/x/vendor/...' cmp stdout want_vendor_imports.txt diff --git a/src/cmd/go/testdata/script/vendor_import_wrong.txt b/src/cmd/go/testdata/script/vendor_import_wrong.txt index aba6269784..73bf595640 100644 --- a/src/cmd/go/testdata/script/vendor_import_wrong.txt +++ b/src/cmd/go/testdata/script/vendor_import_wrong.txt @@ -1,7 +1,18 @@ # Wrong import path +env GO111MODULE=off ! go build vend/x/invalid stderr 'must be imported as foo' +env GO111MODULE= +cd vend/x/invalid +! go build vend/x/invalid +stderr 'must be imported as foo' + +-- vend/x/invalid/go.mod -- +module vend/x/invalid + +go 1.16 + -- vend/x/invalid/invalid.go -- package invalid diff --git a/src/cmd/go/testdata/script/vendor_issue12156.txt b/src/cmd/go/testdata/script/vendor_issue12156.txt index 49eb235ba5..ac95c6d3da 100644 --- a/src/cmd/go/testdata/script/vendor_issue12156.txt +++ b/src/cmd/go/testdata/script/vendor_issue12156.txt @@ -1,5 +1,6 @@ # Tests issue #12156, a former index out of range panic. +env GO111MODULE=off env GOPATH=$WORK/gopath/src/testvendor2 # vendor/x is directly in $GOPATH, not in $GOPATH/src cd $WORK/gopath/src/testvendor2/src/p diff --git a/src/cmd/go/testdata/script/vendor_list_issue11977.txt b/src/cmd/go/testdata/script/vendor_list_issue11977.txt index d97c6518b4..cdab33c089 100644 --- a/src/cmd/go/testdata/script/vendor_list_issue11977.txt +++ b/src/cmd/go/testdata/script/vendor_list_issue11977.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off go get github.com/rsc/go-get-issue-11864 @@ -13,4 +14,4 @@ go list -f '{{join .XTestImports "\n"}}' github.com/rsc/go-get-issue-11864/vendo stdout 'go-get-issue-11864/vendor/vendor.org/tx2' go list -f '{{join .XTestImports "\n"}}' github.com/rsc/go-get-issue-11864/vendor/vendor.org/tx3 -stdout 'go-get-issue-11864/vendor/vendor.org/tx3' \ No newline at end of file +stdout 'go-get-issue-11864/vendor/vendor.org/tx3' diff --git a/src/cmd/go/testdata/script/vendor_resolve.txt b/src/cmd/go/testdata/script/vendor_resolve.txt index 220b92f80b..bc8cf0ab38 100644 --- a/src/cmd/go/testdata/script/vendor_resolve.txt +++ b/src/cmd/go/testdata/script/vendor_resolve.txt @@ -1,3 +1,4 @@ +env GO111MODULE=off ! go build p stderr 'must be imported as x' diff --git a/src/cmd/go/testdata/script/vendor_test_issue11864.txt b/src/cmd/go/testdata/script/vendor_test_issue11864.txt index f11d790e6f..cfb43bf343 100644 --- a/src/cmd/go/testdata/script/vendor_test_issue11864.txt +++ b/src/cmd/go/testdata/script/vendor_test_issue11864.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off go get github.com/rsc/go-get-issue-11864 @@ -16,4 +17,4 @@ go test github.com/rsc/go-get-issue-11864 go test github.com/rsc/go-get-issue-11864/t # external tests should observe internal test exports (golang.org/issue/11977) -go test github.com/rsc/go-get-issue-11864/vendor/vendor.org/tx2 \ No newline at end of file +go test github.com/rsc/go-get-issue-11864/vendor/vendor.org/tx2 diff --git a/src/cmd/go/testdata/script/vendor_test_issue14613.txt b/src/cmd/go/testdata/script/vendor_test_issue14613.txt index 4e5e066d6b..7801e6944d 100644 --- a/src/cmd/go/testdata/script/vendor_test_issue14613.txt +++ b/src/cmd/go/testdata/script/vendor_test_issue14613.txt @@ -1,5 +1,6 @@ [!net] skip [!exec:git] skip +env GO111MODULE=off cd $GOPATH diff --git a/src/cmd/go/testdata/script/vet.txt b/src/cmd/go/testdata/script/vet.txt index 73fe2958fc..6573ae3ebd 100644 --- a/src/cmd/go/testdata/script/vet.txt +++ b/src/cmd/go/testdata/script/vet.txt @@ -1,29 +1,33 @@ # Package with external tests -! go vet vetpkg +! go vet m/vetpkg stderr 'Printf' # With tags -! go vet -tags tagtest vetpkg +! go vet -tags tagtest m/vetpkg stderr 'c\.go.*Printf' # With flags on -! go vet -printf vetpkg +! go vet -printf m/vetpkg stderr 'Printf' # With flags off -go vet -printf=false vetpkg +go vet -printf=false m/vetpkg ! stderr . # With only test files (tests issue #23395) -go vet onlytest +go vet m/onlytest ! stderr . # With only cgo files (tests issue #24193) [!cgo] skip [short] skip -go vet onlycgo +go vet m/onlycgo ! stderr . +-- go.mod -- +module m + +go 1.16 -- vetpkg/a_test.go -- package p_test -- vetpkg/b.go -- @@ -55,4 +59,4 @@ package p import "C" -func F() {} \ No newline at end of file +func F() {} -- GitLab From 0f7ac9b4f5f6bc20344feb8a2c32b8126df80baa Mon Sep 17 00:00:00 2001 From: Alex Opie Date: Thu, 17 Sep 2020 04:31:50 +0000 Subject: [PATCH 0523/1792] cmd/go: use the correct linker config in the buildID hash The linker config is hashed into the buildID; however, the GOROOT_FINAL environment variable that is actually used when -trimpath is specified was not reflected in that hash. This change fixes that. Fixes #38989 Change-Id: I418a21a9f6293ca63c101d22b501dfdba8e91ac6 GitHub-Last-Rev: 4cf82920e4a76173c5cb5359b059e87ee7fc7f51 GitHub-Pull-Request: golang/go#40296 Reviewed-on: https://go-review.googlesource.com/c/go/+/243557 Run-TryBot: Jay Conrod Reviewed-by: Jay Conrod Trust: Jay Conrod Trust: Bryan C. Mills --- src/cmd/go/internal/work/exec.go | 9 ++++- src/cmd/go/internal/work/gc.go | 5 ++- .../script/link_matching_actionid.txt | 38 +++++++++++++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 src/cmd/go/testdata/script/link_matching_actionid.txt diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index d975c36306..9da5a44e17 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -1178,8 +1178,13 @@ func (b *Builder) printLinkerConfig(h io.Writer, p *load.Package) { key, val := cfg.GetArchEnv() fmt.Fprintf(h, "%s=%s\n", key, val) - // The linker writes source file paths that say GOROOT_FINAL. - fmt.Fprintf(h, "GOROOT=%s\n", cfg.GOROOT_FINAL) + // The linker writes source file paths that say GOROOT_FINAL, but + // only if -trimpath is not specified (see ld() in gc.go). + gorootFinal := cfg.GOROOT_FINAL + if cfg.BuildTrimpath { + gorootFinal = trimPathGoRootFinal + } + fmt.Fprintf(h, "GOROOT=%s\n", gorootFinal) // GO_EXTLINK_ENABLED controls whether the external linker is used. fmt.Fprintf(h, "GO_EXTLINK_ENABLED=%s\n", cfg.Getenv("GO_EXTLINK_ENABLED")) diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go index 6031897f88..d76574932e 100644 --- a/src/cmd/go/internal/work/gc.go +++ b/src/cmd/go/internal/work/gc.go @@ -25,6 +25,9 @@ import ( "crypto/sha1" ) +// The 'path' used for GOROOT_FINAL when -trimpath is specified +const trimPathGoRootFinal = "go" + // The Go toolchain. type gcToolchain struct{} @@ -569,7 +572,7 @@ func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string) env := []string{} if cfg.BuildTrimpath { - env = append(env, "GOROOT_FINAL=go") + env = append(env, "GOROOT_FINAL="+trimPathGoRootFinal) } return b.run(root, dir, root.Package.ImportPath, env, cfg.BuildToolexec, base.Tool("link"), "-o", out, "-importcfg", importcfg, ldflags, mainpkg) } diff --git a/src/cmd/go/testdata/script/link_matching_actionid.txt b/src/cmd/go/testdata/script/link_matching_actionid.txt new file mode 100644 index 0000000000..b8d423d027 --- /dev/null +++ b/src/cmd/go/testdata/script/link_matching_actionid.txt @@ -0,0 +1,38 @@ +# Checks that an identical binary is built with -trimpath from the same +# source files, with GOROOT in two different locations. +# Verifies golang.org/issue/38989 + +[short] skip +[!symlink] skip + +# Symlink the compiler to a local path +env GOROOT=$WORK/goroot1 +symlink $GOROOT -> $TESTGO_GOROOT + +# Set up fresh GOCACHE +env GOCACHE=$WORK/gocache1 +mkdir $GOCACHE + +# Build a simple binary +go build -o binary1 -trimpath -x main.go + +# Now repeat the same process with the compiler at a different local path +env GOROOT=$WORK/goroot2 +symlink $GOROOT -> $TESTGO_GOROOT + +env GOCACHE=$WORK/gocache2 +mkdir $GOCACHE + +go build -o binary2 -trimpath -x main.go + +# Check that the binaries match exactly +go tool buildid binary1 +cp stdout buildid1 +go tool buildid binary2 +cp stdout buildid2 +cmp buildid1 buildid2 + + +-- main.go -- +package main +func main() {} -- GitLab From 07d5eb075b6f270ae4443e9689821d2e403b72b5 Mon Sep 17 00:00:00 2001 From: Sam Xie Date: Thu, 17 Sep 2020 02:59:28 +0000 Subject: [PATCH 0524/1792] cmd/go: allow output in non-existent directory When 'go build' is given an output path with -o, if the output path ends with a path separator, always treat it as a directory. Fixes #41313 Change-Id: I9a9c25448abfcd6297ad973f5ed2025b2568a4a7 GitHub-Last-Rev: 20a19bd63a2779a2c94b0efdf86146ffd551293c GitHub-Pull-Request: golang/go#41314 Reviewed-on: https://go-review.googlesource.com/c/go/+/253821 Run-TryBot: Jay Conrod Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Jay Conrod Trust: Bryan C. Mills Trust: Jay Conrod --- src/cmd/go/alldocs.go | 5 ++-- src/cmd/go/internal/work/build.go | 12 ++++++---- src/cmd/go/testdata/script/build_output.txt | 26 +++++++++++++++++++++ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index b7e5bbed2d..5f1c7aaecb 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -93,8 +93,9 @@ // // The -o flag forces build to write the resulting executable or object // to the named output file or directory, instead of the default behavior described -// in the last two paragraphs. If the named output is a directory that exists, -// then any resulting executables will be written to that directory. +// in the last two paragraphs. If the named output is an existing directory or +// ends with a slash or backslash, then any resulting executables +// will be written to that directory. // // The -i flag installs the packages that are dependencies of the target. // diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 990e5d9ecd..86423f118c 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -53,8 +53,9 @@ serving only as a check that the packages can be built. The -o flag forces build to write the resulting executable or object to the named output file or directory, instead of the default behavior described -in the last two paragraphs. If the named output is a directory that exists, -then any resulting executables will be written to that directory. +in the last two paragraphs. If the named output is an existing directory or +ends with a slash or backslash, then any resulting executables +will be written to that directory. The -i flag installs the packages that are dependencies of the target. @@ -387,10 +388,13 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) { } if cfg.BuildO != "" { - // If the -o name exists and is a directory, then + // If the -o name exists and is a directory or + // ends with a slash or backslash, then // write all main packages to that directory. // Otherwise require only a single package be built. - if fi, err := os.Stat(cfg.BuildO); err == nil && fi.IsDir() { + if fi, err := os.Stat(cfg.BuildO); (err == nil && fi.IsDir()) || + strings.HasSuffix(cfg.BuildO, "/") || + strings.HasSuffix(cfg.BuildO, string(os.PathSeparator)) { if !explicitO { base.Fatalf("go build: build output %q already exists and is a directory", cfg.BuildO) } diff --git a/src/cmd/go/testdata/script/build_output.txt b/src/cmd/go/testdata/script/build_output.txt index ced7cf82a6..1e82950dbc 100644 --- a/src/cmd/go/testdata/script/build_output.txt +++ b/src/cmd/go/testdata/script/build_output.txt @@ -18,6 +18,32 @@ go build -o myprog x.go exists -exec myprog ! exists myprogr.exe +! exists bin +go build -o bin/x x.go +exists -exec bin/x +rm bin + +! exists bin +go build -o bin/ x.go +exists -exec bin/x$GOEXE +rm bin + +[windows] ! exists bin +[windows] go build -o bin\x x.go +[windows] exists -exec bin\x +[windows] rm bin + +[windows] ! exists bin +[windows] go build -o bin\ x.go +[windows] exists -exec bin\x.exe +[windows] rm bin + +! exists bin +mkdir bin +go build -o bin x.go +exists -exec bin/x$GOEXE +rm bin + go build p.go ! exists p ! exists p.a -- GitLab From f554eb7bc332cc265e6cc0490a7595b2f5873cba Mon Sep 17 00:00:00 2001 From: David Chase Date: Mon, 13 Jul 2020 14:44:14 -0400 Subject: [PATCH 0525/1792] cmd/compile: add variable length TRESULTS type for SSA use. This type is very much like TTUPLE, but not just for pairs. Used to describe results of a pre-expansion function call. (will later probably also be used to describe the incoming args). Change-Id: I811850cfcc2b3de85085eb4c2eca217c04c330b3 Reviewed-on: https://go-review.googlesource.com/c/go/+/242360 Trust: David Chase Run-TryBot: David Chase TryBot-Result: Go Bot Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/fmt.go | 11 ++++ .../compile/internal/types/etype_string.go | 7 +- src/cmd/compile/internal/types/type.go | 66 +++++++++++++++++-- 3 files changed, 74 insertions(+), 10 deletions(-) diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go index 43e501deaf..d4af451506 100644 --- a/src/cmd/compile/internal/gc/fmt.go +++ b/src/cmd/compile/internal/gc/fmt.go @@ -711,6 +711,17 @@ func tconv2(b *bytes.Buffer, t *types.Type, flag FmtFlag, mode fmtMode, visited return } + if t.Etype == types.TRESULTS { + tys := t.Extra.(*types.Results).Types + for i, et := range tys { + if i > 0 { + b.WriteByte(',') + } + b.WriteString(et.String()) + } + return + } + flag, mode = flag.update(mode) if mode == FTypeIdName { flag |= FmtUnsigned diff --git a/src/cmd/compile/internal/types/etype_string.go b/src/cmd/compile/internal/types/etype_string.go index 0ff05a8c2a..14fd5b71df 100644 --- a/src/cmd/compile/internal/types/etype_string.go +++ b/src/cmd/compile/internal/types/etype_string.go @@ -44,12 +44,13 @@ func _() { _ = x[TCHANARGS-33] _ = x[TSSA-34] _ = x[TTUPLE-35] - _ = x[NTYPE-36] + _ = x[TRESULTS-36] + _ = x[NTYPE-37] } -const _EType_name = "xxxINT8UINT8INT16UINT16INT32UINT32INT64UINT64INTUINTUINTPTRCOMPLEX64COMPLEX128FLOAT32FLOAT64BOOLPTRFUNCSLICEARRAYSTRUCTCHANMAPINTERFORWANYSTRINGUNSAFEPTRIDEALNILBLANKFUNCARGSCHANARGSSSATUPLENTYPE" +const _EType_name = "xxxINT8UINT8INT16UINT16INT32UINT32INT64UINT64INTUINTUINTPTRCOMPLEX64COMPLEX128FLOAT32FLOAT64BOOLPTRFUNCSLICEARRAYSTRUCTCHANMAPINTERFORWANYSTRINGUNSAFEPTRIDEALNILBLANKFUNCARGSCHANARGSSSATUPLERESULTSNTYPE" -var _EType_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, 195} +var _EType_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 EType) String() string { if i >= EType(len(_EType_index)-1) { diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go index a777a5fd90..9b05aef429 100644 --- a/src/cmd/compile/internal/types/type.go +++ b/src/cmd/compile/internal/types/type.go @@ -66,8 +66,9 @@ const ( TCHANARGS // SSA backend types - TSSA // internal types used by SSA backend (flags, memory, etc.) - TTUPLE // a pair of types, used by SSA backend + TSSA // internal types used by SSA backend (flags, memory, etc.) + TTUPLE // a pair of types, used by SSA backend + TRESULTS // multiuple types; the resulting of calling a function or method, plus a memory at the end. NTYPE ) @@ -330,6 +331,11 @@ type Tuple struct { // Any tuple with a memory type must put that memory type second. } +type Results struct { + Types []*Type + // Any Results with a memory type must put that memory type last. +} + // Array contains Type fields specific to array types. type Array struct { Elem *Type // element type @@ -466,6 +472,8 @@ func New(et EType) *Type { t.Extra = new(Chan) case TTUPLE: t.Extra = new(Tuple) + case TRESULTS: + t.Extra = new(Results) } return t } @@ -512,6 +520,12 @@ func NewTuple(t1, t2 *Type) *Type { return t } +func NewResults(types []*Type) *Type { + t := New(TRESULTS) + t.Extra.(*Results).Types = types + return t +} + func newSSA(name string) *Type { t := New(TSSA) t.Extra = name @@ -688,7 +702,7 @@ func (t *Type) copy() *Type { case TARRAY: x := *t.Extra.(*Array) nt.Extra = &x - case TTUPLE, TSSA: + case TTUPLE, TSSA, TRESULTS: Fatalf("ssa types cannot be copied") } // TODO(mdempsky): Find out why this is necessary and explain. @@ -1051,6 +1065,23 @@ func (t *Type) cmp(x *Type) Cmp { } return ttup.second.Compare(xtup.second) + case TRESULTS: + xResults := x.Extra.(*Results) + tResults := t.Extra.(*Results) + xl, tl := len(xResults.Types), len(tResults.Types) + if tl != xl { + if tl < xl { + return CMPlt + } + return CMPgt + } + for i := 0; i < tl; i++ { + if c := tResults.Types[i].Compare(xResults.Types[i]); c != CMPeq { + return c + } + } + return CMPeq + case TMAP: if c := t.Key().cmp(x.Key()); c != CMPeq { return c @@ -1305,6 +1336,9 @@ func (t *Type) FieldType(i int) *Type { panic("bad tuple index") } } + if t.Etype == TRESULTS { + return t.Extra.(*Results).Types[i] + } return t.Field(i).Type } func (t *Type) FieldOff(i int) int64 { @@ -1382,11 +1416,20 @@ func (t *Type) ChanDir() ChanDir { } func (t *Type) IsMemory() bool { - return t == TypeMem || t.Etype == TTUPLE && t.Extra.(*Tuple).second == TypeMem + if t == TypeMem || t.Etype == TTUPLE && t.Extra.(*Tuple).second == TypeMem { + return true + } + if t.Etype == TRESULTS { + if types := t.Extra.(*Results).Types; len(types) > 0 && types[len(types)-1] == TypeMem { + return true + } + } + return false } -func (t *Type) IsFlags() bool { return t == TypeFlags } -func (t *Type) IsVoid() bool { return t == TypeVoid } -func (t *Type) IsTuple() bool { return t.Etype == TTUPLE } +func (t *Type) IsFlags() bool { return t == TypeFlags } +func (t *Type) IsVoid() bool { return t == TypeVoid } +func (t *Type) IsTuple() bool { return t.Etype == TTUPLE } +func (t *Type) IsResults() bool { return t.Etype == TRESULTS } // IsUntyped reports whether t is an untyped type. func (t *Type) IsUntyped() bool { @@ -1431,6 +1474,15 @@ func (t *Type) HasPointers() bool { case TTUPLE: ttup := t.Extra.(*Tuple) return ttup.first.HasPointers() || ttup.second.HasPointers() + + case TRESULTS: + types := t.Extra.(*Results).Types + for _, et := range types { + if et.HasPointers() { + return true + } + } + return false } return true -- GitLab From 35e413c5373538ca6e0516f454f78c74477eff2c Mon Sep 17 00:00:00 2001 From: David Chase Date: Mon, 15 Jun 2020 14:20:36 -0400 Subject: [PATCH 0526/1792] cmd/compile: add new ops for experiment with late call expansion Added Dereference, StaticLECall, SelectN, SelectNAddr Change-Id: I5426ae488e83956539aa07f7415b8acc26c933e6 Reviewed-on: https://go-review.googlesource.com/c/go/+/239082 Trust: David Chase Run-TryBot: David Chase Reviewed-by: Cherry Zhang TryBot-Result: Go Bot --- .../compile/internal/ssa/gen/genericOps.go | 15 ++++++---- src/cmd/compile/internal/ssa/opGen.go | 28 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/genericOps.go b/src/cmd/compile/internal/ssa/gen/genericOps.go index 145ba2d50c..95edff4c8c 100644 --- a/src/cmd/compile/internal/ssa/gen/genericOps.go +++ b/src/cmd/compile/internal/ssa/gen/genericOps.go @@ -346,6 +346,7 @@ var genericOps = []opData{ // Memory operations {name: "Load", argLength: 2}, // Load from arg0. arg1=memory + {name: "Dereference", argLength: 2}, // Load from arg0. arg1=memory. Helper op for arg/result passing, result is an otherwise not-SSA-able "value". {name: "Store", argLength: 3, typ: "Mem", aux: "Typ"}, // Store arg1 to arg0. arg2=memory, aux=type. Returns memory. // The source and destination of Move may overlap in some cases. See e.g. // memmove inlining in generic.rules. When inlineablememmovesize (in ../rewrite.go) @@ -387,9 +388,11 @@ var genericOps = []opData{ // as a phantom first argument. // TODO(josharian): ClosureCall and InterCall should have Int32 aux // to match StaticCall's 32 bit arg size limit. - {name: "ClosureCall", argLength: 3, aux: "CallOff", call: true}, // arg0=code pointer, arg1=context ptr, arg2=memory. auxint=arg size. Returns memory. - {name: "StaticCall", argLength: 1, aux: "CallOff", call: true}, // call function aux.(*obj.LSym), arg0=memory. auxint=arg size. Returns memory. - {name: "InterCall", argLength: 2, aux: "CallOff", call: true}, // interface call. arg0=code pointer, arg1=memory, auxint=arg size. Returns memory. + // TODO(drchase,josharian): could the arg size limit be bundled into the rules for CallOff? + {name: "ClosureCall", argLength: 3, aux: "CallOff", call: true}, // arg0=code pointer, arg1=context ptr, arg2=memory. auxint=arg size. Returns memory. + {name: "StaticCall", argLength: 1, aux: "CallOff", call: true}, // call function aux.(*obj.LSym), arg0=memory. auxint=arg size. Returns memory. + {name: "InterCall", argLength: 2, aux: "CallOff", call: true}, // interface call. arg0=code pointer, arg1=memory, auxint=arg size. Returns memory. + {name: "StaticLECall", argLength: -1, aux: "CallOff", call: true}, // late-expanded static call function aux.(*ssa.AuxCall.Fn). arg0..argN-1 are inputs, argN is mem. auxint = arg size. Result is tuple of result(s), plus mem. // Conversions: signed extensions, zero (unsigned) extensions, truncations {name: "SignExt8to16", argLength: 1, typ: "Int16"}, @@ -531,8 +534,10 @@ var genericOps = []opData{ {name: "Cvt64Fto64U", argLength: 1}, // float64 -> uint64, only used on archs that has the instruction // pseudo-ops for breaking Tuple - {name: "Select0", argLength: 1, zeroWidth: true}, // the first component of a tuple - {name: "Select1", argLength: 1, zeroWidth: true}, // the second component of a tuple + {name: "Select0", argLength: 1, zeroWidth: true}, // the first component of a tuple + {name: "Select1", argLength: 1, zeroWidth: true}, // the second component of a tuple + {name: "SelectN", argLength: 1, aux: "Int64"}, // arg0=tuple, auxint=field index. Returns the auxint'th member. + {name: "SelectNAddr", argLength: 1, aux: "Int64"}, // arg0=tuple, auxint=field index. Returns the address of auxint'th member. Used for un-SSA-able result types. // Atomic operations used for semantically inlining runtime/internal/atomic. // Atomic loads return a new memory so that the loads are properly ordered diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index f00dc3f7f5..1fc0f7ea79 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -2717,6 +2717,7 @@ const ( OpSP OpSB OpLoad + OpDereference OpStore OpMove OpZero @@ -2730,6 +2731,7 @@ const ( OpClosureCall OpStaticCall OpInterCall + OpStaticLECall OpSignExt8to16 OpSignExt8to32 OpSignExt8to64 @@ -2826,6 +2828,8 @@ const ( OpCvt64Fto64U OpSelect0 OpSelect1 + OpSelectN + OpSelectNAddr OpAtomicLoad8 OpAtomicLoad32 OpAtomicLoad64 @@ -34742,6 +34746,11 @@ var opcodeTable = [...]opInfo{ argLen: 2, generic: true, }, + { + name: "Dereference", + argLen: 2, + generic: true, + }, { name: "Store", auxType: auxTyp, @@ -34827,6 +34836,13 @@ var opcodeTable = [...]opInfo{ call: true, generic: true, }, + { + name: "StaticLECall", + auxType: auxCallOff, + argLen: -1, + call: true, + generic: true, + }, { name: "SignExt8to16", argLen: 1, @@ -35328,6 +35344,18 @@ var opcodeTable = [...]opInfo{ zeroWidth: true, generic: true, }, + { + name: "SelectN", + auxType: auxInt64, + argLen: 1, + generic: true, + }, + { + name: "SelectNAddr", + auxType: auxInt64, + argLen: 1, + generic: true, + }, { name: "AtomicLoad8", argLen: 2, -- GitLab From 6796a7fb127676b61375339076ae1c982a721dde Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 17 Sep 2020 09:09:39 -0400 Subject: [PATCH 0527/1792] cmd/addr2line: don't assume that GOROOT_FINAL is clean Fixes #41447 Change-Id: I4460c1c7962d02c41622a5ea1a3c4bc3714a1873 Reviewed-on: https://go-review.googlesource.com/c/go/+/255477 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- src/cmd/addr2line/addr2line_test.go | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/cmd/addr2line/addr2line_test.go b/src/cmd/addr2line/addr2line_test.go index 578d88e432..7973aa2fe1 100644 --- a/src/cmd/addr2line/addr2line_test.go +++ b/src/cmd/addr2line/addr2line_test.go @@ -73,29 +73,37 @@ func testAddr2Line(t *testing.T, exepath, addr string) { if err != nil { t.Fatalf("Stat failed: %v", err) } + // Debug paths are stored slash-separated, so convert to system-native. srcPath = filepath.FromSlash(srcPath) fi2, err := os.Stat(srcPath) - if gorootFinal := os.Getenv("GOROOT_FINAL"); gorootFinal != "" && strings.HasPrefix(srcPath, gorootFinal) { - if os.IsNotExist(err) || (err == nil && !os.SameFile(fi1, fi2)) { - // srcPath has had GOROOT_FINAL substituted for GOROOT, and it doesn't - // match the actual file. GOROOT probably hasn't been moved to its final - // location yet, so try the original location instead. + + // If GOROOT_FINAL is set and srcPath is not the file we expect, perhaps + // srcPath has had GOROOT_FINAL substituted for GOROOT and GOROOT hasn't been + // moved to its final location yet. If so, try the original location instead. + if gorootFinal := os.Getenv("GOROOT_FINAL"); gorootFinal != "" && + (os.IsNotExist(err) || (err == nil && !os.SameFile(fi1, fi2))) { + // srcPath is clean, but GOROOT_FINAL itself might not be. + // (See https://golang.org/issue/41447.) + gorootFinal = filepath.Clean(gorootFinal) + + if strings.HasPrefix(srcPath, gorootFinal) { fi2, err = os.Stat(runtime.GOROOT() + strings.TrimPrefix(srcPath, gorootFinal)) } } + if err != nil { t.Fatalf("Stat failed: %v", err) } if !os.SameFile(fi1, fi2) { t.Fatalf("addr2line_test.go and %s are not same file", srcPath) } - if srcLineNo != "99" { - t.Fatalf("line number = %v; want 99", srcLineNo) + if srcLineNo != "107" { + t.Fatalf("line number = %v; want 107", srcLineNo) } } -// This is line 98. The test depends on that. +// This is line 106. The test depends on that. func TestAddr2Line(t *testing.T) { testenv.MustHaveGoBuild(t) -- GitLab From 22053790fa2c0944df53ea95df476ad2f855424f Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 17 Sep 2020 09:55:23 -0700 Subject: [PATCH 0528/1792] cmd/compile: propagate go:notinheap implicitly //go:notinheap type T int type U T We already correctly propagate the notinheap-ness of T to U. But we have an assertion in the typechecker that if there's no explicit //go:notinheap associated with U, then report an error. Get rid of that error so that implicit propagation is allowed. Adjust the tests so that we make sure that uses of types like U do correctly report an error when U is used in a context that might cause a Go heap allocation. Fixes #41451 Update #40954 Update #41432 Change-Id: I1692bc7cceff21ebb3f557f3748812a40887118d Reviewed-on: https://go-review.googlesource.com/c/go/+/255637 Run-TryBot: Keith Randall Reviewed-by: Cuong Manh Le Reviewed-by: Ian Lance Taylor Trust: Cuong Manh Le TryBot-Result: Go Bot --- src/cmd/compile/internal/gc/typecheck.go | 6 ------ test/notinheap.go | 20 ------------------ test/notinheap2.go | 26 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 55773641ed..834c1a8ee6 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -2068,12 +2068,6 @@ func typecheck1(n *Node, top int) (res *Node) { ok |= ctxStmt n.Left = typecheck(n.Left, ctxType) checkwidth(n.Left.Type) - if n.Left.Type != nil && n.Left.Type.NotInHeap() && !n.Left.Name.Param.Alias && n.Left.Name.Param.Pragma&NotInHeap == 0 { - // The type contains go:notinheap types, so it - // must be marked as such (alternatively, we - // could silently propagate go:notinheap). - yyerror("type %v must be go:notinheap", n.Left.Type) - } } t := n.Type diff --git a/test/notinheap.go b/test/notinheap.go index 5dd4997a65..2188a38a14 100644 --- a/test/notinheap.go +++ b/test/notinheap.go @@ -11,18 +11,6 @@ package p //go:notinheap type nih struct{} -// Types embedding notinheap types must be notinheap. - -type embed1 struct { // ERROR "must be go:notinheap" - x nih -} - -type embed2 [1]nih // ERROR "must be go:notinheap" - -type embed3 struct { // ERROR "must be go:notinheap" - x [1]nih -} - type embed4 map[nih]int // ERROR "incomplete \(or unallocatable\) map key not allowed" type embed5 map[int]nih // ERROR "incomplete \(or unallocatable\) map value not allowed" @@ -52,14 +40,6 @@ type t3 byte //go:notinheap type t4 rune -// Type aliases inherit the go:notinheap-ness of the type they alias. -type nihAlias = nih - -type embedAlias1 struct { // ERROR "must be go:notinheap" - x nihAlias -} -type embedAlias2 [1]nihAlias // ERROR "must be go:notinheap" - var sink interface{} func i() { diff --git a/test/notinheap2.go b/test/notinheap2.go index 23d4b0ae77..100ed37b72 100644 --- a/test/notinheap2.go +++ b/test/notinheap2.go @@ -32,6 +32,25 @@ var y3 *[1]nih var z []nih var w []nih var n int +var sink interface{} + +type embed1 struct { // implicitly notinheap + x nih +} + +type embed2 [1]nih // implicitly notinheap + +type embed3 struct { // implicitly notinheap + x [1]nih +} + +// Type aliases inherit the go:notinheap-ness of the type they alias. +type nihAlias = nih + +type embedAlias1 struct { // implicitly notinheap + x nihAlias +} +type embedAlias2 [1]nihAlias // implicitly notinheap func g() { y = new(nih) // ERROR "can't be allocated in Go" @@ -39,6 +58,13 @@ func g() { y3 = new([1]nih) // ERROR "can't be allocated in Go" z = make([]nih, 1) // ERROR "can't be allocated in Go" z = append(z, x) // ERROR "can't be allocated in Go" + + sink = new(embed1) // ERROR "can't be allocated in Go" + sink = new(embed2) // ERROR "can't be allocated in Go" + sink = new(embed3) // ERROR "can't be allocated in Go" + sink = new(embedAlias1) // ERROR "can't be allocated in Go" + sink = new(embedAlias2) // ERROR "can't be allocated in Go" + // Test for special case of OMAKESLICECOPY x := make([]nih, n) // ERROR "can't be allocated in Go" copy(x, z) -- GitLab From e6426dfd6dbc47ba23b8a91003b8f947c5afa692 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 17 Sep 2020 16:05:52 +0200 Subject: [PATCH 0529/1792] net: use IFF_* consts from package syscall on solaris All necessary IFF_* consts are available in the syscall package. Use them in linkFlags instead of duplicating them. Change-Id: Ibd2b0f6f39f98bfad2a0c8c55d1eb64167aeee03 Reviewed-on: https://go-review.googlesource.com/c/go/+/255497 Trust: Tobias Klauser Run-TryBot: Tobias Klauser Reviewed-by: Brad Fitzpatrick --- src/net/interface_solaris.go | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/src/net/interface_solaris.go b/src/net/interface_solaris.go index 5f9367f996..f8d1571b90 100644 --- a/src/net/interface_solaris.go +++ b/src/net/interface_solaris.go @@ -32,39 +32,21 @@ func interfaceTable(ifindex int) ([]Interface, error) { return ift, nil } -const ( - sysIFF_UP = 0x1 - sysIFF_BROADCAST = 0x2 - sysIFF_DEBUG = 0x4 - sysIFF_LOOPBACK = 0x8 - sysIFF_POINTOPOINT = 0x10 - sysIFF_NOTRAILERS = 0x20 - sysIFF_RUNNING = 0x40 - sysIFF_NOARP = 0x80 - sysIFF_PROMISC = 0x100 - sysIFF_ALLMULTI = 0x200 - sysIFF_INTELLIGENT = 0x400 - sysIFF_MULTICAST = 0x800 - sysIFF_MULTI_BCAST = 0x1000 - sysIFF_UNNUMBERED = 0x2000 - sysIFF_PRIVATE = 0x8000 -) - func linkFlags(rawFlags int) Flags { var f Flags - if rawFlags&sysIFF_UP != 0 { + if rawFlags&syscall.IFF_UP != 0 { f |= FlagUp } - if rawFlags&sysIFF_BROADCAST != 0 { + if rawFlags&syscall.IFF_BROADCAST != 0 { f |= FlagBroadcast } - if rawFlags&sysIFF_LOOPBACK != 0 { + if rawFlags&syscall.IFF_LOOPBACK != 0 { f |= FlagLoopback } - if rawFlags&sysIFF_POINTOPOINT != 0 { + if rawFlags&syscall.IFF_POINTOPOINT != 0 { f |= FlagPointToPoint } - if rawFlags&sysIFF_MULTICAST != 0 { + if rawFlags&syscall.IFF_MULTICAST != 0 { f |= FlagMulticast } return f -- GitLab From 9a702fd427645e4bcd42a68f9676bc1ab2adb6e4 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 17 Sep 2020 15:54:13 -0400 Subject: [PATCH 0530/1792] cmd/go: flip relationship between load and modload Previously, modload imported load, but it mainly just did so in order to install callbacks to the modload API. This was important during vgo development, but there's no longer a strong reason to do this. Nothing modload imports strongly depends on load, so there's little danger of a dependency cycle. This change deletes the callbacks in load and instead, makes load call exported functions in modload directly. In the future, these functions may have different signatures than their GOPATH counterparts. Change-Id: Ifde5c3ffebd190b5bd184924ec447d272b936f27 Reviewed-on: https://go-review.googlesource.com/c/go/+/255719 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/load/pkg.go | 46 ++++++++++----------------- src/cmd/go/internal/modload/import.go | 7 ---- src/cmd/go/internal/modload/init.go | 14 +------- src/cmd/go/internal/vcs/vcs.go | 36 ++++++++++++++++++--- src/cmd/go/internal/work/exec.go | 3 +- src/cmd/go/internal/work/init.go | 4 +-- 6 files changed, 53 insertions(+), 57 deletions(-) diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 71fd9b5538..d06e65737d 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -28,27 +28,13 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modinfo" + "cmd/go/internal/modload" "cmd/go/internal/par" "cmd/go/internal/search" "cmd/go/internal/str" "cmd/go/internal/trace" ) -var ( - // module initialization hook; never nil, no-op if module use is disabled - ModInit func() - - // module hooks; nil if module use is disabled - ModBinDir func() string // return effective bin directory - ModLookup func(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) // lookup effective meaning of import - ModPackageModuleInfo func(path string) *modinfo.ModulePublic // return module info for Package struct - ModImportPaths func(ctx context.Context, args []string) []*search.Match // expand import paths - ModPackageBuildInfo func(main string, deps []string) string // return module info to embed in binary - ModInfoProg func(info string, isgccgo bool) []byte // wrap module info in .go code for binary - ModImportFromFiles func(context.Context, []string) // update go.mod to add modules for imports in these files - ModDirImportPath func(string) string // return effective import path for directory -) - var IgnoreImports bool // control whether we ignore imports in packages // A Package describes a single package found in a directory. @@ -770,7 +756,7 @@ func loadPackageData(path, parentPath, parentDir, parentRoot string, parentIsStd r.dir = filepath.Join(parentDir, path) r.path = dirToImportPath(r.dir) } else if cfg.ModulesEnabled { - r.dir, r.path, r.err = ModLookup(parentPath, parentIsStd, path) + r.dir, r.path, r.err = modload.Lookup(parentPath, parentIsStd, path) } else if mode&ResolveImport != 0 { // We do our own path resolution, because we want to // find out the key to use in packageCache without the @@ -801,7 +787,7 @@ func loadPackageData(path, parentPath, parentDir, parentRoot string, parentIsStd } data.p, data.err = cfg.BuildContext.ImportDir(r.dir, buildMode) if data.p.Root == "" && cfg.ModulesEnabled { - if info := ModPackageModuleInfo(path); info != nil { + if info := modload.PackageModuleInfo(path); info != nil { data.p.Root = info.Dir } } @@ -827,7 +813,7 @@ func loadPackageData(path, parentPath, parentDir, parentRoot string, parentIsStd if cfg.GOBIN != "" { data.p.BinDir = cfg.GOBIN } else if cfg.ModulesEnabled { - data.p.BinDir = ModBinDir() + data.p.BinDir = modload.BinDir() } } @@ -895,8 +881,8 @@ var preloadWorkerCount = runtime.GOMAXPROCS(0) // to ensure preload goroutines are no longer active. This is necessary // because of global mutable state that cannot safely be read and written // concurrently. In particular, packageDataCache may be cleared by "go get" -// in GOPATH mode, and modload.loaded (accessed via ModLookup) may be -// modified by modload.ImportPaths (ModImportPaths). +// in GOPATH mode, and modload.loaded (accessed via modload.Lookup) may be +// modified by modload.ImportPaths (modload.ImportPaths). type preload struct { cancel chan struct{} sema chan struct{} @@ -1006,7 +992,7 @@ func ResolveImportPath(parent *Package, path string) (found string) { func resolveImportPath(path, parentPath, parentDir, parentRoot string, parentIsStd bool) (found string) { if cfg.ModulesEnabled { - if _, p, e := ModLookup(parentPath, parentIsStd, path); e == nil { + if _, p, e := modload.Lookup(parentPath, parentIsStd, path); e == nil { return p } return path @@ -1369,7 +1355,7 @@ func disallowInternal(srcDir string, importer *Package, importerPath string, p * // directory containing them. // If the directory is outside the main module, this will resolve to ".", // which is not a prefix of any valid module. - importerPath = ModDirImportPath(importer.Dir) + importerPath = modload.DirImportPath(importer.Dir) } parentOfInternal := p.ImportPath[:i] if str.HasPathPrefix(importerPath, parentOfInternal) { @@ -1652,7 +1638,7 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor elem = full } if p.Internal.Build.BinDir == "" && cfg.ModulesEnabled { - p.Internal.Build.BinDir = ModBinDir() + p.Internal.Build.BinDir = modload.BinDir() } if p.Internal.Build.BinDir != "" { // Install to GOBIN or bin of GOPATH entry. @@ -1861,9 +1847,9 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor if p.Internal.CmdlineFiles { mainPath = "command-line-arguments" } - p.Module = ModPackageModuleInfo(mainPath) + p.Module = modload.PackageModuleInfo(mainPath) if p.Name == "main" && len(p.DepsErrors) == 0 { - p.Internal.BuildInfo = ModPackageBuildInfo(mainPath, p.Deps) + p.Internal.BuildInfo = modload.PackageBuildInfo(mainPath, p.Deps) } } } @@ -2229,8 +2215,8 @@ func setToolFlags(pkgs ...*Package) { } func ImportPaths(ctx context.Context, args []string) []*search.Match { - if ModInit(); cfg.ModulesEnabled { - return ModImportPaths(ctx, args) + if modload.Init(); cfg.ModulesEnabled { + return modload.ImportPaths(ctx, args) } return search.ImportPaths(args) } @@ -2282,7 +2268,7 @@ func PackagesForBuild(ctx context.Context, args []string) []*Package { // (typically named on the command line). The target is named p.a for // package p or named after the first Go file for package main. func GoFilesPackage(ctx context.Context, gofiles []string) *Package { - ModInit() + modload.Init() for _, f := range gofiles { if !strings.HasSuffix(f, ".go") { @@ -2329,7 +2315,7 @@ func GoFilesPackage(ctx context.Context, gofiles []string) *Package { ctxt.ReadDir = func(string) ([]os.FileInfo, error) { return dirent, nil } if cfg.ModulesEnabled { - ModImportFromFiles(ctx, gofiles) + modload.ImportFromFiles(ctx, gofiles) } var err error @@ -2357,7 +2343,7 @@ func GoFilesPackage(ctx context.Context, gofiles []string) *Package { if cfg.GOBIN != "" { pkg.Target = filepath.Join(cfg.GOBIN, exe) } else if cfg.ModulesEnabled { - pkg.Target = filepath.Join(ModBinDir(), exe) + pkg.Target = filepath.Join(modload.BinDir(), exe) } } diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 10b1e7f4b8..e93eebcb81 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -17,7 +17,6 @@ import ( "time" "cmd/go/internal/cfg" - "cmd/go/internal/load" "cmd/go/internal/modfetch" "cmd/go/internal/par" "cmd/go/internal/search" @@ -38,8 +37,6 @@ type ImportMissingError struct { newMissingVersion string } -var _ load.ImportPathError = (*ImportMissingError)(nil) - func (e *ImportMissingError) Error() string { if e.Module.Path == "" { if search.IsStandardImportPath(e.Path) { @@ -105,8 +102,6 @@ func (e *AmbiguousImportError) Error() string { return buf.String() } -var _ load.ImportPathError = &AmbiguousImportError{} - type invalidImportError struct { importPath string err error @@ -124,8 +119,6 @@ func (e *invalidImportError) Unwrap() error { return e.err } -var _ load.ImportPathError = &invalidImportError{} - // importFromBuildList finds the module and directory in the build list // containing the package with the given import path. The answer must be unique: // importFromBuildList returns an error if multiple modules attempt to provide diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 60aadf23ea..2c95fa4263 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -22,7 +22,6 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" - "cmd/go/internal/load" "cmd/go/internal/lockedfile" "cmd/go/internal/modconv" "cmd/go/internal/modfetch" @@ -210,14 +209,7 @@ func Init() { } cfg.ModulesEnabled = true - load.ModBinDir = BinDir - load.ModLookup = Lookup - load.ModPackageModuleInfo = PackageModuleInfo - load.ModImportPaths = ImportPaths - load.ModPackageBuildInfo = PackageBuildInfo - load.ModInfoProg = ModInfoProg - load.ModImportFromFiles = ImportFromFiles - load.ModDirImportPath = DirImportPath + // load.ModDirImportPath = DirImportPath if modRoot == "" { // We're in module mode, but not inside a module. @@ -243,10 +235,6 @@ func Init() { } } -func init() { - load.ModInit = Init -} - // WillBeEnabled checks whether modules should be enabled but does not // initialize modules by installing hooks. If Init has already been called, // WillBeEnabled returns the same result as Enabled. diff --git a/src/cmd/go/internal/vcs/vcs.go b/src/cmd/go/internal/vcs/vcs.go index e535998d89..90bf10244d 100644 --- a/src/cmd/go/internal/vcs/vcs.go +++ b/src/cmd/go/internal/vcs/vcs.go @@ -21,7 +21,6 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" - "cmd/go/internal/load" "cmd/go/internal/web" ) @@ -664,7 +663,7 @@ func RepoRootForImportPath(importPath string, mod ModuleMode, security web.Secur if err == errUnknownSite { rr, err = repoRootForImportDynamic(importPath, mod, security) if err != nil { - err = load.ImportErrorf(importPath, "unrecognized import path %q: %v", importPath, err) + err = importErrorf(importPath, "unrecognized import path %q: %v", importPath, err) } } if err != nil { @@ -679,7 +678,7 @@ func RepoRootForImportPath(importPath string, mod ModuleMode, security web.Secur if err == nil && strings.Contains(importPath, "...") && strings.Contains(rr.Root, "...") { // Do not allow wildcards in the repo root. rr = nil - err = load.ImportErrorf(importPath, "cannot expand ... in %q", importPath) + err = importErrorf(importPath, "cannot expand ... in %q", importPath) } return rr, err } @@ -703,7 +702,7 @@ func repoRootFromVCSPaths(importPath string, security web.SecurityMode, vcsPaths m := srv.regexp.FindStringSubmatch(importPath) if m == nil { if srv.prefix != "" { - return nil, load.ImportErrorf(importPath, "invalid %s import path %q", srv.prefix, importPath) + return nil, importErrorf(importPath, "invalid %s import path %q", srv.prefix, importPath) } continue } @@ -1185,3 +1184,32 @@ func launchpadVCS(match map[string]string) error { } return nil } + +// importError is a copy of load.importError, made to avoid a dependency cycle +// on cmd/go/internal/load. It just needs to satisfy load.ImportPathError. +type importError struct { + importPath string + err error +} + +func importErrorf(path, format string, args ...interface{}) error { + err := &importError{importPath: path, err: fmt.Errorf(format, args...)} + if errStr := err.Error(); !strings.Contains(errStr, path) { + panic(fmt.Sprintf("path %q not in error %q", path, errStr)) + } + return err +} + +func (e *importError) Error() string { + return e.err.Error() +} + +func (e *importError) Unwrap() error { + // Don't return e.err directly, since we're only wrapping an error if %w + // was passed to ImportErrorf. + return errors.Unwrap(e.err) +} + +func (e *importError) ImportPath() string { + return e.importPath +} diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 9da5a44e17..afd6fd6d3f 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -31,6 +31,7 @@ import ( "cmd/go/internal/cache" "cmd/go/internal/cfg" "cmd/go/internal/load" + "cmd/go/internal/modload" "cmd/go/internal/str" "cmd/go/internal/trace" ) @@ -692,7 +693,7 @@ func (b *Builder) build(ctx context.Context, a *Action) (err error) { } if p.Internal.BuildInfo != "" && cfg.ModulesEnabled { - if err := b.writeFile(objdir+"_gomod_.go", load.ModInfoProg(p.Internal.BuildInfo, cfg.BuildToolchainName == "gccgo")); err != nil { + if err := b.writeFile(objdir+"_gomod_.go", modload.ModInfoProg(p.Internal.BuildInfo, cfg.BuildToolchainName == "gccgo")); err != nil { return err } gofiles = append(gofiles, objdir+"_gomod_.go") diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go index d71387d323..42692acd3b 100644 --- a/src/cmd/go/internal/work/init.go +++ b/src/cmd/go/internal/work/init.go @@ -9,7 +9,7 @@ package work import ( "cmd/go/internal/base" "cmd/go/internal/cfg" - "cmd/go/internal/load" + "cmd/go/internal/modload" "cmd/internal/objabi" "cmd/internal/sys" "flag" @@ -21,7 +21,7 @@ import ( ) func BuildInit() { - load.ModInit() + modload.Init() instrumentInit() buildModeInit() -- GitLab From 7a095c32366593f637a95bc927c63454125e3015 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 15 Sep 2020 15:14:55 -0400 Subject: [PATCH 0531/1792] cmd/go/internal/modload: avoid a network fetch when querying a valid semantic version Test this behavior incidentally in a test for ambiguous import errors. (I rediscovered the error when writing the new test.) For #32567 Updates #28806 Change-Id: I323f05145734e5cf99818b9f04d65075f7c0f787 Reviewed-on: https://go-review.googlesource.com/c/go/+/255046 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Michael Matloob Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/query.go | 21 +++++-- .../script/mod_get_ambiguous_import.txt | 60 +++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_get_ambiguous_import.txt diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index f67a738677..5ddb4e6565 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -212,7 +212,20 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed default: // Direct lookup of semantic version or commit identifier. - // + + // If the query is a valid semantic version and that version is replaced, + // use the replacement module without searching the proxy. + canonicalQuery := module.CanonicalVersion(query) + if canonicalQuery != "" { + m := module.Version{Path: path, Version: query} + if r := Replacement(m); r.Path != "" { + if err := allowed(ctx, m); errors.Is(err, ErrDisallowed) { + return nil, err + } + return &modfetch.RevInfo{Version: query}, nil + } + } + // 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. @@ -222,9 +235,9 @@ func queryProxy(ctx context.Context, proxy, path, query, current string, allowed // The full query doesn't correspond to a tag. If it is a semantic version // with a +metadata suffix, see if there is a tag without that suffix: // semantic versioning defines them to be equivalent. - if vers := module.CanonicalVersion(query); vers != "" && vers != query { - info, err = modfetch.Stat(proxy, path, vers) - if !errors.Is(err, os.ErrNotExist) { + if canonicalQuery != "" && query != canonicalQuery { + info, err = modfetch.Stat(proxy, path, canonicalQuery) + if err != nil && !errors.Is(err, os.ErrNotExist) { return info, err } } diff --git a/src/cmd/go/testdata/script/mod_get_ambiguous_import.txt b/src/cmd/go/testdata/script/mod_get_ambiguous_import.txt new file mode 100644 index 0000000000..8f5bf20636 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_ambiguous_import.txt @@ -0,0 +1,60 @@ +go list -m all +stdout '^example.net/m v0.1.0 ' +! stdout '^example.net/m/p ' +cp go.mod go.mod.orig + +# Upgrading example.net/m/p without also upgrading example.net/m +# causes the import of package example.net/m/p to be ambiguous. +# +# TODO(#27899): Should we automatically upgrade example.net/m to v0.2.0 +# to resolve the conflict? +! go get -d example.net/m/p@v1.0.0 +stderr '^go get example.net/m/p@v1.0.0: 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. +# Note that this command line mixes a module path (example.net/m) +# and a package path (example.net/m/p) in the same command. +go get -d example.net/m@v0.2.0 example.net/m/p@v1.0.0 + +go list -m all +stdout '^example.net/m v0.2.0 ' +stdout '^example.net/m/p v1.0.0 ' + +-- go.mod -- +module example.net/importer + +go 1.16 + +require ( + example.net/m v0.1.0 +) + +replace ( + example.net/m v0.1.0 => ./m1 + example.net/m v0.2.0 => ./m2 + example.net/m/p v1.0.0 => ./p0 +) +-- importer.go -- +package importer +import _ "example.net/m/p" +-- m1/go.mod -- +module example.net/m + +go 1.16 +-- m1/p/p.go -- +package p +-- m2/go.mod -- +module example.net/m + +go 1.16 +-- m2/README.txt -- +Package p has been moved to module …/m/p. +Module …/m/p does not require any version of module …/m. + +-- p0/go.mod -- +module example.net/m/p + +go 1.16 +-- p0/p.go -- +package p -- GitLab From 75fab04b83a832eb84bec9e1f23d395a342c865c Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 17 Sep 2020 15:31:07 -0400 Subject: [PATCH 0532/1792] cmd/asm: make asm -S flag consistent with compile -S flag Change things so that the -S command line option for the assembler works the same as -S in the compiler, e.g. you can use -S=2 to get additional detail. Change-Id: I7bdfba39a98e67c7ae4b93019e171b188bb99a2d Reviewed-on: https://go-review.googlesource.com/c/go/+/255717 Trust: Than McIntosh Run-TryBot: Than McIntosh Reviewed-by: Cherry Zhang Reviewed-by: David Chase TryBot-Result: Go Bot --- src/cmd/asm/internal/flags/flags.go | 7 ++++--- src/cmd/asm/main.go | 4 +--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/cmd/asm/internal/flags/flags.go b/src/cmd/asm/internal/flags/flags.go index 1df9df9563..64024cc97d 100644 --- a/src/cmd/asm/internal/flags/flags.go +++ b/src/cmd/asm/internal/flags/flags.go @@ -17,7 +17,6 @@ import ( var ( Debug = flag.Bool("debug", false, "dump instructions as they are parsed") OutputFile = flag.String("o", "", "output file; default foo.o for /a/b/c/foo.s as first argument") - PrintOut = flag.Bool("S", false, "print assembly and machine code") TrimPath = flag.String("trimpath", "", "remove prefix from recorded source file paths") Shared = flag.Bool("shared", false, "generate code that can be linked into a shared library") Dynlink = flag.Bool("dynlink", false, "support references to Go symbols defined in other shared libraries") @@ -28,14 +27,16 @@ var ( ) var ( - D MultiFlag - I MultiFlag + D MultiFlag + I MultiFlag + PrintOut int ) func init() { flag.Var(&D, "D", "predefined symbol with optional simple value -D=identifier=value; can be set multiple times") flag.Var(&I, "I", "include directory; can be set multiple times") objabi.AddVersionFlag() // -V + objabi.Flagcount("S", "print assembly and machine code", &PrintOut) } // MultiFlag allows setting a value multiple times to collect a list, as in -I=dir1 -I=dir2. diff --git a/src/cmd/asm/main.go b/src/cmd/asm/main.go index a6eb44de73..fd079a2ccd 100644 --- a/src/cmd/asm/main.go +++ b/src/cmd/asm/main.go @@ -35,9 +35,7 @@ func main() { flags.Parse() ctxt := obj.Linknew(architecture.LinkArch) - if *flags.PrintOut { - ctxt.Debugasm = 1 - } + ctxt.Debugasm = flags.PrintOut ctxt.Flag_dynlink = *flags.Dynlink ctxt.Flag_shared = *flags.Shared || *flags.Dynlink ctxt.IsAsm = true -- GitLab From 982ac06f3df4ea08ae0506e6f9fb53eb27ddb140 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 17 Sep 2020 15:35:31 -0400 Subject: [PATCH 0533/1792] cmd/compile,cmd/asm: dump sym ABI versions for -S=2 When -S=2 is in effect for the compiler/assembler, include symbol ABI values for defined symbols and relocations. This is intended to help make it easier to distinguish between a symbol and its ABI wrapper. Change-Id: Ifbf71372392075f15363b40e882b2132406b7d6d Reviewed-on: https://go-review.googlesource.com/c/go/+/255718 Trust: Than McIntosh Run-TryBot: Than McIntosh TryBot-Result: Go Bot Reviewed-by: Cherry Zhang Reviewed-by: David Chase --- src/cmd/internal/obj/objfile.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 7bc4f4992e..aede5fe71c 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -663,7 +663,11 @@ func (ctxt *Link) writeSymDebug(s *LSym) { } func (ctxt *Link) writeSymDebugNamed(s *LSym, name string) { - fmt.Fprintf(ctxt.Bso, "%s ", name) + ver := "" + if ctxt.Debugasm > 1 { + ver = fmt.Sprintf("<%d>", s.ABI()) + } + fmt.Fprintf(ctxt.Bso, "%s%s ", name, ver) if s.Type != 0 { fmt.Fprintf(ctxt.Bso, "%v ", s.Type) } @@ -726,15 +730,19 @@ func (ctxt *Link) writeSymDebugNamed(s *LSym, name string) { sort.Sort(relocByOff(s.R)) // generate stable output for _, r := range s.R { name := "" + ver := "" if r.Sym != nil { name = r.Sym.Name + if ctxt.Debugasm > 1 { + ver = fmt.Sprintf("<%d>", s.ABI()) + } } else if r.Type == objabi.R_TLS_LE { name = "TLS" } if ctxt.Arch.InFamily(sys.ARM, sys.PPC64) { - fmt.Fprintf(ctxt.Bso, "\trel %d+%d t=%d %s+%x\n", int(r.Off), r.Siz, r.Type, name, uint64(r.Add)) + fmt.Fprintf(ctxt.Bso, "\trel %d+%d t=%d %s%s+%x\n", int(r.Off), r.Siz, r.Type, name, ver, uint64(r.Add)) } else { - fmt.Fprintf(ctxt.Bso, "\trel %d+%d t=%d %s+%d\n", int(r.Off), r.Siz, r.Type, name, r.Add) + fmt.Fprintf(ctxt.Bso, "\trel %d+%d t=%d %s%s+%d\n", int(r.Off), r.Siz, r.Type, name, ver, r.Add) } } } -- GitLab From 9e9c030083491aa485152601ebb3b96faa6dec4c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 15 Sep 2020 21:20:22 -0700 Subject: [PATCH 0534/1792] debug/elf: add many PT_ and DT_ constants Change-Id: Icbb5a0f0ff4aa0a425aa4a15477da7bd0d58339c Reviewed-on: https://go-review.googlesource.com/c/go/+/255138 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Tobias Klauser Reviewed-by: Cherry Zhang --- src/debug/elf/elf.go | 223 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 201 insertions(+), 22 deletions(-) diff --git a/src/debug/elf/elf.go b/src/debug/elf/elf.go index 96a67ce732..2b777eabac 100644 --- a/src/debug/elf/elf.go +++ b/src/debug/elf/elf.go @@ -745,18 +745,51 @@ func (i CompressionType) GoString() string { return stringName(uint32(i), compre type ProgType int const ( - PT_NULL ProgType = 0 /* Unused entry. */ - PT_LOAD ProgType = 1 /* Loadable segment. */ - PT_DYNAMIC ProgType = 2 /* Dynamic linking information segment. */ - PT_INTERP ProgType = 3 /* Pathname of interpreter. */ - PT_NOTE ProgType = 4 /* Auxiliary information. */ - PT_SHLIB ProgType = 5 /* Reserved (not used). */ - PT_PHDR ProgType = 6 /* Location of program header itself. */ - PT_TLS ProgType = 7 /* Thread local storage segment */ - PT_LOOS ProgType = 0x60000000 /* First OS-specific. */ - PT_HIOS ProgType = 0x6fffffff /* Last OS-specific. */ - PT_LOPROC ProgType = 0x70000000 /* First processor-specific type. */ - PT_HIPROC ProgType = 0x7fffffff /* Last processor-specific type. */ + PT_NULL ProgType = 0 /* Unused entry. */ + PT_LOAD ProgType = 1 /* Loadable segment. */ + PT_DYNAMIC ProgType = 2 /* Dynamic linking information segment. */ + PT_INTERP ProgType = 3 /* Pathname of interpreter. */ + PT_NOTE ProgType = 4 /* Auxiliary information. */ + PT_SHLIB ProgType = 5 /* Reserved (not used). */ + PT_PHDR ProgType = 6 /* Location of program header itself. */ + PT_TLS ProgType = 7 /* Thread local storage segment */ + + PT_LOOS ProgType = 0x60000000 /* First OS-specific. */ + + PT_GNU_EH_FRAME ProgType = 0x6474e550 /* Frame unwind information */ + PT_GNU_STACK ProgType = 0x6474e551 /* Stack flags */ + PT_GNU_RELRO ProgType = 0x6474e552 /* Read only after relocs */ + PT_GNU_PROPERTY ProgType = 0x6474e553 /* GNU property */ + PT_GNU_MBIND_LO ProgType = 0x6474e555 /* Mbind segments start */ + PT_GNU_MBIND_HI ProgType = 0x6474f554 /* Mbind segments finish */ + + PT_PAX_FLAGS ProgType = 0x65041580 /* PAX flags */ + + PT_OPENBSD_RANDOMIZE ProgType = 0x65a3dbe6 /* Random data */ + PT_OPENBSD_WXNEEDED ProgType = 0x65a3dbe7 /* W^X violations */ + PT_OPENBSD_BOOTDATA ProgType = 0x65a41be6 /* Boot arguments */ + + PT_SUNW_EH_FRAME ProgType = 0x6474e550 /* Frame unwind information */ + PT_SUNWSTACK ProgType = 0x6ffffffb /* Stack segment */ + + PT_HIOS ProgType = 0x6fffffff /* Last OS-specific. */ + + PT_LOPROC ProgType = 0x70000000 /* First processor-specific type. */ + + PT_ARM_ARCHEXT ProgType = 0x70000000 /* Architecture compatibility */ + PT_ARM_EXIDX ProgType = 0x70000001 /* Exception unwind tables */ + + PT_AARCH64_ARCHEXT ProgType = 0x70000000 /* Architecture compatibility */ + PT_AARCH64_UNWIND ProgType = 0x70000001 /* Exception unwind tables */ + + PT_MIPS_REGINFO ProgType = 0x70000000 /* Register usage */ + PT_MIPS_RTPROC ProgType = 0x70000001 /* Runtime procedures */ + PT_MIPS_OPTIONS ProgType = 0x70000002 /* Options */ + PT_MIPS_ABIFLAGS ProgType = 0x70000003 /* ABI flags */ + + PT_S390_PGSTE ProgType = 0x70000000 /* 4k page table size */ + + PT_HIPROC ProgType = 0x7fffffff /* Last processor-specific type. */ ) var ptStrings = []intName{ @@ -769,8 +802,19 @@ var ptStrings = []intName{ {6, "PT_PHDR"}, {7, "PT_TLS"}, {0x60000000, "PT_LOOS"}, + {0x6474e550, "PT_GNU_EH_FRAME"}, + {0x6474e551, "PT_GNU_STACK"}, + {0x6474e552, "PT_GNU_RELRO"}, + {0x6474e553, "PT_GNU_PROPERTY"}, + {0x65041580, "PT_PAX_FLAGS"}, + {0x65a3dbe6, "PT_OPENBSD_RANDOMIZE"}, + {0x65a3dbe7, "PT_OPENBSD_WXNEEDED"}, + {0x65a41be6, "PT_OPENBSD_BOOTDATA"}, + {0x6ffffffb, "PT_SUNWSTACK"}, {0x6fffffff, "PT_HIOS"}, {0x70000000, "PT_LOPROC"}, + // We don't list the processor-dependent ProgTypes, + // as the values overlap. {0x7fffffff, "PT_HIPROC"}, } @@ -837,15 +881,114 @@ const ( the interpretation of the d_un union as follows: even == 'd_ptr', even == 'd_val' or none */ - DT_PREINIT_ARRAY DynTag = 32 /* Address of the array of pointers to pre-initialization functions. */ - DT_PREINIT_ARRAYSZ DynTag = 33 /* Size in bytes of the array of pre-initialization functions. */ - DT_LOOS DynTag = 0x6000000d /* First OS-specific */ - DT_HIOS DynTag = 0x6ffff000 /* Last OS-specific */ - DT_VERSYM DynTag = 0x6ffffff0 - DT_VERNEED DynTag = 0x6ffffffe - DT_VERNEEDNUM DynTag = 0x6fffffff - DT_LOPROC DynTag = 0x70000000 /* First processor-specific type. */ - DT_HIPROC DynTag = 0x7fffffff /* Last processor-specific type. */ + DT_PREINIT_ARRAY DynTag = 32 /* Address of the array of pointers to pre-initialization functions. */ + DT_PREINIT_ARRAYSZ DynTag = 33 /* Size in bytes of the array of pre-initialization functions. */ + DT_SYMTAB_SHNDX DynTag = 34 /* Address of SHT_SYMTAB_SHNDX section. */ + + DT_LOOS DynTag = 0x6000000d /* First OS-specific */ + DT_HIOS DynTag = 0x6ffff000 /* Last OS-specific */ + + DT_VALRNGLO DynTag = 0x6ffffd00 + DT_GNU_PRELINKED DynTag = 0x6ffffdf5 + DT_GNU_CONFLICTSZ DynTag = 0x6ffffdf6 + DT_GNU_LIBLISTSZ DynTag = 0x6ffffdf7 + DT_CHECKSUM DynTag = 0x6ffffdf8 + DT_PLTPADSZ DynTag = 0x6ffffdf9 + DT_MOVEENT DynTag = 0x6ffffdfa + DT_MOVESZ DynTag = 0x6ffffdfb + DT_FEATURE DynTag = 0x6ffffdfc + DT_POSFLAG_1 DynTag = 0x6ffffdfd + DT_SYMINSZ DynTag = 0x6ffffdfe + DT_SYMINENT DynTag = 0x6ffffdff + DT_VALRNGHI DynTag = 0x6ffffdff + + DT_ADDRRNGLO DynTag = 0x6ffffe00 + DT_GNU_HASH DynTag = 0x6ffffef5 + DT_TLSDESC_PLT DynTag = 0x6ffffef6 + DT_TLSDESC_GOT DynTag = 0x6ffffef7 + DT_GNU_CONFLICT DynTag = 0x6ffffef8 + DT_GNU_LIBLIST DynTag = 0x6ffffef9 + DT_CONFIG DynTag = 0x6ffffefa + DT_DEPAUDIT DynTag = 0x6ffffefb + DT_AUDIT DynTag = 0x6ffffefc + DT_PLTPAD DynTag = 0x6ffffefd + DT_MOVETAB DynTag = 0x6ffffefe + DT_SYMINFO DynTag = 0x6ffffeff + DT_ADDRRNGHI DynTag = 0x6ffffeff + + DT_VERSYM DynTag = 0x6ffffff0 + DT_RELACOUNT DynTag = 0x6ffffff9 + DT_RELCOUNT DynTag = 0x6ffffffa + DT_FLAGS_1 DynTag = 0x6ffffffb + DT_VERDEF DynTag = 0x6ffffffc + DT_VERDEFNUM DynTag = 0x6ffffffd + DT_VERNEED DynTag = 0x6ffffffe + DT_VERNEEDNUM DynTag = 0x6fffffff + + DT_LOPROC DynTag = 0x70000000 /* First processor-specific type. */ + + DT_MIPS_RLD_VERSION DynTag = 0x70000001 + DT_MIPS_TIME_STAMP DynTag = 0x70000002 + DT_MIPS_ICHECKSUM DynTag = 0x70000003 + DT_MIPS_IVERSION DynTag = 0x70000004 + DT_MIPS_FLAGS DynTag = 0x70000005 + DT_MIPS_BASE_ADDRESS DynTag = 0x70000006 + DT_MIPS_MSYM DynTag = 0x70000007 + DT_MIPS_CONFLICT DynTag = 0x70000008 + DT_MIPS_LIBLIST DynTag = 0x70000009 + DT_MIPS_LOCAL_GOTNO DynTag = 0x7000000a + DT_MIPS_CONFLICTNO DynTag = 0x7000000b + DT_MIPS_LIBLISTNO DynTag = 0x70000010 + DT_MIPS_SYMTABNO DynTag = 0x70000011 + DT_MIPS_UNREFEXTNO DynTag = 0x70000012 + DT_MIPS_GOTSYM DynTag = 0x70000013 + DT_MIPS_HIPAGENO DynTag = 0x70000014 + DT_MIPS_RLD_MAP DynTag = 0x70000016 + DT_MIPS_DELTA_CLASS DynTag = 0x70000017 + DT_MIPS_DELTA_CLASS_NO DynTag = 0x70000018 + DT_MIPS_DELTA_INSTANCE DynTag = 0x70000019 + DT_MIPS_DELTA_INSTANCE_NO DynTag = 0x7000001a + DT_MIPS_DELTA_RELOC DynTag = 0x7000001b + DT_MIPS_DELTA_RELOC_NO DynTag = 0x7000001c + DT_MIPS_DELTA_SYM DynTag = 0x7000001d + DT_MIPS_DELTA_SYM_NO DynTag = 0x7000001e + DT_MIPS_DELTA_CLASSSYM DynTag = 0x70000020 + DT_MIPS_DELTA_CLASSSYM_NO DynTag = 0x70000021 + DT_MIPS_CXX_FLAGS DynTag = 0x70000022 + DT_MIPS_PIXIE_INIT DynTag = 0x70000023 + DT_MIPS_SYMBOL_LIB DynTag = 0x70000024 + DT_MIPS_LOCALPAGE_GOTIDX DynTag = 0x70000025 + DT_MIPS_LOCAL_GOTIDX DynTag = 0x70000026 + DT_MIPS_HIDDEN_GOTIDX DynTag = 0x70000027 + DT_MIPS_PROTECTED_GOTIDX DynTag = 0x70000028 + DT_MIPS_OPTIONS DynTag = 0x70000029 + DT_MIPS_INTERFACE DynTag = 0x7000002a + DT_MIPS_DYNSTR_ALIGN DynTag = 0x7000002b + DT_MIPS_INTERFACE_SIZE DynTag = 0x7000002c + DT_MIPS_RLD_TEXT_RESOLVE_ADDR DynTag = 0x7000002d + DT_MIPS_PERF_SUFFIX DynTag = 0x7000002e + DT_MIPS_COMPACT_SIZE DynTag = 0x7000002f + DT_MIPS_GP_VALUE DynTag = 0x70000030 + DT_MIPS_AUX_DYNAMIC DynTag = 0x70000031 + DT_MIPS_PLTGOT DynTag = 0x70000032 + DT_MIPS_RWPLT DynTag = 0x70000034 + DT_MIPS_RLD_MAP_REL DynTag = 0x70000035 + + DT_PPC_GOT DynTag = 0x70000000 + DT_PPC_OPT DynTag = 0x70000001 + + DT_PPC64_GLINK DynTag = 0x70000000 + DT_PPC64_OPD DynTag = 0x70000001 + DT_PPC64_OPDSZ DynTag = 0x70000002 + DT_PPC64_OPT DynTag = 0x70000003 + + DT_SPARC_REGISTER DynTag = 0x70000001 + + DT_AUXILIARY DynTag = 0x7ffffffd + DT_USED DynTag = 0x7ffffffe + DT_FILTER DynTag = 0x7fffffff + + DT_HIPROC DynTag = 0x7fffffff /* Last processor-specific type. */ ) var dtStrings = []intName{ @@ -883,13 +1026,49 @@ var dtStrings = []intName{ {32, "DT_ENCODING"}, {32, "DT_PREINIT_ARRAY"}, {33, "DT_PREINIT_ARRAYSZ"}, + {34, "DT_SYMTAB_SHNDX"}, {0x6000000d, "DT_LOOS"}, {0x6ffff000, "DT_HIOS"}, + {0x6ffffd00, "DT_VALRNGLO"}, + {0x6ffffdf5, "DT_GNU_PRELINKED"}, + {0x6ffffdf6, "DT_GNU_CONFLICTSZ"}, + {0x6ffffdf7, "DT_GNU_LIBLISTSZ"}, + {0x6ffffdf8, "DT_CHECKSUM"}, + {0x6ffffdf9, "DT_PLTPADSZ"}, + {0x6ffffdfa, "DT_MOVEENT"}, + {0x6ffffdfb, "DT_MOVESZ"}, + {0x6ffffdfc, "DT_FEATURE"}, + {0x6ffffdfd, "DT_POSFLAG_1"}, + {0x6ffffdfe, "DT_SYMINSZ"}, + {0x6ffffdff, "DT_SYMINENT"}, + {0x6ffffdff, "DT_VALRNGHI"}, + {0x6ffffe00, "DT_ADDRRNGLO"}, + {0x6ffffef5, "DT_GNU_HASH"}, + {0x6ffffef6, "DT_TLSDESC_PLT"}, + {0x6ffffef7, "DT_TLSDESC_GOT"}, + {0x6ffffef8, "DT_GNU_CONFLICT"}, + {0x6ffffef9, "DT_GNU_LIBLIST"}, + {0x6ffffefa, "DT_CONFIG"}, + {0x6ffffefb, "DT_DEPAUDIT"}, + {0x6ffffefc, "DT_AUDIT"}, + {0x6ffffefd, "DT_PLTPAD"}, + {0x6ffffefe, "DT_MOVETAB"}, + {0x6ffffeff, "DT_SYMINFO"}, + {0x6ffffeff, "DT_ADDRRNGHI"}, {0x6ffffff0, "DT_VERSYM"}, + {0x6ffffff9, "DT_RELACOUNT"}, + {0x6ffffffa, "DT_RELCOUNT"}, + {0x6ffffffb, "DT_FLAGS_1"}, + {0x6ffffffc, "DT_VERDEF"}, + {0x6ffffffd, "DT_VERDEFNUM"}, {0x6ffffffe, "DT_VERNEED"}, {0x6fffffff, "DT_VERNEEDNUM"}, {0x70000000, "DT_LOPROC"}, - {0x7fffffff, "DT_HIPROC"}, + // We don't list the processor-dependent DynTags, + // as the values overlap. + {0x7ffffffd, "DT_AUXILIARY"}, + {0x7ffffffe, "DT_USED"}, + {0x7fffffff, "DT_FILTER"}, } func (i DynTag) String() string { return stringName(uint32(i), dtStrings, false) } -- GitLab From 1ee30d25c517cfa5674a35754602f1a9ba3562f4 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 17 Sep 2020 16:22:14 -0400 Subject: [PATCH 0535/1792] runtime: correctly log stderr in TestFakeTime Change-Id: Iaf122ce7a8b8fb431199399aeed67b128a34d20b Reviewed-on: https://go-review.googlesource.com/c/go/+/255720 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- src/runtime/time_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/time_test.go b/src/runtime/time_test.go index bf29561144..a8dab7db8e 100644 --- a/src/runtime/time_test.go +++ b/src/runtime/time_test.go @@ -38,7 +38,7 @@ func TestFakeTime(t *testing.T) { } t.Logf("raw stdout: %q", stdout.String()) - t.Logf("raw stderr: %q", stdout.String()) + t.Logf("raw stderr: %q", stderr.String()) f1, err1 := parseFakeTime(stdout.Bytes()) if err1 != nil { -- GitLab From 0dc369b127651830edef453938dfb5c149aa37cf Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 16 Sep 2020 15:42:00 +0700 Subject: [PATCH 0536/1792] cmd/compile: make typecheck set correct untyped type Passes toolstash-check. Change-Id: Ie631d8dacb1cc76613e1f50da8422850ac7119a1 Reviewed-on: https://go-review.googlesource.com/c/go/+/255217 Trust: Cuong Manh Le Run-TryBot: Cuong Manh Le TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/const.go | 122 ++++++++--------------- src/cmd/compile/internal/gc/typecheck.go | 19 +++- 2 files changed, 60 insertions(+), 81 deletions(-) diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index fe73df9d57..59b2c56051 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -44,7 +44,7 @@ func (v Val) Ctype() Ctype { Fatalf("unexpected Ctype for %T", v.U) panic("unreachable") case nil: - return 0 + return CTxxx case *NilVal: return CTNIL case bool: @@ -261,7 +261,7 @@ func convlit1(n *Node, t *types.Type, explicit bool, context func() string) *Nod } if t == nil || !okforconst[t.Etype] { - t = defaultType(idealkind(n)) + t = defaultType(n.Type) } switch n.Op { @@ -994,10 +994,8 @@ func setconst(n *Node, v Val) { Xoffset: BADWIDTH, } n.SetVal(v) - if n.Type.IsUntyped() { - // TODO(mdempsky): Make typecheck responsible for setting - // the correct untyped type. - n.Type = idealType(v.Ctype()) + if vt := idealType(v.Ctype()); n.Type.IsUntyped() && n.Type != vt { + Fatalf("untyped type mismatch, have: %v, want: %v", n.Type, vt) } // Check range. @@ -1056,67 +1054,6 @@ func idealType(ct Ctype) *types.Type { return nil } -// idealkind returns a constant kind like consttype -// but for an arbitrary "ideal" (untyped constant) expression. -func idealkind(n *Node) Ctype { - if n == nil || !n.Type.IsUntyped() { - return CTxxx - } - - switch n.Op { - default: - return CTxxx - - case OLITERAL: - return n.Val().Ctype() - - // numeric kinds. - case OADD, - OAND, - OANDNOT, - OBITNOT, - ODIV, - ONEG, - OMOD, - OMUL, - OSUB, - OXOR, - OOR, - OPLUS: - k1 := idealkind(n.Left) - k2 := idealkind(n.Right) - if k1 > k2 { - return k1 - } else { - return k2 - } - - case OREAL, OIMAG: - return CTFLT - - case OCOMPLEX: - return CTCPLX - - case OADDSTR: - return CTSTR - - case OANDAND, - OEQ, - OGE, - OGT, - OLE, - OLT, - ONE, - ONOT, - OOROR: - return CTBOOL - - // shifts (beware!). - case OLSH, ORSH: - return idealkind(n.Left) - } -} - // defaultlit on both nodes simultaneously; // if they're both ideal going in they better // get the same type going out. @@ -1152,32 +1089,57 @@ func defaultlit2(l *Node, r *Node, force bool) (*Node, *Node) { return l, r } - k := idealkind(l) - if rk := idealkind(r); rk > k { - k = rk + nn := l + if ctype(r.Type) > ctype(l.Type) { + nn = r } - t := defaultType(k) + + t := defaultType(nn.Type) l = convlit(l, t) r = convlit(r, t) return l, r } -func defaultType(k Ctype) *types.Type { - switch k { - case CTBOOL: +func ctype(t *types.Type) Ctype { + switch t { + case types.Idealbool: + return CTBOOL + case types.Idealstring: + return CTSTR + case types.Idealint: + return CTINT + case types.Idealrune: + return CTRUNE + case types.Idealfloat: + return CTFLT + case types.Idealcomplex: + return CTCPLX + } + Fatalf("bad type %v", t) + panic("unreachable") +} + +func defaultType(t *types.Type) *types.Type { + if !t.IsUntyped() { + return t + } + + switch t { + case types.Idealbool: return types.Types[TBOOL] - case CTSTR: + case types.Idealstring: return types.Types[TSTRING] - case CTINT: + case types.Idealint: return types.Types[TINT] - case CTRUNE: + case types.Idealrune: return types.Runetype - case CTFLT: + case types.Idealfloat: return types.Types[TFLOAT64] - case CTCPLX: + case types.Idealcomplex: return types.Types[TCOMPLEX128] } - Fatalf("bad idealkind: %v", k) + + Fatalf("bad type %v", t) return nil } diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 834c1a8ee6..274787a22b 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -623,6 +623,9 @@ func typecheck1(n *Node, top int) (res *Node) { // no defaultlit for left // the outer context gives the type n.Type = l.Type + if (l.Type == types.Idealfloat || l.Type == types.Idealcomplex) && r.Op == OLITERAL { + n.Type = types.Idealint + } break } @@ -798,6 +801,20 @@ func typecheck1(n *Node, top int) (res *Node) { } n.Type = t + if t.Etype == TIDEAL { + switch { + case l.Type == types.Idealcomplex || r.Type == types.Idealcomplex: + n.Type = types.Idealcomplex + case l.Type == types.Idealfloat || r.Type == types.Idealfloat: + n.Type = types.Idealfloat + case l.Type == types.Idealrune || r.Type == types.Idealrune: + n.Type = types.Idealrune + case l.Type == types.Idealint || r.Type == types.Idealint: + n.Type = types.Idealint + default: + Fatalf("bad untyped type: %v", t) + } + } case OBITNOT, ONEG, ONOT, OPLUS: ok |= ctxExpr @@ -1678,7 +1695,7 @@ func typecheck1(n *Node, top int) (res *Node) { } var why string n.Op = convertop(n.Left.Op == OLITERAL, t, n.Type, &why) - if n.Op == 0 { + if n.Op == OXXX { if !n.Diag() && !n.Type.Broke() && !n.Left.Diag() { yyerror("cannot convert %L to type %v%s", n.Left, n.Type, why) n.SetDiag(true) -- GitLab From dc59469f5178a0715a582cbfcc4cf9c06a2c9e82 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 17 Sep 2020 22:53:39 +0700 Subject: [PATCH 0537/1792] cmd/compile: move validation from unary/binaryOp to typecheck CL 254400 makes typecheck set untyped type correctly. We now have enough information to check valid operators for a type in typecheck. Passes toolstash-check. Change-Id: I01a7606ee6ce9964ec52430d53eaa886442bd17f Reviewed-on: https://go-review.googlesource.com/c/go/+/255617 Trust: Cuong Manh Le Run-TryBot: Cuong Manh Le TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/const.go | 19 +--------- src/cmd/compile/internal/gc/typecheck.go | 44 ++++++++++-------------- 2 files changed, 19 insertions(+), 44 deletions(-) diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index 59b2c56051..399d0148bb 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -838,10 +838,6 @@ Outer: return Val{} } u.Quo(y) - case OMOD, OOR, OAND, OANDNOT, OXOR: - // TODO(mdempsky): Move to typecheck; see #31060. - yyerror("invalid operation: operator %v not defined on untyped float", op) - return Val{} default: break Outer } @@ -867,10 +863,6 @@ Outer: yyerror("complex division by zero") return Val{} } - case OMOD, OOR, OAND, OANDNOT, OXOR: - // TODO(mdempsky): Move to typecheck; see #31060. - yyerror("invalid operation: operator %v not defined on untyped complex", op) - return Val{} default: break Outer } @@ -932,15 +924,6 @@ func unaryOp(op Op, x Val, t *types.Type) Val { } u.Xor(x) return Val{U: u} - - case CTFLT: - // TODO(mdempsky): Move to typecheck; see #31060. - yyerror("invalid operation: operator %v not defined on untyped float", op) - return Val{} - case CTCPLX: - // TODO(mdempsky): Move to typecheck; see #31060. - yyerror("invalid operation: operator %v not defined on untyped complex", op) - return Val{} } case ONOT: @@ -1120,7 +1103,7 @@ func ctype(t *types.Type) Ctype { } func defaultType(t *types.Type) *types.Type { - if !t.IsUntyped() { + if !t.IsUntyped() || t.Etype == TNIL { return t } diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 274787a22b..faa13d72f9 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -716,8 +716,22 @@ func typecheck1(n *Node, top int) (res *Node) { } } - if !okfor[op][et] { - yyerror("invalid operation: %v (operator %v not defined on %s)", n, op, typekind(t)) + if t.Etype == TIDEAL { + switch { + case l.Type == types.Idealcomplex || r.Type == types.Idealcomplex: + t = types.Idealcomplex + case l.Type == types.Idealfloat || r.Type == types.Idealfloat: + t = types.Idealfloat + case l.Type == types.Idealrune || r.Type == types.Idealrune: + t = types.Idealrune + case l.Type == types.Idealint || r.Type == types.Idealint: + t = types.Idealint + default: + Fatalf("bad untyped type: %v", t) + } + } + if dt := defaultType(t); !okfor[op][dt.Etype] { + yyerror("invalid operation: %v (operator %v not defined on %v)", n, op, t) n.Type = nil return n } @@ -756,15 +770,7 @@ func typecheck1(n *Node, top int) (res *Node) { } } - t = l.Type if iscmp[n.Op] { - // TIDEAL includes complex constant, but only OEQ and ONE are defined for complex, - // so check that the n.op is available for complex here before doing evconst. - if !okfor[n.Op][TCOMPLEX128] && (Isconst(l, CTCPLX) || Isconst(r, CTCPLX)) { - yyerror("invalid operation: %v (operator %v not defined on untyped complex)", n, n.Op) - n.Type = nil - return n - } evconst(n) t = types.Idealbool if n.Op != OLITERAL { @@ -801,20 +807,6 @@ func typecheck1(n *Node, top int) (res *Node) { } n.Type = t - if t.Etype == TIDEAL { - switch { - case l.Type == types.Idealcomplex || r.Type == types.Idealcomplex: - n.Type = types.Idealcomplex - case l.Type == types.Idealfloat || r.Type == types.Idealfloat: - n.Type = types.Idealfloat - case l.Type == types.Idealrune || r.Type == types.Idealrune: - n.Type = types.Idealrune - case l.Type == types.Idealint || r.Type == types.Idealint: - n.Type = types.Idealint - default: - Fatalf("bad untyped type: %v", t) - } - } case OBITNOT, ONEG, ONOT, OPLUS: ok |= ctxExpr @@ -825,8 +817,8 @@ func typecheck1(n *Node, top int) (res *Node) { n.Type = nil return n } - if !okfor[n.Op][t.Etype] { - yyerror("invalid operation: %v %v", n.Op, t) + if !okfor[n.Op][defaultType(t).Etype] { + yyerror("invalid operation: %v (operator %v not defined on %s)", n, n.Op, typekind(t)) n.Type = nil return n } -- GitLab From 0b1cec7ad33a073be15db89da90efcba9797df83 Mon Sep 17 00:00:00 2001 From: root <2863768433@qq.com> Date: Sun, 30 Aug 2020 11:36:45 +0800 Subject: [PATCH 0538/1792] cmd/compile: rotate phase's title 180 degrees in ssa/html.go Modify phase's title according to html.go:122 TODO. Fixes #41098 Change-Id: I58fa365e718600aaaa0a72cce72d35a484cde8b8 Reviewed-on: https://go-review.googlesource.com/c/go/+/251657 Reviewed-by: Bradford Lamson-Scribner Reviewed-by: Keith Randall Trust: Josh Bleecher Snyder --- src/cmd/compile/internal/ssa/html.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/html.go b/src/cmd/compile/internal/ssa/html.go index ba37a80412..1c70b64708 100644 --- a/src/cmd/compile/internal/ssa/html.go +++ b/src/cmd/compile/internal/ssa/html.go @@ -119,7 +119,8 @@ td.collapsed { } td.collapsed div { - /* TODO: Flip the direction of the phase's title 90 degrees on a collapsed column. */ + text-align: right; + transform: rotate(180deg); writing-mode: vertical-lr; white-space: pre; } -- GitLab From 234e23d76351c31b191e25b688aa43248d9b3d5b Mon Sep 17 00:00:00 2001 From: root <2863768433@qq.com> Date: Mon, 17 Aug 2020 10:03:06 +0800 Subject: [PATCH 0539/1792] cmd/compile: make expanded/hidden columns in GOSSAFUNC persist across reloads use pushState with updated state and read it on page load,so that state can survive across reloads. Change-Id: I6c5e80e9747576245b979a62cb96d231d8f27d57 Reviewed-on: https://go-review.googlesource.com/c/go/+/248687 Run-TryBot: Alberto Donizetti TryBot-Result: Go Bot Reviewed-by: Bradford Lamson-Scribner Reviewed-by: Keith Randall Trust: Josh Bleecher Snyder --- src/cmd/compile/internal/ssa/html.go | 48 ++++++++++++++++++---------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/src/cmd/compile/internal/ssa/html.go b/src/cmd/compile/internal/ssa/html.go index 1c70b64708..c781ca92cc 100644 --- a/src/cmd/compile/internal/ssa/html.go +++ b/src/cmd/compile/internal/ssa/html.go @@ -358,6 +358,21 @@ body.darkmode ellipse.outline-black { outline: gray solid 2px; } +` + +func TestEscapeRace(t *testing.T) { + tmpl := New("") + _, err := tmpl.New("templ.html").Parse(raceText) + if err != nil { + t.Fatal(err) + } + const count = 20 + for i := 0; i < count; i++ { + _, err := tmpl.New(fmt.Sprintf("x%d.html", i)).Parse(`{{ template "templ.html" .}}`) + if err != nil { + t.Fatal(err) + } + } + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < count; j++ { + sub := tmpl.Lookup(fmt.Sprintf("x%d.html", j)) + if err := sub.Execute(io.Discard, nil); err != nil { + t.Error(err) + } + } + }() + } + wg.Wait() +} + +func TestRecursiveExecute(t *testing.T) { + tmpl := New("") + + recur := func() (HTML, error) { + var sb strings.Builder + if err := tmpl.ExecuteTemplate(&sb, "subroutine", nil); err != nil { + t.Fatal(err) + } + return HTML(sb.String()), nil + } + + m := FuncMap{ + "recur": recur, + } + + top, err := tmpl.New("x.html").Funcs(m).Parse(`{{recur}}`) + if err != nil { + t.Fatal(err) + } + _, err = tmpl.New("subroutine").Parse(``) + if err != nil { + t.Fatal(err) + } + if err := top.Execute(io.Discard, nil); err != nil { + t.Fatal(err) + } +} diff --git a/src/html/template/template.go b/src/html/template/template.go index 69312d36fd..09d71d43e2 100644 --- a/src/html/template/template.go +++ b/src/html/template/template.go @@ -11,6 +11,7 @@ import ( "os" "path" "path/filepath" + "reflect" "sync" "text/template" "text/template/parse" @@ -26,7 +27,9 @@ type Template struct { // template's in sync. text *template.Template // The underlying template's parse tree, updated to be HTML-safe. - Tree *parse.Tree + Tree *parse.Tree + // The original functions, before wrapping. + funcMap FuncMap *nameSpace // common to all associated templates } @@ -35,7 +38,7 @@ var escapeOK = fmt.Errorf("template escaped correctly") // nameSpace is the data structure shared by all templates in an association. type nameSpace struct { - mu sync.Mutex + mu sync.RWMutex set map[string]*Template escaped bool esc escaper @@ -45,8 +48,8 @@ type nameSpace struct { // itself. func (t *Template) Templates() []*Template { ns := t.nameSpace - ns.mu.Lock() - defer ns.mu.Unlock() + ns.mu.RLock() + defer ns.mu.RUnlock() // Return a slice so we don't expose the map. m := make([]*Template, 0, len(ns.set)) for _, v := range ns.set { @@ -84,8 +87,8 @@ func (t *Template) checkCanParse() error { if t == nil { return nil } - t.nameSpace.mu.Lock() - defer t.nameSpace.mu.Unlock() + t.nameSpace.mu.RLock() + defer t.nameSpace.mu.RUnlock() if t.nameSpace.escaped { return fmt.Errorf("html/template: cannot Parse after Execute") } @@ -94,6 +97,16 @@ func (t *Template) checkCanParse() error { // escape escapes all associated templates. func (t *Template) escape() error { + t.nameSpace.mu.RLock() + escapeErr := t.escapeErr + t.nameSpace.mu.RUnlock() + if escapeErr != nil { + if escapeErr == escapeOK { + return nil + } + return escapeErr + } + t.nameSpace.mu.Lock() defer t.nameSpace.mu.Unlock() t.nameSpace.escaped = true @@ -121,6 +134,8 @@ func (t *Template) Execute(wr io.Writer, data interface{}) error { if err := t.escape(); err != nil { return err } + t.nameSpace.mu.RLock() + defer t.nameSpace.mu.RUnlock() return t.text.Execute(wr, data) } @@ -136,6 +151,8 @@ func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) if err != nil { return err } + t.nameSpace.mu.RLock() + defer t.nameSpace.mu.RUnlock() return tmpl.text.Execute(wr, data) } @@ -143,13 +160,27 @@ func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) // is escaped, or returns an error if it cannot be. It returns the named // template. func (t *Template) lookupAndEscapeTemplate(name string) (tmpl *Template, err error) { - t.nameSpace.mu.Lock() - defer t.nameSpace.mu.Unlock() - t.nameSpace.escaped = true + t.nameSpace.mu.RLock() tmpl = t.set[name] + var escapeErr error + if tmpl != nil { + escapeErr = tmpl.escapeErr + } + t.nameSpace.mu.RUnlock() + if tmpl == nil { return nil, fmt.Errorf("html/template: %q is undefined", name) } + if escapeErr != nil { + if escapeErr != escapeOK { + return nil, escapeErr + } + return tmpl, nil + } + + t.nameSpace.mu.Lock() + defer t.nameSpace.mu.Unlock() + t.nameSpace.escaped = true if tmpl.escapeErr != nil && tmpl.escapeErr != escapeOK { return nil, tmpl.escapeErr } @@ -229,6 +260,7 @@ func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error nil, text, text.Tree, + nil, t.nameSpace, } t.set[name] = ret @@ -259,8 +291,10 @@ func (t *Template) Clone() (*Template, error) { nil, textClone, textClone.Tree, + t.funcMap, ns, } + ret.wrapFuncs() ret.set[ret.Name()] = ret for _, x := range textClone.Templates() { name := x.Name() @@ -269,12 +303,15 @@ func (t *Template) Clone() (*Template, error) { return nil, fmt.Errorf("html/template: cannot Clone %q after it has executed", t.Name()) } x.Tree = x.Tree.Copy() - ret.set[name] = &Template{ + tc := &Template{ nil, x, x.Tree, + src.funcMap, ret.nameSpace, } + tc.wrapFuncs() + ret.set[name] = tc } // Return the template associated with the name of this template. return ret.set[ret.Name()], nil @@ -288,6 +325,7 @@ func New(name string) *Template { nil, template.New(name), nil, + nil, ns, } tmpl.set[name] = tmpl @@ -313,6 +351,7 @@ func (t *Template) new(name string) *Template { nil, t.text.New(name), nil, + nil, t.nameSpace, } if existing, ok := tmpl.set[name]; ok { @@ -343,10 +382,35 @@ type FuncMap map[string]interface{} // type. However, it is legal to overwrite elements of the map. The return // value is the template, so calls can be chained. func (t *Template) Funcs(funcMap FuncMap) *Template { - t.text.Funcs(template.FuncMap(funcMap)) + t.funcMap = funcMap + t.wrapFuncs() return t } +// wrapFuncs records the functions with text/template. We wrap them to +// unlock the nameSpace. See TestRecursiveExecute for a test case. +func (t *Template) wrapFuncs() { + if len(t.funcMap) == 0 { + return + } + tfuncs := make(template.FuncMap, len(t.funcMap)) + for name, fn := range t.funcMap { + fnv := reflect.ValueOf(fn) + wrapper := func(args []reflect.Value) []reflect.Value { + t.nameSpace.mu.RUnlock() + defer t.nameSpace.mu.RLock() + if fnv.Type().IsVariadic() { + return fnv.CallSlice(args) + } else { + return fnv.Call(args) + } + } + wrapped := reflect.MakeFunc(fnv.Type(), wrapper) + tfuncs[name] = wrapped.Interface() + } + t.text.Funcs(tfuncs) +} + // Delims sets the action delimiters to the specified strings, to be used in // subsequent calls to Parse, ParseFiles, or ParseGlob. Nested template // definitions will inherit the settings. An empty delimiter stands for the @@ -360,8 +424,8 @@ func (t *Template) Delims(left, right string) *Template { // Lookup returns the template with the given name that is associated with t, // or nil if there is no such template. func (t *Template) Lookup(name string) *Template { - t.nameSpace.mu.Lock() - defer t.nameSpace.mu.Unlock() + t.nameSpace.mu.RLock() + defer t.nameSpace.mu.RUnlock() return t.set[name] } -- GitLab From 2ff33f5e443165e55a080f3a649e4c070c4096d1 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Tue, 8 Dec 2020 22:54:44 -0500 Subject: [PATCH 1544/1792] api: promote next to go1.16 Change-Id: Id7d242ddd4b80a763787513d0a658dd7aea9db7d Reviewed-on: https://go-review.googlesource.com/c/go/+/276454 Run-TryBot: Dmitri Shuralyov TryBot-Result: Go Bot Trust: Dmitri Shuralyov Reviewed-by: Alexander Rakoczy Reviewed-by: Carlos Amedee --- api/go1.16.txt | 484 +++++++++++++++++++++++++++++++++++++++++++++++++ api/next.txt | 452 --------------------------------------------- 2 files changed, 484 insertions(+), 452 deletions(-) create mode 100644 api/go1.16.txt diff --git a/api/go1.16.txt b/api/go1.16.txt new file mode 100644 index 0000000000..2e04b3ba0a --- /dev/null +++ b/api/go1.16.txt @@ -0,0 +1,484 @@ +pkg archive/zip, method (*ReadCloser) Open(string) (fs.File, error) +pkg archive/zip, method (*Reader) Open(string) (fs.File, error) +pkg crypto/tls, method (*CertificateRequestInfo) Context() context.Context +pkg crypto/tls, method (*ClientHelloInfo) Context() context.Context +pkg crypto/tls, method (*Conn) HandshakeContext(context.Context) error +pkg crypto/x509, method (SystemRootsError) Unwrap() error +pkg crypto/x509, type CertificateRequest struct, BasicConstraintsValid bool +pkg crypto/x509, type CertificateRequest struct, ExtKeyUsage []ExtKeyUsage +pkg crypto/x509, type CertificateRequest struct, IsCA bool +pkg crypto/x509, type CertificateRequest struct, KeyUsage KeyUsage +pkg crypto/x509, type CertificateRequest struct, MaxPathLen int +pkg crypto/x509, type CertificateRequest struct, MaxPathLenZero bool +pkg crypto/x509, type CertificateRequest struct, PolicyIdentifiers []asn1.ObjectIdentifier +pkg crypto/x509, type CertificateRequest struct, SubjectKeyId []uint8 +pkg crypto/x509, type CertificateRequest struct, UnknownExtKeyUsage []asn1.ObjectIdentifier +pkg debug/elf, const DT_ADDRRNGHI = 1879047935 +pkg debug/elf, const DT_ADDRRNGHI DynTag +pkg debug/elf, const DT_ADDRRNGLO = 1879047680 +pkg debug/elf, const DT_ADDRRNGLO DynTag +pkg debug/elf, const DT_AUDIT = 1879047932 +pkg debug/elf, const DT_AUDIT DynTag +pkg debug/elf, const DT_AUXILIARY = 2147483645 +pkg debug/elf, const DT_AUXILIARY DynTag +pkg debug/elf, const DT_CHECKSUM = 1879047672 +pkg debug/elf, const DT_CHECKSUM DynTag +pkg debug/elf, const DT_CONFIG = 1879047930 +pkg debug/elf, const DT_CONFIG DynTag +pkg debug/elf, const DT_DEPAUDIT = 1879047931 +pkg debug/elf, const DT_DEPAUDIT DynTag +pkg debug/elf, const DT_FEATURE = 1879047676 +pkg debug/elf, const DT_FEATURE DynTag +pkg debug/elf, const DT_FILTER = 2147483647 +pkg debug/elf, const DT_FILTER DynTag +pkg debug/elf, const DT_FLAGS_1 = 1879048187 +pkg debug/elf, const DT_FLAGS_1 DynTag +pkg debug/elf, const DT_GNU_CONFLICT = 1879047928 +pkg debug/elf, const DT_GNU_CONFLICT DynTag +pkg debug/elf, const DT_GNU_CONFLICTSZ = 1879047670 +pkg debug/elf, const DT_GNU_CONFLICTSZ DynTag +pkg debug/elf, const DT_GNU_HASH = 1879047925 +pkg debug/elf, const DT_GNU_HASH DynTag +pkg debug/elf, const DT_GNU_LIBLIST = 1879047929 +pkg debug/elf, const DT_GNU_LIBLIST DynTag +pkg debug/elf, const DT_GNU_LIBLISTSZ = 1879047671 +pkg debug/elf, const DT_GNU_LIBLISTSZ DynTag +pkg debug/elf, const DT_GNU_PRELINKED = 1879047669 +pkg debug/elf, const DT_GNU_PRELINKED DynTag +pkg debug/elf, const DT_MIPS_AUX_DYNAMIC = 1879048241 +pkg debug/elf, const DT_MIPS_AUX_DYNAMIC DynTag +pkg debug/elf, const DT_MIPS_BASE_ADDRESS = 1879048198 +pkg debug/elf, const DT_MIPS_BASE_ADDRESS DynTag +pkg debug/elf, const DT_MIPS_COMPACT_SIZE = 1879048239 +pkg debug/elf, const DT_MIPS_COMPACT_SIZE DynTag +pkg debug/elf, const DT_MIPS_CONFLICT = 1879048200 +pkg debug/elf, const DT_MIPS_CONFLICT DynTag +pkg debug/elf, const DT_MIPS_CONFLICTNO = 1879048203 +pkg debug/elf, const DT_MIPS_CONFLICTNO DynTag +pkg debug/elf, const DT_MIPS_CXX_FLAGS = 1879048226 +pkg debug/elf, const DT_MIPS_CXX_FLAGS DynTag +pkg debug/elf, const DT_MIPS_DELTA_CLASS = 1879048215 +pkg debug/elf, const DT_MIPS_DELTA_CLASS DynTag +pkg debug/elf, const DT_MIPS_DELTA_CLASSSYM = 1879048224 +pkg debug/elf, const DT_MIPS_DELTA_CLASSSYM DynTag +pkg debug/elf, const DT_MIPS_DELTA_CLASSSYM_NO = 1879048225 +pkg debug/elf, const DT_MIPS_DELTA_CLASSSYM_NO DynTag +pkg debug/elf, const DT_MIPS_DELTA_CLASS_NO = 1879048216 +pkg debug/elf, const DT_MIPS_DELTA_CLASS_NO DynTag +pkg debug/elf, const DT_MIPS_DELTA_INSTANCE = 1879048217 +pkg debug/elf, const DT_MIPS_DELTA_INSTANCE DynTag +pkg debug/elf, const DT_MIPS_DELTA_INSTANCE_NO = 1879048218 +pkg debug/elf, const DT_MIPS_DELTA_INSTANCE_NO DynTag +pkg debug/elf, const DT_MIPS_DELTA_RELOC = 1879048219 +pkg debug/elf, const DT_MIPS_DELTA_RELOC DynTag +pkg debug/elf, const DT_MIPS_DELTA_RELOC_NO = 1879048220 +pkg debug/elf, const DT_MIPS_DELTA_RELOC_NO DynTag +pkg debug/elf, const DT_MIPS_DELTA_SYM = 1879048221 +pkg debug/elf, const DT_MIPS_DELTA_SYM DynTag +pkg debug/elf, const DT_MIPS_DELTA_SYM_NO = 1879048222 +pkg debug/elf, const DT_MIPS_DELTA_SYM_NO DynTag +pkg debug/elf, const DT_MIPS_DYNSTR_ALIGN = 1879048235 +pkg debug/elf, const DT_MIPS_DYNSTR_ALIGN DynTag +pkg debug/elf, const DT_MIPS_FLAGS = 1879048197 +pkg debug/elf, const DT_MIPS_FLAGS DynTag +pkg debug/elf, const DT_MIPS_GOTSYM = 1879048211 +pkg debug/elf, const DT_MIPS_GOTSYM DynTag +pkg debug/elf, const DT_MIPS_GP_VALUE = 1879048240 +pkg debug/elf, const DT_MIPS_GP_VALUE DynTag +pkg debug/elf, const DT_MIPS_HIDDEN_GOTIDX = 1879048231 +pkg debug/elf, const DT_MIPS_HIDDEN_GOTIDX DynTag +pkg debug/elf, const DT_MIPS_HIPAGENO = 1879048212 +pkg debug/elf, const DT_MIPS_HIPAGENO DynTag +pkg debug/elf, const DT_MIPS_ICHECKSUM = 1879048195 +pkg debug/elf, const DT_MIPS_ICHECKSUM DynTag +pkg debug/elf, const DT_MIPS_INTERFACE = 1879048234 +pkg debug/elf, const DT_MIPS_INTERFACE DynTag +pkg debug/elf, const DT_MIPS_INTERFACE_SIZE = 1879048236 +pkg debug/elf, const DT_MIPS_INTERFACE_SIZE DynTag +pkg debug/elf, const DT_MIPS_IVERSION = 1879048196 +pkg debug/elf, const DT_MIPS_IVERSION DynTag +pkg debug/elf, const DT_MIPS_LIBLIST = 1879048201 +pkg debug/elf, const DT_MIPS_LIBLIST DynTag +pkg debug/elf, const DT_MIPS_LIBLISTNO = 1879048208 +pkg debug/elf, const DT_MIPS_LIBLISTNO DynTag +pkg debug/elf, const DT_MIPS_LOCALPAGE_GOTIDX = 1879048229 +pkg debug/elf, const DT_MIPS_LOCALPAGE_GOTIDX DynTag +pkg debug/elf, const DT_MIPS_LOCAL_GOTIDX = 1879048230 +pkg debug/elf, const DT_MIPS_LOCAL_GOTIDX DynTag +pkg debug/elf, const DT_MIPS_LOCAL_GOTNO = 1879048202 +pkg debug/elf, const DT_MIPS_LOCAL_GOTNO DynTag +pkg debug/elf, const DT_MIPS_MSYM = 1879048199 +pkg debug/elf, const DT_MIPS_MSYM DynTag +pkg debug/elf, const DT_MIPS_OPTIONS = 1879048233 +pkg debug/elf, const DT_MIPS_OPTIONS DynTag +pkg debug/elf, const DT_MIPS_PERF_SUFFIX = 1879048238 +pkg debug/elf, const DT_MIPS_PERF_SUFFIX DynTag +pkg debug/elf, const DT_MIPS_PIXIE_INIT = 1879048227 +pkg debug/elf, const DT_MIPS_PIXIE_INIT DynTag +pkg debug/elf, const DT_MIPS_PLTGOT = 1879048242 +pkg debug/elf, const DT_MIPS_PLTGOT DynTag +pkg debug/elf, const DT_MIPS_PROTECTED_GOTIDX = 1879048232 +pkg debug/elf, const DT_MIPS_PROTECTED_GOTIDX DynTag +pkg debug/elf, const DT_MIPS_RLD_MAP = 1879048214 +pkg debug/elf, const DT_MIPS_RLD_MAP DynTag +pkg debug/elf, const DT_MIPS_RLD_MAP_REL = 1879048245 +pkg debug/elf, const DT_MIPS_RLD_MAP_REL DynTag +pkg debug/elf, const DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 1879048237 +pkg debug/elf, const DT_MIPS_RLD_TEXT_RESOLVE_ADDR DynTag +pkg debug/elf, const DT_MIPS_RLD_VERSION = 1879048193 +pkg debug/elf, const DT_MIPS_RLD_VERSION DynTag +pkg debug/elf, const DT_MIPS_RWPLT = 1879048244 +pkg debug/elf, const DT_MIPS_RWPLT DynTag +pkg debug/elf, const DT_MIPS_SYMBOL_LIB = 1879048228 +pkg debug/elf, const DT_MIPS_SYMBOL_LIB DynTag +pkg debug/elf, const DT_MIPS_SYMTABNO = 1879048209 +pkg debug/elf, const DT_MIPS_SYMTABNO DynTag +pkg debug/elf, const DT_MIPS_TIME_STAMP = 1879048194 +pkg debug/elf, const DT_MIPS_TIME_STAMP DynTag +pkg debug/elf, const DT_MIPS_UNREFEXTNO = 1879048210 +pkg debug/elf, const DT_MIPS_UNREFEXTNO DynTag +pkg debug/elf, const DT_MOVEENT = 1879047674 +pkg debug/elf, const DT_MOVEENT DynTag +pkg debug/elf, const DT_MOVESZ = 1879047675 +pkg debug/elf, const DT_MOVESZ DynTag +pkg debug/elf, const DT_MOVETAB = 1879047934 +pkg debug/elf, const DT_MOVETAB DynTag +pkg debug/elf, const DT_PLTPAD = 1879047933 +pkg debug/elf, const DT_PLTPAD DynTag +pkg debug/elf, const DT_PLTPADSZ = 1879047673 +pkg debug/elf, const DT_PLTPADSZ DynTag +pkg debug/elf, const DT_POSFLAG_1 = 1879047677 +pkg debug/elf, const DT_POSFLAG_1 DynTag +pkg debug/elf, const DT_PPC64_GLINK = 1879048192 +pkg debug/elf, const DT_PPC64_GLINK DynTag +pkg debug/elf, const DT_PPC64_OPD = 1879048193 +pkg debug/elf, const DT_PPC64_OPD DynTag +pkg debug/elf, const DT_PPC64_OPDSZ = 1879048194 +pkg debug/elf, const DT_PPC64_OPDSZ DynTag +pkg debug/elf, const DT_PPC64_OPT = 1879048195 +pkg debug/elf, const DT_PPC64_OPT DynTag +pkg debug/elf, const DT_PPC_GOT = 1879048192 +pkg debug/elf, const DT_PPC_GOT DynTag +pkg debug/elf, const DT_PPC_OPT = 1879048193 +pkg debug/elf, const DT_PPC_OPT DynTag +pkg debug/elf, const DT_RELACOUNT = 1879048185 +pkg debug/elf, const DT_RELACOUNT DynTag +pkg debug/elf, const DT_RELCOUNT = 1879048186 +pkg debug/elf, const DT_RELCOUNT DynTag +pkg debug/elf, const DT_SPARC_REGISTER = 1879048193 +pkg debug/elf, const DT_SPARC_REGISTER DynTag +pkg debug/elf, const DT_SYMINENT = 1879047679 +pkg debug/elf, const DT_SYMINENT DynTag +pkg debug/elf, const DT_SYMINFO = 1879047935 +pkg debug/elf, const DT_SYMINFO DynTag +pkg debug/elf, const DT_SYMINSZ = 1879047678 +pkg debug/elf, const DT_SYMINSZ DynTag +pkg debug/elf, const DT_SYMTAB_SHNDX = 34 +pkg debug/elf, const DT_SYMTAB_SHNDX DynTag +pkg debug/elf, const DT_TLSDESC_GOT = 1879047927 +pkg debug/elf, const DT_TLSDESC_GOT DynTag +pkg debug/elf, const DT_TLSDESC_PLT = 1879047926 +pkg debug/elf, const DT_TLSDESC_PLT DynTag +pkg debug/elf, const DT_USED = 2147483646 +pkg debug/elf, const DT_USED DynTag +pkg debug/elf, const DT_VALRNGHI = 1879047679 +pkg debug/elf, const DT_VALRNGHI DynTag +pkg debug/elf, const DT_VALRNGLO = 1879047424 +pkg debug/elf, const DT_VALRNGLO DynTag +pkg debug/elf, const DT_VERDEF = 1879048188 +pkg debug/elf, const DT_VERDEF DynTag +pkg debug/elf, const DT_VERDEFNUM = 1879048189 +pkg debug/elf, const DT_VERDEFNUM DynTag +pkg debug/elf, const PT_AARCH64_ARCHEXT = 1879048192 +pkg debug/elf, const PT_AARCH64_ARCHEXT ProgType +pkg debug/elf, const PT_AARCH64_UNWIND = 1879048193 +pkg debug/elf, const PT_AARCH64_UNWIND ProgType +pkg debug/elf, const PT_ARM_ARCHEXT = 1879048192 +pkg debug/elf, const PT_ARM_ARCHEXT ProgType +pkg debug/elf, const PT_ARM_EXIDX = 1879048193 +pkg debug/elf, const PT_ARM_EXIDX ProgType +pkg debug/elf, const PT_GNU_EH_FRAME = 1685382480 +pkg debug/elf, const PT_GNU_EH_FRAME ProgType +pkg debug/elf, const PT_GNU_MBIND_HI = 1685386580 +pkg debug/elf, const PT_GNU_MBIND_HI ProgType +pkg debug/elf, const PT_GNU_MBIND_LO = 1685382485 +pkg debug/elf, const PT_GNU_MBIND_LO ProgType +pkg debug/elf, const PT_GNU_PROPERTY = 1685382483 +pkg debug/elf, const PT_GNU_PROPERTY ProgType +pkg debug/elf, const PT_GNU_RELRO = 1685382482 +pkg debug/elf, const PT_GNU_RELRO ProgType +pkg debug/elf, const PT_GNU_STACK = 1685382481 +pkg debug/elf, const PT_GNU_STACK ProgType +pkg debug/elf, const PT_MIPS_ABIFLAGS = 1879048195 +pkg debug/elf, const PT_MIPS_ABIFLAGS ProgType +pkg debug/elf, const PT_MIPS_OPTIONS = 1879048194 +pkg debug/elf, const PT_MIPS_OPTIONS ProgType +pkg debug/elf, const PT_MIPS_REGINFO = 1879048192 +pkg debug/elf, const PT_MIPS_REGINFO ProgType +pkg debug/elf, const PT_MIPS_RTPROC = 1879048193 +pkg debug/elf, const PT_MIPS_RTPROC ProgType +pkg debug/elf, const PT_OPENBSD_BOOTDATA = 1705253862 +pkg debug/elf, const PT_OPENBSD_BOOTDATA ProgType +pkg debug/elf, const PT_OPENBSD_RANDOMIZE = 1705237478 +pkg debug/elf, const PT_OPENBSD_RANDOMIZE ProgType +pkg debug/elf, const PT_OPENBSD_WXNEEDED = 1705237479 +pkg debug/elf, const PT_OPENBSD_WXNEEDED ProgType +pkg debug/elf, const PT_PAX_FLAGS = 1694766464 +pkg debug/elf, const PT_PAX_FLAGS ProgType +pkg debug/elf, const PT_S390_PGSTE = 1879048192 +pkg debug/elf, const PT_S390_PGSTE ProgType +pkg debug/elf, const PT_SUNWSTACK = 1879048187 +pkg debug/elf, const PT_SUNWSTACK ProgType +pkg debug/elf, const PT_SUNW_EH_FRAME = 1685382480 +pkg debug/elf, const PT_SUNW_EH_FRAME ProgType +pkg embed, method (FS) Open(string) (fs.File, error) +pkg embed, method (FS) ReadDir(string) ([]fs.DirEntry, error) +pkg embed, method (FS) ReadFile(string) ([]uint8, error) +pkg embed, type FS struct +pkg flag, func Func(string, string, func(string) error) +pkg flag, method (*FlagSet) Func(string, string, func(string) error) +pkg go/build, type Package struct, EmbedPatterns []string +pkg go/build, type Package struct, IgnoredOtherFiles []string +pkg go/build, type Package struct, TestEmbedPatterns []string +pkg go/build, type Package struct, XTestEmbedPatterns []string +pkg html/template, func ParseFS(fs.FS, ...string) (*Template, error) +pkg html/template, method (*Template) ParseFS(fs.FS, ...string) (*Template, error) +pkg io, func NopCloser(Reader) ReadCloser +pkg io, func ReadAll(Reader) ([]uint8, error) +pkg io, type ReadSeekCloser interface { Close, Read, Seek } +pkg io, type ReadSeekCloser interface, Close() error +pkg io, type ReadSeekCloser interface, Read([]uint8) (int, error) +pkg io, type ReadSeekCloser interface, Seek(int64, int) (int64, error) +pkg io, var Discard Writer +pkg io/fs, const ModeAppend = 1073741824 +pkg io/fs, const ModeAppend FileMode +pkg io/fs, const ModeCharDevice = 2097152 +pkg io/fs, const ModeCharDevice FileMode +pkg io/fs, const ModeDevice = 67108864 +pkg io/fs, const ModeDevice FileMode +pkg io/fs, const ModeDir = 2147483648 +pkg io/fs, const ModeDir FileMode +pkg io/fs, const ModeExclusive = 536870912 +pkg io/fs, const ModeExclusive FileMode +pkg io/fs, const ModeIrregular = 524288 +pkg io/fs, const ModeIrregular FileMode +pkg io/fs, const ModeNamedPipe = 33554432 +pkg io/fs, const ModeNamedPipe FileMode +pkg io/fs, const ModePerm = 511 +pkg io/fs, const ModePerm FileMode +pkg io/fs, const ModeSetgid = 4194304 +pkg io/fs, const ModeSetgid FileMode +pkg io/fs, const ModeSetuid = 8388608 +pkg io/fs, const ModeSetuid FileMode +pkg io/fs, const ModeSocket = 16777216 +pkg io/fs, const ModeSocket FileMode +pkg io/fs, const ModeSticky = 1048576 +pkg io/fs, const ModeSticky FileMode +pkg io/fs, const ModeSymlink = 134217728 +pkg io/fs, const ModeSymlink FileMode +pkg io/fs, const ModeTemporary = 268435456 +pkg io/fs, const ModeTemporary FileMode +pkg io/fs, const ModeType = 2401763328 +pkg io/fs, const ModeType FileMode +pkg io/fs, func Glob(FS, string) ([]string, error) +pkg io/fs, func ReadDir(FS, string) ([]DirEntry, error) +pkg io/fs, func ReadFile(FS, string) ([]uint8, error) +pkg io/fs, func Stat(FS, string) (FileInfo, error) +pkg io/fs, func Sub(FS, string) (FS, error) +pkg io/fs, func ValidPath(string) bool +pkg io/fs, func WalkDir(FS, string, WalkDirFunc) error +pkg io/fs, method (*PathError) Error() string +pkg io/fs, method (*PathError) Timeout() bool +pkg io/fs, method (*PathError) Unwrap() error +pkg io/fs, method (FileMode) IsDir() bool +pkg io/fs, method (FileMode) IsRegular() bool +pkg io/fs, method (FileMode) Perm() FileMode +pkg io/fs, method (FileMode) String() string +pkg io/fs, method (FileMode) Type() FileMode +pkg io/fs, type DirEntry interface { Info, IsDir, Name, Type } +pkg io/fs, type DirEntry interface, Info() (FileInfo, error) +pkg io/fs, type DirEntry interface, IsDir() bool +pkg io/fs, type DirEntry interface, Name() string +pkg io/fs, type DirEntry interface, Type() FileMode +pkg io/fs, type FS interface { Open } +pkg io/fs, type FS interface, Open(string) (File, error) +pkg io/fs, type File interface { Close, Read, Stat } +pkg io/fs, type File interface, Close() error +pkg io/fs, type File interface, Read([]uint8) (int, error) +pkg io/fs, type File interface, Stat() (FileInfo, error) +pkg io/fs, type FileInfo interface { IsDir, ModTime, Mode, Name, Size, Sys } +pkg io/fs, type FileInfo interface, IsDir() bool +pkg io/fs, type FileInfo interface, ModTime() time.Time +pkg io/fs, type FileInfo interface, Mode() FileMode +pkg io/fs, type FileInfo interface, Name() string +pkg io/fs, type FileInfo interface, Size() int64 +pkg io/fs, type FileInfo interface, Sys() interface{} +pkg io/fs, type FileMode uint32 +pkg io/fs, type GlobFS interface { Glob, Open } +pkg io/fs, type GlobFS interface, Glob(string) ([]string, error) +pkg io/fs, type GlobFS interface, Open(string) (File, error) +pkg io/fs, type PathError struct +pkg io/fs, type PathError struct, Err error +pkg io/fs, type PathError struct, Op string +pkg io/fs, type PathError struct, Path string +pkg io/fs, type ReadDirFS interface { Open, ReadDir } +pkg io/fs, type ReadDirFS interface, Open(string) (File, error) +pkg io/fs, type ReadDirFS interface, ReadDir(string) ([]DirEntry, error) +pkg io/fs, type ReadDirFile interface { Close, Read, ReadDir, Stat } +pkg io/fs, type ReadDirFile interface, Close() error +pkg io/fs, type ReadDirFile interface, Read([]uint8) (int, error) +pkg io/fs, type ReadDirFile interface, ReadDir(int) ([]DirEntry, error) +pkg io/fs, type ReadDirFile interface, Stat() (FileInfo, error) +pkg io/fs, type ReadFileFS interface { Open, ReadFile } +pkg io/fs, type ReadFileFS interface, Open(string) (File, error) +pkg io/fs, type ReadFileFS interface, ReadFile(string) ([]uint8, error) +pkg io/fs, type StatFS interface { Open, Stat } +pkg io/fs, type StatFS interface, Open(string) (File, error) +pkg io/fs, type StatFS interface, Stat(string) (FileInfo, error) +pkg io/fs, type SubFS interface { Open, Sub } +pkg io/fs, type SubFS interface, Open(string) (File, error) +pkg io/fs, type SubFS interface, Sub(string) (FS, error) +pkg io/fs, type WalkDirFunc func(string, DirEntry, error) error +pkg io/fs, var ErrClosed error +pkg io/fs, var ErrExist error +pkg io/fs, var ErrInvalid error +pkg io/fs, var ErrNotExist error +pkg io/fs, var ErrPermission error +pkg io/fs, var SkipDir error +pkg log, func Default() *Logger +pkg net, var ErrClosed error +pkg net/http, func FS(fs.FS) FileSystem +pkg net/http, type Transport struct, GetProxyConnectHeader func(context.Context, *url.URL, string) (Header, error) +pkg os, const ModeAppend fs.FileMode +pkg os, const ModeCharDevice fs.FileMode +pkg os, const ModeDevice fs.FileMode +pkg os, const ModeDir fs.FileMode +pkg os, const ModeExclusive fs.FileMode +pkg os, const ModeIrregular fs.FileMode +pkg os, const ModeNamedPipe fs.FileMode +pkg os, const ModePerm fs.FileMode +pkg os, const ModeSetgid fs.FileMode +pkg os, const ModeSetuid fs.FileMode +pkg os, const ModeSocket fs.FileMode +pkg os, const ModeSticky fs.FileMode +pkg os, const ModeSymlink fs.FileMode +pkg os, const ModeTemporary fs.FileMode +pkg os, const ModeType fs.FileMode +pkg os, func Chmod(string, fs.FileMode) error +pkg os, func CreateTemp(string, string) (*File, error) +pkg os, func DirFS(string) fs.FS +pkg os, func Lstat(string) (fs.FileInfo, error) +pkg os, func Mkdir(string, fs.FileMode) error +pkg os, func MkdirAll(string, fs.FileMode) error +pkg os, func MkdirTemp(string, string) (string, error) +pkg os, func OpenFile(string, int, fs.FileMode) (*File, error) +pkg os, func ReadDir(string) ([]fs.DirEntry, error) +pkg os, func ReadFile(string) ([]uint8, error) +pkg os, func SameFile(fs.FileInfo, fs.FileInfo) bool +pkg os, func Stat(string) (fs.FileInfo, error) +pkg os, func WriteFile(string, []uint8, fs.FileMode) error +pkg os, method (*File) Chmod(fs.FileMode) error +pkg os, method (*File) ReadDir(int) ([]fs.DirEntry, error) +pkg os, method (*File) Readdir(int) ([]fs.FileInfo, error) +pkg os, method (*File) Stat() (fs.FileInfo, error) +pkg os, type DirEntry = fs.DirEntry +pkg os, type FileInfo = fs.FileInfo +pkg os, type FileMode = fs.FileMode +pkg os, type PathError = fs.PathError +pkg os, var ErrProcessDone error +pkg os/signal, func NotifyContext(context.Context, ...os.Signal) (context.Context, context.CancelFunc) +pkg path/filepath, func WalkDir(string, fs.WalkDirFunc) error +pkg runtime/metrics, const KindBad = 0 +pkg runtime/metrics, const KindBad ValueKind +pkg runtime/metrics, const KindFloat64 = 2 +pkg runtime/metrics, const KindFloat64 ValueKind +pkg runtime/metrics, const KindFloat64Histogram = 3 +pkg runtime/metrics, const KindFloat64Histogram ValueKind +pkg runtime/metrics, const KindUint64 = 1 +pkg runtime/metrics, const KindUint64 ValueKind +pkg runtime/metrics, func All() []Description +pkg runtime/metrics, func Read([]Sample) +pkg runtime/metrics, method (Value) Float64() float64 +pkg runtime/metrics, method (Value) Float64Histogram() *Float64Histogram +pkg runtime/metrics, method (Value) Kind() ValueKind +pkg runtime/metrics, method (Value) Uint64() uint64 +pkg runtime/metrics, type Description struct +pkg runtime/metrics, type Description struct, Cumulative bool +pkg runtime/metrics, type Description struct, Description string +pkg runtime/metrics, type Description struct, Kind ValueKind +pkg runtime/metrics, type Description struct, Name string +pkg runtime/metrics, type Description struct, StopTheWorld bool +pkg runtime/metrics, type Float64Histogram struct +pkg runtime/metrics, type Float64Histogram struct, Buckets []float64 +pkg runtime/metrics, type Float64Histogram struct, Counts []uint64 +pkg runtime/metrics, type Sample struct +pkg runtime/metrics, type Sample struct, Name string +pkg runtime/metrics, type Sample struct, Value Value +pkg runtime/metrics, type Value struct +pkg runtime/metrics, type ValueKind int +pkg syscall (linux-386), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-386), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-386), func Setegid(int) error +pkg syscall (linux-386), func Seteuid(int) error +pkg syscall (linux-386-cgo), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-386-cgo), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-386-cgo), func Setegid(int) error +pkg syscall (linux-386-cgo), func Seteuid(int) error +pkg syscall (linux-amd64), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-amd64), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-amd64), func Setegid(int) error +pkg syscall (linux-amd64), func Seteuid(int) error +pkg syscall (linux-amd64-cgo), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-amd64-cgo), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-amd64-cgo), func Setegid(int) error +pkg syscall (linux-amd64-cgo), func Seteuid(int) error +pkg syscall (linux-arm), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-arm), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-arm), func Setegid(int) error +pkg syscall (linux-arm), func Seteuid(int) error +pkg syscall (linux-arm-cgo), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-arm-cgo), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) +pkg syscall (linux-arm-cgo), func Setegid(int) error +pkg syscall (linux-arm-cgo), func Seteuid(int) error +pkg syscall (windows-386), func RtlGenRandom(*uint8, uint32) error +pkg syscall (windows-386), method (*DLLError) Unwrap() error +pkg syscall (windows-386), type SysProcAttr struct, NoInheritHandles bool +pkg syscall (windows-amd64), func RtlGenRandom(*uint8, uint32) error +pkg syscall (windows-amd64), method (*DLLError) Unwrap() error +pkg syscall (windows-amd64), type SysProcAttr struct, NoInheritHandles bool +pkg testing/fstest, func TestFS(fs.FS, ...string) error +pkg testing/fstest, method (MapFS) Glob(string) ([]string, error) +pkg testing/fstest, method (MapFS) Open(string) (fs.File, error) +pkg testing/fstest, method (MapFS) ReadDir(string) ([]fs.DirEntry, error) +pkg testing/fstest, method (MapFS) ReadFile(string) ([]uint8, error) +pkg testing/fstest, method (MapFS) Stat(string) (fs.FileInfo, error) +pkg testing/fstest, method (MapFS) Sub(string) (fs.FS, error) +pkg testing/fstest, type MapFS map[string]*MapFile +pkg testing/fstest, type MapFile struct +pkg testing/fstest, type MapFile struct, Data []uint8 +pkg testing/fstest, type MapFile struct, ModTime time.Time +pkg testing/fstest, type MapFile struct, Mode fs.FileMode +pkg testing/fstest, type MapFile struct, Sys interface{} +pkg testing/iotest, func ErrReader(error) io.Reader +pkg testing/iotest, func TestReader(io.Reader, []uint8) error +pkg text/template, func ParseFS(fs.FS, ...string) (*Template, error) +pkg text/template, method (*Template) ParseFS(fs.FS, ...string) (*Template, error) +pkg text/template/parse, const NodeComment = 20 +pkg text/template/parse, const NodeComment NodeType +pkg text/template/parse, const ParseComments = 1 +pkg text/template/parse, const ParseComments Mode +pkg text/template/parse, method (*CommentNode) Copy() Node +pkg text/template/parse, method (*CommentNode) String() string +pkg text/template/parse, method (CommentNode) Position() Pos +pkg text/template/parse, method (CommentNode) Type() NodeType +pkg text/template/parse, type CommentNode struct +pkg text/template/parse, type CommentNode struct, Text string +pkg text/template/parse, type CommentNode struct, embedded NodeType +pkg text/template/parse, type CommentNode struct, embedded Pos +pkg text/template/parse, type Mode uint +pkg text/template/parse, type Tree struct, Mode Mode +pkg unicode, const Version = "13.0.0" +pkg unicode, var Chorasmian *RangeTable +pkg unicode, var Dives_Akuru *RangeTable +pkg unicode, var Khitan_Small_Script *RangeTable +pkg unicode, var Yezidi *RangeTable diff --git a/api/next.txt b/api/next.txt index 959172242e..e69de29bb2 100644 --- a/api/next.txt +++ b/api/next.txt @@ -1,452 +0,0 @@ -pkg archive/zip, method (*ReadCloser) Open(string) (fs.File, error) -pkg archive/zip, method (*Reader) Open(string) (fs.File, error) -pkg debug/elf, const DT_ADDRRNGHI = 1879047935 -pkg debug/elf, const DT_ADDRRNGHI DynTag -pkg debug/elf, const DT_ADDRRNGLO = 1879047680 -pkg debug/elf, const DT_ADDRRNGLO DynTag -pkg debug/elf, const DT_AUDIT = 1879047932 -pkg debug/elf, const DT_AUDIT DynTag -pkg debug/elf, const DT_AUXILIARY = 2147483645 -pkg debug/elf, const DT_AUXILIARY DynTag -pkg debug/elf, const DT_CHECKSUM = 1879047672 -pkg debug/elf, const DT_CHECKSUM DynTag -pkg debug/elf, const DT_CONFIG = 1879047930 -pkg debug/elf, const DT_CONFIG DynTag -pkg debug/elf, const DT_DEPAUDIT = 1879047931 -pkg debug/elf, const DT_DEPAUDIT DynTag -pkg debug/elf, const DT_FEATURE = 1879047676 -pkg debug/elf, const DT_FEATURE DynTag -pkg debug/elf, const DT_FILTER = 2147483647 -pkg debug/elf, const DT_FILTER DynTag -pkg debug/elf, const DT_FLAGS_1 = 1879048187 -pkg debug/elf, const DT_FLAGS_1 DynTag -pkg debug/elf, const DT_GNU_CONFLICT = 1879047928 -pkg debug/elf, const DT_GNU_CONFLICT DynTag -pkg debug/elf, const DT_GNU_CONFLICTSZ = 1879047670 -pkg debug/elf, const DT_GNU_CONFLICTSZ DynTag -pkg debug/elf, const DT_GNU_HASH = 1879047925 -pkg debug/elf, const DT_GNU_HASH DynTag -pkg debug/elf, const DT_GNU_LIBLIST = 1879047929 -pkg debug/elf, const DT_GNU_LIBLIST DynTag -pkg debug/elf, const DT_GNU_LIBLISTSZ = 1879047671 -pkg debug/elf, const DT_GNU_LIBLISTSZ DynTag -pkg debug/elf, const DT_GNU_PRELINKED = 1879047669 -pkg debug/elf, const DT_GNU_PRELINKED DynTag -pkg debug/elf, const DT_MIPS_AUX_DYNAMIC = 1879048241 -pkg debug/elf, const DT_MIPS_AUX_DYNAMIC DynTag -pkg debug/elf, const DT_MIPS_BASE_ADDRESS = 1879048198 -pkg debug/elf, const DT_MIPS_BASE_ADDRESS DynTag -pkg debug/elf, const DT_MIPS_COMPACT_SIZE = 1879048239 -pkg debug/elf, const DT_MIPS_COMPACT_SIZE DynTag -pkg debug/elf, const DT_MIPS_CONFLICT = 1879048200 -pkg debug/elf, const DT_MIPS_CONFLICT DynTag -pkg debug/elf, const DT_MIPS_CONFLICTNO = 1879048203 -pkg debug/elf, const DT_MIPS_CONFLICTNO DynTag -pkg debug/elf, const DT_MIPS_CXX_FLAGS = 1879048226 -pkg debug/elf, const DT_MIPS_CXX_FLAGS DynTag -pkg debug/elf, const DT_MIPS_DELTA_CLASS = 1879048215 -pkg debug/elf, const DT_MIPS_DELTA_CLASS DynTag -pkg debug/elf, const DT_MIPS_DELTA_CLASSSYM = 1879048224 -pkg debug/elf, const DT_MIPS_DELTA_CLASSSYM DynTag -pkg debug/elf, const DT_MIPS_DELTA_CLASSSYM_NO = 1879048225 -pkg debug/elf, const DT_MIPS_DELTA_CLASSSYM_NO DynTag -pkg debug/elf, const DT_MIPS_DELTA_CLASS_NO = 1879048216 -pkg debug/elf, const DT_MIPS_DELTA_CLASS_NO DynTag -pkg debug/elf, const DT_MIPS_DELTA_INSTANCE = 1879048217 -pkg debug/elf, const DT_MIPS_DELTA_INSTANCE DynTag -pkg debug/elf, const DT_MIPS_DELTA_INSTANCE_NO = 1879048218 -pkg debug/elf, const DT_MIPS_DELTA_INSTANCE_NO DynTag -pkg debug/elf, const DT_MIPS_DELTA_RELOC = 1879048219 -pkg debug/elf, const DT_MIPS_DELTA_RELOC DynTag -pkg debug/elf, const DT_MIPS_DELTA_RELOC_NO = 1879048220 -pkg debug/elf, const DT_MIPS_DELTA_RELOC_NO DynTag -pkg debug/elf, const DT_MIPS_DELTA_SYM = 1879048221 -pkg debug/elf, const DT_MIPS_DELTA_SYM DynTag -pkg debug/elf, const DT_MIPS_DELTA_SYM_NO = 1879048222 -pkg debug/elf, const DT_MIPS_DELTA_SYM_NO DynTag -pkg debug/elf, const DT_MIPS_DYNSTR_ALIGN = 1879048235 -pkg debug/elf, const DT_MIPS_DYNSTR_ALIGN DynTag -pkg debug/elf, const DT_MIPS_FLAGS = 1879048197 -pkg debug/elf, const DT_MIPS_FLAGS DynTag -pkg debug/elf, const DT_MIPS_GOTSYM = 1879048211 -pkg debug/elf, const DT_MIPS_GOTSYM DynTag -pkg debug/elf, const DT_MIPS_GP_VALUE = 1879048240 -pkg debug/elf, const DT_MIPS_GP_VALUE DynTag -pkg debug/elf, const DT_MIPS_HIDDEN_GOTIDX = 1879048231 -pkg debug/elf, const DT_MIPS_HIDDEN_GOTIDX DynTag -pkg debug/elf, const DT_MIPS_HIPAGENO = 1879048212 -pkg debug/elf, const DT_MIPS_HIPAGENO DynTag -pkg debug/elf, const DT_MIPS_ICHECKSUM = 1879048195 -pkg debug/elf, const DT_MIPS_ICHECKSUM DynTag -pkg debug/elf, const DT_MIPS_INTERFACE = 1879048234 -pkg debug/elf, const DT_MIPS_INTERFACE DynTag -pkg debug/elf, const DT_MIPS_INTERFACE_SIZE = 1879048236 -pkg debug/elf, const DT_MIPS_INTERFACE_SIZE DynTag -pkg debug/elf, const DT_MIPS_IVERSION = 1879048196 -pkg debug/elf, const DT_MIPS_IVERSION DynTag -pkg debug/elf, const DT_MIPS_LIBLIST = 1879048201 -pkg debug/elf, const DT_MIPS_LIBLIST DynTag -pkg debug/elf, const DT_MIPS_LIBLISTNO = 1879048208 -pkg debug/elf, const DT_MIPS_LIBLISTNO DynTag -pkg debug/elf, const DT_MIPS_LOCALPAGE_GOTIDX = 1879048229 -pkg debug/elf, const DT_MIPS_LOCALPAGE_GOTIDX DynTag -pkg debug/elf, const DT_MIPS_LOCAL_GOTIDX = 1879048230 -pkg debug/elf, const DT_MIPS_LOCAL_GOTIDX DynTag -pkg debug/elf, const DT_MIPS_LOCAL_GOTNO = 1879048202 -pkg debug/elf, const DT_MIPS_LOCAL_GOTNO DynTag -pkg debug/elf, const DT_MIPS_MSYM = 1879048199 -pkg debug/elf, const DT_MIPS_MSYM DynTag -pkg debug/elf, const DT_MIPS_OPTIONS = 1879048233 -pkg debug/elf, const DT_MIPS_OPTIONS DynTag -pkg debug/elf, const DT_MIPS_PERF_SUFFIX = 1879048238 -pkg debug/elf, const DT_MIPS_PERF_SUFFIX DynTag -pkg debug/elf, const DT_MIPS_PIXIE_INIT = 1879048227 -pkg debug/elf, const DT_MIPS_PIXIE_INIT DynTag -pkg debug/elf, const DT_MIPS_PLTGOT = 1879048242 -pkg debug/elf, const DT_MIPS_PLTGOT DynTag -pkg debug/elf, const DT_MIPS_PROTECTED_GOTIDX = 1879048232 -pkg debug/elf, const DT_MIPS_PROTECTED_GOTIDX DynTag -pkg debug/elf, const DT_MIPS_RLD_MAP = 1879048214 -pkg debug/elf, const DT_MIPS_RLD_MAP DynTag -pkg debug/elf, const DT_MIPS_RLD_MAP_REL = 1879048245 -pkg debug/elf, const DT_MIPS_RLD_MAP_REL DynTag -pkg debug/elf, const DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 1879048237 -pkg debug/elf, const DT_MIPS_RLD_TEXT_RESOLVE_ADDR DynTag -pkg debug/elf, const DT_MIPS_RLD_VERSION = 1879048193 -pkg debug/elf, const DT_MIPS_RLD_VERSION DynTag -pkg debug/elf, const DT_MIPS_RWPLT = 1879048244 -pkg debug/elf, const DT_MIPS_RWPLT DynTag -pkg debug/elf, const DT_MIPS_SYMBOL_LIB = 1879048228 -pkg debug/elf, const DT_MIPS_SYMBOL_LIB DynTag -pkg debug/elf, const DT_MIPS_SYMTABNO = 1879048209 -pkg debug/elf, const DT_MIPS_SYMTABNO DynTag -pkg debug/elf, const DT_MIPS_TIME_STAMP = 1879048194 -pkg debug/elf, const DT_MIPS_TIME_STAMP DynTag -pkg debug/elf, const DT_MIPS_UNREFEXTNO = 1879048210 -pkg debug/elf, const DT_MIPS_UNREFEXTNO DynTag -pkg debug/elf, const DT_MOVEENT = 1879047674 -pkg debug/elf, const DT_MOVEENT DynTag -pkg debug/elf, const DT_MOVESZ = 1879047675 -pkg debug/elf, const DT_MOVESZ DynTag -pkg debug/elf, const DT_MOVETAB = 1879047934 -pkg debug/elf, const DT_MOVETAB DynTag -pkg debug/elf, const DT_PLTPAD = 1879047933 -pkg debug/elf, const DT_PLTPAD DynTag -pkg debug/elf, const DT_PLTPADSZ = 1879047673 -pkg debug/elf, const DT_PLTPADSZ DynTag -pkg debug/elf, const DT_POSFLAG_1 = 1879047677 -pkg debug/elf, const DT_POSFLAG_1 DynTag -pkg debug/elf, const DT_PPC64_GLINK = 1879048192 -pkg debug/elf, const DT_PPC64_GLINK DynTag -pkg debug/elf, const DT_PPC64_OPD = 1879048193 -pkg debug/elf, const DT_PPC64_OPD DynTag -pkg debug/elf, const DT_PPC64_OPDSZ = 1879048194 -pkg debug/elf, const DT_PPC64_OPDSZ DynTag -pkg debug/elf, const DT_PPC64_OPT = 1879048195 -pkg debug/elf, const DT_PPC64_OPT DynTag -pkg debug/elf, const DT_PPC_GOT = 1879048192 -pkg debug/elf, const DT_PPC_GOT DynTag -pkg debug/elf, const DT_PPC_OPT = 1879048193 -pkg debug/elf, const DT_PPC_OPT DynTag -pkg debug/elf, const DT_RELACOUNT = 1879048185 -pkg debug/elf, const DT_RELACOUNT DynTag -pkg debug/elf, const DT_RELCOUNT = 1879048186 -pkg debug/elf, const DT_RELCOUNT DynTag -pkg debug/elf, const DT_SPARC_REGISTER = 1879048193 -pkg debug/elf, const DT_SPARC_REGISTER DynTag -pkg debug/elf, const DT_SYMINENT = 1879047679 -pkg debug/elf, const DT_SYMINENT DynTag -pkg debug/elf, const DT_SYMINFO = 1879047935 -pkg debug/elf, const DT_SYMINFO DynTag -pkg debug/elf, const DT_SYMINSZ = 1879047678 -pkg debug/elf, const DT_SYMINSZ DynTag -pkg debug/elf, const DT_SYMTAB_SHNDX = 34 -pkg debug/elf, const DT_SYMTAB_SHNDX DynTag -pkg debug/elf, const DT_TLSDESC_GOT = 1879047927 -pkg debug/elf, const DT_TLSDESC_GOT DynTag -pkg debug/elf, const DT_TLSDESC_PLT = 1879047926 -pkg debug/elf, const DT_TLSDESC_PLT DynTag -pkg debug/elf, const DT_USED = 2147483646 -pkg debug/elf, const DT_USED DynTag -pkg debug/elf, const DT_VALRNGHI = 1879047679 -pkg debug/elf, const DT_VALRNGHI DynTag -pkg debug/elf, const DT_VALRNGLO = 1879047424 -pkg debug/elf, const DT_VALRNGLO DynTag -pkg debug/elf, const DT_VERDEF = 1879048188 -pkg debug/elf, const DT_VERDEF DynTag -pkg debug/elf, const DT_VERDEFNUM = 1879048189 -pkg debug/elf, const DT_VERDEFNUM DynTag -pkg debug/elf, const PT_AARCH64_ARCHEXT = 1879048192 -pkg debug/elf, const PT_AARCH64_ARCHEXT ProgType -pkg debug/elf, const PT_AARCH64_UNWIND = 1879048193 -pkg debug/elf, const PT_AARCH64_UNWIND ProgType -pkg debug/elf, const PT_ARM_ARCHEXT = 1879048192 -pkg debug/elf, const PT_ARM_ARCHEXT ProgType -pkg debug/elf, const PT_ARM_EXIDX = 1879048193 -pkg debug/elf, const PT_ARM_EXIDX ProgType -pkg debug/elf, const PT_GNU_EH_FRAME = 1685382480 -pkg debug/elf, const PT_GNU_EH_FRAME ProgType -pkg debug/elf, const PT_GNU_MBIND_HI = 1685386580 -pkg debug/elf, const PT_GNU_MBIND_HI ProgType -pkg debug/elf, const PT_GNU_MBIND_LO = 1685382485 -pkg debug/elf, const PT_GNU_MBIND_LO ProgType -pkg debug/elf, const PT_GNU_PROPERTY = 1685382483 -pkg debug/elf, const PT_GNU_PROPERTY ProgType -pkg debug/elf, const PT_GNU_RELRO = 1685382482 -pkg debug/elf, const PT_GNU_RELRO ProgType -pkg debug/elf, const PT_GNU_STACK = 1685382481 -pkg debug/elf, const PT_GNU_STACK ProgType -pkg debug/elf, const PT_MIPS_ABIFLAGS = 1879048195 -pkg debug/elf, const PT_MIPS_ABIFLAGS ProgType -pkg debug/elf, const PT_MIPS_OPTIONS = 1879048194 -pkg debug/elf, const PT_MIPS_OPTIONS ProgType -pkg debug/elf, const PT_MIPS_REGINFO = 1879048192 -pkg debug/elf, const PT_MIPS_REGINFO ProgType -pkg debug/elf, const PT_MIPS_RTPROC = 1879048193 -pkg debug/elf, const PT_MIPS_RTPROC ProgType -pkg debug/elf, const PT_OPENBSD_BOOTDATA = 1705253862 -pkg debug/elf, const PT_OPENBSD_BOOTDATA ProgType -pkg debug/elf, const PT_OPENBSD_RANDOMIZE = 1705237478 -pkg debug/elf, const PT_OPENBSD_RANDOMIZE ProgType -pkg debug/elf, const PT_OPENBSD_WXNEEDED = 1705237479 -pkg debug/elf, const PT_OPENBSD_WXNEEDED ProgType -pkg debug/elf, const PT_PAX_FLAGS = 1694766464 -pkg debug/elf, const PT_PAX_FLAGS ProgType -pkg debug/elf, const PT_S390_PGSTE = 1879048192 -pkg debug/elf, const PT_S390_PGSTE ProgType -pkg debug/elf, const PT_SUNWSTACK = 1879048187 -pkg debug/elf, const PT_SUNWSTACK ProgType -pkg debug/elf, const PT_SUNW_EH_FRAME = 1685382480 -pkg debug/elf, const PT_SUNW_EH_FRAME ProgType -pkg embed, method (FS) Open(string) (fs.File, error) -pkg embed, method (FS) ReadDir(string) ([]fs.DirEntry, error) -pkg embed, method (FS) ReadFile(string) ([]uint8, error) -pkg embed, type FS struct -pkg flag, func Func(string, string, func(string) error) -pkg flag, method (*FlagSet) Func(string, string, func(string) error) -pkg go/build, type Package struct, EmbedPatterns []string -pkg go/build, type Package struct, IgnoredOtherFiles []string -pkg go/build, type Package struct, TestEmbedPatterns []string -pkg go/build, type Package struct, XTestEmbedPatterns []string -pkg html/template, func ParseFS(fs.FS, ...string) (*Template, error) -pkg html/template, method (*Template) ParseFS(fs.FS, ...string) (*Template, error) -pkg io, func NopCloser(Reader) ReadCloser -pkg io, func ReadAll(Reader) ([]uint8, error) -pkg io, type ReadSeekCloser interface { Close, Read, Seek } -pkg io, type ReadSeekCloser interface, Close() error -pkg io, type ReadSeekCloser interface, Read([]uint8) (int, error) -pkg io, type ReadSeekCloser interface, Seek(int64, int) (int64, error) -pkg io, var Discard Writer -pkg io/fs, const ModeAppend = 1073741824 -pkg io/fs, const ModeAppend FileMode -pkg io/fs, const ModeCharDevice = 2097152 -pkg io/fs, const ModeCharDevice FileMode -pkg io/fs, const ModeDevice = 67108864 -pkg io/fs, const ModeDevice FileMode -pkg io/fs, const ModeDir = 2147483648 -pkg io/fs, const ModeDir FileMode -pkg io/fs, const ModeExclusive = 536870912 -pkg io/fs, const ModeExclusive FileMode -pkg io/fs, const ModeIrregular = 524288 -pkg io/fs, const ModeIrregular FileMode -pkg io/fs, const ModeNamedPipe = 33554432 -pkg io/fs, const ModeNamedPipe FileMode -pkg io/fs, const ModePerm = 511 -pkg io/fs, const ModePerm FileMode -pkg io/fs, const ModeSetgid = 4194304 -pkg io/fs, const ModeSetgid FileMode -pkg io/fs, const ModeSetuid = 8388608 -pkg io/fs, const ModeSetuid FileMode -pkg io/fs, const ModeSocket = 16777216 -pkg io/fs, const ModeSocket FileMode -pkg io/fs, const ModeSticky = 1048576 -pkg io/fs, const ModeSticky FileMode -pkg io/fs, const ModeSymlink = 134217728 -pkg io/fs, const ModeSymlink FileMode -pkg io/fs, const ModeTemporary = 268435456 -pkg io/fs, const ModeTemporary FileMode -pkg io/fs, const ModeType = 2401763328 -pkg io/fs, const ModeType FileMode -pkg io/fs, func Glob(FS, string) ([]string, error) -pkg io/fs, func ReadDir(FS, string) ([]DirEntry, error) -pkg io/fs, func ReadFile(FS, string) ([]uint8, error) -pkg io/fs, func Stat(FS, string) (FileInfo, error) -pkg io/fs, func ValidPath(string) bool -pkg io/fs, method (*PathError) Error() string -pkg io/fs, method (*PathError) Timeout() bool -pkg io/fs, method (*PathError) Unwrap() error -pkg io/fs, method (FileMode) IsDir() bool -pkg io/fs, method (FileMode) IsRegular() bool -pkg io/fs, method (FileMode) Perm() FileMode -pkg io/fs, method (FileMode) String() string -pkg io/fs, method (FileMode) Type() FileMode -pkg io/fs, type DirEntry interface { Info, IsDir, Name, Type } -pkg io/fs, type DirEntry interface, Info() (FileInfo, error) -pkg io/fs, type DirEntry interface, IsDir() bool -pkg io/fs, type DirEntry interface, Name() string -pkg io/fs, type DirEntry interface, Type() FileMode -pkg io/fs, type FS interface { Open } -pkg io/fs, type FS interface, Open(string) (File, error) -pkg io/fs, type File interface { Close, Read, Stat } -pkg io/fs, type File interface, Close() error -pkg io/fs, type File interface, Read([]uint8) (int, error) -pkg io/fs, type File interface, Stat() (FileInfo, error) -pkg io/fs, type FileInfo interface { IsDir, ModTime, Mode, Name, Size, Sys } -pkg io/fs, type FileInfo interface, IsDir() bool -pkg io/fs, type FileInfo interface, ModTime() time.Time -pkg io/fs, type FileInfo interface, Mode() FileMode -pkg io/fs, type FileInfo interface, Name() string -pkg io/fs, type FileInfo interface, Size() int64 -pkg io/fs, type FileInfo interface, Sys() interface{} -pkg io/fs, type FileMode uint32 -pkg io/fs, type GlobFS interface { Glob, Open } -pkg io/fs, type GlobFS interface, Glob(string) ([]string, error) -pkg io/fs, type GlobFS interface, Open(string) (File, error) -pkg io/fs, type PathError struct -pkg io/fs, type PathError struct, Err error -pkg io/fs, type PathError struct, Op string -pkg io/fs, type PathError struct, Path string -pkg io/fs, type ReadDirFS interface { Open, ReadDir } -pkg io/fs, type ReadDirFS interface, Open(string) (File, error) -pkg io/fs, type ReadDirFS interface, ReadDir(string) ([]DirEntry, error) -pkg io/fs, type ReadDirFile interface { Close, Read, ReadDir, Stat } -pkg io/fs, type ReadDirFile interface, Close() error -pkg io/fs, type ReadDirFile interface, Read([]uint8) (int, error) -pkg io/fs, type ReadDirFile interface, ReadDir(int) ([]DirEntry, error) -pkg io/fs, type ReadDirFile interface, Stat() (FileInfo, error) -pkg io/fs, type ReadFileFS interface { Open, ReadFile } -pkg io/fs, type ReadFileFS interface, Open(string) (File, error) -pkg io/fs, type ReadFileFS interface, ReadFile(string) ([]uint8, error) -pkg io/fs, type StatFS interface { Open, Stat } -pkg io/fs, type StatFS interface, Open(string) (File, error) -pkg io/fs, type StatFS interface, Stat(string) (FileInfo, error) -pkg io/fs, var ErrClosed error -pkg io/fs, var ErrExist error -pkg io/fs, var ErrInvalid error -pkg io/fs, var ErrNotExist error -pkg io/fs, var ErrPermission error -pkg log, func Default() *Logger -pkg net, var ErrClosed error -pkg net/http, func FS(fs.FS) FileSystem -pkg net/http, type Transport struct, GetProxyConnectHeader func(context.Context, *url.URL, string) (Header, error) -pkg os, const ModeAppend fs.FileMode -pkg os, const ModeCharDevice fs.FileMode -pkg os, const ModeDevice fs.FileMode -pkg os, const ModeDir fs.FileMode -pkg os, const ModeExclusive fs.FileMode -pkg os, const ModeIrregular fs.FileMode -pkg os, const ModeNamedPipe fs.FileMode -pkg os, const ModePerm fs.FileMode -pkg os, const ModeSetgid fs.FileMode -pkg os, const ModeSetuid fs.FileMode -pkg os, const ModeSocket fs.FileMode -pkg os, const ModeSticky fs.FileMode -pkg os, const ModeSymlink fs.FileMode -pkg os, const ModeTemporary fs.FileMode -pkg os, const ModeType fs.FileMode -pkg os, func Chmod(string, fs.FileMode) error -pkg os, func DirFS(string) fs.FS -pkg os, func Lstat(string) (fs.FileInfo, error) -pkg os, func Mkdir(string, fs.FileMode) error -pkg os, func MkdirAll(string, fs.FileMode) error -pkg os, func OpenFile(string, int, fs.FileMode) (*File, error) -pkg os, func SameFile(fs.FileInfo, fs.FileInfo) bool -pkg os, func Stat(string) (fs.FileInfo, error) -pkg os, method (*File) Chmod(fs.FileMode) error -pkg os, method (*File) ReadDir(int) ([]fs.DirEntry, error) -pkg os, method (*File) Readdir(int) ([]fs.FileInfo, error) -pkg os, method (*File) Stat() (fs.FileInfo, error) -pkg os, type DirEntry = fs.DirEntry -pkg os, type FileInfo = fs.FileInfo -pkg os, type FileMode = fs.FileMode -pkg os, type PathError = fs.PathError -pkg os/signal, func NotifyContext(context.Context, ...os.Signal) (context.Context, context.CancelFunc) -pkg runtime/metrics, const KindBad = 0 -pkg runtime/metrics, const KindBad ValueKind -pkg runtime/metrics, const KindFloat64 = 2 -pkg runtime/metrics, const KindFloat64 ValueKind -pkg runtime/metrics, const KindFloat64Histogram = 3 -pkg runtime/metrics, const KindFloat64Histogram ValueKind -pkg runtime/metrics, const KindUint64 = 1 -pkg runtime/metrics, const KindUint64 ValueKind -pkg runtime/metrics, func All() []Description -pkg runtime/metrics, func Read([]Sample) -pkg runtime/metrics, method (Value) Float64() float64 -pkg runtime/metrics, method (Value) Float64Histogram() *Float64Histogram -pkg runtime/metrics, method (Value) Kind() ValueKind -pkg runtime/metrics, method (Value) Uint64() uint64 -pkg runtime/metrics, type Description struct -pkg runtime/metrics, type Description struct, Cumulative bool -pkg runtime/metrics, type Description struct, Description string -pkg runtime/metrics, type Description struct, Kind ValueKind -pkg runtime/metrics, type Description struct, Name string -pkg runtime/metrics, type Description struct, StopTheWorld bool -pkg runtime/metrics, type Float64Histogram struct -pkg runtime/metrics, type Float64Histogram struct, Buckets []float64 -pkg runtime/metrics, type Float64Histogram struct, Counts []uint64 -pkg runtime/metrics, type Sample struct -pkg runtime/metrics, type Sample struct, Name string -pkg runtime/metrics, type Sample struct, Value Value -pkg runtime/metrics, type Value struct -pkg runtime/metrics, type ValueKind int -pkg syscall (linux-386), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-386), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-386), func Setegid(int) error -pkg syscall (linux-386), func Seteuid(int) error -pkg syscall (linux-386-cgo), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-386-cgo), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-386-cgo), func Setegid(int) error -pkg syscall (linux-386-cgo), func Seteuid(int) error -pkg syscall (linux-amd64), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-amd64), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-amd64), func Setegid(int) error -pkg syscall (linux-amd64), func Seteuid(int) error -pkg syscall (linux-amd64-cgo), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-amd64-cgo), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-amd64-cgo), func Setegid(int) error -pkg syscall (linux-amd64-cgo), func Seteuid(int) error -pkg syscall (linux-arm), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-arm), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-arm), func Setegid(int) error -pkg syscall (linux-arm), func Seteuid(int) error -pkg syscall (linux-arm-cgo), func AllThreadsSyscall(uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-arm-cgo), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) -pkg syscall (linux-arm-cgo), func Setegid(int) error -pkg syscall (linux-arm-cgo), func Seteuid(int) error -pkg syscall (windows-386), func RtlGenRandom(*uint8, uint32) error -pkg syscall (windows-amd64), func RtlGenRandom(*uint8, uint32) error -pkg testing/fstest, func TestFS(fs.FS, ...string) error -pkg testing/fstest, method (MapFS) Glob(string) ([]string, error) -pkg testing/fstest, method (MapFS) Open(string) (fs.File, error) -pkg testing/fstest, method (MapFS) ReadDir(string) ([]fs.DirEntry, error) -pkg testing/fstest, method (MapFS) ReadFile(string) ([]uint8, error) -pkg testing/fstest, method (MapFS) Stat(string) (fs.FileInfo, error) -pkg testing/fstest, type MapFS map[string]*MapFile -pkg testing/fstest, type MapFile struct -pkg testing/fstest, type MapFile struct, Data []uint8 -pkg testing/fstest, type MapFile struct, ModTime time.Time -pkg testing/fstest, type MapFile struct, Mode fs.FileMode -pkg testing/fstest, type MapFile struct, Sys interface{} -pkg testing/iotest, func ErrReader(error) io.Reader -pkg testing/iotest, func TestReader(io.Reader, []uint8) error -pkg text/template, func ParseFS(fs.FS, ...string) (*Template, error) -pkg text/template, method (*Template) ParseFS(fs.FS, ...string) (*Template, error) -pkg text/template/parse, const NodeComment = 20 -pkg text/template/parse, const NodeComment NodeType -pkg text/template/parse, const ParseComments = 1 -pkg text/template/parse, const ParseComments Mode -pkg text/template/parse, method (*CommentNode) Copy() Node -pkg text/template/parse, method (*CommentNode) String() string -pkg text/template/parse, method (CommentNode) Position() Pos -pkg text/template/parse, method (CommentNode) Type() NodeType -pkg text/template/parse, type CommentNode struct -pkg text/template/parse, type CommentNode struct, Text string -pkg text/template/parse, type CommentNode struct, embedded NodeType -pkg text/template/parse, type CommentNode struct, embedded Pos -pkg text/template/parse, type Mode uint -pkg text/template/parse, type Tree struct, Mode Mode -pkg unicode, const Version = "13.0.0" -pkg unicode, var Chorasmian *RangeTable -pkg unicode, var Dives_Akuru *RangeTable -pkg unicode, var Khitan_Small_Script *RangeTable -pkg unicode, var Yezidi *RangeTable -- GitLab From 520f3b72db7befab2028d9a47376267cf2d274a9 Mon Sep 17 00:00:00 2001 From: Johan Brandhorst Date: Thu, 12 Nov 2020 20:34:51 +0000 Subject: [PATCH 1545/1792] crypto/tls: revert "add HandshakeContext method to Conn" This reverts CL 246338. Reason for revert: waiting for 1.17 release cycle Updates #32406 Change-Id: I074379039041e086c62271d689b4b7f442281663 Reviewed-on: https://go-review.googlesource.com/c/go/+/269697 Run-TryBot: Johan Brandhorst-Satzkorn Run-TryBot: Katie Hockman TryBot-Result: Go Bot Reviewed-by: Katie Hockman Trust: Katie Hockman Trust: Roland Shoemaker --- doc/go1.16.html | 17 ------- src/crypto/tls/common.go | 21 -------- src/crypto/tls/conn.go | 62 ++---------------------- src/crypto/tls/handshake_client.go | 11 ++--- src/crypto/tls/handshake_client_test.go | 36 -------------- src/crypto/tls/handshake_client_tls13.go | 3 -- src/crypto/tls/handshake_server.go | 17 +++---- src/crypto/tls/handshake_server_test.go | 50 +------------------ src/crypto/tls/handshake_server_tls13.go | 4 +- src/crypto/tls/tls.go | 55 +++++++++++++++++---- src/net/http/server.go | 2 +- src/net/http/transport.go | 10 ++-- src/net/http/transport_test.go | 2 +- 13 files changed, 69 insertions(+), 221 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index b3d905c168..1694b2277d 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -539,16 +539,6 @@ func TestFoo(t *testing.T) { indefinitely.

-

- The new Conn.HandshakeContext - method allows cancellation of an in-progress handshake. The provided - context is accessible through the new - ClientHelloInfo.Context - and - CertificateRequestInfo.Context methods. Canceling the - context after the handshake has finished has no effect. -

-

Clients now return a handshake error if the server selects @@ -771,13 +761,6 @@ func TestFoo(t *testing.T) { generating a SameSite key without a value.

-

- The net/http package now passes the - Request context to - tls.Conn.HandshakeContext - when performing TLS handshakes. -

-

The Client now sends an explicit Content-Length: 0 diff --git a/src/crypto/tls/common.go b/src/crypto/tls/common.go index 5b68742975..eec6e1ebbd 100644 --- a/src/crypto/tls/common.go +++ b/src/crypto/tls/common.go @@ -7,7 +7,6 @@ package tls import ( "bytes" "container/list" - "context" "crypto" "crypto/ecdsa" "crypto/ed25519" @@ -444,16 +443,6 @@ type ClientHelloInfo struct { // config is embedded by the GetCertificate or GetConfigForClient caller, // for use with SupportsCertificate. config *Config - - // ctx is the context of the handshake that is in progress. - ctx context.Context -} - -// Context returns the context of the handshake that is in progress. -// This context is a child of the context passed to HandshakeContext, -// if any, and is canceled when the handshake concludes. -func (c *ClientHelloInfo) Context() context.Context { - return c.ctx } // CertificateRequestInfo contains information from a server's @@ -472,16 +461,6 @@ type CertificateRequestInfo struct { // Version is the TLS version that was negotiated for this connection. Version uint16 - - // ctx is the context of the handshake that is in progress. - ctx context.Context -} - -// Context returns the context of the handshake that is in progress. -// This context is a child of the context passed to HandshakeContext, -// if any, and is canceled when the handshake concludes. -func (c *CertificateRequestInfo) Context() context.Context { - return c.ctx } // RenegotiationSupport enumerates the different levels of support for TLS diff --git a/src/crypto/tls/conn.go b/src/crypto/tls/conn.go index 969f357834..72ad52c194 100644 --- a/src/crypto/tls/conn.go +++ b/src/crypto/tls/conn.go @@ -8,7 +8,6 @@ package tls import ( "bytes" - "context" "crypto/cipher" "crypto/subtle" "crypto/x509" @@ -28,7 +27,7 @@ type Conn struct { // constant conn net.Conn isClient bool - handshakeFn func(context.Context) error // (*Conn).clientHandshake or serverHandshake + handshakeFn func() error // (*Conn).clientHandshake or serverHandshake // handshakeStatus is 1 if the connection is currently transferring // application data (i.e. is not currently processing a handshake). @@ -1191,7 +1190,7 @@ func (c *Conn) handleRenegotiation() error { defer c.handshakeMutex.Unlock() atomic.StoreUint32(&c.handshakeStatus, 0) - if c.handshakeErr = c.clientHandshake(context.Background()); c.handshakeErr == nil { + if c.handshakeErr = c.clientHandshake(); c.handshakeErr == nil { c.handshakes++ } return c.handshakeErr @@ -1374,61 +1373,8 @@ func (c *Conn) closeNotify() error { // first Read or Write will call it automatically. // // For control over canceling or setting a timeout on a handshake, use -// HandshakeContext or the Dialer's DialContext method instead. +// the Dialer's DialContext method. func (c *Conn) Handshake() error { - return c.HandshakeContext(context.Background()) -} - -// HandshakeContext runs the client or server handshake -// protocol if it has not yet been run. -// -// The provided Context must be non-nil. If the context is canceled before -// the handshake is complete, the handshake is interrupted and an error is returned. -// Once the handshake has completed, cancellation of the context will not affect the -// connection. -// -// Most uses of this package need not call HandshakeContext explicitly: the -// first Read or Write will call it automatically. -func (c *Conn) HandshakeContext(ctx context.Context) error { - // Delegate to unexported method for named return - // without confusing documented signature. - return c.handshakeContext(ctx) -} - -func (c *Conn) handshakeContext(ctx context.Context) (ret error) { - handshakeCtx, cancel := context.WithCancel(ctx) - // Note: defer this before starting the "interrupter" goroutine - // so that we can tell the difference between the input being canceled and - // 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 { - done := make(chan struct{}) - interruptRes := make(chan error, 1) - defer func() { - close(done) - if ctxErr := <-interruptRes; ctxErr != nil { - // Return context error to user. - ret = ctxErr - } - }() - go func() { - select { - case <-handshakeCtx.Done(): - // Close the connection, discarding the error - _ = c.conn.Close() - interruptRes <- handshakeCtx.Err() - case <-done: - interruptRes <- nil - } - }() - } - c.handshakeMutex.Lock() defer c.handshakeMutex.Unlock() @@ -1442,7 +1388,7 @@ func (c *Conn) handshakeContext(ctx context.Context) (ret error) { c.in.Lock() defer c.in.Unlock() - c.handshakeErr = c.handshakeFn(handshakeCtx) + c.handshakeErr = c.handshakeFn() if c.handshakeErr == nil { c.handshakes++ } else { diff --git a/src/crypto/tls/handshake_client.go b/src/crypto/tls/handshake_client.go index 92e33e7169..e684b21d52 100644 --- a/src/crypto/tls/handshake_client.go +++ b/src/crypto/tls/handshake_client.go @@ -6,7 +6,6 @@ package tls import ( "bytes" - "context" "crypto" "crypto/ecdsa" "crypto/ed25519" @@ -25,7 +24,6 @@ import ( type clientHandshakeState struct { c *Conn - ctx context.Context serverHello *serverHelloMsg hello *clientHelloMsg suite *cipherSuite @@ -136,7 +134,7 @@ func (c *Conn) makeClientHello() (*clientHelloMsg, ecdheParameters, error) { return hello, params, nil } -func (c *Conn) clientHandshake(ctx context.Context) (err error) { +func (c *Conn) clientHandshake() (err error) { if c.config == nil { c.config = defaultConfig() } @@ -200,7 +198,6 @@ func (c *Conn) clientHandshake(ctx context.Context) (err error) { if c.vers == VersionTLS13 { hs := &clientHandshakeStateTLS13{ c: c, - ctx: ctx, serverHello: serverHello, hello: hello, ecdheParams: ecdheParams, @@ -215,7 +212,6 @@ func (c *Conn) clientHandshake(ctx context.Context) (err error) { hs := &clientHandshakeState{ c: c, - ctx: ctx, serverHello: serverHello, hello: hello, session: session, @@ -544,7 +540,7 @@ func (hs *clientHandshakeState) doFullHandshake() error { certRequested = true hs.finishedHash.Write(certReq.marshal()) - cri := certificateRequestInfoFromMsg(hs.ctx, c.vers, certReq) + cri := certificateRequestInfoFromMsg(c.vers, certReq) if chainToSend, err = c.getClientCertificate(cri); err != nil { c.sendAlert(alertInternalError) return err @@ -884,11 +880,10 @@ func (c *Conn) verifyServerCertificate(certificates [][]byte) error { // certificateRequestInfoFromMsg generates a CertificateRequestInfo from a TLS // <= 1.2 CertificateRequest, making an effort to fill in missing information. -func certificateRequestInfoFromMsg(ctx context.Context, vers uint16, certReq *certificateRequestMsg) *CertificateRequestInfo { +func certificateRequestInfoFromMsg(vers uint16, certReq *certificateRequestMsg) *CertificateRequestInfo { cri := &CertificateRequestInfo{ AcceptableCAs: certReq.certificateAuthorities, Version: vers, - ctx: ctx, } var rsaAvail, ecAvail bool diff --git a/src/crypto/tls/handshake_client_test.go b/src/crypto/tls/handshake_client_test.go index 8889e2c8c3..12b0254123 100644 --- a/src/crypto/tls/handshake_client_test.go +++ b/src/crypto/tls/handshake_client_test.go @@ -6,7 +6,6 @@ package tls import ( "bytes" - "context" "crypto/rsa" "crypto/x509" "encoding/base64" @@ -21,7 +20,6 @@ import ( "os/exec" "path/filepath" "reflect" - "runtime" "strconv" "strings" "testing" @@ -2513,37 +2511,3 @@ func testResumptionKeepsOCSPAndSCT(t *testing.T, ver uint16) { serverConfig.Certificates[0].SignedCertificateTimestamps, ccs.SignedCertificateTimestamps) } } - -func TestClientHandshakeContextCancellation(t *testing.T) { - c, s := localPipe(t) - serverConfig := testConfig.Clone() - serverErr := make(chan error, 1) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go func() { - defer close(serverErr) - defer s.Close() - conn := Server(s, serverConfig) - _, err := conn.readClientHello(ctx) - cancel() - serverErr <- err - }() - cli := Client(c, testConfig) - err := cli.HandshakeContext(ctx) - if err == nil { - t.Fatal("Client handshake did not error when the context was canceled") - } - if err != context.Canceled { - t.Errorf("Unexpected client handshake error: %v", err) - } - if err := <-serverErr; err != nil { - t.Errorf("Unexpected server error: %v", err) - } - if runtime.GOARCH == "wasm" { - t.Skip("conn.Close does not error as expected when called multiple times on WASM") - } - err = cli.Close() - if err == nil { - t.Error("Client connection was not closed when the context was canceled") - } -} diff --git a/src/crypto/tls/handshake_client_tls13.go b/src/crypto/tls/handshake_client_tls13.go index be37c681c6..daa5d97fd3 100644 --- a/src/crypto/tls/handshake_client_tls13.go +++ b/src/crypto/tls/handshake_client_tls13.go @@ -6,7 +6,6 @@ package tls import ( "bytes" - "context" "crypto" "crypto/hmac" "crypto/rsa" @@ -18,7 +17,6 @@ import ( type clientHandshakeStateTLS13 struct { c *Conn - ctx context.Context serverHello *serverHelloMsg hello *clientHelloMsg ecdheParams ecdheParameters @@ -557,7 +555,6 @@ func (hs *clientHandshakeStateTLS13) sendClientCertificate() error { AcceptableCAs: hs.certReq.certificateAuthorities, SignatureSchemes: hs.certReq.supportedSignatureAlgorithms, Version: c.vers, - ctx: hs.ctx, }) if err != nil { return err diff --git a/src/crypto/tls/handshake_server.go b/src/crypto/tls/handshake_server.go index 5a572a9db1..9c3e0f636e 100644 --- a/src/crypto/tls/handshake_server.go +++ b/src/crypto/tls/handshake_server.go @@ -5,7 +5,6 @@ package tls import ( - "context" "crypto" "crypto/ecdsa" "crypto/ed25519" @@ -24,7 +23,6 @@ import ( // It's discarded once the handshake has completed. type serverHandshakeState struct { c *Conn - ctx context.Context clientHello *clientHelloMsg hello *serverHelloMsg suite *cipherSuite @@ -39,8 +37,8 @@ type serverHandshakeState struct { } // serverHandshake performs a TLS handshake as a server. -func (c *Conn) serverHandshake(ctx context.Context) error { - clientHello, err := c.readClientHello(ctx) +func (c *Conn) serverHandshake() error { + clientHello, err := c.readClientHello() if err != nil { return err } @@ -48,7 +46,6 @@ func (c *Conn) serverHandshake(ctx context.Context) error { if c.vers == VersionTLS13 { hs := serverHandshakeStateTLS13{ c: c, - ctx: ctx, clientHello: clientHello, } return hs.handshake() @@ -56,7 +53,6 @@ func (c *Conn) serverHandshake(ctx context.Context) error { hs := serverHandshakeState{ c: c, - ctx: ctx, clientHello: clientHello, } return hs.handshake() @@ -128,7 +124,7 @@ func (hs *serverHandshakeState) handshake() error { } // readClientHello reads a ClientHello message and selects the protocol version. -func (c *Conn) readClientHello(ctx context.Context) (*clientHelloMsg, error) { +func (c *Conn) readClientHello() (*clientHelloMsg, error) { msg, err := c.readHandshake() if err != nil { return nil, err @@ -142,7 +138,7 @@ func (c *Conn) readClientHello(ctx context.Context) (*clientHelloMsg, error) { var configForClient *Config originalConfig := c.config if c.config.GetConfigForClient != nil { - chi := clientHelloInfo(ctx, c, clientHello) + chi := clientHelloInfo(c, clientHello) if configForClient, err = c.config.GetConfigForClient(chi); err != nil { c.sendAlert(alertInternalError) return nil, err @@ -224,7 +220,7 @@ func (hs *serverHandshakeState) processClientHello() error { } } - hs.cert, err = c.config.getCertificate(clientHelloInfo(hs.ctx, c, hs.clientHello)) + hs.cert, err = c.config.getCertificate(clientHelloInfo(c, hs.clientHello)) if err != nil { if err == errNoCertificates { c.sendAlert(alertUnrecognizedName) @@ -832,7 +828,7 @@ func (c *Conn) processCertsFromClient(certificate Certificate) error { return nil } -func clientHelloInfo(ctx context.Context, c *Conn, clientHello *clientHelloMsg) *ClientHelloInfo { +func clientHelloInfo(c *Conn, clientHello *clientHelloMsg) *ClientHelloInfo { supportedVersions := clientHello.supportedVersions if len(clientHello.supportedVersions) == 0 { supportedVersions = supportedVersionsFromMax(clientHello.vers) @@ -848,6 +844,5 @@ func clientHelloInfo(ctx context.Context, c *Conn, clientHello *clientHelloMsg) SupportedVersions: supportedVersions, Conn: c.conn, config: c.config, - ctx: ctx, } } diff --git a/src/crypto/tls/handshake_server_test.go b/src/crypto/tls/handshake_server_test.go index ad851b6edf..d6bf9e439b 100644 --- a/src/crypto/tls/handshake_server_test.go +++ b/src/crypto/tls/handshake_server_test.go @@ -6,7 +6,6 @@ package tls import ( "bytes" - "context" "crypto" "crypto/elliptic" "crypto/x509" @@ -18,7 +17,6 @@ import ( "os" "os/exec" "path/filepath" - "runtime" "strings" "testing" "time" @@ -40,12 +38,10 @@ func testClientHelloFailure(t *testing.T, serverConfig *Config, m handshakeMessa cli.writeRecord(recordTypeHandshake, m.marshal()) c.Close() }() - ctx := context.Background() conn := Server(s, serverConfig) - ch, err := conn.readClientHello(ctx) + ch, err := conn.readClientHello() hs := serverHandshakeState{ c: conn, - ctx: ctx, clientHello: ch, } if err == nil { @@ -1425,11 +1421,9 @@ func TestSNIGivenOnFailure(t *testing.T) { c.Close() }() conn := Server(s, serverConfig) - ctx := context.Background() - ch, err := conn.readClientHello(ctx) + ch, err := conn.readClientHello() hs := serverHandshakeState{ c: conn, - ctx: ctx, clientHello: ch, } if err == nil { @@ -1683,46 +1677,6 @@ func TestMultipleCertificates(t *testing.T) { } } -func TestServerHandshakeContextCancellation(t *testing.T) { - c, s := localPipe(t) - clientConfig := testConfig.Clone() - clientErr := make(chan error, 1) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go func() { - defer close(clientErr) - defer c.Close() - clientHello := &clientHelloMsg{ - vers: VersionTLS10, - random: make([]byte, 32), - cipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA}, - compressionMethods: []uint8{compressionNone}, - } - cli := Client(c, clientConfig) - _, err := cli.writeRecord(recordTypeHandshake, clientHello.marshal()) - cancel() - clientErr <- err - }() - conn := Server(s, testConfig) - err := conn.HandshakeContext(ctx) - if err == nil { - t.Fatal("Server handshake did not error when the context was canceled") - } - if err != context.Canceled { - t.Errorf("Unexpected server handshake error: %v", err) - } - if err := <-clientErr; err != nil { - t.Errorf("Unexpected client error: %v", err) - } - if runtime.GOARCH == "wasm" { - t.Skip("conn.Close does not error as expected when called multiple times on WASM") - } - err = conn.Close() - if err == nil { - t.Error("Server connection was not closed when the context was canceled") - } -} - func TestAESCipherReordering(t *testing.T) { currentAESSupport := hasAESGCMHardwareSupport defer func() { hasAESGCMHardwareSupport = currentAESSupport; initDefaultCipherSuites() }() diff --git a/src/crypto/tls/handshake_server_tls13.go b/src/crypto/tls/handshake_server_tls13.go index c7837d2955..c2c288aed4 100644 --- a/src/crypto/tls/handshake_server_tls13.go +++ b/src/crypto/tls/handshake_server_tls13.go @@ -6,7 +6,6 @@ package tls import ( "bytes" - "context" "crypto" "crypto/hmac" "crypto/rsa" @@ -24,7 +23,6 @@ const maxClientPSKIdentities = 5 type serverHandshakeStateTLS13 struct { c *Conn - ctx context.Context clientHello *clientHelloMsg hello *serverHelloMsg sentDummyCCS bool @@ -376,7 +374,7 @@ func (hs *serverHandshakeStateTLS13) pickCertificate() error { return c.sendAlert(alertMissingExtension) } - certificate, err := c.config.getCertificate(clientHelloInfo(hs.ctx, c, hs.clientHello)) + certificate, err := c.config.getCertificate(clientHelloInfo(c, hs.clientHello)) if err != nil { if err == errNoCertificates { c.sendAlert(alertUnrecognizedName) diff --git a/src/crypto/tls/tls.go b/src/crypto/tls/tls.go index 19884f96e7..a389873d32 100644 --- a/src/crypto/tls/tls.go +++ b/src/crypto/tls/tls.go @@ -25,6 +25,7 @@ import ( "net" "os" "strings" + "time" ) // Server returns a new TLS server side connection @@ -115,16 +116,28 @@ func DialWithDialer(dialer *net.Dialer, network, addr string, config *Config) (* } func dial(ctx context.Context, netDialer *net.Dialer, network, addr string, config *Config) (*Conn, error) { - if netDialer.Timeout != 0 { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, netDialer.Timeout) - defer cancel() - } + // We want the Timeout and Deadline values from dialer to cover the + // whole process: TCP connection and TLS handshake. This means that we + // also need to start our own timers now. + timeout := netDialer.Timeout if !netDialer.Deadline.IsZero() { - var cancel context.CancelFunc - ctx, cancel = context.WithDeadline(ctx, netDialer.Deadline) - defer cancel() + deadlineTimeout := time.Until(netDialer.Deadline) + if timeout == 0 || deadlineTimeout < timeout { + timeout = deadlineTimeout + } + } + + // hsErrCh is non-nil if we might not wait for Handshake to complete. + var hsErrCh chan error + if timeout != 0 || ctx.Done() != nil { + hsErrCh = make(chan error, 2) + } + if timeout != 0 { + timer := time.AfterFunc(timeout, func() { + hsErrCh <- timeoutError{} + }) + defer timer.Stop() } rawConn, err := netDialer.DialContext(ctx, network, addr) @@ -151,10 +164,34 @@ func dial(ctx context.Context, netDialer *net.Dialer, network, addr string, conf } conn := Client(rawConn, config) - if err := conn.HandshakeContext(ctx); err != nil { + + if hsErrCh == nil { + err = conn.Handshake() + } else { + go func() { + hsErrCh <- conn.Handshake() + }() + + select { + case <-ctx.Done(): + err = ctx.Err() + case err = <-hsErrCh: + if err != nil { + // If the error was due to the context + // closing, prefer the context's error, rather + // than some random network teardown error. + if e := ctx.Err(); e != nil { + err = e + } + } + } + } + + if err != nil { rawConn.Close() return nil, err } + return conn, nil } diff --git a/src/net/http/server.go b/src/net/http/server.go index 102e893d5f..ad99741177 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -1837,7 +1837,7 @@ func (c *conn) serve(ctx context.Context) { if d := c.server.WriteTimeout; d != 0 { c.rwc.SetWriteDeadline(time.Now().Add(d)) } - if err := tlsConn.HandshakeContext(ctx); err != nil { + if err := tlsConn.Handshake(); err != nil { // If the handshake failed due to the client not speaking // TLS, assume they're speaking plaintext HTTP and write a // 400 response on the TLS conn's underlying net.Conn. diff --git a/src/net/http/transport.go b/src/net/http/transport.go index 6358c3897e..0aa48273dd 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -1505,7 +1505,7 @@ func (t *Transport) decConnsPerHost(key connectMethodKey) { // Add TLS to a persistent connection, i.e. negotiate a TLS session. If pconn is already a TLS // tunnel, this function establishes a nested TLS session inside the encrypted channel. // The remote endpoint's name may be overridden by TLSClientConfig.ServerName. -func (pconn *persistConn) addTLS(ctx context.Context, name string, trace *httptrace.ClientTrace) error { +func (pconn *persistConn) addTLS(name string, trace *httptrace.ClientTrace) error { // Initiate TLS and check remote host name against certificate. cfg := cloneTLSConfig(pconn.t.TLSClientConfig) if cfg.ServerName == "" { @@ -1527,7 +1527,7 @@ func (pconn *persistConn) addTLS(ctx context.Context, name string, trace *httptr if trace != nil && trace.TLSHandshakeStart != nil { trace.TLSHandshakeStart() } - err := tlsConn.HandshakeContext(ctx) + err := tlsConn.Handshake() if timer != nil { timer.Stop() } @@ -1583,7 +1583,7 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *pers if trace != nil && trace.TLSHandshakeStart != nil { trace.TLSHandshakeStart() } - if err := tc.HandshakeContext(ctx); err != nil { + if err := tc.Handshake(); err != nil { go pconn.conn.Close() if trace != nil && trace.TLSHandshakeDone != nil { trace.TLSHandshakeDone(tls.ConnectionState{}, err) @@ -1607,7 +1607,7 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *pers if firstTLSHost, _, err = net.SplitHostPort(cm.addr()); err != nil { return nil, wrapErr(err) } - if err = pconn.addTLS(ctx, firstTLSHost, trace); err != nil { + if err = pconn.addTLS(firstTLSHost, trace); err != nil { return nil, wrapErr(err) } } @@ -1721,7 +1721,7 @@ func (t *Transport) dialConn(ctx context.Context, cm connectMethod) (pconn *pers } if cm.proxyURL != nil && cm.targetScheme == "https" { - if err := pconn.addTLS(ctx, cm.tlsHost(), trace); err != nil { + if err := pconn.addTLS(cm.tlsHost(), trace); err != nil { return nil, err } } diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 7f6e0938c2..ba85a61683 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -3734,7 +3734,7 @@ func TestTransportDialTLSContext(t *testing.T) { if err != nil { return nil, err } - return c, c.HandshakeContext(ctx) + return c, c.Handshake() } req, err := NewRequest("GET", ts.URL, nil) -- GitLab From 8fcf318123e15abf6ce35e33831bdb64a4e071ff Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Thu, 17 Dec 2020 15:17:14 -0500 Subject: [PATCH 1546/1792] api/go1.16: remove crypto/tls APIs that are moved to Go 1.17 CL 269697 was created before CL 276454 and submitted after, so the api/go1.16.txt file needs to be updated accordingly to fix the build. Updates #32406. Change-Id: I6bf79cc981be504e0baefa82982814aaee4434dc Reviewed-on: https://go-review.googlesource.com/c/go/+/278992 Trust: Dmitri Shuralyov Trust: Katie Hockman Reviewed-by: Katie Hockman --- api/go1.16.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/go1.16.txt b/api/go1.16.txt index 2e04b3ba0a..16d9cb891b 100644 --- a/api/go1.16.txt +++ b/api/go1.16.txt @@ -1,8 +1,5 @@ pkg archive/zip, method (*ReadCloser) Open(string) (fs.File, error) pkg archive/zip, method (*Reader) Open(string) (fs.File, error) -pkg crypto/tls, method (*CertificateRequestInfo) Context() context.Context -pkg crypto/tls, method (*ClientHelloInfo) Context() context.Context -pkg crypto/tls, method (*Conn) HandshakeContext(context.Context) error pkg crypto/x509, method (SystemRootsError) Unwrap() error pkg crypto/x509, type CertificateRequest struct, BasicConstraintsValid bool pkg crypto/x509, type CertificateRequest struct, ExtKeyUsage []ExtKeyUsage -- GitLab From f1778c28a9c6a898e9d78207847d61b189c49b5c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 17 Dec 2020 14:03:07 -0800 Subject: [PATCH 1547/1792] test: recognize and use gc build tag Change the run.go driver to recognize the "gc" build tag. Change existing tests to use the "gc" build tag if they use some feature that seems specific to the gc compiler, such as passing specific options to or expecting specific behavior from "go tool compile". Change tests to use the "!gccgo" build tag if they use "go build" or "go run", as while those might work with compilers other than gc, they won't work with the way that gccgo runs its testsuite (which happens independently of the go command). For #43252 Change-Id: I666e04b6d7255a77dfc256ee304094e3a6bb15ad Reviewed-on: https://go-review.googlesource.com/c/go/+/279052 Trust: Ian Lance Taylor Reviewed-by: Cherry Zhang --- test/fixedbugs/bug302.go | 2 +- test/fixedbugs/bug369.go | 2 +- test/fixedbugs/issue10607.go | 2 +- test/fixedbugs/issue11771.go | 2 +- test/fixedbugs/issue13268.go | 1 + test/fixedbugs/issue14636.go | 2 +- test/fixedbugs/issue16037_run.go | 2 +- test/fixedbugs/issue19658.go | 2 +- test/fixedbugs/issue21317.go | 6 +----- test/fixedbugs/issue21576.go | 2 +- test/fixedbugs/issue22660.go | 6 +----- test/fixedbugs/issue22662b.go | 6 +----- test/fixedbugs/issue33275_run.go | 2 +- test/fixedbugs/issue33555.go | 2 +- test/fixedbugs/issue36437.go | 2 +- test/fixedbugs/issue9355.go | 6 +----- test/fixedbugs/issue9862_run.go | 2 +- test/linkobj.go | 2 +- test/linkx_run.go | 2 +- test/nosplit.go | 2 +- test/run.go | 2 +- test/sinit_run.go | 2 +- 22 files changed, 22 insertions(+), 37 deletions(-) diff --git a/test/fixedbugs/bug302.go b/test/fixedbugs/bug302.go index 87f9d4ef70..a2ab661277 100644 --- a/test/fixedbugs/bug302.go +++ b/test/fixedbugs/bug302.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,gc // run // Copyright 2010 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/bug369.go b/test/fixedbugs/bug369.go index 9316f7aad0..83f638d046 100644 --- a/test/fixedbugs/bug369.go +++ b/test/fixedbugs/bug369.go @@ -1,4 +1,4 @@ -// +build !nacl,!js,!windows +// +build !nacl,!js,!windows,gc // run // Copyright 2011 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue10607.go b/test/fixedbugs/issue10607.go index 6f4717d820..448a37dcac 100644 --- a/test/fixedbugs/issue10607.go +++ b/test/fixedbugs/issue10607.go @@ -1,4 +1,4 @@ -// +build linux,!ppc64,!riscv64 +// +build linux,!ppc64,!riscv64,gc // run // Copyright 2015 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue11771.go b/test/fixedbugs/issue11771.go index 99d7060d44..c95dd6ba39 100644 --- a/test/fixedbugs/issue11771.go +++ b/test/fixedbugs/issue11771.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,gc // run // Copyright 2015 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue13268.go b/test/fixedbugs/issue13268.go index fcb69c9068..53a82d5074 100644 --- a/test/fixedbugs/issue13268.go +++ b/test/fixedbugs/issue13268.go @@ -1,3 +1,4 @@ +// +build gc // run // Copyright 2015 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue14636.go b/test/fixedbugs/issue14636.go index 6797046e02..06fd193dae 100644 --- a/test/fixedbugs/issue14636.go +++ b/test/fixedbugs/issue14636.go @@ -1,4 +1,4 @@ -// +build !nacl,!js,!android +// +build !nacl,!js,!android,gc // run // Copyright 2016 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue16037_run.go b/test/fixedbugs/issue16037_run.go index d05e3f7f31..68104a9000 100644 --- a/test/fixedbugs/issue16037_run.go +++ b/test/fixedbugs/issue16037_run.go @@ -1,4 +1,4 @@ -// +build !nacl,!js,!android +// +build !nacl,!js,!android,!gccgo // run // Copyright 2016 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue19658.go b/test/fixedbugs/issue19658.go index b2539629df..bab409c6c0 100644 --- a/test/fixedbugs/issue19658.go +++ b/test/fixedbugs/issue19658.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,!gccgo // run // Copyright 2017 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue21317.go b/test/fixedbugs/issue21317.go index f4ec422371..32b660c163 100644 --- a/test/fixedbugs/issue21317.go +++ b/test/fixedbugs/issue21317.go @@ -1,3 +1,4 @@ +// +build !js,gc // run // Copyright 2017 The Go Authors. All rights reserved. @@ -16,15 +17,10 @@ import ( "log" "os" "os/exec" - "runtime" "strings" ) func main() { - if runtime.Compiler != "gc" || runtime.GOOS == "js" { - return - } - f, err := ioutil.TempFile("", "issue21317.go") if err != nil { log.Fatal(err) diff --git a/test/fixedbugs/issue21576.go b/test/fixedbugs/issue21576.go index ae6161ccf5..3f9b1ba008 100644 --- a/test/fixedbugs/issue21576.go +++ b/test/fixedbugs/issue21576.go @@ -1,6 +1,6 @@ // run -// +build !nacl,!js +// +build !nacl,!js,!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 44ba42ac96..9ce9c4d732 100644 --- a/test/fixedbugs/issue22660.go +++ b/test/fixedbugs/issue22660.go @@ -1,3 +1,4 @@ +// +build !js,gc // run // Copyright 2017 The Go Authors. All rights reserved. @@ -14,15 +15,10 @@ import ( "os" "os/exec" "path/filepath" - "runtime" "strings" ) func main() { - if runtime.GOOS == "js" { - return // no file system available on builders - } - f, err := ioutil.TempFile("", "issue22660.go") if err != nil { log.Fatal(err) diff --git a/test/fixedbugs/issue22662b.go b/test/fixedbugs/issue22662b.go index 0fcfe8d0db..8da17679be 100644 --- a/test/fixedbugs/issue22662b.go +++ b/test/fixedbugs/issue22662b.go @@ -1,3 +1,4 @@ +// +build !js,gc // run // Copyright 2018 The Go Authors. All rights reserved. @@ -13,7 +14,6 @@ import ( "log" "os" "os/exec" - "runtime" "strings" ) @@ -36,10 +36,6 @@ var tests = []struct { } func main() { - if runtime.GOOS == "js" { - return // can not exec go tool - } - f, err := ioutil.TempFile("", "issue22662b.go") if err != nil { log.Fatal(err) diff --git a/test/fixedbugs/issue33275_run.go b/test/fixedbugs/issue33275_run.go index f3e2e14f39..ed03dccf4c 100644 --- a/test/fixedbugs/issue33275_run.go +++ b/test/fixedbugs/issue33275_run.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,!gccgo // run // Copyright 2019 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue33555.go b/test/fixedbugs/issue33555.go index 7debd2049c..c1fcd2a79b 100644 --- a/test/fixedbugs/issue33555.go +++ b/test/fixedbugs/issue33555.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,!gccgo // run // Copyright 2019 The Go Authors. All rights reserved. diff --git a/test/fixedbugs/issue36437.go b/test/fixedbugs/issue36437.go index f96544beff..c7a11d27a8 100644 --- a/test/fixedbugs/issue36437.go +++ b/test/fixedbugs/issue36437.go @@ -1,6 +1,6 @@ // run -// +build !nacl,!js +// +build !nacl,!js,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/issue9355.go b/test/fixedbugs/issue9355.go index ab3369d415..319a2a90df 100644 --- a/test/fixedbugs/issue9355.go +++ b/test/fixedbugs/issue9355.go @@ -1,3 +1,4 @@ +// +build !js,gc // run // Copyright 2014 The Go Authors. All rights reserved. @@ -13,14 +14,9 @@ import ( "os/exec" "path/filepath" "regexp" - "runtime" ) func main() { - if runtime.Compiler != "gc" || runtime.GOOS == "js" { - return - } - err := os.Chdir(filepath.Join("fixedbugs", "issue9355.dir")) check(err) diff --git a/test/fixedbugs/issue9862_run.go b/test/fixedbugs/issue9862_run.go index 299e809545..c956c7f7bd 100644 --- a/test/fixedbugs/issue9862_run.go +++ b/test/fixedbugs/issue9862_run.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,gc // run // Copyright 2015 The Go Authors. All rights reserved. diff --git a/test/linkobj.go b/test/linkobj.go index 2902d23f4b..4c9bd24568 100644 --- a/test/linkobj.go +++ b/test/linkobj.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,gc // run // Copyright 2016 The Go Authors. All rights reserved. diff --git a/test/linkx_run.go b/test/linkx_run.go index f25053bf28..ccfc3a93df 100644 --- a/test/linkx_run.go +++ b/test/linkx_run.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,gc // run // Copyright 2014 The Go Authors. All rights reserved. diff --git a/test/nosplit.go b/test/nosplit.go index a3f2a9fb7e..faa7b8c2d8 100644 --- a/test/nosplit.go +++ b/test/nosplit.go @@ -1,4 +1,4 @@ -// +build !nacl,!js,!aix,!gcflags_noopt +// +build !nacl,!js,!aix,!gcflags_noopt,gc // run // Copyright 2014 The Go Authors. All rights reserved. diff --git a/test/run.go b/test/run.go index 4abf32d25c..db3e9f6c2f 100644 --- a/test/run.go +++ b/test/run.go @@ -438,7 +438,7 @@ func (ctxt *context) match(name string) bool { } } - if name == ctxt.GOOS || name == ctxt.GOARCH { + if name == ctxt.GOOS || name == ctxt.GOARCH || name == "gc" { return true } diff --git a/test/sinit_run.go b/test/sinit_run.go index c37fc9b88c..dcaf338331 100644 --- a/test/sinit_run.go +++ b/test/sinit_run.go @@ -1,4 +1,4 @@ -// +build !nacl,!js +// +build !nacl,!js,gc // run // Copyright 2014 The Go Authors. All rights reserved. -- GitLab From 740851bacafd8e47b9a6ce0cd8fa8e05506a7382 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 14 Dec 2020 13:03:06 -0500 Subject: [PATCH 1548/1792] cmd/link: avoid use of -T when linking with lld When doing external linking on Windows, auto-detect the linker flavor (bfd vs gold vs lld) and when linking with "lld", avoid the use of "-T" (linker script), since this option is not supported by lld. [Note: the Go linker currently employs -T to ensure proper placement of the .debug_gdb_scripts section, to work around issues in older versions of binutils; LLD recognizes this section and does place it properly]. Updates #39326. Change-Id: I3ea79cdceef2316bf86eccdb60188ac3655264ed Reviewed-on: https://go-review.googlesource.com/c/go/+/278932 Trust: Than McIntosh Run-TryBot: Than McIntosh TryBot-Result: Go Bot Reviewed-by: Jeremy Faller Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/lib.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index f3c301cc9b..833b3eb9db 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1560,10 +1560,22 @@ func (ctxt *Link) hostlink() { checkStatic(p) } if ctxt.HeadType == objabi.Hwindows { + // Determine which linker we're using. Add in the extldflags in + // case used has specified "-fuse-ld=...". + cmd := exec.Command(*flagExtld, *flagExtldflags, "-Wl,--version") + usingLLD := false + if out, err := cmd.CombinedOutput(); err == nil { + if bytes.Contains(out, []byte("LLD ")) { + usingLLD = true + } + } + // use gcc linker script to work around gcc bug // (see https://golang.org/issue/20183 for details). - p := writeGDBLinkerScript() - argv = append(argv, "-Wl,-T,"+p) + if !usingLLD { + p := writeGDBLinkerScript() + argv = append(argv, "-Wl,-T,"+p) + } // libmingw32 and libmingwex have some inter-dependencies, // so must use linker groups. argv = append(argv, "-Wl,--start-group", "-lmingwex", "-lmingw32", "-Wl,--end-group") -- GitLab From ae652a4ac9354fef81610ca616b872262ea51281 Mon Sep 17 00:00:00 2001 From: Henrique Vicente Date: Mon, 16 Nov 2020 03:09:31 +0100 Subject: [PATCH 1549/1792] os/signal: fix flaky tests for NotifyContext. Test failures started to happen sporadically on some builds after the introduction of NotifyContext. To make these tests more robust and avoid the risk of crosstalk we run them in a separate process. Fixes #41561. Change-Id: Ia7af105c316afd11765358f1e5e253ccfe2adc2b Reviewed-on: https://go-review.googlesource.com/c/go/+/270198 Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Bryan C. Mills Trust: Cherry Zhang --- src/os/signal/signal_test.go | 102 ++++++++++++++++++++--------------- 1 file changed, 60 insertions(+), 42 deletions(-) diff --git a/src/os/signal/signal_test.go b/src/os/signal/signal_test.go index 8945cbfccb..bbc68af9fb 100644 --- a/src/os/signal/signal_test.go +++ b/src/os/signal/signal_test.go @@ -675,22 +675,68 @@ func TestTime(t *testing.T) { <-done } -func TestNotifyContext(t *testing.T) { - c, stop := NotifyContext(context.Background(), syscall.SIGINT) - defer stop() - - if want, got := "signal.NotifyContext(context.Background, [interrupt])", fmt.Sprint(c); want != got { - t.Errorf("c.String() = %q, want %q", got, want) - } +var ( + checkNotifyContext = flag.Bool("check_notify_ctx", false, "if true, TestNotifyContext will fail if SIGINT is not received.") + ctxNotifyTimes = flag.Int("ctx_notify_times", 1, "number of times a SIGINT signal should be received") +) - syscall.Kill(syscall.Getpid(), syscall.SIGINT) - select { - case <-c.Done(): - if got := c.Err(); got != context.Canceled { - t.Errorf("c.Err() = %q, want %q", got, context.Canceled) +func TestNotifyContextNotifications(t *testing.T) { + if *checkNotifyContext { + ctx, _ := NotifyContext(context.Background(), syscall.SIGINT) + // We want to make sure not to be calling Stop() internally on NotifyContext() when processing a received signal. + // Being able to wait for a number of received system signals allows us to do so. + var wg sync.WaitGroup + n := *ctxNotifyTimes + wg.Add(n) + for i := 0; i < n; i++ { + go func() { + syscall.Kill(syscall.Getpid(), syscall.SIGINT) + wg.Done() + }() } - case <-time.After(time.Second): - t.Errorf("timed out waiting for context to be done after SIGINT") + wg.Wait() + <-ctx.Done() + fmt.Print("received SIGINT") + // Sleep to give time to simultaneous signals to reach the process. + // These signals must be ignored given stop() is not called on this code. + // We want to guarantee a SIGINT doesn't cause a premature termination of the program. + time.Sleep(settleTime) + return + } + + t.Parallel() + testCases := []struct { + name string + n int // number of times a SIGINT should be notified. + }{ + {"once", 1}, + {"multiple", 10}, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + var subTimeout time.Duration + if deadline, ok := t.Deadline(); ok { + subTimeout := time.Until(deadline) + subTimeout -= subTimeout / 10 // Leave 10% headroom for cleaning up subprocess. + } + + args := []string{ + "-test.v", + "-test.run=TestNotifyContextNotifications$", + "-check_notify_ctx", + fmt.Sprintf("-ctx_notify_times=%d", tc.n), + } + if subTimeout != 0 { + args = append(args, fmt.Sprintf("-test.timeout=%v", subTimeout)) + } + out, err := exec.Command(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) + } + if want := []byte("received SIGINT"); !bytes.Contains(out, want) { + t.Errorf("got %q, wanted %q", out, want) + } + }) } } @@ -768,34 +814,6 @@ func TestNotifyContextPrematureCancelParent(t *testing.T) { } } -func TestNotifyContextSimultaneousNotifications(t *testing.T) { - c, stop := NotifyContext(context.Background(), syscall.SIGINT) - defer stop() - - if want, got := "signal.NotifyContext(context.Background, [interrupt])", fmt.Sprint(c); want != got { - t.Errorf("c.String() = %q, want %q", got, want) - } - - var wg sync.WaitGroup - n := 10 - wg.Add(n) - for i := 0; i < n; i++ { - go func() { - syscall.Kill(syscall.Getpid(), syscall.SIGINT) - wg.Done() - }() - } - wg.Wait() - select { - case <-c.Done(): - if got := c.Err(); got != context.Canceled { - t.Errorf("c.Err() = %q, want %q", got, context.Canceled) - } - case <-time.After(time.Second): - t.Errorf("expected context to be canceled") - } -} - func TestNotifyContextSimultaneousStop(t *testing.T) { c, stop := NotifyContext(context.Background(), syscall.SIGINT) defer stop() -- GitLab From 2de786647019d8a48bb776660f861995721c88c6 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 17 Dec 2020 14:57:20 -0800 Subject: [PATCH 1550/1792] os: remove dependency on strings package Historically the os package has not imported the strings package. That was enforced by go/build.TestDependencies, but that test was accidentally broken (#43249). A dependency of os on strings was accidentally added by CL 266364; remove it. For #42026 For #43249 Change-Id: If932308f30561fdcc5c608d7563e849c0d2870d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/279072 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Tobias Klauser --- src/os/file_plan9.go | 10 ---------- src/os/tempfile.go | 17 ++++++++++++----- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/os/file_plan9.go b/src/os/file_plan9.go index bbc732838a..4f384e9211 100644 --- a/src/os/file_plan9.go +++ b/src/os/file_plan9.go @@ -336,16 +336,6 @@ func hasPrefix(s, prefix string) bool { return len(s) >= len(prefix) && s[0:len(prefix)] == prefix } -// LastIndexByte from the strings package. -func lastIndex(s string, sep byte) int { - for i := len(s) - 1; i >= 0; i-- { - if s[i] == sep { - return i - } - } - return -1 -} - func rename(oldname, newname string) error { dirname := oldname[:lastIndex(oldname, '/')+1] if hasPrefix(newname, dirname) { diff --git a/src/os/tempfile.go b/src/os/tempfile.go index 2728485c32..4f90fcf8e8 100644 --- a/src/os/tempfile.go +++ b/src/os/tempfile.go @@ -4,10 +4,7 @@ package os -import ( - "errors" - "strings" -) +import "errors" // fastrand provided by runtime. // We generate random temporary file names so that there's a good @@ -62,7 +59,7 @@ func prefixAndSuffix(pattern string) (prefix, suffix string, err error) { return "", "", errPatternHasSeparator } } - if pos := strings.LastIndex(pattern, "*"); pos != -1 { + if pos := lastIndex(pattern, '*'); pos != -1 { prefix, suffix = pattern[:pos], pattern[pos+1:] } else { prefix = pattern @@ -116,3 +113,13 @@ func joinPath(dir, name string) string { } return dir + string(PathSeparator) + name } + +// LastIndexByte from the strings package. +func lastIndex(s string, sep byte) int { + for i := len(s) - 1; i >= 0; i-- { + if s[i] == sep { + return i + } + } + return -1 +} -- GitLab From 139cd0e12ff9d7628c321abbfb8d2f4ada461543 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 17 Dec 2020 14:59:45 -0800 Subject: [PATCH 1551/1792] go/build: make TestDependencies work again CL 243940 accidentally broke TestDependencies such that it always passed. Make it work again, and add a test so that it won't break in the same way. This revealed that the new embed package was missing from TestDepencies, so add it. Fixes #43249 Change-Id: I02b3e38dd35ad88880c4344d46de13b7639aa4c6 Reviewed-on: https://go-review.googlesource.com/c/go/+/279073 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Russ Cox --- src/go/build/deps_test.go | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 56942c0fd2..aa651af718 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -10,6 +10,7 @@ package build import ( "bytes" "fmt" + "go/token" "internal/testenv" "io/fs" "os" @@ -162,6 +163,9 @@ var depsRules = ` < os < os/signal; + io/fs + < embed; + unicode, fmt !< os, os/signal; os/signal, STR @@ -602,6 +606,7 @@ func findImports(pkg string) ([]string, error) { } var imports []string var haveImport = map[string]bool{} + fset := token.NewFileSet() for _, file := range files { name := file.Name() if name == "slice_go14.go" || name == "slice_go18.go" { @@ -611,8 +616,10 @@ func findImports(pkg string) ([]string, error) { if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") { continue } - var info fileInfo - info.name = filepath.Join(dir, name) + info := fileInfo{ + name: filepath.Join(dir, name), + fset: fset, + } f, err := os.Open(info.name) if err != nil { return nil, err @@ -840,3 +847,22 @@ func TestStdlibLowercase(t *testing.T) { } } } + +// TestFindImports tests that findImports works. See #43249. +func TestFindImports(t *testing.T) { + imports, err := findImports("go/build") + if err != nil { + t.Fatal(err) + } + t.Logf("go/build imports %q", imports) + want := []string{"bytes", "os", "path/filepath", "strings"} +wantLoop: + for _, w := range want { + for _, imp := range imports { + if imp == w { + continue wantLoop + } + } + t.Errorf("expected to find %q in import list", w) + } +} -- GitLab From 626cc7c02dd3a1a85d95f83e2d7e988e483e3cac Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 18 Dec 2020 13:54:27 -0800 Subject: [PATCH 1552/1792] test: permit "exponent too large" error The language spec only requires a signed binary exponent of 16 bits for floating point constants. Permit a "exponent too large" error for larger exponents. Don't run test 11326b with gccgo, as it requires successful compilation of floating point constants with exponents that don't fit in 16 bits. Change-Id: I98688160c76864aba525a151a14aaaf86bc36a6f Reviewed-on: https://go-review.googlesource.com/c/go/+/279252 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Robert Griesemer --- test/fixedbugs/issue11326.go | 10 +++++----- test/fixedbugs/issue11326b.go | 4 ++++ test/fixedbugs/issue13471.go | 22 +++++++++++----------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/test/fixedbugs/issue11326.go b/test/fixedbugs/issue11326.go index f3037d53c4..e0c6a9f0ba 100644 --- a/test/fixedbugs/issue11326.go +++ b/test/fixedbugs/issue11326.go @@ -18,11 +18,11 @@ func main() { // Any implementation must be able to handle these constants at // compile time (even though they cannot be assigned to a float64). - var _ = 1e646456992 // ERROR "1e\+646456992 overflows float64|floating-point constant overflow" - var _ = 1e64645699 // ERROR "1e\+64645699 overflows float64|floating-point constant overflow" - var _ = 1e6464569 // ERROR "1e\+6464569 overflows float64|floating-point constant overflow" - var _ = 1e646456 // ERROR "1e\+646456 overflows float64|floating-point constant overflow" - var _ = 1e64645 // ERROR "1e\+64645 overflows float64|floating-point constant overflow" + var _ = 1e646456992 // ERROR "1e\+646456992 overflows float64|floating-point constant overflow|exponent too large" + var _ = 1e64645699 // ERROR "1e\+64645699 overflows float64|floating-point constant overflow|exponent too large" + var _ = 1e6464569 // ERROR "1e\+6464569 overflows float64|floating-point constant overflow|exponent too large" + var _ = 1e646456 // ERROR "1e\+646456 overflows float64|floating-point constant overflow|exponent too large" + var _ = 1e64645 // ERROR "1e\+64645 overflows float64|floating-point constant overflow|exponent too large" var _ = 1e6464 // ERROR "1e\+6464 overflows float64|floating-point constant overflow" var _ = 1e646 // ERROR "1e\+646 overflows float64|floating-point constant overflow" var _ = 1e309 // ERROR "1e\+309 overflows float64|floating-point constant overflow" diff --git a/test/fixedbugs/issue11326b.go b/test/fixedbugs/issue11326b.go index 8aba4d9121..b5f933bfea 100644 --- a/test/fixedbugs/issue11326b.go +++ b/test/fixedbugs/issue11326b.go @@ -1,5 +1,9 @@ // run +// Does not work with gccgo, which uses a smaller (but still permitted) +// exponent size. +// +build !gccgo + // 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. diff --git a/test/fixedbugs/issue13471.go b/test/fixedbugs/issue13471.go index 9bfc8c3d2c..9069412ffa 100644 --- a/test/fixedbugs/issue13471.go +++ b/test/fixedbugs/issue13471.go @@ -9,17 +9,17 @@ package main func main() { - const _ int64 = 1e646456992 // ERROR "integer too large|floating-point constant truncated to integer" - const _ int32 = 1e64645699 // ERROR "integer too large|floating-point constant truncated to integer" - const _ int16 = 1e6464569 // ERROR "integer too large|floating-point constant truncated to integer" - const _ int8 = 1e646456 // ERROR "integer too large|floating-point constant truncated to integer" - const _ int = 1e64645 // ERROR "integer too large|floating-point constant truncated to integer" + const _ int64 = 1e646456992 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" + const _ int32 = 1e64645699 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" + const _ int16 = 1e6464569 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" + const _ int8 = 1e646456 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" + const _ int = 1e64645 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" - const _ uint64 = 1e646456992 // ERROR "integer too large|floating-point constant truncated to integer" - const _ uint32 = 1e64645699 // ERROR "integer too large|floating-point constant truncated to integer" - const _ uint16 = 1e6464569 // ERROR "integer too large|floating-point constant truncated to integer" - const _ uint8 = 1e646456 // ERROR "integer too large|floating-point constant truncated to integer" - const _ uint = 1e64645 // ERROR "integer too large|floating-point constant truncated to integer" + const _ uint64 = 1e646456992 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" + const _ uint32 = 1e64645699 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" + const _ uint16 = 1e6464569 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" + const _ uint8 = 1e646456 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" + const _ uint = 1e64645 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" - const _ rune = 1e64645 // ERROR "integer too large|floating-point constant truncated to integer" + const _ rune = 1e64645 // ERROR "integer too large|floating-point constant truncated to integer|exponent too large" } -- GitLab From 55b58018f41e6de63bdaa8f3d9a284077d4e88c1 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 15 Dec 2020 20:24:33 -0800 Subject: [PATCH 1553/1792] test: for issue11656 try to execute trap, not call it The issue11656 code was using the trap instruction as a PC value, but it is intended to call a PC value that contains the trap instruction. It doesn't matter too much as in practice the address is not executable anyhow. But may as well have the code act the way it is documented to act. Also, don't run the test with gccgo/GoLLVM, as it can't work. The illegal instruction will have no unwind data, so the unwinder won't be able to get past it. In other words, gccgo/GoLLVM suffer from the exact problem that the issue describes, but it seems insoluble. For golang/go#11656 Change-Id: Ib2e50ffc91d215fd50e78f742fafe476c92d704e Reviewed-on: https://go-review.googlesource.com/c/go/+/278473 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Than McIntosh Reviewed-by: Cherry Zhang --- test/fixedbugs/issue11656.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/fixedbugs/issue11656.go b/test/fixedbugs/issue11656.go index 451ae6348f..62b36cf790 100644 --- a/test/fixedbugs/issue11656.go +++ b/test/fixedbugs/issue11656.go @@ -12,6 +12,11 @@ // wasm does not work, because the linear memory is not executable. // +build !wasm +// This test doesn't work on gccgo/GoLLVM, because they will not find +// any unwind information for the artificial function, and will not be +// able to unwind past that point. +// +build !gccgo + package main import ( @@ -75,6 +80,7 @@ func f(n int) { } f.x = uintptr(unsafe.Pointer(&ill[0])) - fn := *(*func())(unsafe.Pointer(&f)) + p := &f + fn := *(*func())(unsafe.Pointer(&p)) fn() } -- GitLab From 89b44b4e2bb2f88474d6b8476f5c28ea2aea9b28 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Sun, 20 Dec 2020 01:15:46 -0800 Subject: [PATCH 1554/1792] cmd/compile: recognize reassignments involving receives Previously, reassigned was failing to detect reassignments due to channel receives in select statements (OSELRECV, OSELRECV2), or due to standalone 2-value receive assignments (OAS2RECV). This was reported as a devirtualization panic, but could have caused mis-inlining as well. Fixes #43292. Change-Id: Ic8079c20c0587aeacff9596697fdeba80a697b12 Reviewed-on: https://go-review.googlesource.com/c/go/+/279352 Trust: Matthew Dempsky Run-TryBot: Matthew Dempsky Reviewed-by: Cuong Manh Le TryBot-Result: Go Bot --- src/cmd/compile/internal/gc/inl.go | 8 +++- test/fixedbugs/issue43292.go | 59 ++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue43292.go diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index 419056985f..600d12b59b 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -832,16 +832,20 @@ func (v *reassignVisitor) visit(n *Node) *Node { return nil } switch n.Op { - case OAS: + case OAS, OSELRECV: if n.Left == v.name && n != v.name.Name.Defn { return n } - case OAS2, OAS2FUNC, OAS2MAPR, OAS2DOTTYPE: + case OAS2, OAS2FUNC, OAS2MAPR, OAS2DOTTYPE, OAS2RECV: for _, p := range n.List.Slice() { if p == v.name && n != v.name.Name.Defn { return n } } + case OSELRECV2: + if (n.Left == v.name || n.List.First() == v.name) && n != v.name.Name.Defn { + return n + } } if a := v.visit(n.Left); a != nil { return a diff --git a/test/fixedbugs/issue43292.go b/test/fixedbugs/issue43292.go new file mode 100644 index 0000000000..02f1c69bd1 --- /dev/null +++ b/test/fixedbugs/issue43292.go @@ -0,0 +1,59 @@ +// run + +// 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 main + +func main() { + { + i := I(A{}) + + b := make(chan I, 1) + b <- B{} + + var ok bool + i, ok = <-b + _ = ok + + i.M() + } + + { + i := I(A{}) + + b := make(chan I, 1) + b <- B{} + + select { + case i = <-b: + } + + i.M() + } + + { + i := I(A{}) + + b := make(chan I, 1) + b <- B{} + + var ok bool + select { + case i, ok = <-b: + } + _ = ok + + i.M() + } +} + +type I interface{ M() int } + +type T int + +func (T) M() int { return 0 } + +type A struct{ T } +type B struct{ T } -- GitLab From 9abbe277105f9b9a3b4c5905e7faf9a02827ce18 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 19 Dec 2020 13:46:49 -0800 Subject: [PATCH 1555/1792] test: skip issue11656.go on mips/mips64/ppc64 For #11656 For #43283 Change-Id: I1fcf2b24800f421e36201af43130b487abe605b1 Reviewed-on: https://go-review.googlesource.com/c/go/+/279312 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Run-TryBot: Emmanuel Odeke Reviewed-by: Emmanuel Odeke --- test/fixedbugs/issue11656.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/fixedbugs/issue11656.go b/test/fixedbugs/issue11656.go index 62b36cf790..5018263364 100644 --- a/test/fixedbugs/issue11656.go +++ b/test/fixedbugs/issue11656.go @@ -27,6 +27,13 @@ import ( ) func main() { + // This test is currently failing on some architectures. + // See issue #43283. + switch runtime.GOARCH { + case "ppc64", "mips", "mipsle", "mips64", "mips64le": + return + } + debug.SetPanicOnFault(true) defer func() { if err := recover(); err == nil { -- GitLab From 53c984d976f49b5671b11ff17f5d622572d4cf58 Mon Sep 17 00:00:00 2001 From: Richard Miller Date: Sat, 5 Dec 2020 19:53:08 +0000 Subject: [PATCH 1556/1792] runtime: skip wakep call in wakeNetPoller on Plan 9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This was part of a performance improvement made by CL 232298 to reduce timer latency. On multiprocessor Plan 9 machines, it triggers memory faults often enough that the builder test suite never completes successfully. See issue #42303 for discussion. As shown by the benchmark result below, worst case latency on plan9_arm is very bad even with the wakep call in place - in the tickers-per-P=1 case, a 3ms timer is 270ms late. Skipping the wakep call and running the benchmark again shows some cases worse, some better. The performance cost doesn't seem excessive for this temporary workaround which makes the plan9_arm builders usable again. With wakep call: cpu% go test -bench Latency time goos: plan9 goarch: arm pkg: time BenchmarkParallelTimerLatency-4 100 10985859 avg-late-ns 18630963 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=1-4 195 270294688 avg-late-ns 542057670 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=2-4 234 182452000 avg-late-ns 423933688 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=3-4 280 193003004 avg-late-ns 408034405 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=4-4 282 132819086 avg-late-ns 313624570 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=5-4 339 71152187 avg-late-ns 189014519 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=6-4 315 26860484 avg-late-ns 101759844 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=7-4 357 19106739 avg-late-ns 59435620 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=8-4 376 7246933 avg-late-ns 38888461 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=9-4 267 40476892 avg-late-ns 205851926 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=10-4 294 87836303 avg-late-ns 252059695 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=2ms/tickers-per-P=1-4 379 4127144 avg-late-ns 10494927 max-late-ns Without wakep call: BenchmarkParallelTimerLatency-4 61 10775151 avg-late-ns 18668517 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=1-4 199 299587535 avg-late-ns 597182307 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=2-4 272 184561831 avg-late-ns 449739837 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=3-4 235 154983257 avg-late-ns 370940553 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=4-4 290 150034689 avg-late-ns 332399843 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=5-4 298 47540764 avg-late-ns 133709031 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=6-4 350 20379394 avg-late-ns 81742809 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=7-4 363 14403223 avg-late-ns 98901212 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=8-4 375 12293090 avg-late-ns 50266552 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=9-4 336 40628820 avg-late-ns 150946099 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=300µs/tickers-per-P=10-4 289 88265539 avg-late-ns 280770418 max-late-ns BenchmarkStaggeredTickerLatency/work-dur=2ms/tickers-per-P=1-4 375 8364937 avg-late-ns 22598421 max-late-ns Fixes #42303 Change-Id: I70c63cb2a2bad46950a7cd9dfc7bb32943710d32 Reviewed-on: https://go-review.googlesource.com/c/go/+/275672 Reviewed-by: David du Colombier <0intro@gmail.com> Trust: Michael Pratt --- src/runtime/proc.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 64e102fb0a..418e06932e 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -2882,7 +2882,9 @@ func wakeNetPoller(when int64) { } else { // There are no threads in the network poller, try to get // one there so it can handle new timers. - wakep() + if GOOS != "plan9" { // Temporary workaround - see issue #42303. + wakep() + } } } -- GitLab From cb95819cf6e969dc7dcc64ec7820d3995379c9f4 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Fri, 11 Dec 2020 14:14:30 -0500 Subject: [PATCH 1557/1792] runtime: detect netbsd netpoll overrun in sysmon The netbsd kernel has a bug [1] that occassionally prevents netpoll from waking with netpollBreak, which could result in missing timers for an unbounded amount of time, as netpoll can't restart with a shorter delay when an earlier timer is added. Prior to CL 232298, sysmon could detect these overrun timers and manually start an M to run them. With this fallback gone, the bug actually prevents timer execution indefinitely. As a workaround, we add back sysmon detection only for netbsd. [1] https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=50094 Updates #42515 Change-Id: I8391f5b9dabef03dd1d94c50b3b4b3bd4f889e66 Reviewed-on: https://go-review.googlesource.com/c/go/+/277332 Run-TryBot: Michael Pratt TryBot-Result: Go Bot Reviewed-by: Michael Knyszek Reviewed-by: Austin Clements Trust: Michael Pratt --- src/runtime/proc.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 418e06932e..5adcbf07dc 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -5130,6 +5130,26 @@ func sysmon() { } } mDoFixup() + if GOOS == "netbsd" { + // netpoll is responsible for waiting for timer + // expiration, so we typically don't have to worry + // about starting an M to service timers. (Note that + // sleep for timeSleepUntil above simply ensures sysmon + // starts running again when that timer expiration may + // cause Go code to run again). + // + // However, netbsd has a kernel bug that sometimes + // misses netpollBreak wake-ups, which can lead to + // unbounded delays servicing timers. If we detect this + // overrun, then startm to get something to handle the + // timer. + // + // See issue 42515 and + // https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=50094. + if next, _ := timeSleepUntil(); next < now { + startm(nil, false) + } + } if atomic.Load(&scavenge.sysmonWake) != 0 { // Kick the scavenger awake if someone requested it. wakeScavenger() -- GitLab From 8438a5779b76620237d608282a99d17467b91f4c Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 11 Nov 2020 21:27:56 -0500 Subject: [PATCH 1558/1792] runtime: use _exit on darwin On darwin, where we use libc for syscalls, when the runtime exits, it calls libc exit function, which may call back into user code, e.g. invoking functions registered with atexit. In particular, it may call back into Go. But at this point, the Go runtime is already exiting, so this wouldn't work. On non-libc platforms we use exit syscall directly, which doesn't invoke any callbacks. Use _exit on darwin to achieve the same behavior. No test for now, as it doesn't pass on all platforms (see trybot run of PS2). May fix #42465. May fix #43294. Change-Id: Ia1ada22b5da8cb64fdd598d0541eb90e195367eb Reviewed-on: https://go-review.googlesource.com/c/go/+/269378 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- src/runtime/sys_darwin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go index c89ce78012..55845bf2e5 100644 --- a/src/runtime/sys_darwin.go +++ b/src/runtime/sys_darwin.go @@ -467,7 +467,7 @@ func setNonblock(fd int32) { //go:cgo_import_dynamic libc_pthread_create pthread_create "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_pthread_self pthread_self "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_pthread_kill pthread_kill "/usr/lib/libSystem.B.dylib" -//go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_exit _exit "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_raise raise "/usr/lib/libSystem.B.dylib" //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" -- GitLab From 6cff874c47bdb4567f5c84bc59d93311493caefe Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Mon, 7 Dec 2020 15:11:46 +0000 Subject: [PATCH 1559/1792] runtime/metrics: add Read examples This change adds two examples of using the Read function: one that reads one metric and one that reads all metrics. Change-Id: I4940a44c9b1d65f3f7a1554e3145ff07e6492fc1 Reviewed-on: https://go-review.googlesource.com/c/go/+/275855 Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Reviewed-by: Michael Pratt Trust: Michael Knyszek --- src/runtime/metrics/example_test.go | 96 +++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/runtime/metrics/example_test.go diff --git a/src/runtime/metrics/example_test.go b/src/runtime/metrics/example_test.go new file mode 100644 index 0000000000..cade0c38bf --- /dev/null +++ b/src/runtime/metrics/example_test.go @@ -0,0 +1,96 @@ +// 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 metrics_test + +import ( + "fmt" + "runtime/metrics" +) + +func ExampleRead_readingOneMetric() { + // Name of the metric we want to read. + const myMetric = "/memory/classes/heap/free:bytes" + + // Create a sample for the metric. + sample := make([]metrics.Sample, 1) + sample[0].Name = myMetric + + // Sample the metric. + metrics.Read(sample) + + // Check if the metric is actually supported. + // If it's not, the resulting value will always have + // kind KindBad. + if sample[0].Value.Kind() == metrics.KindBad { + panic(fmt.Sprintf("metric %q no longer supported", myMetric)) + } + + // Handle the result. + // + // It's OK to assume a particular Kind for a metric; + // they're guaranteed not to change. + freeBytes := sample[0].Value.Uint64() + + fmt.Printf("free but not released memory: %d\n", freeBytes) +} + +func ExampleRead_readingAllMetrics() { + // Get descriptions for all supported metrics. + descs := metrics.All() + + // Create a sample for each metric. + samples := make([]metrics.Sample, len(descs)) + for i := range samples { + samples[i].Name = descs[i].Name + } + + // Sample the metrics. Re-use the samples slice if you can! + metrics.Read(samples) + + // Iterate over all results. + for _, sample := range samples { + // Pull out the name and value. + name, value := sample.Name, sample.Value + + // Handle each sample. + switch value.Kind() { + case metrics.KindUint64: + fmt.Printf("%s: %d\n", name, value.Uint64()) + case metrics.KindFloat64: + fmt.Printf("%s: %f\n", name, value.Float64()) + case metrics.KindFloat64Histogram: + // The histogram may be quite large, so let's just pull out + // a crude estimate for the median for the sake of this example. + fmt.Printf("%s: %f\n", name, medianBucket(value.Float64Histogram())) + case metrics.KindBad: + // This should never happen because all metrics are supported + // by construction. + panic("bug in runtime/metrics package!") + default: + // This may happen as new metrics get added. + // + // The safest thing to do here is to simply log it somewhere + // as something to look into, but ignore it for now. + // In the worst case, you might temporarily miss out on a new metric. + fmt.Printf("%s: unexpected metric Kind: %v\n", name, value.Kind()) + } + } +} + +func medianBucket(h *metrics.Float64Histogram) float64 { + total := uint64(0) + for _, count := range h.Counts { + total += count + } + thresh := total / 2 + total = 0 + for i, count := range h.Counts { + total += count + if total > thresh { + return h.Buckets[i] + } + } + panic("should not happen") +} -- GitLab From bc7e4d9257693413d57ad467814ab71f1585a155 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 21 Dec 2020 13:14:41 -0500 Subject: [PATCH 1560/1792] syscall: don't generate ptrace on iOS May fix #43302. Change-Id: I6b7ddf94495c4fa80cf8a50a38eef5f8b2872669 Reviewed-on: https://go-review.googlesource.com/c/go/+/279481 Trust: Cherry Zhang Reviewed-by: Ian Lance Taylor --- src/syscall/mksyscall.pl | 2 +- src/syscall/ptrace_darwin.go | 14 ++++++++++++++ src/syscall/ptrace_ios.go | 12 ++++++++++++ src/syscall/syscall_darwin_amd64.go | 2 +- src/syscall/syscall_darwin_arm64.go | 2 +- src/syscall/zsyscall_darwin_amd64.go | 2 +- src/syscall/zsyscall_darwin_arm64.go | 2 +- 7 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 src/syscall/ptrace_darwin.go create mode 100644 src/syscall/ptrace_ios.go diff --git a/src/syscall/mksyscall.pl b/src/syscall/mksyscall.pl index 25b40d7ba2..7e2cedfb6c 100755 --- a/src/syscall/mksyscall.pl +++ b/src/syscall/mksyscall.pl @@ -125,7 +125,7 @@ while(<>) { # without reading the header. $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; - if ($darwin && $func eq "ptrace") { + if ($darwin && $func eq "ptrace1") { # The ptrace function is called from forkAndExecInChild where stack # growth is forbidden. $text .= "//go:nosplit\n" diff --git a/src/syscall/ptrace_darwin.go b/src/syscall/ptrace_darwin.go new file mode 100644 index 0000000000..a873d826b8 --- /dev/null +++ b/src/syscall/ptrace_darwin.go @@ -0,0 +1,14 @@ +// 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 !ios + +package syscall + +// 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) +} diff --git a/src/syscall/ptrace_ios.go b/src/syscall/ptrace_ios.go new file mode 100644 index 0000000000..2f61a88a08 --- /dev/null +++ b/src/syscall/ptrace_ios.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. + +package syscall + +// Nosplit because it is called from forkAndExecInChild. +// +//go:nosplit +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + panic("unimplemented") +} diff --git a/src/syscall/syscall_darwin_amd64.go b/src/syscall/syscall_darwin_amd64.go index 23a4e5f996..22ddb78ae5 100644 --- a/src/syscall/syscall_darwin_amd64.go +++ b/src/syscall/syscall_darwin_amd64.go @@ -21,7 +21,7 @@ func setTimeval(sec, usec int64) Timeval { //sys Stat(path string, stat *Stat_t) (err error) = SYS_stat64 //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 ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +//sys ptrace1(request int, pid int, addr uintptr, 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 c824f6d89d..ecb9ffff49 100644 --- a/src/syscall/syscall_darwin_arm64.go +++ b/src/syscall/syscall_darwin_arm64.go @@ -21,7 +21,7 @@ func setTimeval(sec, usec int64) Timeval { //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) //sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error) -//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +//sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint64(fd) diff --git a/src/syscall/zsyscall_darwin_amd64.go b/src/syscall/zsyscall_darwin_amd64.go index 093739ebc7..c246c3a267 100644 --- a/src/syscall/zsyscall_darwin_amd64.go +++ b/src/syscall/zsyscall_darwin_amd64.go @@ -2091,7 +2091,7 @@ func libc_fstatat64_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT //go:nosplit -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { +func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) diff --git a/src/syscall/zsyscall_darwin_arm64.go b/src/syscall/zsyscall_darwin_arm64.go index 7698b2503e..ede0091de2 100644 --- a/src/syscall/zsyscall_darwin_arm64.go +++ b/src/syscall/zsyscall_darwin_arm64.go @@ -2091,7 +2091,7 @@ func libc_fstatat_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT //go:nosplit -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { +func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) -- GitLab From 9b6147120a30a8bc30a41c1651f369e8bcb80948 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 21 Dec 2020 14:11:02 -0500 Subject: [PATCH 1561/1792] cmd/pack: treat compiler's -linkobj output as "compiler object" Treat the compiler's -linkobj output as "compiler object, which means "pack c" will "see through" the file and add individual entry to the new archive, instead of the object as a whole. This is somewhat peculiar. But Go 1.15's cmd/pack does this, although seemingly accidental. We just do the same. FWIW, it does make things more consistent with/without -linkobj flag. Fixes #43271. Change-Id: I6b2d99256db7ebf0fa430f85afa7464e334f6bcb Reviewed-on: https://go-review.googlesource.com/c/go/+/279483 Trust: Cherry Zhang Run-TryBot: Cherry Zhang Reviewed-by: Jeremy Faller Reviewed-by: Than McIntosh --- src/cmd/pack/pack.go | 31 ++++++++++-------- src/cmd/pack/pack_test.go | 66 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 13 deletions(-) diff --git a/src/cmd/pack/pack.go b/src/cmd/pack/pack.go index 82546ea7dc..3dffabe5ec 100644 --- a/src/cmd/pack/pack.go +++ b/src/cmd/pack/pack.go @@ -315,20 +315,25 @@ func (ar *Archive) extractContents1(e *archive.Entry, out io.Writer) { } // isGoCompilerObjFile reports whether file is an object file created -// by the Go compiler, which is an archive file with exactly two entries: -// __.PKGDEF and _go_.o. +// by the Go compiler, which is an archive file with exactly one entry +// of __.PKGDEF, or _go_.o, or both entries. func isGoCompilerObjFile(a *archive.Archive) bool { - if len(a.Entries) != 2 { - return false - } - var foundPkgDef, foundGo bool - for _, e := range a.Entries { - if e.Type == archive.EntryPkgDef && e.Name == "__.PKGDEF" { - foundPkgDef = true - } - if e.Type == archive.EntryGoObj && e.Name == "_go_.o" { - foundGo = true + switch len(a.Entries) { + case 1: + return (a.Entries[0].Type == archive.EntryGoObj && a.Entries[0].Name == "_go_.o") || + (a.Entries[0].Type == archive.EntryPkgDef && a.Entries[0].Name == "__.PKGDEF") + case 2: + var foundPkgDef, foundGo bool + for _, e := range a.Entries { + if e.Type == archive.EntryPkgDef && e.Name == "__.PKGDEF" { + foundPkgDef = true + } + if e.Type == archive.EntryGoObj && e.Name == "_go_.o" { + foundGo = true + } } + return foundPkgDef && foundGo + default: + return false } - return foundPkgDef && foundGo } diff --git a/src/cmd/pack/pack_test.go b/src/cmd/pack/pack_test.go index 218c7acda6..16a5135800 100644 --- a/src/cmd/pack/pack_test.go +++ b/src/cmd/pack/pack_test.go @@ -302,6 +302,72 @@ func TestIssue21703(t *testing.T) { run(goBin, "tool", "compile", "-I", ".", "b.go") } +// Test the "c" command can "see through" the archive generated by the compiler. +// This is peculiar. (See issue ) +func TestCreateWithCompilerObj(t *testing.T) { + testenv.MustHaveGoBuild(t) + + dir := tmpDir(t) + defer os.RemoveAll(dir) + src := filepath.Join(dir, "p.go") + prog := "package p; var X = 42\n" + err := os.WriteFile(src, []byte(prog), 0666) + if err != nil { + t.Fatal(err) + } + + run := func(args ...string) string { + return doRun(t, dir, args...) + } + + goBin := testenv.GoToolPath(t) + run(goBin, "build", "cmd/pack") // writes pack binary to dir + run(goBin, "tool", "compile", "-pack", "-o", "p.a", "p.go") + run("./pack", "c", "packed.a", "p.a") + fi, err := os.Stat(filepath.Join(dir, "p.a")) + if err != nil { + t.Fatalf("stat p.a failed: %v", err) + } + fi2, err := os.Stat(filepath.Join(dir, "packed.a")) + if err != nil { + t.Fatalf("stat packed.a failed: %v", err) + } + // For compiler-generated object file, the "c" command is + // expected to get (essentially) the same file back, instead + // of packing it into a new archive with a single entry. + if want, got := fi.Size(), fi2.Size(); want != got { + t.Errorf("packed file with different size: want %d, got %d", want, got) + } + + // Test -linkobj flag as well. + run(goBin, "tool", "compile", "-linkobj", "p2.a", "-o", "p.x", "p.go") + run("./pack", "c", "packed2.a", "p2.a") + fi, err = os.Stat(filepath.Join(dir, "p2.a")) + if err != nil { + t.Fatalf("stat p2.a failed: %v", err) + } + fi2, err = os.Stat(filepath.Join(dir, "packed2.a")) + if err != nil { + t.Fatalf("stat packed2.a failed: %v", err) + } + if want, got := fi.Size(), fi2.Size(); want != got { + t.Errorf("packed file with different size: want %d, got %d", want, got) + } + + run("./pack", "c", "packed3.a", "p.x") + fi, err = os.Stat(filepath.Join(dir, "p.x")) + if err != nil { + t.Fatalf("stat p.x failed: %v", err) + } + fi2, err = os.Stat(filepath.Join(dir, "packed3.a")) + if err != nil { + t.Fatalf("stat packed3.a failed: %v", err) + } + if want, got := fi.Size(), fi2.Size(); want != got { + t.Errorf("packed file with different size: want %d, got %d", want, got) + } +} + // doRun runs a program in a directory and returns the output. func doRun(t *testing.T, dir string, args ...string) string { cmd := exec.Command(args[0], args[1:]...) -- GitLab From 4d27c4c223ccb7de3876abbac79b58ad9579be1a Mon Sep 17 00:00:00 2001 From: Nikhil Benesch Date: Wed, 9 Dec 2020 15:14:59 -0500 Subject: [PATCH 1562/1792] runtime: correct error handling in several FreeBSD syscall wrappers The FreeBSD syscall convention uses the carry flag to indicate whether an error has occured. The sys_umtx_op, thr_new, and pipe2 syscall wrappers were failing to account for this convention and silently suppressing errors as a result. This commit corrects these wrappers by copying the pattern used by the other fallible syscall wrappers. Note that futexsleep1 must now explicitly ignore the ETIMEDOUT error from sys_umtx_op. Previously ETIMEDOUT was implicitly ignored because sys_umtx_op never returned an error. Fixes #43106. Change-Id: I9c422b87cf4c6d308003bf42c3b419f785578b5d Reviewed-on: https://go-review.googlesource.com/c/go/+/276892 Run-TryBot: Ian Lance Taylor Reviewed-by: Austin Clements Trust: Than McIntosh --- src/runtime/defs_freebsd_386.go | 9 +++++---- src/runtime/defs_freebsd_amd64.go | 9 +++++---- src/runtime/defs_freebsd_arm.go | 9 +++++---- src/runtime/defs_freebsd_arm64.go | 9 +++++---- src/runtime/os_freebsd.go | 3 +-- src/runtime/sys_freebsd_386.s | 6 ++++++ src/runtime/sys_freebsd_amd64.s | 6 ++++++ src/runtime/sys_freebsd_arm.s | 3 +++ src/runtime/sys_freebsd_arm64.s | 6 ++++++ 9 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/runtime/defs_freebsd_386.go b/src/runtime/defs_freebsd_386.go index 767755425c..f822934d58 100644 --- a/src/runtime/defs_freebsd_386.go +++ b/src/runtime/defs_freebsd_386.go @@ -13,10 +13,11 @@ const ( ) const ( - _EINTR = 0x4 - _EFAULT = 0xe - _EAGAIN = 0x23 - _ENOSYS = 0x4e + _EINTR = 0x4 + _EFAULT = 0xe + _EAGAIN = 0x23 + _ENOSYS = 0x4e + _ETIMEDOUT = 0x3c _O_NONBLOCK = 0x4 _O_CLOEXEC = 0x100000 diff --git a/src/runtime/defs_freebsd_amd64.go b/src/runtime/defs_freebsd_amd64.go index 5a833426fd..0b696cf227 100644 --- a/src/runtime/defs_freebsd_amd64.go +++ b/src/runtime/defs_freebsd_amd64.go @@ -13,10 +13,11 @@ const ( ) const ( - _EINTR = 0x4 - _EFAULT = 0xe - _EAGAIN = 0x23 - _ENOSYS = 0x4e + _EINTR = 0x4 + _EFAULT = 0xe + _EAGAIN = 0x23 + _ENOSYS = 0x4e + _ETIMEDOUT = 0x3c _O_NONBLOCK = 0x4 _O_CLOEXEC = 0x100000 diff --git a/src/runtime/defs_freebsd_arm.go b/src/runtime/defs_freebsd_arm.go index b55dfd88cf..b6f3e790cf 100644 --- a/src/runtime/defs_freebsd_arm.go +++ b/src/runtime/defs_freebsd_arm.go @@ -13,10 +13,11 @@ const ( ) const ( - _EINTR = 0x4 - _EFAULT = 0xe - _EAGAIN = 0x23 - _ENOSYS = 0x4e + _EINTR = 0x4 + _EFAULT = 0xe + _EAGAIN = 0x23 + _ENOSYS = 0x4e + _ETIMEDOUT = 0x3c _O_NONBLOCK = 0x4 _O_CLOEXEC = 0x100000 diff --git a/src/runtime/defs_freebsd_arm64.go b/src/runtime/defs_freebsd_arm64.go index 5b9d504ba6..0759a1238f 100644 --- a/src/runtime/defs_freebsd_arm64.go +++ b/src/runtime/defs_freebsd_arm64.go @@ -13,10 +13,11 @@ const ( ) const ( - _EINTR = 0x4 - _EFAULT = 0xe - _EAGAIN = 0x23 - _ENOSYS = 0x4e + _EINTR = 0x4 + _EFAULT = 0xe + _EAGAIN = 0x23 + _ENOSYS = 0x4e + _ETIMEDOUT = 0x3c _O_NONBLOCK = 0x4 _O_CLOEXEC = 0x100000 diff --git a/src/runtime/os_freebsd.go b/src/runtime/os_freebsd.go index 730973a202..1c60ee2a57 100644 --- a/src/runtime/os_freebsd.go +++ b/src/runtime/os_freebsd.go @@ -166,7 +166,7 @@ func futexsleep1(addr *uint32, val uint32, ns int64) { utp = &ut } ret := sys_umtx_op(addr, _UMTX_OP_WAIT_UINT_PRIVATE, val, unsafe.Sizeof(*utp), utp) - if ret >= 0 || ret == -_EINTR { + if ret >= 0 || ret == -_EINTR || ret == -_ETIMEDOUT { return } print("umtx_wait addr=", addr, " val=", val, " ret=", ret, "\n") @@ -208,7 +208,6 @@ func newosproc(mp *m) { var oset sigset sigprocmask(_SIG_SETMASK, &sigset_all, &oset) - // TODO: Check for error. ret := thr_new(¶m, int32(unsafe.Sizeof(param))) sigprocmask(_SIG_SETMASK, &oset, nil) if ret < 0 { diff --git a/src/runtime/sys_freebsd_386.s b/src/runtime/sys_freebsd_386.s index c346e719e1..97e6d9ab36 100644 --- a/src/runtime/sys_freebsd_386.s +++ b/src/runtime/sys_freebsd_386.s @@ -13,12 +13,16 @@ TEXT runtime·sys_umtx_op(SB),NOSPLIT,$-4 MOVL $454, AX INT $0x80 + JAE 2(PC) + NEGL AX MOVL AX, ret+20(FP) RET TEXT runtime·thr_new(SB),NOSPLIT,$-4 MOVL $455, AX INT $0x80 + JAE 2(PC) + NEGL AX MOVL AX, ret+8(FP) RET @@ -120,6 +124,8 @@ TEXT runtime·pipe2(SB),NOSPLIT,$12-16 MOVL flags+0(FP), BX MOVL BX, 8(SP) INT $0x80 + JAE 2(PC) + NEGL AX MOVL AX, errno+12(FP) RET diff --git a/src/runtime/sys_freebsd_amd64.s b/src/runtime/sys_freebsd_amd64.s index 010b2ec4d4..07734b0d7d 100644 --- a/src/runtime/sys_freebsd_amd64.s +++ b/src/runtime/sys_freebsd_amd64.s @@ -18,6 +18,8 @@ TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0 MOVQ ut+24(FP), R8 MOVL $454, AX SYSCALL + JCC 2(PC) + NEGQ AX MOVL AX, ret+32(FP) RET @@ -26,6 +28,8 @@ TEXT runtime·thr_new(SB),NOSPLIT,$0 MOVL size+8(FP), SI MOVL $455, AX SYSCALL + JCC 2(PC) + NEGQ AX MOVL AX, ret+16(FP) RET @@ -118,6 +122,8 @@ TEXT runtime·pipe2(SB),NOSPLIT,$0-20 MOVL flags+0(FP), SI MOVL $542, AX SYSCALL + JCC 2(PC) + NEGQ AX MOVL AX, errno+16(FP) RET diff --git a/src/runtime/sys_freebsd_arm.s b/src/runtime/sys_freebsd_arm.s index 1e12f9cfcb..b12e47c576 100644 --- a/src/runtime/sys_freebsd_arm.s +++ b/src/runtime/sys_freebsd_arm.s @@ -51,6 +51,7 @@ TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0 ADD $20, R13 // arg 5 is passed on stack MOVW $SYS__umtx_op, R7 SWI $0 + RSB.CS $0, R0 SUB $20, R13 // BCS error MOVW R0, ret+20(FP) @@ -61,6 +62,7 @@ TEXT runtime·thr_new(SB),NOSPLIT,$0 MOVW size+4(FP), R1 MOVW $SYS_thr_new, R7 SWI $0 + RSB.CS $0, R0 MOVW R0, ret+8(FP) RET @@ -144,6 +146,7 @@ TEXT runtime·pipe2(SB),NOSPLIT,$0-16 MOVW flags+0(FP), R1 MOVW $SYS_pipe2, R7 SWI $0 + RSB.CS $0, R0 MOVW R0, errno+12(FP) RET diff --git a/src/runtime/sys_freebsd_arm64.s b/src/runtime/sys_freebsd_arm64.s index 8a4f9b7fa1..1aa09e87ca 100644 --- a/src/runtime/sys_freebsd_arm64.s +++ b/src/runtime/sys_freebsd_arm64.s @@ -60,6 +60,9 @@ TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0 MOVD ut+24(FP), R4 MOVD $SYS__umtx_op, R8 SVC + BCC ok + NEG R0, R0 +ok: MOVW R0, ret+32(FP) RET @@ -69,6 +72,9 @@ TEXT runtime·thr_new(SB),NOSPLIT,$0 MOVW size+8(FP), R1 MOVD $SYS_thr_new, R8 SVC + BCC ok + NEG R0, R0 +ok: MOVW R0, ret+16(FP) RET -- GitLab From 0aa9b4709acd609c1a3e9cb028e7f4c4da3f0357 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 22 Dec 2020 12:40:32 -0500 Subject: [PATCH 1563/1792] cmd/pack: r command create output file if not exist Go 1.15 pack's r command creates the output file if it does not exist. The system "ar" command does this as well. Do the same. For bazelbuild/rules_go#2762. Change-Id: Icd88396b5c714b735c859a29ab29851e4301f4d2 Reviewed-on: https://go-review.googlesource.com/c/go/+/279516 Trust: Cherry Zhang Run-TryBot: Cherry Zhang Reviewed-by: Than McIntosh TryBot-Result: Go Bot --- src/cmd/pack/pack.go | 7 +++++-- src/cmd/pack/pack_test.go | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/cmd/pack/pack.go b/src/cmd/pack/pack.go index 3dffabe5ec..412ea36d60 100644 --- a/src/cmd/pack/pack.go +++ b/src/cmd/pack/pack.go @@ -43,7 +43,7 @@ func main() { ar = openArchive(os.Args[2], os.O_RDONLY, os.Args[3:]) ar.scan(ar.printContents) case 'r': - ar = openArchive(os.Args[2], os.O_RDWR, os.Args[3:]) + ar = openArchive(os.Args[2], os.O_RDWR|os.O_CREATE, os.Args[3:]) ar.addFiles() case 'c': ar = openArchive(os.Args[2], os.O_RDWR|os.O_TRUNC|os.O_CREATE, os.Args[3:]) @@ -124,10 +124,13 @@ func openArchive(name string, mode int, files []string) *Archive { log.Fatal(err) } var a *archive.Archive - if mode&os.O_CREATE != 0 { // the c command + if mode&os.O_TRUNC != 0 { // the c command a, err = archive.New(f) } else { a, err = archive.Parse(f, verbose) + if err != nil && mode&os.O_CREATE != 0 { // the r command + a, err = archive.New(f) + } } if err != nil { log.Fatal(err) diff --git a/src/cmd/pack/pack_test.go b/src/cmd/pack/pack_test.go index 16a5135800..118376f9df 100644 --- a/src/cmd/pack/pack_test.go +++ b/src/cmd/pack/pack_test.go @@ -303,7 +303,7 @@ func TestIssue21703(t *testing.T) { } // Test the "c" command can "see through" the archive generated by the compiler. -// This is peculiar. (See issue ) +// This is peculiar. (See issue #43271) func TestCreateWithCompilerObj(t *testing.T) { testenv.MustHaveGoBuild(t) @@ -368,6 +368,29 @@ func TestCreateWithCompilerObj(t *testing.T) { } } +// Test the "r" command creates the output file if it does not exist. +func TestRWithNonexistentFile(t *testing.T) { + testenv.MustHaveGoBuild(t) + + dir := tmpDir(t) + defer os.RemoveAll(dir) + src := filepath.Join(dir, "p.go") + prog := "package p; var X = 42\n" + err := os.WriteFile(src, []byte(prog), 0666) + if err != nil { + t.Fatal(err) + } + + run := func(args ...string) string { + return doRun(t, dir, args...) + } + + goBin := testenv.GoToolPath(t) + run(goBin, "build", "cmd/pack") // writes pack binary to dir + run(goBin, "tool", "compile", "-o", "p.o", "p.go") + run("./pack", "r", "p.a", "p.o") // should succeed +} + // doRun runs a program in a directory and returns the output. func doRun(t *testing.T, dir string, args ...string) string { cmd := exec.Command(args[0], args[1:]...) -- GitLab From c06a354bccf60ea32ed74238be409a00aac292c5 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 21 Dec 2020 18:41:16 -0500 Subject: [PATCH 1564/1792] test: trigger SIGSEGV instead of SIGTRAP in issue11656.go In issue11656.go, it tests that if the runtime can get a reasonable traceback when it faults at a non-function PC. It does it by jumping to an address that contains an illegal or trap instruction. When it traps, the SIGTRAP crashes the runtime. This CL changes it to use an instruction that triggers SIGSEGV. This is due to two reasons: - currently, the handling of bad PC is done by preparePanic, which is only used for a panicking signal (SIGSEGV, SIGBUS, SIGFPE), not a fatal signal (e.g. SIGTRAP). - the test uses defer+recover to get a traceback, which only works for panicking signals, not fatal signals. Ideally, we should handle all kinds of faults (SIGSEGV, SIGBUS, SIGILL, SIGTRAP, etc.) with a nice traceback. I'll leave this for the future. This CL also adds RISCV64 support. Fixes #43283. Change-Id: I5e0fbf8530cc89d16e05c3257d282bc1d4d03405 Reviewed-on: https://go-review.googlesource.com/c/go/+/279423 Trust: Cherry Zhang Reviewed-by: Ian Lance Taylor --- test/fixedbugs/issue11656.go | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/test/fixedbugs/issue11656.go b/test/fixedbugs/issue11656.go index 5018263364..acd3f4f3e5 100644 --- a/test/fixedbugs/issue11656.go +++ b/test/fixedbugs/issue11656.go @@ -27,13 +27,6 @@ import ( ) func main() { - // This test is currently failing on some architectures. - // See issue #43283. - switch runtime.GOARCH { - case "ppc64", "mips", "mipsle", "mips64", "mips64le": - return - } - debug.SetPanicOnFault(true) defer func() { if err := recover(); err == nil { @@ -61,27 +54,30 @@ func f(n int) { x uintptr } - // We want to force an illegal instruction, to get a crash - // at a PC value != 0. + // We want to force a seg fault, to get a crash at a PC value != 0. // Not all systems make the data section non-executable. ill := make([]byte, 64) switch runtime.GOARCH { case "386", "amd64": - binary.LittleEndian.PutUint16(ill, 0x0b0f) // ud2 + ill = append(ill, 0x89, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00) // MOVL AX, 0 case "arm": - binary.LittleEndian.PutUint32(ill, 0xe7f000f0) // no name, but permanently undefined + binary.LittleEndian.PutUint32(ill, 0xe3a00000) // MOVW $0, R0 + binary.LittleEndian.PutUint32(ill, 0xe5800000) // MOVW R0, (R0) case "arm64": - binary.LittleEndian.PutUint32(ill, 0xd4207d00) // brk #1000 + binary.LittleEndian.PutUint32(ill, 0xf90003ff) // MOVD ZR, (ZR) case "ppc64": - binary.BigEndian.PutUint32(ill, 0x7fe00008) // trap + binary.BigEndian.PutUint32(ill, 0xf8000000) // MOVD R0, (R0) case "ppc64le": - binary.LittleEndian.PutUint32(ill, 0x7fe00008) // trap + binary.LittleEndian.PutUint32(ill, 0xf8000000) // MOVD R0, (R0) case "mips", "mips64": - binary.BigEndian.PutUint32(ill, 0x00000034) // trap + binary.BigEndian.PutUint32(ill, 0xfc000000) // MOVV R0, (R0) case "mipsle", "mips64le": - binary.LittleEndian.PutUint32(ill, 0x00000034) // trap + binary.LittleEndian.PutUint32(ill, 0xfc000000) // MOVV R0, (R0) case "s390x": - binary.BigEndian.PutUint32(ill, 0) // undefined instruction + ill = append(ill, 0xa7, 0x09, 0x00, 0x00) // MOVD $0, R0 + ill = append(ill, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24) // MOVD R0, (R0) + case "riscv64": + binary.LittleEndian.PutUint32(ill, 0x00003023) // MOV X0, (X0) default: // Just leave it as 0 and hope for the best. } -- GitLab From c9fb4eb0a22131cc9922fa96afba01d4e21d4fd4 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sun, 8 Nov 2020 11:57:42 +0100 Subject: [PATCH 1565/1792] cmd/link: handle grouped resource sections The Go PE linker does not support enough generalized PE logic to properly handle .rsrc sections gracefully. Instead a few things are special cased for these. The linker also does not support PE's "grouped sections" features, in which input objects have several named sections that are sorted, merged, and renamed in the output file. In the past, more sophisticated support for resources or for PE features like grouped sections have not been necessary, as Go's own object formats are pretty vanilla, and GNU binutils also produces pretty vanilla objects where all sections are already merged. However, GNU binutils is lagging with arm support, and here LLVM has picked up the slack. In particular, LLVM has its own rc/cvtres combo, which are glued together in mingw LLVM distributions as windres, a command line compatible tool with binutils' windres, which supports arm and arm64. But there's a key difference between binutils' windres and LLVM's windres: the LLVM one uses proper grouped sections. So, this commit adds grouped sections support for resource sections to the linker. We don't attempt to plumb generic support for grouped sections, just as there isn't generic support already for what resources require. Instead we augment the resource handling logic to deal with standard two-section resource objects. We also add a test for this, akin to the current test for more vanilla binutils resource objects, and make sure that the rsrc tests are always performed. Fixes #42866. Fixes #43182. Change-Id: I059450021405cdf2ef1c195ddbab3960764ad711 Reviewed-on: https://go-review.googlesource.com/c/go/+/268337 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Cherry Zhang Trust: Alex Brainman Trust: Jason A. Donenfeld --- src/cmd/link/internal/ld/lib.go | 2 +- src/cmd/link/internal/ld/pe.go | 60 ++++++++++-------- src/cmd/link/internal/loadpe/ldpe.go | 49 +++++++------- src/cmd/link/link_test.go | 19 ++++++ .../link/testdata/testPErsrc-complex/main.go | 43 +++++++++++++ .../testdata/testPErsrc-complex/rsrc.syso | Bin 0 -> 352 bytes 6 files changed, 124 insertions(+), 49 deletions(-) create mode 100644 src/cmd/link/testdata/testPErsrc-complex/main.go create mode 100644 src/cmd/link/testdata/testPErsrc-complex/rsrc.syso diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 833b3eb9db..bf95745d8d 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1820,7 +1820,7 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, Errorf(nil, "%v", err) return } - if rsrc != 0 { + if len(rsrc) != 0 { setpersrc(ctxt, rsrc) } ctxt.Textp = append(ctxt.Textp, textp...) diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index adbf516d5c..5edaf54dd2 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -253,7 +253,7 @@ type Dll struct { } var ( - rsrcsym loader.Sym + rsrcsyms []loader.Sym PESECTHEADR int32 PEFILEHEADR int32 pe64 int @@ -1508,46 +1508,56 @@ func (ctxt *Link) dope() { initdynexport(ctxt) } -func setpersrc(ctxt *Link, sym loader.Sym) { - if rsrcsym != 0 { +func setpersrc(ctxt *Link, syms []loader.Sym) { + if len(rsrcsyms) != 0 { Errorf(nil, "too many .rsrc sections") } - - rsrcsym = sym + rsrcsyms = syms } func addpersrc(ctxt *Link) { - if rsrcsym == 0 { + if len(rsrcsyms) == 0 { return } - data := ctxt.loader.Data(rsrcsym) - size := len(data) - h := pefile.addSection(".rsrc", size, size) + var size int64 + for _, rsrcsym := range rsrcsyms { + size += ctxt.loader.SymSize(rsrcsym) + } + h := pefile.addSection(".rsrc", int(size), int(size)) h.characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA h.checkOffset(ctxt.Out.Offset()) - // relocation - relocs := ctxt.loader.Relocs(rsrcsym) - for i := 0; i < relocs.Count(); i++ { - r := relocs.At(i) - p := data[r.Off():] - val := uint32(int64(h.virtualAddress) + r.Add()) - - // 32-bit little-endian - p[0] = byte(val) - - p[1] = byte(val >> 8) - p[2] = byte(val >> 16) - p[3] = byte(val >> 24) + for _, rsrcsym := range rsrcsyms { + // A split resource happens when the actual resource data and its relocations are + // split across multiple sections, denoted by a $01 or $02 at the end of the .rsrc + // section name. + splitResources := strings.Contains(ctxt.loader.SymName(rsrcsym), ".rsrc$") + relocs := ctxt.loader.Relocs(rsrcsym) + data := ctxt.loader.Data(rsrcsym) + for ri := 0; ri < relocs.Count(); ri++ { + r := relocs.At(ri) + p := data[r.Off():] + val := uint32(int64(h.virtualAddress) + r.Add()) + if splitResources { + // If we're a split resource section, and that section has relocation + // symbols, then the data that it points to doesn't actually begin at + // the virtual address listed in this current section, but rather + // begins at the section immediately after this one. So, in order to + // calculate the proper virtual address of the data it's pointing to, + // we have to add the length of this section to the virtual address. + // This works because .rsrc sections are divided into two (but not more) + // of these sections. + val += uint32(len(data)) + } + binary.LittleEndian.PutUint32(p, val) + } + ctxt.Out.Write(data) } - - ctxt.Out.Write(data) h.pad(ctxt.Out, uint32(size)) // update data directory pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = h.virtualAddress - pefile.dataDirectory[pe.IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = h.virtualSize } diff --git a/src/cmd/link/internal/loadpe/ldpe.go b/src/cmd/link/internal/loadpe/ldpe.go index 1e6f978531..a5c025de8f 100644 --- a/src/cmd/link/internal/loadpe/ldpe.go +++ b/src/cmd/link/internal/loadpe/ldpe.go @@ -157,8 +157,9 @@ func makeUpdater(l *loader.Loader, bld *loader.SymbolBuilder, s loader.Sym) *loa // Load loads the PE file pn from input. // Symbols are written into syms, and a slice of the text symbols is returned. -// If an .rsrc section is found, its symbol is returned as rsrc. -func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Reader, pkg string, length int64, pn string) (textp []loader.Sym, rsrc loader.Sym, err error) { +// If an .rsrc section or set of .rsrc$xx sections is found, its symbols are +// returned as rsrc. +func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Reader, pkg string, length int64, pn string) (textp []loader.Sym, rsrc []loader.Sym, err error) { lookup := func(name string, version int) (*loader.SymbolBuilder, loader.Sym) { s := l.LookupOrCreateSym(name, version) sb := l.MakeSymbolUpdater(s) @@ -176,7 +177,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read // TODO: replace pe.NewFile with pe.Load (grep for "add Load function" in debug/pe for details) f, err := pe.NewFile(sr) if err != nil { - return nil, 0, err + return nil, nil, err } defer f.Close() @@ -211,21 +212,21 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read bld.SetType(sym.STEXT) default: - return nil, 0, fmt.Errorf("unexpected flags %#06x for PE section %s", sect.Characteristics, sect.Name) + return nil, nil, fmt.Errorf("unexpected flags %#06x for PE section %s", sect.Characteristics, sect.Name) } if bld.Type() != sym.SNOPTRBSS { data, err := sect.Data() if err != nil { - return nil, 0, err + return nil, nil, err } sectdata[sect] = data bld.SetData(data) } bld.SetSize(int64(sect.Size)) sectsyms[sect] = s - if sect.Name == ".rsrc" { - rsrc = s + if sect.Name == ".rsrc" || strings.HasPrefix(sect.Name, ".rsrc$") { + rsrc = append(rsrc, s) } } @@ -246,22 +247,23 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read continue } + splitResources := strings.HasPrefix(rsect.Name, ".rsrc$") sb := l.MakeSymbolUpdater(sectsyms[rsect]) for j, r := range rsect.Relocs { if int(r.SymbolTableIndex) >= len(f.COFFSymbols) { - return nil, 0, fmt.Errorf("relocation number %d symbol index idx=%d cannot be large then number of symbols %d", j, r.SymbolTableIndex, len(f.COFFSymbols)) + return nil, nil, fmt.Errorf("relocation number %d symbol index idx=%d cannot be large then number of symbols %d", j, r.SymbolTableIndex, len(f.COFFSymbols)) } pesym := &f.COFFSymbols[r.SymbolTableIndex] _, gosym, err := readpesym(l, arch, l.LookupOrCreateSym, f, pesym, sectsyms, localSymVersion) if err != nil { - return nil, 0, err + return nil, nil, err } if gosym == 0 { name, err := pesym.FullName(f.StringTable) if err != nil { name = string(pesym.Name[:]) } - return nil, 0, fmt.Errorf("reloc of invalid sym %s idx=%d type=%d", name, r.SymbolTableIndex, pesym.Type) + return nil, nil, fmt.Errorf("reloc of invalid sym %s idx=%d type=%d", name, r.SymbolTableIndex, pesym.Type) } rSym := gosym @@ -271,11 +273,11 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read var rType objabi.RelocType switch arch.Family { default: - return nil, 0, fmt.Errorf("%s: unsupported arch %v", pn, arch.Family) + return nil, nil, fmt.Errorf("%s: unsupported arch %v", pn, arch.Family) case sys.I386, sys.AMD64: switch r.Type { default: - return nil, 0, fmt.Errorf("%s: %v: unknown relocation type %v", pn, sectsyms[rsect], r.Type) + return nil, nil, fmt.Errorf("%s: %v: unknown relocation type %v", pn, sectsyms[rsect], r.Type) case IMAGE_REL_I386_REL32, IMAGE_REL_AMD64_REL32, IMAGE_REL_AMD64_ADDR32, // R_X86_64_PC32 @@ -302,7 +304,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read case sys.ARM: switch r.Type { default: - return nil, 0, fmt.Errorf("%s: %v: unknown ARM relocation type %v", pn, sectsyms[rsect], r.Type) + return nil, nil, fmt.Errorf("%s: %v: unknown ARM relocation type %v", pn, sectsyms[rsect], r.Type) case IMAGE_REL_ARM_SECREL: rType = objabi.R_PCREL @@ -323,8 +325,9 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read // ld -r could generate multiple section symbols for the // same section but with different values, we have to take - // that into account - if issect(pesym) { + // that into account, or in the case of split resources, + // the section and its symbols are split into two sections. + if issect(pesym) || splitResources { rAdd += int64(pesym.Value) } @@ -346,7 +349,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read name, err := pesym.FullName(f.StringTable) if err != nil { - return nil, 0, err + return nil, nil, err } if name == "" { continue @@ -384,7 +387,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read bld, s, err := readpesym(l, arch, l.LookupOrCreateSym, f, pesym, sectsyms, localSymVersion) if err != nil { - return nil, 0, err + return nil, nil, err } if pesym.SectionNumber == 0 { // extern @@ -402,14 +405,14 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read } else if pesym.SectionNumber > 0 && int(pesym.SectionNumber) <= len(f.Sections) { sect = f.Sections[pesym.SectionNumber-1] if _, found := sectsyms[sect]; !found { - return nil, 0, fmt.Errorf("%s: %v: missing sect.sym", pn, s) + return nil, nil, fmt.Errorf("%s: %v: missing sect.sym", pn, s) } } else { - return nil, 0, fmt.Errorf("%s: %v: sectnum < 0!", pn, s) + return nil, nil, fmt.Errorf("%s: %v: sectnum < 0!", pn, s) } if sect == nil { - return nil, 0, nil + return nil, nil, nil } if l.OuterSym(s) != 0 { @@ -418,7 +421,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read } outerName := l.SymName(l.OuterSym(s)) sectName := l.SymName(sectsyms[sect]) - return nil, 0, fmt.Errorf("%s: duplicate symbol reference: %s in both %s and %s", pn, l.SymName(s), outerName, sectName) + return nil, nil, fmt.Errorf("%s: duplicate symbol reference: %s in both %s and %s", pn, l.SymName(s), outerName, sectName) } bld = makeUpdater(l, bld, s) @@ -429,7 +432,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read bld.SetSize(4) if l.SymType(sectsym) == sym.STEXT { if bld.External() && !bld.DuplicateOK() { - return nil, 0, fmt.Errorf("%s: duplicate symbol definition", l.SymName(s)) + return nil, nil, fmt.Errorf("%s: duplicate symbol definition", l.SymName(s)) } bld.SetExternal(true) } @@ -446,7 +449,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, input *bio.Read if l.SymType(s) == sym.STEXT { for ; s != 0; s = l.SubSym(s) { if l.AttrOnList(s) { - return nil, 0, fmt.Errorf("symbol %s listed multiple times", l.SymName(s)) + return nil, nil, fmt.Errorf("symbol %s listed multiple times", l.SymName(s)) } l.SetAttrOnList(s, true) textp = append(textp, s) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 4eb02c9e8a..7eeb7ef568 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -786,6 +786,25 @@ func TestPErsrc(t *testing.T) { if !bytes.Contains(b, []byte("Hello Gophers!")) { t.Fatalf("binary does not contain expected content") } + + pkgdir = filepath.Join("testdata", "testPErsrc-complex") + exe = filepath.Join(tmpdir, "a.exe") + cmd = exec.Command(testenv.GoToolPath(t), "build", "-o", exe) + cmd.Dir = pkgdir + // cmd.Env = append(os.Environ(), "GOOS=windows", "GOARCH=amd64") // uncomment if debugging in a cross-compiling environment + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("building failed: %v, output:\n%s", err, out) + } + + // Check that the binary contains the rsrc data + b, err = ioutil.ReadFile(exe) + if err != nil { + t.Fatalf("reading output failed: %v", err) + } + if !bytes.Contains(b, []byte("resname RCDATA a.rc")) { + t.Fatalf("binary does not contain expected content") + } } func TestContentAddressableSymbols(t *testing.T) { diff --git a/src/cmd/link/testdata/testPErsrc-complex/main.go b/src/cmd/link/testdata/testPErsrc-complex/main.go new file mode 100644 index 0000000000..affd6eada2 --- /dev/null +++ b/src/cmd/link/testdata/testPErsrc-complex/main.go @@ -0,0 +1,43 @@ +// 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. + +// Test that a PE rsrc section is handled correctly, when the object files +// have been created by llvm-rc or msvc's rc.exe, which means there's the +// @feat.00 symbol as well as split .rsrc$00 and .rsrc$01 section to deal with. +// +// rsrc.syso is created with: +// windres -i a.rc -o rsrc.syso -O coff +// where this windres calls into llvm-rc and llvm-cvtres. The source file, +// a.rc, simply contains a reference to its own bytes: +// +// resname RCDATA a.rc +// +// Object dumping the resultant rsrc.syso, we can see the split sections and +// the @feat.00 SEH symbol: +// +// rsrc.syso: file format coff-x86-64 +// +// architecture: x86_64 +// start address: 0x0000000000000000 +// +// Export Table: +// Sections: +// Idx Name Size VMA Type +// 0 .rsrc$01 00000068 0000000000000000 DATA +// 1 .rsrc$02 00000018 0000000000000000 DATA +// +// SYMBOL TABLE: +// [ 0](sec -1)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000011 @feat.00 +// [ 1](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .rsrc$01 +// AUX scnlen 0x68 nreloc 1 nlnno 0 checksum 0x0 assoc 0 comdat 0 +// [ 3](sec 2)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .rsrc$02 +// AUX scnlen 0x18 nreloc 0 nlnno 0 checksum 0x0 assoc 0 comdat 0 +// [ 5](sec 2)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000000 $R000000 +// RELOCATION RECORDS FOR [.rsrc$01]: +// OFFSET TYPE VALUE +// 0000000000000048 IMAGE_REL_AMD64_ADDR32NB $R000000 + +package main + +func main() {} diff --git a/src/cmd/link/testdata/testPErsrc-complex/rsrc.syso b/src/cmd/link/testdata/testPErsrc-complex/rsrc.syso new file mode 100644 index 0000000000000000000000000000000000000000..eff630b8a23de71fa27da5bf0b49965bf4cea69a GIT binary patch literal 352 zcmYdkV`8vbwl4ky0|Nsa0~j#s6%`jHs~8x9c?=8;84L^zDGUq@XP^R%3=9ko3=9rX zbw*HO1_=fRh8r*rlm@ATGNBYB0~Z4WNNodD08D|*j9_4BFkoOn5ocgvWZ-0BVDJE| zVqg$~(jbbRA&9}1A(+9B!I8n2!4<5Am4ShQnSp_!D782*F*j8q$l1j)#8DwpuP7O0 zErUZ^YGR3=fq@_c1H=FSAhl3mfPD*c1v4YazaSRK4hV*-0sE8*WCJ6}uMjyHsS;!W M1|U9I4T!-206a}1`2YX_ literal 0 HcmV?d00001 -- GitLab From 223331fc0cf5b23fbb9999eb1164b23695ef612a Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 22 Dec 2020 16:57:46 -0500 Subject: [PATCH 1566/1792] cmd/go/internal/modload: add hint for missing implicit dependency By default (and with -mod=readonly), the go command imports an error if a package provided by an implicitly required module is imported by a package in the main module. This import requires an update to go.mod: the module must be required explicitly. The package loader now provides a hint that 'go get' should be run on the importing package. This is preferred to 'go get' on the imported package, since that would add an "// indirect" requirement. For #43131 Change-Id: I0b353ce8ac8c4ddf1a9863544dfaf6c1964daf42 Reviewed-on: https://go-review.googlesource.com/c/go/+/279528 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/load.go | 11 ++- .../script/mod_get_promote_implicit.txt | 82 +++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/script/mod_get_promote_implicit.txt diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index a0f93d028a..27f47fad4d 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -863,12 +863,21 @@ func loadFromRoots(params loaderParams) *loader { for _, pkg := range ld.pkgs { if pkg.mod == Target { for _, dep := range pkg.imports { - if dep.mod.Path != "" { + if dep.mod.Path != "" && dep.mod.Path != Target.Path && index != nil { + _, explicit := index.require[dep.mod] + if allowWriteGoMod && cfg.BuildMod == "readonly" && !explicit { + // TODO(#40775): attach error to package instead of using + // base.Errorf. Ideally, 'go list' should not fail because of this, + // but today, LoadPackages calls WriteGoMod unconditionally, which + // would fail with a less clear message. + base.Errorf("go: %[1]s: package %[2]s imported from implicitly required module; try 'go get -d %[1]s' to add missing requirements", pkg.path, dep.path) + } ld.direct[dep.mod.Path] = true } } } } + base.ExitIfErrors() // If we didn't scan all of the imports from the main module, or didn't use // imports.AnyTags, then we didn't necessarily load every package that diff --git a/src/cmd/go/testdata/script/mod_get_promote_implicit.txt b/src/cmd/go/testdata/script/mod_get_promote_implicit.txt new file mode 100644 index 0000000000..33f6a299e2 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_promote_implicit.txt @@ -0,0 +1,82 @@ +cp go.mod.orig go.mod + +# If we list a package in an implicit dependency imported from the main module, +# we should get an error because the dependency should have an explicit +# requirement. +go list -m indirect-with-pkg +stdout '^indirect-with-pkg v1.0.0 => ./indirect-with-pkg$' +! go list ./use-indirect +stderr '^go: m/use-indirect: package indirect-with-pkg imported from implicitly required module; try ''go get -d m/use-indirect'' to add missing requirements$' + +# We can promote the implicit requirement by getting the importing package, +# as hinted. +go get -d m/use-indirect +cmp go.mod go.mod.use +cp go.mod.orig go.mod + +-- go.mod.orig -- +module m + +go 1.16 + +require direct v1.0.0 + +replace ( + direct v1.0.0 => ./direct + indirect-with-pkg v1.0.0 => ./indirect-with-pkg + indirect-without-pkg v1.0.0 => ./indirect-without-pkg +) +-- go.mod.use -- +module m + +go 1.16 + +require ( + direct v1.0.0 + indirect-with-pkg v1.0.0 +) + +replace ( + direct v1.0.0 => ./direct + indirect-with-pkg v1.0.0 => ./indirect-with-pkg + indirect-without-pkg v1.0.0 => ./indirect-without-pkg +) +-- go.mod.indirect -- +module m + +go 1.16 + +require ( + direct v1.0.0 + indirect-with-pkg v1.0.0 // indirect + indirect-without-pkg v1.0.0 // indirect +) + +replace ( + direct v1.0.0 => ./direct + indirect-with-pkg v1.0.0 => ./indirect-with-pkg + indirect-without-pkg v1.0.0 => ./indirect-without-pkg +) +-- use-indirect/use-indirect.go -- +package use + +import _ "indirect-with-pkg" +-- direct/go.mod -- +module direct + +go 1.16 + +require ( + indirect-with-pkg v1.0.0 + indirect-without-pkg v1.0.0 +) +-- indirect-with-pkg/go.mod -- +module indirect-with-pkg + +go 1.16 +-- indirect-with-pkg/p.go -- +package p +-- indirect-without-pkg/go.mod -- +module indirect-without-pkg + +go 1.16 -- GitLab From b0b0d9828308368e9fbd59ec5de55801f568f720 Mon Sep 17 00:00:00 2001 From: "Andrew G. Morgan" Date: Thu, 12 Nov 2020 21:19:52 -0800 Subject: [PATCH 1567/1792] runtime: linux iscgo support for not blocking nptl signals Under linux+cgo, OS threads are launched via pthread_create(). This abstraction, under linux, requires we avoid blocking signals 32,33 and 34 indefinitely because they are needed to reliably execute POSIX-semantics threading in glibc and/or musl. When blocking signals the go runtime generally re-enables them quickly. However, when a thread exits (under cgo, this is via a return from mstart()), we avoid a deadlock in C-code by not blocking these three signals. Fixes #42494 Change-Id: I02dfb2480a1f97d11679e0c4b132b51bddbe4c14 Reviewed-on: https://go-review.googlesource.com/c/go/+/269799 Reviewed-by: Ian Lance Taylor Reviewed-by: Austin Clements Trust: Tobias Klauser --- src/runtime/os_js.go | 2 +- src/runtime/os_linux.go | 18 ++++++++++++++++++ src/runtime/os_plan9.go | 2 +- src/runtime/os_windows.go | 2 +- src/runtime/proc.go | 8 ++++---- src/runtime/signal_unix.go | 19 +++++++++++++++---- src/syscall/syscall_linux_test.go | 13 +++++++++++++ 7 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/runtime/os_js.go b/src/runtime/os_js.go index 94983b358d..91d18a078f 100644 --- a/src/runtime/os_js.go +++ b/src/runtime/os_js.go @@ -72,7 +72,7 @@ func clearSignalHandlers() { } //go:nosplit -func sigblock() { +func sigblock(exiting bool) { } // Called to initialize a new m (including the bootstrap m). diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index 371db73502..f122d2c2ef 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -301,6 +301,24 @@ func getHugePageSize() uintptr { func osinit() { ncpu = getproccount() physHugePageSize = getHugePageSize() + if iscgo { + // #42494 glibc and musl reserve some signals for + // internal use and require they not be blocked by + // the rest of a normal C runtime. When the go runtime + // blocks...unblocks signals, temporarily, the blocked + // interval of time is generally very short. As such, + // these expectations of *libc code are mostly met by + // the combined go+cgo system of threads. However, + // when go causes a thread to exit, via a return from + // mstart(), the combined runtime can deadlock if + // these signals are blocked. Thus, don't block these + // signals when exiting threads. + // - glibc: SIGCANCEL (32), SIGSETXID (33) + // - musl: SIGTIMER (32), SIGCANCEL (33), SIGSYNCCALL (34) + sigdelset(&sigsetAllExiting, 32) + sigdelset(&sigsetAllExiting, 33) + sigdelset(&sigsetAllExiting, 34) + } osArchInit() } diff --git a/src/runtime/os_plan9.go b/src/runtime/os_plan9.go index 62aecea060..a035526937 100644 --- a/src/runtime/os_plan9.go +++ b/src/runtime/os_plan9.go @@ -195,7 +195,7 @@ func msigrestore(sigmask sigset) { func clearSignalHandlers() { } -func sigblock() { +func sigblock(exiting bool) { } // Called to initialize a new m (including the bootstrap m). diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index ffb087f9db..d389d38ab9 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -886,7 +886,7 @@ func clearSignalHandlers() { } //go:nosplit -func sigblock() { +func sigblock(exiting bool) { } // Called to initialize a new m (including the bootstrap m). diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 5adcbf07dc..592d621241 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1313,7 +1313,7 @@ func mexit(osStack bool) { throw("locked m0 woke up") } - sigblock() + sigblock(true) unminit() // Free the gsignal stack. @@ -1754,7 +1754,7 @@ func needm() { // starting a new m to run Go code via newosproc. var sigmask sigset sigsave(&sigmask) - sigblock() + sigblock(false) // Lock extra list, take head, unlock popped list. // nilokay=false is safe here because of the invariant above, @@ -1903,7 +1903,7 @@ func dropm() { // Setg(nil) clears g, which is the signal handler's cue not to run Go handlers. // It's important not to try to handle a signal between those two steps. sigmask := mp.sigmask - sigblock() + sigblock(false) unminit() mnext := lockextra(true) @@ -3776,7 +3776,7 @@ func beforefork() { // group. See issue #18600. gp.m.locks++ sigsave(&gp.m.sigmask) - sigblock() + sigblock(false) // This function is called before fork in syscall package. // Code between fork and exec must not allocate memory nor even try to grow stack. diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index e8f39c3321..382ba37a87 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -1042,15 +1042,26 @@ func msigrestore(sigmask sigset) { sigprocmask(_SIG_SETMASK, &sigmask, nil) } -// sigblock blocks all signals in the current thread's signal mask. +// sigsetAllExiting is used by sigblock(true) when a thread is +// exiting. sigset_all is defined in OS specific code, and per GOOS +// behavior may override this default for sigsetAllExiting: see +// osinit(). +var sigsetAllExiting = sigset_all + +// sigblock blocks signals in the current thread's signal mask. // This is used to block signals while setting up and tearing down g -// when a non-Go thread calls a Go function. -// The OS-specific code is expected to define sigset_all. +// when a non-Go thread calls a Go function. When a thread is exiting +// we use the sigsetAllExiting value, otherwise the OS specific +// definition of sigset_all is used. // This is nosplit and nowritebarrierrec because it is called by needm // which may be called on a non-Go thread with no g available. //go:nosplit //go:nowritebarrierrec -func sigblock() { +func sigblock(exiting bool) { + if exiting { + sigprocmask(_SIG_SETMASK, &sigsetAllExiting, nil) + return + } sigprocmask(_SIG_SETMASK, &sigset_all, nil) } diff --git a/src/syscall/syscall_linux_test.go b/src/syscall/syscall_linux_test.go index 153d0efef1..adeb7c9ebb 100644 --- a/src/syscall/syscall_linux_test.go +++ b/src/syscall/syscall_linux_test.go @@ -597,6 +597,14 @@ func compareStatus(filter, expect string) error { return nil } +// killAThread locks the goroutine to an OS thread and exits; this +// causes an OS thread to terminate. +func killAThread(c <-chan struct{}) { + runtime.LockOSThread() + <-c + return +} + // TestSetuidEtc performs tests on all of the wrapped system calls // that mirror to the 9 glibc syscalls with POSIX semantics. The test // here is considered authoritative and should compile and run @@ -647,6 +655,11 @@ func TestSetuidEtc(t *testing.T) { } for i, v := range vs { + // Generate some thread churn as we execute the tests. + c := make(chan struct{}) + go killAThread(c) + close(c) + if err := v.fn(); err != nil { t.Errorf("[%d] %q failed: %v", i, v.call, err) continue -- GitLab From fd6ba1c8a23d8a3fffb6c475b21f78510152ef5c Mon Sep 17 00:00:00 2001 From: "Andrew G. Morgan" Date: Fri, 11 Dec 2020 22:42:11 -0800 Subject: [PATCH 1568/1792] os/signal: fix a deadlock with syscall.AllThreadsSyscall() use The syscall.AllThreadsSyscall() fixup mechanism needs to cooperate with signal handling to ensure a notetsleepg() thread can wake up to run the mDoFixup() function. Fixes #43149 Change-Id: I6651b25bc44a4de47d3fb71d0293d51aef8b79c7 Reviewed-on: https://go-review.googlesource.com/c/go/+/277434 Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Trust: Austin Clements Reviewed-by: Ian Lance Taylor --- src/os/signal/signal_linux_test.go | 42 ++++++++++++++++++++++++++++++ src/runtime/proc.go | 1 + src/runtime/sigqueue.go | 34 ++++++++++++++++++++++-- src/runtime/sigqueue_plan9.go | 7 +++++ 4 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/os/signal/signal_linux_test.go diff --git a/src/os/signal/signal_linux_test.go b/src/os/signal/signal_linux_test.go new file mode 100644 index 0000000000..2e553d0b0f --- /dev/null +++ b/src/os/signal/signal_linux_test.go @@ -0,0 +1,42 @@ +// 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 linux + +package signal + +import ( + "os" + "syscall" + "testing" + "time" +) + +const prSetKeepCaps = 8 + +// This test validates that syscall.AllThreadsSyscall() can reliably +// reach all 'm' (threads) of the nocgo runtime even when one thread +// is blocked waiting to receive signals from the kernel. This monitors +// for a regression vs. the fix for #43149. +func TestAllThreadsSyscallSignals(t *testing.T) { + if _, _, err := syscall.AllThreadsSyscall(syscall.SYS_PRCTL, prSetKeepCaps, 0, 0); err == syscall.ENOTSUP { + t.Skip("AllThreadsSyscall disabled with cgo") + } + + sig := make(chan os.Signal, 1) + Notify(sig, os.Interrupt) + + for i := 0; i <= 100; i++ { + if _, _, errno := syscall.AllThreadsSyscall(syscall.SYS_PRCTL, prSetKeepCaps, uintptr(i&1), 0); errno != 0 { + t.Fatalf("[%d] failed to set KEEP_CAPS=%d: %v", i, i&1, errno) + } + } + + select { + case <-time.After(10 * time.Millisecond): + case <-sig: + t.Fatal("unexpected signal") + } + Stop(sig) +} diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 592d621241..ca78587aad 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1515,6 +1515,7 @@ func syscall_runtime_doAllThreadsSyscall(fn func(bool) bool) { if netpollinited() { netpollBreak() } + sigRecvPrepareForFixup() _g_ := getg() if raceenabled { // For m's running without racectx, we loan out the diff --git a/src/runtime/sigqueue.go b/src/runtime/sigqueue.go index 0605f5da80..28b9e26d0f 100644 --- a/src/runtime/sigqueue.go +++ b/src/runtime/sigqueue.go @@ -12,12 +12,16 @@ // sigsend is called by the signal handler to queue a new signal. // signal_recv is called by the Go program to receive a newly queued signal. // Synchronization between sigsend and signal_recv is based on the sig.state -// variable. It can be in 3 states: sigIdle, sigReceiving and sigSending. +// variable. It can be in 4 states: sigIdle, sigReceiving, sigSending and sigFixup. // sigReceiving means that signal_recv is blocked on sig.Note and there are no // new pending signals. // sigSending means that sig.mask *may* contain new pending signals, // signal_recv can't be blocked in this state. // sigIdle means that there are no new pending signals and signal_recv is not blocked. +// sigFixup is a transient state that can only exist as a short +// transition from sigReceiving and then on to sigIdle: it is +// used to ensure the AllThreadsSyscall()'s mDoFixup() operation +// occurs on the sleeping m, waiting to receive a signal. // Transitions between states are done atomically with CAS. // When signal_recv is unblocked, it resets sig.Note and rechecks sig.mask. // If several sigsends and signal_recv execute concurrently, it can lead to @@ -59,6 +63,7 @@ const ( sigIdle = iota sigReceiving sigSending + sigFixup ) // sigsend delivers a signal from sighandler to the internal signal delivery queue. @@ -112,6 +117,9 @@ Send: notewakeup(&sig.note) break Send } + case sigFixup: + // nothing to do - we need to wait for sigIdle. + osyield() } } @@ -119,6 +127,19 @@ Send: return true } +// sigRecvPrepareForFixup is used to temporarily wake up the +// signal_recv() running thread while it is blocked waiting for the +// arrival of a signal. If it causes the thread to wake up, the +// sig.state travels through this sequence: sigReceiving -> sigFixup +// -> sigIdle -> sigReceiving and resumes. (This is only called while +// GC is disabled.) +//go:nosplit +func sigRecvPrepareForFixup() { + if atomic.Cas(&sig.state, sigReceiving, sigFixup) { + notewakeup(&sig.note) + } +} + // Called to receive the next queued signal. // Must only be called from a single goroutine at a time. //go:linkname signal_recv os/signal.signal_recv @@ -146,7 +167,16 @@ func signal_recv() uint32 { } notetsleepg(&sig.note, -1) noteclear(&sig.note) - break Receive + if !atomic.Cas(&sig.state, sigFixup, sigIdle) { + break Receive + } + // Getting here, the code will + // loop around again to sleep + // in state sigReceiving. This + // path is taken when + // sigRecvPrepareForFixup() + // has been called by another + // thread. } case sigSending: if atomic.Cas(&sig.state, sigSending, sigIdle) { diff --git a/src/runtime/sigqueue_plan9.go b/src/runtime/sigqueue_plan9.go index d5fe8f8b35..aebd2060e7 100644 --- a/src/runtime/sigqueue_plan9.go +++ b/src/runtime/sigqueue_plan9.go @@ -92,6 +92,13 @@ func sendNote(s *byte) bool { return true } +// sigRecvPrepareForFixup is a no-op on plan9. (This would only be +// called while GC is disabled.) +// +//go:nosplit +func sigRecvPrepareForFixup() { +} + // Called to receive the next queued signal. // Must only be called from a single goroutine at a time. //go:linkname signal_recv os/signal.signal_recv -- GitLab From 98a73030b01cc23a292934d09f137a2befa439bf Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 16 Dec 2020 16:37:56 -0500 Subject: [PATCH 1569/1792] cmd/go: in 'go get', promote named implicit dependencies to explicit 'go get pkg@vers' will now add an explicit requirement for the module providing pkg if that version was already indirectly required. 'go get mod@vers' will do the same if mod is a module path but not a package. Requirements promoted this way will be marked "// indirect" because 'go get' doesn't know whether they're needed to build packages in the main module. So users should prefer to run 'go get ./pkg' (where ./pkg is a package in the main module) to promote requirements. Fixes #43131 Change-Id: Ifbb65b71274b3cc752a7a593d6ddd875f7de23b8 Reviewed-on: https://go-review.googlesource.com/c/go/+/278812 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Trust: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/buildlist.go | 11 +++++++++++ src/cmd/go/internal/modload/init.go | 6 +++++- src/cmd/go/internal/modload/query.go | 10 +++------- src/cmd/go/internal/str/str.go | 14 ++++++++++++++ .../testdata/script/mod_get_promote_implicit.txt | 6 ++++++ 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/cmd/go/internal/modload/buildlist.go b/src/cmd/go/internal/modload/buildlist.go index 896adebbb1..45f220a6ee 100644 --- a/src/cmd/go/internal/modload/buildlist.go +++ b/src/cmd/go/internal/modload/buildlist.go @@ -28,6 +28,11 @@ import ( // var buildList []module.Version +// additionalExplicitRequirements is a list of modules paths for which +// WriteGoMod should record explicit requirements, even if they would be +// selected without those requirements. Each path must also appear in buildList. +var additionalExplicitRequirements []string + // capVersionSlice returns s with its cap reduced to its length. func capVersionSlice(s []module.Version) []module.Version { return s[:len(s):len(s)] @@ -121,6 +126,12 @@ func EditBuildList(ctx context.Context, add, mustSelect []module.Version) error if !inconsistent { buildList = final + additionalExplicitRequirements = make([]string, 0, len(mustSelect)) + for _, m := range mustSelect { + if m.Version != "none" { + additionalExplicitRequirements = append(additionalExplicitRequirements, m.Path) + } + } return nil } diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 3f70d04145..445ebb262f 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -15,6 +15,7 @@ import ( "os" "path" "path/filepath" + "sort" "strconv" "strings" "sync" @@ -27,6 +28,7 @@ import ( "cmd/go/internal/modfetch" "cmd/go/internal/mvs" "cmd/go/internal/search" + "cmd/go/internal/str" "golang.org/x/mod/modfile" "golang.org/x/mod/module" @@ -845,13 +847,15 @@ func AllowWriteGoMod() { // MinReqs returns a Reqs with minimal additional dependencies of Target, // as will be written to go.mod. func MinReqs() mvs.Reqs { - var retain []string + retain := append([]string{}, additionalExplicitRequirements...) for _, m := range buildList[1:] { _, explicit := index.require[m] if explicit || loaded.direct[m.Path] { retain = append(retain, m.Path) } } + sort.Strings(retain) + str.Uniq(&retain) min, err := mvs.Req(Target, retain, &mvsReqs{buildList: buildList}) if err != nil { base.Fatalf("go: %v", err) diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index e35e0fc16e..8affd179bb 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -21,6 +21,7 @@ import ( "cmd/go/internal/imports" "cmd/go/internal/modfetch" "cmd/go/internal/search" + "cmd/go/internal/str" "cmd/go/internal/trace" "golang.org/x/mod/module" @@ -1005,13 +1006,8 @@ func (rr *replacementRepo) Versions(prefix string) ([]string, error) { sort.Slice(versions, func(i, j int) bool { return semver.Compare(versions[i], versions[j]) < 0 }) - uniq := versions[:1] - for _, v := range versions { - if v != uniq[len(uniq)-1] { - uniq = append(uniq, v) - } - } - return uniq, nil + str.Uniq(&versions) + return versions, nil } func (rr *replacementRepo) Stat(rev string) (*modfetch.RevInfo, error) { diff --git a/src/cmd/go/internal/str/str.go b/src/cmd/go/internal/str/str.go index 0413ed8e69..9106ebf74d 100644 --- a/src/cmd/go/internal/str/str.go +++ b/src/cmd/go/internal/str/str.go @@ -96,6 +96,20 @@ func Contains(x []string, s string) bool { return false } +// Uniq removes consecutive duplicate strings from ss. +func Uniq(ss *[]string) { + if len(*ss) <= 1 { + return + } + uniq := (*ss)[:1] + for _, s := range *ss { + if s != uniq[len(uniq)-1] { + uniq = append(uniq, s) + } + } + *ss = uniq +} + func isSpaceByte(c byte) bool { return c == ' ' || c == '\t' || c == '\n' || c == '\r' } diff --git a/src/cmd/go/testdata/script/mod_get_promote_implicit.txt b/src/cmd/go/testdata/script/mod_get_promote_implicit.txt index 33f6a299e2..c64e0c0f70 100644 --- a/src/cmd/go/testdata/script/mod_get_promote_implicit.txt +++ b/src/cmd/go/testdata/script/mod_get_promote_implicit.txt @@ -14,6 +14,12 @@ go get -d m/use-indirect cmp go.mod go.mod.use cp go.mod.orig go.mod +# We can also promote implicit requirements using 'go get' on them, or their +# packages. This gives us "// indirect" requirements, since 'go get' doesn't +# know they're needed by the main module. See #43131 for the rationale. +go get -d indirect-with-pkg indirect-without-pkg +cmp go.mod go.mod.indirect + -- go.mod.orig -- module m -- GitLab From 49d0b239cb83e62c7b67e68ef9440ddc055a9c53 Mon Sep 17 00:00:00 2001 From: Andrey Bokhanko Date: Mon, 21 Dec 2020 16:33:55 +0000 Subject: [PATCH 1570/1792] doc: fix a typo in contribute.html A fix for a trivial (yet still confusing for neophytes like me!) typo in contribute.html. Change-Id: Ic68673fb2a3855c2b9e8042047087450e8793e6b Reviewed-on: https://go-review.googlesource.com/c/go/+/279452 Reviewed-by: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot --- doc/contribute.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/contribute.html b/doc/contribute.html index f297477fe0..0113a1be5d 100644 --- a/doc/contribute.html +++ b/doc/contribute.html @@ -1129,7 +1129,7 @@ sometimes required because the standard library code you're modifying might require a newer version than the stable one you have installed).

-$ cd $GODIR/src/hash/sha1
+$ cd $GODIR/src/crypto/sha1
 $ [make changes...]
 $ $GODIR/bin/go test .
 
-- GitLab From 30c99cbb7a7bd795a772bbc0f32a1266d86b29bb Mon Sep 17 00:00:00 2001 From: markruler Date: Tue, 22 Dec 2020 17:22:17 +0000 Subject: [PATCH 1571/1792] cmd/go: add the Retract field to 'go help mod edit' definition of the GoMod struct Fixes #43281 Change-Id: Ife26ca174a8818b56aaea9547976d97978478a5f GitHub-Last-Rev: 85a3d30001672b371a58d1c8a2092fc9b937af6f GitHub-Pull-Request: golang/go#43315 Reviewed-on: https://go-review.googlesource.com/c/go/+/279592 Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills Trust: Jay Conrod --- src/cmd/go/alldocs.go | 1 + src/cmd/go/internal/modcmd/edit.go | 1 + 2 files changed, 2 insertions(+) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index c4913ce695..78f114f6af 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1192,6 +1192,7 @@ // Require []Require // Exclude []Module // Replace []Replace +// Retract []Retract // } // // type Require struct { diff --git a/src/cmd/go/internal/modcmd/edit.go b/src/cmd/go/internal/modcmd/edit.go index b203a8a2b0..3a406b91fa 100644 --- a/src/cmd/go/internal/modcmd/edit.go +++ b/src/cmd/go/internal/modcmd/edit.go @@ -95,6 +95,7 @@ writing it back to go.mod. The JSON output corresponds to these Go types: Require []Require Exclude []Module Replace []Replace + Retract []Retract } type Require struct { -- GitLab From d1502b3c7270e655d3306d65f5dd61438626a1a9 Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Wed, 23 Dec 2020 09:30:22 +0100 Subject: [PATCH 1572/1792] lib/time, time/tzdata: update tzdata to 2020e Changelog: Volgograd switches to Moscow time on 2020-12-27 at 02:00. Small changes to past timestamps and abbreviations. See http://mm.icann.org/pipermail/tz-announce/2020-December/000063.html Updates #22487 Change-Id: I709abe899ca498698463e945ccbcf4bc5fe60b92 Reviewed-on: https://go-review.googlesource.com/c/go/+/279794 Trust: Alberto Donizetti Run-TryBot: Alberto Donizetti TryBot-Result: Go Bot Reviewed-by: Tobias Klauser Reviewed-by: Ian Lance Taylor --- lib/time/update.bash | 4 +- lib/time/zoneinfo.zip | Bin 422449 -> 424205 bytes src/time/tzdata/zipdata.go | 13714 ++++++++++++++++++----------------- 3 files changed, 6874 insertions(+), 6844 deletions(-) diff --git a/lib/time/update.bash b/lib/time/update.bash index 8eebdf11f4..ca848994fe 100755 --- a/lib/time/update.bash +++ b/lib/time/update.bash @@ -8,8 +8,8 @@ # Consult https://www.iana.org/time-zones for the latest versions. # Versions to use. -CODE=2020d -DATA=2020d +CODE=2020e +DATA=2020e set -e rm -rf work diff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip index fa143a296da2f72ddb3413e45b60e432c69997e5..eb5f082bf1189505680d568ac80d1717b5a6eaf1 100644 GIT binary patch delta 74711 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.ZvQF()T8 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 QW14o7fgy1{D+2=q0B+sI6aWAK delta 75504 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\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\x00" + - "i\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\x00" + - "x*\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\u007fr\xde \x00\x00\x00\x00\u007f\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%\u007f \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\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\v\x00\x1c\x00Africa/LomeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\x0e|XQÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x1c\x00Africa/Algi" + - "ersUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + - "\x00WET\x00CEST\x00CET\x00\nCET-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x10\x00\x1c\x00Africa/Mo" + - "gadishuUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff\xed/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00" + - "#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83" + - "\x00\x00\x00\f\x00\x1c\x00Africa/LagosUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\nWAT-1\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\x12\x00\x1c\x00Africa/BrazzavilleUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00" + - "\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Afric" + - "a/TimbuktuUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x1c\x00Africa/NouakchottUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x04L" + - "MT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Africa/MaseruUT\t\x00" + - "\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00\x00\x00" + - "\x11\x00\x1c\x00Africa/LibrevilleUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\nWAT-1\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/HarareUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/M" + - "alaboUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11" + - "=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/BanguiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\n" + - "WAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x0e\x00\x1c\x00Africa/NairobiUT\t\x00\x03\xec,\x94_\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda" + - "\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff\xed/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT" + - "\x00+0230\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/Kin" + - "shasaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11" + - "=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x1c\x00Africa/Porto-NovoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00W" + - "AT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x1c\x00Africa/CairoUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u007f\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\u007f\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\u007fYp\x00\x00\x00\x00\x03I\x1d\x00\x00\x00\x00\x00\x04a\xdep\x00\x00\x00\x00\x05+\xa2\x00\x00\x00\x00\x00\x06" + - "C\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\x14" + - "7\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\x000" + - "k\f\xd0\x00\x00\x00\x001\u007f\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@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0\x00\x00\x00\x00C\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\x00L" + - "a\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\tLMT\x00EEST\x00EET\x00\nEET-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00" + - "\x00\x00\r\x00\x1c\x00Africa/DoualaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\nWAT-1\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x1c\x00Africa/JubaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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 \x02\x01\x02\x01\x02\x01\x02\x01\x02\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\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\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00" + - "\x00\x00\x0f\x00\x1c\x00Africa/GaboroneUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x1c\x00Africa/TunisUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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`P" + - "O\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\x02" + - "1\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\rLMT\x00PMT\x00CEST\x00CET\x00\nCET-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00" + - "\x00\xb6\x00\x00\x00\x0e\x00\x1c\x00Africa/KampalaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + +const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Africa/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/FreetownUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x92" + + "H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x1c\x00Af" + + "rica/KinshasaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4" + + "\x00\x00\x00\xb4\x00\x00\x00\f\x00\x1c\x00Africa/LagosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff\xed/\xe1\xd4\x01\x02" + - "\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00" + - "\x00\x00\x00\x0e|XQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x1c\x00Africa/MbabaneUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x04LM" + - "T\x00SAST\x00\nSAST-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x12\x00\x1c\x00Africa/Addis_Ab" + - "abaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff\xed/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b" + - "\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r" + - "\x00\x1c\x00Africa/MaputoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x1c\x00Africa/BissauUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x02\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x92朐\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\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00" + - "\x00\x0f\x00\x1c\x00Africa/BlantyreUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/NiameyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00" + - "\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/Ba" + - "njulUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x1c\x00Africa/JohannesburgUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x10\x00\x1c\x00Africa/Bujum" + + "buraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87" + - "\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00Africa/AbidjanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0" + + "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/KigaliUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\nG" + - "MT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\r\x00\x1c\x00Africa/AsmaraUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff" + - "\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff\xed/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0" + - "230\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/Bamako" + - "UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x12\x00\x1c\x00Africa/OuagadougouUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + + "\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\nC" + + "AT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00Africa/ConakryUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x1c\x00Afr" + + "ica/El_AaiunUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fr\xde \x00\x00\x00\x00\u007f\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%\u007f \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\xc1" + + "X\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\xdc" + + "\xbeD \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\n\x00\x00\x00\x00\x00\xb8K\x97QV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x1c\x00Africa/KhartoumUT\t\x00\x03" + + "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00CAST\x00CAT\x00EAT\x00\nCAT-2" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x1c\x00Africa/CeutaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd6" + + "up\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\fa" + + "G\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#\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\u007fr\xde \x00\x00\x00\x00\u007f\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\xf2" + + "f \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%\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\fT\xce" + + "\xbe\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x1c\x00Africa/MbabaneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\nG" + - "MT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/LusakaUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Afri" + - "ca/LuandaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1Q\xf3P\x01\x00\x00\x030\x00\x00\x00\x00\x0e\x10\x00\x04LMT\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\r\x00\x1c\x00Africa/AsmeraUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00T" + + "\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͞o" + + "p\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\nSAS" + + "T-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q6\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x1c\x00Africa/MonroviaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/NiameyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x8c" + + "P`\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x1c\x00Africa/DakarUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00" + + "\x1c\x00Africa/TripoliUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x003" + + "D6p\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\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x1c\x00Africa/NdjamenaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/DoualaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff" + - "\xff\xff\xed/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT-3" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x1c\x00Africa/LubumbashiUT\t\x00\x03\xec,\x94_\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ9\x0f߁,\x02\x00\x00,\x02\x00\x00\f\x00\x1c\x00Afr" + - "ica/AccraUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9e0f\xb4\xff\xff\xff\xff\xa34{\x80\xff\xff\xff\xff\xa3\xd3\xfcP\xff\xff\xff\xff\xa5\x15\xaf\x00\xff\xff\xff\xff\xa5\xb5/\xd0\xff\xff\xff\xff\xa6\xf6\xe2\x80" + - "\xff\xff\xff\xff\xa7\x96cP\xff\xff\xff\xff\xa8\xd8\x16\x00\xff\xff\xff\xff\xa9w\x96\xd0\xff\xff\xff\xff\xaa\xba\x9b\x00\xff\xff\xff\xff\xabZ\x1b\xd0\xff\xff\xff\xff\xac\x9b\u0380\xff\xff\xff\xff\xad;OP\xff\xff\xff\xff" + - "\xae}\x02\x00\xff\xff\xff\xff\xaf\x1c\x82\xd0\xff\xff\xff\xff\xb0^5\x80\xff\xff\xff\xff\xb0\xfd\xb6P\xff\xff\xff\xff\xb2@\xba\x80\xff\xff\xff\xff\xb2\xe0;P\xff\xff\xff\xff\xb4!\xee\x00\xff\xff\xff\xff\xb4\xc1n\xd0" + - "\xff\xff\xff\xff\xb6\x03!\x80\xff\xff\xff\xff\xb6\xa2\xa2P\xff\xff\xff\xff\xb7\xe4U\x00\xff\xff\xff\xff\xb8\x83\xd5\xd0\xff\xff\xff\xff\xb9\xc6\xda\x00\xff\xff\xff\xff\xbafZ\xd0\xff\xff\xff\xff\xbb\xa8\r\x80\xff\xff\xff\xff" + - "\xbcG\x8eP\xff\xff\xff\xff\xbd\x89A\x00\xff\xff\xff\xff\xbe(\xc1\xd0\xff\xff\xff\xff\xbfjt\x80\xff\xff\xff\xff\xc0\t\xf5P\xff\xff\xff\xff\xc1L\xf9\x80\xff\xff\xff\xff\xc1\xeczP\xff\xff\xff\xff\xc3.-\x00" + - "\xff\xff\xff\xff\xc3ͭ\xd0\xff\xff\xff\xff\xc5\x0f`\x80\xff\xff\xff\xffŮ\xe1P\xff\xff\xff\xff\xc6\xf0\x94\x00\xff\xff\xff\xffǐ\x14\xd0\xff\xff\xff\xff\xc8\xd3\x19\x00\xff\xff\xff\xff\xc9r\x99\xd0\xff\xff\xff\xff" + - "ʴL\x80\xff\xff\xff\xff\xcbS\xcdP\xff\xff\xff\xff̕\x80\x00\xff\xff\xff\xff\xcd5\x00\xd0\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xff\xcc\x00\x00\x00\x00\x04\xb0\x01\x04\x00\x00\x00\x00\x00\nLMT\x00+0020\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00" + - "\x00\x00\x00\x0e|XQV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x1c\x00Africa/KhartoumUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00CAST\x00CAT\x00EAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9f\x1b" + - "\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x1c\x00Africa/CeutaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\xf2" + - "p\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#\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" + - "\x00Ow\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\x13LMT\x00+0130\x00SAST\x00WAT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00" + - "\x1c\x00Africa/El_AaiunUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "K\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\x00" + - "TLU\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\x00" + - "g\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\x00" + - "vT\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\u007fr\xde \x00\x00\x00\x00\u007f\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%\u007f \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 \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+0" + - "1\x00+00\x00\n<+01>-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x1c\x00Africa/TripoliU" + - "T\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\nEET-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ6\x99rU\xa4\x00\x00\x00" + - "\xa4\x00\x00\x00\x0f\x00\x1c\x00Africa/MonroviaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x1c\x00Africa/AlgiersUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x13f" + + "B\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\x00WET\x00CEST\x00CET\x00\nCET-1" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x1c\x00Africa/DjiboutiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x0eLM" + + "T\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x1c\x00Afric" + + "a/Sao_TomeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c" + + "\x00Africa/AbidjanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/MaputoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x04" + + "LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x1c\x00Africa/CairoUT\t" + + "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u007f\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\u007f\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\u007fYp\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\u007f\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\x00" + + "7(\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@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0\x00\x00\x00\x00C\xe0\x00\x00\x00\x00" + + "E\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\tLMT\x00EEST\x00EET\x00\nEET-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82" + + "\x00\x00\x00\x82\x00\x00\x00\v\x00\x1c\x00Africa/LomeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BamakoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x1c\x00Africa/As" + + "maraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3" + + "c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/LibrevilleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/BlantyreUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x1c\x00Africa/W" + + "indhoekUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x003F\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\x1a" + + "G\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\x00Ow\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\x13LMT\x00+0130\x00SAST\x00WA" + + "T\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/HarareUT\t\x00" + + "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00" + + "\x00\r\x00\x1c\x00Africa/AsmeraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x1c\x00Africa/LubumbashiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/" + + "Porto-NovoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00" + + "\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/TimbuktuUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00" + - "\x00\x14\x00\x1c\x00Africa/Dar_es_SalaamUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff\xed/\xe1\xd4" + - "\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT-3\nPK\x03\x04\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x1c\x00Africa/JohannesburgUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x82" + - "F\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\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/K" + - "igaliUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xebE" + - "1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x0f\x00\x1c\x00Africa/DjiboutiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff" + - "\xed/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT-3\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/FreetownUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00America/" + - "UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQq\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x1c\x00Am" + - "erica/Puerto_RicoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa/KampalaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa" + + "/NairobiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Africa/MaseruUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00Africa/OuagadougouUT\t\x00" + + "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00" + + "\r\x00\x1c\x00Africa/LusakaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xbf\x03u\xf3" + - "\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x1c\x00America/RecifeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf14" + - "0\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\xc6" + - "\xb0\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\x003\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x1c\x00America/ResoluteUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5\xfb\x81\x80\xff\xff\xff\xff\xf7" + - "/L`\xff\xff\xff\xff\xf8(w\xe0\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9\xb0\x00\x11-" + - "00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQa\xcb" + - "'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c\x00America/ManausUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif" + + "\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" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x1c\x00Africa/MogadishuUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\xda" + + "X\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+0" + + "230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/Ga" + + "boroneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1" + + "\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BanjulUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fD\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,\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x1c\x00America/New_YorkUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\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\u007f\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)" + + "\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/MalaboUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x12\x00\x1c\x00Africa/Addis_" + + "AbabaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b" + + "{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x1c\x00Africa/NouakchottUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\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\x00G" + + "MT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/LuandaUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00G" + + "MT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x1c\x00Africa/Jub" + + "aUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 \x02\x01\x02\x01\x02\x01\x02\x01\x02\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\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\nEAT-3\nPK" + + "\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x1c\x00Africa/AccraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xff\x9a\x1d\x944\xff\xff\xff\xff\xa1\xc0\xb4\x80\xff" + + "\xff\xff\xff\xa1\xf2\xe4\xf0\xff\xff\xff\xff\xa34\x97\xa0\xff\xff\xff\xff\xa3\xd5i\xf0\xff\xff\xff\xff\xa5\x15\xcb \xff\xff\xff\xff\xa5\xb6\x9dp\xff\xff\xff\xff\xa6\xf6\xfe\xa0\xff\xff\xff\xff\xa7\x97\xd0\xf0\xff\xff\xff\xff\xa8" + + "\xd82 \xff\xff\xff\xff\xa9y\x04p\xff\xff\xff\xff\xaa\xba\xb7 \xff\xff\xff\xff\xab[\x89p\xff\xff\xff\xff\xac\x9b\xea\xa0\xff\xff\xff\xff\xad<\xbc\xf0\xff\xff\xff\xff\xae}\x1e \xff\xff\xff\xff\xaf\x1d\xf0p\xff" + + "\xff\xff\xff\xb0^Q\xa0\xff\xff\xff\xff\xb0\xff#\xf0\xff\xff\xff\xff\xb2@֠\xff\xff\xff\xff\xb2\xe1\xa8\xf0\xff\xff\xff\xff\xb4\"\n \xff\xff\xff\xff\xb4\xc2\xdcp\xff\xff\xff\xff\xb6\x03=\xa0\xff\xff\xff\xff\xb6" + + "\xa4\x0f\xf0\xff\xff\xff\xff\xb7\xe4q \xff\xff\xff\xff\xb8\x85Cp\xff\xff\xff\xff\xb9\xc6\xf6 \xff\xff\xff\xff\xbag\xc8p\xff\xff\xff\xff\xbb\xa8)\xa0\xff\xff\xff\xff\xbcH\xfb\xf0\xff\xff\xff\xff\xbd\x89] \xff" + + "\xff\xff\xff\xbe*/p\xff\xff\xff\xff\xbfj\x90\xa0\xff\xff\xff\xff\xc0\vb\xf0\xff\xff\xff\xff\xc1M\x15\xa0\xff\xff\xff\xff\xc1\xed\xe7\xf0\xff\xff\xff\xff\xc3.I \xff\xff\xff\xff\xc3\xcf\x1bp\xff\xff\xff\xff\xc5" + + "\x0f|\xa0\xff\xff\xff\xffŰN\xf0\xff\xff\xff\xff\xc6\xf0\xb0 \xff\xff\xff\xffǑ\x82p\xff\xff\xff\xff\xc81\f\xa0\xff\xff\xff\xff\xc9t\ap\xff\xff\xff\xff\xca\x12@ \xff\xff\xff\xff\xcbU:\xf0\xff" + + "\xff\xff\xffˇ<\x80\xff\xff\xff\xff\xd2\xe1\xd3x\xff\xff\xff\xffۡ\xdb \xff\xff\xff\xff\xdcB\xab\x18\xff\xff\xff\xff݃\x0e\xa0\xff\xff\xff\xff\xde#ޘ\xff\xff\xff\xff\xdfe\x93\xa0\xff\xff\xff\xff\xe0" + + "\x06c\x98\xff\xff\xff\xff\xe1F\xc7 \xff\xff\xff\xff\xe1\xe7\x97\x18\xff\xff\xff\xff\xe3'\xfa\xa0\xff\xff\xff\xff\xe3\xc8ʘ\xff\xff\xff\xff\xe5\t. \xff\xff\xff\xff\xe5\xa9\xfe\x18\x02\x01\x02\x01\x02\x01\x02\x01\x02" + + "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\xff\xff\xff\xcc\x00\x00\x00\x00" + + "\x04\xb0\x01\x04\x00\x00\x00\x00\x00\n\x00\x00\a\b\x00\x0e\x00\x00\a\b\x01\x0eLMT\x00+0020\x00GMT\x00+0030\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x14\x00\x1c\x00Africa/Dar_es_SalaamUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + + "EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x1c\x00Africa/Bissau" + + "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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朐\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/BanguiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00America/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x1c\x00America/Grand_Tu" + + "rkUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\u007f`\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,M1" + - "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x1c\x00America/Rankin_InletUT\t\x00" + - "\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\x8cn\x00\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(w\xe0\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" + - "\x03\x02\x03\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\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\xab\xa0\x00\t\xff" + - "\xff\xb9\xb0\x01\r\xff\xff\xb9\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x1c\x00America/LimaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\x0e" + - "|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/St_BarthelemyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff" + - "\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQP\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x1c\x00America/Sant" + - "o_DomingoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fH\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\n\x00" + - "\x00\x00\x00\x00\x0e|XQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x1c\x00America/DetroitUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x12y" + - "H\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.\xb3" + - "6`\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\u007f`\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\nEST5EDT,M3.2.0,M1" + - "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x1c\x00America/ParamariboUT\t\x00\x03\xec" + - ",\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x1c\x00A" + - "merica/YakutatUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04a5\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\x12y\x81 \x00\x00\x00\x00\x13i\x80" + - "0\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 v9" + - "0\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\x00YDT\x00AKDT\x00AKS" + - "T\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x1c\x00Am" + - "erica/SantaremUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ְ\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\n\x00\x00\x00\x00\x00\x0e|XQk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14\x00\x1c" + - "\x00America/Punta_ArenasUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\a\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xfc\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff" + - "\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\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 \u007f\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\x00" + - "5\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\x00" + - "CH\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\x00" + - "Q|\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\x01\x02\x01\x03\x01\x04\x02\x04" + - "\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\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\xba\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-03\x00\n<-03>3\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x1c\x00America/ScoresbysundUT\t\x00\x03\xec,\x94_\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#1<+00>,M3.5" + - ".0/0,M10.5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x10\x00\x1c\x00America/Santiag" + - "oUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\x06" + - "\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xc6\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\x1bɰ\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" + - " \u007f\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\x00" + - "J\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\x00" + - "Z\xf7\xaa0\x00\x00\x00\x00[o\xb0\xc0\x00\x00\x00\x00\\\xa9g\xb0\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x03\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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\x10LM" + - "T\x00SMT\x00-05\x00-04\x00-03\x00\n<-04>4<-03>,M9.1.6/24,M4.1.6/24\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\x15\xc8\xcb\x00\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x1c\x00America/GuyanaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\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\x98\xd9y\x88\x00\x00\x00\x00\n}\xb4<\x00\x00\x00\x00'\u007f" + - "\xfb0\x01\x02\x03\xff\xff\xc9x\x00\x00\xff\xff\xcbD\x00\x04\xff\xff\xd5\xd0\x00\n\xff\xff\xc7\xc0\x00\x0eLMT\x00-0345\x00-03\x00-04\x00\n<-04>4\nPK\x03\x04\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x1c\x00America/Coral_HarbourUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x84d\xff\xff\xff" + - "\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff\xaa\x1c\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\nEST5\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Rio_BrancoUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Porto_Acre" + - "UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "`\u007fP\x00\x00\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQp\x1b\xceRC\x03\x00\x00C\x03\x00\x00\x0f\x00\x1c\x00Amer" + - "ica/NipigonUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x81@\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xc8\xf8IP\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#" + - "\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\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\u007f`\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\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\xff\xff\xad@\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\x00ES" + - "T\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00" + - "\x10\x00\x1c\x00America/EdmontonUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05" + - "P\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\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\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/Port_of_SpainUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac" + - "\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x1c\x00Ame" + - "rica/Lower_PrincesUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT" + - "\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x1c\x00America/St_Th" + - "omasUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xac\x8a\x83S" + - "\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x1c\x00America/GuatemalaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x1c\x00A" + - "merica/CatamarcaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00" + - "\x1c\x00America/AntiguaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x1c\x00America/Porto_VelhoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ְ\x02\x01\x02\x01\x02\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\n\x00\x00\x00\x00\x00\x0e|XQ" + - "\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/RosarioUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\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#\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f\x00\x1c\x00America/ChicagoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\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\u007f\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\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,M" + - "3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x1c\x00America/CrestonU" + - "T\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff^=p\xbc\xff\xff\xff\xff\x9b\xd6Kp\xff\xff\xff\xff\x9e\xf9;\x00\x01\x02\x01\xff\xff\x92\xc4\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00\bLMT\x00MST\x00PST\x00\n" + - "MST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x1c\x00America/ManaguaUT\t\x00\x03\xec,\x94_\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00E" + - "ST\x00CDT\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x05{w\xe9\xad\x03\x00\x00\xad\x03\x00\x00\x0e\x00\x1c\x00America/NassauUT\t" + - "\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\f" + - "\xff\xff\xff\xff\x937B\x8a\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00" + - "A\x84\u007f`\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\xb7v\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\bLMT\x00EDT\x00EST\x00\nEST5EDT,M3.2.0,M1" + - "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x1c\x00America/BogotaUT\t\x00\x03\xec,\x94_\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+\xbe]@\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x1c\x00America/Cancu" + - "nUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + - "I\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\x00T\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\x00" + - "EDT\x00EST\x00CDT\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x1c\x00America/Chih" + - "uahuaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x00" + - "1gv\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff" + - "\xff\x9c\x8c\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M4" + - ".1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x1c\x00America/Campo_Gra" + - "ndeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x009\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00N\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\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\x00TC" + - "7@\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\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\n\x00\x00\x00\x00\x00\x0e|XQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00America" + - "/HalifaxUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fU0\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\xc6" + - "r<@\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\u007f\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\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\x00C" + - "dSP\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\x00" + - "APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x1c\x00Am" + - "erica/BoiseUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xa8F" + - "L \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\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\u007f\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\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\nMST7M" + - "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x1c\x00America/Mont" + - "realUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa3" + - "U\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\xd5" + - "U\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\xe3" + - "I(`\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\u007f\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\x8f\xd0p\x00" + - "\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\n\x00\x00\x00\x00\x00\x0e|XQ\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x1c\x00America/Goose_BayUT\t\x00" + - "\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u0098\x138\xff\xff\xff\xff\xc3" + - "YѨ\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" + - "\u007f\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\x00ED\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\x00NST\x00NDT\x00N" + - "PT\x00NWT\x00ADT\x00AST\x00ADDT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9d?" + - "\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x1c\x00America/Sao_PauloUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00T" + + "\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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|k" + + "p\x00\x00\x00\x00N\xb6\"`\x00\x00\x00\x00O\\Mp\x00\x00\x00\x00P\x96\x04`\x00\x00\x00\x00QN\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\x97" + - "w \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\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x1c\x00America/Blanc-SablonUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x06\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff^=9\f\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\x02\x01\x02\x03\x04\x02\xff\xff\xcat\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\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00" + - "\x0f\x00\x1c\x00America/PhoenixUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00A" + + "ST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/St_KittsUT\t\x00\x03" + + "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\b\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10" + + "\x00\x1c\x00America/BarbadosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x1c\x00America/AtikokanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p" + - "\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff\xaa\x1c\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\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xa1" + - "'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/CayenneUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZ" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff\xa9y$\xe5\xff\xff\xff\xff\xb8\x85c\xe5\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\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xc8\x1b\x00\x00\xff\xff" + + "\xc8\x1b\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\fLMT\x00BMT\x00ADT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8f\x19Ԇ\x12\x02\x00\x00" + + "\x12\x02\x00\x00\x16\x00\x1c\x00America/Bahia_BanderasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00\x0e|XQ\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x1c\x00A" + - "merica/NuukUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\"\x00\x00\x00\x03\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#3<-0" + - "2>,M3.5.0/-2,M10.5.0/-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x1c\x00Americ" + - "a/Santa_IsabelUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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\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\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" + + "\x00\x00\x00\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\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\u007f\x00\x00\x00\x00\x00@o\xce" + + "\x90\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\x01\x02\x01\x02\x01\x02\x01\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\x05\x02\xff\xff\x9dT\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10\xff\xff\xb9\xb0\x01\x14" + + "LMT\x00MST\x00CST\x00PST\x00MDT\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x1c\x00America/NuukUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "if3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\"\x00\x00\x00\x03\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#3<-02>,M3.5.0/-2,M10.5.0/-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb1݂" + + "x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x1c\x00America/Costa_RicaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Qa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c\x00America/ManausUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\u007fD\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfd" + + "N\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,\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\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x1c\x00America/WhitehorseUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfb\x1d_\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\x00Q3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/MarigotUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac" + + "\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x1c\x00Ame" + + "rica/Rankin_InletUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\x8cn\x00\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(w\xe0\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\x00" + + "8\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\x00" + + "E\xf3\xb7\x00\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\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\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CD" + + "T,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14\x00\x1c\x00America/Punta" + + "_ArenasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\a\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xfc\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\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 \u007f\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/b" + + "c\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\x00XC\x86\xb0\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\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\xba\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-03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xca" + + "g\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/GrenadaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST" + + "\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x1c\x00America/MenomineeUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\x00C" + + "ST\x00CWT\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x15\xc8\xcb\x00\xac\x00\x00" + + "\x00\xac\x00\x00\x00\x0e\x00\x1c\x00America/GuyanaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x98\xd9y\x88\x00\x00\x00\x00\n}\xb4<\x00\x00\x00\x00'\u007f\xfb0\x01\x02\x03\xff\xff\xc9x\x00\x00\xff" + + "\xff\xcbD\x00\x04\xff\xff\xd5\xd0\x00\n\xff\xff\xc7\xc0\x00\x0eLMT\x00-0345\x00-03\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xbf\xf5" + + "\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x1c\x00America/Buenos_AiresUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\x00" + + "7\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/Port_of_SpainUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff" + + "\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x1c\x00America/Monc" + + "tonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\b" + + "K\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\x00BO" + + "j|\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\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\x14L" + - "MT\x00MST\x00PST\x00PDT\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x1c\x00America/Boa_VistaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + + "\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\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,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q錴$q\x03\x00\x00q\x03\x00\x00\x13\x00\x1c\x00Americ" + + "a/Thunder_BayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x82,\xff\xff\xff\xff\x8f${\xe0\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\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\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\u007f`" + + "\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\xff\xff" + + "\xacT\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\nE" + + "ST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x1c\x00America/" + + "Blanc-SablonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xff^=9\f\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\x02\x01\x02\x03\x04\x02\xff\xff\xcat\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\n" + + "AST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x10\x00\x1c\x00America/MazatlanUT\t\x00\x03\xfc\xff\xe2_" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04" + + "\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00PST\x00MD" + + "T\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x1c\x00Amer" + + "ica/CaymanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x1c\x00America/DawsonUT\t\x00\x03\xfc\xff\xe2_" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ې\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 \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\x00Q4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x8f\x19Ԇ\x12\x02\x00\x00\x12\x02\x00\x00\x16\x00\x1c\x00America/Bahia_Band" + - "erasUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\x01\x02\x01\x02\x01\x02\x01\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\x05\x02\xff\xff" + - "\x9dT\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10\xff\xff\xb9\xb0\x01\x14LMT\x00MST\x00CST\x00PST\x00MDT\x00CDT\x00\nC" + - "ST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x1c\x00America/" + - "Indiana/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ \x17\x89}q\x01\x00\x00q\x01" + - "\x00\x00\x15\x00\x1c\x00America/Indiana/VevayUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\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\x00ED5" + + "P\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf7\xe9 y\xbd\x02\x00\x00\xbd" + + "\x02\x00\x00\x0e\x00\x1c\x00America/InuvikUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0\x06N\x80\xff\xff\xff\xff\xf7/h\x80\xff\xff\xff\xff\xf8(\x94\x00\x00\x00\x00\x00\x11\x89\x90 \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\u007f\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\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\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\x8f\x80\x00\t\xff\xff\x9d\x90\x00\r\xff\xff\xab\xa0\x01\x11-00\x00PDDT\x00PST\x00MS" + + "T\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x1c\x00" + + "America/North_Dakota/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + + "K\x97QR\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x1c\x00America/North_Dakota/New_SalemUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x00" + + "3Gf\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\u007f\x00\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00" + + "A\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\x00M" + + "DT\x00MST\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x1c\x00America/North_Dakota/CenterUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x02" + + "w\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\x00MDT\x00MS" + + "T\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7.\xb6*" + + "\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x1c\x00America/North_Dakota/BeulahUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\xe8" + + "X\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\u007f\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\x00MP" + + "T\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b\vKdC\x03\x00\x00C\x03\x00\x00\x13\x00\x1c\x00" + + "America/Rainy_RiverUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x87(\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ" + + "\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\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\x13i" + + "V\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\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\xff\xff\xa7X\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\x10LM" + + "T\x00CDT\x00CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x14\xc1r8" + + "\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x1c\x00America/AtikokanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8" + + "\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff\xaa\x1c\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\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf8Dz\x97\xae\x01" + + "\x00\x00\xae\x01\x00\x00\x11\x00\x1c\x00America/Boa_VistaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xd2a\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\x00ED" + - "C`\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\n\x00\x00\x00\x00\x00\x0e|XQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x1c\x00America/Indiana/Indianapol" + - "isUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd8G" + - "p\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ݩ\x90" + - "p\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\nES" + - "T5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x1c\x00America/I" + - "ndiana/WinamacUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00" + - "\x00\x00\x00\x00\x0e|XQصK\xa6\n\x02\x00\x00\n\x02\x00\x00\x19\x00\x1c\x00America/Indiana/Tell_CityUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x01\xd8N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x1c\x00America/Indiana/PetersburgUT\t\x00\x03" + - "\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\x14LM" + - "T\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ" + - "\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x1c\x00America/Indiana/VincennesUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\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\u007f\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\x00" + - "E\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\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00E" + - "DT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x1c\x00Ame" + - "rica/Indiana/KnoxUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQM/U\x9f7" + - "\x02\x00\x007\x02\x00\x00\x17\x00\x1c\x00America/Indiana/MarengoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\xf9" + - "p\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`\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\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\n\x00\x00\x00\x00\x00\x0e|XQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x1c\x00A" + - "merica/IndianapolisUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\u007f\xe0\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1" + + "B@\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\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-04\x00\n<-" + + "04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x1c\x00America/MartiniqueUT\t\x00\x03\xfc\xff" + + "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xff" + + "i\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\x00" + + "FFMT\x00AST\x00ADT\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/Ada" + + "kUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\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\xff" + + "s`\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\x00" + + "BDT\x00AHST\x00HDT\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QU9#\xbe2\x05\x00\x00" + + "2\x05\x00\x00\x11\x00\x1c\x00America/VancouverUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Porto_AcreUT\t\x00\x03\xfc\xff\xe2_" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00\x00\x00R\u007f" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x1c\x00America/New_Y" + + "orkUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x9c" + + "Qp\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\x9e" + + "Mp\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cd" + + "a`\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\x00E" + + "ST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00" + + "\x00\x0e\x00\x1c\x00America/RecifeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc0" + - "s\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\x00CW" + - "T\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x10\x00\x1c\x00America/DominicaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST" + - "4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x1c\x00America/Argentina/UT\t\x00\x03\xec,\x94_\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Arge" + - "ntina/SaltaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\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\xde" + + "t \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\xe9\x0f\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x003\nPK\x03\x04\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Qd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x1c\x00America/AsuncionUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + + "3\x0f\xb2\xb0\x00\x00\x00\x0047\x10\xc0\x00\x00\x00\x004\xf8\xcf0\x00\x00\x00\x006\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\x00" + + "Aq\xee@\x00\x00\x00\x00B3\xac\xb0\x00\x00\x00\x00CQ\xd0@\x00\x00\x00\x00D\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\x00" + + "O\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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x1c\x00America/Port-au-PrinceUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00Q3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x1c\x00America/BoiseUT\t\x00\x03\xfc\xff\xe2_" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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*\xea" + + "T\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\u007f\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\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\n\x00\x00\x00\x00\x00\xb8K\x97QJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x1c\x00America/PangnirtungUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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)\xff\xff\xff\xff\xa3\xd5R\x80\xff\xff" + + "\xff\xffˈ\xe2`\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xf7/0@\xff\xff\xff\xff\xf8([\xc0\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\x18`\x00\x00\x00\x001g" + + "g\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?\x9b" + + "b\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\x03\x01" + + "\x02\x03\x04\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\x06\a\x06\a\x06\a\x06\a\x06\b\t\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\x00" + + "\x00\x00\x00\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x01\x15\xff\xff\xc7\xc0\x01\x19\xff\xff\xb9\xb0\x00\x1d\xff\xff\xab\xa0\x00!\xff\xff\xb9\xb0\x01%-" + + "00\x00AWT\x00APT\x00AST\x00ADDT\x00ADT\x00EDT\x00EST\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11." + + "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x1c\x00America/GodthabUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\"\x00\x00\x00\x03\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#3<-02>,M3.5.0/-2,M10.5.0/-" + + "1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x1c\x00America/NassauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x937B\x8a\xff\xff\xff" + + "\xff\xcb\xf4\xefP\xff\xff\xff\xff\xd0\xfaG\xc0\xff\xff\xff\xff\xd1#4P\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2x\x9a\xc0\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Z" + + "p\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\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\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\xff\xff\xb7v\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\x00EWT\x00EST\x00EPT\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/RosarioUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/St_BarthelemyUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x93" + + "73\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x1c\x00" + + "America/PhoenixUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x04,2" + + "h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x1c\x00America/SantaremUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x1c\x00America/MetlakatlaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\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\x00PST\x00PWT\x00PPT\x00PDT\x00AKST\x00AKDT\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x1c\x00America/AraguainaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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<-0" + + "3>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x1c\x00America/DenverUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\x00MD" + + "T\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00" + + "\xc4\x02\x00\x00\x0f\x00\x1c\x00America/CordobaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9c" + + "50\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q?\xc9\x1c\xd4\xc6\x03\x00" + + "\x00\xc6\x03\x00\x00\x0e\x00\x1c\x00America/JuneauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x12y" + + "s\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\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/OjinagaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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\x01\x02\x01\x02\x01\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" + + "\xff\xff\x9e\x1c\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M" + + "3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x1c\x00America/Scoresby" + + "sundUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#1<+00>,M3.5.0/0,M10.5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x1c" + + "\x00America/JujuyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00America/EnsenadaUT" + + "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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\x00MST\x00PST\x00PDT\x00P" + + "WT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x1c" + + "\x00America/TorontoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\nES" + + "T5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qn\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x1c\x00America/N" + + "omeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xb8" + + "qP\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\u007f@\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\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\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\x00BS" + + "T\x00BDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x1c\x00America/Cambridge_BayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\t\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\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0\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\xe6\xfe\x00\x00\x00\x00\x00" + + "9\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\u007f\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\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\a\x06\b\a\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\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\xb9\xb0\x01\x10\xff\xff\xab\xa0\x01\x15\xff\xff\xb9\xb0\x01\x19\xff\xff\xab\xa0\x00\x1d\xff\xff\xb9\xb0\x00!-00\x00MWT\x00" + + "MPT\x00MST\x00MDDT\x00MDT\x00CDT\x00CST\x00EST\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x1c\x00America/CrestonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff^=p\xbc\xff\xff\xff\xff\x9b\xd6Kp\xff\xff\xff" + + "\xff\x9e\xf9;\x00\x01\x02\x01\xff\xff\x92\xc4\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00\bLMT\x00MST\x00PST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qq\xc9" + + "*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x1c\x00America/Puerto_RicoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x1c\x00America/CatamarcaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f \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\xc2" + + "T\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x1c\x00America/Coral_HarbourUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr" + + "\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff" + + "\xaa\x1c\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\nE" + + "ST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x1c\x00America/Argentina/UT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Ar" + + "gentina/SaltaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/B" + + "uenos_AiresUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd4" + + "\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\xd4" + "p0\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\xc7A" + "7\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'\xd0" + - "X\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQ\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00America/Argentina/Ush" + - "uaiaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x1c\x00America/Ar" + - "gentina/CatamarcaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 " + - "\x00\x1c\x00America/Argentina/ComodRivadaviaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f \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\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xfcz=\xe1\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/San_JuanUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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'͵\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQ\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/" + - "San_LuisUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc0" + - "Z\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\xd4" + - "Cd\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\n\x00\x00\x00\x00\x00\x0e|XQ\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e" + - "\x00\x1c\x00America/Argentina/Rio_GallegosUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\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\x00" + - "7\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\u007f \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\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e" + - "|XQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Argentina/JujuyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x8f" + - "0\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\x05l" + - "0\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQY\xd8֭\xd6\x02" + - "\x00\x00\xd6\x02\x00\x00\x19\x00\x1c\x00America/Argentina/TucumanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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=\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@\xcb\xd1@\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \x00\x00\x00\x00H\xfa\xa2\xb0\x00\x00\x00\x00I\xbc" + - "a \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\n\x00\x00\x00\x00\x00\x0e|XQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/Bue" + - "nos_AiresUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + - "G\xdc\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00Ameri" + - "ca/Argentina/CordobaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQm\aD\x0e\xcd\x02\x00\x00\xcd\x02" + - "\x00\x00\x1a\x00\x1c\x00America/Argentina/La_RiojaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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ɰ\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'!\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\u007f \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" + + "X\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\u007f \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\fL" + + "MT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00Ame" + + "rica/Argentina/UshuaiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9c5" + + "0\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfcz=\xe1\xcd\x02\x00\x00" + + "\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/San_JuanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/La_RiojaUT\t\x00\x03" + + "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ɰ\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\xd3" + + "6\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Ar" + + "gentina/San_LuisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ep\xb4c\xc4" + + "\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/Rio_GallegosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f \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\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\x0e|XQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00America/Argentina/MendozaUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00America/Argentina/CordobaUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + + "\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'\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQ\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x1c\x00America/La_PazUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x1bd\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-0" + - "4\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x1c\x00America/DawsonUT\t\x00\x03\xec" + - ",\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ې\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\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,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQU\xactA\xb5\x01\x00\x00\xb5" + - "\x01\x00\x00\x11\x00\x1c\x00America/MatamorosUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa2@\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\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/St_VincentUT\t" + - "\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\u0096dK~\x02\x00\x00~\x02\x00" + - "\x00\x0e\x00\x1c\x00America/ReginaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xb60" + - "H\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\x00M" + - "DT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00\x1c\x00Ameri" + - "ca/YellowknifeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97QutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Argentina/Juju" + + "yUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x1c\x00America/Argentina/CatamarcaUT\t\x00" + + "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x1c\x00America/Argentina/" + + "ComodRivadaviaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x19\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\xff\xff\xff\xff\xf7/Zp\xff\xff\xff" + - "\xff\xf8(\x85\xf0\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\u007f\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\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\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\xb9\xb0\x01\x10\xff\xff\xab\xa0" + - "\x01\x15-00\x00MWT\x00MPT\x00MST\x00MDDT\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\x1b\vKdC\x03\x00\x00C\x03\x00\x00\x13\x00\x1c\x00America/Rainy_RiverUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00J\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x87(\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff" + - "\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\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\x004" + - "R\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\x00B" + - "O\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\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\xff\xff\xa7X\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\n\x00\x00\x00\x00\x00\x0e|XQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x12\x00\x1c\x00America/KralendijkUT\t\x00\x03\xec,\x94_" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e" + - ".#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x1c\x00America/MonterreyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + - "\x01\x02\x01\x02\xff\xff\xa1\xf4\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\bLMT\x00CST\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x1c\x00America/JamaicaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00KMT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x1c\x00America/HavanaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\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 \xa5" + - "P\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\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ܩP\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\x00H" + - "MT\x00CDT\x00CST\x00\nCST5CDT,M3.2.0/0,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x82\x13z\xe2\xc2\x00\x00" + - "\x00\xc2\x00\x00\x00\x13\x00\x1c\x00America/TegucigalpaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa4LKD\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\x00" + - "CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00\x00\x00\x11\x00\x1c\x00America/GuayaquilUT\t" + - "\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f" + - "LMT\x00QMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x1c\x00Americ" + - "a/MetlakatlaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00V" + - "5\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\x00PST\x00PWT\x00PPT\x00PDT\x00A" + - "KST\x00AKDT\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ8\xcdZ\x05o\x01\x00\x00o\x01\x00" + - "\x00\x10\x00\x1c\x00America/MazatlanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b" + - "\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00PST\x00MDT\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00\x0e|XQHQ(\x9a~\x02\x00\x00~\x02\x00\x00\x0e\x00\x1c\x00America/BelizeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x007\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x93^ٰ\xff\xff\xff\xff\x9f\x9f;\xe0\xff" + - "\xff\xff\xff\xa0EQ\xd8\xff\xff\xff\xff\xa1\u007f\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\u007f?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\xc3" + - "X\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\xc1U\xe0\xff\xff\xff\xff\xcdp\xa6X\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\x01\x02\x03\x02\x03\x02\xff\xff" + - "\xadP\x00\x00\xff\xff\xb2\xa8\x01\x04\xff\xff\xab\xa0\x00\n\xff\xff\xb9\xb0\x01\x0eLMT\x00-0530\x00CST\x00CDT\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ" + - "$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x1c\x00America/Knox_INUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\xf8" + - "g\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\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x1c\x00America/CuiabaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x006 -@\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\x00N\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\x00E\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\xda" + - "\x92\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\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\n\x00\x00\x00\x00\x00\x0e|XQo_\x00v/" + - "\x01\x00\x00/\x01\x00\x00\x0e\x00\x1c\x00America/MeridaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xbb\xf1" + + "0\x00\x00\x00\x00@\xd5\v\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97QŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00" + + "America/Argentina/MendozaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\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\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\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\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00\x0e|XQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x1c\x00America/JujuyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\xbc" + - "S0\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+\x99" + - "W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQԾ\xe7#\x95\x00\x00\x00\x95" + - "\x00\x00\x00\x0e\x00\x1c\x00America/CaymanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x1c\x00America/Bele" + - "mUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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Ƞ\x02\x01\x02\x01" + - "\x02\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\n\x00\x00\x00\x00\x00\x0e|XQs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00\x1c\x00America/EirunepeUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00,\xc0\xd1P\x00\x00\x00\x00-f\xe0@" + - "\x00\x00\x00\x00H`\u007fP\x00\x00\x00\x00R\u007f\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10" + - "\x00\x1c\x00America/St_LuciaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\x0e|XQOKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x1c\x00America/BahiaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x1e" + - "xנ\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\xe30\x00\x00\x00\x00:" + - "\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00N\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\n\x00\x00\x00\x00\x00\x0e|XQ\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x1c\x00" + - "America/WhitehorseUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd2" + - "\x80\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\xfb\x1d_\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\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\x00" + - "D/\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\x10L" + - "MT\x00PDT\x00PST\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf7\xe9 " + - "y\xbd\x02\x00\x00\xbd\x02\x00\x00\x0e\x00\x1c\x00America/InuvikUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\xe0\x06N\x80\xff\xff\xff\xff\xf7/h\x80\xff\xff\xff\xff\xf8(\x94\x00\x00\x00\x00\x00\x11\x89" + - "\x90 \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.\xb3" + - "R\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\u007f\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\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\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\x8f\x80\x00\t\xff\xff\x9d\x90\x00\r\xff\xff\xab\xa0\x01\x11-00\x00PDDT\x00" + - "PST\x00MST\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb4T\xbd\xeb5\x02\x00\x005\x02" + - "\x00\x00\x16\x00\x1c\x00America/Port-au-PrinceUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\x00C" + - "dE@\x00\x00\x00\x00D/ZP\x00\x00\x00\x00ED'@\x00\x00\x00\x00O\\Mp\x00\x00\x00\x00P\x96\x04`\x00\x00\x00\x00Q3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb7-2f\xe4\x01" + - "\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/NoronhaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\x00" + + "8\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97QY\xd8֭\xd6" + + "\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x1c\x00America/Argentina/TucumanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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=\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@\xcb\xd1@\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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-0" + + "2\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x89غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x1c\x00America/BelizeUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\u007f?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\xb3" + + "X\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\xab7" + + "P\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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-0530\x00CST\x00CWT\x00CPT\x00CDT\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x1c\x00America/SitkaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\n" + + "0\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\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\x00PS" + + "T\x00PWT\x00PPT\x00PDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00" + + "\x00\x00\x00\x00\xb8K\x97QU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00\x1c\x00America/YellowknifeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x19\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\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0\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*\xea" + + "T\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\u007f\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" + + "\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\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\xb9\xb0\x01\x10\xff\xff\xab\xa0\x01\x15-00\x00MWT\x00MPT\x00MST\x00MDDT\x00MDT\x00\nMST" + + "7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x1c\x00America/In" + + "diana/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q \x17\x89}q\x01\x00\x00q\x01\x00\x00" + + "\x15\x00\x1c\x00America/Indiana/VevayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x002\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x1c\x00America/Buenos_AiresUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQ\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x1c\x00America/Los_AngelesUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdf" + - "\x89\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\u007f\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\x004" + - "S\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\x00B" + - "O\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\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x1c\x00America/El_SalvadorUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x1c\x00America/DenverUT\t\x00\x03\xec,\x94_" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\b" + - "v\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\x8d" + - "5\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\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQp\xb6{\xc9\x13" + - "\x02\x00\x00\x13\x02\x00\x00\x12\x00\x1c\x00America/Fort_WayneUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZi" + + "\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\xd2a\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x1c\x00America/Indiana/VincennesUT\t" + + "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\u007f\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\x00" + + "D/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\x00CDT\x00C" + + "ST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QM/U" + + "\x9f7\x02\x00\x007\x02\x00\x00\x17\x00\x1c\x00America/Indiana/MarengoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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`\xfdp\x00\x00\x00\x00\x05" + + "P\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\x00E" + + "ST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x1c" + + "\x00America/Indiana/WinamacUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11." + + "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x1c\x00America/Indiana/KnoxUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc3" + + "p\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\nCST6C" + + "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x1c\x00America/Indi" + + "ana/IndianapolisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5" + + "U\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\xe3" + + "I6p\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\x00C" + + "PT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QصK\xa6\n\x02\x00\x00\n\x02\x00" + + "\x00\x19\x00\x1c\x00America/Indiana/Tell_CityUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\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\u007f\xa5p\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf4_\x87" + + "p\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\x00" + + "CWT\x00CPT\x00EST\x00EDT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x01\xd8N\x8c\xab\x02" + + "\x00\x00\xab\x02\x00\x00\x1a\x00\x1c\x00America/Indiana/PetersburgUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\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\u007f\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\x00E" + + "ST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x1c\x00Ame" + + "rica/FortalezaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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!\x81i" + + "0\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\x003\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x1c\x00America/AnchorageUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\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\x00" + + "9\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\nAKST9AK" + + "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x1c\x00America/Danm" + + "arkshavnUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x1c\x00America/Campo_GrandeUT\t" + + "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + + "8\xb8\x930\x00\x00\x00\x009\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00N\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\x00" + + "G\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\x00TC7@\x00\x00\x00\x00" + + "T\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/Domin" + + "icaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13" + + "\x02\x00\x00\x13\x02\x00\x00\x12\x00\x1c\x00America/Fort_WayneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\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" + @@ -1626,180 +1527,812 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00 "\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\x00" + - "CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x1c\x00America/Kentucky/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x1c\x00America/Kentucky/Louisville" + - "UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x02" + - "w\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\u007f`\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\x00EDT\x00\nEST5EDT,M3.2." + - "0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x1c\x00America/Kentucky/Mon" + - "ticelloUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\u007f`\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\x00C" + - "DT\x00CST\x00CWT\x00CPT\x00EDT\x00EST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x1c\x00America/North_Dakota/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQR\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x1c\x00America/North_Dakota/New" + - "_SalemUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "Y\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\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\u007f\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\nCST6CDT,M3.2.0,M11." + - "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x1c\x00America/North_Dakota/Cente" + - "rUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "8\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\x00MDT\x00MST\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x1c\x00America/North_Dakota/BeulahUT\t\x00" + - "\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd2" + - "a\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\x16" + - "9)\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\x002" + - "s\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\u007f\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\x14L" + - "MT\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|X" + - "QM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x1c\x00America/Glace_BayUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\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\xdd" + - "P\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\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\x00ED5" + - "P\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\x10LM" + - "T\x00ADT\x00AST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7" + - "\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/MontserratUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AS" + - "T\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x1c\x00America/TorontoUT\t\x00\x03\xec," + - "\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xff" + - "r\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00" + - "@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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" + + "CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Rio_BrancoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\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\xf8" + + "QHP\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`\u007fP\x00\x00\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x1c\x00America/TegucigalpaUT\t\x00\x03\xfc\xff\xe2_" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa4L" + + "KD\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13" + + "\x00\x1c\x00America/Mexico_CityUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\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\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ϷV" + + "P\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10LM" + + "T\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a" + + "\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x1c\x00America/TijuanaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\xf6\x80\xff\xff\xff\xff\xa9yOp\xff\xff\xff\xff\xaf\xf2|\xf0\xff\xff\xff\xff\xb6f" + + "dp\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\xf2" + + "3\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\x13i" + + "r \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\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x1c\x00America/CancunUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + + "\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\x00T\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x1c\x00America/Swift_CurrentUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\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\x14LM" + + "T\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x1c\x00Am" + + "erica/CuiabaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xda" + + "8\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\x009\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00N\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\x00E\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\x00TC7@\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-0" + + "3\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/MendozaU" + + "T\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x1c\x00America/St_John" + + "sUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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\x00" + + "9\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\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\x00" + + "G\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\x00N" + + "DT\x00NST\x00NPT\x00NWT\x00NDDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Qo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x1c\x00America/MeridaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\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\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\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\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\nCST6CDT,M4.1.0,M10.5." + + "0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x1c\x00America/ResoluteUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5\xfb\x81\x80\xff" + + "\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(w\xe0\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\x004" + + "R\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\x00B" + + "O\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9" + + "\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x1c\x00America/ArubaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff" + + "\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00" + + "America/HalifaxUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xdc" + + "4\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\u007fU0\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\xb7N" + + "B@\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\u007f\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\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\x00A" + + "ST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QԾ\xe7#\x95\x00\x00\x00\x95\x00\x00" + + "\x00\x0e\x00\x1c\x00America/PanamaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bLM" + + "T\x00CMT\x00EST\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/Anguil" + + "laUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9bܩ=\xda\x06" + + "\x00\x00\xda\x06\x00\x00\x0f\x00\x1c\x00America/ChicagoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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,M" + + "11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x1c\x00America/JamaicaUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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`\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x1c\x00America/IndianapolisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x1c\x00America/CaracasUT\t\x00\x03\xfc\xff" + + "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xff" + + "i\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x1c" + + "\x00America/LimaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QB\xa0=:\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x1c\x00Americ" + + "a/HermosilloUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ڀ\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\xff\xff\x97\xf8\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10" + + "LMT\x00MST\x00CST\x00PST\x00MDT\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x1c\x00Amer" + + "ica/BelemUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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Ƞ\x02\x01\x02\x01\x02\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\n\x00\x00\x00\x00\x00\xb8K\x97QM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x1c\x00America/Glace_BayUT" + + "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\"\x1b" + + "P\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\xce" + + "P\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\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,M1" + + "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/GuadeloupeUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00" + + "\x1c\x00America/ShiprockUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xe0\xa1" + + "\x90\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\xdf" + + "\x90\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\xda" + + "\x80\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97QU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x1c\x00America/MatamorosUT\t\x00\x03" + + "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00Cd" + + "op\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\xa2@\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6@\rm\xa8\x05" + + "\x00\x00\xa8\x05\x00\x00\x13\x00\x1c\x00America/Fort_NelsonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\x00" + + "5'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\x00" + + "Cd\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\x00" + + "QN\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d\xf7\a ,\x06\x00\x00" + + ",\x06\x00\x00\x11\x00\x1c\x00America/Goose_BayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\u007f\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\x00ED\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\x00" + + "I\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\x00NST\x00NDT\x00NPT\x00NWT\x00ADT\x00AST\x00ADDT\x00\nAST4ADT,M3" + + ".2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x12\x00\x1c\x00America/Kralendij" + + "kUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x1c\x00America/Santa_IsabelUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6" + + "\x80\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\x00MST\x00PST\x00PDT\x00PWT\x00PPT\x00\n" + + "PST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02\x00\x00\x0f\x00\x1c\x00America" + + "/IqaluitUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xccl\xa1\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xf7/>P\xff\xff\xff\xff\xf8(i\xd0\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\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00E" + + "DC`\x00\x00\x00\x00E\xf3\xa8\xf0\x05\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\x06\a\x02\x04\x02" + + "\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xc7\xc0\x01\x11\xff\xff\xc7\xc0\x01\x15\xff\xff\xab\xa0\x00\x19\xff\xff\xb9\xb0\x01\x1d-" + + "00\x00EPT\x00EST\x00EDDT\x00EDT\x00EWT\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x1c\x00America/EdmontonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x00\x00\x00\x00\x00\x0e|XQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x1c\x00America/PanamaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xef\xf0R\x8a\xc4\x02\x00" + - "\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/CordobaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQ\xdf\xe5\x8d\xc4\xda\x04" + - "\x00\x00\xda\x04\x00\x00\x12\x00\x1c\x00America/LouisvilleUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xde" + - "\xbey\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" + + "\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\nMST" + + "7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x1c\x00America/Bo" + + "gotaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+\xbe]@\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x1c" + + "\x00America/GuatemalaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xe4" + + "P\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\b" + + "LMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x1c\x00America/Detr" + + "oitUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f`\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\x00EP" + + "T\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qp\x1b\xceRC\x03\x00\x00C\x03\x00\x00\x0f\x00\x1c\x00" + + "America/NipigonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x81@\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xc8\xf8IP\xff\xff\xff\xffˈ\xf0p\xff\xff" + + "\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\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\xd9" + + "\xa2\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)\n" + + "U\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\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00ED" + + "C`\x00\x00\x00\x00E\xf3\xa8\xf0\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\xff\xff\xad@\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00" + + "\x82\x00\x00\x00\x12\x00\x1c\x00America/MontserratUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nA" + + "ST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00\x1c\x00America/MiquelonUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x1c\x00Am" + + "erica/Sao_PauloUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0T" + + "3 \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!\x81" + + "i0\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\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00N\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\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\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\xd4" + + "L\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\n\x00\x00\x00\x00\x00\xb8K\x97Q[Sp\x90\x02\x05\x00\x00\x02\x05\x00" + + "\x00\x10\x00\x1c\x00America/SantiagoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xc6\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff" + + "\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\x1bɰ\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 \u007f\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\x00" + + "3=\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\x00" + + "Ah\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\x00" + + "O\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\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x03" + + "\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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\n\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x1c\x00America/Knox_INUT\t\x00" + + "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd2" + + "a\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\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\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\nCST" + + "6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x1c\x00America/La" + + "_PazUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x1bd\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\fLM" + + "T\x00CMT\x00BST\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x1c\x00America/" + + "Lower_PrincesUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-043" + + "0\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x1c\x00America/ChihuahuaU" + + "T\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c\x8c\x00\x00\xff" + + "\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M4.1.0,M" + + "10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x1c\x00America/WinnipegUT\t\x00\x03\xfc\xff" + + "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + + "d䰔\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\x00" + + "4R\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\u007f\x00\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00" + + "BO\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\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x1c\x00America/ParamariboUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00\x00\x00\x11\x00\x1c\x00America/Guay" + + "aquilUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00" + + "\x1c\x00America/St_ThomasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x1c\x00America/MontevideoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007fy\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\u007f\x87\xa0\x00\x00\x00\x00" + + "\x0e\xe7\u007f0\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\x00D\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\x00" + + "L\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\x00RP\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-0" + + "230\x00-02\x00-0130\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/" + + "St_LuciaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + ",\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x1c\x00America/YakutatUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\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\x03q" + + "6\xa0\x00\x00\x00\x00\x04a5\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\x12y\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,\xd3" + + "\x8c\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\x00YDT\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae" + + ",\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/AtkaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\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\nHST10HDT,M3.2.0,M11." + + "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x1c\x00America/El_SalvadorUT\t\x00\x03\xfc\xff" + + "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + + "MT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/Noron" + + "haUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x002\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00" + + "\x0f\x00\x1c\x00America/ManaguaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\"\x12\xfe" + + "\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x1c\x00America/Los_AngelesUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\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\xf2" + + "3\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\u007f\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\x13i" + + "r \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\n\x00\x00\x00\x00\x00\xb8K\x97Qs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10" + + "\x00\x1c\x00America/EirunepeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xde" + + "\x90@\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\x00,\xc0\xd1P\x00\x00\x00\x00-f\xe0@\x00\x00\x00\x00H`\u007fP\x00\x00\x00\x00R\u007f\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x1c\x00America/Dawson_CreekUT\t\x00\x03\xfc\xff" + + "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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\x14LMT\x00PDT\x00PST\x00PWT\x00PPT\x00MST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\xe5" + + "\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x1c\x00America/LouisvilleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\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\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\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00E" + + "DC`\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\x00CS" + + "T\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0" + + "\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/CuracaoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04" + + "\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x1c\x00Amer" + + "ica/MonterreyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x00" + + "3GX\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xa1\xf4\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\bLM" + + "T\x00CST\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x11\x00\x1c\x00America/Kentucky/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x1c\x00America/Kentucky/MonticelloUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x94" + + "p\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\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\u007f`\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\x00ES" + + "T\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x1c\x00Amer" + + "ica/Kentucky/LouisvilleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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`\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)\xde" + + "\xa5p\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\u007f`\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\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e" + + "\x00\x1c\x00America/HavanaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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ܩP\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\x00" + + "M\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\nCST5C" + + "DT,M3.2.0/0,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x1c\x00America/" + + "MontrealUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xc6" + + "M|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\u007f\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" + "\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\x00CW" + - "T\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd0v\x01\x8a\x01\x04\x00\x00" + - "\x01\x04\x00\x00\x10\x00\x1c\x00America/EnsenadaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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\x00E" + - "Dm\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\n\x00\x00\x00\x00\x00\x0e|XQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x1c\x00America/ShiprockUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\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\xf8" + - "u\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\x003G" + - "f\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\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQ$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f" + - "\x00\x1c\x00America/OjinagaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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\x01\x02\x01\x02\x01\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\xff\xff\x9e\x1c\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f" + - "\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x1c\x00America/ThuleUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\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\x00" + - "0\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\b" + - "LMT\x00ADT\x00AST\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00" + - "\x00\x00\x0f\x00\x1c\x00America/CaracasUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "W%\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x1c\x00America/AraguainaUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x009\xdf\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00" + - "\x00N\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\n\x00\x00\x00\x00\x00\x0e|XQ\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x1c\x00America/Cambridge_BayUT\t" + - "\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xa1\xf2̀\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0\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\x00" + - "0\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\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\u007f\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\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\a\x06\b\a\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\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\xb9\xb0\x01\x10\xff\xff\xab\xa0\x01\x15\xff\xff\xb9\xb0\x01\x19" + - "\xff\xff\xab\xa0\x00\x1d\xff\xff\xb9\xb0\x00!-00\x00MWT\x00MPT\x00MST\x00MDDT\x00MDT\x00CDT\x00CST\x00EST\x00\nMST7MDT,M3" + - ".2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x1c\x00America/WinnipegU" + - "T\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf8" + - "g\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\x003G" + - "X\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\u007f\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" + + "\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\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\n\x00\x00\x00\x00\x00\x0e|XQ8\xa4]Q^\x03\x00\x00^\x03\x00\x00\x12\x00\x1c\x00America/Grand_TurkUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00M\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\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\u007f`\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\x00" + - "O\\Mp\x00\x00\x00\x00P\x96\x04`\x00\x00\x00\x00Q\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\x00AKD" + - "T\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12" + - "\x00\x1c\x00America/Costa_RicaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQn\xab\xd5\xf9\xcf" + - "\x03\x00\x00\xcf\x03\x00\x00\f\x00\x1c\x00America/NomeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03q" + - "R\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\u007f@\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,\xd3" + - "\x8c\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\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,M1" + - "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/GrenadaUT\t\x00\x03\xec,\x94_" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x937" + - "3\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x1c\x00A" + - "merica/St_JohnsUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00America/VirginUT\t" + + "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QP\x0f(\b=\x01\x00\x00=\x01\x00" + + "\x00\x15\x00\x1c\x00America/Santo_DomingoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fH\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x1c\x00Antarctica/UT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x1c\x00Antarctica" + + "/DumontDUrvilleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xb5f" + - "b\\\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\u007f\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\xc0" + - "RX\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)\xde" + - "tt\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\x84Nd\x00\x00\x00\x00BOct\x00\x00\x00\x00Cd0d\x00\x00\x00\x00D/Et\x00\x00\x00\x00ED\x12d\x00\x00\x00\x00E\xf3" + - "w\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\x00NPT\x00NWT\x00NDDT\x00\nNST3:30NDT,M3.2.0,M11.1.0" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/AtkaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\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}\x87" + - "Z^\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\x8d" + - "m\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\u007f@\x00\x00\x00\x00\x15I~P\x00\x00\x00\x00\x169" + - "a@\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\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\xff" + - "s`\x01\x14\xff\xffs`\x00\x18\xff\xff\x81p\x01\x1d\xff\xffs`\x00\x19LMT\x00NST\x00NWT\x00NPT\x00BST\x00BDT\x00AHST\x00HDT\x00\nHST1" + - "0HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x1c\x00America/As" + - "uncionUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "O\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\xc8" + - "\xb0\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\x006\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\x00D\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>,M" + - "10.1.0/0,M3.4.0/0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQB\xa0=:\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x1c\x00America/Herm" + - "osilloUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ڀ\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\xff\xff\x97\xf8\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00MS" + - "T\x00CST\x00PST\x00MDT\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x1c\x00America/Ti" + - "juanaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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\x00" + - "2s$\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\x00PS" + - "T\x00PDT\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x0f\x00\x1c\x00America/MarigotUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ?\xc9\x1c\xd4\xc6\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x1c\x00America/JuneauUT\t\x00\x03\xec,\x94_\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "2s2\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\x81" + - "p\x00\x18\xff\xff\x8f\x80\x01\x1c\xff\xff\x81p\x00!LMT\x00PST\x00PWT\x00PPT\x00PDT\x00YDT\x00YST\x00AKDT\x00AKST\x00\nAKST9A" + - "KDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x1c\x00America/Mon" + - "tevideoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f" + - "y\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\xf2" + - "5(\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\xdb" + - "s \x00\x00\x00\x00\r\x1a\x120\x00\x00\x00\x00\r\u007f\x87\xa0\x00\x00\x00\x00\x0e\xe7\u007f0\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\x00D\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\xb3" + - "B\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\x00RP\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 LM" + - "T\x00MMT\x00-04\x00-0330\x00-03\x00-0230\x00-02\x00-0130\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe90" + - "T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x1c\x00America/GodthabUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZi" + - "f3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\"\x00\x00\x00\x03\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" + - "#3<-02>,M3.5.0/-2,M10.5.0/-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7" + - "\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/GuadeloupeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AS" + - "T\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00\x1c\x00America/MaceioUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x003\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQJtZ\x8c" + - "\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x1c\x00America/PangnirtungUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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)\xff\xff\xff\xff\xa3\xd5R\x80\xff\xff\xff\xffˈ\xe2`\xff\xff\xff\xff\xd2#\xf4p\xff\xff" + - "\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xf7/0@\xff\xff\xff\xff\xf8([\xc0\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\x18`\x00\x00\x00\x001gg\xf0\x00\x00\x00\x002r\xfa`\x00\x00\x00\x003G" + - "I\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" + - "\u007f`\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\x03\x01\x02\x03\x04\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\x06\a\x06\a\x06\a\x06\a\x06\b\t\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\x00\x00\x00\x00\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xd5\xd0\x01" + - "\b\xff\xff\xc7\xc0\x00\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x01\x15\xff\xff\xc7\xc0\x01\x19\xff\xff\xb9\xb0\x00\x1d\xff\xff\xab\xa0\x00!\xff\xff\xb9\xb0\x01%-00\x00AWT\x00APT\x00AST\x00A" + - "DDT\x00ADT\x00EDT\x00EST\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|" + - "XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/St_KittsUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LM" + - "T\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xdf\b\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10\x00\x1c\x00America/BarbadosUT" + - "\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "\x10\xff\xff\xff\xff\xa9y$\xe5\xff\xff\xff\xff\xb8\x85c\xe5\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\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xc8\x1b\x00\x00\xff\xff\xc8\x1b\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\fLMT\x00B" + - "MT\x00ADT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02\x00\x00\x0f\x00\x1c\x00America/Iqalu" + - "itUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xccl\xa1\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xf7/>P\xff\xff\xff\xff\xf8(i\xd0\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\u007f`\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\x05\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\x06\a\x02\x04\x02\x04\x02\x04\x02\x04\x02" + - "\x04\x02\x04\x02\x04\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xc7\xc0\x01\x11\xff\xff\xc7\xc0\x01\x15\xff\xff\xab\xa0\x00\x19\xff\xff\xb9\xb0\x01\x1d-00\x00EPT" + - "\x00EST\x00EDDT\x00EDT\x00EWT\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQ8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x1c\x00America/MenomineeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x003GX\x00\x00\x00\x00\x00" + - "4R\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\x00" + - "BO\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\nC" + - "ST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x1c\x00America/" + - "MartiniqueUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01" + - "\x00\x00\x13\x00\x1c\x00America/Mexico_CityUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\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\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01" + - "\x10LMT\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x1c" + - "\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x1c\x00America/Swift_CurrentUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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\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\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\x00MP" + - "T\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00\x1c\x00America/MiquelonUT" + - "\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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+\xbek" + - "P\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\n\x00\x00\x00\x00\x00\x0e|XQ\x19vv\xa0\x97\x00\x00\x00\x97\x00" + - "\x00\x00\x0f\x00\x1c\x00America/CuracaoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\n" + - "LMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x1c\x00America/Da" + - "wson_CreekUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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\x14LMT\x00PDT\x00PST\x00PWT\x00PPT\x00MST\x00\nMST7" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/MendozaUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\x0e|XQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/AdakUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\n\x00\x00\x00\x00\x00\x0e|XQ錴$q\x03\x00\x00q\x03\x00\x00\x13\x00\x1c\x00America/T" + - "hunder_BayUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x82,\xff\xff\xff\xff\x8f${\xe0\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\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\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\xce" + - "p\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\u007f`\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\xff\xff\xacT\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\nEST5" + - "EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x1c\x00America/Aru" + - "baUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x02\x00\x00\x00\b\xff\xff\xff\xffԼv\x80\xff\xff\xff\xff\xde4``\xff\xff\xff\xff\xe7<\x02\x80\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xa0\x00\x04-00" + + "\x00+10\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\r\x0e\xf20\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Antarctica/Syow" + + "aUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\xb1X\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00*0\x00\x04-00\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xea\x06\xd3" + + "\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x1c\x00Antarctica/DavisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x1c\x00Antarctica/Palmer" + + "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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 \u007f\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\x00B" + + "3\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\x00P" + + "B\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x1c\x00Antarctica/Maws" + + "onUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf6@\rm\xa8\x05\x00\x00\xa8\x05\x00\x00\x13\x00\x1c\x00America/Fort_NelsonUT\t\x00\x03\xec,\x94_\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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\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\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\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\x00AKD" + - "T\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10" + - "\x00\x1c\x00America/AnguillaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\x0e|XQk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x1c\x00America/DanmarkshavnUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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#@\x00\x00\x00\x00\x1ep\xfc\xb0\x00\x00\x00\x00\x1f\x8f @\x00\x00\x00\x00 \u007f\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\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\n\x00\x00" + - "\x00\x00\x00\x0e|XQ\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x1c\x00Antarctica/DavisUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00F" + - "P\x00\b-00\x00+07\x00+05\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x1c\x00Antarc" + - "tica/RotheraUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + - "\x00\x00\x0e|XQ\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x1c\x00Antarctica/VostokUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe9X\x89\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00T" + - "`\x00\x04-00\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\r\x0e\xf20\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Antarctica" + - "/SyowaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\xb1X\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00*0\x00\x04-00\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x1c\x00Antarctica/DumontDUrvilleUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\x02\x00\x00\x00\b\xff\xff\xff\xffԼv\x80\xff\xff\xff\xff\xde4`" + - "`\xff\xff\xff\xff\xe7<\x02\x80\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xa0\x00\x04-00\x00+10\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQb\xb2\xaf\xf7" + - "\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x1c\x00Antarctica/McMurdoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZ" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97QƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x1c\x00Antarctica/RotheraUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x1c\x00" + + "Antarctica/VostokUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe9X\x89\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00T`\x00\x04-00\x00+06\x00\n<+06>-6\nPK" + + "\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x1c\x00Antarctica/South_PoleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q:\xc8P7\xb1\x00" + + "\x00\x00\xb1\x00\x00\x00\x10\x00\x1c\x00Antarctica/TrollUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x1c\x00Antarctica/CaseyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\f\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xfe\x1è\x00\x00\x00\x00J\xda\x06 \x00\x00\x00\x00" + + "K\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-00\x00+08\x00+11\x00\n<" + + "+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\x84J]\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x1c\x00Antarctica/MacquarieUT" + + "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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Ā\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-0" + + "0\x00AEST\x00AEDT\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7" + + "\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x1c\x00Antarctica/McMurdoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\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" + @@ -2390,1356 +2459,1379 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\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-12" + - "NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x97\xd4#\xed\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x1c\x00Antarctic" + - "a/MacquarieUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 \xf0\xff\xff\xff\xff\xa0\x87\xb4`\xff\xff\xff\xff\xd7\fh\x00\xff\xff\xff\xff\xfb\xc2" + - "\x8d\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\x0046" + - "h\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\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\n" + - "\x00\x00\x00\x00\x00\x0e|XQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x1c\x00Antarctica/South_PoleUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00NZ" + - "MT\x00NZDT\x00\nNZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ:\xc8P7\xb1\x00\x00\x00\xb1" + - "\x00\x00\x00\x10\x00\x1c\x00Antarctica/TrollUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x1c\x00Antarctica/MawsonUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xddzAh\xf3\x00\x00\x00\xf3\x00\x00" + - "\x00\x10\x00\x1c\x00Antarctica/CaseyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "OC͐\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-00\x00+08\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00" + - "\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Arctic/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03" + - "\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x1c\x00Arctic/LongyearbyenUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffr\xee$l\xff\xff\xff" + - "\xff\x9b'\xe3\x00\xff\xff\xff\xff\x9b\xd4{`\xff\xff\xff\xffȷM`\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\xeb\xaf \x90\xff\xff\xff\xff\xec\xa8L\x10\xff\xff\xff\xff\xed\x98=\x10\xff\xff\xff\xff\xee\x88.\x10\xff\xff\xff\xff\xefx\x1f\x10\xff\xff\xff" + - "\xff\xf0h\x10\x10\xff\xff\xff\xff\xf1X\x01\x10\xff\xff\xff\xff\xf2G\xf2\x10\xff\xff\xff\xff\xf37\xe3\x10\xff\xff\xff\xff\xf4'\xd4\x10\xff\xff\xff\xff\xf5\x17\xc5\x10\xff\xff\xff\xff\xf6\x10\xf0\x90\xff\xff\xff\xff\xf7/\x06" + - "\x10\xff\xff\xff\xff\xf7\xf0Ґ\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#-5\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x1c\x00Asia/QostanayUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\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\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\x00" + - "8\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\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r\x00\x1c\x00Asia/CalcuttaU" + - "T\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nIS" + - "T-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/UrumqiUT\t\x00\x03\xec,\x94_\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x1c\x00A" + - "sia/KarachiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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<\xaf" + - "E\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\nP" + - "KT-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x1c\x00Asia/KhandygaUT\t\x00\x03\xec,\x94_\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x006" + - "2\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\x00C" + - "c\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\u007f\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+1" + - "1\x00\n<+09>-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/ThimbuUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00" + - "\x00\x00\x00\x00\x0e|XQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x1c\x00Asia/ThimphuUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQd%\x05\xd8\xe6\x02\x00\x00" + - "\xe6\x02\x00\x00\x10\x00\x1c\x00Asia/VladivostokUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\n\x00\x00\x00\x00\x00\x0e|XQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x1c\x00Asia/VientianeUT" + - "\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x1c\x00Asia/ShanghaiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\x0e|XQ\xb2\xb9\xf4\xb6" + - "R\x02\x00\x00R\x02\x00\x00\x0f\x00\x1c\x00Asia/Ulan_BatorUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x1c\x00Asia/AdenUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/MuscatUT\t\x00\x03\xec,\x94_\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Arctic/UT" + + "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x1c\x00Arct" + + "ic/LongyearbyenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffr\xee$l\xff\xff\xff\xff\x9b'\xe3\x00\xff\xff\xff\xff\x9b\xd4{`\xff\xff\xff\xffȷM`\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\xeb\xaf \x90\xff\xff\xff\xff\xec\xa8" + + "L\x10\xff\xff\xff\xff\xed\x98=\x10\xff\xff\xff\xff\xee\x88.\x10\xff\xff\xff\xff\xefx\x1f\x10\xff\xff\xff\xff\xf0h\x10\x10\xff\xff\xff\xff\xf1X\x01\x10\xff\xff\xff\xff\xf2G\xf2\x10\xff\xff\xff\xff\xf37\xe3\x10\xff\xff" + + "\xff\xff\xf4'\xd4\x10\xff\xff\xff\xff\xf5\x17\xc5\x10\xff\xff\xff\xff\xf6\x10\xf0\x90\xff\xff\xff\xff\xf7/\x06\x10\xff\xff\xff\xff\xf7\xf0Ґ\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x14\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x1c\x00Asia/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x1c\x00Asia/Hong_KongUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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/K" + + "8\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\x00JS" + + "T\x00\nHKT-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/MuscatUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x1c" + - "\x00Asia/DamascusUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r\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>\u007fp\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\u007fg" + - "\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\x8d" + - "p\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\"\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + - "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\"\b\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\tLMT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.5/0,M" + - "10.5.5/0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xba'\xa0z \x04\x00\x00 \x04\x00\x00\x0e\x00\x1c\x00Asia/JerusalemUT\t\x00\x03\xec," + - "\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\x00b\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xff" + - "V\xb6\xc2\xfa\xff\xff\xff\xff\x9e0E\x88\xff\xff\xff\xff\xc8Y\xb2\xe0\xff\xff\xff\xff\xcc\xe5\xc1P\xff\xff\xff\xffͬ\xfe\x00\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Ҋ\xc9p\xff\xff\xff\xff\xd3e\xb0\x80\xff\xff\xff\xff\xd4k\xe0\xd0\xff\xff\xff\xff\xd7Z\x14`\xff\xff\xff\xff\xd7\xdf\x1f\xc0\xff\xff\xff\xff\xd8/\xb5p\xff\xff\xff\xff" + - "\xd9\x1eF\xe0\xff\xff\xff\xff\xda\x10\xe8\xf0\xff\xff\xff\xff\xda\xeb\xb3\xe0\xff\xff\xff\xff۴4\x00\xff\xff\xff\xffܹ \xe0\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\xbeJ`\xff\xff\xff\xff\xe364\xd0\xff\xff\xff\xff\xe4\x9c\xf7\x00\xff\xff\xff\xff\xe5\x16\x16\xd0\xff\xff\xff\xff\xe6t\xd3\xe0\xff\xff\xff\xff" + - "\xe7\x11Ҁ\xff\xff\xff\xff\xe8'\xff\x00\xff\xff\xff\xff\xe8\xe8O\xd0\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\xe8\xaa\xe0" + - "\x00\x00\x00\x00\x14 \t\xe0\x00\x00\x00\x00\x1a\xf9t\xe0\x00\x00\x00\x00\x1b\x8d\x1c\xe0\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1d\x89\xf1\xd0\x00\x00\x00\x00\x1e\xcc\xff`\x00\x00\x00\x00\x1f`\x99P\x00\x00\x00\x00" + + "\xa8\x01\x00\x003\xd8\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x1c" + + "\x00Asia/TaipeiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5" + + "E\"\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\xe3" + + "w\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\x00" + + "CDT\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x1c\x00Asia/QatarUT\t\x00\x03\xfc\xff\xe2_" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x1c\x00Asia/NicosiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\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\x1f" + + "H\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x1c\x00Asia/GazaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\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\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" + + "3\x00\x00\x00\x00\x00\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\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\u007f\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\x001H\x96\xe0\x00\x00\x00\x002\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\x00" + - "J\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\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\n\x00\x00\x00\x00\x00\x0e|XQy\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/BruneiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x02\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xff\xad\x8a\x02D\xff\xff\xff\xff\xbagG\x88\x01\x02\x00" + - "\x00k\xbc\x00\x00\x00\x00ix\x00\x04\x00\x00p\x80\x00\nLMT\x00+0730\x00+08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb2\xb9\xf4\xb6R\x02" + - "\x00\x00R\x02\x00\x00\x10\x00\x1c\x00Asia/UlaanbaatarUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x01" + - "p\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\xceG|\xea\x13\x03\x00\x00\x13\x03\x00\x00\n\x00\x1c\x00Asia/AmmanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r\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\xc2P\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\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\x14" + - "LMT\x00+0730\x00+0820\x00+08\x00+09\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xba'\xa0z \x04\x00\x00 \x04\x00\x00\r" + - "\x00\x1c\x00Asia/Tel_AvivUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\x00b\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\xb2\xe0\xff\xff\xff\xff\xcc\xe5\xc1P\xff\xff\xff\xffͬ\xfe\x00\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Ҋ\xc9p\xff\xff\xff\xff\xd3e\xb0\x80\xff\xff\xff\xff\xd4k\xe0\xd0\xff\xff\xff\xff\xd7" + - "Z\x14`\xff\xff\xff\xff\xd7\xdf\x1f\xc0\xff\xff\xff\xff\xd8/\xb5p\xff\xff\xff\xff\xd9\x1eF\xe0\xff\xff\xff\xff\xda\x10\xe8\xf0\xff\xff\xff\xff\xda\xeb\xb3\xe0\xff\xff\xff\xff۴4\x00\xff\xff\xff\xffܹ \xe0\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\xbeJ`\xff\xff\xff\xff\xe364\xd0\xff\xff\xff\xff\xe4" + - "\x9c\xf7\x00\xff\xff\xff\xff\xe5\x16\x16\xd0\xff\xff\xff\xff\xe6t\xd3\xe0\xff\xff\xff\xff\xe7\x11Ҁ\xff\xff\xff\xff\xe8'\xff\x00\xff\xff\xff\xff\xe8\xe8O\xd0\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\xe8\xaa\xe0\x00\x00\x00\x00\x14 \t\xe0\x00\x00\x00\x00\x1a\xf9t\xe0\x00\x00\x00\x00\x1b\x8d\x1c\xe0\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1d" + - "\x89\xf1\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\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\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-2ID" + - "T,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x1c\x00Asia/Seoul" + - "UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xe6" + - "b\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\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\f" + - "LMT\x00KST\x00JST\x00KDT\x00\nKST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x1c\x00Asia/At" + - "yrauUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x1c\x00Asia/PyongyangUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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@\u007f\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\xb7\x11\xd0\x00\x00\x00\x00" + + "I\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\x00" + + "X\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`" + + "\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\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-2EEST,M3." + + "4.4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x1c\x00Asia/Barnaul" + + "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + + "\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\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" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x1c\x00Asia/SamarkandUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+0" + + "4\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00\x1c\x00Asia/BakuUT" + + "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xb8K\x97QѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x1c\x00Asia/TbilisiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x1c\x00Asia/HovdUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\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\x00C4B\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\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\x06\r\xed\xbd\x04\x00\x00\xbd\x04\x00\x00\v\x00\x1c\x00Asia/HebronUT\t\x00\x03\xec,\x94_\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\x00s\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xff}\xbdJ\x19\xff\xff\xff\xff" + - "\xc8Y\xb2\xe0\xff\xff\xff\xff\xcc\xe5\xc1P\xff\xff\xff\xffͬ\xfe\x00\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Ҋ\xc9p" + - "\xff\xff\xff\xff\xd3e\xb0\x80\xff\xff\xff\xff\xd4k\xe0\xd0\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\u007f\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\xe8\xaa\xe0\x00\x00\x00\x00\x14 \t\xe0" + - "\x00\x00\x00\x00\x1a\xf9t\xe0\x00\x00\x00\x00\x1b\x8d\x1c\xe0\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1d\x89\xf1\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@\u007f\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\x00" + - "J\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\x00TIlP\x00\x00\x00\x00U\x15\xd2\xe0\x00\x00\x00\x00V)\\`\x00\x00\x00\x00" + - "V\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`\x02\x01\x02\x01\x02\x01\x02\x01\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\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\x00IST\x00\nEET-2" + - "EEST,M3.4.4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia" + - "/KuwaitUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x1c\x00Asia/TomskUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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<\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\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\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\x00" + - "bp\x01\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x1c\x00A" + - "sia/ManilaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\xa2P\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\x11L" + + "MT\x00TBMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00A" + + "sia/RiyadhUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02" + - "\x00\x00\n\x00\x1c\x00Asia/ChitaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Qʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x1c\x00Asia/RangoonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\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<+063" + + "0>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x1c\x00Asia/YakutskUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00" + + "\x00\xb0\x04\x00\x00\r\x00\x1c\x00Asia/IstanbulUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\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\xa0" + + "p\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\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\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x1c\x00Asia/QyzylordaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\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\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\x000du" + + "P\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\t" + + "P\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x1c\x00Asia" + + "/KhandygaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "G\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00" + + "\x1c\x00Asia/KathmanduUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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@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\x00M\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\n\x00\x00\x00\x00\x00\x0e|XQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x1c\x00Asia/KatmanduUT\t" + - "\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xac\xf7\xf4\xc0\xab\x04\x00\x00\xab\x04\x00\x00\t\x00\x1c\x00Asia/GazaUT\t\x00\x03\xec,\x94_\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\x00q\x00\x00\x00\x05\x00\x00\x00\x15\xff\xff\xff\xff}\xbdJ\xb0\xff\xff\xff\xff" + - "\xc8Y\xb2\xe0\xff\xff\xff\xff\xcc\xe5\xc1P\xff\xff\xff\xffͬ\xfe\x00\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Ҋ\xc9p" + - "\xff\xff\xff\xff\xd3e\xb0\x80\xff\xff\xff\xff\xd4k\xe0\xd0\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\u007f\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\xe8\xaa\xe0\x00\x00\x00\x00\x14 \t\xe0" + - "\x00\x00\x00\x00\x1a\xf9t\xe0\x00\x00\x00\x00\x1b\x8d\x1c\xe0\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1d\x89\xf1\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@\u007f\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\xb7\x11\xd0\x00\x00\x00\x00I\xcb\xfa\xe0\x00\x00\x00\x00" + - "J\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\x00" + - "Xդ\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`\x02\x01\x02\x01\x02\x01\x02\x01" + - "\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\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-2EEST,M3.4.4/48,M10" + - ".4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x1c\x00Asia/SamarkandUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x1c\x00Asia" + - "/TaipeiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0" + - "Y\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\n" + - "CST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x1c\x00Asia/TashkentUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\fLM" + - "T\x00+05\x00+07\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\xea\x18\xd4\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x1c\x00Asia/Ye" + - "katerinburgUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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+0" + - "4\x00+06\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacauU" + - "T\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xf8" + - "I\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\n\x00\x00\x00\x00\x00\x0e|XQ\xd5ΜGp\x02\x00\x00" + - "p\x02\x00\x00\x0e\x00\x1c\x00Asia/QyzylordaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/" + + "ChongqingUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00C" + + "ST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x1c\x00Asia/Ho_Chi_MinhUT\t\x00" + + "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q0]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x1c\x00Asia/Bishk" + + "ekUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00E\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\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x1c\x00Asia/QostanayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\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\xac" + + "u\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x1c\x00Asia/KabulUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x1c\x00Asia/TomskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d?v\f" + + "\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacaoUT\t\x00\x03\xec" + - ",\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xf8" + - "p\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\xd1" + - "\xb8\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\n\x00\x00\x00\x00\x00\x0e|XQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n" + - "\x00\x1c\x00Asia/TokyoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00J" + - "DT\x00JST\x00\nJST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00\x1c\x00Asia/BakuUT\t\x00\x03\xec," + - "\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "5\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\x00" + - "Cd\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\x00" + - "QW|\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\n\x00\x00\x00\x00\x00\x0e|XQ\x87" + - "\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x1c\x00Asia/BarnaulUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + + "\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_\x96" + + "p\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@\xd0" + + "8\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\n\x00\x00\x00\x00\x00\xb8K\x97Qw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x1c\x00Asia/Ust-NeraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x1c\x00Asia/YerevanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + + "0d\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\u007f\xe0\x00\x00\x00\x00L̕`\x00\x00\x00\x00M\x8ea\xe0\x00\x00\x00\x00" + + "N\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\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x1c\x00Asia/VientianeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qd" + + "%\x05\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x1c\x00Asia/VladivostokUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\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)\xd4" + + "\x98\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\x05" + + "K\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x1c\x00Asia/Beir" + + "utUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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'\u007f" + + "\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\xd0" + + "P\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\tL" + + "MT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.0/0,M10.5.0/0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q?Y\xaf\x19" + + "\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DaccaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "bp\x01\x18LMT\x00HMT\x00+0630\x00+0530\x00+06\x00+07\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\xea\x18\xd4\xf8" + + "\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x1c\x00Asia/YekaterinburgUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "0duP\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\x00" + + "L̇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\n\x00\x00\x00\x00\x00\xb8K\x97Q6j\\J\xcf\x04\x00\x00\xcf" + + "\x04\x00\x00\v\x00\x1c\x00Asia/HebronUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00u\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\u007f" + + "\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'B" + + "P\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@\u007f\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\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`\x02\x01\x02" + + "\x01\x02\x01\x02\x01\x02\x01\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\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\x00IST\x00\nEET-2EEST,M3.4" + + ".4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x1c\x00Asia/ThimphuU" + + "T\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/ThimbuUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q)\x15" + + "II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x1c\x00Asia/SakhalinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x000d" + - "g@\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\xcc" + - "y@\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\x00b" + - "p\x01\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00\x1c\x00As" + - "ia/IstanbulUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\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\x1f" + - "8\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\x1b" + - "xp\x00\x00\x00\x008\xddD\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb\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\x00TL" + - "G\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf9l\x03\x12\xf8\x02\x00" + - "\x00\xf8\x02\x00\x00\f\x00\x1c\x00Asia/IrkutskUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "1]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\x00" + - "M\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\f" + - "LMT\x00IMT\x00+07\x00+09\x00+08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x1c\x00A" + - "sia/QatarUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00Asia/BahrainUT\t\x00\x03\xec,\x94_" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x1c\x00Asia/YangonUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x1c\x00Asia/YerevanUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + - "8\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\x00" + - "G#\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\u007f\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\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+0" + - "4>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x1c\x00Asia/AlmatyUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + + "\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\x18" + + "k\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\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\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\x10" + + "LMT\x00+09\x00+12\x00+11\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x1c\x00" + + "Asia/ChoibalsanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\x90\x00\x00\x00\x00?tb\x80\x00\x00\x00\x00@da\x90\x00\x00\x00\x00ATD\x80\x00\x00\x00\x00BD" + + "C\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\x00k" + + "X\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x1c\x00Asia/SeoulUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\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/p" + + "x\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\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\nK" + + "ST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Asia/MakassarUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x1c\x00Asia" + + "/DubaiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x1c\x00Asia/AlmatyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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<+0" + + "6>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x1c\x00Asia/Ulan_BatorUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xee" + + "L\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\x9a" + + "p\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x1c\x00Asia/SaigonUT\t\x00\x03\xfc\xff" + + "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DhakaUT\t" + + "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x1c\x00Asia/JayapuraU" + + "T\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x1c\x00Asia/Pyongya" + + "ngUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11" + + "\x00\x1c\x00Asia/Kuala_LumpurUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6U\xaa\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\xca" + + "\xb3\xe5`\xff\xff\xff\xffˑ_\b\xff\xff\xff\xff\xd2Hm\xf0\x00\x00\x00\x00\x16\x91\xf5\b\x01\x02\x03\x04\x05\x06\x05\a\x00\x00_V\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\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/ChungkingUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x1c\x00Asia/AqtobeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x1c\x00Asia/ChitaUT\t\x00\x03\xfc\xff" + + "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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@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\x00" + + "J\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\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x1c\x00Asia/ColomboUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\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<+053" + + "0>-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacaoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00\x00\x12\x00\x1c\x00Asi" + + "a/SrednekolymskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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+\xb4" + + "k\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\xee" + + "Yp\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x1c\x00Asia/BaghdadUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "8\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\n\x00\x00\x00\x00\x00\xb8K\x97Qe" + + "\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x1c\x00Asia/AshgabatUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+0" + + "5\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x1c\x00Asia/KamchatkaUT\t\x00\x03" + + "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00" + + "Asia/BahrainUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00Asia/BangkokUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x1c\x00Asia/KarachiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\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\xd2" + + "t\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+0" + + "530\x00+0630\x00+05\x00PKST\x00PKT\x00\nPKT-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x1c\x00" + + "Asia/TashkentUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "FP\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\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x1c\x00Asia/AdenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x1c\x00Asia/OmskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xed" + "P\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\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\fLM" + - "T\x00+05\x00+07\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x1c\x00Asia/Di" + - "liUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + - "MT\x00+08\x00+09\x00\n<+09>-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/Dacca" + - "UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+053" + - "0\x00+06\x00+07\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/Chongq" + - "ingUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nCS" + - "T-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x1c\x00Asia/Ust-NeraUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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<+1" + - "0>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x1c\x00Asia/MagadanUT\t\x00\x03\xec,\x94_\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x006" + - "1\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\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\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x1c\x00Asia/ColomboUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x1c\x00Asia/KrasnoyarskUT\t\x00\x03\xec,\x94_\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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.\x84w" + - "0\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\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\v" + - "0\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\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\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf0\x9cf>\xd7\x02\x00" + - "\x00\xd7\x02\x00\x00\x0e\x00\x1c\x00Asia/KamchatkaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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*\xc4" + - "l\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\n\x00\x00\x00\x00\x00\x0e|XQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x1c\x00Asia/Ujung_PandangUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00M" + - "MT\x00+08\x00+09\x00WITA\x00\nWITA-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x1c\x00Asia/J" + - "akartaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00b" + - "p\x00\x1cLMT\x00BMT\x00+0720\x00+0730\x00+09\x00+08\x00WIB\x00\nWIB-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\x1a\xdc\xca" + - "\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x1c\x00Asia/KolkataUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10" + - "LMT\x00HMT\x00MMT\x00IST\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00" + - "\x1c\x00Asia/KabulUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + + "T`\x01\f\x00\x00bp\x00\bLMT\x00+05\x00+07\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00" + + "\x00\x0f\x00\x1c\x00Asia/Phnom_PenhUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + + "MT\x00BMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17✳2\x04\x00\x002\x04\x00\x00\x0e\x00\x1c\x00Asia/Jerus" + + "alemUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\xcd" + + "\xac\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\xdc" + + "\xb9=\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" + + "\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\nI" + + "ST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x1c\x00Asia" + + "/MagadanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x1c\x00Asia/JakartaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x1c\x00Asia/" + + "NovokuznetskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x1c\x00Asia/OralUT" + - "\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "T`\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQ.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x1c\x00Asia/JayapuraUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\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\xa2" + - "h\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\nPK\x03\x04\n\x00\x00" + - "\x00\x00\x00\x0e|XQS\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x1c\x00Asia/PontianakUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + - "f\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" + - "\x00WIB\x00\nWIB-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Asia/MakassarUT\t\x00\x03" + - "\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f" + - "\x00\x1c\x00Asia/TbilisiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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%\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\xa2P\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\n\x00\x00\x00\x00\x00\x0e|XQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x1c\x00Asia/SingaporeUT\t\x00" + - "\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf5\b\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\x1cL" + - "MT\x00SMT\x00+07\x00+0720\x00+0730\x00+09\x00+08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01" + - "\x00\x00\x89\x01\x00\x00\v\x00\x1c\x00Asia/HarbinUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x1c\x00Asia/Kas" + - "hgarUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ?" + - "Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DhakaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\x004RA\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\x00BE\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x1c\x00Asia/OralUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQO\xb0" + - "\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x1c\x00Asia/YakutskUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\x00" + + "8\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\n\x00\x00\x00\x00\x00\xb8K\x97Q)p\x1cX\xf1\x02\x00\x00\xf1\x02\x00\x00\x10\x00\x1c\x00Asia/Novosib" + + "irskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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<+0" + + "7>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x1c\x00Asia/DamascusUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r\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>\u007fp\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\u007fg\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\"\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + + "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\"\b\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t" + + "LMT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.5/0,M10.5.5/0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q`\xc9\xd4" + + "\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x1c\x00Asia/Ujung_PandangUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x1c\x00Asia/FamagustaUT\t\x00\x03\xfc\xff" + + "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x00" + + "3=\x90\xe0\x00\x00\x00\x004-s\xd0\x00\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062x\x10\x00\x00\x00\x006\xfd\u007f\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\x00" + + "A\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\x00" + + "Onn\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Qʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x1c\x00Asia/YangonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf2s" + + "Q\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xceG|\xea\x13\x03\x00\x00\x13\x03\x00\x00\n\x00\x1c\x00Asia/AmmanUT\t" + + "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r" + + "\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\xc2P\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\x00" + + "3D(`\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\x00" + + "An\xf6\xe0\x00\x00\x00\x00BLr\xe0\x00\x00\x00\x00C\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\x00JD" + + "T\x00JST\x00\nJST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x1c\x00Asia/AnadyrUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc4" + + "\xb0\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q;" + + "\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\v\x00\x1c\x00Asia/TehranUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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$+\xc5" + - "\x90\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@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\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+1" + - "0\x00+09\x00\n<+09>-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00\x1c\x00Asia/Kuala_Lump" + - "urUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft-" + + "@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\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/o7" + + "H\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\xc8" + + "\xb8\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]\x86z" + + "8\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\x00\x00\x00\x00d\x1a\x13\xc8\x00\x00\x00" + + "\x00e\f\x99\xb8\x00\x00\x00\x00e\xfbGH\x00\x00\x00\x00f\xed\xcd8\x00\x00\x00\x00g\xdd\xccH\x00\x00\x00\x00h\xd0R8\x00\x00\x00\x00i\xbe\xff\xc8\x00\x00\x00\x00j\xb1\x85\xb8\x00\x00\x00\x00k\xa03" + + "H\x00\x00\x00\x00l\x92\xb98\x00\x00\x00\x00m\x81f\xc8\x00\x00\x00\x00ns\xec\xb8\x00\x00\x00\x00ob\x9aH\x00\x00\x00\x00pU 8\x00\x00\x00\x00qE\x1fH\x00\x00\x00\x00r7\xa58\x00\x00\x00" + + "\x00s&R\xc8\x00\x00\x00\x00t\x18ظ\x00\x00\x00\x00u\a\x86H\x00\x00\x00\x00u\xfa\f8\x00\x00\x00\x00v\xe8\xb9\xc8\x00\x00\x00\x00w\xdb?\xb8\x00\x00\x00\x00x\xcb>\xc8\x00\x00\x00\x00y\xbd\xc4" + + "\xb8\x00\x00\x00\x00z\xacrH\x00\x00\x00\x00{\x9e\xf88\x00\x00\x00\x00|\x8d\xa5\xc8\x00\x00\x00\x00}\x80+\xb8\x00\x00\x00\x00~n\xd9H\x00\x00\x00\x00\u007fa_8\x00\x00\x00\x00\x80Q^H\x00\x00\x00" + + "\x00\x81C\xe48\x00\x00\x00\x00\x822\x91\xc8\x00\x00\x00\x00\x83%\x17\xb8\x00\x00\x00\x00\x84\x13\xc5H\x00\x00\x00\x00\x85\x06K8\x00\x00\x00\x00\x85\xf4\xf8\xc8\x00\x00\x00\x00\x86\xe7~\xb8\x00\x00\x00\x00\x87\xd7}" + + "\xc8\x00\x00\x00\x00\x88\xca\x03\xb8\x00\x00\x00\x00\x89\xb8\xb1H\x00\x00\x00\x00\x8a\xab78\x00\x00\x00\x00\x8b\x99\xe4\xc8\x00\x00\x00\x00\x8c\x8cj\xb8\x00\x00\x00\x00\x8d{\x18H\x00\x00\x00\x00\x8em\x9e8\x00\x00\x00" + + "\x00\x8f]\x9dH\x00\x00\x00\x00\x90P#8\x00\x00\x00\x00\x91>\xd0\xc8\x00\x00\x00\x00\x921V\xb8\x00\x00\x00\x00\x93 \x04H\x00\x00\x00\x00\x94\x12\x8a8\x00\x00\x00\x00\x95\x017\xc8\x00\x00\x00\x00\x95\xf3\xbd" + + "\xb8\x00\x00\x00\x00\x96\xe3\xbc\xc8\x00\x00\x00\x00\x97\xd6B\xb8\x00\x00\x00\x00\x98\xc4\xf0H\x00\x00\x00\x00\x99\xb7v8\x00\x00\x00\x00\x9a\xa6#\xc8\x00\x00\x00\x00\x9b\x98\xa9\xb8\x00\x00\x00\x00\x9c\x87WH\x00\x00\x00" + + "\x00\x9dy\xdd8\x00\x00\x00\x00\x9ei\xdcH\x00\x00\x00\x00\x9f\\b8\x00\x00\x00\x00\xa0K\x0f\xc8\x00\x00\x00\x00\xa1=\x95\xb8\x00\x00\x00\x00\xa2,CH\x00\x00\x00\x00\xa3\x1e\xc98\x00\x00\x00\x00\xa4\rv" + + "\xc8\x00\x00\x00\x00\xa4\xff\xfc\xb8\x00\x00\x00\x00\xa5\xef\xfb\xc8\x00\x00\x00\x00\xa6⁸\x00\x00\x00\x00\xa7\xd1/H\x00\x00\x00\x00\xa8õ8\x00\x00\x00\x00\xa9\xb2b\xc8\x00\x00\x00\x00\xaa\xa4\xe8\xb8\x00\x00\x00" + + "\x00\xab\x93\x96H\x00\x00\x00\x00\xac\x86\x1c8\x00\x00\x00\x00\xadt\xc9\xc8\x00\x00\x00\x00\xaegO\xb8\x00\x00\x00\x00\xafWN\xc8\x00\x00\x00\x00\xb0IԸ\x00\x00\x00\x00\xb18\x82H\x00\x00\x00\x00\xb2+\b" + + "8\x00\x00\x00\x00\xb3\x19\xb5\xc8\x00\x00\x00\x00\xb4\f;\xb8\x00\x00\x00\x00\xb4\xfa\xe9H\x00\x00\x00\x00\xb5\xedo8\x00\x00\x00\x00\xb6\xddnH\x00\x00\x00\x00\xb7\xcf\xf48\x00\x00\x00\x00\xb8\xbe\xa1\xc8\x00\x00\x00" + + "\x00\xb9\xb1'\xb8\x00\x00\x00\x00\xba\x9f\xd5H\x00\x00\x00\x00\xbb\x92[8\x00\x00\x00\x00\xbc\x81\b\xc8\x00\x00\x00\x00\xbds\x8e\xb8\x00\x00\x00\x00\xbec\x8d\xc8\x00\x00\x00\x00\xbfV\x13\xb8\x00\x00\x00\x00\xc0D\xc1" + + "H\x00\x00\x00\x00\xc17G8\x00\x00\x00\x00\xc2%\xf4\xc8\x00\x00\x00\x00\xc3\x18z\xb8\x00\x00\x00\x00\xc4\a(H\x00\x00\x00\x00\xc4\xf9\xae8\x00\x00\x00\x00\xc5\xe9\xadH\x00\x00\x00\x00\xc6\xdc38\x00\x00\x00" + + "\x00\xc7\xca\xe0\xc8\x00\x00\x00\x00Ƚf\xb8\x00\x00\x00\x00ɬ\x14H\x00\x00\x00\x00ʞ\x9a8\x00\x00\x00\x00ˍG\xc8\x00\x00\x00\x00\xcc\u007f\u0378\x00\x00\x00\x00\xcdo\xcc\xc8\x00\x00\x00\x00\xcebR" + + "\xb8\x00\x00\x00\x00\xcfQ\x00H\x00\x00\x00\x00\xd0C\x868\x00\x00\x00\x00\xd123\xc8\x00\x00\x00\x00\xd2$\xb9\xb8\x00\x00\x00\x00\xd3\x13gH\x00\x00\x00\x00\xd4\x05\xed8\x00\x00\x00\x00\xd4\xf5\xecH\x00\x00\x00" + + "\x00\xd5\xe8r8\x00\x00\x00\x00\xd6\xd7\x1f\xc8\x00\x00\x00\x00\xd7ɥ\xb8\x00\x00\x00\x00ظSH\x00\x00\x00\x00٪\xd98\x00\x00\x00\x00ڙ\x86\xc8\x00\x00\x00\x00ی\f\xb8\x00\x00\x00\x00\xdc|\v" + + "\xc8\x00\x00\x00\x00\xddn\x91\xb8\x00\x00\x00\x00\xde]?H\x01\x02\x04\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\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\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\x00\x0008\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00FP" + + "\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00+04\x00+0430\x00\n<+0330>-3:30<+043" + + "0>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x1c\x00Asia/Singapo" + + "reUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6U\xaa\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\xf5\b\x01\x02\x03\x04\x05\x06\x05\a\x00\x00_V\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\n\x00\x00\x00\x00\x00\x0e|XQ" + - ";\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\v\x00\x1c\x00Asia/TehranUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + + "\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\xf5\b\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "y\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/BruneiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft" + - "-@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\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/o" + - "7H\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]\x86" + - "z8\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\x00\x00\x00\x00d\x1a\x13\xc8\x00\x00" + - "\x00\x00e\f\x99\xb8\x00\x00\x00\x00e\xfbGH\x00\x00\x00\x00f\xed\xcd8\x00\x00\x00\x00g\xdd\xccH\x00\x00\x00\x00h\xd0R8\x00\x00\x00\x00i\xbe\xff\xc8\x00\x00\x00\x00j\xb1\x85\xb8\x00\x00\x00\x00k\xa0" + - "3H\x00\x00\x00\x00l\x92\xb98\x00\x00\x00\x00m\x81f\xc8\x00\x00\x00\x00ns\xec\xb8\x00\x00\x00\x00ob\x9aH\x00\x00\x00\x00pU 8\x00\x00\x00\x00qE\x1fH\x00\x00\x00\x00r7\xa58\x00\x00" + - "\x00\x00s&R\xc8\x00\x00\x00\x00t\x18ظ\x00\x00\x00\x00u\a\x86H\x00\x00\x00\x00u\xfa\f8\x00\x00\x00\x00v\xe8\xb9\xc8\x00\x00\x00\x00w\xdb?\xb8\x00\x00\x00\x00x\xcb>\xc8\x00\x00\x00\x00y\xbd" + - "ĸ\x00\x00\x00\x00z\xacrH\x00\x00\x00\x00{\x9e\xf88\x00\x00\x00\x00|\x8d\xa5\xc8\x00\x00\x00\x00}\x80+\xb8\x00\x00\x00\x00~n\xd9H\x00\x00\x00\x00\u007fa_8\x00\x00\x00\x00\x80Q^H\x00\x00" + - "\x00\x00\x81C\xe48\x00\x00\x00\x00\x822\x91\xc8\x00\x00\x00\x00\x83%\x17\xb8\x00\x00\x00\x00\x84\x13\xc5H\x00\x00\x00\x00\x85\x06K8\x00\x00\x00\x00\x85\xf4\xf8\xc8\x00\x00\x00\x00\x86\xe7~\xb8\x00\x00\x00\x00\x87\xd7" + - "}\xc8\x00\x00\x00\x00\x88\xca\x03\xb8\x00\x00\x00\x00\x89\xb8\xb1H\x00\x00\x00\x00\x8a\xab78\x00\x00\x00\x00\x8b\x99\xe4\xc8\x00\x00\x00\x00\x8c\x8cj\xb8\x00\x00\x00\x00\x8d{\x18H\x00\x00\x00\x00\x8em\x9e8\x00\x00" + - "\x00\x00\x8f]\x9dH\x00\x00\x00\x00\x90P#8\x00\x00\x00\x00\x91>\xd0\xc8\x00\x00\x00\x00\x921V\xb8\x00\x00\x00\x00\x93 \x04H\x00\x00\x00\x00\x94\x12\x8a8\x00\x00\x00\x00\x95\x017\xc8\x00\x00\x00\x00\x95\xf3" + - "\xbd\xb8\x00\x00\x00\x00\x96\xe3\xbc\xc8\x00\x00\x00\x00\x97\xd6B\xb8\x00\x00\x00\x00\x98\xc4\xf0H\x00\x00\x00\x00\x99\xb7v8\x00\x00\x00\x00\x9a\xa6#\xc8\x00\x00\x00\x00\x9b\x98\xa9\xb8\x00\x00\x00\x00\x9c\x87WH\x00\x00" + - "\x00\x00\x9dy\xdd8\x00\x00\x00\x00\x9ei\xdcH\x00\x00\x00\x00\x9f\\b8\x00\x00\x00\x00\xa0K\x0f\xc8\x00\x00\x00\x00\xa1=\x95\xb8\x00\x00\x00\x00\xa2,CH\x00\x00\x00\x00\xa3\x1e\xc98\x00\x00\x00\x00\xa4\r" + - "v\xc8\x00\x00\x00\x00\xa4\xff\xfc\xb8\x00\x00\x00\x00\xa5\xef\xfb\xc8\x00\x00\x00\x00\xa6⁸\x00\x00\x00\x00\xa7\xd1/H\x00\x00\x00\x00\xa8õ8\x00\x00\x00\x00\xa9\xb2b\xc8\x00\x00\x00\x00\xaa\xa4\xe8\xb8\x00\x00" + - "\x00\x00\xab\x93\x96H\x00\x00\x00\x00\xac\x86\x1c8\x00\x00\x00\x00\xadt\xc9\xc8\x00\x00\x00\x00\xaegO\xb8\x00\x00\x00\x00\xafWN\xc8\x00\x00\x00\x00\xb0IԸ\x00\x00\x00\x00\xb18\x82H\x00\x00\x00\x00\xb2+" + - "\b8\x00\x00\x00\x00\xb3\x19\xb5\xc8\x00\x00\x00\x00\xb4\f;\xb8\x00\x00\x00\x00\xb4\xfa\xe9H\x00\x00\x00\x00\xb5\xedo8\x00\x00\x00\x00\xb6\xddnH\x00\x00\x00\x00\xb7\xcf\xf48\x00\x00\x00\x00\xb8\xbe\xa1\xc8\x00\x00" + - "\x00\x00\xb9\xb1'\xb8\x00\x00\x00\x00\xba\x9f\xd5H\x00\x00\x00\x00\xbb\x92[8\x00\x00\x00\x00\xbc\x81\b\xc8\x00\x00\x00\x00\xbds\x8e\xb8\x00\x00\x00\x00\xbec\x8d\xc8\x00\x00\x00\x00\xbfV\x13\xb8\x00\x00\x00\x00\xc0D" + - "\xc1H\x00\x00\x00\x00\xc17G8\x00\x00\x00\x00\xc2%\xf4\xc8\x00\x00\x00\x00\xc3\x18z\xb8\x00\x00\x00\x00\xc4\a(H\x00\x00\x00\x00\xc4\xf9\xae8\x00\x00\x00\x00\xc5\xe9\xadH\x00\x00\x00\x00\xc6\xdc38\x00\x00" + - "\x00\x00\xc7\xca\xe0\xc8\x00\x00\x00\x00Ƚf\xb8\x00\x00\x00\x00ɬ\x14H\x00\x00\x00\x00ʞ\x9a8\x00\x00\x00\x00ˍG\xc8\x00\x00\x00\x00\xcc\u007f\u0378\x00\x00\x00\x00\xcdo\xcc\xc8\x00\x00\x00\x00\xceb" + - "R\xb8\x00\x00\x00\x00\xcfQ\x00H\x00\x00\x00\x00\xd0C\x868\x00\x00\x00\x00\xd123\xc8\x00\x00\x00\x00\xd2$\xb9\xb8\x00\x00\x00\x00\xd3\x13gH\x00\x00\x00\x00\xd4\x05\xed8\x00\x00\x00\x00\xd4\xf5\xecH\x00\x00" + - "\x00\x00\xd5\xe8r8\x00\x00\x00\x00\xd6\xd7\x1f\xc8\x00\x00\x00\x00\xd7ɥ\xb8\x00\x00\x00\x00ظSH\x00\x00\x00\x00٪\xd98\x00\x00\x00\x00ڙ\x86\xc8\x00\x00\x00\x00ی\f\xb8\x00\x00\x00\x00\xdc|" + - "\v\xc8\x00\x00\x00\x00\xddn\x91\xb8\x00\x00\x00\x00\xde]?H\x01\x02\x04\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\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\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\x00\x0008\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00F" + - "P\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00+04\x00+0430\x00\n<+0330>-3:30<+04" + - "30>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x1c\x00Asia/Beirut" + - "UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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'\u007f\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\xec" + - "\xb6\x94P\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\n\x00\x00\x00\x00\x00\x0e|XQ\xdb\xfa\xb5\xbeg\x02" + - "\x00\x00g\x02\x00\x00\v\x00\x1c\x00Asia/AqtobeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "2r{\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\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\n\x00\x00\x00\x00\x00\x0e|XQV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x1c\x00Asia/AnadyrUT\t\x00\x03\xec,\x94_\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + - "K\xae\x0f`\x00\x00\x00\x00L\xcc2\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\n\x00\x00\x00\x00\x00\x0e|XQ0]*\x1bj\x02\x00\x00j\x02" + - "\x00\x00\f\x00\x1c\x00Asia/BishkekUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00E\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\n\x00\x00\x00\x00\x00\x0e|XQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x1c\x00Asia/DubaiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/" + - "RiyadhUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x1c\x00Asia/NovokuznetskUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\x000dY" + - "0\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\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\xed" + - "0\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\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\n\x00\x00\x00\x00\x00\x0e|XQT\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x1c\x00Asia/AqtauUT\t\x00\x03\xec,\x94_\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\n\x00\x00\x00\x00\x00\x0e|XQ:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x1c\x00Asia/Oms" + - "kUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xad\x8a\x02D\xff\xff\xff\xff\xbagG\x88\x01\x02\x00\x00k\xbc\x00\x00\x00\x00ix\x00\x04" + + "\x00\x00p\x80\x00\nLMT\x00+0730\x00+08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00A" + + "sia/UrumqiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97QΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x1c\x00Asia/DiliUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Qe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x1c\x00Asia/AshkhabadUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\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+0" + + "6\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x1c\x00Asia/Krasnoyars" + + "kUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "I\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x1c\x00Asia/AshkhabadUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\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<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x1c\x00Asia/SaigonUT" + - "\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x1c\x00Asia/Sak" + - "halinUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "4R\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\x00" + - "BE\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\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\n\x00\x00\x00\x00\x00\x0e|XQE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x1c\x00Asia/Hong_KongUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x85" + - "ic\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\xdc" + - "\xb8\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\x00H" + - "KWT\x00JST\x00\nHKT-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x1c\x00Asia/Phnom_Penh" + - "UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x1c\x00Asia/NicosiaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\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\x86" + - "P\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\n\x00\x00\x00\x00\x00\x0e|XQ\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x1c\x00Asia/BaghdadUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "8\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\x00" + - "G\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\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00\x00\x12\x00\x1c\x00Asia/SrednekolymskUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\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\x00J\xe3\x16p\x00\x00\x00\x00K\xae\x1dp\x00\x00\x00\x00L\xcc" + - "2\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\bL" + - "MT\x00+10\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQe\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x1c\x00Asia/" + - "AshgabatUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x1c\x00Asia/KathmanduUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\x81z" + - "&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x1c\x00Asia/ChoibalsanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "6\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\u007f\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\x00" + - "V\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\n\x00\x00\x00\x00\x00\x0e|XQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00Asia/BangkokUT" + - "\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/ChungkingUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ)p\x1c" + - "X\xf1\x02\x00\x00\xf1\x02\x00\x00\x10\x00\x1c\x00Asia/NovosibirskUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\x00" + - "L\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\n\x00\x00\x00\x00\x00\x0e|XQ]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x1c\x00" + - "Asia/FamagustaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\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\x00BE\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\x00" + + "I\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\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x1c\x00Asia/AtyrauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\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\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\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\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+0" + + "6\x00+04\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QT\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x1c\x00Asia/AqtauUT\t\x00\x03" + + "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xcc" + + "w\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\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\x0062" + + "M\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\x00" + + "FP\x01\bLMT\x00+04\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x1c\x00A" + + "sia/HarbinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/KuwaitUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r" + + "\x00\x1c\x00Asia/CalcuttaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "MMT\x00IST\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x1c\x00Asia/M" + + "anilaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x1c" + + "\x00Asia/DushanbeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x11c\xfd`\x00\x00\x00\x00\x12S\xe0P\x00\x00\x00\x00\x13M\x19\xe0\x00\x00\x00\x00\x143\xc2" + - "P\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\x000du" + - "P\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\u007f\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\u007f\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-2EE" + - "ST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x1c\x00Asia/Ran" + - "goonUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\x84)\r\xbd\xec\x00\x00" + - "\x00\xec\x00\x00\x00\x10\x00\x1c\x00Asia/Ho_Chi_MinhUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\fLMT\x00+05\x00+07\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x1c\x00Asia/Tel_AvivUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "Zif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x8b" + + "v\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\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\x00" + + "8@\x01\x10LMT\x00JMT\x00IDT\x00IST\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x1c\x00Asia/UlaanbaatarUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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?t" + + "p\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02\x00\x00\f\x00\x1c\x00Asia/IrkutskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\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.\x84" + + "i \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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x1c\x00Asia/ShanghaiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\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\x00" + + "q\xd7\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00" + + "\x00\r\x00\x1c\x00Asia/KatmanduUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x1c\x00Asi" + + "a/HovdUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "2\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#;\xc6" + + "\x80\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\x00C4B" + + "\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\x00b" + + "p\x00\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x1c\x00As" + + "ia/KolkataUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00IS" + + "T\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x1c\x00Asia/Kashgar" + + "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QS\xa5\x81e\xf7" + + "\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x1c\x00Asia/PontianakUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x1c\x00Atlantic/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x1c\x00Atlantic/FaroeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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#\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x1c\x00" + + "Atlantic/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\u0097N\xad\xaf\x00\x00\x00\xaf" + + "\x00\x00\x00\x13\x00\x1c\x00Atlantic/Cape_VerdeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x1c\x00Atlantic/FaroeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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#\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\n\x00\x00\x00\x00\x00\x0e|XQ\x9b\xe9\xf4\x9a\xf9\x02\x00\x00\xf9\x02\x00\x00\x10\x00\x1c\x00Atlantic/BermudaUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\xb4\xc3\x1d\xe6" + - "\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\x01\x02\x01\x02" + - "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xc3:\x00\x00\xff\xff\xc7\xc0\x00\x04\xff\xff\xd5\xd0\x01\bLMT\x00AST\x00ADT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x1c\x00Atlantic/South_GeorgiaUT\t\x00\x03\xec,\x94_\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00" + - "Atlantic/St_HelenaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x1c\x00Atlantic/Jan_MayenUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffr\xee$l\xff\xff\xff\xff\x9b" + - "'\xe3\x00\xff\xff\xff\xff\x9b\xd4{`\xff\xff\xff\xffȷM`\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\xeb\xaf \x90\xff\xff\xff\xff\xec\xa8L\x10\xff\xff\xff\xff\xed\x98=\x10\xff\xff\xff\xff\xee\x88.\x10\xff\xff\xff\xff\xefx\x1f\x10\xff\xff\xff\xff\xf0" + - "h\x10\x10\xff\xff\xff\xff\xf1X\x01\x10\xff\xff\xff\xff\xf2G\xf2\x10\xff\xff\xff\xff\xf37\xe3\x10\xff\xff\xff\xff\xf4'\xd4\x10\xff\xff\xff\xff\xf5\x17\xc5\x10\xff\xff\xff\xff\xf6\x10\xf0\x90\xff\xff\xff\xff\xf7/\x06\x10\xff" + - "\xff\xff\xff\xf7\xf0Ґ\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#1<+00>,M3.5.0/0" + - ",M10.5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00\x10\x00\x1c\x00Atlantic/MadeiraUT\t" + - "\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\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\u007f\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ܹ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#\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\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\x9c\xd2I\f!\x01\x00\x00!\x01\x00\x00\x14\x00\x1c\x00Australia/QueenslandUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x11\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffr\xed\x9f\b\xff\xff\xff\xff\x9cN\xa6\x9c\xff\xff" + - "\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\x00\x00\x00\x00\x03p" + - "9\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" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\xe2\xf1\x9d4\xea\x00\x00\x00\xea\x00\x00\x00\x0f\x00\x1c\x00Australia/NorthUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\xad\xa4\xff\xff\xff\xff\x9c\xbc'\xf8\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7^x\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧ@x\xff\xff\xff\xffΠz\b\xff\xff\xff\xff" + - "χ\"x\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\n\x00\x00\x00\x00\x00\x0e|XQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x1c\x00Australia/Lord_HoweUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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+1" + - "130\x00+1030\x00+11\x00\n<+1030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04\n\x00\x00\x00" + - "\x00\x00\x0e|XQͥ\xdfD\x99\x03\x00\x00\x99\x03\x00\x00\x12\x00\x1c\x00Australia/AdelaideUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xad\xa4\xff\xff\xff\xff\x9c\xbc'\xf8\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7^x\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧ@x\xff\xff\xff\xffΠz\b\xff\xff\xff\xff\xcf" + - "\x87\"x\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\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQ1\x9eD\x00\xad\x03\x00\x00\xad\x03\x00\x00\x14\x00\x1c\x00A" + - "ustralia/YancowinnaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xad\xa4\xff\xff\xff\xff\x9c\xbc" + - "'\xf8\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7^x\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧ@x\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ\"x\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\u007f\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\x18\xc7" + - "\x88\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" + + "\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\x00\x00\n\x14\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\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Qm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\x12\x00\x1c\x00Atlantic/ReykjavikUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x10\xff\xff\xff\xff\x8b`\x83\xa0\xff\xff\xff\xff\x9c\x91\x1e" + + "\x00\xff\xff\xff\xff\x9dш\x90\xff\xff\xff\xff\x9erQ\x80\xff\xff\xff\xff\x9f\xd5\x03\x10\xff\xff\xff\xff\xa0S\x85\x00\xff\xff\xff\xff\xa1\xb66\x90\xff\xff\xff\xff\xa4<'\x80\xff\xff\xff\xff\xa4\xb9t\x10\xff\xff\xff" + + "\xff\xc6M\x1a\x00\xff\xff\xff\xff\xc7=' \xff\xff\xff\xff\xc7\xda\x17\xb0\xff\xff\xff\xff\xc9&C\xa0\xff\xff\xff\xff\xc9\xc3& \xff\xff\xff\xff\xcb\x06%\xa0\xff\xff\xff\xffˬB\xa0\xff\xff\xff\xff\xcc\xdc\xcd" + + " \xff\xff\xff\xff͌$\xa0\xff\xff\xff\xffμ\xaf \xff\xff\xff\xff\xcfl\x06\xa0\xff\xff\xff\xffМ\x91 \xff\xff\xff\xff\xd1K\xe8\xa0\xff\xff\xff\xff҅\xad\xa0\xff\xff\xff\xff\xd3+ʠ\xff\xff\xff" + + "\xff\xd4e\x8f\xa0\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd6Eq\xa0\xff\xff\xff\xff\xd7\x19\xb3 \xff\xff\xff\xff\xd8%S\xa0\xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xd9w" + + " \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xce4 \xff\xff\xff\xffޢu\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x82W\xa0\xff\xff\xff\xff\xe1\x8d\xf8 \xff\xff\xff" + + "\xff\xe2b9\xa0\xff\xff\xff\xff\xe3m\xda \xff\xff\xff\xff\xe4B\x1b\xa0\xff\xff\xff\xff\xe5M\xbc \xff\xff\xff\xff\xe6!\xfd\xa0\xff\xff\xff\xff\xe76ؠ\xff\xff\xff\xff\xe8\v\x1a \xff\xff\xff\xff\xe9\x16\xba" + + "\xa0\xff\xff\xff\xff\xe9\xea\xfc \xff\xff\xff\xff\xea\xf6\x9c\xa0\xff\xff\xff\xff\xeb\xca\xde \xff\xff\xff\xff\xec\xd6~\xa0\xff\xff\xff\xff\xed\xaa\xc0 \xff\xff\xff\xff\xee\xb6`\xa0\xff\xff\xff\xff\uf2a2 \xff\xff\xff" + + "\xff\xf0\x96B\xa0\xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2\u007f_ \xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf53\x82\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x13d" + + "\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xf3F\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xd3(\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc\xbcE \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + + "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xeb" + + "`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaf|7" + + "\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x1c\x00Atlantic/CanaryUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\x14" + + "3\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#2" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00\x1c\x00Atlantic/FaeroeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\x00" + + "H\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\n\x00\x00\x00\x00\x00\xb8K\x97QW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x1c\x00Atlantic/AzoresUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\a\x00\x00\x00\x18\xff\xff\xff\xff^=\x1b\x90\xff\xff\xff\xff\x92\xe6" + + "\xaa\xa0\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\u007f\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\u007f\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ܹ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\xe4B" + + "7\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\"L" + + "b \x00\x00\x00\x00#1<+00>,M3.5.0/0,M10." + + "5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Ql&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x1c\x00Atlantic/BermudaUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x004" + + "R\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\x00B" + + "O\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\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\nACS" + - "T-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xa5\x85&'\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x1c\x00Au" + - "stralia/VictoriaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xa6\x9c\xff\xff\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff" + - "\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\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\x14" + - "Xf\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQf\xdd}\xfe\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x1c\x00Australia/CanberraUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\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\u007f<\xff\xff\xff\xff\x9cN\xa6\x9c\xff\xff\xff\xff\x9c" + - "\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\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\x00C" + - "c\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" + + "\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\x00AST\x00" + + "\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x1c\x00Austra" + + "lia/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0f\x00" + + "\x1c\x00Australia/PerthUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Qo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x1c\x00Australia/LHIUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\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\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<+1" + + "030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00" + + "\x14\x00\x1c\x00Australia/YancowinnaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03" + + "p@\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\u007f\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15" + + "\x00\x1c\x00Australia/Broken_HillUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03" + + "p@\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\u007f\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e" + + "\x00\x1c\x00Australia/WestUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x1c\x00Australia/DarwinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x1c\x00Australia/AdelaideUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\x00A" + + "CDT\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa2ܺ\xca:\x01\x00\x00:\x01" + + "\x00\x00\x0f\x00\x1c\x00Australia/EuclaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x1c\x00Australia/MelbourneUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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,M" + - "4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQf\xdd}\xfe\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x1c\x00Australia/SydneyUT\t\x00\x03\xec" + - ",\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\xff\xff\xff\xff\x9cN\xa6\x9c\xff\xff\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs" + - "\x00\xff\xff\xff\xffχ\x1bp\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\xca" + - "\x80\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\nAES" + - "T-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQf\xdd}\xfe\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Aust" + - "ralia/ACTUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\xff\xff\xff\xff\x9cN\xa6\x9c\xff\xff\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80" + - "\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\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\n\x00\x00\x00\x00\x00\x0e|XQ.\x1b\xa53:" + - "\x01\x00\x00:\x01\x00\x00\x0f\x00\x1c\x00Australia/EuclaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x1c\x00Austra" + + "lia/CanberraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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\xcc" + + "\xb7V\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\t" + + "LMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q3\xba" + + "\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x1c\x00Australia/BrisbaneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\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\nAEST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Qo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x1c\x00Australia/Lord_HoweUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x870" + + "h\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\xd4" + + "p\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\x00ECwx\x00\x00\x00\x00F\x05<\xf0\x00\x00\x00\x00G#Y" + + "x\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9b\xe1\xc1\xa9\x88\x03\x00\x00" + + "\x88\x03\x00\x00\x12\x00\x1c\x00Australia/VictoriaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xb80\xff\xff\xff\xff\x9c\xbc2\x84\xff\xff\xff\xff\xcbT\xc4" + - "\x94\xff\xff\xff\xff\xcb\xc7i\x04\xff\xff\xff\xff̷h\x14\xff\xff\xff\xffͧK\x04\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<+084" + - "5>-8:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9c\xd2I\f!\x01\x00\x00!\x01\x00\x00\x12\x00\x1c\x00Australia/BrisbaneUT\t\x00" + - "\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa6\x9c\xff\xff\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xff\xce" + - "\xa0s\x00\xff\xff\xff\xffχ\x1bp\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\x00A" + - "EST\x00\nAEST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQʹF\xd6\xc7\x03\x00\x00\xc7\x03\x00\x00\x12\x00\x1c\x00Australia/Tasmani" + - "aUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03" + - "\x00\x00\x00\x0e\xff\xff\xff\xfft.\x00\xe4\xff\xff\xff\xff\x9b\xd5x\x80\xff\xff\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p" + - "\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\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\x00" + - "8\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\x00" + - "G\a\xb1\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\x02\x01\x02\x00\x00\x8a\x1c\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00\x9a\xb0\x01\tLMT\x00AEST" + - "\x00AEDT\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQʹF\xd6\xc7\x03\x00\x00\xc7\x03" + - "\x00\x00\x10\x00\x1c\x00Australia/HobartUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\x0e\xff\xff\xff\xfft.\x00\xe4\xff\xff\xff\xff\x9b\xd5x\x80\xff\xff\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff" + - "\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\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\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\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" + - "\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\x8a\x1c\x00" + - "\x00\x00\x00\x8c\xa0\x00\x04\x00\x00\x9a\xb0\x01\tLMT\x00AEST\x00AEDT\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x98Ò\x8d2\x01\x00\x002\x01\x00\x00\x0f\x00\x1c\x00Australia/PerthUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\xc2" + - "\xbc\xff\xff\xff\xff\x9c\xbc=\x10\xff\xff\xff\xff\xcbT\xcf \xff\xff\xff\xff\xcb\xc7s\x90\xff\xff\xff\xff̷r\xa0\xff\xff\xff\xffͧU\x90\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\u007f\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\xee\x83" + - "\xa0\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\x00AW" + - "DT\x00AWST\x00\nAWST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQͥ\xdfD\x99\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x1c\x00Australia/Sout" + - "hUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x1c\x00Australia/HobartUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfe" + + "v\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Ā\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\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x1c\x00Australia/LindemanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + + "\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\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\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03" + + "\x00\x00\x10\x00\x1c\x00Australia/CurrieUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00AE" + + "ST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x0f" + + "\x00\x1c\x00Australia/NorthUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q3\xba\xde\xd3!\x01" + + "\x00\x00!\x01\x00\x00\x14\x00\x1c\x00Australia/QueenslandUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\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\nAEST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/NSWUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/ACTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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\x00" + + "4R\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\x00" + + "BE\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\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x1c\x00Australia/Tas" + + "maniaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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,M" + + "10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x1c\x00Australia/Sout" + + "hUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xad\xa4\xff\xff\xff\xff\x9c\xbc'\xf8\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7^x\xff\xff\xff\xff̷]\x88" + - "\xff\xff\xff\xffͧ@x\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ\"x\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" + + "\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\u007f\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" + @@ -3752,426 +3844,120 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00 "\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\xce\xe5\x90AE\x01\x00\x00E\x01\x00\x00\x12\x00\x1c\x00Australia/LindemanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x15\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xffr\xed\xa2\xd4\xff\xff\xff\xff\x9cN\xa6\x9c\xff\xff\xff" + - "\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\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\n\x00\x00\x00\x00\x00\x0e|XQ\xe2\xf1\x9d4\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x1c" + - "\x00Australia/DarwinUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xad\xa4\xff\xff\xff\xff\x9c\xbc'\xf8\xff\xff\xff\xff\xcbT\xba\b" + - "\xff\xff\xff\xff\xcb\xc7^x\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧ@x\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ\"x\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\n\x00\x00\x00\x00\x00\x0e|XQ\x98Ò\x8d2\x01\x00" + - "\x002\x01\x00\x00\x0e\x00\x1c\x00Australia/WestUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xbc=\x10\xff\xff\xff\xff\xcbT\xcf \xff\xff" + - "\xff\xff\xcb\xc7s\x90\xff\xff\xff\xff̷r\xa0\xff\xff\xff\xffͧU\x90\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\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x1c\x00Australia/LHIUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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+1" + - "1\x00\n<+1030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQf\xdd}\xfe\x88\x03" + - "\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/NSWUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\xff\xff\xff\xff\x9cN\xa6\x9c\xff\xff\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff" + - "\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\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\n" + - "\x00\x00\x00\x00\x00\x0e|XQ1\x9eD\x00\xad\x03\x00\x00\xad\x03\x00\x00\x15\x00\x1c\x00Australia/Broken_HillUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xad\xa4\xff\xff\xff\xff\x9c\xbc'\xf8\xff\xff\xff\xff\xcbT\xba\b\xff\xff\xff\xff\xcb\xc7^x\xff\xff\xff\xff̷]\x88\xff\xff\xff\xffͧ@" + - "x\xff\xff\xff\xffΠz\b\xff\xff\xff\xffχ\"x\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\u007f\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\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\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\xc4\xd5\x01\xe5\u007f\x03\x00\x00\u007f\x03\x00\x00\x10\x00\x1c\x00Australia/CurrieUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00R\x00\x00\x00\x03\x00\x00\x00\x0e\xff\xff\xff\xfft.\x04 \xff\xff\xff\xff\x9b\xd5x\x80" + - "\xff\xff\xff\xff\x9c\xbc \xf0\xff\xff\xff\xff\xcbT\xb3\x00\xff\xff\xff\xff\xcb\xc7Wp\xff\xff\xff\xff̷V\x80\xff\xff\xff\xffͧ9p\xff\xff\xff\xffΠs\x00\xff\xff\xff\xffχ\x1bp\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Ā\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + - "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\x86\xe0\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00\x9a\xb0\x01\tLMT\x00AEST\x00AEDT\x00\nAEST-10AEDT,M10.1.0,M4.1." + - "0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Brazil/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x1c\x00Brazil/DeNoronhaUT\t\x00\x03" + - "\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x8b" + - "o\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\x002\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x1c\x00Bra" + - "zil/AcreUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQ\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00" + - "\v\x00\x1c\x00Brazil/EastUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0T" + - "3 \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!\x81" + - "i0\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\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00N\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\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\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\xd4" + - "L\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\n\x00\x00\x00\x00\x00\x0e|XQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00" + - "\x00\v\x00\x1c\x00Brazil/WestUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fD\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\n\x00\x00\x00\x00\x00\x0e|XQ\xe6\x9aM\xbem\x02\x00\x00m\x02" + - "\x00\x00\x03\x00\x1c\x00CETUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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#\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\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Canada/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00P" + - "K\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00Canada/AtlanticUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fU0\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\xdd" + - "\xa9tP\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\u007f\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\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\n\x00\x00\x00\x00\x00\x0e|XQU9#\xbe2\x05\x00\x002\x05\x00\x00\x0e\x00\x1c\x00Canada/PacificUT\t\x00\x03\xec,\x94_\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xd5" + - "U\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\xe3" + - "IR\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\u007f\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\x00PP" + - "T\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x1c\x00Cana" + - "da/EasternUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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" + + "\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x1c\x00Australia/SydneyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\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\u007f<\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\x00C" + + "c\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,M" + + "4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Brazil/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x1c\x00Brazil/WestUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fD\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,\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-0" + + "3\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x1c\x00Brazil/AcreUT\t\x00\x03" + + "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00" + + "\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x1c\x00Brazil/De" + + "NoronhaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x002\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9d?\xdfڸ\x03\x00" + + "\x00\xb8\x03\x00\x00\v\x00\x1c\x00Brazil/EastUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x009\xdf\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00N\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\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\x00R" + + "cG0\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\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\n\x00\x00\x00\x00\x00\x0e|XQ\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x1c\x00Canada/YukonUT\t" + - "\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfb\x1d_\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\x00" + - "9\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\x00" + - "Gӵ \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\x8f\x9f" + - "t\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\x0f" + - "d\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\x00NPT\x00NWT\x00NDDT\x00\nNST3:30NDT,M3.2.0,M11." + - "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x1c\x00Canada/CentralUT\t\x00\x03\xec,\x94_\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdf" + - "\x89rp\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\x03" + - "q\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\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\u007f\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" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Canada/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc2" + + "\x96dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x1c\x00Canada/SaskatchewanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QU9#\xbe2\x05" + + "\x00\x002\x05\x00\x00\x0e\x00\x1c\x00Canada/PacificUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xe6" + + "GX \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\u007f\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\x02" + + "x\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\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x1c\x00Canada/MountainUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\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;\xdb" + - "\xbb\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\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x1c\x00Chile/UT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x1c\x00Chile/EasterI" + - "slandUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\x00f" + - "\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 \u007f\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\x00" + - "9\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\x00" + - "G\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\x00" + - "W\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\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\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\n" + - "\x00\x00\x00\x00\x00\x0e|XQ[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x1c\x00Chile/ContinentalUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\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\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\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xc6\xff\xff\xff\xff\x8f0G" + - "F\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\x1bɰ\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 \u007f\x030\x00\x00\x00\x00!o\x02@\x00\x00\x00\x00\"9\xfb" + - "0\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\xae" + - "0\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\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x03\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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\n\x00\x00\x00\x00\x00\x0e|XQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x04\x00" + - "\x1c\x00CubaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "j\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`\xe1" + - "P\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 Z5" + - "P\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\xd2" + - "P\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\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" + - ",M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x1c\x00EETUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00" + - "\x00A\x84\u007f`\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\x00EPT\x00\nEST5ED" + - "T,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\x05\x00\x1c\x00EgyptUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u007f\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\u007f\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\u007fYp\x00\x00\x00\x00\x03I\x1d\x00\x00\x00\x00\x00\x04a\xdep\x00\x00\x00\x00\x05+\xa2\x00\x00\x00\x00\x00\x06" + - "C\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\x14" + - "7\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\x000" + - "k\f\xd0\x00\x00\x00\x001\u007f\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@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0\x00\x00\x00\x00C\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\x00L" + - "a\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" + + "\x00A\x84\u007f`\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00Canada/AtlanticUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\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\u007fU0\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\xde" + + "\xbe]`\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" + + "\u007f\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\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" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13\x00\x1c\x00Canada/NewfoundlandUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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\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\x00" + + "I\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\xdc" + + "\xa4\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\x00N" + + "DDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x1c" + + "\x00Canada/CentralUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + + "\u007f\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05" + - "\x00\x00\x04\x00\x1c\x00EireUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x1c\x00Canada/Mounta" + + "inUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xde" + + "\x80\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\u007f" + + "\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\x00" + + "MDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc1Ȇ\x90\x05\x04" + + "\x00\x00\x05\x04\x00\x00\f\x00\x1c\x00Canada/YukonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfb\x1d_\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\x00QO@\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 \u007f\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\x00B" + + "3\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\x00P" + + "B\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\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x03\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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/2" + + "4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x1c\x00Chile/EasterIslandUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00f\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\xd1" + + "\xb0\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 \u007f\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\xbf" + + "0\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\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q<\x8b\x99\x1e\xb7\x03" + + "\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00CST6CDTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "8\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\x00" + + "E\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\x00" + + "CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\a\x1c\x9e\x9a]\x04\x00\x00]\x04" + + "\x00\x00\x04\x00\x1c\x00CubaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xdc\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\u007f_ \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\xda" + - "\x90\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$\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\x00BS" + - "T\x00GMT\x00\nIST-1GMT0,M10.5.0,M3.5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x04\x00\x1c\x00Etc/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd9|\xbd7s\x00\x00\x00s\x00" + - "\x00\x00\n\x00\x1c\x00Etc/GMT-10UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xe5\xf38cr\x00\x00" + - "\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+12UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\xd5" + + "P\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$\x17" + + "P\x00\x00\x00\x00GܩP\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,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x1c\x00EETUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#" + + "\xa8^`\x00\x00\x00\x00?sWP\x00\x00\x00\x00@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0\x00\x00\x00\x00C\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\tLMT\x00EEST\x00EET\x00\nEET-2\nPK\x03\x04\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\x04\x00\x1c\x00EireUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xdc\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\xd6" + + "\xa0\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\xcc" + + "\xa0\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\u007f_ \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\xde" + + "\xa0\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$\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\n\x00\x00\x00\x00\x00" + + "\xb8K\x97QtX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00ESTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe7/\xebT" + + "\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00EST5EDTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\u007f`\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\fED" + + "T\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x04\x00\x1c\x00Etc/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0\xfaFDq\x00" + + "\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+4UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xb2\xab\xd1Is" + - "\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-11UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q)\xb9\xbe\x9dr\x00" + + "\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+11UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qk\x19-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9f." + - "\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/UniversalUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ" + - "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/GreenwichUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQj\xd5d\xb0r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-6UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\xf7\x1ac\xc3r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-1UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\xc5\x18\xb6\xfbr\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-8UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+4UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQe\xcb\xe9Qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+3UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xfc\x19@\xb9r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-9UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + - "\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT-0UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-7UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+2UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xd4X\x9b\xf3q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+5UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/GMTUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\b\x00\x1c\x00Etc/ZuluUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc5\x18\xb6" + + "\xfbr\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-8UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Qe\xcb" + + "\xe9Qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+3UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfc\x19" + + "@\xb9r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-9UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8e" + + "\x1569r\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+10UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ)\xb9" + - "\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+11UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ" + - "\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-13UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xf7\x1ac\xc3r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-1UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e" + - "|XQ,{\xdc;s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-14UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + - "\x00\x00\x0e|XQ\x8e\x1569r\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+10UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-12UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\b\x00\x1c\x00Etc/GMT0UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UCTUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT+0UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x84+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+7UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x84\x19\xb3\tq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+9UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K" + + "\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT-0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-2UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e" + - "|XQ!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-5UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+8UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQH\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+6UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQ5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+1UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UTCUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\xd4X\x9b\xf3q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+5UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/GMTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4x" + + "o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UTCUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qj\xd5d\xb0r\x00\x00\x00" + + "r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-6UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00" + + "\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UCTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00" + + "\x00\b\x00\x1c\x00Etc/GMT0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84\x19\xb3\tq\x00\x00\x00q\x00\x00\x00\t\x00" + + "\x1c\x00Etc/GMT+9UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5\xf38cr\x00\x00\x00r\x00\x00\x00\n\x00" + + "\x1c\x00Etc/GMT+12UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QH\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00" + + "\t\x00\x1c\x00Etc/GMT+6UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00" + + "\b\x00\x1c\x00Etc/ZuluUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x1c" + + "\x00Etc/GMT-7UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00" + + "\x1c\x00Etc/GMT-5UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t" + + "\x00\x1c\x00Etc/GMT+1UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q,{\xdc;s\x00\x00\x00s\x00\x00\x00\n" + + "\x00\x1c\x00Etc/GMT-14UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd9|\xbd7s\x00\x00\x00s\x00" + + "\x00\x00\n\x00\x1c\x00Etc/GMT-10UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xab\xd1Is\x00\x00" + + "\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-11UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x90`N\xe8" + + "s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-13UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84" + + "+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+7UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf7" + + "\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-12UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K" + + "\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT+0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ" + - "k\x19-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x9c\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-3UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+2UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Europe/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00" + - "\x00\x00\x00\x0e|XQDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\r\x00\x1c\x00Europe/ZurichUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/GreenwichUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/UniversalUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+8UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-2UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Europe/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x1c\x00Europe/CopenhagenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x11\xff\xff\xff\xffi\x86ϴ\xff\xff\xff\xffq" + + "\f\xef4\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9bվ\xd0\xff\xff\xff\xff\xc8CWp\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\xd2$\x10\x90\xff\xff\xff\xff\xd3y\x85\x10\xff\xff\xff\xff\xd4\x1b\xad\x90\xff\xff\xff\xff\xd5^\xad\x10\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd7" + + "Gɐ\xff\xff\xff\xff\u05ff\xc2\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#\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\x10" + - "m\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\x0062[\xf0\x00\x00\x00\x006\xfdb\xf0\x00\x00\x00\x008\x1bxp\x00\x00\x00\x008\xdd" + - "D\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb\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`\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\x00MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00E" + - "ET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQM\xe5\xa9 ?\x04\x00\x00?\x04\x00\x00\x11\x00\x1c\x00Europe/Luxembou" + - "rgUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + - "\a\x00\x00\x00\x16\xff\xff\xff\xff\x84\xa2\xad\xbc\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9c\xea\xa7\xe0\xff\xff\xff\xff\x9d\xa4\x99p\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97" + - "\x90\xff\xff\xff\xff\x9f\xe0\xc4p\xff\xff\xff\xff\xa0`\xa5\xf0\xff\xff\xff\xff\xa1~\xe5\xa0\xff\xff\xff\xff\xa2.\x12\xf0\xff\xff\xff\xff\xa3zi\x10\xff\xff\xff\xff\xa45\x81\xf0\xff\xff\xff\xff\xa5^?\x90\xff\xff\xff" + - "\xff\xa6%5\xf0\xff\xff\xff\xff\xa7'\xaa\x00\xff\xff\xff\xff\xa8*\x01\xf0\xff\xff\xff\xff\xa9\a\x9a\x10\xff\xff\xff\xff\xa9\xee4p\xff\xff\xff\xff\xaa\xe7n\x00\xff\xff\xff\xff\xabآp\xff\xff\xff\xff\xac\xc7P" + - "\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\x89k\xf0\xff\xff\xff\xff\xb2p0\x80\xff\xff\xff\xff\xb3r\x88p\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\xc8B0" + - " \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\xb0\x10\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#\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\x00" + - "G\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\x00MM" + - "T\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe1C\xf9\xa1\xde" + - "\x01\x00\x00\xde\x01\x00\x00\r\x00\x1c\x00Europe/SkopjeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + + "\x03\x02\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\xcc\x00\x00\x00\x00\v\xcc\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\rLMT\x00CMT\x00CE" + + "ST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00" + + "\x00\x10\x00\x1c\x00Europe/BucharestUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Qu\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x1c\x00Europe/UlyanovskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\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\x000" + + "d\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" + + "\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\x00L" + + "̣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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03R" + + "\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x1c\x00Europe/NicosiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x006" + + "2x\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\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x1c\x00Europe/BudapestUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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љx\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\xb1" + + "p\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#(\xe8L\xff\xff\xff\xffp\xbc\x81p\xff\xff\xff\xff\x9b" + + "8\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\xd0" + + "n^\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#(\xe8L\xff\xff\xff\xffp\xbc\x81p\xff\xff\xff\xff\x9b8\xf8" + - "p\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#\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\n\x00\x00\x00\x00\x00\x0e|XQ\x1b8\xfel\xd6\x02\x00\x00\xd6\x02\x00\x00\x0e\x00\x1c\x00Europe/Sar" + - "atovUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x002r\x97\xf0\x00\x00\x00\x003=\x9e\xf0\x00\x00\x00\x004Ry\xf0\x00\x00\x00\x005\x1d\x80\xf0\x00\x00\x00\x006" + - "2[\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\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\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\n\x00\x00\x00\x00\x00\x0e|XQDd#\xc4\xf1\x01\x00\x00" + - "\xf1\x01\x00\x00\f\x00\x1c\x00Europe/VaduzUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x10\x00\x1c\x00Europe/MariehamnUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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#\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" + + "\x00MMT\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4" + + "\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x1c\x00Europe/San_MarinoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\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\"L" + + "T\x10\x00\x00\x00\x00#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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00" + + "\x00\x0f\x00\x1c\x00Europe/BelgradeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#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\xad" + - "p\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\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\n\x00\x00\x00\x00\x00\x0e|XQ\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\r\x00\x1c\x00Europe/Lisbo" + - "nUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\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\u007frp" + - "\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ܹ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#\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qߜv\xcf" + + "\x85\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x1c\x00Europe/AndorraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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#\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\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\x00" + + "FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?" + + "\x06\x00\x00?\x06\x00\x00\r\x00\x1c\x00Europe/LondonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa4" + + "N\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\xb2" + + "pL\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\xcf" + + "\x90\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\u007f_ \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\x00" + + "BDST\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qq\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x1c" + + "\x00Europe/TallinnUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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ϒ4\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\"L" + + "7\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\u007f\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\x00TM" + + "T\x00CEST\x00CET\x00EET\x00MSK\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK" + + "\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x1c\x00Europe/ZaporozhyeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc3\b\xff\xff\xff\xff" + + "\xaa\x19\xa30\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xffʪ\xe7\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffν\xd6p\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(\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\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\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\x03\a\x02\a\x02\a\x02\a\x02\a\x02\a\x00\x00 \xf8\x00\x00\x00\x00 \xd0\x00\x04\x00\x00\x1c \x00\n\x00\x00*" + + "0\x00\x0e\x00\x00\x0e\x10\x00\x12\x00\x00\x1c \x01\x16\x00\x008@\x01\x1b\x00\x00*0\x01\x1fLMT\x00+0220\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EE" + + "ST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QVa\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10" + + "\x00\x1c\x00Europe/VolgogradUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x004R" + + "y\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\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x1c\x00Europe/RomeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\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\x0e" + + "9p\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\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#\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\x00" + + "0d\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\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`\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\x00MMT\x00MST\x00MDST" + + "\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x1c\x00E" + + "urope/KievUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1e\xff\xff\xff\xffj\xee\xb0\x18\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С\x9e\xe0\xff\xff\xff\xff\xd1\xe5\xfd\xf0\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\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&\x8d.\xf0\x00\x00\x00\x00'\xf5B\xa0\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\xbc\x90\x00\x00\x00\x000d\xad" + - "\x90\x00\x00\x00\x001]\xd9\x10\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\x01\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x00\x00\x14\xe8\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00" + - "\x1c \x01\b\x00\x008@\x01\r\x00\x00*0\x00\x11\x00\x00\x1c \x00\x15\x00\x00*0\x01\x19LMT\x00CET\x00CEST\x00MSD\x00MSK\x00EET\x00EEST\x00\nE" + - "ET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x1c\x00Eu" + - "rope/KirovUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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)\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\xbc" + + "\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\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\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\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x1c\x00Europe/PragueUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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#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#\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\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\x00" + + "MSD\x00MSK\x00\nEET-2EEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QO+j\x94\x88\x03\x00\x00\x88\x03" + + "\x00\x00\x12\x00\x1c\x00Europe/KaliningradUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xcf" + + "\x924\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\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\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\nEET-2\nPK\x03\x04" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x1c\x00Europe/StockholmUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffT՟\x94\xff\xff\xff\xff|Us" + + "b\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9b\xd5\xda\xf0\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#\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`\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\x00" + - "8@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xea\xc48\xde\\\x02\x00\x00\\\x02\x00" + - "\x00\r\x00\x1c\x00Europe/TiraneUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xb9" + - "p\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\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#\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\xcc" + - "\x93\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\x00CES" + - "T\x00MSD\x00MSK\x00\nEET-2EEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe1C\xf9\xa1\xde\x01\x00\x00" + - "\xde\x01\x00\x00\x0f\x00\x1c\x00Europe/SarajevoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\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\x00C" + + "ET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01" + + "\x00\x00\x0f\x00\x1c\x00Europe/HelsinkiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + + "#\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\x00" + + "8@\x01\x1d\x00\x00*0\x01!LMT\x00WMT\x00KMT\x00CET\x00EET\x00MSK\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M" + + "3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x1c\x00Europe/Belfa" + + "stUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_" + + " \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\n\x00\x00\x00\x00\x00\xb8K\x97QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x1c\x00Europe/BratislavaUT\t\x00" + + "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#(\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\v" + - "u\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,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQk\xa4,\xb6?\x06\x00\x00" + - "?\x06\x00\x00\x0e\x00\x1c\x00Europe/BelfastUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_ \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\x00BD" + - "ST\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x1c\x00E" + - "urope/BratislavaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xcf" + - "\x924\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\x12" + - "T\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#\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\x00" + - "J\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\x00EES" + - "T\x00EET\x00MSD\x00MSK\x00+03\x00\nEET-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x1c\x00Europ" + - "e/ZaporozhyeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "ڐ\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\x04\x03\x04\x03\x04\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\x06\x05\x06\x05\x06\x05\x06\x00\x00\x04\x94\x00\x00\x00\x00\x12\xa4\x01\x04\x00\x00\x04\x94\x00\b\x00\x00\x04\xb0\x00\f\x00\x00\x12\xc0\x01\x12\x00\x00\x0e\x10\x00\x18\x00\x00\x1c \x01\x1cLMT\x00NST" + + "\x00AMT\x00+0020\x00+0120\x00CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\r\x00\x1c\x00Europe/BerlinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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#\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\x00CET\x00EET\x00MSK\x00CEST\x00MSD" + - "\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQn\x81\xf4\xd7Z\x04\x00\x00Z\x04" + - "\x00\x00\r\x00\x1c\x00Europe/MonacoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\a\x00\x00\x00\x1f\xff\xff\xff\xffn\x11\x9f\x94\xff\xff\xff\xff\x91x\vO\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\xca\x17[\xf0\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\u03a2C\x10\xff\xff" + - "\xff\xffϒ4\x10\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#\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\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\n\x00\x00\x00\x00\x00\x0e|XQz\xc3\xe8Ra\x03\x00\x00a\x03\x00\x00\x11\x00\x1c\x00Europe/SimferopolUT\t\x00\x03\xec," + - "\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xff" + - "V\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)\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-\xc2\xc6\xd0\x00\x00\x00\x00.\x84\x85@\x00\x00\x00\x00/t\x84P\x00\x00\x00\x000dg@\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\u007f\x10\x00\x00\x00\x008\x1b\x94\x90\x00\x00\x00\x00" + - "8\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\x00" + - "G#\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\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\n\x00\x00\x00\x00\x00\x0e|XQ" + - "q\xf7p*\xd6\x02\x00\x00\xd6\x02\x00\x00\x10\x00\x1c\x00Europe/VolgogradUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\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\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\x00[\xd4\xed\xf0\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\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<+" + - "04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x12\x00\x1c\x00Europe/Isle_of_ManUT\t\x00\x03\xec" + - ",\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_ \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\n\x00\x00\x00\x00\x00\x0e|XQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x1c\x00Europe/LondonUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xb7" + - "2v\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\xc5" + - "8[ \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\xd3" + - "c)\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\xdf" + - "\xae\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\u007f_ \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\n\x00\x00\x00\x00" + - "\x00\x0e|XQgp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x1c\x00Europe/RigaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\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\xce" + - "\xa2C\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ۀ\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\u007f\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\x00E" + - "EST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQߜvυ\x01\x00\x00\x85\x01\x00\x00" + - "\x0e\x00\x1c\x00Europe/AndorraUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + + "\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x03\x00\x00\x00\r\xff\xff\xff\xffr\xee$l\xff\xff\xff\xff\x9b'\xe3\x00\xff\xff\xff\xff\x9b\xd4{`\xff\xff\xff\xffȷM`\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xff\xcd" + + "\xa9\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\xeb\xaf \x90\xff\xff\xff\xff\xec\xa8L\x10\xff" + + "\xff\xff\xff\xed\x98=\x10\xff\xff\xff\xff\xee\x88.\x10\xff\xff\xff\xff\xefx\x1f\x10\xff\xff\xff\xff\xf0h\x10\x10\xff\xff\xff\xff\xf1X\x01\x10\xff\xff\xff\xff\xf2G\xf2\x10\xff\xff\xff\xff\xf37\xe3\x10\xff\xff\xff\xff\xf4" + + "'\xd4\x10\xff\xff\xff\xff\xf5\x17\xc5\x10\xff\xff\xff\xff\xf6\x10\xf0\x90\xff\xff\xff\xff\xf7/\x06\x10\xff\xff\xff\xff\xf7\xf0Ґ\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#(\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" + + "\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\n" + + "CET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x12\x00\x1c\x00Eur" + + "ope/Isle_of_ManUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xfd" + + "q \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\u007f_ \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\xf0" + + "N \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\xe3" + + "\xaf\x90\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\nGMT" + + "0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x1c\x00Europe/W" + + "arsawUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + + "#\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`\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\n\x00\x00\x00\x00\x00\xb8K\x97Q==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x1c\x00Europe/GibraltarUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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#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#\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x1c\x00Europe/TiraneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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#" + - "\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\n\x00\x00\x00\x00\x00\x0e|XQ\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x1c\x00Europe/CopenhagenUT\t\x00\x03\xec,\x94_" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x11\xff\xff\xff\xffi\x86" + - "ϴ\xff\xff\xff\xffq\f\xef4\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9bվ\xd0\xff\xff\xff\xff\xc8CWp\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\xd2$\x10\x90\xff\xff\xff\xff\xd3y\x85\x10\xff\xff\xff\xff\xd4\x1b\xad\x90\xff\xff\xff\xff\xd5^\xad\x10\xff\xff\xff\xff\xd5\xdf" + - "\xe0\x10\xff\xff\xff\xff\xd7Gɐ\xff\xff\xff\xff\u05ff\xc2\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#" + - "\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\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\x00MS" + - "K\x00\nEET-2EEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x10\x00\x1c\x00" + - "Europe/MariehamnUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x1c\x00Europe/DublinUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + + "\xdc\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\u007f_ \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$\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x1c\x00Europe/SamaraUT\t" + + "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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)\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\x00" + + "5\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\x00" + + "Cc\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xab\x80c$q\x00\x00\x00q" + + "\x00\x00\x00\a\x00\x1c\x00FactoryUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00" + + "\x00\x02\x00\x1c\x00GBUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_ \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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x1c\x00GB-EireUT\t\x00\x03\xfc\xff\xe2_" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_ \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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00GMTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c\x00GMT+0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda" + + "\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c\x00GMT-0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00" + + "o\x00\x00\x00\x04\x00\x1c\x00GMT0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c" + + "\x00GreenwichUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\b\x00\x1c\x00H" + + "ongkongUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x1c\x00" + + "HSTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x1c\x00Iceland" + + "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00" + + "\x00\x00\x10\xff\xff\xff\xff\x8b`\x83\xa0\xff\xff\xff\xff\x9c\x91\x1e\x00\xff\xff\xff\xff\x9dш\x90\xff\xff\xff\xff\x9erQ\x80\xff\xff\xff\xff\x9f\xd5\x03\x10\xff\xff\xff\xff\xa0S\x85\x00\xff\xff\xff\xff\xa1\xb66\x90\xff" + + "\xff\xff\xff\xa4<'\x80\xff\xff\xff\xff\xa4\xb9t\x10\xff\xff\xff\xff\xc6M\x1a\x00\xff\xff\xff\xff\xc7=' \xff\xff\xff\xff\xc7\xda\x17\xb0\xff\xff\xff\xff\xc9&C\xa0\xff\xff\xff\xff\xc9\xc3& \xff\xff\xff\xff\xcb" + + "\x06%\xa0\xff\xff\xff\xffˬB\xa0\xff\xff\xff\xff\xcc\xdc\xcd \xff\xff\xff\xff͌$\xa0\xff\xff\xff\xffμ\xaf \xff\xff\xff\xff\xcfl\x06\xa0\xff\xff\xff\xffМ\x91 \xff\xff\xff\xff\xd1K\xe8\xa0\xff" + + "\xff\xff\xff҅\xad\xa0\xff\xff\xff\xff\xd3+ʠ\xff\xff\xff\xff\xd4e\x8f\xa0\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd6Eq\xa0\xff\xff\xff\xff\xd7\x19\xb3 \xff\xff\xff\xff\xd8%S\xa0\xff\xff\xff\xff\xd8" + + "\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xd9w \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xce4 \xff\xff\xff\xffޢu\xa0\xff\xff\xff\xff߮\x16 \xff" + + "\xff\xff\xff\xe0\x82W\xa0\xff\xff\xff\xff\xe1\x8d\xf8 \xff\xff\xff\xff\xe2b9\xa0\xff\xff\xff\xff\xe3m\xda \xff\xff\xff\xff\xe4B\x1b\xa0\xff\xff\xff\xff\xe5M\xbc \xff\xff\xff\xff\xe6!\xfd\xa0\xff\xff\xff\xff\xe7" + + "6ؠ\xff\xff\xff\xff\xe8\v\x1a \xff\xff\xff\xff\xe9\x16\xba\xa0\xff\xff\xff\xff\xe9\xea\xfc \xff\xff\xff\xff\xea\xf6\x9c\xa0\xff\xff\xff\xff\xeb\xca\xde \xff\xff\xff\xff\xec\xd6~\xa0\xff\xff\xff\xff\xed\xaa\xc0 \xff" + + "\xff\xff\xff\xee\xb6`\xa0\xff\xff\xff\xff\uf2a2 \xff\xff\xff\xff\xf0\x96B\xa0\xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2\u007f_ \xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5" + + "3\x82\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x13d\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xf3F\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xd3(\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff" + + "\xff\xff\xff\xfc\xbcE \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xeb`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00GMT\x00\nGMT0" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Indian/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x13\x00\x1c\x00Indian/AntananarivoUT\t\x00\x03" + + "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00" + + "\r\x00\x1c\x00Indian/ComoroUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/ChristmasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffs\x16\xa9\xe4\x01\x00\x00c\x1c\x00\x00" + + "\x00\x00bp\x00\x04LMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qa\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Indian/" + + "MaheUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x89\u007f\a\x84\x01\x00\x003\xfc\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcd" + + "\xb2\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x1c\x00Indian/CocosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\xc3" + - "\x83\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\x001]\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\x00E" + - "ET\x00CET\x00CEST\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x1c\x00Europe/AthensUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZ" + + "\x00\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|U&\xa4\x01\x00\x00Z\xdc\x00\x00\x00\x00[h\x00\x04LMT\x00+0630" + + "\x00\n<+0630>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x1c\x00Indian/Maldives" + + "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/KerguelenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdaab\x80\x01\x00\x00" + + "\x00\x00\x00\x00\x00\x00FP\x00\x04-00\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x1c\x00Ind" + + "ian/MauritiusUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Qx\xb0W\x14\x98\x00" + + "\x00\x00\x98\x00\x00\x00\r\x00\x1c\x00Indian/ChagosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Indian/" + + "MayotteUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "y(\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Indian/ReunionUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xa8P\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\xdc" + - "\x90\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#\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\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQo\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x1c\x00Europe/BrusselsU" + - "T\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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#\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x1c\x00Europe/WarsawUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\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#0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x1c\x00GBUT\t\x00\x03\xec" + - ",\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_ \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\n\x00\x00\x00\x00\x00\x0e|XQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x1c\x00GB-EireUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f_ \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\n\x00\x00\x00\x00\x00\x0e|XQP" + - "\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00GMTUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o" + - "\x00\x00\x00\x05\x00\x1c\x00GMT+0UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\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\x91\xcc9\x80\x01\x00\x004\x00\x00\x00\x00\x008@\x00\x04LMT\x00+0" + + "4\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x1c\x00IranUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff" + + "\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft-@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\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\x00" + + "M\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\x00\x00\x00\x00d\x1a\x13\xc8\x00\x00\x00\x00e\f\x99\xb8\x00\x00\x00\x00e\xfbGH\x00\x00\x00\x00f\xed\xcd8\x00\x00\x00\x00g\xdd\xccH\x00\x00\x00\x00h\xd0R8\x00\x00\x00\x00" + + "i\xbe\xff\xc8\x00\x00\x00\x00j\xb1\x85\xb8\x00\x00\x00\x00k\xa03H\x00\x00\x00\x00l\x92\xb98\x00\x00\x00\x00m\x81f\xc8\x00\x00\x00\x00ns\xec\xb8\x00\x00\x00\x00ob\x9aH\x00\x00\x00\x00pU 8" + + "\x00\x00\x00\x00qE\x1fH\x00\x00\x00\x00r7\xa58\x00\x00\x00\x00s&R\xc8\x00\x00\x00\x00t\x18ظ\x00\x00\x00\x00u\a\x86H\x00\x00\x00\x00u\xfa\f8\x00\x00\x00\x00v\xe8\xb9\xc8\x00\x00\x00\x00" + + "w\xdb?\xb8\x00\x00\x00\x00x\xcb>\xc8\x00\x00\x00\x00y\xbdĸ\x00\x00\x00\x00z\xacrH\x00\x00\x00\x00{\x9e\xf88\x00\x00\x00\x00|\x8d\xa5\xc8\x00\x00\x00\x00}\x80+\xb8\x00\x00\x00\x00~n\xd9H" + + "\x00\x00\x00\x00\u007fa_8\x00\x00\x00\x00\x80Q^H\x00\x00\x00\x00\x81C\xe48\x00\x00\x00\x00\x822\x91\xc8\x00\x00\x00\x00\x83%\x17\xb8\x00\x00\x00\x00\x84\x13\xc5H\x00\x00\x00\x00\x85\x06K8\x00\x00\x00\x00" + + "\x85\xf4\xf8\xc8\x00\x00\x00\x00\x86\xe7~\xb8\x00\x00\x00\x00\x87\xd7}\xc8\x00\x00\x00\x00\x88\xca\x03\xb8\x00\x00\x00\x00\x89\xb8\xb1H\x00\x00\x00\x00\x8a\xab78\x00\x00\x00\x00\x8b\x99\xe4\xc8\x00\x00\x00\x00\x8c\x8cj\xb8" + + "\x00\x00\x00\x00\x8d{\x18H\x00\x00\x00\x00\x8em\x9e8\x00\x00\x00\x00\x8f]\x9dH\x00\x00\x00\x00\x90P#8\x00\x00\x00\x00\x91>\xd0\xc8\x00\x00\x00\x00\x921V\xb8\x00\x00\x00\x00\x93 \x04H\x00\x00\x00\x00" + + "\x94\x12\x8a8\x00\x00\x00\x00\x95\x017\xc8\x00\x00\x00\x00\x95\xf3\xbd\xb8\x00\x00\x00\x00\x96\xe3\xbc\xc8\x00\x00\x00\x00\x97\xd6B\xb8\x00\x00\x00\x00\x98\xc4\xf0H\x00\x00\x00\x00\x99\xb7v8\x00\x00\x00\x00\x9a\xa6#\xc8" + + "\x00\x00\x00\x00\x9b\x98\xa9\xb8\x00\x00\x00\x00\x9c\x87WH\x00\x00\x00\x00\x9dy\xdd8\x00\x00\x00\x00\x9ei\xdcH\x00\x00\x00\x00\x9f\\b8\x00\x00\x00\x00\xa0K\x0f\xc8\x00\x00\x00\x00\xa1=\x95\xb8\x00\x00\x00\x00" + + "\xa2,CH\x00\x00\x00\x00\xa3\x1e\xc98\x00\x00\x00\x00\xa4\rv\xc8\x00\x00\x00\x00\xa4\xff\xfc\xb8\x00\x00\x00\x00\xa5\xef\xfb\xc8\x00\x00\x00\x00\xa6⁸\x00\x00\x00\x00\xa7\xd1/H\x00\x00\x00\x00\xa8õ8" + + "\x00\x00\x00\x00\xa9\xb2b\xc8\x00\x00\x00\x00\xaa\xa4\xe8\xb8\x00\x00\x00\x00\xab\x93\x96H\x00\x00\x00\x00\xac\x86\x1c8\x00\x00\x00\x00\xadt\xc9\xc8\x00\x00\x00\x00\xaegO\xb8\x00\x00\x00\x00\xafWN\xc8\x00\x00\x00\x00" + + "\xb0IԸ\x00\x00\x00\x00\xb18\x82H\x00\x00\x00\x00\xb2+\b8\x00\x00\x00\x00\xb3\x19\xb5\xc8\x00\x00\x00\x00\xb4\f;\xb8\x00\x00\x00\x00\xb4\xfa\xe9H\x00\x00\x00\x00\xb5\xedo8\x00\x00\x00\x00\xb6\xddnH" + + "\x00\x00\x00\x00\xb7\xcf\xf48\x00\x00\x00\x00\xb8\xbe\xa1\xc8\x00\x00\x00\x00\xb9\xb1'\xb8\x00\x00\x00\x00\xba\x9f\xd5H\x00\x00\x00\x00\xbb\x92[8\x00\x00\x00\x00\xbc\x81\b\xc8\x00\x00\x00\x00\xbds\x8e\xb8\x00\x00\x00\x00" + + "\xbec\x8d\xc8\x00\x00\x00\x00\xbfV\x13\xb8\x00\x00\x00\x00\xc0D\xc1H\x00\x00\x00\x00\xc17G8\x00\x00\x00\x00\xc2%\xf4\xc8\x00\x00\x00\x00\xc3\x18z\xb8\x00\x00\x00\x00\xc4\a(H\x00\x00\x00\x00\xc4\xf9\xae8" + + "\x00\x00\x00\x00\xc5\xe9\xadH\x00\x00\x00\x00\xc6\xdc38\x00\x00\x00\x00\xc7\xca\xe0\xc8\x00\x00\x00\x00Ƚf\xb8\x00\x00\x00\x00ɬ\x14H\x00\x00\x00\x00ʞ\x9a8\x00\x00\x00\x00ˍG\xc8\x00\x00\x00\x00" + + "\xcc\u007f\u0378\x00\x00\x00\x00\xcdo\xcc\xc8\x00\x00\x00\x00\xcebR\xb8\x00\x00\x00\x00\xcfQ\x00H\x00\x00\x00\x00\xd0C\x868\x00\x00\x00\x00\xd123\xc8\x00\x00\x00\x00\xd2$\xb9\xb8\x00\x00\x00\x00\xd3\x13gH" + + "\x00\x00\x00\x00\xd4\x05\xed8\x00\x00\x00\x00\xd4\xf5\xecH\x00\x00\x00\x00\xd5\xe8r8\x00\x00\x00\x00\xd6\xd7\x1f\xc8\x00\x00\x00\x00\xd7ɥ\xb8\x00\x00\x00\x00ظSH\x00\x00\x00\x00٪\xd98\x00\x00\x00\x00" + + "ڙ\x86\xc8\x00\x00\x00\x00ی\f\xb8\x00\x00\x00\x00\xdc|\v\xc8\x00\x00\x00\x00\xddn\x91\xb8\x00\x00\x00\x00\xde]?H\x01\x02\x04\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\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\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\x00\x000" + + "8\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00FP\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00+04\x00+0430" + + "\x00\n<+0330>-3:30<+0430>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17✳2\x04\x00\x002" + + "\x04\x00\x00\x06\x00\x1c\x00IsraelUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00" + + "1H\x96\xe0\x00\x00\x00\x002\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\x00" + + "M\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\x00IS" + + "T\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q%J\xd5\xebS\x01\x00\x00S\x01\x00" + + "\x00\a\x00\x1c\x00JamaicaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c" + - "\x00GMT-0UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\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" + + "\x00KMT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x1c\x00JapanUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x1c\x00KwajaleinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q_\u007f2[\xaf" + + "\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x1c\x00LibyaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x003" + + "D6p\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\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00METUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x11" + + "d'\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#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\x88" + - "0(\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\x12o" + - "l\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\x00J" + - "ST\x00\nHKT-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x1c\x00IcelandUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x10\xff\xff\xff\xff\x8b`\x83\xa0\xff\xff" + - "\xff\xff\x9c\x91\x1e\x00\xff\xff\xff\xff\x9dш\x90\xff\xff\xff\xff\x9erQ\x80\xff\xff\xff\xff\x9f\xd5\x03\x10\xff\xff\xff\xff\xa0S\x85\x00\xff\xff\xff\xff\xa1\xb66\x90\xff\xff\xff\xff\xa4<'\x80\xff\xff\xff\xff\xa4\xb9" + - "t\x10\xff\xff\xff\xff\xc6M\x1a\x00\xff\xff\xff\xff\xc7=' \xff\xff\xff\xff\xc7\xda\x17\xb0\xff\xff\xff\xff\xc9&C\xa0\xff\xff\xff\xff\xc9\xc3& \xff\xff\xff\xff\xcb\x06%\xa0\xff\xff\xff\xffˬB\xa0\xff\xff" + - "\xff\xff\xcc\xdc\xcd \xff\xff\xff\xff͌$\xa0\xff\xff\xff\xffμ\xaf \xff\xff\xff\xff\xcfl\x06\xa0\xff\xff\xff\xffМ\x91 \xff\xff\xff\xff\xd1K\xe8\xa0\xff\xff\xff\xff҅\xad\xa0\xff\xff\xff\xff\xd3+" + - "ʠ\xff\xff\xff\xff\xd4e\x8f\xa0\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd6Eq\xa0\xff\xff\xff\xff\xd7\x19\xb3 \xff\xff\xff\xff\xd8%S\xa0\xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff" + - "\xff\xff\xda\xd9w \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xce4 \xff\xff\xff\xffޢu\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x82W\xa0\xff\xff\xff\xff\xe1\x8d" + - "\xf8 \xff\xff\xff\xff\xe2b9\xa0\xff\xff\xff\xff\xe3m\xda \xff\xff\xff\xff\xe4B\x1b\xa0\xff\xff\xff\xff\xe5M\xbc \xff\xff\xff\xff\xe6!\xfd\xa0\xff\xff\xff\xff\xe76ؠ\xff\xff\xff\xff\xe8\v\x1a \xff\xff" + - "\xff\xff\xe9\x16\xba\xa0\xff\xff\xff\xff\xe9\xea\xfc \xff\xff\xff\xff\xea\xf6\x9c\xa0\xff\xff\xff\xff\xeb\xca\xde \xff\xff\xff\xff\xec\xd6~\xa0\xff\xff\xff\xff\xed\xaa\xc0 \xff\xff\xff\xff\xee\xb6`\xa0\xff\xff\xff\xff\xef\x8a" + - "\xa2 \xff\xff\xff\xff\xf0\x96B\xa0\xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2\u007f_ \xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf53\x82\xa0\xff\xff\xff\xff\xf6?# \xff\xff" + - "\xff\xff\xf7\x13d\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xf3F\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xd3(\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc\xbcE \x02\x01\x02\x01\x02\x01" + - "\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xeb`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Indian/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00" + - "\x00\x00\x00\x0e|XQ\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x1c\x00Indian/MauritiusUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\x89\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQx\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00\x1c\x00Indian/ChagosUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x0e\x00\x1c\x00Indian/MayotteUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + + "\x16\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT" + + "\x00MST\x00CST\x00PST\x00MDT\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xe1Հ\x9c" + + "\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c\x00Mexico/GeneralUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\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\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01" + + "\x10LMT\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0" + + "v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00Mexico/BajaNorteUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\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\xf6\x80\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\xe0" + + "\xaf\xa0\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\x02" + + "5\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00MSTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x01\x00\x00\x00\x04\xff\xff\x9d\x90\x00\x00MST\x00\nMST7\nPK\x03\x04" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe6h\xcac\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00MST7MDTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8" + - "\xff\xff\xff\xff\xed/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT" + - "-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/ChristmasUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffs\x16\xa9\xe4" + - "\x01\x00\x00c\x1c\x00\x00\x00\x00bp\x00\x04LMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQͲ\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x1c\x00" + - "Indian/CocosUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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|U&\xa4\x01\x00\x00Z\xdc\x00\x00\x00\x00[h\x00\x04LMT\x00+0630\x00\n<+0630>-6:30\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x1c\x00Indian/MaldivesUT\t\x00\x03\xec,\x94_\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xeb" + - "E1\u05f6\x00\x00\x00\xb6\x00\x00\x00\r\x00\x1c\x00Indian/ComoroUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif" + + "\x00\x00\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\u007f\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\n\x00\x00\x00" + + "\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x1c\x00NavajoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff\xed" + - "/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT-3\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQy(\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Indian/ReunionUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x91\xcc9\x80\x01\x00\x004\x00\x00\x00" + - "\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xbd\xf3\x17\xf1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Indian/" + - "MaheUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x88d\xe6\x84\x01\x00\x003\xfc\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xb8" + - "K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/KerguelenUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\xdaab\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00FP\x00\x04-00\x00+" + - "05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x13\x00\x1c\x00Indian/Antananariv" + - "oUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff\xb1\xee\xda\xfc\xff\xff\xff\xff\xb4\u009a\xd0\xff\xff\xff\xffǑG\xd8\xff\xff\xff\xff\xed/\xe1\xd4\x01\x02\x03\x01\x00\x00\"\x84\x00\x00\x00\x00*0\x00\x04\x00\x00#(\x00\b\x00\x00" + - "&\xac\x00\x0eLMT\x00EAT\x00+0230\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x1c" + - "\x00IranUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9" + - "\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft-@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00" + - "\x11Ug\xc8\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\x00" + - "2B\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\x00" + - "R=\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\x00\x00\x00\x00d\x1a\x13\xc8\x00\x00\x00\x00e\f\x99\xb8\x00\x00\x00\x00e\xfbGH\x00\x00\x00\x00f\xed\xcd8" + - "\x00\x00\x00\x00g\xdd\xccH\x00\x00\x00\x00h\xd0R8\x00\x00\x00\x00i\xbe\xff\xc8\x00\x00\x00\x00j\xb1\x85\xb8\x00\x00\x00\x00k\xa03H\x00\x00\x00\x00l\x92\xb98\x00\x00\x00\x00m\x81f\xc8\x00\x00\x00\x00" + - "ns\xec\xb8\x00\x00\x00\x00ob\x9aH\x00\x00\x00\x00pU 8\x00\x00\x00\x00qE\x1fH\x00\x00\x00\x00r7\xa58\x00\x00\x00\x00s&R\xc8\x00\x00\x00\x00t\x18ظ\x00\x00\x00\x00u\a\x86H" + - "\x00\x00\x00\x00u\xfa\f8\x00\x00\x00\x00v\xe8\xb9\xc8\x00\x00\x00\x00w\xdb?\xb8\x00\x00\x00\x00x\xcb>\xc8\x00\x00\x00\x00y\xbdĸ\x00\x00\x00\x00z\xacrH\x00\x00\x00\x00{\x9e\xf88\x00\x00\x00\x00" + - "|\x8d\xa5\xc8\x00\x00\x00\x00}\x80+\xb8\x00\x00\x00\x00~n\xd9H\x00\x00\x00\x00\u007fa_8\x00\x00\x00\x00\x80Q^H\x00\x00\x00\x00\x81C\xe48\x00\x00\x00\x00\x822\x91\xc8\x00\x00\x00\x00\x83%\x17\xb8" + - "\x00\x00\x00\x00\x84\x13\xc5H\x00\x00\x00\x00\x85\x06K8\x00\x00\x00\x00\x85\xf4\xf8\xc8\x00\x00\x00\x00\x86\xe7~\xb8\x00\x00\x00\x00\x87\xd7}\xc8\x00\x00\x00\x00\x88\xca\x03\xb8\x00\x00\x00\x00\x89\xb8\xb1H\x00\x00\x00\x00" + - "\x8a\xab78\x00\x00\x00\x00\x8b\x99\xe4\xc8\x00\x00\x00\x00\x8c\x8cj\xb8\x00\x00\x00\x00\x8d{\x18H\x00\x00\x00\x00\x8em\x9e8\x00\x00\x00\x00\x8f]\x9dH\x00\x00\x00\x00\x90P#8\x00\x00\x00\x00\x91>\xd0\xc8" + - "\x00\x00\x00\x00\x921V\xb8\x00\x00\x00\x00\x93 \x04H\x00\x00\x00\x00\x94\x12\x8a8\x00\x00\x00\x00\x95\x017\xc8\x00\x00\x00\x00\x95\xf3\xbd\xb8\x00\x00\x00\x00\x96\xe3\xbc\xc8\x00\x00\x00\x00\x97\xd6B\xb8\x00\x00\x00\x00" + - "\x98\xc4\xf0H\x00\x00\x00\x00\x99\xb7v8\x00\x00\x00\x00\x9a\xa6#\xc8\x00\x00\x00\x00\x9b\x98\xa9\xb8\x00\x00\x00\x00\x9c\x87WH\x00\x00\x00\x00\x9dy\xdd8\x00\x00\x00\x00\x9ei\xdcH\x00\x00\x00\x00\x9f\\b8" + - "\x00\x00\x00\x00\xa0K\x0f\xc8\x00\x00\x00\x00\xa1=\x95\xb8\x00\x00\x00\x00\xa2,CH\x00\x00\x00\x00\xa3\x1e\xc98\x00\x00\x00\x00\xa4\rv\xc8\x00\x00\x00\x00\xa4\xff\xfc\xb8\x00\x00\x00\x00\xa5\xef\xfb\xc8\x00\x00\x00\x00" + - "\xa6⁸\x00\x00\x00\x00\xa7\xd1/H\x00\x00\x00\x00\xa8õ8\x00\x00\x00\x00\xa9\xb2b\xc8\x00\x00\x00\x00\xaa\xa4\xe8\xb8\x00\x00\x00\x00\xab\x93\x96H\x00\x00\x00\x00\xac\x86\x1c8\x00\x00\x00\x00\xadt\xc9\xc8" + - "\x00\x00\x00\x00\xaegO\xb8\x00\x00\x00\x00\xafWN\xc8\x00\x00\x00\x00\xb0IԸ\x00\x00\x00\x00\xb18\x82H\x00\x00\x00\x00\xb2+\b8\x00\x00\x00\x00\xb3\x19\xb5\xc8\x00\x00\x00\x00\xb4\f;\xb8\x00\x00\x00\x00" + - "\xb4\xfa\xe9H\x00\x00\x00\x00\xb5\xedo8\x00\x00\x00\x00\xb6\xddnH\x00\x00\x00\x00\xb7\xcf\xf48\x00\x00\x00\x00\xb8\xbe\xa1\xc8\x00\x00\x00\x00\xb9\xb1'\xb8\x00\x00\x00\x00\xba\x9f\xd5H\x00\x00\x00\x00\xbb\x92[8" + - "\x00\x00\x00\x00\xbc\x81\b\xc8\x00\x00\x00\x00\xbds\x8e\xb8\x00\x00\x00\x00\xbec\x8d\xc8\x00\x00\x00\x00\xbfV\x13\xb8\x00\x00\x00\x00\xc0D\xc1H\x00\x00\x00\x00\xc17G8\x00\x00\x00\x00\xc2%\xf4\xc8\x00\x00\x00\x00" + - "\xc3\x18z\xb8\x00\x00\x00\x00\xc4\a(H\x00\x00\x00\x00\xc4\xf9\xae8\x00\x00\x00\x00\xc5\xe9\xadH\x00\x00\x00\x00\xc6\xdc38\x00\x00\x00\x00\xc7\xca\xe0\xc8\x00\x00\x00\x00Ƚf\xb8\x00\x00\x00\x00ɬ\x14H" + - "\x00\x00\x00\x00ʞ\x9a8\x00\x00\x00\x00ˍG\xc8\x00\x00\x00\x00\xcc\u007f\u0378\x00\x00\x00\x00\xcdo\xcc\xc8\x00\x00\x00\x00\xcebR\xb8\x00\x00\x00\x00\xcfQ\x00H\x00\x00\x00\x00\xd0C\x868\x00\x00\x00\x00" + - "\xd123\xc8\x00\x00\x00\x00\xd2$\xb9\xb8\x00\x00\x00\x00\xd3\x13gH\x00\x00\x00\x00\xd4\x05\xed8\x00\x00\x00\x00\xd4\xf5\xecH\x00\x00\x00\x00\xd5\xe8r8\x00\x00\x00\x00\xd6\xd7\x1f\xc8\x00\x00\x00\x00\xd7ɥ\xb8" + - "\x00\x00\x00\x00ظSH\x00\x00\x00\x00٪\xd98\x00\x00\x00\x00ڙ\x86\xc8\x00\x00\x00\x00ی\f\xb8\x00\x00\x00\x00\xdc|\v\xc8\x00\x00\x00\x00\xddn\x91\xb8\x00\x00\x00\x00\xde]?H\x01\x02\x04\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\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\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\x00\x0008\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00FP\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT" + - "\x00+0330\x00+05\x00+04\x00+0430\x00\n<+0330>-3:30<+0430>,J79/24,J263/24\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xba'\xa0z \x04\x00\x00 \x04\x00\x00\x06\x00\x1c\x00IsraelUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\x00b\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\xb2\xe0" + - "\xff\xff\xff\xff\xcc\xe5\xc1P\xff\xff\xff\xffͬ\xfe\x00\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Ҋ\xc9p\xff\xff\xff\xff" + - "\xd3e\xb0\x80\xff\xff\xff\xff\xd4k\xe0\xd0\xff\xff\xff\xff\xd7Z\x14`\xff\xff\xff\xff\xd7\xdf\x1f\xc0\xff\xff\xff\xff\xd8/\xb5p\xff\xff\xff\xff\xd9\x1eF\xe0\xff\xff\xff\xff\xda\x10\xe8\xf0\xff\xff\xff\xff\xda\xeb\xb3\xe0" + - "\xff\xff\xff\xff۴4\x00\xff\xff\xff\xffܹ \xe0\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\xbeJ`\xff\xff\xff\xff\xe364\xd0\xff\xff\xff\xff\xe4\x9c\xf7\x00\xff\xff\xff\xff\xe5\x16\x16\xd0\xff\xff\xff\xff\xe6t\xd3\xe0\xff\xff\xff\xff\xe7\x11Ҁ\xff\xff\xff\xff\xe8'\xff\x00\xff\xff\xff\xff\xe8\xe8O\xd0" + - "\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\xe8\xaa\xe0\x00\x00\x00\x00\x14 \t\xe0\x00\x00\x00\x00\x1a\xf9t\xe0\x00\x00\x00\x00" + - "\x1b\x8d\x1c\xe0\x00\x00\x00\x00\x1c\xbe\xf8\xe0\x00\x00\x00\x00\x1d\x89\xf1\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\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\x00" + - "F\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\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\n\x00\x00\x00\x00\x00\x0e|XQ%J\xd5\xebS\x01\x00\x00S" + - "\x01\x00\x00\a\x00\x1c\x00JamaicaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\fL" + - "MT\x00KMT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x1c\x00JapanUT\t\x00" + - "\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x1c\x00KwajaleinUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ_\u007f2" + - "[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x1c\x00LibyaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 pJ" + - "p\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\nEET-2\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00METUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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#\x8f\xec\x90\x00\x00\x00\x00?\x9b\u007f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00B" + - "O\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\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,M" + - "11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Mexico/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00Mexico/BajaNorteUT" + - "\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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\x00MST\x00PST\x00PDT\x00P" + - "WT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c" + - "\x00Mexico/GeneralUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\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\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\x01\x02\x01\x02\x01\x02" + - "\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10LMT\x00MST\x00C" + - "ST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ8\xcdZ\x05o\x01\x00\x00o\x01\x00" + - "\x00\x0e\x00\x1c\x00Mexico/BajaSurUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\f" + - "6`\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff" + - "\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00PST\x00MDT\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00" + - "\x00\x00\x00\x00\x0e|XQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x1c\x00NZUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe5" + - "h\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\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\n\x00\x00\x00\x00\x00\x0e|XQ\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x1c\x00NZ-CHATUT\t\x00\x03\xec" + - ",\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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+1" + - "245\x00\n<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x1c\x00NavajoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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" + + "\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\u007f\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\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\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\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x1c\x00PRCUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\x0e|XQŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00PST8PDTUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x13i" + - "r \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\x00PST\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00Pacific/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00\x00" + - "\x00\x00\x0e|XQn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x1c\x00Pacific/Port_MoresbyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xcc\xf3" + - "9a\xc3\x00\x00\x00\xc3\x00\x00\x00\r\x00\x1c\x00Pacific/ChuukUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + + "\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\nMST7M" + + "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x1c\x00NZUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00NZS" + + "T\x00NZMT\x00NZDT\x00\nNZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xc5FF(" + + "\x03\x00\x00(\x03\x00\x00\a\x00\x1c\x00NZ-CHATUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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>-12:45<+1345>,M9.5.0/2:4" + + "5,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00Pacific/UT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/Wa" + + "llisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\b\xa8\x01\x00\x00\xacX\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x1c\x00Pacific/EasterUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "if3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00f\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(v" + + "0\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 \u007f\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\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\xff\xff\x99x\x00\x00\xff\xff\x99" + + "x\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x1c\x00Pacific/Ga" + + "mbierUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81" + + "\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x1c\x00Pacific/NiueUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09" + - "\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00" + - "\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x1c\x00Pacific/EasterUT\t\x00\x03\xec" + - ",\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\x00f\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 \u007f\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\xea" + - "0\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\xc8" + - "0\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\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\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf6\xe8" + - "]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x1c\x00Pacific/KwajaleinUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00\x0e|XQP:\xc0\x8c\xed\x00\x00\x00" + - "\xed\x00\x00\x00\x11\x00\x1c\x00Pacific/TongatapuUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6\a\xb8\xff\xff\xff\xff\xc9sB\x90\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-13\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\v\x00\x1c\x00Pacific/YapUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00T" + + "\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\x14\xff\xff\xff\xff~7TL\xff\xff\xff\xff\xdcC5`\x00\x00\x00\x00\x10t\xca8\x01\x02\x03\xff\xff`" + + "\xb4\x00\x00\xff\xff`\xa0\x00\x04\xff\xff^H\x00\n\xff\xffeP\x00\x10LMT\x00-1120\x00-1130\x00-11\x00\n<-11>11\nPK\x03\x04\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\v\x00\x1c\x00Pacific/YapUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff" + "\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00" + - "+09\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/WallisUT" + - "\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\b\xa8\x01\x00\x00\xacX\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe9\xdd\x1e\xee\f\x01" + - "\x00\x00\f\x01\x00\x00\f\x00\x1c\x00Pacific/ApiaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "+09\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x1c\x00Pacific/Bougainv" + + "illeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x1c\x00Pacific/PohnpeiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x10\xff\xff\xff\xff\x14\xe1\xb9,\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0" + + "\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00" + + "\x00\x00\xc3\x00\x00\x00\f\x00\x1c\x00Pacific/TrukUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x04\x03\x04\x03\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<+14>," + - "M9.5.0/3,M4.1.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQY5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x1c\x00Pacific/Norf" + - "olkUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+1" + - "1\x00+12\x00\n<+11>-11<+12>,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xd5s\x9bkD\x01\x00\x00" + - "D\x01\x00\x00\r\x00\x1c\x00Pacific/EfateUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff" + + "\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10" + + ">-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/TarawaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\r\x00\x1c" + + "\x00Pacific/ChuukUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff" + + "\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10>-10\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x1c\x00Pacific/PalauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xc5FF(\x03\x00\x00(\x03" + + "\x00\x00\x0f\x00\x1c\x00Pacific/ChathamUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x92\xf5´\x00\x00\x00\x00\x19\xd2\xf7\xd0\x00\x00\x00\x00\x1a\xc2\xda\xc0\x00\x00\x00\x00\x1b\xdaf\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$+\u007f@\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\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\n\x00\x00\x00\x00\x00\x0e|XQ4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x1c\x00Pacific/FijiUT\t\x00\x03" + - "\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\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\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\x00MrA\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[ݩ\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<+" + - "13>,M11.2.0,M1.2.3/99\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x1c\x00Pacific/" + - "FunafutiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\f\xfc\x01\x00\x00\xa8\x04\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x1c\x00Pacific/PalauUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x1c\x00P" + - "acific/GuamUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10L" + - "MT\x00GST\x00+09\x00GDT\x00ChST\x00\nChST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x1c\x00P" + - "acific/SaipanUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x1c" + - "\x00Pacific/KosraeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xffGL\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\n\x00\x00\x00\x00\x00\x0e|XQ\x81" + - "\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x1c\x00Pacific/NiueUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~7TL\xff\xff\xff\xff\xdcC5`\x00\x00\x00\x00\x10t\xca8\x01\x02\x03\xff\xff`" + - "\xb4\x00\x00\xff\xff`\xa0\x00\x04\xff\xff^H\x00\n\xff\xffeP\x00\x10LMT\x00-1120\x00-1130\x00-11\x00\n<-11>11\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0e\x00\x1c\x00Pacific/PonapeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\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\x10\xff\xff\xff\xff\x14\xe1\xb9,\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00" + - "~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ߃\xa0_\x86\x00\x00\x00\x86\x00" + - "\x00\x00\f\x00\x1c\x00Pacific/WakeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x18\xcc\x01\x00\x00\x9c4\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x1c\x00Pacific/GalapagosUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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-0" + - "6\x00\n<-06>6\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/JohnstonUT\t\x00" + - "\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nH" + - "ST10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x1c\x00Pacific/MidwayUT\t\x00\x03\xec,\x94_\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xe2;Z" + - "\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x1c\x00Pacific/NauruUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x1c\x00Pacific/GuadalcanalUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\x0f\x00\x1c\x00Pa" + - "cific/ChathamUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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`\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>-12:45<+1345>,M9.5.0/2:45,M4." + - "1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x10\x00\x1c\x00Pacific/AucklandUT\t\x00\x03" + - "\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc4c" + - "p\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:\xb3" + - "m\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\x04LM" + - "T\x00NZST\x00NZMT\x00NZDT\x00\nNZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ" + - "\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x1c\x00Pacific/NoumeaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZ" + + "\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\x00" + + "5\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\x00" + + "C>\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>-12:45<+1345>,M9.5.0/" + + "2:45,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x1c\x00Pacific/Funaf" + + "utiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\f\xfc\x01\x00\x00\xa8\x04\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QY" + + "5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x1c\x00Pacific/NorfolkUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\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+1" + - "2\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x1c\x00Pacific/Fakaof" + - "oUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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>-1" + - "3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Pacific/TahitiUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff" + - "s\xc8\x00\x00\xff\xffs`\x00\x04LMT\x00-10\x00\n<-10>10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x1c\x00Pac" + - "ific/GambierUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0e\x00\x1c\x00Pacific/PonapeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10\xff\xff\xff\xff\x14\xe1\xb9," + + "\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00" + + "\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x1c\x00Pacific/Pago_PagoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00" + + "\x1c\x00Pacific/FakaofoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x1c\x00Pacific/Noum" + + "eaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18D" + + "p\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\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x1c\x00Pacific/KosraeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\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\xffGL" + + "\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>-1" + + "1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x1c\x00Pacific/PitcairnUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nLMT\x00-0830\x00-08\x00\n<-08>8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Qn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x1c\x00Pacific/Port_MoresbyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13" + + "\x04\x00\x00\x13\x04\x00\x00\x10\x00\x1c\x00Pacific/AucklandUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\xa7" + + "G`\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\x1e" + + "x`\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-12NZD" + + "T,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x1c\x00Pacific/Guad" + + "alcanalUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00\x00\x11\x00\x1c\x00Pacific/EnderburyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\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~7Ud\x00\x00\x00\x00\x12V\x04\xc0\x00\x00\x00\x00/" + + "\x059\xb0\x01\x02\x03\xff\xff_\x9c\x00\x00\xff\xffW@\x00\x04\xff\xffeP\x00\b\x00\x00\xb6\xd0\x00\fLMT\x00-12\x00-11\x00+13\x00\n<+13>-13\nPK\x03\x04" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Pacific/TahitiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x94PU\xb8\x01\xff\xffs\xc8\x00\x00\xff\xff" + + "s`\x00\x04LMT\x00-10\x00\n<-10>10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/J" + + "ohnstonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x1c\x00Pacific/Majuro" + + "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~6\x14\x80\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\xcf=Gp\xff\xff\xff\xff\xff\x86\x1bP\x01" + + "\x02\x01\x03\x02\x01\x04\x00\x00\xa0\x80\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<+1" + + "2>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x1c\x00Pacific/MidwayUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x85v" + + "\xf8\x8c\x87\x01\x00\x00\x87\x01\x00\x00\x11\x00\x1c\x00Pacific/RarotongaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff~7J\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\xc8" + + "w\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\x03\x02\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\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\n\x00\x00\x00\x00\x00\xb8K\x97QFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x1c\x00" + + "Pacific/GuamUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + - "\x00\x00\x0e|XQ\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x1c\x00Pacific/MajuroUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~6\x14\x80\xff\xff\xff\xff\x98\x11\x95\xd0\xff\xff\xff\xff\xa0" + - "9\xf9\xf0\xff\xff\xff\xff\xc1\xed5\xd0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xcf=Gp\xff\xff\xff\xff\xff\x86\x1bP\x01\x02\x01\x03\x02\x01\x04\x00\x00\xa0\x80\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<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xeaK\x85v" + - "\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/HonoluluUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif" + + "\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\xef" + + "6\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\x10" + + "LMT\x00GST\x00+09\x00GDT\x00ChST\x00\nChST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x1c\x00" + + "Pacific/TongatapuUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6\a\xb8\xff\xff\xff\xff\xc9sB\x90\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-13\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v" + + "\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/HonoluluUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcb" + "\x89=\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\xff" + - "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\u07b54-\xd6\x00\x00\x00\xd6" + - "\x00\x00\x00\x0f\x00\x1c\x00Pacific/PohnpeiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10\xff\xff\xff\xff\x14\xe1\xb9,\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLM" + - "T\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x1c\x00Pacifi" + - "c/Pago_PagoUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\f\x00\x1c\x00Pacific/TrukUT\t\x00\x03\xec,\x94_\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff" + - "\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0" + - "\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x1c\x00" + - "Pacific/PitcairnUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nLMT\x00-" + - "0830\x00-08\x00\n<-08>8\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQD6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x1c\x00Pacific/Marqu" + - "esasUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x1c\x00Pacific/BougainvilleUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x11L" + - "MT\x00PMMT\x00+10\x00+09\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00" + - "Pacific/TarawaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\x85v\xf8\x8c\x87\x01\x00\x00\x87\x01\x00\x00\x11\x00\x1c\x00Pacific/RarotongaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff~7J\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\x03\x02\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\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\n\x00\x00\x00\x00\x00\x0e|XQt\xca{e" + - "\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x1c\x00Pacific/SamoaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xff" + - "eP\x00\x04LMT\x00SST\x00\nSST11\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x1c\x00Pacific/Kir" + - "itimatiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92" + + "\x00\x00\x00\r\x00\x1c\x00Pacific/SamoaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x04L" + + "MT\x00SST\x00\nSST11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe2;Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x1c\x00Pacific/NauruUT\t" + + "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x0e" + + "LMT\x00+1130\x00+09\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x1c\x00Pa" + + "cific/FijiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\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\x00MrA\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[ݩ\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<+13>,M11.2.0,M1.2.3/99\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe9\xdd\x1e\xee\f\x01\x00\x00\f" + + "\x01\x00\x00\f\x00\x1c\x00Pacific/ApiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x04\x03\x04\x03\x06\x05\x00\x00\xb0\x80\x00\x00\xff\xff_\x00\x00\x00\xff\xff^H\x00\x04\xff\xffs`\x01\n\xff\xff" + + "eP\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<+14>,M9." + + "5.0/3,M4.1.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x1c\x00Pacific/Kiritim" + + "atiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x1c\x00Pacif" + + "ic/WakeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00\x00\x11\x00\x1c\x00P" + - "acific/EnderburyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~7Ud\x00\x00\x00\x00\x12V\x04\xc0\x00\x00\x00\x00/\x059\xb0\x01\x02\x03\xff\xff_\x9c\x00\x00\xff\xffW@\x00\x04\xff\xff" + - "eP\x00\b\x00\x00\xb6\xd0\x00\fLMT\x00-12\x00-11\x00+13\x00\n<+13>-13\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ>\xfe垛\x03\x00\x00\x9b\x03" + - "\x00\x00\x06\x00\x1c\x00PolandUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xd4" + - "K#\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\x14" + - "3\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#\xec\x00\xff\xff\xff\xff\xe50 p\xff\xff\xff\xff\xe6!q\x00\xff\xff\xff\xff\xe7\x12\xa5" + - "p\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\n\x00\x00\x00\x00\x00\x0e|XQ\xc7X,Y\x9f\x01\x00\x00\x9f" + - "\x01\x00\x00\x03\x00\x1c\x00ROKUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xfa" + - "p\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\xef4" + - "x\xff\xff\xff\xff째h\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\n\x00\x00\x00\x00\x00\x0e|XQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t" + - "\x00\x1c\x00SingaporeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcb" + - "\x91_\b\xff\xff\xff\xff\xd2Hm\xf0\x00\x00\x00\x00\x16\x91\xf5\b\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\x00i" + - "x\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" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x1c\x00TurkeyUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\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'\u007f\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\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\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UCTUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + - "\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x1c\x00US/UT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x03\x04\n\x00\x00" + - "\x00\x00\x00\x0e|XQ5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x1c\x00US/AlaskaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\x18\xcc\x01\x00\x00\x9c4\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x1c\x00Pacific/KwajaleinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QFI\xfe" + + "\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x1c\x00Pacific/SaipanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QD" + + "6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x1c\x00Pacific/MarquesasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x1c\x00US/PacificUT\t" + - "\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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" + + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x1c\x00Pacific/Gal" + + "apagosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x1c\x00P" + + "acific/EfateUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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$+\u007f@\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\b" + + "LMT\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x1c\x00PolandUT" + + "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xe1\xa5" + + "\x80\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#\xf0\xff\xff\xff\xffӋ{\x80\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5" + + "E\"\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\n\x00\x00\x00\x00\x00\xb8K\x97QŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00PST8P" + + "DTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\x00PST\x00PWT\x00PPT\x00\nPS" + + "T8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x1c\x00ROCUT\t\x00\x03\xfc" + + "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x1c\x00ROKUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x8f" + + "p\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\x0fR" + + "x\xff\xff\xff\xff\xea\xc7\xd6h\xff\xff\xff\xff\xeb\xef4x\xff\xff\xff\xff째h\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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x1c\x00SingaporeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf5\b\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x1c\x00TurkeyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UCTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00UT" + + "C\x00\nUTC0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00UniversalUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x1c\x00US/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x1c\x00US/PacificUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfe" + + "t\\\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\x12" + + "Q\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\u007f\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\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x1c\x00US/EasternUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\x8f\xd0p\x00\x00" + - "\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x1c\x00US/HawaiiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcb" + + "\x89=\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\xff" + + "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x9aG\xc8\xd0\x06\x00\x00\xd0" + + "\x06\x00\x00\n\x00\x1c\x00US/EasternUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`" + + "\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\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\n\x00\x00\x00\x00\x00\x0e|XQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x1c\x00US/MichiganUT\t\x00\x03\xec,\x94" + - "_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x004" + - "R\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\u007f`\x00\x00\x00\x00B" + - "O\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\nEST5" + - "EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x1c\x00US/ArizonaU" + - "T\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x1c\x00US/" + - "Indiana-StarkeUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x94" + - "p\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\x00CS" + - "T\x00CWT\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xae,\xa44\xc9\x03\x00\x00" + - "\xc9\x03\x00\x00\v\x00\x1c\x00US/AleutianUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xd2a" + - "P@\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\u007f@\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\t" + - "BP\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\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\x19LM" + - "T\x00NST\x00NWT\x00NPT\x00BST\x00BDT\x00AHST\x00HDT\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x1c\x00US/HawaiiUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\x0e|XQp\xb6" + - "{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x1c\x00US/East-IndianaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZi" + + "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x1c\x00US/CentralUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\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\x00" + - "CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x1c\x00US/CentralUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x1c\x00US/ArizonaUT\t\x00\x03\xfc\xff\xe2_" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x1c\x00US/East-Ind" + + "ianaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdd" + "\xa9\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\u007f\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\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\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\x002" + - "s\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\n\x00\x00\x00\x00\x00\x0e|XQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x1c\x00US/MountainUT\t\x00\x03\xec,\x94_" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\b" + - "v\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\x8d" + - "5\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\u007f\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\n\x00\x00\x00\x00\x00\x0e|XQt\xca{e\x92" + - "\x00\x00\x00\x92\x00\x00\x00\b\x00\x1c\x00US/SamoaUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x04LM" + - "T\x00SST\x00\nSST11\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UTCUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n" + - "UTC0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00UniversalUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\nUT" + - "C0\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\x04\x00\x1c\x00W-SUUT\t\x00\x03\xec,\x94_\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + - "2r\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\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\x00" + - "TL\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\x00MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00EET" + - "\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\x0e|XQ2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x1c\x00WETUT\t\x00\x03\xec,\x94_\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\x0f(\x00\x00Africa/BissauUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ" + - " \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeb(\x00\x00Africa/BlantyreUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7)\x00\x00Afric" + - "a/NiameyUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00" + - "\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81*\x00\x00Africa/BanjulUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81J+\x00\x00Africa/AbidjanUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\x14,\x00\x00Africa/AsmaraUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b" + - "{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x11-\x00\x00Africa/BamakoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xda-\x00\x00Africa/Ou" + - "agadougouUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00" + - "\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8.\x00\x00Africa/LusakaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\\\x11=\xfa\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r/\x00\x00Africa/LuandaUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81<0\x00\x00Africa/AsmeraUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ \x1b" + - "\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x8191\x00\x00Africa/LubumbashiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ9\x0f߁,\x02\x00\x00,\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a2\x00\x00Afric" + - "a/AccraUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y4\x00\x00Africa/KhartoumUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c6\x00\x00Africa/CeutaUT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\x049\x00\x00Africa/BujumburaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ" + - "m)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd19\x00\x00Africa/WindhoekUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98<\x00\x00Afric" + - "a/El_AaiunUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ_\u007f2[\xaf\x01\x00\x00\xaf\x01" + - "\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\aD\x00\x00Africa/TripoliUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ6\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfeE\x00\x00Africa/MonroviaU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xebF\x00\x00Africa/Dar_es_SalaamUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xefG\x00\x00Africa/JohannesburgUT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xfaH\x00\x00Africa/KigaliUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4I\x00\x00Africa/DjiboutiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3J\x00\x00Afri" + - "ca/FreetownUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x8eK\x00\x00America/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\x0e|XQq\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd0K\x00\x00America/Puerto_RicoUT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xceL\x00\x00America/RecifeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfaN\x00\x00America/ResoluteUT\x05\x00\x03\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8Q\x00\x00Am" + - "erica/ManausUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ3\x9aG\xc8\xd0\x06\x00\x00" + - "\xd0\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdcS\x00\x00America/New_YorkUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6Z\x00\x00America/Rank" + - "in_InletUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00" + - "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8]\x00\x00America/LimaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y_\x00\x00America/St_Barthelem" + - "yUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81*`\x00\x00America/Santo_DomingoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6a\x00\x00America/DetroitUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\x82e\x00\x00America/ParamariboUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\x0e|XQ,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x89f\x00\x00America/YakutatUT\x05\x00\x03\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84j\x00\x00" + - "America/SantaremUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQk^2S" + - "\xb9\x04\x00\x00\xb9\x04\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81gl\x00\x00America/Punta_ArenasUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81nq\x00\x00Amer" + - "ica/ScoresbysundUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ[Sp\x90" + - "\x02\x05\x00\x00\x02\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9bs\x00\x00America/SantiagoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x15\xc8\xcb\x00\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7x\x00\x00America/" + - "GuyanaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdby\x00\x00America/Coral_HarbourUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n{\x00\x00America/Rio_B" + - "rancoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8|\x00\x00America/Porto_AcreUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQp\x1b\xceRC\x03\x00\x00C\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe6~\x00\x00America/NipigonUT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81r\x82\x00\x00America/EdmontonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x86\x86\x00\x00America/Port_of_SpainUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81W\x87\x00\x00America/Lower_PrincesUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\x88\x00\x00America/St_ThomasUT\x05\x00\x03\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n" + - "\x89\x00\x00America/GuatemalaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ" + - "R\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)\x8a\x00\x00America/CatamarcaUT\x05\x00\x03\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818\x8d\x00\x00Ame" + - "rica/AntiguaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1b\x81-\xa9\x8a\x01\x00\x00" + - "\x8a\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\x8e\x00\x00America/Porto_VelhoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ڏ\x00\x00America/R" + - "osarioUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7\x92\x00\x00America/ChicagoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\x0e|XQ⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n\x9a\x00\x00America/CrestonUT\x05\x00" + - "\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xf1\x9a\x00\x00America/ManaguaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x05{w\xe9\xad\x03\x00\x00\xad\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81a\x9c\x00\x00America/NassauUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81V\xa0\x00\x00Ameri" + - "ca/BogotaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00" + - "\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Q\xa1\x00\x00America/CancunUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaa\xa3\x00\x00America/Chihuahua" + - "UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81I\xa5\x00\x00America/Campo_GrandeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\x0e|XQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\xa9\x00\x00America/HalifaxUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81 \xb0\x00\x00America/BoiseUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQӿ" + - "\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81N\xb4\x00\x00America/MontrealUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xbb\x00\x00Americ" + - "a/Goose_BayUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9d?\xdfڸ\x03\x00\x00\xb8" + - "\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\xc1\x00\x00America/Sao_PauloUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc7\xc5\x00\x00America/Blan" + - "c-SablonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00" + - "\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xc6\x00\x00America/PhoenixUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b\xc8\x00\x00America/AtikokanU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81E\xc9\x00\x00America/CayenneUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\xca\x00\x00America/NuukUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\xcc\x00\x00Amer" + - "ica/Santa_IsabelUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf8Dz\x97" + - "\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b\xd0\x00\x00America/Boa_VistaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x8f\x19Ԇ\x12\x02\x00\x00\x12\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84\xd2\x00\x00America" + - "/Bahia_BanderasUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xe6\xd4\x00\x00America/Indiana/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x810\xd5\x00\x00America/I" + - "ndiana/VevayUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQp\xb6{\xc9\x13\x02\x00\x00" + - "\x13\x02\x00\x00\x1c\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\xd6\x00\x00America/Indiana/IndianapolisUT\x05\x00\x03\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\xd9\x00\x00" + - "America/Indiana/WinamacUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQصK\xa6\n\x02\x00\x00\n\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xdc\x00\x00America/Indiana/Tell_CityUT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x01\xd8N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81k\xde\x00\x00America/Indiana/PetersburgUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xe1\x00\x00America/Indiana/" + - "VincennesUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00" + - "\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeb\xe3\x00\x00America/Indiana/KnoxUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQM/U\x9f7\x02\x00\x007\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x811\xe8\x00\x00America/Ind" + - "iana/MarengoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQp\xb6{\xc9\x13\x02\x00\x00" + - "\x13\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\xea\x00\x00America/IndianapolisUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a\xed\x00\x00America/" + - "DominicaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xe6\xed\x00\x00America/Argentina/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x812\xee\x00\x00America/Argent" + - "ina/SaltaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00" + - "\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x815\xf1\x00\x00America/Argentina/UshuaiaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81L\xf4\x00\x00Americ" + - "a/Argentina/CatamarcaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81e\xf7\x00\x00America/Argentina/ComodRivada" + - "viaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xfcz=\xe1\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x83\xfa\x00\x00America/Argentina/San_JuanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xfd\x00\x00America/Arg" + - "entina/San_LuisUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x8ep\xb4c\xc4" + - "\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc5\x00\x01\x00America/Argentina/Rio_GallegosUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\xe1\x03\x01\x00America/Argentina/JujuyUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQY\xd8֭\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe4\x06\x01\x00America/Argentina/Tucu" + - "manUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\n\x01\x00America/Argentina/Buenos_AiresUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)\r\x01\x00America" + - "/Argentina/CordobaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQm\a" + - "D\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81@\x10\x01\x00America/Argentina/La_RiojaUT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "a\x13\x01\x00America/Argentina/MendozaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81x\x16\x01\x00America/La_PazUT\x05\x00\x03\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j" + - "\x17\x01\x00America/DawsonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ.\xf9\xc0" + - "\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7\x1b\x01\x00America/MonctonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5!\x01\x00America/" + - "MatamorosUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00" + - "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5#\x01\x00America/St_VincentUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3$\x01\x00America/Regin" + - "aUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81i'\x01\x00America/YellowknifeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\x1b\vKdC\x03\x00\x00C\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8f*\x01\x00America/Rainy_RiverU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\x1f.\x01\x00America/KralendijkUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\x0e|XQMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x02/\x01\x00America/MonterreyUT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "r0\x01\x00America/JamaicaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\a" + - "\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e2\x01\x00America/HavanaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb36\x01\x00America" + - "/TegucigalpaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xcd\xc3v\xe3\xb3\x00\x00\x00" + - "\xb3\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc27\x01\x00America/GuayaquilUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc08\x01\x00America/Met" + - "lakatlaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x10" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_;\x01\x00America/MazatlanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQHQ(\x9a~\x02\x00\x00~\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x18=\x01\x00America/BelizeUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xde?\x01\x00America/Knox_INUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1fD\x01\x00America/CuiabaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\rH\x01\x00Amer" + - "ica/MeridaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQutZ\x1a\xb2\x02\x00\x00\xb2\x02" + - "\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84I\x01\x00America/JujuyUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}L\x01\x00America/CaymanUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81ZM\x01\x00America/BelemUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ" + - "s\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+O\x01\x00America/EirunepeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)Q\x01\x00Amer" + - "ica/St_LuciaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQOKjǪ\x02\x00\x00" + - "\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5Q\x01\x00America/BahiaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe6T\x01\x00America/Whiteho" + - "rseUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x817Y\x01\x00America/TortolaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQU9#\xbe2\x05\x00\x002\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x02Z\x01\x00America/VancouverUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf7\xe9 y\xbd\x02\x00\x00\xbd\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\u007f_\x01\x00America/InuvikUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb4" + - "T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84b\x01\x00America/Port-au-PrinceUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\te\x01" + - "\x00America/FortalezaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb7-" + - "2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818g\x01\x00America/NoronhaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ei\x01\x00America" + - "/Buenos_AiresUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf6\"\x12\xfe\x0e\x05\x00" + - "\x00\x0e\x05\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wl\x01\x00America/Los_AngelesUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2q\x01\x00America/" + - "El_SalvadorUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQV\x80\x94@\x12\x04\x00\x00\x12" + - "\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcfr\x01\x00America/DenverUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)w\x01\x00America/Fort_Wa" + - "yneUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x10\x00\xedA\x88y\x01\x00America/Kentucky/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd3y\x01\x00America/Kentucky/Lou" + - "isvilleUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x02\u007f\x01\x00America/Kentucky/MonticelloUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA#\x83\x01\x00Americ" + - "a/North_Dakota/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQR\x1b\x8b(\xde" + - "\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\x83\x01\x00America/North_Dakota/New_SalemUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\xa8\x87\x01\x00America/North_Dakota/CenterUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ۋ\x01\x00America/North_Dako" + - "ta/BeulahUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQM\x94\xc7Kp\x03\x00\x00p\x03\x00" + - "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81C\x90\x01\x00America/Glace_BayUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\x93\x01\x00America/Montse" + - "rratUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81̔\x01\x00America/TorontoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\x0e|XQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ʛ\x01\x00America/PanamaUT\x05\x00\x03\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7" + - "\x9c\x01\x00America/CordobaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xdf\xe5" + - "\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\x9f\x01\x00America/LouisvilleUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ڤ\x01\x00Amer" + - "ica/EnsenadaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQV\x80\x94@\x12\x04\x00\x00" + - "\x12\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\xa9\x01\x00America/ShiprockUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81\xad\x01\x00America/Ojin" + - "agaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xaf\x01\x00America/ThuleUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\x0e|XQ\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbc\xb1\x01\x00America/CaracasUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ò\x01" + - "\x00America/AraguainaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1d`" + - "̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81^\xb5\x01\x00America/Cambridge_BayUT\x05\x00\x03\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xad\xb8\x01\x00A" + - "merica/WinnipegUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ8\xa4]Q^" + - "\x03\x00\x00^\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\xbe\x01\x00America/Grand_TurkUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\xc1\x01\x00America" + - "/VirginUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\xc2\x01\x00America/AnchorageUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x95\xc6\x01\x00America/Costa_Ri" + - "caUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQn\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xc9\xc7\x01\x00America/NomeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde\xcb\x01\x00America/GrenadaUT\x05\x00\x03\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9\xcc\x01\x00A" + - "merica/St_JohnsUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xae,\xa44\xc9" + - "\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xd4\x01\x00America/AtkaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\xd8\x01\x00America/Asunc" + - "ionUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQB\xa0=:\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16\xdc\x01\x00America/HermosilloUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x80\xdd\x01\x00America/TijuanaUT\x05\x00" + - "\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xca\xe1\x01\x00America/MarigotUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "Q?\xc9\x1c\xd4\xc6\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x95\xe2\x01\x00America/JuneauUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\xe6\x01\x00Ameri" + - "ca/MontevideoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe90T\x16\xd1\x01\x00" + - "\x00\xd1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb8\xea\x01\x00America/GodthabUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xec\x01\x00America/Guad" + - "eloupeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xed\x01\x00America/MaceioUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\x0e|XQJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde\xef\x01\x00America/PangnirtungU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81,\xf3\x01\x00America/St_KittsUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xdf\b\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8\xf3\x01\x00America/BarbadosUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)\xf5\x01" + - "\x00America/IqaluitUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ8O:\xbf" + - "\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81V\xf8\x01\x00America/MenomineeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x816\xfc\x01\x00America" + - "/MartiniqueUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd6\xe1Հ\x9c\x01\x00\x00\x9c" + - "\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814\xfd\x01\x00America/Mexico_CityUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\xff\x01\x00America/Sw" + - "ift_CurrentUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd7\b\\\xc6&\x02\x00\x00&" + - "\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdc\x00\x02\x00America/MiquelonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81L\x03\x02\x00America/Curac" + - "aoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81,\x04\x02\x00America/Dawson_CreekUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\a\x02\x00America/MendozaUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x812\n\x02\x00America/AdakUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe9" + - "\x8c\xb4$q\x03\x00\x00q\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81A\x0e\x02\x00America/Thunder_BayUT\x05\x00\x03\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xff\x11\x02\x00Am" + - "erica/ArubaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf6@\rm\xa8\x05\x00\x00\xa8" + - "\x05\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdd\x12\x02\x00America/Fort_NelsonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\x18\x02\x00America/Si" + - "tkaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5\x1c\x02\x00America/AnguillaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\x0e|XQk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\x1d\x02\x00America/DanmarkshavnU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x10\x00\xedA\xae\x1f\x02\x00Antarctica/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ" + - "\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\x1f\x02\x00Antarctica/PalmerUT\x05\x00\x03\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb5#\x02\x00Ant" + - "arctica/DavisUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQƉ\xf71\x84\x00\x00" + - "\x00\x84\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4$\x02\x00Antarctica/RotheraUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94%\x02\x00Antarctic" + - "a/VostokUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\r\x0e\xf20\x85\x00\x00\x00\x85\x00\x00\x00" + - "\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81d&\x02\x00Antarctica/SyowaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813'\x02\x00Antarctica/Dumon" + - "tDUrvilleUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00" + - "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1e(\x02\x00Antarctica/McMurdoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x97\xd4#\xed\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81},\x02\x00Antarctica/Ma" + - "cquarieUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9b0\x02\x00Antarctica/South_PoleUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd4\x02\x00Antarctica/T" + - "rollUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf85\x02\x00Antarctica/MawsonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb6\x02\x00Antarctica/CaseyUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10" + - "\x00\xedA\x188\x02\x00Arctic/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa5\x97\aĤ\x02" + - "\x00\x00\xa4\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y8\x02\x00Arctic/LongyearbyenUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAJ;\x02\x00Asia/UT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\x89;\x02\x00Asia/DushanbeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>=\x02\x00Asia/QostanayUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xec?\x02\x00Asia/C" + - "alcuttaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0fA\x02\x00Asia/UrumqiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQ9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9A\x02\x00Asia/KarachiUT\x05\x00\x03\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)C\x02\x00" + - "Asia/KhandygaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQj$\xcd\xf4\x9a\x00\x00" + - "\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wF\x02\x00Asia/ThimbuUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81VG\x02\x00Asia/ThimphuUT\x05\x00" + - "\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQd%\x05\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x816H\x02\x00Asia/VladivostokUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81fK\x02\x00Asia/VientianeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81FL\x02\x00Asia" + - "/ShanghaiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00" + - "\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16N\x02\x00Asia/Ulan_BatorUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1P\x02\x00Asia/AdenUT\x05\x00\x03\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y" + - "Q\x02\x00Asia/MuscatUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xef\\\xf4q\x17\x04" + - "\x00\x00\x17\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81CR\x02\x00Asia/DamascusUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xba'\xa0z \x04\x00\x00 \x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1V\x02\x00Asia/Jerusale" + - "mUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQy\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\t[\x02\x00Asia/BruneiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe8[\x02\x00Asia/UlaanbaatarUT\x05\x00\x03\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xceG|\xea\x13\x03\x00\x00\x13\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84^\x02\x00As" + - "ia/AmmanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa7f^]@\x01\x00\x00@\x01\x00\x00" + - "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdba\x02\x00Asia/KuchingUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\xba'\xa0z \x04\x00\x00 \x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ac\x02\x00Asia/Tel_AvivUT\x05\x00\x03\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc8" + - "g\x02\x00Asia/SeoulUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ?\xa7^\xfah\x02\x00" + - "\x00h\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xabi\x02\x00Asia/AtyrauUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Xl\x02\x00Asia/PyongyangUT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81Wm\x02\x00Asia/HovdUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\x06\r" + - "\xed\xbd\x04\x00\x00\xbd\x04\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeco\x02\x00Asia/HebronUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeet\x02\x00Asia/KuwaitU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xb8u\x02\x00Asia/TomskUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc7" + - "\xaf\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xedx\x02\x00Asia/ManilaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81 z\x02\x00Asia/Chita" + - "UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81R}\x02\x00Asia/KatmanduUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\xac\xf7\xf4\xc0\xab\x04\x00\x00\xab\x04\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:~\x02\x00Asia/GazaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81(\x83\x02\x00Asia/Sam" + - "arkandUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ބ\x02\x00Asia/TaipeiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\x0e|XQ\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\"\x87\x02\x00Asia/TashkentUT\x05\x00\x03\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\xea\x18\xd4\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05c8\x02\x00" + - "Asia/YekaterinburgUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1d?" + - "v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b\x8c\x02\x00Asia/MacauUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\x8f\x02\x00Asia/Qyzylor" + - "daUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81.\x92\x02\x00Asia/MacaoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x89\x95\x02\x00Asia/TokyoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\x96\x02\x00Asia/Bak" + - "uUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81͙\x02\x00Asia/BarnaulUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x04\x9d\x02\x00Asia/IstanbulUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xa1\x02\x00Asia" + - "/IrkutskUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00" + - "\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\xa5\x02\x00Asia/QatarUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15\xa6\x02\x00Asia/BahrainUT\x05\x00\x03\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xa6\x02\x00" + - "Asia/YangonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x02\x95-\xad\xc4\x02\x00\x00\xc4" + - "\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xa7\x02\x00Asia/YerevanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd\xaa\x02\x00Asia/AlmatyUT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xa3\xad\x02\x00Asia/DiliUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ?Y\xaf\x19\xe7\x00\x00" + - "\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\xae\x02\x00Asia/DaccaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\xaf\x02\x00Asia/ChongqingUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\x8c\xb1\x02\x00Asia/Ust-NeraUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ" + - "\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ִ\x02\x00Asia/MagadanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\v\xb8\x02\x00Asia/Col" + - "omboUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81H\xb9\x02\x00Asia/KrasnoyarskUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\xbc\x02\x00Asia/KamchatkaUT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\x96\xbf\x02\x00Asia/Ujung_PandangUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|" + - "XQb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xc0\x02\x00Asia/JakartaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde\xc1\x02\x00Asia/K" + - "olkataUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\xc3\x02\x00Asia/KabulUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\x0e|XQ&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3\xc3\x02\x00Asia/OralUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x97\xc6\x02\x00Asia/" + - "JayapuraUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQS\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00" + - "\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x89\xc7\x02\x00Asia/PontianakUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc8\xc8\x02\x00Asia/MakassarUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\xcd\xc9\x02\x00Asia/TbilisiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x06\xaa>" + - "\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x88\xcc\x02\x00Asia/SingaporeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd0\xcd\x02\x00Asia/Harb" + - "inUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x9e\xcf\x02\x00Asia/KashgarUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\x0e|XQ?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\xd0\x02\x00Asia/DhakaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94\xd1\x02\x00Asia/Y" + - "akutskUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf\xd4\x02\x00Asia/Kuala_LumpurUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n\xd6\x02\x00Asia/TehranUT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "#\xde\x02\x00Asia/BeirutUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xdb\xfa\xb5\xbeg" + - "\x02\x00\x00g\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D\xe1\x02\x00Asia/AqtobeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\xe3\x02\x00Asia/AnadyrUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ0]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\x1c\xe7\x02\x00Asia/BishkekUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xed" + - "\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcc\xe9\x02\x00Asia/DubaiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x95\xea\x02\x00Asia/Riyadh" + - "UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81_\xeb\x02\x00Asia/NovokuznetskUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\x0e|XQT\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x80\xee\x02\x00Asia/AqtauUT\x05\x00\x03\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\"\xf1\x02\x00Asi" + - "a/OmskUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81J\xf4\x02\x00Asia/AshkhabadUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\x0e|XQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\xf6\x02\x00Asia/SaigonUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\xf7\x02" + - "\x00Asia/SakhalinUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQE\t\xfa-\a\x03" + - "\x00\x00\a\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81t\xfa\x02\x00Asia/Hong_KongUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3\xfd\x02\x00Asia/Phnom_P" + - "enhUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xfe\x02\x00Asia/NicosiaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\x01\x03\x00Asia/BaghdadUT\x05\x00\x03\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\x03\x03\x00Asi" + - "a/SrednekolymskUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQe\x1bb2w" + - "\x01\x00\x00w\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\a\x03\x00Asia/AshgabatUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeb\b\x03\x00Asia/Kathman" + - "duUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xd4\t\x03\x00Asia/ChoibalsanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\x0e|XQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x88\f\x03\x00Asia/BangkokUT\x05\x00\x03\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\r\x03\x00A" + - "sia/ChungkingUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ)p\x1cX\xf1\x02\x00" + - "\x00\xf1\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x817\x0f\x03\x00Asia/NovosibirskUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\x12\x03\x00Asia/Famagu" + - "staUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\x16\x03\x00Asia/RangoonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g\x17\x03\x00Asia/Ho_Chi_MinhUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x9d\x18\x03" + - "\x00Atlantic/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01" + - "\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\x18\x03\x00Atlantic/FaroeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xaf|7\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe1\x1a\x03\x00Atlantic/CanaryU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe7\xcf^\xb0\x15\x03\x00\x00\x15\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\b\x1d\x03\x00Atlantic/StanleyUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\x9b\xe9\xf4\x9a\xf9\x02\x00\x00\xf9\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g \x03\x00Atlantic/BermudaUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaa#\x03" + - "\x00Atlantic/South_GeorgiaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~$\x03\x00Atlantic/St_HelenaUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81L%\x03" + - "\x00Atlantic/Jan_MayenUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb7" + - "\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<(\x03\x00Atlantic/FaeroeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>*\x03\x00Atlant" + - "ic/ReykjavikUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\u0097N\xad\xaf\x00\x00\x00" + - "\xaf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{-\x03\x00Atlantic/Cape_VerdeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w.\x03\x00Atlantic/" + - "AzoresUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00\x10\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[4\x03\x00Atlantic/MadeiraUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA@:\x03\x00Australia/UT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa5\x85&'\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84:" + - "\x03\x00Australia/MelbourneUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x9c\xd2I\f!\x01\x00\x00!\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y>\x03\x00Australia/QueenslandUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe2\xf1\x9d4\xea\x00\x00\x00\xea\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc8?\x03" + - "\x00Australia/NorthUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQo3\xdaR" + - "\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb@\x03\x00Australia/Lord_HoweUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQͥ\xdfD\x99\x03\x00\x00\x99\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfcC\x03\x00Austr" + - "alia/AdelaideUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ1\x9eD\x00\xad\x03\x00" + - "\x00\xad\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe1G\x03\x00Australia/YancowinnaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa5\x85&'\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdcK\x03\x00Austral" + - "ia/VictoriaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQf\xdd}\xfe\x88\x03\x00\x00\x88" + - "\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb0O\x03\x00Australia/CanberraUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQf\xdd}\xfe\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84S\x03\x00Australia/S" + - "ydneyUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQf\xdd}\xfe\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81VW\x03\x00Australia/ACTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQ.\x1b\xa53:\x01\x00\x00:\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%[\x03\x00Australia/EuclaUT\x05\x00\x03\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9c\xd2I\f!\x01\x00\x00!\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8" + - "\\\x03\x00Australia/BrisbaneUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "QʹF\xd6\xc7\x03\x00\x00\xc7\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15^\x03\x00Australia/TasmaniaUT\x05\x00\x03\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQʹF\xd6\xc7\x03\x00\x00\xc7\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81(b\x03\x00A" + - "ustralia/HobartUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x98Ò\x8d2" + - "\x01\x00\x002\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819f\x03\x00Australia/PerthUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQͥ\xdfD\x99\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4g\x03\x00Australia/" + - "SouthUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xce\xe5\x90AE\x01\x00\x00E\x01\x00\x00\x12\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96k\x03\x00Australia/LindemanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe2\xf1\x9d4\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'm\x03\x00Australia/DarwinU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x98Ò\x8d2\x01\x00\x002\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81[n\x03\x00Australia/WestUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5o\x03\x00Australia/LHIUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQf\xdd}\xfe\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd0r\x03\x00Aust" + - "ralia/NSWUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ1\x9eD\x00\xad\x03\x00\x00\xad\x03\x00" + - "\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9fv\x03\x00Australia/Broken_HillUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc4\xd5\x01\xe5\u007f\x03\x00\x00\u007f\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9bz\x03\x00Australia/" + - "CurrieUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAd~\x03\x00Brazil/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa5~\x03\x00Brazil/DeNoronhaUT\x05\x00\x03\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ӏ\x03\x00B" + - "razil/AcreUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9d?\xdfڸ\x03\x00\x00\xb8\x03" + - "\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xba\x82\x03\x00Brazil/EastUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\x0e|XQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7\x86\x03\x00Brazil/WestUT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98\x88" + - "\x03\x00CETUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ<\x8b\x99\x1e\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81B\x8b\x03\x00CST6CDTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA:\x8f\x03\x00Canada/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\x8f\x03\x00Canada/Atla" + - "nticUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQU9#\xbe2\x05\x00\x002\x05\x00\x00\x0e\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81L\x96\x03\x00Canada/PacificUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƛ\x03\x00Canada/EasternUT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81â" + - "\x03\x00Canada/YukonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\u0096dK~\x02" + - "\x00\x00~\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xa7\x03\x00Canada/SaskatchewanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81٩\x03\x00Canada/" + - "NewfoundlandUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ?_p\x99\x0e\x05\x00\x00" + - "\x0e\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81|\xb1\x03\x00Canada/CentralUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ҷ\x03\x00Canada/Mountai" + - "nUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x10\x00\xedA\xe5\xba\x03\x00Chile/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xee\xd0\x1c" + - "YN\x04\x00\x00N\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\xbb\x03\x00Chile/EasterIslandUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf\xbf\x03\x00Chile" + - "/ContinentalUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\a\x1c\x9e\x9a]\x04\x00\x00" + - "]\x04\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\f\xc5\x03\x00CubaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\x0e|XQ`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xc9\x03\x00EETUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQtX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5\xcb\x03\x00ESTUT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe7/\xebT\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81\xcc" + - "\x03\x00EST5EDTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00" + - "\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\xd0\x03\x00EgyptUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xd5\x03\x00EireUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xca\xdb\x03\x00Etc/UT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd9|\xbd7s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\b\xdc" + - "\x03\x00Etc/GMT-10UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe5\xf38cr\x00\x00\x00" + - "r\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf\xdc\x03\x00Etc/GMT+12UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb2\xab\xd1Is\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81u\xdd\x03\x00Etc/GMT-11UT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,\xde" + - "\x03\x00Etc/UniversalUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o" + - "\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xde\x03\x00Etc/GreenwichUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQj\xd5d\xb0r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98\xdf\x03\x00Etc/GMT-6UT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf7\x1ac\xc3r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81M\xe0\x03\x00Etc/GMT-1UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc5\x18\xb6\xfb" + - "r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x02\xe1\x03\x00Etc/GMT-8UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7\xe1\x03\x00Etc/GMT+4UT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQe\xcb\xe9Qq\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "k\xe2\x03\x00Etc/GMT+3UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xfc\x19@\xb9r\x00\x00" + - "\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1f\xe3\x03\x00Etc/GMT-9UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd4\xe3\x03\x00Etc/GMT-0UT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x86\xe4\x03" + - "\x00Etc/GMT-7UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xa9{\xa2qq\x00\x00\x00q\x00" + - "\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xe5\x03\x00Etc/GMT+2UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\x0e|XQ\xd4X\x9b\xf3q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef\xe5\x03\x00Etc/GMT+5UT\x05\x00\x03\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\xe6\x03\x00Et" + - "c/GMTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\b\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S\xe7\x03\x00Etc/ZuluUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQ)\xb9\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x04\xe8\x03\x00Etc/GMT+11UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xba\xe8\x03\x00Etc/GMT" + - "-13UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ,{\xdc;s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81q\xe9\x03\x00Etc/GMT-14UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\x8e\x1569r\x00\x00\x00r\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81(\xea\x03\x00Etc/GMT+10UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde\xea\x03\x00Etc/GMT" + - "-12UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\b\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x95\xeb\x03\x00Etc/GMT0UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81F\xec\x03\x00Etc/UCTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\xec\x03\x00Etc/GMT+0UT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x84+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xa8\xed\x03\x00Etc/GMT+7UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x84\x19\xb3\t" + - "q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\xee\x03\x00Etc/GMT+9UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x10\xef\x03\x00Etc/GMT-2UT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xc5\xef\x03\x00Etc/GMT-5UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\"\xf8\x8f/q\x00\x00" + - "\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81z\xf0\x03\x00Etc/GMT+8UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQH\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81.\xf1\x03\x00Etc/GMT+6UT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xf1\x03" + - "\x00Etc/GMT+1UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00" + - "\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96\xf2\x03\x00Etc/UTCUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\x0e|XQk\x19\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca\xcc\x04\x00Europe/WarsawUT\x05\x00\x03\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xab\x80c$q\x00\x00\x00q\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xd0\x04\x00" + - "FactoryUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81^\xd1\x04\x00GBUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQk" + - "\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9\xd7\x04\x00GB-EireUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\xde\x04\x00GMTUT\x05\x00\x03\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\xdf\x04\x00G" + - "MT+0UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb3\xdf\x04\x00GMT-0UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP" + - "\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81a\xe0\x04\x00GMT0UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xe1\x04\x00GreenwichUT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc0\xe1" + - "\x04\x00HSTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\b\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81m\xe2\x04\x00HongkongUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6\xe5\x04\x00IcelandUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xe8\xe8\x04\x00Indian/UT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81)\xe9\x04\x00Indian/MauritiusUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQx\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81&\xea\x04\x00Indian/ChagosUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\xeb\x04\x00Indi" + - "an/MayotteUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ$l=҅\x00\x00\x00\x85\x00" + - "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\xec\x04\x00Indian/ChristmasUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQͲ\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xec\x04\x00Indian/CocosUT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xa4\xed\x04\x00Indian/MaldivesUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e" + - "|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xee\x04\x00Indian/ComoroUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQy(\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xef\x04\x00Indi" + - "an/ReunionUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xbd\xf3\x17\xf1\x85\x00\x00\x00\x85\x00" + - "\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\xf0\x04\x00Indian/MaheUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\xf1\x04\x00Indian/KerguelenUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xebE1\u05f6\x00\x00\x00\xb6\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xe8\xf1\x04\x00Indian/AntananarivoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\x0e|XQ;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeb\xf2\x04\x00IranUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04" + - "\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xba'\xa0z \x04\x00\x00 \x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd\xfa\x04\x00IsraelUT\x05\x00" + - "\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81]\xff\x04\x00JamaicaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x02\xf4\xaeg\xd5\x00\x00" + - "\x00\xd5\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\x00\x05\x00JapanUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\x02\x05\x00KwajaleinUT\x05\x00\x03\xec,\x94_ux\v\x00" + - "\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\x03\x05\x00Lib" + - "yaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x11\x05\x05\x00METUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf5\x8d\x99\x92o" + - "\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\a\x05\x00MSTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\xe6h\xcac\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g\b\x05\x00MST7MDTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA_\f\x05\x00Mexic" + - "o/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\f\x05\x00Mexico/BajaNorteUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeb\x10\x05\x00Mexico/GeneralUT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcf\x12" + - "\x05\x00Mexico/BajaSurUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQb\xb2\xaf\xf7" + - "\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x86\x14\x05\x00NZUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQ\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5\x18\x05\x00NZ-CHATUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>\x1c\x05\x00Navaj" + - "oUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\x90 \x05\x00PRCUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQŭV\xad\xb7\x03" + - "\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81V\"\x05\x00PST8PDTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAN&\x05\x00Pacific/UT\x05\x00\x03\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90&\x05\x00P" + - "acific/Port_MoresbyUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xcc" + - "\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81x'\x05\x00Pacific/ChuukUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00" + - "\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82(\x05\x00Pacific/" + - "EasterUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x18-\x05\x00Pacific/KwajaleinUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>.\x05\x00Pacific/Tongatapu" + - "UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81v/\x05\x00Pacific/YapUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|X" + - "Q1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~0\x05\x00Pacific/WallisUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04" + - "\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe9\xdd\x1e\xee\f\x01\x00\x00\f\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81L1\x05\x00Pacif" + - "ic/ApiaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQY5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9e2\x05\x00Pacific/NorfolkUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xd5s\x9bkD\x01\x00\x00D\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde3\x05\x00Pacific/EfateUT\x05\x00\x03" + - "\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81i5\x05\x00Pacific/FijiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQa\v\xe0" + - "\xb3\x86\x00\x00\x00\x86\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81R7\x05\x00Pacific/FunafutiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\"8\x05\x00Pacific" + - "/PalauUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd8\x05\x00Pacific/GuamUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\x0e|XQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1:\x05\x00Pacific/SaipanUT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81G<" + - "\x05\x00Pacific/KosraeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x81\xeb\xb8m" + - "\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81=\x05\x00Pacific/NiueUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v>\x05\x00Pacific/Pona" + - "peUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x94?\x05\x00Pacific/WakeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`@\x05\x00Pacific/GalapagosUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ZA\x05" + - "\x00Pacific/JohnstonUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQt\xca{" + - "e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81B\x05\x00Pacific/MidwayUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00" + - "\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xe2;Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[C\x05\x00Pacific/N" + - "auruUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81YD\x05\x00Pacific/GuadalcanalUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,E\x05\x00Pacific/ChathamUT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\x9dH\x05\x00Pacific/AucklandUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\x0e|XQ\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfaL\x05\x00Pacific/NoumeaUT\x05\x00\x03\xec,\x94_ux\v" + - "\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\bN\x05\x00Pa" + - "cific/FakaofoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xea\xc1\xdaυ\x00\x00" + - "\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeaN\x05\x00Pacific/TahitiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7O\x05\x00Pacific/Gambi" + - "erUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x84P\x05\x00Pacific/MajuroUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\x0e|XQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6Q\x05\x00Pacific/HonoluluUT\x05\x00\x03\xec,\x94" + - "_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdR" + - "\x05\x00Pacific/PohnpeiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQt\xca{" + - "e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xecS\x05\x00Pacific/Pago_PagoUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5" + - "\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc9T\x05\x00Pacifi" + - "c/TrukUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2U\x05\x00Pacific/PitcairnUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQD6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb5V\x05\x00Pacific/MarquesasU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\x8bW\x05\x00Pacific/BougainvilleUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\x0e|XQ6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2X\x05\x00Pacific/TarawaUT\x05\x00\x03\xec," + - "\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x85v\xf8\x8c\x87\x01\x00\x00\x87\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p" + - "Y\x05\x00Pacific/RarotongaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ" + - "t\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81B[\x05\x00Pacific/SamoaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01" + - "\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b\\\x05\x00Pacific" + - "/KiritimatiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ3\x03\x1f\f\xac\x00\x00\x00\xac" + - "\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15]\x05\x00Pacific/EnderburyUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\f^\x05\x00PolandUT\x05\x00\x03\xec" + - ",\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xe7a\x05\x00PortugalUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xee\xf0BB\xff\x01\x00\x00" + - "\xff\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc5g\x05\x00ROCUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\x0e|XQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01j\x05\x00ROKUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xddk\x05\x00SingaporeUT\x05" + - "\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81 m\x05\x00TurkeyUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00" + - "\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x10r\x05\x00UCTUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\x0e|XQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xbcr\x05\x00US/UT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14" + - "\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf9r\x05\x00US/AlaskaUT" + - "\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\rw\x05\x00US/PacificUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ3\x9a" + - "G\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_|\x05\x00US/EasternUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81s\x83\x05\x00US/MichiganU" + - "T\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81;\x87\x05\x00US/ArizonaUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ$" + - " \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o\x88\x05\x00US/Indiana-StarkeUT\x05\x00\x03\xec,\x94_ux\v\x00\x01" + - "\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb2\x8c\x05\x00US/A" + - "leutianUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc0\x90\x05\x00US/HawaiiUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\x0e|XQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\x91\x05\x00US/East-IndianaUT\x05\x00\x03\xec,\x94_" + - "ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x94\x05" + - "\x00US/CentralUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQV\x80\x94@\x12\x04\x00\x00\x12" + - "\x04\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Z\x9b\x05\x00US/MountainUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\x9f\x05\x00US/SamoaUT\x05\x00\x03\xec,\x94_u" + - "x\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xa0\x05\x00" + - "UTCUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x811\xa1\x05\x00UniversalUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|" + - "XQ\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3\xa1\x05\x00W-SUUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xad\xa5\x05\x00WETUT\x05\x00\x03\xec,\x94_ux" + - "\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\x0e|XQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ا\x05\x00Z" + - "uluUT\x05\x00\x03\xec,\x94_ux\v\x00\x01\x04\xf5\x01\x00\x00\x04\x14\x00\x00\x00PK\x05\x06\x00\x00\x00\x00f\x02f\x02\x96\xc9\x00\x00\x85\xa8\x05\x00\x00\x00" + "\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\x00E" + + "DC`\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\n" + + "EST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x1c\x00US/Indi" + + "ana-StarkeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe1" + + "p\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\x00CW" + + "T\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00" + + "\b\x00\x1c\x00US/SamoaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + + "SST11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x1c\x00US/MountainUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q5\x11Q\x06\xd1\x03\x00\x00\xd1" + + "\x03\x00\x00\t\x00\x1c\x00US/AlaskaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04" + + "aC\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\x12" + + "y\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\x00A" + + "ST\x00AWT\x00APT\x00AHST\x00AHDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x1c\x00US/MichiganUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\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\u007f`\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\nEST5EDT,M3.2.0" + + ",M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x1c\x00US/AleutianUT\t\x00\x03\xfc\xff\xe2_\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\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\x00HD" + + "T\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UTC" + + "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x1c\x00WETUT\t\x00\x03\xfc\xff\xe2" + + "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\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\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`\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\x15L" + + "MT\x00MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f." + + "\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x1c\x00ZuluUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x00\x00\x00\x00Africa/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81A\x00\x00\x00Africa/FreetownUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\f\x01\x00\x00Africa/KinshasaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\x02\x00\x00Africa/LagosUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\x03\x00\x00Africa/J" + + "ohannesburgUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83" + + "\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\x04\x00\x00Africa/BujumburaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\x04\x00\x00Africa/Kigali" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\xa5\x05\x00\x00Africa/ConakryUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o\x06\x00\x00Africa/El_AaiunUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde\r\x00\x00A" + + "frica/KhartoumUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f\x1b\xeb\xdd2\x02" + + "\x00\x002\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\x0f\x00\x00Africa/CeutaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x12\x00\x00Africa/TunisUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81p\x14\x00\x00Africa/BrazzavilleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Qd\x01\x05\x89\u007f\a\x00\x00\u007f\a\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x15\x00\x00Africa/CasablancaUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:" + + "\x1d\x00\x00Africa/MbabaneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q6\x99r" + + "U\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81@\x1e\x00\x00Africa/MonroviaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\x1f\x00\x00Africa/N" + + "iameyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81( \x00\x00Africa/DakarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0 \x00\x00Africa/TripoliUT\x05\x00\x03\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7\"\x00" + + "\x00Africa/NdjamenaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c" + + "\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd0#\x00\x00Africa/DoualaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcb$\x00\x00Africa/Algi" + + "ersUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9&\x00\x00Africa/DjiboutiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1'\x00\x00Africa/Sao_TomeUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7" + + "(\x00\x00Africa/AbidjanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0" + + "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1)\x00\x00Africa/MaputoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{*\x00\x00Africa/Cai" + + "roUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\v\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xbd/\x00\x00Africa/LomeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x840\x00\x00Africa/BamakoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M1\x00\x00Afri" + + "ca/AsmaraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00" + + "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S2\x00\x00Africa/LibrevilleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81R3\x00\x00Africa/Blantyr" + + "eUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\x1e4\x00\x00Africa/WindhoekUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe56\x00\x00Africa/HarareUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf7\x00\x00A" + + "frica/AsmeraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00" + + "\x83\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb58\x00\x00Africa/LubumbashiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x839\x00\x00Africa/Port" + + "o-NovoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82:\x00\x00Africa/TimbuktuUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M;\x00\x00Africa/KampalaUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81T<\x00\x00Africa/NairobiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc" + + "\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[=\x00\x00Africa/MaseruUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`>\x00\x00Africa/O" + + "uagadougouUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00" + + "\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81.?\x00\x00Africa/LusakaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8?\x00\x00Africa/MogadishuU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\x01A\x00\x00Africa/GaboroneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdA\x00\x00Africa/BanjulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96B\x00\x00Afr" + + "ica/MalaboUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00" + + "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91C\x00\x00Africa/Addis_AbabaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9cD\x00\x00Africa/Nouak" + + "chottUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81iE\x00\x00Africa/LuandaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dF\x00\x00Africa/JubaUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81jH\x00\x00A" + + "frica/AccraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf" + + "\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81lK\x00\x00Africa/Dar_es_SalaamUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81yL\x00\x00Africa/Bi" + + "ssauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81UM\x00\x00Africa/BanguiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAPN\x00\x00America/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92N\x00\x00Ameri" + + "ca/Grand_TurkUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00" + + "\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813R\x00\x00America/St_VincentUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01S\x00\x00America/S" + + "t_KittsUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\b\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdS\x00\x00America/BarbadosUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8f\x19Ԇ\x12\x02\x00\x00\x12\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfeT\x00\x00America/Bahia_Ban" + + "derasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`W\x00\x00America/NuukUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wY\x00\x00America/Costa_RicaUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\xabZ\x00\x00America/ManausUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc1" + + "Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\\\x00\x00America/WhitehorseUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0`\x00\x00Ame" + + "rica/CayenneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00" + + "\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc0a\x00\x00America/MarigotUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8bb\x00\x00America/Ranki" + + "n_InletUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8de\x00\x00America/Punta_ArenasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94j\x00\x00America/Grena" + + "daUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81_k\x00\x00America/MenomineeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\x15\xc8\xcb\x00\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?o\x00\x00America/GuyanaUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813" + + "p\x00\x00America/Buenos_AiresUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Es\x00\x00America/Port_of_SpainUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\x16t\x00\x00America/MonctonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe9" + + "\x8c\xb4$q\x03\x00\x00q\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814z\x00\x00America/Thunder_BayUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2}\x00\x00Am" + + "erica/Blanc-SablonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q8\xcd" + + "Z\x05o\x01\x00\x00o\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\u007f\x00\x00America/MazatlanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƀ\x00\x00Americ" + + "a/CaymanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00" + + "\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\x81\x00\x00America/DawsonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\x85\x00\x00America/TortolaUT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xbb\x86\x00\x00America/ThuleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\xf7\xe9 y\xbd\x02\x00\x00\xbd\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ɉ\x00\x00America/InuvikUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\u038b\x00\x00Americ" + + "a/North_Dakota/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QR\x1b\x8b(\xde" + + "\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\x8c\x00\x00America/North_Dakota/New_SalemUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81S\x90\x00\x00America/North_Dakota/CenterUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x86\x94\x00\x00America/North_Dako" + + "ta/BeulahUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b\vKdC\x03\x00\x00C\x03\x00" + + "\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\x98\x00\x00America/Rainy_RiverUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~\x9c\x00\x00America/Atik" + + "okanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\x9d\x00\x00America/Boa_VistaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\x9f\x00\x00America/MartiniqueU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\x9f\xa0\x00\x00America/AdakUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QU9#\xbe2\x05\x00\x002\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xa4\x00\x00America/VancouverUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\xaa\x00\x00Am" + + "erica/Porto_AcreUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x9aG\xc8" + + "\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\xac\x00\x00America/New_YorkUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\xb3\x00\x00America/" + + "RecifeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_\xb5\x00\x00America/AsuncionUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\xb9\x00\x00America/Port-au-Pr" + + "inceUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\xbb\x00\x00America/MaceioUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\xbd\x00\x00America/BoiseUT\x05\x00\x03\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xc2\x00" + + "\x00America/PangnirtungUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\xc5\x00\x00America/GodthabUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\xc7\x00\x00Ameri" + + "ca/NassauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00" + + "\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xcb\x00\x00America/RosarioUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\xce\x00\x00America/St_Barth" + + "elemyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\xcf\x00\x00America/PhoenixUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3\xd0\x00\x00America/SantaremUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xa6\xd2\x00\x00America/MetlakatlaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xd5\x00\x00America/AraguainaUT\x05\x00\x03\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\xd7\x00" + + "\x00America/DenverUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4" + + "\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\xdc\x00\x00America/CordobaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?\xc9\x1c\xd4\xc6\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81G\xdf\x00\x00America/Ju" + + "neauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xe3\x00\x00America/OjinagaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xe5\x00\x00America/ScoresbysundU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xaf\xe7\x00\x00America/JujuyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xea\x00\x00America/EnsenadaUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xee\x00\x00Am" + + "erica/TorontoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qn\xab\xd5\xf9\xcf\x03\x00" + + "\x00\xcf\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\xf5\x00\x00America/NomeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06\xfa\x00\x00America/Cambrid" + + "ge_BayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xfd\x00\x00America/CrestonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qq\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\xfe\x00\x00America/Puerto_Rico" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81:\xff\x00\x00America/CatamarcaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\x02\x01\x00America/Coral_HarbourUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x10\x00\xedAx\x03\x01\x00America/Argentina/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Qt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\x03\x01\x00America/Argentina/SaltaU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xc7\x06\x01\x00America/Argentina/Buenos_AiresUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3\t\x01\x00America/Arg" + + "entina/UshuaiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfcz=\xe1\xcd\x02" + + "\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfa\f\x01\x00America/Argentina/San_JuanUT\x05\x00\x03\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b\x10\x01\x00" + + "America/Argentina/La_RiojaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x13\x01\x00America/Argentina/San_Lu" + + "isUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81]\x16\x01\x00America/Argentina/Rio_GallegosUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\x19\x01\x00America/" + + "Argentina/CordobaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QutZ" + + "\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\x1c\x01\x00America/Argentina/JujuyUT\x05\x00\x03\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\x1f\x01\x00" + + "America/Argentina/CatamarcaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\"\x01\x00America/Argentina/Comod" + + "RivadaviaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00" + + "\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca%\x01\x00America/Argentina/MendozaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QY\xd8֭\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe1(\x01\x00Americ" + + "a/Argentina/TucumanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x89" + + "غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n,\x01\x00America/BelizeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g0\x01\x00America" + + "/SitkaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j4\x01\x00America/YellowknifeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x907\x01\x00America/Indiana" + + "/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xda7\x01\x00America/Indiana/VevayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9a9\x01\x00America/Indiana/Vi" + + "ncennesUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QM/U\x9f7\x02\x00\x007\x02\x00\x00\x17" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b<\x01\x00America/Indiana/MarengoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3>\x01\x00America/In" + + "diana/WinamacUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00" + + "\x00\xf8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81XA\x01\x00America/Indiana/KnoxUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9eE\x01\x00America" + + "/Indiana/IndianapolisUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QصK\xa6\n\x02\x00\x00\n\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\aH\x01\x00America/Indiana/Tell_CityUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x01\xd8N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81dJ\x01\x00America/Indiana/PetersburgUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81cM\x01\x00America/FortalezaU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\x92O\x01\x00America/AnchorageUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Qk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaeS\x01\x00America/DanmarkshavnUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xbbU\x01\x00America/ReginaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "g\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81X\x01\x00America/AntiguaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81LY\x01\x00Ameri" + + "ca/Porto_VelhoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1e\xfbn۸\x03" + + "\x00\x00\xb8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#[\x01\x00America/Campo_GrandeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)_\x01\x00Americ" + + "a/DominicaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02" + + "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5_\x01\x00America/Fort_WayneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Tb\x01\x00America/Rio_" + + "BrancoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Bd\x01\x00America/TegucigalpaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Qe\x01\x00America/Mexico_" + + "CityUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:g\x01\x00America/TijuanaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84k\x01\x00America/CancunUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdd" + + "m\x01\x00America/Swift_CurrentUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9co\x01\x00America/CuiabaUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8as\x01\x00Am" + + "erica/MendozaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q~\xb2\x0e\x19V\a\x00" + + "\x00V\a\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x97v\x01\x00America/St_JohnsUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x817~\x01\x00America/Mer" + + "idaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\u007f\x01\x00America/ResoluteUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\x82\x01\x00America/ArubaUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\x83" + + "\x01\x00America/HalifaxUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QԾ\xe7" + + "#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[\x8a\x01\x00America/PanamaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818\x8b\x01\x00America/A" + + "nguillaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x04\x8c\x01\x00America/ChicagoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x93\x01\x00America/JamaicaUT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81Ô\x01\x00America/IndianapolisUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\x97\x01\x00America/CaracasUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\x98" + + "\x01\x00America/LimaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QB\xa0=:\x1e\x01" + + "\x00\x00\x1e\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\x99\x01\x00America/HermosilloUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\x9a\x01\x00America/" + + "BelemUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ǜ\x01\x00America/Glace_BayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xa0\x01\x00America/Guadeloupe" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81P\xa1\x01\x00America/ShiprockUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97QU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xa5\x01\x00America/MatamorosUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6@\rm\xa8\x05\x00\x00\xa8\x05\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac" + + "\xa7\x01\x00America/Fort_NelsonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97QOKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\xad\x01\x00America/BahiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\xb0\x01\x00Ameri" + + "ca/Goose_BayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00" + + "\x97\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\xb7\x01\x00America/KralendijkUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xec\xb7\x01\x00America/Sa" + + "nta_IsabelUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02" + + "\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xbc\x01\x00America/IqaluitUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81h\xbf\x01\x00America/Edmonto" + + "nUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81|\xc3\x01\x00America/BogotaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\xc4\x01\x00America/GuatemalaUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96\xc5" + + "\x01\x00America/DetroitUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\x1b\xce" + + "RC\x03\x00\x00C\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b\xc9\x01\x00America/NipigonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\xcc\x01\x00America/" + + "MontserratUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7\b\\\xc6&\x02\x00\x00&\x02" + + "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbc\xcd\x01\x00America/MiquelonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,\xd0\x01\x00America/Sao_Pa" + + "uloUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x10\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\xd4\x01\x00America/SantiagoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xd9\x01\x00America/Knox_INUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xbc\xdd\x01\x00America/La_PazUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19v" + + "v\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xde\x01\x00America/Lower_PrincesUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94\xdf\x01\x00A" + + "merica/ChihuahuaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?_p\x99" + + "\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\xe1\x01\x00America/WinnipegUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b\xe6\x01\x00America/" + + "ParamariboUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00" + + "\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\xe7\x01\x00America/GuayaquilUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\xe8\x01\x00America/St_Th" + + "omasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\xe9\x01\x00America/MontevideoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\xed\x01\x00America/St_LuciaUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81>\xee\x01\x00America/YakutatUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\xf2\x01\x00America/AtkaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81H\xf6\x01\x00Ameri" + + "ca/El_SalvadorUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7-2f\xe4\x01" + + "\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xf7\x01\x00America/NoronhaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\xf9\x01\x00America/Man" + + "aguaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xfa\x01\x00America/Los_AngelesUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\x00\x02\x00America/EirunepeU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81;\x02\x02\x00America/Dawson_CreekUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814\x05\x02\x00America/LouisvilleUT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81Z\n\x02\x00America/CuracaoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97QMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\v\x02\x00America/MonterreyUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xaa\f\x02\x00A" + + "merica/Kentucky/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03\x1a|J" + + "\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5\f\x02\x00America/Kentucky/MonticelloUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16" + + "\x11\x02\x00America/Kentucky/LouisvilleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\x16\x02\x00America/HavanaUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xea\x1a\x02\x00America/MontrealUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "g\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9!\x02\x00America/VirginUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb3\"\x02\x00Americ" + + "a/Santo_DomingoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA?$\x02\x00Antarctica/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84$\x02\x00Antarctica/Dum" + + "ontDUrvilleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\r\x0e\xf20\x85\x00\x00\x00\x85" + + "\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o%\x02\x00Antarctica/SyowaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>&\x02\x00Antarctica/Da" + + "visUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81M'\x02\x00Antarctica/PalmerUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0f+\x02\x00Antarctica/MawsonUT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xf2+\x02\x00Antarctica/RotheraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2,\x02\x00Antarctica/VostokUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92-" + + "\x02\x00Antarctica/South_PoleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf41\x02\x00Antarctica/TrollUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef2\x02\x00A" + + "ntarctica/CaseyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\x84J]\xd0" + + "\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,4\x02\x00Antarctica/MacquarieUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81J8\x02\x00Antar" + + "ctica/McMurdoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xa9<\x02\x00Arctic/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea<\x02\x00Arctic/LongyearbyenU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x10\x00\xedA\xdb?\x02\x00Asia/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\t\xfa-\a\x03" + + "\x00\x00\a\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a@\x02\x00Asia/Hong_KongUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81iC\x02\x00Asia/MuscatU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x813D\x02\x00Asia/TaipeiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wF\x02\x00Asia/QatarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81SG\x02\x00Asia/Nicos" + + "iaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xeeI\x02\x00Asia/GazaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeeN\x02\x00Asia/BarnaulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%R\x02\x00Asia/Sa" + + "markandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdbS\x02\x00Asia/BakuUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97QѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06W\x02\x00Asia/TbilisiUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1Y\x02\x00As" + + "ia/RiyadhUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qʇ{_\xbb\x00\x00\x00\xbb\x00\x00" + + "\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8bZ\x02\x00Asia/RangoonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97QO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c[\x02\x00Asia/YakutskUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7" + + "^\x02\x00Asia/IstanbulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd5ΜG" + + "p\x02\x00\x00p\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaec\x02\x00Asia/QyzylordaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ff\x02\x00Asia/Khand" + + "ygaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4i\x02\x00Asia/KathmanduUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9dj\x02\x00Asia/ChongqingUT\x05\x00\x03\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81nl\x02" + + "\x00Asia/Ho_Chi_MinhUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q0]*" + + "\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4m\x02\x00Asia/BishkekUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Tp\x02\x00Asia/Qostan" + + "ayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\x02s\x02\x00Asia/KabulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5s\x02\x00Asia/TomskUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1aw\x02\x00Asia/Mac" + + "auUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81uz\x02\x00Asia/Ust-NeraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf}\x02\x00Asia/YerevanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ɀ\x02\x00Asi" + + "a/VientianeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qd%\x05\xd8\xe6\x02\x00\x00\xe6" + + "\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9\x81\x02\x00Asia/VladivostokUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ل\x02\x00Asia/BeirutUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xfa\x87\x02\x00Asia/DaccaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\xea" + + "\x18\xd4\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\x89\x02\x00Asia/YekaterinburgUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q6j\\J\xcf\x04\x00\x00\xcf\x04\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x8c\x02\x00Asia" + + "/HebronUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}\x91\x02\x00Asia/ThimphuUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Qj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\x92\x02\x00Asia/ThimbuUT\x05\x00\x03\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x93\x02\x00" + + "Asia/SakhalinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81z&\x80k\x02\x00" + + "\x00k\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\x96\x02\x00Asia/ChoibalsanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*\x99\x02\x00Asia/SeoulUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\r\x9b\x02\x00Asia/MakassarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x12\x9c\x02\x00Asia/DubaiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ۜ\x02\x00Asia/Alma" + + "tyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\x81\x9f\x02\x00Asia/Ulan_BatorUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1c\xa2\x02\x00Asia/SaigonUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xa3\x02\x00As" + + "ia/DhakaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q.>[K\xab\x00\x00\x00\xab\x00\x00\x00" + + "\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81x\xa4\x02\x00Asia/JayapuraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xa5\x02\x00Asia/PyongyangUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81i\xa6\x02\x00Asia/Kuala_LumpurUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xa7\x02\x00Asia/ChungkingUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xa9\x02\x00Asia" + + "/AqtobeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x811\xac\x02\x00Asia/ChitaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81c\xaf\x02\x00Asia/ColomboUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xb0\x02\x00A" + + "sia/MacaoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00" + + "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xb3\x02\x00Asia/SrednekolymskUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\xb7\x02\x00Asia/BaghdadU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qe\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xe9\xb9\x02\x00Asia/AshgabatUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xbb\x02\x00Asia/KamchatkaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƾ\x02\x00Asia" + + "/BahrainUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00" + + "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xbf\x02\x00Asia/BangkokUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xc0\x02\x00Asia/KarachiUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xc1" + + "\x02\x00Asia/TashkentUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85" + + "\x00\x00\x00\x85\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\xc3\x02\x00Asia/AdenUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\xc4\x02\x00Asia/OmskUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w" + + "\xc7\x02\x00Asia/Phnom_PenhUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17\xe2" + + "\x9c\xb32\x04\x00\x002\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\xc8\x02\x00Asia/JerusalemUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xcc\x02\x00Asia/Mag" + + "adanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xd0\x02\x00Asia/JakartaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xd1\x02\x00Asia/NovokuznetskUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f" + + "\xd4\x02\x00Asia/OralUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q)p\x1cX\xf1\x02\x00\x00" + + "\xf1\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a\xd7\x02\x00Asia/NovosibirskUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xda\x02\x00Asia/Damascu" + + "sUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xb3\xde\x02\x00Asia/Ujung_PandangUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd\xdf\x02\x00Asia/FamagustaUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1" + + "\xe3\x02\x00Asia/YangonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xceG|\xea\x13\x03" + + "\x00\x00\x13\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\xe4\x02\x00Asia/AmmanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\b\xe8\x02\x00Asia/TokyoUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "!\xe9\x02\x00Asia/AnadyrUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q;\u007fP\x8d\xd4" + + "\a\x00\x00\xd4\a\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xec\x02\x00Asia/TehranUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xf4\x02\x00Asia/Singapore" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qy\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\xae\xf5\x02\x00Asia/BruneiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8d\xf6\x02\x00Asia/UrumqiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\xf7\x02\x00Asia/Dil" + + "iUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81D\xf8\x02\x00Asia/AshkhabadUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xb8K\x97QL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\xfa\x02\x00Asia/KrasnoyarskUT\x05\x00\x03\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x812\xfd\x02" + + "\x00Asia/AtyrauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QT\x81\x18G^\x02\x00\x00" + + "^\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdf\xff\x02\x00Asia/AqtauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81\x02\x03\x00Asia/HarbinUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O" + + "\x04\x03\x00Asia/KuwaitUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\x1a\xdc\xca\xdc\x00" + + "\x00\x00\xdc\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\x05\x03\x00Asia/CalcuttaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x06\x03\x00Asia/ManilaUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81o\a\x03\x00Asia/DushanbeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\t\x03\x00Asia/Tel_AvivUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\r\x03\x00Asia/U" + + "laanbaatarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02" + + "\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\x10\x03\x00Asia/IrkutskUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\x13\x03\x00Asia/ShanghaiUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81G\x15\x03\x00Asia/KatmanduUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xba\xa3" + + "b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\x16\x03\x00Asia/HovdUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\x18\x03\x00Asia/KolkataU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xe6\x19\x03\x00Asia/KashgarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "QS\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\x1a\x03\x00Asia/PontianakUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\x1b\x03\x00Asia/" + + "KuchingUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAv\x1d\x03\x00Atlantic/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\u0097N\xad\xaf\x00\x00\x00\xaf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\x1d\x03\x00Atlantic/Cape_VerdeUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\xb5\x1e\x03\x00Atlantic/FaroeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5" + + "\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6 \x03\x00Atlantic/Jan_MayenUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6#\x03\x00Atl" + + "antic/ReykjavikUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaf|7\xb3\xde" + + "\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3&\x03\x00Atlantic/CanaryUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n)\x03\x00Atlantic/S" + + "t_HelenaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00" + + "\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8)\x03\x00Atlantic/MadeiraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd/\x03\x00Atlantic/South_G" + + "eorgiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x910\x03\x00Atlantic/FaeroeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe7\xcf^\xb0\x15\x03\x00\x00\x15\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x932\x03\x00Atlantic/StanleyUT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xf25\x03\x00Atlantic/AzoresUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Ql&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6;\x03\x00Atlantic/BermudaUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA @\x03\x00Au" + + "stralia/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qϻ\xca\x1a2\x01\x00\x002\x01\x00\x00" + + "\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81d@\x03\x00Australia/PerthUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdfA\x03\x00Australia/LHIUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xdaD\x03\x00Australia/YancowinnaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5H\x03\x00Australia/Broken_HillUT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xd1L\x03\x00Australia/WestUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81KN\x03\x00Australia/DarwinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u007fO\x03\x00Aus" + + "tralia/AdelaideUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa2ܺ\xca:" + + "\x01\x00\x00:\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dS\x03\x00Australia/EuclaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7T\x03\x00Australia/" + + "MelbourneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00" + + "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbcX\x03\x00Australia/CanberraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\\\x03\x00Australia/Bri" + + "sbaneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd]\x03\x00Australia/Lord_HoweUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe`\x03\x00Australia/Victor" + + "iaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xd2d\x03\x00Australia/HobartUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\ai\x03\x00Australia/LindemanUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\x98j\x03\x00Australia/CurrieUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdn\x03\x00Australia/NorthUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00p\x03\x00Aus" + + "tralia/QueenslandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9a" + + "p\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81oq\x03\x00Australia/NSWUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>u\x03\x00Australia/" + + "ACTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\ry\x03\x00Australia/TasmaniaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D}\x03\x00Australia/SouthUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81&\x81\x03\x00Australia/SydneyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xf8\x84\x03\x00Brazil/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\x85\x03\x00Brazil/West" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\x1a\x87\x03\x00Brazil/AcreUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01\x89\x03\x00Brazil/DeNoronhaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\x8b\x03\x00Bra" + + "zil/EastUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA,\x8f\x03\x00Canada/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\u0096dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81m\x8f\x03\x00Canada/SaskatchewanUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QU9#\xbe2\x05\x00\x002\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "8\x92\x03\x00Canada/PacificUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ" + + "\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb2\x97\x03\x00Canada/EasternUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\x9e\x03\x00Canada/A" + + "tlanticUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x80\xa5\x03\x00Canada/NewfoundlandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\xad\x03\x00Canada/Central" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81y\xb2\x03\x00Canada/MountainUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\xb6\x03\x00Canada/YukonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05fa\x03\x00CET" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x10\x00\xedA\x81\xbd\x03\x00Chile/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q[Sp\x90" + + "\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1\xbd\x03\x00Chile/ContinentalUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xc3\x03\x00Chile/E" + + "asterIslandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q<\x8b\x99\x1e\xb7\x03\x00\x00\xb7" + + "\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xc7\x03\x00CST6CDTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xcb\x03\x00CubaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xd0\x03\x00EETUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81i\xd2\x03\x00EgyptUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05" + + "\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xd7\x03\x00EireUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xb8K\x97QtX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xba\xdd\x03\x00ESTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe7/\xebT\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xde\x03\x00EST5EDTUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA" + + "^\xe2\x03\x00Etc/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00" + + "\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c\xe2\x03\x00Etc/GMT+4UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xb8K\x97Q)\xb9\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xe3\x03\x00Etc/GMT+11UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\x19\xef\x03\x00Etc/" + + "ZuluUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef\xef\x03\x00Etc/GMT-7UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xf0\x03\x00Etc/GMT-5UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\xf1\x03\x00Etc/GMT+" + + "1UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q,{\xdc;s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\r\xf2\x03\x00Etc/GMT-14UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xd9|\xbd7s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\xf2\x03\x00Etc/GMT-10UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xab\xd1Is\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xf3\x03\x00Etc/GMT-1" + + "1UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x812\xf4\x03\x00Etc/GMT-13UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\x84+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\xf4\x03\x00Etc/GMT+7UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\xf5\x03\x00Etc/GMT-12" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81T\xf6\x03\x00Etc/GMT+0UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9c" + + "\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06\xf7\x03\x00Etc/GMT-3UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\xf7\x03\x00Etc/GMT+2UT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81o\xf8\x03\x00Etc/GreenwichUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\xf9\x03\x00Etc/UniversalUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\xf9\x03\x00Etc/GMT" + + "+8UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\xfa\x03\x00Etc/GMT-2UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAD\xfb\x03\x00Europe/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xfb\x03\x00Europe/Copen" + + "hagenUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00\x00\x10\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\xfe\x03\x00Europe/BucharestUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qu\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1e\x01\x04\x00Europe/UlyanovskUT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81`\x04\x04\x00Europe/NicosiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "Q\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd\x06\x04\x00Europe/BudapestUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D\n\x04\x00Euro" + + "pe/VaticanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01" + + "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\x0e\x04\x00Europe/MariehamnUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QWI\xc3\u007f(\x03\x00\x00(\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\x10\x04\x00Europe/MinskUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xd8\x13\x04\x00Europe/San_MarinoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Qo\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\x17\x04\x00Europe/BrusselsUT\x05\x00\x03\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81n\x1c\x04\x00" + + "Europe/IstanbulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde" + + "\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g!\x04\x00Europe/BelgradeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QZk#V\x81\x03\x00\x00\x81\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8e#\x04\x00Europe/Mad" + + "ridUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81V'\x04\x00Europe/ChisinauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Qߜvυ\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92*\x04\x00Europe/AndorraUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b8\xfel\xd6\x02\x00\x00\xd6\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_," + + "\x04\x00Europe/SaratovUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6" + + "?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}/\x04\x00Europe/LondonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qq\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x036\x04\x00Europe/Tall" + + "innUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee8\x04\x00Europe/ZaporozhyeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97QVa\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i;\x04\x00Europe/VolgogradUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\x92>\x04\x00Europe/RomeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QZ\x05w" + + "ג\x02\x00\x00\x92\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aB\x04\x00Europe/ViennaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QN\xa5\xa5\xcb\x12\x02\x00\x00\x12\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81cE\x04\x00Europe/Uzh" + + "gorodUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\r\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbeG\x04\x00Europe/MoscowUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91K\x04\x00Europe/KievUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfbM\x04\x00E" + + "urope/PragueUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00" + + "\xde\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15Q\x04\x00Europe/ZagrebUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qh\xa5J[\xa0\x03\x00\x00\xa0\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:S\x04\x00Europe/MaltaUT\x05" + + "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81 W\x04\x00Europe/TiraspolUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + + "\x97QO+j\x94\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\Z\x04\x00Europe/KaliningradUT\x05\x00\x03\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x810^\x04\x00" + + "Europe/StockholmUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1" + + "\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81k`\x04\x00Europe/SkopjeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90b\x04\x00Europe/Hels" + + "inkiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00\x00\x0e\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbad\x04\x00Europe/VilniusUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6g\x04\x00Europe/BelfastUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-n" + + "\x04\x00Europe/BratislavaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk" + + "\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Kq\x04\x00Europe/JerseyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qgp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd1w\x04\x00Europe/R" + + "igaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\r\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xccz\x04\x00Europe/LisbonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97QDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\x80\x04\x00Europe/BusingenUT\x05\x00\x03\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\x82\x04" + + "\x00Europe/PodgoricaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc9\a\xa0" + + "\xe1/\x04\x00\x00/\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x11\x85\x04\x00Europe/AmsterdamUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\x89\x04\x00Europe/" + + "BerlinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\r\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\x8c\x04\x00Europe/ZurichUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ʎ\x04\x00Europe/SarajevoUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8c\xc8\x15\xd0P\x02\x00\x00P\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xf1\x90\x04\x00Europe/SofiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5\x97\a\xc4" + + "\xa4\x02\x00\x00\xa4\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\x93\x04\x00Europe/OsloUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x96\x04\x00Europe/Ljublj" + + "anaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98\x98\x04\x00Europe/GuernseyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97QDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81 \x9f\x04\x00Europe/VaduzUT\x05\x00\x03\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\xa1\x04\x00" + + "Europe/Isle_of_ManUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q>\xfe" + + "垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xa7\x04\x00Europe/WarsawUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ī\x04\x00Europe/Ki" + + "rovUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05ee\x04\x00Europe/GibraltarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q]i\x11u\xd6\x02\x00\x00\xd6\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5\xb3\x04\x00Europe/AstrakhanUT\x05\x00\x03" + + "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\x05\xb7\x04\x00Europe/TiraneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qn\x81" + + "\xf4\xd7Z\x04\x00\x00Z\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xb9\x04\x00Europe/MonacoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QM\xe5\xa9 ?\x04\x00\x00?\x04\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xbe\x04\x00Europe/Lu" + + "xembourgUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00" + + "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd3\xc2\x04\x00Europe/ParisUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xc7\x04\x00Europe/AthensUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qz\xc3\xe8Ra\x03\x00\x00a\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[" + + "\xca\x04\x00Europe/SimferopolUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xce\x04\x00Europe/DublinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81&\xd4\x04\x00Europe/" + + "SamaraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xab\x80c$q\x00\x00\x00q\x00\x00\x00\a\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xd7\x04\x00FactoryUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xd7\x04\x00GBUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\xde\x04\x00GB-EireUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\xe4" + + "\x04\x00GMTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\xe5\x04\x00GMT+0UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + + "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xe6\x04\x00GMT-0UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\xe6\x04\x00GMT0UT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xab\xe7\x04\x00G" + + "reenwichUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00" + + "\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\xe8\x04\x00HongkongUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6\xeb\x04\x00HSTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S\xec\x04\x00IcelandUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00" + + "\xedA\x85\xef\x04\x00Indian/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00" + + "\x00\xbf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc6\xef\x04\x00Indian/AntananarivoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xf0\x04\x00Indian/C" + + "omoroUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8\xf1\x04\x00Indian/ChristmasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qa\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xf2\x04\x00Indian/MaheUT\x05\x00\x03\xfc\xff\xe2" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QͲ\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81q\xf3" + + "\x04\x00Indian/CocosUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb9\xb2Z\xac\x98\x00" + + "\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81C\xf4\x04\x00Indian/MaldivesUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\xf5\x04\x00Indian/Kerg" + + "uelenUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xf5\x04\x00Indian/MauritiusUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qx\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\xf6\x04\x00Indian/ChagosUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xcf\xf7\x04\x00Indian/MayotteUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qy(" + + "\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\xf8\x04\x00Indian/ReunionUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\xf9\x04\x00IranUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17✳2\x04\x00\x002\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xb5\x01\x05\x00IsraelUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q%J\xd5\xebS\x01\x00\x00" + + "S\x01\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x06\x05\x00JamaicaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\a\x05\x00JapanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcf\b\x05\x00Kwajal" + + "einUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xed\t\x05\x00LibyaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe\x9d" + + "\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\v\x05\x00METUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x85\x0e\x05\x00Mexico/UT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc6\x0e\x05\x00Me" + + "xico/BajaSurUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xe1Հ\x9c\x01\x00\x00" + + "\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}\x10\x05\x00Mexico/GeneralUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81a\x12\x05\x00Mexico/BajaNor" + + "teUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xac\x16\x05\x00MSTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe6h\xcac\xb7" + + "\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\x17\x05\x00MST7MDTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\x1b\x05\x00NavajoUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\x1f\x05\x00NZ" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\xf1#\x05\x00NZ-CHATUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAZ'\x05\x00Pacific/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c'\x05\x00Pacific/WallisU" + + "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81j(\x05\x00Pacific/EasterUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Q\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00-\x05\x00Pacific/GambierUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcd-\x05\x00Pa" + + "cific/NiueUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00\xc3\x00" + + "\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2.\x05\x00Pacific/YapUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca/\x05\x00Pacific/Bougainvill" + + "eUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xe10\x05\x00Pacific/PohnpeiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x002\x05\x00Pacific/TrukUT\x05\x00\x03\xfc\xff\xe2_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t3\x05\x00Pa" + + "cific/TarawaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00" + + "\xc3\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd73\x05\x00Pacific/ChuukUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe14\x05\x00Pacific/PalauUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xbc5\x05\x00Pacific/ChathamUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + + "K\x97Qa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-9\x05\x00Pacific/FunafutiUT\x05\x00\x03\xfc\xff\xe2_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QY5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd9\x05\x00P" + + "acific/NorfolkUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\u07b54-\xd6\x00" + + "\x00\x00\xd6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=;\x05\x00Pacific/PonapeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[<\x05\x00Pacific/Pago" + + "_PagoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818=\x05\x00Pacific/FakaofoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a>\x05\x00Pacific/NoumeaUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "(?\x05\x00Pacific/KosraeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\x0f" + + "A\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b@\x05\x00Pacific/PitcairnUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81EA\x05\x00Pacifi" + + "c/Port_MoresbyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04" + + "\x00\x00\x13\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-B\x05\x00Pacific/AucklandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aF\x05\x00Pacific/Gu" + + "adalcanalUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00" + + "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]G\x05\x00Pacific/EnderburyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81TH\x05\x00Pacific/Tahiti" + + "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81!I\x05\x00Pacific/JohnstonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81HJ\x05\x00Pacific/MajuroUT\x05\x00\x03\xfc\xff\xe2_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81jK\x05\x00" + + "Pacific/MidwayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x85v\xf8\x8c\x87\x01" + + "\x00\x00\x87\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81DL\x05\x00Pacific/RarotongaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16N\x05\x00Pacific/G" + + "uamUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbaO\x05\x00Pacific/TongatapuUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2P\x05\x00Pacific/HonoluluUT\x05\x00" + + "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\x19R\x05\x00Pacific/SamoaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe2" + + ";Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2R\x05\x00Pacific/NauruUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0S\x05\x00Pacific/" + + "FijiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe9\xdd\x1e\xee\f\x01\x00\x00\f\x01\x00\x00\f\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9U\x05\x00Pacific/ApiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xb8K\x97Q\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+W\x05\x00Pacific/KiritimatiUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "%X\x05\x00Pacific/WakeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\xe8]*" + + "\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1X\x05\x00Pacific/KwajaleinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17Z\x05\x00Pacific" + + "/SaipanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QD6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd[\x05\x00Pacific/MarquesasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\\\x05\x00Pacific/Galapago" + + "sUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\x8d]\x05\x00Pacific/EfateUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*_\x05\x00PolandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05c\x05\x00PortugalUT" + + "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xe3h\x05\x00PRCUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QŭV\xad\xb7\x03\x00\x00\xb7" + + "\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9j\x05\x00PST8PDTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xb8K\x97Q\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1n\x05\x00ROCUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xddp\x05\x00ROKUT\x05\x00\x03\xfc" + + "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xb9r\x05\x00SingaporeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00" + + "\x00\xb0\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfcs\x05\x00TurkeyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xecx\x05\x00UCTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98y\x05\x00Universa" + + "lUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x10\x00\xedAJz\x05\x00US/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\"\x12\xfe\x0e\x05" + + "\x00\x00\x0e\x05\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87z\x05\x00US/PacificUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9\u007f\x05\x00US/HawaiiUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf9" + + "\x80\x05\x00US/EasternUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9bܩ=\xda\x06\x00" + + "\x00\xda\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\x88\x05\x00US/CentralUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\x8f\x05\x00US/ArizonaUT\x05\x00\x03\xfc\xff" + + "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_" + + "\x90\x05\x00US/East-IndianaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q$ " + + "\x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\x92\x05\x00US/Indiana-StarkeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\x96\x05\x00US/Sa" + + "moaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81җ\x05\x00US/MountainUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xb8K\x97Q5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)\x9c\x05\x00US/AlaskaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\xa0\x05\x00US/Mich" + + "iganUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\xa4\x05\x00US/AleutianUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x13\xa8\x05\x00UTCUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf\xa8\x05\x00WETUT\x05\x00\x03\xfc\xff\xe2_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea\xaa\x05" + + "\x00W-SUUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xae\x05\x00ZuluUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x05\x06\x00\x00\x00\x00f\x02f\x02\x96\xc9\x00\x00a" + + "\xaf\x05\x00\x00\x00" -- GitLab From fb96f07e1a45b9ec41158732a34aee8c2ccc2eaf Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 23 Dec 2020 17:12:44 +0000 Subject: [PATCH 1573/1792] runtime: fix nStackRoots comment about stack roots A comment in mgcmark.go indicates that we scan stacks a second time but we don't, at least not since changing to the hybrid write barrier. Change-Id: I9376adbb6d8b6dd9dc3cee62e077b5dfb8a3fdde Reviewed-on: https://go-review.googlesource.com/c/go/+/279797 Trust: Michael Knyszek Reviewed-by: Michael Pratt Reviewed-by: Austin Clements --- src/runtime/mgcmark.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 5a24cdac88..52267e6fb0 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -101,8 +101,7 @@ func gcMarkRootPrepare() { // Gs may be created after this point, but it's okay that we // ignore them because they begin life without any roots, so // there's nothing to scan, and any roots they create during - // the concurrent phase will be scanned during mark - // termination. + // the concurrent phase will be caught by the write barrier. work.nStackRoots = int(atomic.Loaduintptr(&allglen)) work.markrootNext = 0 -- GitLab From 8db7e2fecdcd04af31c82d075c60ab6fdf6b7a48 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Tue, 22 Dec 2020 16:23:29 +0000 Subject: [PATCH 1574/1792] runtime: fix allocs-by-size and frees-by-size buckets Currently these two metrics are reported incorrectly, going by the documentation in the runtime/metrics package. We just copy in the size-class-based values from the runtime wholesale, but those implicitly have an inclusive upper-bound and exclusive lower-bound (e.g. 48-byte size class contains objects in the size range (32, 48]) but the API declares inclusive lower-bounds and exclusive upper-bounds. Also, the bottom bucket representing (-inf, 1) should always be empty. Extend the consistency check to verify this. Updates #43329. Change-Id: I11b5b062a34e13405ab662d15334bda91f779775 Reviewed-on: https://go-review.googlesource.com/c/go/+/279467 Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Trust: Michael Knyszek Reviewed-by: Michael Pratt --- src/runtime/metrics.go | 13 ++++++++++++- src/runtime/metrics_test.go | 6 ++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/runtime/metrics.go b/src/runtime/metrics.go index d3c0341aee..af86a0f03a 100644 --- a/src/runtime/metrics.go +++ b/src/runtime/metrics.go @@ -43,7 +43,18 @@ func initMetrics() { } sizeClassBuckets = make([]float64, _NumSizeClasses) for i := range sizeClassBuckets { - sizeClassBuckets[i] = float64(class_to_size[i]) + // Size classes have an inclusive upper-bound + // 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 + // boundaries up by 1. + // + // Also, a float64 can precisely represent integers with + // value up to 2^53 and size classes are relatively small + // (nowhere near 2^48 even) so this will give us exact + // boundaries. + sizeClassBuckets[i] = float64(class_to_size[i] + 1) } timeHistBuckets = timeHistogramMetricsBuckets() metrics = map[string]metricData{ diff --git a/src/runtime/metrics_test.go b/src/runtime/metrics_test.go index 167edd57fd..0ee469ae29 100644 --- a/src/runtime/metrics_test.go +++ b/src/runtime/metrics_test.go @@ -154,6 +154,12 @@ func TestReadMetricsConsistency(t *testing.T) { if totalVirtual.got != totalVirtual.want { t.Errorf(`"/memory/classes/total:bytes" does not match sum of /memory/classes/**: got %d, want %d`, totalVirtual.got, totalVirtual.want) } + if objects.alloc.Counts[0] > 0 { + t.Error("found counts for objects of non-positive size in allocs-by-size") + } + if objects.free.Counts[0] > 0 { + t.Error("found counts for objects of non-positive size in frees-by-size") + } if len(objects.alloc.Buckets) != len(objects.free.Buckets) { t.Error("allocs-by-size and frees-by-size buckets don't match in length") } else if len(objects.alloc.Counts) != len(objects.free.Counts) { -- GitLab From b116404444addc69b5ec987a2a64b92d4956eab0 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Tue, 22 Dec 2020 17:47:43 +0000 Subject: [PATCH 1575/1792] runtime: shift timeHistogram buckets and allow negative durations Today, timeHistogram, when copied, has the wrong set of counts for the bucket that should represent (-inf, 0), when in fact it contains [0, 1). In essence, the buckets are all shifted over by one from where they're supposed to be. But this also means that the existence of the overflow bucket is wrong: the top bucket is supposed to extend to infinity, and what we're really missing is an underflow bucket to represent the range (-inf, 0). We could just always zero this bucket and continue ignoring negative durations, but that likely isn't prudent. timeHistogram is intended to be used with differences in nanotime, but depending on how a platform is implemented (or due to a bug in that platform) it's possible to get a negative duration without having done anything wrong. We should just be resilient to that and be able to detect it. So this change removes the overflow bucket and replaces it with an underflow bucket, and timeHistogram no longer panics when faced with a negative duration. Fixes #43328. Fixes #43329. Change-Id: If336425d7d080fd37bf071e18746800e22d38108 Reviewed-on: https://go-review.googlesource.com/c/go/+/279468 Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Trust: Michael Knyszek Reviewed-by: Michael Pratt --- src/runtime/export_test.go | 4 ++-- src/runtime/histogram.go | 30 +++++++++++++++--------------- src/runtime/histogram_test.go | 22 +++++++++++++++++----- src/runtime/metrics.go | 4 ++-- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 44551dcaf1..22fef3134f 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -1201,12 +1201,12 @@ type TimeHistogram timeHistogram // Counts returns the counts for the given bucket, subBucket indices. // Returns true if the bucket was valid, otherwise returns the counts -// for the overflow bucket and false. +// for the underflow bucket and false. func (th *TimeHistogram) Count(bucket, subBucket uint) (uint64, bool) { t := (*timeHistogram)(th) i := bucket*TimeHistNumSubBuckets + subBucket if i >= uint(len(t.counts)) { - return t.overflow, false + return t.underflow, false } return t.counts[i], true } diff --git a/src/runtime/histogram.go b/src/runtime/histogram.go index 4020969eb9..d48e856cd0 100644 --- a/src/runtime/histogram.go +++ b/src/runtime/histogram.go @@ -69,17 +69,15 @@ const ( // for concurrent use. It is also safe to read all the values // atomically. type timeHistogram struct { - counts [timeHistNumSuperBuckets * timeHistNumSubBuckets]uint64 - overflow uint64 + counts [timeHistNumSuperBuckets * timeHistNumSubBuckets]uint64 + underflow uint64 } // record adds the given duration to the distribution. -// -// Although the duration is an int64 to facilitate ease-of-use -// with e.g. nanotime, the duration must be non-negative. func (h *timeHistogram) record(duration int64) { if duration < 0 { - throw("timeHistogram encountered negative duration") + atomic.Xadd64(&h.underflow, 1) + return } // The index of the exponential bucket is just the index // of the highest set bit adjusted for how many bits we @@ -92,15 +90,17 @@ func (h *timeHistogram) record(duration int64) { superBucket = uint(sys.Len64(uint64(duration))) - timeHistSubBucketBits if superBucket*timeHistNumSubBuckets >= uint(len(h.counts)) { // The bucket index we got is larger than what we support, so - // add into the special overflow bucket. - atomic.Xadd64(&h.overflow, 1) - return + // include this count in the highest bucket, which extends to + // infinity. + superBucket = timeHistNumSuperBuckets - 1 + subBucket = timeHistNumSubBuckets - 1 + } else { + // The linear subbucket index is just the timeHistSubBucketsBits + // bits after the top bit. To extract that value, shift down + // the duration such that we leave the top bit and the next bits + // intact, then extract the index. + subBucket = uint((duration >> (superBucket - 1)) % timeHistNumSubBuckets) } - // The linear subbucket index is just the timeHistSubBucketsBits - // bits after the top bit. To extract that value, shift down - // the duration such that we leave the top bit and the next bits - // intact, then extract the index. - subBucket = uint((duration >> (superBucket - 1)) % timeHistNumSubBuckets) } else { subBucket = uint(duration) } @@ -128,7 +128,7 @@ func timeHistogramMetricsBuckets() []float64 { // index to combine it with the bucketMin. subBucketShift := uint(0) if i > 1 { - // The first two buckets are exact with respect to integers, + // The first two super buckets are exact with respect to integers, // so we'll never have to shift the sub-bucket index. Thereafter, // we shift up by 1 with each subsequent bucket. subBucketShift = uint(i - 2) diff --git a/src/runtime/histogram_test.go b/src/runtime/histogram_test.go index 5f5b28f784..dbc64fa559 100644 --- a/src/runtime/histogram_test.go +++ b/src/runtime/histogram_test.go @@ -5,6 +5,7 @@ package runtime_test import ( + "math" . "runtime" "testing" ) @@ -32,8 +33,8 @@ func TestTimeHistogram(t *testing.T) { h.Record(base + v) } } - // Hit the overflow bucket. - h.Record(int64(^uint64(0) >> 1)) + // Hit the underflow bucket. + h.Record(int64(-1)) // Check to make sure there's exactly one count in each // bucket. @@ -41,7 +42,7 @@ func TestTimeHistogram(t *testing.T) { for j := uint(0); j < TimeHistNumSubBuckets; j++ { c, ok := h.Count(i, j) if !ok { - t.Errorf("hit overflow bucket unexpectedly: (%d, %d)", i, j) + t.Errorf("hit underflow bucket unexpectedly: (%d, %d)", i, j) } else if c != 1 { t.Errorf("bucket (%d, %d) has count that is not 1: %d", i, j, c) } @@ -49,10 +50,21 @@ func TestTimeHistogram(t *testing.T) { } c, ok := h.Count(TimeHistNumSuperBuckets, 0) if ok { - t.Errorf("expected to hit overflow bucket: (%d, %d)", TimeHistNumSuperBuckets, 0) + t.Errorf("expected to hit underflow bucket: (%d, %d)", TimeHistNumSuperBuckets, 0) } if c != 1 { - t.Errorf("overflow bucket has count that is not 1: %d", c) + t.Errorf("underflow bucket has count that is not 1: %d", c) } + + // Check overflow behavior. + // By hitting a high value, we should just be adding into the highest bucket. + h.Record(math.MaxInt64) + c, ok = h.Count(TimeHistNumSuperBuckets-1, TimeHistNumSubBuckets-1) + if !ok { + t.Error("hit underflow bucket in highest bucket unexpectedly") + } else if c != 2 { + t.Errorf("highest has count that is not 2: %d", c) + } + dummyTimeHistogram = TimeHistogram{} } diff --git a/src/runtime/metrics.go b/src/runtime/metrics.go index af86a0f03a..1d191e6298 100644 --- a/src/runtime/metrics.go +++ b/src/runtime/metrics.go @@ -116,9 +116,9 @@ func initMetrics() { "/gc/pauses:seconds": { compute: func(_ *statAggregate, out *metricValue) { hist := out.float64HistOrInit(timeHistBuckets) - hist.counts[len(hist.counts)-1] = atomic.Load64(&memstats.gcPauseDist.overflow) + hist.counts[0] = atomic.Load64(&memstats.gcPauseDist.underflow) for i := range hist.buckets { - hist.counts[i] = atomic.Load64(&memstats.gcPauseDist.counts[i]) + hist.counts[i+1] = atomic.Load64(&memstats.gcPauseDist.counts[i]) } }, }, -- GitLab From 2018b68a65c32a12ed5f65983212bea175b7a0fa Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 23 Dec 2020 14:01:12 -0800 Subject: [PATCH 1576/1792] net/mail: don't use MDT in test When time.Parse sees a timezone name that matches the local timezone, it uses the local timezone. The tests weren't expecting that, so using MDT broke with TZ=America/Boise (where MDT means Mountain Daylight Time). Just use GMT instead. Fixes #43354 Change-Id: Ida70c8c867e2568b1535d1dfbf1fb0ed9e0e5c1e Reviewed-on: https://go-review.googlesource.com/c/go/+/280072 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Emmanuel Odeke --- src/net/mail/message_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/net/mail/message_test.go b/src/net/mail/message_test.go index 0daa3d6c63..80a17b2853 100644 --- a/src/net/mail/message_test.go +++ b/src/net/mail/message_test.go @@ -107,8 +107,8 @@ func TestDateParsing(t *testing.T) { time.Date(1997, 11, 20, 9, 55, 6, 0, time.FixedZone("", -6*60*60)), }, { - "Thu, 20 Nov 1997 09:55:06 MDT (MDT)", - time.Date(1997, 11, 20, 9, 55, 6, 0, time.FixedZone("MDT", 0)), + "Thu, 20 Nov 1997 09:55:06 GMT (GMT)", + time.Date(1997, 11, 20, 9, 55, 6, 0, time.UTC), }, { "Fri, 21 Nov 1997 09:55:06 +1300 (TOT)", @@ -278,8 +278,8 @@ func TestDateParsingCFWS(t *testing.T) { true, }, { - "Fri, 21 Nov 1997 09:55:06 MDT (MDT)", - time.Date(1997, 11, 21, 9, 55, 6, 0, time.FixedZone("MDT", 0)), + "Fri, 21 Nov 1997 09:55:06 GMT (GMT)", + time.Date(1997, 11, 21, 9, 55, 6, 0, time.UTC), true, }, } -- GitLab From 1d78139128d6d839d7da0aeb10b3e51b6c7c0749 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 25 Dec 2020 11:14:11 +0100 Subject: [PATCH 1577/1792] runtime/cgo: fix Android build with NDK 22 Fixes #42655 Change-Id: I7d2b70098a4ba4dcb325fb0be076043789b86135 Reviewed-on: https://go-review.googlesource.com/c/go/+/280312 Run-TryBot: Elias Naur TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Elias Naur --- src/runtime/cgo/gcc_linux_386.c | 2 +- src/runtime/cgo/gcc_linux_amd64.c | 2 +- src/runtime/cgo/gcc_linux_arm.c | 2 +- src/runtime/cgo/gcc_linux_arm64.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/runtime/cgo/gcc_linux_386.c b/src/runtime/cgo/gcc_linux_386.c index ece9f933c5..70c942aeb8 100644 --- a/src/runtime/cgo/gcc_linux_386.c +++ b/src/runtime/cgo/gcc_linux_386.c @@ -12,7 +12,7 @@ static void *threadentry(void*); static void (*setg_gcc)(void*); // This will be set in gcc_android.c for android-specific customization. -void (*x_cgo_inittls)(void **tlsg, void **tlsbase); +void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common)); void x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) diff --git a/src/runtime/cgo/gcc_linux_amd64.c b/src/runtime/cgo/gcc_linux_amd64.c index 9134e0df92..f2bf6482cb 100644 --- a/src/runtime/cgo/gcc_linux_amd64.c +++ b/src/runtime/cgo/gcc_linux_amd64.c @@ -14,7 +14,7 @@ static void* threadentry(void*); static void (*setg_gcc)(void*); // This will be set in gcc_android.c for android-specific customization. -void (*x_cgo_inittls)(void **tlsg, void **tlsbase); +void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common)); void x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) diff --git a/src/runtime/cgo/gcc_linux_arm.c b/src/runtime/cgo/gcc_linux_arm.c index 61855b96b2..5bc0fee90d 100644 --- a/src/runtime/cgo/gcc_linux_arm.c +++ b/src/runtime/cgo/gcc_linux_arm.c @@ -10,7 +10,7 @@ static void *threadentry(void*); -void (*x_cgo_inittls)(void **tlsg, void **tlsbase); +void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common)); static void (*setg_gcc)(void*); void diff --git a/src/runtime/cgo/gcc_linux_arm64.c b/src/runtime/cgo/gcc_linux_arm64.c index 261c884ac9..17ff274fbb 100644 --- a/src/runtime/cgo/gcc_linux_arm64.c +++ b/src/runtime/cgo/gcc_linux_arm64.c @@ -12,7 +12,7 @@ static void *threadentry(void*); -void (*x_cgo_inittls)(void **tlsg, void **tlsbase); +void (*x_cgo_inittls)(void **tlsg, void **tlsbase) __attribute__((common)); static void (*setg_gcc)(void*); void -- GitLab From 4fd94558820100129b98f284e21b19fc27a99926 Mon Sep 17 00:00:00 2001 From: xinlingchao Date: Mon, 28 Dec 2020 14:14:41 +0800 Subject: [PATCH 1578/1792] io/fs: fix typo in comment Change-Id: Idf8e5d808c0996e0ca00979e7b8d7627f29cd10f Reviewed-on: https://go-review.googlesource.com/c/go/+/280552 Reviewed-by: Alberto Donizetti Reviewed-by: Ian Lance Taylor Trust: Alberto Donizetti --- src/io/fs/walk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/fs/walk.go b/src/io/fs/walk.go index 06d0b1769c..c33ff10729 100644 --- a/src/io/fs/walk.go +++ b/src/io/fs/walk.go @@ -15,7 +15,7 @@ import ( var SkipDir = errors.New("skip this directory") // WalkDirFunc is the type of the function called by WalkDir to visit -// each each file or directory. +// each file or directory. // // The path argument contains the argument to Walk as a prefix. // That is, if Walk is called with root argument "dir" and finds a file -- GitLab From f83e0f6616b58e7c77684c1f1dc6575439fdf79b Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 28 Dec 2020 14:33:14 -0500 Subject: [PATCH 1579/1792] misc/ios: add to README how to build ios executables Updates #43371, #43343. Change-Id: I19386269245f2c20345c6cac7560089b8223e9f9 Reviewed-on: https://go-review.googlesource.com/c/go/+/280153 Trust: Cherry Zhang Reviewed-by: Ian Lance Taylor --- misc/ios/README | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/misc/ios/README b/misc/ios/README index 433bcdfd8f..5e71862728 100644 --- a/misc/ios/README +++ b/misc/ios/README @@ -7,6 +7,13 @@ set to the clang wrapper that invokes clang for iOS. For example, this command r GOOS=ios GOARCH=amd64 CGO_ENABLED=1 CC_FOR_TARGET=$(pwd)/../misc/ios/clangwrap.sh ./all.bash +If CC_FOR_TARGET is not set when the toolchain is built (make.bash or all.bash), CC +can be set at commond line. For example, + + GOOS=ios GOARCH=amd64 CGO_ENABLED=1 CC=$(go env GOROOT)/misc/ios/clangwrap.sh go build + +Setting CC is not necessary if the toolchain is built with CC_FOR_TARGET set. + To use the go tool to run individual programs and tests, put $GOROOT/bin into PATH to ensure the go_ios_$GOARCH_exec wrapper is found. For example, to run the archive/tar tests: -- GitLab From b4a71c95d2388cbbab70bd751b9706f848643dd6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 28 Dec 2020 14:36:45 -0500 Subject: [PATCH 1580/1792] doc/go1.16: reference misc/ios/README for how to build iOS programs Updates #43371, #43343. Change-Id: Ib89b809a5220717507272453ea86224d1928dd36 Reviewed-on: https://go-review.googlesource.com/c/go/+/280154 Trust: Cherry Zhang Reviewed-by: Ian Lance Taylor --- doc/go1.16.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 1694b2277d..0c2921fe6b 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -55,7 +55,9 @@ Do not send CLs removing the interior tags from such phrases. Go 1.16 adds an ios/amd64 port, which targets the iOS simulator running on AMD64-based macOS. Previously this was unofficially supported through darwin/amd64 with - the ios build tag set. + the ios build tag set. See also + misc/ios/README for + details about how to build programs for iOS and iOS simulator.

-- GitLab From 780b4de16b5ba03f2f2ebee35281217552578d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Tue, 29 Dec 2020 21:37:06 +0000 Subject: [PATCH 1581/1792] misc/ios: fix wording for command line instructions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A typo was made, which I noticed while looking through the recent master commits. Change-Id: Ieed5d6664a1f3ff5892d59abf194963b44ef0e55 Reviewed-on: https://go-review.googlesource.com/c/go/+/280454 Trust: Daniel Martí Reviewed-by: Cherry Zhang --- misc/ios/README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/ios/README b/misc/ios/README index 5e71862728..0f5e9e335e 100644 --- a/misc/ios/README +++ b/misc/ios/README @@ -8,7 +8,7 @@ set to the clang wrapper that invokes clang for iOS. For example, this command r GOOS=ios GOARCH=amd64 CGO_ENABLED=1 CC_FOR_TARGET=$(pwd)/../misc/ios/clangwrap.sh ./all.bash If CC_FOR_TARGET is not set when the toolchain is built (make.bash or all.bash), CC -can be set at commond line. For example, +can be set on the command line. For example, GOOS=ios GOARCH=amd64 CGO_ENABLED=1 CC=$(go env GOROOT)/misc/ios/clangwrap.sh go build -- GitLab From 0ae2e032f2d42575cb64d0759a6d31a71f39412f Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 30 Dec 2020 15:49:06 -0500 Subject: [PATCH 1582/1792] misc/cgo/test: enable TestCrossPackageTests on darwin/arm64 Somehow I missed that one. It works fine. Change-Id: I0b1286bf1e6a8f40b9f3f114f49b3034079e0b85 Reviewed-on: https://go-review.googlesource.com/c/go/+/280156 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- misc/cgo/test/pkg_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/cgo/test/pkg_test.go b/misc/cgo/test/pkg_test.go index a28ad4ea74..94abaa03e8 100644 --- a/misc/cgo/test/pkg_test.go +++ b/misc/cgo/test/pkg_test.go @@ -30,7 +30,7 @@ func TestCrossPackageTests(t *testing.T) { switch runtime.GOOS { case "android": t.Skip("Can't exec cmd/go subprocess on Android.") - case "darwin", "ios": + case "ios": switch runtime.GOARCH { case "arm64": t.Skip("Can't exec cmd/go subprocess on iOS.") -- GitLab From ed301733bb228653f98ee9381e90bccf7a3e3bb6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 30 Dec 2020 16:41:58 -0500 Subject: [PATCH 1583/1792] misc/cgo/testcarchive: remove special flags for Darwin/ARM The original Darwin/ARM port is gone. For ARM64, it works fine without the flags on macOS/ARM64. Remove the flags. Change-Id: I9cc00c49dd71376dd9c52abb78c2d8cec656b3db Reviewed-on: https://go-review.googlesource.com/c/go/+/280157 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- misc/cgo/testcarchive/carchive_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go index 6ed25d8948..6a5adf79ca 100644 --- a/misc/cgo/testcarchive/carchive_test.go +++ b/misc/cgo/testcarchive/carchive_test.go @@ -118,11 +118,6 @@ func testMain(m *testing.M) int { cc = append(cc, s[start:]) } - if GOOS == "darwin" || GOOS == "ios" { - // For Darwin/ARM. - // TODO: do we still need this? - cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...) - } if GOOS == "aix" { // -Wl,-bnoobjreorder is mandatory to keep the same layout // in .text section. -- GitLab From 20d0991b86f533a734cad96b2002678d9750e6d8 Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Wed, 30 Dec 2020 17:18:55 +0100 Subject: [PATCH 1584/1792] lib/time, time/tzdata: update tzdata to 2020f Changelog 'make rearguard_tarballs' no longer generates a bad rearguard.zi, fixing a 2020e bug. No actual changes to timezones data. See http://mm.icann.org/pipermail/tz-announce/2020-December/000064.html Updates #22487 Change-Id: I78f7adba1c3c1d3489b0da870601117b9b8cb0d3 Reviewed-on: https://go-review.googlesource.com/c/go/+/280455 Trust: Alberto Donizetti Reviewed-by: Ian Lance Taylor Reviewed-by: Tobias Klauser --- lib/time/update.bash | 4 +- lib/time/zoneinfo.zip | Bin 424205 -> 424205 bytes src/time/tzdata/zipdata.go | 3878 ++++++++++++++++++------------------ 3 files changed, 1941 insertions(+), 1941 deletions(-) diff --git a/lib/time/update.bash b/lib/time/update.bash index ca848994fe..c5f934e2db 100755 --- a/lib/time/update.bash +++ b/lib/time/update.bash @@ -8,8 +8,8 @@ # Consult https://www.iana.org/time-zones for the latest versions. # Versions to use. -CODE=2020e -DATA=2020e +CODE=2020f +DATA=2020f set -e rm -rf work diff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip index eb5f082bf1189505680d568ac80d1717b5a6eaf1..fd845c09a41f48a513e5a0eb469fb43e13fc6a79 100644 GIT binary patch delta 29331 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 diff --git a/src/time/tzdata/zipdata.go b/src/time/tzdata/zipdata.go index 71b466d736..34477a283b 100644 --- a/src/time/tzdata/zipdata.go +++ b/src/time/tzdata/zipdata.go @@ -16,35 +16,35 @@ package tzdata -const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Africa/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/FreetownUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + +const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Africa/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/FreetownUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x92" + - "H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x1c\x00Af" + - "rica/KinshasaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x1c\x00Af" + + "rica/KinshasaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4" + - "\x00\x00\x00\xb4\x00\x00\x00\f\x00\x1c\x00Africa/LagosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4" + + "\x00\x00\x00\xb4\x00\x00\x00\f\x00\x1c\x00Africa/LagosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x1c\x00Africa/JohannesburgUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x00T\x8a\x9eQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x1c\x00Africa/JohannesburgUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x10\x00\x1c\x00Africa/Bujum" + - "buraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x04LMT\x00SAST\x00\nSAST-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x10\x00\x1c\x00Africa/Bujum" + + "buraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0" + - "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/KigaliUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0" + + "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/KigaliUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\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\nC" + - "AT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00Africa/ConakryUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "AT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00Africa/ConakryUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x1c\x00Afr" + - "ica/El_AaiunUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x1c\x00Afr" + + "ica/El_AaiunUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -75,8 +75,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04" + "\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\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\n\x00\x00\x00\x00\x00\xb8K\x97QV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x1c\x00Africa/KhartoumUT\t\x00\x03" + - "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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<+01>-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x1c\x00Africa/KhartoumUT\t\x00\x03" + + "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -84,7 +84,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "+\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\x00CAST\x00CAT\x00EAT\x00\nCAT-2" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x1c\x00Africa/CeutaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x1c\x00Africa/CeutaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd6" + "up\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" + @@ -94,8 +94,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "C\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\x00" + - "CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f" + - "\x00\x1c\x00Africa/TunisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f" + + "\x00\x1c\x00Africa/TunisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ϒ" + @@ -103,12 +103,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x1c\x00Africa/Brazzaville" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00CET\x00\nCET-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x1c\x00Africa/Brazzaville" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qd\x01\x05\x89\u007f\a\x00\x00\u007f\a\x00\x00\x11\x00\x1c\x00Af" + - "rica/CasablancaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x10\x00\x0eLMT\x00GMT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQd\x01\x05\x89\u007f\a\x00\x00\u007f\a\x00\x00\x11\x00\x1c\x00Af" + + "rica/CasablancaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\fa" + @@ -140,24 +140,24 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" + "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04" + "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\fT\xce" + - "\xbe\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x1c\x00Africa/MbabaneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\fT\xce" + + "\xbe\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x1c\x00Africa/MbabaneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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͞o" + "p\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\nSAS" + - "T-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q6\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x1c\x00Africa/MonroviaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "T-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ6\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x1c\x00Africa/MonroviaUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/NiameyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/NiameyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x8c" + "P`\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x1c\x00Africa/DakarUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x1c\x00Africa/DakarUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00" + - "\x1c\x00Africa/TripoliUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00" + + "\x1c\x00Africa/TripoliUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -165,15 +165,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x003" + "D6p\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\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x1c\x00Africa/NdjamenaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x1c\x00Africa/NdjamenaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/DoualaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\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\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/DoualaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x1c\x00Africa/AlgiersUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x1c\x00Africa/AlgiersUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -182,23 +182,23 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\x13f" + "B\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\x00WET\x00CEST\x00CET\x00\nCET-1" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x1c\x00Africa/DjiboutiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x1c\x00Africa/DjiboutiUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x0eLM" + - "T\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x1c\x00Afric" + - "a/Sao_TomeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x1c\x00Afric" + + "a/Sao_TomeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c" + - "\x00Africa/AbidjanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x0e\x10\x00\bLMT\x00GMT\x00WAT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c" + + "\x00Africa/AbidjanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/MaputoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/MaputoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x04" + - "LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x1c\x00Africa/CairoUT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x1c\x00Africa/CairoUT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u007f\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" + @@ -219,27 +219,27 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\tLMT\x00EEST\x00EET\x00\nEET-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82" + - "\x00\x00\x00\x82\x00\x00\x00\v\x00\x1c\x00Africa/LomeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82" + + "\x00\x00\x00\x82\x00\x00\x00\v\x00\x1c\x00Africa/LomeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BamakoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BamakoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x1c\x00Africa/As" + - "maraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x1c\x00Africa/As" + + "maraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3" + - "c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/LibrevilleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3" + + "c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/LibrevilleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/BlantyreUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/BlantyreUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x1c\x00Africa/W" + - "indhoekUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x1c\x00Africa/W" + + "indhoekUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x003F\xe7\x80\x00\x00\x00\x004\x11\xfc\x90\x00\x00\x00\x005&" + @@ -250,74 +250,74 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x13LMT\x00+0130\x00SAST\x00WA" + - "T\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/HarareUT\t\x00" + - "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\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\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/HarareUT\t\x00" + + "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00" + - "\x00\r\x00\x1c\x00Africa/AsmeraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00" + + "\x00\r\x00\x1c\x00Africa/AsmeraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x1c\x00Africa/LubumbashiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x1c\x00Africa/LubumbashiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/" + - "Porto-NovoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/" + + "Porto-NovoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/TimbuktuUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00" + + "\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/TimbuktuUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa/KampalaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa/KampalaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa" + - "/NairobiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa" + + "/NairobiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Africa/MaseruUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Africa/MaseruUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00Africa/OuagadougouUT\t\x00" + - "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\nSAST-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00Africa/OuagadougouUT\t\x00" + + "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00" + - "\r\x00\x1c\x00Africa/LusakaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xff\xff\xff\x92\xe6\x92H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00" + + "\r\x00\x1c\x00Africa/LusakaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x1c\x00Africa/MogadishuUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x1c\x00Africa/MogadishuUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\xda" + "X\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+0" + - "230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/Ga" + - "boroneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/Ga" + + "boroneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1" + - "\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BanjulUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1" + + "\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BanjulUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/MalaboUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/MalaboUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x12\x00\x1c\x00Africa/Addis_" + - "AbabaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x12\x00\x1c\x00Africa/Addis_" + + "AbabaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b" + - "{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x1c\x00Africa/NouakchottUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\x00#(\x00\x04\x00\x00*0\x00\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b" + + "{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x1c\x00Africa/NouakchottUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\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\x00G" + - "MT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/LuandaUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "MT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/LuandaUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00G" + - "MT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x1c\x00Africa/Jub" + - "aUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "MT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x1c\x00Africa/Jub" + + "aUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -325,7 +325,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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 \x02\x01\x02\x01\x02\x01\x02\x01\x02\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\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\nEAT-3\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x1c\x00Africa/AccraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x1c\x00Africa/AccraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xff\x9a\x1d\x944\xff\xff\xff\xff\xa1\xc0\xb4\x80\xff" + "\xff\xff\xff\xa1\xf2\xe4\xf0\xff\xff\xff\xff\xa34\x97\xa0\xff\xff\xff\xff\xa3\xd5i\xf0\xff\xff\xff\xff\xa5\x15\xcb \xff\xff\xff\xff\xa5\xb6\x9dp\xff\xff\xff\xff\xa6\xf6\xfe\xa0\xff\xff\xff\xff\xa7\x97\xd0\xf0\xff\xff\xff\xff\xa8" + @@ -337,22 +337,22 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\xff\xff\xffˇ<\x80\xff\xff\xff\xff\xd2\xe1\xd3x\xff\xff\xff\xffۡ\xdb \xff\xff\xff\xff\xdcB\xab\x18\xff\xff\xff\xff݃\x0e\xa0\xff\xff\xff\xff\xde#ޘ\xff\xff\xff\xff\xdfe\x93\xa0\xff\xff\xff\xff\xe0" + "\x06c\x98\xff\xff\xff\xff\xe1F\xc7 \xff\xff\xff\xff\xe1\xe7\x97\x18\xff\xff\xff\xff\xe3'\xfa\xa0\xff\xff\xff\xff\xe3\xc8ʘ\xff\xff\xff\xff\xe5\t. \xff\xff\xff\xff\xe5\xa9\xfe\x18\x02\x01\x02\x01\x02\x01\x02\x01\x02" + "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\xff\xff\xff\xcc\x00\x00\x00\x00" + - "\x04\xb0\x01\x04\x00\x00\x00\x00\x00\n\x00\x00\a\b\x00\x0e\x00\x00\a\b\x01\x0eLMT\x00+0020\x00GMT\x00+0030\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x14\x00\x1c\x00Africa/Dar_es_SalaamUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x04\xb0\x01\x04\x00\x00\x00\x00\x00\n\x00\x00\a\b\x00\x0e\x00\x00\a\b\x01\x0eLMT\x00+0020\x00GMT\x00+0030\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x14\x00\x1c\x00Africa/Dar_es_SalaamUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + - "EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x1c\x00Africa/Bissau" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x1c\x00Africa/Bissau" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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朐\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/BanguiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/BanguiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00America/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x1c\x00America/Grand_Tu" + - "rkUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00America/UT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x1c\x00America/Grand_Tu" + + "rkUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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" + @@ -366,20 +366,20 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "p\x00\x00\x00\x00N\xb6\"`\x00\x00\x00\x00O\\Mp\x00\x00\x00\x00P\x96\x04`\x00\x00\x00\x00QP\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xc8\x1b\x00\x00\xff\xff" + - "\xc8\x1b\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\fLMT\x00BMT\x00ADT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8f\x19Ԇ\x12\x02\x00\x00" + - "\x12\x02\x00\x00\x16\x00\x1c\x00America/Bahia_BanderasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\xc8\x1b\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\fLMT\x00BMT\x00ADT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8f\x19Ԇ\x12\x02\x00\x00" + + "\x12\x02\x00\x00\x16\x00\x1c\x00America/Bahia_BanderasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\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" + @@ -388,8 +388,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x90\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\x01\x02\x01\x02\x01\x02\x01\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\x05\x02\xff\xff\x9dT\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10\xff\xff\xb9\xb0\x01\x14" + - "LMT\x00MST\x00CST\x00PST\x00MDT\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x1c\x00America/NuukUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "LMT\x00MST\x00CST\x00PST\x00MDT\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x1c\x00America/NuukUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + "if3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\"\x00\x00\x00\x03\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" + @@ -397,13 +397,13 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00#3<-02>,M3.5.0/-2,M10.5.0/-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb1݂" + - "x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x1c\x00America/Costa_RicaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\x00-03\x00-02\x00\n<-03>3<-02>,M3.5.0/-2,M10.5.0/-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb1݂" + + "x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x1c\x00America/Costa_RicaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Qa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c\x00America/ManausUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x00T\x8a\x9eQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c\x00America/ManausUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\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\u007fD\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfd" + "N\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" + @@ -411,7 +411,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ ":@\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\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x1c\x00America/WhitehorseUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x1c\x00America/WhitehorseUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -429,15 +429,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00YDD" + - "T\x00PST\x00PDT\x00MST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/Ca" + - "yenneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00PST\x00PDT\x00MST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/Ca" + + "yenneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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<-0" + - "3>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/MarigotUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "3>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/MarigotUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac" + - "\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x1c\x00Ame" + - "rica/Rankin_InletUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x1c\x00Ame" + + "rica/Rankin_InletUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\x8cn\x00\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(w\xe0\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" + @@ -449,8 +449,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "E\xf3\xb7\x00\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\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\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CD" + - "T,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14\x00\x1c\x00America/Punta" + - "_ArenasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14\x00\x1c\x00America/Punta" + + "_ArenasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\a\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xfc\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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" + @@ -470,12 +470,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\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\xba\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-03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xca" + - "g\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/GrenadaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZi" + + "\xc7\xc0\x01\f\xff\xff\xd5\xd0\x01\x10\xff\xff\xd5\xd0\x00\x10LMT\x00SMT\x00-05\x00-04\x00-03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xca" + + "g\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/GrenadaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST" + - "\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x1c\x00America/MenomineeUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x1c\x00America/MenomineeUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -490,12 +490,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\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\x00C" + - "ST\x00CWT\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x15\xc8\xcb\x00\xac\x00\x00" + - "\x00\xac\x00\x00\x00\x0e\x00\x1c\x00America/GuyanaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "ST\x00CWT\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x15\xc8\xcb\x00\xac\x00\x00" + + "\x00\xac\x00\x00\x00\x0e\x00\x1c\x00America/GuyanaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x98\xd9y\x88\x00\x00\x00\x00\n}\xb4<\x00\x00\x00\x00'\u007f\xfb0\x01\x02\x03\xff\xff\xc9x\x00\x00\xff" + - "\xff\xcbD\x00\x04\xff\xff\xd5\xd0\x00\n\xff\xff\xc7\xc0\x00\x0eLMT\x00-0345\x00-03\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xbf\xf5" + - "\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x1c\x00America/Buenos_AiresUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\xff\xcbD\x00\x04\xff\xff\xd5\xd0\x00\n\xff\xff\xc7\xc0\x00\x0eLMT\x00-0345\x00-03\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xbf\xf5" + + "\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x1c\x00America/Buenos_AiresUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\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" + @@ -507,12 +507,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "7\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/Port_of_SpainUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\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\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/Port_of_SpainUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff" + - "\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x1c\x00America/Monc" + - "tonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x1c\x00America/Monc" + + "tonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -537,8 +537,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02" + "\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\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,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q錴$q\x03\x00\x00q\x03\x00\x00\x13\x00\x1c\x00Americ" + - "a/Thunder_BayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ錴$q\x03\x00\x00q\x03\x00\x00\x13\x00\x1c\x00Americ" + + "a/Thunder_BayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x82,\xff\xff\xff\xff\x8f${\xe0\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\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\b \xc1p\x00\x00\x00\x00\t\x10\xa4`" + @@ -553,24 +553,24 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\xff\xff" + "\xacT\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\nE" + - "ST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x1c\x00America/" + - "Blanc-SablonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x1c\x00America/" + + "Blanc-SablonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xff^=9\f\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\x02\x01\x02\x03\x04\x02\xff\xff\xcat\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\n" + - "AST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x10\x00\x1c\x00America/MazatlanUT\t\x00\x03\xfc\xff\xe2_" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "AST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x10\x00\x1c\x00America/MazatlanUT\t\x00\x03`\xa8\xec_" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04" + "\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00PST\x00MD" + - "T\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x1c\x00Amer" + - "ica/CaymanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x1c\x00Amer" + + "ica/CaymanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x1c\x00America/DawsonUT\t\x00\x03\xfc\xff\xe2_" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x1c\x00America/DawsonUT\t\x00\x03`\xa8\xec_" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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)" + @@ -587,11 +587,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Am" + - "erica/TortolaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00YPT\x00YDDT\x00PST\x00PDT\x00MST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Am" + + "erica/TortolaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00\xb8K\x97QU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x1c\x00America/ThuleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00T\x8a\x9eQU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x1c\x00America/ThuleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\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" + @@ -599,8 +599,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00ED5" + "P\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf7\xe9 y\xbd\x02\x00\x00\xbd" + - "\x02\x00\x00\x0e\x00\x1c\x00America/InuvikUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\bLMT\x00ADT\x00AST\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf7\xe9 y\xbd\x02\x00\x00\xbd" + + "\x02\x00\x00\x0e\x00\x1c\x00America/InuvikUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0\x06N\x80\xff\xff\xff\xff\xf7/h\x80\xff\xff\xff\xff\xf8(\x94\x00\x00\x00\x00\x00\x11\x89\x90 \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" + @@ -612,10 +612,10 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "=\xbb\x9d\x00\x00\x00\x00\x00>\x8f\xec\x90\x00\x00\x00\x00?\x9b\u007f\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\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\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\x8f\x80\x00\t\xff\xff\x9d\x90\x00\r\xff\xff\xab\xa0\x01\x11-00\x00PDDT\x00PST\x00MS" + - "T\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x1c\x00" + - "America/North_Dakota/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + - "K\x97QR\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x1c\x00America/North_Dakota/New_SalemUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "T\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x1c\x00" + + "America/North_Dakota/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQR\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x1c\x00America/North_Dakota/New_SalemUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -631,8 +631,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "A\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\x00M" + - "DT\x00MST\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97" + - "QH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x1c\x00America/North_Dakota/CenterUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "DT\x00MST\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "QH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x1c\x00America/North_Dakota/CenterUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -649,8 +649,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x00MDT\x00MS" + - "T\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7.\xb6*" + - "\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x1c\x00America/North_Dakota/BeulahUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "T\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7.\xb6*" + + "\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x1c\x00America/North_Dakota/BeulahUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\xe8" + @@ -668,8 +668,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x00MP" + - "T\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b\vKdC\x03\x00\x00C\x03\x00\x00\x13\x00\x1c\x00" + - "America/Rainy_RiverUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b\vKdC\x03\x00\x00C\x03\x00\x00\x13\x00\x1c\x00" + + "America/Rainy_RiverUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x87(\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ" + "\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\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" + @@ -683,13 +683,13 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\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\xff\xff\xa7X\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\x10LM" + - "T\x00CDT\x00CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x14\xc1r8" + - "\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x1c\x00America/AtikokanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "T\x00CDT\x00CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x14\xc1r8" + + "\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x1c\x00America/AtikokanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8" + "\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff\xaa\x1c\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\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf8Dz\x97\xae\x01" + - "\x00\x00\xae\x01\x00\x00\x11\x00\x1c\x00America/Boa_VistaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\xb9\xb0\x01\x10\xff\xff\xb9\xb0\x00\x14LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf8Dz\x97\xae\x01" + + "\x00\x00\xae\x01\x00\x00\x11\x00\x1c\x00America/Boa_VistaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\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\u007f\xe0\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1" + "B@\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" + @@ -697,12 +697,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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-04\x00\n<-" + - "04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x1c\x00America/MartiniqueUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x1c\x00America/MartiniqueUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xff" + "i\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\x00" + - "FFMT\x00AST\x00ADT\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/Ada" + - "kUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "FFMT\x00AST\x00ADT\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/Ada" + + "kUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -718,8 +718,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\xff" + "s`\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\x00" + - "BDT\x00AHST\x00HDT\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QU9#\xbe2\x05\x00\x00" + - "2\x05\x00\x00\x11\x00\x1c\x00America/VancouverUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "BDT\x00AHST\x00HDT\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQU9#\xbe2\x05\x00\x00" + + "2\x05\x00\x00\x11\x00\x1c\x00America/VancouverUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -742,16 +742,16 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Porto_AcreUT\t\x00\x03\xfc\xff\xe2_" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + ".0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Porto_AcreUT\t\x00\x03`\xa8\xec_" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00\x00\x00R\u007f" + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x1c\x00America/New_Y" + - "orkUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x1c\x00America/New_Y" + + "orkUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -780,8 +780,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00E" + - "ST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00" + - "\x00\x0e\x00\x1c\x00America/RecifeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00" + + "\x00\x0e\x00\x1c\x00America/RecifeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xde" + "t \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" + @@ -790,7 +790,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\xe9\x0f\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x003\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Qd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x1c\x00America/AsuncionUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x00T\x8a\x9eQd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x1c\x00America/AsuncionUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + @@ -805,8 +805,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "O\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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x1c\x00America/Port-au-PrinceUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\fLMT\x00AMT\x00-04\x00-03\x00\n<-04>4<-03>,M10.1.0/0,M3.4.0/0\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x1c\x00America/Port-au-PrinceUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04" + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + @@ -816,8 +816,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00Q3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x1c\x00America/BoiseUT\t\x00\x03\xfc\xff\xe2_" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x1c\x00America/BoiseUT\t\x00\x03`\xa8\xec_" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -844,7 +844,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97QJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x1c\x00America/PangnirtungUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x1c\x00America/PangnirtungUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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)\xff\xff\xff\xff\xa3\xd5R\x80\xff\xff" + "\xff\xffˈ\xe2`\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xf7/0@\xff\xff\xff\xff\xf8([\xc0\x00\x00\x00\x00\x13i9\xe0\x00\x00\x00\x00\x14Y\x1c\xd0\x00\x00\x00\x00\x15I" + @@ -858,8 +858,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x02\x03\x04\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\x06\a\x06\a\x06\a\x06\a\x06\b\t\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\x00" + "\x00\x00\x00\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x01\x15\xff\xff\xc7\xc0\x01\x19\xff\xff\xb9\xb0\x00\x1d\xff\xff\xab\xa0\x00!\xff\xff\xb9\xb0\x01%-" + "00\x00AWT\x00APT\x00AST\x00ADDT\x00ADT\x00EDT\x00EST\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11." + - "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x1c\x00America/GodthabUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x00\x00\x00\x01\x00\x00\x00" + + "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x1c\x00America/GodthabUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\"\x00\x00\x00\x03\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" + @@ -867,7 +867,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\xff\xff" + "π\x00\x00\xff\xff\xd5\xd0\x00\x04\xff\xff\xe3\xe0\x01\bLMT\x00-03\x00-02\x00\n<-03>3<-02>,M3.5.0/-2,M10.5.0/-" + - "1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x1c\x00America/NassauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x1c\x00America/NassauUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x937B\x8a\xff\xff\xff" + "\xff\xcb\xf4\xefP\xff\xff\xff\xff\xd0\xfaG\xc0\xff\xff\xff\xff\xd1#4P\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2x\x9a\xc0\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Z" + @@ -885,7 +885,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00EDC`\x00\x00\x00\x00E\xf3\xa8\xf0\x02\x01\x02\x01\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\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\xff\xff\xb7v\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\x00EWT\x00EST\x00EPT\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/RosarioUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/RosarioUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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@" + @@ -898,24 +898,24 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/St_BarthelemyUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/St_BarthelemyUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x93" + - "73\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x1c\x00" + - "America/PhoenixUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "73\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x1c\x00" + + "America/PhoenixUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x04,2" + - "h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x1c\x00America/SantaremUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZi" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x04,2" + + "h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x1c\x00America/SantaremUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x1c\x00America/MetlakatlaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x1c\x00America/MetlakatlaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\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" + @@ -926,7 +926,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x00PST\x00PWT\x00PPT\x00PDT\x00AKST\x00AKDT\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x1c\x00America/AraguainaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x1c\x00America/AraguainaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -937,7 +937,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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<-0" + - "3>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x1c\x00America/DenverUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "3>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x1c\x00America/DenverUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -955,8 +955,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x00MD" + - "T\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00" + - "\xc4\x02\x00\x00\x0f\x00\x1c\x00America/CordobaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "T\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00" + + "\xc4\x02\x00\x00\x0f\x00\x1c\x00America/CordobaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -968,8 +968,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q?\xc9\x1c\xd4\xc6\x03\x00" + - "\x00\xc6\x03\x00\x00\x0e\x00\x1c\x00America/JuneauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ?\xc9\x1c\xd4\xc6\x03\x00" + + "\x00\xc6\x03\x00\x00\x0e\x00\x1c\x00America/JuneauUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -986,7 +986,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/OjinagaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/OjinagaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -995,8 +995,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x01\x02\x01\x02\x01\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" + "\xff\xff\x9e\x1c\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M" + - "3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x1c\x00America/Scoresby" + - "sundUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x1c\x00America/Scoresby" + + "sundUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1004,8 +1004,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x1c" + - "\x00America/JujuyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "<-01>1<+00>,M3.5.0/0,M10.5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x1c" + + "\x00America/JujuyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1017,8 +1017,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00America/EnsenadaUT" + - "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00America/EnsenadaUT" + + "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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" + @@ -1035,8 +1035,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ " \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\x00P" + - "WT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x1c" + - "\x00America/TorontoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "WT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x1c" + + "\x00America/TorontoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -1065,8 +1065,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nES" + - "T5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qn\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x1c\x00America/N" + - "omeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQn\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x1c\x00America/N" + + "omeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xb8" + "qP\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" + @@ -1082,8 +1082,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00BS" + - "T\x00BDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x1c\x00America/Cambridge_BayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "T\x00BDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x1c\x00America/Cambridge_BayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\t\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\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00\x00\x00\x169)\x00" + @@ -1097,15 +1097,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x04\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\a\x06\b\a\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\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\xb9\xb0\x01\x10\xff\xff\xab\xa0\x01\x15\xff\xff\xb9\xb0\x01\x19\xff\xff\xab\xa0\x00\x1d\xff\xff\xb9\xb0\x00!-00\x00MWT\x00" + "MPT\x00MST\x00MDDT\x00MDT\x00CDT\x00CST\x00EST\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x1c\x00America/CrestonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x00\x00T\x8a\x9eQ⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x1c\x00America/CrestonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff^=p\xbc\xff\xff\xff\xff\x9b\xd6Kp\xff\xff\xff" + - "\xff\x9e\xf9;\x00\x01\x02\x01\xff\xff\x92\xc4\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00\bLMT\x00MST\x00PST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qq\xc9" + - "*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x1c\x00America/Puerto_RicoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\xff\x9e\xf9;\x00\x01\x02\x01\xff\xff\x92\xc4\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00\bLMT\x00MST\x00PST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQq\xc9" + + "*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x1c\x00America/Puerto_RicoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x1c\x00America/CatamarcaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x1c\x00America/CatamarcaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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@" + @@ -1118,14 +1118,14 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\u007f \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\xc2" + "T\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x1c\x00America/Coral_HarbourUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x1c\x00America/Coral_HarbourUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr" + "\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff" + "\xaa\x1c\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\nE" + - "ST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x1c\x00America/Argentina/UT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Ar" + - "gentina/SaltaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x1c\x00America/Argentina/UT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Ar" + + "gentina/SaltaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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@" + @@ -1137,8 +1137,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/B" + - "uenos_AiresUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/B" + + "uenos_AiresUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd4" + "p0\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" + @@ -1150,8 +1150,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "X\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\u007f \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\fL" + - "MT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00Ame" + - "rica/Argentina/UshuaiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "MT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00Ame" + + "rica/Argentina/UshuaiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1163,8 +1163,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfcz=\xe1\xcd\x02\x00\x00" + - "\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/San_JuanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfcz=\xe1\xcd\x02\x00\x00" + + "\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/San_JuanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1177,8 +1177,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\u007f \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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/La_RiojaUT\t\x00\x03" + - "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/La_RiojaUT\t\x00\x03" + + "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ɰ\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" + @@ -1190,8 +1190,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Ar" + - "gentina/San_LuisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Ar" + + "gentina/San_LuisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1203,8 +1203,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ep\xb4c\xc4" + - "\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/Rio_GallegosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ep\xb4c\xc4" + + "\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/Rio_GallegosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04" + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + @@ -1217,8 +1217,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\u007f \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\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00America/Argentina/CordobaUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00America/Argentina/CordobaUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1230,8 +1230,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97QutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Argentina/Juju" + - "yUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\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<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Argentina/Juju" + + "yUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1243,8 +1243,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\u007f \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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x1c\x00America/Argentina/CatamarcaUT\t\x00" + - "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x1c\x00America/Argentina/CatamarcaUT\t\x00" + + "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1256,8 +1256,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x1c\x00America/Argentina/" + - "ComodRivadaviaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x1c\x00America/Argentina/" + + "ComodRivadaviaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1269,8 +1269,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\xf1" + "0\x00\x00\x00\x00@\xd5\v\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97QŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00" + - "America/Argentina/MendozaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\fLMT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00" + + "America/Argentina/MendozaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1282,8 +1282,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "8\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97QY\xd8֭\xd6" + - "\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x1c\x00America/Argentina/TucumanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQY\xd8֭\xd6" + + "\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x1c\x00America/Argentina/TucumanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1296,8 +1296,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\u007f \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-0" + - "2\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x89غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x1c\x00America/BelizeUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "2\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x89غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x1c\x00America/BelizeUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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" + @@ -1314,8 +1314,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\xab7" + "P\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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-0530\x00CST\x00CWT\x00CPT\x00CDT\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x1c\x00America/SitkaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\xb0\x01\x0e\xff\xff\xb9\xb0\x01\x12\xff\xff\xb9\xb0\x01\x16LMT\x00-0530\x00CST\x00CWT\x00CPT\x00CDT\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x1c\x00America/SitkaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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(" + @@ -1332,7 +1332,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00PS" + "T\x00PWT\x00PPT\x00PDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00" + - "\x00\x00\x00\x00\xb8K\x97QU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00\x1c\x00America/YellowknifeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x00\x00\x00\x00T\x8a\x9eQU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00\x1c\x00America/YellowknifeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x19\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\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0\x00\x00\x00\x00\x13id\x10\x00\x00\x00\x00\x14YG\x00\x00\x00\x00\x00\x15IF\x10\x00\x00" + @@ -1345,17 +1345,17 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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" + "\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\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\xb9\xb0\x01\x10\xff\xff\xab\xa0\x01\x15-00\x00MWT\x00MPT\x00MST\x00MDDT\x00MDT\x00\nMST" + - "7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x1c\x00America/In" + - "diana/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q \x17\x89}q\x01\x00\x00q\x01\x00\x00" + - "\x15\x00\x1c\x00America/Indiana/VevayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x1c\x00America/In" + + "diana/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x17\x89}q\x01\x00\x00q\x01\x00\x00" + + "\x15\x00\x1c\x00America/Indiana/VevayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xd2a\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x1c\x00America/Indiana/VincennesUT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x1c\x00America/Indiana/VincennesUT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe4g=\xe0" + @@ -1364,8 +1364,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "D/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\x00CDT\x00C" + - "ST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QM/U" + - "\x9f7\x02\x00\x007\x02\x00\x00\x17\x00\x1c\x00America/Indiana/MarengoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "ST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQM/U" + + "\x9f7\x02\x00\x007\x02\x00\x00\x17\x00\x1c\x00America/Indiana/MarengoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1375,8 +1375,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "P\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\x00E" + - "ST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x1c" + - "\x00America/Indiana/WinamacUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "ST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x1c" + + "\x00America/Indiana/WinamacUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1387,8 +1387,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\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\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11." + - "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x1c\x00America/Indiana/KnoxUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x1c\x00America/Indiana/KnoxUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1405,8 +1405,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\nCST6C" + - "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x1c\x00America/Indi" + - "ana/IndianapolisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x1c\x00America/Indi" + + "ana/IndianapolisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5" + @@ -1415,8 +1415,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "I6p\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\x00C" + - "PT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QصK\xa6\n\x02\x00\x00\n\x02\x00" + - "\x00\x19\x00\x1c\x00America/Indiana/Tell_CityUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "PT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQصK\xa6\n\x02\x00\x00\n\x02\x00" + + "\x00\x19\x00\x1c\x00America/Indiana/Tell_CityUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\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<" + @@ -1425,8 +1425,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "p\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\x00" + - "CWT\x00CPT\x00EST\x00EDT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x01\xd8N\x8c\xab\x02" + - "\x00\x00\xab\x02\x00\x00\x1a\x00\x1c\x00America/Indiana/PetersburgUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "CWT\x00CPT\x00EST\x00EDT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x01\xd8N\x8c\xab\x02" + + "\x00\x00\xab\x02\x00\x00\x1a\x00\x1c\x00America/Indiana/PetersburgUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\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" + @@ -1438,8 +1438,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00E" + - "ST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x1c\x00Ame" + - "rica/FortalezaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x1c\x00Ame" + + "rica/FortalezaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1447,8 +1447,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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!\x81i" + "0\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\x003\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x1c\x00America/AnchorageUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x1c\x00America/AnchorageUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\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" + @@ -1465,8 +1465,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nAKST9AK" + - "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x1c\x00America/Danm" + - "arkshavnUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x1c\x00America/Danm" + + "arkshavnUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1474,7 +1474,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\xe7N0\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\fLMT\x00-03\x00-02\x00GMT\x00\nGM" + - "T0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x1c\x00America/ReginaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "T0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x1c\x00America/ReginaUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -1486,19 +1486,19 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/AntiguaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/AntiguaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0" + - "\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x1c\x00America/Porto_" + - "VelhoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x1c\x00America/Porto_" + + "VelhoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ְ" + "\x02\x01\x02\x01\x02\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x1c\x00America/Campo_GrandeUT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x1c\x00America/Campo_GrandeUT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1514,11 +1514,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "T\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/Domin" + - "icaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00-03\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/Domin" + + "icaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13" + - "\x02\x00\x00\x13\x02\x00\x00\x12\x00\x1c\x00America/Fort_WayneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZi" + + "\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13" + + "\x02\x00\x00\x13\x02\x00\x00\x12\x00\x1c\x00America/Fort_WayneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\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" + @@ -1527,8 +1527,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + - "CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Rio_BrancoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Rio_BrancoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\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" + @@ -1536,20 +1536,20 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "QHP\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`\u007fP\x00\x00\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x1c\x00America/TegucigalpaUT\t\x00\x03\xfc\xff\xe2_" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x1c\x00America/TegucigalpaUT\t\x00\x03`\xa8\xec_" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa4L" + "KD\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13" + - "\x00\x1c\x00America/Mexico_CityUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "<\x00\x00\xff\xff\xb9\xb0\x01\x04\xff\xff\xab\xa0\x00\bLMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13" + + "\x00\x1c\x00America/Mexico_CityUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\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\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ϷV" + "P\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10LM" + - "T\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a" + - "\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x1c\x00America/TijuanaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "T\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a" + + "\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x1c\x00America/TijuanaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\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\xf6\x80\xff\xff\xff\xff\xa9yOp\xff\xff\xff\xff\xaf\xf2|\xf0\xff\xff\xff\xff\xb6f" + "dp\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" + @@ -1567,7 +1567,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x1c\x00America/CancunUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x1c\x00America/CancunUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1577,15 +1577,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00T\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x1c\x00America/Swift_CurrentUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x1c\x00America/Swift_CurrentUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\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\x14LM" + - "T\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x1c\x00Am" + - "erica/CuiabaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x1c\x00Am" + + "erica/CuiabaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xda" + "8\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" + @@ -1601,8 +1601,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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-0" + - "3\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/MendozaU" + - "T\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "3\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/MendozaU" + + "T\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1614,8 +1614,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xb8K\x97Q~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x1c\x00America/St_John" + - "sUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x1c\x00America/St_John" + + "sUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -1646,14 +1646,14 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\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\x00N" + - "DT\x00NST\x00NPT\x00NWT\x00NDDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Qo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x1c\x00America/MeridaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "DT\x00NST\x00NPT\x00NWT\x00NDDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Qo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x1c\x00America/MeridaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\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\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\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\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\nCST6CDT,M4.1.0,M10.5." + - "0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x1c\x00America/ResoluteUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x1c\x00America/ResoluteUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5\xfb\x81\x80\xff" + "\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(w\xe0\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" + @@ -1665,12 +1665,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\x00B" + "O\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9" + - "\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x1c\x00America/ArubaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x1c\x00America/ArubaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff" + - "\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00" + - "America/HalifaxUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00" + + "America/HalifaxUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xdc" + @@ -1698,15 +1698,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00A" + - "ST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QԾ\xe7#\x95\x00\x00\x00\x95\x00\x00" + - "\x00\x0e\x00\x1c\x00America/PanamaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00" + + "\x00\x0e\x00\x1c\x00America/PanamaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bLM" + - "T\x00CMT\x00EST\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/Anguil" + - "laUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\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\x00CMT\x00EST\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/Anguil" + + "laUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9bܩ=\xda\x06" + - "\x00\x00\xda\x06\x00\x00\x0f\x00\x1c\x00America/ChicagoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x02\x00\x00\x00\b\xff\xff\xff\xff\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9bܩ=\xda\x06" + + "\x00\x00\xda\x06\x00\x00\x0f\x00\x1c\x00America/ChicagoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -1736,15 +1736,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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,M" + - "11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x1c\x00America/JamaicaUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x1c\x00America/JamaicaUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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`\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x1c\x00America/IndianapolisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x1c\x00America/IndianapolisUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1753,32 +1753,32 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x1c\x00America/CaracasUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x1c\x00America/CaracasUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xff" + "i\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x1c" + - "\x00America/LimaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xff\xc7\xc0\x00\x0eLMT\x00CMT\x00-0430\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x1c" + + "\x00America/LimaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QB\xa0=:\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x1c\x00Americ" + - "a/HermosilloUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xb9\xb0\x00\bLMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQB\xa0=:\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x1c\x00Americ" + + "a/HermosilloUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ڀ\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\xff\xff\x97\xf8\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10" + - "LMT\x00MST\x00CST\x00PST\x00MDT\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x1c\x00Amer" + - "ica/BelemUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "LMT\x00MST\x00CST\x00PST\x00MDT\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x1c\x00Amer" + + "ica/BelemUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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Ƞ\x02\x01\x02\x01\x02\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\n\x00\x00\x00\x00\x00\xb8K\x97QM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x1c\x00America/Glace_BayUT" + - "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x1c\x00America/Glace_BayUT" + + "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -1793,11 +1793,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "`\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,M1" + - "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/GuadeloupeUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/GuadeloupeUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00" + - "\x1c\x00America/ShiprockUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xff\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00" + + "\x1c\x00America/ShiprockUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -1815,16 +1815,16 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97QU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x1c\x00America/MatamorosUT\t\x00\x03" + - "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x1c\x00America/MatamorosUT\t\x00\x03" + + "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00Cd" + "op\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\xa2@\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6@\rm\xa8\x05" + - "\x00\x00\xa8\x05\x00\x00\x13\x00\x1c\x00America/Fort_NelsonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZi" + + "\xb9\xb0\x01\bLMT\x00CST\x00CDT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6@\rm\xa8\x05" + + "\x00\x00\xa8\x05\x00\x00\x13\x00\x1c\x00America/Fort_NelsonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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 " + @@ -1849,7 +1849,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x02\x01\x02\x01\x02\x01\x02\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\n" + - "MST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QOKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x1c\x00America/BahiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "MST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQOKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x1c\x00America/BahiaUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdc" + @@ -1861,8 +1861,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x00N\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d\xf7\a ,\x06\x00\x00" + - ",\x06\x00\x00\x11\x00\x1c\x00America/Goose_BayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d\xf7\a ,\x06\x00\x00" + + ",\x06\x00\x00\x11\x00\x1c\x00America/Goose_BayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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" + @@ -1889,12 +1889,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00NST\x00NDT\x00NPT\x00NWT\x00ADT\x00AST\x00ADDT\x00\nAST4ADT,M3" + - ".2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x12\x00\x1c\x00America/Kralendij" + - "kUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + ".2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x12\x00\x1c\x00America/Kralendij" + + "kUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x1c\x00America/Santa_IsabelUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x1c\x00America/Santa_IsabelUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6" + "\x80\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" + @@ -1911,8 +1911,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n" + - "PST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02\x00\x00\x0f\x00\x1c\x00America" + - "/IqaluitUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "PST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02\x00\x00\x0f\x00\x1c\x00America" + + "/IqaluitUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xccl\xa1\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xf7/>P\xff\xff\xff\xff\xf8(i\xd0\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" + @@ -1925,7 +1925,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "DC`\x00\x00\x00\x00E\xf3\xa8\xf0\x05\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\x06\a\x02\x04\x02" + "\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xc7\xc0\x01\x11\xff\xff\xc7\xc0\x01\x15\xff\xff\xab\xa0\x00\x19\xff\xff\xb9\xb0\x01\x1d-" + "00\x00EPT\x00EST\x00EDDT\x00EDT\x00EWT\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x1c\x00America/EdmontonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x1c\x00America/EdmontonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -1942,17 +1942,17 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\nMST" + - "7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x1c\x00America/Bo" + - "gotaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x1c\x00America/Bo" + + "gotaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+\xbe]@\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x1c" + - "\x00America/GuatemalaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\b\xff\xff\xb9\xb0\x00\fLMT\x00BMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x1c" + + "\x00America/GuatemalaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xe4" + "P\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\b" + - "LMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x1c\x00America/Detr" + - "oitUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "LMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x1c\x00America/Detr" + + "oitUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -1967,8 +1967,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00\x00A\x84\u007f`\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\x00EP" + - "T\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qp\x1b\xceRC\x03\x00\x00C\x03\x00\x00\x0f\x00\x1c\x00" + - "America/NipigonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\x1b\xceRC\x03\x00\x00C\x03\x00\x00\x0f\x00\x1c\x00" + + "America/NipigonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x81@\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xc8\xf8IP\xff\xff\xff\xffˈ\xf0p\xff\xff" + "\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\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\xd9" + @@ -1982,12 +1982,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00\x00>\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00ED" + "C`\x00\x00\x00\x00E\xf3\xa8\xf0\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\xff\xff\xad@\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x12\x00\x1c\x00America/MontserratUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "T\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00" + + "\x82\x00\x00\x00\x12\x00\x1c\x00America/MontserratUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nA" + - "ST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00\x1c\x00America/MiquelonUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "ST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00\x1c\x00America/MiquelonUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1996,8 +1996,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x1c\x00Am" + - "erica/Sao_PauloUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\n<-03>3<-02>,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x1c\x00Am" + + "erica/Sao_PauloUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0T" + @@ -2013,8 +2013,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\xd4" + - "L\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\n\x00\x00\x00\x00\x00\xb8K\x97Q[Sp\x90\x02\x05\x00\x00\x02\x05\x00" + - "\x00\x10\x00\x1c\x00America/SantiagoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif3\x00\x00\x00\x00\x00\x00" + + "L\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ[Sp\x90\x02\x05\x00\x00\x02\x05\x00" + + "\x00\x10\x00\x1c\x00America/SantiagoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xc6\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff" + "\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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" + @@ -2036,8 +2036,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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\n\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x1c\x00America/Knox_INUT\t\x00" + - "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + ",M4.1.6/24\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x1c\x00America/Knox_INUT\t\x00" + + "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd2" + "a\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" + @@ -2054,23 +2054,23 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\nCST" + - "6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x1c\x00America/La" + - "_PazUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x1c\x00America/La" + + "_PazUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x1bd\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\fLM" + - "T\x00CMT\x00BST\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x1c\x00America/" + - "Lower_PrincesUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00CMT\x00BST\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x1c\x00America/" + + "Lower_PrincesUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-043" + - "0\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x1c\x00America/ChihuahuaU" + - "T\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "0\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x1c\x00America/ChihuahuaU" + + "T\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c\x8c\x00\x00\xff" + "\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M4.1.0,M" + - "10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x1c\x00America/WinnipegUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x1c\x00America/WinnipegUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + "d䰔\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" + @@ -2092,19 +2092,19 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x1c\x00America/ParamariboUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x1c\x00America/ParamariboUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00\x00\x00\x11\x00\x1c\x00America/Guay" + - "aquilUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "-0330\x00-03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00\x00\x00\x11\x00\x1c\x00America/Guay" + + "aquilUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00" + - "\x1c\x00America/St_ThomasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\b\xff\xff\xb9\xb0\x00\fLMT\x00QMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00" + + "\x1c\x00America/St_ThomasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x1c\x00America/MontevideoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x1c\x00America/MontevideoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2121,11 +2121,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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-0" + - "230\x00-02\x00-0130\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/" + - "St_LuciaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "230\x00-02\x00-0130\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/" + + "St_LuciaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - ",\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x1c\x00America/YakutatUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + ",\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x1c\x00America/YakutatUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\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\x03q" + @@ -2141,8 +2141,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\x00YDT\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae" + - ",\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/AtkaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00YPT\x00YDT\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae" + + ",\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/AtkaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2159,12 +2159,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nHST10HDT,M3.2.0,M11." + - "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x1c\x00America/El_SalvadorUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x1c\x00America/El_SalvadorUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + - "MT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/Noron" + - "haUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "MT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/Noron" + + "haUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -2172,14 +2172,14 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ " \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\x002\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00" + - "\x0f\x00\x1c\x00America/ManaguaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00" + + "\x0f\x00\x1c\x00America/ManaguaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\"\x12\xfe" + - "\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x1c\x00America/Los_AngelesUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\xab\xa0\x00\b\xff\xff\xb9\xb0\x00\f\xff\xff\xb9\xb0\x01\x10LMT\x00MMT\x00CST\x00EST\x00CDT\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\"\x12\xfe" + + "\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x1c\x00America/Los_AngelesUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\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" + @@ -2201,8 +2201,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10" + - "\x00\x1c\x00America/EirunepeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10" + + "\x00\x1c\x00America/EirunepeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xde" + "\x90@\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" + @@ -2210,8 +2210,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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`\u007fP\x00\x00\x00\x00R\u007f\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x1c\x00America/Dawson_CreekUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + ">5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x1c\x00America/Dawson_CreekUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -2222,8 +2222,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x14LMT\x00PDT\x00PST\x00PWT\x00PPT\x00MST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\xe5" + - "\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x1c\x00America/LouisvilleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "\x01\f\xff\xff\x9d\x90\x01\x10\xff\xff\x9d\x90\x00\x14LMT\x00PDT\x00PST\x00PWT\x00PPT\x00MST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\xe5" + + "\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x1c\x00America/LouisvilleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + "\x00\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" + @@ -2244,19 +2244,19 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "DC`\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\x00CS" + - "T\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0" + - "\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/CuracaoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "T\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0" + + "\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/CuracaoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04" + - "\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x1c\x00Amer" + - "ica/MonterreyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x1c\x00Amer" + + "ica/MonterreyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x00" + "3GX\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xa1\xf4\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\bLM" + - "T\x00CST\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x11\x00\x1c\x00America/Kentucky/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x1c\x00America/Kentucky/MonticelloUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "T\x00CST\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x11\x00\x1c\x00America/Kentucky/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x1c\x00America/Kentucky/MonticelloUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2273,8 +2273,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "`\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\x00ES" + - "T\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x1c\x00Amer" + - "ica/Kentucky/LouisvilleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "T\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x1c\x00Amer" + + "ica/Kentucky/LouisvilleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2295,8 +2295,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e" + - "\x00\x1c\x00America/HavanaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e" + + "\x00\x1c\x00America/HavanaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2315,8 +2315,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "M\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\nCST5C" + - "DT,M3.2.0/0,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x1c\x00America/" + - "MontrealUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "DT,M3.2.0/0,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x1c\x00America/" + + "MontrealUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -2345,31 +2345,31 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00America/VirginUT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + ".2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00America/VirginUT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QP\x0f(\b=\x01\x00\x00=\x01\x00" + - "\x00\x15\x00\x1c\x00America/Santo_DomingoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\xff\xff\xff\xff\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQP\x0f(\b=\x01\x00\x00=\x01\x00" + + "\x00\x15\x00\x1c\x00America/Santo_DomingoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fH\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x1c\x00Antarctica/UT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x1c\x00Antarctica" + - "/DumontDUrvilleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x1c\x00Antarctica/UT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x1c\x00Antarctica" + + "/DumontDUrvilleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x02\x00\x00\x00\b\xff\xff\xff\xffԼv\x80\xff\xff\xff\xff\xde4``\xff\xff\xff\xff\xe7<\x02\x80\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xa0\x00\x04-00" + - "\x00+10\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\r\x0e\xf20\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Antarctica/Syow" + - "aUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00+10\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\r\x0e\xf20\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Antarctica/Syow" + + "aUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\xb1X\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00*0\x00\x04-00\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xea\x06\xd3" + - "\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x1c\x00Antarctica/DavisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\x00\x00\x00\b\xff\xff\xff\xff\xe7\xb1X\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00*0\x00\x04-00\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xea\x06\xd3" + + "\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x1c\x00Antarctica/DavisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x1c\x00Antarctica/Palmer" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "+05\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x1c\x00Antarctica/Palmer" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x170\xbc\xb0\x00\x00\x00\x00\x18" + @@ -2384,19 +2384,19 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "B\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x1c\x00Antarctica/Maws" + - "onUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x1c\x00Antarctica/Maws" + + "onUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x1c\x00Antarctica/RotheraUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x1c\x00Antarctica/RotheraUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x1c\x00" + - "Antarctica/VostokUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\xff\xff\xd5\xd0\x00\x04-00\x00-03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x1c\x00" + + "Antarctica/VostokUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe9X\x89\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00T`\x00\x04-00\x00+06\x00\n<+06>-6\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x1c\x00Antarctica/South_PoleUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x1c\x00Antarctica/South_PoleUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -2413,18 +2413,18 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q:\xc8P7\xb1\x00" + - "\x00\x00\xb1\x00\x00\x00\x10\x00\x1c\x00Antarctica/TrollUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00NZMT\x00NZDT\x00\nNZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ:\xc8P7\xb1\x00" + + "\x00\x00\xb1\x00\x00\x00\x10\x00\x1c\x00Antarctica/TrollUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x1c\x00Antarctica/CaseyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x00T\x8a\x9eQ\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x1c\x00Antarctica/CaseyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\f\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xfe\x1è\x00\x00\x00\x00J\xda\x06 \x00\x00\x00\x00" + "K\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-00\x00+08\x00+11\x00\n<" + - "+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\x84J]\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x1c\x00Antarctica/MacquarieUT" + - "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\x84J]\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x1c\x00Antarctica/MacquarieUT" + + "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -2440,8 +2440,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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-0" + - "0\x00AEST\x00AEDT\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7" + - "\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x1c\x00Antarctica/McMurdoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "0\x00AEST\x00AEDT\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7" + + "\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x1c\x00Antarctica/McMurdoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\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" + @@ -2459,9 +2459,9 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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-12" + - "NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Arctic/UT" + - "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x1c\x00Arct" + - "ic/LongyearbyenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Arctic/UT" + + "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x1c\x00Arct" + + "ic/LongyearbyenUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffr\xee$l\xff\xff\xff\xff\x9b'\xe3\x00\xff\xff\xff\xff\x9b\xd4{`\xff\xff\xff\xffȷM`\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\xeb\xaf \x90\xff\xff\xff\xff\xec\xa8" + @@ -2473,8 +2473,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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" + "\x00\x00\n\x14\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x1c\x00Asia/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x1c\x00Asia/Hong_KongUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x1c\x00Asia/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x1c\x00Asia/Hong_KongUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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:" + @@ -2488,11 +2488,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x00JS" + - "T\x00\nHKT-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/MuscatUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "T\x00\nHKT-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/MuscatUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x1c" + - "\x00Asia/TaipeiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa8\x01\x00\x003\xd8\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x1c" + + "\x00Asia/TaipeiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5" + "E\"\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" + @@ -2501,11 +2501,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + - "CDT\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x1c\x00Asia/QatarUT\t\x00\x03\xfc\xff\xe2_" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "CDT\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x1c\x00Asia/QatarUT\t\x00\x03`\xa8\xec_" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x1c\x00Asia/NicosiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00T\x8a\x9eQ\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x1c\x00Asia/NicosiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\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" + @@ -2516,7 +2516,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\x1f" + "H\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x1c\x00Asia/GazaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x1c\x00Asia/GazaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\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\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" + "3\x00\x00\x00\x00\x00\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\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" + @@ -2537,8 +2537,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x04\x03\x04\x03\x04\x03\x04\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\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-2EEST,M3." + - "4.4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x1c\x00Asia/Barnaul" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "4.4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x1c\x00Asia/Barnaul" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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 " + @@ -2551,15 +2551,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\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" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x1c\x00Asia/SamarkandUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x1c\x00Asia/SamarkandUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+0" + - "4\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00\x1c\x00Asia/BakuUT" + - "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "4\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00\x1c\x00Asia/BakuUT" + + "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2572,7 +2572,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00" + - "\xb8K\x97QѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x1c\x00Asia/TbilisiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "T\x8a\x9eQѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x1c\x00Asia/TbilisiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + "\x00\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" + @@ -2583,16 +2583,16 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x11L" + - "MT\x00TBMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00A" + - "sia/RiyadhUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "MT\x00TBMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00A" + + "sia/RiyadhUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Qʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x1c\x00Asia/RangoonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00T\x8a\x9eQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x1c\x00Asia/RangoonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\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<+063" + - "0>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x1c\x00Asia/YakutskUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "0>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x1c\x00Asia/YakutskUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2604,8 +2604,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00" + - "\x00\xb0\x04\x00\x00\r\x00\x1c\x00Asia/IstanbulUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00" + + "\x00\xb0\x04\x00\x00\r\x00\x1c\x00Asia/IstanbulUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\xd0\xff\xff\xff\xff\xaa((`\xff\xff\xff\xff\xaa\xe1\xfd" + @@ -2626,7 +2626,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x03\x02\x03\x02\x03\x02\x03\x02\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\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x1c\x00Asia/QyzylordaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "T\x8a\x9eQ\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x1c\x00Asia/QyzylordaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\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" + @@ -2637,8 +2637,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\t" + "P\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x1c\x00Asia" + - "/KhandygaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\bLMT\x00+04\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x1c\x00Asia" + + "/KhandygaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2651,25 +2651,25 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "G\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00" + - "\x1c\x00Asia/KathmanduUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xb0\x00\x10LMT\x00+08\x00+10\x00+09\x00+11\x00\n<+09>-9\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00" + + "\x1c\x00Asia/KathmanduUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/" + - "ChongqingUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "0530\x00+0545\x00\n<+0545>-5:45\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/" + + "ChongqingUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00C" + - "ST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x1c\x00Asia/Ho_Chi_MinhUT\t\x00" + - "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x1c\x00Asia/Ho_Chi_MinhUT\t\x00" + + "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q0]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x1c\x00Asia/Bishk" + - "ekUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "07\x00+08\x00+09\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ0]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x1c\x00Asia/Bishk" + + "ekUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2679,8 +2679,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00E\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\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x1c\x00Asia/QostanayUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\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\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x1c\x00Asia/QostanayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\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\xac" + @@ -2691,11 +2691,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\\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\n\x00\x00\x00\x00\x00\xb8K\x97Q'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x1c\x00Asia/KabulUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x1c\x00Asia/KabulUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x1c\x00Asia/TomskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x1c\x00Asia/TomskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04" + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -2708,8 +2708,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d?v\f" + - "\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d?v\f" + + "\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacauUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2723,7 +2723,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x1c\x00Asia/Ust-NeraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x1c\x00Asia/Ust-NeraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2737,7 +2737,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x1c\x00Asia/YerevanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x1c\x00Asia/YerevanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -2750,11 +2750,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\u007f\xe0\x00\x00\x00\x00L̕`\x00\x00\x00\x00M\x8ea\xe0\x00\x00\x00\x00" + "N\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\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x1c\x00Asia/VientianeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x1c\x00Asia/VientianeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qd" + - "%\x05\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x1c\x00Asia/VladivostokUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQd" + + "%\x05\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x1c\x00Asia/VladivostokUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\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" + @@ -2767,8 +2767,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "K\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x1c\x00Asia/Beir" + - "utUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "09\x00+11\x00+10\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x1c\x00Asia/Beir" + + "utUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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'\u007f" + "\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" + @@ -2780,13 +2780,13 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "`\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\tL" + - "MT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.0/0,M10.5.0/0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q?Y\xaf\x19" + - "\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DaccaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "MT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.0/0,M10.5.0/0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ?Y\xaf\x19" + + "\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DaccaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "bp\x01\x18LMT\x00HMT\x00+0630\x00+0530\x00+06\x00+07\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\xea\x18\xd4\xf8" + - "\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x1c\x00Asia/YekaterinburgUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZi" + + "bp\x01\x18LMT\x00HMT\x00+0630\x00+0530\x00+06\x00+07\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\xea\x18\xd4\xf8" + + "\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x1c\x00Asia/YekaterinburgUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2799,8 +2799,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "L̇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\n\x00\x00\x00\x00\x00\xb8K\x97Q6j\\J\xcf\x04\x00\x00\xcf" + - "\x04\x00\x00\v\x00\x1c\x00Asia/HebronUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x10\x00\x00T`\x00\fLMT\x00PMT\x00+04\x00+06\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ6j\\J\xcf\x04\x00\x00\xcf" + + "\x04\x00\x00\v\x00\x1c\x00Asia/HebronUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00u\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" + @@ -2821,15 +2821,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x04\x03\x04\x03\x04\x03\x04\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\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\x00IST\x00\nEET-2EEST,M3.4" + - ".4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x1c\x00Asia/ThimphuU" + - "T\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + ".4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x1c\x00Asia/ThimphuU" + + "T\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/ThimbuUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/ThimbuUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q)\x15" + - "II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x1c\x00Asia/SakhalinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\xa8\x01\x02\x00\x00T\f\x00\x00\x00\x00MX\x00\x04\x00\x00T`\x00\nLMT\x00+0530\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ)\x15" + + "II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x1c\x00Asia/SakhalinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x18" + "k\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" + @@ -2842,8 +2842,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x10" + - "LMT\x00+09\x00+12\x00+11\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x1c\x00" + - "Asia/ChoibalsanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "LMT\x00+09\x00+12\x00+11\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x1c\x00" + + "Asia/ChoibalsanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2854,7 +2854,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "C\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\x00k" + "X\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x1c\x00Asia/SeoulUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x1c\x00Asia/SeoulUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -2862,15 +2862,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "x\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\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\nK" + - "ST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Asia/MakassarUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "ST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Asia/MakassarUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x1c\x00Asia" + - "/DubaiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00MMT\x00+08\x00+09\x00WITA\x00\nWITA-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x1c\x00Asia" + + "/DubaiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + - "QS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x1c\x00Asia/AlmatyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "QS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x1c\x00Asia/AlmatyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2881,8 +2881,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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<+0" + - "6>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x1c\x00Asia/Ulan_BatorUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "6>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x1c\x00Asia/Ulan_BatorUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xee" + "L\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\x9a" + @@ -2892,39 +2892,39 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x1c\x00Asia/SaigonUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x1c\x00Asia/SaigonUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DhakaUT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "+08\x00+09\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DhakaUT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x1c\x00Asia/JayapuraU" + - "T\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "06\x00+07\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x1c\x00Asia/JayapuraU" + + "T\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x1c\x00Asia/Pyongya" + - "ngUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00+0930\x00WIT\x00\nWIT-9\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x1c\x00Asia/Pyongya" + + "ngUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11" + - "\x00\x1c\x00Asia/Kuala_LumpurUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x04\x00\x00~\x90\x00\b\x00\x00~\x90\x00\x04LMT\x00KST\x00JST\x00\nKST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11" + + "\x00\x1c\x00Asia/Kuala_LumpurUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6U\xaa\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\xca" + "\xb3\xe5`\xff\xff\xff\xffˑ_\b\xff\xff\xff\xff\xd2Hm\xf0\x00\x00\x00\x00\x16\x91\xf5\b\x01\x02\x03\x04\x05\x06\x05\a\x00\x00_V\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\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/ChungkingUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + ">-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/ChungkingUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x1c\x00Asia/AqtobeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\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\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x1c\x00Asia/AqtobeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2935,8 +2935,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x1c\x00Asia/ChitaUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x1c\x00Asia/ChitaUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2949,12 +2949,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "J\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\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x1c\x00Asia/ColomboUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00T\x8a\x9eQ\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x1c\x00Asia/ColomboUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\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<+053" + - "0>-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacaoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "0>-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacaoUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2968,8 +2968,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00\x00\x12\x00\x1c\x00Asi" + - "a/SrednekolymskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "LMT\x00CST\x00+10\x00+09\x00CDT\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00\x00\x12\x00\x1c\x00Asi" + + "a/SrednekolymskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2982,7 +2982,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "Yp\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x1c\x00Asia/BaghdadUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + ">-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x1c\x00Asia/BaghdadUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -2993,16 +2993,16 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "<\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\x00" + "8\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\n\x00\x00\x00\x00\x00\xb8K\x97Qe" + - "\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x1c\x00Asia/AshgabatUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQe" + + "\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x1c\x00Asia/AshgabatUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+0" + - "5\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x1c\x00Asia/KamchatkaUT\t\x00\x03" + - "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "5\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x1c\x00Asia/KamchatkaUT\t\x00\x03" + + "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3014,31 +3014,31 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00" + - "Asia/BahrainUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa8\xc0\x01\fLMT\x00+11\x00+13\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00" + + "Asia/BahrainUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00Asia/BangkokUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00Asia/BangkokUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x1c\x00Asia/KarachiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\x00\x00\x00\x00T\x8a\x9eQ9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x1c\x00Asia/KarachiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\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\xd2" + "t\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+0" + - "530\x00+0630\x00+05\x00PKST\x00PKT\x00\nPKT-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x1c\x00" + - "Asia/TashkentUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "530\x00+0630\x00+05\x00PKST\x00PKT\x00\nPKT-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x1c\x00" + + "Asia/TashkentUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "FP\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\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x1c\x00Asia/AdenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "FP\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x1c\x00Asia/AdenUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x1c\x00Asia/OmskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x1c\x00Asia/OmskUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3051,12 +3051,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "@\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\x00" + - "T`\x01\f\x00\x00bp\x00\bLMT\x00+05\x00+07\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00" + - "\x00\x0f\x00\x1c\x00Asia/Phnom_PenhUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "T`\x01\f\x00\x00bp\x00\bLMT\x00+05\x00+07\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00" + + "\x00\x0f\x00\x1c\x00Asia/Phnom_PenhUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + - "MT\x00BMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17✳2\x04\x00\x002\x04\x00\x00\x0e\x00\x1c\x00Asia/Jerus" + - "alemUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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" + + "MT\x00BMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17✳2\x04\x00\x002\x04\x00\x00\x0e\x00\x1c\x00Asia/Jerus" + + "alemUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\xcd" + "\xac\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" + @@ -3074,8 +3074,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nI" + - "ST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x1c\x00Asia" + - "/MagadanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x1c\x00Asia" + + "/MagadanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3088,13 +3088,13 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x1c\x00Asia/JakartaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x1c\x00Asia/JakartaUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x1c\x00Asia/" + - "NovokuznetskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "+0730\x00+09\x00+08\x00WIB\x00\nWIB-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x1c\x00Asia/" + + "NovokuznetskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3106,8 +3106,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x83\xe4\xb0\x00\x00\x00\x00BE\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x1c\x00Asia/OralUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "`\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x1c\x00Asia/OralUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3118,8 +3118,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "8\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\n\x00\x00\x00\x00\x00\xb8K\x97Q)p\x1cX\xf1\x02\x00\x00\xf1\x02\x00\x00\x10\x00\x1c\x00Asia/Novosib" + - "irskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00+06\x00+04\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ)p\x1cX\xf1\x02\x00\x00\xf1\x02\x00\x00\x10\x00\x1c\x00Asia/Novosib" + + "irskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3132,7 +3132,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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<+0" + - "7>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x1c\x00Asia/DamascusUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "7>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x1c\x00Asia/DamascusUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r\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>\u007fp\xff\xff\xff\xff\xa6@\xf3\x80\xff\xff\xff\xff\xa7\x1eap\xff\xff\xff\xff\xa8 Հ\xff\xff\xff\xff\xa9" + @@ -3150,13 +3150,13 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\"\b\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t" + - "LMT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.5/0,M10.5.5/0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q`\xc9\xd4" + - "\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x1c\x00Asia/Ujung_PandangUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "LMT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.5/0,M10.5.5/0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ`\xc9\xd4" + + "\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x1c\x00Asia/Ujung_PandangUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x1c\x00Asia/FamagustaUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\nWITA-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x1c\x00Asia/FamagustaUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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" + @@ -3172,12 +3172,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00\x00\x00\x00V\xf70\x90\x00\x00\x00\x00W\xd0\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Qʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x1c\x00Asia/YangonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x1c\x00Asia/YangonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf2s" + "Q\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xceG|\xea\x13\x03\x00\x00\x13\x03\x00\x00\n\x00\x1c\x00Asia/AmmanUT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "09\x00\n<+0630>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xceG|\xea\x13\x03\x00\x00\x13\x03\x00\x00\n\x00\x1c\x00Asia/AmmanUT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r" + "\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" + @@ -3190,13 +3190,13 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "Ot\xdb`\x00\x00\x00\x00R\xb3^P\x00\x00\x00\x00S4\x9f`\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01" + "\x02\x01\x02\x01\x02\x01\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!\xb0\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\tLMT\x00EEST\x00EET" + - "\x00\nEET-2EEST,M3.5.4/24,M10.5.5/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00" + - "\x1c\x00Asia/TokyoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\nEET-2EEST,M3.5.4/24,M10.5.5/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00" + + "\x1c\x00Asia/TokyoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00JD" + - "T\x00JST\x00\nJST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x1c\x00Asia/AnadyrUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00JST\x00\nJST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x1c\x00Asia/AnadyrUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc4" + "\xb0\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" + @@ -3208,8 +3208,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "`\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q;" + - "\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\v\x00\x1c\x00Asia/TehranUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ;" + + "\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\v\x00\x1c\x00Asia/TehranUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft-" + "@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\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" + @@ -3243,32 +3243,32 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x02\x05\x00\x0008\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00FP" + "\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00+04\x00+0430\x00\n<+0330>-3:30<+043" + - "0>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x1c\x00Asia/Singapo" + - "reUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "0>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x1c\x00Asia/Singapo" + + "reUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf5\b\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "y\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/BruneiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00p\x80\x00\x1cLMT\x00SMT\x00+07\x00+0720\x00+0730\x00+09\x00+08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "y\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/BruneiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xad\x8a\x02D\xff\xff\xff\xff\xbagG\x88\x01\x02\x00\x00k\xbc\x00\x00\x00\x00ix\x00\x04" + - "\x00\x00p\x80\x00\nLMT\x00+0730\x00+08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00A" + - "sia/UrumqiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00p\x80\x00\nLMT\x00+0730\x00+08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00A" + + "sia/UrumqiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97QΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x1c\x00Asia/DiliUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\x00T\x8a\x9eQΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x1c\x00Asia/DiliUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\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\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Qe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x1c\x00Asia/AshkhabadUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x1c\x00Asia/AshkhabadUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\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+0" + - "6\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x1c\x00Asia/Krasnoyars" + - "kUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "6\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x1c\x00Asia/Krasnoyars" + + "kUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3281,7 +3281,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "I\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\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x1c\x00Asia/AtyrauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "T\x8a\x9eQ?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x1c\x00Asia/AtyrauUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\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\x9c" + @@ -3292,8 +3292,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "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\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+0" + - "6\x00+04\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QT\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x1c\x00Asia/AqtauUT\t\x00\x03" + - "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "6\x00+04\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQT\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x1c\x00Asia/AqtauUT\t\x00\x03" + + "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xcc" + "w\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" + @@ -3303,36 +3303,36 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "M\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\x00" + - "FP\x01\bLMT\x00+04\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x1c\x00A" + - "sia/HarbinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "FP\x01\bLMT\x00+04\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x1c\x00A" + + "sia/HarbinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/KuwaitUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/KuwaitUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r" + - "\x00\x1c\x00Asia/CalcuttaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x1b6\xb4\x01\x00\x00+\xcc\x00\x00\x00\x00*0\x00\x04LMT\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r" + + "\x00\x1c\x00Asia/CalcuttaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "MMT\x00IST\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x1c\x00Asia/M" + - "anilaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "MMT\x00IST\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x1c\x00Asia/M" + + "anilaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x1c" + - "\x00Asia/DushanbeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\b\x00\x00~\x90\x00\fLMT\x00PDT\x00PST\x00JST\x00\nPST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x1c" + + "\x00Asia/DushanbeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\fLMT\x00+05\x00+07\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x1c\x00Asia/Tel_AvivUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\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\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x1c\x00Asia/Tel_AvivUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + "Zif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ф" + @@ -3351,7 +3351,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "8@\x01\x10LMT\x00JMT\x00IDT\x00IST\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x1c\x00Asia/UlaanbaatarUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x00T\x8a\x9eQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x1c\x00Asia/UlaanbaatarUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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{" + @@ -3362,7 +3362,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "p\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02\x00\x00\f\x00\x1c\x00Asia/IrkutskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02\x00\x00\f\x00\x1c\x00Asia/IrkutskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3376,19 +3376,19 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "@\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x1c\x00Asia/ShanghaiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x1c\x00Asia/ShanghaiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\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\x00" + - "q\xd7\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00" + - "\x00\r\x00\x1c\x00Asia/KatmanduUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "q\xd7\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00" + + "\x00\r\x00\x1c\x00Asia/KatmanduUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x1c\x00Asi" + - "a/HovdUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00+0530\x00+0545\x00\n<+0545>-5:45\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x1c\x00Asi" + + "a/HovdUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "2\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#;\xc6" + @@ -3398,33 +3398,33 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x00C4B" + "\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\x00b" + - "p\x00\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x1c\x00As" + - "ia/KolkataUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "p\x00\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x1c\x00As" + + "ia/KolkataUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00IS" + - "T\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x1c\x00Asia/Kashgar" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\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+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x1c\x00Asia/Kashgar" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QS\xa5\x81e\xf7" + - "\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x1c\x00Asia/PontianakUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQS\xa5\x81e\xf7" + + "\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x1c\x00Asia/PontianakUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00WIB\x00\nWIB-7\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x1c\x00Asia/KuchingUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x1c\x00Asia/KuchingUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x1c\x00" + - "Atlantic/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\u0097N\xad\xaf\x00\x00\x00\xaf" + - "\x00\x00\x00\x13\x00\x1c\x00Atlantic/Cape_VerdeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00+0730\x00+0820\x00+08\x00+09\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x1c\x00" + + "Atlantic/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u0097N\xad\xaf\x00\x00\x00\xaf" + + "\x00\x00\x00\x13\x00\x1c\x00Atlantic/Cape_VerdeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x1c\x00Atlantic/FaroeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "@\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\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x1c\x00Atlantic/FaroeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\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" + @@ -3432,8 +3432,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nWET0" + - "WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x1c\x00Atlantic" + - "/Jan_MayenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x1c\x00Atlantic" + + "/Jan_MayenUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffr\xee$l\xff\xff\xff\xff\x9b'\xe3\x00\xff\xff\xff\xff\x9b\xd4{`\xff\xff\xff\xffȷM`\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\xeb\xaf \x90\xff\xff\xff\xff\xec\xa8L\x10\xff\xff\xff" + @@ -3445,7 +3445,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00\x00\n\x14\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\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Qm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\x12\x00\x1c\x00Atlantic/ReykjavikUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x00\x00\x00\x00T\x8a\x9eQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\x12\x00\x1c\x00Atlantic/ReykjavikUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x10\xff\xff\xff\xff\x8b`\x83\xa0\xff\xff\xff\xff\x9c\x91\x1e" + "\x00\xff\xff\xff\xff\x9dш\x90\xff\xff\xff\xff\x9erQ\x80\xff\xff\xff\xff\x9f\xd5\x03\x10\xff\xff\xff\xff\xa0S\x85\x00\xff\xff\xff\xff\xa1\xb66\x90\xff\xff\xff\xff\xa4<'\x80\xff\xff\xff\xff\xa4\xb9t\x10\xff\xff\xff" + @@ -3458,8 +3458,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\xff\xf0\x96B\xa0\xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2\u007f_ \xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf53\x82\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x13d" + "\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xf3F\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xd3(\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc\xbcE \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xeb" + - "`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaf|7" + - "\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x1c\x00Atlantic/CanaryUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaf|7" + + "\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x1c\x00Atlantic/CanaryUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\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\x14" + "3\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" + @@ -3468,11 +3468,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x000" + "d\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\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00Atlantic/St_HelenaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00Atlantic/St_HelenaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00\x10\x00\x1c\x00Atlantic/M" + - "adeiraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00\x10\x00\x1c\x00Atlantic/M" + + "adeiraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x8a\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\u007f\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" + @@ -3496,11 +3496,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\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+01\x00WEST\x00WE" + - "T\x00\nWET0WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x1c\x00A" + - "tlantic/South_GeorgiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "T\x00\nWET0WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x1c\x00A" + + "tlantic/South_GeorgiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00\x1c\x00Atlantic/FaeroeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00\x1c\x00Atlantic/FaeroeUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3508,8 +3508,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00#3\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x1c\x00Atlantic/AzoresUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x1c\x00Atlantic/AzoresUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\a\x00\x00\x00\x18\xff\xff\xff\xff^=\x1b\x90\xff\xff\xff\xff\x92\xe6" + "\xaa\xa0\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\u007f\x8e\x90\xff\xff\xff\xff\x9f\xaa\xd3\x10\xff\xff\xff\xff\xa0_p\x90\xff\xff" + @@ -3548,8 +3548,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x05\x04\x05\x04\x05\x04\x05\x04\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+00\x00WET\x00\n<-01>1<+00>,M3.5.0/0,M10." + - "5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Ql&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x1c\x00Atlantic/BermudaUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQl&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x1c\x00Atlantic/BermudaUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3566,15 +3566,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "O\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\x00AST\x00" + - "\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x1c\x00Austra" + - "lia/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0f\x00" + - "\x1c\x00Australia/PerthUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x1c\x00Austra" + + "lia/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0f\x00" + + "\x1c\x00Australia/PerthUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Qo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x1c\x00Australia/LHIUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00T\x8a\x9eQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x1c\x00Australia/LHIUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\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" + @@ -3586,8 +3586,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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<+1" + - "030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00" + - "\x14\x00\x1c\x00Australia/YancowinnaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00" + + "\x14\x00\x1c\x00Australia/YancowinnaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03" + @@ -3603,8 +3603,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15" + - "\x00\x1c\x00Australia/Broken_HillUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15" + + "\x00\x1c\x00Australia/Broken_HillUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03" + @@ -3620,19 +3620,19 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e" + - "\x00\x1c\x00Australia/WestUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e" + + "\x00\x1c\x00Australia/WestUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x1c\x00Australia/DarwinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x00T\x8a\x9eQ\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x1c\x00Australia/DarwinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x1c\x00Australia/AdelaideUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x1c\x00Australia/AdelaideUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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Π" + @@ -3648,15 +3648,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\x00A" + - "CDT\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa2ܺ\xca:\x01\x00\x00:\x01" + - "\x00\x00\x0f\x00\x1c\x00Australia/EuclaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "CDT\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa2ܺ\xca:\x01\x00\x00:\x01" + + "\x00\x00\x0f\x00\x1c\x00Australia/EuclaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x1c\x00Australia/MelbourneUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "45\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x1c\x00Australia/MelbourneUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3671,8 +3671,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x1c\x00Austra" + - "lia/CanberraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x1c\x00Austra" + + "lia/CanberraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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\xcc" + "\xb7V\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" + @@ -3687,14 +3687,14 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\t" + - "LMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q3\xba" + - "\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x1c\x00Australia/BrisbaneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "LMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\xba" + + "\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x1c\x00Australia/BrisbaneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\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\nAEST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Qo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x1c\x00Australia/Lord_HoweUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\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\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x1c\x00Australia/Lord_HoweUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x870" + @@ -3706,8 +3706,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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#Y" + "x\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9b\xe1\xc1\xa9\x88\x03\x00\x00" + - "\x88\x03\x00\x00\x12\x00\x1c\x00Australia/VictoriaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\n<+1030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9b\xe1\xc1\xa9\x88\x03\x00\x00" + + "\x88\x03\x00\x00\x12\x00\x1c\x00Australia/VictoriaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3723,7 +3723,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x1c\x00Australia/HobartUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x1c\x00Australia/HobartUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3741,14 +3741,14 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x1c\x00Australia/LindemanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x1c\x00Australia/LindemanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + "\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\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\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03" + - "\x00\x00\x10\x00\x1c\x00Australia/CurrieUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03" + + "\x00\x00\x10\x00\x1c\x00Australia/CurrieUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3765,19 +3765,19 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00AE" + - "ST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x0f" + - "\x00\x1c\x00Australia/NorthUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x0f" + + "\x00\x1c\x00Australia/NorthUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q3\xba\xde\xd3!\x01" + - "\x00\x00!\x01\x00\x00\x14\x00\x1c\x00Australia/QueenslandUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\x90\x00\x04\x00\x00\x93\xa8\x01\t\x00\x00\x85\x98\x00\x04LMT\x00ACST\x00ACDT\x00\nACST-9:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\xba\xde\xd3!\x01" + + "\x00\x00!\x01\x00\x00\x14\x00\x1c\x00Australia/QueenslandUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\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\nAEST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97" + - "QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/NSWUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/NSWUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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" + @@ -3793,7 +3793,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/ACTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/ACTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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" + @@ -3809,8 +3809,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "BE\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\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x1c\x00Australia/Tas" + - "maniaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x1c\x00Australia/Tas" + + "maniaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3827,8 +3827,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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,M" + - "10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x1c\x00Australia/Sout" + - "hUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x1c\x00Australia/Sout" + + "hUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3844,7 +3844,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00" + - "\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x1c\x00Australia/SydneyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x1c\x00Australia/SydneyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\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\u007f<\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" + @@ -3860,25 +3860,25 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "c\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,M" + - "4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Brazil/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x1c\x00Brazil/WestUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Brazil/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x1c\x00Brazil/WestUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fD\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,\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-0" + - "3\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x1c\x00Brazil/AcreUT\t\x00\x03" + - "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "3\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x1c\x00Brazil/AcreUT\t\x00\x03" + + "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00" + "\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x1c\x00Brazil/De" + - "NoronhaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x04LMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x1c\x00Brazil/De" + + "NoronhaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3886,8 +3886,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x002\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9d?\xdfڸ\x03\x00" + - "\x00\xb8\x03\x00\x00\v\x00\x1c\x00Brazil/EastUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9d?\xdfڸ\x03\x00" + + "\x00\xb8\x03\x00\x00\v\x00\x1c\x00Brazil/EastUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -3903,9 +3903,9 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "cG0\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Canada/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc2" + - "\x96dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x1c\x00Canada/SaskatchewanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Canada/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc2" + + "\x96dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x1c\x00Canada/SaskatchewanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\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" + @@ -3916,8 +3916,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97QU9#\xbe2\x05" + - "\x00\x002\x05\x00\x00\x0e\x00\x1c\x00Canada/PacificUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\xab\xa0\x01\x10\xff\xff\xab\xa0\x00\x14LMT\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQU9#\xbe2\x05" + + "\x00\x002\x05\x00\x00\x0e\x00\x1c\x00Canada/PacificUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -3940,7 +3940,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x1c\x00Canada/EasternUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x1c\x00Canada/EasternUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -3970,7 +3970,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00Canada/AtlanticUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\x00T\x8a\x9eQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00Canada/AtlanticUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\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" + @@ -3999,7 +3999,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13\x00\x1c\x00Canada/NewfoundlandUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13\x00\x1c\x00Canada/NewfoundlandUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -4031,8 +4031,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\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\xdc" + "\xa4\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\x00N" + - "DDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x1c" + - "\x00Canada/CentralUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "DDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x1c" + + "\x00Canada/CentralUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -4054,8 +4054,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x00\x00\x00\x00\x00\xb8K\x97Q{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x1c\x00Canada/Mounta" + - "inUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\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,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x1c\x00Canada/Mounta" + + "inUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4071,8 +4071,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + - "MDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc1Ȇ\x90\x05\x04" + - "\x00\x00\x05\x04\x00\x00\f\x00\x1c\x00Canada/YukonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "MDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc1Ȇ\x90\x05\x04" + + "\x00\x00\x05\x04\x00\x00\f\x00\x1c\x00Canada/YukonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfb\x1d_\x10\x00\x00\x00\x00\x13ir" + @@ -4090,7 +4090,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00CETUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00CETUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + "\x00\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\xcf" + @@ -4101,9 +4101,9 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\x00CEST\x00CET\x00\nCET-1C" + - "EST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x1c\x00Chile/UT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x1c\x00Chile" + - "/ContinentalUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "EST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x1c\x00Chile/UT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x1c\x00Chile" + + "/ContinentalUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xc6\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0" + "^w\xc6\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" + @@ -4125,8 +4125,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\xba\x00\x00\xff\xff\xbd\xba\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/2" + - "4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x1c\x00Chile/EasterIslandUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x00\x00\x00\x01\x00\x00" + + "4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x1c\x00Chile/EasterIslandUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00f\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\xd1" + @@ -4144,8 +4144,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q<\x8b\x99\x1e\xb7\x03" + - "\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00CST6CDTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "07\x00-05\x00\n<-06>6<-05>,M9.1.6/22,M4.1.6/22\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\x8b\x99\x1e\xb7\x03" + + "\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00CST6CDTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4161,8 +4161,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00" + "E\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\x00" + - "CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\a\x1c\x9e\x9a]\x04\x00\x00]\x04" + - "\x00\x00\x04\x00\x1c\x00CubaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04" + + "\x00\x00\x04\x00\x1c\x00CubaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4181,7 +4181,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x1c\x00EETUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + ".0/0,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x1c\x00EETUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -4190,8 +4190,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q)\xb9\xbe\x9dr\x00" + - "\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+11UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ)\xb9\xbe\x9dr\x00" + + "\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+11UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qk\x1911\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\x19-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc5\x18\xb6" + - "\xfbr\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-8UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc5\x18\xb6" + + "\xfbr\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-8UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00\xb8K\x97Qe\xcb" + - "\xe9Qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+3UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQe\xcb" + + "\xe9Qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+3UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfc\x19" + - "@\xb9r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-9UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfc\x19" + + "@\xb9r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-9UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8e" + - "\x1569r\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+10UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8e" + + "\x1569r\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+10UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xf7\x1ac\xc3r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-1UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xf7\x1ac\xc3r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-1UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K" + - "\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT-0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT-0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\xd4X\x9b\xf3q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+5UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\xd4X\x9b\xf3q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+5UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/GMTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/GMTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4x" + - "o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UTCUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4x" + + "o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UTCUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qj\xd5d\xb0r\x00\x00\x00" + - "r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-6UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQj\xd5d\xb0r\x00\x00\x00" + + "r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-6UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00" + - "\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UCTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00" + + "\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UCTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00" + - "\x00\b\x00\x1c\x00Etc/GMT0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00" + + "\x00\b\x00\x1c\x00Etc/GMT0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84\x19\xb3\tq\x00\x00\x00q\x00\x00\x00\t\x00" + - "\x1c\x00Etc/GMT+9UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84\x19\xb3\tq\x00\x00\x00q\x00\x00\x00\t\x00" + + "\x1c\x00Etc/GMT+9UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5\xf38cr\x00\x00\x00r\x00\x00\x00\n\x00" + - "\x1c\x00Etc/GMT+12UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5\xf38cr\x00\x00\x00r\x00\x00\x00\n\x00" + + "\x1c\x00Etc/GMT+12UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QH\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00" + - "\t\x00\x1c\x00Etc/GMT+6UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQH\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00" + + "\t\x00\x1c\x00Etc/GMT+6UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00" + - "\b\x00\x1c\x00Etc/ZuluUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00" + + "\b\x00\x1c\x00Etc/ZuluUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x1c" + - "\x00Etc/GMT-7UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x1c" + + "\x00Etc/GMT-7UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00" + - "\x1c\x00Etc/GMT-5UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00" + + "\x1c\x00Etc/GMT-5UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t" + - "\x00\x1c\x00Etc/GMT+1UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t" + + "\x00\x1c\x00Etc/GMT+1UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q,{\xdc;s\x00\x00\x00s\x00\x00\x00\n" + - "\x00\x1c\x00Etc/GMT-14UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ,{\xdc;s\x00\x00\x00s\x00\x00\x00\n" + + "\x00\x1c\x00Etc/GMT-14UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd9|\xbd7s\x00\x00\x00s\x00" + - "\x00\x00\n\x00\x1c\x00Etc/GMT-10UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd9|\xbd7s\x00\x00\x00s\x00" + + "\x00\x00\n\x00\x1c\x00Etc/GMT-10UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xab\xd1Is\x00\x00" + - "\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-11UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xab\xd1Is\x00\x00" + + "\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-11UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x90`N\xe8" + - "s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-13UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x90`N\xe8" + + "s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-13UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84" + - "+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+7UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84" + + "+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+7UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf7" + - "\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-12UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf7" + + "\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-12UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K" + - "\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT+0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT+0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\x9c\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-3UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\x9c\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-3UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+2UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+2UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97" + - "QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/GreenwichUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/GreenwichUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/UniversalUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/UniversalUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+8UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\x00T\x8a\x9eQ\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+8UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-2UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\x00T\x8a\x9eQ\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-2UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Europe/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03" + - "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x1c\x00Europe/CopenhagenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Europe/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x1c\x00Europe/CopenhagenUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x11\xff\xff\xff\xffi\x86ϴ\xff\xff\xff\xffq" + "\f\xef4\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9bվ\xd0\xff\xff\xff\xff\xc8CWp\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" + @@ -4377,8 +4377,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x00\x00\v\xcc\x00\x00\x00\x00\v\xcc\x00\x04\x00\x00\x1c \x01\b\x00\x00\x0e\x10\x00\rLMT\x00CMT\x00CE" + - "ST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00" + - "\x00\x10\x00\x1c\x00Europe/BucharestUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "ST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00" + + "\x00\x10\x00\x1c\x00Europe/BucharestUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4390,7 +4390,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Qu\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x1c\x00Europe/UlyanovskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "T\x8a\x9eQu\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x1c\x00Europe/UlyanovskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\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" + @@ -4403,8 +4403,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x00L" + "̣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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03R" + - "\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x1c\x00Europe/NicosiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "@\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03R" + + "\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x1c\x00Europe/NicosiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4415,7 +4415,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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" + "2x\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\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x1c\x00Europe/BudapestUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x00\x00T\x8a\x9eQ\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x1c\x00Europe/BudapestUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + @@ -4429,7 +4429,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x0e\x00\x1c\x00Europe/VaticanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x0e\x00\x1c\x00Europe/VaticanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\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\x9b" + "8\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" + @@ -4446,7 +4446,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x10\x00\x1c\x00Europe/MariehamnUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x00T\x8a\x9eQ\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x10\x00\x1c\x00Europe/MariehamnUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + @@ -4455,7 +4455,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00EET\x00\nEET-2EEST,M3.5.0/3,M10." + - "5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QWI\xc3\u007f(\x03\x00\x00(\x03\x00\x00\f\x00\x1c\x00Europe/MinskUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQWI\xc3\u007f(\x03\x00\x00(\x03\x00\x00\f\x00\x1c\x00Europe/MinskUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4469,8 +4469,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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" + - "\x00MMT\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4" + - "\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x1c\x00Europe/San_MarinoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\x00MMT\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4" + + "\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x1c\x00Europe/San_MarinoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\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\\" + @@ -4486,8 +4486,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "o\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x1c\x00Europe/BrusselsUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\rLMT\x00RMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "o\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x1c\x00Europe/BrusselsUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\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`" + @@ -4506,8 +4506,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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-1" + - "CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x1c\x00Europe/I" + - "stanbulUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x1c\x00Europe/I" + + "stanbulUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\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" + @@ -4527,8 +4527,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00" + - "\x00\x0f\x00\x1c\x00Europe/BelgradeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x15LMT\x00IMT\x00EEST\x00EET\x00+03\x00+04\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00" + + "\x00\x0f\x00\x1c\x00Europe/BelgradeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xce" + "\xa2C\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" + @@ -4536,8 +4536,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "LT\x10\x00\x00\x00\x00#\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" + @@ -4566,16 +4566,16 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Qߜv\xcf" + - "\x85\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x1c\x00Europe/AndorraUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00CEST\x00MSD\x00MSK\x00\nEET-2EEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQߜv\xcf" + + "\x85\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x1c\x00Europe/AndorraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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#-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?" + - "\x06\x00\x00?\x06\x00\x00\r\x00\x1c\x00Europe/LondonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?" + + "\x06\x00\x00?\x06\x00\x00\r\x00\x1c\x00Europe/LondonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa4" + @@ -4615,8 +4615,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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\x00" + - "BDST\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qq\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x1c" + - "\x00Europe/TallinnUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "BDST\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQq\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x1c" + + "\x00Europe/TallinnUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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ϒ4\x10\xff\xff\xff\xff\xd0t" + @@ -4628,7 +4628,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\x00TM" + "T\x00CEST\x00CET\x00EET\x00MSK\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x1c\x00Europe/ZaporozhyeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x1c\x00Europe/ZaporozhyeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc3\b\xff\xff\xff\xff" + "\xaa\x19\xa30\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xffʪ\xe7\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffν\xd6p\x00\x00\x00\x00\x15'\xa7\xd0" + @@ -4638,8 +4638,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\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\x03\a\x02\a\x02\a\x02\a\x02\a\x02\a\x00\x00 \xf8\x00\x00\x00\x00 \xd0\x00\x04\x00\x00\x1c \x00\n\x00\x00*" + "0\x00\x0e\x00\x00\x0e\x10\x00\x12\x00\x00\x1c \x01\x16\x00\x008@\x01\x1b\x00\x00*0\x01\x1fLMT\x00+0220\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EE" + - "ST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QVa\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10" + - "\x00\x1c\x00Europe/VolgogradUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "ST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQVa\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10" + + "\x00\x1c\x00Europe/VolgogradUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4652,7 +4652,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x1c\x00Europe/RomeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x1c\x00Europe/RomeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4669,7 +4669,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QZ\x05wג\x02\x00\x00\x92\x02\x00\x00\r\x00\x1c\x00Europe/ViennaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQZ\x05wג\x02\x00\x00\x92\x02\x00\x00\r\x00\x1c\x00Europe/ViennaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04" + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + @@ -4681,8 +4681,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x00\x00\x00\x00\x00\xb8K\x97QN\xa5\xa5\xcb\x12\x02\x00\x00\x12\x02\x00\x00\x0f\x00\x1c\x00Europe/UzhgorodUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + ".5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQN\xa5\xa5\xcb\x12\x02\x00\x00\x12\x02\x00\x00\x0f\x00\x1c\x00Europe/UzhgorodUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1e\xff\xff\xff\xffj" + "\xee\xb0\x18\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С\x9e\xe0\xff\xff\xff\xff\xd1\xe5\xfd\xf0\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" + @@ -4691,8 +4691,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\x10\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\x01\x05\x06\x05\x06\x05\x06\x05\x06\x05\x06\x00\x00\x14\xe8\x00\x00\x00\x00\x0e\x10\x00\x04\x00\x00\x1c \x01\b\x00\x008@\x01\r\x00\x00*0\x00\x11\x00\x00" + "\x1c \x00\x15\x00\x00*0\x01\x19LMT\x00CET\x00CEST\x00MSD\x00MSK\x00EET\x00EEST\x00\nEET-2EEST,M3.5.0/3," + - "M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\r\x00\x1c\x00Europe/MoscowUT\t\x00\x03\xfc\xff" + - "\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\r\x00\x1c\x00Europe/MoscowUT\t\x00\x03`\xa8" + + "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xff" + "V\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" + @@ -4707,8 +4707,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\x00MMT\x00MST\x00MDST" + - "\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x1c\x00E" + - "urope/KievUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x1c\x00E" + + "urope/KievUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -4717,8 +4717,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\xbc" + "\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\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\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\n\x00\x00\x00\x00\x00\xb8K\x97" + - "QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x1c\x00Europe/PragueUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "ET\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x1c\x00Europe/PragueUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\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" + @@ -4731,7 +4731,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\nCET-1CEST,M3.5.0,M10.5.0/3" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x1c\x00Europe/ZagrebUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x1c\x00Europe/ZagrebUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -4740,8 +4740,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qh\xa5J[\xa0\x03\x00\x00\xa0\x03\x00\x00\f\x00\x1c\x00Europe/MaltaUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQh\xa5J[\xa0\x03\x00\x00\xa0\x03\x00\x00\f\x00\x1c\x00Europe/MaltaUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xcf" + @@ -4756,8 +4756,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\n\x00\x00\x00\x00\x00\xb8K" + - "\x97QI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x1c\x00Europe/TiraspolUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x04\x00\x00\x0e\x10\x00\tLMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x1c\x00Europe/TiraspolUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\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" + @@ -4770,8 +4770,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\x00" + - "MSD\x00MSK\x00\nEET-2EEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QO+j\x94\x88\x03\x00\x00\x88\x03" + - "\x00\x00\x12\x00\x1c\x00Europe/KaliningradUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "MSD\x00MSK\x00\nEET-2EEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQO+j\x94\x88\x03\x00\x00\x88\x03" + + "\x00\x00\x12\x00\x1c\x00Europe/KaliningradUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xcf" + @@ -4787,7 +4787,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\nEET-2\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x1c\x00Europe/StockholmUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x1c\x00Europe/StockholmUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffT՟\x94\xff\xff\xff\xff|Us" + "b\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9b\xd5\xda\xf0\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" + @@ -4796,8 +4796,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x02\x03\x00\x00\x10\xec\x00\x00\x00\x00\x0e\x1e\x00\x04\x00\x00\x0e\x10\x00\b\x00\x00\x1c \x01\fLMT\x00SET\x00CET\x00CEST\x00\n" + - "CET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x1c\x00Eur" + - "ope/SkopjeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "CET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x1c\x00Eur" + + "ope/SkopjeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -4805,8 +4805,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00C" + - "ET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01" + - "\x00\x00\x0f\x00\x1c\x00Europe/HelsinkiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "ET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01" + + "\x00\x00\x0f\x00\x1c\x00Europe/HelsinkiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -4815,7 +4815,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\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\x00EET\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00\x00\x0e\x00\x1c\x00Europe/VilniusUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "T\x8a\x9eQ\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00\x00\x0e\x00\x1c\x00Europe/VilniusUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\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Ȭ\xcfp\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" + @@ -4827,8 +4827,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x10\x00\x00\x00\x006\xfd\u007f\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\x00" + "8@\x01\x1d\x00\x00*0\x01!LMT\x00WMT\x00KMT\x00CET\x00EET\x00MSK\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M" + - "3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x1c\x00Europe/Belfa" + - "stUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x1c\x00Europe/Belfa" + + "stUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -4855,8 +4855,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x1c\x00Europe/BratislavaUT\t\x00" + - "\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + ",M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x1c\x00Europe/BratislavaUT\t\x00" + + "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -4868,8 +4868,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\n" + - "CET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x1c\x00Eur" + - "ope/JerseyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "CET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x1c\x00Eur" + + "ope/JerseyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -4896,8 +4896,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Qgp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x1c\x00Europe/RigaUT" + - "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQgp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x1c\x00Europe/RigaUT" + + "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -4909,7 +4909,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x00" + "LST\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\r\x00\x1c\x00Europe/LisbonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00" + + "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\r\x00\x1c\x00Europe/LisbonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\x00\x00\x00\x06\x00\x00\x00\x1b\xff\xff\xff\xff^=\f\x1d\xff\xff\xff\xff\x92\xe6" + "\x8e\x80\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\u007frp\xff\xff\xff\xff\x9f\xaa\xb6\xf0\xff\xff\xff\xff\xa0_Tp\xff\xff" + @@ -4934,8 +4934,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\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\x00WEMT\x00CET\x00CEST\x00\nWET0WEST,M3.5.0/1,M" + - "10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\x0f\x00\x1c\x00Europe/BusingenUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\x0f\x00\x1c\x00Europe/BusingenUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -4943,8 +4943,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x00" + - "CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde" + - "\x01\x00\x00\x10\x00\x1c\x00Europe/PodgoricaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde" + + "\x01\x00\x00\x10\x00\x1c\x00Europe/PodgoricaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc3" + @@ -4952,8 +4952,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00\x00\"LT\x10\x00\x00\x00\x00#\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x1c\x00Europe/W" + - "arsawUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x1c\x00Europe/W" + + "arsawUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5118,7 +5118,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "1]\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" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x1c\x00Europe/KirovUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x1c\x00Europe/KirovUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + @@ -5131,8 +5131,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x1c\x00Europe/GibraltarUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x1c\x00Europe/GibraltarUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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*, " + @@ -5152,8 +5152,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "0d\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\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\x00" + - "CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q]i\x11u\xd6\x02\x00\x00\xd6" + - "\x02\x00\x00\x10\x00\x1c\x00Europe/AstrakhanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "CET\x00CEST\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ]i\x11u\xd6\x02\x00\x00\xd6" + + "\x02\x00\x00\x10\x00\x1c\x00Europe/AstrakhanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9c" + @@ -5166,7 +5166,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x1c\x00Europe/TiraneUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x1c\x00Europe/TiraneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + @@ -5177,8 +5177,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qn\x81\xf4\xd7Z\x04\x00\x00Z\x04\x00\x00\r\x00\x1c\x00Europe/MonacoUT\t\x00\x03" + - "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQn\x81\xf4\xd7Z\x04\x00\x00Z\x04\x00\x00\r\x00\x1c\x00Europe/MonacoUT\t\x00\x03" + + "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\a\x00\x00\x00\x1f\xff\xff" + "\xff\xffn\x11\x9f\x94\xff\xff\xff\xff\x91x\vO\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" + @@ -5197,7 +5197,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x02\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\x04\x02\x04\x02\x04\x02\x04\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\x00\x00\x06\xec\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\x1c \x01\x16\x00\x00\x0e\x10\x00\x1bLM" + "T\x00PMT\x00WEST\x00WET\x00WEMT\x00CEST\x00CET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\xb8K\x97QM\xe5\xa9 ?\x04\x00\x00?\x04\x00\x00\x11\x00\x1c\x00Europe/LuxembourgUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQM\xe5\xa9 ?\x04\x00\x00?\x04\x00\x00\x11\x00\x1c\x00Europe/LuxembourgUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\a\x00\x00\x00\x16\xff\xff\xff\xff\x84\xa2\xad\xbc\xff\xff\xff\xff\x9b" + "\x1e\x8c`\xff\xff\xff\xff\x9b\xd5\xda\xf0\xff\xff\xff\xff\x9c\xea\xa7\xe0\xff\xff\xff\xff\x9d\xa4\x99p\xff\xff\xff\xff\x9e\xb9\x90\x90\xff\xff\xff\xff\x9f\x84\x97\x90\xff\xff\xff\xff\x9f\xe0\xc4p\xff\xff\xff\xff\xa0`\xa5\xf0\xff" + @@ -5216,8 +5216,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00\x00\x001]\xd9\x10\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\x06\x05" + "\x06\x05\x06\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\x05\xc4\x00\x00\x00\x00\x1c \x01\x04\x00" + "\x00\x0e\x10\x00\t\x00\x00\x0e\x10\x01\r\x00\x00\x00\x00\x00\x12\x00\x00\x0e\x10\x00\x12\x00\x00\x1c \x01\rLMT\x00CEST\x00CET\x00WEST\x00WET\x00\nCET-1CES" + - "T,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00\f\x00\x1c\x00Europe/Pari" + - "sUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\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,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00\f\x00\x1c\x00Europe/Pari" + + "sUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5236,7 +5236,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00P" + "MT\x00WEST\x00WET\x00CET\x00CEST\x00WEMT\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x1c\x00Europe/AthensUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x00\x00\x00\x00T\x8a\x9eQ\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x1c\x00Europe/AthensUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\xa8P\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" + @@ -5248,8 +5248,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\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\nEE" + - "T-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qz\xc3\xe8Ra\x03\x00\x00a\x03\x00\x00\x11\x00\x1c\x00Eur" + - "ope/SimferopolUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQz\xc3\xe8Ra\x03\x00\x00a\x03\x00\x00\x11\x00\x1c\x00Eur" + + "ope/SimferopolUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5264,8 +5264,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x1c\x00Europe/DublinUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x1c\x00Europe/DublinUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + "\xdc\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*," + @@ -5290,8 +5290,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\x04\x05\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$\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x1c\x00Europe/SamaraUT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + ".5.0,M3.5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x1c\x00Europe/SamaraUT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9ct\xe0\x00\x00\x00\x00\x1e\x8ce\xe0\x00\x00\x00\x00\x1f|V\xe0\x00\x00\x00\x00 lG\xe0" + @@ -5303,11 +5303,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "Cc\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xab\x80c$q\x00\x00\x00q" + - "\x00\x00\x00\a\x00\x1c\x00FactoryUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x008@\x01\b\x00\x00*0\x01\x04LMT\x00+03\x00+04\x00+05\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xab\x80c$q\x00\x00\x00q" + + "\x00\x00\x00\a\x00\x1c\x00FactoryUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00" + - "\x00\x02\x00\x1c\x00GBUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00" + + "\x00\x02\x00\x1c\x00GBUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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%" + @@ -5334,8 +5334,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x1c\x00GB-EireUT\t\x00\x03\xfc\xff\xe2_" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x1c\x00GB-EireUT\t\x00\x03`\xa8\xec_" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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*" + @@ -5362,22 +5362,22 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00GMTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00GMTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c\x00GMT+0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c\x00GMT+0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda" + - "\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c\x00GMT-0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda" + + "\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c\x00GMT-0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00" + - "o\x00\x00\x00\x04\x00\x1c\x00GMT0UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00" + + "o\x00\x00\x00\x04\x00\x1c\x00GMT0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c" + - "\x00GreenwichUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c" + + "\x00GreenwichUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\b\x00\x1c\x00H" + - "ongkongUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\b\x00\x1c\x00H" + + "ongkongUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5390,11 +5390,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x1c\x00" + - "HSTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x12LMT\x00HKT\x00HKST\x00HKWT\x00JST\x00\nHKT-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x1c\x00" + + "HSTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x1c\x00Iceland" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x1c\x00Iceland" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00" + "\x00\x00\x10\xff\xff\xff\xff\x8b`\x83\xa0\xff\xff\xff\xff\x9c\x91\x1e\x00\xff\xff\xff\xff\x9dш\x90\xff\xff\xff\xff\x9erQ\x80\xff\xff\xff\xff\x9f\xd5\x03\x10\xff\xff\xff\xff\xa0S\x85\x00\xff\xff\xff\xff\xa1\xb66\x90\xff" + "\xff\xff\xff\xa4<'\x80\xff\xff\xff\xff\xa4\xb9t\x10\xff\xff\xff\xff\xc6M\x1a\x00\xff\xff\xff\xff\xc7=' \xff\xff\xff\xff\xc7\xda\x17\xb0\xff\xff\xff\xff\xc9&C\xa0\xff\xff\xff\xff\xc9\xc3& \xff\xff\xff\xff\xcb" + @@ -5407,50 +5407,50 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "3\x82\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x13d\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xf3F\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xd3(\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff" + "\xff\xff\xff\xfc\xbcE \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xeb`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00GMT\x00\nGMT0" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Indian/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x13\x00\x1c\x00Indian/AntananarivoUT\t\x00\x03" + - "\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Indian/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x13\x00\x1c\x00Indian/AntananarivoUT\t\x00\x03" + + "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00" + - "\r\x00\x1c\x00Indian/ComoroUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\n\x00\x00&\xac\x00\x0eLMT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00" + + "\r\x00\x1c\x00Indian/ComoroUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/ChristmasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/ChristmasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffs\x16\xa9\xe4\x01\x00\x00c\x1c\x00\x00" + - "\x00\x00bp\x00\x04LMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qa\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Indian/" + - "MaheUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00bp\x00\x04LMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQa\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Indian/" + + "MaheUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x89\u007f\a\x84\x01\x00\x003\xfc\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcd" + - "\xb2\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x1c\x00Indian/CocosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff\x89\u007f\a\x84\x01\x00\x003\xfc\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcd" + + "\xb2\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x1c\x00Indian/CocosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\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|U&\xa4\x01\x00\x00Z\xdc\x00\x00\x00\x00[h\x00\x04LMT\x00+0630" + - "\x00\n<+0630>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x1c\x00Indian/Maldives" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\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<+0630>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x1c\x00Indian/Maldives" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/KerguelenUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_u" + + "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/KerguelenUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdaab\x80\x01\x00\x00" + - "\x00\x00\x00\x00\x00\x00FP\x00\x04-00\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x1c\x00Ind" + - "ian/MauritiusUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00FP\x00\x04-00\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x1c\x00Ind" + + "ian/MauritiusUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00\xb8K\x97Qx\xb0W\x14\x98\x00" + - "\x00\x00\x98\x00\x00\x00\r\x00\x1c\x00Indian/ChagosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQx\xb0W\x14\x98\x00" + + "\x00\x00\x98\x00\x00\x00\r\x00\x1c\x00Indian/ChagosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Indian/" + - "MayotteUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\bLMT\x00+05\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Indian/" + + "MayotteUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "y(\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Indian/ReunionUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "y(\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Indian/ReunionUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\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\x91\xcc9\x80\x01\x00\x004\x00\x00\x00\x00\x008@\x00\x04LMT\x00+0" + - "4\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x1c\x00IranUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux" + + "4\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x1c\x00IranUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff" + "\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft-@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\x00\x00\x00\x00\x12EJ\xb8\x00\x00\x00\x00\x137\xec\xc8" + @@ -5484,8 +5484,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\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\x00\x000" + "8\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00FP\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00+04\x00+0430" + - "\x00\n<+0330>-3:30<+0430>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17✳2\x04\x00\x002" + - "\x04\x00\x00\x06\x00\x1c\x00IsraelUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\n<+0330>-3:30<+0430>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17✳2\x04\x00\x002" + + "\x04\x00\x00\x06\x00\x1c\x00IsraelUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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" + @@ -5503,24 +5503,24 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "M\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\x00IS" + - "T\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q%J\xd5\xebS\x01\x00\x00S\x01\x00" + - "\x00\a\x00\x1c\x00JamaicaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ%J\xd5\xebS\x01\x00\x00S\x01\x00" + + "\x00\a\x00\x1c\x00JamaicaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "\x00KMT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x1c\x00JapanUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00KMT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x1c\x00JapanUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x1c\x00KwajaleinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x1c\x00KwajaleinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q_\u007f2[\xaf" + - "\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x1c\x00LibyaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ_\u007f2[\xaf" + + "\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x1c\x00LibyaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -5528,7 +5528,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\x003" + "D6p\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\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00METUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00METUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5539,24 +5539,24 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Mexico/UT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x1c\x00Mexico/B" + - "ajaSurUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Mexico/UT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x1c\x00Mexico/B" + + "ajaSurUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT" + - "\x00MST\x00CST\x00PST\x00MDT\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xe1Հ\x9c" + - "\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c\x00Mexico/GeneralUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00MST\x00CST\x00PST\x00MDT\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xe1Հ\x9c" + + "\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c\x00Mexico/GeneralUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\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\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01" + - "\x10LMT\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0" + - "v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00Mexico/BajaNorteUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\x10LMT\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0" + + "v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00Mexico/BajaNorteUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\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\xf6\x80\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ؑ" + @@ -5574,10 +5574,10 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00MSTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00MSTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x01\x00\x00\x00\x04\xff\xff\x9d\x90\x00\x00MST\x00\nMST7\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe6h\xcac\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00MST7MDTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe6h\xcac\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00MST7MDTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + "\x00\x00\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" + @@ -5594,7 +5594,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\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\n\x00\x00\x00" + - "\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x1c\x00NavajoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x1c\x00NavajoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5612,8 +5612,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "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\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\nMST7M" + - "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x1c\x00NZUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x1c\x00NZUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -5630,8 +5630,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "`\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\x00NZS" + - "T\x00NZMT\x00NZDT\x00\nNZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xc5FF(" + - "\x03\x00\x00(\x03\x00\x00\a\x00\x1c\x00NZ-CHATUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00NZMT\x00NZDT\x00\nNZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xc5FF(" + + "\x03\x00\x00(\x03\x00\x00\a\x00\x1c\x00NZ-CHATUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5645,12 +5645,12 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "`\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>-12:45<+1345>,M9.5.0/2:4" + - "5,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00Pacific/UT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/Wa" + - "llisUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "5,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00Pacific/UT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/Wa" + + "llisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\b\xa8\x01\x00\x00\xacX\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x1c\x00Pacific/EasterUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\b\xa8\x01\x00\x00\xacX\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x1c\x00Pacific/EasterUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + "if3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00f\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" + @@ -5669,45 +5669,45 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\xc0\x00\x00\x00\x00\\\xa9g\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\xff\xff\x99x\x00\x00\xff\xff\x99" + "x\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x1c\x00Pacific/Ga" + - "mbierUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "M9.1.6/22,M4.1.6/22\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x1c\x00Pacific/Ga" + + "mbierUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81" + - "\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x1c\x00Pacific/NiueUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81" + + "\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x1c\x00Pacific/NiueUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~7TL\xff\xff\xff\xff\xdcC5`\x00\x00\x00\x00\x10t\xca8\x01\x02\x03\xff\xff`" + "\xb4\x00\x00\xff\xff`\xa0\x00\x04\xff\xff^H\x00\n\xff\xffeP\x00\x10LMT\x00-1120\x00-1130\x00-11\x00\n<-11>11\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\v\x00\x1c\x00Pacific/YapUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\v\x00\x1c\x00Pacific/YapUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff" + "\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00" + - "+09\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x1c\x00Pacific/Bougainv" + - "illeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "+09\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x1c\x00Pacific/Bougainv" + + "illeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x1c\x00Pacific/PohnpeiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x00\x00T\x8a\x9eQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x1c\x00Pacific/PohnpeiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x10\xff\xff\xff\xff\x14\xe1\xb9,\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0" + - "\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00" + - "\x00\x00\xc3\x00\x00\x00\f\x00\x1c\x00Pacific/TrukUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00" + + "\x00\x00\xc3\x00\x00\x00\f\x00\x1c\x00Pacific/TrukUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff" + "\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10" + - ">-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/TarawaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + ">-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/TarawaUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\r\x00\x1c" + - "\x00Pacific/ChuukUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\xa24\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\r\x00\x1c" + + "\x00Pacific/ChuukUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff" + "\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10>-10\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x1c\x00Pacific/PalauUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x1c\x00Pacific/PalauUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xc5FF(\x03\x00\x00(\x03" + - "\x00\x00\x0f\x00\x1c\x00Pacific/ChathamUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xc5FF(\x03\x00\x00(\x03" + + "\x00\x00\x0f\x00\x1c\x00Pacific/ChathamUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5721,46 +5721,46 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "C>\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>-12:45<+1345>,M9.5.0/" + - "2:45,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x1c\x00Pacific/Funaf" + - "utiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "2:45,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x1c\x00Pacific/Funaf" + + "utiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\f\xfc\x01\x00\x00\xa8\x04\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QY" + - "5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x1c\x00Pacific/NorfolkUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\f\xfc\x01\x00\x00\xa8\x04\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQY" + + "5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x1c\x00Pacific/NorfolkUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0e\x00\x1c\x00Pacific/PonapeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + ".0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0e\x00\x1c\x00Pacific/PonapeUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10\xff\xff\xff\xff\x14\xe1\xb9," + "\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00" + "\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x1c\x00Pacific/Pago_PagoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x1c\x00Pacific/Pago_PagoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00" + - "\x1c\x00Pacific/FakaofoUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xb1x\x00\x00\xff\xff_\xf8\x00\x00\xff\xffeP\x00\x04LMT\x00SST\x00\nSST11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00" + + "\x1c\x00Pacific/FakaofoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x1c\x00Pacific/Noum" + - "eaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "-11\x00+13\x00\n<+13>-13\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x1c\x00Pacific/Noum" + + "eaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18D" + - "p\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\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x1c\x00Pacific/KosraeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "p\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\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x1c\x00Pacific/KosraeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\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\xffGL" + "\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>-1" + - "1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x1c\x00Pacific/PitcairnUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x1c\x00Pacific/PitcairnUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nLMT\x00-0830\x00-08\x00\n<-08>8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Qn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x1c\x00Pacific/Port_MoresbyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x005DB\b\x01\x02\xff\xff\x86\f\x00\x00\xff\xff\x88x\x00\x04\xff\xff\x8f\x80\x00\nLMT\x00-0830\x00-08\x00\n<-08>8\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x1c\x00Pacific/Port_MoresbyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13" + - "\x04\x00\x00\x13\x04\x00\x00\x10\x00\x1c\x00Pacific/AucklandUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13" + + "\x04\x00\x00\x13\x04\x00\x00\x10\x00\x1c\x00Pacific/AucklandUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\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" + @@ -5778,113 +5778,113 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "x`\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-12NZD" + - "T,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x1c\x00Pacific/Guad" + - "alcanalUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x1c\x00Pacific/Guad" + + "alcanalUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00\x00\x11\x00\x1c\x00Pacific/EnderburyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\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\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00\x00\x11\x00\x1c\x00Pacific/EnderburyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\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~7Ud\x00\x00\x00\x00\x12V\x04\xc0\x00\x00\x00\x00/" + "\x059\xb0\x01\x02\x03\xff\xff_\x9c\x00\x00\xff\xffW@\x00\x04\xff\xffeP\x00\b\x00\x00\xb6\xd0\x00\fLMT\x00-12\x00-11\x00+13\x00\n<+13>-13\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Pacific/TahitiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Pacific/TahitiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x94PU\xb8\x01\xff\xffs\xc8\x00\x00\xff\xff" + - "s`\x00\x04LMT\x00-10\x00\n<-10>10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/J" + - "ohnstonUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "s`\x00\x04LMT\x00-10\x00\n<-10>10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/J" + + "ohnstonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x1c\x00Pacific/Majuro" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x1c\x00Pacific/Majuro" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~6\x14\x80\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\xcf=Gp\xff\xff\xff\xff\xff\x86\x1bP\x01" + "\x02\x01\x03\x02\x01\x04\x00\x00\xa0\x80\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<+1" + - "2>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x1c\x00Pacific/MidwayUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "2>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x1c\x00Pacific/MidwayUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x85v" + - "\xf8\x8c\x87\x01\x00\x00\x87\x01\x00\x00\x11\x00\x1c\x00Pacific/RarotongaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x85v" + + "\xf8\x8c\x87\x01\x00\x00\x87\x01\x00\x00\x11\x00\x1c\x00Pacific/RarotongaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff~7J\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\xc8" + "w\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\x03\x02\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\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\n\x00\x00\x00\x00\x00\xb8K\x97QFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x1c\x00" + - "Pacific/GuamUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x0eLMT\x00-1030\x00-10\x00-0930\x00\n<-10>10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x1c\x00" + + "Pacific/GuamUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xef" + "6\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\x10" + - "LMT\x00GST\x00+09\x00GDT\x00ChST\x00\nChST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x1c\x00" + - "Pacific/TongatapuUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "LMT\x00GST\x00+09\x00GDT\x00ChST\x00\nChST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x1c\x00" + + "Pacific/TongatapuUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6\a\xb8\xff\xff\xff\xff\xc9sB\x90\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-13\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v" + - "\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/HonoluluUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v" + + "\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/HonoluluUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcb" + "\x89=\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\xff" + - "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92" + - "\x00\x00\x00\r\x00\x1c\x00Pacific/SamoaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92" + + "\x00\x00\x00\r\x00\x1c\x00Pacific/SamoaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x04L" + - "MT\x00SST\x00\nSST11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe2;Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x1c\x00Pacific/NauruUT\t" + - "\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "MT\x00SST\x00\nSST11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe2;Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x1c\x00Pacific/NauruUT\t" + + "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x0e" + - "LMT\x00+1130\x00+09\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x1c\x00Pa" + - "cific/FijiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "LMT\x00+1130\x00+09\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x1c\x00Pa" + + "cific/FijiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\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\x00MrA\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[ݩ\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<+13>,M11.2.0,M1.2.3/99\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe9\xdd\x1e\xee\f\x01\x00\x00\f" + - "\x01\x00\x00\f\x00\x1c\x00Pacific/ApiaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "+12\x00\n<+12>-12<+13>,M11.2.0,M1.2.3/99\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe9\xdd\x1e\xee\f\x01\x00\x00\f" + + "\x01\x00\x00\f\x00\x1c\x00Pacific/ApiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x04\x03\x04\x03\x06\x05\x00\x00\xb0\x80\x00\x00\xff\xff_\x00\x00\x00\xff\xff^H\x00\x04\xff\xffs`\x01\n\xff\xff" + "eP\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<+14>,M9." + - "5.0/3,M4.1.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x1c\x00Pacific/Kiritim" + - "atiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "5.0/3,M4.1.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x1c\x00Pacific/Kiritim" + + "atiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x1c\x00Pacif" + - "ic/WakeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00-1040\x00-10\x00+14\x00\n<+14>-14\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x1c\x00Pacif" + + "ic/WakeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x18\xcc\x01\x00\x00\x9c4\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x1c\x00Pacific/KwajaleinUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\x00\x01\x00\x00\x00\x02\x00\x00\x00\b\xff\xff\xff\xff~6\x18\xcc\x01\x00\x00\x9c4\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x1c\x00Pacific/KwajaleinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QFI\xfe" + - "\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x1c\x00Pacific/SaipanUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "@\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\n\x00\x00\x00\x00\x00T\x8a\x9eQFI\xfe" + + "\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x1c\x00Pacific/SaipanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97QD" + - "6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x1c\x00Pacific/MarquesasUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\n\x00\x00\x00\x00\x00T\x8a\x9eQD" + + "6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x1c\x00Pacific/MarquesasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x1c\x00Pacific/Gal" + - "apagosUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "-0930\x00\n<-0930>9:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x1c\x00Pacific/Gal" + + "apagosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x1c\x00P" + - "acific/EfateUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xb0\x01\x04\xff\xff\xab\xa0\x00\bLMT\x00-05\x00-06\x00\n<-06>6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x1c\x00P" + + "acific/EfateUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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$+\u007f@\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\b" + - "LMT\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x1c\x00PolandUT" + - "\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "LMT\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x1c\x00PolandUT" + + "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5899,8 +5899,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00W" + - "MT\x00CEST\x00CET\x00EEST\x00EET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\b\x00\x1c\x00PortugalUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "MT\x00CEST\x00CET\x00EEST\x00EET\x00\nCET-1CEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\b\x00\x1c\x00PortugalUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8b\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\u007frp\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" + @@ -5925,15 +5925,15 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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\x00WEMT\x00CET\x00CEST\x00\nWET0WEST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x1c\x00PRCUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x1c\x00PRCUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xd5" + "E\"\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\n\x00\x00\x00\x00\x00\xb8K\x97QŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00PST8P" + - "DTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\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\x80\x00\bLMT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00PST8P" + + "DTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5949,8 +5949,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\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\x00PST\x00PWT\x00PPT\x00\nPS" + - "T8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x1c\x00ROCUT\t\x00\x03\xfc" + - "\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x1c\x00ROCUT\t\x00\x03`" + + "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -5959,20 +5959,20 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x1c\x00ROKUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00T\x8a\x9eQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x1c\x00ROKUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x8f" + "p\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\x0fR" + "x\xff\xff\xff\xff\xea\xc7\xd6h\xff\xff\xff\xff\xeb\xef4x\xff\xff\xff\xff째h\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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x1c\x00SingaporeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\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\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x1c\x00SingaporeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf5\b\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x1c\x00TurkeyUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2" + + "08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x1c\x00TurkeyUT\t\x00\x03`\xa8\xec_`\xa8\xec" + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -5993,14 +5993,14 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UCTUT\t\x00\x03\xfc\xff\xe2_\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "03\x00+04\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UCTUT\t\x00\x03`\xa8\xec_`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00UT" + - "C\x00\nUTC0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00UniversalUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "C\x00\nUTC0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00UniversalUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x1c\x00US/UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x1c\x00US/PacificUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "\nUTC0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x1c\x00US/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x1c\x00US/PacificUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfe" + @@ -6022,13 +6022,13 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x1c\x00US/HawaiiUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\xff\x9d\x90\x01\x10LMT\x00PDT\x00PST\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x1c\x00US/HawaiiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcb" + "\x89=\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\xff" + - "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x9aG\xc8\xd0\x06\x00\x00\xd0" + - "\x06\x00\x00\n\x00\x1c\x00US/EasternUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x9aG\xc8\xd0\x06\x00\x00\xd0" + + "\x06\x00\x00\n\x00\x1c\x00US/EasternUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -6057,8 +6057,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x1c\x00US/CentralUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZi" + + "\xff\xc7\xc0\x01\x10LMT\x00EDT\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x1c\x00US/CentralUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + @@ -6088,13 +6088,13 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xb8K\x97Qø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x1c\x00US/ArizonaUT\t\x00\x03\xfc\xff\xe2_" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + ".0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x1c\x00US/ArizonaUT\t\x00\x03`\xa8\xec_" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x1c\x00US/East-Ind" + - "ianaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00MDT\x00MST\x00MWT\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x1c\x00US/East-Ind" + + "ianaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -6103,8 +6103,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00E" + "DC`\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\n" + - "EST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x1c\x00US/Indi" + - "ana-StarkeUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "EST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x1c\x00US/Indi" + + "ana-StarkeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -6121,11 +6121,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x00CW" + - "T\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00" + - "\b\x00\x1c\x00US/SamoaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "T\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00" + + "\b\x00\x1c\x00US/SamoaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + - "SST11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x1c\x00US/MountainUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_" + + "SST11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x1c\x00US/MountainUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -6143,8 +6143,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q5\x11Q\x06\xd1\x03\x00\x00\xd1" + - "\x03\x00\x00\t\x00\x1c\x00US/AlaskaUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ5\x11Q\x06\xd1\x03\x00\x00\xd1" + + "\x03\x00\x00\t\x00\x1c\x00US/AlaskaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04" + @@ -6161,7 +6161,7 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x00A" + "ST\x00AWT\x00APT\x00AHST\x00AHDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x1c\x00US/MichiganUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x1c\x00US/MichiganUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + "\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -6177,8 +6177,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "`\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\nEST5EDT,M3.2.0" + - ",M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x1c\x00US/AleutianUT\t\x00\x03\xfc\xff\xe2_\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + ",M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x1c\x00US/AleutianUT\t\x00\x03`\xa8\xec_`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -6194,11 +6194,11 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\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\x00HD" + - "T\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UTC" + - "UT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\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\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UTC" + + "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xb8K\x97Q2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x1c\x00WETUT\t\x00\x03\xfc\xff\xe2" + - "_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x04\x00\x00\x00\x00\x00\x00UTC\x00\nUTC0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x1c\x00WETUT\t\x00\x03`\xa8\xec" + + "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -6206,8 +6206,8 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\x00\x00\x00#\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" + @@ -6222,868 +6222,868 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\ "\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\x15L" + - "MT\x00MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f." + - "\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x1c\x00ZuluUT\t\x00\x03\xfc\xff\xe2_\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "MT\x00MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f." + + "\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x1c\x00ZuluUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x00\x00\x00\x00Africa/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81A\x00\x00\x00Africa/FreetownUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\f\x01\x00\x00Africa/KinshasaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\x02\x00\x00Africa/LagosUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\x03\x00\x00Africa/J" + - "ohannesburgUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83" + - "\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\x04\x00\x00Africa/BujumburaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\x04\x00\x00Africa/Kigali" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81\xa5\x05\x00\x00Africa/ConakryUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o\x06\x00\x00Africa/El_AaiunUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde\r\x00\x00A" + - "frica/KhartoumUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f\x1b\xeb\xdd2\x02" + - "\x00\x002\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\x0f\x00\x00Africa/CeutaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x12\x00\x00Africa/TunisUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81p\x14\x00\x00Africa/BrazzavilleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Qd\x01\x05\x89\u007f\a\x00\x00\u007f\a\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x15\x00\x00Africa/CasablancaUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:" + - "\x1d\x00\x00Africa/MbabaneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q6\x99r" + - "U\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81@\x1e\x00\x00Africa/MonroviaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\x1f\x00\x00Africa/N" + - "iameyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81( \x00\x00Africa/DakarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0 \x00\x00Africa/TripoliUT\x05\x00\x03\xfc\xff\xe2_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7\"\x00" + - "\x00Africa/NdjamenaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c" + - "\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd0#\x00\x00Africa/DoualaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcb$\x00\x00Africa/Algi" + - "ersUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9&\x00\x00Africa/DjiboutiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1'\x00\x00Africa/Sao_TomeUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7" + - "(\x00\x00Africa/AbidjanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0" + - "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1)\x00\x00Africa/MaputoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{*\x00\x00Africa/Cai" + - "roUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\v\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xbd/\x00\x00Africa/LomeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x840\x00\x00Africa/BamakoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M1\x00\x00Afri" + - "ca/AsmaraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00" + - "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S2\x00\x00Africa/LibrevilleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81R3\x00\x00Africa/Blantyr" + - "eUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\x1e4\x00\x00Africa/WindhoekUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe56\x00\x00Africa/HarareUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf7\x00\x00A" + - "frica/AsmeraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00" + - "\x83\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb58\x00\x00Africa/LubumbashiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x839\x00\x00Africa/Port" + - "o-NovoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82:\x00\x00Africa/TimbuktuUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M;\x00\x00Africa/KampalaUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81T<\x00\x00Africa/NairobiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc" + - "\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[=\x00\x00Africa/MaseruUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`>\x00\x00Africa/O" + - "uagadougouUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00" + - "\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81.?\x00\x00Africa/LusakaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8?\x00\x00Africa/MogadishuU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\x01A\x00\x00Africa/GaboroneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdA\x00\x00Africa/BanjulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96B\x00\x00Afr" + - "ica/MalaboUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00" + - "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91C\x00\x00Africa/Addis_AbabaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9cD\x00\x00Africa/Nouak" + - "chottUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81iE\x00\x00Africa/LuandaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dF\x00\x00Africa/JubaUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81jH\x00\x00A" + - "frica/AccraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf" + - "\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81lK\x00\x00Africa/Dar_es_SalaamUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81yL\x00\x00Africa/Bi" + - "ssauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81UM\x00\x00Africa/BanguiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAPN\x00\x00America/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92N\x00\x00Ameri" + - "ca/Grand_TurkUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00" + - "\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813R\x00\x00America/St_VincentUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01S\x00\x00America/S" + - "t_KittsUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\b\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdS\x00\x00America/BarbadosUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8f\x19Ԇ\x12\x02\x00\x00\x12\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfeT\x00\x00America/Bahia_Ban" + - "derasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`W\x00\x00America/NuukUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wY\x00\x00America/Costa_RicaUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\xabZ\x00\x00America/ManausUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc1" + - "Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\\\x00\x00America/WhitehorseUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0`\x00\x00Ame" + - "rica/CayenneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc0a\x00\x00America/MarigotUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8bb\x00\x00America/Ranki" + - "n_InletUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8de\x00\x00America/Punta_ArenasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94j\x00\x00America/Grena" + - "daUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81_k\x00\x00America/MenomineeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\x15\xc8\xcb\x00\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?o\x00\x00America/GuyanaUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813" + - "p\x00\x00America/Buenos_AiresUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Es\x00\x00America/Port_of_SpainUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\x16t\x00\x00America/MonctonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe9" + - "\x8c\xb4$q\x03\x00\x00q\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814z\x00\x00America/Thunder_BayUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2}\x00\x00Am" + - "erica/Blanc-SablonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q8\xcd" + - "Z\x05o\x01\x00\x00o\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\u007f\x00\x00America/MazatlanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƀ\x00\x00Americ" + - "a/CaymanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00" + - "\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\x81\x00\x00America/DawsonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\x85\x00\x00America/TortolaUT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xbb\x86\x00\x00America/ThuleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\xf7\xe9 y\xbd\x02\x00\x00\xbd\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ɉ\x00\x00America/InuvikUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\u038b\x00\x00Americ" + - "a/North_Dakota/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QR\x1b\x8b(\xde" + + "\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\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x00\x00\x00\x00Africa/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81A\x00\x00\x00Africa/FreetownUT\x05\x00\x03" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\f\x01\x00\x00Africa/KinshasaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\x02\x00\x00Africa/LagosUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\x03\x00\x00Africa/J" + + "ohannesburgUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83" + + "\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\x04\x00\x00Africa/BujumburaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\x04\x00\x00Africa/Kigali" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\xa5\x05\x00\x00Africa/ConakryUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "T\x8a\x9eQ)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o\x06\x00\x00Africa/El_AaiunUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde\r\x00\x00A" + + "frica/KhartoumUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f\x1b\xeb\xdd2\x02" + + "\x00\x002\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\x0f\x00\x00Africa/CeutaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x12\x00\x00Africa/TunisUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81p\x14\x00\x00Africa/BrazzavilleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQd\x01\x05\x89\u007f\a\x00\x00\u007f\a\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x15\x00\x00Africa/CasablancaUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:" + + "\x1d\x00\x00Africa/MbabaneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ6\x99r" + + "U\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81@\x1e\x00\x00Africa/MonroviaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\x1f\x00\x00Africa/N" + + "iameyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81( \x00\x00Africa/DakarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0 \x00\x00Africa/TripoliUT\x05\x00\x03`\xa8\xec_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7\"\x00" + + "\x00Africa/NdjamenaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c" + + "\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd0#\x00\x00Africa/DoualaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcb$\x00\x00Africa/Algi" + + "ersUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9&\x00\x00Africa/DjiboutiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQ\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1'\x00\x00Africa/Sao_TomeUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7" + + "(\x00\x00Africa/AbidjanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0" + + "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1)\x00\x00Africa/MaputoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{*\x00\x00Africa/Cai" + + "roUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\v\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xbd/\x00\x00Africa/LomeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x840\x00\x00Africa/BamakoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M1\x00\x00Afri" + + "ca/AsmaraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00" + + "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S2\x00\x00Africa/LibrevilleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81R3\x00\x00Africa/Blantyr" + + "eUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\x1e4\x00\x00Africa/WindhoekUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe56\x00\x00Africa/HarareUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf7\x00\x00A" + + "frica/AsmeraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00" + + "\x83\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb58\x00\x00Africa/LubumbashiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x839\x00\x00Africa/Port" + + "o-NovoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82:\x00\x00Africa/TimbuktuUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M;\x00\x00Africa/KampalaUT\x05\x00\x03" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81T<\x00\x00Africa/NairobiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc" + + "\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[=\x00\x00Africa/MaseruUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`>\x00\x00Africa/O" + + "uagadougouUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00" + + "\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81.?\x00\x00Africa/LusakaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8?\x00\x00Africa/MogadishuU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\x01A\x00\x00Africa/GaboroneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdA\x00\x00Africa/BanjulUT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96B\x00\x00Afr" + + "ica/MalaboUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00" + + "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91C\x00\x00Africa/Addis_AbabaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9cD\x00\x00Africa/Nouak" + + "chottUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81iE\x00\x00Africa/LuandaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQ%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dF\x00\x00Africa/JubaUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81jH\x00\x00A" + + "frica/AccraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf" + + "\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81lK\x00\x00Africa/Dar_es_SalaamUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81yL\x00\x00Africa/Bi" + + "ssauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81UM\x00\x00Africa/BanguiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAPN\x00\x00America/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92N\x00\x00Ameri" + + "ca/Grand_TurkUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00" + + "\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813R\x00\x00America/St_VincentUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01S\x00\x00America/S" + + "t_KittsUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\b\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdS\x00\x00America/BarbadosUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8f\x19Ԇ\x12\x02\x00\x00\x12\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfeT\x00\x00America/Bahia_Ban" + + "derasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`W\x00\x00America/NuukUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wY\x00\x00America/Costa_RicaUT\x05\x00\x03" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\xabZ\x00\x00America/ManausUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc1" + + "Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\\\x00\x00America/WhitehorseUT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0`\x00\x00Ame" + + "rica/CayenneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00" + + "\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc0a\x00\x00America/MarigotUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8bb\x00\x00America/Ranki" + + "n_InletUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8de\x00\x00America/Punta_ArenasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94j\x00\x00America/Grena" + + "daUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81_k\x00\x00America/MenomineeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\x15\xc8\xcb\x00\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?o\x00\x00America/GuyanaUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813" + + "p\x00\x00America/Buenos_AiresUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Es\x00\x00America/Port_of_SpainUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\x16t\x00\x00America/MonctonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe9" + + "\x8c\xb4$q\x03\x00\x00q\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814z\x00\x00America/Thunder_BayUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2}\x00\x00Am" + + "erica/Blanc-SablonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ8\xcd" + + "Z\x05o\x01\x00\x00o\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\u007f\x00\x00America/MazatlanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƀ\x00\x00Americ" + + "a/CaymanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00" + + "\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\x81\x00\x00America/DawsonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\x85\x00\x00America/TortolaUT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xbb\x86\x00\x00America/ThuleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\xf7\xe9 y\xbd\x02\x00\x00\xbd\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ɉ\x00\x00America/InuvikUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\u038b\x00\x00Americ" + + "a/North_Dakota/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQR\x1b\x8b(\xde" + "\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\x8c\x00\x00America/North_Dakota/New_SalemUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81S\x90\x00\x00America/North_Dakota/CenterUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x86\x94\x00\x00America/North_Dako" + - "ta/BeulahUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b\vKdC\x03\x00\x00C\x03\x00" + - "\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\x98\x00\x00America/Rainy_RiverUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~\x9c\x00\x00America/Atik" + - "okanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\x9d\x00\x00America/Boa_VistaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\x9f\x00\x00America/MartiniqueU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\x9f\xa0\x00\x00America/AdakUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "QU9#\xbe2\x05\x00\x002\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xa4\x00\x00America/VancouverUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\xaa\x00\x00Am" + - "erica/Porto_AcreUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x9aG\xc8" + - "\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\xac\x00\x00America/New_YorkUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\xb3\x00\x00America/" + - "RecifeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_\xb5\x00\x00America/AsuncionUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\xb9\x00\x00America/Port-au-Pr" + - "inceUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\xbb\x00\x00America/MaceioUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\xbd\x00\x00America/BoiseUT\x05\x00\x03\xfc\xff\xe2_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xc2\x00" + - "\x00America/PangnirtungUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\xc5\x00\x00America/GodthabUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\xc7\x00\x00Ameri" + - "ca/NassauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00" + - "\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xcb\x00\x00America/RosarioUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\xce\x00\x00America/St_Barth" + - "elemyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\xcf\x00\x00America/PhoenixUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3\xd0\x00\x00America/SantaremUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xa6\xd2\x00\x00America/MetlakatlaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xd5\x00\x00America/AraguainaUT\x05\x00\x03\xfc\xff\xe2_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\xd7\x00" + - "\x00America/DenverUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4" + - "\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\xdc\x00\x00America/CordobaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?\xc9\x1c\xd4\xc6\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81G\xdf\x00\x00America/Ju" + - "neauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xe3\x00\x00America/OjinagaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xe5\x00\x00America/ScoresbysundU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xaf\xe7\x00\x00America/JujuyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xea\x00\x00America/EnsenadaUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xee\x00\x00Am" + - "erica/TorontoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qn\xab\xd5\xf9\xcf\x03\x00" + - "\x00\xcf\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\xf5\x00\x00America/NomeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06\xfa\x00\x00America/Cambrid" + - "ge_BayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xfd\x00\x00America/CrestonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qq\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\xfe\x00\x00America/Puerto_Rico" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81:\xff\x00\x00America/CatamarcaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\x02\x01\x00America/Coral_HarbourUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x10\x00\xedAx\x03\x01\x00America/Argentina/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Qt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\x03\x01\x00America/Argentina/SaltaU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xc7\x06\x01\x00America/Argentina/Buenos_AiresUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3\t\x01\x00America/Arg" + - "entina/UshuaiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfcz=\xe1\xcd\x02" + - "\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfa\f\x01\x00America/Argentina/San_JuanUT\x05\x00\x03\xfc\xff\xe2_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b\x10\x01\x00" + - "America/Argentina/La_RiojaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x13\x01\x00America/Argentina/San_Lu" + - "isUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81]\x16\x01\x00America/Argentina/Rio_GallegosUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\x19\x01\x00America/" + - "Argentina/CordobaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QutZ" + - "\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\x1c\x01\x00America/Argentina/JujuyUT\x05\x00\x03\xfc\xff\xe2_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\x1f\x01\x00" + - "America/Argentina/CatamarcaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97QR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\"\x01\x00America/Argentina/Comod" + - "RivadaviaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00" + - "\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca%\x01\x00America/Argentina/MendozaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QY\xd8֭\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe1(\x01\x00Americ" + - "a/Argentina/TucumanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x89" + - "غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n,\x01\x00America/BelizeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g0\x01\x00America" + - "/SitkaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j4\x01\x00America/YellowknifeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x907\x01\x00America/Indiana" + - "/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\xda7\x01\x00America/Indiana/VevayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9a9\x01\x00America/Indiana/Vi" + - "ncennesUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QM/U\x9f7\x02\x00\x007\x02\x00\x00\x17" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b<\x01\x00America/Indiana/MarengoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3>\x01\x00America/In" + - "diana/WinamacUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00" + - "\x00\xf8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81XA\x01\x00America/Indiana/KnoxUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9eE\x01\x00America" + - "/Indiana/IndianapolisUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81S\x90\x00\x00America/North_Dakota/CenterUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x86\x94\x00\x00America/North_Dako" + + "ta/BeulahUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b\vKdC\x03\x00\x00C\x03\x00" + + "\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\x98\x00\x00America/Rainy_RiverUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~\x9c\x00\x00America/Atik" + + "okanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\x9d\x00\x00America/Boa_VistaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\x9f\x00\x00America/MartiniqueU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\x9f\xa0\x00\x00America/AdakUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "QU9#\xbe2\x05\x00\x002\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xa4\x00\x00America/VancouverUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\xaa\x00\x00Am" + + "erica/Porto_AcreUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x9aG\xc8" + + "\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\xac\x00\x00America/New_YorkUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\xb3\x00\x00America/" + + "RecifeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_\xb5\x00\x00America/AsuncionUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\xb9\x00\x00America/Port-au-Pr" + + "inceUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\xbb\x00\x00America/MaceioUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQ.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\xbd\x00\x00America/BoiseUT\x05\x00\x03`\xa8\xec_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xc2\x00" + + "\x00America/PangnirtungUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\xc5\x00\x00America/GodthabUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\xc7\x00\x00Ameri" + + "ca/NassauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00" + + "\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xcb\x00\x00America/RosarioUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\xce\x00\x00America/St_Barth" + + "elemyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\xcf\x00\x00America/PhoenixUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3\xd0\x00\x00America/SantaremUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xa6\xd2\x00\x00America/MetlakatlaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "T\x8a\x9eQ<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xd5\x00\x00America/AraguainaUT\x05\x00\x03`\xa8\xec_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\xd7\x00" + + "\x00America/DenverUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4" + + "\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\xdc\x00\x00America/CordobaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?\xc9\x1c\xd4\xc6\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81G\xdf\x00\x00America/Ju" + + "neauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xe3\x00\x00America/OjinagaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xe5\x00\x00America/ScoresbysundU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xaf\xe7\x00\x00America/JujuyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xea\x00\x00America/EnsenadaUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xee\x00\x00Am" + + "erica/TorontoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQn\xab\xd5\xf9\xcf\x03\x00" + + "\x00\xcf\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\xf5\x00\x00America/NomeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06\xfa\x00\x00America/Cambrid" + + "ge_BayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xfd\x00\x00America/CrestonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQq\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\xfe\x00\x00America/Puerto_Rico" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81:\xff\x00\x00America/CatamarcaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\x02\x01\x00America/Coral_HarbourUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x10\x00\xedAx\x03\x01\x00America/Argentina/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\x03\x01\x00America/Argentina/SaltaU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xc7\x06\x01\x00America/Argentina/Buenos_AiresUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3\t\x01\x00America/Arg" + + "entina/UshuaiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfcz=\xe1\xcd\x02" + + "\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfa\f\x01\x00America/Argentina/San_JuanUT\x05\x00\x03`\xa8\xec_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b\x10\x01\x00" + + "America/Argentina/La_RiojaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x13\x01\x00America/Argentina/San_Lu" + + "isUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81]\x16\x01\x00America/Argentina/Rio_GallegosUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\x19\x01\x00America/" + + "Argentina/CordobaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQutZ" + + "\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\x1c\x01\x00America/Argentina/JujuyUT\x05\x00\x03`\xa8\xec_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\x1f\x01\x00" + + "America/Argentina/CatamarcaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\"\x01\x00America/Argentina/Comod" + + "RivadaviaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00" + + "\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca%\x01\x00America/Argentina/MendozaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQY\xd8֭\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe1(\x01\x00Americ" + + "a/Argentina/TucumanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x89" + + "غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n,\x01\x00America/BelizeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g0\x01\x00America" + + "/SitkaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j4\x01\x00America/YellowknifeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x907\x01\x00America/Indiana" + + "/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xda7\x01\x00America/Indiana/VevayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9a9\x01\x00America/Indiana/Vi" + + "ncennesUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQM/U\x9f7\x02\x00\x007\x02\x00\x00\x17" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b<\x01\x00America/Indiana/MarengoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3>\x01\x00America/In" + + "diana/WinamacUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00" + + "\x00\xf8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81XA\x01\x00America/Indiana/KnoxUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9eE\x01\x00America" + + "/Indiana/IndianapolisUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + "QصK\xa6\n\x02\x00\x00\n\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\aH\x01\x00America/Indiana/Tell_CityUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x01\xd8N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81dJ\x01\x00America/Indiana/PetersburgUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81cM\x01\x00America/FortalezaU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\x92O\x01\x00America/AnchorageUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Qk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaeS\x01\x00America/DanmarkshavnUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xbbU\x01\x00America/ReginaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "g\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81X\x01\x00America/AntiguaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81LY\x01\x00Ameri" + - "ca/Porto_VelhoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1e\xfbn۸\x03" + - "\x00\x00\xb8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#[\x01\x00America/Campo_GrandeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)_\x01\x00Americ" + - "a/DominicaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02" + - "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5_\x01\x00America/Fort_WayneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Tb\x01\x00America/Rio_" + - "BrancoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Bd\x01\x00America/TegucigalpaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Qe\x01\x00America/Mexico_" + - "CityUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:g\x01\x00America/TijuanaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84k\x01\x00America/CancunUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdd" + - "m\x01\x00America/Swift_CurrentUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9co\x01\x00America/CuiabaUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8as\x01\x00Am" + - "erica/MendozaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q~\xb2\x0e\x19V\a\x00" + - "\x00V\a\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x97v\x01\x00America/St_JohnsUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x817~\x01\x00America/Mer" + - "idaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\u007f\x01\x00America/ResoluteUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\x82\x01\x00America/ArubaUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\x83" + - "\x01\x00America/HalifaxUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QԾ\xe7" + - "#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[\x8a\x01\x00America/PanamaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818\x8b\x01\x00America/A" + - "nguillaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x04\x8c\x01\x00America/ChicagoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x93\x01\x00America/JamaicaUT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81Ô\x01\x00America/IndianapolisUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\x97\x01\x00America/CaracasUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\x98" + - "\x01\x00America/LimaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QB\xa0=:\x1e\x01" + - "\x00\x00\x1e\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\x99\x01\x00America/HermosilloUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\x9a\x01\x00America/" + - "BelemUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ǜ\x01\x00America/Glace_BayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xa0\x01\x00America/Guadeloupe" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81P\xa1\x01\x00America/ShiprockUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97QU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xa5\x01\x00America/MatamorosUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6@\rm\xa8\x05\x00\x00\xa8\x05\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac" + - "\xa7\x01\x00America/Fort_NelsonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97QOKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\xad\x01\x00America/BahiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\xb0\x01\x00Ameri" + - "ca/Goose_BayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00" + - "\x97\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\xb7\x01\x00America/KralendijkUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xec\xb7\x01\x00America/Sa" + - "nta_IsabelUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02" + - "\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xbc\x01\x00America/IqaluitUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81h\xbf\x01\x00America/Edmonto" + - "nUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81|\xc3\x01\x00America/BogotaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\xc4\x01\x00America/GuatemalaUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96\xc5" + - "\x01\x00America/DetroitUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\x1b\xce" + - "RC\x03\x00\x00C\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b\xc9\x01\x00America/NipigonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\xcc\x01\x00America/" + - "MontserratUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7\b\\\xc6&\x02\x00\x00&\x02" + - "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbc\xcd\x01\x00America/MiquelonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,\xd0\x01\x00America/Sao_Pa" + - "uloUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x10\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\xd4\x01\x00America/SantiagoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xd9\x01\x00America/Knox_INUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xbc\xdd\x01\x00America/La_PazUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19v" + - "v\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xde\x01\x00America/Lower_PrincesUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94\xdf\x01\x00A" + - "merica/ChihuahuaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?_p\x99" + - "\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\xe1\x01\x00America/WinnipegUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b\xe6\x01\x00America/" + - "ParamariboUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00" + - "\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\xe7\x01\x00America/GuayaquilUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\xe8\x01\x00America/St_Th" + - "omasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\xe9\x01\x00America/MontevideoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\xed\x01\x00America/St_LuciaUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81>\xee\x01\x00America/YakutatUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\xf2\x01\x00America/AtkaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81H\xf6\x01\x00Ameri" + - "ca/El_SalvadorUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7-2f\xe4\x01" + - "\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xf7\x01\x00America/NoronhaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\xf9\x01\x00America/Man" + - "aguaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xfa\x01\x00America/Los_AngelesUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\x00\x02\x00America/EirunepeU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81;\x02\x02\x00America/Dawson_CreekUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814\x05\x02\x00America/LouisvilleUT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81Z\n\x02\x00America/CuracaoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97QMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\v\x02\x00America/MonterreyUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xaa\f\x02\x00A" + - "merica/Kentucky/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03\x1a|J" + - "\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5\f\x02\x00America/Kentucky/MonticelloUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16" + - "\x11\x02\x00America/Kentucky/LouisvilleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\x16\x02\x00America/HavanaUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xea\x1a\x02\x00America/MontrealUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "g\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9!\x02\x00America/VirginUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb3\"\x02\x00Americ" + - "a/Santo_DomingoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA?$\x02\x00Antarctica/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84$\x02\x00Antarctica/Dum" + - "ontDUrvilleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\r\x0e\xf20\x85\x00\x00\x00\x85" + - "\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o%\x02\x00Antarctica/SyowaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>&\x02\x00Antarctica/Da" + - "visUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81M'\x02\x00Antarctica/PalmerUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0f+\x02\x00Antarctica/MawsonUT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xf2+\x02\x00Antarctica/RotheraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2,\x02\x00Antarctica/VostokUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92-" + - "\x02\x00Antarctica/South_PoleUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf41\x02\x00Antarctica/TrollUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef2\x02\x00A" + - "ntarctica/CaseyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\x84J]\xd0" + - "\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,4\x02\x00Antarctica/MacquarieUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81J8\x02\x00Antar" + - "ctica/McMurdoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xa9<\x02\x00Arctic/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea<\x02\x00Arctic/LongyearbyenU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x10\x00\xedA\xdb?\x02\x00Asia/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\t\xfa-\a\x03" + - "\x00\x00\a\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a@\x02\x00Asia/Hong_KongUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81iC\x02\x00Asia/MuscatU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x813D\x02\x00Asia/TaipeiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wF\x02\x00Asia/QatarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81SG\x02\x00Asia/Nicos" + - "iaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xeeI\x02\x00Asia/GazaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeeN\x02\x00Asia/BarnaulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%R\x02\x00Asia/Sa" + - "markandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdbS\x02\x00Asia/BakuUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97QѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06W\x02\x00Asia/TbilisiUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1Y\x02\x00As" + - "ia/RiyadhUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qʇ{_\xbb\x00\x00\x00\xbb\x00\x00" + - "\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8bZ\x02\x00Asia/RangoonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97QO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c[\x02\x00Asia/YakutskUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7" + - "^\x02\x00Asia/IstanbulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd5ΜG" + - "p\x02\x00\x00p\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaec\x02\x00Asia/QyzylordaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ff\x02\x00Asia/Khand" + - "ygaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4i\x02\x00Asia/KathmanduUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9dj\x02\x00Asia/ChongqingUT\x05\x00\x03\xfc\xff\xe2_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81nl\x02" + - "\x00Asia/Ho_Chi_MinhUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q0]*" + - "\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4m\x02\x00Asia/BishkekUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Tp\x02\x00Asia/Qostan" + - "ayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x02s\x02\x00Asia/KabulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5s\x02\x00Asia/TomskUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1aw\x02\x00Asia/Mac" + - "auUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81uz\x02\x00Asia/Ust-NeraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf}\x02\x00Asia/YerevanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ɀ\x02\x00Asi" + - "a/VientianeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qd%\x05\xd8\xe6\x02\x00\x00\xe6" + - "\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9\x81\x02\x00Asia/VladivostokUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ل\x02\x00Asia/BeirutUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xfa\x87\x02\x00Asia/DaccaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\xea" + - "\x18\xd4\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\x89\x02\x00Asia/YekaterinburgUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q6j\\J\xcf\x04\x00\x00\xcf\x04\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x8c\x02\x00Asia" + - "/HebronUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}\x91\x02\x00Asia/ThimphuUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Qj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\x92\x02\x00Asia/ThimbuUT\x05\x00\x03\xfc\xff\xe2_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x93\x02\x00" + - "Asia/SakhalinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81z&\x80k\x02\x00" + - "\x00k\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\x96\x02\x00Asia/ChoibalsanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*\x99\x02\x00Asia/SeoulUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\r\x9b\x02\x00Asia/MakassarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x12\x9c\x02\x00Asia/DubaiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ۜ\x02\x00Asia/Alma" + - "tyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x81\x9f\x02\x00Asia/Ulan_BatorUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1c\xa2\x02\x00Asia/SaigonUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xa3\x02\x00As" + - "ia/DhakaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q.>[K\xab\x00\x00\x00\xab\x00\x00\x00" + - "\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81x\xa4\x02\x00Asia/JayapuraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xa5\x02\x00Asia/PyongyangUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81i\xa6\x02\x00Asia/Kuala_LumpurUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xa7\x02\x00Asia/ChungkingUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xa9\x02\x00Asia" + - "/AqtobeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x811\xac\x02\x00Asia/ChitaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81c\xaf\x02\x00Asia/ColomboUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xb0\x02\x00A" + - "sia/MacaoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00" + - "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xb3\x02\x00Asia/SrednekolymskUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\xb7\x02\x00Asia/BaghdadU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qe\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xe9\xb9\x02\x00Asia/AshgabatUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xbb\x02\x00Asia/KamchatkaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƾ\x02\x00Asia" + - "/BahrainUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00" + - "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xbf\x02\x00Asia/BangkokUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xc0\x02\x00Asia/KarachiUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xc1" + - "\x02\x00Asia/TashkentUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85" + - "\x00\x00\x00\x85\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\xc3\x02\x00Asia/AdenUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\xc4\x02\x00Asia/OmskUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w" + - "\xc7\x02\x00Asia/Phnom_PenhUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17\xe2" + - "\x9c\xb32\x04\x00\x002\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\xc8\x02\x00Asia/JerusalemUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xcc\x02\x00Asia/Mag" + - "adanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xd0\x02\x00Asia/JakartaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xd1\x02\x00Asia/NovokuznetskUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f" + - "\xd4\x02\x00Asia/OralUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q)p\x1cX\xf1\x02\x00\x00" + - "\xf1\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a\xd7\x02\x00Asia/NovosibirskUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xda\x02\x00Asia/Damascu" + - "sUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\xb3\xde\x02\x00Asia/Ujung_PandangUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd\xdf\x02\x00Asia/FamagustaUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1" + - "\xe3\x02\x00Asia/YangonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xceG|\xea\x13\x03" + - "\x00\x00\x13\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\xe4\x02\x00Asia/AmmanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\b\xe8\x02\x00Asia/TokyoUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "!\xe9\x02\x00Asia/AnadyrUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q;\u007fP\x8d\xd4" + - "\a\x00\x00\xd4\a\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xec\x02\x00Asia/TehranUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xf4\x02\x00Asia/Singapore" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qy\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81\xae\xf5\x02\x00Asia/BruneiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8d\xf6\x02\x00Asia/UrumqiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\xf7\x02\x00Asia/Dil" + - "iUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81D\xf8\x02\x00Asia/AshkhabadUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\xb8K\x97QL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\xfa\x02\x00Asia/KrasnoyarskUT\x05\x00\x03\xfc\xff\xe2_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x812\xfd\x02" + - "\x00Asia/AtyrauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QT\x81\x18G^\x02\x00\x00" + - "^\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdf\xff\x02\x00Asia/AqtauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81\x02\x03\x00Asia/HarbinUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O" + - "\x04\x03\x00Asia/KuwaitUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\x1a\xdc\xca\xdc\x00" + - "\x00\x00\xdc\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\x05\x03\x00Asia/CalcuttaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x06\x03\x00Asia/ManilaUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81o\a\x03\x00Asia/DushanbeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\t\x03\x00Asia/Tel_AvivUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\r\x03\x00Asia/U" + - "laanbaatarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02" + - "\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\x10\x03\x00Asia/IrkutskUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\x13\x03\x00Asia/ShanghaiUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81G\x15\x03\x00Asia/KatmanduUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xba\xa3" + - "b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\x16\x03\x00Asia/HovdUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\x18\x03\x00Asia/KolkataU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xe6\x19\x03\x00Asia/KashgarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "QS\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\x1a\x03\x00Asia/PontianakUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\x1b\x03\x00Asia/" + - "KuchingUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAv\x1d\x03\x00Atlantic/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\u0097N\xad\xaf\x00\x00\x00\xaf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\x1d\x03\x00Atlantic/Cape_VerdeUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\xb5\x1e\x03\x00Atlantic/FaroeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5" + - "\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6 \x03\x00Atlantic/Jan_MayenUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6#\x03\x00Atl" + - "antic/ReykjavikUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xaf|7\xb3\xde" + - "\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3&\x03\x00Atlantic/CanaryUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n)\x03\x00Atlantic/S" + - "t_HelenaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00" + - "\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8)\x03\x00Atlantic/MadeiraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd/\x03\x00Atlantic/South_G" + - "eorgiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x910\x03\x00Atlantic/FaeroeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe7\xcf^\xb0\x15\x03\x00\x00\x15\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x932\x03\x00Atlantic/StanleyUT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xf25\x03\x00Atlantic/AzoresUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Ql&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6;\x03\x00Atlantic/BermudaUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA @\x03\x00Au" + - "stralia/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qϻ\xca\x1a2\x01\x00\x002\x01\x00\x00" + - "\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81d@\x03\x00Australia/PerthUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdfA\x03\x00Australia/LHIUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xdaD\x03\x00Australia/YancowinnaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5H\x03\x00Australia/Broken_HillUT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xd1L\x03\x00Australia/WestUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81KN\x03\x00Australia/DarwinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u007fO\x03\x00Aus" + - "tralia/AdelaideUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa2ܺ\xca:" + - "\x01\x00\x00:\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dS\x03\x00Australia/EuclaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7T\x03\x00Australia/" + - "MelbourneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00" + - "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbcX\x03\x00Australia/CanberraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\\\x03\x00Australia/Bri" + - "sbaneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd]\x03\x00Australia/Lord_HoweUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe`\x03\x00Australia/Victor" + - "iaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xd2d\x03\x00Australia/HobartUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\ai\x03\x00Australia/LindemanUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\x98j\x03\x00Australia/CurrieUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdn\x03\x00Australia/NorthUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00p\x03\x00Aus" + - "tralia/QueenslandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9a" + - "p\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81oq\x03\x00Australia/NSWUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>u\x03\x00Australia/" + - "ACTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\ry\x03\x00Australia/TasmaniaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D}\x03\x00Australia/SouthUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81&\x81\x03\x00Australia/SydneyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xf8\x84\x03\x00Brazil/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\x85\x03\x00Brazil/West" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81\x1a\x87\x03\x00Brazil/AcreUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01\x89\x03\x00Brazil/DeNoronhaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\x8b\x03\x00Bra" + - "zil/EastUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA,\x8f\x03\x00Canada/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\u0096dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81m\x8f\x03\x00Canada/SaskatchewanUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QU9#\xbe2\x05\x00\x002\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "8\x92\x03\x00Canada/PacificUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qӿ" + - "\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb2\x97\x03\x00Canada/EasternUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\x9e\x03\x00Canada/A" + - "tlanticUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x80\xa5\x03\x00Canada/NewfoundlandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\xad\x03\x00Canada/Central" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81y\xb2\x03\x00Canada/MountainUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\xb6\x03\x00Canada/YukonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05fa\x03\x00CET" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x10\x00\xedA\x81\xbd\x03\x00Chile/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q[Sp\x90" + - "\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1\xbd\x03\x00Chile/ContinentalUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xc3\x03\x00Chile/E" + - "asterIslandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q<\x8b\x99\x1e\xb7\x03\x00\x00\xb7" + - "\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xc7\x03\x00CST6CDTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xcb\x03\x00CubaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xd0\x03\x00EETUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81i\xd2\x03\x00EgyptUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05" + - "\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xd7\x03\x00EireUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\xb8K\x97QtX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xba\xdd\x03\x00ESTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe7/\xebT\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xde\x03\x00EST5EDTUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA" + - "^\xe2\x03\x00Etc/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00" + - "\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c\xe2\x03\x00Etc/GMT+4UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00\xb8K\x97Q)\xb9\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xe3\x03\x00Etc/GMT+11UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\x19\xef\x03\x00Etc/" + - "ZuluUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef\xef\x03\x00Etc/GMT-7UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xf0\x03\x00Etc/GMT-5UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\xf1\x03\x00Etc/GMT+" + - "1UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q,{\xdc;s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\r\xf2\x03\x00Etc/GMT-14UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xd9|\xbd7s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\xf2\x03\x00Etc/GMT-10UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb2\xab\xd1Is\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xf3\x03\x00Etc/GMT-1" + - "1UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x812\xf4\x03\x00Etc/GMT-13UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\x84+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\xf4\x03\x00Etc/GMT+7UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\xf5\x03\x00Etc/GMT-12" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81T\xf6\x03\x00Etc/GMT+0UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9c" + - "\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06\xf7\x03\x00Etc/GMT-3UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\xf7\x03\x00Etc/GMT+2UT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81o\xf8\x03\x00Etc/GreenwichUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\xf9\x03\x00Etc/UniversalUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\xf9\x03\x00Etc/GMT" + - "+8UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\xfa\x03\x00Etc/GMT-2UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAD\xfb\x03\x00Europe/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xfb\x03\x00Europe/Copen" + - "hagenUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00\x00\x10\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\xfe\x03\x00Europe/BucharestUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qu\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1e\x01\x04\x00Europe/UlyanovskUT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81`\x04\x04\x00Europe/NicosiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97" + - "Q\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd\x06\x04\x00Europe/BudapestUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D\n\x04\x00Euro" + - "pe/VaticanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01" + - "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\x0e\x04\x00Europe/MariehamnUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QWI\xc3\u007f(\x03\x00\x00(\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\x10\x04\x00Europe/MinskUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xd8\x13\x04\x00Europe/San_MarinoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Qo\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\x17\x04\x00Europe/BrusselsUT\x05\x00\x03\xfc\xff\xe2_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81n\x1c\x04\x00" + - "Europe/IstanbulUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde" + - "\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g!\x04\x00Europe/BelgradeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QZk#V\x81\x03\x00\x00\x81\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8e#\x04\x00Europe/Mad" + - "ridUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81V'\x04\x00Europe/ChisinauUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Qߜvυ\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92*\x04\x00Europe/AndorraUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x1b8\xfel\xd6\x02\x00\x00\xd6\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_," + - "\x04\x00Europe/SaratovUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6" + - "?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}/\x04\x00Europe/LondonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qq\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x036\x04\x00Europe/Tall" + - "innUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee8\x04\x00Europe/ZaporozhyeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97QVa\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i;\x04\x00Europe/VolgogradUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\x92>\x04\x00Europe/RomeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QZ\x05w" + - "ג\x02\x00\x00\x92\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aB\x04\x00Europe/ViennaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QN\xa5\xa5\xcb\x12\x02\x00\x00\x12\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81cE\x04\x00Europe/Uzh" + - "gorodUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\r\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbeG\x04\x00Europe/MoscowUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91K\x04\x00Europe/KievUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfbM\x04\x00E" + - "urope/PragueUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00" + - "\xde\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15Q\x04\x00Europe/ZagrebUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qh\xa5J[\xa0\x03\x00\x00\xa0\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:S\x04\x00Europe/MaltaUT\x05" + - "\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81 W\x04\x00Europe/TiraspolUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K" + - "\x97QO+j\x94\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\Z\x04\x00Europe/KaliningradUT\x05\x00\x03\xfc\xff\xe2_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x810^\x04\x00" + - "Europe/StockholmUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1" + - "\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81k`\x04\x00Europe/SkopjeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90b\x04\x00Europe/Hels" + - "inkiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00\x00\x0e\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbad\x04\x00Europe/VilniusUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6g\x04\x00Europe/BelfastUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-n" + - "\x04\x00Europe/BratislavaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk" + - "\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Kq\x04\x00Europe/JerseyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qgp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd1w\x04\x00Europe/R" + - "igaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\r\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xccz\x04\x00Europe/LisbonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97QDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\x80\x04\x00Europe/BusingenUT\x05\x00\x03\xfc\xff\xe2_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\x82\x04" + - "\x00Europe/PodgoricaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc9\a\xa0" + - "\xe1/\x04\x00\x00/\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x11\x85\x04\x00Europe/AmsterdamUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\x89\x04\x00Europe/" + - "BerlinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\r\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\x8c\x04\x00Europe/ZurichUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ʎ\x04\x00Europe/SarajevoUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8c\xc8\x15\xd0P\x02\x00\x00P\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xf1\x90\x04\x00Europe/SofiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xa5\x97\a\xc4" + - "\xa4\x02\x00\x00\xa4\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\x93\x04\x00Europe/OsloUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x96\x04\x00Europe/Ljublj" + - "anaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98\x98\x04\x00Europe/GuernseyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97QDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81 \x9f\x04\x00Europe/VaduzUT\x05\x00\x03\xfc\xff\xe2_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\xa1\x04\x00" + - "Europe/Isle_of_ManUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q>\xfe" + - "垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xa7\x04\x00Europe/WarsawUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ī\x04\x00Europe/Ki" + - "rovUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05ee\x04\x00Europe/GibraltarUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q]i\x11u\xd6\x02\x00\x00\xd6\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5\xb3\x04\x00Europe/AstrakhanUT\x05\x00\x03" + - "\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\x05\xb7\x04\x00Europe/TiraneUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qn\x81" + - "\xf4\xd7Z\x04\x00\x00Z\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xb9\x04\x00Europe/MonacoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QM\xe5\xa9 ?\x04\x00\x00?\x04\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xbe\x04\x00Europe/Lu" + - "xembourgUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00" + - "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd3\xc2\x04\x00Europe/ParisUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xc7\x04\x00Europe/AthensUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qz\xc3\xe8Ra\x03\x00\x00a\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[" + - "\xca\x04\x00Europe/SimferopolUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xce\x04\x00Europe/DublinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81&\xd4\x04\x00Europe/" + - "SamaraUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xab\x80c$q\x00\x00\x00q\x00\x00\x00\a\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xd7\x04\x00FactoryUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xd7\x04\x00GBUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\xde\x04\x00GB-EireUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\xe4" + - "\x04\x00GMTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\xe5\x04\x00GMT+0UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q" + - "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xe6\x04\x00GMT-0UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\xe6\x04\x00GMT0UT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xab\xe7\x04\x00G" + - "reenwichUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00" + - "\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\xe8\x04\x00HongkongUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6\xeb\x04\x00HSTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S\xec\x04\x00IcelandUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00" + - "\xedA\x85\xef\x04\x00Indian/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00" + - "\x00\xbf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc6\xef\x04\x00Indian/AntananarivoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xf0\x04\x00Indian/C" + - "omoroUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8\xf1\x04\x00Indian/ChristmasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qa\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xf2\x04\x00Indian/MaheUT\x05\x00\x03\xfc\xff\xe2" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QͲ\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81q\xf3" + - "\x04\x00Indian/CocosUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb9\xb2Z\xac\x98\x00" + - "\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81C\xf4\x04\x00Indian/MaldivesUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\xf5\x04\x00Indian/Kerg" + - "uelenUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xf5\x04\x00Indian/MauritiusUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qx\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\xf6\x04\x00Indian/ChagosUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xcf\xf7\x04\x00Indian/MayotteUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qy(" + - "\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\xf8\x04\x00Indian/ReunionUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\xf9\x04\x00IranUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x17✳2\x04\x00\x002\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xb5\x01\x05\x00IsraelUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q%J\xd5\xebS\x01\x00\x00" + - "S\x01\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x06\x05\x00JamaicaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\a\x05\x00JapanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcf\b\x05\x00Kwajal" + - "einUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xed\t\x05\x00LibyaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfe\x9d" + - "\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\v\x05\x00METUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x85\x0e\x05\x00Mexico/UT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc6\x0e\x05\x00Me" + - "xico/BajaSurUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd6\xe1Հ\x9c\x01\x00\x00" + - "\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}\x10\x05\x00Mexico/GeneralUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81a\x12\x05\x00Mexico/BajaNor" + - "teUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xac\x16\x05\x00MSTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe6h\xcac\xb7" + - "\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\x17\x05\x00MST7MDTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\x1b\x05\x00NavajoUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\x1f\x05\x00NZ" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81\xf1#\x05\x00NZ-CHATUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAZ'\x05\x00Pacific/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c'\x05\x00Pacific/WallisU" + - "T\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81j(\x05\x00Pacific/EasterUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Q\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00-\x05\x00Pacific/GambierUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcd-\x05\x00Pa" + - "cific/NiueUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00\xc3\x00" + - "\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2.\x05\x00Pacific/YapUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca/\x05\x00Pacific/Bougainvill" + - "eUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\xe10\x05\x00Pacific/PohnpeiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x002\x05\x00Pacific/TrukUT\x05\x00\x03\xfc\xff\xe2_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t3\x05\x00Pa" + - "cific/TarawaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xcc\xf39a\xc3\x00\x00\x00" + - "\xc3\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd73\x05\x00Pacific/ChuukUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe14\x05\x00Pacific/PalauUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xbc5\x05\x00Pacific/ChathamUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8" + - "K\x97Qa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-9\x05\x00Pacific/FunafutiUT\x05\x00\x03\xfc\xff\xe2_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QY5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd9\x05\x00P" + - "acific/NorfolkUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\u07b54-\xd6\x00" + - "\x00\x00\xd6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=;\x05\x00Pacific/PonapeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[<\x05\x00Pacific/Pago" + - "_PagoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818=\x05\x00Pacific/FakaofoUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a>\x05\x00Pacific/NoumeaUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "(?\x05\x00Pacific/KosraeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\x0f" + - "A\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b@\x05\x00Pacific/PitcairnUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81EA\x05\x00Pacifi" + - "c/Port_MoresbyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qb\xb2\xaf\xf7\x13\x04" + - "\x00\x00\x13\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-B\x05\x00Pacific/AucklandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aF\x05\x00Pacific/Gu" + - "adalcanalUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00" + - "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]G\x05\x00Pacific/EnderburyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81TH\x05\x00Pacific/Tahiti" + - "UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81!I\x05\x00Pacific/JohnstonUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81HJ\x05\x00Pacific/MajuroUT\x05\x00\x03\xfc\xff\xe2_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81jK\x05\x00" + - "Pacific/MidwayUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x85v\xf8\x8c\x87\x01" + - "\x00\x00\x87\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81DL\x05\x00Pacific/RarotongaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16N\x05\x00Pacific/G" + - "uamUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbaO\x05\x00Pacific/TongatapuUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2P\x05\x00Pacific/HonoluluUT\x05\x00" + - "\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\x19R\x05\x00Pacific/SamoaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe2" + - ";Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2R\x05\x00Pacific/NauruUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0S\x05\x00Pacific/" + - "FijiUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe9\xdd\x1e\xee\f\x01\x00\x00\f\x01\x00\x00\f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9U\x05\x00Pacific/ApiaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00\xb8K\x97Q\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+W\x05\x00Pacific/KiritimatiUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "%X\x05\x00Pacific/WakeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\xe8]*" + - "\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1X\x05\x00Pacific/KwajaleinUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17Z\x05\x00Pacific" + - "/SaipanUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QD6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd[\x05\x00Pacific/MarquesasUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\\\x05\x00Pacific/Galapago" + - "sUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\x8d]\x05\x00Pacific/EfateUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*_\x05\x00PolandUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05c\x05\x00PortugalUT" + - "\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xe3h\x05\x00PRCUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QŭV\xad\xb7\x03\x00\x00\xb7" + - "\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9j\x05\x00PST8PDTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00\xb8K\x97Q\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1n\x05\x00ROCUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xddp\x05\x00ROKUT\x05\x00\x03\xfc" + - "\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xb9r\x05\x00SingaporeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\aW\x10Ѱ\x04\x00" + - "\x00\xb0\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfcs\x05\x00TurkeyUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xecx\x05\x00UCTUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98y\x05\x00Universa" + - "lUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x10\x00\xedAJz\x05\x00US/UT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xf6\"\x12\xfe\x0e\x05" + - "\x00\x00\x0e\x05\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87z\x05\x00US/PacificUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9\u007f\x05\x00US/HawaiiUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf9" + - "\x80\x05\x00US/EasternUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9bܩ=\xda\x06\x00" + - "\x00\xda\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\x88\x05\x00US/CentralUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\x8f\x05\x00US/ArizonaUT\x05\x00\x03\xfc\xff" + - "\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_" + - "\x90\x05\x00US/East-IndianaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q$ " + - "\x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\x92\x05\x00US/Indiana-StarkeUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Qt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\x96\x05\x00US/Sa" + - "moaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97QV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81җ\x05\x00US/MountainUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "\xb8K\x97Q5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)\x9c\x05\x00US/AlaskaUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\xa0\x05\x00US/Mich" + - "iganUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\xa4\x05\x00US/AleutianUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x13\xa8\x05\x00UTCUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf\xa8\x05\x00WETUT\x05\x00\x03\xfc\xff\xe2_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea\xaa\x05" + - "\x00W-SUUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xb8K\x97Q\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xae\x05\x00ZuluUT\x05\x00\x03\xfc\xff\xe2_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x05\x06\x00\x00\x00\x00f\x02f\x02\x96\xc9\x00\x00a" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x01\xd8N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81dJ\x01\x00America/Indiana/PetersburgUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81cM\x01\x00America/FortalezaU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\x92O\x01\x00America/AnchorageUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaeS\x01\x00America/DanmarkshavnUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xbbU\x01\x00America/ReginaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "g\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81X\x01\x00America/AntiguaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81LY\x01\x00Ameri" + + "ca/Porto_VelhoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1e\xfbn۸\x03" + + "\x00\x00\xb8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#[\x01\x00America/Campo_GrandeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)_\x01\x00Americ" + + "a/DominicaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02" + + "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5_\x01\x00America/Fort_WayneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Tb\x01\x00America/Rio_" + + "BrancoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Bd\x01\x00America/TegucigalpaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Qe\x01\x00America/Mexico_" + + "CityUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:g\x01\x00America/TijuanaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84k\x01\x00America/CancunUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdd" + + "m\x01\x00America/Swift_CurrentUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "T\x8a\x9eQ\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9co\x01\x00America/CuiabaUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8as\x01\x00Am" + + "erica/MendozaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ~\xb2\x0e\x19V\a\x00" + + "\x00V\a\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x97v\x01\x00America/St_JohnsUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x817~\x01\x00America/Mer" + + "idaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\u007f\x01\x00America/ResoluteUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\x82\x01\x00America/ArubaUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\x83" + + "\x01\x00America/HalifaxUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQԾ\xe7" + + "#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[\x8a\x01\x00America/PanamaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818\x8b\x01\x00America/A" + + "nguillaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x04\x8c\x01\x00America/ChicagoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x93\x01\x00America/JamaicaUT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81Ô\x01\x00America/IndianapolisUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\x97\x01\x00America/CaracasUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\x98" + + "\x01\x00America/LimaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQB\xa0=:\x1e\x01" + + "\x00\x00\x1e\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\x99\x01\x00America/HermosilloUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\x9a\x01\x00America/" + + "BelemUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ǜ\x01\x00America/Glace_BayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xa0\x01\x00America/Guadeloupe" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81P\xa1\x01\x00America/ShiprockUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xa5\x01\x00America/MatamorosUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6@\rm\xa8\x05\x00\x00\xa8\x05\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac" + + "\xa7\x01\x00America/Fort_NelsonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQOKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\xad\x01\x00America/BahiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\xb0\x01\x00Ameri" + + "ca/Goose_BayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00" + + "\x97\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\xb7\x01\x00America/KralendijkUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xec\xb7\x01\x00America/Sa" + + "nta_IsabelUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02" + + "\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xbc\x01\x00America/IqaluitUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81h\xbf\x01\x00America/Edmonto" + + "nUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81|\xc3\x01\x00America/BogotaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00T\x8a\x9eQ\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\xc4\x01\x00America/GuatemalaUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96\xc5" + + "\x01\x00America/DetroitUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\x1b\xce" + + "RC\x03\x00\x00C\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b\xc9\x01\x00America/NipigonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\xcc\x01\x00America/" + + "MontserratUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7\b\\\xc6&\x02\x00\x00&\x02" + + "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbc\xcd\x01\x00America/MiquelonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,\xd0\x01\x00America/Sao_Pa" + + "uloUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x10\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\xd4\x01\x00America/SantiagoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xd9\x01\x00America/Knox_INUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xbc\xdd\x01\x00America/La_PazUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19v" + + "v\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xde\x01\x00America/Lower_PrincesUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94\xdf\x01\x00A" + + "merica/ChihuahuaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?_p\x99" + + "\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\xe1\x01\x00America/WinnipegUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b\xe6\x01\x00America/" + + "ParamariboUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00" + + "\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\xe7\x01\x00America/GuayaquilUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\xe8\x01\x00America/St_Th" + + "omasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\xe9\x01\x00America/MontevideoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\xed\x01\x00America/St_LuciaUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81>\xee\x01\x00America/YakutatUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\xf2\x01\x00America/AtkaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81H\xf6\x01\x00Ameri" + + "ca/El_SalvadorUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7-2f\xe4\x01" + + "\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xf7\x01\x00America/NoronhaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\xf9\x01\x00America/Man" + + "aguaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xfa\x01\x00America/Los_AngelesUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\x00\x02\x00America/EirunepeU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81;\x02\x02\x00America/Dawson_CreekUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814\x05\x02\x00America/LouisvilleUT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81Z\n\x02\x00America/CuracaoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\v\x02\x00America/MonterreyUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xaa\f\x02\x00A" + + "merica/Kentucky/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03\x1a|J" + + "\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5\f\x02\x00America/Kentucky/MonticelloUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16" + + "\x11\x02\x00America/Kentucky/LouisvilleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\x16\x02\x00America/HavanaUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xea\x1a\x02\x00America/MontrealUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "g\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9!\x02\x00America/VirginUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb3\"\x02\x00Americ" + + "a/Santo_DomingoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA?$\x02\x00Antarctica/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84$\x02\x00Antarctica/Dum" + + "ontDUrvilleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\r\x0e\xf20\x85\x00\x00\x00\x85" + + "\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o%\x02\x00Antarctica/SyowaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>&\x02\x00Antarctica/Da" + + "visUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81M'\x02\x00Antarctica/PalmerUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0f+\x02\x00Antarctica/MawsonUT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xf2+\x02\x00Antarctica/RotheraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00T\x8a\x9eQ\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2,\x02\x00Antarctica/VostokUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92-" + + "\x02\x00Antarctica/South_PoleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf41\x02\x00Antarctica/TrollUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef2\x02\x00A" + + "ntarctica/CaseyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\x84J]\xd0" + + "\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,4\x02\x00Antarctica/MacquarieUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81J8\x02\x00Antar" + + "ctica/McMurdoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xa9<\x02\x00Arctic/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea<\x02\x00Arctic/LongyearbyenU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x10\x00\xedA\xdb?\x02\x00Asia/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\t\xfa-\a\x03" + + "\x00\x00\a\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a@\x02\x00Asia/Hong_KongUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81iC\x02\x00Asia/MuscatU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x813D\x02\x00Asia/TaipeiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wF\x02\x00Asia/QatarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81SG\x02\x00Asia/Nicos" + + "iaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xeeI\x02\x00Asia/GazaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeeN\x02\x00Asia/BarnaulUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%R\x02\x00Asia/Sa" + + "markandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdbS\x02\x00Asia/BakuUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06W\x02\x00Asia/TbilisiUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1Y\x02\x00As" + + "ia/RiyadhUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQʇ{_\xbb\x00\x00\x00\xbb\x00\x00" + + "\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8bZ\x02\x00Asia/RangoonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c[\x02\x00Asia/YakutskUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7" + + "^\x02\x00Asia/IstanbulUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd5ΜG" + + "p\x02\x00\x00p\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaec\x02\x00Asia/QyzylordaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ff\x02\x00Asia/Khand" + + "ygaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4i\x02\x00Asia/KathmanduUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9dj\x02\x00Asia/ChongqingUT\x05\x00\x03`\xa8\xec_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81nl\x02" + + "\x00Asia/Ho_Chi_MinhUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ0]*" + + "\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4m\x02\x00Asia/BishkekUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Tp\x02\x00Asia/Qostan" + + "ayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\x02s\x02\x00Asia/KabulUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5s\x02\x00Asia/TomskUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1aw\x02\x00Asia/Mac" + + "auUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81uz\x02\x00Asia/Ust-NeraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00T\x8a\x9eQ\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf}\x02\x00Asia/YerevanUT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ɀ\x02\x00Asi" + + "a/VientianeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQd%\x05\xd8\xe6\x02\x00\x00\xe6" + + "\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9\x81\x02\x00Asia/VladivostokUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ل\x02\x00Asia/BeirutUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xfa\x87\x02\x00Asia/DaccaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\xea" + + "\x18\xd4\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\x89\x02\x00Asia/YekaterinburgUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ6j\\J\xcf\x04\x00\x00\xcf\x04\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x8c\x02\x00Asia" + + "/HebronUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}\x91\x02\x00Asia/ThimphuUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\x92\x02\x00Asia/ThimbuUT\x05\x00\x03`\xa8\xec_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x93\x02\x00" + + "Asia/SakhalinUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81z&\x80k\x02\x00" + + "\x00k\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\x96\x02\x00Asia/ChoibalsanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*\x99\x02\x00Asia/SeoulUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\r\x9b\x02\x00Asia/MakassarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x12\x9c\x02\x00Asia/DubaiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ۜ\x02\x00Asia/Alma" + + "tyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\x81\x9f\x02\x00Asia/Ulan_BatorUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1c\xa2\x02\x00Asia/SaigonUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xa3\x02\x00As" + + "ia/DhakaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ.>[K\xab\x00\x00\x00\xab\x00\x00\x00" + + "\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81x\xa4\x02\x00Asia/JayapuraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xa5\x02\x00Asia/PyongyangUT\x05\x00\x03" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81i\xa6\x02\x00Asia/Kuala_LumpurUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xa7\x02\x00Asia/ChungkingUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xa9\x02\x00Asia" + + "/AqtobeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x811\xac\x02\x00Asia/ChitaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81c\xaf\x02\x00Asia/ColomboUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xb0\x02\x00A" + + "sia/MacaoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00" + + "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xb3\x02\x00Asia/SrednekolymskUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\xb7\x02\x00Asia/BaghdadU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQe\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xe9\xb9\x02\x00Asia/AshgabatUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xbb\x02\x00Asia/KamchatkaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƾ\x02\x00Asia" + + "/BahrainUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00" + + "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xbf\x02\x00Asia/BangkokUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xc0\x02\x00Asia/KarachiUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xc1" + + "\x02\x00Asia/TashkentUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85" + + "\x00\x00\x00\x85\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\xc3\x02\x00Asia/AdenUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\xc4\x02\x00Asia/OmskUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w" + + "\xc7\x02\x00Asia/Phnom_PenhUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17\xe2" + + "\x9c\xb32\x04\x00\x002\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\xc8\x02\x00Asia/JerusalemUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xcc\x02\x00Asia/Mag" + + "adanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xd0\x02\x00Asia/JakartaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xd1\x02\x00Asia/NovokuznetskUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f" + + "\xd4\x02\x00Asia/OralUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ)p\x1cX\xf1\x02\x00\x00" + + "\xf1\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a\xd7\x02\x00Asia/NovosibirskUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xda\x02\x00Asia/Damascu" + + "sUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xb3\xde\x02\x00Asia/Ujung_PandangUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd\xdf\x02\x00Asia/FamagustaUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1" + + "\xe3\x02\x00Asia/YangonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xceG|\xea\x13\x03" + + "\x00\x00\x13\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\xe4\x02\x00Asia/AmmanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\b\xe8\x02\x00Asia/TokyoUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "!\xe9\x02\x00Asia/AnadyrUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ;\u007fP\x8d\xd4" + + "\a\x00\x00\xd4\a\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xec\x02\x00Asia/TehranUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xf4\x02\x00Asia/Singapore" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQy\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\xae\xf5\x02\x00Asia/BruneiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8d\xf6\x02\x00Asia/UrumqiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\xf7\x02\x00Asia/Dil" + + "iUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81D\xf8\x02\x00Asia/AshkhabadUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00T\x8a\x9eQL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\xfa\x02\x00Asia/KrasnoyarskUT\x05\x00\x03`\xa8\xec_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x812\xfd\x02" + + "\x00Asia/AtyrauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQT\x81\x18G^\x02\x00\x00" + + "^\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdf\xff\x02\x00Asia/AqtauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81\x02\x03\x00Asia/HarbinUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O" + + "\x04\x03\x00Asia/KuwaitUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\x1a\xdc\xca\xdc\x00" + + "\x00\x00\xdc\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\x05\x03\x00Asia/CalcuttaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x06\x03\x00Asia/ManilaUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81o\a\x03\x00Asia/DushanbeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\t\x03\x00Asia/Tel_AvivUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\r\x03\x00Asia/U" + + "laanbaatarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02" + + "\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\x10\x03\x00Asia/IrkutskUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\x13\x03\x00Asia/ShanghaiUT\x05\x00\x03" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81G\x15\x03\x00Asia/KatmanduUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xba\xa3" + + "b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\x16\x03\x00Asia/HovdUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\x18\x03\x00Asia/KolkataU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xe6\x19\x03\x00Asia/KashgarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "QS\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\x1a\x03\x00Asia/PontianakUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\x1b\x03\x00Asia/" + + "KuchingUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAv\x1d\x03\x00Atlantic/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ\u0097N\xad\xaf\x00\x00\x00\xaf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\x1d\x03\x00Atlantic/Cape_VerdeUT\x05\x00\x03" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\xb5\x1e\x03\x00Atlantic/FaroeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5" + + "\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6 \x03\x00Atlantic/Jan_MayenUT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6#\x03\x00Atl" + + "antic/ReykjavikUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaf|7\xb3\xde" + + "\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3&\x03\x00Atlantic/CanaryUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n)\x03\x00Atlantic/S" + + "t_HelenaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00" + + "\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8)\x03\x00Atlantic/MadeiraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd/\x03\x00Atlantic/South_G" + + "eorgiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x910\x03\x00Atlantic/FaeroeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe7\xcf^\xb0\x15\x03\x00\x00\x15\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x932\x03\x00Atlantic/StanleyUT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xf25\x03\x00Atlantic/AzoresUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQl&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6;\x03\x00Atlantic/BermudaUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA @\x03\x00Au" + + "stralia/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQϻ\xca\x1a2\x01\x00\x002\x01\x00\x00" + + "\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81d@\x03\x00Australia/PerthUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdfA\x03\x00Australia/LHIUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xdaD\x03\x00Australia/YancowinnaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5H\x03\x00Australia/Broken_HillUT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xd1L\x03\x00Australia/WestUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81KN\x03\x00Australia/DarwinUT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u007fO\x03\x00Aus" + + "tralia/AdelaideUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa2ܺ\xca:" + + "\x01\x00\x00:\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dS\x03\x00Australia/EuclaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7T\x03\x00Australia/" + + "MelbourneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00" + + "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbcX\x03\x00Australia/CanberraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\\\x03\x00Australia/Bri" + + "sbaneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd]\x03\x00Australia/Lord_HoweUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe`\x03\x00Australia/Victor" + + "iaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xd2d\x03\x00Australia/HobartUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQ?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\ai\x03\x00Australia/LindemanUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\x98j\x03\x00Australia/CurrieUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdn\x03\x00Australia/NorthUT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00p\x03\x00Aus" + + "tralia/QueenslandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9a" + + "p\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81oq\x03\x00Australia/NSWUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>u\x03\x00Australia/" + + "ACTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\ry\x03\x00Australia/TasmaniaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D}\x03\x00Australia/SouthUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81&\x81\x03\x00Australia/SydneyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xf8\x84\x03\x00Brazil/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\x85\x03\x00Brazil/West" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\x1a\x87\x03\x00Brazil/AcreUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01\x89\x03\x00Brazil/DeNoronhaUT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\x8b\x03\x00Bra" + + "zil/EastUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA,\x8f\x03\x00Canada/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00T\x8a\x9eQ\u0096dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81m\x8f\x03\x00Canada/SaskatchewanUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQU9#\xbe2\x05\x00\x002\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "8\x92\x03\x00Canada/PacificUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ" + + "\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb2\x97\x03\x00Canada/EasternUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\x9e\x03\x00Canada/A" + + "tlanticUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x80\xa5\x03\x00Canada/NewfoundlandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\xad\x03\x00Canada/Central" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81y\xb2\x03\x00Canada/MountainUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00T\x8a\x9eQ\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\xb6\x03\x00Canada/YukonUT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05fa\x03\x00CET" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x10\x00\xedA\x81\xbd\x03\x00Chile/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ[Sp\x90" + + "\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1\xbd\x03\x00Chile/ContinentalUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xc3\x03\x00Chile/E" + + "asterIslandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\x8b\x99\x1e\xb7\x03\x00\x00\xb7" + + "\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xc7\x03\x00CST6CDTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xcb\x03\x00CubaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xd0\x03\x00EETUT\x05\x00\x03" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81i\xd2\x03\x00EgyptUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05" + + "\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xd7\x03\x00EireUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "T\x8a\x9eQtX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xba\xdd\x03\x00ESTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe7/\xebT\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xde\x03\x00EST5EDTUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA" + + "^\xe2\x03\x00Etc/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00" + + "\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c\xe2\x03\x00Etc/GMT+4UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00T\x8a\x9eQ)\xb9\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xe3\x03\x00Etc/GMT+11UT\x05\x00\x03`\xa8\xec_ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\x19\xef\x03\x00Etc/" + + "ZuluUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef\xef\x03\x00Etc/GMT-7UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xf0\x03\x00Etc/GMT-5UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\xf1\x03\x00Etc/GMT+" + + "1UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ,{\xdc;s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\r\xf2\x03\x00Etc/GMT-14UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xd9|\xbd7s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\xf2\x03\x00Etc/GMT-10UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xab\xd1Is\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xf3\x03\x00Etc/GMT-1" + + "1UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x812\xf4\x03\x00Etc/GMT-13UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\x84+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\xf4\x03\x00Etc/GMT+7UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\xf5\x03\x00Etc/GMT-12" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81T\xf6\x03\x00Etc/GMT+0UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9c" + + "\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06\xf7\x03\x00Etc/GMT-3UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\xf7\x03\x00Etc/GMT+2UT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81o\xf8\x03\x00Etc/GreenwichUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\xf9\x03\x00Etc/UniversalUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\xf9\x03\x00Etc/GMT" + + "+8UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\xfa\x03\x00Etc/GMT-2UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAD\xfb\x03\x00Europe/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xfb\x03\x00Europe/Copen" + + "hagenUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00\x00\x10\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\xfe\x03\x00Europe/BucharestUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQu\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1e\x01\x04\x00Europe/UlyanovskUT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81`\x04\x04\x00Europe/NicosiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + + "Q\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd\x06\x04\x00Europe/BudapestUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D\n\x04\x00Euro" + + "pe/VaticanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01" + + "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\x0e\x04\x00Europe/MariehamnUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQWI\xc3\u007f(\x03\x00\x00(\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\x10\x04\x00Europe/MinskUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xd8\x13\x04\x00Europe/San_MarinoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00T\x8a\x9eQo\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\x17\x04\x00Europe/BrusselsUT\x05\x00\x03`\xa8\xec_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81n\x1c\x04\x00" + + "Europe/IstanbulUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde" + + "\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g!\x04\x00Europe/BelgradeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQZk#V\x81\x03\x00\x00\x81\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8e#\x04\x00Europe/Mad" + + "ridUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81V'\x04\x00Europe/ChisinauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQߜvυ\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92*\x04\x00Europe/AndorraUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b8\xfel\xd6\x02\x00\x00\xd6\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_," + + "\x04\x00Europe/SaratovUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6" + + "?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}/\x04\x00Europe/LondonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQq\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x036\x04\x00Europe/Tall" + + "innUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee8\x04\x00Europe/ZaporozhyeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQVa\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i;\x04\x00Europe/VolgogradUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\x92>\x04\x00Europe/RomeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQZ\x05w" + + "ג\x02\x00\x00\x92\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aB\x04\x00Europe/ViennaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQN\xa5\xa5\xcb\x12\x02\x00\x00\x12\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81cE\x04\x00Europe/Uzh" + + "gorodUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\r\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbeG\x04\x00Europe/MoscowUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQ8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91K\x04\x00Europe/KievUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfbM\x04\x00E" + + "urope/PragueUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00" + + "\xde\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15Q\x04\x00Europe/ZagrebUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQh\xa5J[\xa0\x03\x00\x00\xa0\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:S\x04\x00Europe/MaltaUT\x05" + + "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81 W\x04\x00Europe/TiraspolUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + + "\x9eQO+j\x94\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\Z\x04\x00Europe/KaliningradUT\x05\x00\x03`\xa8\xec_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x810^\x04\x00" + + "Europe/StockholmUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1" + + "\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81k`\x04\x00Europe/SkopjeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90b\x04\x00Europe/Hels" + + "inkiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00\x00\x0e\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbad\x04\x00Europe/VilniusUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6g\x04\x00Europe/BelfastUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-n" + + "\x04\x00Europe/BratislavaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk" + + "\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Kq\x04\x00Europe/JerseyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQgp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd1w\x04\x00Europe/R" + + "igaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\r\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xccz\x04\x00Europe/LisbonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\x80\x04\x00Europe/BusingenUT\x05\x00\x03`\xa8\xec_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\x82\x04" + + "\x00Europe/PodgoricaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc9\a\xa0" + + "\xe1/\x04\x00\x00/\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x11\x85\x04\x00Europe/AmsterdamUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\x89\x04\x00Europe/" + + "BerlinUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\r\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\x8c\x04\x00Europe/ZurichUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ʎ\x04\x00Europe/SarajevoUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8c\xc8\x15\xd0P\x02\x00\x00P\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xf1\x90\x04\x00Europe/SofiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5\x97\a\xc4" + + "\xa4\x02\x00\x00\xa4\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\x93\x04\x00Europe/OsloUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x96\x04\x00Europe/Ljublj" + + "anaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98\x98\x04\x00Europe/GuernseyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81 \x9f\x04\x00Europe/VaduzUT\x05\x00\x03`\xa8\xec_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\xa1\x04\x00" + + "Europe/Isle_of_ManUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\xfe" + + "垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xa7\x04\x00Europe/WarsawUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ī\x04\x00Europe/Ki" + + "rovUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05ee\x04\x00Europe/GibraltarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ]i\x11u\xd6\x02\x00\x00\xd6\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5\xb3\x04\x00Europe/AstrakhanUT\x05\x00\x03" + + "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\x05\xb7\x04\x00Europe/TiraneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQn\x81" + + "\xf4\xd7Z\x04\x00\x00Z\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xb9\x04\x00Europe/MonacoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQM\xe5\xa9 ?\x04\x00\x00?\x04\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xbe\x04\x00Europe/Lu" + + "xembourgUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00" + + "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd3\xc2\x04\x00Europe/ParisUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xc7\x04\x00Europe/AthensUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQz\xc3\xe8Ra\x03\x00\x00a\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[" + + "\xca\x04\x00Europe/SimferopolUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xce\x04\x00Europe/DublinUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81&\xd4\x04\x00Europe/" + + "SamaraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xab\x80c$q\x00\x00\x00q\x00\x00\x00\a\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xd7\x04\x00FactoryUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xd7\x04\x00GBUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\xde\x04\x00GB-EireUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\xe4" + + "\x04\x00GMTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\xe5\x04\x00GMT+0UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + + "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xe6\x04\x00GMT-0UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\xe6\x04\x00GMT0UT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xab\xe7\x04\x00G" + + "reenwichUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00" + + "\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\xe8\x04\x00HongkongUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6\xeb\x04\x00HSTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S\xec\x04\x00IcelandUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00" + + "\xedA\x85\xef\x04\x00Indian/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00" + + "\x00\xbf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc6\xef\x04\x00Indian/AntananarivoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xf0\x04\x00Indian/C" + + "omoroUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8\xf1\x04\x00Indian/ChristmasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQa\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xf2\x04\x00Indian/MaheUT\x05\x00\x03`\xa8\xec" + + "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQͲ\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81q\xf3" + + "\x04\x00Indian/CocosUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb9\xb2Z\xac\x98\x00" + + "\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81C\xf4\x04\x00Indian/MaldivesUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\xf5\x04\x00Indian/Kerg" + + "uelenUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xf5\x04\x00Indian/MauritiusUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQx\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\xf6\x04\x00Indian/ChagosUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xcf\xf7\x04\x00Indian/MayotteUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQy(" + + "\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\xf8\x04\x00Indian/ReunionUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\xf9\x04\x00IranUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17✳2\x04\x00\x002\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xb5\x01\x05\x00IsraelUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ%J\xd5\xebS\x01\x00\x00" + + "S\x01\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x06\x05\x00JamaicaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\a\x05\x00JapanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcf\b\x05\x00Kwajal" + + "einUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xed\t\x05\x00LibyaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe\x9d" + + "\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\v\x05\x00METUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x85\x0e\x05\x00Mexico/UT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc6\x0e\x05\x00Me" + + "xico/BajaSurUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xe1Հ\x9c\x01\x00\x00" + + "\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}\x10\x05\x00Mexico/GeneralUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81a\x12\x05\x00Mexico/BajaNor" + + "teUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xac\x16\x05\x00MSTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe6h\xcac\xb7" + + "\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\x17\x05\x00MST7MDTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\x1b\x05\x00NavajoUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\x1f\x05\x00NZ" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\xf1#\x05\x00NZ-CHATUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAZ'\x05\x00Pacific/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c'\x05\x00Pacific/WallisU" + + "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81j(\x05\x00Pacific/EasterUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQ\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00-\x05\x00Pacific/GambierUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcd-\x05\x00Pa" + + "cific/NiueUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00" + + "\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2.\x05\x00Pacific/YapUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca/\x05\x00Pacific/Bougainvill" + + "eUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xe10\x05\x00Pacific/PohnpeiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x002\x05\x00Pacific/TrukUT\x05\x00\x03`\xa8\xec_ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t3\x05\x00Pa" + + "cific/TarawaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00" + + "\xc3\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd73\x05\x00Pacific/ChuukUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe14\x05\x00Pacific/PalauUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xbc5\x05\x00Pacific/ChathamUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + + "\x8a\x9eQa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-9\x05\x00Pacific/FunafutiUT\x05\x00\x03`\xa8\xec_ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQY5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd9\x05\x00P" + + "acific/NorfolkUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u07b54-\xd6\x00" + + "\x00\x00\xd6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=;\x05\x00Pacific/PonapeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[<\x05\x00Pacific/Pago" + + "_PagoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818=\x05\x00Pacific/FakaofoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a>\x05\x00Pacific/NoumeaUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "(?\x05\x00Pacific/KosraeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\x0f" + + "A\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b@\x05\x00Pacific/PitcairnUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81EA\x05\x00Pacifi" + + "c/Port_MoresbyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04" + + "\x00\x00\x13\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-B\x05\x00Pacific/AucklandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aF\x05\x00Pacific/Gu" + + "adalcanalUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00" + + "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]G\x05\x00Pacific/EnderburyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81TH\x05\x00Pacific/Tahiti" + + "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81!I\x05\x00Pacific/JohnstonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81HJ\x05\x00Pacific/MajuroUT\x05\x00\x03`\xa8\xec_u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81jK\x05\x00" + + "Pacific/MidwayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x85v\xf8\x8c\x87\x01" + + "\x00\x00\x87\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81DL\x05\x00Pacific/RarotongaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16N\x05\x00Pacific/G" + + "uamUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbaO\x05\x00Pacific/TongatapuUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2P\x05\x00Pacific/HonoluluUT\x05\x00" + + "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\x19R\x05\x00Pacific/SamoaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe2" + + ";Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2R\x05\x00Pacific/NauruUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0S\x05\x00Pacific/" + + "FijiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe9\xdd\x1e\xee\f\x01\x00\x00\f\x01\x00\x00\f\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9U\x05\x00Pacific/ApiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00T\x8a\x9eQ\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+W\x05\x00Pacific/KiritimatiUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "%X\x05\x00Pacific/WakeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\xe8]*" + + "\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1X\x05\x00Pacific/KwajaleinUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17Z\x05\x00Pacific" + + "/SaipanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQD6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd[\x05\x00Pacific/MarquesasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\\\x05\x00Pacific/Galapago" + + "sUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\x8d]\x05\x00Pacific/EfateUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "T\x8a\x9eQ>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*_\x05\x00PolandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05c\x05\x00PortugalUT" + + "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xe3h\x05\x00PRCUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQŭV\xad\xb7\x03\x00\x00\xb7" + + "\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9j\x05\x00PST8PDTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00T\x8a\x9eQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1n\x05\x00ROCUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xddp\x05\x00ROKUT\x05\x00\x03`" + + "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\xb9r\x05\x00SingaporeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00" + + "\x00\xb0\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfcs\x05\x00TurkeyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xecx\x05\x00UCTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98y\x05\x00Universa" + + "lUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x10\x00\xedAJz\x05\x00US/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\"\x12\xfe\x0e\x05" + + "\x00\x00\x0e\x05\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87z\x05\x00US/PacificUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9\u007f\x05\x00US/HawaiiUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf9" + + "\x80\x05\x00US/EasternUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9bܩ=\xda\x06\x00" + + "\x00\xda\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\x88\x05\x00US/CentralUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\x8f\x05\x00US/ArizonaUT\x05\x00\x03`\xa8" + + "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_" + + "\x90\x05\x00US/East-IndianaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ " + + "\x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\x92\x05\x00US/Indiana-StarkeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\x96\x05\x00US/Sa" + + "moaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81җ\x05\x00US/MountainUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "T\x8a\x9eQ5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)\x9c\x05\x00US/AlaskaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\xa0\x05\x00US/Mich" + + "iganUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\xa4\x05\x00US/AleutianUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x13\xa8\x05\x00UTCUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf\xa8\x05\x00WETUT\x05\x00\x03`\xa8\xec_" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea\xaa\x05" + + "\x00W-SUUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xae\x05\x00ZuluUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x05\x06\x00\x00\x00\x00f\x02f\x02\x96\xc9\x00\x00a" + "\xaf\x05\x00\x00\x00" -- GitLab From 95ce805d14642a8e8e40fe1f8f50b9b5a2c4e38b Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 30 Dec 2020 17:36:08 -0500 Subject: [PATCH 1585/1792] io/fs: remove darwin/arm64 special condition It isn't necessary on darwin/arm64 (macOS). It was probably leftover from the old code when darwin/arm64 meant iOS. The test passes on iOS builder. Apparently this is not needed either. Remove. Change-Id: I6fa0c55d6086325d4b722862c4fe6c30bcd6e6e8 Reviewed-on: https://go-review.googlesource.com/c/go/+/280158 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- src/io/fs/walk_test.go | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/io/fs/walk_test.go b/src/io/fs/walk_test.go index 395471e2e8..ebc4e50fb3 100644 --- a/src/io/fs/walk_test.go +++ b/src/io/fs/walk_test.go @@ -9,7 +9,6 @@ import ( "io/ioutil" "os" pathpkg "path" - "runtime" "testing" "testing/fstest" ) @@ -96,32 +95,7 @@ func mark(entry DirEntry, err error, errors *[]error, clear bool) error { return nil } -func chtmpdir(t *testing.T) (restore func()) { - oldwd, err := os.Getwd() - if err != nil { - t.Fatalf("chtmpdir: %v", err) - } - d, err := ioutil.TempDir("", "test") - if err != nil { - t.Fatalf("chtmpdir: %v", err) - } - if err := os.Chdir(d); err != nil { - t.Fatalf("chtmpdir: %v", err) - } - return func() { - if err := os.Chdir(oldwd); err != nil { - t.Fatalf("chtmpdir: %v", err) - } - os.RemoveAll(d) - } -} - func TestWalkDir(t *testing.T) { - if runtime.GOOS == "darwin" && runtime.GOARCH == "arm64" { - restore := chtmpdir(t) - defer restore() - } - tmpDir, err := ioutil.TempDir("", "TestWalk") if err != nil { t.Fatal("creating temp dir:", err) -- GitLab From 3dd58676054223962cd915bb0934d1f9f489d4d2 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Fri, 1 Jan 2021 00:00:00 -0500 Subject: [PATCH 1586/1792] doc: 2021 is the Year of the Gopher What a year it has been. If there's one thing we can count on at a time like this, it's that 2021 is the Year of the Gopher. Change-Id: I4f6fbbe3d9b4b70df8fadd0d18237f05cd572265 Reviewed-on: https://go-review.googlesource.com/c/go/+/280163 Trust: Dmitri Shuralyov Run-TryBot: Dmitri Shuralyov TryBot-Result: Go Bot Reviewed-by: Alberto Donizetti Reviewed-by: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor --- doc/contribute.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/contribute.html b/doc/contribute.html index 0113a1be5d..66a47eb07e 100644 --- a/doc/contribute.html +++ b/doc/contribute.html @@ -1023,13 +1023,13 @@ New files that you contribute should use the standard copyright header:

-// Copyright 2020 The Go Authors. All rights reserved.
+// 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.
 

-(Use the current year if you're reading this in 2021 or beyond.) +(Use the current year if you're reading this in 2022 or beyond.) Files in the repository are copyrighted the year they are added. Do not update the copyright year on files that you change.

-- GitLab From b01fb2af9ed6a3b90dd89d548ceef38b4ec1fc94 Mon Sep 17 00:00:00 2001 From: DrGo Date: Mon, 4 Jan 2021 11:26:46 +0000 Subject: [PATCH 1587/1792] testing/fstest: fix typo in error message Change-Id: Iac59f5271c79c46b39733fdf0eb4bf9b0fc0bdca GitHub-Last-Rev: 03f96e32a81d1516a9307b6578c930434783e3d3 GitHub-Pull-Request: golang/go#43450 Reviewed-on: https://go-review.googlesource.com/c/go/+/280953 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Tobias Klauser Reviewed-by: Ian Lance Taylor --- src/testing/fstest/testfs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testing/fstest/testfs.go b/src/testing/fstest/testfs.go index 2602bdf0cc..4da6f04eed 100644 --- a/src/testing/fstest/testfs.go +++ b/src/testing/fstest/testfs.go @@ -121,7 +121,7 @@ func (t *fsTester) openDir(dir string) fs.ReadDirFile { d, ok := f.(fs.ReadDirFile) if !ok { f.Close() - t.errorf("%s: Open returned File type %T, not a io.ReadDirFile", dir, f) + t.errorf("%s: Open returned File type %T, not a fs.ReadDirFile", dir, f) return nil } return d -- GitLab From 9eef49cfa6eb016e3b20df189e540c6c5a71f365 Mon Sep 17 00:00:00 2001 From: Toasa Date: Mon, 4 Jan 2021 12:58:18 +0000 Subject: [PATCH 1588/1792] math/rand: fix typo in comment Change-Id: I57fbabf272bdfd61918db155ee6f7091f18e5979 GitHub-Last-Rev: e138804b1ab8086b3742861873b077d6cca8108a GitHub-Pull-Request: golang/go#43495 Reviewed-on: https://go-review.googlesource.com/c/go/+/281373 Reviewed-by: Ian Lance Taylor Trust: Alberto Donizetti --- src/math/rand/gen_cooked.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/math/rand/gen_cooked.go b/src/math/rand/gen_cooked.go index 567b7a8d14..0afc10d727 100644 --- a/src/math/rand/gen_cooked.go +++ b/src/math/rand/gen_cooked.go @@ -4,7 +4,7 @@ // +build ignore -// This program computes the value of rng_cooked in rng.go, +// This program computes the value of rngCooked in rng.go, // which is used for seeding all instances of rand.Source. // a 64bit and a 63bit version of the array is printed to // the standard output. -- GitLab From 6b37b15d9520f9fa2b819e66a37fac4b2d08da78 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Tue, 17 Nov 2020 11:55:53 -0500 Subject: [PATCH 1589/1792] runtime: don't take allglock in tracebackothers tracebackothers is called from fatal throw/panic. A fatal throw may be taken with allglock held (notably in the allocator when allglock is held), which would cause a deadlock in tracebackothers when we try to take allglock again. Locking allglock here is also often a lock order violation w.r.t. the locks held when throw was called. Avoid the deadlock and ordering issues by skipping locking altogether. It is OK to miss concurrently created Gs (which are generally avoided by freezetheworld(), and which were possible previously anyways if created after the loop). Fatal throw/panic freezetheworld(), which should freeze other threads that may be racing to modify allgs. However, freezetheworld() does _not_ guarantee that it stops all other threads, so we can't simply drop the lock. Fixes #42669 Updates #43175 Change-Id: I657aec46ed35fd5d1b3f1ba25b500128ab26b088 Reviewed-on: https://go-review.googlesource.com/c/go/+/270861 Reviewed-by: Michael Knyszek Trust: Michael Pratt --- src/runtime/mgcmark.go | 1 - src/runtime/proc.go | 43 ++++++++++++++++++++++++++++++++++++---- src/runtime/runtime2.go | 1 - src/runtime/traceback.go | 27 +++++++++++++++---------- 4 files changed, 56 insertions(+), 16 deletions(-) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 52267e6fb0..46fae5de72 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -132,7 +132,6 @@ fail: println("gp", gp, "goid", gp.goid, "status", readgstatus(gp), "gcscandone", gp.gcscandone) - unlock(&allglock) // Avoid self-deadlock with traceback. throw("scan missed a g") } diff --git a/src/runtime/proc.go b/src/runtime/proc.go index ca78587aad..5a942a6831 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -490,8 +490,29 @@ func lockedOSThread() bool { } var ( - allgs []*g + // allgs contains all Gs ever created (including dead Gs), and thus + // never shrinks. + // + // Access via the slice is protected by allglock or stop-the-world. + // Readers that cannot take the lock may (carefully!) use the atomic + // variables below. allglock mutex + allgs []*g + + // allglen and allgptr are atomic variables that contain len(allg) and + // &allg[0] respectively. Proper ordering depends on totally-ordered + // loads and stores. Writes are protected by allglock. + // + // allgptr is updated before allglen. Readers should read allglen + // before allgptr to ensure that allglen is always <= len(allgptr). New + // Gs appended during the race can be missed. For a consistent view of + // all Gs, allglock must be held. + // + // allgptr copies should always be stored as a concrete type or + // unsafe.Pointer, not uintptr, to ensure that GC can still reach it + // even if it points to a stale array. + allglen uintptr + allgptr **g ) func allgadd(gp *g) { @@ -501,10 +522,25 @@ func allgadd(gp *g) { lock(&allglock) allgs = append(allgs, gp) - allglen = uintptr(len(allgs)) + if &allgs[0] != allgptr { + atomicstorep(unsafe.Pointer(&allgptr), unsafe.Pointer(&allgs[0])) + } + atomic.Storeuintptr(&allglen, uintptr(len(allgs))) unlock(&allglock) } +// atomicAllG returns &allgs[0] and len(allgs) for use with atomicAllGIndex. +func atomicAllG() (**g, uintptr) { + length := atomic.Loaduintptr(&allglen) + ptr := (**g)(atomic.Loadp(unsafe.Pointer(&allgptr))) + return ptr, length +} + +// atomicAllGIndex returns ptr[i] with the allgptr returned from atomicAllG. +func atomicAllGIndex(ptr **g, i uintptr) *g { + return *(**g)(add(unsafe.Pointer(ptr), i*sys.PtrSize)) +} + const ( // Number of goroutine ids to grab from sched.goidgen to local per-P cache at once. // 16 seems to provide enough amortization, but other than that it's mostly arbitrary number. @@ -4266,7 +4302,7 @@ func badunlockosthread() { } func gcount() int32 { - n := int32(allglen) - sched.gFree.n - int32(atomic.Load(&sched.ngsys)) + n := int32(atomic.Loaduintptr(&allglen)) - sched.gFree.n - int32(atomic.Load(&sched.ngsys)) for _, _p_ := range allp { n -= _p_.gFree.n } @@ -4970,7 +5006,6 @@ func checkdead() { case _Grunnable, _Grunning, _Gsyscall: - unlock(&allglock) print("runtime: checkdead: find g ", gp.goid, " in status ", s, "\n") throw("checkdead: runnable g") } diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index c9376827da..109f0da131 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -1052,7 +1052,6 @@ func (w waitReason) String() string { } var ( - allglen uintptr allm *m gomaxprocs int32 ncpu int32 diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index 0825e9e707..2601cd697f 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -917,17 +917,25 @@ func tracebackothers(me *g) { level, _, _ := gotraceback() // Show the current goroutine first, if we haven't already. - g := getg() - gp := g.m.curg - if gp != nil && gp != me { + curgp := getg().m.curg + if curgp != nil && curgp != me { print("\n") - goroutineheader(gp) - traceback(^uintptr(0), ^uintptr(0), 0, gp) + goroutineheader(curgp) + traceback(^uintptr(0), ^uintptr(0), 0, curgp) } - lock(&allglock) - for _, gp := range allgs { - if gp == me || gp == g.m.curg || readgstatus(gp) == _Gdead || isSystemGoroutine(gp, false) && level < 2 { + // We can't take allglock here because this may be during fatal + // throw/panic, where locking allglock could be out-of-order or a + // direct deadlock. + // + // Instead, use atomic access to allgs which requires no locking. We + // don't lock against concurrent creation of new Gs, but even with + // allglock we may miss Gs created after this loop. + ptr, length := atomicAllG() + for i := uintptr(0); i < length; i++ { + gp := atomicAllGIndex(ptr, i) + + if gp == me || gp == curgp || readgstatus(gp) == _Gdead || isSystemGoroutine(gp, false) && level < 2 { continue } print("\n") @@ -936,14 +944,13 @@ func tracebackothers(me *g) { // called from a signal handler initiated during a // systemstack call. The original G is still in the // running state, and we want to print its stack. - if gp.m != g.m && readgstatus(gp)&^_Gscan == _Grunning { + if gp.m != getg().m && readgstatus(gp)&^_Gscan == _Grunning { print("\tgoroutine running on other thread; stack unavailable\n") printcreatedby(gp) } else { traceback(^uintptr(0), ^uintptr(0), 0, gp) } } - unlock(&allglock) } // tracebackHexdump hexdumps part of stk around frame.sp and frame.fp -- GitLab From 1b85e7c057e0ac20881099eee036cef1d7f2fbb0 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 4 Jan 2021 14:24:40 -0800 Subject: [PATCH 1590/1792] cmd/go: don't scan gccgo standard library packages for imports In a gccgo installation the standard library sources are not available. Change-Id: I929f3645e3ac95a1fa7047d6a3d243159a86ba66 Reviewed-on: https://go-review.googlesource.com/c/go/+/281493 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/load.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 27f47fad4d..9a8b0cf177 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -1083,14 +1083,21 @@ func (ld *loader) load(pkg *loadPkg) { } } - imports, testImports, err := scanDir(pkg.dir, ld.Tags) - if err != nil { - pkg.err = err - return - } - pkg.inStd = (search.IsStandardImportPath(pkg.path) && search.InDir(pkg.dir, cfg.GOROOTsrc) != "") + var imports, testImports []string + + if cfg.BuildContext.Compiler == "gccgo" && pkg.inStd { + // We can't scan standard packages for gccgo. + } else { + var err error + imports, testImports, err = scanDir(pkg.dir, ld.Tags) + if err != nil { + pkg.err = err + return + } + } + pkg.imports = make([]*loadPkg, 0, len(imports)) var importFlags loadPkgFlags if pkg.flags.has(pkgInAll) { -- GitLab From 0b0d004983b5f06d7e8ae2084fc7d6612f1aa869 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 4 Jan 2021 14:06:29 -0800 Subject: [PATCH 1591/1792] cmd/go: pass embedcfg to gccgo if supported For #41191 Change-Id: I75d327759c3d9ef061c19a80b9b2619038dedf68 Reviewed-on: https://go-review.googlesource.com/c/go/+/281492 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/work/gccgo.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go index 3ffd01c473..45ff7c9838 100644 --- a/src/cmd/go/internal/work/gccgo.go +++ b/src/cmd/go/internal/work/gccgo.go @@ -93,6 +93,12 @@ func (tools gccgoToolchain) gc(b *Builder, a *Action, archive string, importcfg, args = append(args, "-I", root) } } + if embedcfg != nil && b.gccSupportsFlag(args[:1], "-fgo-embedcfg=/dev/null") { + if err := b.writeFile(objdir+"embedcfg", embedcfg); err != nil { + return "", nil, err + } + args = append(args, "-fgo-embedcfg="+objdir+"embedcfg") + } if b.gccSupportsFlag(args[:1], "-ffile-prefix-map=a=b") { if cfg.BuildTrimpath { -- GitLab From 3e1e13ce6d1271f49f3d8ee359689145a6995bad Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 21 Dec 2020 18:06:35 -0500 Subject: [PATCH 1592/1792] cmd/go: set cfg.BuildMod to "readonly" by default with no module root modload.Init now sets the default value for -mod if it wasn't set explicitly. This happens before go.mod is loaded, so modload.LoadModFile sets the default value again in order to enable automatic vendoring. Previously, cfg.BuildMod wasn't set at all if LoadModFile wasn't called, as is the case for commands that run outside of a module root. This problem only affected 'go install pkg@version' since other commands are either forbidden in module mode or run with -mod=mod (like 'go get' and 'go mod' subcommands). This change also suppresses "missing sum" errors when -mod=readonly is enabled and there is no module root. Fixes #43278 Related #40278 Change-Id: I6071cc42bc5e24d0d7e84556e5bfd8e368e0019d Reviewed-on: https://go-review.googlesource.com/c/go/+/279490 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Trust: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/import.go | 6 +++--- src/cmd/go/internal/modload/import_test.go | 13 +++++++++---- src/cmd/go/internal/modload/init.go | 16 ++++++++-------- src/cmd/go/internal/modload/modfile.go | 2 +- .../testdata/script/mod_install_pkg_version.txt | 5 +++++ 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index ce5671728e..c16531e2f4 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -58,7 +58,7 @@ func (e *ImportMissingError) Error() string { if e.QueryErr != nil { return fmt.Sprintf("cannot find module providing package %s: %v", e.Path, e.QueryErr) } - if cfg.BuildMod == "mod" { + if cfg.BuildMod == "mod" || (cfg.BuildMod == "readonly" && allowMissingModuleImports) { return "cannot find module providing package " + e.Path } @@ -365,7 +365,7 @@ func queryImport(ctx context.Context, path string) (module.Version, error) { return module.Version{}, &ImportMissingError{Path: path, isStd: true} } - if cfg.BuildMod == "readonly" { + if cfg.BuildMod == "readonly" && !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. @@ -547,7 +547,7 @@ func fetch(ctx context.Context, mod module.Version, needSum bool) (dir string, i mod = r } - if cfg.BuildMod == "readonly" && needSum && !modfetch.HaveSum(mod) { + if HasModRoot() && cfg.BuildMod == "readonly" && needSum && !modfetch.HaveSum(mod) { return "", false, module.VersionError(mod, &sumMissingError{}) } diff --git a/src/cmd/go/internal/modload/import_test.go b/src/cmd/go/internal/modload/import_test.go index 22d5b82e21..9420dc5646 100644 --- a/src/cmd/go/internal/modload/import_test.go +++ b/src/cmd/go/internal/modload/import_test.go @@ -58,10 +58,15 @@ var importTests = []struct { func TestQueryImport(t *testing.T) { testenv.MustHaveExternalNetwork(t) testenv.MustHaveExecPath(t, "git") - defer func(old bool) { - allowMissingModuleImports = old - }(allowMissingModuleImports) - AllowMissingModuleImports() + + oldAllowMissingModuleImports := allowMissingModuleImports + oldRootMode := RootMode + defer func() { + allowMissingModuleImports = oldAllowMissingModuleImports + RootMode = oldRootMode + }() + allowMissingModuleImports = true + RootMode = NoRoot ctx := context.Background() diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 445ebb262f..b0acb7b25d 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -202,6 +202,8 @@ func Init() { } // We're in module mode. Set any global variables that need to be set. + cfg.ModulesEnabled = true + setDefaultBuildMod() list := filepath.SplitList(cfg.BuildContext.GOPATH) if len(list) == 0 || list[0] == "" { base.Fatalf("missing $GOPATH") @@ -211,8 +213,6 @@ func Init() { base.Fatalf("$GOPATH/go.mod exists but should not") } - cfg.ModulesEnabled = true - if modRoot == "" { // We're in module mode, but not inside a module. // @@ -348,8 +348,8 @@ func die() { // ensuring requirements are consistent. WriteGoMod should be called later to // write changes out to disk or report errors in readonly mode. // -// As a side-effect, LoadModFile sets a default for cfg.BuildMod if it does not -// already have an explicit value. +// As a side-effect, LoadModFile may change cfg.BuildMod to "vendor" if +// -mod wasn't set explicitly and automatic vendoring should be enabled. func LoadModFile(ctx context.Context) { if len(buildList) > 0 { return @@ -387,7 +387,7 @@ func LoadModFile(ctx context.Context) { base.Fatalf("go: %v", err) } - setDefaultBuildMod() + setDefaultBuildMod() // possibly enable automatic vendoring modFileToBuildList() if cfg.BuildMod == "vendor" { readVendorList() @@ -586,8 +586,8 @@ func modFileToBuildList() { buildList = list } -// setDefaultBuildMod sets a default value for cfg.BuildMod -// if it is currently empty. +// setDefaultBuildMod sets a default value for cfg.BuildMod if the -mod flag +// wasn't provided. setDefaultBuildMod may be called multiple times. func setDefaultBuildMod() { if cfg.BuildModExplicit { // Don't override an explicit '-mod=' argument. @@ -608,7 +608,7 @@ func setDefaultBuildMod() { if fi, err := fsys.Stat(filepath.Join(modRoot, "vendor")); err == nil && fi.IsDir() { modGo := "unspecified" - if index.goVersionV != "" { + if index != nil && index.goVersionV != "" { if semver.Compare(index.goVersionV, "v1.14") >= 0 { // The Go version is at least 1.14, and a vendor directory exists. // Set -mod=vendor by default. diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index eb05e9f9c9..d5a17236cd 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -446,7 +446,7 @@ func goModSummary(m module.Version) (*modFileSummary, error) { if actual.Path == "" { actual = m } - if cfg.BuildMod == "readonly" && actual.Version != "" { + if HasModRoot() && cfg.BuildMod == "readonly" && actual.Version != "" { key := module.Version{Path: actual.Path, Version: actual.Version + "/go.mod"} if !modfetch.HaveSum(key) { suggestion := fmt.Sprintf("; try 'go mod download %s' to add it", m.Path) 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 e4a7668351..93896d4593 100644 --- a/src/cmd/go/testdata/script/mod_install_pkg_version.txt +++ b/src/cmd/go/testdata/script/mod_install_pkg_version.txt @@ -175,6 +175,11 @@ stdout '^\tmod\texample.com/cmd\tv1.0.0\t' go install example.com/cmd/a@v1.9.0 go version -m $GOPATH/bin/a$GOEXE stdout '^\tmod\texample.com/cmd\tv1.9.0\t' +env GO111MODULE= + +# 'go install pkg@version' succeeds when -mod=readonly is set explicitly. +# Verifies #43278. +go install -mod=readonly example.com/cmd/a@v1.0.0 -- m/go.mod -- module m -- GitLab From d2131704a6fda781bd3b823dbe8f57741663f466 Mon Sep 17 00:00:00 2001 From: Steven Hartland Date: Thu, 7 May 2020 10:08:08 +0000 Subject: [PATCH 1593/1792] net/http/httputil: fix deadlock in DumpRequestOut Fix a deadlock in DumpRequestOut which can occur if the request is cancelled between response being sent and it being processed. Also: * Ensure we don't get a reader leak when an error is reported by the transport before the body is consumed. * Add leaked goroutine retries to avoid false test failures. Fixes #38352 Change-Id: I83710791b2985b997f61fe5b49eadee0bb51bdee Reviewed-on: https://go-review.googlesource.com/c/go/+/232798 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Trust: Damien Neil --- src/net/http/httputil/dump.go | 15 ++++-- src/net/http/httputil/dump_test.go | 80 ++++++++++++++++++++++++++++-- 2 files changed, 87 insertions(+), 8 deletions(-) diff --git a/src/net/http/httputil/dump.go b/src/net/http/httputil/dump.go index 4c9d28bed8..2948f27e5d 100644 --- a/src/net/http/httputil/dump.go +++ b/src/net/http/httputil/dump.go @@ -138,6 +138,8 @@ func DumpRequestOut(req *http.Request, body bool) ([]byte, error) { select { case dr.c <- strings.NewReader("HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n"): case <-quitReadCh: + // Ensure delegateReader.Read doesn't block forever if we get an error. + close(dr.c) } }() @@ -146,7 +148,8 @@ func DumpRequestOut(req *http.Request, body bool) ([]byte, error) { req.Body = save if err != nil { pw.Close() - quitReadCh <- struct{}{} + dr.err = err + close(quitReadCh) return nil, err } dump := buf.Bytes() @@ -167,13 +170,17 @@ func DumpRequestOut(req *http.Request, body bool) ([]byte, error) { // delegateReader is a reader that delegates to another reader, // once it arrives on a channel. type delegateReader struct { - c chan io.Reader - r io.Reader // nil until received from c + c chan io.Reader + err error // only used if r is nil and c is closed. + r io.Reader // nil until received from c } func (r *delegateReader) Read(p []byte) (int, error) { if r.r == nil { - r.r = <-r.c + var ok bool + if r.r, ok = <-r.c; !ok { + return 0, r.err + } } return r.r.Read(p) } diff --git a/src/net/http/httputil/dump_test.go b/src/net/http/httputil/dump_test.go index 7571eb0820..8168b2ebc0 100644 --- a/src/net/http/httputil/dump_test.go +++ b/src/net/http/httputil/dump_test.go @@ -7,13 +7,17 @@ package httputil import ( "bufio" "bytes" + "context" "fmt" "io" + "math/rand" "net/http" "net/url" "runtime" + "runtime/pprof" "strings" "testing" + "time" ) type eofReader struct{} @@ -311,11 +315,39 @@ func TestDumpRequest(t *testing.T) { } } } - if dg := runtime.NumGoroutine() - numg0; dg > 4 { - buf := make([]byte, 4096) - buf = buf[:runtime.Stack(buf, true)] - t.Errorf("Unexpectedly large number of new goroutines: %d new: %s", dg, buf) + + // Validate we haven't leaked any goroutines. + var dg int + dl := deadline(t, 5*time.Second, time.Second) + for time.Now().Before(dl) { + if dg = runtime.NumGoroutine() - numg0; dg <= 4 { + // No unexpected goroutines. + return + } + + // Allow goroutines to schedule and die off. + runtime.Gosched() + } + + buf := make([]byte, 4096) + buf = buf[:runtime.Stack(buf, true)] + t.Errorf("Unexpectedly large number of new goroutines: %d new: %s", dg, buf) +} + +// deadline returns the time which is needed before t.Deadline() +// if one is configured and it is s greater than needed in the future, +// otherwise defaultDelay from the current time. +func deadline(t *testing.T, defaultDelay, needed time.Duration) time.Time { + if dl, ok := t.Deadline(); ok { + if dl = dl.Add(-needed); dl.After(time.Now()) { + // Allow an arbitrarily long delay. + return dl + } } + + // No deadline configured or its closer than needed from now + // so just use the default. + return time.Now().Add(defaultDelay) } func chunk(s string) string { @@ -445,3 +477,43 @@ func TestDumpResponse(t *testing.T) { } } } + +// Issue 38352: Check for deadlock on cancelled requests. +func TestDumpRequestOutIssue38352(t *testing.T) { + if testing.Short() { + return + } + t.Parallel() + + timeout := 10 * time.Second + if deadline, ok := t.Deadline(); ok { + timeout = time.Until(deadline) + timeout -= time.Second * 2 // Leave 2 seconds to report failures. + } + for i := 0; i < 1000; i++ { + delay := time.Duration(rand.Intn(5)) * time.Millisecond + ctx, cancel := context.WithTimeout(context.Background(), delay) + defer cancel() + + r := bytes.NewBuffer(make([]byte, 10000)) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "http://example.com", r) + if err != nil { + t.Fatal(err) + } + + out := make(chan error) + go func() { + _, err = DumpRequestOut(req, true) + out <- err + }() + + select { + case <-out: + case <-time.After(timeout): + b := &bytes.Buffer{} + fmt.Fprintf(b, "deadlock detected on iteration %d after %s with delay: %v\n", i, timeout, delay) + pprof.Lookup("goroutine").WriteTo(b, 1) + t.Fatal(b.String()) + } + } +} -- GitLab From 4c668b25c6517ff12b61c11cad1f22ddc89a9791 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 6 Jan 2021 18:22:17 +0000 Subject: [PATCH 1594/1792] runtime/metrics: fix panic message for Float64Histogram The panic message erroneously refers to float64 values. Change-Id: I83380f41d6c28a72bc69a94b9bcdf9d42b1503c1 Reviewed-on: https://go-review.googlesource.com/c/go/+/281236 Trust: Michael Knyszek Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Reviewed-by: Michael Pratt --- src/runtime/metrics/value.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/metrics/value.go b/src/runtime/metrics/value.go index 0b056b4ea8..61e8a192a3 100644 --- a/src/runtime/metrics/value.go +++ b/src/runtime/metrics/value.go @@ -63,7 +63,7 @@ func (v Value) Float64() float64 { // If v.Kind() != KindFloat64Histogram, this method panics. func (v Value) Float64Histogram() *Float64Histogram { if v.kind != KindFloat64Histogram { - panic("called Float64 on non-float64 metric value") + panic("called Float64Histogram on non-Float64Histogram metric value") } return (*Float64Histogram)(v.pointer) } -- GitLab From c9658bee93c169f6efd4654576bf8e9a920ec1de Mon Sep 17 00:00:00 2001 From: Baokun Lee Date: Thu, 31 Dec 2020 11:42:39 +0800 Subject: [PATCH 1595/1792] cmd/go: make module suggestion more friendly We are trying to avoid by not automatically updating go.mod. The suggestion should be that users actually add the dependencies they need, and the command in an easily copy-pastable form now. Fixes: #43430 Change-Id: I2227dab498fcd8d66184c94ebe9e776629ccadfd Reviewed-on: https://go-review.googlesource.com/c/go/+/280713 Run-TryBot: Baokun Lee Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills Trust: Jay Conrod Trust: Bryan C. Mills --- src/cmd/go/internal/modload/import.go | 12 +++--------- src/cmd/go/internal/modload/init.go | 4 ++-- src/cmd/go/internal/modload/load.go | 4 +--- src/cmd/go/internal/modload/modfile.go | 2 +- src/cmd/go/testdata/script/mod_bad_domain.txt | 2 +- src/cmd/go/testdata/script/mod_get_replaced.txt | 2 +- src/cmd/go/testdata/script/mod_gobuild_import.txt | 2 +- src/cmd/go/testdata/script/mod_init_tidy.txt | 4 ++-- .../go/testdata/script/mod_install_pkg_version.txt | 6 +++--- src/cmd/go/testdata/script/mod_list_bad_import.txt | 2 +- src/cmd/go/testdata/script/mod_readonly.txt | 10 +++++----- src/cmd/go/testdata/script/mod_replace_readonly.txt | 6 +++--- src/cmd/go/testdata/script/mod_sum_ambiguous.txt | 4 ++-- src/cmd/go/testdata/script/mod_sum_readonly.txt | 10 +++++----- 14 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index c16531e2f4..055878c528 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -31,10 +31,6 @@ type ImportMissingError struct { Module module.Version QueryErr error - // inAll indicates whether Path is in the "all" package pattern, - // and thus would be added by 'go mod tidy'. - inAll bool - // isStd indicates whether we would expect to find the package in the standard // library. This is normally true for all dotless import paths, but replace // directives can cause us to treat the replaced paths as also being in @@ -67,16 +63,14 @@ func (e *ImportMissingError) Error() string { if !modfetch.IsZeroPseudoVersion(e.replaced.Version) { suggestArg = e.replaced.String() } - return fmt.Sprintf("module %s provides package %s and is replaced but not required; try 'go get -d %s' to add it", e.replaced.Path, e.Path, suggestArg) + return fmt.Sprintf("module %s provides package %s and is replaced but not required; to add it:\n\tgo get %s", e.replaced.Path, e.Path, suggestArg) } suggestion := "" if !HasModRoot() { suggestion = ": working directory is not part of a module" - } else if e.inAll { - suggestion = "; try 'go mod tidy' to add it" } else { - suggestion = fmt.Sprintf("; try 'go get -d %s' to add it", e.Path) + suggestion = fmt.Sprintf("; to add it:\n\tgo get %s", e.Path) } return fmt.Sprintf("no required module provides package %s%s", e.Path, suggestion) } @@ -151,7 +145,7 @@ func (e *ImportMissingSumError) Error() string { message = fmt.Sprintf("missing go.sum entry for module providing package %s", e.importPath) } if e.inAll { - return message + "; try 'go mod tidy' to add it" + return message + "; to add it:\n\tgo mod tidy" } return message } diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index b0acb7b25d..348c8e66c9 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -458,7 +458,7 @@ func CreateModFile(ctx context.Context, modPath string) { } } if !empty { - fmt.Fprintf(os.Stderr, "go: run 'go mod tidy' to add module requirements and sums\n") + fmt.Fprintf(os.Stderr, "go: to add module requirements and sums:\n\tgo mod tidy\n") } } @@ -907,7 +907,7 @@ func WriteGoMod() { } else if cfg.BuildModReason != "" { base.Fatalf("go: updates to go.mod needed, disabled by -mod=readonly\n\t(%s)", cfg.BuildModReason) } else { - base.Fatalf("go: updates to go.mod needed; try 'go mod tidy' first") + base.Fatalf("go: updates to go.mod needed; to update it:\n\tgo mod tidy") } } diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 9a8b0cf177..ae5b8ef6ab 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -281,9 +281,7 @@ func LoadPackages(ctx context.Context, opts PackageOpts, patterns ...string) (ma for _, pkg := range loaded.pkgs { if pkg.err != nil { if pkg.flags.has(pkgInAll) { - if imErr := (*ImportMissingError)(nil); errors.As(pkg.err, &imErr) { - imErr.inAll = true - } else if sumErr := (*ImportMissingSumError)(nil); errors.As(pkg.err, &sumErr) { + if sumErr := (*ImportMissingSumError)(nil); errors.As(pkg.err, &sumErr) { sumErr.inAll = true } } diff --git a/src/cmd/go/internal/modload/modfile.go b/src/cmd/go/internal/modload/modfile.go index d5a17236cd..c6667d0bf7 100644 --- a/src/cmd/go/internal/modload/modfile.go +++ b/src/cmd/go/internal/modload/modfile.go @@ -449,7 +449,7 @@ func goModSummary(m module.Version) (*modFileSummary, error) { if HasModRoot() && cfg.BuildMod == "readonly" && actual.Version != "" { key := module.Version{Path: actual.Path, Version: actual.Version + "/go.mod"} if !modfetch.HaveSum(key) { - suggestion := fmt.Sprintf("; try 'go mod download %s' to add it", m.Path) + suggestion := fmt.Sprintf("; to add it:\n\tgo mod download %s", m.Path) return nil, module.VersionError(actual, &sumMissingError{suggestion: suggestion}) } } diff --git a/src/cmd/go/testdata/script/mod_bad_domain.txt b/src/cmd/go/testdata/script/mod_bad_domain.txt index 20199c1c2c..7a270d0f07 100644 --- a/src/cmd/go/testdata/script/mod_bad_domain.txt +++ b/src/cmd/go/testdata/script/mod_bad_domain.txt @@ -19,7 +19,7 @@ stderr 'malformed module path "x/y.z": missing dot in first path element' ! go build ./useappengine stderr '^useappengine[/\\]x.go:2:8: cannot find package$' ! go build ./usenonexistent -stderr '^usenonexistent[/\\]x.go:2:8: no required module provides package nonexistent.rsc.io; try ''go mod tidy'' to add it$' +stderr '^usenonexistent[/\\]x.go:2:8: no required module provides package nonexistent.rsc.io; to add it:\n\tgo get nonexistent.rsc.io$' # 'get -d' should be similarly definitive diff --git a/src/cmd/go/testdata/script/mod_get_replaced.txt b/src/cmd/go/testdata/script/mod_get_replaced.txt index 76d0793ffe..d97f3f1a40 100644 --- a/src/cmd/go/testdata/script/mod_get_replaced.txt +++ b/src/cmd/go/testdata/script/mod_get_replaced.txt @@ -87,7 +87,7 @@ stderr '^go get: malformed module path "example": missing dot in first path elem go mod edit -replace example@v0.1.0=./example ! go list example -stderr '^module example provides package example and is replaced but not required; try ''go get -d example@v0.1.0'' to add it$' +stderr '^module example provides package example and is replaced but not required; to add it:\n\tgo get example@v0.1.0$' go get -d example go list -m example diff --git a/src/cmd/go/testdata/script/mod_gobuild_import.txt b/src/cmd/go/testdata/script/mod_gobuild_import.txt index 3a133663ec..c13ae844b5 100644 --- a/src/cmd/go/testdata/script/mod_gobuild_import.txt +++ b/src/cmd/go/testdata/script/mod_gobuild_import.txt @@ -19,7 +19,7 @@ exec $WORK/testimport$GOEXE other/x/y/z/w . stdout w2.go ! exec $WORK/testimport$GOEXE gobuild.example.com/x/y/z/w . -stderr 'no required module provides package gobuild.example.com/x/y/z/w; try ''go get -d gobuild.example.com/x/y/z/w'' to add it' +stderr 'no required module provides package gobuild.example.com/x/y/z/w; to add it:\n\tgo get gobuild.example.com/x/y/z/w' cd z exec $WORK/testimport$GOEXE other/x/y/z/w . diff --git a/src/cmd/go/testdata/script/mod_init_tidy.txt b/src/cmd/go/testdata/script/mod_init_tidy.txt index 6a37edd960..4a525903b2 100644 --- a/src/cmd/go/testdata/script/mod_init_tidy.txt +++ b/src/cmd/go/testdata/script/mod_init_tidy.txt @@ -8,14 +8,14 @@ cd .. # 'go mod init' should recommend 'go mod tidy' if the directory has a .go file. cd pkginroot go mod init m -stderr '^go: run ''go mod tidy'' to add module requirements and sums$' +stderr '^go: to add module requirements and sums:\n\tgo mod tidy$' cd .. # 'go mod init' should recommend 'go mod tidy' if the directory has a # subdirectory. We don't walk the tree to see if it has .go files. cd subdir go mod init m -stderr '^go: run ''go mod tidy'' to add module requirements and sums$' +stderr '^go: to add module requirements and sums:\n\tgo mod tidy$' cd .. -- empty/empty.txt -- 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 93896d4593..e27ebc5cc5 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,7 @@ env GO111MODULE=auto 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; try ''go mod download example.com/cmd'' to add it$' +stderr '^go: example.com/cmd@v1.1.0-doesnotexist: missing go.sum entry; 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 @@ -67,9 +67,9 @@ cd tmp go mod init tmp go mod edit -require=rsc.io/fortune@v1.0.0 ! go install -mod=readonly $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0 -stderr '^go: rsc.io/fortune@v1.0.0: missing go.sum entry; try ''go mod download rsc.io/fortune'' to add it$' +stderr '^go: rsc.io/fortune@v1.0.0: missing go.sum entry; to add it:\n\tgo mod download rsc.io/fortune$' ! go install -mod=readonly ../../pkg/mod/rsc.io/fortune@v1.0.0 -stderr '^go: rsc.io/fortune@v1.0.0: missing go.sum entry; try ''go mod download rsc.io/fortune'' to add it$' +stderr '^go: rsc.io/fortune@v1.0.0: missing go.sum entry; to add it:\n\tgo mod download rsc.io/fortune$' go get -d rsc.io/fortune@v1.0.0 go install -mod=readonly $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0 exists $GOPATH/bin/fortune$GOEXE diff --git a/src/cmd/go/testdata/script/mod_list_bad_import.txt b/src/cmd/go/testdata/script/mod_list_bad_import.txt index 3cd50b0de2..b128408a61 100644 --- a/src/cmd/go/testdata/script/mod_list_bad_import.txt +++ b/src/cmd/go/testdata/script/mod_list_bad_import.txt @@ -39,7 +39,7 @@ stdout example.com/notfound # Listing the missing dependency directly should fail outright... ! go list -f '{{if .Error}}error{{end}} {{if .Incomplete}}incomplete{{end}}' example.com/notfound -stderr 'no required module provides package example.com/notfound; try ''go get -d example.com/notfound'' to add it' +stderr 'no required module provides package example.com/notfound; to add it:\n\tgo get example.com/notfound' ! stdout error ! stdout incomplete diff --git a/src/cmd/go/testdata/script/mod_readonly.txt b/src/cmd/go/testdata/script/mod_readonly.txt index ca8cd6e068..176be72967 100644 --- a/src/cmd/go/testdata/script/mod_readonly.txt +++ b/src/cmd/go/testdata/script/mod_readonly.txt @@ -13,7 +13,7 @@ cmp go.mod go.mod.empty # -mod=readonly should be set by default. env GOFLAGS= ! go list all -stderr '^x.go:2:8: no required module provides package rsc\.io/quote; try ''go mod tidy'' to add it$' +stderr '^x.go:2:8: no required module provides package rsc\.io/quote; to add it:\n\tgo get rsc\.io/quote$' cmp go.mod go.mod.empty env GOFLAGS=-mod=readonly @@ -51,7 +51,7 @@ cmp go.mod go.mod.inconsistent # We get a different message when -mod=readonly is used by default. env GOFLAGS= ! go list -stderr '^go: updates to go.mod needed; try ''go mod tidy'' first$' +stderr '^go: updates to go.mod needed; to update it:\n\tgo mod tidy' # However, it should not reject files missing a 'go' directive, # since that was not always required. @@ -75,15 +75,15 @@ cmp go.mod go.mod.indirect cp go.mod.untidy go.mod ! go list all -stderr '^x.go:2:8: no required module provides package rsc.io/quote; try ''go mod tidy'' to add it$' +stderr '^x.go:2:8: no required module provides package rsc.io/quote; to add it:\n\tgo get rsc.io/quote$' ! go list -deps . -stderr '^x.go:2:8: no required module provides package rsc.io/quote; try ''go mod tidy'' to add it$' +stderr '^x.go:2:8: no required module provides package rsc.io/quote; to add it:\n\tgo get rsc.io/quote$' # However, if we didn't see an import from the main module, we should suggest # 'go get -d' instead, because we don't know whether 'go mod tidy' would add it. ! go list rsc.io/quote -stderr '^no required module provides package rsc.io/quote; try ''go get -d rsc.io/quote'' to add it$' +stderr '^no required module provides package rsc.io/quote; to add it:\n\tgo get rsc.io/quote$' -- go.mod -- diff --git a/src/cmd/go/testdata/script/mod_replace_readonly.txt b/src/cmd/go/testdata/script/mod_replace_readonly.txt index 882c755337..d950d78bd3 100644 --- a/src/cmd/go/testdata/script/mod_replace_readonly.txt +++ b/src/cmd/go/testdata/script/mod_replace_readonly.txt @@ -9,7 +9,7 @@ cp go.mod go.mod.orig # can't in readonly mode, since its go.mod may alter the build list. go mod edit -replace rsc.io/quote=./quote ! go list rsc.io/quote -stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; try ''go get -d rsc.io/quote'' to add it$' +stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; to add it:\n\tgo get rsc.io/quote$' go get -d rsc.io/quote cmp go.mod go.mod.latest go list rsc.io/quote @@ -18,7 +18,7 @@ cp go.mod.orig go.mod # Same test with a specific version. go mod edit -replace rsc.io/quote@v1.0.0-doesnotexist=./quote ! go list rsc.io/quote -stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; try ''go get -d rsc.io/quote@v1.0.0-doesnotexist'' to add it$' +stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; to add it:\n\tgo get rsc.io/quote@v1.0.0-doesnotexist$' go get -d rsc.io/quote@v1.0.0-doesnotexist cmp go.mod go.mod.specific go list rsc.io/quote @@ -28,7 +28,7 @@ cp go.mod.orig go.mod go mod edit -replace rsc.io/quote@v1.0.0-doesnotexist=./quote go mod edit -replace rsc.io/quote@v1.1.0-doesnotexist=./quote ! go list rsc.io/quote -stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; try ''go get -d rsc.io/quote@v1.1.0-doesnotexist'' to add it$' +stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; to add it:\n\tgo get rsc.io/quote@v1.1.0-doesnotexist$' -- go.mod -- module m diff --git a/src/cmd/go/testdata/script/mod_sum_ambiguous.txt b/src/cmd/go/testdata/script/mod_sum_ambiguous.txt index 999257c419..08107bf37c 100644 --- a/src/cmd/go/testdata/script/mod_sum_ambiguous.txt +++ b/src/cmd/go/testdata/script/mod_sum_ambiguous.txt @@ -17,13 +17,13 @@ cp go.sum.a-only go.sum ! go list example.com/ambiguous/a/b stderr '^missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module$' ! go list -deps . -stderr '^use.go:3:8: missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module; try ''go mod tidy'' to add it$' +stderr '^use.go:3:8: missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module; to add it:\n\tgo mod tidy$' cp go.sum.b-only go.sum ! go list example.com/ambiguous/a/b stderr '^missing go.sum entry for module providing package example.com/ambiguous/a/b$' ! go list -deps . -stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b; try ''go mod tidy'' to add it$' +stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b; to add it:\n\tgo mod tidy$' -- go.mod -- module m diff --git a/src/cmd/go/testdata/script/mod_sum_readonly.txt b/src/cmd/go/testdata/script/mod_sum_readonly.txt index 4d6e8aae6a..866f4c1ae4 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 @@ env GO111MODULE=on # 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; try ''go mod download rsc.io/quote'' to add it$' +stderr '^go: rsc.io/quote@v1.5.2: missing go.sum entry; 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 @@ stderr '^go: rsc.io/quote@v1.5.2: missing go.sum entry; try ''go mod download rs # 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; try ''go mod download rsc.io/quote'' to add it$' +stderr '^go: rsc.io/quote@v1.5.2: missing go.sum entry; 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 @@ rm go.sum 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; try ''go mod download rsc.io/quote'' to add it$' +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$' ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.1.mod ! exists go.sum cp go.mod.orig go.mod @@ -35,7 +35,7 @@ exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.mod # When a sum is needed to load a .mod file for a package outside the build list, # we get a generic missing import error. ! go list example.com/doesnotexist -stderr '^no required module provides package example.com/doesnotexist; try ''go get -d example.com/doesnotexist'' to add it$' +stderr '^no required module provides package example.com/doesnotexist; to add it:\n\tgo get example.com/doesnotexist$' # When a sum is needed to load a .zip file, we get a more specific error. # The .zip file is not downloaded. @@ -47,7 +47,7 @@ stderr '^missing go.sum entry for module providing package rsc.io/quote$' # a package that imports it without that error. go list -e -deps -f '{{.ImportPath}}{{with .Error}} {{.Err}}{{end}}' . stdout '^m$' -stdout '^rsc.io/quote missing go.sum entry for module providing package rsc.io/quote; try ''go mod tidy'' to add it$' +stdout '^rsc.io/quote missing go.sum entry for module providing package rsc.io/quote; to add it:\n\tgo mod tidy$' ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip # go.sum should not have been written. -- GitLab From 4787e906cff56ae23028df12c68331745651ec9e Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Tue, 5 Jan 2021 20:52:00 +0100 Subject: [PATCH 1596/1792] crypto/x509: rollback new CertificateRequest fields In general, we don't want to encourage reading them from CSRs, and applications that really want to can parse the Extensions field. Note that this also fixes a bug where the error of parseKeyUsageExtension was not handled in parseCertificateRequest. Fixes #43477 Updates #37172 Change-Id: Ia5707b0e23cecc0aed57e419a1ca25e26eea6bbe Reviewed-on: https://go-review.googlesource.com/c/go/+/281235 Trust: Filippo Valsorda Run-TryBot: Filippo Valsorda TryBot-Result: Go Bot Reviewed-by: Roland Shoemaker --- api/go1.16.txt | 9 ---- doc/go1.16.html | 8 ---- src/crypto/x509/x509.go | 84 ------------------------------------ src/crypto/x509/x509_test.go | 56 +++++++++++------------- 4 files changed, 25 insertions(+), 132 deletions(-) diff --git a/api/go1.16.txt b/api/go1.16.txt index 16d9cb891b..baac5379f8 100644 --- a/api/go1.16.txt +++ b/api/go1.16.txt @@ -1,15 +1,6 @@ pkg archive/zip, method (*ReadCloser) Open(string) (fs.File, error) pkg archive/zip, method (*Reader) Open(string) (fs.File, error) pkg crypto/x509, method (SystemRootsError) Unwrap() error -pkg crypto/x509, type CertificateRequest struct, BasicConstraintsValid bool -pkg crypto/x509, type CertificateRequest struct, ExtKeyUsage []ExtKeyUsage -pkg crypto/x509, type CertificateRequest struct, IsCA bool -pkg crypto/x509, type CertificateRequest struct, KeyUsage KeyUsage -pkg crypto/x509, type CertificateRequest struct, MaxPathLen int -pkg crypto/x509, type CertificateRequest struct, MaxPathLenZero bool -pkg crypto/x509, type CertificateRequest struct, PolicyIdentifiers []asn1.ObjectIdentifier -pkg crypto/x509, type CertificateRequest struct, SubjectKeyId []uint8 -pkg crypto/x509, type CertificateRequest struct, UnknownExtKeyUsage []asn1.ObjectIdentifier pkg debug/elf, const DT_ADDRRNGHI = 1879047935 pkg debug/elf, const DT_ADDRRNGHI DynTag pkg debug/elf, const DT_ADDRRNGLO = 1879047680 diff --git a/doc/go1.16.html b/doc/go1.16.html index 0c2921fe6b..f0dbee7b89 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -590,14 +590,6 @@ func TestFoo(t *testing.T) { a malformed certificate.

-

- A number of additional fields have been added to the - CertificateRequest type. - These fields are now parsed in - ParseCertificateRequest and marshalled in - CreateCertificateRequest. -

-

DSA signature verification is no longer supported. Note that DSA signature generation was never supported. diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 60dfac741b..42d8158d63 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -2006,40 +2006,6 @@ func buildCSRExtensions(template *CertificateRequest) ([]pkix.Extension, error) ret = append(ret, ext) } - if (len(template.ExtKeyUsage) > 0 || len(template.UnknownExtKeyUsage) > 0) && - !oidInExtensions(oidExtensionExtendedKeyUsage, template.ExtraExtensions) { - ext, err := marshalExtKeyUsage(template.ExtKeyUsage, template.UnknownExtKeyUsage) - if err != nil { - return nil, err - } - ret = append(ret, ext) - } - - if template.BasicConstraintsValid && !oidInExtensions(oidExtensionBasicConstraints, template.ExtraExtensions) { - ext, err := marshalBasicConstraints(template.IsCA, template.MaxPathLen, template.MaxPathLenZero) - if err != nil { - return nil, err - } - ret = append(ret, ext) - } - - if len(template.SubjectKeyId) > 0 && !oidInExtensions(oidExtensionSubjectKeyId, template.ExtraExtensions) { - skidBytes, err := asn1.Marshal(template.SubjectKeyId) - if err != nil { - return nil, err - } - ret = append(ret, pkix.Extension{Id: oidExtensionSubjectKeyId, Value: skidBytes}) - } - - if len(template.PolicyIdentifiers) > 0 && - !oidInExtensions(oidExtensionCertificatePolicies, template.ExtraExtensions) { - ext, err := marshalCertificatePolicies(template.PolicyIdentifiers) - if err != nil { - return nil, err - } - ret = append(ret, ext) - } - return append(ret, template.ExtraExtensions...), nil } @@ -2438,37 +2404,6 @@ type CertificateRequest struct { EmailAddresses []string IPAddresses []net.IP URIs []*url.URL - - ExtKeyUsage []ExtKeyUsage // Sequence of extended key usages. - UnknownExtKeyUsage []asn1.ObjectIdentifier // Encountered extended key usages unknown to this package. - - // BasicConstraintsValid indicates whether IsCA, MaxPathLen, - // and MaxPathLenZero are valid. - BasicConstraintsValid bool - IsCA bool - - // MaxPathLen and MaxPathLenZero indicate the presence and - // value of the BasicConstraints' "pathLenConstraint". - // - // When parsing a certificate, a positive non-zero MaxPathLen - // means that the field was specified, -1 means it was unset, - // and MaxPathLenZero being true mean that the field was - // explicitly set to zero. The case of MaxPathLen==0 with MaxPathLenZero==false - // should be treated equivalent to -1 (unset). - // - // When generating a certificate, an unset pathLenConstraint - // can be requested with either MaxPathLen == -1 or using the - // zero value for both MaxPathLen and MaxPathLenZero. - MaxPathLen int - // MaxPathLenZero indicates that BasicConstraintsValid==true - // and MaxPathLen==0 should be interpreted as an actual - // maximum path length of zero. Otherwise, that combination is - // interpreted as MaxPathLen not being set. - MaxPathLenZero bool - - SubjectKeyId []byte - - PolicyIdentifiers []asn1.ObjectIdentifier } // These structures reflect the ASN.1 structure of X.509 certificate @@ -2801,25 +2736,6 @@ func parseCertificateRequest(in *certificateRequest) (*CertificateRequest, error } case extension.Id.Equal(oidExtensionKeyUsage): out.KeyUsage, err = parseKeyUsageExtension(extension.Value) - case extension.Id.Equal(oidExtensionExtendedKeyUsage): - out.ExtKeyUsage, out.UnknownExtKeyUsage, err = parseExtKeyUsageExtension(extension.Value) - if err != nil { - return nil, err - } - case extension.Id.Equal(oidExtensionBasicConstraints): - out.IsCA, out.MaxPathLen, err = parseBasicConstraintsExtension(extension.Value) - if err != nil { - return nil, err - } - out.BasicConstraintsValid = true - out.MaxPathLenZero = out.MaxPathLen == 0 - case extension.Id.Equal(oidExtensionSubjectKeyId): - out.SubjectKeyId, err = parseSubjectKeyIdExtension(extension.Value) - if err != nil { - return nil, err - } - case extension.Id.Equal(oidExtensionCertificatePolicies): - out.PolicyIdentifiers, err = parseCertificatePoliciesExtension(extension.Value) if err != nil { return nil, err } diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index 65d105db34..d5c7ec466b 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -2964,44 +2964,38 @@ func certPoolEqual(a, b *CertPool) bool { } func TestCertificateRequestRoundtripFields(t *testing.T) { + urlA, err := url.Parse("https://example.com/_") + if err != nil { + t.Fatal(err) + } + urlB, err := url.Parse("https://example.org/_") + if err != nil { + t.Fatal(err) + } in := &CertificateRequest{ - KeyUsage: KeyUsageCertSign, - ExtKeyUsage: []ExtKeyUsage{ExtKeyUsageAny}, - UnknownExtKeyUsage: []asn1.ObjectIdentifier{{1, 2, 3}}, - BasicConstraintsValid: true, - IsCA: true, - MaxPathLen: 0, - MaxPathLenZero: true, - SubjectKeyId: []byte{1, 2, 3}, - PolicyIdentifiers: []asn1.ObjectIdentifier{{1, 2, 3}}, + DNSNames: []string{"example.com", "example.org"}, + EmailAddresses: []string{"a@example.com", "b@example.com"}, + IPAddresses: []net.IP{net.IPv4(192, 0, 2, 0), net.IPv6loopback}, + URIs: []*url.URL{urlA, urlB}, + KeyUsage: KeyUsageCertSign, } out := marshalAndParseCSR(t, in) - if in.KeyUsage != out.KeyUsage { - t.Fatalf("Unexpected KeyUsage: got %v, want %v", out.KeyUsage, in.KeyUsage) - } - if !reflect.DeepEqual(in.ExtKeyUsage, out.ExtKeyUsage) { - t.Fatalf("Unexpected ExtKeyUsage: got %v, want %v", out.ExtKeyUsage, in.ExtKeyUsage) - } - if !reflect.DeepEqual(in.UnknownExtKeyUsage, out.UnknownExtKeyUsage) { - t.Fatalf("Unexpected UnknownExtKeyUsage: got %v, want %v", out.UnknownExtKeyUsage, in.UnknownExtKeyUsage) + if !reflect.DeepEqual(in.DNSNames, out.DNSNames) { + t.Fatalf("Unexpected DNSNames: got %v, want %v", out.DNSNames, in.DNSNames) } - if in.BasicConstraintsValid != out.BasicConstraintsValid { - t.Fatalf("Unexpected BasicConstraintsValid: got %v, want %v", out.BasicConstraintsValid, in.BasicConstraintsValid) + if !reflect.DeepEqual(in.EmailAddresses, out.EmailAddresses) { + t.Fatalf("Unexpected EmailAddresses: got %v, want %v", out.EmailAddresses, in.EmailAddresses) } - if in.IsCA != out.IsCA { - t.Fatalf("Unexpected IsCA: got %v, want %v", out.IsCA, in.IsCA) + if len(in.IPAddresses) != len(out.IPAddresses) || + !in.IPAddresses[0].Equal(out.IPAddresses[0]) || + !in.IPAddresses[1].Equal(out.IPAddresses[1]) { + t.Fatalf("Unexpected IPAddresses: got %v, want %v", out.IPAddresses, in.IPAddresses) } - if in.MaxPathLen != out.MaxPathLen { - t.Fatalf("Unexpected MaxPathLen: got %v, want %v", out.MaxPathLen, in.MaxPathLen) + if !reflect.DeepEqual(in.URIs, out.URIs) { + t.Fatalf("Unexpected URIs: got %v, want %v", out.URIs, in.URIs) } - if in.MaxPathLenZero != out.MaxPathLenZero { - t.Fatalf("Unexpected MaxPathLenZero: got %v, want %v", out.MaxPathLenZero, in.MaxPathLenZero) - } - if !reflect.DeepEqual(in.SubjectKeyId, out.SubjectKeyId) { - t.Fatalf("Unexpected SubjectKeyId: got %v, want %v", out.SubjectKeyId, in.SubjectKeyId) - } - if !reflect.DeepEqual(in.PolicyIdentifiers, out.PolicyIdentifiers) { - t.Fatalf("Unexpected PolicyIdentifiers: got %v, want %v", out.PolicyIdentifiers, in.PolicyIdentifiers) + if in.KeyUsage != out.KeyUsage { + t.Fatalf("Unexpected KeyUsage: got %v, want %v", out.KeyUsage, in.KeyUsage) } } -- GitLab From df81a15819d5b264e6451976a2884953e8d28b20 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Wed, 18 Nov 2020 10:28:18 +0800 Subject: [PATCH 1597/1792] runtime: check mips64 VDSO clock_gettime return code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We introduced VDSO feature for mips64x in Go1.14, however Linux kernel didn't ship VDSO safe fallback until 4.13. This CL checks vdso return code it may fix this issue. name old time/op new time/op delta Now 174ns ± 0% 176ns ± 0% +1.20% (p=0.000 n=8+9) NowUnixNano 175ns ± 0% 177ns ± 0% +1.13% (p=0.000 n=9+7) FormatNow 1.01µs ± 1% 1.02µs ± 3% ~ (p=0.181 n=10+10) Fixes #39046 Change-Id: Ibcefe4c8334f634c7ef18fa70f3c7dbe8306f224 Reviewed-on: https://go-review.googlesource.com/c/go/+/270717 Run-TryBot: Meng Zhuo Reviewed-by: Ian Lance Taylor Trust: Michael Pratt Trust: Meng Zhuo --- src/runtime/sys_linux_mips64x.s | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/runtime/sys_linux_mips64x.s b/src/runtime/sys_linux_mips64x.s index afad056d06..c3e9f37694 100644 --- a/src/runtime/sys_linux_mips64x.s +++ b/src/runtime/sys_linux_mips64x.s @@ -250,6 +250,14 @@ noswitch: BEQ R25, fallback JAL (R25) + // check on vdso call return for kernel compatibility + // see https://golang.org/issues/39046 + // if we get any error make fallback permanent. + BEQ R2, R0, finish + MOVV R0, runtime·vdsoClockgettimeSym(SB) + MOVW $0, R4 // CLOCK_REALTIME + MOVV $0(R29), R5 + JMP fallback finish: MOVV 0(R29), R3 // sec @@ -311,6 +319,12 @@ noswitch: BEQ R25, fallback JAL (R25) + // see walltime1 for detail + BEQ R2, R0, finish + MOVV R0, runtime·vdsoClockgettimeSym(SB) + MOVW $1, R4 // CLOCK_MONOTONIC + MOVV $0(R29), R5 + JMP fallback finish: MOVV 0(R29), R3 // sec -- GitLab From 6da2d3b7d7f9c0063bc4128c2453db65c96f5299 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Thu, 7 Jan 2021 14:25:35 +0000 Subject: [PATCH 1598/1792] cmd/link: fix typo in asm.go targetting -> targeting Change-Id: Ie1752b1293426fe908799731acb352408db98d85 GitHub-Last-Rev: 4cf2a211b97655a178f842d20c08ac26002df898 GitHub-Pull-Request: golang/go#43564 Reviewed-on: https://go-review.googlesource.com/c/go/+/282272 Trust: Than McIntosh Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/arm64/asm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index d6c25fac41..14a20a17d5 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -1041,7 +1041,7 @@ func gensymlate(ctxt *ld.Link, ldr *loader.Loader) { } // machoLabelName returns the name of the "label" symbol used for a -// relocation targetting s+off. The label symbols is used on darwin +// relocation targeting s+off. The label symbols is used on darwin // when external linking, so that the addend fits in a Mach-O relocation. func machoLabelName(ldr *loader.Loader, s loader.Sym, off int64) string { return fmt.Sprintf("%s.%d", ldr.SymExtname(s), off/machoRelocLimit) -- GitLab From e60cffa4ca9ae726d96b53817d82d98402017772 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 21 Dec 2020 11:21:59 -0800 Subject: [PATCH 1599/1792] html/template: attach functions to namespace The text/template functions are stored in a data structure shared by all related templates, so do the same with the original, unwrapped, functions on the html/template side. For #39807 Fixes #43295 Change-Id: I9f64a0a601f1151c863a2833b5be2baf649b6cef Reviewed-on: https://go-review.googlesource.com/c/go/+/279492 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Emmanuel Odeke --- src/html/template/exec_test.go | 20 +++++++++++++++ src/html/template/template.go | 46 ++++++++++++++++++++-------------- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/html/template/exec_test.go b/src/html/template/exec_test.go index eb00824260..cd6b78a1a9 100644 --- a/src/html/template/exec_test.go +++ b/src/html/template/exec_test.go @@ -1776,3 +1776,23 @@ func TestRecursiveExecute(t *testing.T) { t.Fatal(err) } } + +// Issue 43295. +func TestTemplateFuncsAfterClone(t *testing.T) { + s := `{{ f . }}` + want := "test" + orig := New("orig").Funcs(map[string]interface{}{ + "f": func(in string) string { + return in + }, + }).New("child") + + overviewTmpl := Must(Must(orig.Clone()).Parse(s)) + var out strings.Builder + if err := overviewTmpl.Execute(&out, want); err != nil { + t.Fatal(err) + } + if got := out.String(); got != want { + t.Fatalf("got %q; want %q", got, want) + } +} diff --git a/src/html/template/template.go b/src/html/template/template.go index 09d71d43e2..1ff7e1f7a0 100644 --- a/src/html/template/template.go +++ b/src/html/template/template.go @@ -27,9 +27,7 @@ type Template struct { // template's in sync. text *template.Template // The underlying template's parse tree, updated to be HTML-safe. - Tree *parse.Tree - // The original functions, before wrapping. - funcMap FuncMap + Tree *parse.Tree *nameSpace // common to all associated templates } @@ -42,6 +40,8 @@ type nameSpace struct { set map[string]*Template escaped bool esc escaper + // The original functions, before wrapping. + funcMap FuncMap } // Templates returns a slice of the templates associated with t, including t @@ -260,7 +260,6 @@ func (t *Template) AddParseTree(name string, tree *parse.Tree) (*Template, error nil, text, text.Tree, - nil, t.nameSpace, } t.set[name] = ret @@ -287,14 +286,19 @@ func (t *Template) Clone() (*Template, error) { } ns := &nameSpace{set: make(map[string]*Template)} ns.esc = makeEscaper(ns) + if t.nameSpace.funcMap != nil { + ns.funcMap = make(FuncMap, len(t.nameSpace.funcMap)) + for name, fn := range t.nameSpace.funcMap { + ns.funcMap[name] = fn + } + } + wrapFuncs(ns, textClone, ns.funcMap) ret := &Template{ nil, textClone, textClone.Tree, - t.funcMap, ns, } - ret.wrapFuncs() ret.set[ret.Name()] = ret for _, x := range textClone.Templates() { name := x.Name() @@ -307,10 +311,8 @@ func (t *Template) Clone() (*Template, error) { nil, x, x.Tree, - src.funcMap, ret.nameSpace, } - tc.wrapFuncs() ret.set[name] = tc } // Return the template associated with the name of this template. @@ -325,7 +327,6 @@ func New(name string) *Template { nil, template.New(name), nil, - nil, ns, } tmpl.set[name] = tmpl @@ -351,7 +352,6 @@ func (t *Template) new(name string) *Template { nil, t.text.New(name), nil, - nil, t.nameSpace, } if existing, ok := tmpl.set[name]; ok { @@ -382,23 +382,31 @@ type FuncMap map[string]interface{} // type. However, it is legal to overwrite elements of the map. The return // value is the template, so calls can be chained. func (t *Template) Funcs(funcMap FuncMap) *Template { - t.funcMap = funcMap - t.wrapFuncs() + t.nameSpace.mu.Lock() + if t.nameSpace.funcMap == nil { + t.nameSpace.funcMap = make(FuncMap, len(funcMap)) + } + for name, fn := range funcMap { + t.nameSpace.funcMap[name] = fn + } + t.nameSpace.mu.Unlock() + + wrapFuncs(t.nameSpace, t.text, funcMap) return t } // wrapFuncs records the functions with text/template. We wrap them to // unlock the nameSpace. See TestRecursiveExecute for a test case. -func (t *Template) wrapFuncs() { - if len(t.funcMap) == 0 { +func wrapFuncs(ns *nameSpace, textTemplate *template.Template, funcMap FuncMap) { + if len(funcMap) == 0 { return } - tfuncs := make(template.FuncMap, len(t.funcMap)) - for name, fn := range t.funcMap { + tfuncs := make(template.FuncMap, len(funcMap)) + for name, fn := range funcMap { fnv := reflect.ValueOf(fn) wrapper := func(args []reflect.Value) []reflect.Value { - t.nameSpace.mu.RUnlock() - defer t.nameSpace.mu.RLock() + ns.mu.RUnlock() + defer ns.mu.RLock() if fnv.Type().IsVariadic() { return fnv.CallSlice(args) } else { @@ -408,7 +416,7 @@ func (t *Template) wrapFuncs() { wrapped := reflect.MakeFunc(fnv.Type(), wrapper) tfuncs[name] = wrapped.Interface() } - t.text.Funcs(tfuncs) + textTemplate.Funcs(tfuncs) } // Delims sets the action delimiters to the specified strings, to be used in -- GitLab From 7cee66d4cb6e726c6c37798583ac0b86c8743f82 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 6 Jan 2021 22:13:45 -0500 Subject: [PATCH 1600/1792] cmd/go: add documentation for Embed fields in go list output This change the struct fields for EmbedPatterns and EmbedFiles to the Package struct listed in the go list documentation that specifies the fields available to the go list template. Fixes #43081 Change-Id: I89c325a9d6292a6ce484ee588b172d2f84e2333a Reviewed-on: https://go-review.googlesource.com/c/go/+/282195 Trust: Michael Matloob Run-TryBot: Michael Matloob TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/go/alldocs.go | 4 ++++ src/cmd/go/internal/list/list.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 78f114f6af..d4303c2aad 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -840,6 +840,10 @@ // TestGoFiles []string // _test.go files in package // XTestGoFiles []string // _test.go files outside package // +// // Embedded files +// EmbedPatterns []string // //go:embed patterns +// EmbedFiles []string // files and directories matched by EmbedPatterns +// // // Cgo directives // CgoCFLAGS []string // cgo: flags for C compiler // CgoCPPFLAGS []string // cgo: flags for C preprocessor diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index ce6f579c05..61d3bc53d3 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -89,6 +89,10 @@ to -f '{{.ImportPath}}'. The struct being passed to the template is: TestGoFiles []string // _test.go files in package XTestGoFiles []string // _test.go files outside package + // Embedded files + EmbedPatterns []string // //go:embed patterns + EmbedFiles []string // files and directories matched by EmbedPatterns + // Cgo directives CgoCFLAGS []string // cgo: flags for C compiler CgoCPPFLAGS []string // cgo: flags for C preprocessor -- GitLab From fa90aaca7d523eaf81c02b48a412cad4ebc57817 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Thu, 7 Jan 2021 21:45:00 +0700 Subject: [PATCH 1601/1792] cmd/compile: fix late expand_calls leaf type for OpStructSelect/OpArraySelect For the example in #43551, before late call expansion, the OpArg type is decomposed to int64. But the late call expansion is currently decompose it to "x.Key" instead. This CL make expand_calls decompose further for struct { 1-field type } and array [1]elem. This matches the previous rules for early decompose args: (StructSelect (StructMake1 x)) => x (ArraySelect (ArrayMake1 x)) => x Fixes #43551 Change-Id: I2f1ebe18cb81cb967f494331c3d237535d2859e7 Reviewed-on: https://go-review.googlesource.com/c/go/+/282332 Trust: Cuong Manh Le Run-TryBot: Cuong Manh Le TryBot-Result: Go Bot Reviewed-by: David Chase --- src/cmd/compile/internal/ssa/expand_calls.go | 3 ++- test/fixedbugs/issue43551.dir/a.go | 13 +++++++++++++ test/fixedbugs/issue43551.dir/b.go | 14 ++++++++++++++ test/fixedbugs/issue43551.go | 7 +++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue43551.dir/a.go create mode 100644 test/fixedbugs/issue43551.dir/b.go create mode 100644 test/fixedbugs/issue43551.go diff --git a/src/cmd/compile/internal/ssa/expand_calls.go b/src/cmd/compile/internal/ssa/expand_calls.go index fbde19d94c..679ee8ad16 100644 --- a/src/cmd/compile/internal/ssa/expand_calls.go +++ b/src/cmd/compile/internal/ssa/expand_calls.go @@ -194,7 +194,8 @@ func expandCalls(f *Func) { } break } - if leaf.Op == OpIData { + switch leaf.Op { + case OpIData, OpStructSelect, OpArraySelect: leafType = removeTrivialWrapperTypes(leaf.Type) } aux := selector.Aux diff --git a/test/fixedbugs/issue43551.dir/a.go b/test/fixedbugs/issue43551.dir/a.go new file mode 100644 index 0000000000..d890dd0c65 --- /dev/null +++ b/test/fixedbugs/issue43551.dir/a.go @@ -0,0 +1,13 @@ +package a + +type S struct { + a Key +} + +func (s S) A() Key { + return s.a +} + +type Key struct { + key int64 +} diff --git a/test/fixedbugs/issue43551.dir/b.go b/test/fixedbugs/issue43551.dir/b.go new file mode 100644 index 0000000000..ba062bf14c --- /dev/null +++ b/test/fixedbugs/issue43551.dir/b.go @@ -0,0 +1,14 @@ +// 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 b + +import "./a" + +type S a.S +type Key a.Key + +func (s S) A() Key { + return Key(a.S(s).A()) +} diff --git a/test/fixedbugs/issue43551.go b/test/fixedbugs/issue43551.go new file mode 100644 index 0000000000..b83fbd7af1 --- /dev/null +++ b/test/fixedbugs/issue43551.go @@ -0,0 +1,7 @@ +// compiledir + +// 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 ignored -- GitLab From 9b55088d6b49fd4bb4832589a1b7e8629de2800c Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 6 Jan 2021 21:59:10 -0500 Subject: [PATCH 1602/1792] doc/go1.16: add release note for disallowing non-ASCII import paths golang.org/cl/251878 disallowed non-ASCII characters in import paths, in module mode. They were already disallowed in module paths, so this change just extended the restriction to the package subdirectory of the module. Update the release notes to alert users of this change. Fixes #43052 Change-Id: I1caf9ef978dd3ac599a3f82c5c376ad62e6fc436 Reviewed-on: https://go-review.googlesource.com/c/go/+/282194 Trust: Michael Matloob Run-TryBot: Michael Matloob TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Reviewed-by: Jay Conrod --- doc/go1.16.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index f0dbee7b89..3e564f8af6 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -164,6 +164,12 @@ Do not send CLs removing the interior tags from such phrases. non-reproducible builds.

+

+ The go command now disallows non-ASCII import paths in module + mode. Non-ASCII module paths have already been disallowed so this change + affects module subdirectory paths that contain non-ASCII characters. +

+

Embedding Files

-- GitLab From 091414b5b7ced2f6ce1cc9d37e12f62c9a00ef0e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 6 Jan 2021 16:25:48 -0800 Subject: [PATCH 1603/1792] io/fs: correct WalkDirFunc documentation The documentation was copied from filepath.WalkFunc, and the copy was not fully adjusted to the new circumstances. Fixes #43536 Change-Id: I09687c7656e6938ebd9fc1e1643d34be88cf141d Reviewed-on: https://go-review.googlesource.com/c/go/+/282172 Trust: Ian Lance Taylor Trust: Emmanuel Odeke Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Emmanuel Odeke Reviewed-by: Marco Gazerro --- src/io/fs/walk.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/io/fs/walk.go b/src/io/fs/walk.go index c33ff10729..534876bad3 100644 --- a/src/io/fs/walk.go +++ b/src/io/fs/walk.go @@ -17,16 +17,11 @@ var SkipDir = errors.New("skip this directory") // WalkDirFunc is the type of the function called by WalkDir to visit // each file or directory. // -// The path argument contains the argument to Walk as a prefix. -// That is, if Walk is called with root argument "dir" and finds a file +// The path argument contains the argument to WalkDir as a prefix. +// That is, if WalkDir is called with root argument "dir" and finds a file // named "a" in that directory, the walk function will be called with // argument "dir/a". // -// The directory and file are joined with Join, which may clean the -// directory name: if Walk is called with the root argument "x/../dir" -// and finds a file named "a" in that directory, the walk function will -// be called with argument "dir/a", not "x/../dir/a". -// // The d argument is the fs.DirEntry for the named path. // // The error result returned by the function controls how WalkDir @@ -42,9 +37,9 @@ var SkipDir = errors.New("skip this directory") // // WalkDir calls the function with a non-nil err argument in two cases. // -// First, if the initial os.Lstat on the root directory fails, WalkDir +// First, if the initial fs.Stat on the root directory fails, WalkDir // calls the function with path set to root, d set to nil, and err set to -// the error from os.Lstat. +// the error from fs.Stat. // // Second, if a directory's ReadDir method fails, WalkDir calls the // function with path set to the directory's path, d set to an -- GitLab From 9ec21a8f347e760945ca0f58ad72062588f08577 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 6 Jan 2021 14:32:03 -0800 Subject: [PATCH 1604/1792] Revert "reflect: support multiple keys in struct tags" Proposal #40281 was initially accepted, but has now been declined. This CL removes most of the work done to implement it. Specifically this reverts CLs 248341, 274448, 274474, and 278392. For #40281 For #43226 Change-Id: I5a9ebb4d9cb5fb0962434b64c59beb8343030be5 Reviewed-on: https://go-review.googlesource.com/c/go/+/281515 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Emmanuel Odeke --- doc/go1.16.html | 11 --- src/reflect/all_test.go | 170 ---------------------------------------- src/reflect/type.go | 43 +++------- 3 files changed, 9 insertions(+), 215 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 3e564f8af6..3645e018b2 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -845,17 +845,6 @@ func TestFoo(t *testing.T) {

-
reflect
-
-

- StructTag - now allows multiple space-separated keys in key:value pairs, - as in `json xml:"field1"` (equivalent to - `json:"field1" xml:"field1"`). -

-
-
-
runtime/debug

diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index b01158635f..1225d6177d 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -7168,176 +7168,6 @@ func TestMapIterDelete1(t *testing.T) { } } -func TestStructTagLookup(t *testing.T) { - var tests = []struct { - tag StructTag - key string - expectedValue string - expectedOK bool - }{ - { - tag: `json:"json_value_1"`, - key: "json", - expectedValue: "json_value_1", - expectedOK: true, - }, - { - tag: `json:"json_value_2" xml:"xml_value_2"`, - key: "json", - expectedValue: "json_value_2", - expectedOK: true, - }, - { - tag: `json:"json_value_3" xml:"xml_value_3"`, - key: "xml", - expectedValue: "xml_value_3", - expectedOK: true, - }, - { - tag: `bson json:"shared_value_4"`, - key: "json", - expectedValue: "shared_value_4", - expectedOK: true, - }, - { - tag: `bson json:"shared_value_5"`, - key: "bson", - expectedValue: "shared_value_5", - expectedOK: true, - }, - { - tag: `json bson xml form:"field_1,omitempty" other:"value_1"`, - key: "xml", - expectedValue: "field_1,omitempty", - expectedOK: true, - }, - { - tag: `json bson xml form:"field_2,omitempty" other:"value_2"`, - key: "form", - expectedValue: "field_2,omitempty", - expectedOK: true, - }, - { - tag: `json bson xml form:"field_3,omitempty" other:"value_3"`, - key: "other", - expectedValue: "value_3", - expectedOK: true, - }, - { - tag: `json bson xml form:"field_4" other:"value_4"`, - key: "json", - expectedValue: "field_4", - expectedOK: true, - }, - { - tag: `json bson xml form:"field_5" other:"value_5"`, - key: "non_existing", - expectedValue: "", - expectedOK: false, - }, - { - tag: `json "json_6"`, - key: "json", - expectedValue: "", - expectedOK: false, - }, - { - tag: `json:"json_7" bson "bson_7"`, - key: "json", - expectedValue: "json_7", - expectedOK: true, - }, - { - tag: `json:"json_8" xml "xml_8"`, - key: "xml", - expectedValue: "", - expectedOK: false, - }, - { - tag: `json bson xml form "form_9" other:"value_9"`, - key: "bson", - expectedValue: "", - expectedOK: false, - }, - { - tag: `json bson xml form "form_10" other:"value_10"`, - key: "other", - expectedValue: "", - expectedOK: false, - }, - { - tag: `json bson xml form:"form_11" other "value_11"`, - key: "json", - expectedValue: "form_11", - expectedOK: true, - }, - { - tag: `tag1`, - key: "tag1", - expectedValue: "", - expectedOK: false, - }, - { - tag: `tag2 :"hello_2"`, - key: "tag2", - expectedValue: "", - expectedOK: false, - }, - { - tag: `tag3: "hello_3"`, - key: "tag3", - expectedValue: "", - expectedOK: false, - }, - { - tag: "json\x7fbson: \"hello_4\"", - key: "json", - expectedValue: "", - expectedOK: false, - }, - { - tag: "json\x7fbson: \"hello_5\"", - key: "bson", - expectedValue: "", - expectedOK: false, - }, - { - tag: "json bson:\x7f\"hello_6\"", - key: "json", - expectedValue: "", - expectedOK: false, - }, - { - tag: "json bson:\x7f\"hello_7\"", - key: "bson", - expectedValue: "", - expectedOK: false, - }, - { - tag: "json\x09bson:\"hello_8\"", - key: "json", - expectedValue: "", - expectedOK: false, - }, - { - tag: "a\x7fb json:\"val\"", - key: "json", - expectedValue: "", - expectedOK: false, - }, - } - - for _, test := range tests { - v, ok := test.tag.Lookup(test.key) - if v != test.expectedValue { - t.Errorf("struct tag lookup failed, got %s, want %s", v, test.expectedValue) - } - if ok != test.expectedOK { - t.Errorf("struct tag lookup failed, got %t, want %t", ok, test.expectedOK) - } - } -} - // iterateToString returns the set of elements // returned by an iterator in readable form. func iterateToString(it *MapIter) string { diff --git a/src/reflect/type.go b/src/reflect/type.go index 1f1e70d485..a1cdf45e15 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -1104,16 +1104,12 @@ type StructField struct { // A StructTag is the tag string in a struct field. // -// By convention, tag strings are a mapping of keys to values. -// The format is key:"value". Each key is a non-empty string consisting -// of non-control characters other than space (U+0020 ' '), -// quote (U+0022 '"'), and colon (U+003A ':'). Each value is quoted -// using U+0022 '"' characters and Go string literal syntax. -// Multiple key-value mappings are separated by zero or more spaces, as in -// key1:"value1" key2:"value2" -// Multiple keys may map to a single shared value by separating the keys -// with spaces, as in -// key1 key2:"value" +// By convention, tag strings are a concatenation of +// optionally space-separated key:"value" pairs. +// Each key is a non-empty string consisting of non-control +// characters other than space (U+0020 ' '), quote (U+0022 '"'), +// and colon (U+003A ':'). Each value is quoted using U+0022 '"' +// characters and Go string literal syntax. type StructTag string // Get returns the value associated with key in the tag string. @@ -1136,9 +1132,6 @@ func (tag StructTag) Lookup(key string) (value string, ok bool) { // When modifying this code, also update the validateStructTag code // in cmd/vet/structtag.go. - // keyFound indicates that such key on the left side has already been found. - var keyFound bool - for tag != "" { // Skip leading space. i := 0 @@ -1158,29 +1151,11 @@ func (tag StructTag) Lookup(key string) (value string, ok bool) { for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f { i++ } - if i == 0 || i+1 >= len(tag) || tag[i] < ' ' || tag[i] == 0x7f { + if i == 0 || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' { break } name := string(tag[:i]) - tag = tag[i:] - - // If we found a space char here - assume that we have a tag with - // multiple keys. - if tag[0] == ' ' { - if name == key { - keyFound = true - } - continue - } - - // Spaces were filtered above so we assume that here we have - // only valid tag value started with `:"`. - if tag[0] != ':' || tag[1] != '"' { - break - } - - // Remove the colon leaving tag at the start of the quoted string. - tag = tag[1:] + tag = tag[i+1:] // Scan quoted string to find value. i = 1 @@ -1196,7 +1171,7 @@ func (tag StructTag) Lookup(key string) (value string, ok bool) { qvalue := string(tag[:i+1]) tag = tag[i+1:] - if key == name || keyFound { + if key == name { value, err := strconv.Unquote(qvalue) if err != nil { break -- GitLab From 54bd1ccce240ca4d0efbbaf4af34339ac3ee5180 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 7 Jan 2021 12:35:01 -0800 Subject: [PATCH 1605/1792] cmd: update to latest golang.org/x/tools In particular bring in CL 201973, which reverts support for multiple keys in a struct tag. For #40281 For #43083 For #43226 Change-Id: I66e76639cbbca55bdbff6956acdb0a97650fdd31 Reviewed-on: https://go-review.googlesource.com/c/go/+/282412 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Emmanuel Odeke --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- .../x/tools/go/analysis/analysis.go | 4 + .../x/tools/go/analysis/diagnostic.go | 4 + .../golang.org/x/tools/go/analysis/doc.go | 4 + .../analysis/internal/analysisflags/help.go | 4 + .../passes/internal/analysisutil/util.go | 4 + .../tools/go/analysis/passes/printf/types.go | 4 + .../go/analysis/passes/structtag/structtag.go | 94 ++++++++----------- .../go/analysis/unitchecker/unitchecker112.go | 4 + .../x/tools/go/analysis/validate.go | 4 + .../golang.org/x/tools/go/ast/astutil/util.go | 4 + .../x/tools/go/ast/inspector/typeof.go | 4 + src/cmd/vendor/modules.txt | 2 +- 14 files changed, 82 insertions(+), 60 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 031b8d4ab7..879513b912 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -8,5 +8,5 @@ require ( golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 golang.org/x/mod v0.4.0 golang.org/x/sys v0.0.0-20201204225414-ed752295db88 // indirect - golang.org/x/tools v0.0.0-20201211025543-abf6a1d87e11 + golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 2fde9445f6..fc251ed663 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -31,8 +31,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20201211025543-abf6a1d87e11 h1:9j/upNXDRpADUw2RpUfJ7E7GHtfhDih62kX6JM8vs2c= -golang.org/x/tools v0.0.0-20201211025543-abf6a1d87e11/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff h1:6EkB024TP1fu6cmQqeCNw685zYDVt5g8N1BXh755SQM= +golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 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 8c3c2e7ab9..d11505a165 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 @@ -1,3 +1,7 @@ +// 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 analysis import ( 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 57eaf6faa2..cd462a0cb5 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 @@ -1,3 +1,7 @@ +// 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 analysis import "go/token" 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 9fa3302dfb..94a3bd5d07 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 @@ -1,3 +1,7 @@ +// 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 analysis defines the interface between a modular static diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/help.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/help.go index c5a70f3b7d..ce92892c81 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/help.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/help.go @@ -1,3 +1,7 @@ +// 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 analysisflags import ( diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil/util.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil/util.go index 80c9476fcd..ac37e4784e 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil/util.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil/util.go @@ -1,3 +1,7 @@ +// 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 analysisutil defines various helper functions // used by two or more packages beneath go/analysis. package analysisutil diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/types.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/types.go index bd8a594ef5..6a5fae44f4 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/types.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/types.go @@ -1,3 +1,7 @@ +// 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 printf import ( 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 02555648a0..f0b15051c5 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 @@ -207,12 +207,12 @@ var ( ) // validateStructTag parses the struct tag and returns an error if it is not -// in the canonical format, as defined by reflect.StructTag. +// in the canonical format, which is a space-separated list of key:"value" +// settings. The value may contain spaces. func validateStructTag(tag string) error { // This code is based on the StructTag.Get code in package reflect. n := 0 - var keys []string for ; tag != ""; n++ { if n > 0 && tag != "" && tag[0] != ' ' { // More restrictive than reflect, but catches likely mistakes @@ -240,27 +240,14 @@ func validateStructTag(tag string) error { if i == 0 { return errTagKeySyntax } - if i+1 >= len(tag) || tag[i] < ' ' || tag[i] == 0x7f { + if i+1 >= len(tag) || tag[i] != ':' { return errTagSyntax } - key := tag[:i] - keys = append(keys, key) - tag = tag[i:] - - // If we found a space char here - assume that we have a tag with - // multiple keys. - if tag[0] == ' ' { - continue - } - - // Spaces were filtered above so we assume that here we have - // only valid tag value started with `:"`. - if tag[0] != ':' || tag[1] != '"' { + if tag[i+1] != '"' { return errTagValueSyntax } - - // Remove the colon leaving tag at the start of the quoted string. - tag = tag[1:] + key := tag[:i] + tag = tag[i+1:] // Scan quoted string to find value. i = 1 @@ -276,56 +263,51 @@ func validateStructTag(tag string) error { qvalue := tag[:i+1] tag = tag[i+1:] - wholeValue, err := strconv.Unquote(qvalue) + value, err := strconv.Unquote(qvalue) if err != nil { return errTagValueSyntax } - for _, key := range keys { - if !checkTagSpaces[key] { - continue - } - - value := wholeValue - switch key { - case "xml": - // If the first or last character in the XML tag is a space, it is - // suspicious. - if strings.Trim(value, " ") != value { - return errTagValueSpace - } + if !checkTagSpaces[key] { + continue + } - // If there are multiple spaces, they are suspicious. - if strings.Count(value, " ") > 1 { - return errTagValueSpace - } + switch key { + case "xml": + // If the first or last character in the XML tag is a space, it is + // suspicious. + if strings.Trim(value, " ") != value { + return errTagValueSpace + } - // If there is no comma, skip the rest of the checks. - comma := strings.IndexRune(value, ',') - if comma < 0 { - continue - } + // If there are multiple spaces, they are suspicious. + if strings.Count(value, " ") > 1 { + return errTagValueSpace + } - // If the character before a comma is a space, this is suspicious. - if comma > 0 && value[comma-1] == ' ' { - return errTagValueSpace - } - value = value[comma+1:] - case "json": - // JSON allows using spaces in the name, so skip it. - comma := strings.IndexRune(value, ',') - if comma < 0 { - continue - } - value = value[comma+1:] + // If there is no comma, skip the rest of the checks. + comma := strings.IndexRune(value, ',') + if comma < 0 { + continue } - if strings.IndexByte(value, ' ') >= 0 { + // If the character before a comma is a space, this is suspicious. + if comma > 0 && value[comma-1] == ' ' { return errTagValueSpace } + value = value[comma+1:] + case "json": + // JSON allows using spaces in the name, so skip it. + comma := strings.IndexRune(value, ',') + if comma < 0 { + continue + } + value = value[comma+1:] } - keys = keys[:0] + if strings.IndexByte(value, ' ') >= 0 { + return errTagValueSpace + } } return nil } 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 index 683b7e91d2..9051456e39 100644 --- 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 @@ -1,3 +1,7 @@ +// 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 go1.12 package unitchecker diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/validate.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/validate.go index ad0e7276c9..23e57bf02b 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/validate.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/validate.go @@ -1,3 +1,7 @@ +// 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 analysis import ( diff --git a/src/cmd/vendor/golang.org/x/tools/go/ast/astutil/util.go b/src/cmd/vendor/golang.org/x/tools/go/ast/astutil/util.go index 7630629824..919d5305ab 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/ast/astutil/util.go +++ b/src/cmd/vendor/golang.org/x/tools/go/ast/astutil/util.go @@ -1,3 +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. + package astutil import "go/ast" diff --git a/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/typeof.go b/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/typeof.go index d61301b133..b6b00cf2e1 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/typeof.go +++ b/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/typeof.go @@ -1,3 +1,7 @@ +// 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 inspector // This file defines func typeOf(ast.Node) uint64. diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 4e47f41855..7337800ba6 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -44,7 +44,7 @@ golang.org/x/mod/zip golang.org/x/sys/internal/unsafeheader golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/tools v0.0.0-20201211025543-abf6a1d87e11 +# golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff ## explicit golang.org/x/tools/go/analysis golang.org/x/tools/go/analysis/internal/analysisflags -- GitLab From ee4d32249b0ccd1475a20ee9e4c5caf4a39e36c4 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Thu, 7 Jan 2021 16:28:35 +0800 Subject: [PATCH 1606/1792] io/fs: minor corrections to Glob release date io/fs is introduced in 2020, not 2009 nor 2010 Change-Id: I7d63aae17b1f8c3af1ded2f639e3fb76ff2aea81 Reviewed-on: https://go-review.googlesource.com/c/go/+/282232 Trust: Meng Zhuo Run-TryBot: Meng Zhuo TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- src/io/fs/glob.go | 2 +- src/io/fs/glob_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/io/fs/glob.go b/src/io/fs/glob.go index cde6c49f3d..59bd1939d7 100644 --- a/src/io/fs/glob.go +++ b/src/io/fs/glob.go @@ -1,4 +1,4 @@ -// Copyright 2010 The Go Authors. All rights reserved. +// 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. diff --git a/src/io/fs/glob_test.go b/src/io/fs/glob_test.go index 5c8ac3fbf3..f0d791fab5 100644 --- a/src/io/fs/glob_test.go +++ b/src/io/fs/glob_test.go @@ -1,4 +1,4 @@ -// Copyright 2009 The Go Authors. All rights reserved. +// 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. -- GitLab From cab120218382c78fb4263566a38df78aa3653f72 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 7 Jan 2021 17:32:06 -0800 Subject: [PATCH 1607/1792] cmd/link: accept extra blocks in TestFallocate For #41127 Change-Id: I794a082299c6dce4202223197ece1864bed36810 Reviewed-on: https://go-review.googlesource.com/c/go/+/282555 Trust: Ian Lance Taylor Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/fallocate_test.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/fallocate_test.go b/src/cmd/link/internal/ld/fallocate_test.go index 51f5fcdd9f..244b70f061 100644 --- a/src/cmd/link/internal/ld/fallocate_test.go +++ b/src/cmd/link/internal/ld/fallocate_test.go @@ -57,8 +57,12 @@ func TestFallocate(t *testing.T) { if got := stat.Size(); got != sz { t.Errorf("unexpected file size: got %d, want %d", got, sz) } - if got, want := stat.Sys().(*syscall.Stat_t).Blocks, (sz+511)/512; got != want { - t.Errorf("unexpected disk usage: got %d blocks, want %d", got, want) + // The number of blocks must be enough for the requested size. + // We used to require an exact match, but it appears that + // some file systems allocate a few extra blocks in some cases. + // See issue #41127. + if got, want := stat.Sys().(*syscall.Stat_t).Blocks, (sz+511)/512; got < want { + t.Errorf("unexpected disk usage: got %d blocks, want at least %d", got, want) } out.munmap() } -- GitLab From d92f8add32f79efe7e46af55172d4c703a778938 Mon Sep 17 00:00:00 2001 From: yangwenmai Date: Thu, 7 Jan 2021 17:45:36 +0800 Subject: [PATCH 1608/1792] archive/tar: fix typo in comment Change-Id: Ifcc565b34b3c3bb7ee62bb0525648a5d2895bf0b Reviewed-on: https://go-review.googlesource.com/c/go/+/282013 Reviewed-by: Ian Lance Taylor Trust: Alberto Donizetti --- src/archive/tar/strconv.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/archive/tar/strconv.go b/src/archive/tar/strconv.go index 0a910f33b9..6d0a403808 100644 --- a/src/archive/tar/strconv.go +++ b/src/archive/tar/strconv.go @@ -28,7 +28,7 @@ func isASCII(s string) bool { } // toASCII converts the input to an ASCII C-style string. -// This a best effort conversion, so invalid characters are dropped. +// This is a best effort conversion, so invalid characters are dropped. func toASCII(s string) string { if isASCII(s) { return s -- GitLab From a9ccd2d79574eead8c20d2bca4562cf2fd412787 Mon Sep 17 00:00:00 2001 From: Meng Zhuo Date: Sat, 26 Dec 2020 10:13:57 +0800 Subject: [PATCH 1609/1792] go/build: skip string literal while findEmbed The findEmbed function looking for comment by readbyte, however it might have constant or variables that contains comment. Maybe we should use ast parser in the future. Fixes #43373 Change-Id: I92544384fc4c11363d8b2f6b9898c8dea1602767 Reviewed-on: https://go-review.googlesource.com/c/go/+/280332 Trust: Matthew Dempsky Trust: Meng Zhuo Run-TryBot: Matthew Dempsky TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky Reviewed-by: Russ Cox --- src/go/build/read.go | 35 +++++++++++++++++++++++++++++++++++ src/go/build/read_test.go | 20 ++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/go/build/read.go b/src/go/build/read.go index 6806a51c24..6da921d471 100644 --- a/src/go/build/read.go +++ b/src/go/build/read.go @@ -171,6 +171,41 @@ func (r *importReader) findEmbed(first bool) bool { case ' ', '\t': // leave startLine alone + case '"': + startLine = false + for r.err == nil { + if r.eof { + r.syntaxError() + } + c = r.readByteNoBuf() + if c == '\\' { + r.readByteNoBuf() + if r.err != nil { + r.syntaxError() + return false + } + continue + } + if c == '"' { + c = r.readByteNoBuf() + goto Reswitch + } + } + goto Reswitch + + case '`': + startLine = false + for r.err == nil { + if r.eof { + r.syntaxError() + } + c = r.readByteNoBuf() + if c == '`' { + c = r.readByteNoBuf() + goto Reswitch + } + } + case '/': c = r.readByteNoBuf() switch c { diff --git a/src/go/build/read_test.go b/src/go/build/read_test.go index 9264d2606f..36c773ecea 100644 --- a/src/go/build/read_test.go +++ b/src/go/build/read_test.go @@ -255,6 +255,26 @@ var readEmbedTests = []struct { "package p\nimport \"embed\"\n//go:embed x y z\nvar files embed.FS", []string{"x", "y", "z"}, }, + { + "package p\nimport \"embed\"\nvar s = \"/*\"\n//go:embed x\nvar files embed.FS", + []string{"x"}, + }, + { + `package p + import "embed" + var s = "\"\\\\" + //go:embed x + var files embed.FS`, + []string{"x"}, + }, + { + "package p\nimport \"embed\"\nvar s = `/*`\n//go:embed x\nvar files embed.FS", + []string{"x"}, + }, + { + "package p\nimport \"embed\"\nvar s = z/ *y\n//go:embed pointer\nvar pointer embed.FS", + []string{"pointer"}, + }, { "package p\n//go:embed x y z\n", // no import, no scan nil, -- GitLab From ae9771713383c1ee01a544cd50cfdbc22841380a Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 6 Jan 2021 23:05:22 +0000 Subject: [PATCH 1610/1792] runtime,runtime/metrics: use explicit histogram boundaries This change modifies the semantics of runtime/metrics.Float64Histogram.Buckets to remove implicit buckets to that extend to positive and negative infinity and instead defines all bucket boundaries as explicitly listed. Bucket boundaries remain the same as before except /gc/heap/allocs-by-size:objects and /gc/heap/frees-by-size:objects no longer have a bucket that extends to negative infinity. This change simplifies the Float64Histogram API, making it both easier to understand and easier to use. Also, add a test for allocs-by-size and frees-by-size that checks them against MemStats. Fixes #43443. Change-Id: I5620f15bd084562dadf288f733c4a8cace21910c Reviewed-on: https://go-review.googlesource.com/c/go/+/281238 Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Reviewed-by: Austin Clements Reviewed-by: Michael Pratt Trust: Michael Knyszek --- src/runtime/histogram.go | 32 ++++++++++++++++++++++++---- src/runtime/metrics.go | 32 ++++++++++++++++++++-------- src/runtime/metrics/histogram.go | 29 +++++++++++++------------ src/runtime/metrics_test.go | 36 ++++++++++++++++++++++++++++---- 4 files changed, 99 insertions(+), 30 deletions(-) diff --git a/src/runtime/histogram.go b/src/runtime/histogram.go index d48e856cd0..42baa6c5e2 100644 --- a/src/runtime/histogram.go +++ b/src/runtime/histogram.go @@ -7,6 +7,7 @@ package runtime import ( "runtime/internal/atomic" "runtime/internal/sys" + "unsafe" ) const ( @@ -69,7 +70,13 @@ const ( // for concurrent use. It is also safe to read all the values // atomically. type timeHistogram struct { - counts [timeHistNumSuperBuckets * timeHistNumSubBuckets]uint64 + counts [timeHistNumSuperBuckets * timeHistNumSubBuckets]uint64 + + // underflow counts all the times we got a negative duration + // sample. Because of how time works on some platforms, it's + // possible to measure negative durations. We could ignore them, + // but we record them anyway because it's better to have some + // signal that it's happening than just missing samples. underflow uint64 } @@ -107,14 +114,30 @@ func (h *timeHistogram) record(duration int64) { atomic.Xadd64(&h.counts[superBucket*timeHistNumSubBuckets+subBucket], 1) } +const ( + fInf = 0x7FF0000000000000 + fNegInf = 0xFFF0000000000000 +) + +func float64Inf() float64 { + inf := uint64(fInf) + return *(*float64)(unsafe.Pointer(&inf)) +} + +func float64NegInf() float64 { + inf := uint64(fNegInf) + return *(*float64)(unsafe.Pointer(&inf)) +} + // timeHistogramMetricsBuckets generates a slice of boundaries for // the timeHistogram. These boundaries are represented in seconds, // not nanoseconds like the timeHistogram represents durations. func timeHistogramMetricsBuckets() []float64 { - b := make([]float64, timeHistTotalBuckets-1) + b := make([]float64, timeHistTotalBuckets+1) + b[0] = float64NegInf() for i := 0; i < timeHistNumSuperBuckets; i++ { superBucketMin := uint64(0) - // The (inclusive) minimum for the first bucket is 0. + // The (inclusive) minimum for the first non-negative bucket is 0. if i > 0 { // The minimum for the second bucket will be // 1 << timeHistSubBucketBits, indicating that all @@ -141,8 +164,9 @@ func timeHistogramMetricsBuckets() []float64 { // Convert the subBucketMin which is in nanoseconds to a float64 seconds value. // These values will all be exactly representable by a float64. - b[i*timeHistNumSubBuckets+j] = float64(subBucketMin) / 1e9 + b[i*timeHistNumSubBuckets+j+1] = float64(subBucketMin) / 1e9 } } + b[len(b)-1] = float64Inf() return b } diff --git a/src/runtime/metrics.go b/src/runtime/metrics.go index 1d191e6298..4d37a56f4c 100644 --- a/src/runtime/metrics.go +++ b/src/runtime/metrics.go @@ -41,8 +41,13 @@ func initMetrics() { if metricsInit { return } - sizeClassBuckets = make([]float64, _NumSizeClasses) - for i := range sizeClassBuckets { + + sizeClassBuckets = make([]float64, _NumSizeClasses, _NumSizeClasses+1) + // Skip size class 0 which is a stand-in for large objects, but large + // objects are tracked separately (and they actually get placed in + // the last bucket, not the first). + sizeClassBuckets[0] = 1 // The smallest allocation is 1 byte in size. + for i := 1; i < _NumSizeClasses; i++ { // Size classes have an inclusive upper-bound // and exclusive lower bound (e.g. 48-byte size class is // (32, 48]) whereas we want and inclusive lower-bound @@ -56,6 +61,8 @@ func initMetrics() { // boundaries. sizeClassBuckets[i] = float64(class_to_size[i] + 1) } + sizeClassBuckets = append(sizeClassBuckets, float64Inf()) + timeHistBuckets = timeHistogramMetricsBuckets() metrics = map[string]metricData{ "/gc/cycles/automatic:gc-cycles": { @@ -84,8 +91,10 @@ func initMetrics() { compute: func(in *statAggregate, out *metricValue) { hist := out.float64HistOrInit(sizeClassBuckets) hist.counts[len(hist.counts)-1] = uint64(in.heapStats.largeAllocCount) - for i := range hist.buckets { - hist.counts[i] = uint64(in.heapStats.smallAllocCount[i]) + // Cut off the first index which is ostensibly for size class 0, + // but large objects are tracked separately so it's actually unused. + for i, count := range in.heapStats.smallAllocCount[1:] { + hist.counts[i] = uint64(count) } }, }, @@ -94,8 +103,10 @@ func initMetrics() { compute: func(in *statAggregate, out *metricValue) { hist := out.float64HistOrInit(sizeClassBuckets) hist.counts[len(hist.counts)-1] = uint64(in.heapStats.largeFreeCount) - for i := range hist.buckets { - hist.counts[i] = uint64(in.heapStats.smallFreeCount[i]) + // Cut off the first index which is ostensibly for size class 0, + // but large objects are tracked separately so it's actually unused. + for i, count := range in.heapStats.smallFreeCount[1:] { + hist.counts[i] = uint64(count) } }, }, @@ -116,8 +127,11 @@ func initMetrics() { "/gc/pauses:seconds": { compute: func(_ *statAggregate, out *metricValue) { hist := out.float64HistOrInit(timeHistBuckets) + // The bottom-most bucket, containing negative values, is tracked + // as a separately as underflow, so fill that in manually and then + // iterate over the rest. hist.counts[0] = atomic.Load64(&memstats.gcPauseDist.underflow) - for i := range hist.buckets { + for i := range memstats.gcPauseDist.counts { hist.counts[i+1] = atomic.Load64(&memstats.gcPauseDist.counts[i]) } }, @@ -437,8 +451,8 @@ func (v *metricValue) float64HistOrInit(buckets []float64) *metricFloat64Histogr v.pointer = unsafe.Pointer(hist) } hist.buckets = buckets - if len(hist.counts) != len(hist.buckets)+1 { - hist.counts = make([]uint64, len(buckets)+1) + if len(hist.counts) != len(hist.buckets)-1 { + hist.counts = make([]uint64, len(buckets)-1) } return hist } diff --git a/src/runtime/metrics/histogram.go b/src/runtime/metrics/histogram.go index e1364e1e26..956422bf84 100644 --- a/src/runtime/metrics/histogram.go +++ b/src/runtime/metrics/histogram.go @@ -6,25 +6,28 @@ package metrics // Float64Histogram represents a distribution of float64 values. type Float64Histogram struct { - // Counts contains the weights for each histogram bucket. The length of - // Counts is equal to the length of Buckets (in the metric description) - // plus one to account for the implicit minimum bucket. + // Counts contains the weights for each histogram bucket. // - // Given N buckets, the following is the mathematical relationship between - // Counts and Buckets. - // count[0] is the weight of the range (-inf, bucket[0]) - // count[n] is the weight of the range [bucket[n], bucket[n+1]), for 0 < n < N-1 - // count[N-1] is the weight of the range [bucket[N-1], inf) + // Given N buckets, Count[n] is the weight of the range + // [bucket[n], bucket[n+1]), for 0 <= n < N. Counts []uint64 - // Buckets contains the boundaries between histogram buckets, in increasing order. + // Buckets contains the boundaries of the histogram buckets, in increasing order. // - // Because this slice contains boundaries, there are len(Buckets)+1 counts: - // a count for all values less than the first boundary, a count covering each - // [slice[i], slice[i+1]) interval, and a count for all values greater than or - // equal to the last boundary. + // Buckets[0] is the inclusive lower bound of the minimum bucket while + // Buckets[len(Buckets)-1] is the exclusive upper bound of the maximum bucket. + // Hence, there are len(Buckets)-1 counts. Furthermore, len(Buckets) != 1, always, + // since at least two boundaries are required to describe one bucket (and 0 + // boundaries are used to describe 0 buckets). + // + // Buckets[0] is permitted to have value -Inf and Buckets[len(Buckets)-1] is + // permitted to have value Inf. // // For a given metric name, the value of Buckets is guaranteed not to change // between calls until program exit. + // + // This slice value is permitted to alias with other Float64Histograms' Buckets + // fields, so the values within should only ever be read. If they need to be + // modified, the user must make a copy. Buckets []float64 } diff --git a/src/runtime/metrics_test.go b/src/runtime/metrics_test.go index 0ee469ae29..5109058ed1 100644 --- a/src/runtime/metrics_test.go +++ b/src/runtime/metrics_test.go @@ -70,6 +70,34 @@ func TestReadMetrics(t *testing.T) { checkUint64(t, name, samples[i].Value.Uint64(), mstats.BuckHashSys) case "/memory/classes/total:bytes": checkUint64(t, name, samples[i].Value.Uint64(), mstats.Sys) + case "/gc/heap/allocs-by-size:objects": + hist := samples[i].Value.Float64Histogram() + // Skip size class 0 in BySize, because it's always empty and not represented + // in the histogram. + for i, sc := range mstats.BySize[1:] { + if b, s := hist.Buckets[i+1], float64(sc.Size+1); b != s { + t.Errorf("bucket does not match size class: got %f, want %f", b, s) + // The rest of the checks aren't expected to work anyway. + continue + } + if c, m := hist.Counts[i], sc.Mallocs; c != m { + t.Errorf("histogram counts do not much BySize for class %d: got %d, want %d", i, c, m) + } + } + case "/gc/heap/frees-by-size:objects": + hist := samples[i].Value.Float64Histogram() + // Skip size class 0 in BySize, because it's always empty and not represented + // in the histogram. + for i, sc := range mstats.BySize[1:] { + if b, s := hist.Buckets[i+1], float64(sc.Size+1); b != s { + t.Errorf("bucket does not match size class: got %f, want %f", b, s) + // The rest of the checks aren't expected to work anyway. + continue + } + if c, f := hist.Counts[i], sc.Frees; c != f { + t.Errorf("histogram counts do not much BySize for class %d: got %d, want %d", i, c, f) + } + } case "/gc/heap/objects:objects": checkUint64(t, name, samples[i].Value.Uint64(), mstats.HeapObjects) case "/gc/heap/goal:bytes": @@ -154,11 +182,11 @@ func TestReadMetricsConsistency(t *testing.T) { if totalVirtual.got != totalVirtual.want { t.Errorf(`"/memory/classes/total:bytes" does not match sum of /memory/classes/**: got %d, want %d`, totalVirtual.got, totalVirtual.want) } - if objects.alloc.Counts[0] > 0 { - t.Error("found counts for objects of non-positive size in allocs-by-size") + if b, c := len(objects.alloc.Buckets), len(objects.alloc.Counts); b != c+1 { + t.Errorf("allocs-by-size has wrong bucket or counts length: %d buckets, %d counts", b, c) } - if objects.free.Counts[0] > 0 { - t.Error("found counts for objects of non-positive size in frees-by-size") + if b, c := len(objects.free.Buckets), len(objects.free.Counts); b != c+1 { + t.Errorf("frees-by-size has wrong bucket or counts length: %d buckets, %d counts", b, c) } if len(objects.alloc.Buckets) != len(objects.free.Buckets) { t.Error("allocs-by-size and frees-by-size buckets don't match in length") -- GitLab From 304f769ffc68e64244266b3aadbf91e6738c0064 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 7 Jan 2021 14:57:53 -0800 Subject: [PATCH 1611/1792] cmd/compile: don't short-circuit copies whose source is volatile Current optimization: When we copy a->b and then b->c, we might as well copy a->c instead of b->c (then b might be dead and go away). *Except* if a is a volatile location (might be clobbered by a call). In that case, we really do want to copy a immediately, because there might be a call before we can do the a->c copy. User calls can't happen in between, because the rule matches up the memory states. But calls inserted for memory barriers, particularly runtime.typedmemmove, can. (I guess we could introduce a register-calling-convention version of runtime.typedmemmove, but that seems a bigger change than this one.) Fixes #43570 Change-Id: Ifa518bb1a6f3a8dd46c352d4fd54ea9713b3eb1a Reviewed-on: https://go-review.googlesource.com/c/go/+/282492 Trust: Keith Randall Trust: Josh Bleecher Snyder Run-TryBot: Keith Randall TryBot-Result: Go Bot Reviewed-by: Josh Bleecher Snyder --- .../compile/internal/ssa/gen/generic.rules | 4 +- .../compile/internal/ssa/rewritegeneric.go | 8 ++-- test/fixedbugs/issue43570.go | 40 +++++++++++++++++++ 3 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 test/fixedbugs/issue43570.go diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index 81568b7b7a..1784923224 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -2512,7 +2512,7 @@ (Move {t1} [s] dst tmp1 midmem:(Move {t2} [s] tmp2 src _)) && t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) - && isStackPtr(src) + && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) => (Move {t1} [s] dst src midmem) @@ -2521,7 +2521,7 @@ (Move {t1} [s] dst tmp1 midmem:(VarDef (Move {t2} [s] tmp2 src _))) && t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) - && isStackPtr(src) + && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) => (Move {t1} [s] dst src midmem) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 4cb9a8f328..958e24d29f 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -13637,7 +13637,7 @@ func rewriteValuegeneric_OpMove(v *Value) bool { return true } // match: (Move {t1} [s] dst tmp1 midmem:(Move {t2} [s] tmp2 src _)) - // cond: t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) + // cond: t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) // result: (Move {t1} [s] dst src midmem) for { s := auxIntToInt64(v.AuxInt) @@ -13651,7 +13651,7 @@ func rewriteValuegeneric_OpMove(v *Value) bool { t2 := auxToType(midmem.Aux) src := midmem.Args[1] tmp2 := midmem.Args[0] - if !(t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) { + if !(t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) { break } v.reset(OpMove) @@ -13661,7 +13661,7 @@ func rewriteValuegeneric_OpMove(v *Value) bool { return true } // match: (Move {t1} [s] dst tmp1 midmem:(VarDef (Move {t2} [s] tmp2 src _))) - // cond: t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) + // cond: t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config)) // result: (Move {t1} [s] dst src midmem) for { s := auxIntToInt64(v.AuxInt) @@ -13679,7 +13679,7 @@ func rewriteValuegeneric_OpMove(v *Value) bool { t2 := auxToType(midmem_0.Aux) src := midmem_0.Args[1] tmp2 := midmem_0.Args[0] - if !(t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) { + if !(t1.Compare(t2) == types.CMPeq && isSamePtr(tmp1, tmp2) && isStackPtr(src) && !isVolatile(src) && disjoint(src, s, tmp2, s) && (disjoint(src, s, dst, s) || isInlinableMemmove(dst, src, s, config))) { break } v.reset(OpMove) diff --git a/test/fixedbugs/issue43570.go b/test/fixedbugs/issue43570.go new file mode 100644 index 0000000000..d073fde5f6 --- /dev/null +++ b/test/fixedbugs/issue43570.go @@ -0,0 +1,40 @@ +// run + +// 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 main + +import "fmt" + +type T [8]*int + +//go:noinline +func f(x int) T { + return T{} +} + +//go:noinline +func g(x int, t T) { + if t != (T{}) { + panic(fmt.Sprintf("bad: %v", t)) + } +} + +func main() { + const N = 10000 + var q T + func() { + for i := 0; i < N; i++ { + q = f(0) + g(0, q) + sink = make([]byte, 1024) + } + }() + // Note that the closure is a trick to get the write to q to be a + // write to a pointer that is known to be non-nil and requires + // a write barrier. +} + +var sink []byte -- GitLab From c6513bca5aeaa9f9b6fe552d60f5b6c700ce0772 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 6 Jan 2021 16:30:41 -0800 Subject: [PATCH 1612/1792] io/fs: minor corrections to Glob doc The documentation for Glob was copied from filepath.Glob, and needs a bit of tweaking: paths are not rooted at slash; the separator is always '/'. Fixes #43537 Change-Id: Id64daa137e2762b66a82a5b9e60bbe603f4e2f5c Reviewed-on: https://go-review.googlesource.com/c/go/+/282173 Trust: Ian Lance Taylor Reviewed-by: Russ Cox --- src/io/fs/glob.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/fs/glob.go b/src/io/fs/glob.go index 59bd1939d7..549f217542 100644 --- a/src/io/fs/glob.go +++ b/src/io/fs/glob.go @@ -22,7 +22,7 @@ type GlobFS interface { // Glob returns the names of all files matching pattern or nil // if there is no matching file. The syntax of patterns is the same // as in path.Match. The pattern may describe hierarchical names such as -// /usr/*/bin/ed (assuming the Separator is '/'). +// usr/*/bin/ed. // // Glob ignores file system errors such as I/O errors reading directories. // The only possible returned error is path.ErrBadPattern, reporting that -- GitLab From 32afcc94363e15ee2ef0cffec962191a15e73094 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Thu, 7 Jan 2021 17:24:39 +0000 Subject: [PATCH 1613/1792] runtime/metrics: change unit on *-by-size metrics to match bucket unit This change modifies the *-by-size metrics' units to be based off the bucket's unit (bytes) as opposed to the unit of the counts (objects). This convention is more in-line with distributions in other metrics systems. Change-Id: Id3b68a09f52f0e1ff9f4346f613ae1cbd9f52f73 Reviewed-on: https://go-review.googlesource.com/c/go/+/282352 Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Reviewed-by: Austin Clements Reviewed-by: Michael Pratt Trust: Michael Knyszek --- src/runtime/metrics.go | 4 ++-- src/runtime/metrics/description.go | 9 +++++++-- src/runtime/metrics/doc.go | 4 ++-- src/runtime/metrics_test.go | 8 ++++---- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/runtime/metrics.go b/src/runtime/metrics.go index 4d37a56f4c..3e8dbda0ca 100644 --- a/src/runtime/metrics.go +++ b/src/runtime/metrics.go @@ -86,7 +86,7 @@ func initMetrics() { out.scalar = in.sysStats.gcCyclesDone }, }, - "/gc/heap/allocs-by-size:objects": { + "/gc/heap/allocs-by-size:bytes": { deps: makeStatDepSet(heapStatsDep), compute: func(in *statAggregate, out *metricValue) { hist := out.float64HistOrInit(sizeClassBuckets) @@ -98,7 +98,7 @@ func initMetrics() { } }, }, - "/gc/heap/frees-by-size:objects": { + "/gc/heap/frees-by-size:bytes": { deps: makeStatDepSet(heapStatsDep), compute: func(in *statAggregate, out *metricValue) { hist := out.float64HistOrInit(sizeClassBuckets) diff --git a/src/runtime/metrics/description.go b/src/runtime/metrics/description.go index 32af5d1727..01c8a685ee 100644 --- a/src/runtime/metrics/description.go +++ b/src/runtime/metrics/description.go @@ -23,6 +23,11 @@ type Description struct { // Examples of units might be "seconds", "bytes", "bytes/second", "cpu-seconds", // "byte*cpu-seconds", and "bytes/second/second". // + // For histograms, multiple units may apply. For instance, the units of the buckets and + // the count. By convention, for histograms, the units of the count are always "samples" + // with the type of sample evident by the metric's name, while the unit in the name + // specifies the buckets' unit. + // // A complete name might look like "/memory/heap/free:bytes". Name string @@ -69,12 +74,12 @@ var allDesc = []Description{ Cumulative: true, }, { - Name: "/gc/heap/allocs-by-size:objects", + Name: "/gc/heap/allocs-by-size:bytes", Description: "Distribution of all objects allocated by approximate size.", Kind: KindFloat64Histogram, }, { - Name: "/gc/heap/frees-by-size:objects", + Name: "/gc/heap/frees-by-size:bytes", Description: "Distribution of all objects freed by approximate size.", Kind: KindFloat64Histogram, }, diff --git a/src/runtime/metrics/doc.go b/src/runtime/metrics/doc.go index a68184ee82..021a0bddca 100644 --- a/src/runtime/metrics/doc.go +++ b/src/runtime/metrics/doc.go @@ -61,10 +61,10 @@ Below is the full list of supported metrics, ordered lexicographically. /gc/cycles/total:gc-cycles Count of all completed GC cycles. - /gc/heap/allocs-by-size:objects + /gc/heap/allocs-by-size:bytes Distribution of all objects allocated by approximate size. - /gc/heap/frees-by-size:objects + /gc/heap/frees-by-size:bytes Distribution of all objects freed by approximate size. /gc/heap/goal:bytes diff --git a/src/runtime/metrics_test.go b/src/runtime/metrics_test.go index 5109058ed1..8a3cf019bd 100644 --- a/src/runtime/metrics_test.go +++ b/src/runtime/metrics_test.go @@ -70,7 +70,7 @@ func TestReadMetrics(t *testing.T) { checkUint64(t, name, samples[i].Value.Uint64(), mstats.BuckHashSys) case "/memory/classes/total:bytes": checkUint64(t, name, samples[i].Value.Uint64(), mstats.Sys) - case "/gc/heap/allocs-by-size:objects": + case "/gc/heap/allocs-by-size:bytes": hist := samples[i].Value.Float64Histogram() // Skip size class 0 in BySize, because it's always empty and not represented // in the histogram. @@ -84,7 +84,7 @@ func TestReadMetrics(t *testing.T) { t.Errorf("histogram counts do not much BySize for class %d: got %d, want %d", i, c, m) } } - case "/gc/heap/frees-by-size:objects": + case "/gc/heap/frees-by-size:bytes": hist := samples[i].Value.Float64Histogram() // Skip size class 0 in BySize, because it's always empty and not represented // in the histogram. @@ -161,9 +161,9 @@ func TestReadMetricsConsistency(t *testing.T) { totalVirtual.got = samples[i].Value.Uint64() case "/gc/heap/objects:objects": objects.total = samples[i].Value.Uint64() - case "/gc/heap/allocs-by-size:objects": + case "/gc/heap/allocs-by-size:bytes": objects.alloc = samples[i].Value.Float64Histogram() - case "/gc/heap/frees-by-size:objects": + case "/gc/heap/frees-by-size:bytes": objects.free = samples[i].Value.Float64Histogram() case "/gc/cycles:gc-cycles": gc.numGC = samples[i].Value.Uint64() -- GitLab From 0c5afc4fb7e3349ec4efdce6554f83554e3d087c Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 7 Jan 2021 17:50:14 -0500 Subject: [PATCH 1614/1792] testing/fstest,os: clarify racy behavior of TestFS The testing.TestFS function assumes that the file system it's testing doesn't change under it. Clarify this in the documentation and fix the use of os.TestDirFS that's currently susceptible to this race. Fixes #42637. Change-Id: Ia7792380726177f8953d150ee87381b66cb01cb3 Reviewed-on: https://go-review.googlesource.com/c/go/+/282452 Trust: Austin Clements Run-TryBot: Austin Clements TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/os/os_test.go | 2 +- src/os/testdata/dirfs/a | 0 src/os/testdata/dirfs/b | 0 src/os/testdata/dirfs/dir/x | 0 src/testing/fstest/testfs.go | 1 + 5 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/os/testdata/dirfs/a create mode 100644 src/os/testdata/dirfs/b create mode 100644 src/os/testdata/dirfs/dir/x diff --git a/src/os/os_test.go b/src/os/os_test.go index 765797f5fb..d2e8ed5d82 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -2687,7 +2687,7 @@ func TestOpenFileKeepsPermissions(t *testing.T) { } func TestDirFS(t *testing.T) { - if err := fstest.TestFS(DirFS("./signal"), "signal.go", "internal/pty/pty.go"); err != nil { + if err := fstest.TestFS(DirFS("./testdata/dirfs"), "a", "b", "dir/x"); err != nil { t.Fatal(err) } } diff --git a/src/os/testdata/dirfs/a b/src/os/testdata/dirfs/a new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/os/testdata/dirfs/b b/src/os/testdata/dirfs/b new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/os/testdata/dirfs/dir/x b/src/os/testdata/dirfs/dir/x new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/testing/fstest/testfs.go b/src/testing/fstest/testfs.go index 4da6f04eed..a7f8007333 100644 --- a/src/testing/fstest/testfs.go +++ b/src/testing/fstest/testfs.go @@ -24,6 +24,7 @@ import ( // It also checks that the file system contains at least the expected files. // As a special case, if no expected files are listed, fsys must be empty. // Otherwise, fsys must only contain at least the listed files: it can also contain others. +// The contents of fsys must not change concurrently with TestFS. // // If TestFS finds any misbehaviors, it returns an error reporting all of them. // The error text spans multiple lines, one per detected misbehavior. -- GitLab From e65c543f3c34f4a505c37ebc3c2b608bc8ae83ec Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 22 Jun 2020 13:06:40 -0400 Subject: [PATCH 1615/1792] go/build/constraint: add parser for build tag constraint expressions This package implements a parser for the new //go:build constraint lines. The parser also handles // +build lines, to be able to process legacy files. This will not be used in the standard library until Go 1.17, but it seems worth publishing in Go 1.16 so that code that needs to process both kinds of lines once Go 1.17 comes out will be able to build using Go 1.16 as well. For #41184. Design in https://golang.org/design/draft-gobuild. Change-Id: I756c0de4081c5039e8b7397200e5274f223ab111 Reviewed-on: https://go-review.googlesource.com/c/go/+/240604 Run-TryBot: Russ Cox TryBot-Result: Go Bot Trust: Russ Cox Trust: Jay Conrod Reviewed-by: Jay Conrod --- src/go/build/build_test.go | 3 +- src/go/build/constraint/expr.go | 574 +++++++++++++++++++++++++++ src/go/build/constraint/expr_test.go | 317 +++++++++++++++ src/go/build/deps_test.go | 3 + 4 files changed, 896 insertions(+), 1 deletion(-) create mode 100644 src/go/build/constraint/expr.go create mode 100644 src/go/build/constraint/expr_test.go diff --git a/src/go/build/build_test.go b/src/go/build/build_test.go index 5a3e9ee714..d8f264cac7 100644 --- a/src/go/build/build_test.go +++ b/src/go/build/build_test.go @@ -28,6 +28,7 @@ func TestMatch(t *testing.T) { ctxt := Default what := "default" match := func(tag string, want map[string]bool) { + t.Helper() m := make(map[string]bool) if !ctxt.match(tag, m) { t.Errorf("%s context should match %s, does not", what, tag) @@ -37,6 +38,7 @@ func TestMatch(t *testing.T) { } } nomatch := func(tag string, want map[string]bool) { + t.Helper() m := make(map[string]bool) if ctxt.match(tag, m) { t.Errorf("%s context should NOT match %s, does", what, tag) @@ -57,7 +59,6 @@ func TestMatch(t *testing.T) { nomatch(runtime.GOOS+","+runtime.GOARCH+",!foo", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "foo": true}) match(runtime.GOOS+","+runtime.GOARCH+",!bar", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "bar": true}) nomatch(runtime.GOOS+","+runtime.GOARCH+",bar", map[string]bool{runtime.GOOS: true, runtime.GOARCH: true, "bar": true}) - nomatch("!", map[string]bool{}) } func TestDotSlashImport(t *testing.T) { diff --git a/src/go/build/constraint/expr.go b/src/go/build/constraint/expr.go new file mode 100644 index 0000000000..3b278702f8 --- /dev/null +++ b/src/go/build/constraint/expr.go @@ -0,0 +1,574 @@ +// 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 constraint implements parsing and evaluation of build constraint lines. +// See https://golang.org/cmd/go/#hdr-Build_constraints for documentation about build constraints themselves. +// +// This package parses both the original “// +build” syntax and the “//go:build” syntax that will be added in Go 1.17. +// The parser is being included in Go 1.16 to allow tools that need to process Go 1.17 source code +// to still be built against the Go 1.16 release. +// See https://golang.org/design/draft-gobuild for details about the “//go:build” syntax. +package constraint + +import ( + "errors" + "strings" + "unicode" + "unicode/utf8" +) + +// An Expr is a build tag constraint expression. +// The underlying concrete type is *AndExpr, *OrExpr, *NotExpr, or *TagExpr. +type Expr interface { + // String returns the string form of the expression, + // using the boolean syntax used in //go:build lines. + String() string + + // Eval reports whether the expression evaluates to true. + // It calls ok(tag) as needed to find out whether a given build tag + // is satisfied by the current build configuration. + Eval(ok func(tag string) bool) bool + + // The presence of an isExpr method explicitly marks the type as an Expr. + // Only implementations in this package should be used as Exprs. + isExpr() +} + +// A TagExpr is an Expr for the single tag Tag. +type TagExpr struct { + Tag string // for example, “linux” or “cgo” +} + +func (x *TagExpr) isExpr() {} + +func (x *TagExpr) Eval(ok func(tag string) bool) bool { + return ok(x.Tag) +} + +func (x *TagExpr) String() string { + return x.Tag +} + +func tag(tag string) Expr { return &TagExpr{tag} } + +// A NotExpr represents the expression !X (the negation of X). +type NotExpr struct { + X Expr +} + +func (x *NotExpr) isExpr() {} + +func (x *NotExpr) Eval(ok func(tag string) bool) bool { + return !x.X.Eval(ok) +} + +func (x *NotExpr) String() string { + s := x.X.String() + switch x.X.(type) { + case *AndExpr, *OrExpr: + s = "(" + s + ")" + } + return "!" + s +} + +func not(x Expr) Expr { return &NotExpr{x} } + +// An AndExpr represents the expression X && Y. +type AndExpr struct { + X, Y Expr +} + +func (x *AndExpr) isExpr() {} + +func (x *AndExpr) Eval(ok func(tag string) bool) bool { + // Note: Eval both, to make sure ok func observes all tags. + xok := x.X.Eval(ok) + yok := x.Y.Eval(ok) + return xok && yok +} + +func (x *AndExpr) String() string { + return andArg(x.X) + " && " + andArg(x.Y) +} + +func andArg(x Expr) string { + s := x.String() + if _, ok := x.(*OrExpr); ok { + s = "(" + s + ")" + } + return s +} + +func and(x, y Expr) Expr { + return &AndExpr{x, y} +} + +// An OrExpr represents the expression X || Y. +type OrExpr struct { + X, Y Expr +} + +func (x *OrExpr) isExpr() {} + +func (x *OrExpr) Eval(ok func(tag string) bool) bool { + // Note: Eval both, to make sure ok func observes all tags. + xok := x.X.Eval(ok) + yok := x.Y.Eval(ok) + return xok || yok +} + +func (x *OrExpr) String() string { + return orArg(x.X) + " || " + orArg(x.Y) +} + +func orArg(x Expr) string { + s := x.String() + if _, ok := x.(*AndExpr); ok { + s = "(" + s + ")" + } + return s +} + +func or(x, y Expr) Expr { + return &OrExpr{x, y} +} + +// A SyntaxError reports a syntax error in a parsed build expression. +type SyntaxError struct { + Offset int // byte offset in input where error was detected + Err string // description of error +} + +func (e *SyntaxError) Error() string { + return e.Err +} + +var errNotConstraint = errors.New("not a build constraint") + +// Parse parses a single build constraint line of the form “//go:build ...” or “// +build ...” +// and returns the corresponding boolean expression. +func Parse(line string) (Expr, error) { + if text, ok := splitGoBuild(line); ok { + return parseExpr(text) + } + if text, ok := splitPlusBuild(line); ok { + return parsePlusBuildExpr(text), nil + } + return nil, errNotConstraint +} + +// IsGoBuild reports whether the line of text is a “//go:build” constraint. +// It only checks the prefix of the text, not that the expression itself parses. +func IsGoBuild(line string) bool { + _, ok := splitGoBuild(line) + return ok +} + +// splitGoBuild splits apart the leading //go:build prefix in line from the build expression itself. +// It returns "", false if the input is not a //go:build line or if the input contains multiple lines. +func splitGoBuild(line string) (expr string, ok bool) { + // A single trailing newline is OK; otherwise multiple lines are not. + if len(line) > 0 && line[len(line)-1] == '\n' { + line = line[:len(line)-1] + } + if strings.Contains(line, "\n") { + return "", false + } + + if !strings.HasPrefix(line, "//go:build") { + return "", false + } + + line = strings.TrimSpace(line) + line = line[len("//go:build"):] + + // If strings.TrimSpace finds more to trim after removing the //go:build prefix, + // it means that the prefix was followed by a space, making this a //go:build line + // (as opposed to a //go:buildsomethingelse line). + // If line is empty, we had "//go:build" by itself, which also counts. + trim := strings.TrimSpace(line) + if len(line) == len(trim) && line != "" { + return "", false + } + + return trim, true +} + +// An exprParser holds state for parsing a build expression. +type exprParser struct { + s string // input string + i int // next read location in s + + tok string // last token read + isTag bool + pos int // position (start) of last token +} + +// parseExpr parses a boolean build tag expression. +func parseExpr(text string) (x Expr, err error) { + defer func() { + if e := recover(); e != nil { + if e, ok := e.(*SyntaxError); ok { + err = e + return + } + panic(e) // unreachable unless parser has a bug + } + }() + + p := &exprParser{s: text} + x = p.or() + if p.tok != "" { + panic(&SyntaxError{Offset: p.pos, Err: "unexpected token " + p.tok}) + } + return x, nil +} + +// or parses a sequence of || expressions. +// On entry, the next input token has not yet been lexed. +// On exit, the next input token has been lexed and is in p.tok. +func (p *exprParser) or() Expr { + x := p.and() + for p.tok == "||" { + x = or(x, p.and()) + } + return x +} + +// and parses a sequence of && expressions. +// On entry, the next input token has not yet been lexed. +// On exit, the next input token has been lexed and is in p.tok. +func (p *exprParser) and() Expr { + x := p.not() + for p.tok == "&&" { + x = and(x, p.not()) + } + return x +} + +// not parses a ! expression. +// On entry, the next input token has not yet been lexed. +// On exit, the next input token has been lexed and is in p.tok. +func (p *exprParser) not() Expr { + p.lex() + if p.tok == "!" { + p.lex() + if p.tok == "!" { + panic(&SyntaxError{Offset: p.pos, Err: "double negation not allowed"}) + } + return not(p.atom()) + } + return p.atom() +} + +// atom parses a tag or a parenthesized expression. +// On entry, the next input token HAS been lexed. +// On exit, the next input token has been lexed and is in p.tok. +func (p *exprParser) atom() Expr { + // first token already in p.tok + if p.tok == "(" { + pos := p.pos + defer func() { + if e := recover(); e != nil { + if e, ok := e.(*SyntaxError); ok && e.Err == "unexpected end of expression" { + e.Err = "missing close paren" + } + panic(e) + } + }() + x := p.or() + if p.tok != ")" { + panic(&SyntaxError{Offset: pos, Err: "missing close paren"}) + } + p.lex() + return x + } + + if !p.isTag { + if p.tok == "" { + panic(&SyntaxError{Offset: p.pos, Err: "unexpected end of expression"}) + } + panic(&SyntaxError{Offset: p.pos, Err: "unexpected token " + p.tok}) + } + tok := p.tok + p.lex() + return tag(tok) +} + +// lex finds and consumes the next token in the input stream. +// On return, p.tok is set to the token text, +// p.isTag reports whether the token was a tag, +// and p.pos records the byte offset of the start of the token in the input stream. +// If lex reaches the end of the input, p.tok is set to the empty string. +// For any other syntax error, lex panics with a SyntaxError. +func (p *exprParser) lex() { + p.isTag = false + for p.i < len(p.s) && (p.s[p.i] == ' ' || p.s[p.i] == '\t') { + p.i++ + } + if p.i >= len(p.s) { + p.tok = "" + p.pos = p.i + return + } + switch p.s[p.i] { + case '(', ')', '!': + p.pos = p.i + p.i++ + p.tok = p.s[p.pos:p.i] + return + + case '&', '|': + if p.i+1 >= len(p.s) || p.s[p.i+1] != p.s[p.i] { + panic(&SyntaxError{Offset: p.i, Err: "invalid syntax at " + string(rune(p.s[p.i]))}) + } + p.pos = p.i + p.i += 2 + p.tok = p.s[p.pos:p.i] + return + } + + tag := p.s[p.i:] + for i, c := range tag { + if !unicode.IsLetter(c) && !unicode.IsDigit(c) && c != '_' && c != '.' { + tag = tag[:i] + break + } + } + if tag == "" { + c, _ := utf8.DecodeRuneInString(p.s[p.i:]) + panic(&SyntaxError{Offset: p.i, Err: "invalid syntax at " + string(c)}) + } + + p.pos = p.i + p.i += len(tag) + p.tok = p.s[p.pos:p.i] + p.isTag = true + return +} + +// IsPlusBuild reports whether the line of text is a “// +build” constraint. +// It only checks the prefix of the text, not that the expression itself parses. +func IsPlusBuild(line string) bool { + _, ok := splitPlusBuild(line) + return ok +} + +// splitGoBuild splits apart the leading //go:build prefix in line from the build expression itself. +// It returns "", false if the input is not a //go:build line or if the input contains multiple lines. +func splitPlusBuild(line string) (expr string, ok bool) { + // A single trailing newline is OK; otherwise multiple lines are not. + if len(line) > 0 && line[len(line)-1] == '\n' { + line = line[:len(line)-1] + } + if strings.Contains(line, "\n") { + return "", false + } + + if !strings.HasPrefix(line, "//") { + return "", false + } + line = line[len("//"):] + // Note the space is optional; "//+build" is recognized too. + line = strings.TrimSpace(line) + + if !strings.HasPrefix(line, "+build") { + return "", false + } + line = line[len("+build"):] + + // If strings.TrimSpace finds more to trim after removing the +build prefix, + // it means that the prefix was followed by a space, making this a +build line + // (as opposed to a +buildsomethingelse line). + // If line is empty, we had "// +build" by itself, which also counts. + trim := strings.TrimSpace(line) + if len(line) == len(trim) && line != "" { + return "", false + } + + return trim, true +} + +// parsePlusBuildExpr parses a legacy build tag expression (as used with “// +build”). +func parsePlusBuildExpr(text string) Expr { + var x Expr + for _, clause := range strings.Fields(text) { + var y Expr + for _, lit := range strings.Split(clause, ",") { + var z Expr + var neg bool + if strings.HasPrefix(lit, "!!") || lit == "!" { + z = tag("ignore") + } else { + if strings.HasPrefix(lit, "!") { + neg = true + lit = lit[len("!"):] + } + if isValidTag(lit) { + z = tag(lit) + } else { + z = tag("ignore") + } + if neg { + z = not(z) + } + } + if y == nil { + y = z + } else { + y = and(y, z) + } + } + if x == nil { + x = y + } else { + x = or(x, y) + } + } + return x +} + +// isValidTag reports whether the word is a valid build tag. +// Tags must be letters, digits, underscores or dots. +// Unlike in Go identifiers, all digits are fine (e.g., "386"). +func isValidTag(word string) bool { + if word == "" { + return false + } + for _, c := range word { + if !unicode.IsLetter(c) && !unicode.IsDigit(c) && c != '_' && c != '.' { + return false + } + } + return true +} + +var errComplex = errors.New("expression too complex for // +build lines") + +// PlusBuildLines returns a sequence of “// +build” lines that evaluate to the build expression x. +// If the expression is too complex to convert directly to “// +build” lines, PlusBuildLines returns an error. +func PlusBuildLines(x Expr) ([]string, error) { + // Push all NOTs to the expression leaves, so that //go:build !(x && y) can be treated as !x || !y. + // This rewrite is both efficient and commonly needed, so it's worth doing. + // Essentially all other possible rewrites are too expensive and too rarely needed. + x = pushNot(x, false) + + // Split into AND of ORs of ANDs of literals (tag or NOT tag). + var split [][][]Expr + for _, or := range appendSplitAnd(nil, x) { + var ands [][]Expr + for _, and := range appendSplitOr(nil, or) { + var lits []Expr + for _, lit := range appendSplitAnd(nil, and) { + switch lit.(type) { + case *TagExpr, *NotExpr: + lits = append(lits, lit) + default: + return nil, errComplex + } + } + ands = append(ands, lits) + } + split = append(split, ands) + } + + // If all the ORs have length 1 (no actual OR'ing going on), + // push the top-level ANDs to the bottom level, so that we get + // one // +build line instead of many. + maxOr := 0 + for _, or := range split { + if maxOr < len(or) { + maxOr = len(or) + } + } + if maxOr == 1 { + var lits []Expr + for _, or := range split { + lits = append(lits, or[0]...) + } + split = [][][]Expr{{lits}} + } + + // Prepare the +build lines. + var lines []string + for _, or := range split { + line := "// +build" + for _, and := range or { + clause := "" + for i, lit := range and { + if i > 0 { + clause += "," + } + clause += lit.String() + } + line += " " + clause + } + lines = append(lines, line) + } + + return lines, nil +} + +// pushNot applies DeMorgan's law to push negations down the expression, +// so that only tags are negated in the result. +// (It applies the rewrites !(X && Y) => (!X || !Y) and !(X || Y) => (!X && !Y).) +func pushNot(x Expr, not bool) Expr { + switch x := x.(type) { + default: + // unreachable + return x + case *NotExpr: + if _, ok := x.X.(*TagExpr); ok && !not { + return x + } + return pushNot(x.X, !not) + case *TagExpr: + if not { + return &NotExpr{X: x} + } + return x + case *AndExpr: + x1 := pushNot(x.X, not) + y1 := pushNot(x.Y, not) + if not { + return or(x1, y1) + } + if x1 == x.X && y1 == x.Y { + return x + } + return and(x1, y1) + case *OrExpr: + x1 := pushNot(x.X, not) + y1 := pushNot(x.Y, not) + if not { + return and(x1, y1) + } + if x1 == x.X && y1 == x.Y { + return x + } + return or(x1, y1) + } +} + +// appendSplitAnd appends x to list while splitting apart any top-level && expressions. +// For example, appendSplitAnd({W}, X && Y && Z) = {W, X, Y, Z}. +func appendSplitAnd(list []Expr, x Expr) []Expr { + if x, ok := x.(*AndExpr); ok { + list = appendSplitAnd(list, x.X) + list = appendSplitAnd(list, x.Y) + return list + } + return append(list, x) +} + +// appendSplitOr appends x to list while splitting apart any top-level || expressions. +// For example, appendSplitOr({W}, X || Y || Z) = {W, X, Y, Z}. +func appendSplitOr(list []Expr, x Expr) []Expr { + if x, ok := x.(*OrExpr); ok { + list = appendSplitOr(list, x.X) + list = appendSplitOr(list, x.Y) + return list + } + return append(list, x) +} diff --git a/src/go/build/constraint/expr_test.go b/src/go/build/constraint/expr_test.go new file mode 100644 index 0000000000..4979f8b5f2 --- /dev/null +++ b/src/go/build/constraint/expr_test.go @@ -0,0 +1,317 @@ +// 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 constraint + +import ( + "fmt" + "reflect" + "strings" + "testing" +) + +var exprStringTests = []struct { + x Expr + out string +}{ + { + x: tag("abc"), + out: "abc", + }, + { + x: not(tag("abc")), + out: "!abc", + }, + { + x: not(and(tag("abc"), tag("def"))), + out: "!(abc && def)", + }, + { + x: and(tag("abc"), or(tag("def"), tag("ghi"))), + out: "abc && (def || ghi)", + }, + { + x: or(and(tag("abc"), tag("def")), tag("ghi")), + out: "(abc && def) || ghi", + }, +} + +func TestExprString(t *testing.T) { + for i, tt := range exprStringTests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + s := tt.x.String() + if s != tt.out { + t.Errorf("String() mismatch:\nhave %s\nwant %s", s, tt.out) + } + }) + } +} + +var lexTests = []struct { + in string + out string +}{ + {"", ""}, + {"x", "x"}, + {"x.y", "x.y"}, + {"x_y", "x_y"}, + {"αx", "αx"}, + {"αx²", "αx err: invalid syntax at ²"}, + {"go1.2", "go1.2"}, + {"x y", "x y"}, + {"x!y", "x ! y"}, + {"&&||!()xy yx ", "&& || ! ( ) xy yx"}, + {"x~", "x err: invalid syntax at ~"}, + {"x ~", "x err: invalid syntax at ~"}, + {"x &", "x err: invalid syntax at &"}, + {"x &y", "x err: invalid syntax at &"}, +} + +func TestLex(t *testing.T) { + for i, tt := range lexTests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + p := &exprParser{s: tt.in} + out := "" + for { + tok, err := lexHelp(p) + if tok == "" && err == nil { + break + } + if out != "" { + out += " " + } + if err != nil { + out += "err: " + err.Error() + break + } + out += tok + } + if out != tt.out { + t.Errorf("lex(%q):\nhave %s\nwant %s", tt.in, out, tt.out) + } + }) + } +} + +func lexHelp(p *exprParser) (tok string, err error) { + defer func() { + if e := recover(); e != nil { + if e, ok := e.(*SyntaxError); ok { + err = e + return + } + panic(e) + } + }() + + p.lex() + return p.tok, nil +} + +var parseExprTests = []struct { + in string + x Expr +}{ + {"x", tag("x")}, + {"x&&y", and(tag("x"), tag("y"))}, + {"x||y", or(tag("x"), tag("y"))}, + {"(x)", tag("x")}, + {"x||y&&z", or(tag("x"), and(tag("y"), tag("z")))}, + {"x&&y||z", or(and(tag("x"), tag("y")), tag("z"))}, + {"x&&(y||z)", and(tag("x"), or(tag("y"), tag("z")))}, + {"(x||y)&&z", and(or(tag("x"), tag("y")), tag("z"))}, + {"!(x&&y)", not(and(tag("x"), tag("y")))}, +} + +func TestParseExpr(t *testing.T) { + for i, tt := range parseExprTests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + x, err := parseExpr(tt.in) + if err != nil { + t.Fatal(err) + } + if x.String() != tt.x.String() { + t.Errorf("parseExpr(%q):\nhave %s\nwant %s", tt.in, x, tt.x) + } + }) + } +} + +var parseExprErrorTests = []struct { + in string + err error +}{ + {"x && ", &SyntaxError{Offset: 5, Err: "unexpected end of expression"}}, + {"x && (", &SyntaxError{Offset: 6, Err: "missing close paren"}}, + {"x && ||", &SyntaxError{Offset: 5, Err: "unexpected token ||"}}, + {"x && !", &SyntaxError{Offset: 6, Err: "unexpected end of expression"}}, + {"x && !!", &SyntaxError{Offset: 6, Err: "double negation not allowed"}}, + {"x !", &SyntaxError{Offset: 2, Err: "unexpected token !"}}, + {"x && (y", &SyntaxError{Offset: 5, Err: "missing close paren"}}, +} + +func TestParseError(t *testing.T) { + for i, tt := range parseExprErrorTests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + x, err := parseExpr(tt.in) + if err == nil { + t.Fatalf("parseExpr(%q) = %v, want error", tt.in, x) + } + if !reflect.DeepEqual(err, tt.err) { + t.Fatalf("parseExpr(%q): wrong error:\nhave %#v\nwant %#v", tt.in, err, tt.err) + } + }) + } +} + +var exprEvalTests = []struct { + in string + ok bool + tags string +}{ + {"x", false, "x"}, + {"x && y", false, "x y"}, + {"x || y", false, "x y"}, + {"!x && yes", true, "x yes"}, + {"yes || y", true, "y yes"}, +} + +func TestExprEval(t *testing.T) { + for i, tt := range exprEvalTests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + x, err := parseExpr(tt.in) + if err != nil { + t.Fatal(err) + } + tags := make(map[string]bool) + wantTags := make(map[string]bool) + for _, tag := range strings.Fields(tt.tags) { + wantTags[tag] = true + } + hasTag := func(tag string) bool { + tags[tag] = true + return tag == "yes" + } + ok := x.Eval(hasTag) + if ok != tt.ok || !reflect.DeepEqual(tags, wantTags) { + t.Errorf("Eval(%#q):\nhave ok=%v, tags=%v\nwant ok=%v, tags=%v", + tt.in, ok, tags, tt.ok, wantTags) + } + }) + } +} + +var parsePlusBuildExprTests = []struct { + in string + x Expr +}{ + {"x", tag("x")}, + {"x,y", and(tag("x"), tag("y"))}, + {"x y", or(tag("x"), tag("y"))}, + {"x y,z", or(tag("x"), and(tag("y"), tag("z")))}, + {"x,y z", or(and(tag("x"), tag("y")), tag("z"))}, + {"x,!y !z", or(and(tag("x"), not(tag("y"))), not(tag("z")))}, + {"!! x", or(tag("ignore"), tag("x"))}, + {"!!x", tag("ignore")}, + {"!x", not(tag("x"))}, + {"!", tag("ignore")}, +} + +func TestParsePlusBuildExpr(t *testing.T) { + for i, tt := range parsePlusBuildExprTests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + x := parsePlusBuildExpr(tt.in) + if x.String() != tt.x.String() { + t.Errorf("parsePlusBuildExpr(%q):\nhave %v\nwant %v", tt.in, x, tt.x) + } + }) + } +} + +var constraintTests = []struct { + in string + x Expr + err error +}{ + {"//+build x y", or(tag("x"), tag("y")), nil}, + {"// +build x y \n", or(tag("x"), tag("y")), nil}, + {"// +build x y \n ", nil, errNotConstraint}, + {"// +build x y \nmore", nil, errNotConstraint}, + {" //+build x y", nil, errNotConstraint}, + + {"//go:build x && y", and(tag("x"), tag("y")), nil}, + {"//go:build x && y\n", and(tag("x"), tag("y")), nil}, + {"//go:build x && y\n ", nil, errNotConstraint}, + {"//go:build x && y\nmore", nil, errNotConstraint}, + {" //go:build x && y", nil, errNotConstraint}, +} + +func TestParse(t *testing.T) { + for i, tt := range constraintTests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + x, err := Parse(tt.in) + if err != nil { + if tt.err == nil { + t.Errorf("Constraint(%q): unexpected error: %v", tt.in, err) + } else if tt.err != err { + t.Errorf("Constraint(%q): error %v, want %v", tt.in, err, tt.err) + } + return + } + if tt.err != nil { + t.Errorf("Constraint(%q) = %v, want error %v", tt.in, x, tt.err) + return + } + if x.String() != tt.x.String() { + t.Errorf("Constraint(%q):\nhave %v\nwant %v", tt.in, x, tt.x) + } + }) + } +} + +var plusBuildLinesTests = []struct { + in string + out []string + err error +}{ + {"x", []string{"x"}, nil}, + {"x && !y", []string{"x,!y"}, nil}, + {"x || y", []string{"x y"}, nil}, + {"x && (y || z)", []string{"x", "y z"}, nil}, + {"!(x && y)", []string{"!x !y"}, nil}, + {"x || (y && z)", []string{"x y,z"}, nil}, + {"w && (x || (y && z))", []string{"w", "x y,z"}, nil}, + {"v || (w && (x || (y && z)))", nil, errComplex}, +} + +func TestPlusBuildLines(t *testing.T) { + for i, tt := range plusBuildLinesTests { + t.Run(fmt.Sprint(i), func(t *testing.T) { + x, err := parseExpr(tt.in) + if err != nil { + t.Fatal(err) + } + lines, err := PlusBuildLines(x) + if err != nil { + if tt.err == nil { + t.Errorf("PlusBuildLines(%q): unexpected error: %v", tt.in, err) + } else if tt.err != err { + t.Errorf("PlusBuildLines(%q): error %v, want %v", tt.in, err, tt.err) + } + return + } + if tt.err != nil { + t.Errorf("PlusBuildLines(%q) = %v, want error %v", tt.in, lines, tt.err) + return + } + var want []string + for _, line := range tt.out { + want = append(want, "// +build "+line) + } + if !reflect.DeepEqual(lines, want) { + t.Errorf("PlusBuildLines(%q):\nhave %q\nwant %q", tt.in, lines, want) + } + }) + } +} diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index aa651af718..99cd59e5b5 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -282,6 +282,9 @@ var depsRules = ` container/heap, go/constant, go/parser < go/types; + FMT + < go/build/constraint; + go/doc, go/parser, internal/goroot, internal/goversion < go/build; -- GitLab From 6728118e0ae2658e758a64fe86e2e1a3aa55268c Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 7 Jan 2021 11:21:37 -0500 Subject: [PATCH 1616/1792] cmd/go: pass signals forward during "go tool" This way, if a SIGINT is sent to the go command, it is forwarded on to the underlying tool. Otherwise trying to use os.Process.Signal to kill "go tool compile" only kills the "go tool" not the "compile". Change-Id: Iac7cd4f06096469f5e76164df813a379c0da3822 Reviewed-on: https://go-review.googlesource.com/c/go/+/282312 Trust: Russ Cox Run-TryBot: Russ Cox TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Reviewed-by: Matthew Dempsky --- src/cmd/go/internal/tool/tool.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/internal/tool/tool.go b/src/cmd/go/internal/tool/tool.go index 7f4dc86802..6a755bc436 100644 --- a/src/cmd/go/internal/tool/tool.go +++ b/src/cmd/go/internal/tool/tool.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "os/exec" + "os/signal" "sort" "strings" @@ -85,7 +86,19 @@ func runTool(ctx context.Context, cmd *base.Command, args []string) { Stdout: os.Stdout, Stderr: os.Stderr, } - err := toolCmd.Run() + err := toolCmd.Start() + if err == nil { + c := make(chan os.Signal, 100) + signal.Notify(c) + go func() { + for sig := range c { + toolCmd.Process.Signal(sig) + } + }() + err = toolCmd.Wait() + signal.Stop(c) + close(c) + } if err != nil { // Only print about the exit status if the command // didn't even run (not an ExitError) or it didn't exit cleanly -- GitLab From fefad1dc856d66c024a94d3421fc52ff326fe970 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 7 Jan 2021 11:22:42 -0500 Subject: [PATCH 1617/1792] test: fix timeout code for invoking compiler When running go tool compile, go tool is running compile as a subprocess. Killing go tool with Process.Kill leaves the subprocess behind. Send an interrupt signal first, which it can forward on to the compile subprocess. Also report the timeout in errorcheck -t. Change-Id: I7ae0029bbe543ed7e60e0fea790dd0739d10bcaa Reviewed-on: https://go-review.googlesource.com/c/go/+/282313 Trust: Russ Cox Run-TryBot: Russ Cox TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Reviewed-by: Matthew Dempsky --- test/run.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/test/run.go b/test/run.go index db3e9f6c2f..624f2236a1 100644 --- a/test/run.go +++ b/test/run.go @@ -467,6 +467,8 @@ func 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() @@ -642,16 +644,18 @@ func (t *test) run() { case err = <-done: // ok case <-tick.C: + cmd.Process.Signal(os.Interrupt) + time.Sleep(1 * time.Second) cmd.Process.Kill() - err = <-done - // err = errors.New("Test timeout") + <-done + err = errTimeout } tick.Stop() } } else { err = cmd.Run() } - if err != nil { + if err != nil && err != errTimeout { err = fmt.Errorf("%s\n%s", err, buf.Bytes()) } return buf.Bytes(), err @@ -731,6 +735,10 @@ func (t *test) run() { 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 -- GitLab From 6598c65646dbb740a6668ffdaffec5627efc95e4 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 7 Jan 2021 11:24:26 -0500 Subject: [PATCH 1618/1792] cmd/compile: fix exponential-time init-cycle reporting I have a real 7,000-line Go program (not so big) that took over two minutes to report a trivial init cycle. I thought the compiler was in an infinite loop but it was actually just very slow. CL 170062 rewrote init cycle reporting but replaced a linear-time algorithm with an exponential one: it explores all paths through the call graph of functions involved in the cycle. The net effect was that Go 1.12 took 0.25 seconds to load, typecheck, and then diagnose the cycle in my program, while Go 1.13 takes 600X longer. This CL makes the new reporting code run in linear time, restoring the speed of Go 1.12 but preserving the semantic fixes from CL 170062. Change-Id: I7d6dc95676d577d9b96f5953b516a64db93249bf Reviewed-on: https://go-review.googlesource.com/c/go/+/282314 Trust: Russ Cox Run-TryBot: Russ Cox TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/initorder.go | 19 +++++++------ test/initexp.go | 36 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 test/initexp.go diff --git a/src/cmd/compile/internal/gc/initorder.go b/src/cmd/compile/internal/gc/initorder.go index 41f1349bbe..e2084fd038 100644 --- a/src/cmd/compile/internal/gc/initorder.go +++ b/src/cmd/compile/internal/gc/initorder.go @@ -108,7 +108,7 @@ func initOrder(l []*Node) []*Node { errorexit() } - findInitLoopAndExit(firstLHS(n), new([]*Node)) + findInitLoopAndExit(firstLHS(n), new([]*Node), make(map[*Node]bool)) Fatalf("initialization unfinished, but failed to identify loop") } } @@ -181,10 +181,7 @@ func (o *InitOrder) flushReady(initialize func(*Node)) { // path points to a slice used for tracking the sequence of // variables/functions visited. Using a pointer to a slice allows the // slice capacity to grow and limit reallocations. -func findInitLoopAndExit(n *Node, path *[]*Node) { - // We implement a simple DFS loop-finding algorithm. This - // could be faster, but initialization cycles are rare. - +func findInitLoopAndExit(n *Node, path *[]*Node, ok map[*Node]bool) { for i, x := range *path { if x == n { reportInitLoopAndExit((*path)[i:]) @@ -201,12 +198,18 @@ func findInitLoopAndExit(n *Node, path *[]*Node) { *path = append(*path, n) for _, ref := range refers { // Short-circuit variables that were initialized. - if ref.Class() == PEXTERN && ref.Name.Defn.Initorder() == InitDone { + if ref.Class() == PEXTERN && ref.Name.Defn.Initorder() == InitDone || ok[ref] { continue } - - findInitLoopAndExit(ref, path) + findInitLoopAndExit(ref, path, ok) } + + // n is not involved in a cycle. + // Record that fact to avoid checking it again when reached another way, + // or else this traversal will take exponential time traversing all paths + // through the part of the package's call graph implicated in the cycle. + ok[n] = true + *path = (*path)[:len(*path)-1] } diff --git a/test/initexp.go b/test/initexp.go new file mode 100644 index 0000000000..f279a7c528 --- /dev/null +++ b/test/initexp.go @@ -0,0 +1,36 @@ +// errorcheck -t 10 + +// 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 p + +// The init cycle diagnosis used to take exponential time +// to traverse the call graph paths. This test case takes +// at least two minutes on a modern laptop with the bug +// and runs in a fraction of a second without it. +// 10 seconds (-t 10 above) should be plenty if the code is working. + +var x = f() + z() // ERROR "initialization loop" + +func f() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } +func z() int { return x } + +func a1() int { return b1() + b2() + b3() + b4() + b5() + b6() + b7() } +func a2() int { return b1() + b2() + b3() + b4() + b5() + b6() + b7() } +func a3() int { return b1() + b2() + b3() + b4() + b5() + b6() + b7() } +func a4() int { return b1() + b2() + b3() + b4() + b5() + b6() + b7() } +func a5() int { return b1() + b2() + b3() + b4() + b5() + b6() + b7() } +func a6() int { return b1() + b2() + b3() + b4() + b5() + b6() + b7() } +func a7() int { return b1() + b2() + b3() + b4() + b5() + b6() + b7() } +func a8() int { return b1() + b2() + b3() + b4() + b5() + b6() + b7() } + +func b1() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } +func b2() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } +func b3() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } +func b4() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } +func b5() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } +func b6() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } +func b7() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } +func b8() int { return a1() + a2() + a3() + a4() + a5() + a6() + a7() } -- GitLab From 8f6a9acbb3f63a77175eaa153cace5f3b6d611b2 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Fri, 8 Jan 2021 16:56:24 +0000 Subject: [PATCH 1619/1792] runtime/metrics: remove unused StopTheWorld Description field This change removes the as-of-yet unused StopTheWorld field in the Description struct. Adding a new field to a struct is much easier than removing it, so let's save it for when we actually need it. Change-Id: I8074b8569187c1a148500575fa8a661534e875d5 Reviewed-on: https://go-review.googlesource.com/c/go/+/282632 Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Trust: Michael Knyszek Reviewed-by: Michael Pratt Reviewed-by: Austin Clements --- api/go1.16.txt | 1 - src/runtime/metrics/description.go | 4 ---- 2 files changed, 5 deletions(-) diff --git a/api/go1.16.txt b/api/go1.16.txt index baac5379f8..8a8c6b8860 100644 --- a/api/go1.16.txt +++ b/api/go1.16.txt @@ -395,7 +395,6 @@ pkg runtime/metrics, type Description struct, Cumulative bool pkg runtime/metrics, type Description struct, Description string pkg runtime/metrics, type Description struct, Kind ValueKind pkg runtime/metrics, type Description struct, Name string -pkg runtime/metrics, type Description struct, StopTheWorld bool pkg runtime/metrics, type Float64Histogram struct pkg runtime/metrics, type Float64Histogram struct, Buckets []float64 pkg runtime/metrics, type Float64Histogram struct, Counts []uint64 diff --git a/src/runtime/metrics/description.go b/src/runtime/metrics/description.go index 01c8a685ee..716802e9a2 100644 --- a/src/runtime/metrics/description.go +++ b/src/runtime/metrics/description.go @@ -46,10 +46,6 @@ type Description struct { // // This flag thus indicates whether or not it's useful to compute a rate from this value. Cumulative bool - - // StopTheWorld is whether or not the metric requires a stop-the-world - // event in order to collect it. - StopTheWorld bool } // The English language descriptions below must be kept in sync with the -- GitLab From 6250833911fc979a4ca5ba8b7f0612d054a3aeec Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Fri, 8 Jan 2021 17:12:50 +0000 Subject: [PATCH 1620/1792] runtime/metrics: mark histogram metrics as cumulative All the current histogram metrics accumulate counts from program start to infinity, and can be reasonably used to compute rates (also to generate windowed distributions). Change-Id: I5196c59867de34fba41bb8552606fa315460cef9 Reviewed-on: https://go-review.googlesource.com/c/go/+/282633 Run-TryBot: Michael Knyszek TryBot-Result: Go Bot Trust: Michael Knyszek Reviewed-by: Michael Pratt Reviewed-by: Austin Clements --- src/runtime/metrics/description.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/runtime/metrics/description.go b/src/runtime/metrics/description.go index 716802e9a2..1175156104 100644 --- a/src/runtime/metrics/description.go +++ b/src/runtime/metrics/description.go @@ -73,11 +73,13 @@ var allDesc = []Description{ Name: "/gc/heap/allocs-by-size:bytes", Description: "Distribution of all objects allocated by approximate size.", Kind: KindFloat64Histogram, + Cumulative: true, }, { Name: "/gc/heap/frees-by-size:bytes", Description: "Distribution of all objects freed by approximate size.", Kind: KindFloat64Histogram, + Cumulative: true, }, { Name: "/gc/heap/goal:bytes", @@ -93,6 +95,7 @@ var allDesc = []Description{ Name: "/gc/pauses:seconds", Description: "Distribution individual GC-related stop-the-world pause latencies.", Kind: KindFloat64Histogram, + Cumulative: true, }, { Name: "/memory/classes/heap/free:bytes", -- GitLab From 25886cf4bd28be373afb80a4c068a785b43bdddf Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 8 Jan 2021 13:24:23 -0500 Subject: [PATCH 1621/1792] cmd/go: preserve sums for indirect deps fetched by 'go mod download' Previously, commands that wrote go.sum (except 'go mod tidy') would retain sums for zip files of directly required modules. Sums of indirect dependencies wouldn't be retained unless they were used to load packages. With this change, sums for indirect dependencies will be retained if they're available. This allows users to add missing sums with 'go mod download example.com/mod', which previously only worked for directly required modules. Note that 'go mod download' without arguments now adds sums for every module in the build list. That matches 1.15 behavior. For #41103 Change-Id: I4cce2bf1c73578dae836bdb5adb32da071554f1a Reviewed-on: https://go-review.googlesource.com/c/go/+/282692 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/init.go | 53 +++++++++---------- .../go/testdata/script/mod_sum_ambiguous.txt | 8 +++ 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 348c8e66c9..1a51c58bf2 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -976,9 +976,12 @@ func WriteGoMod() { // It also contains entries for go.mod files needed for MVS (the version // of these entries ends with "/go.mod"). // -// If addDirect is true, the set also includes sums for modules directly -// required by go.mod, as represented by the index, with replacements applied. -func keepSums(addDirect bool) map[module.Version]bool { +// If keepBuildListZips is true, the set also includes sums for zip files for +// all modules in the build list with replacements applied. 'go get' and +// 'go mod download' may add sums to this set when adding a requirement on a +// module without a root package or when downloading a direct or indirect +// dependency. +func keepSums(keepBuildListZips bool) map[module.Version]bool { // Re-derive the build list using the current list of direct requirements. // Keep the sum for the go.mod of each visited module version (or its // replacement). @@ -1007,19 +1010,20 @@ func keepSums(addDirect bool) map[module.Version]bool { panic(fmt.Sprintf("unexpected error reloading build list: %v", err)) } + actualMods := make(map[string]module.Version) + for _, m := range buildList[1:] { + if r := Replacement(m); r.Path != "" { + actualMods[m.Path] = r + } else { + actualMods[m.Path] = m + } + } + // Add entries for modules in the build list with paths that are prefixes of // paths of loaded packages. We need to retain sums for modules needed to // report ambiguous import errors. We use our re-derived build list, // since the global build list may have been tidied. if loaded != nil { - actualMods := make(map[string]module.Version) - for _, m := range buildList[1:] { - if r := Replacement(m); r.Path != "" { - actualMods[m.Path] = r - } else { - actualMods[m.Path] = m - } - } for _, pkg := range loaded.pkgs { if pkg.testOf != nil || pkg.inStd || module.CheckImportPath(pkg.path) != nil { continue @@ -1032,17 +1036,13 @@ func keepSums(addDirect bool) map[module.Version]bool { } } - // Add entries for modules directly required by go.mod. - if addDirect { - for m := range index.require { - var kept module.Version - if r := Replacement(m); r.Path != "" { - kept = r - } else { - kept = m - } - keep[kept] = true - keep[module.Version{Path: kept.Path, Version: kept.Version + "/go.mod"}] = true + // Add entries for the zip of each module in the build list. + // We might not need all of these (tidy does not add them), but they may be + // added by a specific 'go get' or 'go mod download' command to resolve + // missing import sum errors. + if keepBuildListZips { + for _, m := range actualMods { + keep[m] = true } } @@ -1062,9 +1062,8 @@ func (r *keepSumReqs) Required(m module.Version) ([]module.Version, error) { } func TrimGoSum() { - // Don't retain sums for direct requirements in go.mod. When TrimGoSum is - // called, go.mod has not been updated, and it may contain requirements on - // modules deleted from the build list. - addDirect := false - modfetch.TrimGoSum(keepSums(addDirect)) + // Don't retain sums for the zip file of every module in the build list. + // We may not need them all to build the main module's packages. + keepBuildListZips := false + modfetch.TrimGoSum(keepSums(keepBuildListZips)) } diff --git a/src/cmd/go/testdata/script/mod_sum_ambiguous.txt b/src/cmd/go/testdata/script/mod_sum_ambiguous.txt index 08107bf37c..209367181d 100644 --- a/src/cmd/go/testdata/script/mod_sum_ambiguous.txt +++ b/src/cmd/go/testdata/script/mod_sum_ambiguous.txt @@ -10,6 +10,14 @@ go mod tidy grep '^example.com/ambiguous/a v1.0.0 h1:' go.sum grep '^example.com/ambiguous/a/b v0.0.0-empty h1:' go.sum +# 'go mod download' should also add sums. +cp go.sum.buildlist-only go.sum +go mod download example.com/ambiguous/a +grep '^example.com/ambiguous/a v1.0.0 h1:' go.sum +! grep '^example.com/ambiguous/a/b v0.0.0-empty h1:' go.sum +go mod download example.com/ambiguous/a/b +grep '^example.com/ambiguous/a/b v0.0.0-empty h1:' go.sum + # If two modules could provide a package, and we're missing a sum for one, # we should see a missing sum error, even if we have a sum for a module that # provides the package. -- GitLab From 6192b9875128c5f53a69b959d5a1abf0f10ae93f Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 7 Jan 2021 11:14:06 -0500 Subject: [PATCH 1622/1792] cmd/go: make hints in error messages more consistent * All commands the user can run to fix the problem now appear alone on a separate line after a tab. * Removed -d from 'go get' commands. * Replaced 'go mod tidy' with 'go mod download $modpath' when a package might be provided by a module missing a sum. * Errors about 'path@version' syntax are more explicit. Fixes #29415 Fixes #42087 Fixes #43430 Fixes #43523 Change-Id: I4427c2c4506a727a2c727d652fd2d506bb134d3b Reviewed-on: https://go-review.googlesource.com/c/go/+/282121 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/go_test.go | 4 ++-- src/cmd/go/internal/get/get.go | 2 +- src/cmd/go/internal/load/pkg.go | 6 +----- src/cmd/go/internal/modget/get.go | 2 +- src/cmd/go/internal/modload/import.go | 14 ++++++++------ src/cmd/go/internal/modload/init.go | 2 +- src/cmd/go/internal/modload/load.go | 2 +- src/cmd/go/internal/modload/vendor.go | 2 +- src/cmd/go/internal/test/testflag.go | 2 +- .../testdata/script/mod_get_promote_implicit.txt | 10 +++++++--- src/cmd/go/testdata/script/mod_get_retract.txt | 2 +- src/cmd/go/testdata/script/mod_invalid_path.txt | 2 +- src/cmd/go/testdata/script/mod_sum_ambiguous.txt | 8 ++++++-- src/cmd/go/testdata/script/mod_sum_readonly.txt | 2 +- src/cmd/go/testdata/script/mod_vendor_auto.txt | 6 +++--- src/cmd/go/testdata/script/mod_versions.txt | 6 +++--- src/cmd/go/testdata/script/test_flag.txt | 6 +++--- 17 files changed, 42 insertions(+), 36 deletions(-) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index c472620db2..3cd3454d5a 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -2655,12 +2655,12 @@ func TestBadCommandLines(t *testing.T) { tg.tempFile("src/@x/x.go", "package x\n") tg.setenv("GOPATH", tg.path(".")) tg.runFail("build", "@x") - tg.grepStderr("invalid input directory name \"@x\"|cannot use path@version syntax", "did not reject @x directory") + tg.grepStderr("invalid input directory name \"@x\"|can only use path@version syntax with 'go get' and 'go install' in module-aware mode", "did not reject @x directory") tg.tempFile("src/@x/y/y.go", "package y\n") tg.setenv("GOPATH", tg.path(".")) tg.runFail("build", "@x/y") - tg.grepStderr("invalid import path \"@x/y\"|cannot use path@version syntax", "did not reject @x/y import path") + tg.grepStderr("invalid import path \"@x/y\"|can only use path@version syntax with 'go get' and 'go install' in module-aware mode", "did not reject @x/y import path") tg.tempFile("src/-x/x.go", "package x\n") tg.setenv("GOPATH", tg.path(".")) diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index 94a42c4f73..38ff3823f2 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -202,7 +202,7 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { func downloadPaths(patterns []string) []string { for _, arg := range patterns { if strings.Contains(arg, "@") { - base.Fatalf("go: cannot use path@version syntax in GOPATH mode") + base.Fatalf("go: can only use path@version syntax with 'go get' and 'go install' in module-aware mode") continue } diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 855f9698a2..cffc8fcefa 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -769,11 +769,7 @@ func loadPackageData(path, parentPath, parentDir, parentRoot string, parentIsStd } if strings.Contains(path, "@") { - if cfg.ModulesEnabled { - return nil, false, errors.New("can only use path@version syntax with 'go get'") - } else { - return nil, false, errors.New("cannot use path@version syntax in GOPATH mode") - } + return nil, false, errors.New("can only use path@version syntax with 'go get' and 'go install' in module-aware mode") } // Determine canonical package path and directory. diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 8463ec4e9c..0770b601c0 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -1558,7 +1558,7 @@ func (r *resolver) checkPackagesAndRetractions(ctx context.Context, pkgPatterns } } if retractPath != "" { - fmt.Fprintf(os.Stderr, "go: run 'go get %s@latest' to switch to the latest unretracted version\n", retractPath) + fmt.Fprintf(os.Stderr, "go: to switch to the latest unretracted version, run:\n\tgo get %s@latest", retractPath) } } diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 055878c528..9925d5b905 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -134,6 +134,7 @@ func (e *AmbiguousImportError) Error() string { // for its .zip file. type ImportMissingSumError struct { importPath string + modPaths []string found, inAll bool } @@ -145,7 +146,7 @@ func (e *ImportMissingSumError) Error() string { message = fmt.Sprintf("missing go.sum entry for module providing package %s", e.importPath) } if e.inAll { - return message + "; to add it:\n\tgo mod tidy" + return message + fmt.Sprintf("; to add it:\n\tgo mod download %s", strings.Join(e.modPaths, " ")) } return message } @@ -238,7 +239,7 @@ func importFromBuildList(ctx context.Context, path string, buildList []module.Ve // Check each module on the build list. var dirs []string var mods []module.Version - haveSumErr := false + var sumErrModPaths []string for _, m := range buildList { if !maybeInModule(path, m.Path) { // Avoid possibly downloading irrelevant modules. @@ -251,8 +252,9 @@ func importFromBuildList(ctx context.Context, path string, buildList []module.Ve // We are missing a sum needed to fetch a module in the build list. // We can't verify that the package is unique, and we may not find // the package at all. Keep checking other modules to decide which - // error to report. - haveSumErr = true + // error to report. Multiple sums may be missing if we need to look in + // multiple nested modules to resolve the import; we'll report them all. + sumErrModPaths = append(sumErrModPaths, m.Path) continue } // Report fetch error. @@ -273,8 +275,8 @@ func importFromBuildList(ctx context.Context, path string, buildList []module.Ve if len(mods) > 1 { return module.Version{}, "", &AmbiguousImportError{importPath: path, Dirs: dirs, Modules: mods} } - if haveSumErr { - return module.Version{}, "", &ImportMissingSumError{importPath: path, found: len(mods) > 0} + if len(sumErrModPaths) > 0 { + return module.Version{}, "", &ImportMissingSumError{importPath: path, modPaths: sumErrModPaths, found: len(mods) > 0} } if len(mods) == 1 { return mods[0], dirs[0], nil diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 1a51c58bf2..bc8d17e0a5 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -380,7 +380,7 @@ func LoadModFile(ctx context.Context) { if f.Module == nil { // No module declaration. Must add module path. - base.Fatalf("go: no module declaration in go.mod.\n\tRun 'go mod edit -module=example.com/mod' to specify the module path.") + base.Fatalf("go: no module declaration in go.mod. To specify the module path:\n\tgo mod edit -module=example.com/mod") } if err := checkModulePathLax(f.Module.Mod.Path); err != nil { diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index ae5b8ef6ab..cd36da6a87 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -868,7 +868,7 @@ func loadFromRoots(params loaderParams) *loader { // base.Errorf. Ideally, 'go list' should not fail because of this, // but today, LoadPackages calls WriteGoMod unconditionally, which // would fail with a less clear message. - base.Errorf("go: %[1]s: package %[2]s imported from implicitly required module; try 'go get -d %[1]s' to add missing requirements", pkg.path, dep.path) + base.Errorf("go: %[1]s: package %[2]s imported from implicitly required module; to add missing requirements, run:\n\tgo get %[2]s@%[3]s", pkg.path, dep.path, dep.mod.Version) } ld.direct[dep.mod.Path] = true } diff --git a/src/cmd/go/internal/modload/vendor.go b/src/cmd/go/internal/modload/vendor.go index 80d49053c6..d8fd91f1fe 100644 --- a/src/cmd/go/internal/modload/vendor.go +++ b/src/cmd/go/internal/modload/vendor.go @@ -214,6 +214,6 @@ func checkVendorConsistency() { } if vendErrors.Len() > 0 { - base.Fatalf("go: inconsistent vendoring in %s:%s\n\nrun 'go mod vendor' to sync, or use -mod=mod or -mod=readonly to ignore the vendor directory", modRoot, vendErrors) + base.Fatalf("go: inconsistent vendoring in %s:%s\n\n\tTo ignore the vendor directory, use -mod=readonly or -mod=mod.\n\tTo sync the vendor directory, run:\n\t\tgo mod vendor", modRoot, vendErrors) } } diff --git a/src/cmd/go/internal/test/testflag.go b/src/cmd/go/internal/test/testflag.go index d2671ff5a7..10e6604da5 100644 --- a/src/cmd/go/internal/test/testflag.go +++ b/src/cmd/go/internal/test/testflag.go @@ -325,7 +325,7 @@ func testFlags(args []string) (packageNames, passToTest []string) { if !testC { buildFlag = "-i" } - fmt.Fprintf(os.Stderr, "flag %s is not a 'go test' flag (unknown flags cannot be used with %s)\n", firstUnknownFlag, buildFlag) + fmt.Fprintf(os.Stderr, "go test: unknown flag %s cannot be used with %s\n", firstUnknownFlag, buildFlag) exitWithUsage() } diff --git a/src/cmd/go/testdata/script/mod_get_promote_implicit.txt b/src/cmd/go/testdata/script/mod_get_promote_implicit.txt index c64e0c0f70..10ca6594e4 100644 --- a/src/cmd/go/testdata/script/mod_get_promote_implicit.txt +++ b/src/cmd/go/testdata/script/mod_get_promote_implicit.txt @@ -6,10 +6,12 @@ cp go.mod.orig go.mod go list -m indirect-with-pkg stdout '^indirect-with-pkg v1.0.0 => ./indirect-with-pkg$' ! go list ./use-indirect -stderr '^go: m/use-indirect: package indirect-with-pkg imported from implicitly required module; try ''go get -d m/use-indirect'' to add missing requirements$' +stderr '^go: m/use-indirect: package indirect-with-pkg imported from implicitly required module; to add missing requirements, run:\n\tgo get indirect-with-pkg@v1.0.0$' -# We can promote the implicit requirement by getting the importing package, -# as hinted. +# We can promote the implicit requirement by getting the importing package. +# NOTE: the hint recommends getting the imported package (tested below) since +# it's more obvious and doesn't require -d. However, that adds an '// indirect' +# comment on the requirement. go get -d m/use-indirect cmp go.mod go.mod.use cp go.mod.orig go.mod @@ -17,6 +19,8 @@ cp go.mod.orig go.mod # We can also promote implicit requirements using 'go get' on them, or their # packages. This gives us "// indirect" requirements, since 'go get' doesn't # know they're needed by the main module. See #43131 for the rationale. +# The hint above recommends this because it's more obvious usage and doesn't +# require the -d flag. go get -d indirect-with-pkg indirect-without-pkg cmp go.mod go.mod.indirect diff --git a/src/cmd/go/testdata/script/mod_get_retract.txt b/src/cmd/go/testdata/script/mod_get_retract.txt index 6e328eb592..fe0ac88629 100644 --- a/src/cmd/go/testdata/script/mod_get_retract.txt +++ b/src/cmd/go/testdata/script/mod_get_retract.txt @@ -11,7 +11,7 @@ cp go.mod.orig go.mod go mod edit -require example.com/retract/self/prev@v1.9.0 go get -d example.com/retract/self/prev stderr '^go: warning: example.com/retract/self/prev@v1.9.0: retracted by module author: self$' -stderr '^go: run ''go get example.com/retract/self/prev@latest'' to switch to the latest unretracted version$' +stderr '^go: to switch to the latest unretracted version, run:\n\tgo get example.com/retract/self/prev@latest$' go list -m example.com/retract/self/prev stdout '^example.com/retract/self/prev v1.9.0$' diff --git a/src/cmd/go/testdata/script/mod_invalid_path.txt b/src/cmd/go/testdata/script/mod_invalid_path.txt index 05a5133571..667828839f 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.\n\tRun ''go mod edit -module=example.com/mod'' to specify the module path.$' +stderr '^go: no module declaration in go.mod. 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_sum_ambiguous.txt b/src/cmd/go/testdata/script/mod_sum_ambiguous.txt index 209367181d..5344dc0029 100644 --- a/src/cmd/go/testdata/script/mod_sum_ambiguous.txt +++ b/src/cmd/go/testdata/script/mod_sum_ambiguous.txt @@ -25,13 +25,17 @@ cp go.sum.a-only go.sum ! go list example.com/ambiguous/a/b stderr '^missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module$' ! go list -deps . -stderr '^use.go:3:8: missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module; to add it:\n\tgo mod tidy$' +stderr '^use.go:3:8: missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module; to add it:\n\tgo mod download example.com/ambiguous/a/b$' cp go.sum.b-only go.sum ! go list example.com/ambiguous/a/b stderr '^missing go.sum entry for module providing package example.com/ambiguous/a/b$' ! go list -deps . -stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b; to add it:\n\tgo mod tidy$' +stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b; to add it:\n\tgo mod download example.com/ambiguous/a$' + +cp go.sum.buildlist-only go.sum +! go list -deps . +stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b; to add it:\n\tgo mod download example.com/ambiguous/a example.com/ambiguous/a/b$' -- go.mod -- module m diff --git a/src/cmd/go/testdata/script/mod_sum_readonly.txt b/src/cmd/go/testdata/script/mod_sum_readonly.txt index 866f4c1ae4..00b4d7b5d2 100644 --- a/src/cmd/go/testdata/script/mod_sum_readonly.txt +++ b/src/cmd/go/testdata/script/mod_sum_readonly.txt @@ -47,7 +47,7 @@ stderr '^missing go.sum entry for module providing package rsc.io/quote$' # a package that imports it without that error. go list -e -deps -f '{{.ImportPath}}{{with .Error}} {{.Err}}{{end}}' . stdout '^m$' -stdout '^rsc.io/quote missing go.sum entry for module providing package rsc.io/quote; to add it:\n\tgo mod tidy$' +stdout '^rsc.io/quote missing go.sum entry for module providing package rsc.io/quote; to add it:\n\tgo mod download rsc.io/quote$' ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip # go.sum should not have been written. diff --git a/src/cmd/go/testdata/script/mod_vendor_auto.txt b/src/cmd/go/testdata/script/mod_vendor_auto.txt index 1b362eda0b..b0ea907206 100644 --- a/src/cmd/go/testdata/script/mod_vendor_auto.txt +++ b/src/cmd/go/testdata/script/mod_vendor_auto.txt @@ -66,7 +66,7 @@ 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' stderr '^\texample.com/version@v1.2.0: is replaced in go.mod, but not marked as replaced in vendor/modules.txt' -stderr '\n\nrun .go mod vendor. to sync, or use -mod=mod or -mod=readonly to ignore the vendor directory$' +stderr '^\tTo ignore the vendor directory, use -mod=readonly or -mod=mod.\n\tTo sync the vendor directory, run:\n\t\tgo mod vendor$' # Module-specific subcommands should continue to load the full module graph. go mod graph @@ -135,7 +135,7 @@ 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' stderr '^\texample.com/version@v1.2.0: is replaced in go.mod, but not marked as replaced in vendor/modules.txt' -stderr '\n\nrun .go mod vendor. to sync, or use -mod=mod or -mod=readonly to ignore the vendor directory$' +stderr '^\tTo ignore the vendor directory, use -mod=readonly or -mod=mod.\n\tTo sync the vendor directory, run:\n\t\tgo mod vendor$' # If -mod=vendor is set, limited consistency checks should apply even when # the go version is 1.13 or earlier. @@ -151,7 +151,7 @@ cp $WORK/modules-bad-1.13.txt vendor/modules.txt ! go list -mod=vendor -f {{.Dir}} -tags tools all stderr '^go: inconsistent vendoring in '$WORK[/\\]auto':$' stderr '^\texample.com/printversion@v1.0.0: is explicitly required in go.mod, but vendor/modules.txt indicates example.com/printversion@v1.1.0$' -stderr '\n\nrun .go mod vendor. to sync, or use -mod=mod or -mod=readonly to ignore the vendor directory$' +stderr '^\tTo ignore the vendor directory, use -mod=readonly or -mod=mod.\n\tTo sync the vendor directory, run:\n\t\tgo mod vendor$' # If the go version is still 1.13, 'go mod vendor' should write a # matching vendor/modules.txt containing the corrected 1.13 data. diff --git a/src/cmd/go/testdata/script/mod_versions.txt b/src/cmd/go/testdata/script/mod_versions.txt index fd5e5c589d..9e6322bae1 100644 --- a/src/cmd/go/testdata/script/mod_versions.txt +++ b/src/cmd/go/testdata/script/mod_versions.txt @@ -1,14 +1,14 @@ # Test rejection of pkg@version in GOPATH mode. env GO111MODULE=off ! go get rsc.io/quote@v1.5.1 -stderr 'cannot use path@version syntax in GOPATH mode' +stderr '^go: can only use path@version syntax with ''go get'' and ''go install'' in module-aware mode$' ! go build rsc.io/quote@v1.5.1 -stderr 'cannot use path@version syntax in GOPATH mode' +stderr '^package rsc.io/quote@v1.5.1: can only use path@version syntax with ''go get'' and ''go install'' in module-aware mode$' env GO111MODULE=on cd x ! go build rsc.io/quote@v1.5.1 -stderr 'can only use path@version syntax with ''go get''' +stderr '^package rsc.io/quote@v1.5.1: can only use path@version syntax with ''go get'' and ''go install'' in module-aware mode$' -- x/go.mod -- module x diff --git a/src/cmd/go/testdata/script/test_flag.txt b/src/cmd/go/testdata/script/test_flag.txt index ec88d38cbe..0142b3f308 100644 --- a/src/cmd/go/testdata/script/test_flag.txt +++ b/src/cmd/go/testdata/script/test_flag.txt @@ -9,13 +9,13 @@ go test -count=1 -custom -args -v=7 # However, it should be an error to use custom flags when -i or -c are used, # since we know for sure that no test binary will run at all. ! go test -i -custom -stderr '^flag -custom is not a ''go test'' flag \(unknown flags cannot be used with -i\)$' +stderr '^go test: unknown flag -custom cannot be used with -i$' ! go test -c -custom -stderr '^flag -custom is not a ''go test'' flag \(unknown flags cannot be used with -c\)$' +stderr '^go test: unknown flag -custom cannot be used with -c$' # The same should apply even if -c or -i come after a custom flag. ! go test -custom -c -stderr '^flag -custom is not a ''go test'' flag \(unknown flags cannot be used with -c\)$' +stderr '^go test: unknown flag -custom cannot be used with -c$' -- go.mod -- module m -- GitLab From cd6f3a54e4aa1c608f27275cdbb23f8b2a839faa Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 8 Jan 2021 11:35:35 -0500 Subject: [PATCH 1623/1792] cmd/go: revise 'go help' documentation for modules Module-related help pages now contain a brief summary and point to the reference documentation at golang.org/ref/mod for details. Help pages for commands like 'go get' still describe the basic usage and summarize flags but don't provide as much background detail. Fixes #41427 Fixes #43419 Change-Id: Icacd38e0f33c352c447cc5a496c99674493abde2 Reviewed-on: https://go-review.googlesource.com/c/go/+/282615 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 836 ++++--------------------- src/cmd/go/internal/help/helpdoc.go | 19 +- src/cmd/go/internal/list/list.go | 2 +- src/cmd/go/internal/modcmd/download.go | 4 +- src/cmd/go/internal/modcmd/edit.go | 4 +- src/cmd/go/internal/modcmd/graph.go | 2 + src/cmd/go/internal/modcmd/init.go | 2 + src/cmd/go/internal/modcmd/tidy.go | 2 + src/cmd/go/internal/modcmd/vendor.go | 2 + src/cmd/go/internal/modcmd/verify.go | 2 + src/cmd/go/internal/modcmd/why.go | 2 + src/cmd/go/internal/modfetch/fetch.go | 108 +--- src/cmd/go/internal/modfetch/proxy.go | 61 +- src/cmd/go/internal/modget/get.go | 125 +--- src/cmd/go/internal/modload/help.go | 484 +------------- src/cmd/go/internal/work/build.go | 5 +- 16 files changed, 212 insertions(+), 1448 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index d4303c2aad..d884f7d5f3 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -153,7 +153,10 @@ // created with -buildmode=shared. // -mod mode // module download mode to use: readonly, vendor, or mod. -// See 'go help modules' for more. +// By default, if a vendor directory is present and the go version in go.mod +// is 1.14 or higher, the go command acts as if -mod=vendor were set. +// Otherwise, the go command acts as if -mod=readonly were set. +// See https://golang.org/ref/mod#build-commands for details. // -modcacherw // leave newly-created directories in the module cache read-write // instead of making them read-only. @@ -595,85 +598,49 @@ // // go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages] // -// Get resolves and adds dependencies to the current development module -// and then builds and installs them. -// -// The first step is to resolve which dependencies to add. -// -// For each named package or package pattern, get must decide which version of -// the corresponding module to use. By default, get looks up the latest tagged -// release version, such as v0.4.5 or v1.2.3. If there are no tagged release -// versions, get looks up the latest tagged pre-release version, such as -// v0.0.1-pre1. If there are no tagged versions at all, get looks up the latest -// known commit. If the module is not already required at a later version -// (for example, a pre-release newer than the latest release), get will use -// the version it looked up. Otherwise, get will use the currently -// required version. -// -// This default version selection can be overridden by adding an @version -// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. -// The version may be a prefix: @v1 denotes the latest available version starting -// with v1. See 'go help modules' under the heading 'Module queries' for the -// full query syntax. -// -// For modules stored in source control repositories, the version suffix can -// also be a commit hash, branch identifier, or other syntax known to the -// source control system, as in 'go get golang.org/x/text@master'. Note that -// branches with names that overlap with other module query syntax cannot be -// selected explicitly. For example, the suffix @v2 means the latest version -// starting with v2, not the branch named v2. -// -// If a module under consideration is already a dependency of the current -// development module, then get will update the required version. -// Specifying a version earlier than the current required version is valid and -// downgrades the dependency. The version suffix @none indicates that the -// dependency should be removed entirely, downgrading or removing modules -// depending on it as needed. -// -// The version suffix @latest explicitly requests the latest minor release of -// the module named by the given path. The suffix @upgrade is like @latest but -// will not downgrade a module if it is already required at a revision or -// pre-release version newer than the latest released version. The suffix -// @patch requests the latest patch release: the latest released version -// with the same major and minor version numbers as the currently required -// version. Like @upgrade, @patch will not downgrade a module already required -// at a newer version. If the path is not already required, @upgrade is -// equivalent to @latest, and @patch is disallowed. -// -// Although get defaults to using the latest version of the module containing -// a named package, it does not use the latest version of that module's -// dependencies. Instead it prefers to use the specific dependency versions -// requested by that module. For example, if the latest A requires module -// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A' -// will use the latest A but then use B v1.2.3, as requested by A. (If there -// are competing requirements for a particular module, then 'go get' resolves -// those requirements by taking the maximum requested version.) +// Get resolves its command-line arguments to packages at specific module versions, +// updates go.mod to require those versions, downloads source code into the +// module cache, then builds and installs the named packages. +// +// To add a dependency for a package or upgrade it to its latest version: +// +// go get example.com/pkg +// +// To upgrade or downgrade a package to a specific version: +// +// go get example.com/pkg@v1.2.3 +// +// To remove a dependency on a module and downgrade modules that require it: +// +// go get example.com/mod@none +// +// See https://golang.org/ref/mod#go-get for details. +// +// The 'go install' command may be used to build and install packages. When a +// version is specified, 'go install' runs in module-aware mode and ignores +// the go.mod file in the current directory. For example: +// +// go install example.com/pkg@v1.2.3 +// go install example.com/pkg@latest +// +// See 'go help install' or https://golang.org/ref/mod#go-install for details. +// +// In addition to build flags (listed in 'go help build') 'go get' accepts the +// following flags. // // The -t flag instructs get to consider modules needed to build tests of // packages specified on the command line. // // The -u flag instructs get to update modules providing dependencies // of packages named on the command line to use newer minor or patch -// releases when available. Continuing the previous example, 'go get -u A' -// will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C, -// but C does not provide any packages needed to build packages in A -// (not including tests), then C will not be updated. +// releases when available. // // The -u=patch flag (not -u patch) also instructs get to update dependencies, // but changes the default to select patch releases. -// Continuing the previous example, -// 'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3), -// while 'go get -u=patch A' will use a patch release of A instead. // // When the -t and -u flags are used together, get will update // test dependencies as well. // -// In general, adding a new dependency may require upgrading -// existing dependencies to keep a working build, and 'go get' does -// this automatically. Similarly, downgrading one dependency may -// require downgrading other dependencies, and 'go get' does -// this automatically as well. -// // The -insecure flag permits fetching from repositories and resolving // custom domains using insecure schemes such as HTTP, and also bypassess // module sum validation using the checksum database. Use with caution. @@ -682,12 +649,8 @@ // variable instead. To bypass module sum validation, use GOPRIVATE or // GONOSUMDB. See 'go help environment' for details. // -// The second step is to download (if needed), build, and install -// the named packages. -// -// The -d flag instructs get to skip this step, downloading source code -// needed to build the named packages and their dependencies, but not -// building or installing. +// The -d flag instructs get not to build or install packages. get will only +// update go.mod and download source code needed to build packages. // // Building and installing packages with get is deprecated. In a future release, // the -d flag will be enabled by default, and 'go get' will be only be used to @@ -696,31 +659,14 @@ // ignoring the current module, use 'go install' with an @version suffix like // "@latest" after each argument. // -// If an argument names a module but not a package (because there is no -// Go source code in the module's root directory), then the install step -// is skipped for that argument, instead of causing a build failure. -// For example 'go get golang.org/x/perf' succeeds even though there -// is no code corresponding to that import path. -// -// Note that package patterns are allowed and are expanded after resolving -// the module versions. For example, 'go get golang.org/x/perf/cmd/...' -// adds the latest golang.org/x/perf and then installs the commands in that -// latest version. -// -// With no package arguments, 'go get' applies to Go package in the -// current directory, if any. In particular, 'go get -u' and -// 'go get -u=patch' update all the dependencies of that package. -// With no package arguments and also without -u, 'go get' is not much more -// than 'go install', and 'go get -d' not much more than 'go list'. -// -// For more about modules, see 'go help modules'. +// For more about modules, see https://golang.org/ref/mod. // // For more about specifying packages, see 'go help packages'. // // This text describes the behavior of get using modules to manage source // code and dependencies. If instead the go command is running in GOPATH // mode, the details of get's flags and effects change, as does 'go help get'. -// See 'go help modules' and 'go help gopath-get'. +// See 'go help gopath-get'. // // See also: go build, go install, go clean, go mod. // @@ -1055,7 +1001,7 @@ // // For more about specifying packages, see 'go help packages'. // -// For more about modules, see 'go help modules'. +// For more about modules, see https://golang.org/ref/mod. // // // Module maintenance @@ -1120,7 +1066,9 @@ // // The -x flag causes download to print the commands download executes. // -// See 'go help modules' for more about module queries. +// See https://golang.org/ref/mod#go-mod-download for more about 'go mod download'. +// +// See https://golang.org/ref/mod#version-queries for more about version queries. // // // Edit go.mod from tools or scripts @@ -1223,9 +1171,7 @@ // referred to indirectly. For the full set of modules available to a build, // use 'go list -m -json all'. // -// For example, a tool can obtain the go.mod as a data structure by -// parsing the output of 'go mod edit -json' and can then make changes -// by invoking 'go mod edit' with -require, -exclude, and so on. +// See https://golang.org/ref/mod#go-mod-edit for more about 'go mod edit'. // // // Print module requirement graph @@ -1239,6 +1185,8 @@ // and one of its requirements. Each module is identified as a string of the form // path@version, except for the main module, which has no @version suffix. // +// See https://golang.org/ref/mod#go-mod-graph for more about 'go mod graph'. +// // // Initialize new module in current directory // @@ -1258,6 +1206,8 @@ // If a configuration file for a vendoring tool is present, init will attempt to // import module requirements from it. // +// See https://golang.org/ref/mod#go-mod-init for more about 'go mod init'. +// // // Add missing and remove unused modules // @@ -1277,6 +1227,8 @@ // The -e flag causes tidy to attempt to proceed despite errors // encountered while loading packages. // +// See https://golang.org/ref/mod#go-mod-tidy for more about 'go mod tidy'. +// // // Make vendored copy of dependencies // @@ -1294,6 +1246,8 @@ // The -e flag causes vendor to attempt to proceed despite errors // encountered while loading packages. // +// See https://golang.org/ref/mod#go-mod-vendor for more about 'go mod vendor'. +// // // Verify dependencies have expected content // @@ -1308,6 +1262,8 @@ // modules have been changed and causes 'go mod' to exit with a // non-zero status. // +// See https://golang.org/ref/mod#go-mod-verify for more about 'go mod verify'. +// // // Explain why packages or modules are needed // @@ -1344,6 +1300,8 @@ // (main module does not need package golang.org/x/text/encoding) // $ // +// See https://golang.org/ref/mod#go-mod-why for more about 'go mod why'. +// // // Compile and run Go program // @@ -1788,6 +1746,10 @@ // // General-purpose environment variables: // +// GO111MODULE +// Controls whether the go command runs in module-aware mode or GOPATH mode. +// May be "off", "on", or "auto". +// See https://golang.org/ref/mod#mod-commands. // GCCGO // The gccgo command to run for 'go build -compiler=gccgo'. // GOARCH @@ -1826,20 +1788,24 @@ // GOPATH // For more details see: 'go help gopath'. // GOPROXY -// URL of Go module proxy. See 'go help modules'. +// URL of Go module proxy. See https://golang.org/ref/mod#environment-variables +// and https://golang.org/ref/mod#module-proxy for details. // GOPRIVATE, GONOPROXY, GONOSUMDB // Comma-separated list of glob patterns (in the syntax of Go's path.Match) // of module path prefixes that should always be fetched directly // or that should not be compared against the checksum database. -// See 'go help private'. +// See https://golang.org/ref/mod#private-modules. // GOROOT // The root of the go tree. // GOSUMDB // The name of checksum database to use and optionally its public key and -// URL. See 'go help module-auth'. +// URL. See https://golang.org/ref/mod#authenticating. // GOTMPDIR // The directory where the go command will write // temporary source files, packages, and binaries. +// GOVCS +// Lists version control commands that may be used with matching servers. +// See 'go help vcs'. // // Environment variables for use with cgo: // @@ -1984,88 +1950,23 @@ // directory and then successive parent directories to find the go.mod // marking the root of the main (current) module. // -// The go.mod file itself is line-oriented, with // comments but -// no /* */ comments. Each line holds a single directive, made up of a -// verb followed by arguments. For example: -// -// module my/thing -// go 1.12 -// require other/thing v1.0.2 -// require new/thing/v2 v2.3.4 -// exclude old/thing v1.2.3 -// replace bad/thing v1.4.5 => good/thing v1.4.5 -// retract v1.5.6 -// -// The verbs are -// module, to define the module path; -// go, to set the expected language version; -// require, to require a particular module at a given version or later; -// exclude, to exclude a particular module version from use; -// replace, to replace a module version with a different module version; and -// retract, to indicate a previously released version should not be used. -// Exclude and replace apply only in the main module's go.mod and are ignored -// in dependencies. See https://golang.org/ref/mod for details. -// -// The leading verb can be factored out of adjacent lines to create a block, -// like in Go imports: -// -// require ( -// new/thing/v2 v2.3.4 -// old/thing v1.2.3 -// ) -// -// The go.mod file is designed both to be edited directly and to be -// easily updated by tools. The 'go mod edit' command can be used to -// parse and edit the go.mod file from programs and tools. -// See 'go help mod edit'. -// -// The go command automatically updates go.mod each time it uses the -// module graph, to make sure go.mod always accurately reflects reality -// and is properly formatted. For example, consider this go.mod file: -// -// module M -// -// require ( -// A v1 -// B v1.0.0 -// C v1.0.0 -// D v1.2.3 -// E dev -// ) -// -// exclude D v1.2.3 -// -// The update rewrites non-canonical version identifiers to semver form, -// so A's v1 becomes v1.0.0 and E's dev becomes the pseudo-version for the -// latest commit on the dev branch, perhaps v0.0.0-20180523231146-b3f5c0f6e5f1. -// -// The update modifies requirements to respect exclusions, so the -// requirement on the excluded D v1.2.3 is updated to use the next -// available version of D, perhaps D v1.2.4 or D v1.3.0. -// -// The update removes redundant or misleading requirements. -// For example, if A v1.0.0 itself requires B v1.2.0 and C v1.0.0, -// then go.mod's requirement of B v1.0.0 is misleading (superseded by -// A's need for v1.2.0), and its requirement of C v1.0.0 is redundant -// (implied by A's need for the same version), so both will be removed. -// If module M contains packages that directly import packages from B or -// C, then the requirements will be kept but updated to the actual -// versions being used. -// -// Finally, the update reformats the go.mod in a canonical formatting, so -// that future mechanical changes will result in minimal diffs. -// -// Because the module graph defines the meaning of import statements, any -// commands that load packages also use and therefore update go.mod, -// including go build, go get, go install, go list, go test, go mod graph, -// go mod tidy, and go mod why. -// -// The expected language version, set by the go directive, determines -// which language features are available when compiling the module. -// Language features available in that version will be available for use. -// Language features removed in earlier versions, or added in later versions, -// will not be available. Note that the language version does not affect -// build tags, which are determined by the Go release being used. +// The go.mod file format is described in detail at +// https://golang.org/ref/mod#go-mod-file. +// +// To create a new go.mod file, use 'go help init'. For details see +// 'go help mod init' or https://golang.org/ref/mod#go-mod-init. +// +// To add missing module requirements or remove unneeded requirements, +// use 'go mod tidy'. For details, see 'go help mod tidy' or +// https://golang.org/ref/mod#go-mod-tidy. +// +// To add, upgrade, downgrade, or remove a specific module requirement, use +// 'go get'. For details, see 'go help module-get' or +// https://golang.org/ref/mod#go-get. +// +// To make other changes or to parse go.mod as JSON for use by other tools, +// use 'go mod edit'. See 'go help mod edit' or +// https://golang.org/ref/mod#go-mod-edit. // // // GOPATH environment variable @@ -2300,65 +2201,8 @@ // a site serving from a fixed file system (including a file:/// URL) // can be a module proxy. // -// The GET requests sent to a Go module proxy are: -// -// GET $GOPROXY//@v/list returns a list of known versions of the given -// module, one per line. -// -// GET $GOPROXY//@v/.info returns JSON-formatted metadata -// about that version of the given module. -// -// GET $GOPROXY//@v/.mod returns the go.mod file -// for that version of the given module. -// -// GET $GOPROXY//@v/.zip returns the zip archive -// for that version of the given module. -// -// GET $GOPROXY//@latest returns JSON-formatted metadata about the -// latest known version of the given module in the same format as -// /@v/.info. The latest version should be the version of -// the module the go command may use if /@v/list is empty or no -// listed version is suitable. /@latest is optional and may not -// be implemented by a module proxy. -// -// When resolving the latest version of a module, the go command will request -// /@v/list, then, if no suitable versions are found, /@latest. -// The go command prefers, in order: the semantically highest release version, -// the semantically highest pre-release version, and the chronologically -// most recent pseudo-version. In Go 1.12 and earlier, the go command considered -// pseudo-versions in /@v/list to be pre-release versions, but this is -// no longer true since Go 1.13. -// -// To avoid problems when serving from case-sensitive file systems, -// the and elements are case-encoded, replacing every -// uppercase letter with an exclamation mark followed by the corresponding -// lower-case letter: github.com/Azure encodes as github.com/!azure. -// -// The JSON-formatted metadata about a given module corresponds to -// this Go data structure, which may be expanded in the future: -// -// type Info struct { -// Version string // version string -// Time time.Time // commit time -// } -// -// The zip archive for a specific version of a given module is a -// standard zip file that contains the file tree corresponding -// to the module's source code and related files. The archive uses -// slash-separated paths, and every file path in the archive must -// begin with @/, where the module and version are -// substituted directly, not case-encoded. The root of the module -// file tree corresponds to the @/ prefix in the -// archive. -// -// Even when downloading directly from version control systems, -// the go command synthesizes explicit info, mod, and zip files -// and stores them in its local cache, $GOPATH/pkg/mod/cache/download, -// the same as if it had downloaded them directly from a proxy. -// The cache layout is the same as the proxy URL space, so -// serving $GOPATH/pkg/mod/cache/download at (or copying it to) -// https://example.com/proxy would let other users access those -// cached module versions with GOPROXY=https://example.com/proxy. +// For details on the GOPROXY protocol, see +// https://golang.org/ref/mod#goproxy-protocol. // // // Import path syntax @@ -2509,7 +2353,7 @@ // (See 'go help gopath-get' and 'go help gopath'.) // // When using modules, downloaded packages are stored in the module cache. -// (See 'go help module-get' and 'go help goproxy'.) +// See https://golang.org/ref/mod#module-cache. // // When using modules, an additional variant of the go-import meta tag is // recognized and is preferred over those listing version control systems. @@ -2519,7 +2363,8 @@ // // This tag means to fetch modules with paths beginning with example.org // from the module proxy available at the URL https://code.org/moduleproxy. -// See 'go help goproxy' for details about the proxy protocol. +// See https://golang.org/ref/mod#goproxy-protocol for details about the +// proxy protocol. // // Import path checking // @@ -2550,483 +2395,28 @@ // // Modules, module versions, and more // -// A module is a collection of related Go packages. -// Modules are the unit of source code interchange and versioning. -// The go command has direct support for working with modules, -// including recording and resolving dependencies on other modules. -// Modules replace the old GOPATH-based approach to specifying -// which source files are used in a given build. -// -// Module support -// -// The go command includes support for Go modules. Module-aware mode is active -// by default whenever a go.mod file is found in the current directory or in -// any parent directory. -// -// The quickest way to take advantage of module support is to check out your -// repository, create a go.mod file (described in the next section) there, and run -// go commands from within that file tree. -// -// For more fine-grained control, the go command continues to respect -// a temporary environment variable, GO111MODULE, which can be set to one -// of three string values: off, on, or auto (the default). -// If GO111MODULE=on, then the go command requires the use of modules, -// never consulting GOPATH. We refer to this as the command -// being module-aware or running in "module-aware mode". -// If GO111MODULE=off, then the go command never uses -// module support. Instead it looks in vendor directories and GOPATH -// to find dependencies; we now refer to this as "GOPATH mode." -// If GO111MODULE=auto or is unset, then the go command enables or disables -// module support based on the current directory. -// Module support is enabled only when the current directory contains a -// go.mod file or is below a directory containing a go.mod file. -// -// In module-aware mode, GOPATH no longer defines the meaning of imports -// during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) -// and installed commands (in GOPATH/bin, unless GOBIN is set). -// -// Defining a module -// -// A module is defined by a tree of Go source files with a go.mod file -// in the tree's root directory. The directory containing the go.mod file -// is called the module root. Typically the module root will also correspond -// to a source code repository root (but in general it need not). -// The module is the set of all Go packages in the module root and its -// subdirectories, but excluding subtrees with their own go.mod files. -// -// The "module path" is the import path prefix corresponding to the module root. -// The go.mod file defines the module path and lists the specific versions -// of other modules that should be used when resolving imports during a build, -// by giving their module paths and versions. -// -// For example, this go.mod declares that the directory containing it is the root -// of the module with path example.com/m, and it also declares that the module -// depends on specific versions of golang.org/x/text and gopkg.in/yaml.v2: -// -// module example.com/m -// -// require ( -// golang.org/x/text v0.3.0 -// gopkg.in/yaml.v2 v2.1.0 -// ) -// -// The go.mod file can also specify replacements and excluded versions -// that only apply when building the module directly; they are ignored -// when the module is incorporated into a larger build. -// For more about the go.mod file, see 'go help go.mod'. -// -// To start a new module, simply create a go.mod file in the root of the -// module's directory tree, containing only a module statement. -// The 'go mod init' command can be used to do this: -// -// go mod init example.com/m -// -// In a project already using an existing dependency management tool like -// godep, glide, or dep, 'go mod init' will also add require statements -// matching the existing configuration. -// -// Once the go.mod file exists, no additional steps are required: -// go commands like 'go build', 'go test', or even 'go list' will automatically -// add new dependencies as needed to satisfy imports. -// -// The main module and the build list -// -// The "main module" is the module containing the directory where the go command -// is run. The go command finds the module root by looking for a go.mod in the -// current directory, or else the current directory's parent directory, -// or else the parent's parent directory, and so on. -// -// The main module's go.mod file defines the precise set of packages available -// for use by the go command, through require, replace, and exclude statements. -// Dependency modules, found by following require statements, also contribute -// to the definition of that set of packages, but only through their go.mod -// files' require statements: any replace and exclude statements in dependency -// modules are ignored. The replace and exclude statements therefore allow the -// main module complete control over its own build, without also being subject -// to complete control by dependencies. -// -// The set of modules providing packages to builds is called the "build list". -// The build list initially contains only the main module. Then the go command -// adds to the list the exact module versions required by modules already -// on the list, recursively, until there is nothing left to add to the list. -// If multiple versions of a particular module are added to the list, -// then at the end only the latest version (according to semantic version -// ordering) is kept for use in the build. -// -// The 'go list' command provides information about the main module -// and the build list. For example: -// -// go list -m # print path of main module -// go list -m -f={{.Dir}} # print root directory of main module -// go list -m all # print build list -// -// Maintaining module requirements -// -// The go.mod file is meant to be readable and editable by both programmers and -// tools. Most updates to dependencies can be performed using "go get" and -// "go mod tidy". Other module-aware build commands may be invoked using the -// -mod=mod flag to automatically add missing requirements and fix inconsistencies. -// -// The "go get" command updates go.mod to change the module versions used in a -// build. An upgrade of one module may imply upgrading others, and similarly a -// downgrade of one module may imply downgrading others. The "go get" command -// makes these implied changes as well. See "go help module-get". -// -// The "go mod" command provides other functionality for use in maintaining -// and understanding modules and go.mod files. See "go help mod", particularly -// "go help mod tidy" and "go help mod edit". -// -// As part of maintaining the require statements in go.mod, the go command -// tracks which ones provide packages imported directly by the current module -// and which ones provide packages only used indirectly by other module -// dependencies. Requirements needed only for indirect uses are marked with a -// "// indirect" comment in the go.mod file. Indirect requirements may be -// automatically removed from the go.mod file once they are implied by other -// direct requirements. Indirect requirements only arise when using modules -// that fail to state some of their own dependencies or when explicitly -// upgrading a module's dependencies ahead of its own stated requirements. -// -// The -mod build flag provides additional control over the updating and use of -// go.mod for commands that build packages like "go build" and "go test". -// -// If invoked with -mod=readonly (the default in most situations), the go command -// reports an error if a package named on the command line or an imported package -// is not provided by any module in the build list computed from the main module's -// requirements. The go command also reports an error if a module's checksum is -// missing from go.sum (see Module downloading and verification). Either go.mod or -// go.sum must be updated in these situations. -// -// If invoked with -mod=mod, the go command automatically updates go.mod and -// go.sum, fixing inconsistencies and adding missing requirements and checksums -// as needed. If the go command finds an unfamiliar import, it looks up the -// module containing that import and adds a requirement for the latest version -// of that module to go.mod. In most cases, therefore, one may add an import to -// source code and run "go build", "go test", or even "go list" with -mod=mod: -// as part of analyzing the package, the go command will resolve the import and -// update the go.mod file. -// -// If invoked with -mod=vendor, the go command loads packages from the main -// module's vendor directory instead of downloading modules to and loading packages -// from the module cache. The go command assumes the vendor directory holds -// correct copies of dependencies, and it does not compute the set of required -// module versions from go.mod files. However, the go command does check that -// vendor/modules.txt (generated by "go mod vendor") contains metadata consistent -// with go.mod. -// -// If the go command is not invoked with a -mod flag, and the vendor directory -// is present, and the "go" version in go.mod is 1.14 or higher, the go command -// will act as if it were invoked with -mod=vendor. Otherwise, the -mod flag -// defaults to -mod=readonly. -// -// Note that neither "go get" nor the "go mod" subcommands accept the -mod flag. -// -// Pseudo-versions -// -// The go.mod file and the go command more generally use semantic versions as -// the standard form for describing module versions, so that versions can be -// compared to determine which should be considered earlier or later than another. -// A module version like v1.2.3 is introduced by tagging a revision in the -// underlying source repository. Untagged revisions can be referred to -// using a "pseudo-version" like v0.0.0-yyyymmddhhmmss-abcdefabcdef, -// where the time is the commit time in UTC and the final suffix is the prefix -// of the commit hash. The time portion ensures that two pseudo-versions can -// be compared to determine which happened later, the commit hash identifes -// the underlying commit, and the prefix (v0.0.0- in this example) is derived from -// the most recent tagged version in the commit graph before this commit. -// -// There are three pseudo-version forms: -// -// vX.0.0-yyyymmddhhmmss-abcdefabcdef is used when there is no earlier -// versioned commit with an appropriate major version before the target commit. -// (This was originally the only form, so some older go.mod files use this form -// even for commits that do follow tags.) -// -// vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef is used when the most -// recent versioned commit before the target commit is vX.Y.Z-pre. -// -// vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef is used when the most -// recent versioned commit before the target commit is vX.Y.Z. -// -// Pseudo-versions never need to be typed by hand: the go command will accept -// the plain commit hash and translate it into a pseudo-version (or a tagged -// version if available) automatically. This conversion is an example of a -// module query. -// -// Module queries -// -// The go command accepts a "module query" in place of a module version -// both on the command line and in the main module's go.mod file. -// (After evaluating a query found in the main module's go.mod file, -// the go command updates the file to replace the query with its result.) -// -// A fully-specified semantic version, such as "v1.2.3", -// evaluates to that specific version. -// -// A semantic version prefix, such as "v1" or "v1.2", -// evaluates to the latest available tagged version with that prefix. -// -// A semantic version comparison, such as "=v1.5.6", -// evaluates to the available tagged version nearest to the comparison target -// (the latest version for < and <=, the earliest version for > and >=). -// -// The string "latest" matches the latest available tagged version, -// or else the underlying source repository's latest untagged revision. -// -// The string "upgrade" is like "latest", but if the module is -// currently required at a later version than the version "latest" -// would select (for example, a newer pre-release version), "upgrade" -// will select the later version instead. -// -// The string "patch" matches the latest available tagged version -// of a module with the same major and minor version numbers as the -// currently required version. If no version is currently required, -// "patch" is equivalent to "latest". -// -// A revision identifier for the underlying source repository, such as -// a commit hash prefix, revision tag, or branch name, selects that -// specific code revision. If the revision is also tagged with a -// semantic version, the query evaluates to that semantic version. -// Otherwise the query evaluates to a pseudo-version for the commit. -// Note that branches and tags with names that are matched by other -// query syntax cannot be selected this way. For example, the query -// "v2" means the latest version starting with "v2", not the branch -// named "v2". -// -// All queries prefer release versions to pre-release versions. -// For example, " [/go.mod] -// -// Each known module version results in two lines in the go.sum file. -// The first line gives the hash of the module version's file tree. -// The second line appends "/go.mod" to the version and gives the hash -// of only the module version's (possibly synthesized) go.mod file. -// The go.mod-only hash allows downloading and authenticating a -// module version's go.mod file, which is needed to compute the -// dependency graph, without also downloading all the module's source code. -// -// The hash begins with an algorithm prefix of the form "h:". -// The only defined algorithm prefix is "h1:", which uses SHA-256. -// -// Module authentication failures -// -// The go command maintains a cache of downloaded packages and computes -// and records the cryptographic checksum of each package at download time. -// In normal operation, the go command checks the main module's go.sum file -// against these precomputed checksums instead of recomputing them on -// each command invocation. The 'go mod verify' command checks that -// the cached copies of module downloads still match both their recorded -// checksums and the entries in go.sum. -// -// In day-to-day development, the checksum of a given module version -// should never change. Each time a dependency is used by a given main -// module, the go command checks its local cached copy, freshly -// downloaded or not, against the main module's go.sum. If the checksums -// don't match, the go command reports the mismatch as a security error -// and refuses to run the build. When this happens, proceed with caution: -// code changing unexpectedly means today's build will not match -// yesterday's, and the unexpected change may not be beneficial. -// -// If the go command reports a mismatch in go.sum, the downloaded code -// for the reported module version does not match the one used in a -// previous build of the main module. It is important at that point -// to find out what the right checksum should be, to decide whether -// go.sum is wrong or the downloaded code is wrong. Usually go.sum is right: -// you want to use the same code you used yesterday. -// -// If a downloaded module is not yet included in go.sum and it is a publicly -// available module, the go command consults the Go checksum database to fetch -// the expected go.sum lines. If the downloaded code does not match those -// lines, the go command reports the mismatch and exits. Note that the -// database is not consulted for module versions already listed in go.sum. -// -// If a go.sum mismatch is reported, it is always worth investigating why -// the code downloaded today differs from what was downloaded yesterday. -// -// The GOSUMDB environment variable identifies the name of checksum database -// to use and optionally its public key and URL, as in: -// -// GOSUMDB="sum.golang.org" -// GOSUMDB="sum.golang.org+" -// GOSUMDB="sum.golang.org+ https://sum.golang.org" -// -// The go command knows the public key of sum.golang.org, and also that the name -// sum.golang.google.cn (available inside mainland China) connects to the -// sum.golang.org checksum database; use of any other database requires giving -// the public key explicitly. -// The URL defaults to "https://" followed by the database name. -// -// GOSUMDB defaults to "sum.golang.org", the Go checksum database run by Google. -// See https://sum.golang.org/privacy for the service's privacy policy. -// -// If GOSUMDB is set to "off", or if "go get" is invoked with the -insecure flag, -// the checksum database is not consulted, and all unrecognized modules are -// accepted, at the cost of giving up the security guarantee of verified repeatable -// downloads for all modules. A better way to bypass the checksum database -// for specific modules is to use the GOPRIVATE or GONOSUMDB environment -// variables. See 'go help private' for details. +// When the go command downloads a module zip file or go.mod file into the +// module cache, it computes a cryptographic hash and compares it with a known +// value to verify the file hasn't changed since it was first downloaded. Known +// hashes are stored in a file in the module root directory named go.sum. Hashes +// may also be downloaded from the checksum database depending on the values of +// GOSUMDB, GOPRIVATE, and GONOSUMDB. // -// The 'go env -w' command (see 'go help env') can be used to set these variables -// for future go command invocations. +// For details, see https://golang.org/ref/mod#authenticating. // // // Package lists and patterns @@ -3121,8 +2511,8 @@ // These defaults work well for publicly available source code. // // The GOPRIVATE environment variable controls which modules the go command -// considers to be private (not available publicly) and should therefore not use the -// proxy or checksum database. The variable is a comma-separated list of +// considers to be private (not available publicly) and should therefore not use +// the proxy or checksum database. The variable is a comma-separated list of // glob patterns (in the syntax of Go's path.Match) of module path prefixes. // For example, // @@ -3132,10 +2522,6 @@ // matching either pattern, including git.corp.example.com/xyzzy, rsc.io/private, // and rsc.io/private/quux. // -// The GOPRIVATE environment variable may be used by other tools as well to -// identify non-public modules. For example, an editor could use GOPRIVATE -// to decide whether to hyperlink a package import to a godoc.org page. -// // For fine-grained control over module download and validation, the GONOPROXY // and GONOSUMDB environment variables accept the same kind of glob list // and override GOPRIVATE for the specific decision of whether to use the proxy @@ -3148,12 +2534,6 @@ // GOPROXY=proxy.example.com // GONOPROXY=none // -// This would tell the go command and other tools that modules beginning with -// a corp.example.com subdomain are private but that the company proxy should -// be used for downloading both public and private modules, because -// GONOPROXY has been set to a pattern that won't match any modules, -// overriding GOPRIVATE. -// // The GOPRIVATE variable is also used to define the "public" and "private" // patterns for the GOVCS variable; see 'go help vcs'. For that usage, // GOPRIVATE applies even in GOPATH mode. In that case, it matches import paths @@ -3162,6 +2542,8 @@ // The 'go env -w' command (see 'go help env') can be used to set these variables // for future go command invocations. // +// For more details, see https://golang.org/ref/mod#private-modules. +// // // Testing flags // diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index 98f58441b4..e07ad0e1db 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -266,7 +266,7 @@ listed in the GOPATH environment variable. (See 'go help gopath-get' and 'go help gopath'.) When using modules, downloaded packages are stored in the module cache. -(See 'go help module-get' and 'go help goproxy'.) +See https://golang.org/ref/mod#module-cache. When using modules, an additional variant of the go-import meta tag is recognized and is preferred over those listing version control systems. @@ -276,7 +276,8 @@ That variant uses "mod" as the vcs in the content value, as in: This tag means to fetch modules with paths beginning with example.org from the module proxy available at the URL https://code.org/moduleproxy. -See 'go help goproxy' for details about the proxy protocol. +See https://golang.org/ref/mod#goproxy-protocol for details about the +proxy protocol. Import path checking @@ -483,6 +484,10 @@ See 'go help env' for details. General-purpose environment variables: + GO111MODULE + Controls whether the go command runs in module-aware mode or GOPATH mode. + May be "off", "on", or "auto". + See https://golang.org/ref/mod#mod-commands. GCCGO The gccgo command to run for 'go build -compiler=gccgo'. GOARCH @@ -521,20 +526,24 @@ General-purpose environment variables: GOPATH For more details see: 'go help gopath'. GOPROXY - URL of Go module proxy. See 'go help modules'. + URL of Go module proxy. See https://golang.org/ref/mod#environment-variables + and https://golang.org/ref/mod#module-proxy for details. GOPRIVATE, GONOPROXY, GONOSUMDB Comma-separated list of glob patterns (in the syntax of Go's path.Match) of module path prefixes that should always be fetched directly or that should not be compared against the checksum database. - See 'go help private'. + See https://golang.org/ref/mod#private-modules. GOROOT The root of the go tree. GOSUMDB The name of checksum database to use and optionally its public key and - URL. See 'go help module-auth'. + URL. See https://golang.org/ref/mod#authenticating. GOTMPDIR The directory where the go command will write temporary source files, packages, and binaries. + GOVCS + Lists version control commands that may be used with matching servers. + See 'go help vcs'. Environment variables for use with cgo: diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 61d3bc53d3..8a67335b3e 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -304,7 +304,7 @@ For more about build flags, see 'go help build'. For more about specifying packages, see 'go help packages'. -For more about modules, see 'go help modules'. +For more about modules, see https://golang.org/ref/mod. `, } diff --git a/src/cmd/go/internal/modcmd/download.go b/src/cmd/go/internal/modcmd/download.go index ef1ad780c8..e7d3d869cb 100644 --- a/src/cmd/go/internal/modcmd/download.go +++ b/src/cmd/go/internal/modcmd/download.go @@ -52,7 +52,9 @@ corresponding to this Go struct: The -x flag causes download to print the commands download executes. -See 'go help modules' for more about module queries. +See https://golang.org/ref/mod#go-mod-download for more about 'go mod download'. + +See https://golang.org/ref/mod#version-queries for more about version queries. `, } diff --git a/src/cmd/go/internal/modcmd/edit.go b/src/cmd/go/internal/modcmd/edit.go index 3a406b91fa..1df104eb1d 100644 --- a/src/cmd/go/internal/modcmd/edit.go +++ b/src/cmd/go/internal/modcmd/edit.go @@ -122,9 +122,7 @@ Note that this only describes the go.mod file itself, not other modules referred to indirectly. For the full set of modules available to a build, use 'go list -m -json all'. -For example, a tool can obtain the go.mod as a data structure by -parsing the output of 'go mod edit -json' and can then make changes -by invoking 'go mod edit' with -require, -exclude, and so on. +See https://golang.org/ref/mod#go-mod-edit for more about 'go mod edit'. `, } diff --git a/src/cmd/go/internal/modcmd/graph.go b/src/cmd/go/internal/modcmd/graph.go index 3277548c23..a88e9ef455 100644 --- a/src/cmd/go/internal/modcmd/graph.go +++ b/src/cmd/go/internal/modcmd/graph.go @@ -26,6 +26,8 @@ Graph prints the module requirement graph (with replacements applied) in text form. Each line in the output has two space-separated fields: a module and one of its requirements. Each module is identified as a string of the form path@version, except for the main module, which has no @version suffix. + +See https://golang.org/ref/mod#go-mod-graph for more about 'go mod graph'. `, Run: runGraph, } diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index c081bb547d..73cc282d81 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -27,6 +27,8 @@ Gopkg.lock), and the current directory (if in GOPATH). If a configuration file for a vendoring tool is present, init will attempt to import module requirements from it. + +See https://golang.org/ref/mod#go-mod-init for more about 'go mod init'. `, Run: runInit, } diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index fb43e33ec5..3b83d87a8e 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -29,6 +29,8 @@ to standard error. The -e flag causes tidy to attempt to proceed despite errors encountered while loading packages. + +See https://golang.org/ref/mod#go-mod-tidy for more about 'go mod tidy'. `, Run: runTidy, } diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index 1bbb57d353..e42ff42fbd 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -38,6 +38,8 @@ modules and packages to standard error. The -e flag causes vendor to attempt to proceed despite errors encountered while loading packages. + +See https://golang.org/ref/mod#go-mod-vendor for more about 'go mod vendor'. `, Run: runVendor, } diff --git a/src/cmd/go/internal/modcmd/verify.go b/src/cmd/go/internal/modcmd/verify.go index c83e70076a..8321429131 100644 --- a/src/cmd/go/internal/modcmd/verify.go +++ b/src/cmd/go/internal/modcmd/verify.go @@ -31,6 +31,8 @@ modified since being downloaded. If all the modules are unmodified, verify prints "all modules verified." Otherwise it reports which modules have been changed and causes 'go mod' to exit with a non-zero status. + +See https://golang.org/ref/mod#go-mod-verify for more about 'go mod verify'. `, Run: runVerify, } diff --git a/src/cmd/go/internal/modcmd/why.go b/src/cmd/go/internal/modcmd/why.go index e287c88060..a5f3e8afcb 100644 --- a/src/cmd/go/internal/modcmd/why.go +++ b/src/cmd/go/internal/modcmd/why.go @@ -48,6 +48,8 @@ For example: # golang.org/x/text/encoding (main module does not need package golang.org/x/text/encoding) $ + +See https://golang.org/ref/mod#go-mod-why for more about 'go mod why'. `, } diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index debeb3f319..c55c3cf253 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -768,90 +768,14 @@ var HelpModuleAuth = &base.Command{ UsageLine: "module-auth", Short: "module authentication using go.sum", Long: ` -The go command tries to authenticate every downloaded module, -checking that the bits downloaded for a specific module version today -match bits downloaded yesterday. This ensures repeatable builds -and detects introduction of unexpected changes, malicious or not. - -In each module's root, alongside go.mod, the go command maintains -a file named go.sum containing the cryptographic checksums of the -module's dependencies. - -The form of each line in go.sum is three fields: - - [/go.mod] - -Each known module version results in two lines in the go.sum file. -The first line gives the hash of the module version's file tree. -The second line appends "/go.mod" to the version and gives the hash -of only the module version's (possibly synthesized) go.mod file. -The go.mod-only hash allows downloading and authenticating a -module version's go.mod file, which is needed to compute the -dependency graph, without also downloading all the module's source code. - -The hash begins with an algorithm prefix of the form "h:". -The only defined algorithm prefix is "h1:", which uses SHA-256. - -Module authentication failures - -The go command maintains a cache of downloaded packages and computes -and records the cryptographic checksum of each package at download time. -In normal operation, the go command checks the main module's go.sum file -against these precomputed checksums instead of recomputing them on -each command invocation. The 'go mod verify' command checks that -the cached copies of module downloads still match both their recorded -checksums and the entries in go.sum. - -In day-to-day development, the checksum of a given module version -should never change. Each time a dependency is used by a given main -module, the go command checks its local cached copy, freshly -downloaded or not, against the main module's go.sum. If the checksums -don't match, the go command reports the mismatch as a security error -and refuses to run the build. When this happens, proceed with caution: -code changing unexpectedly means today's build will not match -yesterday's, and the unexpected change may not be beneficial. - -If the go command reports a mismatch in go.sum, the downloaded code -for the reported module version does not match the one used in a -previous build of the main module. It is important at that point -to find out what the right checksum should be, to decide whether -go.sum is wrong or the downloaded code is wrong. Usually go.sum is right: -you want to use the same code you used yesterday. - -If a downloaded module is not yet included in go.sum and it is a publicly -available module, the go command consults the Go checksum database to fetch -the expected go.sum lines. If the downloaded code does not match those -lines, the go command reports the mismatch and exits. Note that the -database is not consulted for module versions already listed in go.sum. - -If a go.sum mismatch is reported, it is always worth investigating why -the code downloaded today differs from what was downloaded yesterday. - -The GOSUMDB environment variable identifies the name of checksum database -to use and optionally its public key and URL, as in: - - GOSUMDB="sum.golang.org" - GOSUMDB="sum.golang.org+" - GOSUMDB="sum.golang.org+ https://sum.golang.org" - -The go command knows the public key of sum.golang.org, and also that the name -sum.golang.google.cn (available inside mainland China) connects to the -sum.golang.org checksum database; use of any other database requires giving -the public key explicitly. -The URL defaults to "https://" followed by the database name. - -GOSUMDB defaults to "sum.golang.org", the Go checksum database run by Google. -See https://sum.golang.org/privacy for the service's privacy policy. - -If GOSUMDB is set to "off", or if "go get" is invoked with the -insecure flag, -the checksum database is not consulted, and all unrecognized modules are -accepted, at the cost of giving up the security guarantee of verified repeatable -downloads for all modules. A better way to bypass the checksum database -for specific modules is to use the GOPRIVATE or GONOSUMDB environment -variables. See 'go help private' for details. - -The 'go env -w' command (see 'go help env') can be used to set these variables -for future go command invocations. +When the go command downloads a module zip file or go.mod file into the +module cache, it computes a cryptographic hash and compares it with a known +value to verify the file hasn't changed since it was first downloaded. Known +hashes are stored in a file in the module root directory named go.sum. Hashes +may also be downloaded from the checksum database depending on the values of +GOSUMDB, GOPRIVATE, and GONOSUMDB. + +For details, see https://golang.org/ref/mod#authenticating. `, } @@ -865,8 +789,8 @@ regardless of source, against the public Go checksum database at sum.golang.org. These defaults work well for publicly available source code. The GOPRIVATE environment variable controls which modules the go command -considers to be private (not available publicly) and should therefore not use the -proxy or checksum database. The variable is a comma-separated list of +considers to be private (not available publicly) and should therefore not use +the proxy or checksum database. The variable is a comma-separated list of glob patterns (in the syntax of Go's path.Match) of module path prefixes. For example, @@ -876,10 +800,6 @@ causes the go command to treat as private any module with a path prefix matching either pattern, including git.corp.example.com/xyzzy, rsc.io/private, and rsc.io/private/quux. -The GOPRIVATE environment variable may be used by other tools as well to -identify non-public modules. For example, an editor could use GOPRIVATE -to decide whether to hyperlink a package import to a godoc.org page. - For fine-grained control over module download and validation, the GONOPROXY and GONOSUMDB environment variables accept the same kind of glob list and override GOPRIVATE for the specific decision of whether to use the proxy @@ -892,12 +812,6 @@ users would configure go using: GOPROXY=proxy.example.com GONOPROXY=none -This would tell the go command and other tools that modules beginning with -a corp.example.com subdomain are private but that the company proxy should -be used for downloading both public and private modules, because -GONOPROXY has been set to a pattern that won't match any modules, -overriding GOPRIVATE. - The GOPRIVATE variable is also used to define the "public" and "private" patterns for the GOVCS variable; see 'go help vcs'. For that usage, GOPRIVATE applies even in GOPATH mode. In that case, it matches import paths @@ -905,5 +819,7 @@ instead of module paths. The 'go env -w' command (see 'go help env') can be used to set these variables for future go command invocations. + +For more details, see https://golang.org/ref/mod#private-modules. `, } diff --git a/src/cmd/go/internal/modfetch/proxy.go b/src/cmd/go/internal/modfetch/proxy.go index d75b4da521..6c86d8d786 100644 --- a/src/cmd/go/internal/modfetch/proxy.go +++ b/src/cmd/go/internal/modfetch/proxy.go @@ -36,65 +36,8 @@ URLs of a specified form. The requests have no query parameters, so even a site serving from a fixed file system (including a file:/// URL) can be a module proxy. -The GET requests sent to a Go module proxy are: - -GET $GOPROXY//@v/list returns a list of known versions of the given -module, one per line. - -GET $GOPROXY//@v/.info returns JSON-formatted metadata -about that version of the given module. - -GET $GOPROXY//@v/.mod returns the go.mod file -for that version of the given module. - -GET $GOPROXY//@v/.zip returns the zip archive -for that version of the given module. - -GET $GOPROXY//@latest returns JSON-formatted metadata about the -latest known version of the given module in the same format as -/@v/.info. The latest version should be the version of -the module the go command may use if /@v/list is empty or no -listed version is suitable. /@latest is optional and may not -be implemented by a module proxy. - -When resolving the latest version of a module, the go command will request -/@v/list, then, if no suitable versions are found, /@latest. -The go command prefers, in order: the semantically highest release version, -the semantically highest pre-release version, and the chronologically -most recent pseudo-version. In Go 1.12 and earlier, the go command considered -pseudo-versions in /@v/list to be pre-release versions, but this is -no longer true since Go 1.13. - -To avoid problems when serving from case-sensitive file systems, -the and elements are case-encoded, replacing every -uppercase letter with an exclamation mark followed by the corresponding -lower-case letter: github.com/Azure encodes as github.com/!azure. - -The JSON-formatted metadata about a given module corresponds to -this Go data structure, which may be expanded in the future: - - type Info struct { - Version string // version string - Time time.Time // commit time - } - -The zip archive for a specific version of a given module is a -standard zip file that contains the file tree corresponding -to the module's source code and related files. The archive uses -slash-separated paths, and every file path in the archive must -begin with @/, where the module and version are -substituted directly, not case-encoded. The root of the module -file tree corresponds to the @/ prefix in the -archive. - -Even when downloading directly from version control systems, -the go command synthesizes explicit info, mod, and zip files -and stores them in its local cache, $GOPATH/pkg/mod/cache/download, -the same as if it had downloaded them directly from a proxy. -The cache layout is the same as the proxy URL space, so -serving $GOPATH/pkg/mod/cache/download at (or copying it to) -https://example.com/proxy would let other users access those -cached module versions with GOPROXY=https://example.com/proxy. +For details on the GOPROXY protocol, see +https://golang.org/ref/mod#goproxy-protocol. `, } diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 0770b601c0..574f3e194d 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -56,85 +56,49 @@ var CmdGet = &base.Command{ UsageLine: "go get [-d] [-t] [-u] [-v] [-insecure] [build flags] [packages]", Short: "add dependencies to current module and install them", Long: ` -Get resolves and adds dependencies to the current development module -and then builds and installs them. - -The first step is to resolve which dependencies to add. - -For each named package or package pattern, get must decide which version of -the corresponding module to use. By default, get looks up the latest tagged -release version, such as v0.4.5 or v1.2.3. If there are no tagged release -versions, get looks up the latest tagged pre-release version, such as -v0.0.1-pre1. If there are no tagged versions at all, get looks up the latest -known commit. If the module is not already required at a later version -(for example, a pre-release newer than the latest release), get will use -the version it looked up. Otherwise, get will use the currently -required version. - -This default version selection can be overridden by adding an @version -suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. -The version may be a prefix: @v1 denotes the latest available version starting -with v1. See 'go help modules' under the heading 'Module queries' for the -full query syntax. - -For modules stored in source control repositories, the version suffix can -also be a commit hash, branch identifier, or other syntax known to the -source control system, as in 'go get golang.org/x/text@master'. Note that -branches with names that overlap with other module query syntax cannot be -selected explicitly. For example, the suffix @v2 means the latest version -starting with v2, not the branch named v2. - -If a module under consideration is already a dependency of the current -development module, then get will update the required version. -Specifying a version earlier than the current required version is valid and -downgrades the dependency. The version suffix @none indicates that the -dependency should be removed entirely, downgrading or removing modules -depending on it as needed. - -The version suffix @latest explicitly requests the latest minor release of -the module named by the given path. The suffix @upgrade is like @latest but -will not downgrade a module if it is already required at a revision or -pre-release version newer than the latest released version. The suffix -@patch requests the latest patch release: the latest released version -with the same major and minor version numbers as the currently required -version. Like @upgrade, @patch will not downgrade a module already required -at a newer version. If the path is not already required, @upgrade is -equivalent to @latest, and @patch is disallowed. - -Although get defaults to using the latest version of the module containing -a named package, it does not use the latest version of that module's -dependencies. Instead it prefers to use the specific dependency versions -requested by that module. For example, if the latest A requires module -B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A' -will use the latest A but then use B v1.2.3, as requested by A. (If there -are competing requirements for a particular module, then 'go get' resolves -those requirements by taking the maximum requested version.) +Get resolves its command-line arguments to packages at specific module versions, +updates go.mod to require those versions, downloads source code into the +module cache, then builds and installs the named packages. + +To add a dependency for a package or upgrade it to its latest version: + + go get example.com/pkg + +To upgrade or downgrade a package to a specific version: + + go get example.com/pkg@v1.2.3 + +To remove a dependency on a module and downgrade modules that require it: + + go get example.com/mod@none + +See https://golang.org/ref/mod#go-get for details. + +The 'go install' command may be used to build and install packages. When a +version is specified, 'go install' runs in module-aware mode and ignores +the go.mod file in the current directory. For example: + + go install example.com/pkg@v1.2.3 + go install example.com/pkg@latest + +See 'go help install' or https://golang.org/ref/mod#go-install for details. + +In addition to build flags (listed in 'go help build') 'go get' accepts the +following flags. The -t flag instructs get to consider modules needed to build tests of packages specified on the command line. The -u flag instructs get to update modules providing dependencies of packages named on the command line to use newer minor or patch -releases when available. Continuing the previous example, 'go get -u A' -will use the latest A with B v1.3.1 (not B v1.2.3). If B requires module C, -but C does not provide any packages needed to build packages in A -(not including tests), then C will not be updated. +releases when available. The -u=patch flag (not -u patch) also instructs get to update dependencies, but changes the default to select patch releases. -Continuing the previous example, -'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3), -while 'go get -u=patch A' will use a patch release of A instead. When the -t and -u flags are used together, get will update test dependencies as well. -In general, adding a new dependency may require upgrading -existing dependencies to keep a working build, and 'go get' does -this automatically. Similarly, downgrading one dependency may -require downgrading other dependencies, and 'go get' does -this automatically as well. - The -insecure flag permits fetching from repositories and resolving custom domains using insecure schemes such as HTTP, and also bypassess module sum validation using the checksum database. Use with caution. @@ -143,12 +107,8 @@ To permit the use of insecure schemes, use the GOINSECURE environment variable instead. To bypass module sum validation, use GOPRIVATE or GONOSUMDB. See 'go help environment' for details. -The second step is to download (if needed), build, and install -the named packages. - -The -d flag instructs get to skip this step, downloading source code -needed to build the named packages and their dependencies, but not -building or installing. +The -d flag instructs get not to build or install packages. get will only +update go.mod and download source code needed to build packages. Building and installing packages with get is deprecated. In a future release, the -d flag will be enabled by default, and 'go get' will be only be used to @@ -157,31 +117,14 @@ dependencies from the current module, use 'go install'. To install a package ignoring the current module, use 'go install' with an @version suffix like "@latest" after each argument. -If an argument names a module but not a package (because there is no -Go source code in the module's root directory), then the install step -is skipped for that argument, instead of causing a build failure. -For example 'go get golang.org/x/perf' succeeds even though there -is no code corresponding to that import path. - -Note that package patterns are allowed and are expanded after resolving -the module versions. For example, 'go get golang.org/x/perf/cmd/...' -adds the latest golang.org/x/perf and then installs the commands in that -latest version. - -With no package arguments, 'go get' applies to Go package in the -current directory, if any. In particular, 'go get -u' and -'go get -u=patch' update all the dependencies of that package. -With no package arguments and also without -u, 'go get' is not much more -than 'go install', and 'go get -d' not much more than 'go list'. - -For more about modules, see 'go help modules'. +For more about modules, see https://golang.org/ref/mod. For more about specifying packages, see 'go help packages'. This text describes the behavior of get using modules to manage source code and dependencies. If instead the go command is running in GOPATH mode, the details of get's flags and effects change, as does 'go help get'. -See 'go help modules' and 'go help gopath-get'. +See 'go help gopath-get'. See also: go build, go install, go clean, go mod. `, diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go index d81dfd56fb..1cb58961be 100644 --- a/src/cmd/go/internal/modload/help.go +++ b/src/cmd/go/internal/modload/help.go @@ -12,395 +12,16 @@ var HelpModules = &base.Command{ UsageLine: "modules", Short: "modules, module versions, and more", Long: ` -A module is a collection of related Go packages. -Modules are the unit of source code interchange and versioning. -The go command has direct support for working with modules, -including recording and resolving dependencies on other modules. -Modules replace the old GOPATH-based approach to specifying -which source files are used in a given build. +Modules are how Go manages dependencies. -Module support +A module is a collection of packages that are released, versioned, and +distributed together. Modules may be downloaded directly from version control +repositories or from module proxy servers. -The go command includes support for Go modules. Module-aware mode is active -by default whenever a go.mod file is found in the current directory or in -any parent directory. +For a series of tutorials on modules, see +https://golang.org/doc/tutorial/create-module. -The quickest way to take advantage of module support is to check out your -repository, create a go.mod file (described in the next section) there, and run -go commands from within that file tree. - -For more fine-grained control, the go command continues to respect -a temporary environment variable, GO111MODULE, which can be set to one -of three string values: off, on, or auto (the default). -If GO111MODULE=on, then the go command requires the use of modules, -never consulting GOPATH. We refer to this as the command -being module-aware or running in "module-aware mode". -If GO111MODULE=off, then the go command never uses -module support. Instead it looks in vendor directories and GOPATH -to find dependencies; we now refer to this as "GOPATH mode." -If GO111MODULE=auto or is unset, then the go command enables or disables -module support based on the current directory. -Module support is enabled only when the current directory contains a -go.mod file or is below a directory containing a go.mod file. - -In module-aware mode, GOPATH no longer defines the meaning of imports -during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) -and installed commands (in GOPATH/bin, unless GOBIN is set). - -Defining a module - -A module is defined by a tree of Go source files with a go.mod file -in the tree's root directory. The directory containing the go.mod file -is called the module root. Typically the module root will also correspond -to a source code repository root (but in general it need not). -The module is the set of all Go packages in the module root and its -subdirectories, but excluding subtrees with their own go.mod files. - -The "module path" is the import path prefix corresponding to the module root. -The go.mod file defines the module path and lists the specific versions -of other modules that should be used when resolving imports during a build, -by giving their module paths and versions. - -For example, this go.mod declares that the directory containing it is the root -of the module with path example.com/m, and it also declares that the module -depends on specific versions of golang.org/x/text and gopkg.in/yaml.v2: - - module example.com/m - - require ( - golang.org/x/text v0.3.0 - gopkg.in/yaml.v2 v2.1.0 - ) - -The go.mod file can also specify replacements and excluded versions -that only apply when building the module directly; they are ignored -when the module is incorporated into a larger build. -For more about the go.mod file, see 'go help go.mod'. - -To start a new module, simply create a go.mod file in the root of the -module's directory tree, containing only a module statement. -The 'go mod init' command can be used to do this: - - go mod init example.com/m - -In a project already using an existing dependency management tool like -godep, glide, or dep, 'go mod init' will also add require statements -matching the existing configuration. - -Once the go.mod file exists, no additional steps are required: -go commands like 'go build', 'go test', or even 'go list' will automatically -add new dependencies as needed to satisfy imports. - -The main module and the build list - -The "main module" is the module containing the directory where the go command -is run. The go command finds the module root by looking for a go.mod in the -current directory, or else the current directory's parent directory, -or else the parent's parent directory, and so on. - -The main module's go.mod file defines the precise set of packages available -for use by the go command, through require, replace, and exclude statements. -Dependency modules, found by following require statements, also contribute -to the definition of that set of packages, but only through their go.mod -files' require statements: any replace and exclude statements in dependency -modules are ignored. The replace and exclude statements therefore allow the -main module complete control over its own build, without also being subject -to complete control by dependencies. - -The set of modules providing packages to builds is called the "build list". -The build list initially contains only the main module. Then the go command -adds to the list the exact module versions required by modules already -on the list, recursively, until there is nothing left to add to the list. -If multiple versions of a particular module are added to the list, -then at the end only the latest version (according to semantic version -ordering) is kept for use in the build. - -The 'go list' command provides information about the main module -and the build list. For example: - - go list -m # print path of main module - go list -m -f={{.Dir}} # print root directory of main module - go list -m all # print build list - -Maintaining module requirements - -The go.mod file is meant to be readable and editable by both programmers and -tools. Most updates to dependencies can be performed using "go get" and -"go mod tidy". Other module-aware build commands may be invoked using the --mod=mod flag to automatically add missing requirements and fix inconsistencies. - -The "go get" command updates go.mod to change the module versions used in a -build. An upgrade of one module may imply upgrading others, and similarly a -downgrade of one module may imply downgrading others. The "go get" command -makes these implied changes as well. See "go help module-get". - -The "go mod" command provides other functionality for use in maintaining -and understanding modules and go.mod files. See "go help mod", particularly -"go help mod tidy" and "go help mod edit". - -As part of maintaining the require statements in go.mod, the go command -tracks which ones provide packages imported directly by the current module -and which ones provide packages only used indirectly by other module -dependencies. Requirements needed only for indirect uses are marked with a -"// indirect" comment in the go.mod file. Indirect requirements may be -automatically removed from the go.mod file once they are implied by other -direct requirements. Indirect requirements only arise when using modules -that fail to state some of their own dependencies or when explicitly -upgrading a module's dependencies ahead of its own stated requirements. - -The -mod build flag provides additional control over the updating and use of -go.mod for commands that build packages like "go build" and "go test". - -If invoked with -mod=readonly (the default in most situations), the go command -reports an error if a package named on the command line or an imported package -is not provided by any module in the build list computed from the main module's -requirements. The go command also reports an error if a module's checksum is -missing from go.sum (see Module downloading and verification). Either go.mod or -go.sum must be updated in these situations. - -If invoked with -mod=mod, the go command automatically updates go.mod and -go.sum, fixing inconsistencies and adding missing requirements and checksums -as needed. If the go command finds an unfamiliar import, it looks up the -module containing that import and adds a requirement for the latest version -of that module to go.mod. In most cases, therefore, one may add an import to -source code and run "go build", "go test", or even "go list" with -mod=mod: -as part of analyzing the package, the go command will resolve the import and -update the go.mod file. - -If invoked with -mod=vendor, the go command loads packages from the main -module's vendor directory instead of downloading modules to and loading packages -from the module cache. The go command assumes the vendor directory holds -correct copies of dependencies, and it does not compute the set of required -module versions from go.mod files. However, the go command does check that -vendor/modules.txt (generated by "go mod vendor") contains metadata consistent -with go.mod. - -If the go command is not invoked with a -mod flag, and the vendor directory -is present, and the "go" version in go.mod is 1.14 or higher, the go command -will act as if it were invoked with -mod=vendor. Otherwise, the -mod flag -defaults to -mod=readonly. - -Note that neither "go get" nor the "go mod" subcommands accept the -mod flag. - -Pseudo-versions - -The go.mod file and the go command more generally use semantic versions as -the standard form for describing module versions, so that versions can be -compared to determine which should be considered earlier or later than another. -A module version like v1.2.3 is introduced by tagging a revision in the -underlying source repository. Untagged revisions can be referred to -using a "pseudo-version" like v0.0.0-yyyymmddhhmmss-abcdefabcdef, -where the time is the commit time in UTC and the final suffix is the prefix -of the commit hash. The time portion ensures that two pseudo-versions can -be compared to determine which happened later, the commit hash identifes -the underlying commit, and the prefix (v0.0.0- in this example) is derived from -the most recent tagged version in the commit graph before this commit. - -There are three pseudo-version forms: - -vX.0.0-yyyymmddhhmmss-abcdefabcdef is used when there is no earlier -versioned commit with an appropriate major version before the target commit. -(This was originally the only form, so some older go.mod files use this form -even for commits that do follow tags.) - -vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef is used when the most -recent versioned commit before the target commit is vX.Y.Z-pre. - -vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef is used when the most -recent versioned commit before the target commit is vX.Y.Z. - -Pseudo-versions never need to be typed by hand: the go command will accept -the plain commit hash and translate it into a pseudo-version (or a tagged -version if available) automatically. This conversion is an example of a -module query. - -Module queries - -The go command accepts a "module query" in place of a module version -both on the command line and in the main module's go.mod file. -(After evaluating a query found in the main module's go.mod file, -the go command updates the file to replace the query with its result.) - -A fully-specified semantic version, such as "v1.2.3", -evaluates to that specific version. - -A semantic version prefix, such as "v1" or "v1.2", -evaluates to the latest available tagged version with that prefix. - -A semantic version comparison, such as "=v1.5.6", -evaluates to the available tagged version nearest to the comparison target -(the latest version for < and <=, the earliest version for > and >=). - -The string "latest" matches the latest available tagged version, -or else the underlying source repository's latest untagged revision. - -The string "upgrade" is like "latest", but if the module is -currently required at a later version than the version "latest" -would select (for example, a newer pre-release version), "upgrade" -will select the later version instead. - -The string "patch" matches the latest available tagged version -of a module with the same major and minor version numbers as the -currently required version. If no version is currently required, -"patch" is equivalent to "latest". - -A revision identifier for the underlying source repository, such as -a commit hash prefix, revision tag, or branch name, selects that -specific code revision. If the revision is also tagged with a -semantic version, the query evaluates to that semantic version. -Otherwise the query evaluates to a pseudo-version for the commit. -Note that branches and tags with names that are matched by other -query syntax cannot be selected this way. For example, the query -"v2" means the latest version starting with "v2", not the branch -named "v2". - -All queries prefer release versions to pre-release versions. -For example, " good/thing v1.4.5 - retract v1.5.6 - -The verbs are - module, to define the module path; - go, to set the expected language version; - require, to require a particular module at a given version or later; - exclude, to exclude a particular module version from use; - replace, to replace a module version with a different module version; and - retract, to indicate a previously released version should not be used. -Exclude and replace apply only in the main module's go.mod and are ignored -in dependencies. See https://golang.org/ref/mod for details. - -The leading verb can be factored out of adjacent lines to create a block, -like in Go imports: - - require ( - new/thing/v2 v2.3.4 - old/thing v1.2.3 - ) - -The go.mod file is designed both to be edited directly and to be -easily updated by tools. The 'go mod edit' command can be used to -parse and edit the go.mod file from programs and tools. -See 'go help mod edit'. - -The go command automatically updates go.mod each time it uses the -module graph, to make sure go.mod always accurately reflects reality -and is properly formatted. For example, consider this go.mod file: - - module M - - require ( - A v1 - B v1.0.0 - C v1.0.0 - D v1.2.3 - E dev - ) - - exclude D v1.2.3 - -The update rewrites non-canonical version identifiers to semver form, -so A's v1 becomes v1.0.0 and E's dev becomes the pseudo-version for the -latest commit on the dev branch, perhaps v0.0.0-20180523231146-b3f5c0f6e5f1. - -The update modifies requirements to respect exclusions, so the -requirement on the excluded D v1.2.3 is updated to use the next -available version of D, perhaps D v1.2.4 or D v1.3.0. +The go.mod file format is described in detail at +https://golang.org/ref/mod#go-mod-file. -The update removes redundant or misleading requirements. -For example, if A v1.0.0 itself requires B v1.2.0 and C v1.0.0, -then go.mod's requirement of B v1.0.0 is misleading (superseded by -A's need for v1.2.0), and its requirement of C v1.0.0 is redundant -(implied by A's need for the same version), so both will be removed. -If module M contains packages that directly import packages from B or -C, then the requirements will be kept but updated to the actual -versions being used. +To create a new go.mod file, use 'go help init'. For details see +'go help mod init' or https://golang.org/ref/mod#go-mod-init. -Finally, the update reformats the go.mod in a canonical formatting, so -that future mechanical changes will result in minimal diffs. +To add missing module requirements or remove unneeded requirements, +use 'go mod tidy'. For details, see 'go help mod tidy' or +https://golang.org/ref/mod#go-mod-tidy. -Because the module graph defines the meaning of import statements, any -commands that load packages also use and therefore update go.mod, -including go build, go get, go install, go list, go test, go mod graph, -go mod tidy, and go mod why. +To add, upgrade, downgrade, or remove a specific module requirement, use +'go get'. For details, see 'go help module-get' or +https://golang.org/ref/mod#go-get. -The expected language version, set by the go directive, determines -which language features are available when compiling the module. -Language features available in that version will be available for use. -Language features removed in earlier versions, or added in later versions, -will not be available. Note that the language version does not affect -build tags, which are determined by the Go release being used. +To make other changes or to parse go.mod as JSON for use by other tools, +use 'go mod edit'. See 'go help mod edit' or +https://golang.org/ref/mod#go-mod-edit. `, } diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 7f2617cf1c..873d85de4e 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -113,7 +113,10 @@ and test commands: created with -buildmode=shared. -mod mode module download mode to use: readonly, vendor, or mod. - See 'go help modules' for more. + By default, if a vendor directory is present and the go version in go.mod + is 1.14 or higher, the go command acts as if -mod=vendor were set. + Otherwise, the go command acts as if -mod=readonly were set. + See https://golang.org/ref/mod#build-commands for details. -modcacherw leave newly-created directories in the module cache read-write instead of making them read-only. -- GitLab From 59bfc18e3441d9cd0b1b2f302935403bbf52ac8b Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 8 Jan 2021 16:12:46 -0500 Subject: [PATCH 1624/1792] cmd/go: add hint to read 'go help vcs' to GOVCS errors Fixes #43596 Change-Id: Iff925d077b5de64161e88c9471402bc7e8885fcd Reviewed-on: https://go-review.googlesource.com/c/go/+/282713 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modget/query.go | 4 +-- src/cmd/go/internal/vcs/vcs.go | 2 +- src/cmd/go/testdata/script/govcs.txt | 52 ++++++++++++++-------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/cmd/go/internal/modget/query.go b/src/cmd/go/internal/modget/query.go index 20eb0b6364..d8364c8c0d 100644 --- a/src/cmd/go/internal/modget/query.go +++ b/src/cmd/go/internal/modget/query.go @@ -281,14 +281,14 @@ func reportError(q *query, err error) { // TODO(bcmills): Use errors.As to unpack these errors instead of parsing // strings with regular expressions. - patternRE := regexp.MustCompile("(?m)(?:[ \t(\"`]|^)" + regexp.QuoteMeta(q.pattern) + "(?:[ @:)\"`]|$)") + patternRE := regexp.MustCompile("(?m)(?:[ \t(\"`]|^)" + regexp.QuoteMeta(q.pattern) + "(?:[ @:;)\"`]|$)") if patternRE.MatchString(errStr) { if q.rawVersion == "" { base.Errorf("go get: %s", errStr) return } - versionRE := regexp.MustCompile("(?m)(?:[ @(\"`]|^)" + regexp.QuoteMeta(q.version) + "(?:[ :)\"`]|$)") + versionRE := regexp.MustCompile("(?m)(?:[ @(\"`]|^)" + regexp.QuoteMeta(q.version) + "(?:[ :;)\"`]|$)") if versionRE.MatchString(errStr) { base.Errorf("go get: %s", errStr) return diff --git a/src/cmd/go/internal/vcs/vcs.go b/src/cmd/go/internal/vcs/vcs.go index 4894ecdc35..327ea7cc86 100644 --- a/src/cmd/go/internal/vcs/vcs.go +++ b/src/cmd/go/internal/vcs/vcs.go @@ -729,7 +729,7 @@ func checkGOVCS(vcs *Cmd, root string) error { if private { what = "private" } - return fmt.Errorf("GOVCS disallows using %s for %s %s", vcs.Cmd, what, root) + return fmt.Errorf("GOVCS disallows using %s for %s %s; see 'go help vcs'", vcs.Cmd, what, root) } return nil diff --git a/src/cmd/go/testdata/script/govcs.txt b/src/cmd/go/testdata/script/govcs.txt index 35f092ee49..4180d7da6a 100644 --- a/src/cmd/go/testdata/script/govcs.txt +++ b/src/cmd/go/testdata/script/govcs.txt @@ -5,40 +5,40 @@ env GOPROXY=direct # GOVCS stops go get env GOVCS='*:none' ! go get github.com/google/go-cmp -stderr 'go get: GOVCS disallows using git for public github.com/google/go-cmp' +stderr '^go get: GOVCS disallows using git for public github.com/google/go-cmp; see ''go help vcs''$' env GOPRIVATE='github.com/google' ! go get github.com/google/go-cmp -stderr 'go get: GOVCS disallows using git for private github.com/google/go-cmp' +stderr '^go get: GOVCS disallows using git for private github.com/google/go-cmp; see ''go help vcs''$' # public pattern works env GOPRIVATE='github.com/google' env GOVCS='public:all,private:none' ! go get github.com/google/go-cmp -stderr 'go get: GOVCS disallows using git for private github.com/google/go-cmp' +stderr '^go get: GOVCS disallows using git for private github.com/google/go-cmp; see ''go help vcs''$' # private pattern works env GOPRIVATE='hubgit.com/google' env GOVCS='private:all,public:none' ! go get github.com/google/go-cmp -stderr 'go get: GOVCS disallows using git for public github.com/google/go-cmp' +stderr '^go get: GOVCS disallows using git for public github.com/google/go-cmp; see ''go help vcs''$' # other patterns work (for more patterns, see TestGOVCS) env GOPRIVATE= env GOVCS='github.com:svn|hg' ! go get github.com/google/go-cmp -stderr 'go get: GOVCS disallows using git for public github.com/google/go-cmp' +stderr '^go get: GOVCS disallows using git for public github.com/google/go-cmp; see ''go help vcs''$' env GOVCS='github.com/google/go-cmp/inner:git,github.com:svn|hg' ! go get github.com/google/go-cmp -stderr 'go get: GOVCS disallows using git for public github.com/google/go-cmp' +stderr '^go get: GOVCS disallows using git for public github.com/google/go-cmp; see ''go help vcs''$' # bad patterns are reported (for more bad patterns, see TestGOVCSErrors) env GOVCS='git' ! go get github.com/google/go-cmp -stderr 'go get github.com/google/go-cmp: malformed entry in GOVCS \(missing colon\): "git"' +stderr '^go get github.com/google/go-cmp: malformed entry in GOVCS \(missing colon\): "git"$' env GOVCS=github.com:hg,github.com:git ! go get github.com/google/go-cmp -stderr 'go get github.com/google/go-cmp: unreachable pattern in GOVCS: "github.com:git" after "github.com:hg"' +stderr '^go get github.com/google/go-cmp: unreachable pattern in GOVCS: "github.com:git" after "github.com:hg"$' # bad GOVCS patterns do not stop commands that do not need to check VCS go list @@ -50,19 +50,19 @@ env GOPROXY=direct env GOPRIVATE= env GOVCS= ! go get rsc.io/nonexist.svn/hello -stderr 'go get rsc.io/nonexist.svn/hello: GOVCS disallows using svn for public rsc.io/nonexist.svn' +stderr '^go get rsc.io/nonexist.svn/hello: GOVCS disallows using svn for public rsc.io/nonexist.svn; see ''go help vcs''$' # fossil is disallowed by default env GOPRIVATE= env GOVCS= ! go get rsc.io/nonexist.fossil/hello -stderr 'go get rsc.io/nonexist.fossil/hello: GOVCS disallows using fossil for public rsc.io/nonexist.fossil' +stderr '^go get rsc.io/nonexist.fossil/hello: GOVCS disallows using fossil for public rsc.io/nonexist.fossil; see ''go help vcs''$' # bzr is disallowed by default env GOPRIVATE= env GOVCS= ! go get rsc.io/nonexist.bzr/hello -stderr 'go get rsc.io/nonexist.bzr/hello: GOVCS disallows using bzr for public rsc.io/nonexist.bzr' +stderr '^go get rsc.io/nonexist.bzr/hello: GOVCS disallows using bzr for public rsc.io/nonexist.bzr; see ''go help vcs''$' # git is OK by default env GOVCS= @@ -77,12 +77,12 @@ env GONOSUMDB='*' # git can be disallowed env GOVCS=public:hg ! go get rsc.io/nonexist.git/hello -stderr 'go get rsc.io/nonexist.git/hello: GOVCS disallows using git for public rsc.io/nonexist.git' +stderr '^go get rsc.io/nonexist.git/hello: GOVCS disallows using git for public rsc.io/nonexist.git; see ''go help vcs''$' # hg can be disallowed env GOVCS=public:git ! go get rsc.io/nonexist.hg/hello -stderr 'go get rsc.io/nonexist.hg/hello: GOVCS disallows using hg for public rsc.io/nonexist.hg' +stderr '^go get rsc.io/nonexist.hg/hello: GOVCS disallows using hg for public rsc.io/nonexist.hg; see ''go help vcs''$' # Repeat in GOPATH mode. Error texts slightly different. @@ -91,40 +91,40 @@ env GO111MODULE=off # GOVCS stops go get env GOVCS='*:none' ! go get github.com/google/go-cmp -stderr 'package github.com/google/go-cmp: GOVCS disallows using git for public github.com/google/go-cmp' +stderr '^package github.com/google/go-cmp: GOVCS disallows using git for public github.com/google/go-cmp; see ''go help vcs''$' env GOPRIVATE='github.com/google' ! go get github.com/google/go-cmp -stderr 'package github.com/google/go-cmp: GOVCS disallows using git for private github.com/google/go-cmp' +stderr '^package github.com/google/go-cmp: GOVCS disallows using git for private github.com/google/go-cmp; see ''go help vcs''$' # public pattern works env GOPRIVATE='github.com/google' env GOVCS='public:all,private:none' ! go get github.com/google/go-cmp -stderr 'package github.com/google/go-cmp: GOVCS disallows using git for private github.com/google/go-cmp' +stderr '^package github.com/google/go-cmp: GOVCS disallows using git for private github.com/google/go-cmp; see ''go help vcs''$' # private pattern works env GOPRIVATE='hubgit.com/google' env GOVCS='private:all,public:none' ! go get github.com/google/go-cmp -stderr 'package github.com/google/go-cmp: GOVCS disallows using git for public github.com/google/go-cmp' +stderr '^package github.com/google/go-cmp: GOVCS disallows using git for public github.com/google/go-cmp; see ''go help vcs''$' # other patterns work (for more patterns, see TestGOVCS) env GOPRIVATE= env GOVCS='github.com:svn|hg' ! go get github.com/google/go-cmp -stderr 'package github.com/google/go-cmp: GOVCS disallows using git for public github.com/google/go-cmp' +stderr '^package github.com/google/go-cmp: GOVCS disallows using git for public github.com/google/go-cmp; see ''go help vcs''$' env GOVCS='github.com/google/go-cmp/inner:git,github.com:svn|hg' ! go get github.com/google/go-cmp -stderr 'package github.com/google/go-cmp: GOVCS disallows using git for public github.com/google/go-cmp' +stderr '^package github.com/google/go-cmp: GOVCS disallows using git for public github.com/google/go-cmp; see ''go help vcs''$' # bad patterns are reported (for more bad patterns, see TestGOVCSErrors) env GOVCS='git' ! go get github.com/google/go-cmp -stderr 'package github.com/google/go-cmp: malformed entry in GOVCS \(missing colon\): "git"' +stderr '^package github.com/google/go-cmp: malformed entry in GOVCS \(missing colon\): "git"$' env GOVCS=github.com:hg,github.com:git ! go get github.com/google/go-cmp -stderr 'package github.com/google/go-cmp: unreachable pattern in GOVCS: "github.com:git" after "github.com:hg"' +stderr '^package github.com/google/go-cmp: unreachable pattern in GOVCS: "github.com:git" after "github.com:hg"$' # bad GOVCS patterns do not stop commands that do not need to check VCS go list @@ -133,19 +133,19 @@ go list env GOPRIVATE= env GOVCS= ! go get rsc.io/nonexist.svn/hello -stderr 'package rsc.io/nonexist.svn/hello: GOVCS disallows using svn for public rsc.io/nonexist.svn' +stderr '^package rsc.io/nonexist.svn/hello: GOVCS disallows using svn for public rsc.io/nonexist.svn; see ''go help vcs''$' # fossil is disallowed by default env GOPRIVATE= env GOVCS= ! go get rsc.io/nonexist.fossil/hello -stderr 'package rsc.io/nonexist.fossil/hello: GOVCS disallows using fossil for public rsc.io/nonexist.fossil' +stderr '^package rsc.io/nonexist.fossil/hello: GOVCS disallows using fossil for public rsc.io/nonexist.fossil; see ''go help vcs''$' # bzr is disallowed by default env GOPRIVATE= env GOVCS= ! go get rsc.io/nonexist.bzr/hello -stderr 'package rsc.io/nonexist.bzr/hello: GOVCS disallows using bzr for public rsc.io/nonexist.bzr' +stderr '^package rsc.io/nonexist.bzr/hello: GOVCS disallows using bzr for public rsc.io/nonexist.bzr; see ''go help vcs''$' # git is OK by default env GOVCS= @@ -160,12 +160,12 @@ env GONOSUMDB='*' # git can be disallowed env GOVCS=public:hg ! go get rsc.io/nonexist.git/hello -stderr 'package rsc.io/nonexist.git/hello: GOVCS disallows using git for public rsc.io/nonexist.git' +stderr '^package rsc.io/nonexist.git/hello: GOVCS disallows using git for public rsc.io/nonexist.git; see ''go help vcs''$' # hg can be disallowed env GOVCS=public:git ! go get rsc.io/nonexist.hg/hello -stderr 'package rsc.io/nonexist.hg/hello: GOVCS disallows using hg for public rsc.io/nonexist.hg' +stderr '^package rsc.io/nonexist.hg/hello: GOVCS disallows using hg for public rsc.io/nonexist.hg; see ''go help vcs''$' -- go.mod -- module m -- GitLab From c3b4c7093ac46431b6e15cf1979bd9a251a400da Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 23 Dec 2020 17:33:18 -0500 Subject: [PATCH 1625/1792] cmd/internal/objfile: don't require runtime.symtab symbol for XCOFF For some reason (that I didn't look into), externally linked AIX binaries don't have runtime.symtab symbol. Since recent Go releases (Go 1.3 maybe?), that symbol is empty and not necessary anyway. Don't require it. Fixes #40972. Change-Id: I73a1f0142195ea6debdba8a4f6e12cadc3980dc5 Reviewed-on: https://go-review.googlesource.com/c/go/+/279995 Trust: Cherry Zhang Reviewed-by: Than McIntosh --- src/cmd/internal/objfile/xcoff.go | 4 +--- src/cmd/objdump/objdump_test.go | 5 ----- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/cmd/internal/objfile/xcoff.go b/src/cmd/internal/objfile/xcoff.go index d438c80226..d6df4db8f0 100644 --- a/src/cmd/internal/objfile/xcoff.go +++ b/src/cmd/internal/objfile/xcoff.go @@ -94,9 +94,7 @@ func (f *xcoffFile) pcln() (textStart uint64, symtab, pclntab []byte, err error) if pclntab, err = loadXCOFFTable(f.xcoff, "runtime.pclntab", "runtime.epclntab"); err != nil { return 0, nil, nil, err } - if symtab, err = loadXCOFFTable(f.xcoff, "runtime.symtab", "runtime.esymtab"); err != nil { - return 0, nil, nil, err - } + symtab, _ = loadXCOFFTable(f.xcoff, "runtime.symtab", "runtime.esymtab") // ignore error, this symbol is not useful anyway return textStart, symtab, pclntab, nil } diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go index edaca774f7..1748e13a53 100644 --- a/src/cmd/objdump/objdump_test.go +++ b/src/cmd/objdump/objdump_test.go @@ -237,9 +237,6 @@ func testGoAndCgoDisasm(t *testing.T, printCode bool, printGnuAsm bool) { t.Parallel() testDisasm(t, "fmthello.go", printCode, printGnuAsm) if build.Default.CgoEnabled { - if runtime.GOOS == "aix" { - return // issue 40972 - } testDisasm(t, "fmthellocgo.go", printCode, printGnuAsm) } } @@ -261,8 +258,6 @@ func TestDisasmExtld(t *testing.T) { switch runtime.GOOS { case "plan9", "windows": t.Skipf("skipping on %s", runtime.GOOS) - case "aix": - t.Skipf("skipping on AIX, see issue 40972") } t.Parallel() testDisasm(t, "fmthello.go", false, false, "-ldflags=-linkmode=external") -- GitLab From 759309029fc1087a2f68f0f30f4cf77d3eb8c7b9 Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Mon, 11 Jan 2021 14:21:40 -0500 Subject: [PATCH 1626/1792] doc: update editors.html for Go 1.16 Rerank editor plugins based on popularity (Go 2019 survey), and remove Atom, as it is no longer popular. Change-Id: I06d39b67eec24a920439b9ea1198b6e2a939874e Reviewed-on: https://go-review.googlesource.com/c/go/+/283073 Trust: Rebecca Stambler Run-TryBot: Rebecca Stambler Reviewed-by: Robert Findley --- doc/editors.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/editors.html b/doc/editors.html index 7a46fb745d..e0d0c530e5 100644 --- a/doc/editors.html +++ b/doc/editors.html @@ -19,13 +19,11 @@ editing, navigation, testing, and debugging experience.

    -
  • vim: vim-go plugin provides Go programming language support
  • Visual Studio Code: Go extension provides support for the Go programming language
  • GoLand: GoLand is distributed either as a standalone IDE or as a plugin for IntelliJ IDEA Ultimate
  • -
  • Atom: Go-Plus is an Atom package that provides enhanced Go support
  • -
+
  • vim: vim-go plugin provides Go programming language support
  • Note that these are only a few top solutions; a more comprehensive -- GitLab From 81ea89adf38b90c3c3a8c4eed9e6c093a8634d59 Mon Sep 17 00:00:00 2001 From: Jakub Warczarek Date: Sat, 12 Dec 2020 17:43:52 +0000 Subject: [PATCH 1627/1792] cmd/go: fix non-script staleness checks interacting badly with GOFLAGS Fixes #43012. Change-Id: Idc7a64b53c411e6dadd98521a48e15e664737d42 GitHub-Last-Rev: b56c0880c3b5ceb86c6fa2ba6bf82f8969e10472 GitHub-Pull-Request: golang/go#43155 Reviewed-on: https://go-review.googlesource.com/c/go/+/277453 Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot --- src/cmd/go/go_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 3cd3454d5a..3ce32388d0 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -216,6 +216,7 @@ func TestMain(m *testing.M) { } // Don't let these environment variables confuse the test. os.Setenv("GOENV", "off") + os.Unsetenv("GOFLAGS") os.Unsetenv("GOBIN") os.Unsetenv("GOPATH") os.Unsetenv("GIT_ALLOW_PROTOCOL") -- GitLab From 665def2c11bb49749b075d612e98b6db293266a7 Mon Sep 17 00:00:00 2001 From: Eric Chiang Date: Thu, 12 Nov 2020 19:13:02 -0800 Subject: [PATCH 1628/1792] encoding/asn1: document unmarshaling behavior for IMPLICIT string fields Fixes #42570. Change-Id: I73e339cdebe1720c141861a12e28a94cef13c75b Reviewed-on: https://go-review.googlesource.com/c/go/+/269798 Reviewed-by: Katie Hockman Reviewed-by: Roland Shoemaker Run-TryBot: Katie Hockman Trust: Emmanuel Odeke Trust: Katie Hockman --- src/encoding/asn1/asn1.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/encoding/asn1/asn1.go b/src/encoding/asn1/asn1.go index 7c260b49d9..f9b9cb4930 100644 --- a/src/encoding/asn1/asn1.go +++ b/src/encoding/asn1/asn1.go @@ -1067,6 +1067,15 @@ func setDefaultValue(v reflect.Value, params fieldParameters) (ok bool) { // set causes a SET, rather than a SEQUENCE type to be expected // tag:x specifies the ASN.1 tag number; implies ASN.1 CONTEXT SPECIFIC // +// When decoding an ASN.1 value with an IMPLICIT tag into a string field, +// Unmarshal will default to a PrintableString, which doesn't support +// characters such as '@' and '&'. To force other encodings, use the following +// tags: +// +// ia5 causes strings to be unmarshaled as ASN.1 IA5String values +// numeric causes strings to be unmarshaled as ASN.1 NumericString values +// utf8 causes strings to be unmarshaled as ASN.1 UTF8String values +// // If the type of the first field of a structure is RawContent then the raw // ASN1 contents of the struct will be stored in it. // -- GitLab From ba76567bc2500204432ed8a5cb28848410e74447 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 15 Dec 2020 22:00:02 -0500 Subject: [PATCH 1629/1792] cmd/go/internal/modload: delete unused *mvsReqs.next method For #36460 Updates #36465 Change-Id: Id818dce21d39a48cf5fc9c015b30497dce9cd1ef Reviewed-on: https://go-review.googlesource.com/c/go/+/278596 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob --- src/cmd/go/internal/modload/mvs.go | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go index 167d6819b0..31015194f9 100644 --- a/src/cmd/go/internal/modload/mvs.go +++ b/src/cmd/go/internal/modload/mvs.go @@ -111,19 +111,3 @@ func (*mvsReqs) Previous(m module.Version) (module.Version, error) { } return module.Version{Path: m.Path, Version: "none"}, nil } - -// next returns the next version of m.Path after m.Version. -// It is only used by the exclusion processing in the Required method, -// not called directly by MVS. -func (*mvsReqs) next(m module.Version) (module.Version, error) { - // TODO(golang.org/issue/38714): thread tracing context through MVS. - list, err := versions(context.TODO(), m.Path, CheckAllowed) - if err != nil { - return module.Version{}, err - } - i := sort.Search(len(list), func(i int) bool { return semver.Compare(list[i], m.Version) > 0 }) - if i < len(list) { - return module.Version{Path: m.Path, Version: list[i]}, nil - } - return module.Version{Path: m.Path, Version: "none"}, nil -} -- GitLab From 7eb31d999cf2769deb0e7bdcafc30e18f52ceb48 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 8 Jan 2021 15:14:22 -0500 Subject: [PATCH 1630/1792] cmd/go: add hints to more missing sum error messages When a command fails due to a module zip sum missing from go.sum, if the module is in the build list, the go command will print a 'go mod download' command the user can run to fix it. Previously, a hint was only printed if the module provided a package in 'all'. We don't print a 'go get' hint, since we may not want to add a new requirement to go.mod. Fixes #43572 Change-Id: I88c61b1b42ad56c04e4482f6a1bb97ce758aaeff Reviewed-on: https://go-review.googlesource.com/c/go/+/282712 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Trust: Jay Conrod --- src/cmd/go/internal/modload/import.go | 66 ++++++++++++++----- src/cmd/go/internal/modload/load.go | 8 ++- .../go/testdata/script/mod_sum_ambiguous.txt | 12 ++-- .../go/testdata/script/mod_sum_readonly.txt | 4 +- 4 files changed, 65 insertions(+), 25 deletions(-) diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 9925d5b905..182429aee4 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -130,25 +130,57 @@ func (e *AmbiguousImportError) Error() string { } // ImportMissingSumError is reported in readonly mode when we need to check -// if a module in the build list contains a package, but we don't have a sum -// for its .zip file. +// if a module contains a package, but we don't have a sum for its .zip file. +// 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 +// 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. type ImportMissingSumError struct { - importPath string - modPaths []string - found, inAll bool + importPath string + found bool + mods []module.Version + importer, importerVersion string // optional, but used for additional context + importerIsTest bool } func (e *ImportMissingSumError) Error() string { + var importParen string + if e.importer != "" { + importParen = fmt.Sprintf(" (imported by %s)", e.importer) + } var message string if e.found { - message = fmt.Sprintf("missing go.sum entry needed to verify package %s is provided by exactly one module", e.importPath) + message = fmt.Sprintf("missing go.sum entry needed to verify package %s%s is provided by exactly one module", e.importPath, importParen) } else { - message = fmt.Sprintf("missing go.sum entry for module providing package %s", e.importPath) + message = fmt.Sprintf("missing go.sum entry for module providing package %s%s", e.importPath, importParen) } - if e.inAll { - return message + fmt.Sprintf("; to add it:\n\tgo mod download %s", strings.Join(e.modPaths, " ")) + var hint string + if e.importer == "" { + // Importing package is unknown, or the missing package was named on the + // command line. Recommend 'go mod download' for the modules that could + // provide the package, since that shouldn't change go.mod. + args := make([]string, len(e.mods)) + for i, mod := range e.mods { + args[i] = mod.Path + } + hint = fmt.Sprintf("; to add:\n\tgo mod download %s", strings.Join(args, " ")) + } else { + // Importing package is known (common case). Recommend 'go get' on the + // current version of the importing package. + tFlag := "" + if e.importerIsTest { + tFlag = " -t" + } + version := "" + if e.importerVersion != "" { + version = "@" + e.importerVersion + } + hint = fmt.Sprintf("; to add:\n\tgo get%s %s%s", tFlag, e.importer, version) } - return message + return message + hint } func (e *ImportMissingSumError) ImportPath() string { @@ -239,7 +271,7 @@ func importFromBuildList(ctx context.Context, path string, buildList []module.Ve // Check each module on the build list. var dirs []string var mods []module.Version - var sumErrModPaths []string + var sumErrMods []module.Version for _, m := range buildList { if !maybeInModule(path, m.Path) { // Avoid possibly downloading irrelevant modules. @@ -253,8 +285,8 @@ func importFromBuildList(ctx context.Context, path string, buildList []module.Ve // We can't verify that the package is unique, and we may not find // the package at all. Keep checking other modules to decide which // error to report. Multiple sums may be missing if we need to look in - // multiple nested modules to resolve the import; we'll report them all. - sumErrModPaths = append(sumErrModPaths, m.Path) + // multiple nested modules to resolve the import. + sumErrMods = append(sumErrMods, m) continue } // Report fetch error. @@ -275,8 +307,12 @@ func importFromBuildList(ctx context.Context, path string, buildList []module.Ve if len(mods) > 1 { return module.Version{}, "", &AmbiguousImportError{importPath: path, Dirs: dirs, Modules: mods} } - if len(sumErrModPaths) > 0 { - return module.Version{}, "", &ImportMissingSumError{importPath: path, modPaths: sumErrModPaths, found: len(mods) > 0} + if len(sumErrMods) > 0 { + return module.Version{}, "", &ImportMissingSumError{ + importPath: path, + mods: sumErrMods, + found: len(mods) > 0, + } } if len(mods) == 1 { return mods[0], dirs[0], nil diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index cd36da6a87..6d87acc6d3 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -280,9 +280,11 @@ func LoadPackages(ctx context.Context, opts PackageOpts, patterns ...string) (ma checkMultiplePaths() for _, pkg := range loaded.pkgs { if pkg.err != nil { - if pkg.flags.has(pkgInAll) { - if sumErr := (*ImportMissingSumError)(nil); errors.As(pkg.err, &sumErr) { - sumErr.inAll = true + if sumErr := (*ImportMissingSumError)(nil); errors.As(pkg.err, &sumErr) { + if importer := pkg.stack; importer != nil { + sumErr.importer = importer.path + sumErr.importerVersion = importer.mod.Version + sumErr.importerIsTest = importer.testOf != nil } } diff --git a/src/cmd/go/testdata/script/mod_sum_ambiguous.txt b/src/cmd/go/testdata/script/mod_sum_ambiguous.txt index 5344dc0029..07c6659177 100644 --- a/src/cmd/go/testdata/script/mod_sum_ambiguous.txt +++ b/src/cmd/go/testdata/script/mod_sum_ambiguous.txt @@ -23,19 +23,21 @@ grep '^example.com/ambiguous/a/b v0.0.0-empty h1:' go.sum # provides the package. cp go.sum.a-only go.sum ! go list example.com/ambiguous/a/b -stderr '^missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module$' +stderr '^missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module; to add:\n\tgo mod download example.com/ambiguous/a/b$' ! go list -deps . -stderr '^use.go:3:8: missing go.sum entry needed to verify package example.com/ambiguous/a/b is provided by exactly one module; to add it:\n\tgo mod download example.com/ambiguous/a/b$' +stderr '^use.go:3:8: missing go.sum entry needed to verify package example.com/ambiguous/a/b \(imported by m\) is provided by exactly one module; to add:\n\tgo get m$' cp go.sum.b-only go.sum ! go list example.com/ambiguous/a/b -stderr '^missing go.sum entry for module providing package example.com/ambiguous/a/b$' +stderr '^missing go.sum entry for module providing package example.com/ambiguous/a/b; to add:\n\tgo mod download example.com/ambiguous/a$' ! go list -deps . -stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b; to add it:\n\tgo mod download example.com/ambiguous/a$' +stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b \(imported by m\); to add:\n\tgo get m$' cp go.sum.buildlist-only go.sum +! go list example.com/ambiguous/a/b +stderr '^missing go.sum entry for module providing package example.com/ambiguous/a/b; to add:\n\tgo mod download example.com/ambiguous/a example.com/ambiguous/a/b$' ! go list -deps . -stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b; to add it:\n\tgo mod download example.com/ambiguous/a example.com/ambiguous/a/b$' +stderr '^use.go:3:8: missing go.sum entry for module providing package example.com/ambiguous/a/b \(imported by m\); to add:\n\tgo get m$' -- go.mod -- module m diff --git a/src/cmd/go/testdata/script/mod_sum_readonly.txt b/src/cmd/go/testdata/script/mod_sum_readonly.txt index 00b4d7b5d2..57c5bbeefd 100644 --- a/src/cmd/go/testdata/script/mod_sum_readonly.txt +++ b/src/cmd/go/testdata/script/mod_sum_readonly.txt @@ -40,14 +40,14 @@ stderr '^no required module provides package example.com/doesnotexist; to add it # When a sum is needed to load a .zip file, we get a more specific error. # The .zip file is not downloaded. ! go list rsc.io/quote -stderr '^missing go.sum entry for module providing package rsc.io/quote$' +stderr '^missing go.sum entry for module providing package rsc.io/quote; to add:\n\tgo mod download rsc.io/quote$' ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip # The error is attached to the package from the missing module. We can load # a package that imports it without that error. go list -e -deps -f '{{.ImportPath}}{{with .Error}} {{.Err}}{{end}}' . stdout '^m$' -stdout '^rsc.io/quote missing go.sum entry for module providing package rsc.io/quote; to add it:\n\tgo mod download rsc.io/quote$' +stdout '^rsc.io/quote missing go.sum entry for module providing package rsc.io/quote \(imported by m\); to add:\n\tgo get m$' ! exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.zip # go.sum should not have been written. -- GitLab From 6aa28d3e06d0757995c54a22d2f2a1f1b396774f Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 13 Jan 2021 17:07:09 -0500 Subject: [PATCH 1631/1792] go/build: report positions for go:embed directives For #43469 For #43632 Change-Id: I9ac2da690344935da0e1dbe00b134dfcee65ec8a Reviewed-on: https://go-review.googlesource.com/c/go/+/283636 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Trust: Jay Conrod Reviewed-by: Bryan C. Mills --- api/go1.16.txt | 3 ++ src/go/build/build.go | 68 ++++++++++++++++++++--------------- src/go/build/read.go | 74 +++++++++++++++++++++++++++++---------- src/go/build/read_test.go | 57 ++++++++++++++++++++---------- 4 files changed, 136 insertions(+), 66 deletions(-) diff --git a/api/go1.16.txt b/api/go1.16.txt index 8a8c6b8860..a4a034be06 100644 --- a/api/go1.16.txt +++ b/api/go1.16.txt @@ -226,9 +226,12 @@ pkg embed, type FS struct pkg flag, func Func(string, string, func(string) error) pkg flag, method (*FlagSet) Func(string, string, func(string) error) pkg go/build, type Package struct, EmbedPatterns []string +pkg go/build, type Package struct, EmbedPatternPos map[string][]token.Position pkg go/build, type Package struct, IgnoredOtherFiles []string pkg go/build, type Package struct, TestEmbedPatterns []string +pkg go/build, type Package struct, TestEmbedPatternPos map[string][]token.Position pkg go/build, type Package struct, XTestEmbedPatterns []string +pkg go/build, type Package struct, XTestEmbedPatternPos map[string][]token.Position pkg html/template, func ParseFS(fs.FS, ...string) (*Template, error) pkg html/template, method (*Template) ParseFS(fs.FS, ...string) (*Template, error) pkg io, func NopCloser(Reader) ReadCloser diff --git a/src/go/build/build.go b/src/go/build/build.go index 82e481bdc2..72311c7d2c 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -449,9 +449,12 @@ type Package struct { // //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 - TestEmbedPatterns []string // patterns from TestGoFiles - XTestEmbedPatterns []string // patterns from XTestGoFiles + 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 @@ -794,10 +797,12 @@ Found: var badGoError error var Sfiles []string // files with ".S"(capital S)/.sx(capital s equivalent for case insensitive filesystems) var firstFile, firstCommentFile string - var embeds, testEmbeds, xTestEmbeds []string - imported := make(map[string][]token.Position) - testImported := make(map[string][]token.Position) - xTestImported := make(map[string][]token.Position) + embedPos := make(map[string][]token.Position) + testEmbedPos := make(map[string][]token.Position) + xTestEmbedPos := make(map[string][]token.Position) + importPos := make(map[string][]token.Position) + testImportPos := make(map[string][]token.Position) + xTestImportPos := make(map[string][]token.Position) allTags := make(map[string]bool) fset := token.NewFileSet() for _, d := range dirs { @@ -920,31 +925,31 @@ Found: } } - var fileList, embedList *[]string - var importMap map[string][]token.Position + var fileList *[]string + var importMap, embedMap map[string][]token.Position switch { case isCgo: allTags["cgo"] = true if ctxt.CgoEnabled { fileList = &p.CgoFiles - importMap = imported - embedList = &embeds + importMap = importPos + embedMap = embedPos } else { - // Ignore imports from cgo files if cgo is disabled. + // Ignore imports and embeds from cgo files if cgo is disabled. fileList = &p.IgnoredGoFiles } case isXTest: fileList = &p.XTestGoFiles - importMap = xTestImported - embedList = &xTestEmbeds + importMap = xTestImportPos + embedMap = xTestEmbedPos case isTest: fileList = &p.TestGoFiles - importMap = testImported - embedList = &testEmbeds + importMap = testImportPos + embedMap = testEmbedPos default: fileList = &p.GoFiles - importMap = imported - embedList = &embeds + importMap = importPos + embedMap = embedPos } *fileList = append(*fileList, name) if importMap != nil { @@ -952,8 +957,10 @@ Found: importMap[imp.path] = append(importMap[imp.path], fset.Position(imp.pos)) } } - if embedList != nil { - *embedList = append(*embedList, info.embeds...) + if embedMap != nil { + for _, emb := range info.embeds { + embedMap[emb.pattern] = append(embedMap[emb.pattern], emb.pos) + } } } @@ -962,13 +969,13 @@ Found: } sort.Strings(p.AllTags) - p.EmbedPatterns = uniq(embeds) - p.TestEmbedPatterns = uniq(testEmbeds) - p.XTestEmbedPatterns = uniq(xTestEmbeds) + p.EmbedPatterns, p.EmbedPatternPos = cleanDecls(embedPos) + p.TestEmbedPatterns, p.TestEmbedPatternPos = cleanDecls(testEmbedPos) + p.XTestEmbedPatterns, p.XTestEmbedPatternPos = cleanDecls(xTestEmbedPos) - p.Imports, p.ImportPos = cleanImports(imported) - p.TestImports, p.TestImportPos = cleanImports(testImported) - p.XTestImports, p.XTestImportPos = cleanImports(xTestImported) + p.Imports, p.ImportPos = cleanDecls(importPos) + p.TestImports, p.TestImportPos = cleanDecls(testImportPos) + p.XTestImports, p.XTestImportPos = cleanDecls(xTestImportPos) // add the .S/.sx files only if we are using cgo // (which means gcc will compile them). @@ -1340,7 +1347,7 @@ type fileInfo struct { parsed *ast.File parseErr error imports []fileImport - embeds []string + embeds []fileEmbed embedErr error } @@ -1350,6 +1357,11 @@ type fileImport struct { doc *ast.CommentGroup } +type fileEmbed struct { + pattern string + pos token.Position +} + // matchFile determines whether the file with the given name in the given directory // should be included in the package being constructed. // If the file should be included, matchFile returns a non-nil *fileInfo (and a nil error). @@ -1424,7 +1436,7 @@ func (ctxt *Context) matchFile(dir, name string, allTags map[string]bool, binary return info, nil } -func cleanImports(m map[string][]token.Position) ([]string, map[string][]token.Position) { +func cleanDecls(m map[string][]token.Position) ([]string, map[string][]token.Position) { all := make([]string, 0, len(m)) for path := range m { all = append(all, path) diff --git a/src/go/build/read.go b/src/go/build/read.go index 6da921d471..aa7c6ee59e 100644 --- a/src/go/build/read.go +++ b/src/go/build/read.go @@ -10,6 +10,7 @@ import ( "fmt" "go/ast" "go/parser" + "go/token" "io" "strconv" "strings" @@ -24,6 +25,18 @@ type importReader struct { err error eof bool nerr int + pos token.Position +} + +func newImportReader(name string, r io.Reader) *importReader { + return &importReader{ + b: bufio.NewReader(r), + pos: token.Position{ + Filename: name, + Line: 1, + Column: 1, + }, + } } func isIdent(c byte) bool { @@ -66,22 +79,32 @@ func (r *importReader) readByte() byte { // readByteNoBuf is like readByte but doesn't buffer the byte. // It exhausts r.buf before reading from r.b. func (r *importReader) readByteNoBuf() byte { + var c byte + var err error if len(r.buf) > 0 { - c := r.buf[0] + c = r.buf[0] r.buf = r.buf[1:] - return c - } - c, err := r.b.ReadByte() - if err == nil && c == 0 { - err = errNUL + } else { + c, err = r.b.ReadByte() + if err == nil && c == 0 { + err = errNUL + } } + if err != nil { if err == io.EOF { r.eof = true } else if r.err == nil { r.err = err } - c = 0 + return 0 + } + r.pos.Offset++ + if c == '\n' { + r.pos.Line++ + r.pos.Column = 1 + } else { + r.pos.Column++ } return c } @@ -323,7 +346,7 @@ func (r *importReader) readImport() { // readComments is like io.ReadAll, except that it only reads the leading // block of comments in the file. func readComments(f io.Reader) ([]byte, error) { - r := &importReader{b: bufio.NewReader(f)} + r := newImportReader("", f) r.peekByte(true) if r.err == nil && !r.eof { // Didn't reach EOF, so must have found a non-space byte. Remove it. @@ -340,7 +363,7 @@ func readComments(f io.Reader) ([]byte, error) { // It only returns an error if there are problems reading the file, // not for syntax errors in the file itself. func readGoInfo(f io.Reader, info *fileInfo) error { - r := &importReader{b: bufio.NewReader(f)} + r := newImportReader(info.name, f) r.readKeyword("package") r.readIdent() @@ -428,6 +451,7 @@ func readGoInfo(f io.Reader, info *fileInfo) error { var line []byte for first := true; r.findEmbed(first); first = false { line = line[:0] + pos := r.pos for { c := r.readByteNoBuf() if c == '\n' || r.err != nil || r.eof { @@ -438,9 +462,9 @@ func readGoInfo(f io.Reader, info *fileInfo) error { // Add args if line is well-formed. // Ignore badly-formed lines - the compiler will report them when it finds them, // and we can pretend they are not there to help go list succeed with what it knows. - args, err := parseGoEmbed(string(line)) + embs, err := parseGoEmbed(string(line), pos) if err == nil { - info.embeds = append(info.embeds, args...) + info.embeds = append(info.embeds, embs...) } } } @@ -450,11 +474,23 @@ func readGoInfo(f io.Reader, info *fileInfo) error { // 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. -// There is a copy of this code in cmd/compile/internal/gc/noder.go as well. -func parseGoEmbed(args string) ([]string, error) { - var list []string - for args = strings.TrimSpace(args); args != ""; args = strings.TrimSpace(args) { +// This is based on a similar function in cmd/compile/internal/gc/noder.go; +// this version calculates position information as well. +func parseGoEmbed(args string, pos token.Position) ([]fileEmbed, error) { + trimBytes := func(n int) { + pos.Offset += n + pos.Column += utf8.RuneCountInString(args[:n]) + args = args[n:] + } + trimSpace := func() { + trim := strings.TrimLeftFunc(args, unicode.IsSpace) + trimBytes(len(args) - len(trim)) + } + + var list []fileEmbed + for trimSpace(); args != ""; trimSpace() { var path string + pathPos := pos Switch: switch args[0] { default: @@ -466,7 +502,7 @@ func parseGoEmbed(args string) ([]string, error) { } } path = args[:i] - args = args[i:] + trimBytes(i) case '`': i := strings.Index(args[1:], "`") @@ -474,7 +510,7 @@ func parseGoEmbed(args string) ([]string, error) { return nil, fmt.Errorf("invalid quoted string in //go:embed: %s", args) } path = args[1 : 1+i] - args = args[1+i+1:] + trimBytes(1 + i + 1) case '"': i := 1 @@ -489,7 +525,7 @@ func parseGoEmbed(args string) ([]string, error) { return nil, fmt.Errorf("invalid quoted string in //go:embed: %s", args[:i+1]) } path = q - args = args[i+1:] + trimBytes(i + 1) break Switch } } @@ -504,7 +540,7 @@ func parseGoEmbed(args string) ([]string, error) { return nil, fmt.Errorf("invalid quoted string in //go:embed: %s", args) } } - list = append(list, path) + list = append(list, fileEmbed{path, pathPos}) } return list, nil } diff --git a/src/go/build/read_test.go b/src/go/build/read_test.go index 36c773ecea..32e6bae008 100644 --- a/src/go/build/read_test.go +++ b/src/go/build/read_test.go @@ -5,9 +5,9 @@ package build import ( + "fmt" "go/token" "io" - "reflect" "strings" "testing" ) @@ -228,36 +228,45 @@ func TestReadFailuresIgnored(t *testing.T) { } var readEmbedTests = []struct { - in string - out []string + in, out string }{ { "package p\n", - nil, + "", }, { "package p\nimport \"embed\"\nvar i int\n//go:embed x y z\nvar files embed.FS", - []string{"x", "y", "z"}, + `test:4:12:x + test:4:14:y + test:4:16:z`, }, { "package p\nimport \"embed\"\nvar i int\n//go:embed x \"\\x79\" `z`\nvar files embed.FS", - []string{"x", "y", "z"}, + `test:4:12:x + test:4:14:y + test:4:21:z`, }, { "package p\nimport \"embed\"\nvar i int\n//go:embed x y\n//go:embed z\nvar files embed.FS", - []string{"x", "y", "z"}, + `test:4:12:x + test:4:14:y + test:5:12:z`, }, { "package p\nimport \"embed\"\nvar i int\n\t //go:embed x y\n\t //go:embed z\n\t var files embed.FS", - []string{"x", "y", "z"}, + `test:4:14:x + test:4:16:y + test:5:14:z`, }, { "package p\nimport \"embed\"\n//go:embed x y z\nvar files embed.FS", - []string{"x", "y", "z"}, + `test:3:12:x + test:3:14:y + test:3:16:z`, }, { "package p\nimport \"embed\"\nvar s = \"/*\"\n//go:embed x\nvar files embed.FS", - []string{"x"}, + `test:4:12:x`, }, { `package p @@ -265,38 +274,48 @@ var readEmbedTests = []struct { var s = "\"\\\\" //go:embed x var files embed.FS`, - []string{"x"}, + `test:4:15:x`, }, { "package p\nimport \"embed\"\nvar s = `/*`\n//go:embed x\nvar files embed.FS", - []string{"x"}, + `test:4:12:x`, }, { "package p\nimport \"embed\"\nvar s = z/ *y\n//go:embed pointer\nvar pointer embed.FS", - []string{"pointer"}, + "test:4:12:pointer", }, { "package p\n//go:embed x y z\n", // no import, no scan - nil, + "", }, { "package p\n//go:embed x y z\nvar files embed.FS", // no import, no scan - nil, + "", }, } func TestReadEmbed(t *testing.T) { fset := token.NewFileSet() for i, tt := range readEmbedTests { - var info fileInfo - info.fset = fset + info := fileInfo{ + name: "test", + fset: fset, + } err := readGoInfo(strings.NewReader(tt.in), &info) if err != nil { t.Errorf("#%d: %v", i, err) continue } - if !reflect.DeepEqual(info.embeds, tt.out) { - t.Errorf("#%d: embeds=%v, want %v", i, info.embeds, tt.out) + b := &strings.Builder{} + sep := "" + for _, emb := range info.embeds { + fmt.Fprintf(b, "%s%v:%s", sep, emb.pos, emb.pattern) + sep = "\n" + } + got := b.String() + want := strings.Join(strings.Fields(tt.out), "\n") + if got != want { + t.Errorf("#%d: embeds:\n%s\nwant:\n%s", i, got, want) } } } -- GitLab From c73232d08f84e110707627a23ceae14d2b534889 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 13 Jan 2021 16:21:16 -0500 Subject: [PATCH 1632/1792] cmd/go/internal/load: refactor setErrorPos to PackageError.setPos Renamed setErrorPos to setPos, made it a method of PackageError, and removed its Package parameter and return value. This makes it more clear that setPos modifies PackageError and does not create a new Package. Change-Id: I26c58d3d456c7c18a5c2598e1e8e158b1e6b4b36 Reviewed-on: https://go-review.googlesource.com/c/go/+/283637 Trust: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/load/pkg.go | 36 ++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index cffc8fcefa..9cea76d738 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -304,7 +304,7 @@ func (p *Package) setLoadPackageDataError(err error, path string, stk *ImportSta } if path != stk.Top() { - p = setErrorPos(p, importPos) + p.Error.setPos(importPos) } } @@ -447,6 +447,15 @@ func (p *PackageError) MarshalJSON() ([]byte, error) { return json.Marshal(perr) } +func (p *PackageError) setPos(posList []token.Position) { + if len(posList) == 0 { + return + } + pos := posList[0] + pos.Filename = base.ShortPath(pos.Filename) + p.Pos = pos.String() +} + // ImportPathError is a type of error that prevents a package from being loaded // for a given import path. When such a package is loaded, a *Package is // returned with Err wrapping an ImportPathError: the error is attached to @@ -695,17 +704,19 @@ func loadImport(ctx context.Context, pre *preload, path, srcDir string, parent * Err: ImportErrorf(path, "non-canonical import path %q: should be %q", path, pathpkg.Clean(path)), } p.Incomplete = true - setErrorPos(p, importPos) + p.Error.setPos(importPos) } } // Checked on every import because the rules depend on the code doing the importing. if perr := disallowInternal(srcDir, parent, parentPath, p, stk); perr != p { - return setErrorPos(perr, importPos) + perr.Error.setPos(importPos) + return perr } if mode&ResolveImport != 0 { if perr := disallowVendor(srcDir, path, parentPath, p, stk); perr != p { - return setErrorPos(perr, importPos) + perr.Error.setPos(importPos) + return perr } } @@ -715,7 +726,8 @@ func loadImport(ctx context.Context, pre *preload, path, srcDir string, parent * ImportStack: stk.Copy(), Err: ImportErrorf(path, "import %q is a program, not an importable package", path), } - return setErrorPos(&perr, importPos) + perr.Error.setPos(importPos) + return &perr } if p.Internal.Local && parent != nil && !parent.Internal.Local { @@ -730,21 +742,13 @@ func loadImport(ctx context.Context, pre *preload, path, srcDir string, parent * ImportStack: stk.Copy(), Err: err, } - return setErrorPos(&perr, importPos) + perr.Error.setPos(importPos) + return &perr } return p } -func setErrorPos(p *Package, importPos []token.Position) *Package { - if len(importPos) > 0 { - pos := importPos[0] - pos.Filename = base.ShortPath(pos.Filename) - p.Error.Pos = pos.String() - } - return p -} - // loadPackageData loads information needed to construct a *Package. The result // is cached, and later calls to loadPackageData for the same package will return // the same data. @@ -1649,7 +1653,7 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor // must be either in an explicit command-line argument, // or on the importer side (indicated by a non-empty importPos). if path != stk.Top() && len(importPos) > 0 { - p = setErrorPos(p, importPos) + p.Error.setPos(importPos) } } } -- GitLab From d9b79e53bb40275d7974cbc14cc60fc1ce84f8f1 Mon Sep 17 00:00:00 2001 From: Junchen Li Date: Fri, 8 Jan 2021 10:20:34 +0800 Subject: [PATCH 1633/1792] cmd/compile: fix wrong complement for arm64 floating-point comparisons Consider the following example, func test(a, b float64, x uint64) uint64 { if a < b { x = 0 } return x } func main() { fmt.Println(test(1, math.NaN(), 123)) } The output is 0, but the expectation is 123. This is because the rewrite rule (CSEL [cc] (MOVDconst [0]) y flag) => (CSEL0 [arm64Negate(cc)] y flag) converts FCMP NaN, 1 CSEL MI, 0, 123, R0 // if 1 < NaN then R0 = 0 else R0 = 123 to FCMP NaN, 1 CSEL GE, 123, 0, R0 // if 1 >= NaN then R0 = 123 else R0 = 0 But both 1 < NaN and 1 >= NaN are false. So the output is 0, not 123. The root cause is arm64Negate not handle negation of floating comparison correctly. According to the ARM manual, the meaning of MI, GE, and PL are MI: Less than GE: Greater than or equal to PL: Greater than, equal to, or unordered Because NaN cannot be compared with other numbers, the result of such comparison is unordered. So when NaN is involved, unlike integer, the result of !(a < b) is not a >= b, it is a >= b || a is NaN || b is NaN. This is exactly what PL means. We add NotLessThanF to represent PL. Then the negation of LessThanF is NotLessThanF rather than GreaterEqualF. The same reason for the other floating comparison operations. Fixes #43619 Change-Id: Ia511b0027ad067436bace9fbfd261dbeaae01bcd Reviewed-on: https://go-review.googlesource.com/c/go/+/283572 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Trust: Keith Randall --- src/cmd/compile/internal/arm64/ssa.go | 20 +++- src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 32 ++--- src/cmd/compile/internal/ssa/opGen.go | 40 +++++++ src/cmd/compile/internal/ssa/rewrite.go | 31 +++-- test/fixedbugs/issue43619.go | 119 +++++++++++++++++++ 5 files changed, 215 insertions(+), 27 deletions(-) create mode 100644 test/fixedbugs/issue43619.go diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index 22b28a9308..43588511ab 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -1054,7 +1054,11 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { ssa.OpARM64LessThanF, ssa.OpARM64LessEqualF, ssa.OpARM64GreaterThanF, - ssa.OpARM64GreaterEqualF: + ssa.OpARM64GreaterEqualF, + ssa.OpARM64NotLessThanF, + ssa.OpARM64NotLessEqualF, + ssa.OpARM64NotGreaterThanF, + ssa.OpARM64NotGreaterEqualF: // generate boolean values using CSET p := s.Prog(arm64.ACSET) p.From.Type = obj.TYPE_REG // assembler encodes conditional bits in Reg @@ -1098,10 +1102,16 @@ var condBits = map[ssa.Op]int16{ ssa.OpARM64GreaterThanU: arm64.COND_HI, ssa.OpARM64GreaterEqual: arm64.COND_GE, ssa.OpARM64GreaterEqualU: arm64.COND_HS, - ssa.OpARM64LessThanF: arm64.COND_MI, - ssa.OpARM64LessEqualF: arm64.COND_LS, - ssa.OpARM64GreaterThanF: arm64.COND_GT, - ssa.OpARM64GreaterEqualF: arm64.COND_GE, + ssa.OpARM64LessThanF: arm64.COND_MI, // Less than + ssa.OpARM64LessEqualF: arm64.COND_LS, // Less than or equal to + ssa.OpARM64GreaterThanF: arm64.COND_GT, // Greater than + ssa.OpARM64GreaterEqualF: arm64.COND_GE, // Greater than or equal to + + // The following condition codes have unordered to handle comparisons related to NaN. + ssa.OpARM64NotLessThanF: arm64.COND_PL, // Greater than, equal to, or unordered + ssa.OpARM64NotLessEqualF: arm64.COND_HI, // Greater than or unordered + ssa.OpARM64NotGreaterThanF: arm64.COND_LE, // Less than, equal to or unordered + ssa.OpARM64NotGreaterEqualF: arm64.COND_LT, // Less than or unordered } var blockJump = map[ssa.BlockKind]struct { diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index 87db2b7c9d..b0bc9c78ff 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -478,20 +478,24 @@ func init() { // pseudo-ops {name: "LoweredNilCheck", argLength: 2, reg: regInfo{inputs: []regMask{gpg}}, nilCheck: true, faultOnNilArg0: true}, // panic if arg0 is nil. arg1=mem. - {name: "Equal", argLength: 1, reg: readflags}, // bool, true flags encode x==y false otherwise. - {name: "NotEqual", argLength: 1, reg: readflags}, // bool, true flags encode x!=y false otherwise. - {name: "LessThan", argLength: 1, reg: readflags}, // bool, true flags encode signed xy false otherwise. - {name: "GreaterEqual", argLength: 1, reg: readflags}, // bool, true flags encode signed x>=y false otherwise. - {name: "LessThanU", argLength: 1, reg: readflags}, // bool, true flags encode unsigned xy false otherwise. - {name: "GreaterEqualU", argLength: 1, reg: readflags}, // bool, true flags encode unsigned x>=y false otherwise. - {name: "LessThanF", argLength: 1, reg: readflags}, // bool, true flags encode floating-point xy false otherwise. - {name: "GreaterEqualF", argLength: 1, reg: readflags}, // bool, true flags encode floating-point x>=y false otherwise. + {name: "Equal", argLength: 1, reg: readflags}, // bool, true flags encode x==y false otherwise. + {name: "NotEqual", argLength: 1, reg: readflags}, // bool, true flags encode x!=y false otherwise. + {name: "LessThan", argLength: 1, reg: readflags}, // bool, true flags encode signed xy false otherwise. + {name: "GreaterEqual", argLength: 1, reg: readflags}, // bool, true flags encode signed x>=y false otherwise. + {name: "LessThanU", argLength: 1, reg: readflags}, // bool, true flags encode unsigned xy false otherwise. + {name: "GreaterEqualU", argLength: 1, reg: readflags}, // bool, true flags encode unsigned x>=y false otherwise. + {name: "LessThanF", argLength: 1, reg: readflags}, // bool, true flags encode floating-point xy false otherwise. + {name: "GreaterEqualF", argLength: 1, reg: readflags}, // bool, true flags encode floating-point x>=y false otherwise. + {name: "NotLessThanF", argLength: 1, reg: readflags}, // bool, true flags encode floating-point x>=y || x is unordered with y, false otherwise. + {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 NotEqual or LessThan -> GreaterEqual +// for example !Equal -> NotEqual or !LessThan -> GreaterEqual // -// TODO: add floating-point conditions +// For floating point, it's more subtle because NaN is unordered. We do +// !LessThanF -> NotLessThanF, the latter takes care of NaNs. func arm64Negate(op Op) Op { switch op { case OpARM64LessThan: @@ -1000,13 +1001,21 @@ func arm64Negate(op Op) Op { case OpARM64NotEqual: return OpARM64Equal case OpARM64LessThanF: - return OpARM64GreaterEqualF - case OpARM64GreaterThanF: - return OpARM64LessEqualF + return OpARM64NotLessThanF + case OpARM64NotLessThanF: + return OpARM64LessThanF case OpARM64LessEqualF: + return OpARM64NotLessEqualF + case OpARM64NotLessEqualF: + return OpARM64LessEqualF + case OpARM64GreaterThanF: + return OpARM64NotGreaterThanF + case OpARM64NotGreaterThanF: return OpARM64GreaterThanF case OpARM64GreaterEqualF: - return OpARM64LessThanF + return OpARM64NotGreaterEqualF + case OpARM64NotGreaterEqualF: + return OpARM64GreaterEqualF default: panic("unreachable") } @@ -1017,8 +1026,6 @@ func arm64Negate(op Op) Op { // that the same result would be produced if the arguments // to the flag-generating instruction were reversed, e.g. // (InvertFlags (CMP x y)) -> (CMP y x) -// -// TODO: add floating-point conditions func arm64Invert(op Op) Op { switch op { case OpARM64LessThan: @@ -1047,6 +1054,14 @@ func arm64Invert(op Op) Op { return OpARM64GreaterEqualF case OpARM64GreaterEqualF: return OpARM64LessEqualF + case OpARM64NotLessThanF: + return OpARM64NotGreaterThanF + case OpARM64NotGreaterThanF: + return OpARM64NotLessThanF + case OpARM64NotLessEqualF: + return OpARM64NotGreaterEqualF + case OpARM64NotGreaterEqualF: + return OpARM64NotLessEqualF default: panic("unreachable") } diff --git a/test/fixedbugs/issue43619.go b/test/fixedbugs/issue43619.go new file mode 100644 index 0000000000..3e667851a4 --- /dev/null +++ b/test/fixedbugs/issue43619.go @@ -0,0 +1,119 @@ +// run + +// 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 main + +import ( + "fmt" + "math" +) + +//go:noinline +func fcmplt(a, b float64, x uint64) uint64 { + if a < b { + x = 0 + } + return x +} + +//go:noinline +func fcmple(a, b float64, x uint64) uint64 { + if a <= b { + x = 0 + } + return x +} + +//go:noinline +func fcmpgt(a, b float64, x uint64) uint64 { + if a > b { + x = 0 + } + return x +} + +//go:noinline +func fcmpge(a, b float64, x uint64) uint64 { + if a >= b { + x = 0 + } + return x +} + +//go:noinline +func fcmpeq(a, b float64, x uint64) uint64 { + if a == b { + x = 0 + } + return x +} + +//go:noinline +func fcmpne(a, b float64, x uint64) uint64 { + if a != b { + x = 0 + } + return x +} + +func main() { + type fn func(a, b float64, x uint64) uint64 + + type testCase struct { + f fn + a, b float64 + x, want uint64 + } + NaN := math.NaN() + for _, t := range []testCase{ + {fcmplt, 1.0, 1.0, 123, 123}, + {fcmple, 1.0, 1.0, 123, 0}, + {fcmpgt, 1.0, 1.0, 123, 123}, + {fcmpge, 1.0, 1.0, 123, 0}, + {fcmpeq, 1.0, 1.0, 123, 0}, + {fcmpne, 1.0, 1.0, 123, 123}, + + {fcmplt, 1.0, 2.0, 123, 0}, + {fcmple, 1.0, 2.0, 123, 0}, + {fcmpgt, 1.0, 2.0, 123, 123}, + {fcmpge, 1.0, 2.0, 123, 123}, + {fcmpeq, 1.0, 2.0, 123, 123}, + {fcmpne, 1.0, 2.0, 123, 0}, + + {fcmplt, 2.0, 1.0, 123, 123}, + {fcmple, 2.0, 1.0, 123, 123}, + {fcmpgt, 2.0, 1.0, 123, 0}, + {fcmpge, 2.0, 1.0, 123, 0}, + {fcmpeq, 2.0, 1.0, 123, 123}, + {fcmpne, 2.0, 1.0, 123, 0}, + + {fcmplt, 1.0, NaN, 123, 123}, + {fcmple, 1.0, NaN, 123, 123}, + {fcmpgt, 1.0, NaN, 123, 123}, + {fcmpge, 1.0, NaN, 123, 123}, + {fcmpeq, 1.0, NaN, 123, 123}, + {fcmpne, 1.0, NaN, 123, 0}, + + {fcmplt, NaN, 1.0, 123, 123}, + {fcmple, NaN, 1.0, 123, 123}, + {fcmpgt, NaN, 1.0, 123, 123}, + {fcmpge, NaN, 1.0, 123, 123}, + {fcmpeq, NaN, 1.0, 123, 123}, + {fcmpne, NaN, 1.0, 123, 0}, + + {fcmplt, NaN, NaN, 123, 123}, + {fcmple, NaN, NaN, 123, 123}, + {fcmpgt, NaN, NaN, 123, 123}, + {fcmpge, NaN, NaN, 123, 123}, + {fcmpeq, NaN, NaN, 123, 123}, + {fcmpne, NaN, NaN, 123, 0}, + } { + got := t.f(t.a, t.b, t.x) + if got != t.want { + panic(fmt.Sprintf("want %v, got %v", t.want, got)) + } + } +} -- GitLab From 9135795891a0a297dbbfb66b726b249712f47927 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 13 Jan 2021 17:08:38 -0500 Subject: [PATCH 1634/1792] cmd/go/internal/load: report positions for embed errors Fixes #43469 Fixes #43632 Change-Id: I862bb9da8bc3e4f15635bc33fd7cb5f12b917d71 Reviewed-on: https://go-review.googlesource.com/c/go/+/283638 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Trust: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/load/pkg.go | 63 +++++++++++++++++++++------- src/cmd/go/internal/load/test.go | 4 ++ src/cmd/go/testdata/script/embed.txt | 17 ++++++-- 3 files changed, 64 insertions(+), 20 deletions(-) diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 9cea76d738..a1be074f6a 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -412,6 +412,9 @@ type PackageError struct { } func (p *PackageError) Error() string { + // TODO(#43696): decide when to print the stack or the position based on + // the error type and whether the package is in the main module. + // Document the rationale. if p.Pos != "" && (len(p.ImportStack) == 0 || !p.alwaysPrintStack) { // Omit import stack. The full path to the file where the error // is the most important thing. @@ -1663,11 +1666,6 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor p.setLoadPackageDataError(err, path, stk, importPos) } - p.EmbedFiles, p.Internal.Embed, err = p.resolveEmbed(p.EmbedPatterns) - if err != nil { - setError(err) - } - useBindir := p.Name == "main" if !p.Standard { switch cfg.BuildBuildmode { @@ -1803,9 +1801,19 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor return } + // Errors after this point are caused by this package, not the importing + // package. Pushing the path here prevents us from reporting the error + // with the position of the import declaration. stk.Push(path) defer stk.Pop() + p.EmbedFiles, p.Internal.Embed, err = p.resolveEmbed(p.EmbedPatterns) + if err != nil { + setError(err) + embedErr := err.(*EmbedError) + p.Error.setPos(p.Internal.Build.EmbedPatternPos[embedErr.Pattern]) + } + // Check for case-insensitive collision of input files. // To avoid problems on case-insensitive files, we reject any package // where two different input files have equal names under a case-insensitive @@ -1909,6 +1917,20 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor } } +// An EmbedError indicates a problem with a go:embed directive. +type EmbedError struct { + Pattern string + Err error +} + +func (e *EmbedError) Error() string { + return fmt.Sprintf("pattern %s: %v", e.Pattern, e.Err) +} + +func (e *EmbedError) Unwrap() error { + return e.Err +} + // ResolveEmbed resolves //go:embed patterns and returns only the file list. // For use by go list to compute p.TestEmbedFiles and p.XTestEmbedFiles. func (p *Package) ResolveEmbed(patterns []string) []string { @@ -1920,24 +1942,33 @@ func (p *Package) ResolveEmbed(patterns []string) []string { // It sets files to the list of unique files matched (for go list), // and it sets pmap to the more precise mapping from // patterns to files. -// TODO(rsc): All these messages need position information for better error reports. func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[string][]string, err error) { + var pattern string + defer func() { + if err != nil { + err = &EmbedError{ + Pattern: pattern, + Err: err, + } + } + }() + pmap = make(map[string][]string) have := make(map[string]int) dirOK := make(map[string]bool) pid := 0 // pattern ID, to allow reuse of have map - for _, pattern := range patterns { + for _, pattern = range patterns { pid++ // Check pattern is valid for //go:embed. if _, err := path.Match(pattern, ""); err != nil || !validEmbedPattern(pattern) { - return nil, nil, fmt.Errorf("pattern %s: invalid pattern syntax", pattern) + return nil, nil, fmt.Errorf("invalid pattern syntax") } // Glob to find matches. match, err := fsys.Glob(p.Dir + string(filepath.Separator) + filepath.FromSlash(pattern)) if err != nil { - return nil, nil, fmt.Errorf("pattern %s: %v", pattern, err) + return nil, nil, err } // Filter list of matches down to the ones that will still exist when @@ -1961,26 +1992,26 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri // (do not contain a go.mod). for dir := file; len(dir) > len(p.Dir)+1 && !dirOK[dir]; dir = filepath.Dir(dir) { if _, err := fsys.Stat(filepath.Join(dir, "go.mod")); err == nil { - return nil, nil, fmt.Errorf("pattern %s: cannot embed %s %s: in different module", pattern, what, rel) + return nil, nil, fmt.Errorf("cannot embed %s %s: in different module", what, rel) } if dir != file { if info, err := fsys.Lstat(dir); err == nil && !info.IsDir() { - return nil, nil, fmt.Errorf("pattern %s: cannot embed %s %s: in non-directory %s", pattern, what, rel, dir[len(p.Dir)+1:]) + return nil, nil, fmt.Errorf("cannot embed %s %s: in non-directory %s", what, rel, dir[len(p.Dir)+1:]) } } dirOK[dir] = true if elem := filepath.Base(dir); isBadEmbedName(elem) { if dir == file { - return nil, nil, fmt.Errorf("pattern %s: cannot embed %s %s: invalid name %s", pattern, what, rel, elem) + return nil, nil, fmt.Errorf("cannot embed %s %s: invalid name %s", what, rel, elem) } else { - return nil, nil, fmt.Errorf("pattern %s: cannot embed %s %s: in invalid directory %s", pattern, what, rel, elem) + return nil, nil, fmt.Errorf("cannot embed %s %s: in invalid directory %s", what, rel, elem) } } } switch { default: - return nil, nil, fmt.Errorf("pattern %s: cannot embed irregular file %s", pattern, rel) + return nil, nil, fmt.Errorf("cannot embed irregular file %s", rel) case info.Mode().IsRegular(): if have[rel] != pid { @@ -2027,13 +2058,13 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri return nil, nil, err } if count == 0 { - return nil, nil, fmt.Errorf("pattern %s: cannot embed directory %s: contains no embeddable files", pattern, rel) + return nil, nil, fmt.Errorf("cannot embed directory %s: contains no embeddable files", rel) } } } if len(list) == 0 { - return nil, nil, fmt.Errorf("pattern %s: no matching files found", pattern) + return nil, nil, fmt.Errorf("no matching files found") } sort.Strings(list) pmap[pattern] = list diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index d884361aaa..178f257f4b 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -130,6 +130,8 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p ImportStack: stk.Copy(), Err: err, } + embedErr := err.(*EmbedError) + ptestErr.setPos(p.Internal.Build.TestEmbedPatternPos[embedErr.Pattern]) } stk.Pop() @@ -151,6 +153,8 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p ImportStack: stk.Copy(), Err: err, } + embedErr := err.(*EmbedError) + pxtestErr.setPos(p.Internal.Build.XTestEmbedPatternPos[embedErr.Pattern]) } stk.Pop() diff --git a/src/cmd/go/testdata/script/embed.txt b/src/cmd/go/testdata/script/embed.txt index 7e9a548661..710968feca 100644 --- a/src/cmd/go/testdata/script/embed.txt +++ b/src/cmd/go/testdata/script/embed.txt @@ -20,7 +20,7 @@ cp x.go2 x.go go build -x cp x.txt .git ! go build -x -stderr 'pattern [*]t: cannot embed file [.]git' +stderr '^x.go:5:12: pattern [*]t: cannot embed file [.]git: invalid name [.]git$' rm .git # build rejects symlinks @@ -32,19 +32,24 @@ rm .git # build rejects empty directories mkdir t ! go build -x -stderr 'pattern [*]t: cannot embed directory t: contains no embeddable files' +stderr '^x.go:5:12: pattern [*]t: cannot embed directory t: contains no embeddable files$' # build ignores symlinks and invalid names in directories cp x.txt t/.git ! go build -x -stderr 'pattern [*]t: cannot embed directory t: contains no embeddable files' +stderr '^x.go:5:12: pattern [*]t: cannot embed directory t: contains no embeddable files$' [symlink] symlink t/x.link -> ../x.txt [symlink] ! go build -x -[symlink] stderr 'pattern [*]t: cannot embed directory t: contains no embeddable files' +[symlink] stderr '^x.go:5:12: pattern [*]t: cannot embed directory t: contains no embeddable files$' cp x.txt t/x.txt go build -x +# build reports errors with positions in imported packages +rm t/x.txt +! go build m/use +stderr '^x.go:5:12: pattern [*]t: cannot embed directory t: contains no embeddable files$' + -- x.go -- package p @@ -67,6 +72,10 @@ hello -- x.txt2 -- not hello +-- use/use.go -- +package use + +import _ "m" -- go.mod -- module m -- GitLab From 0c86b999c35ed199bc7aa001affb1d5d186c9e73 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 14 Jan 2021 12:00:23 -0800 Subject: [PATCH 1635/1792] cmd/test2json: document passing -test.paniconexit0 For #29062 Fixes #43263 Change-Id: I160197c94cc4f936967cc22c82cec01663a14fe6 Reviewed-on: https://go-review.googlesource.com/c/go/+/283873 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Bryan C. Mills TryBot-Result: Go Bot --- src/cmd/go/testdata/script/test_exit.txt | 17 +++++++++++++++++ src/cmd/test2json/main.go | 6 +++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/testdata/script/test_exit.txt b/src/cmd/go/testdata/script/test_exit.txt index 23a2429d1e..3703ba53d3 100644 --- a/src/cmd/go/testdata/script/test_exit.txt +++ b/src/cmd/go/testdata/script/test_exit.txt @@ -54,6 +54,23 @@ go test -list=. ./main_zero stdout 'skipping all tests' ! stdout TestNotListed +# Running the test directly still fails, if we pass the flag. +go test -c -o ./zero.exe ./zero +! exec ./zero.exe -test.paniconexit0 + +# Using -json doesn't affect the exit status. +! go test -json ./zero +! stdout '"Output":"ok' +! stdout 'exit status' +stdout 'panic' +stdout '"Output":"FAIL' + +# Running the test via test2json also fails. +! go tool test2json ./zero.exe -test.v -test.paniconexit0 +! stdout '"Output":"ok' +! stdout 'exit status' +stdout 'panic' + -- go.mod -- module m diff --git a/src/cmd/test2json/main.go b/src/cmd/test2json/main.go index 57a874193e..e40881ab3f 100644 --- a/src/cmd/test2json/main.go +++ b/src/cmd/test2json/main.go @@ -6,7 +6,7 @@ // // Usage: // -// go tool test2json [-p pkg] [-t] [./pkg.test -test.v] +// go tool test2json [-p pkg] [-t] [./pkg.test -test.v [-test.paniconexit0]] // // Test2json runs the given test command and converts its output to JSON; // with no command specified, test2json expects test output on standard input. @@ -18,6 +18,10 @@ // // The -t flag requests that time stamps be added to each test event. // +// The test must be invoked with -test.v. Additionally passing +// -test.paniconexit0 will cause test2json to exit with a non-zero +// status if one of the tests being run calls os.Exit(0). +// // Note that test2json is only intended for converting a single test // binary's output. To convert the output of a "go test" command, // use "go test -json" instead of invoking test2json directly. -- GitLab From 84e8a06f62e47bf3f126e6c7e5f39dd7ca82f421 Mon Sep 17 00:00:00 2001 From: Quim Muntal Date: Thu, 14 Jan 2021 21:29:49 +0100 Subject: [PATCH 1636/1792] cmd/cgo: remove unnecessary space in cgo export header The cgo header has an unnecessary space in the exported function definition on non-windows goos. This was introduced in go1.16 so it would be good to fix it before release. Example: // Current behavior, notice there is an unecessary space // between extern and void extern void Foo(); // With this CL extern void Foo(); Change-Id: Ic2c21f8d806fe35a7be7183dbfe35ac605b6e4f6 Reviewed-on: https://go-review.googlesource.com/c/go/+/283892 Reviewed-by: Ian Lance Taylor Trust: Katie Hockman --- src/cmd/cgo/out.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 11c53facf8..fa6f0efbbe 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -953,9 +953,9 @@ func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) { // Build the wrapper function compiled by gcc. gccExport := "" if goos == "windows" { - gccExport = "__declspec(dllexport)" + gccExport = "__declspec(dllexport) " } - s := fmt.Sprintf("%s %s %s(", gccExport, gccResult, exp.ExpName) + s := fmt.Sprintf("%s%s %s(", gccExport, gccResult, exp.ExpName) if fn.Recv != nil { s += p.cgoType(fn.Recv.List[0].Type).C.String() s += " recv" -- GitLab From eb330020dc42930e99d9a8c8ea3cc0972cbd230f Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 14 Jan 2021 12:29:16 -0500 Subject: [PATCH 1637/1792] cmd/dist, cmd/go: pass -arch for C compilation on Darwin On Apple Silicon Mac, the C compiler has an annoying default target selection, depending on the ancestor processes' architecture. In particular, if the shell or IDE is x86, when running "go build" even with a native ARM64 Go toolchain, the C compiler defaults to x86, causing build failures. We pass "-arch" flag explicitly to avoid this situation. Fixes #43692. Fixes #43476. Updates golang/vscode-go#1087. Change-Id: I80b6a116a114e11e273c6886e377a1cc969fa3f6 Reviewed-on: https://go-review.googlesource.com/c/go/+/283812 Trust: Cherry Zhang Run-TryBot: Cherry Zhang Reviewed-by: Ian Lance Taylor Reviewed-by: Bryan C. Mills --- src/cmd/cgo/gcc.go | 7 ++++++ src/cmd/go/internal/work/exec.go | 9 ++++++- .../testdata/script/build_darwin_cc_arch.txt | 24 +++++++++++++++++++ src/cmd/link/internal/ld/lib.go | 11 +++++++-- 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 src/cmd/go/testdata/script/build_darwin_cc_arch.txt diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 111a309eb5..b5e28e3254 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -1549,7 +1549,14 @@ func (p *Package) gccBaseCmd() []string { func (p *Package) gccMachine() []string { switch goarch { case "amd64": + if goos == "darwin" { + return []string{"-arch", "x86_64", "-m64"} + } return []string{"-m64"} + case "arm64": + if goos == "darwin" { + return []string{"-arch", "arm64"} + } case "386": return []string{"-m32"} case "arm": diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index feb2299d40..af8b78e661 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2435,7 +2435,7 @@ func (b *Builder) fcExe() []string { func (b *Builder) compilerExe(envValue string, def string) []string { compiler := strings.Fields(envValue) if len(compiler) == 0 { - compiler = []string{def} + compiler = strings.Fields(def) } return compiler } @@ -2581,7 +2581,14 @@ func (b *Builder) gccArchArgs() []string { case "386": return []string{"-m32"} case "amd64": + if cfg.Goos == "darwin" { + return []string{"-arch", "x86_64", "-m64"} + } return []string{"-m64"} + case "arm64": + if cfg.Goos == "darwin" { + return []string{"-arch", "arm64"} + } case "arm": return []string{"-marm"} // not thumb case "s390x": diff --git a/src/cmd/go/testdata/script/build_darwin_cc_arch.txt b/src/cmd/go/testdata/script/build_darwin_cc_arch.txt new file mode 100644 index 0000000000..2b81b4cf80 --- /dev/null +++ b/src/cmd/go/testdata/script/build_darwin_cc_arch.txt @@ -0,0 +1,24 @@ +# Test that we pass -arch flag to C compiler on Darwin (issue 43692). + +[!darwin] skip +[!cgo] skip + +# clear CC, in case user sets it +env CC= + +env CGO_ENABLED=1 + +env GOARCH=amd64 +go build -n -x c.go +stderr 'clang.*-arch x86_64' + +env GOARCH=arm64 +go build -n -x c.go +stderr 'clang.*-arch arm64' + +-- c.go -- +package main + +import "C" + +func main() {} diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index bf95745d8d..dd5e8ab2c5 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1749,12 +1749,19 @@ func hostlinkArchArgs(arch *sys.Arch) []string { switch arch.Family { case sys.I386: return []string{"-m32"} - case sys.AMD64, sys.S390X: + case sys.AMD64: + if objabi.GOOS == "darwin" { + return []string{"-arch", "x86_64", "-m64"} + } + return []string{"-m64"} + case sys.S390X: return []string{"-m64"} case sys.ARM: return []string{"-marm"} case sys.ARM64: - // nothing needed + if objabi.GOOS == "darwin" { + return []string{"-arch", "arm64"} + } case sys.MIPS64: return []string{"-mabi=64"} case sys.MIPS: -- GitLab From e125ccd10ea191101dbc31f0dd39a98f9d3ab929 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 14 Jan 2021 13:28:37 -0500 Subject: [PATCH 1638/1792] cmd/go: in 'go mod edit', validate versions given to -retract and -exclude Fixes #43280 Change-Id: Icb6c6807fe32a89202a2709d4a1c8d8af967628f Reviewed-on: https://go-review.googlesource.com/c/go/+/283853 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +-- src/cmd/go/testdata/script/mod_edit.txt | 6 ++++ .../vendor/golang.org/x/mod/modfile/rule.go | 30 +++++++++++++++++++ src/cmd/vendor/modules.txt | 2 +- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 879513b912..235e28f64f 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -6,7 +6,7 @@ require ( github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2 golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 - golang.org/x/mod v0.4.0 + golang.org/x/mod v0.4.1 golang.org/x/sys v0.0.0-20201204225414-ed752295db88 // indirect golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index fc251ed663..70aae0b4cc 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -14,8 +14,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0 h1:8pl+sMODzuvGJkmj2W4kZihvVb5mKm8pB/X44PIQHv8= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= diff --git a/src/cmd/go/testdata/script/mod_edit.txt b/src/cmd/go/testdata/script/mod_edit.txt index 78485eb86a..d7e681e831 100644 --- a/src/cmd/go/testdata/script/mod_edit.txt +++ b/src/cmd/go/testdata/script/mod_edit.txt @@ -21,6 +21,12 @@ cmpenv go.mod $WORK/go.mod.edit1 go mod edit -droprequire=x.1 -dropexclude=x.1@v1.2.1 -dropreplace=x.1@v1.3.0 -require=x.3@v1.99.0 -dropretract=v1.0.0 -dropretract=[v1.1.0,v1.2.0] cmpenv go.mod $WORK/go.mod.edit2 +# -exclude and -retract reject invalid versions. +! go mod edit -exclude=example.com/m@bad +stderr '^go mod: -exclude=example.com/m@bad: version "bad" invalid: must be of the form v1.2.3$' +! go mod edit -retract=bad +stderr '^go mod: -retract=bad: version "bad" invalid: must be of the form v1.2.3$' + # go mod edit -json go mod edit -json cmpenv stdout $WORK/go.mod.json 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 83398dda5d..c6a189dbe0 100644 --- a/src/cmd/vendor/golang.org/x/mod/modfile/rule.go +++ b/src/cmd/vendor/golang.org/x/mod/modfile/rule.go @@ -832,7 +832,16 @@ func (f *File) DropRequire(path string) error { return nil } +// AddExclude adds a exclude statement to the mod file. Errors if the provided +// version is not a canonical version string func (f *File) AddExclude(path, vers string) error { + if !isCanonicalVersion(vers) { + return &module.InvalidVersionError{ + Version: vers, + Err: errors.New("must be of the form v1.2.3"), + } + } + var hint *Line for _, x := range f.Exclude { if x.Mod.Path == path && x.Mod.Version == vers { @@ -904,7 +913,22 @@ func (f *File) DropReplace(oldPath, oldVers string) error { return nil } +// AddRetract adds a retract statement to the mod file. Errors if the provided +// version interval does not consist of canonical version strings func (f *File) AddRetract(vi VersionInterval, rationale string) error { + if !isCanonicalVersion(vi.High) { + return &module.InvalidVersionError{ + Version: vi.High, + Err: errors.New("must be of the form v1.2.3"), + } + } + if !isCanonicalVersion(vi.Low) { + return &module.InvalidVersionError{ + Version: vi.Low, + Err: errors.New("must be of the form v1.2.3"), + } + } + r := &Retract{ VersionInterval: vi, } @@ -1061,3 +1085,9 @@ func lineRetractLess(li, lj *Line) bool { } return semver.Compare(vii.High, vij.High) > 0 } + +// isCanonicalVersion tests if the provided version string represents a valid +// canonical version. +func isCanonicalVersion(vers string) bool { + return vers != "" && semver.Canonical(vers) == vers +} diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 7337800ba6..e033984956 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -28,7 +28,7 @@ golang.org/x/arch/x86/x86asm golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ssh/terminal -# golang.org/x/mod v0.4.0 +# golang.org/x/mod v0.4.1 ## explicit golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile -- GitLab From ff196c3e84b7e8d47285a0833d0458db3286f8ec Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Fri, 15 Jan 2021 15:23:23 +0100 Subject: [PATCH 1639/1792] crypto/x509: update iOS bundled roots to version 55188.40.9 Updates #38843 Change-Id: If76844e1caf23f98d814de89f77610de59d96a34 Reviewed-on: https://go-review.googlesource.com/c/go/+/284134 Trust: Filippo Valsorda Run-TryBot: Filippo Valsorda Reviewed-by: Dmitri Shuralyov --- src/crypto/x509/root.go | 6 +- src/crypto/x509/root_ios.go | 280 +----------------------------------- 2 files changed, 6 insertions(+), 280 deletions(-) diff --git a/src/crypto/x509/root.go b/src/crypto/x509/root.go index ac92915128..cc53f7aefc 100644 --- a/src/crypto/x509/root.go +++ b/src/crypto/x509/root.go @@ -4,7 +4,11 @@ package x509 -//go:generate go run root_ios_gen.go -version 55161.140.3 +// To update the embedded iOS root store, update the -version +// argument to the latest security_certificates version from +// https://opensource.apple.com/source/security_certificates/ +// and run "go generate". See https://golang.org/issue/38843. +//go:generate go run root_ios_gen.go -version 55188.40.9 import "sync" diff --git a/src/crypto/x509/root_ios.go b/src/crypto/x509/root_ios.go index cb3529d6d5..d2dfb62b77 100644 --- a/src/crypto/x509/root_ios.go +++ b/src/crypto/x509/root_ios.go @@ -1,4 +1,4 @@ -// Code generated by root_ios_gen.go -version 55161.140.3; DO NOT EDIT. +// Code generated by root_ios_gen.go -version 55188.40.9; DO NOT EDIT. // Update the version in root.go and regenerate with "go generate". // +build ios @@ -116,61 +116,6 @@ ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- -# "AddTrust Class 1 CA Root" -# 8C 72 09 27 9A C0 4E 27 5E 16 D0 7F D3 B7 75 E8 -# 01 54 B5 96 80 46 E3 1F 52 DD 25 76 63 24 E9 A7 ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- -# "AddTrust External CA Root" -# 68 7F A4 51 38 22 78 FF F0 C8 B1 1F 8D 43 D5 76 -# 67 1C 6E B2 BC EA B4 13 FB 83 D9 65 D0 6D 2F F2 ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- # "Admin-Root-CA" # A3 1F 09 30 53 BD 12 C1 F5 C3 C6 EF D4 98 02 3F # D2 91 4D 77 58 D0 5D 69 8C E0 84 B5 06 26 E0 E5 @@ -1249,31 +1194,6 @@ Bvt9YAretIpjsJyp8qS5UwGH0GikJ3+r/+n6yUA4iGe0OcaEb1fJU9u6ju7AQ7L4 CYNu/2bPPu8Xs1gYJQk0XuPL1hS27PKSb3TkL4Eq1ZKR4OCXPDJoBYVL0fdX4lId kxpUnwVwwEpxYB5DC2Ae/qPOgRnhCzU= -----END CERTIFICATE----- -# "Class 2 Primary CA" -# 0F 99 3C 8A EF 97 BA AF 56 87 14 0E D5 9A D1 82 -# 1B B4 AF AC F0 AA 9A 58 B5 D5 7A 33 8A 3A FB CB ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- # "COMODO Certification Authority" # 0C 2C D6 3D F7 80 6F A3 99 ED E8 09 11 6B 57 5B # F8 79 89 F0 65 18 F9 80 8C 86 05 03 17 8B AF 66 @@ -1529,31 +1449,6 @@ CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 -----END CERTIFICATE----- -# "Deutsche Telekom Root CA 2" -# B6 19 1A 50 D0 C3 97 7F 7D A9 9B CD AA C8 6A 22 -# 7D AE B9 67 9E C7 0B A3 B0 C9 D9 22 71 C1 70 D3 ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- # "Developer ID Certification Authority" # 7A FC 9D 01 A6 2F 03 A2 DE 96 37 93 6D 4A FE 68 # 09 0D 2D E1 8D 03 F2 9C 88 CF B0 B1 BA 63 58 7F @@ -1801,29 +1696,6 @@ R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- -# "DST Root CA X4" -# 9A 73 92 9A 50 0F 1A 0B F4 9D CB 04 6E 80 39 16 -# 96 96 55 73 45 E9 F8 13 F1 0F F9 38 0D B2 26 95 ------BEGIN CERTIFICATE----- -MIIDOzCCAiOgAwIBAgIRANAeRlAAACmMAAAAAgAAAAIwDQYJKoZIhvcNAQEFBQAw -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYNDAeFw0wMDA5MTMwNjIyNTBaFw0yMDA5MTMwNjIyNTBa -MD8xJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjEXMBUGA1UE -AxMORFNUIFJvb3QgQ0EgWDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCthX3OFEYY8gSeIYur0O4ypOT68HnDrjLfIutL5PZHRwQGjzCPb9PFo/ihboJ8 -RvfGhBAqpQCo47zwYEhpWm1jB+L/OE/dBBiyn98krfU2NiBKSom2J58RBeAwHGEy -cO+lewyjVvbDDLUy4CheY059vfMjPAftCRXjqSZIolQb9FdPcAoa90mFwB7rKniE -J7vppdrUScSS0+eBrHSUPLdvwyn4RGp+lSwbWYcbg5EpSpE0GRJdchic0YDjvIoC -YHpe7Rkj93PYRTQyU4bhC88ck8tMqbvRYqMRqR+vobbkrj5LLCOQCHV5WEoxWh+0 -E2SpIFe7RkV++MmpIAc0h1tZAgMBAAGjMjAwMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFPCD6nPIP1ubWzdf9UyPWvf0hki9MA0GCSqGSIb3DQEBBQUAA4IBAQCE -G85wl5eEWd7adH6XW/ikGN5salvpq/Fix6yVTzE6CrhlP5LBdkf6kx1bSPL18M45 -g0rw2zA/MWOhJ3+S6U+BE0zPGCuu8YQaZibR7snm3HiHUaZNMu5c8D0x0bcMxDjY -AVVcHCoNiL53Q4PLW27nbY6wwG0ffFKmgV3blxrYWfuUDgGpyPwHwkfVFvz9qjaV -mf12VJffL6W8omBPtgteb6UaT/k1oJ7YI0ldGf+ngpVbRhD+LC3cUtT6GO/BEPZu -8YTV/hbiDH5v3khVqMIeKT6o8IuXGG7F6a6vKwP1F1FwTXf4UC/ivhme7vdUH7B/ -Vv4AEbT8dNfEeFxrkDbh ------END CERTIFICATE----- # "E-Tugra Certification Authority" # B0 BF D5 2B B0 D7 D9 BD 92 BF 5D 4D C1 3D A2 55 # C0 2C 54 2F 37 83 65 EA 89 39 11 F5 5E 55 F2 3C @@ -2671,39 +2543,6 @@ EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi AmvZWg== -----END CERTIFICATE----- -# "I.CA - Qualified Certification Authority, 09/2009" -# C0 C0 5A 8D 8D A5 5E AF 27 AA 9B 91 0B 0A 6E F0 -# D8 BB DE D3 46 92 8D B8 72 E1 82 C2 07 3E 98 02 ------BEGIN CERTIFICATE----- -MIIFHjCCBAagAwIBAgIEAKA3oDANBgkqhkiG9w0BAQsFADCBtzELMAkGA1UEBhMC -Q1oxOjA4BgNVBAMMMUkuQ0EgLSBRdWFsaWZpZWQgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHksIDA5LzIwMDkxLTArBgNVBAoMJFBydm7DrSBjZXJ0aWZpa2HEjW7DrSBh -dXRvcml0YSwgYS5zLjE9MDsGA1UECww0SS5DQSAtIEFjY3JlZGl0ZWQgUHJvdmlk -ZXIgb2YgQ2VydGlmaWNhdGlvbiBTZXJ2aWNlczAeFw0wOTA5MDEwMDAwMDBaFw0x -OTA5MDEwMDAwMDBaMIG3MQswCQYDVQQGEwJDWjE6MDgGA1UEAwwxSS5DQSAtIFF1 -YWxpZmllZCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSwgMDkvMjAwOTEtMCsGA1UE -CgwkUHJ2bsOtIGNlcnRpZmlrYcSNbsOtIGF1dG9yaXRhLCBhLnMuMT0wOwYDVQQL -DDRJLkNBIC0gQWNjcmVkaXRlZCBQcm92aWRlciBvZiBDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtTaEy0KC8M9l -4lSaWHMs4+sVV1LwzyJYiIQNeCrv1HHm/YpGIdY/Z640ceankjQvIX7m23BK4OSC -6KO8kZYA3zopOz6GFCOKV2PvLukbc+c2imF6kLHEv6qNA8WxhPbR3xKwlHDwB2yh -Wzo7V3QVgDRG83sugqQntKYC3LnlTGbJpNP+Az72gpO9AHUn/IBhFk4ksc8lYS2L -9GCy9CsmdKSBP78p9w8Lx7vDLqkDgt1/zBrcUWmSSb7AE/BPEeMryQV1IdI6nlGn -BhWkXOYf6GSdayJw86btuxC7viDKNrbp44HjQRaSxnp6O3eto1x4DfiYdw/YbJFe -7EjkxSQBywIDAQABo4IBLjCCASowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwgecGA1UdIASB3zCB3DCB2QYEVR0gADCB0DCBzQYIKwYBBQUHAgIwgcAa -gb1UZW50byBjZXJ0aWZpa2F0IGplIHZ5ZGFuIGpha28ga3ZhbGlmaWtvdmFueSBz -eXN0ZW1vdnkgY2VydGlmaWthdCBwb2RsZSB6YWtvbmEgYy4gMjI3LzIwMDAgU2Iu -IHYgcGxhdG5lbSB6bmVuaS9UaGlzIGlzIHF1YWxpZmllZCBzeXN0ZW0gY2VydGlm -aWNhdGUgYWNjb3JkaW5nIHRvIEN6ZWNoIEFjdCBOby4gMjI3LzIwMDAgQ29sbC4w -HQYDVR0OBBYEFHnL0CPpOmdwkXRP01Hi4CD94Sj7MA0GCSqGSIb3DQEBCwUAA4IB -AQB9laU214hYaBHPZftbDS/2dIGLWdmdSbj1OZbJ8LIPBMxYjPoEMqzAR74tw96T -i6aWRa5WdOWaS6I/qibEKFZhJAVXX5mkx2ewGFLJ+0Go+eTxnjLOnhVF2V2s+57b -m8c8j6/bS6Ij6DspcHEYpfjjh64hE2r0aSpZDjGzKFM6YpqsCJN8qYe2X1qmGMLQ -wvNdjG+nPzCJOOuUEypIWt555ZDLXqS5F7ZjBjlfyDZjEfS2Es9Idok8alf563Mi -9/o+Ba46wMYOkk3P1IlU0RqCajdbliioACKDztAqubONU1guZVzV8tuMASVzbJeL -/GAB7ECTwe1RuKrLYtglMKI9 ------END CERTIFICATE----- # "IdenTrust Commercial Root CA 1" # 5D 56 49 9B E4 D2 E0 8B CF CA D0 8A 3E 38 72 3D # 50 50 3B DE 70 69 48 E4 2F 55 60 30 19 E5 28 AE @@ -4722,123 +4561,6 @@ VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG jjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- -# "UTN - DATACorp SGC" -# 85 FB 2F 91 DD 12 27 5A 01 45 B6 36 53 4F 84 02 -# 4A D6 8B 69 B8 EE 88 68 4F F7 11 37 58 05 B3 48 ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- -# "UTN-USERFirst-Client Authentication and Email" -# 43 F2 57 41 2D 44 0D 62 74 76 97 4F 87 7D A8 F1 -# FC 24 44 56 5A 36 7A E6 0E DD C2 7A 41 25 31 AE ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB -rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt -Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa -Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV -BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l -dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE -AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B -YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 -hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l -L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm -SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM -1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw -Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 -aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u -7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 -xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ -rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim -eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk -USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- -# "UTN-USERFirst-Hardware" -# 6E A5 47 41 D0 04 66 7E ED 1B 48 16 63 4A A3 A7 -# 9E 6E 4B 96 95 0F 82 79 DA FC 8D 9B D8 81 21 37 ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- -# "UTN-USERFirst-Object" -# 6F FF 78 E4 00 A7 0C 11 01 1C D8 59 77 C4 59 FB -# 5A F9 6A 3D F0 54 08 20 D0 F4 B8 60 78 75 E5 8F ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB -lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt -T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV -BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc -BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3 -dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP -HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO -KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo -5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+ -pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb -kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC -AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov -L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV -HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN -AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw -NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB -mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU -4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5 -81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR -Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= ------END CERTIFICATE----- # "VeriSign Class 1 Public Primary Certification Authority - G3" # CB B5 AF 18 5E 94 2A 24 02 F9 EA CB C0 ED 5B B8 # 76 EE A3 C1 22 36 23 D0 04 47 E4 F3 BA 55 4B 65 -- GitLab From 1deae0b59747ea87d0ef02b6dfdfbbdf5e7bcee8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Jan 2021 10:16:25 -0500 Subject: [PATCH 1640/1792] os: invoke processKiller synchronously in testKillProcess Previously, testKillProcess needlessly invoked processKiller in a separate goroutine and failed to wait for that goroutine to complete, causing the calls to t.Fatalf in that goroutine to potentially occur after the test function had already returned. Fixes #43722 Change-Id: I5d03cb24af51bb73f0ff96419dac57ec39776967 Reviewed-on: https://go-review.googlesource.com/c/go/+/284153 Trust: Bryan C. Mills Trust: Jason A. Donenfeld Reviewed-by: Jason A. Donenfeld Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot --- src/os/os_test.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/os/os_test.go b/src/os/os_test.go index d2e8ed5d82..698dbca91e 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -2298,6 +2298,7 @@ func TestLongPath(t *testing.T) { func testKillProcess(t *testing.T, processKiller func(p *Process)) { testenv.MustHaveExec(t) + t.Parallel() // Re-exec the test binary itself to emulate "sleep 1". cmd := osexec.Command(Args[0], "-test.run", "TestSleep") @@ -2305,14 +2306,15 @@ func testKillProcess(t *testing.T, processKiller func(p *Process)) { if err != nil { t.Fatalf("Failed to start test process: %v", err) } - go func() { - time.Sleep(100 * time.Millisecond) - processKiller(cmd.Process) + + defer func() { + if err := cmd.Wait(); err == nil { + t.Errorf("Test process succeeded, but expected to fail") + } }() - err = cmd.Wait() - if err == nil { - t.Errorf("Test process succeeded, but expected to fail") - } + + time.Sleep(100 * time.Millisecond) + processKiller(cmd.Process) } // TestSleep emulates "sleep 1". It is a helper for testKillProcess, so we -- GitLab From bb5075a5259baeaa75f09db64c3860c5876a00fd Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 15 Jan 2021 00:04:10 +0100 Subject: [PATCH 1641/1792] syscall: remove RtlGenRandom and move it into internal/syscall There's on need to expose this to the frozen syscall package, and it also doesn't need to be unsafe. So we move it into internal/syscall and have the generator make a safer function signature. Fixes #43704. Change-Id: Iccae69dc273a0aa97ee6846eb537f1dc1412f2de Reviewed-on: https://go-review.googlesource.com/c/go/+/283992 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Austin Clements Trust: Jason A. Donenfeld --- api/go1.16.txt | 2 -- src/crypto/rand/rand_windows.go | 4 ++-- src/internal/syscall/windows/syscall_windows.go | 2 ++ src/internal/syscall/windows/zsyscall_windows.go | 13 +++++++++++++ src/syscall/syscall_windows.go | 1 - src/syscall/zsyscall_windows.go | 9 --------- 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/api/go1.16.txt b/api/go1.16.txt index a4a034be06..6e1f8ca91d 100644 --- a/api/go1.16.txt +++ b/api/go1.16.txt @@ -430,10 +430,8 @@ pkg syscall (linux-arm-cgo), func AllThreadsSyscall(uintptr, uintptr, uintptr, u pkg syscall (linux-arm-cgo), func AllThreadsSyscall6(uintptr, uintptr, uintptr, uintptr, uintptr, uintptr, uintptr) (uintptr, uintptr, Errno) pkg syscall (linux-arm-cgo), func Setegid(int) error pkg syscall (linux-arm-cgo), func Seteuid(int) error -pkg syscall (windows-386), func RtlGenRandom(*uint8, uint32) error pkg syscall (windows-386), method (*DLLError) Unwrap() error pkg syscall (windows-386), type SysProcAttr struct, NoInheritHandles bool -pkg syscall (windows-amd64), func RtlGenRandom(*uint8, uint32) error pkg syscall (windows-amd64), method (*DLLError) Unwrap() error pkg syscall (windows-amd64), type SysProcAttr struct, NoInheritHandles bool pkg testing/fstest, func TestFS(fs.FS, ...string) error diff --git a/src/crypto/rand/rand_windows.go b/src/crypto/rand/rand_windows.go index 8b2c960906..7379f1489a 100644 --- a/src/crypto/rand/rand_windows.go +++ b/src/crypto/rand/rand_windows.go @@ -8,8 +8,8 @@ package rand import ( + "internal/syscall/windows" "os" - "syscall" ) func init() { Reader = &rngReader{} } @@ -24,7 +24,7 @@ func (r *rngReader) Read(b []byte) (n int, err error) { return 0, nil } - err = syscall.RtlGenRandom(&b[0], inputLen) + err = windows.RtlGenRandom(b) if err != nil { return 0, os.NewSyscallError("RtlGenRandom", err) } diff --git a/src/internal/syscall/windows/syscall_windows.go b/src/internal/syscall/windows/syscall_windows.go index 1f40c11820..f8965d0bab 100644 --- a/src/internal/syscall/windows/syscall_windows.go +++ b/src/internal/syscall/windows/syscall_windows.go @@ -342,3 +342,5 @@ func LoadGetFinalPathNameByHandle() error { //sys CreateEnvironmentBlock(block **uint16, token syscall.Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock //sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock + +//sys RtlGenRandom(buf []byte) (err error) = advapi32.SystemFunction036 diff --git a/src/internal/syscall/windows/zsyscall_windows.go b/src/internal/syscall/windows/zsyscall_windows.go index 170b239486..aaad4a5b94 100644 --- a/src/internal/syscall/windows/zsyscall_windows.go +++ b/src/internal/syscall/windows/zsyscall_windows.go @@ -52,6 +52,7 @@ var ( procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") procRevertToSelf = modadvapi32.NewProc("RevertToSelf") procSetTokenInformation = modadvapi32.NewProc("SetTokenInformation") + procSystemFunction036 = modadvapi32.NewProc("SystemFunction036") procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") procGetACP = modkernel32.NewProc("GetACP") procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") @@ -140,6 +141,18 @@ func SetTokenInformation(tokenHandle syscall.Token, tokenInformationClass uint32 return } +func RtlGenRandom(buf []byte) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall(procSystemFunction036.Addr(), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0) if r0 != 0 { diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go index c1a12ccba3..ba69133d81 100644 --- a/src/syscall/syscall_windows.go +++ b/src/syscall/syscall_windows.go @@ -234,7 +234,6 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW //sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext //sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom -//sys RtlGenRandom(buf *uint8, bytes uint32) (err error) = advapi32.SystemFunction036 //sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW //sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW //sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW diff --git a/src/syscall/zsyscall_windows.go b/src/syscall/zsyscall_windows.go index 86c4cac2ad..2166be595b 100644 --- a/src/syscall/zsyscall_windows.go +++ b/src/syscall/zsyscall_windows.go @@ -65,7 +65,6 @@ var ( procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") - procSystemFunction036 = modadvapi32.NewProc("SystemFunction036") procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore") procCertCloseStore = modcrypt32.NewProc("CertCloseStore") procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") @@ -333,14 +332,6 @@ func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32 return } -func RtlGenRandom(buf *uint8, bytes uint32) (err error) { - r1, _, e1 := Syscall(procSystemFunction036.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(bytes), 0) - if r1 == 0 { - err = errnoErr(e1) - } - return -} - func CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) { r1, _, e1 := Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0) if r1 == 0 { -- GitLab From b386c735e7582d08a938ce2bc582f931946854b4 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 13 Jan 2021 14:40:07 -0500 Subject: [PATCH 1642/1792] cmd/go: fix go generate docs The docs were never updated for the change to the placement of the DO NOT EDIT line. Also, the description of the DO NOT EDIT line interrupted the description of the //go:generate line, which made for some confusing references in the text that followed. Move it lower. Fixes #41196. Change-Id: I6af2a199fa98d45f5ccac7cdf7e9e54257699e61 Reviewed-on: https://go-review.googlesource.com/c/go/+/283633 Trust: Russ Cox Reviewed-by: Ian Lance Taylor --- src/cmd/go/alldocs.go | 18 +++++++++--------- src/cmd/go/internal/generate/generate.go | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index d884f7d5f3..0645780966 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -495,15 +495,6 @@ // (gofmt), a fully qualified path (/usr/you/bin/mytool), or a // command alias, described below. // -// To convey to humans and machine tools that code is generated, -// generated source should have a line that matches the following -// regular expression (in Go syntax): -// -// ^// Code generated .* DO NOT EDIT\.$ -// -// The line may appear anywhere in the file, but is typically -// placed near the beginning so it is easy to find. -// // Note that go generate does not parse the file, so lines that look // like directives in comments or multiline strings will be treated // as directives. @@ -515,6 +506,15 @@ // Quoted strings use Go syntax and are evaluated before execution; a // quoted string appears as a single argument to the generator. // +// To convey to humans and machine tools that code is generated, +// generated source should have a line that matches the following +// regular expression (in Go syntax): +// +// ^// Code generated .* DO NOT EDIT\.$ +// +// This line must appear before the first non-comment, non-blank +// text in the file. +// // Go generate sets several variables when it runs the generator: // // $GOARCH diff --git a/src/cmd/go/internal/generate/generate.go b/src/cmd/go/internal/generate/generate.go index c7401948b8..b1e001c800 100644 --- a/src/cmd/go/internal/generate/generate.go +++ b/src/cmd/go/internal/generate/generate.go @@ -52,15 +52,6 @@ that can be run locally. It must either be in the shell path (gofmt), a fully qualified path (/usr/you/bin/mytool), or a command alias, described below. -To convey to humans and machine tools that code is generated, -generated source should have a line that matches the following -regular expression (in Go syntax): - - ^// Code generated .* DO NOT EDIT\.$ - -The line may appear anywhere in the file, but is typically -placed near the beginning so it is easy to find. - Note that go generate does not parse the file, so lines that look like directives in comments or multiline strings will be treated as directives. @@ -72,6 +63,15 @@ arguments when it is run. Quoted strings use Go syntax and are evaluated before execution; a quoted string appears as a single argument to the generator. +To convey to humans and machine tools that code is generated, +generated source should have a line that matches the following +regular expression (in Go syntax): + + ^// Code generated .* DO NOT EDIT\.$ + +This line must appear before the first non-comment, non-blank +text in the file. + Go generate sets several variables when it runs the generator: $GOARCH -- GitLab From 54198b04dbdf424d8aec922c1f8870ce0e9b7332 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 8 Jan 2021 15:35:19 -0500 Subject: [PATCH 1643/1792] cmd/compile: disallow embed of var inside func Allowing embedding into []byte inside a func creates an unfortunate problem: either all calls start with the same underlying data and can see each other's changes to the underlying data (surprising and racy!) or all calls start by making their own copy of the underlying data (surprising and expensive!). After discussion on #43216, the consensus was to remove support for all vars embedded inside functions. Fixes #43216. Change-Id: I01e62b5f0dcd9e8566c6d2286218e97803f54704 Reviewed-on: https://go-review.googlesource.com/c/go/+/282714 Trust: Russ Cox Reviewed-by: Jay Conrod --- src/cmd/compile/internal/gc/embed.go | 9 ++---- src/embed/internal/embedtest/embed_test.go | 32 +++++++-------------- src/embed/internal/embedtest/embedx_test.go | 14 --------- 3 files changed, 13 insertions(+), 42 deletions(-) diff --git a/src/cmd/compile/internal/gc/embed.go b/src/cmd/compile/internal/gc/embed.go index 103949c1f9..6db246eece 100644 --- a/src/cmd/compile/internal/gc/embed.go +++ b/src/cmd/compile/internal/gc/embed.go @@ -133,13 +133,8 @@ func varEmbed(p *noder, names []*Node, typ *Node, exprs []*Node, embeds []Pragma v := names[0] if dclcontext != PEXTERN { - numLocalEmbed++ - v = newnamel(v.Pos, lookupN("embed.", numLocalEmbed)) - v.Sym.Def = asTypesNode(v) - v.Name.Param.Ntype = typ - v.SetClass(PEXTERN) - externdcl = append(externdcl, v) - exprs = []*Node{v} + p.yyerrorpos(pos, "go:embed cannot apply to var inside func") + return exprs } v.Name.Param.SetEmbedFiles(list) diff --git a/src/embed/internal/embedtest/embed_test.go b/src/embed/internal/embedtest/embed_test.go index c6a7bea7a3..40f65ffc3f 100644 --- a/src/embed/internal/embedtest/embed_test.go +++ b/src/embed/internal/embedtest/embed_test.go @@ -73,24 +73,11 @@ func TestGlobal(t *testing.T) { testString(t, string(glass), "glass", "I can eat glass and it doesn't hurt me.\n") } -func TestLocal(t *testing.T) { - //go:embed testdata/k*.txt - var local embed.FS - testFiles(t, local, "testdata/ken.txt", "If a program is too slow, it must have a loop.\n") - - //go:embed testdata/k*.txt - var s string - testString(t, s, "local variable s", "If a program is too slow, it must have a loop.\n") - - //go:embed testdata/h*.txt - var b []byte - testString(t, string(b), "local variable b", "hello, world\n") -} +//go:embed testdata +var testDirAll embed.FS func TestDir(t *testing.T) { - //go:embed testdata - var all embed.FS - + all := testDirAll testFiles(t, all, "testdata/hello.txt", "hello, world\n") testFiles(t, all, "testdata/i/i18n.txt", "internationalization\n") testFiles(t, all, "testdata/i/j/k/k8s.txt", "kubernetes\n") @@ -102,12 +89,15 @@ func TestDir(t *testing.T) { testDir(t, all, "testdata/i/j/k", "k8s.txt") } -func TestHidden(t *testing.T) { - //go:embed testdata - var dir embed.FS +//go:embed testdata +var testHiddenDir embed.FS - //go:embed testdata/* - var star embed.FS +//go:embed testdata/* +var testHiddenStar embed.FS + +func TestHidden(t *testing.T) { + dir := testHiddenDir + star := testHiddenStar t.Logf("//go:embed testdata") diff --git a/src/embed/internal/embedtest/embedx_test.go b/src/embed/internal/embedtest/embedx_test.go index 20d5a28c11..27fa11614e 100644 --- a/src/embed/internal/embedtest/embedx_test.go +++ b/src/embed/internal/embedtest/embedx_test.go @@ -90,17 +90,3 @@ func TestXGlobal(t *testing.T) { } bbig[0] = old } - -func TestXLocal(t *testing.T) { - //go:embed testdata/*o.txt - var local embed.FS - testFiles(t, local, "testdata/hello.txt", "hello, world\n") - - //go:embed testdata/k*.txt - var s string - testString(t, s, "local variable s", "If a program is too slow, it must have a loop.\n") - - //go:embed testdata/h*.txt - var b []byte - testString(t, string(b), "local variable b", "hello, world\n") -} -- GitLab From ec9470162f26819abd7b7bb86dd36cfe87f7f5bc Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 8 Jan 2021 14:27:00 -0500 Subject: [PATCH 1644/1792] cmd/compile: allow embed into any string or byte slice type The current implementation requires saying "string" or "[]byte" and disallows aliases, defined types, and even "[]uint8". This was not 100% intended and mostly just fell out of when the checks were being done in the implementation (too early, before typechecking). After discussion on #43217 (forked into #43602), the consensus was to allow all string and byte slice types, same as we do for string conversions in the language itself. This CL does that. It's more code than you'd expect because the decision has to be delayed until after typechecking. But it also more closely aligns with the version that's already on dev.regabi. Fixes #43602. Change-Id: Iba919cfadfbd5d7116f2bf47e2512fb1d5c36731 Reviewed-on: https://go-review.googlesource.com/c/go/+/282715 Trust: Russ Cox Reviewed-by: Jay Conrod --- src/cmd/compile/internal/gc/embed.go | 84 ++++++++++----------------- src/cmd/compile/internal/gc/noder.go | 2 +- src/cmd/compile/internal/gc/syntax.go | 21 ++++--- 3 files changed, 46 insertions(+), 61 deletions(-) diff --git a/src/cmd/compile/internal/gc/embed.go b/src/cmd/compile/internal/gc/embed.go index 6db246eece..1307780960 100644 --- a/src/cmd/compile/internal/gc/embed.go +++ b/src/cmd/compile/internal/gc/embed.go @@ -47,9 +47,7 @@ const ( embedFiles ) -var numLocalEmbed int - -func varEmbed(p *noder, names []*Node, typ *Node, exprs []*Node, embeds []PragmaEmbed) (newExprs []*Node) { +func varEmbed(p *noder, names []*Node, typ *Node, exprs []*Node, embeds []PragmaEmbed) { haveEmbed := false for _, decl := range p.file.DeclList { imp, ok := decl.(*syntax.ImportDecl) @@ -67,44 +65,52 @@ func varEmbed(p *noder, names []*Node, typ *Node, exprs []*Node, embeds []Pragma pos := embeds[0].Pos if !haveEmbed { p.yyerrorpos(pos, "invalid go:embed: missing import \"embed\"") - return exprs + return } if embedCfg.Patterns == nil { p.yyerrorpos(pos, "invalid go:embed: build system did not supply embed configuration") - return exprs + return } if len(names) > 1 { p.yyerrorpos(pos, "go:embed cannot apply to multiple vars") - return exprs + return } if len(exprs) > 0 { p.yyerrorpos(pos, "go:embed cannot apply to var with initializer") - return exprs + return } if typ == nil { // Should not happen, since len(exprs) == 0 now. p.yyerrorpos(pos, "go:embed cannot apply to var without type") - return exprs + return + } + if dclcontext != PEXTERN { + p.yyerrorpos(pos, "go:embed cannot apply to var inside func") + return } - kind := embedKindApprox(typ) - if kind == embedUnknown { - p.yyerrorpos(pos, "go:embed cannot apply to var of type %v", typ) - return exprs + var list []irEmbed + for _, e := range embeds { + list = append(list, irEmbed{Pos: p.makeXPos(e.Pos), Patterns: e.Patterns}) } + v := names[0] + v.Name.Param.SetEmbedList(list) + embedlist = append(embedlist, v) +} +func embedFileList(v *Node, kind int) []string { // Build list of files to store. have := make(map[string]bool) var list []string - for _, e := range embeds { + for _, e := range v.Name.Param.EmbedList() { for _, pattern := range e.Patterns { files, ok := embedCfg.Patterns[pattern] if !ok { - p.yyerrorpos(e.Pos, "invalid go:embed: build system did not map pattern: %s", pattern) + yyerrorl(e.Pos, "invalid go:embed: build system did not map pattern: %s", pattern) } for _, file := range files { if embedCfg.Files[file] == "" { - p.yyerrorpos(e.Pos, "invalid go:embed: build system did not map file: %s", file) + yyerrorl(e.Pos, "invalid go:embed: build system did not map file: %s", file) continue } if !have[file] { @@ -126,41 +132,12 @@ func varEmbed(p *noder, names []*Node, typ *Node, exprs []*Node, embeds []Pragma if kind == embedString || kind == embedBytes { if len(list) > 1 { - p.yyerrorpos(pos, "invalid go:embed: multiple files for type %v", typ) - return exprs + yyerrorl(v.Pos, "invalid go:embed: multiple files for type %v", v.Type) + return nil } } - v := names[0] - if dclcontext != PEXTERN { - p.yyerrorpos(pos, "go:embed cannot apply to var inside func") - return exprs - } - - v.Name.Param.SetEmbedFiles(list) - embedlist = append(embedlist, v) - return exprs -} - -// embedKindApprox determines the kind of embedding variable, approximately. -// The match is approximate because we haven't done scope resolution yet and -// can't tell whether "string" and "byte" really mean "string" and "byte". -// The result must be confirmed later, after type checking, using embedKind. -func embedKindApprox(typ *Node) int { - if typ.Sym != nil && typ.Sym.Name == "FS" && (typ.Sym.Pkg.Path == "embed" || (typ.Sym.Pkg == localpkg && myimportpath == "embed")) { - return embedFiles - } - // These are not guaranteed to match only string and []byte - - // maybe the local package has redefined one of those words. - // But it's the best we can do now during the noder. - // The stricter check happens later, in initEmbed calling embedKind. - if typ.Sym != nil && typ.Sym.Name == "string" && typ.Sym.Pkg == localpkg { - return embedString - } - if typ.Op == OTARRAY && typ.Left == nil && typ.Right.Sym != nil && typ.Right.Sym.Name == "byte" && typ.Right.Sym.Pkg == localpkg { - return embedBytes - } - return embedUnknown + return list } // embedKind determines the kind of embedding variable. @@ -168,10 +145,10 @@ func embedKind(typ *types.Type) int { if typ.Sym != nil && typ.Sym.Name == "FS" && (typ.Sym.Pkg.Path == "embed" || (typ.Sym.Pkg == localpkg && myimportpath == "embed")) { return embedFiles } - if typ == types.Types[TSTRING] { + if typ.Etype == types.TSTRING { return embedString } - if typ.Sym == nil && typ.IsSlice() && typ.Elem() == types.Bytetype { + if typ.Etype == types.TSLICE && typ.Elem().Etype == types.TUINT8 { return embedBytes } return embedUnknown @@ -209,11 +186,14 @@ func dumpembeds() { // initEmbed emits the init data for a //go:embed variable, // which is either a string, a []byte, or an embed.FS. func initEmbed(v *Node) { - files := v.Name.Param.EmbedFiles() - switch kind := embedKind(v.Type); kind { - case embedUnknown: + kind := embedKind(v.Type) + if kind == embedUnknown { yyerrorl(v.Pos, "go:embed cannot apply to var of type %v", v.Type) + return + } + files := embedFileList(v, kind) + switch kind { case embedString, embedBytes: file := files[0] fsym, size, err := fileStringSym(v.Pos, embedCfg.Files[file], kind == embedString, nil) diff --git a/src/cmd/compile/internal/gc/noder.go b/src/cmd/compile/internal/gc/noder.go index 67d24ef0bc..7494c3ef6b 100644 --- a/src/cmd/compile/internal/gc/noder.go +++ b/src/cmd/compile/internal/gc/noder.go @@ -397,7 +397,7 @@ func (p *noder) varDecl(decl *syntax.VarDecl) []*Node { p.yyerrorpos(e.Pos, "//go:embed only allowed in Go files that import \"embed\"") } } else { - exprs = varEmbed(p, names, typ, exprs, pragma.Embeds) + varEmbed(p, names, typ, exprs, pragma.Embeds) } pragma.Embeds = nil } diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index 43358333b8..7b4a315e05 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -499,7 +499,12 @@ type paramType struct { alias bool } -type embedFileList []string +type irEmbed struct { + Pos src.XPos + Patterns []string +} + +type embedList []irEmbed // Pragma returns the PragmaFlag for p, which must be for an OTYPE. func (p *Param) Pragma() PragmaFlag { @@ -547,28 +552,28 @@ func (p *Param) SetAlias(alias bool) { (*p.Extra).(*paramType).alias = alias } -// EmbedFiles returns the list of embedded files for p, +// EmbedList returns the list of embedded files for p, // which must be for an ONAME var. -func (p *Param) EmbedFiles() []string { +func (p *Param) EmbedList() []irEmbed { if p.Extra == nil { return nil } - return *(*p.Extra).(*embedFileList) + return *(*p.Extra).(*embedList) } -// SetEmbedFiles sets the list of embedded files for p, +// SetEmbedList sets the list of embedded files for p, // which must be for an ONAME var. -func (p *Param) SetEmbedFiles(list []string) { +func (p *Param) SetEmbedList(list []irEmbed) { if p.Extra == nil { if len(list) == 0 { return } - f := embedFileList(list) + f := embedList(list) p.Extra = new(interface{}) *p.Extra = &f return } - *(*p.Extra).(*embedFileList) = list + *(*p.Extra).(*embedList) = list } // Functions -- GitLab From 9f83418b83a43029ce8801ef10162dd94fdba81d Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Fri, 15 Jan 2021 13:19:31 -0500 Subject: [PATCH 1645/1792] cmd/link: remove GOROOT write in TestBuildForTvOS Tests should avoid writing to GOROOT when possible. Such writes would fail if GOROOT is non-writeable, and it can interfere with other tests that don't expect GOROOT to change during test execution. Updates #28387. Change-Id: I7d72614f218df3375540f5c2f9c9f8c11034f602 Reviewed-on: https://go-review.googlesource.com/c/go/+/284293 Trust: Dmitri Shuralyov Reviewed-by: Cherry Zhang Reviewed-by: Bryan C. Mills --- src/cmd/link/link_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 7eeb7ef568..8153c0b31b 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -320,6 +320,7 @@ func TestBuildForTvOS(t *testing.T) { } link := exec.Command(CC[0], CC[1:]...) + link.Args = append(link.Args, "-o", filepath.Join(tmpDir, "a.out")) // Avoid writing to package directory. link.Args = append(link.Args, ar, filepath.Join("testdata", "testBuildFortvOS", "main.m")) if out, err := link.CombinedOutput(); err != nil { t.Fatalf("%v: %v:\n%s", link.Args, err, out) -- GitLab From 682a1d2176b02337460aeede0ff9e49429525195 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 15 Jan 2021 16:29:00 +0100 Subject: [PATCH 1646/1792] runtime: detect errors in DuplicateHandle These functions rely on DuplicateHandle succeeding, but they don't check the return value, which might be masking subtle bugs that cause other problems down the line. Updates #43720. Change-Id: I77f0e6645affa534777ffc173144a52e4afa5f81 Reviewed-on: https://go-review.googlesource.com/c/go/+/284135 Run-TryBot: Jason A. Donenfeld Reviewed-by: Alex Brainman Reviewed-by: Austin Clements Trust: Alex Brainman Trust: Jason A. Donenfeld --- src/runtime/os_windows.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index d389d38ab9..16ff285e88 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -893,7 +893,10 @@ func sigblock(exiting bool) { // Called on the new thread, cannot allocate memory. func minit() { var thandle uintptr - stdcall7(_DuplicateHandle, currentProcess, currentThread, currentProcess, uintptr(unsafe.Pointer(&thandle)), 0, 0, _DUPLICATE_SAME_ACCESS) + if stdcall7(_DuplicateHandle, currentProcess, currentThread, currentProcess, uintptr(unsafe.Pointer(&thandle)), 0, 0, _DUPLICATE_SAME_ACCESS) == 0 { + print("runtime.minit: duplicatehandle failed; errno=", getlasterror(), "\n") + throw("runtime.minit: duplicatehandle failed") + } // Configure usleep timer, if possible. var timer uintptr @@ -1134,8 +1137,12 @@ func profileloop1(param uintptr) uint32 { } // Acquire our own handle to the thread. var thread uintptr - stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) + if stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) == 0 { + print("runtime.profileloop1: duplicatehandle failed; errno=", getlasterror(), "\n") + throw("runtime.profileloop1: duplicatehandle failed") + } unlock(&mp.threadLock) + // mp may exit between the DuplicateHandle // above and the SuspendThread. The handle // will remain valid, but SuspendThread may @@ -1214,7 +1221,10 @@ func preemptM(mp *m) { return } var thread uintptr - stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) + if stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) == 0 { + print("runtime.preemptM: duplicatehandle failed; errno=", getlasterror(), "\n") + throw("runtime.preemptM: duplicatehandle failed") + } unlock(&mp.threadLock) // Prepare thread context buffer. This must be aligned to 16 bytes. -- GitLab From 5a8fbb0d2d339fa87a02c0794f5a92c1ce121631 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 18 Jan 2021 13:31:28 +0100 Subject: [PATCH 1647/1792] os: do not close syscall.Stdin in TestReadStdin By calling NewConsoleFile on syscall.Stdin, we wind up closing it when the function returns, which causes errors when all the tests are run in a loop. To fix this, we instead create a duplicate handle of stdin. Fixes #43720. Change-Id: Ie6426e6306c7e1e39601794f4ff48bbf2fe67502 Reviewed-on: https://go-review.googlesource.com/c/go/+/284140 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Jason A. Donenfeld --- src/os/os_windows_test.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/os/os_windows_test.go b/src/os/os_windows_test.go index 8d1d1f61b2..b0929b4f30 100644 --- a/src/os/os_windows_test.go +++ b/src/os/os_windows_test.go @@ -692,7 +692,16 @@ func TestReadStdin(t *testing.T) { poll.ReadConsole = old }() - testConsole := os.NewConsoleFile(syscall.Stdin, "test") + p, err := syscall.GetCurrentProcess() + if err != nil { + t.Fatalf("Unable to get handle to current process: %v", err) + } + var stdinDuplicate syscall.Handle + err = syscall.DuplicateHandle(p, syscall.Handle(syscall.Stdin), p, &stdinDuplicate, 0, false, syscall.DUPLICATE_SAME_ACCESS) + if err != nil { + t.Fatalf("Unable to duplicate stdin: %v", err) + } + testConsole := os.NewConsoleFile(stdinDuplicate, "test") var tests = []string{ "abc", -- GitLab From dbab07983596c705d2ef12806e0f9d630063e571 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 15 Jan 2021 13:01:37 +0100 Subject: [PATCH 1648/1792] runtime: free Windows event handles after last lock is dropped Calls to lock may need to use global members of mOS that also need to be cleaned up before the thread exits. Before this commit, these resources would leak. Moving them to be cleaned up in unminit, however, would race with gstack on unix. So this creates a new helper, mdestroy, to release resources that must be destroyed only after locks are no longer required. We also move highResTimer lifetime to the same semantics, since it doesn't help to constantly acquire and release the timer object during dropm. Updates #43720. Change-Id: Ib3f598f3fda1b2bbcb608099616fa4f85bc1c289 Reviewed-on: https://go-review.googlesource.com/c/go/+/284137 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Reviewed-by: Austin Clements Trust: Alex Brainman Trust: Jason A. Donenfeld --- src/runtime/os3_solaris.go | 5 +++++ src/runtime/os_aix.go | 5 +++++ src/runtime/os_darwin.go | 5 +++++ src/runtime/os_dragonfly.go | 5 +++++ src/runtime/os_freebsd.go | 5 +++++ src/runtime/os_js.go | 5 +++++ src/runtime/os_linux.go | 5 +++++ src/runtime/os_netbsd.go | 5 +++++ src/runtime/os_openbsd.go | 5 +++++ src/runtime/os_plan9.go | 5 +++++ src/runtime/os_windows.go | 38 +++++++++++++++++++++++++------------ src/runtime/proc.go | 4 ++++ 12 files changed, 80 insertions(+), 12 deletions(-) diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go index d6e36fbfbb..6ba11afd93 100644 --- a/src/runtime/os3_solaris.go +++ b/src/runtime/os3_solaris.go @@ -227,6 +227,11 @@ func unminit() { unminitSignals() } +// 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 sigtramp() //go:nosplit diff --git a/src/runtime/os_aix.go b/src/runtime/os_aix.go index 0c501be96a..303f0876de 100644 --- a/src/runtime/os_aix.go +++ b/src/runtime/os_aix.go @@ -180,6 +180,11 @@ func unminit() { unminitSignals() } +// 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) { +} + // tstart is a function descriptor to _tstart defined in assembly. var tstart funcDescriptor diff --git a/src/runtime/os_darwin.go b/src/runtime/os_darwin.go index e0a43c28aa..9ca17c20df 100644 --- a/src/runtime/os_darwin.go +++ b/src/runtime/os_darwin.go @@ -325,6 +325,11 @@ 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) { +} + //go:nosplit func osyield() { usleep(1) diff --git a/src/runtime/os_dragonfly.go b/src/runtime/os_dragonfly.go index 6578fcbeb1..383df54bd4 100644 --- a/src/runtime/os_dragonfly.go +++ b/src/runtime/os_dragonfly.go @@ -203,6 +203,11 @@ func unminit() { unminitSignals() } +// 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 sigtramp() type sigactiont struct { diff --git a/src/runtime/os_freebsd.go b/src/runtime/os_freebsd.go index 1c60ee2a57..09065ccb68 100644 --- a/src/runtime/os_freebsd.go +++ b/src/runtime/os_freebsd.go @@ -319,6 +319,11 @@ func unminit() { unminitSignals() } +// 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 sigtramp() type sigactiont struct { diff --git a/src/runtime/os_js.go b/src/runtime/os_js.go index 91d18a078f..24261e88a2 100644 --- a/src/runtime/os_js.go +++ b/src/runtime/os_js.go @@ -84,6 +84,11 @@ func 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 diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index f122d2c2ef..058c7daf9c 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -375,6 +375,11 @@ func unminit() { unminitSignals() } +// 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) { +} + //#ifdef GOARCH_386 //#define sa_handler k_sa_handler //#endif diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index f7f90cedc1..2b742a3711 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -290,6 +290,11 @@ func unminit() { unminitSignals() } +// 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 sigtramp() type sigactiont struct { diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index d7960f4c91..490077bc29 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -257,6 +257,11 @@ func unminit() { unminitSignals() } +// 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 sigtramp() type sigactiont struct { diff --git a/src/runtime/os_plan9.go b/src/runtime/os_plan9.go index a035526937..2a84a73716 100644 --- a/src/runtime/os_plan9.go +++ b/src/runtime/os_plan9.go @@ -213,6 +213,11 @@ func 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) { +} + var sysstat = []byte("/dev/sysstat\x00") func getproccount() int32 { diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index 16ff285e88..83d0d63e5d 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -898,20 +898,18 @@ func minit() { throw("runtime.minit: duplicatehandle failed") } + mp := getg().m + lock(&mp.threadLock) + mp.thread = thandle + // Configure usleep timer, if possible. - var timer uintptr - if haveHighResTimer { - timer = createHighResTimer() - if timer == 0 { + if mp.highResTimer == 0 && haveHighResTimer { + mp.highResTimer = createHighResTimer() + if mp.highResTimer == 0 { print("runtime: CreateWaitableTimerEx failed; errno=", getlasterror(), "\n") throw("CreateWaitableTimerEx when creating timer failed") } } - - mp := getg().m - lock(&mp.threadLock) - mp.thread = thandle - mp.highResTimer = timer unlock(&mp.threadLock) // Query the true stack base from the OS. Currently we're @@ -947,13 +945,29 @@ func minit() { func unminit() { mp := getg().m lock(&mp.threadLock) - stdcall1(_CloseHandle, mp.thread) - mp.thread = 0 + if mp.thread != 0 { + stdcall1(_CloseHandle, mp.thread) + mp.thread = 0 + } + unlock(&mp.threadLock) +} + +// 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. +//go:nosplit +func mdestroy(mp *m) { if mp.highResTimer != 0 { stdcall1(_CloseHandle, mp.highResTimer) mp.highResTimer = 0 } - unlock(&mp.threadLock) + if mp.waitsema != 0 { + stdcall1(_CloseHandle, mp.waitsema) + mp.waitsema = 0 + } + if mp.resumesema != 0 { + stdcall1(_CloseHandle, mp.resumesema) + mp.resumesema = 0 + } } // Calling stdcall on os stack. diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 5a942a6831..b776f88936 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1407,6 +1407,10 @@ found: } } + // Destroy all allocated resources. After this is called, we may no + // longer take any locks. + mdestroy(m) + if osStack { // Return from mstart and let the system thread // library free the g0 stack and terminate the thread. -- GitLab From 9fed39d2814073a9389a614342f603bab9963bff Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Mon, 24 Aug 2020 18:04:13 +1000 Subject: [PATCH 1649/1792] runtime: factor out mStackIsSystemAllocated Rather than repeat long lists of GOOS values, factor out the code that checks if a runtime starts on a system allocated stack. Note that this adds aix to one case, which appears to have been previously missed. Change-Id: I5cecb0bb47dd79cde8d723e5a42ba541e43cbfff Reviewed-on: https://go-review.googlesource.com/c/go/+/250179 Trust: Joel Sing Reviewed-by: Cherry Zhang Run-TryBot: Joel Sing TryBot-Result: Go Bot --- src/runtime/proc.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index b776f88936..477152d899 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1206,6 +1206,16 @@ func startTheWorldWithSema(emitTraceEvent bool) int64 { return startTime } +// mStackIsSystemAllocated indicates whether this runtime starts on a +// system-allocated stack. +func mStackIsSystemAllocated() bool { + switch GOOS { + case "aix", "darwin", "plan9", "illumos", "ios", "solaris", "windows": + return true + } + return false +} + // mstart is the entry-point for new Ms. // // This must not split the stack because we may not even have stack @@ -1240,8 +1250,7 @@ func mstart() { mstart1() // Exit this thread. - switch GOOS { - case "windows", "solaris", "illumos", "plan9", "darwin", "ios", "aix": + if mStackIsSystemAllocated() { // Windows, Solaris, illumos, Darwin, AIX and Plan 9 always system-allocate // the stack, but put it in _g_.stack before mstart, // so the logic above hasn't set osStack yet. @@ -1724,7 +1733,7 @@ func allocm(_p_ *p, fn func(), id int64) *m { // In case of cgo or Solaris or illumos or Darwin, pthread_create will make us a stack. // Windows and Plan 9 will layout sched stack on OS stack. - if iscgo || GOOS == "solaris" || GOOS == "illumos" || GOOS == "windows" || GOOS == "plan9" || GOOS == "darwin" || GOOS == "ios" { + if iscgo || mStackIsSystemAllocated() { mp.g0 = malg(-1) } else { mp.g0 = malg(8192 * sys.StackGuardMultiplier) -- GitLab From 61debffd977889cd3f7f63b4f71d5a8ef1fc604e Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Sun, 4 Oct 2020 01:44:41 +1000 Subject: [PATCH 1650/1792] runtime: factor out usesLibcall Rather than inline lists of GOOS values, factor out the code that checks if a runtime makes system calls via libcall. Change-Id: Ib19d7e63a2b4b8314f1841c0ff26e1b3a16b4b22 Reviewed-on: https://go-review.googlesource.com/c/go/+/259239 Trust: Joel Sing Reviewed-by: Cherry Zhang Run-TryBot: Joel Sing TryBot-Result: Go Bot --- src/runtime/proc.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 477152d899..46aa3b04a5 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1206,6 +1206,16 @@ func startTheWorldWithSema(emitTraceEvent bool) int64 { return startTime } +// usesLibcall indicates whether this runtime performs system calls +// via libcall. +func usesLibcall() bool { + switch GOOS { + case "aix", "darwin", "illumos", "ios", "solaris", "windows": + return true + } + return false +} + // mStackIsSystemAllocated indicates whether this runtime starts on a // system-allocated stack. func mStackIsSystemAllocated() bool { @@ -4481,7 +4491,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) { // Normal traceback is impossible or has failed. // See if it falls into several common cases. n = 0 - if (GOOS == "windows" || GOOS == "solaris" || GOOS == "illumos" || GOOS == "darwin" || GOOS == "ios" || GOOS == "aix") && mp.libcallg != 0 && mp.libcallpc != 0 && mp.libcallsp != 0 { + 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[0], len(stk), nil, nil, 0) -- GitLab From d047c91a6c0f22af00d1c1e770a9d85201392656 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Mon, 24 Aug 2020 03:13:54 +1000 Subject: [PATCH 1651/1792] cmd/link,runtime: switch openbsd/amd64 to pthreads This switches openbsd/amd64 to thread creation via pthreads, rather than doing direct system calls. Update #36435 Change-Id: I1105d5c392aa3e4c445d99c8cb80b927712e3529 Reviewed-on: https://go-review.googlesource.com/c/go/+/250180 Trust: Joel Sing Run-TryBot: Joel Sing TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/data.go | 4 +- src/cmd/link/internal/ld/lib.go | 1 + src/cmd/link/internal/ld/main.go | 8 ++ src/runtime/asm_amd64.s | 4 + src/runtime/defs_openbsd.go | 9 ++ src/runtime/defs_openbsd_amd64.go | 9 ++ src/runtime/os_openbsd.go | 34 ----- src/runtime/os_openbsd_libc.go | 58 ++++++++ src/runtime/os_openbsd_syscall.go | 45 ++++++ src/runtime/proc.go | 5 + src/runtime/sys_darwin.go | 44 ------ src/runtime/sys_libc.go | 53 +++++++ src/runtime/sys_openbsd.go | 77 ++++++++++ src/runtime/sys_openbsd_amd64.s | 229 +++++++++++++++++++----------- 14 files changed, 418 insertions(+), 162 deletions(-) create mode 100644 src/runtime/os_openbsd_libc.go create mode 100644 src/runtime/os_openbsd_syscall.go create mode 100644 src/runtime/sys_libc.go create mode 100644 src/runtime/sys_openbsd.go diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 3c5091e6a0..6013e0ab0a 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -206,8 +206,8 @@ func (st *relocSymState) relocsym(s loader.Sym, P []byte) { } // We need to be able to reference dynimport symbols when linking against - // shared libraries, and Solaris, Darwin and AIX need it always - if !target.IsSolaris() && !target.IsDarwin() && !target.IsAIX() && rs != 0 && rst == sym.SDYNIMPORT && !target.IsDynlinkingGo() && !ldr.AttrSubSymbol(rs) { + // shared libraries, and AIX, Darwin, OpenBSD and Solaris always need it. + if !target.IsAIX() && !target.IsDarwin() && !target.IsSolaris() && !target.IsOpenbsd() && rs != 0 && rst == sym.SDYNIMPORT && !target.IsDynlinkingGo() && !ldr.AttrSubSymbol(rs) { if !(target.IsPPC64() && target.IsExternal() && ldr.SymName(rs) == ".TOC.") { st.err.Errorf(s, "unhandled relocation for %s (type %d (%s) rtype %d (%s))", ldr.SymName(rs), rst, rst, rt, sym.RelocName(target.Arch, rt)) } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index dd5e8ab2c5..014969664b 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1273,6 +1273,7 @@ func (ctxt *Link) hostlink() { } case objabi.Hopenbsd: argv = append(argv, "-Wl,-nopie") + argv = append(argv, "-pthread") case objabi.Hwindows: if windowsgui { argv = append(argv, "-mwindows") diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 5c8293810f..64f52bc52f 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -183,6 +183,14 @@ func Main(arch *sys.Arch, theArch Arch) { interpreter = *flagInterpreter + if *flagBuildid == "" && ctxt.Target.IsOpenbsd() { + // TODO(jsing): Remove once direct syscalls are no longer in use. + // OpenBSD 6.7 onwards will not permit direct syscalls from a + // dynamically linked binary unless it identifies the binary + // contains a .note.go.buildid ELF note. See issue #36435. + *flagBuildid = "go-openbsd" + } + // enable benchmarking var bench *benchmark.Metrics if len(*benchmarkFlag) != 0 { diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s index 196252e1dd..4ac87089f2 100644 --- a/src/runtime/asm_amd64.s +++ b/src/runtime/asm_amd64.s @@ -181,6 +181,10 @@ needtls: // skip TLS setup on Darwin JMP ok #endif +#ifdef GOOS_openbsd + // skip TLS setup on OpenBSD + JMP ok +#endif LEAQ runtime·m0+m_tls(SB), DI CALL runtime·settls(SB) diff --git a/src/runtime/defs_openbsd.go b/src/runtime/defs_openbsd.go index 53e9d59a3c..57717abf7e 100644 --- a/src/runtime/defs_openbsd.go +++ b/src/runtime/defs_openbsd.go @@ -54,6 +54,8 @@ const ( SA_RESTART = C.SA_RESTART SA_ONSTACK = C.SA_ONSTACK + PTHREAD_CREATE_DETACHED = C.PTHREAD_CREATE_DETACHED + SIGHUP = C.SIGHUP SIGINT = C.SIGINT SIGQUIT = C.SIGQUIT @@ -129,3 +131,10 @@ type Timeval C.struct_timeval type Itimerval C.struct_itimerval type KeventT C.struct_kevent + +type Pthread C.pthread_t +type PthreadAttr C.pthread_attr_t +type PthreadCond C.pthread_cond_t +type PthreadCondAttr C.pthread_condattr_t +type PthreadMutex C.pthread_mutex_t +type PthreadMutexAttr C.pthread_mutexattr_t diff --git a/src/runtime/defs_openbsd_amd64.go b/src/runtime/defs_openbsd_amd64.go index c187a98ae0..01ca934cea 100644 --- a/src/runtime/defs_openbsd_amd64.go +++ b/src/runtime/defs_openbsd_amd64.go @@ -30,6 +30,8 @@ const ( _SA_RESTART = 0x2 _SA_ONSTACK = 0x1 + _PTHREAD_CREATE_DETACHED = 0x1 + _SIGHUP = 0x1 _SIGINT = 0x2 _SIGQUIT = 0x3 @@ -177,3 +179,10 @@ type keventt struct { data int64 udata *byte } + +type pthread uintptr +type pthreadattr uintptr +type pthreadcond uintptr +type pthreadcondattr uintptr +type pthreadmutex uintptr +type pthreadmutexattr uintptr diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 490077bc29..61be627c27 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -6,7 +6,6 @@ package runtime import ( "runtime/internal/atomic" - "runtime/internal/sys" "unsafe" ) @@ -47,9 +46,6 @@ func raiseproc(sig uint32) func getthrid() int32 func thrkill(tid int32, sig int) -//go:noescape -func tfork(param *tforkt, psize uintptr, mm *m, gg *g, fn uintptr) int32 - //go:noescape func thrsleep(ident uintptr, clock_id int32, tsp *timespec, lock uintptr, abort *uint32) int32 @@ -183,36 +179,6 @@ func semawakeup(mp *m) { } } -// May run with m.p==nil, so write barriers are not allowed. -//go:nowritebarrier -func newosproc(mp *m) { - stk := unsafe.Pointer(mp.g0.stack.hi) - if false { - print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n") - } - - // Stack pointer must point inside stack area (as marked with MAP_STACK), - // rather than at the top of it. - param := tforkt{ - tf_tcb: unsafe.Pointer(&mp.tls[0]), - tf_tid: nil, // minit will record tid - tf_stack: uintptr(stk) - sys.PtrSize, - } - - var oset sigset - sigprocmask(_SIG_SETMASK, &sigset_all, &oset) - ret := tfork(¶m, unsafe.Sizeof(param), mp, mp.g0, funcPC(mstart)) - sigprocmask(_SIG_SETMASK, &oset, nil) - - if ret < 0 { - print("runtime: failed to create new OS thread (have ", mcount()-1, " already; errno=", -ret, ")\n") - if ret == -_EAGAIN { - println("runtime: may need to increase max user processes (ulimit -p)") - } - throw("runtime.newosproc") - } -} - func osinit() { ncpu = getncpu() physPageSize = getPageSize() diff --git a/src/runtime/os_openbsd_libc.go b/src/runtime/os_openbsd_libc.go new file mode 100644 index 0000000000..60735644f0 --- /dev/null +++ b/src/runtime/os_openbsd_libc.go @@ -0,0 +1,58 @@ +// 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 openbsd,amd64 + +package runtime + +import ( + "unsafe" +) + +var failThreadCreate = []byte("runtime: failed to create new OS thread\n") + +// mstart_stub provides glue code to call mstart from pthread_create. +func mstart_stub() + +// May run with m.p==nil, so write barriers are not allowed. +//go:nowritebarrierrec +func newosproc(mp *m) { + if false { + print("newosproc m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n") + } + + // Initialize an attribute object. + var attr pthreadattr + if err := pthread_attr_init(&attr); err != 0 { + write(2, unsafe.Pointer(&failThreadCreate[0]), int32(len(failThreadCreate))) + exit(1) + } + + // Find out OS stack size for our own stack guard. + var stacksize uintptr + if pthread_attr_getstacksize(&attr, &stacksize) != 0 { + write(2, unsafe.Pointer(&failThreadCreate[0]), int32(len(failThreadCreate))) + exit(1) + } + mp.g0.stack.hi = stacksize // for mstart + + // Tell the pthread library we won't join with this thread. + if pthread_attr_setdetachstate(&attr, _PTHREAD_CREATE_DETACHED) != 0 { + write(2, unsafe.Pointer(&failThreadCreate[0]), int32(len(failThreadCreate))) + exit(1) + } + + // Finally, create the thread. It starts at mstart_stub, which does some low-level + // setup and then calls mstart. + var oset sigset + sigprocmask(_SIG_SETMASK, &sigset_all, &oset) + err := pthread_create(&attr, funcPC(mstart_stub), unsafe.Pointer(mp)) + sigprocmask(_SIG_SETMASK, &oset, nil) + if err != 0 { + write(2, unsafe.Pointer(&failThreadCreate[0]), int32(len(failThreadCreate))) + exit(1) + } + + pthread_attr_destroy(&attr) +} diff --git a/src/runtime/os_openbsd_syscall.go b/src/runtime/os_openbsd_syscall.go new file mode 100644 index 0000000000..e91a97ca8e --- /dev/null +++ b/src/runtime/os_openbsd_syscall.go @@ -0,0 +1,45 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build openbsd,!amd64 + +package runtime + +import ( + "runtime/internal/sys" + "unsafe" +) + +//go:noescape +func tfork(param *tforkt, psize uintptr, mm *m, gg *g, fn uintptr) int32 + +// May run with m.p==nil, so write barriers are not allowed. +//go:nowritebarrier +func newosproc(mp *m) { + stk := unsafe.Pointer(mp.g0.stack.hi) + if false { + print("newosproc stk=", stk, " m=", mp, " g=", mp.g0, " id=", mp.id, " ostk=", &mp, "\n") + } + + // Stack pointer must point inside stack area (as marked with MAP_STACK), + // rather than at the top of it. + param := tforkt{ + tf_tcb: unsafe.Pointer(&mp.tls[0]), + tf_tid: nil, // minit will record tid + tf_stack: uintptr(stk) - sys.PtrSize, + } + + var oset sigset + sigprocmask(_SIG_SETMASK, &sigset_all, &oset) + ret := tfork(¶m, unsafe.Sizeof(param), mp, mp.g0, funcPC(mstart)) + sigprocmask(_SIG_SETMASK, &oset, nil) + + if ret < 0 { + print("runtime: failed to create new OS thread (have ", mcount()-1, " already; errno=", -ret, ")\n") + if ret == -_EAGAIN { + println("runtime: may need to increase max user processes (ulimit -p)") + } + throw("runtime.newosproc") + } +} diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 46aa3b04a5..26cf7c7335 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1222,6 +1222,11 @@ func mStackIsSystemAllocated() bool { switch GOOS { case "aix", "darwin", "plan9", "illumos", "ios", "solaris", "windows": return true + case "openbsd": + switch GOARCH { + case "amd64": + return true + } } return false } diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go index 55845bf2e5..4a3f2fc453 100644 --- a/src/runtime/sys_darwin.go +++ b/src/runtime/sys_darwin.go @@ -6,50 +6,6 @@ package runtime import "unsafe" -// Call fn with arg as its argument. Return what fn returns. -// fn is the raw pc value of the entry point of the desired function. -// Switches to the system stack, if not already there. -// Preserves the calling point as the location where a profiler traceback will begin. -//go:nosplit -func libcCall(fn, arg unsafe.Pointer) int32 { - // Leave caller's PC/SP/G around for traceback. - gp := getg() - var mp *m - if gp != nil { - mp = gp.m - } - if mp != nil && mp.libcallsp == 0 { - mp.libcallg.set(gp) - mp.libcallpc = getcallerpc() - // sp must be the last, because once async cpu profiler finds - // all three values to be non-zero, it will use them - mp.libcallsp = getcallersp() - } else { - // Make sure we don't reset libcallsp. This makes - // libcCall reentrant; We remember the g/pc/sp for the - // first call on an M, until that libcCall instance - // returns. Reentrance only matters for signals, as - // libc never calls back into Go. The tricky case is - // where we call libcX from an M and record g/pc/sp. - // Before that call returns, a signal arrives on the - // same M and the signal handling code calls another - // libc function. We don't want that second libcCall - // from within the handler to be recorded, and we - // don't want that call's completion to zero - // libcallsp. - // We don't need to set libcall* while we're in a sighandler - // (even if we're not currently in libc) because we block all - // signals while we're handling a signal. That includes the - // profile signal, which is the one that uses the libcall* info. - mp = nil - } - res := asmcgocall(fn, arg) - if mp != nil { - mp.libcallsp = 0 - } - return res -} - // The X versions of syscall expect the libc call to return a 64-bit result. // Otherwise (the non-X version) expects a 32-bit result. // This distinction is required because an error is indicated by returning -1, diff --git a/src/runtime/sys_libc.go b/src/runtime/sys_libc.go new file mode 100644 index 0000000000..c97a97d77b --- /dev/null +++ b/src/runtime/sys_libc.go @@ -0,0 +1,53 @@ +// 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 openbsd,amd64 + +package runtime + +import "unsafe" + +// Call fn with arg as its argument. Return what fn returns. +// fn is the raw pc value of the entry point of the desired function. +// Switches to the system stack, if not already there. +// Preserves the calling point as the location where a profiler traceback will begin. +//go:nosplit +func libcCall(fn, arg unsafe.Pointer) int32 { + // Leave caller's PC/SP/G around for traceback. + gp := getg() + var mp *m + if gp != nil { + mp = gp.m + } + if mp != nil && mp.libcallsp == 0 { + mp.libcallg.set(gp) + mp.libcallpc = getcallerpc() + // sp must be the last, because once async cpu profiler finds + // all three values to be non-zero, it will use them + mp.libcallsp = getcallersp() + } else { + // Make sure we don't reset libcallsp. This makes + // libcCall reentrant; We remember the g/pc/sp for the + // first call on an M, until that libcCall instance + // returns. Reentrance only matters for signals, as + // libc never calls back into Go. The tricky case is + // where we call libcX from an M and record g/pc/sp. + // Before that call returns, a signal arrives on the + // same M and the signal handling code calls another + // libc function. We don't want that second libcCall + // from within the handler to be recorded, and we + // don't want that call's completion to zero + // libcallsp. + // We don't need to set libcall* while we're in a sighandler + // (even if we're not currently in libc) because we block all + // signals while we're handling a signal. That includes the + // profile signal, which is the one that uses the libcall* info. + mp = nil + } + res := asmcgocall(fn, arg) + if mp != nil { + mp.libcallsp = 0 + } + return res +} diff --git a/src/runtime/sys_openbsd.go b/src/runtime/sys_openbsd.go new file mode 100644 index 0000000000..4dfab7d7b0 --- /dev/null +++ b/src/runtime/sys_openbsd.go @@ -0,0 +1,77 @@ +// 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 openbsd,amd64 + +package runtime + +import "unsafe" + +// The *_trampoline functions convert from the Go calling convention to the C calling convention +// and then call the underlying libc function. These are defined in sys_openbsd_$ARCH.s. + +//go:nosplit +//go:cgo_unsafe_args +func pthread_attr_init(attr *pthreadattr) int32 { + return libcCall(unsafe.Pointer(funcPC(pthread_attr_init_trampoline)), unsafe.Pointer(&attr)) +} +func pthread_attr_init_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func pthread_attr_destroy(attr *pthreadattr) int32 { + return libcCall(unsafe.Pointer(funcPC(pthread_attr_destroy_trampoline)), unsafe.Pointer(&attr)) +} +func pthread_attr_destroy_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func pthread_attr_getstacksize(attr *pthreadattr, size *uintptr) int32 { + return libcCall(unsafe.Pointer(funcPC(pthread_attr_getstacksize_trampoline)), unsafe.Pointer(&attr)) +} +func pthread_attr_getstacksize_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func pthread_attr_setdetachstate(attr *pthreadattr, state int) int32 { + return libcCall(unsafe.Pointer(funcPC(pthread_attr_setdetachstate_trampoline)), unsafe.Pointer(&attr)) +} +func pthread_attr_setdetachstate_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func pthread_create(attr *pthreadattr, start uintptr, arg unsafe.Pointer) int32 { + return libcCall(unsafe.Pointer(funcPC(pthread_create_trampoline)), unsafe.Pointer(&attr)) +} +func pthread_create_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func pthread_self() (t pthread) { + libcCall(unsafe.Pointer(funcPC(pthread_self_trampoline)), unsafe.Pointer(&t)) + return +} +func pthread_self_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func pthread_kill(t pthread, sig uint32) { + libcCall(unsafe.Pointer(funcPC(pthread_kill_trampoline)), unsafe.Pointer(&t)) +} +func pthread_kill_trampoline() + +// Tell the linker that the libc_* functions are to be found +// in a system library, with the libc_ prefix missing. + +//go:cgo_import_dynamic libc_pthread_attr_init pthread_attr_init "libpthread.so" +//go:cgo_import_dynamic libc_pthread_attr_destroy pthread_attr_destroy "libpthread.so" +//go:cgo_import_dynamic libc_pthread_attr_getstacksize pthread_attr_getstacksize "libpthread.so" +//go:cgo_import_dynamic libc_pthread_attr_setdetachstate pthread_attr_setdetachstate "libpthread.so" +//go:cgo_import_dynamic libc_pthread_create pthread_create "libpthread.so" +//go:cgo_import_dynamic libc_pthread_sigmask pthread_sigmask "libpthread.so" +//go:cgo_import_dynamic libc_pthread_self pthread_self "libpthread.so" +//go:cgo_import_dynamic libc_pthread_kill pthread_kill "libpthread.so" + +//go:cgo_import_dynamic _ _ "libpthread.so" +//go:cgo_import_dynamic _ _ "libc.so" diff --git a/src/runtime/sys_openbsd_amd64.s b/src/runtime/sys_openbsd_amd64.s index 37d70ab9aa..455234d7cd 100644 --- a/src/runtime/sys_openbsd_amd64.s +++ b/src/runtime/sys_openbsd_amd64.s @@ -2,8 +2,10 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // -// System calls and other sys.stuff for AMD64, OpenBSD -// /usr/src/sys/kern/syscalls.master for syscall numbers. +// System calls and other sys.stuff for AMD64, OpenBSD. +// System calls are implemented in libc/libpthread, this file +// contains trampolines that convert from Go to C calling convention. +// Some direct system call implementations currently remain. // #include "go_asm.h" @@ -12,49 +14,159 @@ #define CLOCK_MONOTONIC $3 -// int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void)); -TEXT runtime·tfork(SB),NOSPLIT,$32 +TEXT runtime·settls(SB),NOSPLIT,$0 + // Nothing to do, pthread already set thread-local storage up. + RET - // Copy mp, gp and fn off parent stack for use by child. - MOVQ mm+16(FP), R8 - MOVQ gg+24(FP), R9 - MOVQ fn+32(FP), R12 +// 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 + // DI points to the m. + // We are already on m's g0 stack. - MOVQ param+0(FP), DI - MOVQ psize+8(FP), SI - MOVL $8, AX // sys___tfork - SYSCALL + // Save callee-save registers. + SUBQ $48, SP + MOVQ BX, 0(SP) + MOVQ BP, 8(SP) + MOVQ R12, 16(SP) + MOVQ R13, 24(SP) + MOVQ R14, 32(SP) + MOVQ R15, 40(SP) - // Return if tfork syscall failed. - JCC 4(PC) - NEGQ AX - MOVL AX, ret+40(FP) + // Load g and save to TLS entry. + // See cmd/link/internal/ld/sym.go:computeTLSOffset. + MOVQ m_g0(DI), DX // g + MOVQ DX, -8(FS) + + // Someday the convention will be D is always cleared. + CLD + + CALL runtime·mstart(SB) + + // Restore callee-save registers. + MOVQ 0(SP), BX + MOVQ 8(SP), BP + MOVQ 16(SP), R12 + MOVQ 24(SP), R13 + MOVQ 32(SP), R14 + MOVQ 40(SP), R15 + + // Go is all done with this OS thread. + // Tell pthread everything is ok (we never join with this thread, so + // the value here doesn't really matter). + XORL AX, AX + + ADDQ $48, SP RET - // In parent, return. - CMPL AX, $0 - JEQ 3(PC) - MOVL AX, ret+40(FP) +TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 + MOVQ fn+0(FP), AX + 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 + CALL AX + MOVQ BP, SP + POPQ BP RET - // Set FS to point at m->tls. - LEAQ m_tls(R8), DI - CALL runtime·settls(SB) +TEXT runtime·sigtramp(SB),NOSPLIT,$72 + // Save callee-saved C registers, since the caller may be a C signal handler. + MOVQ BX, bx-8(SP) + MOVQ BP, bp-16(SP) // save in case GOEXPERIMENT=noframepointer is set + MOVQ R12, r12-24(SP) + MOVQ R13, r13-32(SP) + MOVQ R14, r14-40(SP) + MOVQ R15, r15-48(SP) + // We don't save mxcsr or the x87 control word because sigtrampgo doesn't + // modify them. - // In child, set up new stack. - get_tls(CX) - MOVQ R8, g_m(R9) - MOVQ R9, g(CX) - CALL runtime·stackcheck(SB) + MOVQ DX, ctx-56(SP) + MOVQ SI, info-64(SP) + MOVQ DI, signum-72(SP) + CALL runtime·sigtrampgo(SB) - // Call fn - CALL R12 + MOVQ r15-48(SP), R15 + MOVQ r14-40(SP), R14 + MOVQ r13-32(SP), R13 + MOVQ r12-24(SP), R12 + MOVQ bp-16(SP), BP + MOVQ bx-8(SP), BX + RET - // It shouldn't return. If it does, exit - MOVQ $0, DI // arg 1 - notdead - MOVL $302, AX // sys___threxit - SYSCALL - JMP -3(PC) // keep exiting +// +// These trampolines help convert from Go calling convention to C calling convention. +// They should be called with asmcgocall. +// A pointer to the arguments is passed in DI. +// 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 + 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·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·osyield(SB),NOSPLIT,$0 MOVL $298, AX // sys_sched_yield @@ -251,43 +363,6 @@ TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$0 MOVL AX, ret+8(FP) RET -TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 - MOVQ fn+0(FP), AX - 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 - CALL AX - MOVQ BP, SP - POPQ BP - RET - -TEXT runtime·sigtramp(SB),NOSPLIT,$72 - // Save callee-saved C registers, since the caller may be a C signal handler. - MOVQ BX, bx-8(SP) - MOVQ BP, bp-16(SP) // save in case GOEXPERIMENT=noframepointer is set - MOVQ R12, r12-24(SP) - MOVQ R13, r13-32(SP) - MOVQ R14, r14-40(SP) - MOVQ R15, r15-48(SP) - // We don't save mxcsr or the x87 control word because sigtrampgo doesn't - // modify them. - - MOVQ DX, ctx-56(SP) - MOVQ SI, info-64(SP) - MOVQ DI, signum-72(SP) - CALL runtime·sigtrampgo(SB) - - MOVQ r15-48(SP), R15 - MOVQ r14-40(SP), R14 - MOVQ r13-32(SP), R13 - MOVQ r12-24(SP), R12 - MOVQ bp-16(SP), BP - MOVQ bx-8(SP), BX - RET - TEXT runtime·mmap(SB),NOSPLIT,$0 MOVQ addr+0(FP), DI // arg 1 - addr MOVQ n+8(FP), SI // arg 2 - len @@ -340,16 +415,6 @@ TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 MOVL $0xf1, 0xf1 // crash RET -// set tls base to DI -TEXT runtime·settls(SB),NOSPLIT,$0 - // adjust for ELF: wants to use -8(FS) for g - ADDQ $8, DI - MOVQ $329, AX // sys___settcb - SYSCALL - JCC 2(PC) - MOVL $0xf1, 0xf1 // crash - RET - TEXT runtime·sysctl(SB),NOSPLIT,$0 MOVQ mib+0(FP), DI // arg 1 - name MOVL miblen+8(FP), SI // arg 2 - namelen -- GitLab From ca5774a5a533ce26ed64010fcc98f258e5bb0cc1 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 14 Jan 2021 13:04:17 -0500 Subject: [PATCH 1652/1792] embed: treat uninitialized FS as empty As described in the FS documentation. This prevents http.FS and other clients from panicking when the go:embed directive is missing. For #43682 Related #43698 Change-Id: Iecf26d229a099e55d24670c3119cd6c6d17ecc6e Reviewed-on: https://go-review.googlesource.com/c/go/+/283852 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Trust: Jay Conrod Reviewed-by: Bryan C. Mills --- src/embed/embed.go | 6 ++++++ src/embed/internal/embedtest/embed_test.go | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/embed/embed.go b/src/embed/embed.go index 29e0adf1a6..cc6855e6a5 100644 --- a/src/embed/embed.go +++ b/src/embed/embed.go @@ -244,6 +244,9 @@ func (f FS) lookup(name string) *file { if name == "." { return dotFile } + if f.files == nil { + return nil + } // Binary search to find where name would be in the list, // and then check if name is at that position. @@ -261,6 +264,9 @@ func (f FS) lookup(name string) *file { // readDir returns the list of files corresponding to the directory dir. func (f FS) readDir(dir string) []file { + if f.files == nil { + return nil + } // Binary search to find where dir starts and ends in the list // and then return that slice of the list. files := *f.files diff --git a/src/embed/internal/embedtest/embed_test.go b/src/embed/internal/embedtest/embed_test.go index 40f65ffc3f..43ae5c7e05 100644 --- a/src/embed/internal/embedtest/embed_test.go +++ b/src/embed/internal/embedtest/embed_test.go @@ -112,3 +112,20 @@ func TestHidden(t *testing.T) { testDir(t, star, "testdata/.hidden", "fortune.txt", "more/") // but not .more or _more } + +func TestUninitialized(t *testing.T) { + var uninitialized embed.FS + testDir(t, uninitialized, ".") + f, err := uninitialized.Open(".") + if err != nil { + t.Fatal(err) + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + t.Fatal(err) + } + if !fi.IsDir() { + t.Errorf("in uninitialized embed.FS, . is not a directory") + } +} -- GitLab From ccb2e906882e45fe2d22c31049185208adbfb62e Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 19 Jan 2021 11:02:10 -0500 Subject: [PATCH 1653/1792] cmd/link: exit before Asmb2 if error If there are already errors emitted, don't run the Asmb2 pass and just exit. At the point of Asmb2 relocations are already resolved and errors should have been reported, if any. Asmb2 is unlikely to emit additional useful users errors. Instead, the invalid input may cause inconsistencies and crash the linker, or it may emit some internal errors which are more confusing than helpful. Exit on error before Asmb2. Fixes #43748. Change-Id: Icf6e27f2eef5b6259e921ec0e64bebad5dd805f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/284576 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 64f52bc52f..5a096f1b3b 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -338,6 +338,8 @@ func Main(arch *sys.Arch, theArch Arch) { bench.Start("Asmb") asmb(ctxt) + exitIfErrors() + // Generate additional symbols for the native symbol table just prior // to code generation. bench.Start("GenSymsLate") -- GitLab From 0575e35e506cb180c5743209684b57dd41b4365f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 8 Jan 2021 17:02:41 -0500 Subject: [PATCH 1654/1792] cmd/compile: require 'go 1.16' go.mod line for //go:embed This will produce better errors when earlier versions of Go compile code using //go:embed. (The import will cause a compilation error but then the go command will add to the output that the Go toolchain in use looks too old and maybe that's the problem.) This CL also adds a test for disallowing embed of a var inside a func. It's a bit too difficult to rebase down into that CL. The build system configuration check is delayed in order to make it possible to use errorcheck for these tests. Change-Id: I12ece4ff2d8d53380b63f54866e8f3497657d54c Reviewed-on: https://go-review.googlesource.com/c/go/+/282718 Trust: Russ Cox Run-TryBot: Russ Cox TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/compile/internal/gc/embed.go | 16 ++++++++++++---- src/go/types/stdlib_test.go | 2 ++ test/embedfunc.go | 15 +++++++++++++++ test/embedvers.go | 12 ++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 test/embedfunc.go create mode 100644 test/embedvers.go diff --git a/src/cmd/compile/internal/gc/embed.go b/src/cmd/compile/internal/gc/embed.go index 1307780960..f45796cc1d 100644 --- a/src/cmd/compile/internal/gc/embed.go +++ b/src/cmd/compile/internal/gc/embed.go @@ -67,10 +67,6 @@ func varEmbed(p *noder, names []*Node, typ *Node, exprs []*Node, embeds []Pragma p.yyerrorpos(pos, "invalid go:embed: missing import \"embed\"") return } - if embedCfg.Patterns == nil { - p.yyerrorpos(pos, "invalid go:embed: build system did not supply embed configuration") - return - } if len(names) > 1 { p.yyerrorpos(pos, "go:embed cannot apply to multiple vars") return @@ -186,6 +182,18 @@ func dumpembeds() { // initEmbed emits the init data for a //go:embed variable, // which is either a string, a []byte, or an embed.FS. func initEmbed(v *Node) { + commentPos := v.Name.Param.EmbedList()[0].Pos + if !langSupported(1, 16, localpkg) { + lno := lineno + lineno = commentPos + yyerrorv("go1.16", "go:embed") + lineno = lno + return + } + if embedCfg.Patterns == nil { + yyerrorl(commentPos, "invalid go:embed: build system did not supply embed configuration") + return + } kind := embedKind(v.Type) if kind == embedUnknown { yyerrorl(v.Pos, "go:embed cannot apply to var of type %v", v.Type) diff --git a/src/go/types/stdlib_test.go b/src/go/types/stdlib_test.go index 23f8f9a18d..5ca44936ea 100644 --- a/src/go/types/stdlib_test.go +++ b/src/go/types/stdlib_test.go @@ -155,6 +155,8 @@ func TestStdTest(t *testing.T) { testTestDir(t, filepath.Join(runtime.GOROOT(), "test"), "cmplxdivide.go", // also needs file cmplxdivide1.go - ignore "directive.go", // tests compiler rejection of bad directive placement - ignore + "embedfunc.go", // tests //go:embed + "embedvers.go", // tests //go:embed ) } diff --git a/test/embedfunc.go b/test/embedfunc.go new file mode 100644 index 0000000000..14e0f82975 --- /dev/null +++ b/test/embedfunc.go @@ -0,0 +1,15 @@ +// errorcheck + +// 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 p + +import _ "embed" + +func f() { + //go:embed x.txt // ERROR "go:embed cannot apply to var inside func" + var x string + _ = x +} diff --git a/test/embedvers.go b/test/embedvers.go new file mode 100644 index 0000000000..71f0f22f1d --- /dev/null +++ b/test/embedvers.go @@ -0,0 +1,12 @@ +// errorcheck -lang=go1.15 + +// 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 p + +import _ "embed" + +//go:embed x.txt // ERROR "go:embed requires go1.16 or later" +var x string -- GitLab From 824f2d635ca96a7bded6ed039f8a9c0f06ee1443 Mon Sep 17 00:00:00 2001 From: Constantin Konstantinidis Date: Fri, 15 Jan 2021 17:05:29 +0100 Subject: [PATCH 1655/1792] cmd/go: allow go fmt to complete when embedded file is missing Fixes #43273 Change-Id: I75fe2e608cb43c048e3c2a22fe7fbb6eb779504a Reviewed-on: https://go-review.googlesource.com/c/go/+/280452 Trust: Jay Conrod Trust: Bryan C. Mills Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Jay Conrod --- src/cmd/go/internal/fmtcmd/fmt.go | 3 ++- src/cmd/go/testdata/script/embed_fmt.txt | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/script/embed_fmt.txt diff --git a/src/cmd/go/internal/fmtcmd/fmt.go b/src/cmd/go/internal/fmtcmd/fmt.go index b0c1c59b40..6b98f0ccd3 100644 --- a/src/cmd/go/internal/fmtcmd/fmt.go +++ b/src/cmd/go/internal/fmtcmd/fmt.go @@ -75,7 +75,8 @@ func runFmt(ctx context.Context, cmd *base.Command, args []string) { } if pkg.Error != nil { var nogo *load.NoGoError - if errors.As(pkg.Error, &nogo) && len(pkg.InternalAllGoFiles()) > 0 { + var embed *load.EmbedError + if (errors.As(pkg.Error, &nogo) || errors.As(pkg.Error, &embed)) && len(pkg.InternalAllGoFiles()) > 0 { // Skip this error, as we will format // all files regardless. } else { diff --git a/src/cmd/go/testdata/script/embed_fmt.txt b/src/cmd/go/testdata/script/embed_fmt.txt new file mode 100644 index 0000000000..8a16afea8a --- /dev/null +++ b/src/cmd/go/testdata/script/embed_fmt.txt @@ -0,0 +1,22 @@ +# go fmt ignores file not found +go fmt xnofmt.go +cmp xnofmt.go xfmt.ref +! go build xnofmt.go +stderr 'xnofmt.go:5:12: pattern missing.txt: no matching files found' + +-- xnofmt.go -- +package p + +import "embed" + +//go:embed missing.txt +var X embed.FS +-- xfmt.ref -- +package p + +import "embed" + +//go:embed missing.txt +var X embed.FS +-- go.mod -- +module m -- GitLab From 928bda4f4a88efe2e53f3607e8d2ad0796b449c0 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Sat, 16 Jan 2021 04:38:50 +1100 Subject: [PATCH 1656/1792] runtime: convert openbsd/amd64 locking to libc Switch openbsd/amd64 to locking via libc, rather than performing direct system calls. Update #36435 Change-Id: I5e92bd70ce557b78ff385577088a9775cc468ea9 Reviewed-on: https://go-review.googlesource.com/c/go/+/270378 Trust: Joel Sing Run-TryBot: Joel Sing TryBot-Result: Go Bot Reviewed-by: Cherry Zhang --- src/runtime/os_openbsd.go | 8 ------ src/runtime/os_openbsd_syscall1.go | 15 +++++++++++ src/runtime/sys_openbsd1.go | 34 +++++++++++++++++++++++++ src/runtime/sys_openbsd_amd64.s | 40 ++++++++++++++++-------------- 4 files changed, 71 insertions(+), 26 deletions(-) create mode 100644 src/runtime/os_openbsd_syscall1.go create mode 100644 src/runtime/sys_openbsd1.go diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 61be627c27..56b686a2fa 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -46,14 +46,6 @@ func raiseproc(sig uint32) func getthrid() int32 func thrkill(tid int32, sig int) -//go:noescape -func thrsleep(ident uintptr, clock_id int32, tsp *timespec, lock uintptr, abort *uint32) int32 - -//go:noescape -func thrwakeup(ident uintptr, n int32) int32 - -func osyield() - func kqueue() int32 //go:noescape diff --git a/src/runtime/os_openbsd_syscall1.go b/src/runtime/os_openbsd_syscall1.go new file mode 100644 index 0000000000..08928cfef4 --- /dev/null +++ b/src/runtime/os_openbsd_syscall1.go @@ -0,0 +1,15 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build openbsd,!amd64 + +package runtime + +//go:noescape +func thrsleep(ident uintptr, clock_id int32, tsp *timespec, lock uintptr, abort *uint32) int32 + +//go:noescape +func thrwakeup(ident uintptr, n int32) int32 + +func osyield() diff --git a/src/runtime/sys_openbsd1.go b/src/runtime/sys_openbsd1.go new file mode 100644 index 0000000000..a201a16c53 --- /dev/null +++ b/src/runtime/sys_openbsd1.go @@ -0,0 +1,34 @@ +// 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 openbsd,amd64 + +package runtime + +import "unsafe" + +//go:nosplit +//go:cgo_unsafe_args +func thrsleep(ident uintptr, clock_id int32, tsp *timespec, lock uintptr, abort *uint32) int32 { + return libcCall(unsafe.Pointer(funcPC(thrsleep_trampoline)), unsafe.Pointer(&ident)) +} +func thrsleep_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func thrwakeup(ident uintptr, n int32) int32 { + return libcCall(unsafe.Pointer(funcPC(thrwakeup_trampoline)), unsafe.Pointer(&ident)) +} +func thrwakeup_trampoline() + +func osyield() { + libcCall(unsafe.Pointer(funcPC(sched_yield_trampoline)), unsafe.Pointer(nil)) +} +func sched_yield_trampoline() + +//go:cgo_import_dynamic libc_thrsleep __thrsleep "libc.so" +//go:cgo_import_dynamic libc_thrwakeup __thrwakeup "libc.so" +//go:cgo_import_dynamic libc_sched_yield sched_yield "libc.so" + +//go:cgo_import_dynamic _ _ "libc.so" diff --git a/src/runtime/sys_openbsd_amd64.s b/src/runtime/sys_openbsd_amd64.s index 455234d7cd..ac0ae27e45 100644 --- a/src/runtime/sys_openbsd_amd64.s +++ b/src/runtime/sys_openbsd_amd64.s @@ -168,28 +168,32 @@ TEXT runtime·pthread_kill_trampoline(SB),NOSPLIT,$0 POPQ BP RET -TEXT runtime·osyield(SB),NOSPLIT,$0 - MOVL $298, AX // sys_sched_yield - SYSCALL +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 3 - lock + MOVQ 32(DI), R8 // arg 4 - abort + MOVQ 0(DI), DI // arg 1 - id + CALL libc_thrsleep(SB) + POPQ BP RET -TEXT runtime·thrsleep(SB),NOSPLIT,$0 - MOVQ ident+0(FP), DI // arg 1 - ident - MOVL clock_id+8(FP), SI // arg 2 - clock_id - MOVQ tsp+16(FP), DX // arg 3 - tp - MOVQ lock+24(FP), R10 // arg 4 - lock - MOVQ abort+32(FP), R8 // arg 5 - abort - MOVL $94, AX // sys___thrsleep - SYSCALL - MOVL AX, ret+40(FP) +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·thrwakeup(SB),NOSPLIT,$0 - MOVQ ident+0(FP), DI // arg 1 - ident - MOVL n+8(FP), SI // arg 2 - n - MOVL $301, AX // sys___thrwakeup - SYSCALL - MOVL AX, ret+16(FP) +TEXT runtime·sched_yield_trampoline(SB),NOSPLIT,$0 + PUSHQ BP + MOVQ SP, BP + CALL libc_sched_yield(SB) + POPQ BP RET // Exit the entire program (like C exit) -- GitLab From be28e5abc5ddca0d6b2d8c91b7bb9c05717154e7 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 20 Jan 2021 09:45:03 -0500 Subject: [PATCH 1657/1792] cmd/go: fix mod_get_fallback test Fixes #43795 Change-Id: I3d791d0ac9ce0b523c78c649aaf5e339a7f63b76 Reviewed-on: https://go-review.googlesource.com/c/go/+/284797 Trust: Jay Conrod Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills TryBot-Result: Go Bot --- src/cmd/go/testdata/script/mod_get_fallback.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/testdata/script/mod_get_fallback.txt b/src/cmd/go/testdata/script/mod_get_fallback.txt index a9834a324e..9733fa366b 100644 --- a/src/cmd/go/testdata/script/mod_get_fallback.txt +++ b/src/cmd/go/testdata/script/mod_get_fallback.txt @@ -6,5 +6,5 @@ env GOPROXY=https://proxy.golang.org,direct env GOSUMDB=off go get -x -v -d golang.org/x/tools/cmd/goimports -stderr '# get https://proxy.golang.org/golang.org/x/tools/@latest' +stderr '# get https://proxy.golang.org/golang.org/x/tools/@v/list' ! stderr '# get https://golang.org' -- GitLab From 6e243ce71d910876839d1bad4adf9b259c3a8e21 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Wed, 13 Jan 2021 20:58:00 -0500 Subject: [PATCH 1658/1792] cmd/go: have go mod vendor copy embedded files in subdirs If a package vendored with go mod vendor depends on embedded files contained in subdirectories, copy them into the the corresponding place in the module's vendor tree. (Embeds in parent directories are disallowed by the embed pattern rules, and embeds in the same directory are copied because go mod vendor already copies the non-go files in the package's own directory). Export the vendor pattern expansion code in internal/load so internal/modcmd's vendor code can use it. Fixes #43077 Change-Id: I61edb344d73df590574a6498ffb6069e8d72a147 Reviewed-on: https://go-review.googlesource.com/c/go/+/283641 Trust: Michael Matloob Trust: Bryan C. Mills Run-TryBot: Michael Matloob TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/go/internal/list/list.go | 2 - src/cmd/go/internal/load/pkg.go | 26 +-- src/cmd/go/internal/load/test.go | 4 +- src/cmd/go/internal/modcmd/vendor.go | 76 +++++++- src/cmd/go/testdata/script/embed.txt | 26 +++ .../go/testdata/script/mod_vendor_embed.txt | 179 ++++++++++++++++++ 6 files changed, 292 insertions(+), 21 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_vendor_embed.txt diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 8a67335b3e..975b02252e 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -581,8 +581,6 @@ func runList(ctx context.Context, cmd *base.Command, args []string) { // Show vendor-expanded paths in listing p.TestImports = p.Resolve(p.TestImports) p.XTestImports = p.Resolve(p.XTestImports) - p.TestEmbedFiles = p.ResolveEmbed(p.TestEmbedPatterns) - p.XTestEmbedFiles = p.ResolveEmbed(p.XTestEmbedPatterns) p.DepOnly = !cmdline[p] if *listCompiled { diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index a1be074f6a..92dd794871 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -1807,7 +1807,7 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor stk.Push(path) defer stk.Pop() - p.EmbedFiles, p.Internal.Embed, err = p.resolveEmbed(p.EmbedPatterns) + p.EmbedFiles, p.Internal.Embed, err = resolveEmbed(p.Dir, p.EmbedPatterns) if err != nil { setError(err) embedErr := err.(*EmbedError) @@ -1932,17 +1932,20 @@ func (e *EmbedError) Unwrap() error { } // ResolveEmbed resolves //go:embed patterns and returns only the file list. -// For use by go list to compute p.TestEmbedFiles and p.XTestEmbedFiles. -func (p *Package) ResolveEmbed(patterns []string) []string { - files, _, _ := p.resolveEmbed(patterns) - return files +// For use by go mod vendor to find embedded files it should copy into the +// vendor directory. +// TODO(#42504): Once go mod vendor uses load.PackagesAndErrors, just +// call (*Package).ResolveEmbed +func ResolveEmbed(dir string, patterns []string) ([]string, error) { + files, _, err := resolveEmbed(dir, patterns) + return files, err } // resolveEmbed resolves //go:embed patterns to precise file lists. // It sets files to the list of unique files matched (for go list), // and it sets pmap to the more precise mapping from // patterns to files. -func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[string][]string, err error) { +func resolveEmbed(pkgdir string, patterns []string) (files []string, pmap map[string][]string, err error) { var pattern string defer func() { if err != nil { @@ -1953,6 +1956,7 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri } }() + // TODO(rsc): All these messages need position information for better error reports. pmap = make(map[string][]string) have := make(map[string]int) dirOK := make(map[string]bool) @@ -1966,7 +1970,7 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri } // Glob to find matches. - match, err := fsys.Glob(p.Dir + string(filepath.Separator) + filepath.FromSlash(pattern)) + match, err := fsys.Glob(pkgdir + string(filepath.Separator) + filepath.FromSlash(pattern)) if err != nil { return nil, nil, err } @@ -1977,7 +1981,7 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri // then there may be other things lying around, like symbolic links or .git directories.) var list []string for _, file := range match { - rel := filepath.ToSlash(file[len(p.Dir)+1:]) // file, relative to p.Dir + rel := filepath.ToSlash(file[len(pkgdir)+1:]) // file, relative to p.Dir what := "file" info, err := fsys.Lstat(file) @@ -1990,13 +1994,13 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri // Check that directories along path do not begin a new module // (do not contain a go.mod). - for dir := file; len(dir) > len(p.Dir)+1 && !dirOK[dir]; dir = filepath.Dir(dir) { + for dir := file; len(dir) > len(pkgdir)+1 && !dirOK[dir]; dir = filepath.Dir(dir) { if _, err := fsys.Stat(filepath.Join(dir, "go.mod")); err == nil { return nil, nil, fmt.Errorf("cannot embed %s %s: in different module", what, rel) } if dir != file { if info, err := fsys.Lstat(dir); err == nil && !info.IsDir() { - return nil, nil, fmt.Errorf("cannot embed %s %s: in non-directory %s", what, rel, dir[len(p.Dir)+1:]) + return nil, nil, fmt.Errorf("cannot embed %s %s: in non-directory %s", what, rel, dir[len(pkgdir)+1:]) } } dirOK[dir] = true @@ -2027,7 +2031,7 @@ func (p *Package) resolveEmbed(patterns []string) (files []string, pmap map[stri if err != nil { return err } - rel := filepath.ToSlash(path[len(p.Dir)+1:]) + rel := filepath.ToSlash(path[len(pkgdir)+1:]) name := info.Name() if path != file && (isBadEmbedName(name) || name[0] == '.' || name[0] == '_') { // Ignore bad names, assuming they won't go into modules. diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index 178f257f4b..eb8aef3ee2 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -124,7 +124,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p imports = append(imports, p1) } var err error - p.TestEmbedFiles, testEmbed, err = p.resolveEmbed(p.TestEmbedPatterns) + p.TestEmbedFiles, testEmbed, err = resolveEmbed(p.Dir, p.TestEmbedPatterns) if err != nil && ptestErr == nil { ptestErr = &PackageError{ ImportStack: stk.Copy(), @@ -147,7 +147,7 @@ func TestPackagesAndErrors(ctx context.Context, p *Package, cover *TestCover) (p } p.XTestImports[i] = p1.ImportPath } - p.XTestEmbedFiles, xtestEmbed, err = p.resolveEmbed(p.XTestEmbedPatterns) + p.XTestEmbedFiles, xtestEmbed, err = resolveEmbed(p.Dir, p.XTestEmbedPatterns) if err != nil && pxtestErr == nil { pxtestErr = &PackageError{ ImportStack: stk.Copy(), diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index e42ff42fbd..d3ed9e00e2 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -7,7 +7,9 @@ package modcmd import ( "bytes" "context" + "errors" "fmt" + "go/build" "io" "io/fs" "os" @@ -19,7 +21,9 @@ import ( "cmd/go/internal/cfg" "cmd/go/internal/fsys" "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" @@ -182,19 +186,76 @@ func moduleLine(m, r module.Version) string { } func vendorPkg(vdir, pkg string) { + // TODO(#42504): Instead of calling modload.ImportMap then build.ImportDir, + // just call load.PackagesAndErrors. To do that, we need to add a good way + // to ignore build constraints. realPath := modload.ImportMap(pkg) if realPath != pkg && modload.ImportMap(realPath) != "" { fmt.Fprintf(os.Stderr, "warning: %s imported as both %s and %s; making two copies.\n", realPath, realPath, pkg) } + copiedFiles := make(map[string]bool) dst := filepath.Join(vdir, pkg) src := modload.PackageDir(realPath) if src == "" { fmt.Fprintf(os.Stderr, "internal error: no pkg for %s -> %s\n", pkg, realPath) } - copyDir(dst, src, matchPotentialSourceFile) + copyDir(dst, src, matchPotentialSourceFile, copiedFiles) if m := modload.PackageModule(realPath); m.Path != "" { - copyMetadata(m.Path, realPath, dst, src) + copyMetadata(m.Path, realPath, dst, src, copiedFiles) + } + + ctx := build.Default + ctx.UseAllFiles = true + bp, err := ctx.ImportDir(src, build.IgnoreVendor) + // Because UseAllFiles is set on the build.Context, it's possible ta get + // a MultiplePackageError on an otherwise valid package: the package could + // have different names for GOOS=windows and GOOS=mac for example. On the + // other hand if there's a NoGoError, the package might have source files + // specifying "// +build ignore" those packages should be skipped because + // embeds from ignored files can't be used. + // TODO(#42504): Find a better way to avoid errors from ImportDir. We'll + // need to figure this out when we switch to PackagesAndErrors as per the + // TODO above. + var multiplePackageError *build.MultiplePackageError + var noGoError *build.NoGoError + if err != nil { + if errors.As(err, &noGoError) { + return // No source files in this package are built. Skip embeds in ignored files. + } else if !errors.As(err, &multiplePackageError) { // multiplePackgeErrors are okay, but others are not. + base.Fatalf("internal error: failed to find embedded files of %s: %v\n", pkg, err) + } + } + embedPatterns := str.StringList(bp.EmbedPatterns, bp.TestEmbedPatterns, bp.XTestEmbedPatterns) + embeds, err := load.ResolveEmbed(bp.Dir, embedPatterns) + if err != nil { + base.Fatalf("go mod vendor: %v", err) + } + for _, embed := range embeds { + embedDst := filepath.Join(dst, embed) + if copiedFiles[embedDst] { + continue + } + + // Copy the file as is done by copyDir below. + r, err := os.Open(filepath.Join(src, embed)) + if err != nil { + base.Fatalf("go mod vendor: %v", err) + } + if err := os.MkdirAll(filepath.Dir(embedDst), 0777); err != nil { + base.Fatalf("go mod vendor: %v", err) + } + w, err := os.Create(embedDst) + if err != nil { + base.Fatalf("go mod vendor: %v", err) + } + if _, err := io.Copy(w, r); err != nil { + base.Fatalf("go mod vendor: %v", err) + } + r.Close() + if err := w.Close(); err != nil { + base.Fatalf("go mod vendor: %v", err) + } } } @@ -207,14 +268,14 @@ var copiedMetadata = make(map[metakey]bool) // copyMetadata copies metadata files from parents of src to parents of dst, // stopping after processing the src parent for modPath. -func copyMetadata(modPath, pkg, dst, src string) { +func copyMetadata(modPath, pkg, dst, src string, copiedFiles map[string]bool) { for parent := 0; ; parent++ { if copiedMetadata[metakey{modPath, dst}] { break } copiedMetadata[metakey{modPath, dst}] = true if parent > 0 { - copyDir(dst, src, matchMetadata) + copyDir(dst, src, matchMetadata, copiedFiles) } if modPath == pkg { break @@ -282,7 +343,7 @@ func matchPotentialSourceFile(dir string, info fs.DirEntry) bool { } // copyDir copies all regular files satisfying match(info) from src to dst. -func copyDir(dst, src string, match func(dir string, info fs.DirEntry) bool) { +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 mod vendor: %v", err) @@ -294,11 +355,14 @@ func copyDir(dst, src string, match func(dir string, info fs.DirEntry) bool) { if file.IsDir() || !file.Type().IsRegular() || !match(src, file) { continue } + copiedFiles[file.Name()] = true r, err := os.Open(filepath.Join(src, file.Name())) if err != nil { base.Fatalf("go mod vendor: %v", err) } - w, err := os.Create(filepath.Join(dst, file.Name())) + dstPath := filepath.Join(dst, file.Name()) + copiedFiles[dstPath] = true + w, err := os.Create(dstPath) if err != nil { base.Fatalf("go mod vendor: %v", err) } diff --git a/src/cmd/go/testdata/script/embed.txt b/src/cmd/go/testdata/script/embed.txt index 710968feca..2ad799b7a7 100644 --- a/src/cmd/go/testdata/script/embed.txt +++ b/src/cmd/go/testdata/script/embed.txt @@ -3,6 +3,14 @@ go list -f '{{.EmbedPatterns}}' stdout '\[x\*t\*t\]' go list -f '{{.EmbedFiles}}' stdout '\[x.txt\]' +go list -test -f '{{.TestEmbedPatterns}}' +stdout '\[y\*t\*t\]' +go list -test -f '{{.TestEmbedFiles}}' +stdout '\[y.txt\]' +go list -test -f '{{.XTestEmbedPatterns}}' +stdout '\[z\*t\*t\]' +go list -test -f '{{.XTestEmbedFiles}}' +stdout '\[z.txt\]' # build embeds x.txt go build -x @@ -58,6 +66,22 @@ import "embed" //go:embed x*t*t var X embed.FS +-- x_test.go -- +package p + +import "embed" + +//go:embed y*t*t +var Y string + +-- x_x_test.go -- +package p_test + +import "embed" + +//go:embed z*t*t +var Z string + -- x.go2 -- package p @@ -69,6 +93,8 @@ var X embed.FS -- x.txt -- hello +-- y.txt -- +-- z.txt -- -- x.txt2 -- not hello diff --git a/src/cmd/go/testdata/script/mod_vendor_embed.txt b/src/cmd/go/testdata/script/mod_vendor_embed.txt new file mode 100644 index 0000000000..be114159a1 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_vendor_embed.txt @@ -0,0 +1,179 @@ +go mod vendor +cmp vendor/example.com/a/samedir_embed.txt a/samedir_embed.txt +cmp vendor/example.com/a/subdir/embed.txt a/subdir/embed.txt +cmp vendor/example.com/a/subdir/test/embed.txt a/subdir/test/embed.txt +cmp vendor/example.com/a/subdir/test/xtest/embed.txt a/subdir/test/xtest/embed.txt + +cd broken_no_matching_files +! go mod vendor +stderr 'go mod vendor: pattern foo.txt: no matching files found' + +cd ../broken_bad_pattern +! go mod vendor +stderr 'go mod vendor: pattern ../foo.txt: invalid pattern syntax' + +# matchPotentialSourceFile prunes out tests and unbuilt code. +# Make sure that they are vendored if they are embedded files. +cd ../embed_unbuilt +go mod vendor +cmp vendor/example.com/dep/unbuilt.go dep/unbuilt.go +cmp vendor/example.com/dep/dep_test.go dep/dep_test.go +! exists vendor/example.com/dep/not_embedded_unbuilt.go +! exists vendor/example.com/dep/not_embedded_dep_test.go +-- go.mod -- +module example.com/foo +go 1.16 + +require ( + example.com/a v0.1.0 +) + +replace ( + example.com/a v0.1.0 => ./a +) +-- foo.go -- +package main + +import ( + "fmt" + + "example.com/a" +) + +func main() { + fmt.Println(a.Str()) +} +-- a/go.mod -- +module example.com/a +-- a/a.go -- +package a + +import _ "embed" + +//go:embed samedir_embed.txt +var sameDir string + +//go:embed subdir/embed.txt +var subDir string + +func Str() string { + return sameDir + subDir +} +-- a/a_test.go -- +package a + +import _ "embed" + +//go:embed subdir/test/embed.txt +var subderTest string +-- a/a_x_test.go -- +package a_test + +import _ "embed" + +//go:embed subdir/test/xtest/embed.txt +var subdirXtest string +-- a/samedir_embed.txt -- +embedded file in same directory as package +-- a/subdir/embed.txt -- +embedded file in subdirectory of package +-- a/subdir/test/embed.txt -- +embedded file of test in subdirectory of package +-- a/subdir/test/xtest/embed.txt -- +embedded file of xtest in subdirectory of package +-- broken_no_matching_files/go.mod -- +module example.com/broken +go 1.16 + +require ( + example.com/brokendep v0.1.0 +) + +replace ( + example.com/brokendep v0.1.0 => ./brokendep +) +-- broken_no_matching_files/f.go -- +package broken + +import _ "example.com/brokendep" + +func F() {} +-- broken_no_matching_files/brokendep/go.mod -- +module example.com/brokendep +go 1.16 +-- broken_no_matching_files/brokendep/f.go -- +package brokendep + +import _ "embed" + +//go:embed foo.txt +var foo string +-- broken_bad_pattern/go.mod -- +module example.com/broken +go 1.16 + +require ( + example.com/brokendep v0.1.0 +) + +replace ( + example.com/brokendep v0.1.0 => ./brokendep +) +-- broken_bad_pattern/f.go -- +package broken + +import _ "example.com/brokendep" + +func F() {} +-- broken_bad_pattern/brokendep/go.mod -- +module example.com/brokendep +go 1.16 +-- broken_bad_pattern/brokendep/f.go -- +package brokendep + +import _ "embed" + +//go:embed ../foo.txt +var foo string +-- embed_unbuilt/go.mod -- +module example.com/foo +go 1.16 + +require ( + example.com/dep v0.1.0 +) + +replace ( + example.com/dep v0.1.0 => ./dep +) +-- embed_unbuilt/foo.go -- +package a + +import _ "example.com/dep" + +func F() {} +-- embed_unbuilt/dep/go.mod -- +module example.com/dep +go 1.16 +-- embed_unbuilt/dep/dep.go -- +package dep + +import _ "embed" + +//go:embed unbuilt.go +var unbuilt string + +//go:embed dep_test.go +var depTest string +-- embed_unbuilt/dep/unbuilt.go -- +// +build ignore + +package dep +-- embed_unbuilt/dep/not_embedded_unbuilt.go -- +// +build ignore + +package dep +-- embed_unbuilt/dep/dep_test.go -- +package dep +-- embed_unbuilt/dep/not_embedded_dep_test.go -- +package dep -- GitLab From 803d18fc6c656c5410a62157de0328a669e1b56b Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Fri, 15 Jan 2021 19:18:34 -0500 Subject: [PATCH 1659/1792] cmd/go: set Incomplete field on go list output if no files match embed If no files match the embed pattern, the Error field will be set on the package output by go list. Also set the Incomplete field for consistency. Fixes #43727 Change-Id: I5b4bb2a03a751269641a9bc4ef1d0fa0e37d46aa Reviewed-on: https://go-review.googlesource.com/c/go/+/284257 Trust: Michael Matloob Run-TryBot: Michael Matloob TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/load/pkg.go | 1 + src/cmd/go/testdata/script/embed.txt | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 92dd794871..3f67927111 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -1809,6 +1809,7 @@ func (p *Package) load(ctx context.Context, path string, stk *ImportStack, impor 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]) diff --git a/src/cmd/go/testdata/script/embed.txt b/src/cmd/go/testdata/script/embed.txt index 2ad799b7a7..6ad42e9cd1 100644 --- a/src/cmd/go/testdata/script/embed.txt +++ b/src/cmd/go/testdata/script/embed.txt @@ -46,6 +46,8 @@ stderr '^x.go:5:12: pattern [*]t: cannot embed directory t: contains no embeddab cp x.txt t/.git ! go build -x stderr '^x.go:5:12: pattern [*]t: cannot embed directory t: contains no embeddable files$' +go list -e -f '{{.Incomplete}}' +stdout 'true' [symlink] symlink t/x.link -> ../x.txt [symlink] ! go build -x [symlink] stderr '^x.go:5:12: pattern [*]t: cannot embed directory t: contains no embeddable files$' -- GitLab From d2d155d1ae8c704a37f42fd3ebb1f3846f78e4d4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 19 Jan 2021 21:30:36 -0800 Subject: [PATCH 1660/1792] runtime: don't adjust timer pp field in timerWaiting status Before this CL, the following sequence was possible: * GC scavenger starts and sets up scavenge.timer * GC calls readyForScavenger, but sysmon is sleeping * program calls runtime.GOMAXPROCS to shrink number of processors * procresize destroys a P, the one that scavenge.timer is on * (*pp).destroy calls moveTimers, which gets to the scavenger timer * scavenger timer is timerWaiting, and moveTimers clears t.pp * sysmon wakes up and calls wakeScavenger * wakeScavengers calls stopTimer on scavenger.timer, still timerWaiting * stopTimer calls deltimer which loads t.pp, which is still nil * stopTimer tries to increment deletedTimers on nil t.pp, and crashes The point of vulnerability is the time that t.pp is set to nil by moveTimers and the time that t.pp is set to non-nil by moveTimers, which is a few instructions at most. So it's not likely and in particular is quite unlikely on x86. But with a more relaxed memory model the area of vulnerability can be somewhat larger. This appears to tbe the cause of two builder failures in a few months on linux-mips. This CL fixes the problem by making moveTimers change the status from timerWaiting to timerMoving while t.pp is clear. That will cause deltimer to wait until the status is back to timerWaiting, at which point t.pp has been set again. Fixes #43712 Change-Id: I66838319ecfbf15be66c1fac88d9bd40e2295852 Reviewed-on: https://go-review.googlesource.com/c/go/+/284775 Trust: Ian Lance Taylor Reviewed-by: Michael Knyszek Reviewed-by: Michael Pratt --- src/runtime/time.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/runtime/time.go b/src/runtime/time.go index d338705b7c..8ab2a03430 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -609,8 +609,14 @@ func moveTimers(pp *p, timers []*timer) { for { switch s := atomic.Load(&t.status); s { case timerWaiting: + if !atomic.Cas(&t.status, s, timerMoving) { + continue + } t.pp = 0 doaddtimer(pp, t) + if !atomic.Cas(&t.status, timerMoving, timerWaiting) { + badTimer() + } break loop case timerModifiedEarlier, timerModifiedLater: if !atomic.Cas(&t.status, s, timerMoving) { -- GitLab From ecf4ebf10054f70e51a0ce759b2ae91aa4febd1a Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Sat, 5 Dec 2020 15:03:27 -0500 Subject: [PATCH 1661/1792] cmd/internal/moddeps: check content of all modules in GOROOT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expand the scope of the TestAllDependenciesVendored test to check that all modules in GOROOT are tidy, that packages are vendored, the vendor content matches the upstream copy exactly, and that bundled packages are re-generated (using x/tools/cmd/bundle at the version selected in cmd module; this is deterministic and guaranteed to be updated over time). This is done in a conceptually simple way: 1. Make a temporary copy of the entire GOROOT tree (except .git), one that is safe to modify. 2. Run a list of high-level commands, the same commands we expect Go developers should be able to run in a normal complete GOROOT tree to make it clean and tidy. 3. Diff the end result with the original GOROOT tree being tested to catch any unexpected differences. The current set of commands that are run require the cmd/go command, and a functional compiler itself (because re-generating the syscall package involves a directive like //go:generate go run [...]). As a result, copying a large majority of the GOROOT tree is a requirement. Instead of looking for the few files or directories that can we can get away not copying (e.g., the testdata directories aren't strictly needed at this time), we opt not to optimize and just do the simple copy. This is motivated by these reasons: • We end up having a complete, normal GOROOT tree, one that happens to be located at another path. There's a very high likelihood that module management/code generation commands, both the ones we run today and any additional ones that we might want to add in the future, will result in correct results even as the Go project evolves over time. • Having a completely stand-alone copy of the GOROOT tree without symlinks minimizes the risk of some of the module management/code generation commands, either now or in the future, from modifying the user's original GOROOT tree, something that should not happen during test execution. Overlays achieved with symlinks work well when we can guarantee only new files are added, but that isn't the case here. • Copying the entire GOROOT (without .git), takes around 5 seconds on a fairly modern computer with an SSD. The most we can save is a couple of seconds. (We make some minor exceptions: the GOROOT/.git directory isn't copied, and GOROOT/{bin,pkg} are deemed safe to share and thus symlink instead of copying. If these optimizations cease to be viable to make, we'll need to remove them.) Since this functionality is fairly expensive to execute and requires network access, it runs only when the test is executed without -short flag. The previous behavior of the TestAllDependenciesVendored test is kept in -short test mode. all.bash runs package tests with -short flag, so its behavior is unchanged. The expectation is that the new test will run on some of the longtest builders to catch problems. Users can invoke the test manually 'go test cmd/internal/moddeps' (and it's run as part of 'go test cmd', again, only when -short flag isn't provided). On a 2017 MacBook Pro, a successful long test takes under 15 seconds, which should be within scope of all long tests that are selected by 'go test std cmd'. We may further adjust when and where the test runs by default based on our experience. Fixes #36852. Fixes #41409. Fixes #43687. Updates #43440. Change-Id: I9eb85205fec7ec62e3f867831a0a82e3c767f618 Reviewed-on: https://go-review.googlesource.com/c/go/+/283643 Run-TryBot: Dmitri Shuralyov TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Trust: Dmitri Shuralyov --- src/cmd/internal/moddeps/moddeps_test.go | 400 ++++++++++++++++++----- 1 file changed, 316 insertions(+), 84 deletions(-) diff --git a/src/cmd/internal/moddeps/moddeps_test.go b/src/cmd/internal/moddeps/moddeps_test.go index 9ea21873c5..cba401c896 100644 --- a/src/cmd/internal/moddeps/moddeps_test.go +++ b/src/cmd/internal/moddeps/moddeps_test.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "internal/testenv" + "io" "io/fs" "io/ioutil" "os" @@ -21,93 +22,34 @@ import ( "golang.org/x/mod/module" ) -type gorootModule struct { - Path string - Dir string - hasVendor bool -} - -// findGorootModules returns the list of modules found in the GOROOT source tree. -func findGorootModules(t *testing.T) []gorootModule { - t.Helper() - goBin := testenv.GoToolPath(t) - - goroot.once.Do(func() { - goroot.err = filepath.WalkDir(runtime.GOROOT(), func(path string, info fs.DirEntry, err error) error { - if err != nil { - return err - } - if info.IsDir() && (info.Name() == "vendor" || info.Name() == "testdata") { - return filepath.SkipDir - } - if path == filepath.Join(runtime.GOROOT(), "pkg") { - // GOROOT/pkg contains generated artifacts, not source code. - // - // In https://golang.org/issue/37929 it was observed to somehow contain - // a module cache, so it is important to skip. (That helps with the - // running time of this test anyway.) - return filepath.SkipDir - } - if info.IsDir() || info.Name() != "go.mod" { - return nil - } - dir := filepath.Dir(path) - - // Use 'go list' to describe the module contained in this directory (but - // not its dependencies). - cmd := exec.Command(goBin, "list", "-json", "-m") - cmd.Env = append(os.Environ(), "GO111MODULE=on") - cmd.Dir = dir - cmd.Stderr = new(strings.Builder) - out, err := cmd.Output() - if err != nil { - return fmt.Errorf("'go list -json -m' in %s: %w\n%s", dir, err, cmd.Stderr) - } - - var m gorootModule - if err := json.Unmarshal(out, &m); err != nil { - return fmt.Errorf("decoding 'go list -json -m' in %s: %w", dir, err) - } - if m.Path == "" || m.Dir == "" { - return fmt.Errorf("'go list -json -m' in %s failed to populate Path and/or Dir", dir) - } - if _, err := os.Stat(filepath.Join(dir, "vendor")); err == nil { - m.hasVendor = true - } - goroot.modules = append(goroot.modules, m) - return nil - }) - }) - - if goroot.err != nil { - t.Fatal(goroot.err) - } - return goroot.modules -} - -// goroot caches the list of modules found in the GOROOT source tree. -var goroot struct { - once sync.Once - modules []gorootModule - err error -} - -// TestAllDependenciesVendored ensures that all packages imported within GOROOT -// are vendored in the corresponding GOROOT module. +// TestAllDependencies ensures dependencies of all +// modules in GOROOT are in a consistent state. // -// This property allows offline development within the Go project, and ensures -// that all dependency changes are presented in the usual code review process. +// In short mode, it does a limited quick check and stops there. +// In long mode, it also makes a copy of the entire GOROOT tree +// and requires network access to perform more thorough checks. +// Keep this distinction in mind when adding new checks. // -// This test does NOT ensure that the vendored contents match the unmodified -// contents of the corresponding dependency versions. Such as test would require -// network access, and would currently either need to copy the entire GOROOT module -// or explicitly invoke version control to check for changes. -// (See golang.org/issue/36852 and golang.org/issue/27348.) -func TestAllDependenciesVendored(t *testing.T) { +// See issues 36852, 41409, and 43687. +// (Also see golang.org/issue/27348.) +func TestAllDependencies(t *testing.T) { goBin := testenv.GoToolPath(t) + // Ensure that all packages imported within GOROOT + // are vendored in the corresponding GOROOT module. + // + // This property allows offline development within the Go project, and ensures + // that all dependency changes are presented in the usual code review process. + // + // As a quick first-order check, avoid network access and the need to copy the + // entire GOROOT tree or explicitly invoke version control to check for changes. + // Just check that packages are vendored. (In non-short mode, we go on to also + // copy the GOROOT tree and perform more rigorous consistency checks. Jump below + // for more details.) for _, m := range findGorootModules(t) { - t.Run(m.Path, func(t *testing.T) { + // 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) { if m.hasVendor { // Load all of the packages in the module to ensure that their // dependencies are vendored. If any imported package is missing, @@ -140,6 +82,226 @@ func TestAllDependenciesVendored(t *testing.T) { } }) } + + // We now get to the slow, but more thorough part of the test. + // Only run it in long test mode. + if testing.Short() { + return + } + + // Ensure that all modules within GOROOT are tidy, vendored, and bundled. + // Ensure that the vendored contents match the unmodified contents of the + // corresponding dependency versions. + // + // The non-short section of this test requires network access and the diff + // command. + // + // It makes a temporary copy of the entire GOROOT tree (where it can safely + // perform operations that may mutate the tree), executes the same module + // maintenance commands that we expect Go developers to run, and then + // diffs the potentially modified module copy with the real one in GOROOT. + // (We could try to rely on Git to do things differently, but that's not the + // path we've chosen at this time. This allows the test to run when the tree + // is not checked into Git.) + + testenv.MustHaveExternalNetwork(t) + if haveDiff := func() bool { + diff, err := exec.Command("diff", "--recursive", "--unified", ".", ".").CombinedOutput() + if err != nil || len(diff) != 0 { + return false + } + diff, err = exec.Command("diff", "--recursive", "--unified", ".", "..").CombinedOutput() + if err == nil || len(diff) == 0 { + return false + } + return true + }(); !haveDiff { + // For now, the diff command is a mandatory dependency of this test. + // This test will primarily run on longtest builders, since few people + // would test the cmd/internal/moddeps package directly, and all.bash + // runs tests in short mode. It's fine to skip if diff is unavailable. + t.Skip("skipping because a diff command with support for --recursive and --unified flags is unavailable") + } + + // Build the bundle binary at the golang.org/x/tools + // module version specified in GOROOT/src/cmd/go.mod. + bundleDir := t.TempDir() + r := runner{Dir: filepath.Join(runtime.GOROOT(), "src/cmd")} + r.run(t, goBin, "build", "-mod=readonly", "-o", bundleDir, "golang.org/x/tools/cmd/bundle") + + var gorootCopyDir string + for _, m := range findGorootModules(t) { + // Create a test-wide GOROOT copy. It can be created once + // and reused between subtests whenever they don't fail. + // + // This is a relatively expensive operation, but it's a pre-requisite to + // be able to safely run commands like "go mod tidy", "go mod vendor", and + // "go generate" on the GOROOT tree content. Those commands may modify the + // tree, and we don't want to happen to the real tree as part of executing + // a test. + if gorootCopyDir == "" { + gorootCopyDir = makeGOROOTCopy(t) + } + + t.Run(m.Path+"(thorough)", func(t *testing.T) { + defer func() { + if t.Failed() { + // The test failed, which means it's possible the GOROOT copy + // may have been modified. No choice but to reset it for next + // module test case. (This is slow, but it happens only during + // test failures.) + gorootCopyDir = "" + } + }() + + rel, err := filepath.Rel(runtime.GOROOT(), m.Dir) + if err != nil { + t.Fatalf("filepath.Rel(%q, %q): %v", runtime.GOROOT(), m.Dir, err) + } + r := runner{ + Dir: filepath.Join(gorootCopyDir, rel), + Env: append(os.Environ(), + // Set GOROOT. + "GOROOT="+gorootCopyDir, + // Explicitly clear PWD and GOROOT_FINAL so that GOROOT=gorootCopyDir is definitely used. + "PWD=", + "GOROOT_FINAL=", + // Add GOROOTcopy/bin and bundleDir to front of PATH. + "PATH="+filepath.Join(gorootCopyDir, "bin")+string(filepath.ListSeparator)+ + bundleDir+string(filepath.ListSeparator)+os.Getenv("PATH"), + ), + } + goBinCopy := filepath.Join(gorootCopyDir, "bin", "go") + r.run(t, goBinCopy, "mod", "tidy") // See issue 43687. + r.run(t, goBinCopy, "mod", "verify") // Verify should be a no-op, but test it just in case. + r.run(t, goBinCopy, "mod", "vendor") // See issue 36852. + pkgs := packagePattern(m.Path) + r.run(t, goBinCopy, "generate", `-run=^//go:generate bundle `, pkgs) // See issue 41409. + advice := "$ cd " + m.Dir + "\n" + + "$ go mod tidy # to remove extraneous dependencies\n" + + "$ go mod vendor # to vendor dependecies\n" + + "$ go generate -run=bundle " + pkgs + " # to regenerate bundled packages\n" + if m.Path == "std" { + r.run(t, goBinCopy, "generate", "syscall", "internal/syscall/...") // See issue 43440. + advice += "$ go generate syscall internal/syscall/... # to regenerate syscall packages\n" + } + // TODO(golang.org/issue/43440): Check anything else influenced by dependency versions. + + diff, err := exec.Command("diff", "--recursive", "--unified", r.Dir, m.Dir).CombinedOutput() + if err != nil || len(diff) != 0 { + t.Errorf(`Module %s in %s is not tidy (-want +got): + +%s +To fix it, run: + +%s +(If module %[1]s is definitely tidy, this could mean +there's a problem in the go or bundle command.)`, m.Path, m.Dir, diff, advice) + } + }) + } +} + +// packagePattern returns a package pattern that matches all packages +// in the module modulePath, and ideally as few others as possible. +func packagePattern(modulePath string) string { + if modulePath == "std" { + return "std" + } + return modulePath + "/..." +} + +// makeGOROOTCopy makes a temporary copy of the current GOROOT tree. +// The goal is to allow the calling test t to safely mutate a GOROOT +// copy without also modifying the original GOROOT. +// +// It copies the entire tree as is, with the exception of the GOROOT/.git +// directory, which is skipped, and the GOROOT/{bin,pkg} directories, +// which are symlinked. This is done for speed, since a GOROOT tree is +// functional without being in a Git repository, and bin and pkg are +// 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(runtime.GOROOT(), func(src string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if src == filepath.Join(runtime.GOROOT(), ".git") { + return filepath.SkipDir + } + + rel, err := filepath.Rel(runtime.GOROOT(), src) + if err != nil { + return fmt.Errorf("filepath.Rel(%q, %q): %v", runtime.GOROOT(), src, err) + } + dst := filepath.Join(gorootCopyDir, rel) + + switch src { + case filepath.Join(runtime.GOROOT(), "bin"), + filepath.Join(runtime.GOROOT(), "pkg"): + // If the OS supports symlinks, use them instead + // of copying the bin and pkg directories. + if err := os.Symlink(src, dst); err == nil { + return filepath.SkipDir + } + } + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(src) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // If it's a directory, make a corresponding directory. + if info.IsDir() { + return os.MkdirAll(dst, perm|0200) + } + + // Copy the file bytes. + // We can't create a symlink because the file may get modified; + // we need to ensure that only the temporary copy is affected. + s, err := os.Open(src) + if err != nil { + return err + } + defer s.Close() + d, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + _, err = io.Copy(d, s) + if err != nil { + d.Close() + return err + } + return d.Close() + }) + if err != nil { + t.Fatal(err) + } + return gorootCopyDir +} + +type runner struct { + Dir string + Env []string +} + +// run runs the command and requires that it succeeds. +func (r runner) run(t *testing.T, args ...string) { + t.Helper() + cmd := exec.Command(args[0], args[1:]...) + cmd.Dir = r.Dir + cmd.Env = r.Env + out, err := cmd.CombinedOutput() + if err != nil { + t.Logf("> %s\n", strings.Join(args, " ")) + t.Fatalf("command failed: %s\n%s", err, out) + } } // TestDependencyVersionsConsistent verifies that each module in GOROOT that @@ -159,8 +321,7 @@ func TestDependencyVersionsConsistent(t *testing.T) { seen := map[string]map[requirement][]gorootModule{} // module path → requirement → set of modules with that requirement for _, m := range findGorootModules(t) { if !m.hasVendor { - // TestAllDependenciesVendored will ensure that the module has no - // dependencies. + // TestAllDependencies will ensure that the module has no dependencies. continue } @@ -233,3 +394,74 @@ func TestDependencyVersionsConsistent(t *testing.T) { } } } + +type gorootModule struct { + Path string + Dir string + hasVendor bool +} + +// findGorootModules returns the list of modules found in the GOROOT source tree. +func findGorootModules(t *testing.T) []gorootModule { + t.Helper() + goBin := testenv.GoToolPath(t) + + goroot.once.Do(func() { + goroot.err = filepath.WalkDir(runtime.GOROOT(), func(path string, info fs.DirEntry, err error) error { + if err != nil { + return err + } + if info.IsDir() && (info.Name() == "vendor" || info.Name() == "testdata") { + return filepath.SkipDir + } + if path == filepath.Join(runtime.GOROOT(), "pkg") { + // GOROOT/pkg contains generated artifacts, not source code. + // + // In https://golang.org/issue/37929 it was observed to somehow contain + // a module cache, so it is important to skip. (That helps with the + // running time of this test anyway.) + return filepath.SkipDir + } + if info.IsDir() || info.Name() != "go.mod" { + return nil + } + dir := filepath.Dir(path) + + // Use 'go list' to describe the module contained in this directory (but + // not its dependencies). + cmd := exec.Command(goBin, "list", "-json", "-m") + cmd.Env = append(os.Environ(), "GO111MODULE=on") + cmd.Dir = dir + cmd.Stderr = new(strings.Builder) + out, err := cmd.Output() + if err != nil { + return fmt.Errorf("'go list -json -m' in %s: %w\n%s", dir, err, cmd.Stderr) + } + + var m gorootModule + if err := json.Unmarshal(out, &m); err != nil { + return fmt.Errorf("decoding 'go list -json -m' in %s: %w", dir, err) + } + if m.Path == "" || m.Dir == "" { + return fmt.Errorf("'go list -json -m' in %s failed to populate Path and/or Dir", dir) + } + if _, err := os.Stat(filepath.Join(dir, "vendor")); err == nil { + m.hasVendor = true + } + goroot.modules = append(goroot.modules, m) + return nil + }) + }) + + if goroot.err != nil { + t.Fatal(goroot.err) + } + return goroot.modules +} + +// goroot caches the list of modules found in the GOROOT source tree. +var goroot struct { + once sync.Once + modules []gorootModule + err error +} -- GitLab From d95ca9138026cbe40e0857d76a81a16d03230871 Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Fri, 8 Jan 2021 03:56:58 +0100 Subject: [PATCH 1662/1792] crypto/elliptic: fix P-224 field reduction This patch fixes two independent bugs in p224Contract, the function that performs the final complete reduction in the P-224 field. Incorrect outputs due to these bugs were observable from a high-level P224().ScalarMult() call. The first bug was in the calculation of out3GT. That mask was supposed to be all ones if the third limb of the value is greater than the third limb of P (out[3] > 0xffff000). Instead, it was also set if they are equal. That meant that if the third limb was equal, the value was always considered greater than or equal to P, even when the three bottom limbs were all zero. There is exactly one affected value, P - 1, which would trigger the subtraction by P even if it's lower than P already. The second bug was more easily hit, and is the one that caused the known high-level incorrect output: after the conditional subtraction by P, a potential underflow of the lowest limb was not handled. Any values that trigger the subtraction by P (values between P and 2^224-1, and P - 1 due to the bug above) but have a zero lowest limb would produce invalid outputs. Those conditions apply to the intermediate representation before the subtraction, so they are hard to trace to precise inputs. This patch also adds a test suite for the P-224 field arithmetic, including a custom fuzzer that automatically explores potential edge cases by combining limb values that have various meanings in the code. contractMatchesBigInt in TestP224Contract finds the second bug in less than a second without being tailored to it, and could eventually find the first one too by combining 0, (1 << 28) - 1, and the difference of (1 << 28) and (1 << 12). The incorrect P224().ScalarMult() output was found by the elliptic-curve-differential-fuzzer project running on OSS-Fuzz and reported by Philippe Antoine (Catena cyber). Fixes CVE-2021-3114 Fixes #43786 Change-Id: I50176602d544de3da854270d66a293bcaca57ad7 Reviewed-on: https://go-review.googlesource.com/c/go/+/284779 Run-TryBot: Roland Shoemaker TryBot-Result: Go Bot Trust: Ian Lance Taylor Trust: Roland Shoemaker Reviewed-by: Filippo Valsorda --- src/crypto/elliptic/p224.go | 41 +++-- src/crypto/elliptic/p224_test.go | 277 ++++++++++++++++++++++++++++++- 2 files changed, 298 insertions(+), 20 deletions(-) diff --git a/src/crypto/elliptic/p224.go b/src/crypto/elliptic/p224.go index 2ea63f3f0c..8c76021464 100644 --- a/src/crypto/elliptic/p224.go +++ b/src/crypto/elliptic/p224.go @@ -386,10 +386,11 @@ func p224Invert(out, in *p224FieldElement) { // p224Contract converts a FieldElement to its unique, minimal form. // // On entry, in[i] < 2**29 -// On exit, in[i] < 2**28 +// On exit, out[i] < 2**28 and out < p func p224Contract(out, in *p224FieldElement) { copy(out[:], in[:]) + // First, carry the bits above 28 to the higher limb. for i := 0; i < 7; i++ { out[i+1] += out[i] >> 28 out[i] &= bottom28Bits @@ -397,10 +398,13 @@ func p224Contract(out, in *p224FieldElement) { top := out[7] >> 28 out[7] &= bottom28Bits + // Use the reduction identity to carry the overflow. + // + // a + top * 2²²⁴ = a + top * 2⁹⁶ - top out[0] -= top out[3] += top << 12 - // We may just have made out[i] negative. So we carry down. If we made + // We may just have made out[0] negative. So we carry down. If we made // out[0] negative then we know that out[3] is sufficiently positive // because we just added to it. for i := 0; i < 3; i++ { @@ -425,13 +429,12 @@ func p224Contract(out, in *p224FieldElement) { // There are two cases to consider for out[3]: // 1) The first time that we eliminated top, we didn't push out[3] over // 2**28. In this case, the partial carry chain didn't change any values - // and top is zero. + // and top is now zero. // 2) We did push out[3] over 2**28 the first time that we eliminated top. - // The first value of top was in [0..16), therefore, prior to eliminating - // the first top, 0xfff1000 <= out[3] <= 0xfffffff. Therefore, after - // overflowing and being reduced by the second carry chain, out[3] <= - // 0xf000. Thus it cannot have overflowed when we eliminated top for the - // second time. + // The first value of top was in [0..2], therefore, after overflowing + // and being reduced by the second carry chain, out[3] <= 2<<12 - 1. + // In both cases, out[3] cannot have overflowed when we eliminated top for + // the second time. // Again, we may just have made out[0] negative, so do the same carry down. // As before, if we made out[0] negative then we know that out[3] is @@ -470,12 +473,11 @@ func p224Contract(out, in *p224FieldElement) { bottom3NonZero |= bottom3NonZero >> 1 bottom3NonZero = uint32(int32(bottom3NonZero<<31) >> 31) - // Everything depends on the value of out[3]. - // If it's > 0xffff000 and top4AllOnes != 0 then the whole value is >= p - // If it's = 0xffff000 and top4AllOnes != 0 and bottom3NonZero != 0, - // then the whole value is >= p + // Assuming top4AllOnes != 0, everything depends on the value of out[3]. + // If it's > 0xffff000 then the whole value is > p + // If it's = 0xffff000 and bottom3NonZero != 0, then the whole value is >= p // If it's < 0xffff000, then the whole value is < p - n := out[3] - 0xffff000 + n := 0xffff000 - out[3] out3Equal := n out3Equal |= out3Equal >> 16 out3Equal |= out3Equal >> 8 @@ -484,8 +486,8 @@ func p224Contract(out, in *p224FieldElement) { out3Equal |= out3Equal >> 1 out3Equal = ^uint32(int32(out3Equal<<31) >> 31) - // If out[3] > 0xffff000 then n's MSB will be zero. - out3GT := ^uint32(int32(n) >> 31) + // If out[3] > 0xffff000 then n's MSB will be one. + out3GT := uint32(int32(n) >> 31) mask := top4AllOnes & ((out3Equal & bottom3NonZero) | out3GT) out[0] -= 1 & mask @@ -494,6 +496,15 @@ func p224Contract(out, in *p224FieldElement) { out[5] -= 0xfffffff & mask out[6] -= 0xfffffff & mask out[7] -= 0xfffffff & mask + + // Do one final carry down, in case we made out[0] negative. One of + // out[0..3] needs to be positive and able to absorb the -1 or the value + // would have been < p, and the subtraction wouldn't have happened. + for i := 0; i < 3; i++ { + mask := uint32(int32(out[i]) >> 31) + out[i] += (1 << 28) & mask + out[i+1] -= 1 & mask + } } // Group element functions. diff --git a/src/crypto/elliptic/p224_test.go b/src/crypto/elliptic/p224_test.go index 8b4fa0483b..c3141b6ab4 100644 --- a/src/crypto/elliptic/p224_test.go +++ b/src/crypto/elliptic/p224_test.go @@ -6,7 +6,11 @@ package elliptic import ( "math/big" + "math/bits" + "math/rand" + "reflect" "testing" + "testing/quick" ) var toFromBigTests = []string{ @@ -21,16 +25,16 @@ func p224AlternativeToBig(in *p224FieldElement) *big.Int { ret := new(big.Int) tmp := new(big.Int) - for i := uint(0); i < 8; i++ { + for i := len(in) - 1; i >= 0; i-- { + ret.Lsh(ret, 28) tmp.SetInt64(int64(in[i])) - tmp.Lsh(tmp, 28*i) ret.Add(ret, tmp) } - ret.Mod(ret, p224.P) + ret.Mod(ret, P224().Params().P) return ret } -func TestToFromBig(t *testing.T) { +func TestP224ToFromBig(t *testing.T) { for i, test := range toFromBigTests { n, _ := new(big.Int).SetString(test, 16) var x p224FieldElement @@ -41,7 +45,270 @@ func TestToFromBig(t *testing.T) { } q := p224AlternativeToBig(&x) if n.Cmp(q) != 0 { - t.Errorf("#%d: %x != %x (alternative)", i, n, m) + t.Errorf("#%d: %x != %x (alternative)", i, n, q) } } } + +// quickCheckConfig32 will make each quickcheck test run (32 * -quickchecks) +// times. The default value of -quickchecks is 100. +var quickCheckConfig32 = &quick.Config{MaxCountScale: 32} + +// weirdLimbs can be combined to generate a range of edge-case field elements. +var weirdLimbs = [...]uint32{ + 0, 1, (1 << 29) - 1, + (1 << 12), (1 << 12) - 1, + (1 << 28), (1 << 28) - 1, +} + +func generateLimb(rand *rand.Rand) uint32 { + const bottom29Bits = 0x1fffffff + n := rand.Intn(len(weirdLimbs) + 3) + switch n { + case len(weirdLimbs): + // Random value. + return uint32(rand.Int31n(1 << 29)) + case len(weirdLimbs) + 1: + // Sum of two values. + k := generateLimb(rand) + generateLimb(rand) + return k & bottom29Bits + case len(weirdLimbs) + 2: + // Difference of two values. + k := generateLimb(rand) - generateLimb(rand) + return k & bottom29Bits + default: + return weirdLimbs[n] + } +} + +func (p224FieldElement) Generate(rand *rand.Rand, size int) reflect.Value { + return reflect.ValueOf(p224FieldElement{ + generateLimb(rand), + generateLimb(rand), + generateLimb(rand), + generateLimb(rand), + generateLimb(rand), + generateLimb(rand), + generateLimb(rand), + generateLimb(rand), + }) +} + +func isInBounds(x *p224FieldElement) bool { + return bits.Len32(x[0]) <= 29 && + bits.Len32(x[1]) <= 29 && + bits.Len32(x[2]) <= 29 && + bits.Len32(x[3]) <= 29 && + bits.Len32(x[4]) <= 29 && + bits.Len32(x[5]) <= 29 && + bits.Len32(x[6]) <= 29 && + bits.Len32(x[7]) <= 29 +} + +func TestP224Mul(t *testing.T) { + mulMatchesBigInt := func(a, b, out p224FieldElement) bool { + var tmp p224LargeFieldElement + p224Mul(&out, &a, &b, &tmp) + + exp := new(big.Int).Mul(p224AlternativeToBig(&a), p224AlternativeToBig(&b)) + exp.Mod(exp, P224().Params().P) + got := p224AlternativeToBig(&out) + if exp.Cmp(got) != 0 || !isInBounds(&out) { + t.Logf("a = %x", a) + t.Logf("b = %x", b) + t.Logf("p224Mul(a, b) = %x = %v", out, got) + t.Logf("a * b = %v", exp) + return false + } + + return true + } + + a := p224FieldElement{0xfffffff, 0xfffffff, 0xf00ffff, 0x20f, 0x0, 0x0, 0x0, 0x0} + b := p224FieldElement{1, 0, 0, 0, 0, 0, 0, 0} + if !mulMatchesBigInt(a, b, p224FieldElement{}) { + t.Fail() + } + + if err := quick.Check(mulMatchesBigInt, quickCheckConfig32); err != nil { + t.Error(err) + } +} + +func TestP224Square(t *testing.T) { + squareMatchesBigInt := func(a, out p224FieldElement) bool { + var tmp p224LargeFieldElement + p224Square(&out, &a, &tmp) + + exp := p224AlternativeToBig(&a) + exp.Mul(exp, exp) + exp.Mod(exp, P224().Params().P) + got := p224AlternativeToBig(&out) + if exp.Cmp(got) != 0 || !isInBounds(&out) { + t.Logf("a = %x", a) + t.Logf("p224Square(a, b) = %x = %v", out, got) + t.Logf("a * a = %v", exp) + return false + } + + return true + } + + if err := quick.Check(squareMatchesBigInt, quickCheckConfig32); err != nil { + t.Error(err) + } +} + +func TestP224Add(t *testing.T) { + addMatchesBigInt := func(a, b, out p224FieldElement) bool { + p224Add(&out, &a, &b) + + exp := new(big.Int).Add(p224AlternativeToBig(&a), p224AlternativeToBig(&b)) + exp.Mod(exp, P224().Params().P) + got := p224AlternativeToBig(&out) + if exp.Cmp(got) != 0 { + t.Logf("a = %x", a) + t.Logf("b = %x", b) + t.Logf("p224Add(a, b) = %x = %v", out, got) + t.Logf("a + b = %v", exp) + return false + } + + return true + } + + if err := quick.Check(addMatchesBigInt, quickCheckConfig32); err != nil { + t.Error(err) + } +} + +func TestP224Reduce(t *testing.T) { + reduceMatchesBigInt := func(a p224FieldElement) bool { + out := a + // TODO: generate higher values for functions like p224Reduce that are + // expected to work with higher input bounds. + p224Reduce(&out) + + exp := p224AlternativeToBig(&a) + got := p224AlternativeToBig(&out) + if exp.Cmp(got) != 0 || !isInBounds(&out) { + t.Logf("a = %x = %v", a, exp) + t.Logf("p224Reduce(a) = %x = %v", out, got) + return false + } + + return true + } + + if err := quick.Check(reduceMatchesBigInt, quickCheckConfig32); err != nil { + t.Error(err) + } +} + +func TestP224Contract(t *testing.T) { + contractMatchesBigInt := func(a, out p224FieldElement) bool { + p224Contract(&out, &a) + + exp := p224AlternativeToBig(&a) + got := p224AlternativeToBig(&out) + if exp.Cmp(got) != 0 { + t.Logf("a = %x = %v", a, exp) + t.Logf("p224Contract(a) = %x = %v", out, got) + return false + } + + // Check that out < P. + for i := range p224P { + k := 8 - i - 1 + if out[k] > p224P[k] { + t.Logf("p224Contract(a) = %x", out) + return false + } + if out[k] < p224P[k] { + return true + } + } + t.Logf("p224Contract(a) = %x", out) + return false + } + + if !contractMatchesBigInt(p224P, p224FieldElement{}) { + t.Error("p224Contract(p) is broken") + } + pMinus1 := p224FieldElement{0, 0, 0, 0xffff000, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff} + if !contractMatchesBigInt(pMinus1, p224FieldElement{}) { + t.Error("p224Contract(p - 1) is broken") + } + // Check that we can handle input above p, but lowest limb zero. + a := p224FieldElement{0, 1, 0, 0xffff000, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff} + if !contractMatchesBigInt(a, p224FieldElement{}) { + t.Error("p224Contract(p + 2²⁸) is broken") + } + // Check that we can handle input above p, but lowest three limbs zero. + b := p224FieldElement{0, 0, 0, 0xffff001, 0xfffffff, 0xfffffff, 0xfffffff, 0xfffffff} + if !contractMatchesBigInt(b, p224FieldElement{}) { + t.Error("p224Contract(p + 2⁸⁴) is broken") + } + + if err := quick.Check(contractMatchesBigInt, quickCheckConfig32); err != nil { + t.Error(err) + } +} + +func TestP224IsZero(t *testing.T) { + if got := p224IsZero(&p224FieldElement{}); got != 1 { + t.Errorf("p224IsZero(0) = %d, expected 1", got) + } + if got := p224IsZero((*p224FieldElement)(&p224P)); got != 1 { + t.Errorf("p224IsZero(p) = %d, expected 1", got) + } + if got := p224IsZero(&p224FieldElement{1}); got != 0 { + t.Errorf("p224IsZero(1) = %d, expected 0", got) + } + + isZeroMatchesBigInt := func(a p224FieldElement) bool { + isZero := p224IsZero(&a) + + big := p224AlternativeToBig(&a) + if big.Sign() == 0 && isZero != 1 { + return false + } + if big.Sign() != 0 && isZero != 0 { + return false + } + return true + } + + if err := quick.Check(isZeroMatchesBigInt, quickCheckConfig32); err != nil { + t.Error(err) + } +} + +func TestP224Invert(t *testing.T) { + var out p224FieldElement + + p224Invert(&out, &p224FieldElement{}) + if got := p224IsZero(&out); got != 1 { + t.Errorf("p224Invert(0) = %x, expected 0", out) + } + + p224Invert(&out, (*p224FieldElement)(&p224P)) + if got := p224IsZero(&out); got != 1 { + t.Errorf("p224Invert(p) = %x, expected 0", out) + } + + p224Invert(&out, &p224FieldElement{1}) + p224Contract(&out, &out) + if out != (p224FieldElement{1}) { + t.Errorf("p224Invert(1) = %x, expected 1", out) + } + + var tmp p224LargeFieldElement + a := p224FieldElement{1, 2, 3, 4, 5, 6, 7, 8} + p224Invert(&out, &a) + p224Mul(&out, &out, &a, &tmp) + p224Contract(&out, &out) + if out != (p224FieldElement{1}) { + t.Errorf("p224Invert(a) * a = %x, expected 1", out) + } +} -- GitLab From 3d40895e36e5f16654fa6b75f7fdf59edb18d2e0 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Tue, 25 Aug 2020 01:29:02 +1000 Subject: [PATCH 1663/1792] runtime: switch openbsd/arm64 to pthreads This switches openbsd/arm64 to thread creation via pthreads, rather than doing direct system calls. Update #36435 Change-Id: I7cf60fa954f92628e05f15d2732833a2fbdccdb9 Reviewed-on: https://go-review.googlesource.com/c/go/+/250182 Trust: Joel Sing Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot --- src/runtime/defs_openbsd_arm64.go | 9 + src/runtime/os_openbsd_libc.go | 2 +- src/runtime/os_openbsd_syscall.go | 1 + src/runtime/proc.go | 2 +- src/runtime/sys_libc.go | 2 +- src/runtime/sys_openbsd.go | 2 +- src/runtime/sys_openbsd_arm64.s | 281 +++++++++++++++++++----------- src/runtime/tls_arm64.s | 4 + 8 files changed, 195 insertions(+), 108 deletions(-) diff --git a/src/runtime/defs_openbsd_arm64.go b/src/runtime/defs_openbsd_arm64.go index 628f4bc5a5..63ea8dfecc 100644 --- a/src/runtime/defs_openbsd_arm64.go +++ b/src/runtime/defs_openbsd_arm64.go @@ -31,6 +31,8 @@ const ( _SA_RESTART = 0x2 _SA_ONSTACK = 0x1 + _PTHREAD_CREATE_DETACHED = 0x1 + _SIGHUP = 0x1 _SIGINT = 0x2 _SIGQUIT = 0x3 @@ -157,3 +159,10 @@ type keventt struct { data int64 udata *byte } + +type pthread uintptr +type pthreadattr uintptr +type pthreadcond uintptr +type pthreadcondattr uintptr +type pthreadmutex uintptr +type pthreadmutexattr uintptr diff --git a/src/runtime/os_openbsd_libc.go b/src/runtime/os_openbsd_libc.go index 60735644f0..2edb0358b0 100644 --- a/src/runtime/os_openbsd_libc.go +++ b/src/runtime/os_openbsd_libc.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. -// +build openbsd,amd64 +// +build openbsd,amd64 openbsd,arm64 package runtime diff --git a/src/runtime/os_openbsd_syscall.go b/src/runtime/os_openbsd_syscall.go index e91a97ca8e..16ff2b8e25 100644 --- a/src/runtime/os_openbsd_syscall.go +++ b/src/runtime/os_openbsd_syscall.go @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. // +build openbsd,!amd64 +// +build openbsd,!arm64 package runtime diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 26cf7c7335..30033712aa 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1224,7 +1224,7 @@ func mStackIsSystemAllocated() bool { return true case "openbsd": switch GOARCH { - case "amd64": + case "amd64", "arm64": return true } } diff --git a/src/runtime/sys_libc.go b/src/runtime/sys_libc.go index c97a97d77b..996c032105 100644 --- a/src/runtime/sys_libc.go +++ b/src/runtime/sys_libc.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. -// +build darwin openbsd,amd64 +// +build darwin openbsd,amd64 openbsd,arm64 package runtime diff --git a/src/runtime/sys_openbsd.go b/src/runtime/sys_openbsd.go index 4dfab7d7b0..56de00aad5 100644 --- a/src/runtime/sys_openbsd.go +++ b/src/runtime/sys_openbsd.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. -// +build openbsd,amd64 +// +build openbsd,amd64 openbsd,arm64 package runtime diff --git a/src/runtime/sys_openbsd_arm64.s b/src/runtime/sys_openbsd_arm64.s index 621b1b1a42..90646bbe85 100644 --- a/src/runtime/sys_openbsd_arm64.s +++ b/src/runtime/sys_openbsd_arm64.s @@ -3,7 +3,9 @@ // license that can be found in the LICENSE file. // // System calls and other sys.stuff for arm64, OpenBSD -// /usr/src/sys/kern/syscalls.master for syscall numbers. +// System calls are implemented in libc/libpthread, this file +// contains trampolines that convert from Go to C calling convention. +// Some direct system call implementations currently remain. // #include "go_asm.h" @@ -24,6 +26,180 @@ NOOP; \ NOOP +// 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,$160 + // R0 points to the m. + // We are already on m's g0 stack. + + // Save callee-save registers. + MOVD R19, 8(RSP) + MOVD R20, 16(RSP) + MOVD R21, 24(RSP) + MOVD R22, 32(RSP) + MOVD R23, 40(RSP) + MOVD R24, 48(RSP) + MOVD R25, 56(RSP) + MOVD R26, 64(RSP) + MOVD R27, 72(RSP) + MOVD g, 80(RSP) + MOVD R29, 88(RSP) + FMOVD F8, 96(RSP) + FMOVD F9, 104(RSP) + FMOVD F10, 112(RSP) + FMOVD F11, 120(RSP) + FMOVD F12, 128(RSP) + FMOVD F13, 136(RSP) + FMOVD F14, 144(RSP) + FMOVD F15, 152(RSP) + + MOVD m_g0(R0), g + BL runtime·save_g(SB) + + BL runtime·mstart(SB) + + // Restore callee-save registers. + MOVD 8(RSP), R19 + MOVD 16(RSP), R20 + MOVD 24(RSP), R21 + MOVD 32(RSP), R22 + MOVD 40(RSP), R23 + MOVD 48(RSP), R24 + MOVD 56(RSP), R25 + MOVD 64(RSP), R26 + MOVD 72(RSP), R27 + MOVD 80(RSP), g + MOVD 88(RSP), R29 + FMOVD 96(RSP), F8 + FMOVD 104(RSP), F9 + FMOVD 112(RSP), F10 + FMOVD 120(RSP), F11 + FMOVD 128(RSP), F12 + FMOVD 136(RSP), F13 + FMOVD 144(RSP), F14 + FMOVD 152(RSP), F15 + + // Go is all done with this OS thread. + // Tell pthread everything is ok (we never join with this thread, so + // the value here doesn't really matter). + MOVD $0, R0 + + RET + +TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 + MOVW sig+8(FP), R0 + MOVD info+16(FP), R1 + MOVD ctx+24(FP), R2 + MOVD fn+0(FP), R11 + BL (R11) // Alignment for ELF ABI? + RET + +TEXT runtime·sigtramp(SB),NOSPLIT,$192 + // Save callee-save registers in the case of signal forwarding. + // Please refer to https://golang.org/issue/31827 . + MOVD R19, 8*4(RSP) + MOVD R20, 8*5(RSP) + MOVD R21, 8*6(RSP) + MOVD R22, 8*7(RSP) + MOVD R23, 8*8(RSP) + MOVD R24, 8*9(RSP) + MOVD R25, 8*10(RSP) + MOVD R26, 8*11(RSP) + MOVD R27, 8*12(RSP) + MOVD g, 8*13(RSP) + MOVD R29, 8*14(RSP) + FMOVD F8, 8*15(RSP) + FMOVD F9, 8*16(RSP) + FMOVD F10, 8*17(RSP) + FMOVD F11, 8*18(RSP) + FMOVD F12, 8*19(RSP) + FMOVD F13, 8*20(RSP) + FMOVD F14, 8*21(RSP) + FMOVD F15, 8*22(RSP) + + // If called from an external code context, g will not be set. + // Save R0, since runtime·load_g will clobber it. + MOVW R0, 8(RSP) // signum + BL runtime·load_g(SB) + + MOVD R1, 16(RSP) + MOVD R2, 24(RSP) + BL runtime·sigtrampgo(SB) + + // Restore callee-save registers. + MOVD 8*4(RSP), R19 + MOVD 8*5(RSP), R20 + MOVD 8*6(RSP), R21 + MOVD 8*7(RSP), R22 + MOVD 8*8(RSP), R23 + MOVD 8*9(RSP), R24 + MOVD 8*10(RSP), R25 + MOVD 8*11(RSP), R26 + MOVD 8*12(RSP), R27 + MOVD 8*13(RSP), g + MOVD 8*14(RSP), R29 + FMOVD 8*15(RSP), F8 + FMOVD 8*16(RSP), F9 + FMOVD 8*17(RSP), F10 + FMOVD 8*18(RSP), F11 + FMOVD 8*19(RSP), F12 + FMOVD 8*20(RSP), F13 + FMOVD 8*21(RSP), F14 + FMOVD 8*22(RSP), F15 + + RET + +// +// These trampolines help convert from Go calling convention to C calling convention. +// They should be called with asmcgocall. +// A pointer to the arguments is passed in R0. +// A single int32 result is returned in R0. +// (For more results, make an args/results structure.) +TEXT runtime·pthread_attr_init_trampoline(SB),NOSPLIT,$0 + MOVD 0(R0), R0 // arg 1 - attr + CALL libc_pthread_attr_init(SB) + RET + +TEXT runtime·pthread_attr_destroy_trampoline(SB),NOSPLIT,$0 + MOVD 0(R0), R0 // arg 1 - attr + CALL libc_pthread_attr_destroy(SB) + RET + +TEXT runtime·pthread_attr_getstacksize_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - size + MOVD 0(R0), R0 // arg 1 - attr + CALL libc_pthread_attr_getstacksize(SB) + RET + +TEXT runtime·pthread_attr_setdetachstate_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - state + MOVD 0(R0), R0 // arg 1 - attr + CALL libc_pthread_attr_setdetachstate(SB) + RET + +TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 + MOVD 0(R0), R1 // arg 2 - attr + MOVD 8(R0), R2 // arg 3 - start + MOVD 16(R0), R3 // arg 4 - arg + SUB $16, RSP + MOVD RSP, R0 // arg 1 - &threadid (discard) + CALL libc_pthread_create(SB) + ADD $16, RSP + RET + +TEXT runtime·pthread_self_trampoline(SB),NOSPLIT,$0 + MOVD R0, R19 // pointer to args + CALL libc_pthread_self(SB) + MOVD R0, 0(R19) // return value + RET + +TEXT runtime·pthread_kill_trampoline(SB),NOSPLIT,$0 + MOVW 8(R0), R1 // arg 2 - sig + MOVD 0(R0), R0 // arg 1 - thread + CALL libc_pthread_kill(SB) + RET + // Exit the entire program (like C exit) TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0 MOVW code+0(FP), R0 // arg 1 - status @@ -248,109 +424,6 @@ TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$0 MOVW R0, ret+8(FP) RET -TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 - MOVW sig+8(FP), R0 - MOVD info+16(FP), R1 - MOVD ctx+24(FP), R2 - MOVD fn+0(FP), R11 - BL (R11) // Alignment for ELF ABI? - RET - -TEXT runtime·sigtramp(SB),NOSPLIT,$192 - // Save callee-save registers in the case of signal forwarding. - // Please refer to https://golang.org/issue/31827 . - MOVD R19, 8*4(RSP) - MOVD R20, 8*5(RSP) - MOVD R21, 8*6(RSP) - MOVD R22, 8*7(RSP) - MOVD R23, 8*8(RSP) - MOVD R24, 8*9(RSP) - MOVD R25, 8*10(RSP) - MOVD R26, 8*11(RSP) - MOVD R27, 8*12(RSP) - MOVD g, 8*13(RSP) - MOVD R29, 8*14(RSP) - FMOVD F8, 8*15(RSP) - FMOVD F9, 8*16(RSP) - FMOVD F10, 8*17(RSP) - FMOVD F11, 8*18(RSP) - FMOVD F12, 8*19(RSP) - FMOVD F13, 8*20(RSP) - FMOVD F14, 8*21(RSP) - FMOVD F15, 8*22(RSP) - - // If called from an external code context, g will not be set. - // Save R0, since runtime·load_g will clobber it. - MOVW R0, 8(RSP) // signum - MOVB runtime·iscgo(SB), R0 - CMP $0, R0 - BEQ 2(PC) - BL runtime·load_g(SB) - - MOVD R1, 16(RSP) - MOVD R2, 24(RSP) - BL runtime·sigtrampgo(SB) - - // Restore callee-save registers. - MOVD 8*4(RSP), R19 - MOVD 8*5(RSP), R20 - MOVD 8*6(RSP), R21 - MOVD 8*7(RSP), R22 - MOVD 8*8(RSP), R23 - MOVD 8*9(RSP), R24 - MOVD 8*10(RSP), R25 - MOVD 8*11(RSP), R26 - MOVD 8*12(RSP), R27 - MOVD 8*13(RSP), g - MOVD 8*14(RSP), R29 - FMOVD 8*15(RSP), F8 - FMOVD 8*16(RSP), F9 - FMOVD 8*17(RSP), F10 - FMOVD 8*18(RSP), F11 - FMOVD 8*19(RSP), F12 - FMOVD 8*20(RSP), F13 - FMOVD 8*21(RSP), F14 - FMOVD 8*22(RSP), F15 - - RET - -// int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void)); -TEXT runtime·tfork(SB),NOSPLIT,$0 - - // Copy mp, gp and fn off parent stack for use by child. - MOVD mm+16(FP), R4 - MOVD gg+24(FP), R5 - MOVD fn+32(FP), R6 - - MOVD param+0(FP), R0 // arg 1 - param - MOVD psize+8(FP), R1 // arg 2 - psize - MOVD $8, R8 // sys___tfork - INVOKE_SYSCALL - - // Return if syscall failed. - BCC 4(PC) - NEG R0, R0 - MOVW R0, ret+40(FP) - RET - - // In parent, return. - CMP $0, R0 - BEQ 3(PC) - MOVW R0, ret+40(FP) - RET - - // Initialise m, g. - MOVD R5, g - MOVD R4, g_m(g) - - // Call fn. - BL (R6) - - // fn should never return. - MOVD $2, R8 // crash if reached - MOVD R8, (R8) - RET - TEXT runtime·sigaltstack(SB),NOSPLIT,$0 MOVD new+0(FP), R0 // arg 1 - new sigaltstack MOVD old+8(FP), R1 // arg 2 - old sigaltstack diff --git a/src/runtime/tls_arm64.s b/src/runtime/tls_arm64.s index 3f02974d5b..085012f791 100644 --- a/src/runtime/tls_arm64.s +++ b/src/runtime/tls_arm64.s @@ -10,8 +10,10 @@ TEXT runtime·load_g(SB),NOSPLIT,$0 #ifndef TLS_darwin +#ifndef GOOS_openbsd MOVB runtime·iscgo(SB), R0 CBZ R0, nocgo +#endif #endif MRS_TPIDR_R0 @@ -27,8 +29,10 @@ nocgo: TEXT runtime·save_g(SB),NOSPLIT,$0 #ifndef TLS_darwin +#ifndef GOOS_openbsd MOVB runtime·iscgo(SB), R0 CBZ R0, nocgo +#endif #endif MRS_TPIDR_R0 -- GitLab From 46e2e2e9d99925bbf724b12693c6d3e27a95d6a0 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 11 Jan 2021 09:41:54 -0500 Subject: [PATCH 1664/1792] cmd/go: pass resolved CC, GCCGO to cgo This makes sure the go command and cgo agree about exactly which compiler is being used. This issue was reported by RyotaK. Fixes CVE-2021-3115 Fixes #43783 Change-Id: If171c5c8b2523efb5ea2d957e5ad1380a038149c Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/949416 Reviewed-by: Ian Lance Taylor Reviewed-by: Jay Conrod Reviewed-on: https://go-review.googlesource.com/c/go/+/284780 Run-TryBot: Roland Shoemaker TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Roland Shoemaker --- src/cmd/go/internal/work/action.go | 3 +++ src/cmd/go/internal/work/exec.go | 30 +++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index 9d141ae233..b071ed1400 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -57,6 +57,9 @@ type Builder struct { id sync.Mutex toolIDCache map[string]string // tool name -> tool ID buildIDCache map[string]string // file name -> build ID + + cgoEnvOnce sync.Once + cgoEnvCache []string } // NOTE: Much of Action would not need to be exported if not for test. diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index af8b78e661..e750904266 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -1164,10 +1164,8 @@ func (b *Builder) vet(ctx context.Context, a *Action) error { return err } - env := b.cCompilerEnv() - if cfg.BuildToolchainName == "gccgo" { - env = append(env, "GCCGO="+BuildToolchain.compiler()) - } + // TODO(rsc): Why do we pass $GCCGO to go vet? + env := b.cgoEnv() p := a.Package tool := VetTool @@ -2110,6 +2108,24 @@ func (b *Builder) cCompilerEnv() []string { return []string{"TERM=dumb"} } +// cgoEnv returns environment variables to set when running cgo. +// Some of these pass through to cgo running the C compiler, +// so it includes cCompilerEnv. +func (b *Builder) cgoEnv() []string { + b.cgoEnvOnce.Do(func() { + cc, err := exec.LookPath(b.ccExe()[0]) + if err != nil || filepath.Base(cc) == cc { // reject relative path + cc = "/missing-cc" + } + gccgo := GccgoBin + if filepath.Base(gccgo) == gccgo { // reject relative path + gccgo = "/missing-gccgo" + } + b.cgoEnvCache = append(b.cCompilerEnv(), "CC="+cc, "GCCGO="+gccgo) + }) + return b.cgoEnvCache +} + // 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 == "". @@ -2710,13 +2726,13 @@ func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgo // along to the host linker. At this point in the code, cgoLDFLAGS // consists of the original $CGO_LDFLAGS (unchecked) and all the // flags put together from source code (checked). - cgoenv := b.cCompilerEnv() + cgoenv := b.cgoEnv() if len(cgoLDFLAGS) > 0 { flags := make([]string, len(cgoLDFLAGS)) for i, f := range cgoLDFLAGS { flags[i] = strconv.Quote(f) } - cgoenv = []string{"CGO_LDFLAGS=" + strings.Join(flags, " ")} + cgoenv = append(cgoenv, "CGO_LDFLAGS="+strings.Join(flags, " ")) } if cfg.BuildToolchainName == "gccgo" { @@ -2947,7 +2963,7 @@ func (b *Builder) dynimport(a *Action, p *load.Package, objdir, importGo, cgoExe if p.Standard && p.ImportPath == "runtime/cgo" { cgoflags = []string{"-dynlinker"} // record path to dynamic linker } - return b.run(a, base.Cwd, p.ImportPath, b.cCompilerEnv(), cfg.BuildToolexec, cgoExe, "-dynpackage", p.Name, "-dynimport", dynobj, "-dynout", importGo, cgoflags) + return b.run(a, base.Cwd, p.ImportPath, b.cgoEnv(), cfg.BuildToolexec, cgoExe, "-dynpackage", p.Name, "-dynimport", dynobj, "-dynout", importGo, cgoflags) } // Run SWIG on all SWIG input files. -- GitLab From 5a8a2265fb3f2a4f2b37737e8a69e1aea763325f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 11 Jan 2021 10:01:24 -0500 Subject: [PATCH 1665/1792] cmd/cgo: report exec errors a bit more clearly Change-Id: I0e6bebf0e2e6efdef4be880e0c6c7451b938924b Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/949417 Reviewed-by: Katie Hockman Reviewed-by: Jay Conrod Reviewed-by: Ian Lance Taylor Reviewed-on: https://go-review.googlesource.com/c/go/+/284781 Run-TryBot: Roland Shoemaker Reviewed-by: Ian Lance Taylor Trust: Roland Shoemaker --- src/cmd/cgo/util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/cgo/util.go b/src/cmd/cgo/util.go index 921306b7aa..779f7be225 100644 --- a/src/cmd/cgo/util.go +++ b/src/cmd/cgo/util.go @@ -63,7 +63,7 @@ func run(stdin []byte, argv []string) (stdout, stderr []byte, ok bool) { p.Env = append(os.Environ(), "TERM=dumb") err := p.Run() if _, ok := err.(*exec.ExitError); err != nil && !ok { - fatalf("%s", err) + fatalf("exec %s: %s", argv[0], err) } ok = p.ProcessState.Success() stdout, stderr = bout.Bytes(), berr.Bytes() @@ -88,7 +88,7 @@ func fatalf(msg string, args ...interface{}) { // If we've already printed other errors, they might have // caused the fatal condition. Assume they're enough. if nerrors == 0 { - fmt.Fprintf(os.Stderr, msg+"\n", args...) + fmt.Fprintf(os.Stderr, "cgo: "+msg+"\n", args...) } os.Exit(2) } -- GitLab From b186e4d70de28697d1ad7e3c31625793e6338ef0 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 11 Jan 2021 09:43:08 -0500 Subject: [PATCH 1666/1792] cmd/go: add test case for cgo CC setting Change-Id: Ied986053a64447c5eac6369f6c9b69ed3d3f94d9 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/949415 Reviewed-by: Ian Lance Taylor Reviewed-on: https://go-review.googlesource.com/c/go/+/284782 Run-TryBot: Roland Shoemaker TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Roland Shoemaker --- src/cmd/go/testdata/script/cgo_path.txt | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/cmd/go/testdata/script/cgo_path.txt diff --git a/src/cmd/go/testdata/script/cgo_path.txt b/src/cmd/go/testdata/script/cgo_path.txt new file mode 100644 index 0000000000..0d15998426 --- /dev/null +++ b/src/cmd/go/testdata/script/cgo_path.txt @@ -0,0 +1,35 @@ +[!cgo] skip + +env GOCACHE=$WORK/gocache # Looking for compile flags, so need a clean cache. +[!windows] env PATH=.:$PATH +[!windows] chmod 0777 p/gcc p/clang +[!windows] exists -exec p/gcc p/clang +[windows] exists -exec p/gcc.bat p/clang.bat +! exists p/bug.txt +go build -x +! exists p/bug.txt + +-- go.mod -- +module m + +-- m.go -- +package m + +import _ "m/p" + +-- p/p.go -- +package p + +// #define X 1 +import "C" + +-- p/gcc -- +#!/bin/sh +echo ran gcc >bug.txt +-- p/clang -- +#!/bin/sh +echo ran clang >bug.txt +-- p/gcc.bat -- +echo ran gcc >bug.txt +-- p/clang.bat -- +echo ran clang >bug.txt -- GitLab From 953d1feca9b21af075ad5fc8a3dad096d3ccc3a0 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Fri, 15 Jan 2021 12:14:06 -0800 Subject: [PATCH 1667/1792] all: introduce and use internal/execabs Introduces a wrapper around os/exec, internal/execabs, for use in all commands. This wrapper prevents exec.LookPath and exec.Command from running executables in the current directory. All imports of os/exec in non-test files in cmd/ are replaced with imports of internal/execabs. This issue was reported by RyotaK. Fixes CVE-2021-3115 Fixes #43783 Change-Id: I0423451a6e27ec1e1d6f3fe929ab1ef69145c08f Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/955304 Reviewed-by: Russ Cox Reviewed-by: Katie Hockman Reviewed-on: https://go-review.googlesource.com/c/go/+/284783 Run-TryBot: Roland Shoemaker Reviewed-by: Katie Hockman Trust: Roland Shoemaker --- src/cmd/api/goapi.go | 2 +- src/cmd/api/run.go | 2 +- src/cmd/cgo/out.go | 2 +- src/cmd/cgo/util.go | 2 +- src/cmd/compile/internal/ssa/html.go | 2 +- src/cmd/cover/func.go | 2 +- src/cmd/cover/testdata/toolexec.go | 2 +- src/cmd/dist/buildtool.go | 4 +- src/cmd/doc/dirs.go | 2 +- src/cmd/fix/typecheck.go | 2 +- src/cmd/go/internal/base/base.go | 2 +- src/cmd/go/internal/bug/bug.go | 2 +- src/cmd/go/internal/generate/generate.go | 2 +- .../go/internal/modfetch/codehost/codehost.go | 2 +- src/cmd/go/internal/modfetch/codehost/git.go | 2 +- src/cmd/go/internal/test/genflags.go | 2 +- src/cmd/go/internal/test/test.go | 2 +- src/cmd/go/internal/tool/tool.go | 2 +- src/cmd/go/internal/vcs/vcs.go | 2 +- src/cmd/go/internal/vet/vetflag.go | 2 +- src/cmd/go/internal/work/build.go | 2 +- src/cmd/go/internal/work/buildid.go | 2 +- src/cmd/go/internal/work/exec.go | 2 +- src/cmd/go/internal/work/gccgo.go | 2 +- src/cmd/go/testdata/addmod.go | 2 +- src/cmd/internal/browser/browser.go | 2 +- src/cmd/internal/diff/diff.go | 2 +- src/cmd/internal/dwarf/dwarf.go | 2 +- src/cmd/internal/pkgpath/pkgpath.go | 2 +- src/cmd/link/internal/ld/execarchive.go | 2 +- src/cmd/link/internal/ld/lib.go | 2 +- src/cmd/test2json/main.go | 2 +- src/cmd/trace/pprof.go | 2 +- src/go/build/build.go | 2 +- src/go/build/deps_test.go | 8 +- .../gccgoimporter/gccgoinstallation.go | 2 +- src/go/internal/srcimporter/srcimporter.go | 2 +- src/internal/execabs/execabs.go | 70 ++++++++++++ src/internal/execabs/execabs_test.go | 104 ++++++++++++++++++ src/internal/goroot/gc.go | 2 +- 40 files changed, 220 insertions(+), 38 deletions(-) create mode 100644 src/internal/execabs/execabs.go create mode 100644 src/internal/execabs/execabs_test.go diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index ba42812fa6..efc2696f8f 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -16,10 +16,10 @@ import ( "go/parser" "go/token" "go/types" + exec "internal/execabs" "io" "log" "os" - "os/exec" "path/filepath" "regexp" "runtime" diff --git a/src/cmd/api/run.go b/src/cmd/api/run.go index a36f1179c1..ecb1d0f81a 100644 --- a/src/cmd/api/run.go +++ b/src/cmd/api/run.go @@ -10,9 +10,9 @@ package main import ( "fmt" + exec "internal/execabs" "log" "os" - "os/exec" "path/filepath" "runtime" "strings" diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index fa6f0efbbe..8e83f02202 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -14,10 +14,10 @@ import ( "go/ast" "go/printer" "go/token" + exec "internal/execabs" "internal/xcoff" "io" "os" - "os/exec" "path/filepath" "regexp" "sort" diff --git a/src/cmd/cgo/util.go b/src/cmd/cgo/util.go index 779f7be225..00d931b98a 100644 --- a/src/cmd/cgo/util.go +++ b/src/cmd/cgo/util.go @@ -8,9 +8,9 @@ import ( "bytes" "fmt" "go/token" + exec "internal/execabs" "io/ioutil" "os" - "os/exec" ) // run runs the command argv, feeding in stdin on standard input. diff --git a/src/cmd/compile/internal/ssa/html.go b/src/cmd/compile/internal/ssa/html.go index a9d52fa4ee..c06b5808e1 100644 --- a/src/cmd/compile/internal/ssa/html.go +++ b/src/cmd/compile/internal/ssa/html.go @@ -9,9 +9,9 @@ import ( "cmd/internal/src" "fmt" "html" + exec "internal/execabs" "io" "os" - "os/exec" "path/filepath" "strconv" "strings" diff --git a/src/cmd/cover/func.go b/src/cmd/cover/func.go index 988c4caebf..ce7c771ac9 100644 --- a/src/cmd/cover/func.go +++ b/src/cmd/cover/func.go @@ -15,9 +15,9 @@ import ( "go/ast" "go/parser" "go/token" + exec "internal/execabs" "io" "os" - "os/exec" "path" "path/filepath" "runtime" diff --git a/src/cmd/cover/testdata/toolexec.go b/src/cmd/cover/testdata/toolexec.go index 1769efedbe..386de79038 100644 --- a/src/cmd/cover/testdata/toolexec.go +++ b/src/cmd/cover/testdata/toolexec.go @@ -16,7 +16,7 @@ package main import ( "os" - "os/exec" + exec "internal/execabs" "strings" ) diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go index e7bedfb84e..cf85f2ac8e 100644 --- a/src/cmd/dist/buildtool.go +++ b/src/cmd/dist/buildtool.go @@ -305,8 +305,10 @@ func bootstrapFixImports(srcFile string) string { continue } if strings.HasPrefix(line, `import "`) || strings.HasPrefix(line, `import . "`) || - inBlock && (strings.HasPrefix(line, "\t\"") || strings.HasPrefix(line, "\t. \"")) { + inBlock && (strings.HasPrefix(line, "\t\"") || strings.HasPrefix(line, "\t. \"") || strings.HasPrefix(line, "\texec \"")) { line = strings.Replace(line, `"cmd/`, `"bootstrap/cmd/`, -1) + // During bootstrap, must use plain os/exec. + line = strings.Replace(line, `exec "internal/execabs"`, `"os/exec"`, -1) for _, dir := range bootstrapDirs { if strings.HasPrefix(dir, "cmd/") { continue diff --git a/src/cmd/doc/dirs.go b/src/cmd/doc/dirs.go index 38cbe7fa02..661624cfe4 100644 --- a/src/cmd/doc/dirs.go +++ b/src/cmd/doc/dirs.go @@ -7,9 +7,9 @@ package main import ( "bytes" "fmt" + exec "internal/execabs" "log" "os" - "os/exec" "path/filepath" "regexp" "strings" diff --git a/src/cmd/fix/typecheck.go b/src/cmd/fix/typecheck.go index 40b2287f26..39a53785b7 100644 --- a/src/cmd/fix/typecheck.go +++ b/src/cmd/fix/typecheck.go @@ -9,8 +9,8 @@ import ( "go/ast" "go/parser" "go/token" + exec "internal/execabs" "os" - "os/exec" "path/filepath" "reflect" "runtime" diff --git a/src/cmd/go/internal/base/base.go b/src/cmd/go/internal/base/base.go index 004588c732..954ce47a98 100644 --- a/src/cmd/go/internal/base/base.go +++ b/src/cmd/go/internal/base/base.go @@ -10,9 +10,9 @@ import ( "context" "flag" "fmt" + exec "internal/execabs" "log" "os" - "os/exec" "strings" "sync" diff --git a/src/cmd/go/internal/bug/bug.go b/src/cmd/go/internal/bug/bug.go index 1085feaaee..4aa08b4ff6 100644 --- a/src/cmd/go/internal/bug/bug.go +++ b/src/cmd/go/internal/bug/bug.go @@ -9,10 +9,10 @@ import ( "bytes" "context" "fmt" + exec "internal/execabs" "io" urlpkg "net/url" "os" - "os/exec" "path/filepath" "regexp" "runtime" diff --git a/src/cmd/go/internal/generate/generate.go b/src/cmd/go/internal/generate/generate.go index b1e001c800..a48311d51b 100644 --- a/src/cmd/go/internal/generate/generate.go +++ b/src/cmd/go/internal/generate/generate.go @@ -12,10 +12,10 @@ import ( "fmt" "go/parser" "go/token" + exec "internal/execabs" "io" "log" "os" - "os/exec" "path/filepath" "regexp" "strconv" diff --git a/src/cmd/go/internal/modfetch/codehost/codehost.go b/src/cmd/go/internal/modfetch/codehost/codehost.go index 86c1c14d4a..378fbae34f 100644 --- a/src/cmd/go/internal/modfetch/codehost/codehost.go +++ b/src/cmd/go/internal/modfetch/codehost/codehost.go @@ -10,10 +10,10 @@ import ( "bytes" "crypto/sha256" "fmt" + exec "internal/execabs" "io" "io/fs" "os" - "os/exec" "path/filepath" "strings" "sync" diff --git a/src/cmd/go/internal/modfetch/codehost/git.go b/src/cmd/go/internal/modfetch/codehost/git.go index 8abc039e7f..72005e27d5 100644 --- a/src/cmd/go/internal/modfetch/codehost/git.go +++ b/src/cmd/go/internal/modfetch/codehost/git.go @@ -8,11 +8,11 @@ import ( "bytes" "errors" "fmt" + exec "internal/execabs" "io" "io/fs" "net/url" "os" - "os/exec" "path/filepath" "sort" "strconv" diff --git a/src/cmd/go/internal/test/genflags.go b/src/cmd/go/internal/test/genflags.go index 5e83d53980..30334b0f30 100644 --- a/src/cmd/go/internal/test/genflags.go +++ b/src/cmd/go/internal/test/genflags.go @@ -9,9 +9,9 @@ package main import ( "bytes" "flag" + exec "internal/execabs" "log" "os" - "os/exec" "strings" "testing" "text/template" diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 50fe2dbf39..7fc9e8fbdc 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -11,10 +11,10 @@ import ( "errors" "fmt" "go/build" + exec "internal/execabs" "io" "io/fs" "os" - "os/exec" "path" "path/filepath" "regexp" diff --git a/src/cmd/go/internal/tool/tool.go b/src/cmd/go/internal/tool/tool.go index 6a755bc436..95c90ea7c8 100644 --- a/src/cmd/go/internal/tool/tool.go +++ b/src/cmd/go/internal/tool/tool.go @@ -8,8 +8,8 @@ package tool import ( "context" "fmt" + exec "internal/execabs" "os" - "os/exec" "os/signal" "sort" "strings" diff --git a/src/cmd/go/internal/vcs/vcs.go b/src/cmd/go/internal/vcs/vcs.go index 327ea7cc86..9feffe0765 100644 --- a/src/cmd/go/internal/vcs/vcs.go +++ b/src/cmd/go/internal/vcs/vcs.go @@ -8,13 +8,13 @@ import ( "encoding/json" "errors" "fmt" + exec "internal/execabs" "internal/lazyregexp" "internal/singleflight" "io/fs" "log" urlpkg "net/url" "os" - "os/exec" "path/filepath" "regexp" "strings" diff --git a/src/cmd/go/internal/vet/vetflag.go b/src/cmd/go/internal/vet/vetflag.go index ef995ef835..5bf5cf4446 100644 --- a/src/cmd/go/internal/vet/vetflag.go +++ b/src/cmd/go/internal/vet/vetflag.go @@ -10,9 +10,9 @@ import ( "errors" "flag" "fmt" + exec "internal/execabs" "log" "os" - "os/exec" "path/filepath" "strings" diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 873d85de4e..780d639c5d 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -9,9 +9,9 @@ import ( "errors" "fmt" "go/build" + exec "internal/execabs" "internal/goroot" "os" - "os/exec" "path" "path/filepath" "runtime" diff --git a/src/cmd/go/internal/work/buildid.go b/src/cmd/go/internal/work/buildid.go index d76988145b..c555d4a9f1 100644 --- a/src/cmd/go/internal/work/buildid.go +++ b/src/cmd/go/internal/work/buildid.go @@ -7,8 +7,8 @@ package work import ( "bytes" "fmt" + exec "internal/execabs" "os" - "os/exec" "strings" "cmd/go/internal/base" diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index e750904266..16a4ebaa0f 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -13,13 +13,13 @@ import ( "encoding/json" "errors" "fmt" + exec "internal/execabs" "internal/lazyregexp" "io" "io/fs" "log" "math/rand" "os" - "os/exec" "path/filepath" "regexp" "runtime" diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go index 45ff7c9838..b58c8aa885 100644 --- a/src/cmd/go/internal/work/gccgo.go +++ b/src/cmd/go/internal/work/gccgo.go @@ -6,8 +6,8 @@ package work import ( "fmt" + exec "internal/execabs" "os" - "os/exec" "path/filepath" "strings" "sync" diff --git a/src/cmd/go/testdata/addmod.go b/src/cmd/go/testdata/addmod.go index 58376b7ed4..09fc8e713b 100644 --- a/src/cmd/go/testdata/addmod.go +++ b/src/cmd/go/testdata/addmod.go @@ -25,7 +25,7 @@ import ( "io/fs" "log" "os" - "os/exec" + exec "internal/execabs" "path/filepath" "strings" diff --git a/src/cmd/internal/browser/browser.go b/src/cmd/internal/browser/browser.go index 6867c85d23..577d31789f 100644 --- a/src/cmd/internal/browser/browser.go +++ b/src/cmd/internal/browser/browser.go @@ -6,8 +6,8 @@ package browser import ( + exec "internal/execabs" "os" - "os/exec" "runtime" "time" ) diff --git a/src/cmd/internal/diff/diff.go b/src/cmd/internal/diff/diff.go index e9d2c23780..c0ca2f3106 100644 --- a/src/cmd/internal/diff/diff.go +++ b/src/cmd/internal/diff/diff.go @@ -7,9 +7,9 @@ package diff import ( + exec "internal/execabs" "io/ioutil" "os" - "os/exec" "runtime" ) diff --git a/src/cmd/internal/dwarf/dwarf.go b/src/cmd/internal/dwarf/dwarf.go index e1a70ef853..8de4096f06 100644 --- a/src/cmd/internal/dwarf/dwarf.go +++ b/src/cmd/internal/dwarf/dwarf.go @@ -12,7 +12,7 @@ import ( "cmd/internal/objabi" "errors" "fmt" - "os/exec" + exec "internal/execabs" "sort" "strconv" "strings" diff --git a/src/cmd/internal/pkgpath/pkgpath.go b/src/cmd/internal/pkgpath/pkgpath.go index 40a040a81a..72e3bdb631 100644 --- a/src/cmd/internal/pkgpath/pkgpath.go +++ b/src/cmd/internal/pkgpath/pkgpath.go @@ -10,9 +10,9 @@ import ( "bytes" "errors" "fmt" + exec "internal/execabs" "io/ioutil" "os" - "os/exec" "strings" ) diff --git a/src/cmd/link/internal/ld/execarchive.go b/src/cmd/link/internal/ld/execarchive.go index fe5cc40865..4687c624de 100644 --- a/src/cmd/link/internal/ld/execarchive.go +++ b/src/cmd/link/internal/ld/execarchive.go @@ -7,8 +7,8 @@ package ld import ( + exec "internal/execabs" "os" - "os/exec" "path/filepath" "syscall" ) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 014969664b..17d5040827 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -49,11 +49,11 @@ import ( "encoding/base64" "encoding/binary" "fmt" + exec "internal/execabs" "io" "io/ioutil" "log" "os" - "os/exec" "path/filepath" "runtime" "sort" diff --git a/src/cmd/test2json/main.go b/src/cmd/test2json/main.go index e40881ab3f..fdf681a8ff 100644 --- a/src/cmd/test2json/main.go +++ b/src/cmd/test2json/main.go @@ -86,9 +86,9 @@ package main import ( "flag" "fmt" + exec "internal/execabs" "io" "os" - "os/exec" "cmd/internal/test2json" ) diff --git a/src/cmd/trace/pprof.go b/src/cmd/trace/pprof.go index a73ff5336a..c4d3742820 100644 --- a/src/cmd/trace/pprof.go +++ b/src/cmd/trace/pprof.go @@ -9,11 +9,11 @@ package main import ( "bufio" "fmt" + exec "internal/execabs" "internal/trace" "io" "net/http" "os" - "os/exec" "path/filepath" "runtime" "sort" diff --git a/src/go/build/build.go b/src/go/build/build.go index 72311c7d2c..217fadf5bd 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -11,13 +11,13 @@ import ( "go/ast" "go/doc" "go/token" + exec "internal/execabs" "internal/goroot" "internal/goversion" "io" "io/fs" "io/ioutil" "os" - "os/exec" pathpkg "path" "path/filepath" "runtime" diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 99cd59e5b5..c97c668cc4 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -178,7 +178,7 @@ var depsRules = ` reflect !< OS; OS - < golang.org/x/sys/cpu, internal/goroot; + < golang.org/x/sys/cpu; # FMT is OS (which includes string routines) plus reflect and fmt. # It does not include package log, which should be avoided in core packages. @@ -194,6 +194,12 @@ var depsRules = ` log !< FMT; + OS, FMT + < internal/execabs; + + OS, internal/execabs + < internal/goroot; + # Misc packages needing only FMT. FMT < flag, diff --git a/src/go/internal/gccgoimporter/gccgoinstallation.go b/src/go/internal/gccgoimporter/gccgoinstallation.go index 8fc7ce3232..e90a3cc0b0 100644 --- a/src/go/internal/gccgoimporter/gccgoinstallation.go +++ b/src/go/internal/gccgoimporter/gccgoinstallation.go @@ -7,8 +7,8 @@ package gccgoimporter import ( "bufio" "go/types" + exec "internal/execabs" "os" - "os/exec" "path/filepath" "strings" ) diff --git a/src/go/internal/srcimporter/srcimporter.go b/src/go/internal/srcimporter/srcimporter.go index c4d501dcd9..438ae0ff2e 100644 --- a/src/go/internal/srcimporter/srcimporter.go +++ b/src/go/internal/srcimporter/srcimporter.go @@ -13,9 +13,9 @@ import ( "go/parser" "go/token" "go/types" + exec "internal/execabs" "io" "os" - "os/exec" "path/filepath" "strings" "sync" diff --git a/src/internal/execabs/execabs.go b/src/internal/execabs/execabs.go new file mode 100644 index 0000000000..9a05d971da --- /dev/null +++ b/src/internal/execabs/execabs.go @@ -0,0 +1,70 @@ +// 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 execabs is a drop-in replacement for os/exec +// that requires PATH lookups to find absolute paths. +// That is, execabs.Command("cmd") runs the same PATH lookup +// as exec.Command("cmd"), but if the result is a path +// which is relative, the Run and Start methods will report +// an error instead of running the executable. +package execabs + +import ( + "context" + "fmt" + "os/exec" + "path/filepath" + "reflect" + "unsafe" +) + +var ErrNotFound = exec.ErrNotFound + +type ( + Cmd = exec.Cmd + Error = exec.Error + ExitError = exec.ExitError +) + +func relError(file, path string) error { + return fmt.Errorf("%s resolves to executable relative to current directory (.%c%s)", file, filepath.Separator, path) +} + +func LookPath(file string) (string, error) { + path, err := exec.LookPath(file) + if err != nil { + return "", err + } + if filepath.Base(file) == file && !filepath.IsAbs(path) { + return "", relError(file, path) + } + return path, nil +} + +func fixCmd(name string, cmd *exec.Cmd) { + if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) { + // exec.Command was called with a bare binary name and + // exec.LookPath returned a path which is not absolute. + // Set cmd.lookPathErr and clear cmd.Path so that it + // cannot be run. + lookPathErr := (*error)(unsafe.Pointer(reflect.ValueOf(cmd).Elem().FieldByName("lookPathErr").Addr().Pointer())) + if *lookPathErr == nil { + *lookPathErr = relError(name, cmd.Path) + } + cmd.Path = "" + } +} + +func CommandContext(ctx context.Context, name string, arg ...string) *exec.Cmd { + cmd := exec.CommandContext(ctx, name, arg...) + fixCmd(name, cmd) + return cmd + +} + +func Command(name string, arg ...string) *exec.Cmd { + cmd := exec.Command(name, arg...) + fixCmd(name, cmd) + return cmd +} diff --git a/src/internal/execabs/execabs_test.go b/src/internal/execabs/execabs_test.go new file mode 100644 index 0000000000..b71458587c --- /dev/null +++ b/src/internal/execabs/execabs_test.go @@ -0,0 +1,104 @@ +// 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 execabs + +import ( + "context" + "fmt" + "internal/testenv" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" +) + +func TestFixCmd(t *testing.T) { + cmd := &exec.Cmd{Path: "hello"} + fixCmd("hello", cmd) + if cmd.Path != "" { + t.Error("fixCmd didn't clear cmd.Path") + } + expectedErr := fmt.Sprintf("hello resolves to executable relative to current directory (.%chello)", filepath.Separator) + if err := cmd.Run(); err == nil { + t.Fatal("Command.Run didn't fail") + } else if err.Error() != expectedErr { + t.Fatalf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error()) + } +} + +func TestCommand(t *testing.T) { + testenv.MustHaveExec(t) + + for _, cmd := range []func(string) *Cmd{ + func(s string) *Cmd { return Command(s) }, + func(s string) *Cmd { return CommandContext(context.Background(), s) }, + } { + tmpDir := t.TempDir() + executable := "execabs-test" + if runtime.GOOS == "windows" { + executable += ".exe" + } + if err := ioutil.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil { + t.Fatalf("ioutil.WriteFile failed: %s", err) + } + cwd, err := os.Getwd() + if err != nil { + t.Fatalf("os.Getwd failed: %s", err) + } + defer os.Chdir(cwd) + if err = os.Chdir(tmpDir); err != nil { + t.Fatalf("os.Chdir failed: %s", err) + } + if runtime.GOOS != "windows" { + // add "." to PATH so that exec.LookPath looks in the current directory on + // non-windows platforms as well + origPath := os.Getenv("PATH") + defer os.Setenv("PATH", origPath) + os.Setenv("PATH", fmt.Sprintf(".:%s", origPath)) + } + expectedErr := fmt.Sprintf("execabs-test resolves to executable relative to current directory (.%c%s)", filepath.Separator, executable) + if err = cmd("execabs-test").Run(); err == nil { + t.Fatalf("Command.Run didn't fail when exec.LookPath returned a relative path") + } else if err.Error() != expectedErr { + t.Errorf("Command.Run returned unexpected error: want %q, got %q", expectedErr, err.Error()) + } + } +} + +func TestLookPath(t *testing.T) { + testenv.MustHaveExec(t) + + tmpDir := t.TempDir() + executable := "execabs-test" + if runtime.GOOS == "windows" { + executable += ".exe" + } + if err := ioutil.WriteFile(filepath.Join(tmpDir, executable), []byte{1, 2, 3}, 0111); err != nil { + t.Fatalf("ioutil.WriteFile failed: %s", err) + } + cwd, err := os.Getwd() + if err != nil { + t.Fatalf("os.Getwd failed: %s", err) + } + defer os.Chdir(cwd) + if err = os.Chdir(tmpDir); err != nil { + t.Fatalf("os.Chdir failed: %s", err) + } + if runtime.GOOS != "windows" { + // add "." to PATH so that exec.LookPath looks in the current directory on + // non-windows platforms as well + origPath := os.Getenv("PATH") + defer os.Setenv("PATH", origPath) + os.Setenv("PATH", fmt.Sprintf(".:%s", origPath)) + } + expectedErr := fmt.Sprintf("execabs-test resolves to executable relative to current directory (.%c%s)", filepath.Separator, executable) + if _, err := LookPath("execabs-test"); err == nil { + t.Fatalf("LookPath didn't fail when finding a non-relative path") + } else if err.Error() != expectedErr { + t.Errorf("LookPath returned unexpected error: want %q, got %q", expectedErr, err.Error()) + } +} diff --git a/src/internal/goroot/gc.go b/src/internal/goroot/gc.go index 0f541d734b..ce72bc3896 100644 --- a/src/internal/goroot/gc.go +++ b/src/internal/goroot/gc.go @@ -7,8 +7,8 @@ package goroot import ( + exec "internal/execabs" "os" - "os/exec" "path/filepath" "strings" "sync" -- GitLab From 3c2f11ba5b76cda35a5bedc9299833c649216b83 Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Tue, 19 Jan 2021 09:59:24 -0800 Subject: [PATCH 1668/1792] cmd/go: overwrite program name with full path If the program path is resolved, replace the first argument of the exec.Cmd, which is the bare program name with the resolved path. Change-Id: I92cf5e6f4bb7c8fef9b59f5eab963f4e75b90d07 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/957908 Reviewed-by: Katie Hockman Reviewed-by: Russ Cox Reviewed-by: Jay Conrod Reviewed-on: https://go-review.googlesource.com/c/go/+/284784 Trust: Roland Shoemaker Reviewed-by: Ian Lance Taylor Run-TryBot: Roland Shoemaker --- src/cmd/go/internal/work/exec.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 16a4ebaa0f..cacb4c05df 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2042,6 +2042,9 @@ func (b *Builder) runOut(a *Action, dir string, env []string, cmdargs ...interfa var buf bytes.Buffer cmd := exec.Command(cmdline[0], cmdline[1:]...) + if cmd.Path != "" { + cmd.Args[0] = cmd.Path + } cmd.Stdout = &buf cmd.Stderr = &buf cleanup := passLongArgsInResponseFiles(cmd) -- GitLab From 9f43a9e07b1379a808de38559e408040b17ced1c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 20 Jan 2021 20:09:18 -0800 Subject: [PATCH 1669/1792] doc/go1.16: mention new debug/elf constants For #40700 Change-Id: If105d2f043539bb0893f577a984f14ee3e7ca753 Reviewed-on: https://go-review.googlesource.com/c/go/+/285212 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 3645e018b2..6e912f61fa 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -616,6 +616,16 @@ func TestFoo(t *testing.T) {

    +
    debug/elf
    +
    +

    + More DT + and PT + constants have been added. +

    +
    +
    +
    encoding/asn1

    -- GitLab From e2b4f1fea5b0367fd6d687f677f9a8cb9dc252ea Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 21 Jan 2021 14:24:14 -0500 Subject: [PATCH 1670/1792] doc/go1.16: minor formatting fix Change-Id: Ie924a15da0d9a35089d1d4b3d6c4a07b93bdf270 Reviewed-on: https://go-review.googlesource.com/c/go/+/285393 Trust: Austin Clements Reviewed-by: Ian Lance Taylor --- doc/go1.16.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 6e912f61fa..ca07689fc8 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -892,11 +892,11 @@ func TestFoo(t *testing.T) {

    - SysProcAttr on Windows has a new NoInheritHandles field that disables inheriting handles when creating a new process. + SysProcAttr on Windows has a new NoInheritHandles field that disables inheriting handles when creating a new process.

    - DLLError on Windows now has an Unwrap function for unwrapping its underlying error. + DLLError on Windows now has an Unwrap method for unwrapping its underlying error.

    -- GitLab From 07b023560983db0ea0d82265be68fe5f89d545fe Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 20 Jan 2021 18:01:56 -0800 Subject: [PATCH 1671/1792] doc/go1.16: add notes about package-specific fs.FS changes For #40700 For #41190 Change-Id: I964d6856d5cad62c859d0f3a7afdd349a8ad87cb Reviewed-on: https://go-review.googlesource.com/c/go/+/285093 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index ca07689fc8..c76161432e 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -512,6 +512,16 @@ func TestFoo(t *testing.T) { in mind.

    +
    archive/zip
    +
    +

    + The new Reader.Open + method implements the fs.FS + interface. +

    +
    +
    +
    crypto/dsa

    @@ -675,6 +685,18 @@ func TestFoo(t *testing.T) {

    +
    html/template
    +
    +

    + The new template.ParseFS + function and template.Template.ParseFS + method are like template.ParseGlob + and template.Template.ParseGlob, + but read the templates from an fs.FS. +

    +
    +
    +
    io

    @@ -784,6 +806,12 @@ func TestFoo(t *testing.T) { environment variable for https:// URLs when HTTPS_PROXY is unset.

    + +

    + The new http.FS + function converts an fs.FS + to an http.Handler. +

    @@ -915,6 +943,14 @@ func TestFoo(t *testing.T) { Newlines characters are now allowed inside action delimiters, permitting actions to span multiple lines.

    + +

    + The new template.ParseFS + function and template.Template.ParseFS + method are like template.ParseGlob + and template.Template.ParseGlob, + but read the templates from an fs.FS. +

    -- GitLab From 11def3d40b12292a30b305226cd4910b6c5bc14b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 21 Jan 2021 18:29:13 -0800 Subject: [PATCH 1672/1792] doc/go1.16: mention syscall.AllThreadsSyscall For #1435 For #40700 Change-Id: I01d277617ab511c90b9663fc89e418402e5ee2be Reviewed-on: https://go-review.googlesource.com/c/go/+/285597 Trust: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick --- doc/go1.16.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index c76161432e..aa70ec8c82 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -934,6 +934,16 @@ func TestFoo(t *testing.T) { and related calls are now implemented. Previously, they returned an syscall.EOPNOTSUPP error.

    + +

    + On Linux, the new functions + AllThreadsSyscall + and AllThreadsSyscall6 + may be used to make a system call on all Go threads in the process. + These functions may only be used by programs that do not use cgo; + if a program uses cgo, they will always return + syscall.ENOTSUP. +

    -- GitLab From ec1b9452658dfa6ca865a9dd2711726ab71de99c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 21 Jan 2021 18:21:35 -0800 Subject: [PATCH 1673/1792] doc/go1.16: mention path/filepath.WalkDir For #40700 For #42027 Change-Id: Ifb73050dfdab21784fa52d758ad9c408e6489684 Reviewed-on: https://go-review.googlesource.com/c/go/+/285595 Trust: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick --- doc/go1.16.html | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index aa70ec8c82..b3166fbaf5 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -872,6 +872,21 @@ func TestFoo(t *testing.T) {
    path/filepath
    +

    + The new function + WalkDir + is similar to + Walk, + but is typically more efficient. + The function passed to WalkDir receives a + fs.DirEntry + instead of a + fs.FileInfo. + (To clarify for those who recall the Walk function + as taking an os.FileInfo, + os.FileInfo is now an alias for fs.FileInfo.) +

    +

    The Match and Glob functions now -- GitLab From cf10e69f17a202499aed8de6dd08f9642ab61b53 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 21 Jan 2021 18:10:47 -0800 Subject: [PATCH 1674/1792] doc/go1.16: mention net/http.Transport.GetProxyConnectHeader For #40700 For #41048 Change-Id: Ida6bcaaf5edaa2bba9ba2b8e02ec9959481f8302 Reviewed-on: https://go-review.googlesource.com/c/go/+/285594 Trust: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick --- doc/go1.16.html | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index b3166fbaf5..d7714888f2 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -807,6 +807,19 @@ func TestFoo(t *testing.T) { HTTPS_PROXY is unset.

    +

    + The Transport + type has a new field + GetProxyConnectHeader + which may be set to a function that returns headers to send to a + proxy during a CONNECT request. + In effect GetProxyConnectHeader is a dynamic + version of the existing field + ProxyConnectHeader; + if GetProxyConnectHeader is not nil, + then ProxyConnectHeader is ignored. +

    +

    The new http.FS function converts an fs.FS -- GitLab From 50cba0506f0f979cf1a1670ffff9113a4cdb6273 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 21 Jan 2021 19:41:56 -0800 Subject: [PATCH 1675/1792] time: clarify Timer.Reset behavior on AfterFunc Timers Fixes #28100 Change-Id: I37d4d7badf455e4ecf982d4fc7cb070052de2e45 Reviewed-on: https://go-review.googlesource.com/c/go/+/285632 Trust: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor --- src/time/sleep.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/time/sleep.go b/src/time/sleep.go index 90d8a18a68..4f45799414 100644 --- a/src/time/sleep.go +++ b/src/time/sleep.go @@ -101,7 +101,9 @@ func NewTimer(d Duration) *Timer { // It returns true if the timer had been active, false if the timer had // expired or been stopped. // -// Reset should be invoked only on stopped or expired timers with drained channels. +// For a Timer created with NewTimer, Reset should be invoked only on +// stopped or expired timers with drained channels. +// // If a program has already received a value from t.C, the timer is known // to have expired and the channel drained, so t.Reset can be used directly. // If a program has not yet received a value from t.C, however, @@ -120,6 +122,15 @@ func NewTimer(d Duration) *Timer { // is a race condition between draining the channel and the new timer expiring. // Reset should always be invoked on stopped or expired channels, as described above. // The return value exists to preserve compatibility with existing programs. +// +// For a Timer created with AfterFunc(d, f), Reset either reschedules +// when f will run, in which case Reset returns true, or schedules f +// to run again, in which case it returns false. +// When Reset returns false, Reset neither waits for the prior f to +// complete before returning nor does it guarantee that the subsequent +// goroutine running f does not run concurrently with the prior +// one. If the caller needs to know whether the prior execution of +// f is completed, it must coordinate with f explicitly. func (t *Timer) Reset(d Duration) bool { if t.r.f == nil { panic("time: Reset called on uninitialized Timer") -- GitLab From 7ece3a7b17ff637755dbe9e5687af22fd5f82168 Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Thu, 21 Jan 2021 18:24:55 -0800 Subject: [PATCH 1676/1792] net/http: fix flaky TestDisableKeepAliveUpgrade This test hijacks a connection. It was reading from the net.Conn returned by Hijack, not the bufio.ReadWriter, causing flaky failures when a read-ahead byte was held in the read buffer. Fixes #43073. Change-Id: Ic3e7f704fba9635fd851cb3c0c0c74e312b75f6e Reviewed-on: https://go-review.googlesource.com/c/go/+/285596 Trust: Damien Neil Run-TryBot: Damien Neil TryBot-Result: Go Bot Reviewed-by: Brad Fitzpatrick Reviewed-by: Anmol Sethi --- src/net/http/serve_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 95e6bf4adb..f8687416fe 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -6460,13 +6460,15 @@ func TestDisableKeepAliveUpgrade(t *testing.T) { w.Header().Set("Connection", "Upgrade") w.Header().Set("Upgrade", "someProto") w.WriteHeader(StatusSwitchingProtocols) - c, _, err := w.(Hijacker).Hijack() + c, buf, err := w.(Hijacker).Hijack() if err != nil { return } defer c.Close() - io.Copy(c, c) + // Copy from the *bufio.ReadWriter, which may contain buffered data. + // Copy to the net.Conn, to avoid buffering the output. + io.Copy(c, buf) })) s.Config.SetKeepAlivesEnabled(false) s.Start() -- GitLab From ec4051763d439e7108bc673dd0b1bf1cbbc5dfc5 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Fri, 22 Jan 2021 15:00:35 +0000 Subject: [PATCH 1677/1792] runtime: fix typo in mgcscavenge.go recieved -> received Change-Id: I84336170e179832604e1311ea9263af36f9ce15a GitHub-Last-Rev: a6068c1d2b5a7711b93899f798dbc84f1ea339e4 GitHub-Pull-Request: golang/go#43845 Reviewed-on: https://go-review.googlesource.com/c/go/+/285675 Reviewed-by: Keith Randall Trust: Alberto Donizetti --- src/runtime/mgcscavenge.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/mgcscavenge.go b/src/runtime/mgcscavenge.go index 38f09309dc..a7c5bc49b8 100644 --- a/src/runtime/mgcscavenge.go +++ b/src/runtime/mgcscavenge.go @@ -562,7 +562,7 @@ func (p *pageAlloc) scavengeUnreserve(r addrRange, gen uint32) { func (p *pageAlloc) scavengeOne(work addrRange, max uintptr, mayUnlock bool) (uintptr, addrRange) { assertLockHeld(p.mheapLock) - // Defensively check if we've recieved an empty address range. + // Defensively check if we've received an empty address range. // If so, just return. if work.size() == 0 { // Nothing to do. -- GitLab From b268b607743ebf570396750208e0032870653edd Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Fri, 22 Jan 2021 19:32:43 +1100 Subject: [PATCH 1678/1792] runtime: remove pthread_kill/pthread_self for openbsd We're now using getthrid() and thrkill() instead. Updates #36435 Change-Id: I1c6bcfb9b46d149e0a2a10e936a244576489a88e Reviewed-on: https://go-review.googlesource.com/c/go/+/285692 Trust: Joel Sing Run-TryBot: Joel Sing Reviewed-by: Cherry Zhang --- src/runtime/sys_openbsd.go | 18 ------------------ src/runtime/sys_openbsd_amd64.s | 18 ------------------ src/runtime/sys_openbsd_arm64.s | 12 ------------ 3 files changed, 48 deletions(-) diff --git a/src/runtime/sys_openbsd.go b/src/runtime/sys_openbsd.go index 56de00aad5..2d41ed0d46 100644 --- a/src/runtime/sys_openbsd.go +++ b/src/runtime/sys_openbsd.go @@ -46,21 +46,6 @@ func pthread_create(attr *pthreadattr, start uintptr, arg unsafe.Pointer) int32 } func pthread_create_trampoline() -//go:nosplit -//go:cgo_unsafe_args -func pthread_self() (t pthread) { - libcCall(unsafe.Pointer(funcPC(pthread_self_trampoline)), unsafe.Pointer(&t)) - return -} -func pthread_self_trampoline() - -//go:nosplit -//go:cgo_unsafe_args -func pthread_kill(t pthread, sig uint32) { - libcCall(unsafe.Pointer(funcPC(pthread_kill_trampoline)), unsafe.Pointer(&t)) -} -func pthread_kill_trampoline() - // Tell the linker that the libc_* functions are to be found // in a system library, with the libc_ prefix missing. @@ -70,8 +55,5 @@ func pthread_kill_trampoline() //go:cgo_import_dynamic libc_pthread_attr_setdetachstate pthread_attr_setdetachstate "libpthread.so" //go:cgo_import_dynamic libc_pthread_create pthread_create "libpthread.so" //go:cgo_import_dynamic libc_pthread_sigmask pthread_sigmask "libpthread.so" -//go:cgo_import_dynamic libc_pthread_self pthread_self "libpthread.so" -//go:cgo_import_dynamic libc_pthread_kill pthread_kill "libpthread.so" //go:cgo_import_dynamic _ _ "libpthread.so" -//go:cgo_import_dynamic _ _ "libc.so" diff --git a/src/runtime/sys_openbsd_amd64.s b/src/runtime/sys_openbsd_amd64.s index ac0ae27e45..1086557aab 100644 --- a/src/runtime/sys_openbsd_amd64.s +++ b/src/runtime/sys_openbsd_amd64.s @@ -150,24 +150,6 @@ TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 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·thrsleep_trampoline(SB),NOSPLIT,$0 PUSHQ BP MOVQ SP, BP diff --git a/src/runtime/sys_openbsd_arm64.s b/src/runtime/sys_openbsd_arm64.s index 90646bbe85..2ec9d038ba 100644 --- a/src/runtime/sys_openbsd_arm64.s +++ b/src/runtime/sys_openbsd_arm64.s @@ -188,18 +188,6 @@ TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 ADD $16, RSP RET -TEXT runtime·pthread_self_trampoline(SB),NOSPLIT,$0 - MOVD R0, R19 // pointer to args - CALL libc_pthread_self(SB) - MOVD R0, 0(R19) // return value - RET - -TEXT runtime·pthread_kill_trampoline(SB),NOSPLIT,$0 - MOVW 8(R0), R1 // arg 2 - sig - MOVD 0(R0), R0 // arg 1 - thread - CALL libc_pthread_kill(SB) - RET - // Exit the entire program (like C exit) TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0 MOVW code+0(FP), R0 // arg 1 - status -- GitLab From a1b53d85dad7648d545ee5e0d7e768f300bfcd84 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Fri, 15 Jan 2021 19:41:26 -0500 Subject: [PATCH 1679/1792] cmd/go: add documentation for test and xtest fields output by go list The TestEmbedPatterns, TestEmbedFiles, XTestEmbedPatterns, and XTestEmbedFiles fields were left out of golang.org/cl/282195 which was supposed to document the embed fields available in the go list output. Add documentation for them in this CL. Fixes #43081 Change-Id: Ifc256c476daec7c0f0e2c41f86b82f958b3e2b1a Reviewed-on: https://go-review.googlesource.com/c/go/+/284258 Trust: Michael Matloob Run-TryBot: Michael Matloob Reviewed-by: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 8 ++++++-- src/cmd/go/internal/list/list.go | 8 ++++++-- src/cmd/go/internal/load/pkg.go | 6 +++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 0645780966..49d390297c 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -787,8 +787,12 @@ // XTestGoFiles []string // _test.go files outside package // // // Embedded files -// EmbedPatterns []string // //go:embed patterns -// EmbedFiles []string // files and directories matched by EmbedPatterns +// EmbedPatterns []string // //go:embed patterns +// EmbedFiles []string // files matched by EmbedPatterns +// TestEmbedPatterns []string // //go:embed patterns in TestGoFiles +// TestEmbedFiles []string // files matched by TestEmbedPatterns +// XTestEmbedPatterns []string // //go:embed patterns in XTestGoFiles +// XTestEmbedFiles []string // files matched by XTestEmbedPatterns // // // Cgo directives // CgoCFLAGS []string // cgo: flags for C compiler diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 975b02252e..b4d82d9f8c 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -90,8 +90,12 @@ to -f '{{.ImportPath}}'. The struct being passed to the template is: XTestGoFiles []string // _test.go files outside package // Embedded files - EmbedPatterns []string // //go:embed patterns - EmbedFiles []string // files and directories matched by EmbedPatterns + EmbedPatterns []string // //go:embed patterns + EmbedFiles []string // files matched by EmbedPatterns + TestEmbedPatterns []string // //go:embed patterns in TestGoFiles + TestEmbedFiles []string // files matched by TestEmbedPatterns + XTestEmbedPatterns []string // //go:embed patterns in XTestGoFiles + XTestEmbedFiles []string // files matched by XTestEmbedPatterns // Cgo directives CgoCFLAGS []string // cgo: flags for C compiler diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 3f67927111..3a274a3ad1 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -96,7 +96,7 @@ type PackagePublic struct { // Embedded files EmbedPatterns []string `json:",omitempty"` // //go:embed patterns - EmbedFiles []string `json:",omitempty"` // files and directories matched by EmbedPatterns + EmbedFiles []string `json:",omitempty"` // files matched by EmbedPatterns // Cgo directives CgoCFLAGS []string `json:",omitempty"` // cgo: flags for C compiler @@ -122,11 +122,11 @@ type PackagePublic struct { TestGoFiles []string `json:",omitempty"` // _test.go files in package TestImports []string `json:",omitempty"` // imports from TestGoFiles TestEmbedPatterns []string `json:",omitempty"` // //go:embed patterns - TestEmbedFiles []string `json:",omitempty"` // //files matched by EmbedPatterns + TestEmbedFiles []string `json:",omitempty"` // files matched by TestEmbedPatterns XTestGoFiles []string `json:",omitempty"` // _test.go files outside package XTestImports []string `json:",omitempty"` // imports from XTestGoFiles XTestEmbedPatterns []string `json:",omitempty"` // //go:embed patterns - XTestEmbedFiles []string `json:",omitempty"` // //files matched by EmbedPatterns + XTestEmbedFiles []string `json:",omitempty"` // files matched by XTestEmbedPatterns } // AllFiles returns the names of all the files considered for the package. -- GitLab From dab3e5affefb7e0b157ad27fe4797c4c6f3c4ea6 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Sun, 15 Nov 2020 23:28:57 +1100 Subject: [PATCH 1680/1792] runtime: switch runtime to libc for openbsd/amd64 Use libc rather than performing direct system calls for the runtime on openbsd/amd64. Updates #36435 Change-Id: Ib708009c3743f56a3fd6cb3bc731451e4a398849 Reviewed-on: https://go-review.googlesource.com/c/go/+/270379 Trust: Joel Sing Reviewed-by: Cherry Zhang --- src/runtime/defs_openbsd.go | 5 + src/runtime/defs_openbsd_amd64.go | 5 + src/runtime/mmap.go | 11 +- src/runtime/os_openbsd.go | 43 --- src/runtime/os_openbsd_syscall2.go | 95 +++++ src/runtime/proc.go | 2 + src/runtime/signal_openbsd.go | 2 +- src/runtime/stubs2.go | 7 +- src/runtime/stubs3.go | 7 +- src/runtime/sys_openbsd2.go | 250 +++++++++++++ src/runtime/sys_openbsd_amd64.s | 552 ++++++++++++++--------------- src/runtime/timestub2.go | 5 +- 12 files changed, 641 insertions(+), 343 deletions(-) create mode 100644 src/runtime/os_openbsd_syscall2.go create mode 100644 src/runtime/sys_openbsd2.go diff --git a/src/runtime/defs_openbsd.go b/src/runtime/defs_openbsd.go index 57717abf7e..ff7e21c71e 100644 --- a/src/runtime/defs_openbsd.go +++ b/src/runtime/defs_openbsd.go @@ -56,6 +56,11 @@ const ( 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 + SIGHUP = C.SIGHUP SIGINT = C.SIGINT SIGQUIT = C.SIGQUIT diff --git a/src/runtime/defs_openbsd_amd64.go b/src/runtime/defs_openbsd_amd64.go index 01ca934cea..46f1245201 100644 --- a/src/runtime/defs_openbsd_amd64.go +++ b/src/runtime/defs_openbsd_amd64.go @@ -32,6 +32,11 @@ const ( _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/mmap.go b/src/runtime/mmap.go index 9fe31cb416..1b1848b79e 100644 --- a/src/runtime/mmap.go +++ b/src/runtime/mmap.go @@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build !aix +// +build !darwin +// +build !js +// +build !linux !amd64 +// +build !linux !arm64 +// +build !openbsd // +build !plan9 // +build !solaris // +build !windows -// +build !linux !amd64 -// +build !linux !arm64 -// +build !js -// +build !darwin -// +build !aix package runtime diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 56b686a2fa..6259b96c22 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -13,49 +13,6 @@ type mOS struct { waitsemacount uint32 } -//go:noescape -func setitimer(mode int32, new, old *itimerval) - -//go:noescape -func sigaction(sig uint32, new, old *sigactiont) - -//go:noescape -func sigaltstack(new, old *stackt) - -//go:noescape -func obsdsigprocmask(how int32, new sigset) sigset - -//go:nosplit -//go:nowritebarrierrec -func sigprocmask(how int32, new, old *sigset) { - n := sigset(0) - if new != nil { - n = *new - } - r := obsdsigprocmask(how, n) - if old != nil { - *old = r - } -} - -//go:noescape -func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 - -func raiseproc(sig uint32) - -func getthrid() int32 -func thrkill(tid int32, sig int) - -func kqueue() int32 - -//go:noescape -func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32 - -func pipe() (r, w int32, errno int32) -func pipe2(flags int32) (r, w int32, errno int32) -func closeonexec(fd int32) -func setNonblock(fd int32) - const ( _ESRCH = 3 _EWOULDBLOCK = _EAGAIN diff --git a/src/runtime/os_openbsd_syscall2.go b/src/runtime/os_openbsd_syscall2.go new file mode 100644 index 0000000000..74eb271c2c --- /dev/null +++ b/src/runtime/os_openbsd_syscall2.go @@ -0,0 +1,95 @@ +// 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 openbsd,!amd64 + +package runtime + +import ( + "unsafe" +) + +//go:noescape +func sigaction(sig uint32, new, old *sigactiont) + +func kqueue() int32 + +//go:noescape +func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32 + +func raiseproc(sig uint32) + +func getthrid() int32 +func thrkill(tid int32, sig int) + +// read calls the read system call. +// It returns a non-negative number of bytes written or a negative errno value. +func read(fd int32, p unsafe.Pointer, n int32) int32 + +func closefd(fd int32) int32 + +func exit(code int32) +func usleep(usec uint32) + +// write calls the write system call. +// It returns a non-negative number of bytes written or a negative errno value. +//go:noescape +func write1(fd uintptr, p unsafe.Pointer, n int32) int32 + +//go:noescape +func open(name *byte, mode, perm int32) int32 + +// return value is only set on linux to be used in osinit() +func madvise(addr unsafe.Pointer, n uintptr, flags int32) int32 + +// exitThread terminates the current thread, writing *wait = 0 when +// the stack is safe to reclaim. +// +//go:noescape +func exitThread(wait *uint32) + +//go:noescape +func obsdsigprocmask(how int32, new sigset) sigset + +//go:nosplit +//go:nowritebarrierrec +func sigprocmask(how int32, new, old *sigset) { + n := sigset(0) + if new != nil { + n = *new + } + r := obsdsigprocmask(how, n) + if old != nil { + *old = r + } +} + +func pipe() (r, w int32, errno int32) +func pipe2(flags int32) (r, w int32, errno int32) + +//go:noescape +func setitimer(mode int32, new, old *itimerval) + +//go:noescape +func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 + +// mmap calls the mmap system call. It is implemented in assembly. +// We only pass the lower 32 bits of file offset to the +// assembly routine; the higher bits (if required), should be provided +// by the assembly routine as 0. +// The err result is an OS error code such as ENOMEM. +func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (p unsafe.Pointer, err int) + +// munmap calls the munmap system call. It is implemented in assembly. +func munmap(addr unsafe.Pointer, n uintptr) + +func nanotime1() int64 + +//go:noescape +func sigaltstack(new, old *stackt) + +func closeonexec(fd int32) +func setNonblock(fd int32) + +func walltime1() (sec int64, nsec int32) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 30033712aa..aa44c625c5 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1212,6 +1212,8 @@ func usesLibcall() bool { switch GOOS { case "aix", "darwin", "illumos", "ios", "solaris", "windows": return true + case "openbsd": + return GOARCH == "amd64" } return false } diff --git a/src/runtime/signal_openbsd.go b/src/runtime/signal_openbsd.go index 99c601ce58..d2c5c5e39a 100644 --- a/src/runtime/signal_openbsd.go +++ b/src/runtime/signal_openbsd.go @@ -37,5 +37,5 @@ var sigtable = [...]sigTabT{ /* 29 */ {_SigNotify, "SIGINFO: status request from keyboard"}, /* 30 */ {_SigNotify, "SIGUSR1: user-defined signal 1"}, /* 31 */ {_SigNotify, "SIGUSR2: user-defined signal 2"}, - /* 32 */ {_SigNotify, "SIGTHR: reserved"}, + /* 32 */ {0, "SIGTHR: reserved"}, // thread AST - cannot be registered. } diff --git a/src/runtime/stubs2.go b/src/runtime/stubs2.go index 4a1a5cc3d9..85088b3ab9 100644 --- a/src/runtime/stubs2.go +++ b/src/runtime/stubs2.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. +// +build !aix +// +build !darwin +// +build !js +// +build !openbsd // +build !plan9 // +build !solaris // +build !windows -// +build !js -// +build !darwin -// +build !aix package runtime diff --git a/src/runtime/stubs3.go b/src/runtime/stubs3.go index 95eecc7eca..1885d32051 100644 --- a/src/runtime/stubs3.go +++ b/src/runtime/stubs3.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. +// +build !aix +// +build !darwin +// +build !freebsd +// +build !openbsd // +build !plan9 // +build !solaris -// +build !freebsd -// +build !darwin -// +build !aix package runtime diff --git a/src/runtime/sys_openbsd2.go b/src/runtime/sys_openbsd2.go new file mode 100644 index 0000000000..73592df226 --- /dev/null +++ b/src/runtime/sys_openbsd2.go @@ -0,0 +1,250 @@ +// 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 openbsd,amd64 + +package runtime + +import "unsafe" + +// This is exported via linkname to assembly in runtime/cgo. +//go:linkname exit +//go:nosplit +//go:cgo_unsafe_args +func exit(code int32) { + libcCall(unsafe.Pointer(funcPC(exit_trampoline)), unsafe.Pointer(&code)) +} +func exit_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func getthrid() (tid int32) { + libcCall(unsafe.Pointer(funcPC(getthrid_trampoline)), unsafe.Pointer(&tid)) + return +} +func getthrid_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func raiseproc(sig uint32) { + libcCall(unsafe.Pointer(funcPC(raiseproc_trampoline)), unsafe.Pointer(&sig)) +} +func raiseproc_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func thrkill(tid int32, sig int) { + libcCall(unsafe.Pointer(funcPC(thrkill_trampoline)), unsafe.Pointer(&tid)) +} +func thrkill_trampoline() + +// mmap is used to do low-level memory allocation via mmap. Don't allow stack +// splits, since this function (used by sysAlloc) is called in a lot of low-level +// parts of the runtime and callers often assume it won't acquire any locks. +// go:nosplit +func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (unsafe.Pointer, int) { + args := struct { + addr unsafe.Pointer + n uintptr + prot, flags, fd int32 + off uint32 + ret1 unsafe.Pointer + ret2 int + }{addr, n, prot, flags, fd, off, nil, 0} + libcCall(unsafe.Pointer(funcPC(mmap_trampoline)), unsafe.Pointer(&args)) + return args.ret1, args.ret2 +} +func mmap_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func munmap(addr unsafe.Pointer, n uintptr) { + libcCall(unsafe.Pointer(funcPC(munmap_trampoline)), unsafe.Pointer(&addr)) +} +func munmap_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func madvise(addr unsafe.Pointer, n uintptr, flags int32) { + libcCall(unsafe.Pointer(funcPC(madvise_trampoline)), unsafe.Pointer(&addr)) +} +func madvise_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func open(name *byte, mode, perm int32) (ret int32) { + return libcCall(unsafe.Pointer(funcPC(open_trampoline)), unsafe.Pointer(&name)) +} +func open_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func closefd(fd int32) int32 { + return libcCall(unsafe.Pointer(funcPC(close_trampoline)), unsafe.Pointer(&fd)) +} +func close_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func read(fd int32, p unsafe.Pointer, n int32) int32 { + return libcCall(unsafe.Pointer(funcPC(read_trampoline)), unsafe.Pointer(&fd)) +} +func read_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func write1(fd uintptr, p unsafe.Pointer, n int32) int32 { + return libcCall(unsafe.Pointer(funcPC(write_trampoline)), unsafe.Pointer(&fd)) +} +func write_trampoline() + +func pipe() (r, w int32, errno int32) { + return pipe2(0) +} + +func pipe2(flags int32) (r, w int32, errno int32) { + var p [2]int32 + args := struct { + p unsafe.Pointer + flags int32 + }{noescape(unsafe.Pointer(&p)), flags} + errno = libcCall(unsafe.Pointer(funcPC(pipe2_trampoline)), unsafe.Pointer(&args)) + return p[0], p[1], errno +} +func pipe2_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func setitimer(mode int32, new, old *itimerval) { + libcCall(unsafe.Pointer(funcPC(setitimer_trampoline)), unsafe.Pointer(&mode)) +} +func setitimer_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func usleep(usec uint32) { + libcCall(unsafe.Pointer(funcPC(usleep_trampoline)), unsafe.Pointer(&usec)) +} +func usleep_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 { + return libcCall(unsafe.Pointer(funcPC(sysctl_trampoline)), unsafe.Pointer(&mib)) +} +func sysctl_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func fcntl(fd, cmd, arg int32) int32 { + return libcCall(unsafe.Pointer(funcPC(fcntl_trampoline)), unsafe.Pointer(&fd)) +} +func fcntl_trampoline() + +//go:nosplit +func nanotime1() int64 { + var ts timespec + args := struct { + clock_id int32 + tp unsafe.Pointer + }{_CLOCK_MONOTONIC, unsafe.Pointer(&ts)} + libcCall(unsafe.Pointer(funcPC(clock_gettime_trampoline)), unsafe.Pointer(&args)) + return ts.tv_sec*1e9 + int64(ts.tv_nsec) +} +func clock_gettime_trampoline() + +//go:nosplit +func walltime1() (int64, int32) { + var ts timespec + args := struct { + clock_id int32 + tp unsafe.Pointer + }{_CLOCK_REALTIME, unsafe.Pointer(&ts)} + libcCall(unsafe.Pointer(funcPC(clock_gettime_trampoline)), unsafe.Pointer(&args)) + return ts.tv_sec, int32(ts.tv_nsec) +} + +//go:nosplit +//go:cgo_unsafe_args +func kqueue() int32 { + return libcCall(unsafe.Pointer(funcPC(kqueue_trampoline)), nil) +} +func kqueue_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func kevent(kq int32, ch *keventt, nch int32, ev *keventt, nev int32, ts *timespec) int32 { + return libcCall(unsafe.Pointer(funcPC(kevent_trampoline)), unsafe.Pointer(&kq)) +} +func kevent_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func sigaction(sig uint32, new *sigactiont, old *sigactiont) { + libcCall(unsafe.Pointer(funcPC(sigaction_trampoline)), unsafe.Pointer(&sig)) +} +func sigaction_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func sigprocmask(how uint32, new *sigset, old *sigset) { + libcCall(unsafe.Pointer(funcPC(sigprocmask_trampoline)), unsafe.Pointer(&how)) +} +func sigprocmask_trampoline() + +//go:nosplit +//go:cgo_unsafe_args +func sigaltstack(new *stackt, old *stackt) { + libcCall(unsafe.Pointer(funcPC(sigaltstack_trampoline)), unsafe.Pointer(&new)) +} +func sigaltstack_trampoline() + +// Not used on OpenBSD, but must be defined. +func exitThread(wait *uint32) { +} + +//go:nosplit +func closeonexec(fd int32) { + fcntl(fd, _F_SETFD, _FD_CLOEXEC) +} + +//go:nosplit +func setNonblock(fd int32) { + flags := fcntl(fd, _F_GETFL, 0) + fcntl(fd, _F_SETFL, flags|_O_NONBLOCK) +} + +// Tell the linker that the libc_* functions are to be found +// in a system library, with the libc_ prefix missing. + +//go:cgo_import_dynamic libc_errno __errno "libc.so" +//go:cgo_import_dynamic libc_exit exit "libc.so" +//go:cgo_import_dynamic libc_getthrid getthrid "libc.so" +//go:cgo_import_dynamic libc_sched_yield sched_yield "libc.so" +//go:cgo_import_dynamic libc_thrkill thrkill "libc.so" + +//go:cgo_import_dynamic libc_mmap mmap "libc.so" +//go:cgo_import_dynamic libc_munmap munmap "libc.so" +//go:cgo_import_dynamic libc_madvise madvise "libc.so" + +//go:cgo_import_dynamic libc_open open "libc.so" +//go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_read read "libc.so" +//go:cgo_import_dynamic libc_write write "libc.so" +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + +//go:cgo_import_dynamic libc_clock_gettime clock_gettime "libc.so" +//go:cgo_import_dynamic libc_setitimer setitimer "libc.so" +//go:cgo_import_dynamic libc_usleep usleep "libc.so" +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" +//go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_kill kill "libc.so" +//go:cgo_import_dynamic libc_kqueue kqueue "libc.so" +//go:cgo_import_dynamic libc_kevent kevent "libc.so" + +//go:cgo_import_dynamic libc_sigaction sigaction "libc.so" +//go:cgo_import_dynamic libc_sigaltstack sigaltstack "libc.so" + +//go:cgo_import_dynamic _ _ "libc.so" diff --git a/src/runtime/sys_openbsd_amd64.s b/src/runtime/sys_openbsd_amd64.s index 1086557aab..4680a7f7aa 100644 --- a/src/runtime/sys_openbsd_amd64.s +++ b/src/runtime/sys_openbsd_amd64.s @@ -150,13 +150,23 @@ TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 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 3 - lock - MOVQ 32(DI), R8 // arg 4 - abort + 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 @@ -171,6 +181,35 @@ TEXT runtime·thrwakeup_trampoline(SB),NOSPLIT,$0 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 @@ -178,290 +217,231 @@ TEXT runtime·sched_yield_trampoline(SB),NOSPLIT,$0 POPQ BP RET -// Exit the entire program (like C exit) -TEXT runtime·exit(SB),NOSPLIT,$-8 - MOVL code+0(FP), DI // arg 1 - exit status - MOVL $1, AX // sys_exit - SYSCALL - MOVL $0xf1, 0xf1 // crash - RET - -// func exitThread(wait *uint32) -TEXT runtime·exitThread(SB),NOSPLIT,$0-8 - MOVQ wait+0(FP), DI // arg 1 - notdead - MOVL $302, AX // sys___threxit - SYSCALL - MOVL $0xf1, 0xf1 // crash - JMP 0(PC) - -TEXT runtime·open(SB),NOSPLIT,$-8 - MOVQ name+0(FP), DI // arg 1 pathname - MOVL mode+8(FP), SI // arg 2 flags - MOVL perm+12(FP), DX // arg 3 mode - MOVL $5, AX - SYSCALL - JCC 2(PC) - MOVL $-1, AX - MOVL AX, ret+16(FP) - RET - -TEXT runtime·closefd(SB),NOSPLIT,$-8 - MOVL fd+0(FP), DI // arg 1 fd - MOVL $6, AX - SYSCALL - JCC 2(PC) - MOVL $-1, AX - MOVL AX, ret+8(FP) - RET - -TEXT runtime·read(SB),NOSPLIT,$-8 - MOVL fd+0(FP), DI // arg 1 fd - MOVQ p+8(FP), SI // arg 2 buf - MOVL n+16(FP), DX // arg 3 count - MOVL $3, AX - SYSCALL - JCC 2(PC) - NEGQ AX // caller expects negative errno - MOVL AX, ret+24(FP) - RET - -// func pipe() (r, w int32, errno int32) -TEXT runtime·pipe(SB),NOSPLIT,$0-12 - LEAQ r+0(FP), DI - MOVL $263, AX - SYSCALL - MOVL AX, errno+8(FP) - RET - -// func pipe2(flags int32) (r, w int32, errno int32) -TEXT runtime·pipe2(SB),NOSPLIT,$0-20 - LEAQ r+8(FP), DI - MOVL flags+0(FP), SI - MOVL $101, AX - SYSCALL - MOVL AX, errno+16(FP) - RET - -TEXT runtime·write1(SB),NOSPLIT,$-8 - MOVQ fd+0(FP), DI // arg 1 - fd - MOVQ p+8(FP), SI // arg 2 - buf - MOVL n+16(FP), DX // arg 3 - nbyte - MOVL $4, AX // sys_write - SYSCALL - JCC 2(PC) - NEGQ AX // caller expects negative errno - MOVL AX, ret+24(FP) - RET - -TEXT runtime·usleep(SB),NOSPLIT,$16 - MOVL $0, DX - MOVL usec+0(FP), AX - MOVL $1000000, CX - DIVL CX - MOVQ AX, 0(SP) // tv_sec - MOVL $1000, AX - MULL DX - MOVQ AX, 8(SP) // tv_nsec - - MOVQ SP, DI // arg 1 - rqtp - MOVQ $0, SI // arg 2 - rmtp - MOVL $91, AX // sys_nanosleep - SYSCALL - RET - -TEXT runtime·getthrid(SB),NOSPLIT,$0-4 - MOVL $299, AX // sys_getthrid - SYSCALL - MOVL AX, ret+0(FP) - RET - -TEXT runtime·thrkill(SB),NOSPLIT,$0-16 - MOVL tid+0(FP), DI // arg 1 - tid - MOVQ sig+8(FP), SI // arg 2 - signum - MOVQ $0, DX // arg 3 - tcb - MOVL $119, AX // sys_thrkill - SYSCALL - RET - -TEXT runtime·raiseproc(SB),NOSPLIT,$16 - MOVL $20, AX // sys_getpid - SYSCALL - MOVQ AX, DI // arg 1 - pid - MOVL sig+0(FP), SI // arg 2 - signum - MOVL $122, AX // sys_kill - SYSCALL - RET - -TEXT runtime·setitimer(SB),NOSPLIT,$-8 - MOVL mode+0(FP), DI // arg 1 - which - MOVQ new+8(FP), SI // arg 2 - itv - MOVQ old+16(FP), DX // arg 3 - oitv - MOVL $69, AX // sys_setitimer - SYSCALL - RET - -// func walltime1() (sec int64, nsec int32) -TEXT runtime·walltime1(SB), NOSPLIT, $32 - MOVQ $0, DI // arg 1 - clock_id - LEAQ 8(SP), SI // arg 2 - tp - MOVL $87, AX // sys_clock_gettime - SYSCALL - MOVQ 8(SP), AX // sec - MOVQ 16(SP), DX // nsec - - // sec is in AX, nsec in DX - MOVQ AX, sec+0(FP) - MOVL DX, nsec+8(FP) - RET - -TEXT runtime·nanotime1(SB),NOSPLIT,$24 - MOVQ CLOCK_MONOTONIC, DI // arg 1 - clock_id - LEAQ 8(SP), SI // arg 2 - tp - MOVL $87, AX // sys_clock_gettime - SYSCALL - MOVQ 8(SP), AX // sec - MOVQ 16(SP), DX // nsec - - // sec is in AX, nsec in DX - // return nsec in AX - IMULQ $1000000000, AX - ADDQ DX, AX - MOVQ AX, ret+0(FP) - RET - -TEXT runtime·sigaction(SB),NOSPLIT,$-8 - MOVL sig+0(FP), DI // arg 1 - signum - MOVQ new+8(FP), SI // arg 2 - nsa - MOVQ old+16(FP), DX // arg 3 - osa - MOVL $46, AX - SYSCALL - JCC 2(PC) - MOVL $0xf1, 0xf1 // crash - RET - -TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$0 - MOVL how+0(FP), DI // arg 1 - how - MOVL new+4(FP), SI // arg 2 - set - MOVL $48, AX // sys_sigprocmask - SYSCALL - JCC 2(PC) - MOVL $0xf1, 0xf1 // crash - MOVL AX, ret+8(FP) - RET - -TEXT runtime·mmap(SB),NOSPLIT,$0 - MOVQ addr+0(FP), DI // arg 1 - addr - MOVQ n+8(FP), SI // arg 2 - len - MOVL prot+16(FP), DX // arg 3 - prot - MOVL flags+20(FP), R10 // arg 4 - flags - MOVL fd+24(FP), R8 // arg 5 - fd - MOVL off+28(FP), R9 - SUBQ $16, SP - MOVQ R9, 8(SP) // arg 7 - offset (passed on stack) - MOVQ $0, R9 // arg 6 - pad - MOVL $197, AX - SYSCALL - JCC ok - ADDQ $16, SP - MOVQ $0, p+32(FP) - MOVQ AX, err+40(FP) +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 + MOVL 16(BX), DX // arg 3 prot + MOVL 20(BX), CX // arg 4 flags + MOVL 24(BX), R8 // arg 5 fid + MOVL 28(BX), R9 // arg 6 offset + CALL libc_mmap(SB) + XORL DX, DX + CMPQ AX, $-1 + JNE ok + CALL libc_errno(SB) + MOVLQSX (AX), DX // errno + XORQ AX, AX +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 + CALL libc_read(SB) + TESTL AX, AX + JGE noerr + CALL libc_errno(SB) + 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 + CALL libc_write(SB) + TESTL AX, AX + JGE noerr + CALL libc_errno(SB) + 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) + TESTL AX, AX + JEQ 3(PC) + 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 + MOVQ 32(DI), R8 // arg 5 dst + 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 + MOVL 32(DI), R8 // arg 5 nev + MOVQ 40(DI), R9 // arg 6 ts + MOVL 0(DI), DI // arg 1 kq + CALL libc_kevent(SB) + CMPL AX, $-1 + JNE ok + CALL libc_errno(SB) + MOVL (AX), AX // errno + NEGL AX // caller expects negative errno value ok: - ADDQ $16, SP - MOVQ AX, p+32(FP) - MOVQ $0, err+40(FP) - RET - -TEXT runtime·munmap(SB),NOSPLIT,$0 - MOVQ addr+0(FP), DI // arg 1 - addr - MOVQ n+8(FP), SI // arg 2 - len - MOVL $73, AX // sys_munmap - SYSCALL - JCC 2(PC) - MOVL $0xf1, 0xf1 // crash - RET - -TEXT runtime·madvise(SB),NOSPLIT,$0 - MOVQ addr+0(FP), DI // arg 1 - addr - MOVQ n+8(FP), SI // arg 2 - len - MOVL flags+16(FP), DX // arg 3 - behav - MOVQ $75, AX // sys_madvise - SYSCALL - JCC 2(PC) - MOVL $-1, AX - MOVL AX, ret+24(FP) - RET - -TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 - MOVQ new+0(FP), DI // arg 1 - nss - MOVQ old+8(FP), SI // arg 2 - oss - MOVQ $288, AX // sys_sigaltstack - SYSCALL - JCC 2(PC) - MOVL $0xf1, 0xf1 // crash - RET - -TEXT runtime·sysctl(SB),NOSPLIT,$0 - MOVQ mib+0(FP), DI // arg 1 - name - MOVL miblen+8(FP), SI // arg 2 - namelen - MOVQ out+16(FP), DX // arg 3 - oldp - MOVQ size+24(FP), R10 // arg 4 - oldlenp - MOVQ dst+32(FP), R8 // arg 5 - newp - MOVQ ndst+40(FP), R9 // arg 6 - newlen - MOVQ $202, AX // sys___sysctl - SYSCALL - JCC 4(PC) - NEGQ AX - MOVL AX, ret+48(FP) - RET - MOVL $0, AX - MOVL AX, ret+48(FP) - RET - -// int32 runtime·kqueue(void); -TEXT runtime·kqueue(SB),NOSPLIT,$0 - MOVL $269, AX - SYSCALL - JCC 2(PC) - NEGQ AX - MOVL AX, ret+0(FP) - RET - -// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); -TEXT runtime·kevent(SB),NOSPLIT,$0 - MOVL kq+0(FP), DI - MOVQ ch+8(FP), SI - MOVL nch+16(FP), DX - MOVQ ev+24(FP), R10 - MOVL nev+32(FP), R8 - MOVQ ts+40(FP), R9 - MOVL $72, AX - SYSCALL - JCC 2(PC) - NEGQ AX - MOVL AX, ret+48(FP) - RET - -// void runtime·closeonexec(int32 fd); -TEXT runtime·closeonexec(SB),NOSPLIT,$0 - MOVL fd+0(FP), DI // fd - MOVQ $2, SI // F_SETFD - MOVQ $1, DX // FD_CLOEXEC - MOVL $92, AX // fcntl - SYSCALL - RET - -// func runtime·setNonblock(int32 fd) -TEXT runtime·setNonblock(SB),NOSPLIT,$0-4 - MOVL fd+0(FP), DI // fd - MOVQ $3, SI // F_GETFL - MOVQ $0, DX - MOVL $92, AX // fcntl - SYSCALL - MOVL fd+0(FP), DI // fd - MOVQ $4, SI // F_SETFL - MOVQ $4, DX // O_NONBLOCK - ORL AX, DX - MOVL $92, AX // fcntl - SYSCALL + 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) + TESTL AX, AX + JEQ 2(PC) + MOVL $0xf1, 0xf1 // crash + 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 + XORL AX, AX // vararg: say "no float args" + CALL libc_fcntl(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 + CALL libc_sigaction(SB) + 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 + CALL libc_pthread_sigmask(SB) + 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 diff --git a/src/runtime/timestub2.go b/src/runtime/timestub2.go index 6d73aabc35..68777ee4a9 100644 --- a/src/runtime/timestub2.go +++ b/src/runtime/timestub2.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. +// +build !aix // +build !darwin -// +build !windows // +build !freebsd -// +build !aix +// +build !openbsd // +build !solaris +// +build !windows package runtime -- GitLab From a2cef9b544708ecae983ed8836ee2425a28aab68 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 22 Jan 2021 14:27:24 -0500 Subject: [PATCH 1681/1792] cmd/go: don't lookup the path for CC when invoking cgo Previously, if CC was a path without separators (like gcc or clang), we'd look it up in PATH in cmd/go using internal/execabs.LookPath, then pass the resolved path to cgo in CC. This caused a regression: if the directory in PATH containing CC has a space, cgo splits it and interprets it as multiple arguments. With this change, cmd/go no longer resolves CC before invoking cgo. cgo does the path lookup on each invocation. This reverts the security fix CL 284780, but that was redundant with the addition of internal/execabs (CL 955304), which still protects us. Fixes #43808 Updates #41400 Change-Id: I65d91a1e303856df8653881eb6e2e75a3bf95c49 Reviewed-on: https://go-review.googlesource.com/c/go/+/285873 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/work/action.go | 3 - src/cmd/go/internal/work/exec.go | 27 ++------- src/cmd/go/testdata/script/cgo_path.txt | 5 +- src/cmd/go/testdata/script/cgo_path_space.txt | 55 +++++++++++++++++++ 4 files changed, 64 insertions(+), 26 deletions(-) create mode 100644 src/cmd/go/testdata/script/cgo_path_space.txt diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index b071ed1400..9d141ae233 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -57,9 +57,6 @@ type Builder struct { id sync.Mutex toolIDCache map[string]string // tool name -> tool ID buildIDCache map[string]string // file name -> build ID - - cgoEnvOnce sync.Once - cgoEnvCache []string } // NOTE: Much of Action would not need to be exported if not for test. diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index cacb4c05df..422e83c224 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -1165,7 +1165,10 @@ func (b *Builder) vet(ctx context.Context, a *Action) error { } // TODO(rsc): Why do we pass $GCCGO to go vet? - env := b.cgoEnv() + env := b.cCompilerEnv() + if cfg.BuildToolchainName == "gccgo" { + env = append(env, "GCCGO="+BuildToolchain.compiler()) + } p := a.Package tool := VetTool @@ -2111,24 +2114,6 @@ func (b *Builder) cCompilerEnv() []string { return []string{"TERM=dumb"} } -// cgoEnv returns environment variables to set when running cgo. -// Some of these pass through to cgo running the C compiler, -// so it includes cCompilerEnv. -func (b *Builder) cgoEnv() []string { - b.cgoEnvOnce.Do(func() { - cc, err := exec.LookPath(b.ccExe()[0]) - if err != nil || filepath.Base(cc) == cc { // reject relative path - cc = "/missing-cc" - } - gccgo := GccgoBin - if filepath.Base(gccgo) == gccgo { // reject relative path - gccgo = "/missing-gccgo" - } - b.cgoEnvCache = append(b.cCompilerEnv(), "CC="+cc, "GCCGO="+gccgo) - }) - return b.cgoEnvCache -} - // 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 == "". @@ -2729,7 +2714,7 @@ func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgo // along to the host linker. At this point in the code, cgoLDFLAGS // consists of the original $CGO_LDFLAGS (unchecked) and all the // flags put together from source code (checked). - cgoenv := b.cgoEnv() + cgoenv := b.cCompilerEnv() if len(cgoLDFLAGS) > 0 { flags := make([]string, len(cgoLDFLAGS)) for i, f := range cgoLDFLAGS { @@ -2966,7 +2951,7 @@ func (b *Builder) dynimport(a *Action, p *load.Package, objdir, importGo, cgoExe if p.Standard && p.ImportPath == "runtime/cgo" { cgoflags = []string{"-dynlinker"} // record path to dynamic linker } - return b.run(a, base.Cwd, p.ImportPath, b.cgoEnv(), cfg.BuildToolexec, cgoExe, "-dynpackage", p.Name, "-dynimport", dynobj, "-dynout", importGo, cgoflags) + return b.run(a, base.Cwd, p.ImportPath, b.cCompilerEnv(), cfg.BuildToolexec, cgoExe, "-dynpackage", p.Name, "-dynimport", dynobj, "-dynout", importGo, cgoflags) } // Run SWIG on all SWIG input files. diff --git a/src/cmd/go/testdata/script/cgo_path.txt b/src/cmd/go/testdata/script/cgo_path.txt index 0d15998426..98c56ff40e 100644 --- a/src/cmd/go/testdata/script/cgo_path.txt +++ b/src/cmd/go/testdata/script/cgo_path.txt @@ -2,11 +2,12 @@ env GOCACHE=$WORK/gocache # Looking for compile flags, so need a clean cache. [!windows] env PATH=.:$PATH -[!windows] chmod 0777 p/gcc p/clang +[!windows] chmod 0755 p/gcc p/clang [!windows] exists -exec p/gcc p/clang [windows] exists -exec p/gcc.bat p/clang.bat ! exists p/bug.txt -go build -x +! go build -x +stderr '^cgo: exec (clang|gcc): (clang|gcc) resolves to executable relative to current directory \(.[/\\](clang|gcc)(.bat)?\)$' ! exists p/bug.txt -- go.mod -- diff --git a/src/cmd/go/testdata/script/cgo_path_space.txt b/src/cmd/go/testdata/script/cgo_path_space.txt new file mode 100644 index 0000000000..6d203b04d6 --- /dev/null +++ b/src/cmd/go/testdata/script/cgo_path_space.txt @@ -0,0 +1,55 @@ +# Check that if the PATH directory containing the C compiler has a space, +# we can still use that compiler with cgo. +# Verifies #43808. + +[!cgo] skip + +# Check if default CC was set by make.bash. +# If it was, this test is not valid. +go env CC +stdout '^(clang|gcc)$' + +[!windows] chmod 0755 $WORK/'program files'/clang +[!windows] chmod 0755 $WORK/'program files'/gcc +[!windows] exists -exec $WORK/'program files'/clang +[!windows] exists -exec $WORK/'program files'/gcc +[!windows] env PATH=$WORK/'program files':$PATH +[windows] exists -exec $WORK/'program files'/gcc.bat +[windows] exists -exec $WORK/'program files'/clang.bat +[windows] env PATH=$WORK\'program files';%PATH% + +! exists log.txt +? go build -x +exists log.txt +rm log.txt + +# TODO(#41400, #43078): when CC is set explicitly, it should be allowed to +# contain spaces separating arguments, and it should be possible to quote +# arguments with spaces (including the path), as in CGO_CFLAGS and other +# variables. For now, this doesn't work. +[!windows] env CC=$WORK/'program files'/gcc +[windows] env CC=$WORK\'program files'\gcc.bat +! go build -x +! exists log.txt + +-- go.mod -- +module m + +-- m.go -- +package m + +// #define X 1 +import "C" + +-- $WORK/program files/gcc -- +#!/bin/sh + +echo ok >log.txt +-- $WORK/program files/clang -- +#!/bin/sh + +echo ok >log.txt +-- $WORK/program files/gcc.bat -- +echo ok >log.txt +-- $WORK/program files/clang.bat -- +echo ok >log.txt -- GitLab From 3a778ff50f7091b8a64875c8ed95bfaacf3d334c Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 22 Jan 2021 09:47:59 -0500 Subject: [PATCH 1682/1792] runtime: check for g0 stack last in signal handler In the signal handler, we adjust gsingal's stack to the stack where the signal is delivered. TSAN may deliver signals to the g0 stack, so we have a special case for the g0 stack. However, we don't have very good accuracy in determining the g0 stack's bounds, as it is system allocated and we don't know where it is exactly. If g0.stack.lo is too low, the condition may be triggered incorrectly, where we thought the signal is delivered to the g0 stack but it is actually not. In this case, as the stack bounds is actually wrong, when the stack grows, it may go below the (inaccurate) lower bound, causing "morestack on gsignal" crash. Check for g0 stack last to avoid this situation. There could still be false positives, but for those cases we'll crash either way. (If we could in some way determine the g0 stack bounds accurately, this would not matter (but probably doesn't hurt).) Fixes #43853. Change-Id: I759717c5aa2b0deb83ffb23e57b7625a6b249ee8 Reviewed-on: https://go-review.googlesource.com/c/go/+/285772 Trust: Cherry Zhang Reviewed-by: Michael Pratt --- src/runtime/proc.go | 5 +++++ src/runtime/signal_unix.go | 30 +++++++++++++++++------------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index aa44c625c5..d51dcb0d22 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1251,6 +1251,11 @@ func mstart() { // Initialize stack bounds from system stack. // Cgo may have left stack size in stack.hi. // minit may update the stack bounds. + // + // Note: these bounds may not be very accurate. + // We set hi to &size, but there are things above + // it. The 1024 is supposed to compensate this, + // but is somewhat arbitrary. size := _g_.stack.hi if size == 0 { size = 8192 * sys.StackGuardMultiplier diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index 382ba37a87..3f70707ab4 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -475,6 +475,14 @@ func adjustSignalStack(sig uint32, mp *m, gsigStack *gsignalStack) bool { return false } + var st stackt + sigaltstack(nil, &st) + stsp := uintptr(unsafe.Pointer(st.ss_sp)) + if st.ss_flags&_SS_DISABLE == 0 && sp >= stsp && sp < stsp+st.ss_size { + setGsignalStack(&st, gsigStack) + return true + } + if sp >= mp.g0.stack.lo && sp < mp.g0.stack.hi { // The signal was delivered on the g0 stack. // This can happen when linked with C code @@ -483,29 +491,25 @@ func adjustSignalStack(sig uint32, mp *m, gsigStack *gsignalStack) bool { // the signal handler directly when C code, // including C code called via cgo, calls a // TSAN-intercepted function such as malloc. + // + // We check this condition last as g0.stack.lo + // may be not very accurate (see mstart). st := stackt{ss_size: mp.g0.stack.hi - mp.g0.stack.lo} setSignalstackSP(&st, mp.g0.stack.lo) setGsignalStack(&st, gsigStack) return true } - var st stackt - sigaltstack(nil, &st) + // sp is not within gsignal stack, g0 stack, or sigaltstack. Bad. + setg(nil) + needm() if st.ss_flags&_SS_DISABLE != 0 { - setg(nil) - needm() noSignalStack(sig) - dropm() - } - stsp := uintptr(unsafe.Pointer(st.ss_sp)) - if sp < stsp || sp >= stsp+st.ss_size { - setg(nil) - needm() + } else { sigNotOnStack(sig) - dropm() } - setGsignalStack(&st, gsigStack) - return true + dropm() + return false } // crashing is the number of m's we have waited for when implementing -- GitLab From eb21b31e487344fb0045b3ef7b14df9521b94952 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 22 Jan 2021 16:35:21 -0500 Subject: [PATCH 1683/1792] runtime: define dummy msanmove In msan mode we instrument code with msan* functions, including msanmove. In some configurations the code is instrumented by the compiler but msan is not actually linked in, so we need dummy definitions for those functions so the program links. msanmove is newly added in CL 270859 but a dummy definition in msan0.go was not added, causing link failures. Add it. Change-Id: I91f8e749919f57f1182e90b43412b0282cf4767c Reviewed-on: https://go-review.googlesource.com/c/go/+/285955 Trust: Cherry Zhang Reviewed-by: Ian Lance Taylor --- src/runtime/msan0.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/runtime/msan0.go b/src/runtime/msan0.go index 117c5e5789..374d13f30b 100644 --- a/src/runtime/msan0.go +++ b/src/runtime/msan0.go @@ -16,7 +16,8 @@ const msanenabled = false // Because msanenabled is false, none of these functions should be called. -func msanread(addr unsafe.Pointer, sz uintptr) { throw("msan") } -func msanwrite(addr unsafe.Pointer, sz uintptr) { throw("msan") } -func msanmalloc(addr unsafe.Pointer, sz uintptr) { throw("msan") } -func msanfree(addr unsafe.Pointer, sz uintptr) { throw("msan") } +func msanread(addr unsafe.Pointer, sz uintptr) { throw("msan") } +func msanwrite(addr unsafe.Pointer, sz uintptr) { throw("msan") } +func msanmalloc(addr unsafe.Pointer, sz uintptr) { throw("msan") } +func msanfree(addr unsafe.Pointer, sz uintptr) { throw("msan") } +func msanmove(dst, src unsafe.Pointer, sz uintptr) { throw("msan") } -- GitLab From 25c39e4fb5e5fc7c3840228158cd6f2345c9dc07 Mon Sep 17 00:00:00 2001 From: Pantonshire Date: Mon, 18 Jan 2021 17:41:36 +0000 Subject: [PATCH 1684/1792] io/ioutil: fix example test for WriteFile to allow it to run in the playground The example for WriteFile assumed the existence of a testdata/ directory, which is not present on the playground. The example now writes the file to the current working directory, rather than to testdata/. Fixes #32916 Change-Id: I577caac7e67ba9d9941b2dd19346ad5ff61e78d9 GitHub-Last-Rev: 40f14e0adc4ebc00fb2946fe0cbaf8e0cb99f62c GitHub-Pull-Request: golang/go#43757 Reviewed-on: https://go-review.googlesource.com/c/go/+/284452 Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Bryan C. Mills --- src/io/ioutil/example_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io/ioutil/example_test.go b/src/io/ioutil/example_test.go index bc2b6fba73..78b0730c65 100644 --- a/src/io/ioutil/example_test.go +++ b/src/io/ioutil/example_test.go @@ -125,7 +125,7 @@ func ExampleReadFile() { func ExampleWriteFile() { message := []byte("Hello, Gophers!") - err := ioutil.WriteFile("testdata/hello", message, 0644) + err := ioutil.WriteFile("hello", message, 0644) if err != nil { log.Fatal(err) } -- GitLab From 66ee8b158f0a9e9fdc6cc2118926cb4bea497128 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Sat, 23 Jan 2021 06:18:30 +1100 Subject: [PATCH 1685/1792] runtime: restore cgo_import_dynamic for libc.so on openbsd This was removed in change 285692, however we need to explicitly pull libc.so in when libpthread.so is being used. The current code works on openbsd/amd64 since we pull libc.so in via runtime/sys_openbsd2.go, however openbsd/arm64 does not do this currently. Change-Id: Ibe93d936a22e69e2fe12620f6d27ccca7a91dba5 Reviewed-on: https://go-review.googlesource.com/c/go/+/285912 Trust: Joel Sing Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot --- src/runtime/sys_openbsd.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/sys_openbsd.go b/src/runtime/sys_openbsd.go index 2d41ed0d46..fcddf4d6a5 100644 --- a/src/runtime/sys_openbsd.go +++ b/src/runtime/sys_openbsd.go @@ -57,3 +57,4 @@ func pthread_create_trampoline() //go:cgo_import_dynamic libc_pthread_sigmask pthread_sigmask "libpthread.so" //go:cgo_import_dynamic _ _ "libpthread.so" +//go:cgo_import_dynamic _ _ "libc.so" -- GitLab From cd99385ff4a4b7534c71bb92420da6f462c5598e Mon Sep 17 00:00:00 2001 From: eric fang Date: Thu, 14 Jan 2021 07:14:02 +0000 Subject: [PATCH 1686/1792] cmd/internal/obj/arm64: fix VMOVQ instruction encoding error The VMOVQ instruction moves a 128-bit constant into a V register, as 128-bit constant can't be loaded into a register directly, we split it into two 64-bit constants and load it from constant pool. Currently we add the 128-bit constant to literal pool by calling the 'addpool' function twice, this is not the right way because it doesn't guarantee the two DWORD instructions are consecutive, and the second call of addpool will overwrite the p.Pool field,resulting in a wrong PC-relative offset value of the Prog. This CL renames the flag LFROM3 to LFROM128, and adds a new function addpool128 to add a 128-bit constant to the literal pool. Change-Id: I616f043c99a9a18a663f8768842cc980de2e6f79 Reviewed-on: https://go-review.googlesource.com/c/go/+/282334 Reviewed-by: eric fang Reviewed-by: Cherry Zhang Run-TryBot: eric fang Trust: eric fang --- src/cmd/internal/obj/arm64/asm7.go | 38 +++++++++++++++++-- .../arm64/{asm_test.go => asm_arm64_test.go} | 18 +++++++-- src/cmd/internal/obj/arm64/asm_arm64_test.s | 14 +++++++ 3 files changed, 62 insertions(+), 8 deletions(-) rename src/cmd/internal/obj/arm64/{asm_test.go => asm_arm64_test.go} (89%) create mode 100644 src/cmd/internal/obj/arm64/asm_arm64_test.s diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 1a359f1921..70072cfba4 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -280,7 +280,7 @@ func MOVCONST(d int64, s int, rt int) uint32 { const ( // Optab.flag LFROM = 1 << 0 // p.From uses constant pool - LFROM3 = 1 << 1 // p.From3 uses constant pool + LFROM128 = 1 << 1 // p.From3<<64+p.From forms a 128-bit constant in literal pool LTO = 1 << 2 // p.To uses constant pool NOTUSETMP = 1 << 3 // p expands to multiple instructions, but does NOT use REGTMP ) @@ -419,7 +419,7 @@ var optab = []Optab{ {AMOVD, C_LACON, C_NONE, C_NONE, C_RSP, 34, 8, REGSP, LFROM, 0}, // Move a large constant to a vector register. - {AVMOVQ, C_VCON, C_NONE, C_VCON, C_VREG, 101, 4, 0, LFROM | LFROM3, 0}, + {AVMOVQ, C_VCON, C_NONE, C_VCON, C_VREG, 101, 4, 0, LFROM128, 0}, {AVMOVD, C_VCON, C_NONE, C_NONE, C_VREG, 101, 4, 0, LFROM, 0}, {AVMOVS, C_LCON, C_NONE, C_NONE, C_VREG, 101, 4, 0, LFROM, 0}, @@ -995,8 +995,8 @@ func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { if o.flag&LFROM != 0 { c.addpool(p, &p.From) } - if o.flag&LFROM3 != 0 { - c.addpool(p, p.GetFrom3()) + if o.flag&LFROM128 != 0 { + c.addpool128(p, &p.From, p.GetFrom3()) } if o.flag<O != 0 { c.addpool(p, &p.To) @@ -1201,6 +1201,36 @@ func (c *ctxt7) flushpool(p *obj.Prog, skip int) { } } +// addpool128 adds a 128-bit constant to literal pool by two consecutive DWORD +// instructions, the 128-bit constant is formed by ah.Offset<<64+al.Offset. +func (c *ctxt7) addpool128(p *obj.Prog, al, ah *obj.Addr) { + lit := al.Offset + q := c.newprog() + q.As = ADWORD + q.To.Type = obj.TYPE_CONST + q.To.Offset = lit + q.Pc = int64(c.pool.size) + + lit = ah.Offset + t := c.newprog() + t.As = ADWORD + t.To.Type = obj.TYPE_CONST + t.To.Offset = lit + t.Pc = int64(c.pool.size + 8) + q.Link = t + + if c.blitrl == nil { + c.blitrl = q + c.pool.start = uint32(p.Pc) + } else { + c.elitrl.Link = q + } + + c.elitrl = t + c.pool.size += 16 + p.Pool = q +} + /* * MOVD foo(SB), R is actually * MOVD addr, REGTMP diff --git a/src/cmd/internal/obj/arm64/asm_test.go b/src/cmd/internal/obj/arm64/asm_arm64_test.go similarity index 89% rename from src/cmd/internal/obj/arm64/asm_test.go rename to src/cmd/internal/obj/arm64/asm_arm64_test.go index 9efdb0217f..c6a00f5b94 100644 --- a/src/cmd/internal/obj/arm64/asm_test.go +++ b/src/cmd/internal/obj/arm64/asm_arm64_test.go @@ -47,7 +47,7 @@ func TestLarge(t *testing.T) { // assemble generated file cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-S", "-o", filepath.Join(dir, "test.o"), tmpfile) - cmd.Env = append(os.Environ(), "GOARCH=arm64", "GOOS=linux") + cmd.Env = append(os.Environ(), "GOOS=linux") out, err := cmd.CombinedOutput() if err != nil { t.Errorf("Assemble failed: %v, output: %s", err, out) @@ -62,7 +62,7 @@ func TestLarge(t *testing.T) { // build generated file cmd = exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", filepath.Join(dir, "x.o"), tmpfile) - cmd.Env = append(os.Environ(), "GOARCH=arm64", "GOOS=linux") + cmd.Env = append(os.Environ(), "GOOS=linux") out, err = cmd.CombinedOutput() if err != nil { t.Errorf("Build failed: %v, output: %s", err, out) @@ -96,7 +96,7 @@ func TestNoRet(t *testing.T) { t.Fatal(err) } cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-o", filepath.Join(dir, "x.o"), tmpfile) - cmd.Env = append(os.Environ(), "GOARCH=arm64", "GOOS=linux") + cmd.Env = append(os.Environ(), "GOOS=linux") if out, err := cmd.CombinedOutput(); err != nil { t.Errorf("%v\n%s", err, out) } @@ -134,7 +134,7 @@ func TestPCALIGN(t *testing.T) { t.Fatal(err) } cmd := exec.Command(testenv.GoToolPath(t), "tool", "asm", "-S", "-o", tmpout, tmpfile) - cmd.Env = append(os.Environ(), "GOARCH=arm64", "GOOS=linux") + cmd.Env = append(os.Environ(), "GOOS=linux") out, err := cmd.CombinedOutput() if err != nil { t.Errorf("The %s build failed: %v, output: %s", test.name, err, out) @@ -150,3 +150,13 @@ func TestPCALIGN(t *testing.T) { } } } + +func testvmovq() (r1, r2 uint64) + +// TestVMOVQ checks if the arm64 VMOVQ instruction is working properly. +func TestVMOVQ(t *testing.T) { + a, b := testvmovq() + if a != 0x7040201008040201 || b != 0x3040201008040201 { + t.Errorf("TestVMOVQ got: a=0x%x, b=0x%x, want: a=0x7040201008040201, b=0x3040201008040201", a, b) + } +} diff --git a/src/cmd/internal/obj/arm64/asm_arm64_test.s b/src/cmd/internal/obj/arm64/asm_arm64_test.s new file mode 100644 index 0000000000..9d337a4fd1 --- /dev/null +++ b/src/cmd/internal/obj/arm64/asm_arm64_test.s @@ -0,0 +1,14 @@ +// 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. + +#include "textflag.h" + +// testvmovq() (r1, r2 uint64) +TEXT ·testvmovq(SB), NOSPLIT, $0-16 + VMOVQ $0x7040201008040201, $0x3040201008040201, V1 + VMOV V1.D[0], R0 + VMOV V1.D[1], R1 + MOVD R0, r1+0(FP) + MOVD R1, r2+8(FP) + RET -- GitLab From 9897655c615584c5a70b7a2d89028c014fc5f29b Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 22 Jan 2021 20:21:22 -0800 Subject: [PATCH 1687/1792] doc/go1.16: reword ambiguously parsable sentence Change-Id: Idc54967e962352a598c9d4c563d1d9f51ec5c889 Reviewed-on: https://go-review.googlesource.com/c/go/+/285680 Reviewed-by: Ian Lance Taylor Trust: Brad Fitzpatrick --- doc/go1.16.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index d7714888f2..9c8919e5c2 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -461,10 +461,10 @@ func TestFoo(t *testing.T) {

    The new io/fs package - defines an abstraction for read-only trees of files, - the fs.FS interface, - and the standard library packages have - been adapted to make use of the interface as appropriate. + defines the fs.FS interface, + an abstraction for read-only trees of files. + The standard library packages have been adapted to make use + of the interface as appropriate.

    -- GitLab From b634f5d97a6e65f19057c00ed2095a1a872c7fa8 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 22 Jan 2021 20:38:29 -0800 Subject: [PATCH 1688/1792] doc/go1.16: add crypto/x509 memory optimization Change-Id: I0c61b0e0d1430f66e3f7dbf07817264258a1c15a Reviewed-on: https://go-review.googlesource.com/c/go/+/285682 Reviewed-by: Ian Lance Taylor Trust: Brad Fitzpatrick --- doc/go1.16.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 9c8919e5c2..78f69f6c7d 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -623,6 +623,14 @@ func TestFoo(t *testing.T) { method allows accessing the Err field through the errors package functions.

    + +

    + On Unix systems, the crypto/x509 package is now more + efficient in how it stores its copy of the system cert pool. + Programs that use only a small number of roots will use around a + half megabyte less memory. +

    +
    -- GitLab From 044f937a73dc9a28c36a6c87d55c2211247e7d63 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 25 Jan 2021 11:14:57 +0100 Subject: [PATCH 1689/1792] doc/go1.16: fix WalkDir and Walk links Reported by Ben on golang-dev: https://groups.google.com/g/golang-dev/c/gsoj5Vv15j0/m/XR9CYSRkAgAJ For #40700. Change-Id: If4702cf0e9858aaef99c231251dc646a67d1026e Reviewed-on: https://go-review.googlesource.com/c/go/+/285718 Trust: Tobias Klauser Reviewed-by: Alberto Donizetti --- doc/go1.16.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 78f69f6c7d..9c4910053c 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -895,9 +895,9 @@ func TestFoo(t *testing.T) {

    The new function - WalkDir + WalkDir is similar to - Walk, + Walk, but is typically more efficient. The function passed to WalkDir receives a fs.DirEntry -- GitLab From ff82cc971aabd113f3b79afb054e287c0d5c5c00 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 18 Jan 2021 15:23:16 +0100 Subject: [PATCH 1690/1792] os: force consistent mtime before running fstest on directory on Windows FindFileNext sometimes returns a different mtime than looking at the file directly, because the MFT on NTFS is written to lazily. In order to keep these in sync, we use GetFileInformationByHandle to get the actual mtime, and then write it back to the file explicitly. Fixes #42637. Change-Id: I774016d3ac55d0dc9b0f9c1b681516c33ba0d28a Reviewed-on: https://go-review.googlesource.com/c/go/+/285720 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Trust: Jason A. Donenfeld --- src/os/os_test.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/os/os_test.go b/src/os/os_test.go index 698dbca91e..ee54b4aba1 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -11,6 +11,7 @@ import ( "fmt" "internal/testenv" "io" + "io/fs" "os" . "os" osexec "os/exec" @@ -2689,6 +2690,32 @@ func TestOpenFileKeepsPermissions(t *testing.T) { } func TestDirFS(t *testing.T) { + // 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" { + if err := filepath.WalkDir("./testdata/dirfs", func(path string, d fs.DirEntry, err error) error { + if err != nil { + t.Fatal(err) + } + info, err := d.Info() + if err != nil { + t.Fatal(err) + } + stat, err := Stat(path) // This uses GetFileInformationByHandle internally. + if err != nil { + t.Fatal(err) + } + if stat.ModTime() == info.ModTime() { + return nil + } + if err := Chtimes(path, stat.ModTime(), stat.ModTime()); err != nil { + t.Log(err) // We only log, not die, in case the test directory is not writable. + } + return nil + }); err != nil { + t.Fatal(err) + } + } if err := fstest.TestFS(DirFS("./testdata/dirfs"), "a", "b", "dir/x"); err != nil { t.Fatal(err) } -- GitLab From 54b251f542c97cf58a2ae800d3ed86cf14d0feed Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 25 Jan 2021 12:31:54 +0100 Subject: [PATCH 1691/1792] lib/time, time/tzdata: update tzdata to 2021a Changelog: South Sudan changes from +03 to +02 on 2021-02-01 at 00:00. Release announcement: http://mm.icann.org/pipermail/tz-announce/2021-January/000065.html Updates #22487 Change-Id: Ia0a1a7a8f5d47adac9782bc2a445f69e02440f77 Reviewed-on: https://go-review.googlesource.com/c/go/+/285719 Trust: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Go Bot Reviewed-by: Alberto Donizetti --- lib/time/update.bash | 4 +- lib/time/zoneinfo.zip | Bin 424205 -> 424214 bytes src/time/tzdata/zipdata.go | 13744 +++++++++++++++++------------------ 3 files changed, 6874 insertions(+), 6874 deletions(-) diff --git a/lib/time/update.bash b/lib/time/update.bash index c5f934e2db..e088ea6b90 100755 --- a/lib/time/update.bash +++ b/lib/time/update.bash @@ -8,8 +8,8 @@ # Consult https://www.iana.org/time-zones for the latest versions. # Versions to use. -CODE=2020f -DATA=2020f +CODE=2021a +DATA=2021a set -e rm -rf work diff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip index fd845c09a41f48a513e5a0eb469fb43e13fc6a79..d32fbba5175174b72ca42df853941f5a7122fad6 100644 GIT binary patch delta 47952 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 BFJ=G$ diff --git a/src/time/tzdata/zipdata.go b/src/time/tzdata/zipdata.go index 34477a283b..03b59720e2 100644 --- a/src/time/tzdata/zipdata.go +++ b/src/time/tzdata/zipdata.go @@ -16,610 +16,478 @@ package tzdata -const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Africa/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/FreetownUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x92" + - "H\x01\xff\xff\xfc8\x00\x00\x00\x00\x00\x00\x00\x04LMT\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x1c\x00Af" + - "rica/KinshasaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + +const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Africa/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa/NairobiUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Af" + + "rica/FreetownUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4" + - "\x00\x00\x00\xb4\x00\x00\x00\f\x00\x1c\x00Africa/LagosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x1c\x00Africa/JohannesburgUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x10\x00\x1c\x00Africa/Bujum" + - "buraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0" + - "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/KigaliUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\nC" + - "AT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00Africa/ConakryUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x1c\x00Afr" + - "ica/El_AaiunUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fr\xde \x00\x00\x00\x00\u007f\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%\u007f \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\xc1" + - "X\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\xdc" + - "\xbeD \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\n\x00\x00\x00\x00\x00T\x8a\x9eQV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x1c\x00Africa/KhartoumUT\t\x00\x03" + - "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00CAST\x00CAT\x00EAT\x00\nCAT-2" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x1c\x00Africa/CeutaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd6" + - "up\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\fa" + - "G\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#\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\u007fr\xde \x00\x00\x00\x00\u007f\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\xf2" + - "f \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%\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\fT\xce" + - "\xbe\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x1c\x00Africa/MbabaneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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͞o" + - "p\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\nSAS" + - "T-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ6\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x1c\x00Africa/MonroviaUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/NiameyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x8c" + - "P`\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x1c\x00Africa/DakarUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00" + - "\x1c\x00Africa/TripoliUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x003" + - "D6p\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\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x1c\x00Africa/NdjamenaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/DoualaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\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\n\x00\x00\x00\x00" + + "\x00\xf1c9R\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x1c\x00Africa/CeutaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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#\xa8^`\x00\x00\x00\x00?sWP\x00\x00\x00\x00@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0" + + "\x00\x00\x00\x00C\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\x00" + + "I\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\tLMT\x00EEST\x00EET\x00\nEET-2" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x1c\x00Africa/KhartoumUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00CAST\x00CAT\x00EAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00" + + "\x00\x00\xf1c9R\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x1c\x00Africa/MbabaneUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\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\xcc" + + "\xae\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\n\x00\x00\x00\x00\x00\xf1c9R)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x1c\x00Africa/El_AaiunU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\\\xce" + + "C\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\xbf" + + "M \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\u007fr\xde \x00\x00\x00\x00\u007f\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\x81" + + "j\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%\u007f \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\xcaI" + + "D \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 \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\n\x00\x00\x00\x00\x00\xf1c9R6\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x1c\x00Africa/MonroviaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00" + + "\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/LusakaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x82F\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00" + + "\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BamakoU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4" + + "\x00\x00\x00\r\x00\x1c\x00Africa/NiameyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c" + + "9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/KigaliUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x1c\x00Africa/AlgiersUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + + "\x00\x00\x00\x00\x00\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\x00C" + + "AT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x1c\x00Africa/BissauUT\t\x00\x03\x15\xac" + + "\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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朐\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x1c\x00Africa/KinshasaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\xaa" + + "C\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\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x12\x00\x1c\x00Africa/Addis_AbabaUT\t\x00\x03\x15\xac\x0e`" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x1c\x00" + + "Africa/TunisUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00CE" + + "T\x00\nCET-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BanjulUT\t\x00\x03\x15\xac\x0e" + + "`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00" + + "Africa/OuagadougouUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + + "\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/LibrevilleUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x13f" + - "B\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\x00WET\x00CEST\x00CET\x00\nCET-1" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x1c\x00Africa/DjiboutiUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x0eLM" + - "T\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x1c\x00Afric" + - "a/Sao_TomeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x1c\x00Africa/BrazzavilleU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Afr" + + "ica/BanguiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c" + - "\x00Africa/AbidjanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/MaputoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x04" + - "LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x1c\x00Africa/CairoUT\t" + - "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u007f\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\u007f\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\u007fYp\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\u007f\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\x00" + - "7(\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@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0\x00\x00\x00\x00C\xe0\x00\x00\x00\x00" + - "E\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\tLMT\x00EEST\x00EET\x00\nEET-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82" + - "\x00\x00\x00\x82\x00\x00\x00\v\x00\x1c\x00Africa/LomeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00" + + "\x82\x00\x00\x00\x0e\x00\x1c\x00Africa/AbidjanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BamakoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x1c\x00Africa/As" + - "maraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3" + - "c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/LibrevilleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/BlantyreUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x1c\x00Africa/W" + - "indhoekUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x003F\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\x1a" + - "G\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\x00Ow\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\x13LMT\x00+0130\x00SAST\x00WA" + - "T\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/HarareUT\t\x00" + - "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00" + - "\x00\r\x00\x1c\x00Africa/AsmeraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x1c\x00Africa/LubumbashiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x1c\x00Africa/AlgiersUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/" + - "Porto-NovoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/TimbuktuUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x13" + + "fB\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\x00WET\x00CEST\x00CET\x00\nCET-" + + "1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x1c\x00Africa/NouakchottUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x1c\x00Afr" + + "ica/Sao_TomeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf7" + + "c\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x0e\x10\x00\bLMT\x00GMT\x00WAT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x14" + + "\x00\x1c\x00Africa/Dar_es_SalaamUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa/KampalaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Africa" + - "/NairobiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x1c\x00Africa/LubumbashiUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Af" + + "rica/KampalaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/BlantyreUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x04" + + "LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/MalaboUT" + + "\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x1c\x00Afri" + + "ca/NdjamenaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + + "MT\x00WAT\x00WAST\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00Africa/Timb" + + "uktuUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_" + + "\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/GaboroneUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\n" + + "CAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rd\x01\x05\x89\u007f\a\x00\x00\u007f\a\x00\x00\x11\x00\x1c\x00Africa/CasablancaUT\t\x00\x03\x15\xac" + + "\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\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\x00" + + "Pg\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\x00" + + "W\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\x00" + + "o\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\u007fr\xde \x00\x00\x00\x00\u007f\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%\u007f \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\bL" + + "MT\x00+01\x00+00\x00\n<+01>-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/Map" + + "utoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c" + + "\xb4\x00\x00\x00\xb4\x00\x00\x00\f\x00\x1c\x00Africa/LagosUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + + "\x00\x00\xf1c9R\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Africa/MaseruUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\x00" + + "SAST\x00\nSAST-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x1c\x00Africa/Porto-Novo" + + "UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00Af" + + "rica/ConakryUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/DoualaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x1c\x00Africa/MogadishuUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x0eL" + + "MT\x00+0230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x1c\x00Afri" + + "ca/DakarUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Africa/MaseruUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\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\n\x00\x00\x00\x00\x00\xf1c9R" + + "_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x1c\x00Africa/TripoliUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00Africa/OuagadougouUT\t\x00" + - "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00" + - "\r\x00\x1c\x00Africa/LusakaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x1c\x00Africa/MogadishuUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\xda" + - "X\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+0" + - "230\x00EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x1c\x00Africa/Ga" + - "boroneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1" + - "\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x1c\x00Africa/BanjulUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/MalaboUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x12\x00\x1c\x00Africa/Addis_" + - "AbabaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b" + - "{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x1c\x00Africa/NouakchottUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\x00G" + - "MT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/LuandaUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00G" + - "MT\x00+0030\x00WAT\x00\nWAT-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x1c\x00Africa/Jub" + - "aUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 \x02\x01\x02\x01\x02\x01\x02\x01\x02\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\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\nEAT-3\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x1c\x00Africa/AccraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xff\x9a\x1d\x944\xff\xff\xff\xff\xa1\xc0\xb4\x80\xff" + - "\xff\xff\xff\xa1\xf2\xe4\xf0\xff\xff\xff\xff\xa34\x97\xa0\xff\xff\xff\xff\xa3\xd5i\xf0\xff\xff\xff\xff\xa5\x15\xcb \xff\xff\xff\xff\xa5\xb6\x9dp\xff\xff\xff\xff\xa6\xf6\xfe\xa0\xff\xff\xff\xff\xa7\x97\xd0\xf0\xff\xff\xff\xff\xa8" + - "\xd82 \xff\xff\xff\xff\xa9y\x04p\xff\xff\xff\xff\xaa\xba\xb7 \xff\xff\xff\xff\xab[\x89p\xff\xff\xff\xff\xac\x9b\xea\xa0\xff\xff\xff\xff\xad<\xbc\xf0\xff\xff\xff\xff\xae}\x1e \xff\xff\xff\xff\xaf\x1d\xf0p\xff" + - "\xff\xff\xff\xb0^Q\xa0\xff\xff\xff\xff\xb0\xff#\xf0\xff\xff\xff\xff\xb2@֠\xff\xff\xff\xff\xb2\xe1\xa8\xf0\xff\xff\xff\xff\xb4\"\n \xff\xff\xff\xff\xb4\xc2\xdcp\xff\xff\xff\xff\xb6\x03=\xa0\xff\xff\xff\xff\xb6" + - "\xa4\x0f\xf0\xff\xff\xff\xff\xb7\xe4q \xff\xff\xff\xff\xb8\x85Cp\xff\xff\xff\xff\xb9\xc6\xf6 \xff\xff\xff\xff\xbag\xc8p\xff\xff\xff\xff\xbb\xa8)\xa0\xff\xff\xff\xff\xbcH\xfb\xf0\xff\xff\xff\xff\xbd\x89] \xff" + - "\xff\xff\xff\xbe*/p\xff\xff\xff\xff\xbfj\x90\xa0\xff\xff\xff\xff\xc0\vb\xf0\xff\xff\xff\xff\xc1M\x15\xa0\xff\xff\xff\xff\xc1\xed\xe7\xf0\xff\xff\xff\xff\xc3.I \xff\xff\xff\xff\xc3\xcf\x1bp\xff\xff\xff\xff\xc5" + - "\x0f|\xa0\xff\xff\xff\xffŰN\xf0\xff\xff\xff\xff\xc6\xf0\xb0 \xff\xff\xff\xffǑ\x82p\xff\xff\xff\xff\xc81\f\xa0\xff\xff\xff\xff\xc9t\ap\xff\xff\xff\xff\xca\x12@ \xff\xff\xff\xff\xcbU:\xf0\xff" + - "\xff\xff\xffˇ<\x80\xff\xff\xff\xff\xd2\xe1\xd3x\xff\xff\xff\xffۡ\xdb \xff\xff\xff\xff\xdcB\xab\x18\xff\xff\xff\xff݃\x0e\xa0\xff\xff\xff\xff\xde#ޘ\xff\xff\xff\xff\xdfe\x93\xa0\xff\xff\xff\xff\xe0" + - "\x06c\x98\xff\xff\xff\xff\xe1F\xc7 \xff\xff\xff\xff\xe1\xe7\x97\x18\xff\xff\xff\xff\xe3'\xfa\xa0\xff\xff\xff\xff\xe3\xc8ʘ\xff\xff\xff\xff\xe5\t. \xff\xff\xff\xff\xe5\xa9\xfe\x18\x02\x01\x02\x01\x02\x01\x02\x01\x02" + - "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\xff\xff\xff\xcc\x00\x00\x00\x00" + - "\x04\xb0\x01\x04\x00\x00\x00\x00\x00\n\x00\x00\a\b\x00\x0e\x00\x00\a\b\x01\x0eLMT\x00+0020\x00GMT\x00+0030\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x14\x00\x1c\x00Africa/Dar_es_SalaamUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x00\x00\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\x00EE" + + "T\x00\nEET-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x1c\x00Africa/HarareUT\t\x00\x03\x15\xac\x0e" + + "`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x82" + + "F\xc5\xf4\x01\x00\x00\x1e\x8c\x00\x00\x00\x00\x1c \x00\x04LMT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x1c" + + "\x00Africa/AsmaraUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + + "\x00\x00\x00\xf1c9Rm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x1c\x00Africa/WindhoekUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x003F\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\x00Ow\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\x13LMT\x00+0130\x00SAST\x00WAT\x00CAT\x00\nCAT-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xee\xc4" + + "h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x1c\x00Africa/AccraUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9a\x1d\x944\xff\xff\xff\xff\xa1\xc0\xb4\x80\xff\xff\xff\xff\xa1\xf2\xe4\xf0\xff\xff\xff\xff\xa34\x97" + + "\xa0\xff\xff\xff\xff\xa3\xd5i\xf0\xff\xff\xff\xff\xa5\x15\xcb \xff\xff\xff\xff\xa5\xb6\x9dp\xff\xff\xff\xff\xa6\xf6\xfe\xa0\xff\xff\xff\xff\xa7\x97\xd0\xf0\xff\xff\xff\xff\xa8\xd82 \xff\xff\xff\xff\xa9y\x04p\xff\xff\xff" + + "\xff\xaa\xba\xb7 \xff\xff\xff\xff\xab[\x89p\xff\xff\xff\xff\xac\x9b\xea\xa0\xff\xff\xff\xff\xad<\xbc\xf0\xff\xff\xff\xff\xae}\x1e \xff\xff\xff\xff\xaf\x1d\xf0p\xff\xff\xff\xff\xb0^Q\xa0\xff\xff\xff\xff\xb0\xff#" + + "\xf0\xff\xff\xff\xff\xb2@֠\xff\xff\xff\xff\xb2\xe1\xa8\xf0\xff\xff\xff\xff\xb4\"\n \xff\xff\xff\xff\xb4\xc2\xdcp\xff\xff\xff\xff\xb6\x03=\xa0\xff\xff\xff\xff\xb6\xa4\x0f\xf0\xff\xff\xff\xff\xb7\xe4q \xff\xff\xff" + + "\xff\xb8\x85Cp\xff\xff\xff\xff\xb9\xc6\xf6 \xff\xff\xff\xff\xbag\xc8p\xff\xff\xff\xff\xbb\xa8)\xa0\xff\xff\xff\xff\xbcH\xfb\xf0\xff\xff\xff\xff\xbd\x89] \xff\xff\xff\xff\xbe*/p\xff\xff\xff\xff\xbfj\x90" + + "\xa0\xff\xff\xff\xff\xc0\vb\xf0\xff\xff\xff\xff\xc1M\x15\xa0\xff\xff\xff\xff\xc1\xed\xe7\xf0\xff\xff\xff\xff\xc3.I \xff\xff\xff\xff\xc3\xcf\x1bp\xff\xff\xff\xff\xc5\x0f|\xa0\xff\xff\xff\xffŰN\xf0\xff\xff\xff" + + "\xff\xc6\xf0\xb0 \xff\xff\xff\xffǑ\x82p\xff\xff\xff\xff\xc81\f\xa0\xff\xff\xff\xff\xc9t\ap\xff\xff\xff\xff\xca\x12@ \xff\xff\xff\xff\xcbU:\xf0\xff\xff\xff\xffˇ<\x80\xff\xff\xff\xff\xd2\xe1\xd3" + + "x\xff\xff\xff\xffۡ\xdb \xff\xff\xff\xff\xdcB\xab\x18\xff\xff\xff\xff݃\x0e\xa0\xff\xff\xff\xff\xde#ޘ\xff\xff\xff\xff\xdfe\x93\xa0\xff\xff\xff\xff\xe0\x06c\x98\xff\xff\xff\xff\xe1F\xc7 \xff\xff\xff" + + "\xff\xe1\xe7\x97\x18\xff\xff\xff\xff\xe3'\xfa\xa0\xff\xff\xff\xff\xe3\xc8ʘ\xff\xff\xff\xff\xe5\t. \xff\xff\xff\xff\xe5\xa9\xfe\x18\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + + "\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\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\xff\xff\xff\xcc\x00\x00\x00\x00\x04\xb0\x01\x04\x00\x00\x00\x00\x00\n\x00\x00\a\b" + + "\x00\x0e\x00\x00\a\b\x01\x0eLMT\x00+0020\x00GMT\x00+0030\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00" + + "\v\x00\x1c\x00Africa/LomeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + + "\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x1c\x00Africa/DjiboutiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + - "EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x1c\x00Africa/Bissau" + - "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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朐\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x1c\x00Africa/BanguiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + + "EAT\x00+0245\x00\nEAT-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00America/UT\t\x00\x03" + + "\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x1c\x00America" + + "/TegucigalpaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa4LKD\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\n\x00" + + "\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/St_KittsUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00America/UT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x1c\x00America/Grand_Tu" + - "rkUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\u007f`\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|k" + - "p\x00\x00\x00\x00N\xb6\"`\x00\x00\x00\x00O\\Mp\x00\x00\x00\x00P\x96\x04`\x00\x00\x00\x00QP\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xc8\x1b\x00\x00\xff\xff" + - "\xc8\x1b\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\fLMT\x00BMT\x00ADT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8f\x19Ԇ\x12\x02\x00\x00" + - "\x12\x02\x00\x00\x16\x00\x1c\x00America/Bahia_BanderasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\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\u007f\x00\x00\x00\x00\x00@o\xce" + - "\x90\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\x01\x02\x01\x02\x01\x02\x01\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\x05\x02\xff\xff\x9dT\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10\xff\xff\xb9\xb0\x01\x14" + - "LMT\x00MST\x00CST\x00PST\x00MDT\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x1c\x00America/NuukUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + - "if3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\"\x00\x00\x00\x03\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#3<-02>,M3.5.0/-2,M10.5.0/-1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb1݂" + - "x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x1c\x00America/Costa_RicaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x1c\x00America/ManausUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\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\u007fD\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfd" + - "N\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,\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\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x1c\x00America/WhitehorseUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfb\x1d_\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\x00Q3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/MarigotUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac" + - "\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x1c\x00Ame" + - "rica/Rankin_InletUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\x8cn\x00\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(w\xe0\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\x00" + - "8\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\x00" + - "E\xf3\xb7\x00\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\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\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CD" + - "T,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14\x00\x1c\x00America/Punta" + - "_ArenasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff" + + "\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rq\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x1c\x00America/Puer" + + "to_RicoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\a\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xfc\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\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 \u007f\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/b" + - "c\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\x00XC\x86\xb0\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\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\xba\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-03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xca" + - "g\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/GrenadaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST" + - "\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x1c\x00America/MenomineeUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\x00C" + - "ST\x00CWT\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x15\xc8\xcb\x00\xac\x00\x00" + - "\x00\xac\x00\x00\x00\x0e\x00\x1c\x00America/GuyanaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\n\x00\x00\x00\x00\x00\xf1c9R\xdf\b\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10\x00" + + "\x1c\x00America/BarbadosUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10\xff\xff\xff\xff\xa9y$\xe5\xff\xff\xff\xff\xb8\x85c\xe5\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\x01\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xc8\x1b\x00\x00\xff\xff\xc8" + + "\x1b\x00\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\fLMT\x00BMT\x00ADT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x14\xc1r8\xe0\x00\x00\x00\xe0" + + "\x00\x00\x00\x10\x00\x1c\x00America/AtikokanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x98\xd9y\x88\x00\x00\x00\x00\n}\xb4<\x00\x00\x00\x00'\u007f\xfb0\x01\x02\x03\xff\xff\xc9x\x00\x00\xff" + - "\xff\xcbD\x00\x04\xff\xff\xd5\xd0\x00\n\xff\xff\xc7\xc0\x00\x0eLMT\x00-0345\x00-03\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xbf\xf5" + - "\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x1c\x00America/Buenos_AiresUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\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\x00" + - "7\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/Port_of_SpainUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff" + - "\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x1c\x00America/Monc" + - "tonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\b" + - "K\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\x00BO" + - "j|\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,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ錴$q\x03\x00\x00q\x03\x00\x00\x13\x00\x1c\x00Americ" + - "a/Thunder_BayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x82,\xff\xff\xff\xff\x8f${\xe0\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\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\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\u007f`" + - "\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\xff\xff" + - "\xacT\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\nE" + - "ST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x1c\x00America/" + - "Blanc-SablonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xff^=9\f\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\x02\x01\x02\x03\x04\x02\xff\xff\xcat\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\n" + - "AST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x10\x00\x1c\x00America/MazatlanUT\t\x00\x03`\xa8\xec_" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04" + - "\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00PST\x00MD" + - "T\x00\nMST7MDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x1c\x00Amer" + - "ica/CaymanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x1c\x00America/DawsonUT\t\x00\x03`\xa8\xec_" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ې\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 \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\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\x00ED5" + - "P\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf7\xe9 y\xbd\x02\x00\x00\xbd" + - "\x02\x00\x00\x0e\x00\x1c\x00America/InuvikUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\x18\xff\xff\xff\xffr\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff" + + "\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff\xaa\x1c\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\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00" + + "\x00\x10\x00\x1c\x00America/DominicaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x1c\x00America/GuatemalaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x1fK" + + "P\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\n\x00\x00\x00\x00\x00\xf1c9R" + + "\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x1c\x00America/Rankin_InletUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\x8cn\x00\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8" + + "(w\xe0\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\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\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\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9\xb0\x00\x11-00\x00CDDT\x00" + + "CST\x00CDT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00" + + "\x00\x00\x0f\x00\x1c\x00America/TortolaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0\x06N\x80\xff\xff\xff\xff\xf7/h\x80\xff\xff\xff\xff\xf8(\x94\x00\x00\x00\x00\x00\x11\x89\x90 \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\u007f\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\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\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\x8f\x80\x00\t\xff\xff\x9d\x90\x00\r\xff\xff\xab\xa0\x01\x11-00\x00PDDT\x00PST\x00MS" + - "T\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x1c\x00" + - "America/North_Dakota/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQR\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x1c\x00America/North_Dakota/New_SalemUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + + "\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02\x00\x00\x0f\x00\x1c\x00America/IqaluitUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xccl\xa1\x80\xff\xff\xff\xff\xd2" + + "#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xf7/>P\xff\xff\xff\xff\xf8(i\xd0\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\u007f`\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\x05\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\x06\a\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff" + + "\xff\xb9\xb0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xc7\xc0\x01\x11\xff\xff\xc7\xc0\x01\x15\xff\xff\xab\xa0\x00\x19\xff\xff\xb9\xb0\x01\x1d-00\x00EPT\x00EST\x00EDDT\x00EDT\x00EWT\x00" + + "CST\x00CDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00" + + "\x1c\x00America/MiquelonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xb4" + + "P\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" + + "\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x1c\x00America/FortalezaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x0f" + + "I\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\x003\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x1c\x00America/Resolut" + + "eUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5\xfb\x81\x80\xff\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(w\xe0\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\x00" + + "9\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\x03\x02\x03\x02\x03\x02\x03\x02\x03" + + "\x02\x03\x02\x03\x02\x03\x02\x03\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff" + + "\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x1c\x00America/St_ThomasUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01" + + "\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x1c\x00Amer" + + "ica/RecifeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xae" + + "0\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\xe3" + + "0\x00\x00\x00\x009\xe9\x0f\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x003\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x19vv\xa0" + + "\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/CuracaoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04" + + "\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x1c\x00Amer" + + "ica/MartiniqueUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R?\xc9\x1c\xd4\xc6\x03" + + "\x00\x00\xc6\x03\x00\x00\x0e\x00\x1c\x00America/JuneauUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04" + + "a'\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\x12" + + "ys\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\x00PS" + + "T\x00PWT\x00PPT\x00PDT\x00YDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK" + + "\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x1c\x00America/BoiseUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x8d5\x90\x00\x00\x00\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" + @@ -627,1124 +495,374 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\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\x00" + "3Gf\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\u007f\x00\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00" + - "A\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\x00M" + - "DT\x00MST\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x1c\x00America/North_Dakota/CenterUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x02" + - "w\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\x00MDT\x00MS" + - "T\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7.\xb6*" + - "\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x1c\x00America/North_Dakota/BeulahUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\xe8" + - "X\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\u007f\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\x00MP" + - "T\x00CST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b\vKdC\x03\x00\x00C\x03\x00\x00\x13\x00\x1c\x00" + - "America/Rainy_RiverUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x87(\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ" + - "\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\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\x13i" + - "V\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\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\xff\xff\xa7X\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\x10LM" + - "T\x00CDT\x00CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x14\xc1r8" + - "\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x1c\x00America/AtikokanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8" + - "\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff\xaa\x1c\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\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf8Dz\x97\xae\x01" + - "\x00\x00\xae\x01\x00\x00\x11\x00\x1c\x00America/Boa_VistaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\u007f\xe0\xff\xff\xff\xff\xb8\x0fW\xf0\xff\xff\xff\xff\xb8\xfdN\xb0\xff\xff\xff\xff\xb9\xf1" + - "B@\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\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-04\x00\n<-" + - "04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x1c\x00America/MartiniqueUT\t\x00\x03`\xa8" + - "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xff" + - "i\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\x00" + - "FFMT\x00AST\x00ADT\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/Ada" + - "kUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\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\xff" + - "s`\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\x00" + - "BDT\x00AHST\x00HDT\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQU9#\xbe2\x05\x00\x00" + - "2\x05\x00\x00\x11\x00\x1c\x00America/VancouverUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Porto_AcreUT\t\x00\x03`\xa8\xec_" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00\x00\x00R\u007f" + - "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x1c\x00America/New_Y" + - "orkUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x9c" + - "Qp\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\x9e" + - "Mp\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cd" + - "a`\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\x00E" + - "ST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00" + - "\x00\x0e\x00\x1c\x00America/RecifeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xde" + - "t \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\xe9\x0f\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x003\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x1c\x00America/AsuncionUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + - "3\x0f\xb2\xb0\x00\x00\x00\x0047\x10\xc0\x00\x00\x00\x004\xf8\xcf0\x00\x00\x00\x006\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\x00" + - "Aq\xee@\x00\x00\x00\x00B3\xac\xb0\x00\x00\x00\x00CQ\xd0@\x00\x00\x00\x00D\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\x00" + - "O\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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x1c\x00America/Port-au-PrinceUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00Q3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x1c\x00America/BoiseUT\t\x00\x03`\xa8\xec_" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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*\xea" + - "T\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\u007f\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x1c\x00America/PangnirtungUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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)\xff\xff\xff\xff\xa3\xd5R\x80\xff\xff" + - "\xff\xffˈ\xe2`\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xf7/0@\xff\xff\xff\xff\xf8([\xc0\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\x18`\x00\x00\x00\x001g" + - "g\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?\x9b" + - "b\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\x03\x01" + - "\x02\x03\x04\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\x06\a\x06\a\x06\a\x06\a\x06\b\t\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\x00" + - "\x00\x00\x00\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x01\x15\xff\xff\xc7\xc0\x01\x19\xff\xff\xb9\xb0\x00\x1d\xff\xff\xab\xa0\x00!\xff\xff\xb9\xb0\x01%-" + - "00\x00AWT\x00APT\x00AST\x00ADDT\x00ADT\x00EDT\x00EST\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11." + - "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x1c\x00America/GodthabUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\"\x00\x00\x00\x03\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#3<-02>,M3.5.0/-2,M10.5.0/-" + - "1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x1c\x00America/NassauUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x937B\x8a\xff\xff\xff" + - "\xff\xcb\xf4\xefP\xff\xff\xff\xff\xd0\xfaG\xc0\xff\xff\xff\xff\xd1#4P\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2x\x9a\xc0\xff\xff\xff\xff\xf5Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Z" + - "p\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\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\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\xff\xff\xb7v\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\x00EWT\x00EST\x00EPT\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/RosarioUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/St_BarthelemyUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x93" + - "73\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x1c\x00" + - "America/PhoenixUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00" + + "A\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\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\x00" + + "PDT\x00PST\x00MWT\x00MPT\x00MST\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x1c\x00America/Blanc-SablonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x06\x00\x00\x00\x05\x00\x00\x00\x14\xff\xff\xff\xff^=9\f\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\x02\x01\x02\x03\x04\x02\xff\xff\xcat\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\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x1c" + + "\x00America/CuiabaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x04,2" + - "h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x1c\x00America/SantaremUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x1c\x00America/MetlakatlaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\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\xe0T" + + "A0\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!\x81" + + "w@\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\x009\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00N\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\x00E\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\x00TC7@\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[\xde" + + "n\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\n\x00\x00\x00\x00\x00\xf1c9R\xf7\xe9 y\xbd\x02\x00\x00\xbd\x02\x00\x00\x0e\x00\x1c\x00America/Inuvi" + + "kUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0\x06N\x80\xff\xff\xff\xff\xf7/h\x80\xff\xff\xff\xff\xf8(\x94\x00\x00\x00\x00\x00\x11\x89\x90 \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\u007f\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\x03" + + "\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\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\x8f\x80\x00\t\xff\xff\x9d\x90\x00\r\xff\xff\xab\xa0\x01\x11-00\x00PDDT\x00PST\x00MST\x00MDT\x00\nMST7MDT,M3.2." + + "0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00\x1c\x00America/YellowknifeU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x19\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\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0\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)\n" + + "r\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\u007f\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\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\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\xb9\xb0\x01\x10\xff\xff\xab\xa0\x01\x15-00\x00MWT\x00MPT\x00M" + + "ST\x00MDDT\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x10\x00\x1c\x00America/Indiana/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00" + + "\xf1c9R$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x1c\x00America/Indiana/KnoxUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x01\xd8N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x1c\x00America/Indiana/Petersburg" + + "UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00" + + "\x00\xf1c9Rp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x1c\x00America/Indiana/IndianapolisUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RصK\xa6\n\x02\x00\x00\n\x02\x00\x00\x19\x00\x1c\x00America/Indiana/Tell_C" + + "ityUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15\x00\x1c\x00America/Indiana/V" + + "evayUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xd2a\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\n\x00\x00\x00\x00\x00\xf1c9RK-E\xfad" + + "\x02\x00\x00d\x02\x00\x00\x17\x00\x1c\x00America/Indiana/WinamacUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\x00PST\x00PWT\x00PPT\x00PDT\x00AKST\x00AKDT\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x1c\x00America/AraguainaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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<-0" + - "3>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x1c\x00America/DenverUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\x00MD" + - "T\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00" + - "\xc4\x02\x00\x00\x0f\x00\x1c\x00America/CordobaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9c" + - "50\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\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQ?\xc9\x1c\xd4\xc6\x03\x00" + - "\x00\xc6\x03\x00\x00\x0e\x00\x1c\x00America/JuneauUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x12y" + - "s\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\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/OjinagaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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\x01\x02\x01\x02\x01\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" + - "\xff\xff\x9e\x1c\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M" + - "3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x1c\x00America/Scoresby" + - "sundUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#1<+00>,M3.5.0/0,M10.5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x1c" + - "\x00America/JujuyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00America/EnsenadaUT" + - "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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" + + "\x00\x00\x00\x00\x00\x00\x00\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\xf9" + + "p\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\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\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\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M" + + "3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RM/U\x9f7\x02\x00\x007\x02\x00\x00\x17\x00\x1c\x00America/Indiana/" + + "MarengoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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`\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\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\n\x00\x00\x00\x00\x00\xf1c9R\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x1c\x00America/Indiana/VincennesUT\t" + + "\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\u007f\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\x00" + + "D/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\x00CDT\x00C" + + "ST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rc)\xf6" + + ")\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x1c\x00America/BogotaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+\xbe" + + "]@\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\n\x00" + + "\x00\x00\x00\x00\xf1c9R.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x1c\x00America/MonctonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\xd9" + + "\x94\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)\n" + + "G\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\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\x00P" + - "WT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x1c" + - "\x00America/TorontoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\nES" + - "T5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQn\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x1c\x00America/N" + - "omeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xb8" + - "qP\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\u007f@\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\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\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\x00BS" + - "T\x00BDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x1c\x00America/Cambridge_BayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\t\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\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0\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\xe6\xfe\x00\x00\x00\x00\x00" + - "9\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\u007f\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\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\a\x06\b\a\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\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\xb9\xb0\x01\x10\xff\xff\xab\xa0\x01\x15\xff\xff\xb9\xb0\x01\x19\xff\xff\xab\xa0\x00\x1d\xff\xff\xb9\xb0\x00!-00\x00MWT\x00" + - "MPT\x00MST\x00MDDT\x00MDT\x00CDT\x00CST\x00EST\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x1c\x00America/CrestonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff^=p\xbc\xff\xff\xff\xff\x9b\xd6Kp\xff\xff\xff" + - "\xff\x9e\xf9;\x00\x01\x02\x01\xff\xff\x92\xc4\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00\bLMT\x00MST\x00PST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQq\xc9" + - "*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x1c\x00America/Puerto_RicoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x1c\x00America/CatamarcaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + + "\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\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,M11.1.0\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/MarigotUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f \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\xc2" + - "T\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x1c\x00America/Coral_HarbourUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr" + - "\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff" + - "\xaa\x1c\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\nE" + - "ST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x1c\x00America/Argentina/UT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Ar" + - "gentina/SaltaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6" + + "T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00\x1c\x00America" + + "/MaceioUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x003\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xf1c9RԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x1c\x00America/PanamaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xf1c9R\xa2\x81\xbfyS\x02\x00\x00" + + "S\x02\x00\x00\x12\x00\x1c\x00America/MetlakatlaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\xf4" + + "p\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\x00PST" + + "\x00PWT\x00PPT\x00PDT\x00AKST\x00AKDT\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1" + + "c9R\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x1c\x00America/DawsonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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ې\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\x00" + + "J\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\x00Q3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/B" + - "uenos_AiresUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd4" + - "p0\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\xc7A" + - "7\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'\xd0" + - "X\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\u007f \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\fL" + - "MT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00Ame" + - "rica/Argentina/UshuaiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9c5" + - "0\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\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfcz=\xe1\xcd\x02\x00\x00" + - "\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/San_JuanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/La_RiojaUT\t\x00\x03" + - "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ɰ\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\xd3" + - "6\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\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Ar" + - "gentina/San_LuisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ep\xb4c\xc4" + - "\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/Rio_GallegosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f \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\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00America/Argentina/CordobaUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Argentina/Juju" + - "yUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x1c\x00America/Argentina/CatamarcaUT\t\x00" + - "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x1c\x00America/Argentina/" + - "ComodRivadaviaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd30\x00\x00\x00\x00+\x99W \x00\x00\x00\x007\xf6ư\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00@\xbb\xf1" + - "0\x00\x00\x00\x00@\xd5\v\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00" + - "America/Argentina/MendozaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + - "8\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\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQY\xd8֭\xd6" + - "\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x1c\x00America/Argentina/TucumanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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=\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@\xcb\xd1@\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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-0" + - "2\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x89غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x1c\x00America/BelizeUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\u007f?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\xb3" + - "X\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\xab7" + - "P\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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-0530\x00CST\x00CWT\x00CPT\x00CDT\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x1c\x00America/SitkaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\n" + - "0\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\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\x00PS" + - "T\x00PWT\x00PPT\x00PDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00\x1c\x00America/YellowknifeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x19\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\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0\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*\xea" + - "T\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\u007f\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" + - "\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\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\xb9\xb0\x01\x10\xff\xff\xab\xa0\x01\x15-00\x00MWT\x00MPT\x00MST\x00MDDT\x00MDT\x00\nMST" + - "7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x1c\x00America/In" + - "diana/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x17\x89}q\x01\x00\x00q\x01\x00\x00" + - "\x15\x00\x1c\x00America/Indiana/VevayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xd2a\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x1c\x00America/Indiana/VincennesUT\t" + - "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\u007f\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\x00" + - "D/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\x00CDT\x00C" + - "ST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQM/U" + - "\x9f7\x02\x00\x007\x02\x00\x00\x17\x00\x1c\x00America/Indiana/MarengoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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`\xfdp\x00\x00\x00\x00\x05" + - "P\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\x00E" + - "ST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x1c" + - "\x00America/Indiana/WinamacUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\x18LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11." + - "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x1c\x00America/Indiana/KnoxUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc3" + - "p\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\nCST6C" + - "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x1c\x00America/Indi" + - "ana/IndianapolisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5" + - "U\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" + + "\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\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/AntiguaUT" + + "\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x11\x00\x1c\x00America/Kentucky/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00" + + "\x00\xf1c9R\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x1c\x00America/Kentucky/LouisvilleUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xe3" + - "I6p\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\x00C" + - "PT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQصK\xa6\n\x02\x00\x00\n\x02\x00" + - "\x00\x19\x00\x1c\x00America/Indiana/Tell_CityUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\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\u007f\xa5p\xff\xff\xff\xff\xf3o\xa4\x80\xff\xff\xff\xff\xf4_\x87" + - "p\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\x00" + - "CWT\x00CPT\x00EST\x00EDT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x01\xd8N\x8c\xab\x02" + - "\x00\x00\xab\x02\x00\x00\x1a\x00\x1c\x00America/Indiana/PetersburgUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\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\u007f\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\x00E" + - "ST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x1c\x00Ame" + - "rica/FortalezaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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!\x81i" + - "0\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\x003\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x1c\x00America/AnchorageUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\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\x00" + - "9\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\nAKST9AK" + - "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x1c\x00America/Danm" + - "arkshavnUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x1c\x00America/Campo_GrandeUT\t" + - "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + - "8\xb8\x930\x00\x00\x00\x009\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00N\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\x00" + - "G\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\x00TC7@\x00\x00\x00\x00" + - "T\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/Domin" + - "icaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13" + - "\x02\x00\x00\x13\x02\x00\x00\x12\x00\x1c\x00America/Fort_WayneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\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\x00" + - "CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Rio_BrancoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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\xf8" + - "QHP\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`\u007fP\x00\x00\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x1c\x00America/TegucigalpaUT\t\x00\x03`\xa8\xec_" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa4L" + - "KD\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13" + - "\x00\x1c\x00America/Mexico_CityUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\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\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ϷV" + - "P\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10LM" + - "T\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a" + - "\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x1c\x00America/TijuanaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\xf6\x80\xff\xff\xff\xff\xa9yOp\xff\xff\xff\xff\xaf\xf2|\xf0\xff\xff\xff\xff\xb6f" + - "dp\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\xf2" + - "3\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\x13i" + - "r \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\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x1c\x00America/CancunUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + - "\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\x00T\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x1c\x00America/Swift_CurrentUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\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\x14LM" + - "T\x00MDT\x00MST\x00MWT\x00MPT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x1c\x00Am" + - "erica/CuiabaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xda" + - "8\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\x009\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00N\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\x00E\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\x00TC7@\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-0" + - "3\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/MendozaU" + - "T\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00T\x8a\x9eQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x1c\x00America/St_John" + - "sUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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\x00" + - "9\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\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\x00" + - "G\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\x00N" + - "DT\x00NST\x00NPT\x00NWT\x00NDDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Qo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x1c\x00America/MeridaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\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\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\x01\x02\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\x01\x03\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\nCST6CDT,M4.1.0,M10.5." + - "0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x1c\x00America/ResoluteUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5\xfb\x81\x80\xff" + - "\xff\xff\xff\xf7/L`\xff\xff\xff\xff\xf8(w\xe0\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\x004" + - "R\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\x00B" + - "O\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\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\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x04\x03\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xab\xa0\x00\t\xff\xff\xb9\xb0\x01\r\xff\xff\xb9" + - "\xb0\x00\x11-00\x00CDDT\x00CST\x00CDT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x1c\x00America/ArubaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff" + - "\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00" + - "America/HalifaxUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xdc" + - "4\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\u007fU0\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\xb7N" + - "B@\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\u007f\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\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\x00A" + - "ST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00" + - "\x00\x0e\x00\x1c\x00America/PanamaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bLM" + - "T\x00CMT\x00EST\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/Anguil" + - "laUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9bܩ=\xda\x06" + - "\x00\x00\xda\x06\x00\x00\x0f\x00\x1c\x00America/ChicagoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "I6p\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\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\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00C" + + "da`\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\nPK" + + "\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x1c\x00America/Kentucky/MonticelloUT\t\x00\x03" + + "\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\u007f`\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\x00C" + + "PT\x00EDT\x00EST\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00" + + "\x00\x0f\x00\x1c\x00America/OjinagaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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\x01\x02\x01\x02\x01\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\xff\xff\x9e\x1c\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0" + + "\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x1c\x00America/ArubaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]" + + "\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00" + + "\r\x00\x1c\x00America/SitkaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\n\x00\x00\x00\x00\x00\xf1c9Rѱ\x86b\xee" + + "\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x1c\x00America/NassauUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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" + + "\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\x937B\x8a\xff\xff\xff\xff\xcb\xf4\xefP\xff\xff\xff\xff\xd0\xfaG\xc0\xff\xff\xff\xff\xd1#4P" + + "\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2x\x9a\xc0\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00" + + "@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\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\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\xff\xff\xb7v\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\x00E" + + "WT\x00EST\x00EPT\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x9d?\xdfڸ\x03\x00" + + "\x00\xb8\x03\x00\x00\x11\x00\x1c\x00America/Sao_PauloUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf14" + + "0\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'!\x0f" + + "0\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\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00" + + "\x00N\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\xc2" + + "0\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\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\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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,M" + - "11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x1c\x00America/JamaicaUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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`\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x1c\x00America/IndianapolisUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xf1c9R" + + "g\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Rio_BrancoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\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\xf8QH" + + "P\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`\u007fP\x00\x00\x00\x00R\u007f\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\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x1c\x00America/Costa_RicaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00CS" + + "T\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x1c\x00America/Porto_VelhoUT\t" + + "\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ְ\x02\x01\x02\x01\x02\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x1c\x00America/IndianapolisUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + @@ -1753,225 +871,683 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x1c\x00America/CaracasUT\t\x00\x03`\xa8" + - "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xff" + - "i\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x1c" + - "\x00America/LimaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x1c\x00America/Port-au-Prince" + + "UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x002" + + "r\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\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\xffe" + + "P\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" + + "\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x1c\x00Ameri" + + "ca/St_JohnsUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcd" + + "\x82\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\xde" + + "tX\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\u007f\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\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#j" + + "p\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\x001g" + + "6\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?\x9b" + + "1\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Δ\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\n\x00\x00\x00\x00\x00\xf1c9RJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x1c\x00America/PangnirtungUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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)\xff\xff\xff\xff\xa3\xd5R\x80\xff\xff\xff" + + "\xffˈ\xe2`\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xed\xd0\xff\xff\xff\xff\xf7/0@\xff\xff\xff\xff\xf8([\xc0\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\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\u007f`\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\x03\x01\x02" + + "\x03\x04\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\x06\a\x06\a\x06\a\x06\a\x06\b\t\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\a\x06\x00\x00" + + "\x00\x00\x00\x00\xff\xff\xd5\xd0\x01\x04\xff\xff\xd5\xd0\x01\b\xff\xff\xc7\xc0\x00\f\xff\xff\xe3\xe0\x01\x10\xff\xff\xd5\xd0\x01\x15\xff\xff\xc7\xc0\x01\x19\xff\xff\xb9\xb0\x00\x1d\xff\xff\xab\xa0\x00!\xff\xff\xb9\xb0\x01%-0" + + "0\x00AWT\x00APT\x00AST\x00ADDT\x00ADT\x00EDT\x00EST\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11.1" + + ".0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x1c\x00America/MatamorosUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf7" + + "p\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\xa2@\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\bL" + + "MT\x00CST\x00CDT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00" + + "\x00\x10\x00\x1c\x00America/EirunepeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00,\xc0\xd1P\x00\x00\x00\x00-f\xe0@\x00\x00\x00\x00H`\u007fP\x00\x00\x00\x00R\u007f\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x1c\x00America/ShiprockUT\t\x00\x03\x15\xac\x0e`" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\b" + + "v\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\x8d" + + "5\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R\xe90T\x16\xd1" + + "\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x1c\x00America/GodthabUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\"\x00\x00\x00\x03\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#3<-02>,M3.5.0/-2,M10.5.0/-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RU\r\xf7\xd3\xc7\x01\x00" + + "\x00\xc7\x01\x00\x00\r\x00\x1c\x00America/ThuleUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x1c\x00Ameri" + + "ca/ManaguaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xd4o" + + "P\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11" + + "\x00\x1c\x00America/Glace_BayUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\x00" + + "APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x1c\x00Am" + + "erica/CrestonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQB\xa0=:\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x1c\x00Americ" + - "a/HermosilloUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ڀ\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\xff\xff\x97\xf8\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10" + - "LMT\x00MST\x00CST\x00PST\x00MDT\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x1c\x00Amer" + - "ica/BelemUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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Ƞ\x02\x01\x02\x01\x02\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\n\x00\x00\x00\x00\x00T\x8a\x9eQM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x1c\x00America/Glace_BayUT" + - "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\"\x1b" + - "P\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\xce" + - "P\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\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,M1" + - "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/GuadeloupeUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00" + - "\x1c\x00America/ShiprockUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xe0\xa1" + - "\x90\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\xdf" + - "\x90\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\xda" + - "\x80\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\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x1c\x00America/MatamorosUT\t\x00\x03" + - "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00Cd" + - "op\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\xa2@\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6@\rm\xa8\x05" + - "\x00\x00\xa8\x05\x00\x00\x13\x00\x1c\x00America/Fort_NelsonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZi" + + "\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff^=p\xbc\xff\xff\xff\xff\x9b\xd6Kp\xff\xff\xff\xff\x9e\xf9;\x00\x01\x02\x01\xff\xff\x92\xc4\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\x8f\x80\x00" + + "\bLMT\x00MST\x00PST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RB\xa0=:\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x1c\x00America/Her" + + "mosilloUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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ڀ\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\xff\xff\x97\xf8\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00M" + + "ST\x00CST\x00PST\x00MDT\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x1c\x00America/S" + + "anta_IsabelUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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\x15I" + + "T \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\x00" + + "MST\x00PST\x00PDT\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RP\x0f" + + "(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x1c\x00America/Santo_DomingoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\b" + + "K\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\u007fH\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\x00" + + "EST\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/St" + + "_VincentUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R" + + "\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13\x00\x1c\x00America/Mexico_CityUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\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\xb6f" + + "V`\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\xff\xff\xa3\f\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff" + + "\xff\xb9\xb0\x01\f\xff\xff\xb9\xb0\x01\x10LMT\x00MST\x00CST\x00CDT\x00CWT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n" + + "\x00\x00\x00\x00\x00\xf1c9R\x15\xc8\xcb\x00\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x1c\x00America/GuyanaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\x04\x00\x00\x00\x12\xff\xff\xff\xff\x98\xd9y\x88\x00\x00\x00\x00\n}\xb4<\x00\x00" + + "\x00\x00'\u007f\xfb0\x01\x02\x03\xff\xff\xc9x\x00\x00\xff\xff\xcbD\x00\x04\xff\xff\xd5\xd0\x00\n\xff\xff\xc7\xc0\x00\x0eLMT\x00-0345\x00-03\x00-04\x00\n<-04>4\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/Port_of_SpainUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373" + + "\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x1c\x00Am" + + "erica/DetroitUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\u007f`\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\x00" + + "EST\x00EWT\x00EPT\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x12\x00\x1c\x00America/Argentina/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04" + + "\n\x00\x00\x00\x00\x00\xf1c9RR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x1c\x00America/Argentina/CatamarcaUT\t\x00\x03\x15\xac" + + "\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff" + + "r\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\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\x00" + + "G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xf1c9RR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x1c\x00America/Argentina/Com" + + "odRivadaviaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd4" + + "p0\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\xc7A" + + "7\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'\xd0" + + "X\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\u007f \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\fL" + + "MT\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x1c\x00Ame" + + "rica/Argentina/UshuaiaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9c5" + + "0\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\u007f \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\n\x00\x00\x00\x00\x00\xf1c9RŒZ\x8c\xc4\x02\x00\x00" + + "\xc4\x02\x00\x00\x19\x00\x1c\x00America/Argentina/MendozaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\x00" + + "7\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\u007f \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\n\x00\x00\x00\x00\x00\xf1" + + "c9R\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00America/Argentina/Buenos_AiresUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xf1c9Rm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/La_Rioj" + + "aUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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ɰ\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@\xbb\xf10\x00\x00\x00\x00" + + "@\xd5\v\xc0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\fLM" + + "T\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x1c\x00Amer" + + "ica/Argentina/Rio_GallegosUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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'\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\u007f \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\x00CMT\x00-04\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RutZ\x1a" + + "\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Argentina/JujuyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f \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\n\x00\x00\x00\x00\x00\xf1c9R\xfcz=\xe1\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a" + + "\x00\x1c\x00America/Argentina/San_JuanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\x00" + - "5'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\x00" + - "Cd\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\x00" + - "QN\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d\xf7\a ,\x06\x00\x00" + - ",\x06\x00\x00\x11\x00\x1c\x00America/Goose_BayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\u007f\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\x00ED\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\x00" + - "I\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\x00NST\x00NDT\x00NPT\x00NWT\x00ADT\x00AST\x00ADDT\x00\nAST4ADT,M3" + - ".2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x12\x00\x1c\x00America/Kralendij" + - "kUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x1c\x00America/Santa_IsabelUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6" + - "\x80\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\x00MST\x00PST\x00PDT\x00PWT\x00PPT\x00\n" + - "PST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02\x00\x00\x0f\x00\x1c\x00America" + - "/IqaluitUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\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\u007f \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\n\x00" + + "\x00\x00\x00\x00\xf1c9R\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x1c\x00America/Argentina/San_LuisUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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;\xc3" + + "0\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\n\x00\x00\x00\x00\x00\xf1c9Rt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x1c\x00America/Argenti" + + "na/SaltaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xccl\xa1\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\xff\xff\xff\xff\xf7/>P\xff\xff\xff\xff\xf8(i\xd0\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\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00E" + - "DC`\x00\x00\x00\x00E\xf3\xa8\xf0\x05\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\x06\a\x02\x04\x02" + - "\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x04\x00\x00\x00\x00\x00\x00\xff\xff\xc7\xc0\x01\x04\xff\xff\xb9\xb0\x00\b\xff\xff\xd5\xd0\x01\f\xff\xff\xc7\xc0\x01\x11\xff\xff\xc7\xc0\x01\x15\xff\xff\xab\xa0\x00\x19\xff\xff\xb9\xb0\x01\x1d-" + - "00\x00EPT\x00EST\x00EDDT\x00EDT\x00EWT\x00CST\x00CDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x1c\x00America/EdmontonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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" + + "\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\xc0" + + "Z\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\xd4" + + "Cd\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\u007f \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\n\x00\x00\x00\x00\x00\xf1c9RY\xd8֭\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x1c\x00America/Argentina/Tucuma" + + "nUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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=\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@\xcb\xd1@\x00\x00\x00\x00" + + "Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xf1c9R\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00" + + "\x00\x19\x00\x1c\x00America/Argentina/CordobaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\xff" + + "0\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\xc6" + + "\xb0\x00\x00\x00\x008\xbf*\xb0\x00\x00\x00\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xf1c9R" + + "\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x1c\x00America/Grand_TurkUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\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\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-\x9ei" + + "p\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\u007f`\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\x8f\xec\x90\x00\x00\x00\x00?\x9b\u007f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00B" + + "O\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\x01\x02\x01\x02\x01\x02\x01\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\x05\x02\xff\xff\x9dT\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10\xff\xff\xb9\xb0\x01\x14LMT\x00MST\x00CST\x00PS" + + "T\x00MDT\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00" + + "\x0e\x00\x1c\x00America/VirginUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04" + + "\n\x00\x00\x00\x00\x00\xf1c9R\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/CayenneUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00" + + "\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/MontserratUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00" + + "\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x1c\x00America/WinnipegUT\t\x00\x03\x15\xac\x0e" + + "`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe6" + + "G<\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\x004" + + "R\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\u007f\x00\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00B" + + "O\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\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\nMST" + - "7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x1c\x00America/Bo" + - "gotaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+\xbe]@\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x1c" + - "\x00America/GuatemalaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00" + + "\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/AnguillaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff" + + "\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/Mend" + + "ozaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf4" + + "w@\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(\xfa" + + "g\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\u007f \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\n\x00\x00\x00\x00\x00\xf1c9R\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x1c\x00America/San" + + "taremUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/" + + "St_LuciaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R" + + "Ծ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x1c\x00America/CaymanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\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\n\x00\x00\x00\x00\x00\xf1c9Rp\x1b\xceRC\x03\x00\x00C\x03\x00\x00\x0f\x00\x1c\x00Ame" + + "rica/NipigonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x81@\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xc8\xf8IP\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2" + + "#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\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\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\u007f`\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\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\xff\xff\xad@\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\x00E" + + "ST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RV\x80\x94@\x12\x04\x00\x00\x12\x04\x00" + + "\x00\x0e\x00\x1c\x00America/DenverUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xe0" + + "\xa1\x90\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x1c\x00America/Dawson_CreekU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xde" + + "\xb3\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\u007f\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\x0f" + + "f\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\x14LMT\x00PDT\x00PST\x00PWT\x00PPT\x00MST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00" + + "\xf1c9R\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x1c\x00America/NuukUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\"\x00\x00\x00\x03\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#3<-02>,M3.5.0/-2,M10.5.0/-1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf2" + + "\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x1c\x00America/CancunUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\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\x00" + + "2r\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\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\xb8G\x00\x00\x00\x00\x00L\xcd\x13\xf0\x00\x00\x00\x00" + + "M\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\x00T\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\n\x00\x00\x00\x00\x00\xf1c9R" + + "n\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x1c\x00America/NomeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\x003" + + "G\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\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\n\x00\x00\x00\x00\x00\xf1c9R,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x1c\x00America/YakutatUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04a5\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\x12y\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\x00YDT\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2." + + "0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x1c\x00America/GrenadaUT\t\x00\x03" + + "\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f" + + "\x00\x1c\x00America/RosarioUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xe4" + - "P\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\b" + - "LMT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x1c\x00America/Detr" + - "oitUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f`\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\x00EP" + - "T\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQp\x1b\xceRC\x03\x00\x00C\x03\x00\x00\x0f\x00\x1c\x00" + - "America/NipigonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\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'!\x0f" + + "0\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\u007f \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\n\x00\x00\x00\x00\x00\xf1c9R\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00" + + "\x0f\x00\x1c\x00America/CaracasUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9Ro_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x1c\x00America/MeridaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x10\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\x00" + + "7\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\x01\x02\x01\x03\x01\x03\x01\x03" + + "\x01\x03\x01\x03\x01\x03\x01\x03\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\nCST6CDT,M4." + + "1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x1c\x00America/Buenos_Air" + + "esUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xaf" + + "0\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\xf1" + + "0\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\u007f \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-0" + + "4\x00-03\x00-02\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x1b\vKdC\x03\x00\x00C\x03\x00\x00\x13\x00\x1c\x00America/Rain" + + "y_RiverUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x87(\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ\xfe\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff" + + "\xff\xff\xd2a\t\xf0\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\xc0" + + "u\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)\xde" + + "\xb3\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\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\xff\xff\xa7X\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\x00CW" + + "T\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x1c\x00" + + "America/PhoenixUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x14\xff\xff\xff\xffr\xee\x81@\xff\xff\xff\xff\x9e\xb8\x93p\xff\xff\xff\xff\x9f\xba\xeb`\xff\xff\xff\xff\xc8\xf8IP\xff\xff\xff\xffˈ\xf0p\xff\xff" + - "\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`\xfb\xe0\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\xd9" + + "\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\n\x00\x00\x00\x00\x00\xf1c9R\xdf\xe5\x8d" + + "\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x1c\x00America/LouisvilleUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\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\xd9" + "\xa2\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" + @@ -1980,1389 +1556,999 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\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\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00ED" + - "C`\x00\x00\x00\x00E\xf3\xa8\xf0\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\xff\xff\xad@\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\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x12\x00\x1c\x00America/MontserratUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nA" + - "ST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00\x1c\x00America/MiquelonUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x1c\x00Am" + - "erica/Sao_PauloUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0T" + - "3 \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!\x81" + - "i0\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\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00N\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\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\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\xd4" + - "L\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ[Sp\x90\x02\x05\x00\x00\x02\x05\x00" + - "\x00\x10\x00\x1c\x00America/SantiagoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x06\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xc6\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff" + - "\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\x1bɰ\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 \u007f\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\x00" + - "3=\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\x00" + - "Ah\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\x00" + - "O\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\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x03" + - "\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x1c\x00America/Knox_INUT\t\x00" + - "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd2" + - "a\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\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\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\nCST" + - "6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x1c\x00America/La" + - "_PazUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x1bd\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\fLM" + - "T\x00CMT\x00BST\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x1c\x00America/" + - "Lower_PrincesUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\nLMT\x00-043" + - "0\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x1c\x00America/ChihuahuaU" + - "T\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c\x8c\x00\x00\xff" + - "\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7MDT,M4.1.0,M" + - "10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x1c\x00America/WinnipegUT\t\x00\x03`\xa8" + - "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + - "d䰔\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\x00" + - "4R\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\u007f\x00\x00\x00\x00\x00@o\xc0\x80\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00" + - "BO\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\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x1c\x00America/ParamariboUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00\x00\x00\x11\x00\x1c\x00America/Guay" + - "aquilUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00" + - "\x1c\x00America/St_ThomasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x1c\x00America/MontevideoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007fy\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\u007f\x87\xa0\x00\x00\x00\x00" + - "\x0e\xe7\u007f0\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\x00D\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\x00" + - "L\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\x00RP\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-0" + - "230\x00-02\x00-0130\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x1c\x00America/" + - "St_LuciaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - ",\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x1c\x00America/YakutatUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\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\x03q" + - "6\xa0\x00\x00\x00\x00\x04a5\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\x12y\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,\xd3" + - "\x8c\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\x00YDT\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae" + - ",\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x1c\x00America/AtkaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\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\nHST10HDT,M3.2.0,M11." + - "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x1c\x00America/El_SalvadorUT\t\x00\x03`\xa8" + - "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + - "MT\x00CDT\x00CST\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/Noron" + - "haUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x002\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00" + - "\x0f\x00\x1c\x00America/ManaguaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\"\x12\xfe" + - "\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x1c\x00America/Los_AngelesUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "C`\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rk^2S\xb9" + + "\x04\x00\x00\xb9\x04\x00\x00\x14\x00\x1c\x00America/Punta_ArenasUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\xf2" + - "3\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\u007f\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\x13i" + - "r \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\n\x00\x00\x00\x00\x00T\x8a\x9eQs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10" + - "\x00\x1c\x00America/EirunepeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xde" + - "\x90@\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\x00,\xc0\xd1P\x00\x00\x00\x00-f\xe0@\x00\x00\x00\x00H`\u007fP\x00\x00\x00\x00R\u007f\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\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x1c\x00America/Dawson_CreekUT\t\x00\x03`\xa8" + - "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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\x14LMT\x00PDT\x00PST\x00PWT\x00PPT\x00MST\x00\nMST7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\xe5" + - "\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x1c\x00America/LouisvilleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\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\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\u007f`\x00\x00\x00\x00BO\x94p\x00\x00\x00\x00Cda`\x00\x00\x00\x00D/vp\x00\x00\x00\x00E" + - "DC`\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\x00CS" + - "T\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0" + - "\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x1c\x00America/CuracaoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04" + - "\xff\xff\xc7\xc0\x00\nLMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x1c\x00Amer" + - "ica/MonterreyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x00" + - "3GX\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xa1\xf4\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\bLM" + - "T\x00CST\x00CDT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x11\x00\x1c\x00America/Kentucky/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x1c\x00America/Kentucky/MonticelloUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x94" + - "p\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\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\u007f`\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\x00ES" + - "T\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x1c\x00Amer" + - "ica/Kentucky/LouisvilleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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`\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)\xde" + - "\xa5p\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\u007f`\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\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e" + - "\x00\x1c\x00America/HavanaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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ܩP\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\x00" + - "M\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\nCST5C" + - "DT,M3.2.0/0,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x1c\x00America/" + - "MontrealUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\a\x00\x00\x00\x14\xff\xff\xff\xffi\x87\x1d\xfc\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff" + + "\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\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 \u007f\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\xf1" + + "v@\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\x00XC" + + "\x86\xb0\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\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\xba\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-03\x00" + + "\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x1c\x00America/Porto_AcreUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00" + + "\x00\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x1c\x00America/" + + "New_YorkUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + + "\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%\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" + + "\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\xc6" + - "M|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\u007f\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" + - "\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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" + + "M|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\xe7" + + "7\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\u007f\x97`\xff\xff\xff\xff\xf3o\x96p\xff\xff\xff\xff\xf4_y`\xff\xff\xff\xff\xf5" + + "Oxp\xff\xff\xff\xff\xf6?[`\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(w\xe0\xff\xff\xff\xff\xf9\x0f\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\x00" + + "EDT\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xad`\x12\xe9\xaa\x00" + + "\x00\x00\xaa\x00\x00\x00\x0e\x00\x1c\x00America/La_PazUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x1bd\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\n\x00\x00\x00\x00\x00\xf1c9R\xb7-2f" + + "\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x1c\x00America/NoronhaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\xc7" + + "\xb7\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\x002\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x1c\x00America/GuadeloupeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff" + + "\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x1c\x00Ameri" + + "ca/Campo_GrandeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0T" + + "A0\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!\x81" + + "w@\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\x009\xdf\xf1@\x00\x00\x00\x00:\x8f:\xb0\x00\x00\x00\x00;\xc9\r\xc0\x00\x00\x00\x00N\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\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\x00TC7@\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\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\n\x00\x00\x00\x00\x00\xf1c9R:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00" + + "\x00\x14\x00\x1c\x00America/ScoresbysundUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#1<+00>,M3.5.0/0,M10.5.0/1\nPK\x03\x04\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x1c\x00America/North_Dakota/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x1c\x00America/North_Dakot" + + "a/CenterUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00MDT\x00MST\x00MWT\x00MPT\x00CDT\x00CST\x00\nCST6CDT,M3.2.0,M1" + + "1.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RR\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x1c\x00America/North_Dakota/New" + + "_SalemUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "Y\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\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\u007f\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\nCST6CDT,M3.2.0,M11." + + "1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x1c\x00America/North_Dakota/Beula" + + "hUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\x00" + + "G-|\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\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x1c\x00America/VirginUT\t" + - "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQP\x0f(\b=\x01\x00\x00=\x01\x00" + - "\x00\x15\x00\x1c\x00America/Santo_DomingoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fH\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x1c\x00Antarctica/UT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x1c\x00Antarctica" + - "/DumontDUrvilleUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x1c\x00America/Goose_BayUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\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\u007f\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\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\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\x00ED\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\x00NST\x00NDT\x00NPT\x00NWT\x00ADT\x00AST\x00AD" + + "DT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x12\x00\x1c\x00Ame" + + "rica/Fort_WayneUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x02\x00\x00\x00\b\xff\xff\xff\xffԼv\x80\xff\xff\xff\xff\xde4``\xff\xff\xff\xff\xe7<\x02\x80\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xa0\x00\x04-00" + - "\x00+10\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\r\x0e\xf20\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Antarctica/Syow" + - "aUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\xb1X\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00*0\x00\x04-00\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xea\x06\xd3" + - "\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x1c\x00Antarctica/DavisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\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\xe3I" + + "6p\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\x00CP" + + "T\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R):\x17-\x88\x06\x00\x00\x88\x06\x00\x00" + + "\x0f\x00\x1c\x00America/HalifaxUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xbc" + + "E@\xff\xff\xff\xff\xb0\u007fU0\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\x9d" + + "1\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\u007f\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\x99" + + "X\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,\xd3" + + "FP\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\x00A" + + "DT\x00AST\x00AWT\x00APT\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x1c\xd8\x19\x9dp\x01\x00" + + "\x00p\x01\x00\x00\x15\x00\x1c\x00America/Swift_CurrentUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\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\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\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\n\x00\x00\x00\x00\x00\xf1c9R[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x10\x00\x1c\x00America/SantiagoUT\t\x00\x03\x15\xac\x0e" + + "`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x06\x00\x00\x00\x14\xff\xff\xff\xffi" + + "\x87\x1d\xc6\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\x1bɰ\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 \u007f\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\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x03\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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\n\x00\x00\x00\x00\x00\xf1c9R8\xcdZ\x05" + + "o\x01\x00\x00o\x01\x00\x00\x10\x00\x1c\x00America/MazatlanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x1c\x00Antarctica/Palmer" + - "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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 \u007f\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\x00B" + - "3\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\x00P" + - "B\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x1c\x00Antarctica/Maws" + - "onUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x1c\x00Antarctica/RotheraUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x1c\x00" + - "Antarctica/VostokUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe9X\x89\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00T`\x00\x04-00\x00+06\x00\n<+06>-6\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x1c\x00Antarctica/South_PoleUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ:\xc8P7\xb1\x00" + - "\x00\x00\xb1\x00\x00\x00\x10\x00\x1c\x00Antarctica/TrollUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x1c\x00Antarctica/CaseyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\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\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ڀ\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00" + + "\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00PST\x00MDT\x00\nMST7MDT,M4.1.0,M10.5" + + ".0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x1c\x00America/St_BarthelemyUT\t\x00\x03\x15" + + "\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x9373\xac\x01\xff\xff\xc6T\x00\x00\xff\xff\xc7\xc0\x00\x04LMT\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x89غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00" + + "\x1c\x00America/BelizeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\u007f?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\xda" + + "\x99\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-0530\x00CST\x00CWT\x00CPT\x00C" + + "DT\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00\x00\x00\x11\x00\x1c\x00America/GuayaquilUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\fL" + + "MT\x00QMT\x00-04\x00-05\x00\n<-05>5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x1c\x00America" + + "/MontevideoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xd2" + + "C0\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\u007fy\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\x18" + + "R8\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\x96" + + "u0\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\u007f\x87\xa0\x00\x00\x00\x00\x0e\xe7\u007f0\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\x00D\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\x00RP\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\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x1c\x00America/Los_AngelesUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\f\x00\x00\x00\x03\x00\x00\x00\f\xff\xff\xff\xff\xfe\x1è\x00\x00\x00\x00J\xda\x06 \x00\x00\x00\x00" + - "K\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-00\x00+08\x00+11\x00\n<" + - "+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\x84J]\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x1c\x00Antarctica/MacquarieUT" + - "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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Ā\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-0" + - "0\x00AEST\x00AEDT\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7" + - "\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x1c\x00Antarctica/McMurdoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\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-12" + - "NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Arctic/UT" + - "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x1c\x00Arct" + - "ic/LongyearbyenUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "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\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\u007f\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\x00" + + "62\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\x00" + + "D/\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\x00P" + + "DT\x00PST\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\a\x1c\x9e\x9a]\x04\x00" + + "\x00]\x04\x00\x00\x0e\x00\x1c\x00America/HavanaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x1ez" + + "SP\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:\xc6" + + "\xb5\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\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,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x1c\x00Am" + + "erica/MenomineeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffr\xee$l\xff\xff\xff\xff\x9b'\xe3\x00\xff\xff\xff\xff\x9b\xd4{`\xff\xff\xff\xffȷM`\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\xeb\xaf \x90\xff\xff\xff\xff\xec\xa8" + - "L\x10\xff\xff\xff\xff\xed\x98=\x10\xff\xff\xff\xff\xee\x88.\x10\xff\xff\xff\xff\xefx\x1f\x10\xff\xff\xff\xff\xf0h\x10\x10\xff\xff\xff\xff\xf1X\x01\x10\xff\xff\xff\xff\xf2G\xf2\x10\xff\xff\xff\xff\xf37\xe3\x10\xff\xff" + - "\xff\xff\xf4'\xd4\x10\xff\xff\xff\xff\xf5\x17\xc5\x10\xff\xff\xff\xff\xf6\x10\xf0\x90\xff\xff\xff\xff\xf7/\x06\x10\xff\xff\xff\xff\xf7\xf0Ґ\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x14\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x1c\x00Asia/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x1c\x00Asia/Hong_KongUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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/K" + - "8\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\x00JS" + - "T\x00\nHKT-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/MuscatUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x1c" + - "\x00Asia/TaipeiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5" + - "E\"\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\xe3" + - "w\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\x00" + - "CDT\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x1c\x00Asia/QatarUT\t\x00\x03`\xa8\xec_" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x1c\x00Asia/NicosiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\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\x1f" + - "H\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x1c\x00Asia/GazaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\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\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" + - "3\x00\x00\x00\x00\x00\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\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\u007f\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@\u007f\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\xb7\x11\xd0\x00\x00\x00\x00" + - "I\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\x00" + - "X\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`" + - "\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\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-2EEST,M3." + - "4.4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x1c\x00Asia/Barnaul" + - "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + - "\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\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" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x1c\x00Asia/SamarkandUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + + "\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\x13i" + + "V\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\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\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x1c\x00America/JujuyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05" + + "l0\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\u007f \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\n\x00\x00\x00\x00\x00\xf1c9R\xd0v\x01\x8a\x01" + + "\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x1c\x00America/TijuanaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\xff\xff\xff\xff\xa9yOp\xff\xff\xff\xff\xaf\xf2|\xf0\xff\xff\xff\xff\xb6fd" + + "p\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\x00MST\x00PST\x00PDT\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x1c\x00America/EdmontonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+0" + - "4\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00\x1c\x00Asia/BakuUT" + - "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x1c\x00Asia/TbilisiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\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\xa2P\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\x11L" + - "MT\x00TBMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00A" + - "sia/RiyadhUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\n" + + "MST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x1c\x00America" + + "/ChihuahuaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x1c\x00Asia/RangoonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\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<+063" + - "0>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x1c\x00Asia/YakutskUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00" + - "\x00\xb0\x04\x00\x00\r\x00\x1c\x00Asia/IstanbulUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\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\xa0" + - "p\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\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\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x1c\x00Asia/QyzylordaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\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\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\x000du" + - "P\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\t" + - "P\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x1c\x00Asia" + - "/KhandygaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\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\x01\x02\x01\x02\x01\x02\x03\x02\x03\x02\x04\x01\x04\x01\x04" + + "\x01\x04\x01\x04\xff\xff\x9c\x8c\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\xb9\xb0\x01\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00CDT\x00MDT\x00\nMST7M" + + "DT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x1c\x00America/Camb" + + "ridge_BayUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "G\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\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00" + - "\x1c\x00Asia/KathmanduUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/" + - "ChongqingUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00C" + - "ST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x1c\x00Asia/Ho_Chi_MinhUT\t\x00" + - "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ0]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x1c\x00Asia/Bishk" + - "ekUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00E\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\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x1c\x00Asia/QostanayUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\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\xac" + - "u\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x1c\x00Asia/KabulUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x1c\x00Asia/TomskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d?v\f" + - "\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacauUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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_\x96" + - "p\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@\xd0" + - "8\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\n\x00\x00\x00\x00\x00T\x8a\x9eQw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x1c\x00Asia/Ust-NeraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x1c\x00Asia/YerevanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + - "0d\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\u007f\xe0\x00\x00\x00\x00L̕`\x00\x00\x00\x00M\x8ea\xe0\x00\x00\x00\x00" + - "N\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\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x1c\x00Asia/VientianeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQd" + - "%\x05\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x1c\x00Asia/VladivostokUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\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)\xd4" + - "\x98\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\x05" + - "K\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x1c\x00Asia/Beir" + - "utUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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'\u007f" + - "\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\xd0" + - "P\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\tL" + - "MT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.0/0,M10.5.0/0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ?Y\xaf\x19" + - "\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DaccaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "bp\x01\x18LMT\x00HMT\x00+0630\x00+0530\x00+06\x00+07\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\xea\x18\xd4\xf8" + - "\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x1c\x00Asia/YekaterinburgUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "0duP\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\x00" + - "L̇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\n\x00\x00\x00\x00\x00T\x8a\x9eQ6j\\J\xcf\x04\x00\x00\xcf" + - "\x04\x00\x00\v\x00\x1c\x00Asia/HebronUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00u\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\u007f" + - "\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'B" + - "P\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@\u007f\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\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`\x02\x01\x02" + - "\x01\x02\x01\x02\x01\x02\x01\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\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\x00IST\x00\nEET-2EEST,M3.4" + - ".4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x1c\x00Asia/ThimphuU" + - "T\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/ThimbuUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ)\x15" + - "II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x1c\x00Asia/SakhalinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x18" + - "k\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\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\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\x10" + - "LMT\x00+09\x00+12\x00+11\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x1c\x00" + - "Asia/ChoibalsanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\x90\x00\x00\x00\x00?tb\x80\x00\x00\x00\x00@da\x90\x00\x00\x00\x00ATD\x80\x00\x00\x00\x00BD" + - "C\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\x00k" + - "X\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x1c\x00Asia/SeoulUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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/p" + - "x\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\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\nK" + - "ST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x1c\x00Asia/MakassarUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x1c\x00Asia" + - "/DubaiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x1c\x00Asia/AlmatyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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<+0" + - "6>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x1c\x00Asia/Ulan_BatorUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xee" + - "L\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\x9a" + - "p\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x1c\x00Asia/SaigonUT\t\x00\x03`\xa8" + - "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DhakaUT\t" + - "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x1c\x00Asia/JayapuraU" + - "T\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x1c\x00Asia/Pyongya" + - "ngUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11" + - "\x00\x1c\x00Asia/Kuala_LumpurUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6U\xaa\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\xca" + - "\xb3\xe5`\xff\xff\xff\xffˑ_\b\xff\xff\xff\xff\xd2Hm\xf0\x00\x00\x00\x00\x16\x91\xf5\b\x01\x02\x03\x04\x05\x06\x05\a\x00\x00_V\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/ChungkingUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x1c\x00Asia/AqtobeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x1c\x00Asia/ChitaUT\t\x00\x03`\xa8" + - "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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@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\x00" + - "J\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\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x1c\x00Asia/ColomboUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\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<+053" + - "0>-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacaoUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00\x00\x12\x00\x1c\x00Asi" + - "a/SrednekolymskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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+\xb4" + - "k\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\xee" + - "Yp\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x1c\x00Asia/BaghdadUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "8\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\n\x00\x00\x00\x00\x00T\x8a\x9eQe" + - "\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x1c\x00Asia/AshgabatUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+0" + - "5\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x1c\x00Asia/KamchatkaUT\t\x00\x03" + - "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00" + - "Asia/BahrainUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00Asia/BangkokUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQ9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x1c\x00Asia/KarachiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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\xd2" + - "t\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+0" + - "530\x00+0630\x00+05\x00PKST\x00PKT\x00\nPKT-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x1c\x00" + - "Asia/TashkentUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\xa1\xf2̀\xff\xff\xff\xffˉ\f\x90\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\x18\x00\xff\xff\xff\xff\xf7/Zp\xff\xff\xff\xff\xf8(\x85\xf0" + + "\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\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\u007f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00BO\xb0\x90\x00\x00\x00\x00" + + "Cd}\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\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\a\x06\b\a\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\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\xb9\xb0\x01\x10" + + "\xff\xff\xab\xa0\x01\x15\xff\xff\xb9\xb0\x01\x19\xff\xff\xab\xa0\x00\x1d\xff\xff\xb9\xb0\x00!-00\x00MWT\x00MPT\x00MST\x00MDDT\x00MDT\x00CDT\x00CST\x00EST" + + "\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x1c\x00Ameri" + + "ca/WhitehorseUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "FP\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x1c\x00Asia/AdenUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\xfb\x1d_\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\x00" + + "8\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\x00" + + "E\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\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\r" + + "l\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\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\x00" + + "ED\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\x00" + + "AHST\x00HDT\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Ra\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00" + + "\x0e\x00\x1c\x00America/ManausUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fD\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,\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\n\x00\x00\x00\x00\x00\xf1c9R\xf1\xf9\x1dɻ\x00\x00\x00" + + "\xbb\x00\x00\x00\x12\x00\x1c\x00America/ParamariboUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x1c\x00Asia/OmskUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xed" + - "P\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\x00" + - "T`\x01\f\x00\x00bp\x00\bLMT\x00+05\x00+07\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00" + - "\x00\x0f\x00\x1c\x00Asia/Phnom_PenhUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + - "MT\x00BMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17✳2\x04\x00\x002\x04\x00\x00\x0e\x00\x1c\x00Asia/Jerus" + - "alemUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\xcd" + - "\xac\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\xdc" + - "\xb9=\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" + - "\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\nI" + - "ST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x1c\x00Asia" + - "/MagadanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x1c\x00Asia/JakartaUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x1c\x00Asia/" + - "NovokuznetskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x004RA\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\x00BE\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x1c\x00Asia/OralUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\n\x00\x00\x00\x00\x00\xf1c9R\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x1c\x00America/LimaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00" + + "\x00\x00\x00\x00\xf1c9Rd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x1c\x00America/AsuncionUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x0f" + + "Z1\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\x006\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\x00D\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\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f\x00\x1c\x00America/ChicagoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\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\nCST6" + + "CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x1c\x00America/Mon" + + "terreyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\xff\xff\xa1\xf4\x00\x00\xff\xff\xab\xa0\x00\x04\xff\xff\xb9\xb0\x01\bLMT\x00CST\x00C" + + "DT\x00\nCST6CDT,M4.1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x1c\x00Ame" + + "rica/Coral_HarbourUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x84d\xff\xff\xff\xff\x9e\xb8\xa1\x80\xff\xff\xff\xff\x9f\xba\xf9p\xff\xff\xff\xff\xc8\xf8W`\xff\xff\xff\xffˈ\xfe" + + "\x80\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2a\t\xf0\x02\x01\x02\x01\x03\x04\x05\xff\xff\xaa\x1c\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" + + "LMT\x00CDT\x00CST\x00CWT\x00CPT\x00EST\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R錴$q\x03\x00\x00q\x03\x00\x00\x13\x00\x1c\x00" + + "America/Thunder_BayUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x18\xff\xff\xff\xffr\xee\x82,\xff\xff\xff\xff\x8f${\xe0\xff\xff\xff\xffˈ\xf0p\xff\xff\xff\xff\xd2#\xf4p\xff\xff\xff\xff\xd2`" + + "\xfb\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\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\u007f`\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\xff\xff\xacT\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\x00" + + "EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x1c\x00Am" + + "erica/EnsenadaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf6\x80\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\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\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\x14L" + + "MT\x00MST\x00PST\x00PDT\x00PWT\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9" + + "ROKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x1c\x00America/BahiaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff" + + "\xb0\x00\x00\x00\x00N\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\b" + + "LMT\x00-02\x00-03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x1c\x00America/Mo" + + "ntrealUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xc9" + + "p\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\u007f\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\x8f\xd0" + + "p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\n\x00\x00\x00\x00\x00\xf1c9R%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x1c\x00America/JamaicaUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00KMT\x00EST\x00EDT\x00\nES" + + "T5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x1c\x00America/AnchorageUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x1b" + + "0\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\x00A" + + "KDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00" + + "\x00\x14\x00\x1c\x00America/DanmarkshavnUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "8\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ)p\x1cX\xf1\x02\x00\x00\xf1\x02\x00\x00\x10\x00\x1c\x00Asia/Novosib" + - "irskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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<+0" + - "7>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x1c\x00Asia/DamascusUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r\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>\u007fp\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\u007fg\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\"\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + - "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\"\b\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t" + - "LMT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.5/0,M10.5.5/0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ`\xc9\xd4" + - "\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x1c\x00Asia/Ujung_PandangUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x1c\x00Asia/FamagustaUT\t\x00\x03`\xa8" + - "\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x00" + - "3=\x90\xe0\x00\x00\x00\x004-s\xd0\x00\x00\x00\x005\x1dr\xe0\x00\x00\x00\x0062x\x10\x00\x00\x00\x006\xfd\u007f\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\x00" + - "A\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\x00" + - "Onn\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\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x1c\x00Asia/YangonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + + "\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#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-0" + + "2\x00-03\x00\n<-03>3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x1c\x00America/CordobaU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00Gw\t\xb0\x00\x00\x00\x00G\xdc\u007f \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\n\x00\x00\x00\x00\x00\xf1c9R\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x1c\x00America/ReginaU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n" + + "CST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x1c\x00America/BelemUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + + "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xdc" + + "\xb9Y \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Ƞ\x02\x01\x02\x01\x02\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\n\x00\x00\x00\x00\x00" + + "\xf1c9Rӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x1c\x00America/TorontoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\xdc" + + "\x8dp\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\xc6" + + "\xb5\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\x00" + + "EDT\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RU9#\xbe2\x05" + + "\x00\x002\x05\x00\x00\x11\x00\x1c\x00America/VancouverUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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\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\n\x00\x00\x00\x00\x00\xf1c9R\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x1c\x00America/Boa_VistaUT\t\x00\x03\x15\xac\x0e" + + "`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\u007f\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ޛ\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-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x1c\x00" + + "America/Lower_PrincesUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x93\x1e.#\xff\xff\xff\xff\xf6\x98\xecH\x01\x02\xff\xff\xbf]\x00\x00\xff\xff\xc0\xb8\x00\x04\xff\xff\xc7\xc0\x00\n" + + "LMT\x00-0430\x00AST\x00\nAST4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x1c\x00Antarctica" + + "/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x1c\x00A" + + "ntarctica/VostokUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe9X\x89\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00T`\x00\x04-00\x00+06\x00\n<+06>-6\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xf1c9R\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x1c\x00Antarctica/PalmerUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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 \u007f\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\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x1c\x00Antarctica/TrollUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "BF\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\n\x00\x00\x00\x00\x00\xf1c9Rb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x1c\x00Antarctica/McMurdoUT" + + "\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xf1" + + "c9R\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x1c\x00Antarctica/DavisUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\r\x0e\xf20\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Antarctica" + + "/SyowaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe7\xb1X\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00*0\x00\x04-00\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x1c\x00Antarctica/DumontDUrvilleUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf2s" + - "Q\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xceG|\xea\x13\x03\x00\x00\x13\x03\x00\x00\n\x00\x1c\x00Asia/AmmanUT\t" + - "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r" + - "\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\xc2P\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\x00" + - "3D(`\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\x00" + - "An\xf6\xe0\x00\x00\x00\x00BLr\xe0\x00\x00\x00\x00C\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\x00JD" + - "T\x00JST\x00\nJST-9\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x1c\x00Asia/AnadyrUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc4" + - "\xb0\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ;" + - "\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\v\x00\x1c\x00Asia/TehranUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft-" + - "@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\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/o7" + - "H\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\xc8" + - "\xb8\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]\x86z" + - "8\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\x00\x00\x00\x00d\x1a\x13\xc8\x00\x00\x00" + - "\x00e\f\x99\xb8\x00\x00\x00\x00e\xfbGH\x00\x00\x00\x00f\xed\xcd8\x00\x00\x00\x00g\xdd\xccH\x00\x00\x00\x00h\xd0R8\x00\x00\x00\x00i\xbe\xff\xc8\x00\x00\x00\x00j\xb1\x85\xb8\x00\x00\x00\x00k\xa03" + - "H\x00\x00\x00\x00l\x92\xb98\x00\x00\x00\x00m\x81f\xc8\x00\x00\x00\x00ns\xec\xb8\x00\x00\x00\x00ob\x9aH\x00\x00\x00\x00pU 8\x00\x00\x00\x00qE\x1fH\x00\x00\x00\x00r7\xa58\x00\x00\x00" + - "\x00s&R\xc8\x00\x00\x00\x00t\x18ظ\x00\x00\x00\x00u\a\x86H\x00\x00\x00\x00u\xfa\f8\x00\x00\x00\x00v\xe8\xb9\xc8\x00\x00\x00\x00w\xdb?\xb8\x00\x00\x00\x00x\xcb>\xc8\x00\x00\x00\x00y\xbd\xc4" + - "\xb8\x00\x00\x00\x00z\xacrH\x00\x00\x00\x00{\x9e\xf88\x00\x00\x00\x00|\x8d\xa5\xc8\x00\x00\x00\x00}\x80+\xb8\x00\x00\x00\x00~n\xd9H\x00\x00\x00\x00\u007fa_8\x00\x00\x00\x00\x80Q^H\x00\x00\x00" + - "\x00\x81C\xe48\x00\x00\x00\x00\x822\x91\xc8\x00\x00\x00\x00\x83%\x17\xb8\x00\x00\x00\x00\x84\x13\xc5H\x00\x00\x00\x00\x85\x06K8\x00\x00\x00\x00\x85\xf4\xf8\xc8\x00\x00\x00\x00\x86\xe7~\xb8\x00\x00\x00\x00\x87\xd7}" + - "\xc8\x00\x00\x00\x00\x88\xca\x03\xb8\x00\x00\x00\x00\x89\xb8\xb1H\x00\x00\x00\x00\x8a\xab78\x00\x00\x00\x00\x8b\x99\xe4\xc8\x00\x00\x00\x00\x8c\x8cj\xb8\x00\x00\x00\x00\x8d{\x18H\x00\x00\x00\x00\x8em\x9e8\x00\x00\x00" + - "\x00\x8f]\x9dH\x00\x00\x00\x00\x90P#8\x00\x00\x00\x00\x91>\xd0\xc8\x00\x00\x00\x00\x921V\xb8\x00\x00\x00\x00\x93 \x04H\x00\x00\x00\x00\x94\x12\x8a8\x00\x00\x00\x00\x95\x017\xc8\x00\x00\x00\x00\x95\xf3\xbd" + - "\xb8\x00\x00\x00\x00\x96\xe3\xbc\xc8\x00\x00\x00\x00\x97\xd6B\xb8\x00\x00\x00\x00\x98\xc4\xf0H\x00\x00\x00\x00\x99\xb7v8\x00\x00\x00\x00\x9a\xa6#\xc8\x00\x00\x00\x00\x9b\x98\xa9\xb8\x00\x00\x00\x00\x9c\x87WH\x00\x00\x00" + - "\x00\x9dy\xdd8\x00\x00\x00\x00\x9ei\xdcH\x00\x00\x00\x00\x9f\\b8\x00\x00\x00\x00\xa0K\x0f\xc8\x00\x00\x00\x00\xa1=\x95\xb8\x00\x00\x00\x00\xa2,CH\x00\x00\x00\x00\xa3\x1e\xc98\x00\x00\x00\x00\xa4\rv" + - "\xc8\x00\x00\x00\x00\xa4\xff\xfc\xb8\x00\x00\x00\x00\xa5\xef\xfb\xc8\x00\x00\x00\x00\xa6⁸\x00\x00\x00\x00\xa7\xd1/H\x00\x00\x00\x00\xa8õ8\x00\x00\x00\x00\xa9\xb2b\xc8\x00\x00\x00\x00\xaa\xa4\xe8\xb8\x00\x00\x00" + - "\x00\xab\x93\x96H\x00\x00\x00\x00\xac\x86\x1c8\x00\x00\x00\x00\xadt\xc9\xc8\x00\x00\x00\x00\xaegO\xb8\x00\x00\x00\x00\xafWN\xc8\x00\x00\x00\x00\xb0IԸ\x00\x00\x00\x00\xb18\x82H\x00\x00\x00\x00\xb2+\b" + - "8\x00\x00\x00\x00\xb3\x19\xb5\xc8\x00\x00\x00\x00\xb4\f;\xb8\x00\x00\x00\x00\xb4\xfa\xe9H\x00\x00\x00\x00\xb5\xedo8\x00\x00\x00\x00\xb6\xddnH\x00\x00\x00\x00\xb7\xcf\xf48\x00\x00\x00\x00\xb8\xbe\xa1\xc8\x00\x00\x00" + - "\x00\xb9\xb1'\xb8\x00\x00\x00\x00\xba\x9f\xd5H\x00\x00\x00\x00\xbb\x92[8\x00\x00\x00\x00\xbc\x81\b\xc8\x00\x00\x00\x00\xbds\x8e\xb8\x00\x00\x00\x00\xbec\x8d\xc8\x00\x00\x00\x00\xbfV\x13\xb8\x00\x00\x00\x00\xc0D\xc1" + - "H\x00\x00\x00\x00\xc17G8\x00\x00\x00\x00\xc2%\xf4\xc8\x00\x00\x00\x00\xc3\x18z\xb8\x00\x00\x00\x00\xc4\a(H\x00\x00\x00\x00\xc4\xf9\xae8\x00\x00\x00\x00\xc5\xe9\xadH\x00\x00\x00\x00\xc6\xdc38\x00\x00\x00" + - "\x00\xc7\xca\xe0\xc8\x00\x00\x00\x00Ƚf\xb8\x00\x00\x00\x00ɬ\x14H\x00\x00\x00\x00ʞ\x9a8\x00\x00\x00\x00ˍG\xc8\x00\x00\x00\x00\xcc\u007f\u0378\x00\x00\x00\x00\xcdo\xcc\xc8\x00\x00\x00\x00\xcebR" + - "\xb8\x00\x00\x00\x00\xcfQ\x00H\x00\x00\x00\x00\xd0C\x868\x00\x00\x00\x00\xd123\xc8\x00\x00\x00\x00\xd2$\xb9\xb8\x00\x00\x00\x00\xd3\x13gH\x00\x00\x00\x00\xd4\x05\xed8\x00\x00\x00\x00\xd4\xf5\xecH\x00\x00\x00" + - "\x00\xd5\xe8r8\x00\x00\x00\x00\xd6\xd7\x1f\xc8\x00\x00\x00\x00\xd7ɥ\xb8\x00\x00\x00\x00ظSH\x00\x00\x00\x00٪\xd98\x00\x00\x00\x00ڙ\x86\xc8\x00\x00\x00\x00ی\f\xb8\x00\x00\x00\x00\xdc|\v" + - "\xc8\x00\x00\x00\x00\xddn\x91\xb8\x00\x00\x00\x00\xde]?H\x01\x02\x04\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\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\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\x00\x0008\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00FP" + - "\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00+04\x00+0430\x00\n<+0330>-3:30<+043" + - "0>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x1c\x00Asia/Singapo" + - "reUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf5\b\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "y\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/BruneiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xad\x8a\x02D\xff\xff\xff\xff\xbagG\x88\x01\x02\x00\x00k\xbc\x00\x00\x00\x00ix\x00\x04" + - "\x00\x00p\x80\x00\nLMT\x00+0730\x00+08\x00\n<+08>-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00A" + - "sia/UrumqiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x1c\x00Asia/DiliUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x1c\x00Asia/AshkhabadUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\x02\x00\x00\x00\b\xff\xff\xff\xffԼv\x80\xff\xff\xff\xff\xde4`" + + "`\xff\xff\xff\xff\xe7<\x02\x80\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x8c\xa0\x00\x04-00\x00+10\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xd7N\xab\x8b" + + "\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x1c\x00Antarctica/MawsonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x1c\x00A" + + "ntarctica/RotheraUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x1c\x00Antarctica/CaseyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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-00\x00+08\x00" + + "+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb2\x84J]\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x1c\x00Antarctica/Macqu" + + "arieUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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Ā\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\n\x00\x00\x00\x00\x00\xf1c" + + "9Rb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x1c\x00Antarctica/South_PoleUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x12x" + + "g\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.\x8d" + + "k`\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<\x93" + + "O\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\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00" + + "Arctic/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00" + + "\x00\x13\x00\x1c\x00Arctic/LongyearbyenUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffr\xee$l\xff\xff\xff\xff\x9b'\xe3\x00\xff\xff\xff\xff\x9b\xd4{`\xff\xff\xff\xffȷM`\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\xeb" + + "\xaf \x90\xff\xff\xff\xff\xec\xa8L\x10\xff\xff\xff\xff\xed\x98=\x10\xff\xff\xff\xff\xee\x88.\x10\xff\xff\xff\xff\xefx\x1f\x10\xff\xff\xff\xff\xf0h\x10\x10\xff\xff\xff\xff\xf1X\x01\x10\xff\xff\xff\xff\xf2G\xf2\x10\xff" + + "\xff\xff\xff\xf37\xe3\x10\xff\xff\xff\xff\xf4'\xd4\x10\xff\xff\xff\xff\xf5\x17\xc5\x10\xff\xff\xff\xff\xf6\x10\xf0\x90\xff\xff\xff\xff\xf7/\x06\x10\xff\xff\xff\xff\xf7\xf0Ґ\x00\x00\x00\x00\x13MD\x10\x00\x00\x00\x00\x14" + + "3\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#\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\xce" + + "\x81\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\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x1c\x00Asia/ChoibalsanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + + "5\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\u007f\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\x00" + + "U\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\n\x00\x00\x00\x00\x00\xf1c9Rj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/T" + + "himbuUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x1c\x00Asia/VientianeUT\t\x00\x03\x15\xac\x0e`" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xf1c9Rʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x1c\x00Asia/YangonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\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+0" + - "6\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x1c\x00Asia/Krasnoyars" + - "kUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x00BE\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\x00" + - "I\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\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x1c\x00Asia/AtyrauUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + + "\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R6j\\J\xcf\x04\x00\x00\xcf\x04\x00\x00\v\x00\x1c\x00Asia/HebronUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00u\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\xd0" + + "\xa9\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\u007f\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\x003" + + "D(`\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@\u007f\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\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`\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\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\x00EE" + + "ST\x00EET\x00IDT\x00IST\x00\nEET-2EEST,M3.4.4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9" + + "R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/ChongqingUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\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\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\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\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+0" + - "6\x00+04\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQT\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x1c\x00Asia/AqtauUT\t\x00\x03" + - "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xcc" + - "w\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\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\x0062" + - "M\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\x00" + - "FP\x01\bLMT\x00+04\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x1c\x00A" + - "sia/HarbinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/KuwaitUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r" + - "\x00\x1c\x00Asia/CalcuttaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + - "MMT\x00IST\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x1c\x00Asia/M" + - "anilaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x1c" + - "\x00Asia/DushanbeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\fLMT\x00+05\x00+07\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x1c\x00Asia/Tel_AvivUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00T" + - "Zif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x8b" + - "v\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\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\x00" + - "8@\x01\x10LMT\x00JMT\x00IDT\x00IST\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x1c\x00Asia/UlaanbaatarUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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?t" + - "p\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02\x00\x00\f\x00\x1c\x00Asia/IrkutskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + + "\x00\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\n\x00\x00\x00\x00\x00\xf1c9R'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00" + + "\x1c\x00Asia/KabulUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x1c\x00Asia/Bahrai" + + "nUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02\x00\x00\f\x00\x1c\x00Asia/IrkutskUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + "\x00\x00TZif2\x00\x00\x00\x00\x00\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" + @@ -3376,424 +2562,1289 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\ "@\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x1c\x00Asia/ShanghaiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\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\x00" + - "q\xd7\x00\x00\x00\x00~\x90\x01\x04\x00\x00p\x80\x00\bLMT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00" + - "\x00\r\x00\x1c\x00Asia/KatmanduUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x1c\x00Asi" + - "a/HovdUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "2\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#;\xc6" + - "\x80\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\x00C4B" + - "\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\x00b" + - "p\x00\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x1c\x00As" + - "ia/KolkataUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00IS" + - "T\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x1c\x00Asia/Kashgar" + - "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQS\xa5\x81e\xf7" + - "\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x1c\x00Asia/PontianakUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00WIB\x00\nWIB-7\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x1c\x00Asia/KuchingUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x1c\x00" + - "Atlantic/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u0097N\xad\xaf\x00\x00\x00\xaf" + - "\x00\x00\x00\x13\x00\x1c\x00Atlantic/Cape_VerdeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x1c\x00Atlantic/FaroeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00\xf1c9RO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x1c\x00Asia/YakutskUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\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#\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\x00" + + "F\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\n\x00\x00\x00\x00\x00\xf1c9R.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x1c\x00Asia/Jay" + + "apuraUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x0eL" + + "MT\x00+09\x00+0930\x00WIT\x00\nWIT-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x1c\x00Asia/H" + + "ong_KongUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05" + + "G\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\n\x00\x00\x00\x00\x00\xf1c9RS\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x1c" + + "\x00Asia/PontianakUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00WIB\x00\nWIB-7\nPK\x03\x04\n\x00\x00\x00\x00\x00" + + "\xf1c9R;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\v\x00\x1c\x00Asia/TehranUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00" + + "\x00\x00\x0ft-@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\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\x00" + + "Z\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\x00\x00\x00\x00d\x1a" + + "\x13\xc8\x00\x00\x00\x00e\f\x99\xb8\x00\x00\x00\x00e\xfbGH\x00\x00\x00\x00f\xed\xcd8\x00\x00\x00\x00g\xdd\xccH\x00\x00\x00\x00h\xd0R8\x00\x00\x00\x00i\xbe\xff\xc8\x00\x00\x00\x00j\xb1\x85\xb8\x00\x00" + + "\x00\x00k\xa03H\x00\x00\x00\x00l\x92\xb98\x00\x00\x00\x00m\x81f\xc8\x00\x00\x00\x00ns\xec\xb8\x00\x00\x00\x00ob\x9aH\x00\x00\x00\x00pU 8\x00\x00\x00\x00qE\x1fH\x00\x00\x00\x00r7" + + "\xa58\x00\x00\x00\x00s&R\xc8\x00\x00\x00\x00t\x18ظ\x00\x00\x00\x00u\a\x86H\x00\x00\x00\x00u\xfa\f8\x00\x00\x00\x00v\xe8\xb9\xc8\x00\x00\x00\x00w\xdb?\xb8\x00\x00\x00\x00x\xcb>\xc8\x00\x00" + + "\x00\x00y\xbdĸ\x00\x00\x00\x00z\xacrH\x00\x00\x00\x00{\x9e\xf88\x00\x00\x00\x00|\x8d\xa5\xc8\x00\x00\x00\x00}\x80+\xb8\x00\x00\x00\x00~n\xd9H\x00\x00\x00\x00\u007fa_8\x00\x00\x00\x00\x80Q" + + "^H\x00\x00\x00\x00\x81C\xe48\x00\x00\x00\x00\x822\x91\xc8\x00\x00\x00\x00\x83%\x17\xb8\x00\x00\x00\x00\x84\x13\xc5H\x00\x00\x00\x00\x85\x06K8\x00\x00\x00\x00\x85\xf4\xf8\xc8\x00\x00\x00\x00\x86\xe7~\xb8\x00\x00" + + "\x00\x00\x87\xd7}\xc8\x00\x00\x00\x00\x88\xca\x03\xb8\x00\x00\x00\x00\x89\xb8\xb1H\x00\x00\x00\x00\x8a\xab78\x00\x00\x00\x00\x8b\x99\xe4\xc8\x00\x00\x00\x00\x8c\x8cj\xb8\x00\x00\x00\x00\x8d{\x18H\x00\x00\x00\x00\x8em" + + "\x9e8\x00\x00\x00\x00\x8f]\x9dH\x00\x00\x00\x00\x90P#8\x00\x00\x00\x00\x91>\xd0\xc8\x00\x00\x00\x00\x921V\xb8\x00\x00\x00\x00\x93 \x04H\x00\x00\x00\x00\x94\x12\x8a8\x00\x00\x00\x00\x95\x017\xc8\x00\x00" + + "\x00\x00\x95\xf3\xbd\xb8\x00\x00\x00\x00\x96\xe3\xbc\xc8\x00\x00\x00\x00\x97\xd6B\xb8\x00\x00\x00\x00\x98\xc4\xf0H\x00\x00\x00\x00\x99\xb7v8\x00\x00\x00\x00\x9a\xa6#\xc8\x00\x00\x00\x00\x9b\x98\xa9\xb8\x00\x00\x00\x00\x9c\x87" + + "WH\x00\x00\x00\x00\x9dy\xdd8\x00\x00\x00\x00\x9ei\xdcH\x00\x00\x00\x00\x9f\\b8\x00\x00\x00\x00\xa0K\x0f\xc8\x00\x00\x00\x00\xa1=\x95\xb8\x00\x00\x00\x00\xa2,CH\x00\x00\x00\x00\xa3\x1e\xc98\x00\x00" + + "\x00\x00\xa4\rv\xc8\x00\x00\x00\x00\xa4\xff\xfc\xb8\x00\x00\x00\x00\xa5\xef\xfb\xc8\x00\x00\x00\x00\xa6⁸\x00\x00\x00\x00\xa7\xd1/H\x00\x00\x00\x00\xa8õ8\x00\x00\x00\x00\xa9\xb2b\xc8\x00\x00\x00\x00\xaa\xa4" + + "\xe8\xb8\x00\x00\x00\x00\xab\x93\x96H\x00\x00\x00\x00\xac\x86\x1c8\x00\x00\x00\x00\xadt\xc9\xc8\x00\x00\x00\x00\xaegO\xb8\x00\x00\x00\x00\xafWN\xc8\x00\x00\x00\x00\xb0IԸ\x00\x00\x00\x00\xb18\x82H\x00\x00" + + "\x00\x00\xb2+\b8\x00\x00\x00\x00\xb3\x19\xb5\xc8\x00\x00\x00\x00\xb4\f;\xb8\x00\x00\x00\x00\xb4\xfa\xe9H\x00\x00\x00\x00\xb5\xedo8\x00\x00\x00\x00\xb6\xddnH\x00\x00\x00\x00\xb7\xcf\xf48\x00\x00\x00\x00\xb8\xbe" + + "\xa1\xc8\x00\x00\x00\x00\xb9\xb1'\xb8\x00\x00\x00\x00\xba\x9f\xd5H\x00\x00\x00\x00\xbb\x92[8\x00\x00\x00\x00\xbc\x81\b\xc8\x00\x00\x00\x00\xbds\x8e\xb8\x00\x00\x00\x00\xbec\x8d\xc8\x00\x00\x00\x00\xbfV\x13\xb8\x00\x00" + + "\x00\x00\xc0D\xc1H\x00\x00\x00\x00\xc17G8\x00\x00\x00\x00\xc2%\xf4\xc8\x00\x00\x00\x00\xc3\x18z\xb8\x00\x00\x00\x00\xc4\a(H\x00\x00\x00\x00\xc4\xf9\xae8\x00\x00\x00\x00\xc5\xe9\xadH\x00\x00\x00\x00\xc6\xdc" + + "38\x00\x00\x00\x00\xc7\xca\xe0\xc8\x00\x00\x00\x00Ƚf\xb8\x00\x00\x00\x00ɬ\x14H\x00\x00\x00\x00ʞ\x9a8\x00\x00\x00\x00ˍG\xc8\x00\x00\x00\x00\xcc\u007f\u0378\x00\x00\x00\x00\xcdo\xcc\xc8\x00\x00" + + "\x00\x00\xcebR\xb8\x00\x00\x00\x00\xcfQ\x00H\x00\x00\x00\x00\xd0C\x868\x00\x00\x00\x00\xd123\xc8\x00\x00\x00\x00\xd2$\xb9\xb8\x00\x00\x00\x00\xd3\x13gH\x00\x00\x00\x00\xd4\x05\xed8\x00\x00\x00\x00\xd4\xf5" + + "\xecH\x00\x00\x00\x00\xd5\xe8r8\x00\x00\x00\x00\xd6\xd7\x1f\xc8\x00\x00\x00\x00\xd7ɥ\xb8\x00\x00\x00\x00ظSH\x00\x00\x00\x00٪\xd98\x00\x00\x00\x00ڙ\x86\xc8\x00\x00\x00\x00ی\f\xb8\x00\x00" + + "\x00\x00\xdc|\v\xc8\x00\x00\x00\x00\xddn\x91\xb8\x00\x00\x00\x00\xde]?H\x01\x02\x04\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\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\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\x00\x0008\x00\x00\x00\x0008\x00\x04\x00\x0018\x00" + + "\b\x00\x00FP\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00+04\x00+0430\x00\n<+0330>-3:30" + + "<+0430>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rd%\x05\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x1c\x00Asia/Vl" + + "adivostokUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "I\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\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x1c\x00Asia/OmskUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x95" + + "P\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\n\x00\x00\x00\x00\x00\xf1c9R\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x1c\x00Asi" + + "a/TaipeiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/DaccaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x1c\x00Asia/FamagustaUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x00\x00\x00\x006\xfd\u007f\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/RiyadhUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5\x1b6\xb4\x01\x00\x00+\xcc\x00\x00\x00\x00*" + + "0\x00\x04LMT\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x1c\x00Asia/Chung" + + "kingUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xceG|\xea\x13\x03\x00\x00\x13\x03\x00\x00\n\x00\x1c\x00Asia/AmmanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r\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\xc2P\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-5:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00" + + "\r\x00\x1c\x00Asia/ShanghaiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\bL" + + "MT\x00CDT\x00CST\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x1c\x00Asia/Qyzylor" + + "daUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\v" + + "P\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\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\x00\\\x1b\xd8" + + "\xa0\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\n\x00" + + "\x00\x00\x00\x00\xf1c9R\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x1c\x00Asia/Tel_AvivUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\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\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif" + + "3\x00\x00\x00\x00\x00\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\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\x00" + + "J\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x1c\x00Asia/TashkentUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x10\xff\xff\xff\xff\x8b`\x83\xa0\xff\xff\xff\xff\x9c\x91\x1e" + - "\x00\xff\xff\xff\xff\x9dш\x90\xff\xff\xff\xff\x9erQ\x80\xff\xff\xff\xff\x9f\xd5\x03\x10\xff\xff\xff\xff\xa0S\x85\x00\xff\xff\xff\xff\xa1\xb66\x90\xff\xff\xff\xff\xa4<'\x80\xff\xff\xff\xff\xa4\xb9t\x10\xff\xff\xff" + - "\xff\xc6M\x1a\x00\xff\xff\xff\xff\xc7=' \xff\xff\xff\xff\xc7\xda\x17\xb0\xff\xff\xff\xff\xc9&C\xa0\xff\xff\xff\xff\xc9\xc3& \xff\xff\xff\xff\xcb\x06%\xa0\xff\xff\xff\xffˬB\xa0\xff\xff\xff\xff\xcc\xdc\xcd" + - " \xff\xff\xff\xff͌$\xa0\xff\xff\xff\xffμ\xaf \xff\xff\xff\xff\xcfl\x06\xa0\xff\xff\xff\xffМ\x91 \xff\xff\xff\xff\xd1K\xe8\xa0\xff\xff\xff\xff҅\xad\xa0\xff\xff\xff\xff\xd3+ʠ\xff\xff\xff" + - "\xff\xd4e\x8f\xa0\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd6Eq\xa0\xff\xff\xff\xff\xd7\x19\xb3 \xff\xff\xff\xff\xd8%S\xa0\xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xd9w" + - " \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xce4 \xff\xff\xff\xffޢu\xa0\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x82W\xa0\xff\xff\xff\xff\xe1\x8d\xf8 \xff\xff\xff" + - "\xff\xe2b9\xa0\xff\xff\xff\xff\xe3m\xda \xff\xff\xff\xff\xe4B\x1b\xa0\xff\xff\xff\xff\xe5M\xbc \xff\xff\xff\xff\xe6!\xfd\xa0\xff\xff\xff\xff\xe76ؠ\xff\xff\xff\xff\xe8\v\x1a \xff\xff\xff\xff\xe9\x16\xba" + - "\xa0\xff\xff\xff\xff\xe9\xea\xfc \xff\xff\xff\xff\xea\xf6\x9c\xa0\xff\xff\xff\xff\xeb\xca\xde \xff\xff\xff\xff\xec\xd6~\xa0\xff\xff\xff\xff\xed\xaa\xc0 \xff\xff\xff\xff\xee\xb6`\xa0\xff\xff\xff\xff\uf2a2 \xff\xff\xff" + - "\xff\xf0\x96B\xa0\xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2\u007f_ \xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf53\x82\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x13d" + - "\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xf3F\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xd3(\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc\xbcE \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + - "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xeb" + - "`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaf|7" + - "\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x1c\x00Atlantic/CanaryUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\xef" + + "0\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\n\x00\x00\x00\x00\x00\xf1c9R\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/KuwaitUT\t" + + "\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RB\x1d\xc6\x1b\x85\x00\x00\x00" + + "\x85\x00\x00\x00\v\x00\x1c\x00Asia/UrumqiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Re\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x1c\x00Asia/AshkhabadUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x1c\x00Asi" + + "a/KamchatkaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R" + + "\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x1c\x00Asia/BarnaulUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\x14" + - "3\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#2" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00\x1c\x00Atlantic/FaeroeUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\x00" + - "H\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\n\x00\x00\x00\x00\x00T\x8a\x9eQW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x1c\x00Atlantic/AzoresUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x00\x00\x00\a\x00\x00\x00\x18\xff\xff\xff\xff^=\x1b\x90\xff\xff\xff\xff\x92\xe6" + - "\xaa\xa0\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\u007f\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\u007f\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ܹ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\xe4B" + - "7\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\"L" + - "b \x00\x00\x00\x00#1<+00>,M3.5.0/0,M10." + - "5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQl&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x1c\x00Atlantic/BermudaUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x004" + - "R\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\x00B" + - "O\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\x00AST\x00" + - "\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x1c\x00Austra" + - "lia/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0f\x00" + - "\x1c\x00Australia/PerthUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x1c\x00Australia/LHIUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\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\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<+1" + - "030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00" + - "\x14\x00\x1c\x00Australia/YancowinnaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03" + - "p@\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\u007f\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15" + - "\x00\x1c\x00Australia/Broken_HillUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03" + - "p@\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\u007f\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e" + - "\x00\x1c\x00Australia/WestUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x1c\x00Australia/DarwinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\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\x000" + + "dg@\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\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\x00" + + "bp\x01\fLMT\x00+06\x00+08\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x1c\x00A" + + "sia/NovokuznetskUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x004RA\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\x00BE\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R0]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x1c\x00Asia/BishkekUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\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\x00E\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\n\x00\x00\x00\x00\x00\xf1c9R\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x1c\x00Asia/Kuching" + + "UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00u" + + "0\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\n\x00\x00\x00\x00\x00\xf1c" + + "9R\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x1c\x00Asia/SaigonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80\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\x00d\x00\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\n\x00\x00" + + "\x00\x00\x00\xf1c9R\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x1c\x00Asia/SingaporeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\nP" + - "K\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x1c\x00Australia/AdelaideUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\x00A" + - "CDT\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa2ܺ\xca:\x01\x00\x00:\x01" + - "\x00\x00\x0f\x00\x1c\x00Australia/EuclaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x1c\x00Australia/MelbourneUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x1c\x00Austra" + - "lia/CanberraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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\xcc" + - "\xb7V\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\t" + - "LMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\xba" + - "\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x1c\x00Australia/BrisbaneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "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\xf5\b\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\n\x00\x00\x00\x00\x00\xf1c9R)p\x1cX\xf1\x02\x00\x00\xf1\x02\x00\x00\x10\x00\x1c\x00Asia/Novo" + + "sibirskUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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+\xfe" + + "N\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\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\xfb" + + "0@\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\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\n\x00\x00\x00\x00\x00\xf1c9R?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x1c\x00Asia/AtyrauUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "6\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\x00" + + "8@\x00\x10LMT\x00+03\x00+05\x00+06\x00+04\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t" + + "\x00\x1c\x00Asia/GazaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00s\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\xcd" + + "\xac\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\u007f\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@\u007f\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\xb7\x11\xd0\x00\x00\x00\x00I\xcb\xfa\xe0\x00\x00\x00\x00J\xa0<`\x00\x00\x00\x00K\xad.\x9c\x00\x00\x00\x00L" + + "a\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`\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\x00\x00 P\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\t\x00\x00*0\x01\r\x00\x00\x1c \x00\x11" + + "LMT\x00EEST\x00EET\x00IDT\x00IST\x00\nEET-2EEST,M3.4.4/48,M10.4.4/49\nPK\x03\x04\n\x00\x00" + + "\x00\x00\x00\xf1c9RΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x1c\x00Asia/DiliUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x1c\x00Asia/ChitaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + + "\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@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" + + "\x00M\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\n\x00\x00\x00\x00\x00\xf1c9R\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x1c\x00As" + + "ia/Ulan_BatorUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9Rw\rD\an\x01\x00\x00n\x01\x00" + + "\x00\x0e\x00\x1c\x00Asia/SamarkandUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + + "\x00\x00\x00\xf1c9R\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x1c\x00Asia/NicosiaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\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\xdd" + + "\x92\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\x1d" + + "r\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\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x1c\x00Asia/AdenUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd5\x1b6\xb4\x01\x00\x00+\xcc\x00\x00\x00\x00*" + + "0\x00\x04LMT\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x1c\x00Asia/Dhaka" + + "UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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+053" + + "0\x00+06\x00+07\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x1c\x00Asia/Sakhal" + + "inUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x9e" + + "P\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\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" + + "\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\n\x00\x00\x00\x00\x00\xf1c9RT\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x1c\x00Asia/AqtauUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x92`\x00\x00\x00\x00" + + "0d\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+0" + + "4\x00+05\x00+06\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x1c\x00Asia/Pyongy" + + "angUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x17✳2\x04\x00\x002\x04\x00\x00" + + "\x0e\x00\x1c\x00Asia/JerusalemUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x83\x82" + + "p\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\x00I" + + "DT\x00IST\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R's\x96\x1en\x01" + + "\x00\x00n\x01\x00\x00\r\x00\x1c\x00Asia/DushanbeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x9c" + + "X\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\fLMT\x00+05\x00+07\x00+06\x00\n<+05>-5\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xf1c9R\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x1c\x00Asia/ColomboUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xf1c9R9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x1c\x00Asia/KarachiUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00H" + + "A\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00\x1c\x00Asia/Kuala_LumpurUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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~6U\xaa\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\xf5\b\x01\x02\x03\x04\x05\x06\x05\a\x00\x00_V\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\n\x00\x00\x00\x00\x00\xf1c9Re\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x1c\x00Asia/Ashg" + + "abatUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "8@\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\n\x00\x00\x00\x00\x00\xf1c9" + + "R\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x1c\x00Asia/KolkataUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RB\x1d\xc6\x1b\x85\x00\x00\x00\x85" + + "\x00\x00\x00\f\x00\x1c\x00Asia/KashgarUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x1c\x00Asia/HovdUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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-\x94" + + "j\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\x00C4B\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\n\x00\x00\x00\x00\x00\xf1c9R\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00\x1c\x00Asia/BakuUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xf1c9R\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00" + + "\x1c\x00Asia/KhandygaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R\x9a\xea\x18\xd4\xf8\x02\x00\x00" + + "\xf8\x02\x00\x00\x12\x00\x1c\x00Asia/YekaterinburgUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x000du" + + "P\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\t" + + "P\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\n\x00\x00\x00\x00\x00\xf1c9Rʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00" + + "\f\x00\x1c\x00Asia/RangoonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xf1c9Rǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x1c\x00Asia/ManilaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\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\nAEST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x1c\x00Australia/Lord_HoweUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacaoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x870" + - "h\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\xd4" + - "p\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\x00ECwx\x00\x00\x00\x00F\x05<\xf0\x00\x00\x00\x00G#Y" + - "x\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9b\xe1\xc1\xa9\x88\x03\x00\x00" + - "\x88\x03\x00\x00\x12\x00\x1c\x00Australia/VictoriaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "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\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\xab" + + "p\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\x9b9" + + "8\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+1" + + "0\x00+09\x00CDT\x00\nCST-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x1c\x00Asia/AlmatyUT" + + "\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\x00" + + "T`\x00\f\x00\x00T`\x01\fLMT\x00+05\x00+07\x00+06\x00\n<+06>-6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RѾ\xa8\xc7u\x02\x00\x00u\x02\x00" + + "\x00\f\x00\x1c\x00Asia/TbilisiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xa2P\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\n\x00\x00\x00\x00\x00\xf1c9R\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x1c\x00Asia/Phnom_PenhU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x1c\x00Asia/MacauUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\xe3v" + + "y\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\x9b" + + "98\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\n\x00\x00\x00\x00\x00\xf1c9R\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x1c\x00Asia/Magadan" + + "UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x1c\x00Asia/QatarUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xf1c9R\x9a\x1a\xdc\xca\xdc\x00\x00" + + "\x00\xdc\x00\x00\x00\r\x00\x1c\x00Asia/CalcuttaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10LM" + + "T\x00HMT\x00MMT\x00IST\x00+0630\x00\nIST-5:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x1c\x00" + + "Asia/UlaanbaatarUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x000" + + "d \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\x00B" + + "DQ\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\n\x00\x00\x00\x00\x00\xf1c9R\xa4Zߐ\xe6\x02\x00\x00" + + "\xe6\x02\x00\x00\x12\x00\x1c\x00Asia/SrednekolymskUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x1c\x00Australia/HobartUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + + "\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$+\xa9" + + "p\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]L" + + "p\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\xff" + + "p\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+1" + + "2\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x1c\x00Asia/AqtobeUT\t" + + "\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "5\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\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\n\x00\x00\x00\x00\x00\xf1c9Rw\x86\x8d^\x03\x03" + + "\x00\x00\x03\x03\x00\x00\r\x00\x1c\x00Asia/Ust-NeraUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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*\xc4" + + "z\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\n\x00\x00\x00\x00\x00\xf1c9RL\xe0\x91y" + + "\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x1c\x00Asia/KrasnoyarskUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x00BE\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\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\n\x00\x00\x00\x00\x00\xf1c9R\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x1c\x00Asia/SeoulUT\t" + + "\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xf1c9Ry\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x1c\x00Asia/Brune" + + "iUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xad\x8a\x02D\xff\xff\xff\xff\xbagG\x88\x01\x02\x00\x00k\xbc\x00\x00\x00\x00ix\x00\x04\x00\x00p\x80\x00\nLMT\x00+0730\x00+08\x00\n<+08>" + + "-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x1c\x00Asia/BaghdadUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "2P_\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\n\x00\x00\x00\x00\x00\xf1c9R`\xc9\xd4" + + "\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x1c\x00Asia/Ujung_PandangUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00\xf1c9RV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x1c\x00Asia/AnadyrUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xcc2\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\n\x00\x00\x00\x00\x00\xf1c9R\xed\x8c\xf1\x91\x85" + + "\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Asia/MuscatUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x1c\x00Asia/Ho_Chi_MinhUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x80" + + "\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\x00d\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x1c\x00Asia/DamascusUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x03\x00\x00\x00\r\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>\u007fp\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\u007fg\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\"\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\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02" + + "\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\"\b\x00\x00\x00\x00*0" + + "\x01\x04\x00\x00\x1c \x00\tLMT\x00EEST\x00EET\x00\nEET-2EEST,M3.5.5/0,M10.5.5/0\nPK\x03\x04\n\x00\x00\x00\x00" + + "\x00\xf1c9Rj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x1c\x00Asia/ThimphuUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00" + + "\x00\f\x00\x1c\x00Asia/BangkokUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "BMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x1c\x00Asia/YerevanU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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 l" + + "G\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\u007f\xe0\x00\x00\x00\x00L\xcc" + + "\x95`\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\x00FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+0" + + "5\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x1c\x00Asia/KatmanduUT" + + "\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x1c\x00Asia/OralUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "FP\x01\b\x00\x008@\x00\x10LMT\x00+03\x00+05\x00+06\x00+04\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x02\xf4\xaeg\xd5\x00\x00" + + "\x00\xd5\x00\x00\x00\n\x00\x1c\x00Asia/TokyoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00\x1c\x00Asia/Istan" + + "bulUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\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\xdd" + + "D\xf0\x00\x00\x00\x009\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb\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\x17" + + "N\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\n\x00\x00\x00\x00\x00\xf1c9R\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x1c" + + "\x00Asia/BeirutUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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'\u007f\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\n\x00\x00\x00" + + "\x00\x00\xf1c9Rb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x1c\x00Asia/JakartaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\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\x00W" + + "IB\x00\nWIB-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x1c\x00Asia/DubaiUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x1c" + + "\x00Asia/QostanayUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\xc0" + + "P\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\n\x00\x00\x00\x00\x00\xf1c9R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x1c\x00Asia/HarbinUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\t\x00\x1c\x00Atlantic/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R" + + "\u0097N\xad\xaf\x00\x00\x00\xaf\x00\x00\x00\x13\x00\x1c\x00Atlantic/Cape_VerdeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xe7\xcf^\xb0\x15\x03\x00\x00\x15\x03\x00\x00\x10\x00\x1c\x00Atlantic/StanleyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x93" + + "D_<\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;\u007f@\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\n\x00\x00\x00\x00\x00\xf1c9R\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00\x10\x00\x1c\x00Atlantic/" + + "MadeiraUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x8a\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\u007f\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\xe2" + + "q\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\xd22" + + "t\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ܹ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\xe1r" + + "V\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\xef\x8a" + + "\xb00\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#\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\x00AST\x00\nAST4ADT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xaf|7\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x1c\x00Atlantic/CanaryUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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#2\nPK\x03\x04\n\x00\x00\x00\x00" + + "\x00\xf1c9R\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00\x1c\x00Atlantic/FaeroeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\u007f\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ܹ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\xcc" + + "\xa0\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#1<+00>,M3.5.0/0,M10.5.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n" + + "\x00\x1c\x00Australia/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RX\xb9\x9ap\x88" + + "\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/NSWUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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\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\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" + + "\n\x00\x00\x00\x00\x00\xf1c9R\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x1c\x00Australia/AdelaideUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v" + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfe" + - "v\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Ā\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\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x1c\x00Australia/LindemanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x12" + + "\x00\x1c\x00Australia/VictoriaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\x00" + + "6\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\x00" + + "EC~\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\n\x00\x00" + + "\x00\x00\x00\xf1c9Ro3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x1c\x00Australia/LHIUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\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\x16" + + "8@\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\x002" + + "r.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\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\n\x00\x00\x00\x00\x00\xf1c9R\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00" + + "\x00\x00\x0f\x00\x1c\x00Australia/NorthUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xc8R\x1a" + + "\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x1c\x00Australia/DarwinUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xf1c9R\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x14\x00\x1c\x00Australia/YancowinnaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\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\x00" + + "9\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\x00" + + "G\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\tL" + + "MT\x00AEST\x00ACST\x00ACDT\x00\nACST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00" + + "\xf1c9R3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x14\x00\x1c\x00Australia/QueenslandUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x03" + + "p9\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\n\x00\x00\x00\x00\x00\xf1c9RX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x1c\x00Australia/SydneyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03" + - "\x00\x00\x10\x00\x1c\x00Australia/CurrieUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + + "\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,M1" + + "0.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x1c\x00Australia/Tasma" + + "niaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x03p" + + "9\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Ā\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\n\x00\x00\x00\x00\x00\xf1c9R\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x1c\x00Australia/SouthU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c" + + "9RX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x1c\x00Australia/CanberraUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\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\u007f<\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\x00C" + + "c\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\x01\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\x00AE" + - "ST\x00\nAEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x0f" + - "\x00\x1c\x00Australia/NorthUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\xba\xde\xd3!\x01" + - "\x00\x00!\x01\x00\x00\x14\x00\x1c\x00Australia/QueenslandUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\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\nAEST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/NSWUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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" + + "\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,M" + + "4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x1c\x00Australia/CurrieUT\t\x00\x03\x15" + + "\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + + "\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\n\x00\x00\x00\x00\x00\xf1c9R\xa2ܺ\xca:\x01\x00\x00:\x01\x00\x00\x0f\x00\x1c\x00Australia/EuclaUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00" + + "\x1c\x00Australia/HobartUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + - "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/ACTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + + "\x01\x02\x01\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\n" + + "AEST-10AEDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15\x00\x1c\x00A" + + "ustralia/Broken_HillUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\x18" + + "Lj\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\x00C" + + "c\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\nAC" + + "ST-9:30ACDT,M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x1c\x00A" + + "ustralia/LindemanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\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\n\x00\x00\x00\x00\x00\xf1c9R\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x1c\x00Australia/MelbourneU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x168" + + "H\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\x002r" + + "5\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\n\x00\x00\x00\x00\x00\xf1c9R3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x1c" + + "\x00Australia/BrisbaneUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xc7" + + "e\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\n\x00\x00\x00\x00\x00\xf1c9Rϻ\xca\x1a2\x01\x00\x002\x01" + + "\x00\x00\x0f\x00\x1c\x00Australia/PerthUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n" + + "\x00\x00\x00\x00\x00\xf1c9Ro3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x1c\x00Australia/Lord_HoweUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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+103" + + "0\x00+11\x00\n<+1030>-10:30<+11>-11,M10.1.0,M4.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rϻ" + + "\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e\x00\x1c\x00Australia/WestUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcb" + + "T\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9RX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x1c\x00Australia/ACTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux" + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f<\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" + @@ -3809,726 +3860,1158 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\ "BE\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\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x1c\x00Australia/Tas" + - "maniaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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" + + "M10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Brazil/UT\t\x00\x03\x15" + + "\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\v\x00\x1c\x00Brazil/E" + + "astUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x009\xdf\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00N\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\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\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\n\x00\x00\x00\x00\x00\xf1c9Rg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x1c\x00Brazil/" + + "AcreUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x1c\x00" + + "Brazil/DeNoronhaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe0" + + "T%\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\x002\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c" + + "9Ra\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x1c\x00Brazil/WestUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fD\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,\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\n\x00\x00\x00\x00\x00\xf1" + + "c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Canada/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00" + + "\x00\x00\x00\x00\xf1c9RU9#\xbe2\x05\x00\x002\x05\x00\x00\x0e\x00\x1c\x00Canada/PacificUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\x00\x00\x8a\x1c\x00\x00\x00\x00\x9a\xb0\x01\x04\x00\x00\x8c\xa0\x00\tLMT\x00AEDT\x00AEST\x00\nAEST-10AEDT,M" + - "10.1.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x1c\x00Australia/Sout" + - "hUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\x00" + - "1]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\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x1c\x00Australia/SydneyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\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\u007f<\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\x00C" + - "c\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,M" + - "4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Brazil/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x1c\x00Brazil/WestUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fD\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,\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-0" + - "3\x00-04\x00\n<-04>4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x1c\x00Brazil/AcreUT\t\x00\x03" + - "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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`\u007fP\x00\x00" + - "\x00\x00R\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x1c\x00Brazil/De" + - "NoronhaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x002\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9d?\xdfڸ\x03\x00" + - "\x00\xb8\x03\x00\x00\v\x00\x1c\x00Brazil/EastUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x009\xdf\xe30\x00\x00\x00\x00:\x8f,\xa0\x00\x00\x00\x00;\xc8\xff\xb0\x00\x00\x00\x00N\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\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\x00R" + - "cG0\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Canada/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc2" + - "\x96dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x1c\x00Canada/SaskatchewanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQU9#\xbe2\x05" + - "\x00\x002\x05\x00\x00\x0e\x00\x1c\x00Canada/PacificUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xe6" + - "GX \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\u007f\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\x02" + - "x\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\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x1c\x00Canada/EasternUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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|3" + - "p\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\u007f\x97`\xff\xff\xff\xff\xf3o\x96" + - "p\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00" + - "\x00A\x84\u007f`\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00Canada/AtlanticUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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\u007fU0\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\xde" + - "\xbe]`\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" + - "\u007f\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\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\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\n\x00\x00\x00\x00\x00\xf1c9R?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x1c\x00Canada/Central" + + "UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd7" + + "5\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\x003" + + "GX\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\u007f\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\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" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13\x00\x1c\x00Canada/NewfoundlandUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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\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\x00" + - "I\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\xdc" + - "\xa4\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\x00N" + - "DDT\x00\nNST3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x1c" + - "\x00Canada/CentralUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + - "\u007f\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" + + "\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\n\x00\x00\x00\x00\x00\xf1c9R):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x1c\x00Canada/AtlanticUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007fU0\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\u007f\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\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x1c\x00Canada/Mounta" + - "inUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xde" + - "\x80\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\u007f" + - "\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\x00" + - "MDT\x00MST\x00MWT\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc1Ȇ\x90\x05\x04" + - "\x00\x00\x05\x04\x00\x00\f\x00\x1c\x00Canada/YukonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfb\x1d_\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\x8f\xec\x90\x00\x00\x00\x00?\x9b\u007f\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\x00MW" + + "T\x00MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x1c\x00" + + "Canada/YukonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xcb" + + "\x89(\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\xfb\x1d_\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\x00QO@\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 \u007f\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\x00B" + - "3\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\x00P" + - "B\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\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x03\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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/2" + - "4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x1c\x00Chile/EasterIslandUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00f\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\xd1" + - "\xb0\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 \u007f\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\xbf" + - "0\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\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\x8b\x99\x1e\xb7\x03" + - "\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00CST6CDTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "8\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\x00" + - "E\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\x00" + - "CST\x00CWT\x00CPT\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04" + - "\x00\x00\x04\x00\x1c\x00CubaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xd5" + - "P\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$\x17" + - "P\x00\x00\x00\x00GܩP\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,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x1c\x00EETUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#" + - "\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\x00Cd0" + + "d\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\x00NPT\x00NWT\x00NDDT\x00\nNS" + + "T3:30NDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x1c\x00Canada" + + "/EasternUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\u007f\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\xe8" + - "6c`\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\u007f\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\u007fYp\x00\x00\x00\x00\x03I\x1d\x00\x00\x00\x00\x00\x04" + - "a\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\x12" + - "U\\\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\u007f\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@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0\x00\x00\x00\x00C\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" + + "\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\xc6" + + "M|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\u007f\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" + + "\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\x00\x00\x1dU\x00\x00\x00\x00*0\x01\x04\x00\x00\x1c \x00\tLMT\x00EEST\x00EET\x00\nEET-2\nPK\x03\x04\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\x04\x00\x1c\x00EireUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\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\n\x00\x00\x00\x00\x00\xf1c9R\u0096dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x1c\x00Canada/Saskatchew" + + "anUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xcb" + + "p\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\x00CS" + + "T\x00\nCST6\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00CETUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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#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 \u007f\x030\x00\x00\x00\x00!o\x02@\x00\x00\x00\x00\"9\xfb" + + "0\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\xae" + + "0\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\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\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/2" + + "2,M4.1.6/22\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x1c\x00Chile/ContinentalU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x06\x00\x00" + + "\x00\x14\xff\xff\xff\xffi\x87\x1d\xc6\xff\xff\xff\xff\x8f0GF\xff\xff\xff\xff\x9b\\\xe5P\xff\xff\xff\xff\x9f|\xe2\xc6\xff\xff\xff\xff\xa1\x00q\xc0\xff\xff\xff\xff\xb0^w\xc6\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\x1bɰ\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 \u007f" + + "\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\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\x01\x02\x01\x03\x01\x04\x02\x04\x02\x04\x02\x04\x02\x04\x02\x03\x02\x03\x05\x03\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\xff\xff\xbd\xba\x00\x00\xff\xff\xbd\xba\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\x00" + + "SMT\x00-05\x00-04\x00-03\x00\n<-04>4<-03>,M9.1.6/24,M4.1.6/24\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1" + + "c9R<\x8b\x99\x1e\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00CST6CDTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xdc\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\xd6" + - "\xa0\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\xcc" + - "\xa0\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\u007f_ \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\xde" + - "\xa0\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$\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\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQtX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00ESTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe7/\xebT" + - "\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00EST5EDTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\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\xdb" + + "p\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\xee" + + "p\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\xa1" + + "p\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\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\a" + + "\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x04\x00\x1c\x00CubaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\u007f`\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\fED" + - "T\x00EST\x00EWT\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x04\x00\x1c\x00Etc/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0\xfaFDq\x00" + - "\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+4UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ)\xb9\xbe\x9dr\x00" + - "\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+11UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQk\x19-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc5\x18\xb6" + - "\xfbr\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-8UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQe\xcb" + - "\xe9Qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+3UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfc\x19" + - "@\xb9r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-9UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8e" + - "\x1569r\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+10UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xf7\x1ac\xc3r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-1UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\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ܩP\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\nCST" + + "5CDT,M3.2.0/0,M11.1.0/1\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x1c\x00EETUT\t" + + "\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\xa8^`\x00\x00\x00\x00?sWP\x00\x00\x00\x00@\x91z\xe0\x00\x00\x00\x00A\\s\xd0\x00\x00\x00\x00Bq\\\xe0" + + "\x00\x00\x00\x00C\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\x00" + + "I\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\tLMT\x00EEST\x00EET\x00\nEET-2" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\x04\x00\x1c\x00EireUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\xdc\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\u007f_ \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$\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\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RtX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00ESTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00" + + "\x00\xf1c9R\xe7/\xebT\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00EST5EDTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x05" + + "P\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\x13" + + "iG\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\u007f`\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\x00EPT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9" + + "R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x1c\x00Etc/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1" + + "c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT+0UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9" + + "RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/GreenwichUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1" + + "c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT-0UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xd4X\x9b\xf3q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+5UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT-0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xf7\x1ac\xc3r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-1UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c" + + "9R5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+1UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\xd4X\x9b\xf3q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+5UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/GMTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4x" + - "o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UTCUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQj\xd5d\xb0r\x00\x00\x00" + - "r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-6UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00" + - "\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UCTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00" + - "\x00\b\x00\x1c\x00Etc/GMT0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84\x19\xb3\tq\x00\x00\x00q\x00\x00\x00\t\x00" + - "\x1c\x00Etc/GMT+9UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5\xf38cr\x00\x00\x00r\x00\x00\x00\n\x00" + - "\x1c\x00Etc/GMT+12UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQH\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00" + - "\t\x00\x1c\x00Etc/GMT+6UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00" + - "\b\x00\x1c\x00Etc/ZuluUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x1c" + - "\x00Etc/GMT-7UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00" + - "\x1c\x00Etc/GMT-5UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t" + - "\x00\x1c\x00Etc/GMT+1UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ,{\xdc;s\x00\x00\x00s\x00\x00\x00\n" + - "\x00\x1c\x00Etc/GMT-14UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd9|\xbd7s\x00\x00\x00s\x00" + - "\x00\x00\n\x00\x1c\x00Etc/GMT-10UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xab\xd1Is\x00\x00" + - "\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-11UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x90`N\xe8" + - "s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-13UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84" + - "+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+7UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf7" + - "\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-12UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00Etc/GMT+0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c" + + "9R\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+8UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\x9c\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-3UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+2UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-12UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UCTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+2UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/GreenwichUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xb2\xab\xd1Is\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-11UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+4UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R\x9c\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-3UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + + "\x00\xf1c9R!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-5UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/UniversalUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + + "\x00\x00\xf1c9Re\xcb\xe9Qq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+3UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + + "\x00\x00\xf1c9R\xd9|\xbd7s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-10UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+8UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-2UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Europe/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03" + - "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x1c\x00Europe/CopenhagenUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + - "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x11\xff\xff\xff\xffi\x86ϴ\xff\xff\xff\xffq" + - "\f\xef4\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9bվ\xd0\xff\xff\xff\xff\xc8CWp\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\xd2$\x10\x90\xff\xff\xff\xff\xd3y\x85\x10\xff\xff\xff\xff\xd4\x1b\xad\x90\xff\xff\xff\xff\xd5^\xad\x10\xff\xff\xff\xff\xd5\xdf\xe0\x10\xff\xff\xff\xff\xd7" + - "Gɐ\xff\xff\xff\xff\u05ff\xc2\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#\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\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQu\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x1c\x00Europe/UlyanovskUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n" + + "\x00\x00\x00\x00\x00\xf1c9R\xe5\xf38cr\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+12UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xfc\x19@\xb9r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-9UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\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\x000" + - "d\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" + - "\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\x00L" + - "̣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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03R" + - "\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x1c\x00Europe/NicosiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x006" + - "2x\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\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x1c\x00Europe/BudapestUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-13UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\xb6\xd0\x00\x00+13\x00\n<+13>-13" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\b\x00\x1c\x00Etc/GMT0UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00\x00\x00\x00\x00GMT\x00\nGMT0\nPK" + + "\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x8e\x1569r\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+10UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xffs`\x00\x00-10\x00\n<-10>10\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rj\xd5d\xb0r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-6UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00T`\x00\x00+06\x00\n<+06>-6" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/UTCUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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љx\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\xb1" + - "p\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#(\xe8L\xff\xff\xff\xffp\xbc\x81p\xff\xff\xff\xff\x9b" + - "8\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\xd0" + - "n^\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#\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" + - "\x00MMT\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00+03\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4" + - "\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x1c\x00Europe/San_MarinoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\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\"L" + - "T\x10\x00\x00\x00\x00#7\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xf1c9RH\x9b\xd1\x04q\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+6UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-7UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\a\x00\x1c\x00Etc/GMTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00" + + "\x00\x00\x00\x00\xf1c9R\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-2UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n" + + "\x00\x00\x00\x00\x00\xf1c9R,{\xdc;s\x00\x00\x00s\x00\x00\x00\n\x00\x1c\x00Etc/GMT-14UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x1c\x00Etc/UniversalUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00UTC\x00\nUTC0\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xc5\x18\xb6\xfbr\x00\x00\x00r\x00\x00\x00\t\x00\x1c\x00Etc/GMT-8UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x00p\x80\x00\x00+08\x00\n<+08>-8" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R)\xb9\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n\x00\x1c\x00Etc/GMT+11UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffeP\x00\x00-11\x00\n<-11>" + + "11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\b\x00\x1c\x00Etc/ZuluUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00UTC\x00\nUTC0\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rk\x19-4" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x84\x19\xb3\tq\x00\x00\x00q\x00\x00\x00\t\x00\x1c\x00Etc/GMT+9UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xff\xff\x81p\x00\x00-09\x00\n<-09>9" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Europe/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x1c\x00Europe/SamaraUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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)\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\x00" + + "62M\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\x00" + + "D%\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9Rk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x1c\x00E" + + "urope/BelfastUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_ \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\nGMT0B" + + "ST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Ro\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x1c\x00Europe/Bru" + + "sselsUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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#\x86%p\x00\x00\x00\x00?\x9b\x00" + + "p\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\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\b" + + "LMT\x00+03\x00+04\x00+05\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RO+j\x94\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x1c\x00Europ" + + "e/KaliningradUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + + "3=\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\x00" + + "A\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\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\nEET-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xe1" + + "C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x1c\x00Europe/BelgradeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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#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#\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\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\n\x00\x00\x00\x00\x00\xf1c9R\xea\xc48\xde\\\x02\x00\x00" + + "\\\x02\x00\x00\r\x00\x1c\x00Europe/TiraneUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + + "#(\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\x9c" + + "Zp\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#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]" + + "\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\xe7" + + "K\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\xeb" + + "W\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#\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\x00MMT\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EEST\x00+03\x00\n<" + + "+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RZk#V\x81\x03\x00\x00\x81\x03\x00\x00\r\x00\x1c\x00Europe/MadridUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\x92p\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͐\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#\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\x0062[\xf0\x00\x00\x00\x00" + + "6\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\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\x00" + + "EC\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\x00MMT\x00MST\x00" + + "MDST\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x8c\xc8\x15\xd0P\x02\x00\x00P\x02\x00\x00\f" + + "\x00\x1c\x00Europe/SofiaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x001]" + + "\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\x00CEST\x00" + + "EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00" + + "\x00\x0e\x00\x1c\x00Europe/VilniusUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xa3f" + + "x`\xff\xff\xff\xffȬ\xcfp\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\u007f\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\x00W" + + "MT\x00KMT\x00CET\x00EET\x00MSK\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0" + + "/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\r\x00\x1c\x00Europe/BerlinUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00" + - "\x00\x0f\x00\x1c\x00Europe/BelgradeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\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\x8e" + + "o\xf0\x00\x00\x00\x00TL\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\n\x00\x00\x00\x00\x00\xf1c9R\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x1c\x00Europe/Budape" + + "stUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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љx\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\xde" + + "p\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#(\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#\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\nEE" + + "T-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x1c\x00Eur" + + "ope/BratislavaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\"L" + + "7\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\x00MS" + + "D\x00MSK\x00\nEET-2EEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00" + + "\x10\x00\x1c\x00Europe/LjubljanaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xce" + "\xa2C\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" + @@ -4536,340 +5019,120 @@ const zipdata = "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\ "LT\x10\x00\x00\x00\x00#\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQߜv\xcf" + - "\x85\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x1c\x00Europe/AndorraUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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#\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\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\x00" + - "FP\x01\b\x00\x008@\x00\f\x00\x008@\x01\fLMT\x00+03\x00+05\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?" + - "\x06\x00\x00?\x06\x00\x00\r\x00\x1c\x00Europe/LondonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xa4" + - "N\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\xb2" + - "pL\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\xcf" + - "\x90\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\u007f_ \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\x00" + - "BDST\x00\nGMT0BST,M3.5.0/1,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQq\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x1c" + - "\x00Europe/TallinnUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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ϒ4\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\"L" + - "7\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\u007f\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\x00TM" + - "T\x00CEST\x00CET\x00EET\x00MSK\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK" + - "\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x1c\x00Europe/ZaporozhyeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc3\b\xff\xff\xff\xff" + - "\xaa\x19\xa30\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xffʪ\xe7\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffν\xd6p\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(\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\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\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\x03\a\x02\a\x02\a\x02\a\x02\a\x02\a\x00\x00 \xf8\x00\x00\x00\x00 \xd0\x00\x04\x00\x00\x1c \x00\n\x00\x00*" + - "0\x00\x0e\x00\x00\x0e\x10\x00\x12\x00\x00\x1c \x01\x16\x00\x008@\x01\x1b\x00\x00*0\x01\x1fLMT\x00+0220\x00EET\x00MSK\x00CET\x00CEST\x00MSD\x00EE" + - "ST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQVa\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10" + - "\x00\x1c\x00Europe/VolgogradUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x004R" + - "y\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\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x1c\x00Europe/RomeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\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\x0e" + - "9p\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\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#\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\x00" + - "0d\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\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`\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\x00MMT\x00MST\x00MDST" + - "\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x1c\x00E" + - "urope/KievUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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)\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\xbc" + - "\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\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\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\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x1c\x00Europe/PragueUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\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#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" + + "\x00\x00\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#\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\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\x00" + - "MSD\x00MSK\x00\nEET-2EEST,M3.5.0,M10.5.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQO+j\x94\x88\x03\x00\x00\x88\x03" + - "\x00\x00\x12\x00\x1c\x00Europe/KaliningradUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xcf" + - "\x924\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\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\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\nEET-2\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x1c\x00Europe/StockholmUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffT՟\x94\xff\xff\xff\xff|Us" + - "b\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9b\xd5\xda\xf0\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#\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\x00" + - "8@\x01\x1d\x00\x00*0\x01!LMT\x00WMT\x00KMT\x00CET\x00EET\x00MSK\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M" + - "3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x1c\x00Europe/Belfa" + - "stUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_" + - " \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\n\x00\x00\x00\x00\x00T\x8a\x9eQIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x1c\x00Europe/BratislavaUT\t\x00" + - "\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\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\n\x00\x00\x00\x00\x00\xf1" + + "c9R8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x1c\x00Europe/KievUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\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\xdb" + + "P\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)\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\xbc\x90\x00\x00\x00\x000d\xad\x90\x00\x00\x00\x001]\xd9\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\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\x00CEST\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10" + + ".5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\r\x00\x1c\x00Europe/ZurichUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\n\x00\x00\x00\x00\x00\xf1c9R\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x1c\x00Europe/StockholmUT\t\x00\x03\x15" + + "\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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" + + "\xffT՟\x94\xff\xff\xff\xff|Usb\xff\xff\xff\xff\x9b\x1e\x8c`\xff\xff\xff\xff\x9b\xd5\xda\xf0\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\xdc" + + "\x90\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#\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\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\"L" + + "MT\x00CMT\x00BMT\x00EEST\x00EET\x00CET\x00CEST\x00MSD\x00MSK\x00\nEET-2EEST,M3.5.0,M10.5" + + ".0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x1c\x00Europe/ZaporozhyeUT\t\x00\x03\x15\xac\x0e" + + "`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xc3\b\xff\xff\xff\xff\xaa\x19\xa30\xff\xff\xff\xff\xb5\xa4\x19`\xff\xff\xff\xffʪ\xe7\xd0\xff\xff\xff\xff\xcc\xe7K\x10\xff\xff\xff\xffͩ\x17\x90\xff\xff\xff\xff\u03a2C\x10\xff\xff\xff\xffν\xd6p\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(\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\xbc\x90\x00\x00\x00\x000d\xad\x90\x00" + + "\x00\x00\x001]\xd9\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\x03\a\x02\a\x02\a\x02\a\x02\a\x02\a\x00\x00 \xf8\x00\x00\x00\x00 \xd0\x00\x04\x00\x00" + + "\x1c \x00\n\x00\x00*0\x00\x0e\x00\x00\x0e\x10\x00\x12\x00\x00\x1c \x01\x16\x00\x008@\x01\x1b\x00\x00*0\x01\x1fLMT\x00+0220\x00EET\x00MSK\x00CET\x00CEST" + + "\x00MSD\x00EEST\x00\nEET-2EEST,M3.5.0/3,M10.5.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xe0\xfe\x83\xe5\xcd\x02" + + "\x00\x00\xcd\x02\x00\x00\f\x00\x1c\x00Europe/KirovUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xcd" + + "p\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\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`\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\n\x00\x00\x00\x00\x00\xf1c9" + + "R>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x1c\x00Europe/WarsawUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xe3\xa1" + + "\x80\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#\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x1c\x00Europe/W" + - "arsawUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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" + - "#\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`\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x1c\x00Europe/GibraltarUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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#\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x1c\x00Europe/TiraneUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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#\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x1c\x00Europe/DublinUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "\xdc\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\u007f_ \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$\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x1c\x00Europe/SamaraUT\t" + - "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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)\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\x00" + - "5\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\x00" + - "Cc\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\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xab\x80c$q\x00\x00\x00q" + - "\x00\x00\x00\a\x00\x1c\x00FactoryUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00" + - "\x00\x02\x00\x1c\x00GBUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "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\xffr\xee$l\xff\xff\xff\xff\x9b'\xe3\x00\xff\xff\xff\xff" + + "\x9b\xd4{`\xff\xff\xff\xffȷM`\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\xeb\xaf \x90\xff\xff\xff\xff\xec\xa8L\x10\xff\xff\xff\xff\xed\x98=\x10\xff\xff\xff\xff\xee\x88.\x10\xff\xff\xff\xff\xefx\x1f\x10\xff\xff\xff\xff\xf0h\x10\x10\xff\xff\xff\xff" + + "\xf1X\x01\x10\xff\xff\xff\xff\xf2G\xf2\x10\xff\xff\xff\xff\xf37\xe3\x10\xff\xff\xff\xff\xf4'\xd4\x10\xff\xff\xff\xff\xf5\x17\xc5\x10\xff\xff\xff\xff\xf6\x10\xf0\x90\xff\xff\xff\xff\xf7/\x06\x10\xff\xff\xff\xff\xf7\xf0Ґ" + + "\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#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\t" + + "p\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\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\n\x00\x00\x00\x00\x00\xf1c9R" + + "\xab\x80c$q\x00\x00\x00q\x00\x00\x00\a\x00\x1c\x00FactoryUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\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\n\x00\x00\x00\x00\x00\xf1c9Rk\xa4" + + ",\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x1c\x00GBUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f_ \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\n\x00\x00\x00\x00\x00\xf1c9Rk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x1c\x00GB-Eire" + + "UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xb5" + + "IZ \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\xc3" + + "Xy \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\u007f_ \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,M" + + "10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00GMTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00GMT\x00\nGMT0\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c\x00GMT+0UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + + "\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x1c\x00GMT-0UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9" + + "RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x1c\x00GMT0UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00" + + "\x00\x00o\x00\x00\x00\t\x00\x1c\x00GreenwichUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00" + - "o\x00\x00\x00\x04\x00\x1c\x00GMT0UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RE\t\xfa-\a\x03\x00\x00" + + "\a\x03\x00\x00\b\x00\x1c\x00HongkongUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xf6" + + "G\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\x04" + + "M\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\x00" + + "w\x88\x01\r\x00\x00~\x90\x00\x12LMT\x00HKT\x00HKST\x00HKWT\x00JST\x00\nHKT-8\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R=\xf7\xfawp\x00\x00" + + "\x00p\x00\x00\x00\x03\x00\x1c\x00HSTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x1c" + - "\x00GreenwichUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\b\x00\x1c\x00H" + - "ongkongUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x1c\x00" + - "HSTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x1c\x00Iceland" + - "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00" + - "\x00\x00\x10\xff\xff\xff\xff\x8b`\x83\xa0\xff\xff\xff\xff\x9c\x91\x1e\x00\xff\xff\xff\xff\x9dш\x90\xff\xff\xff\xff\x9erQ\x80\xff\xff\xff\xff\x9f\xd5\x03\x10\xff\xff\xff\xff\xa0S\x85\x00\xff\xff\xff\xff\xa1\xb66\x90\xff" + - "\xff\xff\xff\xa4<'\x80\xff\xff\xff\xff\xa4\xb9t\x10\xff\xff\xff\xff\xc6M\x1a\x00\xff\xff\xff\xff\xc7=' \xff\xff\xff\xff\xc7\xda\x17\xb0\xff\xff\xff\xff\xc9&C\xa0\xff\xff\xff\xff\xc9\xc3& \xff\xff\xff\xff\xcb" + - "\x06%\xa0\xff\xff\xff\xffˬB\xa0\xff\xff\xff\xff\xcc\xdc\xcd \xff\xff\xff\xff͌$\xa0\xff\xff\xff\xffμ\xaf \xff\xff\xff\xff\xcfl\x06\xa0\xff\xff\xff\xffМ\x91 \xff\xff\xff\xff\xd1K\xe8\xa0\xff" + - "\xff\xff\xff҅\xad\xa0\xff\xff\xff\xff\xd3+ʠ\xff\xff\xff\xff\xd4e\x8f\xa0\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd6Eq\xa0\xff\xff\xff\xff\xd7\x19\xb3 \xff\xff\xff\xff\xd8%S\xa0\xff\xff\xff\xff\xd8" + - "\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xd9w \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xce4 \xff\xff\xff\xffޢu\xa0\xff\xff\xff\xff߮\x16 \xff" + - "\xff\xff\xff\xe0\x82W\xa0\xff\xff\xff\xff\xe1\x8d\xf8 \xff\xff\xff\xff\xe2b9\xa0\xff\xff\xff\xff\xe3m\xda \xff\xff\xff\xff\xe4B\x1b\xa0\xff\xff\xff\xff\xe5M\xbc \xff\xff\xff\xff\xe6!\xfd\xa0\xff\xff\xff\xff\xe7" + - "6ؠ\xff\xff\xff\xff\xe8\v\x1a \xff\xff\xff\xff\xe9\x16\xba\xa0\xff\xff\xff\xff\xe9\xea\xfc \xff\xff\xff\xff\xea\xf6\x9c\xa0\xff\xff\xff\xff\xeb\xca\xde \xff\xff\xff\xff\xec\xd6~\xa0\xff\xff\xff\xff\xed\xaa\xc0 \xff" + - "\xff\xff\xff\xee\xb6`\xa0\xff\xff\xff\xff\uf2a2 \xff\xff\xff\xff\xf0\x96B\xa0\xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2\u007f_ \xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff\xf4_A \xff\xff\xff\xff\xf5" + - "3\x82\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x13d\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xf3F\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xd3(\xa0\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff" + - "\xff\xff\xff\xfc\xbcE \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xeb`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00GMT\x00\nGMT0" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Indian/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x13\x00\x1c\x00Indian/AntananarivoUT\t\x00\x03" + - "`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00" + - "\r\x00\x1c\x00Indian/ComoroUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\n\x00\x00\x00\x00\x00\xf1c9Rm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00" + + "\x1c\x00IcelandUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04\x00\x00\x00\x10\xff\xff\xff\xff\x8b`\x83\xa0\xff\xff\xff\xff\x9c\x91\x1e\x00\xff\xff\xff\xff\x9dш\x90\xff\xff\xff\xff\x9erQ\x80\xff\xff\xff\xff\x9f\xd5\x03\x10\xff\xff\xff\xff\xa0S\x85\x00" + + "\xff\xff\xff\xff\xa1\xb66\x90\xff\xff\xff\xff\xa4<'\x80\xff\xff\xff\xff\xa4\xb9t\x10\xff\xff\xff\xff\xc6M\x1a\x00\xff\xff\xff\xff\xc7=' \xff\xff\xff\xff\xc7\xda\x17\xb0\xff\xff\xff\xff\xc9&C\xa0\xff\xff\xff\xff" + + "\xc9\xc3& \xff\xff\xff\xff\xcb\x06%\xa0\xff\xff\xff\xffˬB\xa0\xff\xff\xff\xff\xcc\xdc\xcd \xff\xff\xff\xff͌$\xa0\xff\xff\xff\xffμ\xaf \xff\xff\xff\xff\xcfl\x06\xa0\xff\xff\xff\xffМ\x91 " + + "\xff\xff\xff\xff\xd1K\xe8\xa0\xff\xff\xff\xff҅\xad\xa0\xff\xff\xff\xff\xd3+ʠ\xff\xff\xff\xff\xd4e\x8f\xa0\xff\xff\xff\xff\xd59\xd1 \xff\xff\xff\xff\xd6Eq\xa0\xff\xff\xff\xff\xd7\x19\xb3 \xff\xff\xff\xff" + + "\xd8%S\xa0\xff\xff\xff\xff\xd8\xf9\x95 \xff\xff\xff\xff\xda\x0ep \xff\xff\xff\xff\xda\xd9w \xff\xff\xff\xff\xdb\xe5\x17\xa0\xff\xff\xff\xffܹY \xff\xff\xff\xff\xdd\xce4 \xff\xff\xff\xffޢu\xa0" + + "\xff\xff\xff\xff߮\x16 \xff\xff\xff\xff\xe0\x82W\xa0\xff\xff\xff\xff\xe1\x8d\xf8 \xff\xff\xff\xff\xe2b9\xa0\xff\xff\xff\xff\xe3m\xda \xff\xff\xff\xff\xe4B\x1b\xa0\xff\xff\xff\xff\xe5M\xbc \xff\xff\xff\xff" + + "\xe6!\xfd\xa0\xff\xff\xff\xff\xe76ؠ\xff\xff\xff\xff\xe8\v\x1a \xff\xff\xff\xff\xe9\x16\xba\xa0\xff\xff\xff\xff\xe9\xea\xfc \xff\xff\xff\xff\xea\xf6\x9c\xa0\xff\xff\xff\xff\xeb\xca\xde \xff\xff\xff\xff\xec\xd6~\xa0" + + "\xff\xff\xff\xff\xed\xaa\xc0 \xff\xff\xff\xff\xee\xb6`\xa0\xff\xff\xff\xff\uf2a2 \xff\xff\xff\xff\xf0\x96B\xa0\xff\xff\xff\xff\xf1j\x84 \xff\xff\xff\xff\xf2\u007f_ \xff\xff\xff\xff\xf3S\xa0\xa0\xff\xff\xff\xff" + + "\xf4_A \xff\xff\xff\xff\xf53\x82\xa0\xff\xff\xff\xff\xf6?# \xff\xff\xff\xff\xf7\x13d\xa0\xff\xff\xff\xff\xf8\x1f\x05 \xff\xff\xff\xff\xf8\xf3F\xa0\xff\xff\xff\xff\xf9\xfe\xe7 \xff\xff\xff\xff\xfa\xd3(\xa0" + + "\xff\xff\xff\xff\xfb\xe8\x03\xa0\xff\xff\xff\xff\xfc\xbcE \x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\x02\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\xeb`\x00\x00\x00\x00\x00\x00\x01\x04\xff\xff\xf1\xf0\x00\b\x00\x00\x00\x00\x00\fLMT\x00+00\x00-01\x00" + + "GMT\x00\nGMT0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x1c\x00Indian/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Indian/MayotteU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xb8K\xabυ\x00\x00\x00" + + "\x85\x00\x00\x00\x10\x00\x1c\x00Indian/KerguelenUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdaab\x80\x01\x00\x00\x00\x00\x00\x00\x00\x00FP\x00\x04-00\x00+05\x00\n<+0" + + "5>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x1c\x00Indian/MaldivesUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xf1c9Ry(\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Indian/ReunionUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\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\x91\xcc9\x80\x01\x00\x004\x00\x00\x00\x00\x008@\x00\x04LM" + + "T\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x1c\x00Indian/Mauritiu" + + "sUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x13\x00\x1c\x00In" + + "dian/AntananarivoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/ChristmasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + + "\n\x00\x00\x00\x00\x00\xf1c9Ra\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Indian/MaheUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x89\u007f\a\x84\x01\x00\x003\xfc\x00\x00\x00\x008@\x00" + + "\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x1c\x00Indian/Comor" + + "oUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R$l=҅\x00" + + "\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/ChristmasUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\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\xffs\x16\xa9\xe4\x01\x00\x00c\x1c\x00\x00\x00\x00bp\x00\x04LMT\x00+07\x00\n<" + + "+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rx\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00\x1c\x00Indian/ChagosUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00" + + "\xf1c9RͲ\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x1c\x00Indian/CocosUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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|U&\xa4\x01\x00\x00Z\xdc\x00\x00\x00\x00[h\x00\x04LMT\x00" + + "+0630\x00\n<+0630>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x1c\x00IranUT\t\x00\x03\x15" + + "\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff" + + "\xff\x9al}\xc8\xff\xff\xff\xff\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft-@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\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,\xa1" + + "H\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\x00\x00\x00\x00d\x1a\x13\xc8\x00\x00\x00\x00e\f\x99\xb8\x00\x00\x00\x00e\xfbGH\x00\x00\x00\x00f\xed\xcd8\x00\x00\x00\x00g\xdd\xccH\x00\x00\x00" + + "\x00h\xd0R8\x00\x00\x00\x00i\xbe\xff\xc8\x00\x00\x00\x00j\xb1\x85\xb8\x00\x00\x00\x00k\xa03H\x00\x00\x00\x00l\x92\xb98\x00\x00\x00\x00m\x81f\xc8\x00\x00\x00\x00ns\xec\xb8\x00\x00\x00\x00ob\x9a" + + "H\x00\x00\x00\x00pU 8\x00\x00\x00\x00qE\x1fH\x00\x00\x00\x00r7\xa58\x00\x00\x00\x00s&R\xc8\x00\x00\x00\x00t\x18ظ\x00\x00\x00\x00u\a\x86H\x00\x00\x00\x00u\xfa\f8\x00\x00\x00" + + "\x00v\xe8\xb9\xc8\x00\x00\x00\x00w\xdb?\xb8\x00\x00\x00\x00x\xcb>\xc8\x00\x00\x00\x00y\xbdĸ\x00\x00\x00\x00z\xacrH\x00\x00\x00\x00{\x9e\xf88\x00\x00\x00\x00|\x8d\xa5\xc8\x00\x00\x00\x00}\x80+" + + "\xb8\x00\x00\x00\x00~n\xd9H\x00\x00\x00\x00\u007fa_8\x00\x00\x00\x00\x80Q^H\x00\x00\x00\x00\x81C\xe48\x00\x00\x00\x00\x822\x91\xc8\x00\x00\x00\x00\x83%\x17\xb8\x00\x00\x00\x00\x84\x13\xc5H\x00\x00\x00" + + "\x00\x85\x06K8\x00\x00\x00\x00\x85\xf4\xf8\xc8\x00\x00\x00\x00\x86\xe7~\xb8\x00\x00\x00\x00\x87\xd7}\xc8\x00\x00\x00\x00\x88\xca\x03\xb8\x00\x00\x00\x00\x89\xb8\xb1H\x00\x00\x00\x00\x8a\xab78\x00\x00\x00\x00\x8b\x99\xe4" + + "\xc8\x00\x00\x00\x00\x8c\x8cj\xb8\x00\x00\x00\x00\x8d{\x18H\x00\x00\x00\x00\x8em\x9e8\x00\x00\x00\x00\x8f]\x9dH\x00\x00\x00\x00\x90P#8\x00\x00\x00\x00\x91>\xd0\xc8\x00\x00\x00\x00\x921V\xb8\x00\x00\x00" + + "\x00\x93 \x04H\x00\x00\x00\x00\x94\x12\x8a8\x00\x00\x00\x00\x95\x017\xc8\x00\x00\x00\x00\x95\xf3\xbd\xb8\x00\x00\x00\x00\x96\xe3\xbc\xc8\x00\x00\x00\x00\x97\xd6B\xb8\x00\x00\x00\x00\x98\xc4\xf0H\x00\x00\x00\x00\x99\xb7v" + + "8\x00\x00\x00\x00\x9a\xa6#\xc8\x00\x00\x00\x00\x9b\x98\xa9\xb8\x00\x00\x00\x00\x9c\x87WH\x00\x00\x00\x00\x9dy\xdd8\x00\x00\x00\x00\x9ei\xdcH\x00\x00\x00\x00\x9f\\b8\x00\x00\x00\x00\xa0K\x0f\xc8\x00\x00\x00" + + "\x00\xa1=\x95\xb8\x00\x00\x00\x00\xa2,CH\x00\x00\x00\x00\xa3\x1e\xc98\x00\x00\x00\x00\xa4\rv\xc8\x00\x00\x00\x00\xa4\xff\xfc\xb8\x00\x00\x00\x00\xa5\xef\xfb\xc8\x00\x00\x00\x00\xa6⁸\x00\x00\x00\x00\xa7\xd1/" + + "H\x00\x00\x00\x00\xa8õ8\x00\x00\x00\x00\xa9\xb2b\xc8\x00\x00\x00\x00\xaa\xa4\xe8\xb8\x00\x00\x00\x00\xab\x93\x96H\x00\x00\x00\x00\xac\x86\x1c8\x00\x00\x00\x00\xadt\xc9\xc8\x00\x00\x00\x00\xaegO\xb8\x00\x00\x00" + + "\x00\xafWN\xc8\x00\x00\x00\x00\xb0IԸ\x00\x00\x00\x00\xb18\x82H\x00\x00\x00\x00\xb2+\b8\x00\x00\x00\x00\xb3\x19\xb5\xc8\x00\x00\x00\x00\xb4\f;\xb8\x00\x00\x00\x00\xb4\xfa\xe9H\x00\x00\x00\x00\xb5\xedo" + + "8\x00\x00\x00\x00\xb6\xddnH\x00\x00\x00\x00\xb7\xcf\xf48\x00\x00\x00\x00\xb8\xbe\xa1\xc8\x00\x00\x00\x00\xb9\xb1'\xb8\x00\x00\x00\x00\xba\x9f\xd5H\x00\x00\x00\x00\xbb\x92[8\x00\x00\x00\x00\xbc\x81\b\xc8\x00\x00\x00" + + "\x00\xbds\x8e\xb8\x00\x00\x00\x00\xbec\x8d\xc8\x00\x00\x00\x00\xbfV\x13\xb8\x00\x00\x00\x00\xc0D\xc1H\x00\x00\x00\x00\xc17G8\x00\x00\x00\x00\xc2%\xf4\xc8\x00\x00\x00\x00\xc3\x18z\xb8\x00\x00\x00\x00\xc4\a(" + + "H\x00\x00\x00\x00\xc4\xf9\xae8\x00\x00\x00\x00\xc5\xe9\xadH\x00\x00\x00\x00\xc6\xdc38\x00\x00\x00\x00\xc7\xca\xe0\xc8\x00\x00\x00\x00Ƚf\xb8\x00\x00\x00\x00ɬ\x14H\x00\x00\x00\x00ʞ\x9a8\x00\x00\x00" + + "\x00ˍG\xc8\x00\x00\x00\x00\xcc\u007f\u0378\x00\x00\x00\x00\xcdo\xcc\xc8\x00\x00\x00\x00\xcebR\xb8\x00\x00\x00\x00\xcfQ\x00H\x00\x00\x00\x00\xd0C\x868\x00\x00\x00\x00\xd123\xc8\x00\x00\x00\x00\xd2$\xb9" + + "\xb8\x00\x00\x00\x00\xd3\x13gH\x00\x00\x00\x00\xd4\x05\xed8\x00\x00\x00\x00\xd4\xf5\xecH\x00\x00\x00\x00\xd5\xe8r8\x00\x00\x00\x00\xd6\xd7\x1f\xc8\x00\x00\x00\x00\xd7ɥ\xb8\x00\x00\x00\x00ظSH\x00\x00\x00" + + "\x00٪\xd98\x00\x00\x00\x00ڙ\x86\xc8\x00\x00\x00\x00ی\f\xb8\x00\x00\x00\x00\xdc|\v\xc8\x00\x00\x00\x00\xddn\x91\xb8\x00\x00\x00\x00\xde]?H\x01\x02\x04\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\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\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\x00\x0008\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00FP\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00" + + "+04\x00+0430\x00\n<+0330>-3:30<+0430>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R" + + "\x17✳2\x04\x00\x002\x04\x00\x00\x06\x00\x1c\x00IsraelUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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Ҋ\xd7" + + "\x80\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\x03" + + "P\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\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\x00J" + + "MT\x00IDT\x00IST\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R%J" + + "\xd5\xebS\x01\x00\x00S\x01\x00\x00\a\x00\x1c\x00JamaicaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00KMT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x1c\x00Ja" + + "panUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nJS" + + "T-9\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x1c\x00KwajaleinUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xed" + + "5\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x1c\x00LibyaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00" + + "2N\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\nEE" + + "T-2\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00METUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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#\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\n\x00" + + "\x00\x00\x00\x00\xf1c9R8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x1c\x00Mexico/BajaSurUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x16\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\x01\x02\x01\x02\x01\x02\x01\x03\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\x01\x04\xff" + + "\xff\x9c<\x00\x00\xff\xff\x9d\x90\x00\x04\xff\xff\xab\xa0\x00\b\xff\xff\x8f\x80\x00\f\xff\xff\xab\xa0\x01\x10LMT\x00MST\x00CST\x00PST\x00MDT\x00\nMST7MDT,M4" + + ".1.0,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00MSTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + + "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n" + + "MST7\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xe6h\xcac\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00MST7MDTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01" + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xffs\x16\xa9\xe4\x01\x00\x00c\x1c\x00\x00" + - "\x00\x00bp\x00\x04LMT\x00+07\x00\n<+07>-7\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQa\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x1c\x00Indian/" + - "MaheUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x89\u007f\a\x84\x01\x00\x003\xfc\x00\x00\x00\x008@\x00\x04LMT\x00+04\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcd" + - "\xb2\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x1c\x00Indian/CocosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00TZif2\x00\x00\x00\x00\x00\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\xcd" + + "\x80\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\u007f\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\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\n\x00\x00\x00\x00\x00\xf1c9RV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x1c\x00NavajoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00" + + "4R\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\u007f\x00\x00\x00\x00\x00@oΐ\x00\x00\x00\x00A\x84\x9b\x80\x00\x00\x00\x00" + + "BO\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\x00M" + + "PT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x1c\x00NZU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00" + + "\xf1c9R\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x1c\x00NZ-CHATUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\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|U&\xa4\x01\x00\x00Z\xdc\x00\x00\x00\x00[h\x00\x04LMT\x00+0630" + - "\x00\n<+0630>-6:30\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb9\xb2Z\xac\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x1c\x00Indian/Maldives" + - "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + - "PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x1c\x00Indian/KerguelenUT\t\x00\x03`\xa8\xec_`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00" + - "\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdaab\x80\x01\x00\x00" + - "\x00\x00\x00\x00\x00\x00FP\x00\x04-00\x00+05\x00\n<+05>-5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x1c\x00Ind" + - "ian/MauritiusUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQx\xb0W\x14\x98\x00" + - "\x00\x00\x98\x00\x00\x00\r\x00\x1c\x00Indian/ChagosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x1c\x00Indian/" + - "MayotteUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "y(\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Indian/ReunionUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\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\x91\xcc9\x80\x01\x00\x004\x00\x00\x00\x00\x008@\x00\x04LMT\x00+0" + - "4\x00\n<+04>-4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x1c\x00IranUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + - "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\x00\x00\x00\x06\x00\x00\x00\x1c\xff\xff\xff\xff\x9al}\xc8\xff\xff\xff\xff" + - "\xd2\xdb\x12\xc8\x00\x00\x00\x00\x0e\xbb\xa2H\x00\x00\x00\x00\x0ft-@\x00\x00\x00\x00\x10\x8e@0\x00\x00\x00\x00\x10\xed:@\x00\x00\x00\x00\x11Ug\xc8\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\x00" + - "M\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\x00\x00\x00\x00d\x1a\x13\xc8\x00\x00\x00\x00e\f\x99\xb8\x00\x00\x00\x00e\xfbGH\x00\x00\x00\x00f\xed\xcd8\x00\x00\x00\x00g\xdd\xccH\x00\x00\x00\x00h\xd0R8\x00\x00\x00\x00" + - "i\xbe\xff\xc8\x00\x00\x00\x00j\xb1\x85\xb8\x00\x00\x00\x00k\xa03H\x00\x00\x00\x00l\x92\xb98\x00\x00\x00\x00m\x81f\xc8\x00\x00\x00\x00ns\xec\xb8\x00\x00\x00\x00ob\x9aH\x00\x00\x00\x00pU 8" + - "\x00\x00\x00\x00qE\x1fH\x00\x00\x00\x00r7\xa58\x00\x00\x00\x00s&R\xc8\x00\x00\x00\x00t\x18ظ\x00\x00\x00\x00u\a\x86H\x00\x00\x00\x00u\xfa\f8\x00\x00\x00\x00v\xe8\xb9\xc8\x00\x00\x00\x00" + - "w\xdb?\xb8\x00\x00\x00\x00x\xcb>\xc8\x00\x00\x00\x00y\xbdĸ\x00\x00\x00\x00z\xacrH\x00\x00\x00\x00{\x9e\xf88\x00\x00\x00\x00|\x8d\xa5\xc8\x00\x00\x00\x00}\x80+\xb8\x00\x00\x00\x00~n\xd9H" + - "\x00\x00\x00\x00\u007fa_8\x00\x00\x00\x00\x80Q^H\x00\x00\x00\x00\x81C\xe48\x00\x00\x00\x00\x822\x91\xc8\x00\x00\x00\x00\x83%\x17\xb8\x00\x00\x00\x00\x84\x13\xc5H\x00\x00\x00\x00\x85\x06K8\x00\x00\x00\x00" + - "\x85\xf4\xf8\xc8\x00\x00\x00\x00\x86\xe7~\xb8\x00\x00\x00\x00\x87\xd7}\xc8\x00\x00\x00\x00\x88\xca\x03\xb8\x00\x00\x00\x00\x89\xb8\xb1H\x00\x00\x00\x00\x8a\xab78\x00\x00\x00\x00\x8b\x99\xe4\xc8\x00\x00\x00\x00\x8c\x8cj\xb8" + - "\x00\x00\x00\x00\x8d{\x18H\x00\x00\x00\x00\x8em\x9e8\x00\x00\x00\x00\x8f]\x9dH\x00\x00\x00\x00\x90P#8\x00\x00\x00\x00\x91>\xd0\xc8\x00\x00\x00\x00\x921V\xb8\x00\x00\x00\x00\x93 \x04H\x00\x00\x00\x00" + - "\x94\x12\x8a8\x00\x00\x00\x00\x95\x017\xc8\x00\x00\x00\x00\x95\xf3\xbd\xb8\x00\x00\x00\x00\x96\xe3\xbc\xc8\x00\x00\x00\x00\x97\xd6B\xb8\x00\x00\x00\x00\x98\xc4\xf0H\x00\x00\x00\x00\x99\xb7v8\x00\x00\x00\x00\x9a\xa6#\xc8" + - "\x00\x00\x00\x00\x9b\x98\xa9\xb8\x00\x00\x00\x00\x9c\x87WH\x00\x00\x00\x00\x9dy\xdd8\x00\x00\x00\x00\x9ei\xdcH\x00\x00\x00\x00\x9f\\b8\x00\x00\x00\x00\xa0K\x0f\xc8\x00\x00\x00\x00\xa1=\x95\xb8\x00\x00\x00\x00" + - "\xa2,CH\x00\x00\x00\x00\xa3\x1e\xc98\x00\x00\x00\x00\xa4\rv\xc8\x00\x00\x00\x00\xa4\xff\xfc\xb8\x00\x00\x00\x00\xa5\xef\xfb\xc8\x00\x00\x00\x00\xa6⁸\x00\x00\x00\x00\xa7\xd1/H\x00\x00\x00\x00\xa8õ8" + - "\x00\x00\x00\x00\xa9\xb2b\xc8\x00\x00\x00\x00\xaa\xa4\xe8\xb8\x00\x00\x00\x00\xab\x93\x96H\x00\x00\x00\x00\xac\x86\x1c8\x00\x00\x00\x00\xadt\xc9\xc8\x00\x00\x00\x00\xaegO\xb8\x00\x00\x00\x00\xafWN\xc8\x00\x00\x00\x00" + - "\xb0IԸ\x00\x00\x00\x00\xb18\x82H\x00\x00\x00\x00\xb2+\b8\x00\x00\x00\x00\xb3\x19\xb5\xc8\x00\x00\x00\x00\xb4\f;\xb8\x00\x00\x00\x00\xb4\xfa\xe9H\x00\x00\x00\x00\xb5\xedo8\x00\x00\x00\x00\xb6\xddnH" + - "\x00\x00\x00\x00\xb7\xcf\xf48\x00\x00\x00\x00\xb8\xbe\xa1\xc8\x00\x00\x00\x00\xb9\xb1'\xb8\x00\x00\x00\x00\xba\x9f\xd5H\x00\x00\x00\x00\xbb\x92[8\x00\x00\x00\x00\xbc\x81\b\xc8\x00\x00\x00\x00\xbds\x8e\xb8\x00\x00\x00\x00" + - "\xbec\x8d\xc8\x00\x00\x00\x00\xbfV\x13\xb8\x00\x00\x00\x00\xc0D\xc1H\x00\x00\x00\x00\xc17G8\x00\x00\x00\x00\xc2%\xf4\xc8\x00\x00\x00\x00\xc3\x18z\xb8\x00\x00\x00\x00\xc4\a(H\x00\x00\x00\x00\xc4\xf9\xae8" + - "\x00\x00\x00\x00\xc5\xe9\xadH\x00\x00\x00\x00\xc6\xdc38\x00\x00\x00\x00\xc7\xca\xe0\xc8\x00\x00\x00\x00Ƚf\xb8\x00\x00\x00\x00ɬ\x14H\x00\x00\x00\x00ʞ\x9a8\x00\x00\x00\x00ˍG\xc8\x00\x00\x00\x00" + - "\xcc\u007f\u0378\x00\x00\x00\x00\xcdo\xcc\xc8\x00\x00\x00\x00\xcebR\xb8\x00\x00\x00\x00\xcfQ\x00H\x00\x00\x00\x00\xd0C\x868\x00\x00\x00\x00\xd123\xc8\x00\x00\x00\x00\xd2$\xb9\xb8\x00\x00\x00\x00\xd3\x13gH" + - "\x00\x00\x00\x00\xd4\x05\xed8\x00\x00\x00\x00\xd4\xf5\xecH\x00\x00\x00\x00\xd5\xe8r8\x00\x00\x00\x00\xd6\xd7\x1f\xc8\x00\x00\x00\x00\xd7ɥ\xb8\x00\x00\x00\x00ظSH\x00\x00\x00\x00٪\xd98\x00\x00\x00\x00" + - "ڙ\x86\xc8\x00\x00\x00\x00ی\f\xb8\x00\x00\x00\x00\xdc|\v\xc8\x00\x00\x00\x00\xddn\x91\xb8\x00\x00\x00\x00\xde]?H\x01\x02\x04\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\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\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\x00\x000" + - "8\x00\x00\x00\x0008\x00\x04\x00\x0018\x00\b\x00\x00FP\x01\x0e\x00\x008@\x00\x12\x00\x00?H\x01\x16LMT\x00TMT\x00+0330\x00+05\x00+04\x00+0430" + - "\x00\n<+0330>-3:30<+0430>,J79/24,J263/24\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17✳2\x04\x00\x002" + - "\x04\x00\x00\x06\x00\x1c\x00IsraelUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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&\x02" + + "B\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\x0046" + + "K\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\xac" + + "D\x00\x04\x00\x00\xc1\\\x01\n\x00\x00\xb3L\x00\x10LMT\x00+1215\x00+1345\x00+1245\x00\n<+1245>-12:45<+1345>,M" + + "9.5.0/2:45,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00Pacific" + + "/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x1c\x00P" + + "acific/EasterUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\x00" + - "1H\x96\xe0\x00\x00\x00\x002\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\x00" + - "M\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\x00IS" + - "T\x00IDDT\x00\nIST-2IDT,M3.4.4/26,M10.5.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ%J\xd5\xebS\x01\x00\x00S\x01\x00" + - "\x00\a\x00\x1c\x00JamaicaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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" + - "\x00KMT\x00EST\x00EDT\x00\nEST5\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x1c\x00JapanUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x1c\x00KwajaleinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + - "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ_\u007f2[\xaf" + - "\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x1c\x00LibyaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x003" + - "D6p\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\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x1c\x00METUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x11" + - "d'\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#\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00MSTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00f\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 \u007f\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\x00" + + "8\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\x00" + + "G\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\x00" + + "W7\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\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\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\n\x00\x00\x00\x00\x00\xf1c9R\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x1c\x00Pacific/PitcairnUT\t\x00\x03\x15\xac\x0e`\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + + "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nLMT\x00-0830\x00-08\x00\n<-08>8\nPK\x03\x04\n\x00\x00\x00\x00\x00" + + "\xf1c9R3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00\x00\x11\x00\x1c\x00Pacific/EnderburyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00\x01\x00\x00\x00\x04\xff\xff\x9d\x90\x00\x00MST\x00\nMST7\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe6h\xcac\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00MST7MDTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + - "\x00\x00\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\u007f\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\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x1c\x00NavajoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\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\nMST7M" + - "DT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x1c\x00NZUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\x00NZS" + - "T\x00NZMT\x00NZDT\x00\nNZST-12NZDT,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xc5FF(" + - "\x03\x00\x00(\x03\x00\x00\a\x00\x1c\x00NZ-CHATUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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>-12:45<+1345>,M9.5.0/2:4" + - "5,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x1c\x00Pacific/UT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/Wa" + - "llisUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\b\xa8\x01\x00\x00\xacX\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x1c\x00Pacific/EasterUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZ" + - "if3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00f\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(v" + - "0\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 \u007f\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\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\xff\xff\x99x\x00\x00\xff\xff\x99" + - "x\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x1c\x00Pacific/Ga" + - "mbierUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81" + - "\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x1c\x00Pacific/NiueUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "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\x03\x00\x00\x00\x04\x00\x00\x00\x10\xff\xff\xff\xff~7Ud\x00\x00\x00\x00\x12V\x04\xc0\x00\x00\x00\x00" + + "/\x059\xb0\x01\x02\x03\xff\xff_\x9c\x00\x00\xff\xffW@\x00\x04\xff\xffeP\x00\b\x00\x00\xb6\xd0\x00\fLMT\x00-12\x00-11\x00+13\x00\n<+13>-13\nPK\x03" + + "\x04\n\x00\x00\x00\x00\x00\xf1c9Ra\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x1c\x00Pacific/FunafutiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\f\xfc\x01\x00\x00\xa8\x04\x00" + + "\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0e\x00\x1c\x00Pacif" + + "ic/PonapeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10\xff\xff\xff\xff\x14\xe1\xb9,\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10" + + "\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x1c\x00Pacific/NoumeaUT\t\x00\x03" + + "\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x80\xf8vܔ" + + "\x00\x00\x00\x94\x00\x00\x00\r\x00\x1c\x00Pacific/PalauUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/Jo" + + "hnstonUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00" + + "HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x1c\x00Pacific/MajuroU" + + "T\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~6\x14\x80\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\xcf=Gp\xff\xff\xff\xff\xff\x86\x1bP\x01\x02" + + "\x01\x03\x02\x01\x04\x00\x00\xa0\x80\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<+12" + + ">-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x1c\x00Pacific/Pago_PagoUT\t\x00\x03\x15\xac\x0e" + + "`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R" + + "\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x1c\x00Pacific/EfateUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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$+\u007f@\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\n\x00\x00\x00\x00\x00\xf1c9R\xc8=ku\xae\x00\x00" + + "\x00\xae\x00\x00\x00\x12\x00\x1c\x00Pacific/KiritimatiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~7TL\xff\xff\xff\xff\xdcC5`\x00\x00\x00\x00\x10t\xca8\x01\x02\x03\xff\xff`" + - "\xb4\x00\x00\xff\xff`\xa0\x00\x04\xff\xff^H\x00\n\xff\xffeP\x00\x10LMT\x00-1120\x00-1130\x00-11\x00\n<-11>11\nPK\x03\x04\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\v\x00\x1c\x00Pacific/YapUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff" + - "\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00" + - "+09\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x1c\x00Pacific/Bougainv" + - "illeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x1c\x00Pacific/PohnpeiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x05\x00\x00\x00\x10\xff\xff\xff\xff\x14\xe1\xb9,\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0" + - "\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00" + - "\x00\x00\xc3\x00\x00\x00\f\x00\x1c\x00Pacific/TrukUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff" + - "\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10" + - ">-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/TarawaUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\r\x00\x1c" + - "\x00Pacific/ChuukUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff" + - "\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10>-10\nPK\x03" + - "\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x1c\x00Pacific/PalauUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xc5FF(\x03\x00\x00(\x03" + - "\x00\x00\x0f\x00\x1c\x00Pacific/ChathamUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x00" + - "5\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\x00" + - "C>\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>-12:45<+1345>,M9.5.0/" + - "2:45,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x1c\x00Pacific/Funaf" + - "utiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\f\xfc\x01\x00\x00\xa8\x04\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQY" + - "5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x1c\x00Pacific/NorfolkUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00" + - "\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0e\x00\x1c\x00Pacific/PonapeUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10\xff\xff\xff\xff\x14\xe1\xb9," + - "\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02\x04\x03\x02\xff\xffB\xd4\x00" + - "\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x1c\x00Pacific/Pago_PagoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00" + - "\x1c\x00Pacific/FakaofoUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x1c\x00Pacific/Noum" + - "eaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x18D" + - "p\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\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x1c\x00Pacific/KosraeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\n\x00\x00\x00\x00\x00\xf1" + + "c9R\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x1c\x00Pacific/FakaofoUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x96\xc5FF(\x03\x00\x00(\x03\x00" + + "\x00\x0f\x00\x1c\x00Pacific/ChathamUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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>-12:45<+1345>,M9.5.0/2" + + ":45,M4.1.0/3:45\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x1c\x00Pacific/Kwajal" + + "einUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9Rt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x1c\x00Pacific/MidwayUT\t\x00\x03\x15" + + "\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c" + + "9R1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/WallisUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\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\xffGL" + - "\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>-1" + - "1\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x1c\x00Pacific/PitcairnUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\nLMT\x00-0830\x00-08\x00\n<-08>8\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x1c\x00Pacific/Port_MoresbyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13" + - "\x04\x00\x00\x13\x04\x00\x00\x10\x00\x1c\x00Pacific/AucklandUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\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\xa7" + - "G`\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\x1e" + - "x`\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-12NZD" + - "T,M9.5.0,M4.1.0/3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x1c\x00Pacific/Guad" + - "alcanalUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00\x00\x11\x00\x1c\x00Pacific/EnderburyUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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~7Ud\x00\x00\x00\x00\x12V\x04\xc0\x00\x00\x00\x00/" + - "\x059\xb0\x01\x02\x03\xff\xff_\x9c\x00\x00\xff\xffW@\x00\x04\xff\xffeP\x00\b\x00\x00\xb6\xd0\x00\fLMT\x00-12\x00-11\x00+13\x00\n<+13>-13\nPK\x03\x04" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x1c\x00Pacific/TahitiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x94PU\xb8\x01\xff\xffs\xc8\x00\x00\xff\xff" + - "s`\x00\x04LMT\x00-10\x00\n<-10>10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/J" + - "ohnstonUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\b\xa8\x01\x00\x00\xacX\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00" + + "+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x1c\x00Pacific/FijiUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\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\x00MrA\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\x00Z" + + "Z\x10\xe0\x00\x00\x00\x00[ݩ\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<" + + "+13>,M11.2.0,M1.2.3/99\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xe9\xdd\x1e\xee\f\x01\x00\x00\f\x01\x00\x00\f\x00\x1c\x00Pacific" + + "/ApiaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x00" + + "N\xfd\x8b\xa0\x00\x00\x00\x00Ow\r\xe0\x01\x02\x04\x03\x04\x03\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<+14>,M9.5.0/3,M4.1.0/4" + + "\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\v\x00\x1c\x00Pacific/YapUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&" + + "\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~" + + "\x90\x00\bLMT\x00+10\x00+09\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x1c\x00Pacif" + + "ic/Port_MoresbyUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x00PM" + + "MT\x00+10\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/Honol" + + "uluUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x1c\x00Pacific/PohnpeiUT\t" + + "\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x10" + + "\xff\xff\xff\xff\x14\xe1\xb9,\xff\xff\xff\xff~6 \xac\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\x01\x02\x03\x02" + + "\x04\x03\x02\xff\xffB\xd4\x00\x00\x00\x00\x94T\x00\x00\x00\x00\x9a\xb0\x00\x04\x00\x00~\x90\x00\b\x00\x00\x8c\xa0\x00\fLMT\x00+11\x00+09\x00+10\x00\n<+11>-11\nP" + + "K\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x1c\x00Pacific/GambierUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00" + + "\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xe2;Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x1c\x00Pacifi" + + "c/NauruUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x1c\x00Pacific/Majuro" + - "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~6\x14\x80\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\xcf=Gp\xff\xff\xff\xff\xff\x86\x1bP\x01" + - "\x02\x01\x03\x02\x01\x04\x00\x00\xa0\x80\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<+1" + - "2>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x1c\x00Pacific/MidwayUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x85v" + - "\xf8\x8c\x87\x01\x00\x00\x87\x01\x00\x00\x11\x00\x1c\x00Pacific/RarotongaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff~7J\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\xc8" + - "w\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\x03\x02\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x1c\x00" + - "Pacific/GuamUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xef" + - "6\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\x10" + - "LMT\x00GST\x00+09\x00GDT\x00ChST\x00\nChST-10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x1c\x00" + - "Pacific/TongatapuUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6\a\xb8\xff\xff\xff\xff\xc9sB\x90\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-13\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v" + - "\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x1c\x00Pacific/HonoluluUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcb" + - "\x89=\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\xff" + - "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92" + - "\x00\x00\x00\r\x00\x1c\x00Pacific/SamoaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\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\n\x00\x00\x00\x00\x00\xf1c9R\x97n7\x1a\xf2\x00\x00\x00" + + "\xf2\x00\x00\x00\x0e\x00\x1c\x00Pacific/KosraeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xffGL\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\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x85v\xf8\x8c\x87\x01\x00\x00\x87\x01\x00\x00\x11\x00\x1c\x00Pacific/RarotongaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1b\x00\x00\x00\x04\x00\x00\x00\x14\xff\xff\xff\xff~7J\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\x03\x02\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\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\n\x00\x00\x00\x00\x00\xf1c9RD6\x83\xa1\x8b\x00\x00\x00" + + "\x8b\x00\x00\x00\x11\x00\x1c\x00Pacific/MarquesasUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x1c\x00Pacific/TarawaUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xcc\xf39a\xc3\x00\x00\x00" + + "\xc3\x00\x00\x00\f\x00\x1c\x00Pacific/TrukUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x04L" + - "MT\x00SST\x00\nSST11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe2;Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x1c\x00Pacific/NauruUT\t" + - "\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x0e" + - "LMT\x00+1130\x00+09\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x1c\x00Pa" + - "cific/FijiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\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\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\x00MrA\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[ݩ\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<+13>,M11.2.0,M1.2.3/99\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe9\xdd\x1e\xee\f\x01\x00\x00\f" + - "\x01\x00\x00\f\x00\x1c\x00Pacific/ApiaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\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\x01\x02\x04\x03\x04\x03\x06\x05\x00\x00\xb0\x80\x00\x00\xff\xff_\x00\x00\x00\xff\xff^H\x00\x04\xff\xffs`\x01\n\xff\xff" + - "eP\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<+14>,M9." + - "5.0/3,M4.1.0/4\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x1c\x00Pacific/Kiritim" + - "atiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x1c\x00Pacif" + - "ic/WakeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x18\xcc\x01\x00\x00\x9c4\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\nPK\x03\x04\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x1c\x00Pacific/KwajaleinUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2" + - "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQFI\xfe" + - "\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x1c\x00Pacific/SaipanUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\f\xff\xff\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9" + + "\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10>-" + + "10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x81\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x1c\x00Pacific/NiueUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00" + + "\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x14\xff\xff\xff\xff~7TL\xff\xff\xff\xff" + + "\xdcC5`\x00\x00\x00\x00\x10t\xca8\x01\x02\x03\xff\xff`\xb4\x00\x00\xff\xff`\xa0\x00\x04\xff\xff^H\x00\n\xff\xffeP\x00\x10LMT\x00-1120\x00-1130\x00-11\x00\n" + + "<-11>11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x1c\x00Pacific/SamoaUT\t\x00\x03\x15\xac\x0e`" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RF" + + "I\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x1c\x00Pacific/GuamUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQD" + - "6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x1c\x00Pacific/MarquesasUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x1c\x00Pacific/Gal" + - "apagosUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x1c\x00P" + - "acific/EfateUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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$+\u007f@\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\b" + - "LMT\x00+12\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x1c\x00PolandUT" + - "\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xe1\xa5" + - "\x80\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#\xf0\xff\xff\xff\xffӋ{\x80\xff\xff\xff\xff\xd4B\xad\xf0\xff\xff\xff\xff\xd5" + - "E\"\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\n\x00\x00\x00\x00\x00T\x8a\x9eQŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x1c\x00PST8P" + - "DTUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\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\x00PST\x00PWT\x00PPT\x00\nPS" + - "T8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x1c\x00ROCUT\t\x00\x03`" + - "\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x1c\x00ROKUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\x8f" + - "p\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\x0fR" + - "x\xff\xff\xff\xff\xea\xc7\xd6h\xff\xff\xff\xff\xeb\xef4x\xff\xff\xff\xff째h\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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x1c\x00SingaporeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xf5\b\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x1c\x00TurkeyUT\t\x00\x03`\xa8\xec_`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01" + - "\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UCTUT\t\x00\x03`\xa8\xec_`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" + - "\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00UT" + - "C\x00\nUTC0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00UniversalUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x1c\x00US/UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x1c\x00US/PacificUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xfe" + - "t\\\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\x12" + - "Q\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\u007f\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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x1c\x00US/HawaiiUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xcb" + - "\x89=\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\xff" + - "zh\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x9aG\xc8\xd0\x06\x00\x00\xd0" + - "\x06\x00\x00\n\x00\x1c\x00US/EasternUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`" + - "\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\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x1c\x00US/CentralUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZi" + + "\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\n\x00\x00\x00\x00\x00\xf1c9RF" + + "I\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x1c\x00Pacific/SaipanUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\u007f\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\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\n\x00\x00\x00\x00\x00T\x8a\x9eQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x1c\x00US/ArizonaUT\t\x00\x03`\xa8\xec_" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00" + - "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x1c\x00US/East-Ind" + - "ianaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xdd" + - "\xa9\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\x00E" + - "DC`\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\n" + - "EST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x1c\x00US/Indi" + - "ana-StarkeUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xe1" + - "p\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\x00CW" + - "T\x00CPT\x00EST\x00\nCST6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00" + - "\b\x00\x1c\x00US/SamoaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n" + - "SST11\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x1c\x00US/MountainUT\t\x00\x03`\xa8\xec_`\xa8\xec_" + + "\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\n\x00\x00\x00\x00\x00\xf1c9" + + "R\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x1c\x00Pacific/GalapagosUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00" + + "\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x1c\x00Pacific/BougainvilleUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`" + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + - "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ5\x11Q\x06\xd1\x03\x00\x00\xd1" + - "\x03\x00\x00\t\x00\x1c\x00US/AlaskaUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x04" + - "aC\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\x12" + - "y\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\x00A" + - "ST\x00AWT\x00APT\x00AHST\x00AHDT\x00YST\x00AKDT\x00AKST\x00\nAKST9AKDT,M3.2.0,M11.1.0" + - "\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x1c\x00US/MichiganUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00" + - "\x00TZif2\x00\x00\x00\x00\x00\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\u007f`\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\nEST5EDT,M3.2.0" + - ",M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x1c\x00US/AleutianUT\t\x00\x03`\xa8\xec_`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + - "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\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\x00HD" + - "T\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UTC" + - "UT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00T\x8a\x9eQ2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x1c\x00WETUT\t\x00\x03`\xa8\xec" + - "_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + - "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\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\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`\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\x15L" + - "MT\x00MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f." + - "\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x1c\x00ZuluUT\t\x00\x03`\xa8\xec_`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R߃\xa0_\x86\x00\x00\x00\x86\x00" + + "\x00\x00\f\x00\x1c\x00Pacific/WakeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x00\x00\x00\x00Africa/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81A\x00\x00\x00Africa/FreetownUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\f\x01\x00\x00Africa/KinshasaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\x02\x00\x00Africa/LagosUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\x03\x00\x00Africa/J" + - "ohannesburgUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83" + - "\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\x04\x00\x00Africa/BujumburaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\x04\x00\x00Africa/Kigali" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81\xa5\x05\x00\x00Africa/ConakryUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o\x06\x00\x00Africa/El_AaiunUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\xadD\xef\xca\x01\x00\x00\xca\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde\r\x00\x00A" + - "frica/KhartoumUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f\x1b\xeb\xdd2\x02" + - "\x00\x002\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\x0f\x00\x00Africa/CeutaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x12\x00\x00Africa/TunisUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81p\x14\x00\x00Africa/BrazzavilleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQd\x01\x05\x89\u007f\a\x00\x00\u007f\a\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x15\x00\x00Africa/CasablancaUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:" + - "\x1d\x00\x00Africa/MbabaneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ6\x99r" + - "U\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81@\x1e\x00\x00Africa/MonroviaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\x1f\x00\x00Africa/N" + - "iameyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81( \x00\x00Africa/DakarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0 \x00\x00Africa/TripoliUT\x05\x00\x03`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7\"\x00" + - "\x00Africa/NdjamenaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c" + - "\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd0#\x00\x00Africa/DoualaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcb$\x00\x00Africa/Algi" + - "ersUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9&\x00\x00Africa/DjiboutiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQ\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1'\x00\x00Africa/Sao_TomeUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7" + - "(\x00\x00Africa/AbidjanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0" + - "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1)\x00\x00Africa/MaputoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{*\x00\x00Africa/Cai" + - "roUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\v\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xbd/\x00\x00Africa/LomeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x840\x00\x00Africa/BamakoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M1\x00\x00Afri" + - "ca/AsmaraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00" + - "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S2\x00\x00Africa/LibrevilleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81R3\x00\x00Africa/Blantyr" + - "eUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\x1e4\x00\x00Africa/WindhoekUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe56\x00\x00Africa/HarareUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf7\x00\x00A" + - "frica/AsmeraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00" + - "\x83\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb58\x00\x00Africa/LubumbashiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x839\x00\x00Africa/Port" + - "o-NovoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82:\x00\x00Africa/TimbuktuUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M;\x00\x00Africa/KampalaUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81T<\x00\x00Africa/NairobiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc" + - "\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[=\x00\x00Africa/MaseruUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`>\x00\x00Africa/O" + - "uagadougouUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00" + - "\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81.?\x00\x00Africa/LusakaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8?\x00\x00Africa/MogadishuU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\x01A\x00\x00Africa/GaboroneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdA\x00\x00Africa/BanjulUT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96B\x00\x00Afr" + - "ica/MalaboUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00" + - "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91C\x00\x00Africa/Addis_AbabaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9cD\x00\x00Africa/Nouak" + - "chottUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81iE\x00\x00Africa/LuandaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQ%JO\xdf\xc1\x01\x00\x00\xc1\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dF\x00\x00Africa/JubaUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81jH\x00\x00A" + - "frica/AccraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf" + - "\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81lK\x00\x00Africa/Dar_es_SalaamUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81yL\x00\x00Africa/Bi" + - "ssauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81UM\x00\x00Africa/BanguiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAPN\x00\x00America/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe3\xc9I\xd0U\x03\x00\x00U\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92N\x00\x00Ameri" + - "ca/Grand_TurkUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00" + - "\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813R\x00\x00America/St_VincentUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01S\x00\x00America/S" + - "t_KittsUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\b\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdS\x00\x00America/BarbadosUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8f\x19Ԇ\x12\x02\x00\x00\x12\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfeT\x00\x00America/Bahia_Ban" + - "derasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`W\x00\x00America/NuukUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wY\x00\x00America/Costa_RicaUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\xabZ\x00\x00America/ManausUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc1" + - "Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\\\x00\x00America/WhitehorseUT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0`\x00\x00Ame" + - "rica/CayenneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00" + - "\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc0a\x00\x00America/MarigotUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8bb\x00\x00America/Ranki" + - "n_InletUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8de\x00\x00America/Punta_ArenasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94j\x00\x00America/Grena" + - "daUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81_k\x00\x00America/MenomineeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\x15\xc8\xcb\x00\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?o\x00\x00America/GuyanaUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813" + - "p\x00\x00America/Buenos_AiresUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Es\x00\x00America/Port_of_SpainUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\x16t\x00\x00America/MonctonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe9" + - "\x8c\xb4$q\x03\x00\x00q\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814z\x00\x00America/Thunder_BayUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaaʂA\xcd\x00\x00\x00\xcd\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2}\x00\x00Am" + - "erica/Blanc-SablonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ8\xcd" + - "Z\x05o\x01\x00\x00o\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\u007f\x00\x00America/MazatlanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƀ\x00\x00Americ" + - "a/CaymanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00" + - "\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\x81\x00\x00America/DawsonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\x85\x00\x00America/TortolaUT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xbb\x86\x00\x00America/ThuleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\xf7\xe9 y\xbd\x02\x00\x00\xbd\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ɉ\x00\x00America/InuvikUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\u038b\x00\x00Americ" + - "a/North_Dakota/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQR\x1b\x8b(\xde" + - "\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\x8c\x00\x00America/North_Dakota/New_SalemUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81S\x90\x00\x00America/North_Dakota/CenterUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7.\xb6*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x86\x94\x00\x00America/North_Dako" + - "ta/BeulahUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b\vKdC\x03\x00\x00C\x03\x00" + - "\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\x98\x00\x00America/Rainy_RiverUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~\x9c\x00\x00America/Atik" + - "okanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\x9d\x00\x00America/Boa_VistaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\x9f\x00\x00America/MartiniqueU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\x9f\xa0\x00\x00America/AdakUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QU9#\xbe2\x05\x00\x002\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xa4\x00\x00America/VancouverUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\xaa\x00\x00Am" + - "erica/Porto_AcreUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x9aG\xc8" + - "\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\xac\x00\x00America/New_YorkUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\xb3\x00\x00America/" + - "RecifeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_\xb5\x00\x00America/AsuncionUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\xb9\x00\x00America/Port-au-Pr" + - "inceUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ挋\x92\xf6\x01\x00\x00\xf6\x01\x00\x00\x0e\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\xbb\x00\x00America/MaceioUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQ.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\xbd\x00\x00America/BoiseUT\x05\x00\x03`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQJtZ\x8c\x01\x03\x00\x00\x01\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xc2\x00" + - "\x00America/PangnirtungUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\xc5\x00\x00America/GodthabUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\xc7\x00\x00Ameri" + - "ca/NassauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00" + - "\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xcb\x00\x00America/RosarioUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\xce\x00\x00America/St_Barth" + - "elemyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\xcf\x00\x00America/PhoenixUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x04,2h\x99\x01\x00\x00\x99\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3\xd0\x00\x00America/SantaremUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xa6\xd2\x00\x00America/MetlakatlaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xd5\x00\x00America/AraguainaUT\x05\x00\x03`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe0\xd7\x00" + - "\x00America/DenverUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4" + - "\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\xdc\x00\x00America/CordobaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?\xc9\x1c\xd4\xc6\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81G\xdf\x00\x00America/Ju" + - "neauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xe3\x00\x00America/OjinagaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xe5\x00\x00America/ScoresbysundU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xaf\xe7\x00\x00America/JujuyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xea\x00\x00America/EnsenadaUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xee\x00\x00Am" + - "erica/TorontoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQn\xab\xd5\xf9\xcf\x03\x00" + - "\x00\xcf\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1\xf5\x00\x00America/NomeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06\xfa\x00\x00America/Cambrid" + - "ge_BayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xfd\x00\x00America/CrestonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQq\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\xfe\x00\x00America/Puerto_Rico" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81:\xff\x00\x00America/CatamarcaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\x02\x01\x00America/Coral_HarbourUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x10\x00\xedAx\x03\x01\x00America/Argentina/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\x03\x01\x00America/Argentina/SaltaU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xc7\x06\x01\x00America/Argentina/Buenos_AiresUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3\t\x01\x00America/Arg" + - "entina/UshuaiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfcz=\xe1\xcd\x02" + - "\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfa\f\x01\x00America/Argentina/San_JuanUT\x05\x00\x03`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b\x10\x01\x00" + - "America/Argentina/La_RiojaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x13\x01\x00America/Argentina/San_Lu" + - "isUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81]\x16\x01\x00America/Argentina/Rio_GallegosUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\x19\x01\x00America/" + - "Argentina/CordobaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQutZ" + - "\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\x1c\x01\x00America/Argentina/JujuyUT\x05\x00\x03`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\x1f\x01\x00" + - "America/Argentina/CatamarcaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\"\x01\x00America/Argentina/Comod" + - "RivadaviaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00" + - "\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca%\x01\x00America/Argentina/MendozaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQY\xd8֭\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe1(\x01\x00Americ" + - "a/Argentina/TucumanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x89" + - "غ\xee\x15\x04\x00\x00\x15\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n,\x01\x00America/BelizeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81{\xc1\x92\xbc\x03\x00\x00\xbc\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g0\x01\x00America" + - "/SitkaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j4\x01\x00America/YellowknifeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x907\x01\x00America/Indiana" + - "/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\xda7\x01\x00America/Indiana/VevayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9a9\x01\x00America/Indiana/Vi" + - "ncennesUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQM/U\x9f7\x02\x00\x007\x02\x00\x00\x17" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b<\x01\x00America/Indiana/MarengoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQK-E\xfad\x02\x00\x00d\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3>\x01\x00America/In" + - "diana/WinamacUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00" + - "\x00\xf8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81XA\x01\x00America/Indiana/KnoxUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9eE\x01\x00America" + - "/Indiana/IndianapolisUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QصK\xa6\n\x02\x00\x00\n\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\aH\x01\x00America/Indiana/Tell_CityUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x01\xd8N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81dJ\x01\x00America/Indiana/PetersburgUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81cM\x01\x00America/FortalezaU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\x92O\x01\x00America/AnchorageUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaeS\x01\x00America/DanmarkshavnUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xbbU\x01\x00America/ReginaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "g\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81X\x01\x00America/AntiguaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81LY\x01\x00Ameri" + - "ca/Porto_VelhoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1e\xfbn۸\x03" + - "\x00\x00\xb8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#[\x01\x00America/Campo_GrandeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)_\x01\x00Americ" + - "a/DominicaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02" + - "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5_\x01\x00America/Fort_WayneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Tb\x01\x00America/Rio_" + - "BrancoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Bd\x01\x00America/TegucigalpaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Qe\x01\x00America/Mexico_" + - "CityUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x0f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:g\x01\x00America/TijuanaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84k\x01\x00America/CancunUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1c\xd8\x19\x9dp\x01\x00\x00p\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdd" + - "m\x01\x00America/Swift_CurrentUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9co\x01\x00America/CuiabaUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8as\x01\x00Am" + - "erica/MendozaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ~\xb2\x0e\x19V\a\x00" + - "\x00V\a\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x97v\x01\x00America/St_JohnsUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQo_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x817~\x01\x00America/Mer" + - "idaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xfe\xf3%\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\u007f\x01\x00America/ResoluteUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\x82\x01\x00America/ArubaUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\x83" + - "\x01\x00America/HalifaxUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQԾ\xe7" + - "#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[\x8a\x01\x00America/PanamaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818\x8b\x01\x00America/A" + - "nguillaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x04\x8c\x01\x00America/ChicagoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x93\x01\x00America/JamaicaUT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81Ô\x01\x00America/IndianapolisUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\x97\x01\x00America/CaracasUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\x98" + - "\x01\x00America/LimaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQB\xa0=:\x1e\x01" + - "\x00\x00\x1e\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\x99\x01\x00America/HermosilloUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x85-\xb9\xf8\x8a\x01\x00\x00\x8a\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\x9a\x01\x00America/" + - "BelemUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQM\x94\xc7Kp\x03\x00\x00p\x03\x00\x00\x11\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ǜ\x01\x00America/Glace_BayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xa0\x01\x00America/Guadeloupe" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81P\xa1\x01\x00America/ShiprockUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xa5\x01\x00America/MatamorosUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6@\rm\xa8\x05\x00\x00\xa8\x05\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac" + - "\xa7\x01\x00America/Fort_NelsonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQOKjǪ\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\xad\x01\x00America/BahiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\xb0\x01\x00Ameri" + - "ca/Goose_BayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00" + - "\x97\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\xb7\x01\x00America/KralendijkUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xec\xb7\x01\x00America/Sa" + - "nta_IsabelUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02" + - "\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xbc\x01\x00America/IqaluitUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81h\xbf\x01\x00America/Edmonto" + - "nUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81|\xc3\x01\x00America/BogotaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\xc4\x01\x00America/GuatemalaUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96\xc5" + - "\x01\x00America/DetroitUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\x1b\xce" + - "RC\x03\x00\x00C\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b\xc9\x01\x00America/NipigonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\xcc\x01\x00America/" + - "MontserratUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7\b\\\xc6&\x02\x00\x00&\x02" + - "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbc\xcd\x01\x00America/MiquelonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,\xd0\x01\x00America/Sao_Pa" + - "uloUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x10\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\xd4\x01\x00America/SantiagoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xd9\x01\x00America/Knox_INUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xad`\x12\xe9\xaa\x00\x00\x00\xaa\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xbc\xdd\x01\x00America/La_PazUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19v" + - "v\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xae\xde\x01\x00America/Lower_PrincesUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x94\xdf\x01\x00A" + - "merica/ChihuahuaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?_p\x99" + - "\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\xe1\x01\x00America/WinnipegUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b\xe6\x01\x00America/" + - "ParamariboUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00" + - "\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\xe7\x01\x00America/GuayaquilUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\xe8\x01\x00America/St_Th" + - "omasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\xe9\x01\x00America/MontevideoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\xed\x01\x00America/St_LuciaUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81>\xee\x01\x00America/YakutatUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\xf2\x01\x00America/AtkaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81H\xf6\x01\x00Ameri" + - "ca/El_SalvadorUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7-2f\xe4\x01" + - "\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xf7\x01\x00America/NoronhaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81r\xf9\x01\x00America/Man" + - "aguaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xfa\x01\x00America/Los_AngelesUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\x00\x02\x00America/EirunepeU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ+\x10`ȫ\x02\x00\x00\xab\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81;\x02\x02\x00America/Dawson_CreekUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814\x05\x02\x00America/LouisvilleUT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81Z\n\x02\x00America/CuracaoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\v\x02\x00America/MonterreyUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xaa\f\x02\x00A" + - "merica/Kentucky/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03\x1a|J" + - "\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5\f\x02\x00America/Kentucky/MonticelloUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16" + - "\x11\x02\x00America/Kentucky/LouisvilleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\x16\x02\x00America/HavanaUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xea\x1a\x02\x00America/MontrealUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "g\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9!\x02\x00America/VirginUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb3\"\x02\x00Americ" + - "a/Santo_DomingoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA?$\x02\x00Antarctica/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84$\x02\x00Antarctica/Dum" + - "ontDUrvilleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\r\x0e\xf20\x85\x00\x00\x00\x85" + - "\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o%\x02\x00Antarctica/SyowaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>&\x02\x00Antarctica/Da" + - "visUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95{\xf3\xa9w\x03\x00\x00w\x03\x00\x00\x11\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81M'\x02\x00Antarctica/PalmerUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0f+\x02\x00Antarctica/MawsonUT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xf2+\x02\x00Antarctica/RotheraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2,\x02\x00Antarctica/VostokUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92-" + - "\x02\x00Antarctica/South_PoleUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf41\x02\x00Antarctica/TrollUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef2\x02\x00A" + - "ntarctica/CaseyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\x84J]\xd0" + - "\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,4\x02\x00Antarctica/MacquarieUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81J8\x02\x00Antar" + - "ctica/McMurdoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xa9<\x02\x00Arctic/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea<\x02\x00Arctic/LongyearbyenU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x10\x00\xedA\xdb?\x02\x00Asia/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\t\xfa-\a\x03" + - "\x00\x00\a\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a@\x02\x00Asia/Hong_KongUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81iC\x02\x00Asia/MuscatU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x813D\x02\x00Asia/TaipeiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81wF\x02\x00Asia/QatarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81SG\x02\x00Asia/Nicos" + - "iaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xeeI\x02\x00Asia/GazaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeeN\x02\x00Asia/BarnaulUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQw\rD\an\x01\x00\x00n\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%R\x02\x00Asia/Sa" + - "markandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdbS\x02\x00Asia/BakuUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06W\x02\x00Asia/TbilisiUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1Y\x02\x00As" + - "ia/RiyadhUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQʇ{_\xbb\x00\x00\x00\xbb\x00\x00" + - "\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8bZ\x02\x00Asia/RangoonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c[\x02\x00Asia/YakutskUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb7" + - "^\x02\x00Asia/IstanbulUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd5ΜG" + - "p\x02\x00\x00p\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaec\x02\x00Asia/QyzylordaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ff\x02\x00Asia/Khand" + - "ygaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4i\x02\x00Asia/KathmanduUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9dj\x02\x00Asia/ChongqingUT\x05\x00\x03`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81nl\x02" + - "\x00Asia/Ho_Chi_MinhUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ0]*" + - "\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4m\x02\x00Asia/BishkekUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Tp\x02\x00Asia/Qostan" + - "ayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x02s\x02\x00Asia/KabulUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5s\x02\x00Asia/TomskUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1aw\x02\x00Asia/Mac" + - "auUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81uz\x02\x00Asia/Ust-NeraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf}\x02\x00Asia/YerevanUT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ɀ\x02\x00Asi" + - "a/VientianeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQd%\x05\xd8\xe6\x02\x00\x00\xe6" + - "\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9\x81\x02\x00Asia/VladivostokUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ل\x02\x00Asia/BeirutUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xfa\x87\x02\x00Asia/DaccaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\xea" + - "\x18\xd4\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\x89\x02\x00Asia/YekaterinburgUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ6j\\J\xcf\x04\x00\x00\xcf\x04\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x8c\x02\x00Asia" + - "/HebronUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}\x91\x02\x00Asia/ThimphuUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\x92\x02\x00Asia/ThimbuUT\x05\x00\x03`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x93\x02\x00" + - "Asia/SakhalinUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81z&\x80k\x02\x00" + - "\x00k\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\x96\x02\x00Asia/ChoibalsanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*\x99\x02\x00Asia/SeoulUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\r\x9b\x02\x00Asia/MakassarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x12\x9c\x02\x00Asia/DubaiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQS\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ۜ\x02\x00Asia/Alma" + - "tyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x81\x9f\x02\x00Asia/Ulan_BatorUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1c\xa2\x02\x00Asia/SaigonUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xa3\x02\x00As" + - "ia/DhakaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ.>[K\xab\x00\x00\x00\xab\x00\x00\x00" + - "\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81x\xa4\x02\x00Asia/JayapuraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a\xc1\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xa5\x02\x00Asia/PyongyangUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ恸\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81i\xa6\x02\x00Asia/Kuala_LumpurUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xa7\x02\x00Asia/ChungkingUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xa9\x02\x00Asia" + - "/AqtobeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x811\xac\x02\x00Asia/ChitaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81c\xaf\x02\x00Asia/ColomboUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xb0\x02\x00A" + - "sia/MacaoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa4Zߐ\xe6\x02\x00\x00\xe6\x02\x00" + - "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xb3\x02\x00Asia/SrednekolymskUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\xb7\x02\x00Asia/BaghdadU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQe\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xe9\xb9\x02\x00Asia/AshgabatUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\xf0\x9cf>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xbb\x02\x00Asia/KamchatkaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xdav\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ƾ\x02\x00Asia" + - "/BahrainUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00" + - "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xbf\x02\x00Asia/BangkokUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xc0\x02\x00Asia/KarachiUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xc1" + - "\x02\x00Asia/TashkentUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85" + - "\x00\x00\x00\x85\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\xc3\x02\x00Asia/AdenUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\xc4\x02\x00Asia/OmskUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w" + - "\xc7\x02\x00Asia/Phnom_PenhUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17\xe2" + - "\x9c\xb32\x04\x00\x002\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\xc8\x02\x00Asia/JerusalemUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xcc\x02\x00Asia/Mag" + - "adanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xd0\x02\x00Asia/JakartaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xd1\x02\x00Asia/NovokuznetskUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f" + - "\xd4\x02\x00Asia/OralUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ)p\x1cX\xf1\x02\x00\x00" + - "\xf1\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a\xd7\x02\x00Asia/NovosibirskUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\xda\x02\x00Asia/Damascu" + - "sUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\xb3\xde\x02\x00Asia/Ujung_PandangUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd\xdf\x02\x00Asia/FamagustaUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1" + - "\xe3\x02\x00Asia/YangonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xceG|\xea\x13\x03" + - "\x00\x00\x13\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\xe4\x02\x00Asia/AmmanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\b\xe8\x02\x00Asia/TokyoUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "!\xe9\x02\x00Asia/AnadyrUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ;\u007fP\x8d\xd4" + - "\a\x00\x00\xd4\a\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81M\xec\x02\x00Asia/TehranUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xf4\x02\x00Asia/Singapore" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQy\x19\xe0N\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81\xae\xf5\x02\x00Asia/BruneiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8d\xf6\x02\x00Asia/UrumqiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\xf7\x02\x00Asia/Dil" + - "iUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQe\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81D\xf8\x02\x00Asia/AshkhabadUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\xfa\x02\x00Asia/KrasnoyarskUT\x05\x00\x03`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x812\xfd\x02" + - "\x00Asia/AtyrauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQT\x81\x18G^\x02\x00\x00" + - "^\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdf\xff\x02\x00Asia/AqtauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x81\x02\x03\x00Asia/HarbinUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O" + - "\x04\x03\x00Asia/KuwaitUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\x1a\xdc\xca\xdc\x00" + - "\x00\x00\xdc\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\x05\x03\x00Asia/CalcuttaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81<\x06\x03\x00Asia/ManilaUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81o\a\x03\x00Asia/DushanbeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\t\x03\x00Asia/Tel_AvivUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\r\x03\x00Asia/U" + - "laanbaatarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02" + - "\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\x10\x03\x00Asia/IrkutskUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81w\x13\x03\x00Asia/ShanghaiUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81G\x15\x03\x00Asia/KatmanduUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xba\xa3" + - "b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\x16\x03\x00Asia/HovdUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\x18\x03\x00Asia/KolkataU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81\xe6\x19\x03\x00Asia/KashgarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "QS\xa5\x81e\xf7\x00\x00\x00\xf7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb1\x1a\x03\x00Asia/PontianakUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\x1b\x03\x00Asia/" + - "KuchingUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAv\x1d\x03\x00Atlantic/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\u0097N\xad\xaf\x00\x00\x00\xaf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb9\x1d\x03\x00Atlantic/Cape_VerdeUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\xb5\x1e\x03\x00Atlantic/FaroeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5" + - "\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6 \x03\x00Atlantic/Jan_MayenUT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6#\x03\x00Atl" + - "antic/ReykjavikUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xaf|7\xb3\xde" + - "\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe3&\x03\x00Atlantic/CanaryUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\n)\x03\x00Atlantic/S" + - "t_HelenaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00" + - "\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8)\x03\x00Atlantic/MadeiraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd/\x03\x00Atlantic/South_G" + - "eorgiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x910\x03\x00Atlantic/FaeroeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe7\xcf^\xb0\x15\x03\x00\x00\x15\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x932\x03\x00Atlantic/StanleyUT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xf25\x03\x00Atlantic/AzoresUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQl&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6;\x03\x00Atlantic/BermudaUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA @\x03\x00Au" + - "stralia/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQϻ\xca\x1a2\x01\x00\x002\x01\x00\x00" + - "\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81d@\x03\x00Australia/PerthUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdfA\x03\x00Australia/LHIUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xdaD\x03\x00Australia/YancowinnaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\xbd\xca#\u007f\xad\x03\x00\x00\xad\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd5H\x03\x00Australia/Broken_HillUT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQϻ\xca\x1a2\x01\x00\x002\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81\xd1L\x03\x00Australia/WestUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81KN\x03\x00Australia/DarwinUT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u007fO\x03\x00Aus" + - "tralia/AdelaideUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa2ܺ\xca:" + - "\x01\x00\x00:\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dS\x03\x00Australia/EuclaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe7T\x03\x00Australia/" + - "MelbourneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00" + - "\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbcX\x03\x00Australia/CanberraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\\\x03\x00Australia/Bri" + - "sbaneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQo3\xdaR\xb4\x02\x00\x00\xb4\x02\x00\x00\x13\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd]\x03\x00Australia/Lord_HoweUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9b\xe1\xc1\xa9\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe`\x03\x00Australia/Victor" + - "iaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xd2d\x03\x00Australia/HobartUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQ?\x95\xbd\x12E\x01\x00\x00E\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\ai\x03\x00Australia/LindemanUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\x98j\x03\x00Australia/CurrieUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\xc8R\x1a\x1b\xea\x00\x00\x00\xea\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdn\x03\x00Australia/NorthUT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\xba\xde\xd3!\x01\x00\x00!\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00p\x03\x00Aus" + - "tralia/QueenslandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9a" + - "p\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81oq\x03\x00Australia/NSWUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>u\x03\x00Australia/" + - "ACTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\xf2\xe6Z\xeb\x03\x00\x00\xeb\x03\x00\x00\x12\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\ry\x03\x00Australia/TasmaniaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D}\x03\x00Australia/SouthUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQX\xb9\x9ap\x88\x03\x00\x00\x88\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81&\x81\x03\x00Australia/SydneyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xf8\x84\x03\x00Brazil/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQa\xcb'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x819\x85\x03\x00Brazil/West" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81\x1a\x87\x03\x00Brazil/AcreUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x01\x89\x03\x00Brazil/DeNoronhaUT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\x8b\x03\x00Bra" + - "zil/EastUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA,\x8f\x03\x00Canada/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\u0096dK~\x02\x00\x00~\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81m\x8f\x03\x00Canada/SaskatchewanUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQU9#\xbe2\x05\x00\x002\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "8\x92\x03\x00Canada/PacificUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQӿ" + - "\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb2\x97\x03\x00Canada/EasternUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\x9e\x03\x00Canada/A" + - "tlanticUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x13" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x80\xa5\x03\x00Canada/NewfoundlandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\xad\x03\x00Canada/Central" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81y\xb2\x03\x00Canada/MountainUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\xb6\x03\x00Canada/YukonUT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe6\x9aM\xbem\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05fa\x03\x00CET" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x10\x00\xedA\x81\xbd\x03\x00Chile/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ[Sp\x90" + - "\x02\x05\x00\x00\x02\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1\xbd\x03\x00Chile/ContinentalUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xc3\x03\x00Chile/E" + - "asterIslandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ<\x8b\x99\x1e\xb7\x03\x00\x00\xb7" + - "\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xc7\x03\x00CST6CDTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQ\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xcb\x03\x00CubaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ`l\x8d~\xf1\x01\x00\x00\xf1\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;\xd0\x03\x00EETUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81i\xd2\x03\x00EgyptUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05" + - "\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xd7\x03\x00EireUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQtX\xbe\xe4o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xba\xdd\x03\x00ESTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe7/\xebT\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xde\x03\x00EST5EDTUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA" + - "^\xe2\x03\x00Etc/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0\xfaFDq\x00\x00\x00q\x00\x00\x00" + - "\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c\xe2\x03\x00Etc/GMT+4UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + - "\x00\x00\x00T\x8a\x9eQ)\xb9\xbe\x9dr\x00\x00\x00r\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xe3\x03\x00Etc/GMT+11UT\x05\x00\x03`\xa8\xec_ux\v\x00" + - "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\x19\xef\x03\x00Etc/" + - "ZuluUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQJ0p-r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xef\xef\x03\x00Etc/GMT-7UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ!\xd6~wr\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\xf0\x03\x00Etc/GMT-5UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ5\xb8\xe8\x86q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\xf1\x03\x00Etc/GMT+" + - "1UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ,{\xdc;s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\r\xf2\x03\x00Etc/GMT-14UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xd9|\xbd7s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\xf2\x03\x00Etc/GMT-10UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb2\xab\xd1Is\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xf3\x03\x00Etc/GMT-1" + - "1UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x90`N\xe8s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x812\xf4\x03\x00Etc/GMT-13UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\x84+\x9a$q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\xf4\x03\x00Etc/GMT+7UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf7\x19s\x81s\x00\x00\x00s\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\xf5\x03\x00Etc/GMT-12" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81T\xf6\x03\x00Etc/GMT+0UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9c" + - "\xfcm\x99r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06\xf7\x03\x00Etc/GMT-3UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa9{\xa2qq\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\xf7\x03\x00Etc/GMT+2UT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81o\xf8\x03\x00Etc/GreenwichUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\xf9\x03\x00Etc/UniversalUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\"\xf8\x8f/q\x00\x00\x00q\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\xf9\x03\x00Etc/GMT" + - "+8UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xbc\x19y\x04r\x00\x00\x00r\x00\x00\x00\t\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\xfa\x03\x00Etc/GMT-2UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAD\xfb\x03\x00Europe/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x92\xfc\f+o\x02\x00\x00o\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x85\xfb\x03\x00Europe/Copen" + - "hagenUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x90\xa9\xf5ϕ\x02\x00\x00\x95\x02\x00\x00\x10\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\xfe\x03\x00Europe/BucharestUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQu\xb0\xcd\xfc\xf8\x02\x00\x00\xf8\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1e\x01\x04\x00Europe/UlyanovskUT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81`\x04\x04\x00Europe/NicosiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9e" + - "Q\xe6Kf\xab\xfe\x02\x00\x00\xfe\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd\x06\x04\x00Europe/BudapestUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01" + - "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D\n\x04\x00Euro" + - "pe/VaticanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01" + - "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\x0e\x04\x00Europe/MariehamnUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQWI\xc3\u007f(\x03\x00\x00(\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\x10\x04\x00Europe/MinskUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xd8\x13\x04\x00Europe/San_MarinoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQo\xbc\x831O\x04\x00\x00O\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\x17\x04\x00Europe/BrusselsUT\x05\x00\x03`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81n\x1c\x04\x00" + - "Europe/IstanbulUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde" + - "\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81g!\x04\x00Europe/BelgradeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQZk#V\x81\x03\x00\x00\x81\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8e#\x04\x00Europe/Mad" + - "ridUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81V'\x04\x00Europe/ChisinauUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQߜvυ\x01\x00\x00\x85\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92*\x04\x00Europe/AndorraUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x1b8\xfel\xd6\x02\x00\x00\xd6\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_," + - "\x04\x00Europe/SaratovUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6" + - "?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}/\x04\x00Europe/LondonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQq\x16\x9b?\xa3\x02\x00\x00\xa3\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x036\x04\x00Europe/Tall" + - "innUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf2\xfa\xcb\x130\x02\x00\x000\x02\x00\x00\x11\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee8\x04\x00Europe/ZaporozhyeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQVa\x92\xd3\xdf\x02\x00\x00\xdf\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i;\x04\x00Europe/VolgogradUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\xb4\x9e\xe7\xb3\x03\x00\x00\xb3\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\x92>\x04\x00Europe/RomeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQZ\x05w" + - "ג\x02\x00\x00\x92\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aB\x04\x00Europe/ViennaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQN\xa5\xa5\xcb\x12\x02\x00\x00\x12\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81cE\x04\x00Europe/Uzh" + - "gorodUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\r\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbeG\x04\x00Europe/MoscowUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQ8I\xdeN%\x02\x00\x00%\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91K\x04\x00Europe/KievUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfbM\x04\x00E" + - "urope/PragueUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00" + - "\xde\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15Q\x04\x00Europe/ZagrebUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQh\xa5J[\xa0\x03\x00\x00\xa0\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:S\x04\x00Europe/MaltaUT\x05" + - "\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQI\xb8\xbc\xd3\xf3\x02\x00\x00\xf3\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + - "\x00\xa4\x81 W\x04\x00Europe/TiraspolUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a" + - "\x9eQO+j\x94\x88\x03\x00\x00\x88\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\Z\x04\x00Europe/KaliningradUT\x05\x00\x03`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd9L\xf6\xf7\xf1\x01\x00\x00\xf1\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x810^\x04\x00" + - "Europe/StockholmUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1" + - "\xde\x01\x00\x00\xde\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81k`\x04\x00Europe/SkopjeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe5\xc8X\xa7\xe1\x01\x00\x00\xe1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90b\x04\x00Europe/Hels" + - "inkiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xccb\xf72\xa4\x02\x00\x00\xa4\x02\x00\x00\x0e\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbad\x04\x00Europe/VilniusUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6g\x04\x00Europe/BelfastUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQIo\x11{\xd3\x02\x00\x00\xd3\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-n" + - "\x04\x00Europe/BratislavaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk" + - "\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Kq\x04\x00Europe/JerseyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQgp\xc0\xa7\xb6\x02\x00\x00\xb6\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd1w\x04\x00Europe/R" + - "igaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\r\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xccz\x04\x00Europe/LisbonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\x80\x04\x00Europe/BusingenUT\x05\x00\x03`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\x82\x04" + - "\x00Europe/PodgoricaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc9\a\xa0" + - "\xe1/\x04\x00\x00/\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x11\x85\x04\x00Europe/AmsterdamUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17S\x91\xb3\xc1\x02\x00\x00\xc1\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8a\x89\x04\x00Europe/" + - "BerlinUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\r\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x92\x8c\x04\x00Europe/ZurichUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ʎ\x04\x00Europe/SarajevoUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8c\xc8\x15\xd0P\x02\x00\x00P\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xf1\x90\x04\x00Europe/SofiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xa5\x97\a\xc4" + - "\xa4\x02\x00\x00\xa4\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\x93\x04\x00Europe/OsloUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + - "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x96\x04\x00Europe/Ljublj" + - "anaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x0f\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98\x98\x04\x00Europe/GuernseyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQDd#\xc4\xf1\x01\x00\x00\xf1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81 \x9f\x04\x00Europe/VaduzUT\x05\x00\x03`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\xa1\x04\x00" + - "Europe/Isle_of_ManUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\xfe" + - "垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\xa7\x04\x00Europe/WarsawUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe0\xfe\x83\xe5\xcd\x02\x00\x00\xcd\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ī\x04\x00Europe/Ki" + - "rovUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ==\xa4\x16\xc4\x04\x00\x00\xc4\x04\x00\x00\x10\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u05ee\x04\x00Europe/GibraltarUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ]i\x11u\xd6\x02\x00\x00\xd6\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5\xb3\x04\x00Europe/AstrakhanUT\x05\x00\x03" + - "`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea\xc48\xde\\\x02\x00\x00\\\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + - "\x81\x05\xb7\x04\x00Europe/TiraneUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQn\x81" + - "\xf4\xd7Z\x04\x00\x00Z\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xb9\x04\x00Europe/MonacoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQM\xe5\xa9 ?\x04\x00\x00?\x04\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xbe\x04\x00Europe/Lu" + - "xembourgUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7\xf5\x94\xdaQ\x04\x00\x00Q\x04\x00\x00" + - "\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd3\xc2\x04\x00Europe/ParisUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcb*j\x8f\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xc7\x04\x00Europe/AthensUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQz\xc3\xe8Ra\x03\x00\x00a\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[" + - "\xca\x04\x00Europe/SimferopolUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "\x9a\v\xf9/\xd8\x05\x00\x00\xd8\x05\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xce\x04\x00Europe/DublinUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x95\u007fpp\xdc\x02\x00\x00\xdc\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81&\xd4\x04\x00Europe/" + - "SamaraUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xab\x80c$q\x00\x00\x00q\x00\x00\x00\a\x00" + - "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81I\xd7\x04\x00FactoryUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xd7\x04\x00GBUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\xde\x04\x00GB-EireUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\xe4" + - "\x04\x00GMTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\xe5\x04\x00GMT+0UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ" + - "P\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xe6\x04\x00GMT-0UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\xe6\x04\x00GMT0UT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xab\xe7\x04\x00G" + - "reenwichUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00" + - "\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]\xe8\x04\x00HongkongUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6\xeb\x04\x00HSTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81S\xec\x04\x00IcelandUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00" + - "\xedA\x85\xef\x04\x00Indian/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00" + - "\x00\xbf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc6\xef\x04\x00Indian/AntananarivoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd2\xf0\x04\x00Indian/C" + - "omoroUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8\xf1\x04\x00Indian/ChristmasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQa\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xf2\x04\x00Indian/MaheUT\x05\x00\x03`\xa8\xec" + - "_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQͲ\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81q\xf3" + - "\x04\x00Indian/CocosUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb9\xb2Z\xac\x98\x00" + - "\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81C\xf4\x04\x00Indian/MaldivesUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + - "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$\xf5\x04\x00Indian/Kerg" + - "uelenUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3\xf5\x04\x00Indian/MauritiusUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQx\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0\xf6\x04\x00Indian/ChagosUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xcf\xf7\x04\x00Indian/MayotteUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQy(" + - "\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\xf8\x04\x00Indian/ReunionUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\xf9\x04\x00IranUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x17✳2\x04\x00\x002\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\xb5\x01\x05\x00IsraelUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ%J\xd5\xebS\x01\x00\x00" + - "S\x01\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x06\x05\x00JamaicaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\a\x05\x00JapanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcf\b\x05\x00Kwajal" + - "einUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x05\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xed\t\x05\x00LibyaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfe\x9d" + - "\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\v\x05\x00METUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x85\x0e\x05\x00Mexico/UT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc6\x0e\x05\x00Me" + - "xico/BajaSurUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd6\xe1Հ\x9c\x01\x00\x00" + - "\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81}\x10\x05\x00Mexico/GeneralUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81a\x12\x05\x00Mexico/BajaNor" + - "teUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf5\x8d\x99\x92o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\xa4\x81\xac\x16\x05\x00MSTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe6h\xcac\xb7" + - "\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\x17\x05\x00MST7MDTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + - "\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\x1b\x05\x00NavajoUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa2\x1f\x05\x00NZ" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81\xf1#\x05\x00NZ-CHATUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAZ'\x05\x00Pacific/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c'\x05\x00Pacific/WallisU" + - "T\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00" + - "\x00\x00\x00\xa4\x81j(\x05\x00Pacific/EasterUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQ\xc23\xa0\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00-\x05\x00Pacific/GambierUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcd-\x05\x00Pa" + - "cific/NiueUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00" + - "\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2.\x05\x00Pacific/YapUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + - "\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca/\x05\x00Pacific/Bougainvill" + - "eUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\xe10\x05\x00Pacific/PohnpeiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x002\x05\x00Pacific/TrukUT\x05\x00\x03`\xa8\xec_ux\v" + - "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t3\x05\x00Pa" + - "cific/TarawaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xcc\xf39a\xc3\x00\x00\x00" + - "\xc3\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd73\x05\x00Pacific/ChuukUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + - "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x80\xf8vܔ\x00\x00\x00\x94\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe14\x05\x00Pacific/PalauUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x96\xc5FF(\x03\x00\x00(\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xbc5\x05\x00Pacific/ChathamUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T" + - "\x8a\x9eQa\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-9\x05\x00Pacific/FunafutiUT\x05\x00\x03`\xa8\xec_ux" + - "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQY5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd9\x05\x00P" + - "acific/NorfolkUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\u07b54-\xd6\x00" + - "\x00\x00\xd6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=;\x05\x00Pacific/PonapeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[<\x05\x00Pacific/Pago" + - "_PagoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818=\x05\x00Pacific/FakaofoUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a>\x05\x00Pacific/NoumeaUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "(?\x05\x00Pacific/KosraeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\x0f" + - "A\x05\x99\x00\x00\x00\x99\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b@\x05\x00Pacific/PitcairnUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8" + - "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81EA\x05\x00Pacifi" + - "c/Port_MoresbyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQb\xb2\xaf\xf7\x13\x04" + - "\x00\x00\x13\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-B\x05\x00Pacific/AucklandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aF\x05\x00Pacific/Gu" + - "adalcanalUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00" + - "\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]G\x05\x00Pacific/EnderburyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + - "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81TH\x05\x00Pacific/Tahiti" + - "UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + - "\x00\x00\x00\x00\xa4\x81!I\x05\x00Pacific/JohnstonUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81HJ\x05\x00Pacific/MajuroUT\x05\x00\x03`\xa8\xec_u" + - "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81jK\x05\x00" + - "Pacific/MidwayUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x85v\xf8\x8c\x87\x01" + - "\x00\x00\x87\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81DL\x05\x00Pacific/RarotongaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16N\x05\x00Pacific/G" + - "uamUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbaO\x05\x00Pacific/TongatapuUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + - "\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2P\x05\x00Pacific/HonoluluUT\x05\x00" + - "\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + - "\xa4\x81\x19R\x05\x00Pacific/SamoaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe2" + - ";Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2R\x05\x00Pacific/NauruUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf0S\x05\x00Pacific/" + - "FijiUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe9\xdd\x1e\xee\f\x01\x00\x00\f\x01\x00\x00\f\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9U\x05\x00Pacific/ApiaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + - "\x00\x00T\x8a\x9eQ\xc8=ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+W\x05\x00Pacific/KiritimatiUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "%X\x05\x00Pacific/WakeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\xe8]*" + - "\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1X\x05\x00Pacific/KwajaleinUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17Z\x05\x00Pacific" + - "/SaipanUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQD6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11" + - "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd[\x05\x00Pacific/MarquesasUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\\\x05\x00Pacific/Galapago" + - "sUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x00\x00\xa4\x81\x8d]\x05\x00Pacific/EfateUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*_\x05\x00PolandUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + - "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05c\x05\x00PortugalUT" + - "\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00" + - "\x00\x00\xa4\x81\xe3h\x05\x00PRCUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQŭV\xad\xb7\x03\x00\x00\xb7" + - "\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9j\x05\x00PST8PDTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + - "\x00\x00\x00\x00T\x8a\x9eQ\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1n\x05\x00ROCUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00" + - "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xddp\x05\x00ROKUT\x05\x00\x03`" + - "\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + - "\xb9r\x05\x00SingaporeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\aW\x10Ѱ\x04\x00" + - "\x00\xb0\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfcs\x05\x00TurkeyUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + - "\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xecx\x05\x00UCTUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00" + - "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98y\x05\x00Universa" + - "lUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00" + - "\x00\x00\x00\x10\x00\xedAJz\x05\x00US/UT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xf6\"\x12\xfe\x0e\x05" + - "\x00\x00\x0e\x05\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87z\x05\x00US/PacificUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + - "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9\u007f\x05\x00US/HawaiiUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf9" + - "\x80\x05\x00US/EasternUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9bܩ=\xda\x06\x00" + - "\x00\xda\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\r\x88\x05\x00US/CentralUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + - "\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81+\x8f\x05\x00US/ArizonaUT\x05\x00\x03`\xa8" + - "\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_" + - "\x90\x05\x00US/East-IndianaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ$ " + - "\x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbb\x92\x05\x00US/Indiana-StarkeUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04" + - "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\x96\x05\x00US/Sa" + - "moaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x18\x00\x00" + - "\x00\x00\x00\x00\x00\x00\x00\xa4\x81җ\x05\x00US/MountainUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + - "T\x8a\x9eQ5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)\x9c\x05\x00US/AlaskaUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03" + - "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\xa0\x05\x00US/Mich" + - "iganUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x18\x00" + - "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\xa4\x05\x00US/AleutianUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + - "\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x13\xa8\x05\x00UTCUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + - "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbf\xa8\x05\x00WETUT\x05\x00\x03`\xa8\xec_" + - "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea\xaa\x05" + - "\x00W-SUUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00T\x8a\x9eQ\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x18" + - "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\xae\x05\x00ZuluUT\x05\x00\x03`\xa8\xec_ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x05\x06\x00\x00\x00\x00f\x02f\x02\x96\xc9\x00\x00a" + - "\xaf\x05\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\x18\xcc\x01\x00\x00\x9c4\x00\x00\x00\x00\xa8\xc0\x00\x04LMT\x00+12\x00\n<+12>-12\n" + + "PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9RP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x1c\x00Pacific/TongatapuUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00" + + "\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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~6\a\xb8\xff\xff" + + "\xff\xff\xc9sB\x90\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-13\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\r\x00\x1c\x00Pacific/ChuukUT\t\x00\x03" + + "\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\f\xff\xff" + + "\xff\xff\x14\xe1\xbf4\xff\xff\xff\xff~6&\xb4\xff\xff\xff\xff\x98\x11\xa3\xe0\xff\xff\xff\xff\xa09\xf9\xf0\xff\xff\xff\xff\xc9\xea\n`\xff\xff\xff\xff\xd2\x11\x0e\xf0\x01\x02\x03\x02\x03\x02\xff\xff<\xcc\x00\x00\x00\x00" + + "\x8eL\x00\x00\x00\x00\x8c\xa0\x00\x04\x00\x00~\x90\x00\bLMT\x00+10\x00+09\x00\n<+10>-10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xea\xc1\xdaυ\x00\x00\x00" + + "\x85\x00\x00\x00\x0e\x00\x1c\x00Pacific/TahitiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RY\xd2K|\x86\x00\x00\x00\x86\x00\x00\x00\x13\x00\x1c\x00Pacific/GuadalcanalUT\t\x00\x03\x15\xac\x0e" + + "`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" + + "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x94" + + "O3\x8c\x01\x00\x00\x95\xf4\x00\x00\x00\x00\x9a\xb0\x00\x04LMT\x00+11\x00\n<+11>-11\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00" + + "\x10\x00\x1c\x00Pacific/AucklandUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xb3" + + "C\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\xc1" + + "n\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\n\x00\x00\x00\x00\x00\xf1c9RY5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00\x0f\x00\x1c\x00Pacific/NorfolkUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x1c" + + "\x00PolandUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\xa4" + + "U\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#\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\n\x00\x00\x00\x00\x00\xf1c9RŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00" + + "\a\x00\x1c\x00PST8PDTUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\x15I" + + "T \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\x00PST\x00PW" + + "T\x00PPT\x00\nPST8PDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x1c\x00" + + "ROCUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x1c\x00ROKUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00" + + "\x00\x00\x00\x00\x00\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\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\n\x00\x00\x00\x00\x00\xf1c9R\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x1c\x00SingaporeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xf5\b\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\n\x00\x00\x00\x00\x00\xf1c9R\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x1c\x00TurkeyUT\t" + + "\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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'\u007f\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\x00" + + "9\xfbZp\x00\x00\x00\x00:\xbd&\xf0\x00\x00\x00\x00;\xdb\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\x00" + + "G\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\x00" + + "V>\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\x00E" + + "EST\x00EET\x00+03\x00+04\x00\n<+03>-3\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x1c\x00UCTUT" + + "\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x1c\x00UniversalUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x1c\x00US/UT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x1c\x00US/PacificUT\t\x00" + + "\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\xd2" + + "a&\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\xe6" + + "GJ\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\u007f\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\x02" + + "x\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\n\x00\x00\x00\x00\x00\xf1c9R\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x1c\x00US/CentralUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\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\nCST" + + "6CDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x1c\x00US/Michiga" + + "nUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\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\u007f`\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\x00" + + "EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x1c\x00US" + + "/AleutianUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\u007f@\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\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\x00" + + "NPT\x00BST\x00BDT\x00AHST\x00HDT\x00\nHST10HDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R" + + "$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x1c\x00US/Indiana-StarkeUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9RV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\v\x00\x1c\x00US/MountainUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\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\u007f\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\x00" + + "MPT\x00\nMST7MDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x1c\x00US" + + "/ArizonaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06" + + "\x00\x00\n\x00\x1c\x00US/EasternUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xe6" + + "G-\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\u007f\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\x8f\xd0p\x00\x00\x00\x00?\x9bb\xe0\x00\x00\x00\x00@o\xb2p\x00\x00\x00\x00A\x84\u007f`\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\n\x00\x00\x00\x00\x00\xf1c" + + "9R5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\t\x00\x1c\x00US/AlaskaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\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\nAKST9AKDT,M3." + + "2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9Rt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x1c\x00US/SamoaUT\t\x00\x03\x15\xac\x0e`\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" + + "\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9Rp\xb6" + + "{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x1c\x00US/East-IndianaUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\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\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\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\x00" + + "CDT\x00CST\x00CWT\x00CPT\x00EST\x00EDT\x00\nEST5EDT,M3.2.0,M11.1.0\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\t\x00\x1c\x00US/HawaiiUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\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\xffz" + + "h\x01\x10\xff\xffs`\x00\x04LMT\x00HST\x00HDT\x00HWT\x00HPT\x00\nHST10\nPK\x03\x04\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00" + + "\x00\x00\x03\x00\x1c\x00UTCUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\n\x00\x00\x00\x00\x00\xf1c9R2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x1c\x00WE" + + "TUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00\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#\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\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\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\x00" + + "IΫ\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\x00MMT\x00MST\x00MDST\x00MSD\x00MSK\x00+05\x00EET\x00EEST\x00\nMSK-3\nPK\x03\x04\n\x00\x00" + + "\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x04\x00\x1c\x00ZuluUT\t\x00\x03\x15\xac\x0e`\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00TZif2" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00TZif2\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\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\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x00\x00\x00\x00Africa/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81A\x00\x00\x00Africa/Nair" + + "obiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81H\x01\x00\x00Africa/FreetownUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xf1c9R\x9f\x1b\xeb\xdd2\x02\x00\x002\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x13\x02\x00\x00Africa/CeutaUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b\x04\x00\x00" + + "Africa/AsmeraUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00" + + "\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91\x05\x00\x00Africa/LuandaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x14\xcf\x10n\xca\x01\x00\x00\xca\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c\x06\x00\x00Africa/JubaUT\x05" + + "\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\x9b\b\x00\x00Africa/JohannesburgUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6\t\x00\x00Africa/BujumburaUT\x05\x00\x03\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x12tnj\xfc\x04\x00\x00\xfc\x04\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81s\n" + + "\x00\x00Africa/CairoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RV\xadD\xef\xca\x01" + + "\x00\x00\xca\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb5\x0f\x00\x00Africa/KhartoumUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc8\x11\x00\x00Africa/Mbab" + + "aneUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R)\xae\x8eo&\a\x00\x00&\a\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xce\x12\x00\x00Africa/El_AaiunUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xf1c9R6\x99rU\xa4\x00\x00\x00\xa4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81=\x1a\x00\x00Africa/MonroviaUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81*" + + "\x1b\x00\x00Africa/LusakaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87" + + "\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf4\x1b\x00\x00Africa/BamakoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd\x1c\x00\x00Africa/Niam" + + "eyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xb8\x1d\x00\x00Africa/KigaliUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xf1c9R\xca>\xd5\xe0\x95\x00\x00\x00\x95\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\x1e\x00\x00Africa/BissauUT\x05\x00\x03\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81^\x1f\x00\x00Af" + + "rica/KinshasaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00" + + "\x00\xbf\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[ \x00\x00Africa/Addis_AbabaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x93\xf4\x94\v\xc1\x01\x00\x00\xc1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f!\x00\x00Africa/Tu" + + "nisUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\r\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81m#\x00\x00Africa/BanjulUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x816$\x00\x00Africa/OuagadougouUT\x05\x00\x03\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\x04%\x00\x00Africa/LibrevilleUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03&\x00\x00Africa/BrazzavilleUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03'\x00\x00A" + + "frica/BanguiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00" + + "\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe'\x00\x00Africa/AbidjanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RÊ\x0e\xc0\xd6\x01\x00\x00\xd6\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc8(\x00\x00Africa/Algiers" + + "UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\xe6*\x00\x00Africa/NouakchottUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\xc1\n\x8a\x84\xad\x00\x00\x00\xad\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb3+\x00\x00Africa/Sao_TomeUT\x05\x00\x03\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa9," + + "\x00\x00Africa/Dar_es_SalaamUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6-\x00\x00Africa/LubumbashiUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84.\x00\x00A" + + "frica/KampalaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00" + + "\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b/\x00\x00Africa/BlantyreUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W0\x00\x00Africa/Malab" + + "oUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xaa\x81\t\x03\xa0\x00\x00\x00\xa0\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81R1\x00\x00Africa/NdjamenaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;2\x00\x00Africa/TimbuktuUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x063\x00" + + "\x00Africa/GaboroneUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rd\x01\x05\x89" + + "\u007f\a\x00\x00\u007f\a\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd23\x00\x00Africa/CasablancaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9c;\x00\x00Africa/" + + "MaputoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\f\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f<\x00\x00Africa/LagosUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xf1c9R\xcc\fTξ\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81`=\x00\x00Africa/MaseruUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81e>\x00" + + "\x00Africa/Porto-NovoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b" + + "{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81d?\x00\x00Africa/ConakryUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x1d\xb3c\xb4\x00\x00\x00\xb4\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81.@\x00\x00Africa/D" + + "oualaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x10\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81)A\x00\x00Africa/MogadishuUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x812B\x00\x00Africa/DakarUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R_\u007f2[\xaf\x01\x00\x00\xaf\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfa" + + "B\x00\x00Africa/TripoliUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R \x1b\xb0" + + "_\x83\x00\x00\x00\x83\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1D\x00\x00Africa/HarareUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbbE\x00\x00Africa/Asm" + + "araUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rm)\xb8P~\x02\x00\x00~\x02\x00\x00\x0f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc1F\x00\x00Africa/WindhoekUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xf1c9R\xee\xc4h2\xbc\x02\x00\x00\xbc\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x88I\x00\x00Africa/AccraUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8aL\x00\x00" + + "Africa/LomeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf" + + "\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81QM\x00\x00Africa/DjiboutiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAYN\x00\x00America/UT\x05\x00\x03\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x82\x13z\xe2\xc2\x00\x00\x00\xc2\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\x9bN\x00\x00America/TegucigalpaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaaO\x00\x00America/St_KittsUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rq\xc9*;\xb1\x00\x00\x00\xb1\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81vP\x00\x00A" + + "merica/Puerto_RicoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xdf\b" + + "\x9c\x9f\xe7\x00\x00\x00\xe7\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81tQ\x00\x00America/BarbadosUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa5R\x00\x00Americ" + + "a/AtikokanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00" + + "\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcfS\x00\x00America/DominicaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xac\x8a\x83S\xd4\x00\x00\x00\xd4\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9bT\x00\x00America/Guatem" + + "alaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x1e+}\x15\xb4\x02\x00\x00\xb4\x02\x00\x00\x14\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbaU\x00\x00America/Rankin_InletUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbcX\x00\x00America/TortolaUT" + + "\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R<\xb9\x18\x87\xe4\x02\x00\x00\xe4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\x87Y\x00\x00America/IqaluitUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9R\xd7\b\\\xc6&\x02\x00\x00&\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\\\x00\x00America/MiquelonUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x11Z\xde\xe4\x01\x00\x00\xe4\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81$_\x00\x00A" + + "merica/FortalezaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd6\xfe\xf3%" + + "\xb4\x02\x00\x00\xb4\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Sa\x00\x00America/ResoluteUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Qd\x00\x00America/" + + "St_ThomasUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xbf\x03u\xf3\xe4\x01\x00\x00\xe4\x01\x00" + + "\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1ee\x00\x00America/RecifeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Jg\x00\x00America/CuracaoUT" + + "\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7\x17jҲ\x00\x00\x00\xb2\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81*h\x00\x00America/MartiniqueUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R?\xc9\x1c\xd4\xc6\x03\x00\x00\xc6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81(i\x00\x00America/JuneauUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R.\xbe\x1a>\xe7\x03\x00\x00\xe7\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x816m\x00\x00" + + "America/BoiseUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xaaʂA\xcd\x00\x00" + + "\x00\xcd\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81dq\x00\x00America/Blanc-SablonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\u007f$*\xa0\xa6\x03\x00\x00\xa6\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u007fr\x00\x00America" + + "/CuiabaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf7\xe9 y\xbd\x02\x00\x00\xbd\x02\x00\x00\x0e" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81mv\x00\x00America/InuvikUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xf1c9RU!\x12f\xd9\x02\x00\x00\xd9\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ry\x00\x00America/Yellowknife" + + "UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x10\x00\xedA\x98|\x00\x00America/Indiana/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2|\x00\x00America/Indiana/KnoxUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x01\xd8N\x8c\xab\x02\x00\x00\xab\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81(\x81\x00\x00America/Indiana/PetersburgUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x1c\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81'\x84\x00\x00America/Indiana/In" + + "dianapolisUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RصK\xa6\n\x02\x00\x00\n\x02" + + "\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90\x86\x00\x00America/Indiana/Tell_CityUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R \x17\x89}q\x01\x00\x00q\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xed\x88\x00\x00Ameri" + + "ca/Indiana/VevayUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RK-E\xfa" + + "d\x02\x00\x00d\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xad\x8a\x00\x00America/Indiana/WinamacUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RM/U\x9f7\x02\x00\x007\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b\x8d\x00\x00A" + + "merica/Indiana/MarengoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\r\xedsp.\x02\x00\x00.\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea\x8f\x00\x00America/Indiana/VincennesUT\x05" + + "\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rc)\xf6)\xb3\x00\x00\x00\xb3\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81k\x92\x00\x00America/BogotaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9" + + "R.\xf9\xc0\x1e\xd5\x05\x00\x00\xd5\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\x93\x00\x00America/MonctonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x84\x99\x00\x00Amer" + + "ica/MarigotUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R挋\x92\xf6\x01\x00\x00\xf6" + + "\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81O\x9a\x00\x00America/MaceioUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8d\x9c\x00\x00America/PanamaU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa2\x81\xbfyS\x02\x00\x00S\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81j\x9d\x00\x00America/MetlakatlaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\xfe\xe6\xf5J\x05\x04\x00\x00\x05\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\xa0\x00\x00America/DawsonUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81V\xa4\x00" + + "\x00America/CatamarcaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xca" + + "g\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81e\xa7\x00\x00America/AntiguaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA0\xa8\x00\x00America" + + "/Kentucky/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04" + + "\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xa8\x00\x00America/Kentucky/LouisvilleUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x03\x1a|J\xcc\x03\x00\x00\xcc\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaa\xad\x00\x00Ame" + + "rica/Kentucky/MonticelloUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xf1c9R$\r\x89l\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81˱\x00\x00America/OjinagaUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8\xb3\x00\x00A" + + "merica/ArubaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x81{\xc1\x92\xbc\x03\x00\x00" + + "\xbc\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ִ\x00\x00America/SitkaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rѱ\x86b\xee\x03\x00\x00\xee\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ٸ\x00\x00America/NassauU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9d?\xdfڸ\x03\x00\x00\xb8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\x0f\xbd\x00\x00America/Sao_PauloUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9Rg\xf5K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x12\xc1\x00\x00America/Rio_BrancoUT\x05\x00\x03\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb1݂x\xe8\x00\x00\x00\xe8\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\x00\xc3\x00\x00America/Costa_RicaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\x1b\x81-\xa9\x8a\x01\x00\x00\x8a\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x814\xc4\x00\x00America/Porto_VelhoUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\v\xc6\x00" + + "\x00America/IndianapolisUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xb4T\xbd\xeb5\x02\x00\x005\x02\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81l\xc8\x00\x00America/Port-au-PrinceUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xea$\xc1\xbf\xb0\x00\x00\x00\xb0\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf1" + + "\xca\x00\x00America/El_SalvadorUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\xcb\x00\x00America/AdakUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R~\xb2\x0e\x19V\a\x00\x00V\a\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfd\xcf\x00\x00Americ" + + "a/St_JohnsUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RJtZ\x8c\x01\x03\x00\x00\x01\x03" + + "\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9d\xd7\x00\x00America/PangnirtungUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RU\xactA\xb5\x01\x00\x00\xb5\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeb\xda\x00\x00America/Mat" + + "amorosUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rs\xb0\xeau\xb4\x01\x00\x00\xb4\x01\x00\x00\x10\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeb\xdc\x00\x00America/EirunepeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\xde\x00\x00America/ShiprockUT" + + "\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81E\xe3\x00\x00America/GodthabUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9RU\r\xf7\xd3\xc7\x01\x00\x00\xc7\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81_\xe5\x00\x00America/ThuleUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe5s\xb3\\'\x01\x00\x00'\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81m\xe7\x00\x00Amer" + + "ica/ManaguaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RM\x94\xc7Kp\x03\x00\x00p" + + "\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdd\xe8\x00\x00America/Glace_BayUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R⚵\xfb\x9e\x00\x00\x00\x9e\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x98\xec\x00\x00America/Cres" + + "tonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RB\xa0=:\x1e\x01\x00\x00\x1e\x01\x00\x00\x12\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u007f\xed\x00\x00America/HermosilloUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe9\xee\x00\x00America/Santa_Isabe" + + "lUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RP\x0f(\b=\x01\x00\x00=\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x818\xf3\x00\x00America/Santo_DomingoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\xf4\x00\x00America/St_Vincent" + + "UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\x92\xf5\x00\x00America/Mexico_CityUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9R\x15\xc8\xcb\x00\xac\x00\x00\x00\xac\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\xf7\x00\x00America/GuyanaUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o" + + "\xf8\x00\x00America/Port_of_SpainUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xf1c9R>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81@\xf9\x00\x00America/DetroitUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\f\xfd\x00\x00A" + + "merica/Argentina/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RR\xc8\xd9" + + "\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\xfd\x00\x00America/Argentina/CatamarcaUT\x05\x00\x03\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RR\xc8\xd9\xf6\xc4\x02\x00\x00\xc4\x02\x00\x00 \x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "q\x00\x01\x00America/Argentina/ComodRivadaviaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8b}\xb6\x1e\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8f\x03\x01\x00America/Argent" + + "ina/UshuaiaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RŒZ\x8c\xc4\x02\x00\x00\xc4" + + "\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa6\x06\x01\x00America/Argentina/MendozaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd\t\x01\x00Amer" + + "ica/Argentina/Buenos_AiresUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9Rm\aD\x0e\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd9\f\x01\x00America/Argentina/La_Rio" + + "jaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8ep\xb4c\xc4\x02\x00\x00\xc4\x02\x00\x00\x1e\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xfa\x0f\x01\x00America/Argentina/Rio_GallegosUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x16\x13\x01\x00America/" + + "Argentina/JujuyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xfcz=\xe1\xcd" + + "\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\x16\x01\x00America/Argentina/San_JuanUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x1c\x80\xb9\\\xcd\x02\x00\x00\xcd\x02\x00\x00\x1a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\x19\x01" + + "\x00America/Argentina/San_LuisUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9Rt*\x9b!\xb2\x02\x00\x00\xb2\x02\x00\x00\x17\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81[\x1c\x01\x00America/Argentina/Salta" + + "UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RY\xd8֭\xd6\x02\x00\x00\xd6\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81^\x1f\x01\x00America/Argentina/TucumanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\"\x01\x00America/Argenti" + + "na/CordobaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe3\xc9I\xd0U\x03\x00\x00U\x03" + + "\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9e%\x01\x00America/Grand_TurkUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?)\x01\x00America/Knox" + + "_INUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8f\x19Ԇ\x12\x02\x00\x00\x12\x02\x00\x00\x16\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x80-\x01\x00America/Bahia_BanderasUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2/\x01\x00America/VirginU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa1'\a\xbd\x97\x00\x00\x00\x97\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xac0\x01\x00America/CayenneUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8c1\x01\x00America/MontserratUT\x05\x00\x03\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R?_p\x99\x0e\x05\x00\x00\x0e\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Z2" + + "\x01\x00America/WinnipegUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xca" + + "g\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb27\x01\x00America/AnguillaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RŒZ\x8c\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~8\x01\x00Americ" + + "a/MendozaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x04,2h\x99\x01\x00\x00\x99\x01\x00" + + "\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b;\x01\x00America/SantaremUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81n=\x01\x00America/St_Luci" + + "aUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RԾ\xe7#\x95\x00\x00\x00\x95\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81:>\x01\x00America/CaymanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xf1c9Rp\x1b\xceRC\x03\x00\x00C\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17?\x01\x00America/NipigonUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3B\x01\x00" + + "America/DenverUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R+\x10`ȫ\x02" + + "\x00\x00\xab\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfdF\x01\x00America/Dawson_CreekUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe90T\x16\xd1\x01\x00\x00\xd1\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6I\x01\x00Americ" + + "a/NuukUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf2\x04\xde\xdd\x11\x02\x00\x00\x11\x02\x00\x00\x0e\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\rL\x01\x00America/CancunUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xf1c9Rn\xab\xd5\xf9\xcf\x03\x00\x00\xcf\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81fN\x01\x00America/NomeUT\x05\x00\x03\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R,\xdb~\xab\xb2\x03\x00\x00\xb2\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{R" + + "\x01\x00America/YakutatUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag" + + "\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81vV\x01\x00America/GrenadaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81AW\x01\x00America/" + + "RosarioUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xac\x8e\xee\x13\xbe\x00\x00\x00\xbe\x00\x00\x00\x0f" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81NZ\x01\x00America/CaracasUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Ro_\x00v/\x01\x00\x00/\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U[\x01\x00America/MeridaUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe0\xbf\xf5\xe5\xc4\x02\x00\x00\xc4\x02\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\xcc\\\x01\x00America/Buenos_AiresUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x1b\vKdC\x03\x00\x00C\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xde_\x01\x00America/Rainy_RiverUT\x05\x00\x03" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81nc\x01\x00America/PhoenixUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R" + + "\xdf\xe5\x8d\xc4\xda\x04\x00\x00\xda\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7d\x01\x00America/LouisvilleUT\x05\x00\x03\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rk^2S\xb9\x04\x00\x00\xb9\x04\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcdi\x01\x00Am" + + "erica/Punta_ArenasUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xf5" + + "K\x89\xa2\x01\x00\x00\xa2\x01\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd4n\x01\x00America/Porto_AcreUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2p\x01\x00Amer" + + "ica/New_YorkUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xad`\x12\xe9\xaa\x00\x00\x00" + + "\xaa\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdcw\x01\x00America/La_PazUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb7-2f\xe4\x01\x00\x00\xe4\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcex\x01\x00America/Noronh" + + "aUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xfbz\x01\x00America/GuadeloupeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9R\x1e\xfbn۸\x03\x00\x00\xb8\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc9{\x01\x00America/Campo_GrandeU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R:\x9a1T\xdf\x01\x00\x00\xdf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xcf\u007f\x01\x00America/ScoresbysundUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xfc\x81\x01\x00America/North_Dakota/" + + "UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RH\xeam\xef\xde\x03\x00\x00\xde\x03\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81K\x82\x01\x00America/North_Dakota/CenterUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RR\x1b\x8b(\xde\x03\x00\x00\xde\x03\x00\x00\x1e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81~\x86\x01\x00America/North" + + "_Dakota/New_SalemUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb7.\xb6" + + "*\x13\x04\x00\x00\x13\x04\x00\x00\x1b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4\x8a\x01\x00America/North_Dakota/BeulahUT\x05\x00\x03\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x1d\xf7\a ,\x06\x00\x00,\x06\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\x1c\x8f\x01\x00America/Goose_BayUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9" + + "Rp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93\x95\x01\x00America/Fort_WayneUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R):\x17-\x88\x06\x00\x00\x88\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf2\x97\x01\x00A" + + "merica/HalifaxUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x1c\xd8\x19\x9dp\x01" + + "\x00\x00p\x01\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Þ\x01\x00America/Swift_CurrentUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R[Sp\x90\x02\x05\x00\x00\x02\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x82\xa0\x01\x00Ameri" + + "ca/SantiagoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R8\xcdZ\x05o\x01\x00\x00o" + + "\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Υ\x01\x00America/MazatlanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rg\xcag\xe7\x82\x00\x00\x00\x82\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x87\xa7\x01\x00America/St_Ba" + + "rthelemyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x89غ\xee\x15\x04\x00\x00\x15\x04\x00\x00" + + "\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81X\xa8\x01\x00America/BelizeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xcd\xc3v\xe3\xb3\x00\x00\x00\xb3\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb5\xac\x01\x00America/GuayaquilU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xc0\x98\x00\b\xc9\x03\x00\x00\xc9\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xb3\xad\x01\x00America/MontevideoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ȱ\x01\x00America/Los_AngelesUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\a\x1c\x9e\x9a]\x04\x00\x00]\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81#\xb7\x01\x00America/HavanaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R" + + "8O:\xbf\x95\x03\x00\x00\x95\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ȼ\x01\x00America/MenomineeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RutZ\x1a\xb2\x02\x00\x00\xb2\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa8\xbf\x01\x00Ame" + + "rica/JujuyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04" + + "\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1\xc2\x01\x00America/TijuanaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R{\a\a\xdc\xca\x03\x00\x00\xca\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xeb\xc6\x01\x00America/Edmonto" + + "nUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x82s\x1dT\x01\x00\x00T\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xff\xca\x01\x00America/ChihuahuaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xf1c9R\x1d`̟\x00\x03\x00\x00\x00\x03\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9e\xcc\x01\x00America/Cambridge_BayU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xc1Ȇ\x90\x05\x04\x00\x00\x05\x04\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xed\xcf\x01\x00America/WhitehorseUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\xf6@\rm\xa8\x05\x00\x00\xa8\x05\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>\xd4\x01\x00America/Fort_NelsonUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x813\xda\x01\x00America/AtkaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Ra\xcb" + + "'\xe9\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81B\xde\x01\x00America/ManausUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\xf9\x1dɻ\x00\x00\x00\xbb\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81&\xe0\x01\x00America/" + + "ParamariboUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xfe7\xa1\x87\x1b\x01\x00\x00\x1b\x01" + + "\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\xe1\x01\x00America/LimaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rd\xa9y\x9at\x03\x00\x00t\x03\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8e\xe2\x01\x00America/AsuncionUT" + + "\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81L\xe6\x01\x00America/ChicagoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9RMv\xa1\x0f%\x01\x00\x00%\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o\xed\x01\x00America/MonterreyUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x14\xc1r8\xe0\x00\x00\x00\xe0\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdf\xee\x01\x00" + + "America/Coral_HarbourUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9" + + "R錴$q\x03\x00\x00q\x03\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e\xf0\x01\x00America/Thunder_BayUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcc\xf3\x01\x00" + + "America/EnsenadaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9ROKj\xc7" + + "\xaa\x02\x00\x00\xaa\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17\xf8\x01\x00America/BahiaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\b\xfb\x01\x00America/Mon" + + "trealUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\x0f\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\x02\x02\x00America/JamaicaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xf1c9R5\x11Q\x06\xd1\x03\x00\x00\xd1\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3\x03\x02\x00America/AnchorageUT\x05" + + "\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rk\xc2\rx\xbf\x01\x00\x00\xbf\x01\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xbf\a\x02\x00America/DanmarkshavnUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcc\t\x02\x00America/KralendijkUT\x05\x00\x03" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R<\x01V\rP\x02\x00\x00P\x02\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\xaf\n\x02\x00America/AraguainaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xef\xf0R\x8a\xc4\x02\x00\x00\xc4\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81J\r\x02\x00America/CordobaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\u0096dK~\x02\x00\x00~\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W\x10\x02\x00Ame" + + "rica/ReginaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x85-\xb9\xf8\x8a\x01\x00\x00\x8a" + + "\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\x13\x02\x00America/BelemUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rӿ\x92\xbc\xb5\x06\x00\x00\xb5\x06\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xee\x14\x02\x00America/TorontoU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RU9#\xbe2\x05\x00\x002\x05\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xec\x1b\x02\x00America/VancouverUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R\xf8Dz\x97\xae\x01\x00\x00\xae\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i!\x02\x00America/Boa_VistaUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x19vv\xa0\x97\x00\x00\x00\x97\x00\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b" + + "#\x02\x00America/Lower_PrincesUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAH$\x02\x00Antarctica/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xc2\v\xae\b\x85\x00\x00\x00\x85\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8d$\x02\x00Antar" + + "ctica/VostokUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x95{\xf3\xa9w\x03\x00\x00" + + "w\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81]%\x02\x00Antarctica/PalmerUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R:\xc8P7\xb1\x00\x00\x00\xb1\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1f)\x02\x00Antarctica/" + + "TrollUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x12\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1a*\x02\x00Antarctica/McMurdoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x95\xea\x06\xd3\xc5\x00\x00\x00\xc5\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y.\x02\x00Antarctica/DavisU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\r\x0e\xf20\x85\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\x88/\x02\x00Antarctica/SyowaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xf1c9R\xc8\x14\xdcA\x98\x00\x00\x00\x98\x00\x00\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81W0\x02\x00Antarctica/DumontDUrville" + + "UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd7N\xab\x8b\x98\x00\x00\x00\x98\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81B1\x02\x00Antarctica/MawsonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9RƉ\xf71\x84\x00\x00\x00\x84\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%2\x02\x00Antarctica/RotheraUT\x05\x00\x03" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xddzAh\xf3\x00\x00\x00\xf3\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\xf52\x02\x00Antarctica/CaseyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xb2\x84J]\xd0\x03\x00\x00\xd0\x03\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x8124\x02\x00Antarctica/MacquarieUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x15\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P8\x02" + + "\x00Antarctica/South_PoleUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xb2<\x02\x00Arctic/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3<\x02\x00Arctic/Long" + + "yearbyenUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\xe4?\x02\x00Asia/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9R[u\x99q\xf1\x02\x00\x00\xf1\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#@\x02\x00Asia/TomskUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x81z&\x80k\x02\x00\x00k\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81XC\x02\x00Asia/Ch" + + "oibalsanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00" + + "\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\fF\x02\x00Asia/ThimbuUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9R\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xebF\x02\x00Asia/VientianeUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rʇ{_\xbb\x00\x00\x00\xbb\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcb" + + "G\x02\x00Asia/YangonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R6j\\J\xcf\x04" + + "\x00\x00\xcf\x04\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcbH\x02\x00Asia/HebronUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdfM\x02\x00Asia/ChongqingU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R'\xe2\\\xff\x9f\x00\x00\x00\x9f\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xb0O\x02\x00Asia/KabulUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xda" + + "v\x19z\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x93P\x02\x00Asia/BahrainUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf9l\x03\x12\xf8\x02\x00\x00\xf8\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81qQ\x02\x00Asia/Irku" + + "tskUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RO\xb0\x03\xe9\xe5\x02\x00\x00\xe5\x02\x00\x00\f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xafT\x02\x00Asia/YakutskUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xf1c9R.>[K\xab\x00\x00\x00\xab\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdaW\x02\x00Asia/JayapuraUT\x05\x00\x03\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RE\t\xfa-\a\x03\x00\x00\a\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xccX\x02\x00As" + + "ia/Hong_KongUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RS\xa5\x81e\xf7\x00\x00\x00" + + "\xf7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1b\\\x02\x00Asia/PontianakUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Z]\x02\x00Asia/TehranUT\x05" + + "\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rd%\x05\xd8\xe6\x02\x00\x00\xe6\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81se\x02\x00Asia/VladivostokUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9R:\x11\xea\xa2\xe5\x02\x00\x00\xe5\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa3h\x02\x00Asia/OmskUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcbk\x02\x00Asia/Tai" + + "peiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R?Y\xaf\x19\xe7\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0fn\x02\x00Asia/DaccaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9R]S\xbb\x12\xac\x03\x00\x00\xac\x03\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:o\x02\x00Asia/FamagustaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81.s\x02\x00Asi" + + "a/RiyadhUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00" + + "\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8s\x02\x00Asia/ChungkingUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xceG|\xea\x13\x03\x00\x00\x13\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc9u\x02\x00Asia/AmmanUT\x05\x00\x03\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81 y" + + "\x02\x00Asia/MakassarUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8bSnT\xa1" + + "\x00\x00\x00\xa1\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%z\x02\x00Asia/KathmanduUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0e{\x02\x00Asia/Shangh" + + "aiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd5ΜGp\x02\x00\x00p\x02\x00\x00\x0e\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xde|\x02\x00Asia/QyzylordaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x17✳2\x04\x00\x002\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96\u007f\x02\x00Asia/Tel_AvivUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb2\xe27Yn\x01\x00\x00n\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0f\x84\x02\x00A" + + "sia/TashkentUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xcfׇ\xe1\x85\x00\x00\x00" + + "\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ą\x02\x00Asia/KuwaitUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8e\x86\x02\x00Asia/UrumqiUT\x05\x00\x03\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Re\x1bb2w\x01\x00\x00w\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "X\x87\x02\x00Asia/AshkhabadUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf0\x9c" + + "f>\xd7\x02\x00\x00\xd7\x02\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17\x89\x02\x00Asia/KamchatkaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x87\xbd\xedL\xf1\x02\x00\x00\xf1\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x816\x8c\x02\x00Asia/Bar" + + "naulUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8a\x9a\x90\xf7\xd6\x02\x00\x00\xd6\x02\x00\x00\x11\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81m\x8f\x02\x00Asia/NovokuznetskUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xf1c9R0]*\x1bj\x02\x00\x00j\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8e\x92\x02\x00Asia/BishkekUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa7f^]@\x01\x00\x00@\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81>" + + "\x95\x02\x00Asia/KuchingUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x84)\r\xbd\xec" + + "\x00\x00\x00\xec\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ė\x02\x00Asia/SaigonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5\x97\x02\x00Asia/Singapore" + + "UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R)p\x1cX\xf1\x02\x00\x00\xf1\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81=\x99\x02\x00Asia/NovosibirskUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R?\xa7^\xfah\x02\x00\x00h\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81x\x9c\x02\x00Asia/AtyrauUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x88έ\xe2\xbd\x04\x00\x00\xbd\x04\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\x9f\x02\x00Asi" + + "a/GazaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RΒ\x1a\x8c\xaa\x00\x00\x00\xaa\x00\x00\x00\t\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\xa4\x02\x00Asia/DiliUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xf1c9R\xab\xcd\xdf\x05\xee\x02\x00\x00\xee\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x12\xa5\x02\x00Asia/ChitaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81D\xa8\x02\x00Asia/" + + "Ulan_BatorUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rw\rD\an\x01\x00\x00n\x01" + + "\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81ߪ\x02\x00Asia/SamarkandUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x03R\xda\xedU\x02\x00\x00U\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x95\xac\x02\x00Asia/NicosiaUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xcfׇ\xe1\x85\x00\x00\x00\x85\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x810\xaf\x02\x00Asia/AdenUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R?Y\xaf\x19\xe7" + + "\x00\x00\x00\xe7\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf8\xaf\x02\x00Asia/DhakaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R)\x15II\xf3\x02\x00\x00\xf3\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\xb1\x02\x00Asia/SakhalinUT" + + "\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RT\x81\x18G^\x02\x00\x00^\x02\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81]\xb4\x02\x00Asia/AqtauUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8a\xc1" + + "\x1eB\xb7\x00\x00\x00\xb7\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xff\xb6\x02\x00Asia/PyongyangUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x17✳2\x04\x00\x002\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\xb7\x02\x00Asia/Jer" + + "usalemUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R's\x96\x1en\x01\x00\x00n\x01\x00\x00\r\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81x\xbc\x02\x00Asia/DushanbeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9R\\\x91\x87\xbb\xf7\x00\x00\x00\xf7\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81-\xbe\x02\x00Asia/ColomboUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R9Y\xb7\xf1\n\x01\x00\x00\n\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81j\xbf\x02" + + "\x00Asia/KarachiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R恸\x1e\x00\x01\x00" + + "\x00\x00\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xba\xc0\x02\x00Asia/Kuala_LumpurUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Re\x1bb2w\x01\x00\x00w\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05\xc2\x02\x00Asia/Ashga" + + "batUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\f\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3\xc3\x02\x00Asia/KolkataUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xf1c9RB\x1d\xc6\x1b\x85\x00\x00\x00\x85\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5\xc4\x02\x00Asia/KashgarUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xba\xa3b\xc1R\x02\x00\x00R\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb0\xc5\x02\x00Asi" + + "a/HovdUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x03\x87\xb3<\xe8\x02\x00\x00\xe8\x02\x00\x00\t\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E\xc8\x02\x00Asia/BakuUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00" + + "\x00\xf1c9R\x83g\x95M\a\x03\x00\x00\a\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\xcb\x02\x00Asia/KhandygaUT\x05\x00\x03\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9a\xea\x18\xd4\xf8\x02\x00\x00\xf8\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbe\xce\x02\x00As" + + "ia/YekaterinburgUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rʇ{_" + + "\xbb\x00\x00\x00\xbb\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x02\xd2\x02\x00Asia/RangoonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rǯ\xdf\x1c\xee\x00\x00\x00\xee\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\xd3\x02\x00Asia/ManilaU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x816\xd4\x02\x00Asia/MacaoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RS" + + "\xdd\\2a\x02\x00\x00a\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x91\xd7\x02\x00Asia/AlmatyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RѾ\xa8\xc7u\x02\x00\x00u\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x817\xda\x02\x00Asia/Tbili" + + "siUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\xa4\x81\xf2\xdc\x02\x00Asia/Phnom_PenhUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\x1d?v\f\x17\x03\x00\x00\x17\x03\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd3\xdd\x02\x00Asia/MacauUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe4_P\x18\xef\x02\x00\x00\xef\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81.\xe1\x02\x00Asi" + + "a/MagadanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xdav\x19z\x98\x00\x00\x00\x98\x00\x00" + + "\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81c\xe4\x02\x00Asia/QatarUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9R\x9a\x1a\xdc\xca\xdc\x00\x00\x00\xdc\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81?\xe5\x02\x00Asia/CalcuttaUT\x05\x00\x03\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb2\xb9\xf4\xb6R\x02\x00\x00R\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81b\xe6" + + "\x02\x00Asia/UlaanbaatarUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa4Z" + + "ߐ\xe6\x02\x00\x00\xe6\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\xe8\x02\x00Asia/SrednekolymskUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xdb\xfa\xb5\xbeg\x02\x00\x00g\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x810\xec\x02\x00Asia" + + "/AqtobeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rw\x86\x8d^\x03\x03\x00\x00\x03\x03\x00\x00\r" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdc\xee\x02\x00Asia/Ust-NeraUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xf1c9RL\xe0\x91y\xe5\x02\x00\x00\xe5\x02\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81&\xf2\x02\x00Asia/KrasnoyarskUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81U\xf5\x02\x00Asia/SeoulUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Ry\x19\xe0N" + + "\x9a\x00\x00\x00\x9a\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x818\xf7\x02\x00Asia/BruneiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd7e&uv\x02\x00\x00v\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17\xf8\x02\x00Asia/BaghdadU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R`\xc9\xd4\\\xbe\x00\x00\x00\xbe\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xd3\xfa\x02\x00Asia/Ujung_PandangUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9RV\xe0\xe7!\xe7\x02\x00\x00\xe7\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdd\xfb\x02\x00Asia/AnadyrUT\x05\x00\x03\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xed\x8c\xf1\x91\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\xff\x02\x00As" + + "ia/MuscatUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x84)\r\xbd\xec\x00\x00\x00\xec\x00\x00" + + "\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd3\xff\x02\x00Asia/Ho_Chi_MinhUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xef\\\xf4q\x17\x04\x00\x00\x17\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\t\x01\x03\x00Asia/DamascusUT" + + "\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rj$\xcd\xf4\x9a\x00\x00\x00\x9a\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81g\x05\x03\x00Asia/ThimphuUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R" + + "\x88\xf6C\x84\x98\x00\x00\x00\x98\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81G\x06\x03\x00Asia/BangkokUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x02\x95-\xad\xc4\x02\x00\x00\xc4\x02\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81%\a\x03\x00Asia/Yer" + + "evanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8bSnT\xa1\x00\x00\x00\xa1\x00\x00\x00\r\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81/\n\x03\x00Asia/KatmanduUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R&\xe9\xd1\xd8q\x02\x00\x00q\x02\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x17\v\x03\x00Asia/OralUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcb\r\x03\x00Asia" + + "/TokyoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\r\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe4\x0e\x03\x00Asia/IstanbulUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9R\xc7\x11\xe1[\xdc\x02\x00\x00\xdc\x02\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xdb\x13\x03\x00Asia/BeirutUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rb\xadű\xf8\x00\x00\x00\xf8\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfc\x16\x03\x00" + + "Asia/JakartaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xed\x8c\xf1\x91\x85\x00\x00\x00" + + "\x85\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81:\x18\x03\x00Asia/DubaiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa1\xfax\x98g\x02\x00\x00g\x02\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x03\x19\x03\x00Asia/QostanayUT\x05\x00\x03" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\xb1\x1b\x03\x00Asia/HarbinUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\u007f\x1d\x03\x00Atlantic/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\u0097N\xad\xaf\x00\x00\x00\xaf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2\x1d\x03\x00Atlantic/Cape_V" + + "erdeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe7\xcf^\xb0\x15\x03\x00\x00\x15\x03\x00\x00\x10\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbe\x1e\x03\x00Atlantic/StanleyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03" + + "\n\x00\x00\x00\x00\x00\xf1c9R\x82\xfa Z\x9b\x05\x00\x00\x9b\x05\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1d\"\x03\x00Atlantic/MadeiraUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rl&\x04\x99\x00\x04\x00\x00\x00\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\x02(\x03\x00Atlantic/BermudaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xaf|7\xb3\xde\x01\x00\x00\xde\x01\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81L,\x03\x00Atlantic/CanaryUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81s.\x03\x00Atl" + + "antic/FaroeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rm\xbd\x10k\xf1\x02\x00\x00\xf1" + + "\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81t0\x03\x00Atlantic/ReykjavikUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8" + + "\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb13\x03\x00Atlantic/Ja" + + "n_MayenUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf1\b{\x87\x82\x00\x00\x00\x82\x00\x00\x00\x12" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa16\x03\x00Atlantic/St_HelenaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x0f-\xadׄ\x00\x00\x00\x84\x00\x00\x00\x16\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81o7\x03\x00Atlantic/South_" + + "GeorgiaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb7\x0e\xbdm\xb9\x01\x00\x00\xb9\x01\x00\x00\x0f" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81C8\x03\x00Atlantic/FaeroeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RW\x99\x9d\v\x9b\x05\x00\x00\x9b\x05\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81E:\x03\x00Atlantic/AzoresUT\x05" + + "\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10" + + "\x00\xedA)@\x03\x00Australia/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RX\xb9\x9a" + + "p\x88\x03\x00\x00\x88\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81m@\x03\x00Australia/NSWUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8ff~ՙ\x03\x00\x00\x99\x03\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe垛\x03\x00\x00\x9b\x03\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "?\xbe\x04\x00Europe/WarsawUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rk\xa4," + + "\xb6?\x06\x00\x00?\x06\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81!\xc2\x04\x00Europe/LondonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rn\x81\xf4\xd7Z\x04\x00\x00Z\x04\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa7\xc8\x04\x00Europe/Mon" + + "acoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xa5\x97\aĤ\x02\x00\x00\xa4\x02\x00\x00\v\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81H\xcd\x04\x00Europe/OsloUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xf1c9R\xe1C\xf9\xa1\xde\x01\x00\x00\xde\x01\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x811\xd0\x04\x00Europe/PodgoricaUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\xd2\x04\x00" + + "Europe/IstanbulUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xab\x80c$q" + + "\x00\x00\x00q\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81R\xd7\x04\x00FactoryUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x04\xd8\x04\x00GBUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rk\xa4,\xb6?\x06\x00\x00?\x06\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\u007f\xde\x04\x00GB-Eir" + + "eUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\xff\xe4\x04\x00GMTUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00" + + "\x00\x00o\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xab\xe5\x04\x00GMT+0UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\xe6\x04\x00GMT-0UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\a\xe7\x04\x00GMT0UT" + + "\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RP\xda\xfa\x03o\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\xa4\x81\xb4\xe7\x04\x00GreenwichUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RE\t\xfa" + + "-\a\x03\x00\x00\a\x03\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81f\xe8\x04\x00HongkongUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R=\xf7\xfawp\x00\x00\x00p\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf\xeb\x04\x00HSTUT\x05\x00\x03\x15\xac\x0e`ux\v" + + "\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rm\xbd\x10k\xf1\x02\x00\x00\xf1\x02\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\\\xec\x04\x00Ic" + + "elandUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x8e\xef\x04\x00Indian/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcf\xef\x04\x00Indian/MayotteUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb8K\xabυ\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd6\xf0\x04\x00Indi" + + "an/KerguelenUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb9\xb2Z\xac\x98\x00\x00\x00" + + "\x98\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa5\xf1\x04\x00Indian/MaldivesUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Ry(\xb6\x8f\x85\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x86\xf2\x04\x00Indian/Reunio" + + "nUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x96\xed=\x98\xb3\x00\x00\x00\xb3\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81S\xf3\x04\x00Indian/MauritiusUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\xb4\x8d\x98ƿ\x00\x00\x00\xbf\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81P\xf4\x04\x00Indian/AntananarivoUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Ra\x85jo\x85\x00\x00\x00\x85\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\\\xf5\x04\x00Indian/MaheUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb4\x8d\x98" + + "ƿ\x00\x00\x00\xbf\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81&\xf6\x04\x00Indian/ComoroUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R$l=҅\x00\x00\x00\x85\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81,\xf7\x04\x00Indian/Chr" + + "istmasUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rx\xb0W\x14\x98\x00\x00\x00\x98\x00\x00\x00\r\x00" + + "\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfb\xf7\x04\x00Indian/ChagosUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9RͲ\xfb\xf6\x8c\x00\x00\x00\x8c\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xda\xf8\x04\x00Indian/CocosUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R;\u007fP\x8d\xd4\a\x00\x00\xd4\a\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xac\xf9\x04" + + "\x00IranUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x17✳2\x04\x00\x002\x04\x00\x00\x06\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbe\x01\x05\x00IsraelUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9" + + "R%J\xd5\xebS\x01\x00\x00S\x01\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x810\x06\x05\x00JamaicaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x02\xf4\xaeg\xd5\x00\x00\x00\xd5\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc4\a\x05\x00JapanUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd8" + + "\b\x05\x00KwajaleinUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R_\u007f2[\xaf\x01\x00\x00" + + "\xaf\x01\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6\t\x05\x00LibyaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\xfe\x9d\x1b\xc9m\x02\x00\x00m\x02\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe4\v\x05\x00METUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedA\x8e\x0e\x05\x00Mexico/UT\x05" + + "\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xd6\xe1Հ\x9c\x01\x00\x00\x9c\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xcf\x0e\x05\x00Mexico/GeneralUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9" + + "R\xd0v\x01\x8a\x01\x04\x00\x00\x01\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb3\x10\x05\x00Mexico/BajaNorteUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R8\xcdZ\x05o\x01\x00\x00o\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfe\x14\x05\x00Mex" + + "ico/BajaSurUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf5\x8d\x99\x92o\x00\x00\x00o" + + "\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb5\x16\x05\x00MSTUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xf1c9R\xe6h\xcac\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81a\x17\x05\x00MST7MDTUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00" + + "\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RV\x80\x94@\x12\x04\x00\x00\x12\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Y\x1b\x05\x00NavajoUT\x05" + + "\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\xa4\x81\xab\x1f\x05\x00NZUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x96\xc5FF(\x03\x00\x00(\x03\x00" + + "\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfa#\x05\x00NZ-CHATUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedAc'\x05\x00Pacific/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8" + + "\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xee\xd0\x1cYN\x04\x00\x00N\x04\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa5'\x05\x00Pacifi" + + "c/EasterUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xfa\x0fA\x05\x99\x00\x00\x00\x99\x00\x00\x00" + + "\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;,\x05\x00Pacific/PitcairnUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R3\x03\x1f\f\xac\x00\x00\x00\xac\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1e-\x05\x00Pacific/Enderbur" + + "yUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Ra\vೆ\x00\x00\x00\x86\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\xa4\x81\x15.\x05\x00Pacific/FunafutiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe5.\x05\x00Pacific/PonapeUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xb7\xef\x97\xc6\xc6\x00\x00\x00\xc6\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x030\x05" + + "\x00Pacific/NoumeaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x80\xf8vܔ" + + "\x00\x00\x00\x94\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x111\x05\x00Pacific/PalauUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xec1\x05\x00Pacific/John" + + "stonUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xca\"\xb8i\xda\x00\x00\x00\xda\x00\x00\x00\x0e\x00\x18\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x133\x05\x00Pacific/MajuroUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00" + + "\x00\x00\x00\x00\xf1c9Rt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x8154\x05\x00Pacific/Pago_PagoUT\x05\x00\x03" + + "\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9e\u007f\xab\x95V\x01\x00\x00V\x01\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4" + + "\x81\x125\x05\x00Pacific/EfateUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xc8=" + + "ku\xae\x00\x00\x00\xae\x00\x00\x00\x12\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaf6\x05\x00Pacific/KiritimatiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01" + + "\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x8a|\xdcU\x99\x00\x00\x00\x99\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa97\x05\x00Paci" + + "fic/FakaofoUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x96\xc5FF(\x03\x00\x00(" + + "\x03\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x8b8\x05\x00Pacific/ChathamUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00" + + "PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xf6\xe8]*\xdb\x00\x00\x00\xdb\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfc;\x05\x00Pacific/Kwajal" + + "einUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\x0e\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\"=\x05\x00Pacific/MidwayUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00" + + "\x00\x00\x00\xf1c9R1\xce_(\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfc=\x05\x00Pacific/WallisUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R4\xd0Yӣ\x01\x00\x00\xa3\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xca>\x05" + + "\x00Pacific/FijiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe9\xdd\x1e\xee\f\x01\x00" + + "\x00\f\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb3@\x05\x00Pacific/ApiaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00P" + + "K\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05B\x05\x00Pacific/YapUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rn\x04\x19y\x9a\x00\x00\x00\x9a\x00\x00\x00\x14\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\rC\x05\x00Pacific/Port_MoresbyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R\xeaK\x85v\xdd\x00\x00\x00\xdd\x00\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5C\x05\x00Pacific/HonoluluUT\x05\x00\x03\x15\xac\x0e" + + "`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\u07b54-\xd6\x00\x00\x00\xd6\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1cE" + + "\x05\x00Pacific/PohnpeiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xc23\xa0" + + "\xbc\x84\x00\x00\x00\x84\x00\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81;F\x05\x00Pacific/GambierUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe2;Z\xf7\xb7\x00\x00\x00\xb7\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\bG\x05\x00Pacific/" + + "NauruUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x97n7\x1a\xf2\x00\x00\x00\xf2\x00\x00\x00\x0e\x00\x18" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x06H\x05\x00Pacific/KosraeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n" + + "\x00\x00\x00\x00\x00\xf1c9R\x85v\xf8\x8c\x87\x01\x00\x00\x87\x01\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81@I\x05\x00Pacific/RarotongaUT\x05\x00" + + "\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RD6\x83\xa1\x8b\x00\x00\x00\x8b\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\xa4\x81\x12K\x05\x00Pacific/MarquesasUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9R6\xb7S{\x86\x00\x00\x00\x86\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe8K\x05\x00Pacific/TarawaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb6L\x05\x00Pac" + + "ific/TrukUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x81\xeb\xb8m\xaf\x00\x00\x00\xaf\x00\x00" + + "\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbfM\x05\x00Pacific/NiueUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e" + + "\x03\n\x00\x00\x00\x00\x00\xf1c9Rt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb4N\x05\x00Pacific/SamoaUT\x05\x00\x03\x15" + + "\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RFI\xfe\x14^\x01\x00\x00^\x01\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81" + + "\x8dO\x05\x00Pacific/GuamUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RFI\xfe\x14" + + "^\x01\x00\x00^\x01\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x811Q\x05\x00Pacific/SaipanUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04" + + "\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x81\xe3w\n\xaf\x00\x00\x00\xaf\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd7R\x05\x00Pacific/Ga" + + "lapagosUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9a\xf2:F\xc9\x00\x00\x00\xc9\x00\x00\x00\x14" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd1S\x05\x00Pacific/BougainvilleUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R߃\xa0_\x86\x00\x00\x00\x86\x00\x00\x00\f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe8T\x05\x00Pacific/WakeU" + + "T\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RP:\xc0\x8c\xed\x00\x00\x00\xed\x00\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\xa4\x81\xb4U\x05\x00Pacific/TongatapuUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00" + + "\x00\x00\xf1c9R\xcc\xf39a\xc3\x00\x00\x00\xc3\x00\x00\x00\r\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xecV\x05\x00Pacific/ChuukUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xea\xc1\xdaυ\x00\x00\x00\x85\x00\x00\x00\x0e\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf6W\x05\x00P" + + "acific/TahitiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RY\xd2K|\x86\x00\x00" + + "\x00\x86\x00\x00\x00\x13\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc3X\x05\x00Pacific/GuadalcanalUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00" + + "\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rb\xb2\xaf\xf7\x13\x04\x00\x00\x13\x04\x00\x00\x10\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x96Y\x05\x00Pacific/" + + "AucklandUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RY5\x1a6\xf7\x00\x00\x00\xf7\x00\x00\x00" + + "\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf3]\x05\x00Pacific/NorfolkUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R>\xfe垛\x03\x00\x00\x9b\x03\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813_\x05\x00PolandUT\x05\x00\x03\x15\xac\x0e`ux" + + "\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xfa\xd5\xd6М\x05\x00\x00\x9c\x05\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x0ec\x05\x00P" + + "ortugalUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R*\xe4@\xa9\x89\x01\x00\x00\x89\x01\x00\x00\x03" + + "\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xech\x05\x00PRCUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R" + + "ŭV\xad\xb7\x03\x00\x00\xb7\x03\x00\x00\a\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb2j\x05\x00PST8PDTUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00" + + "\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xee\xf0BB\xff\x01\x00\x00\xff\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xaan\x05\x00ROCUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xc7X,Y\x9f\x01\x00\x00\x9f\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe6p\x05\x00" + + "ROKUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x06\xaa>\xa8\x00\x01\x00\x00\x00\x01\x00\x00\t\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xc2r\x05\x00SingaporeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c" + + "9R\aW\x10Ѱ\x04\x00\x00\xb0\x04\x00\x00\x06\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x05t\x05\x00TurkeyUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03" + + "\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xf5x\x05\x00UCTUT\x05\x00\x03\x15\xac\x0e`" + + "ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa1y\x05" + + "\x00UniversalUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x10\x00\xedASz\x05\x00US/UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1" + + "c9R\xf6\"\x12\xfe\x0e\x05\x00\x00\x0e\x05\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x90z\x05\x00US/PacificUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03" + + "\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9bܩ=\xda\x06\x00\x00\xda\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xe2\u007f\x05\x00US/Cent" + + "ralUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R>\x14\xe7\x03\x83\x03\x00\x00\x83\x03\x00\x00\v\x00\x18\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x87\x05\x00US/MichiganUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00" + + "\xf1c9R\xae,\xa44\xc9\x03\x00\x00\xc9\x03\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ȋ\x05\x00US/AleutianUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04" + + "\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R$ \x873\xf8\x03\x00\x00\xf8\x03\x00\x00\x11\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81֎\x05\x00US/In" + + "diana-StarkeUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9RV\x80\x94@\x12\x04\x00\x00" + + "\x12\x04\x00\x00\v\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x19\x93\x05\x00US/MountainUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01" + + "\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rø\xab\x9b\xf0\x00\x00\x00\xf0\x00\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81p\x97\x05\x00US/ArizonaUT\x05\x00\x03\x15\xac" + + "\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R3\x9aG\xc8\xd0\x06\x00\x00\xd0\x06\x00\x00\n\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4" + + "\x98\x05\x00US/EasternUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R5\x11Q\x06\xd1\x03\x00" + + "\x00\xd1\x03\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xb8\x9f\x05\x00US/AlaskaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02" + + "\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rt\xca{e\x92\x00\x00\x00\x92\x00\x00\x00\b\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81̣\x05\x00US/SamoaUT\x05\x00\x03\x15\xac\x0e`u" + + "x\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9Rp\xb6{\xc9\x13\x02\x00\x00\x13\x02\x00\x00\x0f\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa0\xa4\x05\x00" + + "US/East-IndianaUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xeaK\x85v\xdd" + + "\x00\x00\x00\xdd\x00\x00\x00\t\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xfc\xa6\x05\x00US/HawaiiUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK" + + "\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00\x00\x00o\x00\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1c\xa8\x05\x00UTCUT\x05\x00\x03\x15\xac\x0e`ux\v\x00" + + "\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R2\x91B\xc0\xee\x01\x00\x00\xee\x01\x00\x00\x03\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81Ȩ\x05\x00WET" + + "UT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\xe1\xc1\xeb\x05\x8c\x03\x00\x00\x8c\x03\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\xa4\x81\xf3\xaa\x05\x00W-SUUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x01\x02\x1e\x03\n\x00\x00\x00\x00\x00\xf1c9R\x9f.\xe4xo\x00" + + "\x00\x00o\x00\x00\x00\x04\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xbd\xae\x05\x00ZuluUT\x05\x00\x03\x15\xac\x0e`ux\v\x00\x01\x04\xe8\x03\x00\x00\x04\xe8\x03\x00\x00PK\x05\x06\x00\x00\x00\x00" + + "f\x02f\x02\x96\xc9\x00\x00j\xaf\x05\x00\x00\x00" -- GitLab From 6de8443f3b324be69a3082a67ce71fa869d1a32b Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 22 Jan 2021 10:58:12 -0500 Subject: [PATCH 1692/1792] doc/asm: add a section on go_asm.h, clean up go_tls.h section Currently the only mention of go_asm.h is buried in a confusing section about the runtime-specific go_tls.h header. We actually want people to use go_asm.h, so this CL adds a section with a proper discussion of this header. As part of this, we remove the discussion of go_asm.h from the go_tls.h section and clean up what remains. I stumbled on this when working on the internal ABI specification. I wanted to refer to stable documentation on how to access struct fields from assembly and found there was none. Change-Id: I0d53741e7685e65794611939e76285f7c82e1d65 Reviewed-on: https://go-review.googlesource.com/c/go/+/286052 Trust: Austin Clements Reviewed-by: Jeremy Faller Reviewed-by: Michael Knyszek --- doc/asm.html | 72 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/doc/asm.html b/doc/asm.html index cc8598aeff..7173d9bd51 100644 --- a/doc/asm.html +++ b/doc/asm.html @@ -464,6 +464,57 @@ Function is the top of the call stack. Traceback should stop at this function. +

    Interacting with Go types and constants

    + +

    +If a package has any .s files, then go build will direct +the compiler to emit a special header called go_asm.h, +which the .s files can then #include. +The file contains symbolic #define constants for the +offsets of Go struct fields, the sizes of Go struct types, and most +Go const declarations defined in the current package. +Go assembly should avoid making assumptions about the layout of Go +types and instead use these constants. +This improves the readability of assembly code, and keeps it robust to +changes in data layout either in the Go type definitions or in the +layout rules used by the Go compiler. +

    + +

    +Constants are of the form const_name. +For example, given the Go declaration const bufSize = +1024, assembly code can refer to the value of this constant +as const_bufSize. +

    + +

    +Field offsets are of the form type_field. +Struct sizes are of the form type__size. +For example, consider the following Go definition: +

    + +
    +type reader struct {
    +	buf [bufSize]byte
    +	r   int
    +}
    +
    + +

    +Assembly can refer to the size of this struct +as reader__size and the offsets of the two fields +as reader_buf and reader_r. +Hence, if register R1 contains a pointer to +a reader, assembly can reference the r field +as reader_r(R1). +

    + +

    +If any of these #define names are ambiguous (for example, +a struct with a _size field), #include +"go_asm.h" will fail with a "redefinition of macro" error. +

    +

    Runtime Coordination

    @@ -615,21 +666,15 @@ Here follow some descriptions of key Go-specific details for the supported archi

    The runtime pointer to the g structure is maintained through the value of an otherwise unused (as far as Go is concerned) register in the MMU. -An OS-dependent macro get_tls is defined for the assembler if the source is -in the runtime package and includes a special header, go_tls.h: +In the runtime package, assembly code can include go_tls.h, which defines +an OS- and architecture-dependent macro get_tls for accessing this register. +The get_tls macro takes one argument, which is the register to load the +g pointer into.

    -
    -#include "go_tls.h"
    -
    -

    -Within the runtime, the get_tls macro loads its argument register -with a pointer to the g pointer, and the g struct -contains the m pointer. -There's another special header containing the offsets for each -element of g, called go_asm.h. -The sequence to load g and m using CX looks like this: +For example, the sequence to load g and m +using CX looks like this:

    @@ -642,8 +687,7 @@ MOVL	g_m(AX), BX   // Move g.m into BX.
     

    -Note: The code above works only in the runtime package, while go_tls.h also -applies to arm, amd64 and amd64p32, and go_asm.h applies to all architectures. +The get_tls macro is also defined on amd64.

    -- GitLab From 54514c6b2896c6a634a7b8017ade909985172e4d Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 25 Jan 2021 10:34:28 -0500 Subject: [PATCH 1693/1792] cmd/go: fix TestScript/cgo_path, cgo_path_space when CC set These tests failed if CC was set to a path containing a separator during make.bash. They now set CC explicitly. Fixes #43897 Change-Id: Ic6e7f192fcb363f0ac9f45b329113255453bf76f Reviewed-on: https://go-review.googlesource.com/c/go/+/286292 Run-TryBot: Jay Conrod TryBot-Result: Go Bot Trust: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/testdata/script/cgo_path.txt | 7 +++++ src/cmd/go/testdata/script/cgo_path_space.txt | 27 ++++++++++--------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/cmd/go/testdata/script/cgo_path.txt b/src/cmd/go/testdata/script/cgo_path.txt index 98c56ff40e..be9609e86f 100644 --- a/src/cmd/go/testdata/script/cgo_path.txt +++ b/src/cmd/go/testdata/script/cgo_path.txt @@ -1,5 +1,12 @@ [!cgo] skip +# Set CC explicitly to 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' + env GOCACHE=$WORK/gocache # Looking for compile flags, so need a clean cache. [!windows] env PATH=.:$PATH [!windows] chmod 0755 p/gcc p/clang diff --git a/src/cmd/go/testdata/script/cgo_path_space.txt b/src/cmd/go/testdata/script/cgo_path_space.txt index 6d203b04d6..654295dc69 100644 --- a/src/cmd/go/testdata/script/cgo_path_space.txt +++ b/src/cmd/go/testdata/script/cgo_path_space.txt @@ -1,13 +1,14 @@ # Check that if the PATH directory containing the C compiler has a space, # we can still use that compiler with cgo. # Verifies #43808. - [!cgo] skip -# Check if default CC was set by make.bash. -# If it was, this test is not valid. -go env CC -stdout '^(clang|gcc)$' +# Set CC explicitly to 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' [!windows] chmod 0755 $WORK/'program files'/clang [!windows] chmod 0755 $WORK/'program files'/gcc @@ -18,10 +19,10 @@ stdout '^(clang|gcc)$' [windows] exists -exec $WORK/'program files'/clang.bat [windows] env PATH=$WORK\'program files';%PATH% -! exists log.txt +! exists $WORK/log.txt ? go build -x -exists log.txt -rm log.txt +exists $WORK/log.txt +rm $WORK/log.txt # TODO(#41400, #43078): when CC is set explicitly, it should be allowed to # contain spaces separating arguments, and it should be possible to quote @@ -30,7 +31,7 @@ rm log.txt [!windows] env CC=$WORK/'program files'/gcc [windows] env CC=$WORK\'program files'\gcc.bat ! go build -x -! exists log.txt +! exists $WORK/log.txt -- go.mod -- module m @@ -44,12 +45,12 @@ import "C" -- $WORK/program files/gcc -- #!/bin/sh -echo ok >log.txt +echo ok >$WORK/log.txt -- $WORK/program files/clang -- #!/bin/sh -echo ok >log.txt +echo ok >$WORK/log.txt -- $WORK/program files/gcc.bat -- -echo ok >log.txt +echo ok >%WORK%\log.txt -- $WORK/program files/clang.bat -- -echo ok >log.txt +echo ok >%WORK%\log.txt -- GitLab From 3d85c69a0bf67adec57b76511ccc5e5b0ba9cdf4 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 22 Jan 2021 14:54:23 -0800 Subject: [PATCH 1694/1792] html/template: revert "avoid race when escaping updates template" This reverts CLs 274450 and 279492, except for the new tests. The new race test is changed to skip, as it now fails. We can try again for 1.17. Original CL descriptions: html/template: attach functions to namespace The text/template functions are stored in a data structure shared by all related templates, so do the same with the original, unwrapped, functions on the html/template side. html/template: avoid race when escaping updates template For #39807 Fixes #43855 Change-Id: I2ce91321ada06ea496a982aefe170eb5af9ba847 Reviewed-on: https://go-review.googlesource.com/c/go/+/285957 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Emmanuel Odeke --- src/html/template/exec_test.go | 35 +++++++++++++ src/html/template/template.go | 96 +++++----------------------------- 2 files changed, 47 insertions(+), 84 deletions(-) diff --git a/src/html/template/exec_test.go b/src/html/template/exec_test.go index cd6b78a1a9..7d1bef1782 100644 --- a/src/html/template/exec_test.go +++ b/src/html/template/exec_test.go @@ -1720,6 +1720,8 @@ var v = "v"; ` func TestEscapeRace(t *testing.T) { + t.Skip("this test currently fails with -race; see issue #39807") + tmpl := New("") _, err := tmpl.New("templ.html").Parse(raceText) if err != nil { @@ -1777,6 +1779,39 @@ func TestRecursiveExecute(t *testing.T) { } } +// recursiveInvoker is for TestRecursiveExecuteViaMethod. +type recursiveInvoker struct { + t *testing.T + tmpl *Template +} + +func (r *recursiveInvoker) Recur() (string, error) { + var sb strings.Builder + if err := r.tmpl.ExecuteTemplate(&sb, "subroutine", nil); err != nil { + r.t.Fatal(err) + } + return sb.String(), nil +} + +func TestRecursiveExecuteViaMethod(t *testing.T) { + tmpl := New("") + top, err := tmpl.New("x.html").Parse(`{{.Recur}}`) + if err != nil { + t.Fatal(err) + } + _, err = tmpl.New("subroutine").Parse(``) + if err != nil { + t.Fatal(err) + } + r := &recursiveInvoker{ + t: t, + tmpl: tmpl, + } + if err := top.Execute(io.Discard, r); err != nil { + t.Fatal(err) + } +} + // Issue 43295. func TestTemplateFuncsAfterClone(t *testing.T) { s := `{{ f . }}` diff --git a/src/html/template/template.go b/src/html/template/template.go index 1ff7e1f7a0..69312d36fd 100644 --- a/src/html/template/template.go +++ b/src/html/template/template.go @@ -11,7 +11,6 @@ import ( "os" "path" "path/filepath" - "reflect" "sync" "text/template" "text/template/parse" @@ -36,20 +35,18 @@ var escapeOK = fmt.Errorf("template escaped correctly") // nameSpace is the data structure shared by all templates in an association. type nameSpace struct { - mu sync.RWMutex + mu sync.Mutex set map[string]*Template escaped bool esc escaper - // The original functions, before wrapping. - funcMap FuncMap } // Templates returns a slice of the templates associated with t, including t // itself. func (t *Template) Templates() []*Template { ns := t.nameSpace - ns.mu.RLock() - defer ns.mu.RUnlock() + ns.mu.Lock() + defer ns.mu.Unlock() // Return a slice so we don't expose the map. m := make([]*Template, 0, len(ns.set)) for _, v := range ns.set { @@ -87,8 +84,8 @@ func (t *Template) checkCanParse() error { if t == nil { return nil } - t.nameSpace.mu.RLock() - defer t.nameSpace.mu.RUnlock() + t.nameSpace.mu.Lock() + defer t.nameSpace.mu.Unlock() if t.nameSpace.escaped { return fmt.Errorf("html/template: cannot Parse after Execute") } @@ -97,16 +94,6 @@ func (t *Template) checkCanParse() error { // escape escapes all associated templates. func (t *Template) escape() error { - t.nameSpace.mu.RLock() - escapeErr := t.escapeErr - t.nameSpace.mu.RUnlock() - if escapeErr != nil { - if escapeErr == escapeOK { - return nil - } - return escapeErr - } - t.nameSpace.mu.Lock() defer t.nameSpace.mu.Unlock() t.nameSpace.escaped = true @@ -134,8 +121,6 @@ func (t *Template) Execute(wr io.Writer, data interface{}) error { if err := t.escape(); err != nil { return err } - t.nameSpace.mu.RLock() - defer t.nameSpace.mu.RUnlock() return t.text.Execute(wr, data) } @@ -151,8 +136,6 @@ func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) if err != nil { return err } - t.nameSpace.mu.RLock() - defer t.nameSpace.mu.RUnlock() return tmpl.text.Execute(wr, data) } @@ -160,27 +143,13 @@ func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) // is escaped, or returns an error if it cannot be. It returns the named // template. func (t *Template) lookupAndEscapeTemplate(name string) (tmpl *Template, err error) { - t.nameSpace.mu.RLock() + t.nameSpace.mu.Lock() + defer t.nameSpace.mu.Unlock() + t.nameSpace.escaped = true tmpl = t.set[name] - var escapeErr error - if tmpl != nil { - escapeErr = tmpl.escapeErr - } - t.nameSpace.mu.RUnlock() - if tmpl == nil { return nil, fmt.Errorf("html/template: %q is undefined", name) } - if escapeErr != nil { - if escapeErr != escapeOK { - return nil, escapeErr - } - return tmpl, nil - } - - t.nameSpace.mu.Lock() - defer t.nameSpace.mu.Unlock() - t.nameSpace.escaped = true if tmpl.escapeErr != nil && tmpl.escapeErr != escapeOK { return nil, tmpl.escapeErr } @@ -286,13 +255,6 @@ func (t *Template) Clone() (*Template, error) { } ns := &nameSpace{set: make(map[string]*Template)} ns.esc = makeEscaper(ns) - if t.nameSpace.funcMap != nil { - ns.funcMap = make(FuncMap, len(t.nameSpace.funcMap)) - for name, fn := range t.nameSpace.funcMap { - ns.funcMap[name] = fn - } - } - wrapFuncs(ns, textClone, ns.funcMap) ret := &Template{ nil, textClone, @@ -307,13 +269,12 @@ func (t *Template) Clone() (*Template, error) { return nil, fmt.Errorf("html/template: cannot Clone %q after it has executed", t.Name()) } x.Tree = x.Tree.Copy() - tc := &Template{ + ret.set[name] = &Template{ nil, x, x.Tree, ret.nameSpace, } - ret.set[name] = tc } // Return the template associated with the name of this template. return ret.set[ret.Name()], nil @@ -382,43 +343,10 @@ type FuncMap map[string]interface{} // type. However, it is legal to overwrite elements of the map. The return // value is the template, so calls can be chained. func (t *Template) Funcs(funcMap FuncMap) *Template { - t.nameSpace.mu.Lock() - if t.nameSpace.funcMap == nil { - t.nameSpace.funcMap = make(FuncMap, len(funcMap)) - } - for name, fn := range funcMap { - t.nameSpace.funcMap[name] = fn - } - t.nameSpace.mu.Unlock() - - wrapFuncs(t.nameSpace, t.text, funcMap) + t.text.Funcs(template.FuncMap(funcMap)) return t } -// wrapFuncs records the functions with text/template. We wrap them to -// unlock the nameSpace. See TestRecursiveExecute for a test case. -func wrapFuncs(ns *nameSpace, textTemplate *template.Template, funcMap FuncMap) { - if len(funcMap) == 0 { - return - } - tfuncs := make(template.FuncMap, len(funcMap)) - for name, fn := range funcMap { - fnv := reflect.ValueOf(fn) - wrapper := func(args []reflect.Value) []reflect.Value { - ns.mu.RUnlock() - defer ns.mu.RLock() - if fnv.Type().IsVariadic() { - return fnv.CallSlice(args) - } else { - return fnv.Call(args) - } - } - wrapped := reflect.MakeFunc(fnv.Type(), wrapper) - tfuncs[name] = wrapped.Interface() - } - textTemplate.Funcs(tfuncs) -} - // Delims sets the action delimiters to the specified strings, to be used in // subsequent calls to Parse, ParseFiles, or ParseGlob. Nested template // definitions will inherit the settings. An empty delimiter stands for the @@ -432,8 +360,8 @@ func (t *Template) Delims(left, right string) *Template { // Lookup returns the template with the given name that is associated with t, // or nil if there is no such template. func (t *Template) Lookup(name string) *Template { - t.nameSpace.mu.RLock() - defer t.nameSpace.mu.RUnlock() + t.nameSpace.mu.Lock() + defer t.nameSpace.mu.Unlock() return t.set[name] } -- GitLab From 96a276363b130d0f0e5185f2f17c0f6bce43f885 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 20 Jan 2021 20:41:16 -0800 Subject: [PATCH 1695/1792] doc/go1.16: mention go/build changes For #40070 For #41191 For #43469 For #43632 Change-Id: I6dc6b6ea0f35876a4c252e4e287a0280aca9d502 Reviewed-on: https://go-review.googlesource.com/c/go/+/285213 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 9c4910053c..0330ec6b24 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -693,6 +693,37 @@ func TestFoo(t *testing.T) {

    +
    go/build
    +
    +

    + The Package + struct has new fields that report information + about //go:embed directives in the package: + EmbedPatterns, + EmbedPatternPos, + TestEmbedPatterns, + TestEmbedPatternPos, + XTestEmbedPatterns, + XTestEmbedPatternPos. +

    + +

    + The Package field + IgnoredGoFiles + will no longer include files that start with "_" or ".", + as those files are always ignored. + IgnoredGoFiles is for files ignored because of + build constraints. +

    + +

    + The new Package + field IgnoredOtherFiles + has a list of non-Go files ignored because of build constraints. +

    +
    +
    +
    html/template

    -- GitLab From e6b6d107f7157bb515564f628e5b9b455e295db3 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 21 Jan 2021 16:23:18 -0800 Subject: [PATCH 1696/1792] doc/go1.16: mention deprecation of io/ioutil For #40025 For #40700 For #42026 Change-Id: Ib51b5e1398c4eb811506df21e3bd56dd84bd1f7e Reviewed-on: https://go-review.googlesource.com/c/go/+/285377 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 0330ec6b24..37a2160944 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -499,6 +499,44 @@ func TestFoo(t *testing.T) { implementations.

    +

    Deprecation of io/ioutil

    + +

    + The io/ioutil package has + turned out to be a poorly defined and hard to understand collection + of things. All functionality provided by the package has been moved + to other packages. The io/ioutil package remains and + will continue to work as before, but we encourage new code to use + the new definitions in the io and + os packages. + + Here is a list of the new locations of the names exported + by io/ioutil: +

    +

    + + The package now defines + Discard, + NopCloser, and + ReadAll, + to be used instead of the same names in the + io/ioutil package. +

    @@ -896,6 +943,16 @@ func TestFoo(t *testing.T) { instead of the unexported errFinished when the process has already finished.

    + +

    + The package now defines + CreateTemp, + MkdirTemp, + ReadFile, and + WriteFile, + to be used instead of functions defined in the + io/ioutil package. +

    -- GitLab From a51921fa5b1398227efd61ceb3991313f037d7fa Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 21 Jan 2021 22:47:18 -0800 Subject: [PATCH 1697/1792] doc/go1.16: mention new testing/iotest functions For #38781 For #40700 For #41190 Change-Id: I72f1055e51edb517041d3861640734ba6ef5f342 Reviewed-on: https://go-review.googlesource.com/c/go/+/285673 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 37a2160944..1a88568acb 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -1071,6 +1071,25 @@ func TestFoo(t *testing.T) { +
    testing/iotest
    +
    +

    + The new + ErrReader + function returns an + io.Reader that always + returns an error. +

    + +

    + The new + TestReader + function tests that an io.Reader + behaves correctly. +

    +
    +
    +
    text/template

    -- GitLab From ad2ca26a521a5a642f51c3ef8e3004c9ce7af5aa Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 21 Jan 2021 17:29:36 -0800 Subject: [PATCH 1698/1792] doc/go1.16: mention os.DirEntry and types moved from os to io/fs For #40700 For #41467 For #41190 Change-Id: Id94e7511c98c38a22b1f9a55af6e200c9df07fd3 Reviewed-on: https://go-review.googlesource.com/c/go/+/285592 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 1a88568acb..e1e8c7a833 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -944,6 +944,23 @@ func TestFoo(t *testing.T) { already finished.

    +

    + The package defines a new type + DirEntry + as an alias for fs.DirEntry. + The new ReadDir + function and the new + File.ReadDir + method can be used to read the contents of a directory into a + slice of DirEntry. + The File.Readdir + method (note the lower case d in dir) + still exists, returning a slice of + FileInfo, but for + most programs it will be more efficient to switch to + File.ReadDir. +

    +

    The package now defines CreateTemp, @@ -953,6 +970,18 @@ func TestFoo(t *testing.T) { to be used instead of functions defined in the io/ioutil package.

    + +

    + The types FileInfo, + FileMode, and + PathError + are now aliases for types of the same name in the + io/fs package. + Function signatures in the os + package have been updated to refer to the names in the + io/fs package. + This should not affect any existing code. +

    -- GitLab From deaf29a8a8ab76613bf0d5d97c4e31bfbdc4c4e9 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Thu, 21 Jan 2021 19:27:12 -0800 Subject: [PATCH 1699/1792] cmd/compile: fix order-of-assignment issue w/ defers CL 261677 fixed a logic issue in walk's alias detection, where it was checking the RHS expression instead of the LHS expression when trying to determine the kind of assignment. However, correcting this exposed a latent issue with assigning to result parameters in functions with defers, where an assignment could become visible earlier than intended if a later expression could panic. Fixes #43835. Change-Id: I061ced125e3896e26d65f45b28c99db2c8a74a8c Reviewed-on: https://go-review.googlesource.com/c/go/+/285633 Run-TryBot: Matthew Dempsky Reviewed-by: Cuong Manh Le Reviewed-by: Keith Randall Trust: Matthew Dempsky --- src/cmd/compile/internal/gc/walk.go | 12 +++++++++-- test/fixedbugs/issue43835.go | 33 +++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue43835.go diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index a7b6e7fcb3..2133a160b2 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -267,7 +267,7 @@ func walkstmt(n *Node) *Node { if n.List.Len() == 0 { break } - if (Curfn.Type.FuncType().Outnamed && n.List.Len() > 1) || paramoutheap(Curfn) { + if (Curfn.Type.FuncType().Outnamed && n.List.Len() > 1) || paramoutheap(Curfn) || Curfn.Func.HasDefer() { // assign to the function out parameters, // so that reorder3 can fix up conflicts var rl []*Node @@ -2233,7 +2233,15 @@ func aliased(r *Node, all []*Node) bool { memwrite = true continue - case PAUTO, PPARAM, PPARAMOUT: + case PPARAMOUT: + // Assignments to a result parameter in a function with defers + // becomes visible early if evaluation of any later expression + // panics (#43835). + if Curfn.Func.HasDefer() { + return true + } + fallthrough + case PAUTO, PPARAM: if l.Name.Addrtaken() { memwrite = true continue diff --git a/test/fixedbugs/issue43835.go b/test/fixedbugs/issue43835.go new file mode 100644 index 0000000000..449eb72ee1 --- /dev/null +++ b/test/fixedbugs/issue43835.go @@ -0,0 +1,33 @@ +// run + +// 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 main + +func main() { + if f() { + panic("FAIL") + } + if bad, _ := g(); bad { + panic("FAIL") + } +} + +func f() (bad bool) { + defer func() { + recover() + }() + var p *int + bad, _ = true, *p + return +} + +func g() (bool, int) { + defer func() { + recover() + }() + var p *int + return true, *p +} -- GitLab From bf0f7c9d78fa28320a2c60d5a6d1956acfae4a89 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 21 Jan 2021 17:58:17 -0800 Subject: [PATCH 1700/1792] doc/go1.16: mention os.DirFS in os section For #40700 For #41190 Change-Id: I8ade6efd5be09003fc3e5db5a9b91ba6e0f023f7 Reviewed-on: https://go-review.googlesource.com/c/go/+/285593 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index e1e8c7a833..7ddb4a935e 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -982,6 +982,13 @@ func TestFoo(t *testing.T) { io/fs package. This should not affect any existing code.

    + +

    + The new DirFS function + provides an implementation of + fs.FS backed by a tree + of operating system files. +

    -- GitLab From ce8b318624adcdd45ecd53b33f6bae38bcccc7be Mon Sep 17 00:00:00 2001 From: Hilko Bengen Date: Mon, 25 Jan 2021 22:54:20 +0000 Subject: [PATCH 1701/1792] net/http/fcgi: remove locking added to prevent a test-only race The race reported in issue #41167 was detected only because the ReadWriter used in test code happened to be a bytes.Buffer whose Read and Write operate (unsafely) on shared state. This is not the case in any realistic scenario where the FastCGI protocol is spoken over sockets or pairs of pipes. Since tests that use nopWriteCloser don't care about any output generate by child.Serve(), we change nopWriteCloser to provide a dummy Write method. Remove the locking added in CL 252417, since it causes a deadlock during write as reported in #43901. The race in tests no longer happens thanks to the aforementioned change to nopWriteCloser. Fixes #43901. Updates #41167. Change-Id: I8cf31088a71253c34056698f8e2ad0bee9fcf6c6 GitHub-Last-Rev: b06d8377fdada075775d79a20577d38a7c471b45 GitHub-Pull-Request: golang/go#43027 Reviewed-on: https://go-review.googlesource.com/c/go/+/275692 Reviewed-by: Ian Lance Taylor Trust: Dmitri Shuralyov --- src/net/http/fcgi/child.go | 3 --- src/net/http/fcgi/fcgi_test.go | 12 ++++++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/net/http/fcgi/child.go b/src/net/http/fcgi/child.go index e97b8440e1..756722ba14 100644 --- a/src/net/http/fcgi/child.go +++ b/src/net/http/fcgi/child.go @@ -171,12 +171,9 @@ func (c *child) serve() { defer c.cleanUp() var rec record for { - c.conn.mutex.Lock() if err := rec.read(c.conn.rwc); err != nil { - c.conn.mutex.Unlock() return } - c.conn.mutex.Unlock() if err := c.handleRecord(&rec); err != nil { return } diff --git a/src/net/http/fcgi/fcgi_test.go b/src/net/http/fcgi/fcgi_test.go index d3b704f821..b58111de20 100644 --- a/src/net/http/fcgi/fcgi_test.go +++ b/src/net/http/fcgi/fcgi_test.go @@ -221,7 +221,11 @@ var cleanUpTests = []struct { } type nopWriteCloser struct { - io.ReadWriter + io.Reader +} + +func (nopWriteCloser) Write(buf []byte) (int, error) { + return len(buf), nil } func (nopWriteCloser) Close() error { @@ -235,7 +239,7 @@ func TestChildServeCleansUp(t *testing.T) { for _, tt := range cleanUpTests { input := make([]byte, len(tt.input)) copy(input, tt.input) - rc := nopWriteCloser{bytes.NewBuffer(input)} + rc := nopWriteCloser{bytes.NewReader(input)} done := make(chan bool) c := newChild(rc, http.HandlerFunc(func( w http.ResponseWriter, @@ -325,7 +329,7 @@ func TestChildServeReadsEnvVars(t *testing.T) { for _, tt := range envVarTests { input := make([]byte, len(tt.input)) copy(input, tt.input) - rc := nopWriteCloser{bytes.NewBuffer(input)} + rc := nopWriteCloser{bytes.NewReader(input)} done := make(chan bool) c := newChild(rc, http.HandlerFunc(func( w http.ResponseWriter, @@ -375,7 +379,7 @@ func TestResponseWriterSniffsContentType(t *testing.T) { t.Run(tt.name, func(t *testing.T) { input := make([]byte, len(streamFullRequestStdin)) copy(input, streamFullRequestStdin) - rc := nopWriteCloser{bytes.NewBuffer(input)} + rc := nopWriteCloser{bytes.NewReader(input)} done := make(chan bool) var resp *response c := newChild(rc, http.HandlerFunc(func( -- GitLab From cf263e9f772eeeac21df6fe8f51a8c93e8ad5a27 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 21 Jan 2021 16:13:35 -0800 Subject: [PATCH 1702/1792] os: correct names in CreateTemp and MkdirTemp doc comments For #42026 Change-Id: I51e3ce9d3a4729cfac44bd3ff3f3ec80dcd5abb5 Reviewed-on: https://go-review.googlesource.com/c/go/+/285376 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- src/os/tempfile.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/os/tempfile.go b/src/os/tempfile.go index 4f90fcf8e8..1ad44f1163 100644 --- a/src/os/tempfile.go +++ b/src/os/tempfile.go @@ -20,7 +20,7 @@ func nextRandom() string { // opens the file for reading and writing, and returns the resulting file. // The filename is generated by taking pattern and adding a random string to the end. // If pattern includes a "*", the random string replaces the last "*". -// If dir is the empty string, TempFile uses the default directory for temporary files, as returned by TempDir. +// If dir is the empty string, CreateTemp uses the default directory for temporary files, as returned by TempDir. // Multiple programs or goroutines calling CreateTemp simultaneously will not choose the same file. // The caller can use the file's Name method to find the pathname of the file. // It is the caller's responsibility to remove the file when it is no longer needed. @@ -71,7 +71,7 @@ func prefixAndSuffix(pattern string) (prefix, suffix string, err error) { // and returns the pathname of the new directory. // The new directory's name is generated by adding a random string to the end of pattern. // If pattern includes a "*", the random string replaces the last "*" instead. -// If dir is the empty string, TempFile uses the default directory for temporary files, as returned by TempDir. +// If dir is the empty string, MkdirTemp uses the default directory for temporary files, as returned by TempDir. // Multiple programs or goroutines calling MkdirTemp simultaneously will not choose the same directory. // It is the caller's responsibility to remove the directory when it is no longer needed. func MkdirTemp(dir, pattern string) (string, error) { -- GitLab From 1d5e14632edc2ba76156c8a771a2a1a5c5387326 Mon Sep 17 00:00:00 2001 From: Victor Michel Date: Sun, 24 Jan 2021 05:53:36 +0000 Subject: [PATCH 1703/1792] os: further document limitations around naked file descriptors NewFile requires the file descriptor to be either closed through the returned File instance, or to stay valid at least until the finalizer runs during garbage collection. These requirements are easily violated when file descriptors are closed via unix.Close, or when the *File returned by NewFile is garbage collected while the underlying file descriptor is still in use. This commit adds further documentation for NewFile and Fd, making it explicit that using naked file descriptors is subject to constraints due to garbage collection of File objects. Fixes #43863 Change-Id: I49ea1f0054eb2d2a72b616450c8e83476f4d07fb GitHub-Last-Rev: 180d0130ae9009456914fb265b4bafa0e599de0e GitHub-Pull-Request: golang/go#43867 Reviewed-on: https://go-review.googlesource.com/c/go/+/286032 Trust: Ian Lance Taylor Reviewed-by: Rob Pike --- src/os/file_unix.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/os/file_unix.go b/src/os/file_unix.go index 0dc7a5a0a2..f88450018e 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -66,6 +66,10 @@ type file struct { // making it invalid; see runtime.SetFinalizer for more information on when // a finalizer might be run. On Unix systems this will cause the SetDeadline // methods to stop working. +// Because file descriptors can be reused, the returned file descriptor may +// only be closed through the Close method of f, or by its finalizer during +// garbage collection. Otherwise, during garbage collection the finalizer +// may close an unrelated file descriptor with the same (reused) number. // // As an alternative, see the f.SyscallConn method. func (f *File) Fd() uintptr { @@ -90,6 +94,10 @@ func (f *File) Fd() uintptr { // descriptor. On Unix systems, if the file descriptor is in // non-blocking mode, NewFile will attempt to return a pollable File // (one for which the SetDeadline methods work). +// +// After passing it to NewFile, fd may become invalid under the same +// 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 { -- GitLab From 8634a234df2a9e93ed1de58bf59d2eb843d8f464 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Mon, 16 Nov 2020 04:47:56 +1100 Subject: [PATCH 1704/1792] runtime,syscall: convert syscall on openbsd/amd64 to libc Convert the syscall package on openbsd/amd64 to use libc rather than performing direct system calls. Updates #36435 Change-Id: Ieb5926a91ed34f7c722e3667004ec484c86804ef Reviewed-on: https://go-review.googlesource.com/c/go/+/270380 Trust: Joel Sing Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot --- src/runtime/sys_openbsd3.go | 113 ++ src/runtime/sys_openbsd_amd64.s | 333 ++++++ src/syscall/asm9_unix1_amd64.s | 4 +- src/syscall/asm_openbsd_amd64.s | 32 + src/syscall/asm_unix_amd64.s | 2 +- src/syscall/exec_bsd.go | 2 +- src/syscall/{exec_darwin.go => exec_libc2.go} | 2 + src/syscall/exec_unix.go | 4 + src/syscall/mkall.sh | 9 +- src/syscall/mkasm.go | 64 ++ .../{mkasm_darwin.go => mkasm_openbsd.go} | 25 +- src/syscall/mksyscall.pl | 30 +- src/syscall/syscall_openbsd.go | 5 - src/syscall/syscall_openbsd1.go | 13 + src/syscall/syscall_openbsd_libc.go | 93 ++ src/syscall/zsyscall_darwin_amd64.s | 2 +- src/syscall/zsyscall_darwin_arm64.s | 2 +- src/syscall/zsyscall_openbsd_amd64.go | 967 +++++++++++++++--- src/syscall/zsyscall_openbsd_amd64.s | 233 +++++ 19 files changed, 1762 insertions(+), 173 deletions(-) create mode 100644 src/runtime/sys_openbsd3.go create mode 100644 src/syscall/asm_openbsd_amd64.s rename src/syscall/{exec_darwin.go => exec_libc2.go} (99%) create mode 100644 src/syscall/mkasm.go rename src/syscall/{mkasm_darwin.go => mkasm_openbsd.go} (51%) create mode 100644 src/syscall/syscall_openbsd1.go create mode 100644 src/syscall/syscall_openbsd_libc.go create mode 100644 src/syscall/zsyscall_openbsd_amd64.s diff --git a/src/runtime/sys_openbsd3.go b/src/runtime/sys_openbsd3.go new file mode 100644 index 0000000000..a8f9b0ee14 --- /dev/null +++ b/src/runtime/sys_openbsd3.go @@ -0,0 +1,113 @@ +// 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 openbsd,amd64 + +package runtime + +import "unsafe" + +// The X versions of syscall expect the libc call to return a 64-bit result. +// Otherwise (the non-X version) expects a 32-bit result. +// This distinction is required because an error is indicated by returning -1, +// and we need to know whether to check 32 or 64 bits of the result. +// (Some libc functions that return 32 bits put junk in the upper 32 bits of AX.) + +//go:linkname syscall_syscall syscall.syscall +//go:nosplit +//go:cgo_unsafe_args +func syscall_syscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) { + entersyscall() + libcCall(unsafe.Pointer(funcPC(syscall)), unsafe.Pointer(&fn)) + exitsyscall() + return +} +func syscall() + +//go:linkname syscall_syscallX syscall.syscallX +//go:nosplit +//go:cgo_unsafe_args +func syscall_syscallX(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) { + entersyscall() + libcCall(unsafe.Pointer(funcPC(syscallX)), unsafe.Pointer(&fn)) + exitsyscall() + return +} +func syscallX() + +//go:linkname syscall_syscall6 syscall.syscall6 +//go:nosplit +//go:cgo_unsafe_args +func syscall_syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) { + entersyscall() + libcCall(unsafe.Pointer(funcPC(syscall6)), unsafe.Pointer(&fn)) + exitsyscall() + return +} +func syscall6() + +//go:linkname syscall_syscall6X syscall.syscall6X +//go:nosplit +//go:cgo_unsafe_args +func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) { + entersyscall() + libcCall(unsafe.Pointer(funcPC(syscall6X)), unsafe.Pointer(&fn)) + exitsyscall() + return +} +func syscall6X() + +//go:linkname syscall_syscall10 syscall.syscall10 +//go:nosplit +//go:cgo_unsafe_args +func syscall_syscall10(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 uintptr) (r1, r2, err uintptr) { + entersyscall() + libcCall(unsafe.Pointer(funcPC(syscall10)), unsafe.Pointer(&fn)) + exitsyscall() + return +} +func syscall10() + +//go:linkname syscall_syscall10X syscall.syscall10X +//go:nosplit +//go:cgo_unsafe_args +func syscall_syscall10X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 uintptr) (r1, r2, err uintptr) { + entersyscall() + libcCall(unsafe.Pointer(funcPC(syscall10X)), unsafe.Pointer(&fn)) + exitsyscall() + return +} +func syscall10X() + +//go:linkname syscall_rawSyscall syscall.rawSyscall +//go:nosplit +//go:cgo_unsafe_args +func syscall_rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) { + libcCall(unsafe.Pointer(funcPC(syscall)), unsafe.Pointer(&fn)) + return +} + +//go:linkname syscall_rawSyscall6 syscall.rawSyscall6 +//go:nosplit +//go:cgo_unsafe_args +func syscall_rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) { + libcCall(unsafe.Pointer(funcPC(syscall6)), unsafe.Pointer(&fn)) + return +} + +//go:linkname syscall_rawSyscall6X syscall.rawSyscall6X +//go:nosplit +//go:cgo_unsafe_args +func syscall_rawSyscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) { + libcCall(unsafe.Pointer(funcPC(syscall6X)), unsafe.Pointer(&fn)) + return +} + +//go:linkname syscall_rawSyscall10X syscall.rawSyscall10X +//go:nosplit +//go:cgo_unsafe_args +func syscall_rawSyscall10X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 uintptr) (r1, r2, err uintptr) { + libcCall(unsafe.Pointer(funcPC(syscall10X)), unsafe.Pointer(&fn)) + return +} diff --git a/src/runtime/sys_openbsd_amd64.s b/src/runtime/sys_openbsd_amd64.s index 4680a7f7aa..534645eec4 100644 --- a/src/runtime/sys_openbsd_amd64.s +++ b/src/runtime/sys_openbsd_amd64.s @@ -445,3 +445,336 @@ TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0 MOVL $0xf1, 0xf1 // crash POPQ BP RET + +// syscall calls a function in libc on behalf of the syscall package. +// syscall takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// 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 + MOVQ (0*8)(DI), CX // fn + MOVQ (2*8)(DI), SI // a2 + MOVQ (3*8)(DI), DX // a3 + MOVQ DI, (SP) + MOVQ (1*8)(DI), DI // a1 + XORL AX, AX // vararg: say "no float args" + + CALL CX + + MOVQ (SP), DI + MOVQ AX, (4*8)(DI) // r1 + MOVQ DX, (5*8)(DI) // r2 + + // Standard libc functions return -1 on error + // and set errno. + CMPL AX, $-1 // Note: high 32 bits are junk + JNE ok + + // Get error code from libc. + CALL libc_errno(SB) + MOVLQSX (AX), AX + MOVQ (SP), DI + MOVQ AX, (6*8)(DI) // err + +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. +// syscallX takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscallX must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// 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 + MOVQ (0*8)(DI), CX // fn + MOVQ (2*8)(DI), SI // a2 + MOVQ (3*8)(DI), DX // a3 + MOVQ DI, (SP) + MOVQ (1*8)(DI), DI // a1 + XORL AX, AX // vararg: say "no float args" + + CALL CX + + MOVQ (SP), DI + MOVQ AX, (4*8)(DI) // r1 + MOVQ DX, (5*8)(DI) // r2 + + // Standard libc functions return -1 on error + // and set errno. + CMPQ AX, $-1 + JNE ok + + // Get error code from libc. + CALL libc_errno(SB) + MOVLQSX (AX), AX + MOVQ (SP), DI + MOVQ AX, (6*8)(DI) // err + +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. +// syscall6 takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// a4 uintptr +// a5 uintptr +// a6 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall6 must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// 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 + MOVQ (0*8)(DI), R11// fn + MOVQ (2*8)(DI), SI // a2 + MOVQ (3*8)(DI), DX // a3 + MOVQ (4*8)(DI), CX // a4 + MOVQ (5*8)(DI), R8 // a5 + MOVQ (6*8)(DI), R9 // a6 + MOVQ DI, (SP) + MOVQ (1*8)(DI), DI // a1 + XORL AX, AX // vararg: say "no float args" + + CALL R11 + + MOVQ (SP), DI + MOVQ AX, (7*8)(DI) // r1 + MOVQ DX, (8*8)(DI) // r2 + + CMPL AX, $-1 + JNE ok + + CALL libc_errno(SB) + MOVLQSX (AX), AX + MOVQ (SP), DI + MOVQ AX, (9*8)(DI) // err + +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. +// syscall6X takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// a4 uintptr +// a5 uintptr +// a6 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall6X must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// 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 + MOVQ (0*8)(DI), R11// fn + MOVQ (2*8)(DI), SI // a2 + MOVQ (3*8)(DI), DX // a3 + MOVQ (4*8)(DI), CX // a4 + MOVQ (5*8)(DI), R8 // a5 + MOVQ (6*8)(DI), R9 // a6 + MOVQ DI, (SP) + MOVQ (1*8)(DI), DI // a1 + XORL AX, AX // vararg: say "no float args" + + CALL R11 + + MOVQ (SP), DI + MOVQ AX, (7*8)(DI) // r1 + MOVQ DX, (8*8)(DI) // r2 + + CMPQ AX, $-1 + JNE ok + + CALL libc_errno(SB) + MOVLQSX (AX), AX + MOVQ (SP), DI + MOVQ AX, (9*8)(DI) // err + +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. +// syscall10 takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// a4 uintptr +// a5 uintptr +// a6 uintptr +// a7 uintptr +// a8 uintptr +// a9 uintptr +// a10 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// 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 + MOVQ (7*8)(DI), R10 // a7 + MOVQ (8*8)(DI), R11 // a8 + MOVQ (9*8)(DI), R12 // a9 + MOVQ (10*8)(DI), R13 // a10 + MOVQ R10, (1*8)(SP) // a7 + MOVQ R11, (2*8)(SP) // a8 + MOVQ R12, (3*8)(SP) // a9 + MOVQ R13, (4*8)(SP) // a10 + MOVQ (0*8)(DI), R11 // fn + MOVQ (2*8)(DI), SI // a2 + MOVQ (3*8)(DI), DX // a3 + MOVQ (4*8)(DI), CX // a4 + MOVQ (5*8)(DI), R8 // a5 + MOVQ (6*8)(DI), R9 // a6 + MOVQ DI, (SP) + MOVQ (1*8)(DI), DI // a1 + XORL AX, AX // vararg: say "no float args" + + CALL R11 + + MOVQ (SP), DI + MOVQ AX, (11*8)(DI) // r1 + MOVQ DX, (12*8)(DI) // r2 + + CMPL AX, $-1 + JNE ok + + CALL libc_errno(SB) + MOVLQSX (AX), AX + MOVQ (SP), DI + MOVQ AX, (13*8)(DI) // err + +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. +// syscall10X takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// a4 uintptr +// a5 uintptr +// a6 uintptr +// a7 uintptr +// a8 uintptr +// a9 uintptr +// a10 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall10X must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// 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 + MOVQ (7*8)(DI), R10 // a7 + MOVQ (8*8)(DI), R11 // a8 + MOVQ (9*8)(DI), R12 // a9 + MOVQ (10*8)(DI), R13 // a10 + MOVQ R10, (1*8)(SP) // a7 + MOVQ R11, (2*8)(SP) // a8 + MOVQ R12, (3*8)(SP) // a9 + MOVQ R13, (4*8)(SP) // a10 + MOVQ (0*8)(DI), R11 // fn + MOVQ (2*8)(DI), SI // a2 + MOVQ (3*8)(DI), DX // a3 + MOVQ (4*8)(DI), CX // a4 + MOVQ (5*8)(DI), R8 // a5 + MOVQ (6*8)(DI), R9 // a6 + MOVQ DI, (SP) + MOVQ (1*8)(DI), DI // a1 + XORL AX, AX // vararg: say "no float args" + + CALL R11 + + MOVQ (SP), DI + MOVQ AX, (11*8)(DI) // r1 + MOVQ DX, (12*8)(DI) // r2 + + CMPQ AX, $-1 + JNE ok + + CALL libc_errno(SB) + MOVLQSX (AX), AX + MOVQ (SP), DI + MOVQ AX, (13*8)(DI) // err + +ok: + XORL AX, AX // no error (it's ignored anyway) + MOVQ BP, SP + POPQ BP + RET diff --git a/src/syscall/asm9_unix1_amd64.s b/src/syscall/asm9_unix1_amd64.s index 29af78c801..f2ae87d623 100644 --- a/src/syscall/asm9_unix1_amd64.s +++ b/src/syscall/asm9_unix1_amd64.s @@ -1,4 +1,4 @@ -// +build netbsd openbsd +// +build netbsd // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -8,7 +8,7 @@ #include "funcdata.h" // -// Syscall9 support for AMD64, NetBSD and OpenBSD +// Syscall9 support for AMD64, NetBSD // // func Syscall9(trap int64, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int64); diff --git a/src/syscall/asm_openbsd_amd64.s b/src/syscall/asm_openbsd_amd64.s new file mode 100644 index 0000000000..8d2ffd11bb --- /dev/null +++ b/src/syscall/asm_openbsd_amd64.s @@ -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. + +#include "textflag.h" + +// +// System call support for AMD64, OpenBSD +// + +// Provide these function names via assembly so they are provided as ABI0, +// rather than ABIInternal. + +// func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP ·syscallInternal(SB) + +// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP ·syscall6Internal(SB) + +// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP ·rawSyscallInternal(SB) + +// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP ·rawSyscall6Internal(SB) + +// func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP ·syscall9Internal(SB) diff --git a/src/syscall/asm_unix_amd64.s b/src/syscall/asm_unix_amd64.s index 9cf3fe0d35..aa03eb96a0 100644 --- a/src/syscall/asm_unix_amd64.s +++ b/src/syscall/asm_unix_amd64.s @@ -1,4 +1,4 @@ -// +build netbsd freebsd openbsd dragonfly +// +build netbsd freebsd dragonfly // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style diff --git a/src/syscall/exec_bsd.go b/src/syscall/exec_bsd.go index b297db96cc..9069ef4613 100644 --- a/src/syscall/exec_bsd.go +++ b/src/syscall/exec_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. -// +build dragonfly freebsd netbsd openbsd +// +build dragonfly freebsd netbsd openbsd,!amd64 package syscall diff --git a/src/syscall/exec_darwin.go b/src/syscall/exec_libc2.go similarity index 99% rename from src/syscall/exec_darwin.go rename to src/syscall/exec_libc2.go index f035d55553..496e7cf4c3 100644 --- a/src/syscall/exec_darwin.go +++ b/src/syscall/exec_libc2.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build darwin openbsd,amd64 + package syscall import ( diff --git a/src/syscall/exec_unix.go b/src/syscall/exec_unix.go index 725c2bc1f9..1f49c78ef9 100644 --- a/src/syscall/exec_unix.go +++ b/src/syscall/exec_unix.go @@ -272,6 +272,7 @@ func runtime_AfterExec() // avoids a build dependency for other platforms. var execveLibc func(path uintptr, argv uintptr, envp uintptr) Errno var execveDarwin func(path *byte, argv **byte, envp **byte) error +var execveOpenBSD func(path *byte, argv **byte, envp **byte) error // Exec invokes the execve(2) system call. func Exec(argv0 string, argv []string, envv []string) (err error) { @@ -299,6 +300,9 @@ func Exec(argv0 string, argv []string, envv []string) (err error) { } else if runtime.GOOS == "darwin" || runtime.GOOS == "ios" { // Similarly on Darwin. err1 = execveDarwin(argv0p, &argvp[0], &envvp[0]) + } else if runtime.GOOS == "openbsd" && runtime.GOARCH == "amd64" { + // Similarly on OpenBSD. + err1 = execveOpenBSD(argv0p, &argvp[0], &envvp[0]) } else { _, _, err1 = RawSyscall(SYS_EXECVE, uintptr(unsafe.Pointer(argv0p)), diff --git a/src/syscall/mkall.sh b/src/syscall/mkall.sh index 8f1111dafb..3aaf8c429d 100755 --- a/src/syscall/mkall.sh +++ b/src/syscall/mkall.sh @@ -283,6 +283,7 @@ netbsd_arm64) mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_386) + GOOSARCH_in="syscall_openbsd1.go syscall_openbsd_$GOARCH.go" mkerrors="$mkerrors -m32" mksyscall="./mksyscall.pl -l32 -openbsd" mksysctl="./mksysctl_openbsd.pl" @@ -291,14 +292,17 @@ openbsd_386) mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_amd64) + GOOSARCH_in="syscall_openbsd_libc.go syscall_openbsd_$GOARCH.go" mkerrors="$mkerrors -m64" - mksyscall="./mksyscall.pl -openbsd" + mksyscall="./mksyscall.pl -openbsd -libc" mksysctl="./mksysctl_openbsd.pl" zsysctl="zsysctl_openbsd.go" mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" + mkasm="go run mkasm_openbsd.go" ;; openbsd_arm) + GOOSARCH_in="syscall_openbsd1.go syscall_openbsd_$GOARCH.go" mkerrors="$mkerrors" mksyscall="./mksyscall.pl -l32 -openbsd -arm" mksysctl="./mksysctl_openbsd.pl" @@ -309,6 +313,7 @@ openbsd_arm) mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; openbsd_arm64) + GOOSARCH_in="syscall_openbsd1.go syscall_openbsd_$GOARCH.go" mkerrors="$mkerrors -m64" mksyscall="./mksyscall.pl -openbsd" mksysctl="./mksysctl_openbsd.pl" @@ -319,6 +324,7 @@ openbsd_arm64) mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; openbsd_mips64) + GOOSARCH_in="syscall_openbsd1.go syscall_openbsd_$GOARCH.go" mkerrors="$mkerrors -m64" mksyscall="./mksyscall.pl -openbsd" mksysctl="./mksysctl_openbsd.pl" @@ -327,7 +333,6 @@ openbsd_mips64) # Let the type of C char be signed to make the bare syscall # API consistent between platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" - GOOSARCH_in=syscall_openbsd_mips64.go ;; plan9_386) mkerrors= diff --git a/src/syscall/mkasm.go b/src/syscall/mkasm.go new file mode 100644 index 0000000000..2ebaf8d351 --- /dev/null +++ b/src/syscall/mkasm.go @@ -0,0 +1,64 @@ +// 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 ignore + +// mkasm.go generates assembly trampolines to call library routines from Go. +// This program must be run after mksyscall.pl. +package main + +import ( + "bytes" + "fmt" + "log" + "os" + "strings" +) + +func main() { + if len(os.Args) != 3 { + log.Fatalf("Usage: %s ", os.Args[0]) + } + goos, arch := os.Args[1], os.Args[2] + + syscallFilename := fmt.Sprintf("syscall_%s.go", goos) + syscallArchFilename := fmt.Sprintf("syscall_%s_%s.go", goos, arch) + + in1, err := os.ReadFile(syscallFilename) + if err != nil { + log.Fatalf("can't open syscall file: %s", err) + } + in2, err := os.ReadFile(syscallArchFilename) + if err != nil { + log.Fatalf("can't open syscall file: %s", err) + } + in3, err := os.ReadFile("z" + syscallArchFilename) + if err != nil { + log.Fatalf("can't open syscall file: %s", err) + } + in := string(in1) + string(in2) + string(in3) + + trampolines := map[string]bool{} + + var out bytes.Buffer + + fmt.Fprintf(&out, "// go run mkasm.go %s\n", strings.Join(os.Args[1:], " ")) + fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") + fmt.Fprintf(&out, "#include \"textflag.h\"\n") + for _, line := range strings.Split(in, "\n") { + if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") { + continue + } + fn := line[5 : len(line)-13] + if !trampolines[fn] { + trampolines[fn] = true + fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn) + fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) + } + } + err = os.WriteFile(fmt.Sprintf("zsyscall_%s_%s.s", goos, arch), out.Bytes(), 0644) + if err != nil { + log.Fatalf("can't write syscall file: %s", err) + } +} diff --git a/src/syscall/mkasm_darwin.go b/src/syscall/mkasm_openbsd.go similarity index 51% rename from src/syscall/mkasm_darwin.go rename to src/syscall/mkasm_openbsd.go index 1783387a53..9b938bde8c 100644 --- a/src/syscall/mkasm_darwin.go +++ b/src/syscall/mkasm_openbsd.go @@ -1,34 +1,35 @@ -// Copyright 2018 The Go Authors. All rights reserved. +// 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 -// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go. -//This program must be run after mksyscall.pl. +// mkasm_openbsd.go generates assembly trampolines to call libc routines from Go. +// This program must be run after mksyscall.pl. package main import ( "bytes" "fmt" + "io/ioutil" "log" "os" "strings" ) func main() { - in1, err := os.ReadFile("syscall_darwin.go") + in1, err := ioutil.ReadFile("syscall_openbsd.go") if err != nil { - log.Fatalf("can't open syscall_darwin.go: %s", err) + log.Fatalf("can't open syscall_openbsd.go: %s", err) } arch := os.Args[1] - in2, err := os.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch)) + in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_openbsd_%s.go", arch)) if err != nil { - log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err) + log.Fatalf("can't open syscall_openbsd_%s.go: %s", arch, err) } - in3, err := os.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch)) + in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_openbsd_%s.go", arch)) if err != nil { - log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err) + log.Fatalf("can't open zsyscall_openbsd_%s.go: %s", arch, err) } in := string(in1) + string(in2) + string(in3) @@ -36,7 +37,7 @@ func main() { var out bytes.Buffer - fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " ")) + fmt.Fprintf(&out, "// go run mkasm_openbsd.go %s\n", strings.Join(os.Args[1:], " ")) fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") fmt.Fprintf(&out, "#include \"textflag.h\"\n") for _, line := range strings.Split(in, "\n") { @@ -50,8 +51,8 @@ func main() { fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) } } - err = os.WriteFile(fmt.Sprintf("zsyscall_darwin_%s.s", arch), out.Bytes(), 0644) + err = ioutil.WriteFile(fmt.Sprintf("zsyscall_openbsd_%s.s", arch), out.Bytes(), 0644) if err != nil { - log.Fatalf("can't write zsyscall_darwin_%s.s: %s", arch, err) + log.Fatalf("can't write zsyscall_openbsd_%s.s: %s", arch, err) } } diff --git a/src/syscall/mksyscall.pl b/src/syscall/mksyscall.pl index 7e2cedfb6c..fa9e684d0f 100755 --- a/src/syscall/mksyscall.pl +++ b/src/syscall/mksyscall.pl @@ -30,6 +30,7 @@ my $openbsd = 0; my $netbsd = 0; my $dragonfly = 0; my $arm = 0; # 64-bit value should use (even, odd)-pair +my $libc = 0; my $tags = ""; # build tags if($ARGV[0] eq "-b32") { @@ -45,6 +46,7 @@ if($ARGV[0] eq "-plan9") { } if($ARGV[0] eq "-darwin") { $darwin = 1; + $libc = 1; shift; } if($ARGV[0] eq "-openbsd") { @@ -63,6 +65,10 @@ if($ARGV[0] eq "-arm") { $arm = 1; shift; } +if($ARGV[0] eq "-libc") { + $libc = 1; + shift; +} if($ARGV[0] eq "-tags") { shift; $tags = $ARGV[0]; @@ -125,7 +131,7 @@ while(<>) { # 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") { + if (($darwin || ($openbsd && $libc)) && $func eq "ptrace") { # The ptrace function is called from forkAndExecInChild where stack # growth is forbidden. $text .= "//go:nosplit\n" @@ -176,7 +182,9 @@ while(<>) { push @args, "uintptr(_p$n)", "uintptr(len($name))"; $n++; } elsif($type eq "int64" && ($openbsd || $netbsd)) { - push @args, "0"; + if (!$libc) { + push @args, "0"; + } if($_32bit eq "big-endian") { push @args, "uintptr($name>>32)", "uintptr($name)"; } elsif($_32bit eq "little-endian") { @@ -220,7 +228,7 @@ while(<>) { $asm = "RawSyscall"; } } - if ($darwin) { + if ($libc) { # Call unexported syscall functions (which take # libc functions instead of syscall numbers). $asm = lcfirst($asm); @@ -243,7 +251,7 @@ while(<>) { print STDERR "$ARGV:$.: too many arguments to system call\n"; } - if ($darwin) { + if ($darwin || ($openbsd && $libc)) { # Use extended versions for calls that generate a 64-bit result. my ($name, $type) = parseparam($out[0]); if ($type eq "int64" || ($type eq "uintptr" && $_32bit eq "")) { @@ -257,13 +265,13 @@ while(<>) { $sysname = "SYS_$func"; $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar $sysname =~ y/a-z/A-Z/; - if($darwin) { + if($libc) { $sysname =~ y/A-Z/a-z/; $sysname = substr $sysname, 4; $funcname = "libc_$sysname"; } } - if($darwin) { + if($libc) { if($funcname eq "") { $sysname = substr $sysname, 4; $funcname = "libc_$sysname"; @@ -338,17 +346,21 @@ while(<>) { } $text .= "\treturn\n"; $text .= "}\n\n"; - if($darwin) { + if($libc) { if (not exists $trampolines{$funcname}) { $trampolines{$funcname} = 1; # The assembly trampoline that jumps to the libc routine. $text .= "func ${funcname}_trampoline()\n"; # Map syscall.funcname to just plain funcname. - # (The jump to this function is in the assembly trampoline, generated by mksyscallasm_darwin.go.) + # (The jump to this function is in the assembly trampoline, generated by mkasm_$GOOS.go.) $text .= "//go:linkname $funcname $funcname\n"; # Tell the linker that funcname can be found in libSystem using varname without the libc_ prefix. my $basename = substr $funcname, 5; - $text .= "//go:cgo_import_dynamic $funcname $basename \"/usr/lib/libSystem.B.dylib\"\n\n"; + my $libc = "libc.so"; + if ($darwin) { + $libc = "/usr/lib/libSystem.B.dylib"; + } + $text .= "//go:cgo_import_dynamic $funcname $basename \"$libc\"\n\n"; } } } diff --git a/src/syscall/syscall_openbsd.go b/src/syscall/syscall_openbsd.go index eebb5ceb1a..5a5ba5a51b 100644 --- a/src/syscall/syscall_openbsd.go +++ b/src/syscall/syscall_openbsd.go @@ -182,7 +182,6 @@ func setattrlistTimes(path string, times []Timespec) error { //sys Rename(from string, to string) (err error) //sys Revoke(path string) (err error) //sys Rmdir(path string) (err error) -//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) //sysnb Setegid(egid int) (err error) //sysnb Seteuid(euid int) (err error) @@ -207,8 +206,4 @@ func setattrlistTimes(path string, times []Timespec) error { //sys write(fd int, p []byte) (n int, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) -//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ -//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) -//sys getcwd(buf []byte) (n int, err error) = SYS___GETCWD -//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL diff --git a/src/syscall/syscall_openbsd1.go b/src/syscall/syscall_openbsd1.go new file mode 100644 index 0000000000..d8065374fb --- /dev/null +++ b/src/syscall/syscall_openbsd1.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. + +// +build openbsd,!amd64 + +package syscall + +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys getcwd(buf []byte) (n int, err error) = SYS___GETCWD +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL diff --git a/src/syscall/syscall_openbsd_libc.go b/src/syscall/syscall_openbsd_libc.go new file mode 100644 index 0000000000..191c7e0e43 --- /dev/null +++ b/src/syscall/syscall_openbsd_libc.go @@ -0,0 +1,93 @@ +// 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 openbsd,amd64 + +package syscall + +import "unsafe" + +//sys directSyscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr) (ret uintptr, err error) = SYS_syscall + +func syscallInternal(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { + return syscall6X(funcPC(libc_syscall_trampoline), trap, a1, a2, a3, 0, 0) +} + +func syscall6Internal(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { + return syscall10X(funcPC(libc_syscall_trampoline), trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) +} + +func rawSyscallInternal(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { + return rawSyscall6X(funcPC(libc_syscall_trampoline), trap, a1, a2, a3, 0, 0) +} + +func rawSyscall6Internal(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) { + return rawSyscall10X(funcPC(libc_syscall_trampoline), trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) +} + +func syscall9Internal(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) { + return rawSyscall10X(funcPC(libc_syscall_trampoline), trap, a1, a2, a3, a4, a5, a6, a7, a8, a9) +} + +// Implemented in the runtime package (runtime/sys_openbsd3.go) +func syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall10(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 uintptr) (r1, r2 uintptr, err Errno) +func syscall10X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 uintptr) (r1, r2 uintptr, err Errno) +func rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +func rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func rawSyscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func rawSyscall10X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 uintptr) (r1, r2 uintptr, err Errno) + +func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) { + return syscall10(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, 0) +} +func syscall9X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) { + return syscall10X(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, 0) +} + +// Find the entry point for f. See comments in runtime/proc.go for the +// function of the same name. +//go:nosplit +func funcPC(f func()) uintptr { + return **(**uintptr)(unsafe.Pointer(&f)) +} + +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_lseek +//sys getcwd(buf []byte) (n int, err error) +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) +//sysnb fork() (pid int, err error) +//sysnb ioctl(fd int, req int, arg int) (err error) +//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) +//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 +//sys unlinkat(fd int, path string, flags int) (err error) +//sys openat(fd int, path string, flags int, perm uint32) (fdret int, err error) + +func init() { + execveOpenBSD = execve +} + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := syscall(funcPC(libc_read_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := syscall(funcPC(libc_write_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/src/syscall/zsyscall_darwin_amd64.s b/src/syscall/zsyscall_darwin_amd64.s index d99656d028..492f947855 100644 --- a/src/syscall/zsyscall_darwin_amd64.s +++ b/src/syscall/zsyscall_darwin_amd64.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go amd64 +// go run mkasm.go darwin amd64 // Code generated by the command above; DO NOT EDIT. #include "textflag.h" TEXT ·libc_getfsstat_trampoline(SB),NOSPLIT,$0-0 diff --git a/src/syscall/zsyscall_darwin_arm64.s b/src/syscall/zsyscall_darwin_arm64.s index 0a8879d1c3..b606c6e49e 100644 --- a/src/syscall/zsyscall_darwin_arm64.s +++ b/src/syscall/zsyscall_darwin_arm64.s @@ -1,4 +1,4 @@ -// go run mkasm_darwin.go arm64 +// go run mkasm.go darwin arm64 // Code generated by the command above; DO NOT EDIT. #include "textflag.h" TEXT ·libc_getfsstat_trampoline(SB),NOSPLIT,$0-0 diff --git a/src/syscall/zsyscall_openbsd_amd64.go b/src/syscall/zsyscall_openbsd_amd64.go index f7390390e0..67dc0d3733 100644 --- a/src/syscall/zsyscall_openbsd_amd64.go +++ b/src/syscall/zsyscall_openbsd_amd64.go @@ -1,4 +1,4 @@ -// mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// mksyscall.pl -openbsd -libc -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_libc.go syscall_openbsd_amd64.go // Code generated by the command above; DO NOT EDIT. // +build openbsd,amd64 @@ -10,7 +10,7 @@ import "unsafe" // 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 := rawSyscall(funcPC(libc_getgroups_trampoline), uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -18,20 +18,30 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +func libc_getgroups_trampoline() + +//go:linkname libc_getgroups libc_getgroups +//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 := rawSyscall(funcPC(libc_setgroups_trampoline), uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setgroups_trampoline() + +//go:linkname libc_setgroups libc_setgroups +//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 := syscall6(funcPC(libc_wait4_trampoline), uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -39,10 +49,15 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +func libc_wait4_trampoline() + +//go:linkname libc_wait4 libc_wait4 +//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(funcPC(libc_accept_trampoline), uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -50,30 +65,45 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +func libc_accept_trampoline() + +//go:linkname libc_accept libc_accept +//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(funcPC(libc_bind_trampoline), uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_bind_trampoline() + +//go:linkname libc_bind libc_bind +//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(funcPC(libc_connect_trampoline), uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_connect_trampoline() + +//go:linkname libc_connect libc_connect +//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 := rawSyscall(funcPC(libc_socket_trampoline), uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -81,66 +111,101 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +func libc_socket_trampoline() + +//go:linkname libc_socket libc_socket +//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 := syscall6(funcPC(libc_getsockopt_trampoline), uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getsockopt_trampoline() + +//go:linkname libc_getsockopt libc_getsockopt +//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 := syscall6(funcPC(libc_setsockopt_trampoline), uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setsockopt_trampoline() + +//go:linkname libc_setsockopt libc_setsockopt +//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 := rawSyscall(funcPC(libc_getpeername_trampoline), uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getpeername_trampoline() + +//go:linkname libc_getpeername libc_getpeername +//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 := rawSyscall(funcPC(libc_getsockname_trampoline), uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getsockname_trampoline() + +//go:linkname libc_getsockname libc_getsockname +//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(funcPC(libc_shutdown_trampoline), uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_shutdown_trampoline() + +//go:linkname libc_shutdown libc_shutdown +//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 := rawSyscall6(funcPC(libc_socketpair_trampoline), uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_socketpair_trampoline() + +//go:linkname libc_socketpair libc_socketpair +//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) { @@ -150,7 +215,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } 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 := syscall6(funcPC(libc_recvfrom_trampoline), 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) @@ -158,6 +223,11 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +func libc_recvfrom_trampoline() + +//go:linkname libc_recvfrom libc_recvfrom +//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) { @@ -167,17 +237,22 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall6(funcPC(libc_sendto_trampoline), uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_sendto_trampoline() + +//go:linkname libc_sendto libc_sendto +//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(funcPC(libc_recvmsg_trampoline), uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -185,10 +260,15 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +func libc_recvmsg_trampoline() + +//go:linkname libc_recvmsg libc_recvmsg +//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(funcPC(libc_sendmsg_trampoline), uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -196,10 +276,15 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +func libc_sendmsg_trampoline() + +//go:linkname libc_sendmsg libc_sendmsg +//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 := syscall6(funcPC(libc_kevent_trampoline), uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -207,21 +292,10 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func libc_kevent_trampoline() -func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { - var _p0 unsafe.Pointer - if len(mib) > 0 { - _p0 = unsafe.Pointer(&mib[0]) - } 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)) - if e1 != 0 { - err = errnoErr(e1) - } - return -} +//go:linkname libc_kevent libc_kevent +//go:cgo_import_dynamic libc_kevent kevent "libc.so" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -231,27 +305,37 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall(funcPC(libc_utimes_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_utimes_trampoline() + +//go:linkname libc_utimes libc_utimes +//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(funcPC(libc_futimes_trampoline), uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_futimes_trampoline() + +//go:linkname libc_futimes libc_futimes +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + r0, _, e1 := syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -259,20 +343,30 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { return } +func libc_fcntl_trampoline() + +//go:linkname libc_fcntl libc_fcntl +//go:cgo_import_dynamic libc_fcntl fcntl "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 := rawSyscall(funcPC(libc_pipe2_trampoline), uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_pipe2_trampoline() + +//go:linkname libc_pipe2 libc_pipe2 +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { - r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + r0, _, e1 := syscall6(funcPC(libc_accept4_trampoline), uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -280,6 +374,11 @@ func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int return } +func libc_accept4_trampoline() + +//go:linkname libc_accept4 libc_accept4 +//go:cgo_import_dynamic libc_accept4 accept4 "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) { @@ -289,7 +388,7 @@ func getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall(funcPC(libc_getdents_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -297,6 +396,11 @@ func getdents(fd int, buf []byte) (n int, err error) { return } +func libc_getdents_trampoline() + +//go:linkname libc_getdents libc_getdents +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -305,23 +409,33 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall(funcPC(libc_access_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_access_trampoline() + +//go:linkname libc_access libc_access +//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(funcPC(libc_adjtime_trampoline), uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_adjtime_trampoline() + +//go:linkname libc_adjtime libc_adjtime +//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) { @@ -330,13 +444,18 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_chdir_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chdir_trampoline() + +//go:linkname libc_chdir libc_chdir +//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) { @@ -345,13 +464,18 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall(funcPC(libc_chflags_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chflags_trampoline() + +//go:linkname libc_chflags libc_chflags +//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) { @@ -360,13 +484,18 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall(funcPC(libc_chmod_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chmod_trampoline() + +//go:linkname libc_chmod libc_chmod +//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) { @@ -375,13 +504,18 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall(funcPC(libc_chown_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chown_trampoline() + +//go:linkname libc_chown libc_chown +//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) { @@ -390,27 +524,37 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_chroot_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chroot_trampoline() + +//go:linkname libc_chroot libc_chroot +//go:cgo_import_dynamic libc_chroot chroot "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(funcPC(libc_close_trampoline), uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_close_trampoline() + +//go:linkname libc_close libc_close +//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(funcPC(libc_dup_trampoline), uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -418,70 +562,105 @@ func Dup(fd int) (nfd int, err error) { return } +func libc_dup_trampoline() + +//go:linkname libc_dup libc_dup +//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(funcPC(libc_dup2_trampoline), uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_dup2_trampoline() + +//go:linkname libc_dup2 libc_dup2 +//go:cgo_import_dynamic libc_dup2 dup2 "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(funcPC(libc_fchdir_trampoline), uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fchdir_trampoline() + +//go:linkname libc_fchdir libc_fchdir +//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(funcPC(libc_fchflags_trampoline), uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fchflags_trampoline() + +//go:linkname libc_fchflags libc_fchflags +//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(funcPC(libc_fchmod_trampoline), uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fchmod_trampoline() + +//go:linkname libc_fchmod libc_fchmod +//go:cgo_import_dynamic libc_fchmod fchmod "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(funcPC(libc_fchown_trampoline), uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fchown_trampoline() + +//go:linkname libc_fchown libc_fchown +//go:cgo_import_dynamic libc_fchown fchown "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(funcPC(libc_flock_trampoline), uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_flock_trampoline() + +//go:linkname libc_flock libc_flock +//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(funcPC(libc_fpathconf_trampoline), uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -489,74 +668,114 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +func libc_fpathconf_trampoline() + +//go:linkname libc_fpathconf libc_fpathconf +//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(funcPC(libc_fstat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fstat_trampoline() + +//go:linkname libc_fstat libc_fstat +//go:cgo_import_dynamic libc_fstat fstat "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(funcPC(libc_fstatfs_trampoline), uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fstatfs_trampoline() + +//go:linkname libc_fstatfs libc_fstatfs +//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(funcPC(libc_fsync_trampoline), uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fsync_trampoline() + +//go:linkname libc_fsync libc_fsync +//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(funcPC(libc_ftruncate_trampoline), uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_ftruncate_trampoline() + +//go:linkname libc_ftruncate libc_ftruncate +//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, _, _ := rawSyscall(funcPC(libc_getegid_trampoline), 0, 0, 0) egid = int(r0) return } +func libc_getegid_trampoline() + +//go:linkname libc_getegid libc_getegid +//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, _, _ := rawSyscall(funcPC(libc_geteuid_trampoline), 0, 0, 0) uid = int(r0) return } +func libc_geteuid_trampoline() + +//go:linkname libc_geteuid libc_geteuid +//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, _, _ := rawSyscall(funcPC(libc_getgid_trampoline), 0, 0, 0) gid = int(r0) return } +func libc_getgid_trampoline() + +//go:linkname libc_getgid libc_getgid +//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 := rawSyscall(funcPC(libc_getpgid_trampoline), uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -564,34 +783,54 @@ func Getpgid(pid int) (pgid int, err error) { return } +func libc_getpgid_trampoline() + +//go:linkname libc_getpgid libc_getpgid +//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, _, _ := rawSyscall(funcPC(libc_getpgrp_trampoline), 0, 0, 0) pgrp = int(r0) return } +func libc_getpgrp_trampoline() + +//go:linkname libc_getpgrp libc_getpgrp +//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, _, _ := rawSyscall(funcPC(libc_getpid_trampoline), 0, 0, 0) pid = int(r0) return } +func libc_getpid_trampoline() + +//go:linkname libc_getpid libc_getpid +//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, _, _ := rawSyscall(funcPC(libc_getppid_trampoline), 0, 0, 0) ppid = int(r0) return } +func libc_getppid_trampoline() + +//go:linkname libc_getppid libc_getppid +//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(funcPC(libc_getpriority_trampoline), uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -599,30 +838,45 @@ func Getpriority(which int, who int) (prio int, err error) { return } +func libc_getpriority_trampoline() + +//go:linkname libc_getpriority libc_getpriority +//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 := rawSyscall(funcPC(libc_getrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getrlimit_trampoline() + +//go:linkname libc_getrlimit libc_getrlimit +//go:cgo_import_dynamic libc_getrlimit getrlimit "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 := rawSyscall(funcPC(libc_getrusage_trampoline), uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getrusage_trampoline() + +//go:linkname libc_getrusage libc_getrusage +//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 := rawSyscall(funcPC(libc_getsid_trampoline), uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -630,46 +884,71 @@ func Getsid(pid int) (sid int, err error) { return } +func libc_getsid_trampoline() + +//go:linkname libc_getsid libc_getsid +//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 := rawSyscall(funcPC(libc_gettimeofday_trampoline), uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_gettimeofday_trampoline() + +//go:linkname libc_gettimeofday libc_gettimeofday +//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, _, _ := rawSyscall(funcPC(libc_getuid_trampoline), 0, 0, 0) uid = int(r0) return } +func libc_getuid_trampoline() + +//go:linkname libc_getuid libc_getuid +//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(funcPC(libc_issetugid_trampoline), 0, 0, 0) tainted = bool(r0 != 0) return } +func libc_issetugid_trampoline() + +//go:linkname libc_issetugid libc_issetugid +//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 Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall(funcPC(libc_kill_trampoline), uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_kill_trampoline() + +//go:linkname libc_kill libc_kill +//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(funcPC(libc_kqueue_trampoline), 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -677,6 +956,11 @@ func Kqueue() (fd int, err error) { return } +func libc_kqueue_trampoline() + +//go:linkname libc_kqueue libc_kqueue +//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) { @@ -685,13 +969,18 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall(funcPC(libc_lchown_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_lchown_trampoline() + +//go:linkname libc_lchown libc_lchown +//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) { @@ -705,23 +994,33 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall(funcPC(libc_link_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_link_trampoline() + +//go:linkname libc_link libc_link +//go:cgo_import_dynamic libc_link link "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(funcPC(libc_listen_trampoline), uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_listen_trampoline() + +//go:linkname libc_listen libc_listen +//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) { @@ -730,13 +1029,18 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall(funcPC(libc_lstat_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_lstat_trampoline() + +//go:linkname libc_lstat libc_lstat +//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) { @@ -745,13 +1049,18 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall(funcPC(libc_mkdir_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_mkdir_trampoline() + +//go:linkname libc_mkdir libc_mkdir +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -760,13 +1069,18 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall(funcPC(libc_mkfifo_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_mkfifo_trampoline() + +//go:linkname libc_mkfifo libc_mkfifo +//go:cgo_import_dynamic libc_mkfifo mkfifo "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) { @@ -775,23 +1089,33 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall(funcPC(libc_mknod_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_mknod_trampoline() + +//go:linkname libc_mknod libc_mknod +//go:cgo_import_dynamic libc_mknod mknod "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(funcPC(libc_nanosleep_trampoline), uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_nanosleep_trampoline() + +//go:linkname libc_nanosleep libc_nanosleep +//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) { @@ -800,7 +1124,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall(funcPC(libc_open_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -808,6 +1132,11 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +func libc_open_trampoline() + +//go:linkname libc_open libc_open +//go:cgo_import_dynamic libc_open open "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) { @@ -816,7 +1145,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall(funcPC(libc_pathconf_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -824,6 +1153,11 @@ func Pathconf(path string, name int) (val int, err error) { return } +func libc_pathconf_trampoline() + +//go:linkname libc_pathconf libc_pathconf +//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) { @@ -833,7 +1167,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall6(funcPC(libc_pread_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -841,6 +1175,11 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { return } +func libc_pread_trampoline() + +//go:linkname libc_pread libc_pread +//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) { @@ -850,7 +1189,7 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall6(funcPC(libc_pwrite_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -858,6 +1197,11 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +func libc_pwrite_trampoline() + +//go:linkname libc_pwrite libc_pwrite +//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) { @@ -867,7 +1211,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall(funcPC(libc_read_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -875,6 +1219,11 @@ func read(fd int, p []byte) (n int, err error) { return } +func libc_read_trampoline() + +//go:linkname libc_read libc_read +//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) { @@ -889,7 +1238,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall(funcPC(libc_readlink_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -897,6 +1246,11 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +func libc_readlink_trampoline() + +//go:linkname libc_readlink libc_readlink +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -910,13 +1264,18 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall(funcPC(libc_rename_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_rename_trampoline() + +//go:linkname libc_rename libc_rename +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -925,13 +1284,18 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_revoke_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_revoke_trampoline() + +//go:linkname libc_revoke libc_revoke +//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) { @@ -940,64 +1304,78 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_rmdir_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func libc_rmdir_trampoline() -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) - newoffset = int64(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} +//go:linkname libc_rmdir libc_rmdir +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + _, _, e1 := syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_select_trampoline() + +//go:linkname libc_select libc_select +//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 := rawSyscall(funcPC(libc_setegid_trampoline), uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setegid_trampoline() + +//go:linkname libc_setegid libc_setegid +//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 := rawSyscall(funcPC(libc_seteuid_trampoline), uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_seteuid_trampoline() + +//go:linkname libc_seteuid libc_seteuid +//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 := rawSyscall(funcPC(libc_setgid_trampoline), uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setgid_trampoline() + +//go:linkname libc_setgid libc_setgid +//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) { @@ -1006,67 +1384,97 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_setlogin_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setlogin_trampoline() + +//go:linkname libc_setlogin libc_setlogin +//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 := rawSyscall(funcPC(libc_setpgid_trampoline), uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setpgid_trampoline() + +//go:linkname libc_setpgid libc_setpgid +//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(funcPC(libc_setpriority_trampoline), uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setpriority_trampoline() + +//go:linkname libc_setpriority libc_setpriority +//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 := rawSyscall(funcPC(libc_setregid_trampoline), uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setregid_trampoline() + +//go:linkname libc_setregid libc_setregid +//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 := rawSyscall(funcPC(libc_setreuid_trampoline), uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setreuid_trampoline() + +//go:linkname libc_setreuid libc_setreuid +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // 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) + _, _, e1 := rawSyscall(funcPC(libc_setrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setrlimit_trampoline() + +//go:linkname libc_setrlimit libc_setrlimit +//go:cgo_import_dynamic libc_setrlimit setrlimit "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 := rawSyscall(funcPC(libc_setsid_trampoline), 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1074,26 +1482,41 @@ func Setsid() (pid int, err error) { return } +func libc_setsid_trampoline() + +//go:linkname libc_setsid libc_setsid +//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 := rawSyscall(funcPC(libc_settimeofday_trampoline), uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_settimeofday_trampoline() + +//go:linkname libc_settimeofday libc_settimeofday +//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 := rawSyscall(funcPC(libc_setuid_trampoline), uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setuid_trampoline() + +//go:linkname libc_setuid libc_setuid +//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) { @@ -1102,13 +1525,18 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall(funcPC(libc_stat_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_stat_trampoline() + +//go:linkname libc_stat libc_stat +//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) { @@ -1117,13 +1545,18 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall(funcPC(libc_statfs_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_statfs_trampoline() + +//go:linkname libc_statfs libc_statfs +//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) { @@ -1137,23 +1570,33 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall(funcPC(libc_symlink_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_symlink_trampoline() + +//go:linkname libc_symlink libc_symlink +//go:cgo_import_dynamic libc_symlink symlink "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(funcPC(libc_sync_trampoline), 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_sync_trampoline() + +//go:linkname libc_sync libc_sync +//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) { @@ -1162,21 +1605,31 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + _, _, e1 := syscall(funcPC(libc_truncate_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_truncate_trampoline() + +//go:linkname libc_truncate libc_truncate +//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(funcPC(libc_umask_trampoline), uintptr(newmask), 0, 0) oldmask = int(r0) return } +func libc_umask_trampoline() + +//go:linkname libc_umask libc_umask +//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) { @@ -1185,13 +1638,18 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_unlink_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_unlink_trampoline() + +//go:linkname libc_unlink libc_unlink +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1200,13 +1658,18 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall(funcPC(libc_unmount_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_unmount_trampoline() + +//go:linkname libc_unmount libc_unmount +//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) { @@ -1216,7 +1679,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall(funcPC(libc_write_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1224,10 +1687,15 @@ func write(fd int, p []byte) (n int, err error) { return } +func libc_write_trampoline() + +//go:linkname libc_write libc_write +//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 := syscall6X(funcPC(libc_mmap_trampoline), uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1235,53 +1703,78 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +func libc_mmap_trampoline() + +//go:linkname libc_mmap libc_mmap +//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(funcPC(libc_munmap_trampoline), uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_munmap_trampoline() + +//go:linkname libc_munmap libc_munmap +//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)) - n = int(r0) +func utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall6(funcPC(libc_utimensat_trampoline), uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_utimensat_trampoline() + +//go:linkname libc_utimensat libc_utimensat +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + // 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)) - n = int(r0) +func directSyscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr) (ret uintptr, err error) { + r0, _, e1 := syscall6X(funcPC(libc_syscall_trampoline), uintptr(trap), uintptr(a1), uintptr(a2), uintptr(a3), uintptr(a4), uintptr(a5)) + ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_syscall_trampoline() + +//go:linkname libc_syscall libc_syscall +//go:cgo_import_dynamic libc_syscall syscall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := syscallX(funcPC(libc_lseek_trampoline), uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_lseek_trampoline() + +//go:linkname libc_lseek libc_lseek +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getcwd(buf []byte) (n int, err error) { @@ -1291,10 +1784,206 @@ func getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall(funcPC(libc_getcwd_trampoline), uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) } return } + +func libc_getcwd_trampoline() + +//go:linkname libc_getcwd libc_getcwd +//go:cgo_import_dynamic libc_getcwd getcwd "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) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall6(funcPC(libc_sysctl_trampoline), 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 +} + +func libc_sysctl_trampoline() + +//go:linkname libc_sysctl libc_sysctl +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fork() (pid int, err error) { + r0, _, e1 := rawSyscall(funcPC(libc_fork_trampoline), 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fork_trampoline() + +//go:linkname libc_fork libc_fork +//go:cgo_import_dynamic libc_fork fork "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req int, arg int) (err error) { + _, _, e1 := rawSyscall(funcPC(libc_ioctl_trampoline), uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_ioctl_trampoline() + +//go:linkname libc_ioctl libc_ioctl +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func execve(path *byte, argv **byte, envp **byte) (err error) { + _, _, e1 := rawSyscall(funcPC(libc_execve_trampoline), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(argv)), uintptr(unsafe.Pointer(envp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_execve_trampoline() + +//go:linkname libc_execve libc_execve +//go:cgo_import_dynamic libc_execve execve "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exit(res int) (err error) { + _, _, e1 := rawSyscall(funcPC(libc_exit_trampoline), uintptr(res), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_exit_trampoline() + +//go:linkname libc_exit libc_exit +//go:cgo_import_dynamic libc_exit exit "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +//go:nosplit +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_ptrace_trampoline() + +//go:linkname libc_ptrace libc_ptrace +//go:cgo_import_dynamic libc_ptrace ptrace "libc.so" + +// 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 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := rawSyscall(funcPC(libc_getentropy_trampoline), uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_getentropy_trampoline() + +//go:linkname libc_getentropy libc_getentropy +//go:cgo_import_dynamic libc_getentropy getentropy "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) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall6(funcPC(libc_fstatat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fstatat_trampoline() + +//go:linkname libc_fstatat libc_fstatat +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) { + r0, _, e1 := syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(fd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall(funcPC(libc_unlinkat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_unlinkat_trampoline() + +//go:linkname libc_unlinkat libc_unlinkat +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(fd int, path string, flags int, perm uint32) (fdret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := syscall6(funcPC(libc_openat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(perm), 0, 0) + fdret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_openat_trampoline() + +//go:linkname libc_openat libc_openat +//go:cgo_import_dynamic libc_openat openat "libc.so" diff --git a/src/syscall/zsyscall_openbsd_amd64.s b/src/syscall/zsyscall_openbsd_amd64.s new file mode 100644 index 0000000000..e5c5dde930 --- /dev/null +++ b/src/syscall/zsyscall_openbsd_amd64.s @@ -0,0 +1,233 @@ +// go run mkasm.go openbsd amd64 +// Code generated by the command above; DO NOT EDIT. +#include "textflag.h" +TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) +TEXT ·libc_setgroups_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) +TEXT ·libc_wait4_trampoline(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) +TEXT ·libc_accept_trampoline(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) +TEXT ·libc_bind_trampoline(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) +TEXT ·libc_connect_trampoline(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) +TEXT ·libc_socket_trampoline(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) +TEXT ·libc_getsockopt_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) +TEXT ·libc_setsockopt_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) +TEXT ·libc_getpeername_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) +TEXT ·libc_getsockname_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) +TEXT ·libc_shutdown_trampoline(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) +TEXT ·libc_socketpair_trampoline(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) +TEXT ·libc_recvfrom_trampoline(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) +TEXT ·libc_sendto_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) +TEXT ·libc_recvmsg_trampoline(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) +TEXT ·libc_sendmsg_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) +TEXT ·libc_kevent_trampoline(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) +TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) +TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) +TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +TEXT ·libc_pipe2_trampoline(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) +TEXT ·libc_accept4_trampoline(SB),NOSPLIT,$0-0 + JMP libc_accept4(SB) +TEXT ·libc_getdents_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) +TEXT ·libc_access_trampoline(SB),NOSPLIT,$0-0 + JMP libc_access(SB) +TEXT ·libc_adjtime_trampoline(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) +TEXT ·libc_chdir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) +TEXT ·libc_chflags_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) +TEXT ·libc_chmod_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) +TEXT ·libc_chown_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) +TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) +TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 + JMP libc_close(SB) +TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) +TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) +TEXT ·libc_fchdir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) +TEXT ·libc_fchflags_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) +TEXT ·libc_fchmod_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) +TEXT ·libc_fchown_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) +TEXT ·libc_flock_trampoline(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) +TEXT ·libc_fpathconf_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) +TEXT ·libc_fstat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) +TEXT ·libc_fstatfs_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) +TEXT ·libc_fsync_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) +TEXT ·libc_ftruncate_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) +TEXT ·libc_getegid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) +TEXT ·libc_geteuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) +TEXT ·libc_getgid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) +TEXT ·libc_getpgid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) +TEXT ·libc_getpgrp_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) +TEXT ·libc_getpid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) +TEXT ·libc_getppid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) +TEXT ·libc_getpriority_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) +TEXT ·libc_getrlimit_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) +TEXT ·libc_getrusage_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) +TEXT ·libc_getsid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) +TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) +TEXT ·libc_getuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) +TEXT ·libc_issetugid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) +TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) +TEXT ·libc_kqueue_trampoline(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) +TEXT ·libc_lchown_trampoline(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) +TEXT ·libc_link_trampoline(SB),NOSPLIT,$0-0 + JMP libc_link(SB) +TEXT ·libc_listen_trampoline(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) +TEXT ·libc_lstat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) +TEXT ·libc_mkdir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) +TEXT ·libc_mkfifo_trampoline(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) +TEXT ·libc_mknod_trampoline(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) +TEXT ·libc_nanosleep_trampoline(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) +TEXT ·libc_open_trampoline(SB),NOSPLIT,$0-0 + JMP libc_open(SB) +TEXT ·libc_pathconf_trampoline(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) +TEXT ·libc_pread_trampoline(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) +TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) +TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0 + JMP libc_read(SB) +TEXT ·libc_readlink_trampoline(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) +TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) +TEXT ·libc_revoke_trampoline(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) +TEXT ·libc_rmdir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) +TEXT ·libc_select_trampoline(SB),NOSPLIT,$0-0 + JMP libc_select(SB) +TEXT ·libc_setegid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) +TEXT ·libc_seteuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) +TEXT ·libc_setgid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) +TEXT ·libc_setlogin_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) +TEXT ·libc_setpgid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) +TEXT ·libc_setpriority_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) +TEXT ·libc_setregid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) +TEXT ·libc_setreuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) +TEXT ·libc_setrlimit_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) +TEXT ·libc_setsid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) +TEXT ·libc_settimeofday_trampoline(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) +TEXT ·libc_setuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) +TEXT ·libc_stat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) +TEXT ·libc_statfs_trampoline(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) +TEXT ·libc_symlink_trampoline(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) +TEXT ·libc_sync_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) +TEXT ·libc_truncate_trampoline(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) +TEXT ·libc_umask_trampoline(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) +TEXT ·libc_unlink_trampoline(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) +TEXT ·libc_unmount_trampoline(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) +TEXT ·libc_write_trampoline(SB),NOSPLIT,$0-0 + JMP libc_write(SB) +TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) +TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) +TEXT ·libc_utimensat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) +TEXT ·libc_syscall_trampoline(SB),NOSPLIT,$0-0 + JMP libc_syscall(SB) +TEXT ·libc_lseek_trampoline(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) +TEXT ·libc_getcwd_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) +TEXT ·libc_sysctl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) +TEXT ·libc_fork_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fork(SB) +TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) +TEXT ·libc_execve_trampoline(SB),NOSPLIT,$0-0 + JMP libc_execve(SB) +TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) +TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ptrace(SB) +TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getentropy(SB) +TEXT ·libc_fstatat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) +TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) +TEXT ·libc_openat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) -- GitLab From 0f797f168d1aec8481ee43ace57d3209aee93dba Mon Sep 17 00:00:00 2001 From: Paul Davis <43160081+Pawls@users.noreply.github.com> Date: Tue, 26 Jan 2021 23:29:47 +0000 Subject: [PATCH 1705/1792] math: fix typo in sqrt.go code comment "it does not necessary" -> "it is not necessary" Change-Id: I66f9cf2670d76b3686badb4a537b3ec084447d62 GitHub-Last-Rev: 52a0f9993abf25369cdb6b31eaf476df1626cf87 GitHub-Pull-Request: golang/go#43935 Reviewed-on: https://go-review.googlesource.com/c/go/+/287052 Reviewed-by: Robert Griesemer Reviewed-by: Ian Lance Taylor Trust: Robert Griesemer --- src/math/sqrt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/math/sqrt.go b/src/math/sqrt.go index 7e95f2365b..1077a62897 100644 --- a/src/math/sqrt.go +++ b/src/math/sqrt.go @@ -67,7 +67,7 @@ package math // // One may easily use induction to prove (4) and (5). // Note. Since the left hand side of (3) contain only i+2 bits, -// it does not necessary to do a full (53-bit) comparison +// it is not necessary to do a full (53-bit) comparison // in (3). // 3. Final rounding // After generating the 53 bits result, we compute one more bit. -- GitLab From 210f70e298cf7e45a2b2638545228a44c78740de Mon Sep 17 00:00:00 2001 From: Ryuji Iwata Date: Tue, 26 Jan 2021 12:53:08 +0000 Subject: [PATCH 1706/1792] doc/go1.16: fix closing brace in .Export format A parenthesis of go list "-f" flag format is double curly braces. Change-Id: Ifd38e0b0ae3c46272a4acd65584818228168b7c6 GitHub-Last-Rev: b46030492b5caf18fe127621fdf92cbec4c03ad5 GitHub-Pull-Request: golang/go#43924 Reviewed-on: https://go-review.googlesource.com/c/go/+/286752 Reviewed-by: Ian Lance Taylor Trust: Tobias Klauser --- doc/go1.16.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 7ddb4a935e..3a45940479 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -275,7 +275,7 @@ Do not send CLs removing the interior tags from such phrases. When the -export flag is specified, the BuildID field is now set to the build ID of the compiled package. This is equivalent to running go tool buildid on - go list -exported -f {{.Export}, + go list -exported -f {{.Export}}, but without the extra step.

    -- GitLab From 5cdf0da1bfc74ad1017a488044a865850f7c3c8e Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Wed, 27 Jan 2021 01:00:05 +1100 Subject: [PATCH 1707/1792] syscall: clean up mkasm related changes The mkasm_darwin.go file was renamed to mkasm.go in CL 270380, with OpenBSD support being added. The mkasm_openbsd.go file should not have been merged, so remove it. Fix up references to mkasm_$GOOS.go and provide $GOOS as an argument on invocation. Updates #36435 Change-Id: I868d3f2146973d026e6a663d437749dbb6b312ec Reviewed-on: https://go-review.googlesource.com/c/go/+/286812 Trust: Joel Sing Reviewed-by: Cherry Zhang --- src/syscall/mkall.sh | 8 ++--- src/syscall/mkasm_openbsd.go | 58 ------------------------------------ src/syscall/mksyscall.pl | 2 +- 3 files changed, 5 insertions(+), 63 deletions(-) delete mode 100644 src/syscall/mkasm_openbsd.go diff --git a/src/syscall/mkall.sh b/src/syscall/mkall.sh index 3aaf8c429d..87e5157416 100755 --- a/src/syscall/mkall.sh +++ b/src/syscall/mkall.sh @@ -125,13 +125,13 @@ darwin_amd64) mkerrors="$mkerrors -m64" mksyscall="./mksyscall.pl -darwin" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" + mkasm="go run mkasm.go" ;; darwin_arm64) mkerrors="$mkerrors -m64" mksyscall="./mksyscall.pl -darwin" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_darwin.go" + mkasm="go run mkasm.go" ;; dragonfly_amd64) mkerrors="$mkerrors -m64" @@ -299,7 +299,7 @@ openbsd_amd64) zsysctl="zsysctl_openbsd.go" mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" mktypes="GOARCH=$GOARCH go tool cgo -godefs" - mkasm="go run mkasm_openbsd.go" + mkasm="go run mkasm.go" ;; openbsd_arm) GOOSARCH_in="syscall_openbsd1.go syscall_openbsd_$GOARCH.go" @@ -372,5 +372,5 @@ esac # Therefore, "go run" tries to recompile syscall package but ztypes is empty and it fails. echo "$mktypes types_$GOOS.go |go run mkpost.go >ztypes_$GOOSARCH.go.NEW && mv ztypes_$GOOSARCH.go.NEW ztypes_$GOOSARCH.go"; fi - if [ -n "$mkasm" ]; then echo "$mkasm $GOARCH"; fi + if [ -n "$mkasm" ]; then echo "$mkasm $GOOS $GOARCH"; fi ) | $run diff --git a/src/syscall/mkasm_openbsd.go b/src/syscall/mkasm_openbsd.go deleted file mode 100644 index 9b938bde8c..0000000000 --- a/src/syscall/mkasm_openbsd.go +++ /dev/null @@ -1,58 +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 - -// mkasm_openbsd.go generates assembly trampolines to call libc routines from Go. -// This program must be run after mksyscall.pl. -package main - -import ( - "bytes" - "fmt" - "io/ioutil" - "log" - "os" - "strings" -) - -func main() { - in1, err := ioutil.ReadFile("syscall_openbsd.go") - if err != nil { - log.Fatalf("can't open syscall_openbsd.go: %s", err) - } - arch := os.Args[1] - in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_openbsd_%s.go", arch)) - if err != nil { - log.Fatalf("can't open syscall_openbsd_%s.go: %s", arch, err) - } - in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_openbsd_%s.go", arch)) - if err != nil { - log.Fatalf("can't open zsyscall_openbsd_%s.go: %s", arch, err) - } - in := string(in1) + string(in2) + string(in3) - - trampolines := map[string]bool{} - - var out bytes.Buffer - - fmt.Fprintf(&out, "// go run mkasm_openbsd.go %s\n", strings.Join(os.Args[1:], " ")) - fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") - fmt.Fprintf(&out, "#include \"textflag.h\"\n") - for _, line := range strings.Split(in, "\n") { - if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") { - continue - } - fn := line[5 : len(line)-13] - if !trampolines[fn] { - trampolines[fn] = true - fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn) - fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) - } - } - err = ioutil.WriteFile(fmt.Sprintf("zsyscall_openbsd_%s.s", arch), out.Bytes(), 0644) - if err != nil { - log.Fatalf("can't write zsyscall_openbsd_%s.s: %s", arch, err) - } -} diff --git a/src/syscall/mksyscall.pl b/src/syscall/mksyscall.pl index fa9e684d0f..67e8d1d99e 100755 --- a/src/syscall/mksyscall.pl +++ b/src/syscall/mksyscall.pl @@ -352,7 +352,7 @@ while(<>) { # The assembly trampoline that jumps to the libc routine. $text .= "func ${funcname}_trampoline()\n"; # Map syscall.funcname to just plain funcname. - # (The jump to this function is in the assembly trampoline, generated by mkasm_$GOOS.go.) + # (The jump to this function is in the assembly trampoline, generated by mkasm.go.) $text .= "//go:linkname $funcname $funcname\n"; # Tell the linker that funcname can be found in libSystem using varname without the libc_ prefix. my $basename = substr $funcname, 5; -- GitLab From 6c8fbfbdcfa48ca29926097b20767fe83409b3ed Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Tue, 26 Jan 2021 17:52:19 +1100 Subject: [PATCH 1708/1792] runtime: convert openbsd/arm64 locking to libc Switch openbsd/arm64 to locking via libc, rather than performing direct system calls. Update #36435 Change-Id: I2f30432c4bc232224cf87dca750665b8c40c7b72 Reviewed-on: https://go-review.googlesource.com/c/go/+/286813 Trust: Joel Sing Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot --- src/runtime/os_openbsd_syscall1.go | 2 +- src/runtime/sys_openbsd1.go | 2 +- src/runtime/sys_openbsd_arm64.s | 43 +++++++++++++----------------- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/runtime/os_openbsd_syscall1.go b/src/runtime/os_openbsd_syscall1.go index 08928cfef4..b0bef4c504 100644 --- a/src/runtime/os_openbsd_syscall1.go +++ b/src/runtime/os_openbsd_syscall1.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. -// +build openbsd,!amd64 +// +build openbsd,!amd64,!arm64 package runtime diff --git a/src/runtime/sys_openbsd1.go b/src/runtime/sys_openbsd1.go index a201a16c53..e2886218db 100644 --- a/src/runtime/sys_openbsd1.go +++ b/src/runtime/sys_openbsd1.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. -// +build openbsd,amd64 +// +build openbsd,amd64 openbsd,arm64 package runtime diff --git a/src/runtime/sys_openbsd_arm64.s b/src/runtime/sys_openbsd_arm64.s index 2ec9d038ba..7e454a9867 100644 --- a/src/runtime/sys_openbsd_arm64.s +++ b/src/runtime/sys_openbsd_arm64.s @@ -188,6 +188,25 @@ TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 ADD $16, RSP RET +TEXT runtime·thrsleep_trampoline(SB),NOSPLIT,$0 + MOVW 8(R0), R1 // arg 2 - clock_id + MOVD 16(R0), R2 // arg 3 - abstime + MOVD 24(R0), R3 // arg 4 - lock + MOVD 32(R0), R4 // arg 5 - abort + MOVD 0(R0), R0 // arg 1 - id + CALL libc_thrsleep(SB) + RET + +TEXT runtime·thrwakeup_trampoline(SB),NOSPLIT,$0 + MOVW 8(R0), R1 // arg 2 - count + MOVD 0(R0), R0 // arg 1 - id + CALL libc_thrwakeup(SB) + RET + +TEXT runtime·sched_yield_trampoline(SB),NOSPLIT,$0 + CALL libc_sched_yield(SB) + RET + // Exit the entire program (like C exit) TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0 MOVW code+0(FP), R0 // arg 1 - status @@ -422,30 +441,6 @@ TEXT runtime·sigaltstack(SB),NOSPLIT,$0 MOVD R8, (R8) RET -TEXT runtime·osyield(SB),NOSPLIT,$0 - MOVD $298, R8 // sys_sched_yield - INVOKE_SYSCALL - RET - -TEXT runtime·thrsleep(SB),NOSPLIT,$0 - MOVD ident+0(FP), R0 // arg 1 - ident - MOVW clock_id+8(FP), R1 // arg 2 - clock_id - MOVD tsp+16(FP), R2 // arg 3 - tsp - MOVD lock+24(FP), R3 // arg 4 - lock - MOVD abort+32(FP), R4 // arg 5 - abort - MOVD $94, R8 // sys___thrsleep - INVOKE_SYSCALL - MOVW R0, ret+40(FP) - RET - -TEXT runtime·thrwakeup(SB),NOSPLIT,$0 - MOVD ident+0(FP), R0 // arg 1 - ident - MOVW n+8(FP), R1 // arg 2 - n - MOVD $301, R8 // sys___thrwakeup - INVOKE_SYSCALL - MOVW R0, ret+16(FP) - RET - TEXT runtime·sysctl(SB),NOSPLIT,$0 MOVD mib+0(FP), R0 // arg 1 - mib MOVW miblen+8(FP), R1 // arg 2 - miblen -- GitLab From cd176b361591420f84fcbcaaf0cf24351aed0995 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Tue, 26 Jan 2021 23:06:51 +1100 Subject: [PATCH 1709/1792] runtime: switch runtime to libc for openbsd/arm64 Use libc rather than performing direct system calls for the runtime on openbsd/arm64. Updates #36435 Change-Id: I8bd41dfec16209f2b9a83dda24b9a1e4b06757c6 Reviewed-on: https://go-review.googlesource.com/c/go/+/286814 Trust: Joel Sing Reviewed-by: Cherry Zhang --- src/runtime/defs_openbsd_arm64.go | 5 + src/runtime/os_openbsd_syscall2.go | 2 +- src/runtime/proc.go | 2 +- src/runtime/sys_openbsd2.go | 2 +- src/runtime/sys_openbsd_arm64.s | 485 ++++++++++++----------------- 5 files changed, 201 insertions(+), 295 deletions(-) diff --git a/src/runtime/defs_openbsd_arm64.go b/src/runtime/defs_openbsd_arm64.go index 63ea8dfecc..d2b947feb2 100644 --- a/src/runtime/defs_openbsd_arm64.go +++ b/src/runtime/defs_openbsd_arm64.go @@ -33,6 +33,11 @@ const ( _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/os_openbsd_syscall2.go b/src/runtime/os_openbsd_syscall2.go index 74eb271c2c..ab940510af 100644 --- a/src/runtime/os_openbsd_syscall2.go +++ b/src/runtime/os_openbsd_syscall2.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. -// +build openbsd,!amd64 +// +build openbsd,!amd64,!arm64 package runtime diff --git a/src/runtime/proc.go b/src/runtime/proc.go index d51dcb0d22..73a789c189 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1213,7 +1213,7 @@ func usesLibcall() bool { case "aix", "darwin", "illumos", "ios", "solaris", "windows": return true case "openbsd": - return GOARCH == "amd64" + return GOARCH == "amd64" || GOARCH == "arm64" } return false } diff --git a/src/runtime/sys_openbsd2.go b/src/runtime/sys_openbsd2.go index 73592df226..474e7145e7 100644 --- a/src/runtime/sys_openbsd2.go +++ b/src/runtime/sys_openbsd2.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. -// +build openbsd,amd64 +// +build openbsd,amd64 openbsd,arm64 package runtime diff --git a/src/runtime/sys_openbsd_arm64.s b/src/runtime/sys_openbsd_arm64.s index 7e454a9867..0fd983ef25 100644 --- a/src/runtime/sys_openbsd_arm64.s +++ b/src/runtime/sys_openbsd_arm64.s @@ -15,17 +15,6 @@ #define CLOCK_REALTIME $0 #define CLOCK_MONOTONIC $3 -// With OpenBSD 6.7 onwards, an arm64 syscall returns two instructions -// after the SVC instruction, to allow for a speculative execution -// barrier to be placed after the SVC without impacting performance. -// For now use hardware no-ops as this works with both older and newer -// kernels. After OpenBSD 6.8 is released this should be changed to -// speculation barriers. -#define INVOKE_SYSCALL \ - SVC; \ - NOOP; \ - NOOP - // 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. @@ -188,6 +177,13 @@ TEXT runtime·pthread_create_trampoline(SB),NOSPLIT,$0 ADD $16, RSP RET +TEXT runtime·thrkill_trampoline(SB),NOSPLIT,$0 + MOVW 8(R0), R1 // arg 2 - signal + MOVD $0, R2 // arg 3 - tcb + MOVW 0(R0), R0 // arg 1 - tid + CALL libc_thrkill(SB) + RET + TEXT runtime·thrsleep_trampoline(SB),NOSPLIT,$0 MOVW 8(R0), R1 // arg 2 - clock_id MOVD 16(R0), R2 // arg 3 - abstime @@ -203,302 +199,207 @@ TEXT runtime·thrwakeup_trampoline(SB),NOSPLIT,$0 CALL libc_thrwakeup(SB) RET +TEXT runtime·exit_trampoline(SB),NOSPLIT,$0 + MOVW 0(R0), R0 // arg 1 - status + CALL libc_exit(SB) + MOVD $0, R0 // crash on failure + MOVD R0, (R0) + RET + +TEXT runtime·getthrid_trampoline(SB),NOSPLIT,$0 + MOVD R0, R19 // pointer to args + CALL libc_getthrid(SB) + MOVW R0, 0(R19) // return value + RET + +TEXT runtime·raiseproc_trampoline(SB),NOSPLIT,$0 + MOVD R0, R19 // pointer to args + CALL libc_getpid(SB) // arg 1 - pid + MOVW 0(R19), R1 // arg 2 - signal + CALL libc_kill(SB) + RET + TEXT runtime·sched_yield_trampoline(SB),NOSPLIT,$0 CALL libc_sched_yield(SB) RET -// Exit the entire program (like C exit) -TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0 - MOVW code+0(FP), R0 // arg 1 - status - MOVD $1, R8 // sys_exit - INVOKE_SYSCALL - BCC 3(PC) - MOVD $0, R0 // crash on syscall failure +TEXT runtime·mmap_trampoline(SB),NOSPLIT,$0 + MOVD R0, R19 // pointer to args + MOVD 0(R19), R0 // arg 1 - addr + MOVD 8(R19), R1 // arg 2 - len + MOVW 16(R19), R2 // arg 3 - prot + MOVW 20(R19), R3 // arg 4 - flags + MOVW 24(R19), R4 // arg 5 - fid + MOVW 28(R19), R5 // arg 6 - offset + CALL libc_mmap(SB) + MOVD $0, R1 + CMP $-1, R0 + BNE noerr + CALL libc_errno(SB) + MOVW (R0), R1 // errno + MOVD $0, R0 +noerr: + MOVD R0, 32(R19) + MOVD R1, 40(R19) + RET + +TEXT runtime·munmap_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - len + MOVD 0(R0), R0 // arg 1 - addr + CALL libc_munmap(SB) + CMP $-1, R0 + BNE 3(PC) + MOVD $0, R0 // crash on failure MOVD R0, (R0) RET -// func exitThread(wait *uint32) -TEXT runtime·exitThread(SB),NOSPLIT,$0 - MOVD wait+0(FP), R0 // arg 1 - notdead - MOVD $302, R8 // sys___threxit - INVOKE_SYSCALL - MOVD $0, R0 // crash on syscall failure +TEXT runtime·madvise_trampoline(SB), NOSPLIT, $0 + MOVD 8(R0), R1 // arg 2 - len + MOVW 16(R0), R2 // arg 3 - advice + MOVD 0(R0), R0 // arg 1 - addr + CALL libc_madvise(SB) + // ignore failure - maybe pages are locked + RET + +TEXT runtime·open_trampoline(SB),NOSPLIT,$0 + MOVW 8(R0), R1 // arg 2 - flags + MOVW 12(R0), R2 // arg 3 - mode + MOVD 0(R0), R0 // arg 1 - path + MOVD $0, R3 // varargs + CALL libc_open(SB) + RET + +TEXT runtime·close_trampoline(SB),NOSPLIT,$0 + MOVD 0(R0), R0 // arg 1 - fd + CALL libc_close(SB) + RET + +TEXT runtime·read_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - buf + MOVW 16(R0), R2 // arg 3 - count + MOVW 0(R0), R0 // arg 1 - fd + CALL libc_read(SB) + CMP $-1, R0 + BNE noerr + CALL libc_errno(SB) + MOVW (R0), R0 // errno + NEG R0, R0 // caller expects negative errno value +noerr: + RET + +TEXT runtime·write_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - buf + MOVW 16(R0), R2 // arg 3 - count + MOVW 0(R0), R0 // arg 1 - fd + CALL libc_write(SB) + CMP $-1, R0 + BNE noerr + CALL libc_errno(SB) + MOVW (R0), R0 // errno + NEG R0, R0 // caller expects negative errno value +noerr: + RET + +TEXT runtime·pipe2_trampoline(SB),NOSPLIT,$0 + MOVW 8(R0), R1 // arg 2 - flags + MOVD 0(R0), R0 // arg 1 - filedes + CALL libc_pipe2(SB) + CMP $-1, R0 + BNE noerr + CALL libc_errno(SB) + MOVW (R0), R0 // errno + NEG R0, R0 // caller expects negative errno value +noerr: + RET + +TEXT runtime·setitimer_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - new + MOVD 16(R0), R2 // arg 3 - old + MOVW 0(R0), R0 // arg 1 - which + CALL libc_setitimer(SB) + RET + +TEXT runtime·usleep_trampoline(SB),NOSPLIT,$0 + MOVD 0(R0), R0 // arg 1 - usec + CALL libc_usleep(SB) + RET + +TEXT runtime·sysctl_trampoline(SB),NOSPLIT,$0 + MOVW 8(R0), R1 // arg 2 - miblen + MOVD 16(R0), R2 // arg 3 - out + MOVD 24(R0), R3 // arg 4 - size + MOVD 32(R0), R4 // arg 5 - dst + MOVD 40(R0), R5 // arg 6 - ndst + MOVD 0(R0), R0 // arg 1 - mib + CALL libc_sysctl(SB) + RET + +TEXT runtime·kqueue_trampoline(SB),NOSPLIT,$0 + CALL libc_kqueue(SB) + RET + +TEXT runtime·kevent_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - keventt + MOVW 16(R0), R2 // arg 3 - nch + MOVD 24(R0), R3 // arg 4 - ev + MOVW 32(R0), R4 // arg 5 - nev + MOVD 40(R0), R5 // arg 6 - ts + MOVW 0(R0), R0 // arg 1 - kq + CALL libc_kevent(SB) + CMP $-1, R0 + BNE noerr + CALL libc_errno(SB) + MOVW (R0), R0 // errno + NEG R0, R0 // caller expects negative errno value +noerr: + RET + +TEXT runtime·clock_gettime_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - tp + MOVD 0(R0), R0 // arg 1 - clock_id + CALL libc_clock_gettime(SB) + CMP $-1, R0 + BNE 3(PC) + MOVD $0, R0 // crash on failure MOVD R0, (R0) - JMP 0(PC) - -TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0 - MOVD name+0(FP), R0 // arg 1 - path - MOVW mode+8(FP), R1 // arg 2 - mode - MOVW perm+12(FP), R2 // arg 3 - perm - MOVD $5, R8 // sys_open - INVOKE_SYSCALL - BCC 2(PC) - MOVW $-1, R0 - MOVW R0, ret+16(FP) - RET - -TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0 - MOVW fd+0(FP), R0 // arg 1 - fd - MOVD $6, R8 // sys_close - INVOKE_SYSCALL - BCC 2(PC) - MOVW $-1, R0 - MOVW R0, ret+8(FP) - RET - -TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0 - MOVW fd+0(FP), R0 // arg 1 - fd - MOVD p+8(FP), R1 // arg 2 - buf - MOVW n+16(FP), R2 // arg 3 - nbyte - MOVD $3, R8 // sys_read - INVOKE_SYSCALL - BCC 2(PC) - NEG R0, R0 - MOVW R0, ret+24(FP) - RET - -// func pipe() (r, w int32, errno int32) -TEXT runtime·pipe(SB),NOSPLIT|NOFRAME,$0-12 - MOVD $r+0(FP), R0 - MOVW $0, R1 - MOVD $101, R8 // sys_pipe2 - INVOKE_SYSCALL - BCC 2(PC) - NEG R0, R0 - MOVW R0, errno+8(FP) - RET - -// func pipe2(flags int32) (r, w int32, errno int32) -TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20 - MOVD $r+8(FP), R0 - MOVW flags+0(FP), R1 - MOVD $101, R8 // sys_pipe2 - INVOKE_SYSCALL - BCC 2(PC) - NEG R0, R0 - MOVW R0, errno+16(FP) - RET - -TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0 - MOVD fd+0(FP), R0 // arg 1 - fd - MOVD p+8(FP), R1 // arg 2 - buf - MOVW n+16(FP), R2 // arg 3 - nbyte - MOVD $4, R8 // sys_write - INVOKE_SYSCALL - BCC 2(PC) - NEG R0, R0 - MOVW R0, ret+24(FP) - RET - -TEXT runtime·usleep(SB),NOSPLIT,$24-4 - MOVWU usec+0(FP), R3 - MOVD R3, R5 - MOVW $1000000, R4 - UDIV R4, R3 - MOVD R3, 8(RSP) // tv_sec - MUL R3, R4 - SUB R4, R5 - MOVW $1000, R4 - MUL R4, R5 - MOVD R5, 16(RSP) // tv_nsec - - ADD $8, RSP, R0 // arg 1 - rqtp - MOVD $0, R1 // arg 2 - rmtp - MOVD $91, R8 // sys_nanosleep - INVOKE_SYSCALL - RET - -TEXT runtime·getthrid(SB),NOSPLIT,$0-4 - MOVD $299, R8 // sys_getthrid - INVOKE_SYSCALL - MOVW R0, ret+0(FP) - RET - -TEXT runtime·thrkill(SB),NOSPLIT,$0-16 - MOVW tid+0(FP), R0 // arg 1 - tid - MOVD sig+8(FP), R1 // arg 2 - signum - MOVW $0, R2 // arg 3 - tcb - MOVD $119, R8 // sys_thrkill - INVOKE_SYSCALL - RET - -TEXT runtime·raiseproc(SB),NOSPLIT,$0 - MOVD $20, R8 // sys_getpid - INVOKE_SYSCALL - // arg 1 - pid, already in R0 - MOVW sig+0(FP), R1 // arg 2 - signum - MOVD $122, R8 // sys_kill - INVOKE_SYSCALL - RET - -TEXT runtime·mmap(SB),NOSPLIT,$0 - MOVD addr+0(FP), R0 // arg 1 - addr - MOVD n+8(FP), R1 // arg 2 - len - MOVW prot+16(FP), R2 // arg 3 - prot - MOVW flags+20(FP), R3 // arg 4 - flags - MOVW fd+24(FP), R4 // arg 5 - fd - MOVW $0, R5 // arg 6 - pad - MOVW off+28(FP), R6 // arg 7 - offset - MOVD $197, R8 // sys_mmap - INVOKE_SYSCALL - MOVD $0, R1 - BCC 3(PC) - MOVD R0, R1 // if error, move to R1 - MOVD $0, R0 - MOVD R0, p+32(FP) - MOVD R1, err+40(FP) RET -TEXT runtime·munmap(SB),NOSPLIT,$0 - MOVD addr+0(FP), R0 // arg 1 - addr - MOVD n+8(FP), R1 // arg 2 - len - MOVD $73, R8 // sys_munmap - INVOKE_SYSCALL - BCC 3(PC) +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 $0, R3 // vararg + CALL libc_fcntl(SB) + RET + +TEXT runtime·sigaction_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - new + MOVD 16(R0), R2 // arg 3 - old + MOVW 0(R0), R0 // arg 1 - sig + CALL libc_sigaction(SB) + CMP $-1, R0 + BNE 3(PC) MOVD $0, R0 // crash on syscall failure MOVD R0, (R0) RET -TEXT runtime·madvise(SB),NOSPLIT,$0 - MOVD addr+0(FP), R0 // arg 1 - addr - MOVD n+8(FP), R1 // arg 2 - len - MOVW flags+16(FP), R2 // arg 2 - flags - MOVD $75, R8 // sys_madvise - INVOKE_SYSCALL - BCC 2(PC) - MOVW $-1, R0 - MOVW R0, ret+24(FP) - RET - -TEXT runtime·setitimer(SB),NOSPLIT,$0 - MOVW mode+0(FP), R0 // arg 1 - mode - MOVD new+8(FP), R1 // arg 2 - new value - MOVD old+16(FP), R2 // arg 3 - old value - MOVD $69, R8 // sys_setitimer - INVOKE_SYSCALL - RET - -// func walltime1() (sec int64, nsec int32) -TEXT runtime·walltime1(SB), NOSPLIT, $32 - MOVW CLOCK_REALTIME, R0 // arg 1 - clock_id - MOVD $8(RSP), R1 // arg 2 - tp - MOVD $87, R8 // sys_clock_gettime - INVOKE_SYSCALL - - MOVD 8(RSP), R0 // sec - MOVD 16(RSP), R1 // nsec - MOVD R0, sec+0(FP) - MOVW R1, nsec+8(FP) - - RET - -// int64 nanotime1(void) so really -// void nanotime1(int64 *nsec) -TEXT runtime·nanotime1(SB),NOSPLIT,$32 - MOVW CLOCK_MONOTONIC, R0 // arg 1 - clock_id - MOVD $8(RSP), R1 // arg 2 - tp - MOVD $87, R8 // sys_clock_gettime - INVOKE_SYSCALL - - MOVW 8(RSP), R3 // sec - MOVW 16(RSP), R5 // nsec - - MOVD $1000000000, R4 - MUL R4, R3 - ADD R5, R3 - MOVD R3, ret+0(FP) - RET - -TEXT runtime·sigaction(SB),NOSPLIT,$0 - MOVW sig+0(FP), R0 // arg 1 - signum - MOVD new+8(FP), R1 // arg 2 - new sigaction - MOVD old+16(FP), R2 // arg 3 - old sigaction - MOVD $46, R8 // sys_sigaction - INVOKE_SYSCALL - BCC 3(PC) - MOVD $3, R0 // crash on syscall failure +TEXT runtime·sigprocmask_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - new + MOVD 16(R0), R2 // arg 3 - old + MOVW 0(R0), R0 // arg 1 - how + CALL libc_pthread_sigmask(SB) + CMP $-1, R0 + BNE 3(PC) + MOVD $0, R0 // crash on syscall failure MOVD R0, (R0) RET -TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$0 - MOVW how+0(FP), R0 // arg 1 - mode - MOVW new+4(FP), R1 // arg 2 - new - MOVD $48, R8 // sys_sigprocmask - INVOKE_SYSCALL - BCC 3(PC) - MOVD $3, R8 // crash on syscall failure - MOVD R8, (R8) - MOVW R0, ret+8(FP) - RET - -TEXT runtime·sigaltstack(SB),NOSPLIT,$0 - MOVD new+0(FP), R0 // arg 1 - new sigaltstack - MOVD old+8(FP), R1 // arg 2 - old sigaltstack - MOVD $288, R8 // sys_sigaltstack - INVOKE_SYSCALL - BCC 3(PC) - MOVD $0, R8 // crash on syscall failure - MOVD R8, (R8) - RET - -TEXT runtime·sysctl(SB),NOSPLIT,$0 - MOVD mib+0(FP), R0 // arg 1 - mib - MOVW miblen+8(FP), R1 // arg 2 - miblen - MOVD out+16(FP), R2 // arg 3 - out - MOVD size+24(FP), R3 // arg 4 - size - MOVD dst+32(FP), R4 // arg 5 - dest - MOVD ndst+40(FP), R5 // arg 6 - newlen - MOVD $202, R8 // sys___sysctl - INVOKE_SYSCALL - BCC 2(PC) - NEG R0, R0 - MOVW R0, ret+48(FP) - RET - -// int32 runtime·kqueue(void); -TEXT runtime·kqueue(SB),NOSPLIT,$0 - MOVD $269, R8 // sys_kqueue - INVOKE_SYSCALL - BCC 2(PC) - NEG R0, R0 - MOVW R0, ret+0(FP) - RET - -// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); -TEXT runtime·kevent(SB),NOSPLIT,$0 - MOVW kq+0(FP), R0 // arg 1 - kq - MOVD ch+8(FP), R1 // arg 2 - changelist - MOVW nch+16(FP), R2 // arg 3 - nchanges - MOVD ev+24(FP), R3 // arg 4 - eventlist - MOVW nev+32(FP), R4 // arg 5 - nevents - MOVD ts+40(FP), R5 // arg 6 - timeout - MOVD $72, R8 // sys_kevent - INVOKE_SYSCALL - BCC 2(PC) - NEG R0, R0 - MOVW R0, ret+48(FP) - RET - -// func closeonexec(fd int32) -TEXT runtime·closeonexec(SB),NOSPLIT,$0 - MOVW fd+0(FP), R0 // arg 1 - fd - MOVD $2, R1 // arg 2 - cmd (F_SETFD) - MOVD $1, R2 // arg 3 - arg (FD_CLOEXEC) - MOVD $92, R8 // sys_fcntl - INVOKE_SYSCALL - RET - -// func runtime·setNonblock(int32 fd) -TEXT runtime·setNonblock(SB),NOSPLIT|NOFRAME,$0-4 - MOVW fd+0(FP), R0 // arg 1 - fd - MOVD $3, R1 // arg 2 - cmd (F_GETFL) - MOVD $0, R2 // arg 3 - MOVD $92, R8 // sys_fcntl - INVOKE_SYSCALL - MOVD $4, R2 // O_NONBLOCK - ORR R0, R2 // arg 3 - flags - MOVW fd+0(FP), R0 // arg 1 - fd - MOVD $4, R1 // arg 2 - cmd (F_SETFL) - MOVD $92, R8 // sys_fcntl - INVOKE_SYSCALL +TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0 + MOVD 8(R0), R1 // arg 2 - old + MOVD 0(R0), R0 // arg 1 - new + CALL libc_sigaltstack(SB) + CMP $-1, R0 + BNE 3(PC) + MOVD $0, R0 // crash on syscall failure + MOVD R0, (R0) RET -- GitLab From ff9e8364c6501e9092564dd1e1fadf27f91b2fbb Mon Sep 17 00:00:00 2001 From: Nehal J Wani Date: Wed, 27 Jan 2021 16:24:14 +0000 Subject: [PATCH 1710/1792] cmd/go: skip issue33139 when the 'cc' script command is unavailable With CGO disabled, the test suite tries to run the following and fail: CGO_ENABLED=0 go test -run=TestScript/link_syso_issue33139 cmd/go go test proxy running at GOPROXY=http://127.0.0.1:38829/mod --- FAIL: TestScript (0.01s) --- FAIL: TestScript/link_syso_issue33139 (0.01s) script_test.go:215: # Test that we can use the external linker with a host syso file that is # embedded in a package, that is referenced by a Go assembly function. # See issue 33139. (0.000s) # External linking is not supported on linux/ppc64. # See: https://github.com/golang/go/issues/8912 (0.000s) # External linking is not supported on linux/riscv64. # See: https://github.com/golang/go/issues/36739 (0.001s) > [linux] [riscv64] skip > cc -c -o syso/objTestImpl.syso syso/src/objTestImpl.c FAIL: testdata/script/link_syso_issue33139.txt:15: unexpected error starting command: fork/exec /dev/null: permission denied CC was set to /dev/null (during build) in the scenario mentioned above This patch replaces [!exec:cc] with [!cgo] because we care about the availability of the 'cc' builtin and not the 'cc' executable in $PATH Change-Id: Ifbd2441f5f8e903ca3da213aba76f44c2e2eebab GitHub-Last-Rev: 3b743787d08502f7a936e800ee7b6909fcf56068 GitHub-Pull-Request: golang/go#43912 Reviewed-on: https://go-review.googlesource.com/c/go/+/286633 Trust: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/testdata/script/link_syso_issue33139.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/testdata/script/link_syso_issue33139.txt b/src/cmd/go/testdata/script/link_syso_issue33139.txt index 26034c9626..8a8cb4aa8c 100644 --- a/src/cmd/go/testdata/script/link_syso_issue33139.txt +++ b/src/cmd/go/testdata/script/link_syso_issue33139.txt @@ -2,7 +2,7 @@ # embedded in a package, that is referenced by a Go assembly function. # See issue 33139. [!gc] skip -[!exec:cc] skip +[!cgo] skip # External linking is not supported on linux/ppc64. # See: https://github.com/golang/go/issues/8912 -- GitLab From 8cfa01943a7f43493543efba81996221bb0f27f8 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Wed, 27 Jan 2021 19:02:37 +0000 Subject: [PATCH 1711/1792] runtime: block console ctrlhandler when the signal is handled Fixes #41884 I can confirm this change fixes my issue. I can't confirm that this doesn't break any and everything else. I see that this code has been tweaked repeatedly, so I would really welcome guidance into further testing. Change-Id: I1986dd0c2f30cfe10257f0d8c658988d6986f7a6 GitHub-Last-Rev: 92f02c96973e12f1472511bcf3c5ebb36c6b0440 GitHub-Pull-Request: golang/go#41886 Reviewed-on: https://go-review.googlesource.com/c/go/+/261057 Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Jason A. Donenfeld Trust: Jason A. Donenfeld Trust: Alex Brainman --- src/runtime/os_windows.go | 7 +++ src/runtime/signal_windows_test.go | 64 ++++++++++++++++++++++ src/runtime/testdata/testwinsignal/main.go | 19 +++++++ 3 files changed, 90 insertions(+) create mode 100644 src/runtime/testdata/testwinsignal/main.go diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index 83d0d63e5d..e6b22e3167 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -46,6 +46,7 @@ const ( //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" @@ -97,6 +98,7 @@ var ( _SetThreadPriority, _SetUnhandledExceptionFilter, _SetWaitableTimer, + _Sleep, _SuspendThread, _SwitchToThread, _TlsAlloc, @@ -1094,6 +1096,11 @@ func ctrlhandler1(_type uint32) uint32 { } if sigsend(s) { + if s == _SIGTERM { + // Windows terminates the process after this handler returns. + // Block indefinitely to give signal handlers a chance to clean up. + stdcall1(_Sleep, uintptr(_INFINITE)) + } return 1 } return 0 diff --git a/src/runtime/signal_windows_test.go b/src/runtime/signal_windows_test.go index a5a885c2f7..33a9b92ee7 100644 --- a/src/runtime/signal_windows_test.go +++ b/src/runtime/signal_windows_test.go @@ -11,6 +11,7 @@ import ( "os/exec" "path/filepath" "runtime" + "strconv" "strings" "syscall" "testing" @@ -79,6 +80,69 @@ func sendCtrlBreak(pid int) error { return nil } +// TestCtrlHandler tests that Go can gracefully handle closing the console window. +// See https://golang.org/issues/41884. +func TestCtrlHandler(t *testing.T) { + testenv.MustHaveGoBuild(t) + t.Parallel() + + // build go program + exe := filepath.Join(t.TempDir(), "test.exe") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, "testdata/testwinsignal/main.go") + out, err := testenv.CleanCmdEnv(cmd).CombinedOutput() + if err != nil { + t.Fatalf("failed to build go exe: %v\n%s", err, out) + } + + // run test program + cmd = exec.Command(exe) + var stderr bytes.Buffer + cmd.Stderr = &stderr + outPipe, err := cmd.StdoutPipe() + if err != nil { + t.Fatalf("Failed to create stdout pipe: %v", err) + } + outReader := bufio.NewReader(outPipe) + + // in a new command window + const _CREATE_NEW_CONSOLE = 0x00000010 + cmd.SysProcAttr = &syscall.SysProcAttr{ + CreationFlags: _CREATE_NEW_CONSOLE, + HideWindow: true, + } + if err := cmd.Start(); err != nil { + t.Fatalf("Start failed: %v", err) + } + defer func() { + cmd.Process.Kill() + cmd.Wait() + }() + + // wait for child to be ready to receive signals + if line, err := outReader.ReadString('\n'); err != nil { + t.Fatalf("could not read stdout: %v", err) + } else if strings.TrimSpace(line) != "ready" { + t.Fatalf("unexpected message: %s", line) + } + + // gracefully kill pid, this closes the command window + if err := exec.Command("taskkill.exe", "/pid", strconv.Itoa(cmd.Process.Pid)).Run(); err != nil { + t.Fatalf("failed to kill: %v", err) + } + + // check child received, handled SIGTERM + if line, err := outReader.ReadString('\n'); err != nil { + t.Fatalf("could not read stdout: %v", err) + } else if expected, got := syscall.SIGTERM.String(), strings.TrimSpace(line); expected != got { + t.Fatalf("Expected '%s' got: %s", expected, got) + } + + // check child exited gracefully, did not timeout + if err := cmd.Wait(); err != nil { + t.Fatalf("Program exited with error: %v\n%s", err, &stderr) + } +} + // TestLibraryCtrlHandler tests that Go DLL allows calling program to handle console control events. // See https://golang.org/issues/35965. func TestLibraryCtrlHandler(t *testing.T) { diff --git a/src/runtime/testdata/testwinsignal/main.go b/src/runtime/testdata/testwinsignal/main.go new file mode 100644 index 0000000000..d8cd884ffa --- /dev/null +++ b/src/runtime/testdata/testwinsignal/main.go @@ -0,0 +1,19 @@ +package main + +import ( + "fmt" + "os" + "os/signal" + "time" +) + +func main() { + c := make(chan os.Signal, 1) + signal.Notify(c) + + fmt.Println("ready") + sig := <-c + + time.Sleep(time.Second) + fmt.Println(sig) +} -- GitLab From a5a5e2c968eb14335f4e46606d8edfbdbdcea728 Mon Sep 17 00:00:00 2001 From: Dan Scales Date: Mon, 25 Jan 2021 17:51:03 -0800 Subject: [PATCH 1712/1792] runtime: make sure to remove open-coded defer entries in all cases after a recover We add entries to the defer list at panic/goexit time on-the-fly for frames with open-coded defers. We do this so that we can correctly process open-coded defers and non-open-coded defers in the correct order during panics/goexits. But we need to remove entries for open-coded defers from the defer list when there is a recover, since those entries may never get removed otherwise and will get stale, since their corresponding defers may now be processed normally (inline). This bug here is that we were only removing higher-up stale entries during a recover if all defers in the current frame were done. But we could have more defers in the current frame (as the new test case shows). In this case, we need to leave the current defer entry around for use by deferreturn, but still remove any stale entries further along the chain. For bug 43921, simple change that we should abort the removal loop for any defer entry that is started (i.e. in process by a still not-recovered outer panic), even if it is not an open-coded defer. This change does not fix bug 43920, which looks to be a more complex fix. Fixes #43882 Fixes #43921 Change-Id: Ie05b2fa26973aa26b25c8899a2abc916090ee4f5 Reviewed-on: https://go-review.googlesource.com/c/go/+/286712 Run-TryBot: Dan Scales TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky Reviewed-by: Keith Randall Trust: Dan Scales --- src/runtime/crash_test.go | 12 +++++ src/runtime/defer_test.go | 28 ++++++++++ src/runtime/panic.go | 63 ++++++++++++----------- src/runtime/testdata/testprog/deadlock.go | 39 ++++++++++++++ 4 files changed, 113 insertions(+), 29 deletions(-) diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go index 58ad4f3eba..e5bd7973b7 100644 --- a/src/runtime/crash_test.go +++ b/src/runtime/crash_test.go @@ -294,6 +294,18 @@ func TestRecursivePanic4(t *testing.T) { } +func TestRecursivePanic5(t *testing.T) { + output := runTestProg(t, "testprog", "RecursivePanic5") + want := `first panic +second panic +panic: third panic +` + if !strings.HasPrefix(output, want) { + t.Fatalf("output does not start with %q:\n%s", want, output) + } + +} + func TestGoexitCrash(t *testing.T) { // External linking brings in cgo, causing deadlock detection not working. testenv.MustInternalLink(t) diff --git a/src/runtime/defer_test.go b/src/runtime/defer_test.go index 5ac0814564..9a40ea1984 100644 --- a/src/runtime/defer_test.go +++ b/src/runtime/defer_test.go @@ -410,3 +410,31 @@ func rec1(max int) { rec1(max - 1) } } + +func TestIssue43921(t *testing.T) { + defer func() { + expect(t, 1, recover()) + }() + func() { + // Prevent open-coded defers + for { + defer func() {}() + break + } + + defer func() { + defer func() { + expect(t, 4, recover()) + }() + panic(4) + }() + panic(1) + + }() +} + +func expect(t *testing.T, n int, err interface{}) { + if n != err { + t.Fatalf("have %v, want %v", err, n) + } +} diff --git a/src/runtime/panic.go b/src/runtime/panic.go index aed17d6fc6..5b2ccdd874 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -1000,37 +1000,42 @@ func gopanic(e interface{}) { } atomic.Xadd(&runningPanicDefers, -1) - if done { - // Remove any remaining non-started, open-coded - // defer entries after a recover, since the - // corresponding defers will be executed normally - // (inline). Any such entry will become stale once - // we run the corresponding defers inline and exit - // the associated stack frame. - d := gp._defer - var prev *_defer - for d != nil { - if d.openDefer { - if d.started { - // This defer is started but we - // are in the middle of a - // defer-panic-recover inside of - // it, so don't remove it or any - // further defer entries - break - } - if prev == nil { - gp._defer = d.link - } else { - prev.link = d.link - } - newd := d.link - freedefer(d) - d = newd + // Remove any remaining non-started, open-coded + // defer entries after a recover, since the + // corresponding defers will be executed normally + // (inline). Any such entry will become stale once + // we run the corresponding defers inline and exit + // the associated stack frame. + d := gp._defer + var prev *_defer + if !done { + // Skip our current frame, if not done. It is + // needed to complete any remaining defers in + // deferreturn() + prev = d + d = d.link + } + for d != nil { + if d.started { + // This defer is started but we + // are in the middle of a + // defer-panic-recover inside of + // it, so don't remove it or any + // further defer entries + break + } + if d.openDefer { + if prev == nil { + gp._defer = d.link } else { - prev = d - d = d.link + prev.link = d.link } + newd := d.link + freedefer(d) + d = newd + } else { + prev = d + d = d.link } } diff --git a/src/runtime/testdata/testprog/deadlock.go b/src/runtime/testdata/testprog/deadlock.go index 105d6a5faa..781acbd770 100644 --- a/src/runtime/testdata/testprog/deadlock.go +++ b/src/runtime/testdata/testprog/deadlock.go @@ -25,6 +25,7 @@ func init() { register("RecursivePanic2", RecursivePanic2) register("RecursivePanic3", RecursivePanic3) register("RecursivePanic4", RecursivePanic4) + register("RecursivePanic5", RecursivePanic5) register("GoexitExit", GoexitExit) register("GoNil", GoNil) register("MainGoroutineID", MainGoroutineID) @@ -160,6 +161,44 @@ func RecursivePanic4() { panic("first panic") } +// Test case where we have an open-coded defer higher up the stack (in two), and +// in the current function (three) we recover in a defer while we still have +// another defer to be processed. +func RecursivePanic5() { + one() + panic("third panic") +} + +//go:noinline +func one() { + two() +} + +//go:noinline +func two() { + defer func() { + }() + + three() +} + +//go:noinline +func three() { + defer func() { + }() + + defer func() { + fmt.Println(recover()) + }() + + defer func() { + fmt.Println(recover()) + panic("second panic") + }() + + panic("first panic") +} + func GoexitExit() { println("t1") go func() { -- GitLab From 35334caf18cb35ecc7a43082b7bfcc7ce8d0de8f Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Wed, 27 Jan 2021 12:00:46 -0800 Subject: [PATCH 1713/1792] crypto/x509: remove leftover CertificateRequest field Removes the KeyUsage field that was missed in the rollback in CL 281235. Also updates CreateCertificateRequest to reflect that these fields were removed. For #43407. Updates #43477. Updates #37172. Change-Id: I6244aed4a3ef3c2460c38af5511e5c2e82546179 Reviewed-on: https://go-review.googlesource.com/c/go/+/287392 Trust: Alexander Rakoczy Trust: Roland Shoemaker Trust: Dmitri Shuralyov Run-TryBot: Alexander Rakoczy Reviewed-by: Alexander Rakoczy Reviewed-by: Dmitri Shuralyov Reviewed-by: Filippo Valsorda TryBot-Result: Go Bot --- src/crypto/x509/x509.go | 24 ------------------------ src/crypto/x509/x509_test.go | 4 ---- 2 files changed, 28 deletions(-) diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 42d8158d63..8c0299b11e 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -1997,15 +1997,6 @@ func buildCSRExtensions(template *CertificateRequest) ([]pkix.Extension, error) }) } - if template.KeyUsage != 0 && - !oidInExtensions(oidExtensionKeyUsage, template.ExtraExtensions) { - ext, err := marshalKeyUsage(template.KeyUsage) - if err != nil { - return nil, err - } - ret = append(ret, ext) - } - return append(ret, template.ExtraExtensions...), nil } @@ -2371,7 +2362,6 @@ type CertificateRequest struct { Version int Signature []byte SignatureAlgorithm SignatureAlgorithm - KeyUsage KeyUsage PublicKeyAlgorithm PublicKeyAlgorithm PublicKey interface{} @@ -2501,15 +2491,6 @@ func parseCSRExtensions(rawAttributes []asn1.RawValue) ([]pkix.Extension, error) // - EmailAddresses // - IPAddresses // - URIs -// - KeyUsage -// - ExtKeyUsage -// - UnknownExtKeyUsage -// - BasicConstraintsValid -// - IsCA -// - MaxPathLen -// - MaxPathLenZero -// - SubjectKeyId -// - PolicyIdentifiers // - ExtraExtensions // - Attributes (deprecated) // @@ -2734,11 +2715,6 @@ func parseCertificateRequest(in *certificateRequest) (*CertificateRequest, error if err != nil { return nil, err } - case extension.Id.Equal(oidExtensionKeyUsage): - out.KeyUsage, err = parseKeyUsageExtension(extension.Value) - if err != nil { - return nil, err - } } } diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index d5c7ec466b..51dda16815 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -2977,7 +2977,6 @@ func TestCertificateRequestRoundtripFields(t *testing.T) { EmailAddresses: []string{"a@example.com", "b@example.com"}, IPAddresses: []net.IP{net.IPv4(192, 0, 2, 0), net.IPv6loopback}, URIs: []*url.URL{urlA, urlB}, - KeyUsage: KeyUsageCertSign, } out := marshalAndParseCSR(t, in) @@ -2995,7 +2994,4 @@ func TestCertificateRequestRoundtripFields(t *testing.T) { if !reflect.DeepEqual(in.URIs, out.URIs) { t.Fatalf("Unexpected URIs: got %v, want %v", out.URIs, in.URIs) } - if in.KeyUsage != out.KeyUsage { - t.Fatalf("Unexpected KeyUsage: got %v, want %v", out.KeyUsage, in.KeyUsage) - } } -- GitLab From 00f2ff5c942e8f3e68cd10b5909278cda15c6bb5 Mon Sep 17 00:00:00 2001 From: Alexander Rakoczy Date: Wed, 27 Jan 2021 15:26:02 -0500 Subject: [PATCH 1714/1792] api/go1.16: add go/build/constraint APIs These APIs were added in CL 240604 as part of an approved proposal. It was submitted after the initial api/go1.16.txt creation. For #41184 For #43407 Change-Id: Ifb54df2b61c554c32bd9d17afbb74f4e42e0b228 Reviewed-on: https://go-review.googlesource.com/c/go/+/287412 Trust: Alexander Rakoczy Run-TryBot: Alexander Rakoczy Reviewed-by: Dmitri Shuralyov --- api/go1.16.txt | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/api/go1.16.txt b/api/go1.16.txt index 6e1f8ca91d..ce015fd6fb 100644 --- a/api/go1.16.txt +++ b/api/go1.16.txt @@ -232,6 +232,35 @@ pkg go/build, type Package struct, TestEmbedPatterns []string pkg go/build, type Package struct, TestEmbedPatternPos map[string][]token.Position pkg go/build, type Package struct, XTestEmbedPatterns []string pkg go/build, type Package struct, XTestEmbedPatternPos map[string][]token.Position +pkg go/build/constraint, func IsGoBuild(string) bool +pkg go/build/constraint, func IsPlusBuild(string) bool +pkg go/build/constraint, func Parse(string) (Expr, error) +pkg go/build/constraint, func PlusBuildLines(Expr) ([]string, error) +pkg go/build/constraint, method (*AndExpr) Eval(func(string) bool) bool +pkg go/build/constraint, method (*AndExpr) String() string +pkg go/build/constraint, method (*NotExpr) Eval(func(string) bool) bool +pkg go/build/constraint, method (*NotExpr) String() string +pkg go/build/constraint, method (*OrExpr) Eval(func(string) bool) bool +pkg go/build/constraint, method (*OrExpr) String() string +pkg go/build/constraint, method (*SyntaxError) Error() string +pkg go/build/constraint, method (*TagExpr) Eval(func(string) bool) bool +pkg go/build/constraint, method (*TagExpr) String() string +pkg go/build/constraint, type AndExpr struct +pkg go/build/constraint, type AndExpr struct, X Expr +pkg go/build/constraint, type AndExpr struct, Y Expr +pkg go/build/constraint, type Expr interface, Eval(func(string) bool) bool +pkg go/build/constraint, type Expr interface, String() string +pkg go/build/constraint, type Expr interface, unexported methods +pkg go/build/constraint, type NotExpr struct +pkg go/build/constraint, type NotExpr struct, X Expr +pkg go/build/constraint, type OrExpr struct +pkg go/build/constraint, type OrExpr struct, X Expr +pkg go/build/constraint, type OrExpr struct, Y Expr +pkg go/build/constraint, type SyntaxError struct +pkg go/build/constraint, type SyntaxError struct, Err string +pkg go/build/constraint, type SyntaxError struct, Offset int +pkg go/build/constraint, type TagExpr struct +pkg go/build/constraint, type TagExpr struct, Tag string pkg html/template, func ParseFS(fs.FS, ...string) (*Template, error) pkg html/template, method (*Template) ParseFS(fs.FS, ...string) (*Template, error) pkg io, func NopCloser(Reader) ReadCloser -- GitLab From 3e06467282c6d5678a6273747658c04314e013ef Mon Sep 17 00:00:00 2001 From: Alexander Rakoczy Date: Wed, 27 Jan 2021 16:19:02 -0500 Subject: [PATCH 1715/1792] [release-branch.go1.16] go1.16rc1 Change-Id: I978f6df491a19a9c45ab906dbc5194b8665bf4a5 Reviewed-on: https://go-review.googlesource.com/c/go/+/287352 Run-TryBot: Alexander Rakoczy Trust: Alexander Rakoczy TryBot-Result: Go Bot Reviewed-by: Dmitri Shuralyov --- VERSION | 1 + 1 file changed, 1 insertion(+) create mode 100644 VERSION diff --git a/VERSION b/VERSION new file mode 100644 index 0000000000..1903322150 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +go1.16rc1 \ No newline at end of file -- GitLab From 376518d77fb5d718f90c8b66ea25660aa3734032 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Wed, 27 Jan 2021 01:48:47 +1100 Subject: [PATCH 1716/1792] runtime,syscall: convert syscall on openbsd/arm64 to libc Convert the syscall package on openbsd/arm64 to use libc rather than performing direct system calls. Updates #36435 Change-Id: I7e1da8537cea9ed9bf2676f181e56ae99383333f Reviewed-on: https://go-review.googlesource.com/c/go/+/286815 Trust: Joel Sing Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot --- src/runtime/sys_openbsd3.go | 2 +- src/runtime/sys_openbsd_arm64.s | 295 ++++++++ src/syscall/asm_openbsd_arm64.s | 140 +--- src/syscall/exec_bsd.go | 2 +- src/syscall/exec_libc2.go | 2 +- src/syscall/mkall.sh | 5 +- src/syscall/syscall_openbsd1.go | 2 +- src/syscall/syscall_openbsd_libc.go | 2 +- src/syscall/zsyscall_openbsd_arm64.go | 941 ++++++++++++++++++++++---- src/syscall/zsyscall_openbsd_arm64.s | 233 +++++++ 10 files changed, 1372 insertions(+), 252 deletions(-) create mode 100644 src/syscall/zsyscall_openbsd_arm64.s diff --git a/src/runtime/sys_openbsd3.go b/src/runtime/sys_openbsd3.go index a8f9b0ee14..4d4c88e3ac 100644 --- a/src/runtime/sys_openbsd3.go +++ b/src/runtime/sys_openbsd3.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. -// +build openbsd,amd64 +// +build openbsd,amd64 openbsd,arm64 package runtime diff --git a/src/runtime/sys_openbsd_arm64.s b/src/runtime/sys_openbsd_arm64.s index 0fd983ef25..9b4acc90a5 100644 --- a/src/runtime/sys_openbsd_arm64.s +++ b/src/runtime/sys_openbsd_arm64.s @@ -403,3 +403,298 @@ TEXT runtime·sigaltstack_trampoline(SB),NOSPLIT,$0 MOVD $0, R0 // crash on syscall failure MOVD R0, (R0) RET + +// syscall calls a function in libc on behalf of the syscall package. +// syscall takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// syscall expects a 32-bit result and tests for 32-bit -1 +// to decide there was an error. +TEXT runtime·syscall(SB),NOSPLIT,$0 + MOVD R0, R19 // pointer to args + + MOVD (0*8)(R19), R11 // fn + MOVD (1*8)(R19), R0 // a1 + MOVD (2*8)(R19), R1 // a2 + MOVD (3*8)(R19), R2 // a3 + MOVD $0, R3 // vararg + + CALL R11 + + MOVD R0, (4*8)(R19) // r1 + MOVD R1, (5*8)(R19) // r2 + + // Standard libc functions return -1 on error + // and set errno. + CMPW $-1, R0 + BNE ok + + // Get error code from libc. + CALL libc_errno(SB) + MOVW (R0), R0 + MOVD R0, (6*8)(R19) // err + +ok: + RET + +// syscallX calls a function in libc on behalf of the syscall package. +// syscallX takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscallX must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// 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 + MOVD R0, R19 // pointer to args + + MOVD (0*8)(R19), R11 // fn + MOVD (1*8)(R19), R0 // a1 + MOVD (2*8)(R19), R1 // a2 + MOVD (3*8)(R19), R2 // a3 + MOVD $0, R3 // vararg + + CALL R11 + + MOVD R0, (4*8)(R19) // r1 + MOVD R1, (5*8)(R19) // r2 + + // Standard libc functions return -1 on error + // and set errno. + CMP $-1, R0 + BNE ok + + // Get error code from libc. + CALL libc_errno(SB) + MOVW (R0), R0 + MOVD R0, (6*8)(R19) // err + +ok: + RET + +// syscall6 calls a function in libc on behalf of the syscall package. +// syscall6 takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// a4 uintptr +// a5 uintptr +// a6 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall6 must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// syscall6 expects a 32-bit result and tests for 32-bit -1 +// to decide there was an error. +TEXT runtime·syscall6(SB),NOSPLIT,$0 + MOVD R0, R19 // pointer to args + + MOVD (0*8)(R19), R11 // fn + MOVD (1*8)(R19), R0 // a1 + MOVD (2*8)(R19), R1 // a2 + MOVD (3*8)(R19), R2 // a3 + MOVD (4*8)(R19), R3 // a4 + MOVD (5*8)(R19), R4 // a5 + MOVD (6*8)(R19), R5 // a6 + MOVD $0, R6 // vararg + + CALL R11 + + MOVD R0, (7*8)(R19) // r1 + MOVD R1, (8*8)(R19) // r2 + + // Standard libc functions return -1 on error + // and set errno. + CMPW $-1, R0 + BNE ok + + // Get error code from libc. + CALL libc_errno(SB) + MOVW (R0), R0 + MOVD R0, (9*8)(R19) // err + +ok: + RET + +// syscall6X calls a function in libc on behalf of the syscall package. +// syscall6X takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// a4 uintptr +// a5 uintptr +// a6 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall6X must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// 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 + MOVD R0, R19 // pointer to args + + MOVD (0*8)(R19), R11 // fn + MOVD (1*8)(R19), R0 // a1 + MOVD (2*8)(R19), R1 // a2 + MOVD (3*8)(R19), R2 // a3 + MOVD (4*8)(R19), R3 // a4 + MOVD (5*8)(R19), R4 // a5 + MOVD (6*8)(R19), R5 // a6 + MOVD $0, R6 // vararg + + CALL R11 + + MOVD R0, (7*8)(R19) // r1 + MOVD R1, (8*8)(R19) // r2 + + // Standard libc functions return -1 on error + // and set errno. + CMP $-1, R0 + BNE ok + + // Get error code from libc. + CALL libc_errno(SB) + MOVW (R0), R0 + MOVD R0, (9*8)(R19) // err + +ok: + RET + +// syscall10 calls a function in libc on behalf of the syscall package. +// syscall10 takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// a4 uintptr +// a5 uintptr +// a6 uintptr +// a7 uintptr +// a8 uintptr +// a9 uintptr +// a10 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall10 must be called on the g0 stack with the +// C calling convention (use libcCall). +TEXT runtime·syscall10(SB),NOSPLIT,$0 + MOVD R0, R19 // pointer to args + + MOVD (0*8)(R19), R11 // fn + MOVD (1*8)(R19), R0 // a1 + MOVD (2*8)(R19), R1 // a2 + MOVD (3*8)(R19), R2 // a3 + MOVD (4*8)(R19), R3 // a4 + MOVD (5*8)(R19), R4 // a5 + MOVD (6*8)(R19), R5 // a6 + MOVD (7*8)(R19), R6 // a7 + MOVD (8*8)(R19), R7 // a8 + MOVD (9*8)(R19), R8 // a9 + MOVD (10*8)(R19), R9 // a10 + MOVD $0, R10 // vararg + + CALL R11 + + MOVD R0, (11*8)(R19) // r1 + MOVD R1, (12*8)(R19) // r2 + + // Standard libc functions return -1 on error + // and set errno. + CMPW $-1, R0 + BNE ok + + // Get error code from libc. + CALL libc_errno(SB) + MOVW (R0), R0 + MOVD R0, (13*8)(R19) // err + +ok: + RET + +// syscall10X calls a function in libc on behalf of the syscall package. +// syscall10X takes a pointer to a struct like: +// struct { +// fn uintptr +// a1 uintptr +// a2 uintptr +// a3 uintptr +// a4 uintptr +// a5 uintptr +// a6 uintptr +// a7 uintptr +// a8 uintptr +// a9 uintptr +// a10 uintptr +// r1 uintptr +// r2 uintptr +// err uintptr +// } +// syscall10X must be called on the g0 stack with the +// C calling convention (use libcCall). +// +// 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 + MOVD R0, R19 // pointer to args + + MOVD (0*8)(R19), R11 // fn + MOVD (1*8)(R19), R0 // a1 + MOVD (2*8)(R19), R1 // a2 + MOVD (3*8)(R19), R2 // a3 + MOVD (4*8)(R19), R3 // a4 + MOVD (5*8)(R19), R4 // a5 + MOVD (6*8)(R19), R5 // a6 + MOVD (7*8)(R19), R6 // a7 + MOVD (8*8)(R19), R7 // a8 + MOVD (9*8)(R19), R8 // a9 + MOVD (10*8)(R19), R9 // a10 + MOVD $0, R10 // vararg + + CALL R11 + + MOVD R0, (11*8)(R19) // r1 + MOVD R1, (12*8)(R19) // r2 + + // Standard libc functions return -1 on error + // and set errno. + CMP $-1, R0 + BNE ok + + // Get error code from libc. + CALL libc_errno(SB) + MOVW (R0), R0 + MOVD R0, (13*8)(R19) // err + +ok: + RET diff --git a/src/syscall/asm_openbsd_arm64.s b/src/syscall/asm_openbsd_arm64.s index dcbed10cbe..61595a11a3 100644 --- a/src/syscall/asm_openbsd_arm64.s +++ b/src/syscall/asm_openbsd_arm64.s @@ -4,127 +4,29 @@ #include "textflag.h" -// See comment in runtime/sys_openbsd_arm64.s re this construction. -#define INVOKE_SYSCALL \ - SVC; \ - NOOP; \ - NOOP +// +// System call support for ARM64, OpenBSD +// -// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64); -TEXT ·Syscall(SB),NOSPLIT,$0-56 - BL runtime·entersyscall(SB) - MOVD a1+8(FP), R0 - MOVD a2+16(FP), R1 - MOVD a3+24(FP), R2 - MOVD $0, R3 - MOVD $0, R4 - MOVD $0, R5 - MOVD trap+0(FP), R8 // syscall number - INVOKE_SYSCALL - BCC ok - MOVD $-1, R4 - MOVD R4, r1+32(FP) // r1 - MOVD ZR, r2+40(FP) // r2 - MOVD R0, err+48(FP) // errno - BL runtime·exitsyscall(SB) - RET -ok: - MOVD R0, r1+32(FP) // r1 - MOVD R1, r2+40(FP) // r2 - MOVD ZR, err+48(FP) // errno - BL runtime·exitsyscall(SB) - RET +// Provide these function names via assembly so they are provided as ABI0, +// rather than ABIInternal. -TEXT ·Syscall6(SB),NOSPLIT,$0-80 - BL runtime·entersyscall(SB) - MOVD a1+8(FP), R0 - MOVD a2+16(FP), R1 - MOVD a3+24(FP), R2 - MOVD a4+32(FP), R3 - MOVD a5+40(FP), R4 - MOVD a6+48(FP), R5 - MOVD trap+0(FP), R8 // syscall number - INVOKE_SYSCALL - BCC ok - MOVD $-1, R4 - MOVD R4, r1+56(FP) // r1 - MOVD ZR, r2+64(FP) // r2 - MOVD R0, err+72(FP) // errno - BL runtime·exitsyscall(SB) - RET -ok: - MOVD R0, r1+56(FP) // r1 - MOVD R1, r2+64(FP) // r2 - MOVD ZR, err+72(FP) // errno - BL runtime·exitsyscall(SB) - RET +// func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP ·syscallInternal(SB) -TEXT ·Syscall9(SB),NOSPLIT,$0-104 - BL runtime·entersyscall(SB) - MOVD a1+8(FP), R0 - MOVD a2+16(FP), R1 - MOVD a3+24(FP), R2 - MOVD a4+32(FP), R3 - MOVD a5+40(FP), R4 - MOVD a6+48(FP), R5 - MOVD a7+56(FP), R6 - MOVD a8+64(FP), R7 - MOVD a9+72(FP), R8 // on stack - MOVD R8, 8(RSP) - MOVD num+0(FP), R8 // syscall number - INVOKE_SYSCALL - BCC ok - MOVD $-1, R4 - MOVD R4, r1+80(FP) // r1 - MOVD ZR, r2+88(FP) // r2 - MOVD R0, err+96(FP) // errno - BL runtime·exitsyscall(SB) - RET -ok: - MOVD R0, r1+80(FP) // r1 - MOVD R1, r2+88(FP) // r2 - MOVD ZR, err+96(FP) // errno - BL runtime·exitsyscall(SB) - RET +// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP ·syscall6Internal(SB) -TEXT ·RawSyscall(SB),NOSPLIT,$0-56 - MOVD a1+8(FP), R0 - MOVD a2+16(FP), R1 - MOVD a3+24(FP), R2 - MOVD $0, R3 - MOVD $0, R4 - MOVD $0, R5 - MOVD trap+0(FP), R8 // syscall number - INVOKE_SYSCALL - BCC ok - MOVD $-1, R4 - MOVD R4, r1+32(FP) // r1 - MOVD ZR, r2+40(FP) // r2 - MOVD R0, err+48(FP) // errno - RET -ok: - MOVD R0, r1+32(FP) // r1 - MOVD R1, r2+40(FP) // r2 - MOVD ZR, err+48(FP) // errno - RET +// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP ·rawSyscallInternal(SB) -TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 - MOVD a1+8(FP), R0 - MOVD a2+16(FP), R1 - MOVD a3+24(FP), R2 - MOVD a4+32(FP), R3 - MOVD a5+40(FP), R4 - MOVD a6+48(FP), R5 - MOVD trap+0(FP), R8 // syscall number - INVOKE_SYSCALL - BCC ok - MOVD $-1, R4 - MOVD R4, r1+56(FP) // r1 - MOVD ZR, r2+64(FP) // r2 - MOVD R0, err+72(FP) // errno - RET -ok: - MOVD R0, r1+56(FP) // r1 - MOVD R1, r2+64(FP) // r2 - MOVD ZR, err+72(FP) // errno - RET +// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP ·rawSyscall6Internal(SB) + +// func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP ·syscall9Internal(SB) diff --git a/src/syscall/exec_bsd.go b/src/syscall/exec_bsd.go index 9069ef4613..940a81b58e 100644 --- a/src/syscall/exec_bsd.go +++ b/src/syscall/exec_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. -// +build dragonfly freebsd netbsd openbsd,!amd64 +// +build dragonfly freebsd netbsd openbsd,!amd64,!arm64 package syscall diff --git a/src/syscall/exec_libc2.go b/src/syscall/exec_libc2.go index 496e7cf4c3..45d3f85baf 100644 --- a/src/syscall/exec_libc2.go +++ b/src/syscall/exec_libc2.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. -// +build darwin openbsd,amd64 +// +build darwin openbsd,amd64 openbsd,arm64 package syscall diff --git a/src/syscall/mkall.sh b/src/syscall/mkall.sh index 87e5157416..d1e28efa8c 100755 --- a/src/syscall/mkall.sh +++ b/src/syscall/mkall.sh @@ -313,15 +313,16 @@ openbsd_arm) mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; openbsd_arm64) - GOOSARCH_in="syscall_openbsd1.go syscall_openbsd_$GOARCH.go" + GOOSARCH_in="syscall_openbsd_libc.go syscall_openbsd_$GOARCH.go" mkerrors="$mkerrors -m64" - mksyscall="./mksyscall.pl -openbsd" + mksyscall="./mksyscall.pl -openbsd -libc" mksysctl="./mksysctl_openbsd.pl" zsysctl="zsysctl_openbsd.go" mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" # Let the type of C char be signed to make the bare syscall # API consistent between platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + mkasm="go run mkasm.go" ;; openbsd_mips64) GOOSARCH_in="syscall_openbsd1.go syscall_openbsd_$GOARCH.go" diff --git a/src/syscall/syscall_openbsd1.go b/src/syscall/syscall_openbsd1.go index d8065374fb..2c7d0f8c90 100644 --- a/src/syscall/syscall_openbsd1.go +++ b/src/syscall/syscall_openbsd1.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. -// +build openbsd,!amd64 +// +build openbsd,!amd64,!arm64 package syscall diff --git a/src/syscall/syscall_openbsd_libc.go b/src/syscall/syscall_openbsd_libc.go index 191c7e0e43..2fcc2011bc 100644 --- a/src/syscall/syscall_openbsd_libc.go +++ b/src/syscall/syscall_openbsd_libc.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. -// +build openbsd,amd64 +// +build openbsd,amd64 openbsd,arm64 package syscall diff --git a/src/syscall/zsyscall_openbsd_arm64.go b/src/syscall/zsyscall_openbsd_arm64.go index 626ce17703..90a46f3c4b 100644 --- a/src/syscall/zsyscall_openbsd_arm64.go +++ b/src/syscall/zsyscall_openbsd_arm64.go @@ -1,4 +1,4 @@ -// mksyscall.pl -openbsd -tags openbsd,arm64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm64.go +// mksyscall.pl -openbsd -libc -tags openbsd,arm64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_libc.go syscall_openbsd_arm64.go // Code generated by the command above; DO NOT EDIT. // +build openbsd,arm64 @@ -10,7 +10,7 @@ import "unsafe" // 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 := rawSyscall(funcPC(libc_getgroups_trampoline), uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -18,20 +18,30 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { return } +func libc_getgroups_trampoline() + +//go:linkname libc_getgroups libc_getgroups +//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 := rawSyscall(funcPC(libc_setgroups_trampoline), uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setgroups_trampoline() + +//go:linkname libc_setgroups libc_setgroups +//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 := syscall6(funcPC(libc_wait4_trampoline), uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) wpid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -39,10 +49,15 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err return } +func libc_wait4_trampoline() + +//go:linkname libc_wait4 libc_wait4 +//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(funcPC(libc_accept_trampoline), uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -50,30 +65,45 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { return } +func libc_accept_trampoline() + +//go:linkname libc_accept libc_accept +//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(funcPC(libc_bind_trampoline), uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_bind_trampoline() + +//go:linkname libc_bind libc_bind +//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(funcPC(libc_connect_trampoline), uintptr(s), uintptr(addr), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_connect_trampoline() + +//go:linkname libc_connect libc_connect +//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 := rawSyscall(funcPC(libc_socket_trampoline), uintptr(domain), uintptr(typ), uintptr(proto)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -81,66 +111,101 @@ func socket(domain int, typ int, proto int) (fd int, err error) { return } +func libc_socket_trampoline() + +//go:linkname libc_socket libc_socket +//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 := syscall6(funcPC(libc_getsockopt_trampoline), uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getsockopt_trampoline() + +//go:linkname libc_getsockopt libc_getsockopt +//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 := syscall6(funcPC(libc_setsockopt_trampoline), uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setsockopt_trampoline() + +//go:linkname libc_setsockopt libc_setsockopt +//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 := rawSyscall(funcPC(libc_getpeername_trampoline), uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getpeername_trampoline() + +//go:linkname libc_getpeername libc_getpeername +//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 := rawSyscall(funcPC(libc_getsockname_trampoline), uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getsockname_trampoline() + +//go:linkname libc_getsockname libc_getsockname +//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(funcPC(libc_shutdown_trampoline), uintptr(s), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_shutdown_trampoline() + +//go:linkname libc_shutdown libc_shutdown +//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 := rawSyscall6(funcPC(libc_socketpair_trampoline), uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_socketpair_trampoline() + +//go:linkname libc_socketpair libc_socketpair +//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) { @@ -150,7 +215,7 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } 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 := syscall6(funcPC(libc_recvfrom_trampoline), 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) @@ -158,6 +223,11 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl return } +func libc_recvfrom_trampoline() + +//go:linkname libc_recvfrom libc_recvfrom +//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) { @@ -167,17 +237,22 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( } else { _p0 = unsafe.Pointer(&_zero) } - _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + _, _, e1 := syscall6(funcPC(libc_sendto_trampoline), uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_sendto_trampoline() + +//go:linkname libc_sendto libc_sendto +//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(funcPC(libc_recvmsg_trampoline), uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -185,10 +260,15 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +func libc_recvmsg_trampoline() + +//go:linkname libc_recvmsg libc_recvmsg +//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(funcPC(libc_sendmsg_trampoline), uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -196,10 +276,15 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { return } +func libc_sendmsg_trampoline() + +//go:linkname libc_sendmsg libc_sendmsg +//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 := syscall6(funcPC(libc_kevent_trampoline), uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -207,6 +292,11 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne return } +func libc_kevent_trampoline() + +//go:linkname libc_kevent libc_kevent +//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) { @@ -215,27 +305,37 @@ func utimes(path string, timeval *[2]Timeval) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + _, _, e1 := syscall(funcPC(libc_utimes_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_utimes_trampoline() + +//go:linkname libc_utimes libc_utimes +//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(funcPC(libc_futimes_trampoline), uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_futimes_trampoline() + +//go:linkname libc_futimes libc_futimes +//go:cgo_import_dynamic libc_futimes futimes "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { - r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + r0, _, e1 := syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -243,20 +343,30 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { return } +func libc_fcntl_trampoline() + +//go:linkname libc_fcntl libc_fcntl +//go:cgo_import_dynamic libc_fcntl fcntl "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 := rawSyscall(funcPC(libc_pipe2_trampoline), uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_pipe2_trampoline() + +//go:linkname libc_pipe2 libc_pipe2 +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { - r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + r0, _, e1 := syscall6(funcPC(libc_accept4_trampoline), uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -264,6 +374,11 @@ func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int return } +func libc_accept4_trampoline() + +//go:linkname libc_accept4 libc_accept4 +//go:cgo_import_dynamic libc_accept4 accept4 "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) { @@ -273,7 +388,7 @@ func getdents(fd int, buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + r0, _, e1 := syscall(funcPC(libc_getdents_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -281,6 +396,11 @@ func getdents(fd int, buf []byte) (n int, err error) { return } +func libc_getdents_trampoline() + +//go:linkname libc_getdents libc_getdents +//go:cgo_import_dynamic libc_getdents getdents "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -289,23 +409,33 @@ func Access(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall(funcPC(libc_access_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_access_trampoline() + +//go:linkname libc_access libc_access +//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(funcPC(libc_adjtime_trampoline), uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_adjtime_trampoline() + +//go:linkname libc_adjtime libc_adjtime +//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) { @@ -314,13 +444,18 @@ func Chdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_chdir_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chdir_trampoline() + +//go:linkname libc_chdir libc_chdir +//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) { @@ -329,13 +464,18 @@ func Chflags(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall(funcPC(libc_chflags_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chflags_trampoline() + +//go:linkname libc_chflags libc_chflags +//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) { @@ -344,13 +484,18 @@ func Chmod(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall(funcPC(libc_chmod_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chmod_trampoline() + +//go:linkname libc_chmod libc_chmod +//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) { @@ -359,13 +504,18 @@ func Chown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall(funcPC(libc_chown_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chown_trampoline() + +//go:linkname libc_chown libc_chown +//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) { @@ -374,27 +524,37 @@ func Chroot(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_chroot_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_chroot_trampoline() + +//go:linkname libc_chroot libc_chroot +//go:cgo_import_dynamic libc_chroot chroot "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(funcPC(libc_close_trampoline), uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_close_trampoline() + +//go:linkname libc_close libc_close +//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(funcPC(libc_dup_trampoline), uintptr(fd), 0, 0) nfd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -402,70 +562,105 @@ func Dup(fd int) (nfd int, err error) { return } +func libc_dup_trampoline() + +//go:linkname libc_dup libc_dup +//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(funcPC(libc_dup2_trampoline), uintptr(from), uintptr(to), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_dup2_trampoline() + +//go:linkname libc_dup2 libc_dup2 +//go:cgo_import_dynamic libc_dup2 dup2 "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(funcPC(libc_fchdir_trampoline), uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fchdir_trampoline() + +//go:linkname libc_fchdir libc_fchdir +//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(funcPC(libc_fchflags_trampoline), uintptr(fd), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fchflags_trampoline() + +//go:linkname libc_fchflags libc_fchflags +//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(funcPC(libc_fchmod_trampoline), uintptr(fd), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fchmod_trampoline() + +//go:linkname libc_fchmod libc_fchmod +//go:cgo_import_dynamic libc_fchmod fchmod "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(funcPC(libc_fchown_trampoline), uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fchown_trampoline() + +//go:linkname libc_fchown libc_fchown +//go:cgo_import_dynamic libc_fchown fchown "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(funcPC(libc_flock_trampoline), uintptr(fd), uintptr(how), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_flock_trampoline() + +//go:linkname libc_flock libc_flock +//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(funcPC(libc_fpathconf_trampoline), uintptr(fd), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -473,74 +668,114 @@ func Fpathconf(fd int, name int) (val int, err error) { return } +func libc_fpathconf_trampoline() + +//go:linkname libc_fpathconf libc_fpathconf +//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(funcPC(libc_fstat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fstat_trampoline() + +//go:linkname libc_fstat libc_fstat +//go:cgo_import_dynamic libc_fstat fstat "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(funcPC(libc_fstatfs_trampoline), uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fstatfs_trampoline() + +//go:linkname libc_fstatfs libc_fstatfs +//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(funcPC(libc_fsync_trampoline), uintptr(fd), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_fsync_trampoline() + +//go:linkname libc_fsync libc_fsync +//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(funcPC(libc_ftruncate_trampoline), uintptr(fd), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_ftruncate_trampoline() + +//go:linkname libc_ftruncate libc_ftruncate +//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, _, _ := rawSyscall(funcPC(libc_getegid_trampoline), 0, 0, 0) egid = int(r0) return } +func libc_getegid_trampoline() + +//go:linkname libc_getegid libc_getegid +//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, _, _ := rawSyscall(funcPC(libc_geteuid_trampoline), 0, 0, 0) uid = int(r0) return } +func libc_geteuid_trampoline() + +//go:linkname libc_geteuid libc_geteuid +//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, _, _ := rawSyscall(funcPC(libc_getgid_trampoline), 0, 0, 0) gid = int(r0) return } +func libc_getgid_trampoline() + +//go:linkname libc_getgid libc_getgid +//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 := rawSyscall(funcPC(libc_getpgid_trampoline), uintptr(pid), 0, 0) pgid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -548,34 +783,54 @@ func Getpgid(pid int) (pgid int, err error) { return } +func libc_getpgid_trampoline() + +//go:linkname libc_getpgid libc_getpgid +//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, _, _ := rawSyscall(funcPC(libc_getpgrp_trampoline), 0, 0, 0) pgrp = int(r0) return } +func libc_getpgrp_trampoline() + +//go:linkname libc_getpgrp libc_getpgrp +//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, _, _ := rawSyscall(funcPC(libc_getpid_trampoline), 0, 0, 0) pid = int(r0) return } +func libc_getpid_trampoline() + +//go:linkname libc_getpid libc_getpid +//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, _, _ := rawSyscall(funcPC(libc_getppid_trampoline), 0, 0, 0) ppid = int(r0) return } +func libc_getppid_trampoline() + +//go:linkname libc_getppid libc_getppid +//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(funcPC(libc_getpriority_trampoline), uintptr(which), uintptr(who), 0) prio = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -583,30 +838,45 @@ func Getpriority(which int, who int) (prio int, err error) { return } +func libc_getpriority_trampoline() + +//go:linkname libc_getpriority libc_getpriority +//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 := rawSyscall(funcPC(libc_getrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getrlimit_trampoline() + +//go:linkname libc_getrlimit libc_getrlimit +//go:cgo_import_dynamic libc_getrlimit getrlimit "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 := rawSyscall(funcPC(libc_getrusage_trampoline), uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_getrusage_trampoline() + +//go:linkname libc_getrusage libc_getrusage +//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 := rawSyscall(funcPC(libc_getsid_trampoline), uintptr(pid), 0, 0) sid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -614,46 +884,71 @@ func Getsid(pid int) (sid int, err error) { return } +func libc_getsid_trampoline() + +//go:linkname libc_getsid libc_getsid +//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 := rawSyscall(funcPC(libc_gettimeofday_trampoline), uintptr(unsafe.Pointer(tv)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_gettimeofday_trampoline() + +//go:linkname libc_gettimeofday libc_gettimeofday +//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, _, _ := rawSyscall(funcPC(libc_getuid_trampoline), 0, 0, 0) uid = int(r0) return } +func libc_getuid_trampoline() + +//go:linkname libc_getuid libc_getuid +//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(funcPC(libc_issetugid_trampoline), 0, 0, 0) tainted = bool(r0 != 0) return } +func libc_issetugid_trampoline() + +//go:linkname libc_issetugid libc_issetugid +//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 Signal) (err error) { - _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + _, _, e1 := syscall(funcPC(libc_kill_trampoline), uintptr(pid), uintptr(signum), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_kill_trampoline() + +//go:linkname libc_kill libc_kill +//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(funcPC(libc_kqueue_trampoline), 0, 0, 0) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -661,6 +956,11 @@ func Kqueue() (fd int, err error) { return } +func libc_kqueue_trampoline() + +//go:linkname libc_kqueue libc_kqueue +//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) { @@ -669,13 +969,18 @@ func Lchown(path string, uid int, gid int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + _, _, e1 := syscall(funcPC(libc_lchown_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_lchown_trampoline() + +//go:linkname libc_lchown libc_lchown +//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) { @@ -689,23 +994,33 @@ func Link(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall(funcPC(libc_link_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_link_trampoline() + +//go:linkname libc_link libc_link +//go:cgo_import_dynamic libc_link link "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(funcPC(libc_listen_trampoline), uintptr(s), uintptr(backlog), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_listen_trampoline() + +//go:linkname libc_listen libc_listen +//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) { @@ -714,13 +1029,18 @@ func Lstat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall(funcPC(libc_lstat_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_lstat_trampoline() + +//go:linkname libc_lstat libc_lstat +//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) { @@ -729,13 +1049,18 @@ func Mkdir(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall(funcPC(libc_mkdir_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_mkdir_trampoline() + +//go:linkname libc_mkdir libc_mkdir +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -744,13 +1069,18 @@ func Mkfifo(path string, mode uint32) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + _, _, e1 := syscall(funcPC(libc_mkfifo_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_mkfifo_trampoline() + +//go:linkname libc_mkfifo libc_mkfifo +//go:cgo_import_dynamic libc_mkfifo mkfifo "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) { @@ -759,23 +1089,33 @@ func Mknod(path string, mode uint32, dev int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + _, _, e1 := syscall(funcPC(libc_mknod_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_mknod_trampoline() + +//go:linkname libc_mknod libc_mknod +//go:cgo_import_dynamic libc_mknod mknod "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(funcPC(libc_nanosleep_trampoline), uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_nanosleep_trampoline() + +//go:linkname libc_nanosleep libc_nanosleep +//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) { @@ -784,7 +1124,7 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + r0, _, e1 := syscall(funcPC(libc_open_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) fd = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -792,6 +1132,11 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { return } +func libc_open_trampoline() + +//go:linkname libc_open libc_open +//go:cgo_import_dynamic libc_open open "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) { @@ -800,7 +1145,7 @@ func Pathconf(path string, name int) (val int, err error) { if err != nil { return } - r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + r0, _, e1 := syscall(funcPC(libc_pathconf_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -808,6 +1153,11 @@ func Pathconf(path string, name int) (val int, err error) { return } +func libc_pathconf_trampoline() + +//go:linkname libc_pathconf libc_pathconf +//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) { @@ -817,7 +1167,7 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall6(funcPC(libc_pread_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -825,6 +1175,11 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { return } +func libc_pread_trampoline() + +//go:linkname libc_pread libc_pread +//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) { @@ -834,7 +1189,7 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + r0, _, e1 := syscall6(funcPC(libc_pwrite_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -842,6 +1197,11 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { return } +func libc_pwrite_trampoline() + +//go:linkname libc_pwrite libc_pwrite +//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) { @@ -851,7 +1211,7 @@ func read(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall(funcPC(libc_read_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -859,6 +1219,11 @@ func read(fd int, p []byte) (n int, err error) { return } +func libc_read_trampoline() + +//go:linkname libc_read libc_read +//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) { @@ -873,7 +1238,7 @@ func Readlink(path string, buf []byte) (n int, err error) { } else { _p1 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + r0, _, e1 := syscall(funcPC(libc_readlink_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -881,6 +1246,11 @@ func Readlink(path string, buf []byte) (n int, err error) { return } +func libc_readlink_trampoline() + +//go:linkname libc_readlink libc_readlink +//go:cgo_import_dynamic libc_readlink readlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -894,13 +1264,18 @@ func Rename(from string, to string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall(funcPC(libc_rename_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_rename_trampoline() + +//go:linkname libc_rename libc_rename +//go:cgo_import_dynamic libc_rename rename "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -909,13 +1284,18 @@ func Revoke(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_revoke_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_revoke_trampoline() + +//go:linkname libc_revoke libc_revoke +//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) { @@ -924,64 +1304,78 @@ func Rmdir(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_rmdir_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func libc_rmdir_trampoline() -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) - newoffset = int64(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} +//go:linkname libc_rmdir libc_rmdir +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { - _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + _, _, e1 := syscall6(funcPC(libc_select_trampoline), uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_select_trampoline() + +//go:linkname libc_select libc_select +//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 := rawSyscall(funcPC(libc_setegid_trampoline), uintptr(egid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setegid_trampoline() + +//go:linkname libc_setegid libc_setegid +//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 := rawSyscall(funcPC(libc_seteuid_trampoline), uintptr(euid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_seteuid_trampoline() + +//go:linkname libc_seteuid libc_seteuid +//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 := rawSyscall(funcPC(libc_setgid_trampoline), uintptr(gid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setgid_trampoline() + +//go:linkname libc_setgid libc_setgid +//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) { @@ -990,67 +1384,97 @@ func Setlogin(name string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_setlogin_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setlogin_trampoline() + +//go:linkname libc_setlogin libc_setlogin +//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 := rawSyscall(funcPC(libc_setpgid_trampoline), uintptr(pid), uintptr(pgid), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setpgid_trampoline() + +//go:linkname libc_setpgid libc_setpgid +//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(funcPC(libc_setpriority_trampoline), uintptr(which), uintptr(who), uintptr(prio)) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setpriority_trampoline() + +//go:linkname libc_setpriority libc_setpriority +//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 := rawSyscall(funcPC(libc_setregid_trampoline), uintptr(rgid), uintptr(egid), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setregid_trampoline() + +//go:linkname libc_setregid libc_setregid +//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 := rawSyscall(funcPC(libc_setreuid_trampoline), uintptr(ruid), uintptr(euid), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setreuid_trampoline() + +//go:linkname libc_setreuid libc_setreuid +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" + // 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) + _, _, e1 := rawSyscall(funcPC(libc_setrlimit_trampoline), uintptr(which), uintptr(unsafe.Pointer(lim)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setrlimit_trampoline() + +//go:linkname libc_setrlimit libc_setrlimit +//go:cgo_import_dynamic libc_setrlimit setrlimit "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 := rawSyscall(funcPC(libc_setsid_trampoline), 0, 0, 0) pid = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1058,26 +1482,41 @@ func Setsid() (pid int, err error) { return } +func libc_setsid_trampoline() + +//go:linkname libc_setsid libc_setsid +//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 := rawSyscall(funcPC(libc_settimeofday_trampoline), uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_settimeofday_trampoline() + +//go:linkname libc_settimeofday libc_settimeofday +//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 := rawSyscall(funcPC(libc_setuid_trampoline), uintptr(uid), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_setuid_trampoline() + +//go:linkname libc_setuid libc_setuid +//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) { @@ -1086,13 +1525,18 @@ func Stat(path string, stat *Stat_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall(funcPC(libc_stat_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_stat_trampoline() + +//go:linkname libc_stat libc_stat +//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) { @@ -1101,13 +1545,18 @@ func Statfs(path string, stat *Statfs_t) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + _, _, e1 := syscall(funcPC(libc_statfs_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_statfs_trampoline() + +//go:linkname libc_statfs libc_statfs +//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) { @@ -1121,23 +1570,33 @@ func Symlink(path string, link string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + _, _, e1 := syscall(funcPC(libc_symlink_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_symlink_trampoline() + +//go:linkname libc_symlink libc_symlink +//go:cgo_import_dynamic libc_symlink symlink "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(funcPC(libc_sync_trampoline), 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_sync_trampoline() + +//go:linkname libc_sync libc_sync +//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) { @@ -1146,21 +1605,31 @@ func Truncate(path string, length int64) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + _, _, e1 := syscall(funcPC(libc_truncate_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_truncate_trampoline() + +//go:linkname libc_truncate libc_truncate +//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(funcPC(libc_umask_trampoline), uintptr(newmask), 0, 0) oldmask = int(r0) return } +func libc_umask_trampoline() + +//go:linkname libc_umask libc_umask +//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) { @@ -1169,13 +1638,18 @@ func Unlink(path string) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + _, _, e1 := syscall(funcPC(libc_unlink_trampoline), uintptr(unsafe.Pointer(_p0)), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_unlink_trampoline() + +//go:linkname libc_unlink libc_unlink +//go:cgo_import_dynamic libc_unlink unlink "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1184,13 +1658,18 @@ func Unmount(path string, flags int) (err error) { if err != nil { return } - _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + _, _, e1 := syscall(funcPC(libc_unmount_trampoline), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_unmount_trampoline() + +//go:linkname libc_unmount libc_unmount +//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) { @@ -1200,7 +1679,7 @@ func write(fd int, p []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + r0, _, e1 := syscall(funcPC(libc_write_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(p))) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1208,10 +1687,15 @@ func write(fd int, p []byte) (n int, err error) { return } +func libc_write_trampoline() + +//go:linkname libc_write libc_write +//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 := syscall6X(funcPC(libc_mmap_trampoline), uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -1219,53 +1703,78 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( return } +func libc_mmap_trampoline() + +//go:linkname libc_mmap libc_mmap +//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(funcPC(libc_munmap_trampoline), uintptr(addr), uintptr(length), 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_munmap_trampoline() + +//go:linkname libc_munmap libc_munmap +//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)) - n = int(r0) +func utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall6(funcPC(libc_utimensat_trampoline), uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_utimensat_trampoline() + +//go:linkname libc_utimensat libc_utimensat +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" + // 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)) - n = int(r0) +func directSyscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr) (ret uintptr, err error) { + r0, _, e1 := syscall6X(funcPC(libc_syscall_trampoline), uintptr(trap), uintptr(a1), uintptr(a2), uintptr(a3), uintptr(a4), uintptr(a5)) + ret = uintptr(r0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_syscall_trampoline() + +//go:linkname libc_syscall libc_syscall +//go:cgo_import_dynamic libc_syscall syscall "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(path) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := syscallX(funcPC(libc_lseek_trampoline), uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) if e1 != 0 { err = errnoErr(e1) } return } +func libc_lseek_trampoline() + +//go:linkname libc_lseek libc_lseek +//go:cgo_import_dynamic libc_lseek lseek "libc.so" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getcwd(buf []byte) (n int, err error) { @@ -1275,7 +1784,7 @@ func getcwd(buf []byte) (n int, err error) { } else { _p0 = unsafe.Pointer(&_zero) } - r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + r0, _, e1 := syscall(funcPC(libc_getcwd_trampoline), uintptr(_p0), uintptr(len(buf)), 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -1283,6 +1792,11 @@ func getcwd(buf []byte) (n int, err error) { return } +func libc_getcwd_trampoline() + +//go:linkname libc_getcwd libc_getcwd +//go:cgo_import_dynamic libc_getcwd getcwd "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) { @@ -1292,9 +1806,184 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) } 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 := syscall6(funcPC(libc_sysctl_trampoline), 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 +} + +func libc_sysctl_trampoline() + +//go:linkname libc_sysctl libc_sysctl +//go:cgo_import_dynamic libc_sysctl sysctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fork() (pid int, err error) { + r0, _, e1 := rawSyscall(funcPC(libc_fork_trampoline), 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fork_trampoline() + +//go:linkname libc_fork libc_fork +//go:cgo_import_dynamic libc_fork fork "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req int, arg int) (err error) { + _, _, e1 := rawSyscall(funcPC(libc_ioctl_trampoline), uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_ioctl_trampoline() + +//go:linkname libc_ioctl libc_ioctl +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func execve(path *byte, argv **byte, envp **byte) (err error) { + _, _, e1 := rawSyscall(funcPC(libc_execve_trampoline), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(argv)), uintptr(unsafe.Pointer(envp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_execve_trampoline() + +//go:linkname libc_execve libc_execve +//go:cgo_import_dynamic libc_execve execve "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exit(res int) (err error) { + _, _, e1 := rawSyscall(funcPC(libc_exit_trampoline), uintptr(res), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_exit_trampoline() + +//go:linkname libc_exit libc_exit +//go:cgo_import_dynamic libc_exit exit "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +//go:nosplit +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_ptrace_trampoline() + +//go:linkname libc_ptrace libc_ptrace +//go:cgo_import_dynamic libc_ptrace ptrace "libc.so" + +// 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 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := rawSyscall(funcPC(libc_getentropy_trampoline), uintptr(_p0), uintptr(len(p)), 0) if e1 != 0 { err = errnoErr(e1) } return } + +func libc_getentropy_trampoline() + +//go:linkname libc_getentropy libc_getentropy +//go:cgo_import_dynamic libc_getentropy getentropy "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) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall6(funcPC(libc_fstatat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fstatat_trampoline() + +//go:linkname libc_fstatat libc_fstatat +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) { + r0, _, e1 := syscall(funcPC(libc_fcntl_trampoline), uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(fd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall(funcPC(libc_unlinkat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_unlinkat_trampoline() + +//go:linkname libc_unlinkat libc_unlinkat +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(fd int, path string, flags int, perm uint32) (fdret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := syscall6(funcPC(libc_openat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(perm), 0, 0) + fdret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_openat_trampoline() + +//go:linkname libc_openat libc_openat +//go:cgo_import_dynamic libc_openat openat "libc.so" diff --git a/src/syscall/zsyscall_openbsd_arm64.s b/src/syscall/zsyscall_openbsd_arm64.s new file mode 100644 index 0000000000..37778b1db5 --- /dev/null +++ b/src/syscall/zsyscall_openbsd_arm64.s @@ -0,0 +1,233 @@ +// go run mkasm.go openbsd arm64 +// Code generated by the command above; DO NOT EDIT. +#include "textflag.h" +TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getgroups(SB) +TEXT ·libc_setgroups_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setgroups(SB) +TEXT ·libc_wait4_trampoline(SB),NOSPLIT,$0-0 + JMP libc_wait4(SB) +TEXT ·libc_accept_trampoline(SB),NOSPLIT,$0-0 + JMP libc_accept(SB) +TEXT ·libc_bind_trampoline(SB),NOSPLIT,$0-0 + JMP libc_bind(SB) +TEXT ·libc_connect_trampoline(SB),NOSPLIT,$0-0 + JMP libc_connect(SB) +TEXT ·libc_socket_trampoline(SB),NOSPLIT,$0-0 + JMP libc_socket(SB) +TEXT ·libc_getsockopt_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getsockopt(SB) +TEXT ·libc_setsockopt_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setsockopt(SB) +TEXT ·libc_getpeername_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpeername(SB) +TEXT ·libc_getsockname_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getsockname(SB) +TEXT ·libc_shutdown_trampoline(SB),NOSPLIT,$0-0 + JMP libc_shutdown(SB) +TEXT ·libc_socketpair_trampoline(SB),NOSPLIT,$0-0 + JMP libc_socketpair(SB) +TEXT ·libc_recvfrom_trampoline(SB),NOSPLIT,$0-0 + JMP libc_recvfrom(SB) +TEXT ·libc_sendto_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sendto(SB) +TEXT ·libc_recvmsg_trampoline(SB),NOSPLIT,$0-0 + JMP libc_recvmsg(SB) +TEXT ·libc_sendmsg_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sendmsg(SB) +TEXT ·libc_kevent_trampoline(SB),NOSPLIT,$0-0 + JMP libc_kevent(SB) +TEXT ·libc_utimes_trampoline(SB),NOSPLIT,$0-0 + JMP libc_utimes(SB) +TEXT ·libc_futimes_trampoline(SB),NOSPLIT,$0-0 + JMP libc_futimes(SB) +TEXT ·libc_fcntl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +TEXT ·libc_pipe2_trampoline(SB),NOSPLIT,$0-0 + JMP libc_pipe2(SB) +TEXT ·libc_accept4_trampoline(SB),NOSPLIT,$0-0 + JMP libc_accept4(SB) +TEXT ·libc_getdents_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getdents(SB) +TEXT ·libc_access_trampoline(SB),NOSPLIT,$0-0 + JMP libc_access(SB) +TEXT ·libc_adjtime_trampoline(SB),NOSPLIT,$0-0 + JMP libc_adjtime(SB) +TEXT ·libc_chdir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chdir(SB) +TEXT ·libc_chflags_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chflags(SB) +TEXT ·libc_chmod_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chmod(SB) +TEXT ·libc_chown_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chown(SB) +TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 + JMP libc_chroot(SB) +TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 + JMP libc_close(SB) +TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 + JMP libc_dup(SB) +TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0 + JMP libc_dup2(SB) +TEXT ·libc_fchdir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fchdir(SB) +TEXT ·libc_fchflags_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fchflags(SB) +TEXT ·libc_fchmod_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fchmod(SB) +TEXT ·libc_fchown_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fchown(SB) +TEXT ·libc_flock_trampoline(SB),NOSPLIT,$0-0 + JMP libc_flock(SB) +TEXT ·libc_fpathconf_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fpathconf(SB) +TEXT ·libc_fstat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fstat(SB) +TEXT ·libc_fstatfs_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fstatfs(SB) +TEXT ·libc_fsync_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fsync(SB) +TEXT ·libc_ftruncate_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ftruncate(SB) +TEXT ·libc_getegid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getegid(SB) +TEXT ·libc_geteuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_geteuid(SB) +TEXT ·libc_getgid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getgid(SB) +TEXT ·libc_getpgid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpgid(SB) +TEXT ·libc_getpgrp_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpgrp(SB) +TEXT ·libc_getpid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpid(SB) +TEXT ·libc_getppid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getppid(SB) +TEXT ·libc_getpriority_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getpriority(SB) +TEXT ·libc_getrlimit_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getrlimit(SB) +TEXT ·libc_getrusage_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getrusage(SB) +TEXT ·libc_getsid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getsid(SB) +TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 + JMP libc_gettimeofday(SB) +TEXT ·libc_getuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getuid(SB) +TEXT ·libc_issetugid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_issetugid(SB) +TEXT ·libc_kill_trampoline(SB),NOSPLIT,$0-0 + JMP libc_kill(SB) +TEXT ·libc_kqueue_trampoline(SB),NOSPLIT,$0-0 + JMP libc_kqueue(SB) +TEXT ·libc_lchown_trampoline(SB),NOSPLIT,$0-0 + JMP libc_lchown(SB) +TEXT ·libc_link_trampoline(SB),NOSPLIT,$0-0 + JMP libc_link(SB) +TEXT ·libc_listen_trampoline(SB),NOSPLIT,$0-0 + JMP libc_listen(SB) +TEXT ·libc_lstat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_lstat(SB) +TEXT ·libc_mkdir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_mkdir(SB) +TEXT ·libc_mkfifo_trampoline(SB),NOSPLIT,$0-0 + JMP libc_mkfifo(SB) +TEXT ·libc_mknod_trampoline(SB),NOSPLIT,$0-0 + JMP libc_mknod(SB) +TEXT ·libc_nanosleep_trampoline(SB),NOSPLIT,$0-0 + JMP libc_nanosleep(SB) +TEXT ·libc_open_trampoline(SB),NOSPLIT,$0-0 + JMP libc_open(SB) +TEXT ·libc_pathconf_trampoline(SB),NOSPLIT,$0-0 + JMP libc_pathconf(SB) +TEXT ·libc_pread_trampoline(SB),NOSPLIT,$0-0 + JMP libc_pread(SB) +TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0 + JMP libc_pwrite(SB) +TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0 + JMP libc_read(SB) +TEXT ·libc_readlink_trampoline(SB),NOSPLIT,$0-0 + JMP libc_readlink(SB) +TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0 + JMP libc_rename(SB) +TEXT ·libc_revoke_trampoline(SB),NOSPLIT,$0-0 + JMP libc_revoke(SB) +TEXT ·libc_rmdir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_rmdir(SB) +TEXT ·libc_select_trampoline(SB),NOSPLIT,$0-0 + JMP libc_select(SB) +TEXT ·libc_setegid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setegid(SB) +TEXT ·libc_seteuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_seteuid(SB) +TEXT ·libc_setgid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setgid(SB) +TEXT ·libc_setlogin_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setlogin(SB) +TEXT ·libc_setpgid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setpgid(SB) +TEXT ·libc_setpriority_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setpriority(SB) +TEXT ·libc_setregid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setregid(SB) +TEXT ·libc_setreuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setreuid(SB) +TEXT ·libc_setrlimit_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setrlimit(SB) +TEXT ·libc_setsid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setsid(SB) +TEXT ·libc_settimeofday_trampoline(SB),NOSPLIT,$0-0 + JMP libc_settimeofday(SB) +TEXT ·libc_setuid_trampoline(SB),NOSPLIT,$0-0 + JMP libc_setuid(SB) +TEXT ·libc_stat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_stat(SB) +TEXT ·libc_statfs_trampoline(SB),NOSPLIT,$0-0 + JMP libc_statfs(SB) +TEXT ·libc_symlink_trampoline(SB),NOSPLIT,$0-0 + JMP libc_symlink(SB) +TEXT ·libc_sync_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sync(SB) +TEXT ·libc_truncate_trampoline(SB),NOSPLIT,$0-0 + JMP libc_truncate(SB) +TEXT ·libc_umask_trampoline(SB),NOSPLIT,$0-0 + JMP libc_umask(SB) +TEXT ·libc_unlink_trampoline(SB),NOSPLIT,$0-0 + JMP libc_unlink(SB) +TEXT ·libc_unmount_trampoline(SB),NOSPLIT,$0-0 + JMP libc_unmount(SB) +TEXT ·libc_write_trampoline(SB),NOSPLIT,$0-0 + JMP libc_write(SB) +TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 + JMP libc_mmap(SB) +TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 + JMP libc_munmap(SB) +TEXT ·libc_utimensat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_utimensat(SB) +TEXT ·libc_syscall_trampoline(SB),NOSPLIT,$0-0 + JMP libc_syscall(SB) +TEXT ·libc_lseek_trampoline(SB),NOSPLIT,$0-0 + JMP libc_lseek(SB) +TEXT ·libc_getcwd_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getcwd(SB) +TEXT ·libc_sysctl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_sysctl(SB) +TEXT ·libc_fork_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fork(SB) +TEXT ·libc_ioctl_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ioctl(SB) +TEXT ·libc_execve_trampoline(SB),NOSPLIT,$0-0 + JMP libc_execve(SB) +TEXT ·libc_exit_trampoline(SB),NOSPLIT,$0-0 + JMP libc_exit(SB) +TEXT ·libc_ptrace_trampoline(SB),NOSPLIT,$0-0 + JMP libc_ptrace(SB) +TEXT ·libc_getentropy_trampoline(SB),NOSPLIT,$0-0 + JMP libc_getentropy(SB) +TEXT ·libc_fstatat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fstatat(SB) +TEXT ·libc_unlinkat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_unlinkat(SB) +TEXT ·libc_openat_trampoline(SB),NOSPLIT,$0-0 + JMP libc_openat(SB) -- GitLab From 4b068cafb5a5e094dd0b7ed37ff73e08309a39e7 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 27 Jan 2021 13:54:10 -0800 Subject: [PATCH 1717/1792] doc/go1.16: document go/build/constraint package For #40700 For #41184 Fixes #43957 Change-Id: Ia346f4cf160431b721efeba7dc5f1fb8814efd95 Reviewed-on: https://go-review.googlesource.com/c/go/+/287472 Trust: Ian Lance Taylor Reviewed-by: Russ Cox Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 3a45940479..6cc75b4865 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -762,6 +762,25 @@ func TestFoo(t *testing.T) { +
    go/build/constraint
    +
    +

    + The new + go/build/constraint + package parses build constraint lines, both the original + // +build syntax and the //go:build + syntax that will be introduced in Go 1.17. + This package exists so that tools built with Go 1.16 will be able + to process Go 1.17 source code. + See https://golang.org/design/draft-gobuild + for details about the build constraint syntaxes and the planned + transition to the //go:build syntax. + Note that //go:build lines are not supported + in Go 1.16 and should not be introduced into Go programs yet. +

    +
    +
    +
    html/template

    -- GitLab From 725a642c2d0b42e2b4435dfbfbff6b138d37d2ce Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Wed, 27 Jan 2021 23:09:57 +1100 Subject: [PATCH 1718/1792] runtime: correct syscall10/syscall10X on openbsd/amd64 The syscall10/syscall10X implementation uses an incorrect stack offset for arguments a7 to a10. Correct this so that the syscall arguments work as intended. Updates #36435 Fixes #43927 Change-Id: Ia7ae6cc8c89f50acfd951c0f271f3b3309934499 Reviewed-on: https://go-review.googlesource.com/c/go/+/287252 Trust: Joel Sing Reviewed-by: Cherry Zhang --- src/runtime/sys_openbsd_amd64.s | 36 ++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/runtime/sys_openbsd_amd64.s b/src/runtime/sys_openbsd_amd64.s index 534645eec4..b3a76b57a3 100644 --- a/src/runtime/sys_openbsd_amd64.s +++ b/src/runtime/sys_openbsd_amd64.s @@ -676,27 +676,31 @@ TEXT runtime·syscall10(SB),NOSPLIT,$0 PUSHQ BP MOVQ SP, BP SUBQ $48, SP + + // 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). MOVQ (7*8)(DI), R10 // a7 MOVQ (8*8)(DI), R11 // a8 MOVQ (9*8)(DI), R12 // a9 MOVQ (10*8)(DI), R13 // a10 - MOVQ R10, (1*8)(SP) // a7 - MOVQ R11, (2*8)(SP) // a8 - MOVQ R12, (3*8)(SP) // a9 - MOVQ R13, (4*8)(SP) // a10 + MOVQ R10, (0*8)(SP) // a7 + MOVQ R11, (1*8)(SP) // a8 + MOVQ R12, (2*8)(SP) // a9 + MOVQ R13, (3*8)(SP) // a10 MOVQ (0*8)(DI), R11 // fn MOVQ (2*8)(DI), SI // a2 MOVQ (3*8)(DI), DX // a3 MOVQ (4*8)(DI), CX // a4 MOVQ (5*8)(DI), R8 // a5 MOVQ (6*8)(DI), R9 // a6 - MOVQ DI, (SP) + MOVQ DI, (4*8)(SP) MOVQ (1*8)(DI), DI // a1 XORL AX, AX // vararg: say "no float args" CALL R11 - MOVQ (SP), DI + MOVQ (4*8)(SP), DI MOVQ AX, (11*8)(DI) // r1 MOVQ DX, (12*8)(DI) // r2 @@ -705,7 +709,7 @@ TEXT runtime·syscall10(SB),NOSPLIT,$0 CALL libc_errno(SB) MOVLQSX (AX), AX - MOVQ (SP), DI + MOVQ (4*8)(SP), DI MOVQ AX, (13*8)(DI) // err ok: @@ -741,27 +745,31 @@ TEXT runtime·syscall10X(SB),NOSPLIT,$0 PUSHQ BP MOVQ SP, BP SUBQ $48, SP + + // 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). MOVQ (7*8)(DI), R10 // a7 MOVQ (8*8)(DI), R11 // a8 MOVQ (9*8)(DI), R12 // a9 MOVQ (10*8)(DI), R13 // a10 - MOVQ R10, (1*8)(SP) // a7 - MOVQ R11, (2*8)(SP) // a8 - MOVQ R12, (3*8)(SP) // a9 - MOVQ R13, (4*8)(SP) // a10 + MOVQ R10, (0*8)(SP) // a7 + MOVQ R11, (1*8)(SP) // a8 + MOVQ R12, (2*8)(SP) // a9 + MOVQ R13, (3*8)(SP) // a10 MOVQ (0*8)(DI), R11 // fn MOVQ (2*8)(DI), SI // a2 MOVQ (3*8)(DI), DX // a3 MOVQ (4*8)(DI), CX // a4 MOVQ (5*8)(DI), R8 // a5 MOVQ (6*8)(DI), R9 // a6 - MOVQ DI, (SP) + MOVQ DI, (4*8)(SP) MOVQ (1*8)(DI), DI // a1 XORL AX, AX // vararg: say "no float args" CALL R11 - MOVQ (SP), DI + MOVQ (4*8)(SP), DI MOVQ AX, (11*8)(DI) // r1 MOVQ DX, (12*8)(DI) // r2 @@ -770,7 +778,7 @@ TEXT runtime·syscall10X(SB),NOSPLIT,$0 CALL libc_errno(SB) MOVLQSX (AX), AX - MOVQ (SP), DI + MOVQ (4*8)(SP), DI MOVQ AX, (13*8)(DI) // err ok: -- GitLab From 41bb49b878ce4dd24c0055aaf734577d3fb37d50 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 28 Jan 2021 11:14:23 -0500 Subject: [PATCH 1719/1792] cmd/go: revert TestScript/build_trimpath to use ioutil.ReadFile This call was changed to os.ReadFile in CL 266365, but the test also builds that source file using gccgo if present, and released versions of gccgo do not yet support ioutil.ReadFile. Manually tested with gccgo gccgo 10.2.1 (see #35786). Fixes #43974. Updates #42026. Change-Id: Ic4ca0848d3ca324e2ab10fd14ad867f21e0898e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/287613 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod TryBot-Result: Go Bot --- src/cmd/go/testdata/script/build_trimpath.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/testdata/script/build_trimpath.txt b/src/cmd/go/testdata/script/build_trimpath.txt index e1ea0a48b2..2c3bee8fdc 100644 --- a/src/cmd/go/testdata/script/build_trimpath.txt +++ b/src/cmd/go/testdata/script/build_trimpath.txt @@ -121,6 +121,7 @@ package main import ( "bytes" "fmt" + "io/ioutil" "log" "os" "os/exec" @@ -130,7 +131,7 @@ import ( func main() { exe := os.Args[1] - data, err := os.ReadFile(exe) + data, err := ioutil.ReadFile(exe) if err != nil { log.Fatal(err) } -- GitLab From c8bd8010ff7c0115bf186443119216ba51f09d2b Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Thu, 28 Jan 2021 19:19:47 +1100 Subject: [PATCH 1720/1792] syscall: generate readlen/writelen for openbsd libc Rather than hand rolling readlen and writelen, move it to being generated via mksyscall.pl, as is done for most other functions. Updates #36435 Change-Id: I649aed7b182b41c8639686feae25ce19dab812c3 Reviewed-on: https://go-review.googlesource.com/c/go/+/287532 Trust: Joel Sing Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot --- src/syscall/syscall_openbsd_libc.go | 28 ++++++--------------------- src/syscall/zsyscall_openbsd_amd64.go | 22 +++++++++++++++++++++ src/syscall/zsyscall_openbsd_arm64.go | 22 +++++++++++++++++++++ 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/src/syscall/syscall_openbsd_libc.go b/src/syscall/syscall_openbsd_libc.go index 2fcc2011bc..042615bf2a 100644 --- a/src/syscall/syscall_openbsd_libc.go +++ b/src/syscall/syscall_openbsd_libc.go @@ -8,6 +8,10 @@ package syscall import "unsafe" +func init() { + execveOpenBSD = execve +} + //sys directSyscall(trap uintptr, a1 uintptr, a2 uintptr, a3 uintptr, a4 uintptr, a5 uintptr) (ret uintptr, err error) = SYS_syscall func syscallInternal(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) { @@ -56,6 +60,8 @@ func funcPC(f func()) uintptr { return **(**uintptr)(unsafe.Pointer(&f)) } +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_read +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_write //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_lseek //sys getcwd(buf []byte) (n int, err error) //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) @@ -69,25 +75,3 @@ func funcPC(f func()) uintptr { //sys fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) = SYS_fcntl //sys unlinkat(fd int, path string, flags int) (err error) //sys openat(fd int, path string, flags int, perm uint32) (fdret int, err error) - -func init() { - execveOpenBSD = execve -} - -func readlen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall(funcPC(libc_read_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func writelen(fd int, buf *byte, nbuf int) (n int, err error) { - r0, _, e1 := syscall(funcPC(libc_write_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} diff --git a/src/syscall/zsyscall_openbsd_amd64.go b/src/syscall/zsyscall_openbsd_amd64.go index 67dc0d3733..733050ad1d 100644 --- a/src/syscall/zsyscall_openbsd_amd64.go +++ b/src/syscall/zsyscall_openbsd_amd64.go @@ -1761,6 +1761,28 @@ func libc_syscall_trampoline() // 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(funcPC(libc_read_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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(funcPC(libc_write_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + 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) (newoffset int64, err error) { r0, _, e1 := syscallX(funcPC(libc_lseek_trampoline), uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) diff --git a/src/syscall/zsyscall_openbsd_arm64.go b/src/syscall/zsyscall_openbsd_arm64.go index 90a46f3c4b..2093eb74e5 100644 --- a/src/syscall/zsyscall_openbsd_arm64.go +++ b/src/syscall/zsyscall_openbsd_arm64.go @@ -1761,6 +1761,28 @@ func libc_syscall_trampoline() // 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(funcPC(libc_read_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// 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(funcPC(libc_write_trampoline), uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + 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) (newoffset int64, err error) { r0, _, e1 := syscallX(funcPC(libc_lseek_trampoline), uintptr(fd), uintptr(offset), uintptr(whence)) newoffset = int64(r0) -- GitLab From 68058edc39edae96e34225ca163002233b623c97 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 28 Jan 2021 14:57:55 -0500 Subject: [PATCH 1721/1792] runtime: document pointer write atomicity for memclrNoHeapPointers memclrNoHeapPointers is the underlying implementation of typedmemclr and memclrHasPointers, so it still needs to write pointer-aligned words atomically. Document this requirement. Updates #41428. Change-Id: Ice00dee5de7a96a50e51ff019fcef069e8a8406a Reviewed-on: https://go-review.googlesource.com/c/go/+/287692 Trust: Cherry Zhang Reviewed-by: Keith Randall --- src/runtime/memclr_386.s | 2 ++ src/runtime/memclr_amd64.s | 2 ++ src/runtime/memclr_arm.s | 2 ++ src/runtime/memclr_arm64.s | 2 ++ src/runtime/memclr_mips64x.s | 2 ++ src/runtime/memclr_mipsx.s | 2 ++ src/runtime/memclr_plan9_386.s | 2 ++ src/runtime/memclr_plan9_amd64.s | 2 ++ src/runtime/memclr_ppc64x.s | 2 ++ src/runtime/memclr_riscv64.s | 2 ++ src/runtime/memclr_s390x.s | 2 ++ src/runtime/memclr_wasm.s | 2 ++ src/runtime/stubs.go | 8 ++++++++ 13 files changed, 32 insertions(+) diff --git a/src/runtime/memclr_386.s b/src/runtime/memclr_386.s index 65f7196312..5e090ef09e 100644 --- a/src/runtime/memclr_386.s +++ b/src/runtime/memclr_386.s @@ -9,6 +9,8 @@ // NOTE: Windows externalthreadhandler expects memclr to preserve DX. +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB), NOSPLIT, $0-8 MOVL ptr+0(FP), DI diff --git a/src/runtime/memclr_amd64.s b/src/runtime/memclr_amd64.s index d79078fd00..37fe9745b1 100644 --- a/src/runtime/memclr_amd64.s +++ b/src/runtime/memclr_amd64.s @@ -9,6 +9,8 @@ // NOTE: Windows externalthreadhandler expects memclr to preserve DX. +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB), NOSPLIT, $0-16 MOVQ ptr+0(FP), DI diff --git a/src/runtime/memclr_arm.s b/src/runtime/memclr_arm.s index 7326b8be34..f113a1aa2d 100644 --- a/src/runtime/memclr_arm.s +++ b/src/runtime/memclr_arm.s @@ -30,6 +30,8 @@ #define N R12 #define TMP R12 /* N and TMP don't overlap */ +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-8 MOVW ptr+0(FP), TO diff --git a/src/runtime/memclr_arm64.s b/src/runtime/memclr_arm64.s index a56a6dfb85..bef77651e4 100644 --- a/src/runtime/memclr_arm64.s +++ b/src/runtime/memclr_arm64.s @@ -4,6 +4,8 @@ #include "textflag.h" +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16 MOVD ptr+0(FP), R0 diff --git a/src/runtime/memclr_mips64x.s b/src/runtime/memclr_mips64x.s index 4c2292eae8..d7a3251e20 100644 --- a/src/runtime/memclr_mips64x.s +++ b/src/runtime/memclr_mips64x.s @@ -7,6 +7,8 @@ #include "go_asm.h" #include "textflag.h" +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16 MOVV ptr+0(FP), R1 diff --git a/src/runtime/memclr_mipsx.s b/src/runtime/memclr_mipsx.s index 1561a23dbe..eb2a8a7219 100644 --- a/src/runtime/memclr_mipsx.s +++ b/src/runtime/memclr_mipsx.s @@ -14,6 +14,8 @@ #define MOVWLO MOVWL #endif +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-8 MOVW n+4(FP), R2 diff --git a/src/runtime/memclr_plan9_386.s b/src/runtime/memclr_plan9_386.s index 5b880ae86f..54701a9453 100644 --- a/src/runtime/memclr_plan9_386.s +++ b/src/runtime/memclr_plan9_386.s @@ -4,6 +4,8 @@ #include "textflag.h" +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB), NOSPLIT, $0-8 MOVL ptr+0(FP), DI diff --git a/src/runtime/memclr_plan9_amd64.s b/src/runtime/memclr_plan9_amd64.s index ad383cd6b3..8c6a1cc780 100644 --- a/src/runtime/memclr_plan9_amd64.s +++ b/src/runtime/memclr_plan9_amd64.s @@ -4,6 +4,8 @@ #include "textflag.h" +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16 MOVQ ptr+0(FP), DI diff --git a/src/runtime/memclr_ppc64x.s b/src/runtime/memclr_ppc64x.s index 072963f756..7512620894 100644 --- a/src/runtime/memclr_ppc64x.s +++ b/src/runtime/memclr_ppc64x.s @@ -6,6 +6,8 @@ #include "textflag.h" +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB), NOSPLIT|NOFRAME, $0-16 MOVD ptr+0(FP), R3 diff --git a/src/runtime/memclr_riscv64.s b/src/runtime/memclr_riscv64.s index ba7704e805..54ddaa4560 100644 --- a/src/runtime/memclr_riscv64.s +++ b/src/runtime/memclr_riscv64.s @@ -4,6 +4,8 @@ #include "textflag.h" +// See memclrNoHeapPointers Go doc for important implementation constraints. + // void runtime·memclrNoHeapPointers(void*, uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT,$0-16 MOV ptr+0(FP), T1 diff --git a/src/runtime/memclr_s390x.s b/src/runtime/memclr_s390x.s index dd14a441cc..fa657ef66e 100644 --- a/src/runtime/memclr_s390x.s +++ b/src/runtime/memclr_s390x.s @@ -4,6 +4,8 @@ #include "textflag.h" +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB),NOSPLIT|NOFRAME,$0-16 MOVD ptr+0(FP), R4 diff --git a/src/runtime/memclr_wasm.s b/src/runtime/memclr_wasm.s index 68ffe2f67b..5a053049f8 100644 --- a/src/runtime/memclr_wasm.s +++ b/src/runtime/memclr_wasm.s @@ -4,6 +4,8 @@ #include "textflag.h" +// See memclrNoHeapPointers Go doc for important implementation constraints. + // func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) TEXT runtime·memclrNoHeapPointers(SB), NOSPLIT, $0-16 MOVD ptr+0(FP), R0 diff --git a/src/runtime/stubs.go b/src/runtime/stubs.go index b55c3c0590..2ee2c74dfe 100644 --- a/src/runtime/stubs.go +++ b/src/runtime/stubs.go @@ -73,7 +73,15 @@ func badsystemstack() { // *ptr is uninitialized memory (e.g., memory that's being reused // for a new allocation) and hence contains only "junk". // +// memclrNoHeapPointers ensures that if ptr is pointer-aligned, and n +// is a multiple of the pointer size, then any pointer-aligned, +// pointer-sized portion is cleared atomically. Despite the function +// name, this is necessary because this function is the underlying +// implementation of typedmemclr and memclrHasPointers. See the doc of +// memmove for more details. +// // The (CPU-specific) implementations of this function are in memclr_*.s. +// //go:noescape func memclrNoHeapPointers(ptr unsafe.Pointer, n uintptr) -- GitLab From 44361140c02556a0a71bc52299149bb8de26024b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 29 Jan 2021 10:25:34 -0800 Subject: [PATCH 1722/1792] embed: update docs for proposal tweaks //go:embed variables can be type aliases. //go:embed variables can't be local to a function. For #43216 For #43602 Fixes #43978 Change-Id: Ib1d104dfa32b97c91d8bfc5ed5d461ca14da188f Reviewed-on: https://go-review.googlesource.com/c/go/+/288072 Trust: Ian Lance Taylor Reviewed-by: Russ Cox --- src/embed/embed.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/embed/embed.go b/src/embed/embed.go index cc6855e6a5..f12bf31e76 100644 --- a/src/embed/embed.go +++ b/src/embed/embed.go @@ -9,18 +9,28 @@ // files read from the package directory or subdirectories at compile time. // // For example, here are three ways to embed a file named hello.txt -// and then print its contents at run time: +// and then print its contents at run time. // -// import "embed" +// Embedding one file into a string: +// +// import _ "embed" // // //go:embed hello.txt // var s string // print(s) // +// Embedding one file into a slice of bytes: +// +// import _ "embed" +// // //go:embed hello.txt // var b []byte // print(string(b)) // +// Embedded one or more files into a file system: +// +// import "embed" +// // //go:embed hello.txt // var f embed.FS // data, _ := f.ReadFile("hello.txt") @@ -34,8 +44,8 @@ // The directive must immediately precede a line containing the declaration of a single variable. // Only blank lines and ‘//’ line comments are permitted between the directive and the declaration. // -// The variable must be of type string, []byte, or FS exactly. Named types or type aliases -// derived from those types are not allowed. +// The type of the variable must be a string type, or a slice of a byte type, +// or FS (or an alias of FS). // // For example: // @@ -70,8 +80,8 @@ // // The //go:embed directive can be used with both exported and unexported variables, // depending on whether the package wants to make the data available to other packages. -// Similarly, it can be used with both global and function-local variables, -// depending on what is more convenient in context. +// It can only be used with global variables at package scope, +// not with local variables. // // Patterns must not match files outside the package's module, such as ‘.git/*’ or symbolic links. // Matches for empty directories are ignored. After that, each pattern in a //go:embed line -- GitLab From 6ac91e460c294bda5a50e628b7556bf20525fa44 Mon Sep 17 00:00:00 2001 From: Toshihiro Shiino Date: Sun, 31 Jan 2021 12:42:44 +0000 Subject: [PATCH 1723/1792] doc/go1.16: minor markup fixes Add missing tags. Remove unnecessary
    tag. For #40700 Change-Id: I03d3ce1c89a9ae3d3195dcd2bb8b1a61f011e1ed Reviewed-on: https://go-review.googlesource.com/c/go/+/288275 Reviewed-by: Dmitri Shuralyov Reviewed-by: Ian Lance Taylor Reviewed-by: Alberto Donizetti --- doc/go1.16.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 6cc75b4865..fc01a5f509 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -146,7 +146,7 @@ Do not send CLs removing the interior tags from such phrases. retract directives may now be used in a go.mod file to indicate that certain published versions of the module should not be used by other modules. A module author may retract a version after a severe problem - is discovered or if the version was published unintentionally.
    + is discovered or if the version was published unintentionally.

    @@ -899,7 +899,7 @@ func TestFoo(t *testing.T) {

    - The Client now sends + The Client now sends an explicit Content-Length: 0 header in PATCH requests with empty bodies, matching the existing behavior of POST and PUT. @@ -946,7 +946,7 @@ func TestFoo(t *testing.T) {

    net/smtp

    - The Client's + The Client's Mail method now sends the SMTPUTF8 directive to servers that support it, signaling that addresses are encoded in UTF-8. -- GitLab From 26e29aa15a189b26d3b2400a594d329368e78e79 Mon Sep 17 00:00:00 2001 From: Nehal J Wani Date: Tue, 26 Jan 2021 16:29:05 +0000 Subject: [PATCH 1724/1792] cmd/link: disable TestPIESize if CGO isn't enabled With CGO disabled, the test throws the following error: elf_test.go:291: # command-line-arguments loadinternal: cannot find runtime/cgo Change-Id: Iaeb183562ab637c714240b49e73078bdb791b35b GitHub-Last-Rev: f8fe9afad5611411966413d17cb5874f7b0018a0 GitHub-Pull-Request: golang/go#43911 Reviewed-on: https://go-review.googlesource.com/c/go/+/286632 Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Reviewed-by: Cherry Zhang Trust: Matthew Dempsky --- src/cmd/link/elf_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cmd/link/elf_test.go b/src/cmd/link/elf_test.go index 334f050e88..20754d09f5 100644 --- a/src/cmd/link/elf_test.go +++ b/src/cmd/link/elf_test.go @@ -226,6 +226,12 @@ func main() { func TestPIESize(t *testing.T) { testenv.MustHaveGoBuild(t) + + // We don't want to test -linkmode=external if cgo is not supported. + // On some systems -buildmode=pie implies -linkmode=external, so just + // always skip the test if cgo is not supported. + testenv.MustHaveCGO(t) + if !sys.BuildModeSupported(runtime.Compiler, "pie", runtime.GOOS, runtime.GOARCH) { t.Skip("-buildmode=pie not supported") } -- GitLab From 0b6cfea6342a7d95f74bc9e273039236ebd7e64f Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 28 Jan 2021 12:19:49 -0500 Subject: [PATCH 1725/1792] doc/go1.16: document that on OpenBSD syscalls are now made through libc Updates #36435, #40700. Change-Id: I1e2ded111ad58066cc9f2c9d00e719497b0f34d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/287634 Trust: Cherry Zhang Reviewed-by: Joel Sing --- doc/go1.16.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index fc01a5f509..8d31f63fa2 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -80,6 +80,16 @@ Do not send CLs removing the interior tags from such phrases. support cgo.

    +

    + On the 64-bit x86 and 64-bit ARM architectures on OpenBSD (the + openbsd/amd64 and openbsd/arm64 ports), system + calls are now made through libc, instead of directly using + the SYSCALL/SVC instruction. This ensures + forward-compatibility with future versions of OpenBSD. In particular, + OpenBSD 6.9 onwards will require system calls to be made through + libc for non-static Go binaries. +

    +

    386

    -- GitLab From 32e789f4fb45b6296b9283ab80e126287eab4db5 Mon Sep 17 00:00:00 2001 From: Tom Thorogood Date: Mon, 1 Feb 2021 13:32:18 +1030 Subject: [PATCH 1726/1792] test: fix incorrectly laid out instructions in issue11656.go CL 279423 introduced a regression in this test as it incorrectly laid out various instructions. In the case of arm, the second instruction was overwriting the first. In the case of 386, amd64 and s390x, the instructions were being appended to the end of the slice after 64 zero bytes. This was causing test failures on "linux/s390x on z13". Fixes #44028 Change-Id: Id136212dabdae27db7e91904b0df6a3a9d2f4af4 Reviewed-on: https://go-review.googlesource.com/c/go/+/288278 Run-TryBot: Ian Lance Taylor Reviewed-by: Keith Randall Reviewed-by: Cherry Zhang --- test/fixedbugs/issue11656.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/fixedbugs/issue11656.go b/test/fixedbugs/issue11656.go index acd3f4f3e5..85fe720b30 100644 --- a/test/fixedbugs/issue11656.go +++ b/test/fixedbugs/issue11656.go @@ -59,10 +59,10 @@ func f(n int) { ill := make([]byte, 64) switch runtime.GOARCH { case "386", "amd64": - ill = append(ill, 0x89, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00) // MOVL AX, 0 + ill = append(ill[:0], 0x89, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00) // MOVL AX, 0 case "arm": - binary.LittleEndian.PutUint32(ill, 0xe3a00000) // MOVW $0, R0 - binary.LittleEndian.PutUint32(ill, 0xe5800000) // MOVW R0, (R0) + binary.LittleEndian.PutUint32(ill[0:4], 0xe3a00000) // MOVW $0, R0 + binary.LittleEndian.PutUint32(ill[4:8], 0xe5800000) // MOVW R0, (R0) case "arm64": binary.LittleEndian.PutUint32(ill, 0xf90003ff) // MOVD ZR, (ZR) case "ppc64": @@ -74,7 +74,7 @@ func f(n int) { case "mipsle", "mips64le": binary.LittleEndian.PutUint32(ill, 0xfc000000) // MOVV R0, (R0) case "s390x": - ill = append(ill, 0xa7, 0x09, 0x00, 0x00) // MOVD $0, R0 + ill = append(ill[:0], 0xa7, 0x09, 0x00, 0x00) // MOVD $0, R0 ill = append(ill, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x24) // MOVD R0, (R0) case "riscv64": binary.LittleEndian.PutUint32(ill, 0x00003023) // MOV X0, (X0) -- GitLab From 1426a571b79bfcb3c0339e2fd96c893cd1549af6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 1 Feb 2021 16:46:49 -0500 Subject: [PATCH 1727/1792] cmd/link: fix off-by-1 error in findShlibSection We want to find a section that contains addr. sect.Addr+sect.Size is the exclusive upper bound. Change-Id: If2cd6bdd6e03174680e066189b0f4bf9e2ba6630 Reviewed-on: https://go-review.googlesource.com/c/go/+/288592 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/decodesym.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/decodesym.go b/src/cmd/link/internal/ld/decodesym.go index c6e2d8ca7f..fc179fc6e4 100644 --- a/src/cmd/link/internal/ld/decodesym.go +++ b/src/cmd/link/internal/ld/decodesym.go @@ -279,7 +279,7 @@ func findShlibSection(ctxt *Link, path string, addr uint64) *elf.Section { for _, shlib := range ctxt.Shlibs { if shlib.Path == path { for _, sect := range shlib.File.Sections[1:] { // skip the NULL section - if sect.Addr <= addr && addr <= sect.Addr+sect.Size { + if sect.Addr <= addr && addr < sect.Addr+sect.Size { return sect } } -- GitLab From 98f8454a73b569d81d1c5e167d7b68f22e2e3fea Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Mon, 1 Feb 2021 13:36:50 -0500 Subject: [PATCH 1728/1792] cmd/link: don't decode type symbol in shared library in deadcode In the linker's deadcode pass we decode type symbols for interface satisfaction analysis. When linking against Go shared libraries, the type symbol may come from a shared library, so it doesn't have data in the current module being linked, so we cannot decode it. We already have code to skip DYNIMPORT symbols. However, this doesn't actually work, because at that point the type symbols' names haven't been mangled, whereas they may be mangled in the shared library. So the symbol definition (in shared library) and reference (in current module) haven't been connected. Skip decoding type symbols of type Sxxx (along with DYNIMPORT) when linkShared. Note: we cannot skip all type symbols, as we still need to mark unexported methods defined in the current module. Fixes #44031. Change-Id: I833d19a060c94edbd6fc448172358f9a7d760657 Reviewed-on: https://go-review.googlesource.com/c/go/+/288496 Trust: Cherry Zhang Trust: Than McIntosh Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh --- misc/cgo/testshared/shared_test.go | 8 ++++++++ .../cgo/testshared/testdata/issue44031/a/a.go | 9 +++++++++ .../cgo/testshared/testdata/issue44031/b/b.go | 17 ++++++++++++++++ .../testdata/issue44031/main/main.go | 20 +++++++++++++++++++ src/cmd/link/internal/ld/deadcode.go | 16 +++++++++------ 5 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 misc/cgo/testshared/testdata/issue44031/a/a.go create mode 100644 misc/cgo/testshared/testdata/issue44031/b/b.go create mode 100644 misc/cgo/testshared/testdata/issue44031/main/main.go diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go index 5e0893784b..f52391c6f6 100644 --- a/misc/cgo/testshared/shared_test.go +++ b/misc/cgo/testshared/shared_test.go @@ -1063,3 +1063,11 @@ func TestGCData(t *testing.T) { 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") +} diff --git a/misc/cgo/testshared/testdata/issue44031/a/a.go b/misc/cgo/testshared/testdata/issue44031/a/a.go new file mode 100644 index 0000000000..48827e682f --- /dev/null +++ b/misc/cgo/testshared/testdata/issue44031/a/a.go @@ -0,0 +1,9 @@ +// 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 a + +type ATypeWithALoooooongName interface { // a long name, so the type descriptor symbol name is mangled + M() +} diff --git a/misc/cgo/testshared/testdata/issue44031/b/b.go b/misc/cgo/testshared/testdata/issue44031/b/b.go new file mode 100644 index 0000000000..ad3ebec2b9 --- /dev/null +++ b/misc/cgo/testshared/testdata/issue44031/b/b.go @@ -0,0 +1,17 @@ +// 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 b + +import "testshared/issue44031/a" + +type T int + +func (T) M() {} + +var i = a.ATypeWithALoooooongName(T(0)) + +func F() { + i.M() +} diff --git a/misc/cgo/testshared/testdata/issue44031/main/main.go b/misc/cgo/testshared/testdata/issue44031/main/main.go new file mode 100644 index 0000000000..47f2e3a98e --- /dev/null +++ b/misc/cgo/testshared/testdata/issue44031/main/main.go @@ -0,0 +1,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. + +package main + +import "testshared/issue44031/b" + +type t int + +func (t) m() {} + +type i interface{ m() } // test that unexported method is correctly marked + +var v interface{} = t(0) + +func main() { + b.F() + v.(i).m() +} diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index d8813fa936..245076a83a 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -165,13 +165,17 @@ func (d *deadcodePass) flood() { // R_USEIFACEMETHOD is a marker relocation that marks an interface // method as used. rs := r.Sym() - if d.ldr.SymType(rs) != sym.SDYNIMPORT { // don't decode DYNIMPORT symbol (we'll mark all exported methods anyway) - m := d.decodeIfaceMethod(d.ldr, d.ctxt.Arch, rs, r.Add()) - if d.ctxt.Debugvlog > 1 { - d.ctxt.Logf("reached iface method: %v\n", m) - } - d.ifaceMethod[m] = true + if d.ctxt.linkShared && (d.ldr.SymType(rs) == sym.SDYNIMPORT || d.ldr.SymType(rs) == sym.Sxxx) { + // Don't decode symbol from shared library (we'll mark all exported methods anyway). + // We check for both SDYNIMPORT and Sxxx because name-mangled symbols haven't + // been resolved at this point. + continue + } + m := d.decodeIfaceMethod(d.ldr, d.ctxt.Arch, rs, r.Add()) + if d.ctxt.Debugvlog > 1 { + d.ctxt.Logf("reached iface method: %v\n", m) } + d.ifaceMethod[m] = true continue } rs := r.Sym() -- GitLab From fca94ab3ab113ceddb7934f76d0f1660cad98260 Mon Sep 17 00:00:00 2001 From: task4233 Date: Tue, 2 Feb 2021 03:54:24 +0000 Subject: [PATCH 1729/1792] spec: improve the example in Type assertions section The example, var v, ok T1 = x.(T), can be interpreted as type T1 interface{} or type T = bool; type T1 = T. Separating the example would help understanding for readers. Change-Id: I179f4564e67f4d503815d29307df2cebb50c82f9 GitHub-Last-Rev: b34fffb6bb07cb2883bc313ef3bc9980b3dd4abe GitHub-Pull-Request: golang/go#44040 Reviewed-on: https://go-review.googlesource.com/c/go/+/288472 Reviewed-by: Robert Griesemer Reviewed-by: Rob Pike Reviewed-by: Ian Lance Taylor Trust: Robert Griesemer --- doc/go_spec.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/go_spec.html b/doc/go_spec.html index 676407f6f2..c9e14a3fec 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -3400,7 +3400,7 @@ A type assertion used in an assignment or initializat v, ok = x.(T) v, ok := x.(T) var v, ok = x.(T) -var v, ok T1 = x.(T) +var v, ok interface{} = x.(T) // dynamic types of v and ok are T and bool

    -- GitLab From e491c6eea9ad599a0ae766a3217bd9a16ca3a25a Mon Sep 17 00:00:00 2001 From: Katie Hockman Date: Wed, 27 Jan 2021 10:33:35 -0500 Subject: [PATCH 1730/1792] math/big: fix comment in divRecursiveStep There appears to be a typo in the description of the recursive division algorithm. Two things seem suspicious with the original comment: 1. It is talking about choosing s, but s doesn't appear anywhere in the equation. 2. The math in the equation is incorrect. Where B = len(v)/2 s = B - 1 Proof that it is incorrect: len(v) - B >= B + 1 len(v) - len(v)/2 >= len(v)/2 + 1 This doesn't hold if len(v) is even, e.g. 10: 10 - 10/2 >= 10/2 + 1 10 - 5 >= 5 + 1 5 >= 6 // this is false The new equation will be the following, which will be mathematically correct: len(v) - s >= B + 1 len(v) - (len(v)/2 - 1) >= len(v)/2 + 1 len(v) - len(v)/2 + 1 >= len(v)/2 + 1 len(v) - len(v)/2 >= len(v)/2 This holds if len(v) is even or odd. e.g. 10 10 - 10/2 >= 10/2 10 - 5 >= 5 5 >= 5 e.g. 11 11 - 11/2 >= 11/2 11 - 5 >= 5 6 >= 5 Change-Id: If77ce09286cf7038637b5dfd0fb7d4f828023f56 Reviewed-on: https://go-review.googlesource.com/c/go/+/287372 Run-TryBot: Katie Hockman Reviewed-by: Filippo Valsorda Trust: Katie Hockman --- src/math/big/nat.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/math/big/nat.go b/src/math/big/nat.go index 068176e1c1..bbd6c8850b 100644 --- a/src/math/big/nat.go +++ b/src/math/big/nat.go @@ -881,7 +881,7 @@ func (z nat) divRecursiveStep(u, v nat, depth int, tmp *nat, temps []*nat) { // then floor(u1/v1) >= floor(u/v) // // Moreover, the difference is at most 2 if len(v1) >= len(u/v) - // We choose s = B-1 since len(v)-B >= B+1 >= len(u/v) + // We choose s = B-1 since len(v)-s >= B+1 >= len(u/v) s := (B - 1) // Except for the first step, the top bits are always // a division remainder, so the quotient length is <= n. -- GitLab From 8869086d8f0a31033ccdc103106c768dc17216b1 Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Thu, 4 Feb 2021 02:47:37 +0000 Subject: [PATCH 1731/1792] runtime: fix typo in histogram.go indicies -> indices Change-Id: Ia50ae5918fc7a53c23590a94a18087a99bfd9bb7 GitHub-Last-Rev: 98eb724275fd61d5f5ce5dad6b1010c10f76906d GitHub-Pull-Request: golang/go#44095 Reviewed-on: https://go-review.googlesource.com/c/go/+/289529 Reviewed-by: Ian Lance Taylor Trust: Keith Randall --- src/runtime/histogram.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/histogram.go b/src/runtime/histogram.go index 42baa6c5e2..da4910d341 100644 --- a/src/runtime/histogram.go +++ b/src/runtime/histogram.go @@ -26,7 +26,7 @@ const ( // The number of super-buckets (timeHistNumSuperBuckets), on the // other hand, defines the range. To reserve room for sub-buckets, // bit timeHistSubBucketBits is the first bit considered for - // super-buckets, so super-bucket indicies are adjusted accordingly. + // super-buckets, so super-bucket indices are adjusted accordingly. // // As an example, consider 45 super-buckets with 16 sub-buckets. // -- GitLab From 4516afebedd18692c6dc70cbdee16a049c26024b Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 5 Feb 2021 10:55:12 -0500 Subject: [PATCH 1732/1792] testing/fstest: avoid symlink-induced failures in tester Do not require directory entry and Stat result to match for symlinks, because they won't (Stat dereferences the symlink). Fixes #44113. Change-Id: Ifc6dbce5719906e2f42254a7172f1ef787464a9e Reviewed-on: https://go-review.googlesource.com/c/go/+/290009 Trust: Russ Cox Run-TryBot: Russ Cox Reviewed-by: Bryan C. Mills --- src/testing/fstest/testfs.go | 25 ++++++++++++++++++------- src/testing/fstest/testfs_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 src/testing/fstest/testfs_test.go diff --git a/src/testing/fstest/testfs.go b/src/testing/fstest/testfs.go index a7f8007333..8fc8acaaf3 100644 --- a/src/testing/fstest/testfs.go +++ b/src/testing/fstest/testfs.go @@ -403,9 +403,10 @@ func (t *fsTester) checkStat(path string, entry fs.DirEntry) { return } fentry := formatEntry(entry) - finfo := formatInfoEntry(info) - if fentry != finfo { - t.errorf("%s: mismatch:\n\tentry = %s\n\tfile.Stat() = %s", path, fentry, finfo) + fientry := formatInfoEntry(info) + // Note: mismatch here is OK for symlink, because Open dereferences symlink. + if fentry != fientry && entry.Type()&fs.ModeSymlink == 0 { + t.errorf("%s: mismatch:\n\tentry = %s\n\tfile.Stat() = %s", path, fentry, fientry) } einfo, err := entry.Info() @@ -413,12 +414,22 @@ func (t *fsTester) checkStat(path string, entry fs.DirEntry) { t.errorf("%s: entry.Info: %v", path, err) return } - fentry = formatInfo(einfo) - finfo = formatInfo(info) - if fentry != finfo { - t.errorf("%s: mismatch:\n\tentry.Info() = %s\n\tfile.Stat() = %s\n", path, fentry, finfo) + finfo := formatInfo(info) + if entry.Type()&fs.ModeSymlink != 0 { + // For symlink, just check that entry.Info matches entry on common fields. + // Open deferences symlink, so info itself may differ. + feentry := formatInfoEntry(einfo) + if fentry != feentry { + t.errorf("%s: mismatch\n\tentry = %s\n\tentry.Info() = %s\n", path, fentry, feentry) + } + } else { + feinfo := formatInfo(einfo) + if feinfo != finfo { + t.errorf("%s: mismatch:\n\tentry.Info() = %s\n\tfile.Stat() = %s\n", path, feinfo, finfo) + } } + // Stat should be the same as Open+Stat, even for symlinks. info2, err := fs.Stat(t.fsys, path) if err != nil { t.errorf("%s: fs.Stat: %v", path, err) diff --git a/src/testing/fstest/testfs_test.go b/src/testing/fstest/testfs_test.go new file mode 100644 index 0000000000..5b8813c343 --- /dev/null +++ b/src/testing/fstest/testfs_test.go @@ -0,0 +1,31 @@ +// 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 fstest + +import ( + "internal/testenv" + "os" + "path/filepath" + "testing" +) + +func TestSymlink(t *testing.T) { + testenv.MustHaveSymlink(t) + + tmp := t.TempDir() + tmpfs := os.DirFS(tmp) + + if err := os.WriteFile(filepath.Join(tmp, "hello"), []byte("hello, world\n"), 0644); err != nil { + t.Fatal(err) + } + + if err := os.Symlink(filepath.Join(tmp, "hello"), filepath.Join(tmp, "hello.link")); err != nil { + t.Fatal(err) + } + + if err := TestFS(tmpfs, "hello", "hello.link"); err != nil { + t.Fatal(err) + } +} -- GitLab From b54cd94d478c95e79e5eea1d77e73d7b2b769f09 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 5 Feb 2021 16:45:40 -0500 Subject: [PATCH 1733/1792] embed, io/fs: clarify that leading and trailing slashes are disallowed Fixes #44012 Change-Id: I5782cea301a65ae12ba870ff1e6b2e0a2651dc09 Reviewed-on: https://go-review.googlesource.com/c/go/+/290071 Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills TryBot-Result: Go Bot Trust: Jay Conrod --- src/embed/embed.go | 18 +++++++++--------- src/io/fs/fs.go | 1 + 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/embed/embed.go b/src/embed/embed.go index f12bf31e76..98da870ac6 100644 --- a/src/embed/embed.go +++ b/src/embed/embed.go @@ -61,12 +61,15 @@ // The Go build system will recognize the directives and arrange for the declared variable // (in the example above, content) to be populated with the matching files from the file system. // -// The //go:embed directive accepts multiple space-separated patterns for brevity, -// but it can also be repeated, to avoid very long lines when there are many patterns. -// The patterns are interpreted relative to the package directory containing the source file. -// The path separator is a forward slash, even on Windows systems. -// To allow for naming files with spaces in their names, patterns can be written -// as Go double-quoted or back-quoted string literals. +// The //go:embed directive accepts multiple space-separated patterns for +// brevity, but it can also be repeated, to avoid very long lines when there are +// many patterns. The patterns are interpreted relative to the package directory +// containing the source file. The path separator is a forward slash, even on +// Windows systems. Patterns may not contain ‘.’ or ‘..’ or empty path elements, +// nor may they begin or end with a slash. To match everything in the current +// directory, use ‘*’ instead of ‘.’. To allow for naming files with spaces in +// their names, patterns can be written as Go double-quoted or back-quoted +// string literals. // // If a pattern names a directory, all files in the subtree rooted at that directory are // embedded (recursively), except that files with names beginning with ‘.’ or ‘_’ @@ -87,9 +90,6 @@ // Matches for empty directories are ignored. After that, each pattern in a //go:embed line // must match at least one file or non-empty directory. // -// Patterns must not contain ‘.’ or ‘..’ path elements nor begin with a leading slash. -// To match everything in the current directory, use ‘*’ instead of ‘.’. -// // If any patterns are invalid or have invalid matches, the build will fail. // // Strings and Bytes diff --git a/src/io/fs/fs.go b/src/io/fs/fs.go index b691a86049..c330f123ad 100644 --- a/src/io/fs/fs.go +++ b/src/io/fs/fs.go @@ -36,6 +36,7 @@ type FS interface { // sequences of path elements, like “x/y/z”. // Path names must not contain a “.” or “..” or empty element, // except for the special case that the root directory is named “.”. +// Leading and trailing slashes (like “/x” or “x/”) are not allowed. // // Paths are slash-separated on all systems, even Windows. // Backslashes must not appear in path names. -- GitLab From 724d0720b3e110f64598bf789cbe2a6a1b3b0fd8 Mon Sep 17 00:00:00 2001 From: KimMachineGun Date: Fri, 5 Feb 2021 05:47:46 +0000 Subject: [PATCH 1734/1792] doc/go1.16: add missed heading tag in vet section Add missed heading tag in CL 276373. For #40700 Change-Id: Ida9e8861589bbc296a5a1cecbf9fe33fa09ed0ca GitHub-Last-Rev: d218f8d4b70b20c30422863db7bed3683e3218e6 GitHub-Pull-Request: golang/go#44111 Reviewed-on: https://go-review.googlesource.com/c/go/+/289869 Reviewed-by: Tim King Reviewed-by: Dmitri Shuralyov Trust: Tim King Trust: Dmitri Shuralyov --- doc/go1.16.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 8d31f63fa2..878bf0d029 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -364,6 +364,8 @@ func TestFoo(t *testing.T) { } +

    New warning for frame pointer

    +

    The vet tool now warns about amd64 assembly that clobbers the BP register (the frame pointer) without saving and restoring it, -- GitLab From ed3e4afa12d655a0c5606bcf3dd4e1cdadcb1476 Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Wed, 6 Jan 2021 02:40:05 +0000 Subject: [PATCH 1735/1792] syscall/plan9: remove spooky fd action at a distance Change Plan 9 fork/exec to use the O_CLOEXEC file descriptor, instead of relying on spooky at a distance. Historically, Plan 9 has set the O_CLOEXEC flag on the underlying channels in the kernel, rather than the file descriptors -- if two fds pointed at a single channel, as with dup, changing the flags on one of them would be observable on the other. The per-Chan semantics are ok, if unexpected, when a chan is only handled within a single process, but this isn't always the case. Forked processes share Chans, but even more of a problem is the interaction between /srv and OCEXEC, which can lead to unexectedly closed file descriptors in completely unrelated proceses. For example: func exists() bool { // If some other thread execs here, // we don't want to leak the fd, so // open it O_CLOEXEC fd := Open("/srv/foo", O_CLOEXEC) if fd != -1 { Close(fd) return true } return false } would close the connection to any file descriptor (maybe even for the root fs) in ALL other processes that have it open if an exec were to happen(!), which is quite undesriable. As a result, 9front will be changing this behavior for the next release. Go is the only code observed so far that relies on this behavior on purpose, and It's easy to make the code work with both semantics: simply using the file descriptor that was opened with O_CEXEC instead of throwing it away. So we do that here. Fixes #43524 Change-Id: I4887f5c934a5e63e5e6c1bb59878a325abc928d3 GitHub-Last-Rev: 96bb21bd1e8f64dc7e082a56928748a7d54c9272 GitHub-Pull-Request: golang/go#43533 Reviewed-on: https://go-review.googlesource.com/c/go/+/281833 Reviewed-by: David du Colombier <0intro@gmail.com> Reviewed-by: Richard Miller Reviewed-by: Jacob Moody Run-TryBot: David du Colombier <0intro@gmail.com> Trust: Ian Lance Taylor --- src/syscall/exec_plan9.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/syscall/exec_plan9.go b/src/syscall/exec_plan9.go index 47ccbdc384..12c4237f69 100644 --- a/src/syscall/exec_plan9.go +++ b/src/syscall/exec_plan9.go @@ -320,14 +320,15 @@ func cexecPipe(p []int) error { return e } - fd, e := Open("#d/"+itoa(p[1]), O_CLOEXEC) + fd, e := Open("#d/"+itoa(p[1]), O_RDWR|O_CLOEXEC) if e != nil { Close(p[0]) Close(p[1]) return e } - Close(fd) + Close(p[1]) + p[1] = fd return nil } -- GitLab From 1901853098bbe25a1bbedc0ee53c6658d754151e Mon Sep 17 00:00:00 2001 From: Changkun Ou Date: Sun, 7 Feb 2021 17:31:12 +0100 Subject: [PATCH 1736/1792] runtime/metrics: fix panic in readingAllMetric example medianBucket can return if the total is greater than thresh. However, if a histogram has no counts, total and thresh will both be zero and cause panic. Adding an equal sign to prevent the potential panic. Fixes #44148 Change-Id: Ifb8a781990f490d142ae7c035b4e01d6a07ae04d Reviewed-on: https://go-review.googlesource.com/c/go/+/290171 Trust: Ian Lance Taylor Reviewed-by: Michael Knyszek Run-TryBot: Michael Knyszek TryBot-Result: Go Bot --- src/runtime/metrics/example_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/metrics/example_test.go b/src/runtime/metrics/example_test.go index cade0c38bf..624d9d8a6b 100644 --- a/src/runtime/metrics/example_test.go +++ b/src/runtime/metrics/example_test.go @@ -88,7 +88,7 @@ func medianBucket(h *metrics.Float64Histogram) float64 { total = 0 for i, count := range h.Counts { total += count - if total > thresh { + if total >= thresh { return h.Buckets[i] } } -- GitLab From dc725bfb3c3f29c7395e088d25ef6bf8dba8f129 Mon Sep 17 00:00:00 2001 From: KimMachineGun Date: Mon, 8 Feb 2021 23:27:52 +0000 Subject: [PATCH 1737/1792] doc/go1.16: mention new vet check for asn1.Unmarshal This vet check was added in CL 243397. For #40700. Change-Id: Ibff6df9395d37bb2b84a791443578009f23af4fb GitHub-Last-Rev: e47c38f6309f31a6de48d4ffc82078d7ad45b171 GitHub-Pull-Request: golang/go#44147 Reviewed-on: https://go-review.googlesource.com/c/go/+/290330 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/go1.16.html b/doc/go1.16.html index 878bf0d029..f6f72c3882 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -378,6 +378,16 @@ func TestFoo(t *testing.T) { fixes.

    +

    New warning for asn1.Unmarshal

    + +

    + The vet tool now warns about incorrectly passing a non-pointer or nil argument to + asn1.Unmarshal. + This is like the existing checks for + encoding/json.Unmarshal + and encoding/xml.Unmarshal. +

    +

    Runtime

    -- GitLab From cea4e21b525ad6b465f62741680eaa0a44e9cc3e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 8 Feb 2021 16:32:39 -0800 Subject: [PATCH 1738/1792] io/fs: backslash is always a glob meta character Fixes #44171 Change-Id: I2d3437a2f5b9fa0358e4664e1a8eacebed975eed Reviewed-on: https://go-review.googlesource.com/c/go/+/290512 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Rob Pike Reviewed-by: Russ Cox --- src/io/fs/glob.go | 5 ++--- src/io/fs/glob_test.go | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/io/fs/glob.go b/src/io/fs/glob.go index 549f217542..45d9cb61b9 100644 --- a/src/io/fs/glob.go +++ b/src/io/fs/glob.go @@ -6,7 +6,6 @@ package fs import ( "path" - "runtime" ) // A GlobFS is a file system with a Glob method. @@ -111,8 +110,8 @@ func glob(fs FS, dir, pattern string, matches []string) (m []string, e error) { // recognized by path.Match. func hasMeta(path string) bool { for i := 0; i < len(path); i++ { - c := path[i] - if c == '*' || c == '?' || c == '[' || runtime.GOOS == "windows" && c == '\\' { + switch path[i] { + case '*', '?', '[', '\\': return true } } diff --git a/src/io/fs/glob_test.go b/src/io/fs/glob_test.go index f0d791fab5..f19bebed77 100644 --- a/src/io/fs/glob_test.go +++ b/src/io/fs/glob_test.go @@ -17,6 +17,7 @@ var globTests = []struct { }{ {os.DirFS("."), "glob.go", "glob.go"}, {os.DirFS("."), "gl?b.go", "glob.go"}, + {os.DirFS("."), `gl\ob.go`, "glob.go"}, {os.DirFS("."), "*", "glob.go"}, {os.DirFS(".."), "*/glob.go", "fs/glob.go"}, } @@ -32,7 +33,7 @@ func TestGlob(t *testing.T) { t.Errorf("Glob(%#q) = %#v want %v", tt.pattern, matches, tt.result) } } - for _, pattern := range []string{"no_match", "../*/no_match"} { + for _, pattern := range []string{"no_match", "../*/no_match", `\*`} { matches, err := Glob(os.DirFS("."), pattern) if err != nil { t.Errorf("Glob error for %q: %s", pattern, err) -- GitLab From c9d6f45fec19a9cb66ddd89d61bfa982f5bf4afe Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sun, 7 Feb 2021 15:25:39 -0800 Subject: [PATCH 1739/1792] runtime/metrics: fix a couple of documentation typpos Fixes #44150 Change-Id: Ibe5bfba01491dd8c2f0696fab40a1673230d76e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/290349 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Dmitri Shuralyov Reviewed-by: Michael Knyszek --- src/runtime/metrics/doc.go | 7 ++++--- src/runtime/metrics/sample.go | 6 +++--- src/runtime/metrics/value.go | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/runtime/metrics/doc.go b/src/runtime/metrics/doc.go index 021a0bddca..5da050f973 100644 --- a/src/runtime/metrics/doc.go +++ b/src/runtime/metrics/doc.go @@ -16,13 +16,14 @@ Interface Metrics are designated by a string key, rather than, for example, a field name in a struct. The full list of supported metrics is always available in the slice of Descriptions returned by All. Each Description also includes useful information -about the metric, such as how to display it (e.g. gauge vs. counter) and how difficult -or disruptive it is to obtain it (e.g. do you need to stop the world?). +about the metric, such as how to display it (for example, gauge vs. counter) +and how difficult or disruptive it is to obtain it (for example, do you need to +stop the world?). Thus, users of this API are encouraged to sample supported metrics defined by the slice returned by All to remain compatible across Go versions. Of course, situations arise where reading specific metrics is critical. For these cases, users are -encouranged to use build tags, and although metrics may be deprecated and removed, +encouraged to use build tags, and although metrics may be deprecated and removed, users should consider this to be an exceptional and rare event, coinciding with a very large change in a particular Go implementation. diff --git a/src/runtime/metrics/sample.go b/src/runtime/metrics/sample.go index 35534dd70d..b3933e266e 100644 --- a/src/runtime/metrics/sample.go +++ b/src/runtime/metrics/sample.go @@ -32,9 +32,9 @@ func runtime_readMetrics(unsafe.Pointer, int, int) // // Note that re-use has some caveats. Notably, Values should not be read or // manipulated while a Read with that value is outstanding; that is a data race. -// This property includes pointer-typed Values (e.g. Float64Histogram) whose -// underlying storage will be reused by Read when possible. To safely use such -// values in a concurrent setting, all data must be deep-copied. +// This property includes pointer-typed Values (for example, Float64Histogram) +// whose underlying storage will be reused by Read when possible. To safely use +// such values in a concurrent setting, all data must be deep-copied. // // It is safe to execute multiple Read calls concurrently, but their arguments // must share no underlying memory. When in doubt, create a new []Sample from diff --git a/src/runtime/metrics/value.go b/src/runtime/metrics/value.go index 61e8a192a3..ed9a33d87c 100644 --- a/src/runtime/metrics/value.go +++ b/src/runtime/metrics/value.go @@ -33,7 +33,7 @@ type Value struct { pointer unsafe.Pointer // contains non-scalar values. } -// Kind returns the a tag representing the kind of value this is. +// Kind returns the tag representing the kind of value this is. func (v Value) Kind() ValueKind { return v.kind } -- GitLab From e0ac989cf3e43ec77c7205a66cb1cd63dd4d3043 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Thu, 4 Feb 2021 01:39:18 -0800 Subject: [PATCH 1740/1792] archive/tar: detect out of bounds accesses in PAX records resulting from padded lengths Handles the case in which padding of a PAX record's length field violates invariants about the formatting of record, whereby it no longer matches the prescribed format: "%d %s=%s\n", , , as per: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html#tag_20_92_13_03 0-padding, and paddings of other sorts weren't handled and we assumed that only non-padded decimal lengths would be passed in. Added test cases to ensure that the parsing still proceeds as expected. The prior crashing repro: 0000000000000000000000000000000030 mtime=1432668921.098285006\n30 ctime=2147483649.15163319 exposed the fallacy in the code, that assumed that the length would ALWAYS be a non-padded decimal length string. This bug has existed since Go1.1 as per CL 6700047. Thanks to Josh Bleecher Snyder for fuzzing this package, and thanks to Tom Thorogood for advocacy, raising parity with GNU Tar, but for providing more test cases. Fixes #40196 Change-Id: I32e0af4887bc9221481bd9e8a5120a79f177f08c Reviewed-on: https://go-review.googlesource.com/c/go/+/289629 Trust: Emmanuel Odeke Trust: Joe Tsai Run-TryBot: Emmanuel Odeke TryBot-Result: Go Bot Reviewed-by: Joe Tsai --- src/archive/tar/strconv.go | 21 ++++++++++++++++++++- src/archive/tar/strconv_test.go | 7 +++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/archive/tar/strconv.go b/src/archive/tar/strconv.go index 6d0a403808..f0b61e6dba 100644 --- a/src/archive/tar/strconv.go +++ b/src/archive/tar/strconv.go @@ -265,8 +265,27 @@ func parsePAXRecord(s string) (k, v, r string, err error) { return "", "", s, ErrHeader } + afterSpace := int64(sp + 1) + beforeLastNewLine := n - 1 + // In some cases, "length" was perhaps padded/malformed, and + // trying to index past where the space supposedly is goes past + // the end of the actual record. + // For example: + // "0000000000000000000000000000000030 mtime=1432668921.098285006\n30 ctime=2147483649.15163319" + // ^ ^ + // | | + // | afterSpace=35 + // | + // beforeLastNewLine=29 + // yet indexOf(firstSpace) MUST BE before endOfRecord. + // + // See https://golang.org/issues/40196. + if afterSpace >= beforeLastNewLine { + return "", "", s, ErrHeader + } + // Extract everything between the space and the final newline. - rec, nl, rem := s[sp+1:n-1], s[n-1:n], s[n:] + rec, nl, rem := s[afterSpace:beforeLastNewLine], s[beforeLastNewLine:n], s[n:] if nl != "\n" { return "", "", s, ErrHeader } diff --git a/src/archive/tar/strconv_test.go b/src/archive/tar/strconv_test.go index dd3505a758..add65e272a 100644 --- a/src/archive/tar/strconv_test.go +++ b/src/archive/tar/strconv_test.go @@ -368,6 +368,13 @@ func TestParsePAXRecord(t *testing.T) { {"16 longkeyname=hahaha\n", "16 longkeyname=hahaha\n", "", "", false}, {"3 somelongkey=\n", "3 somelongkey=\n", "", "", false}, {"50 tooshort=\n", "50 tooshort=\n", "", "", false}, + {"0000000000000000000000000000000030 mtime=1432668921.098285006\n30 ctime=2147483649.15163319", "0000000000000000000000000000000030 mtime=1432668921.098285006\n30 ctime=2147483649.15163319", "mtime", "1432668921.098285006", false}, + {"06 k=v\n", "06 k=v\n", "", "", false}, + {"00006 k=v\n", "00006 k=v\n", "", "", false}, + {"000006 k=v\n", "000006 k=v\n", "", "", false}, + {"000000 k=v\n", "000000 k=v\n", "", "", false}, + {"0 k=v\n", "0 k=v\n", "", "", false}, + {"+0000005 x=\n", "+0000005 x=\n", "", "", false}, } for _, v := range vectors { -- GitLab From e9c96835971044aa4ace37c7787de231bbde05d9 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 4 Feb 2021 15:26:52 -0500 Subject: [PATCH 1741/1792] cmd/go: suppress errors from 'go get -d' for packages that only conditionally exist Fixes #44106 Fixes #29268 Change-Id: Id113f2ced274d43fbf66cb804581448218996f81 Reviewed-on: https://go-review.googlesource.com/c/go/+/289769 TryBot-Result: Go Bot Reviewed-by: Jay Conrod Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills --- src/cmd/go/internal/modget/get.go | 20 ++- .../go/testdata/script/mod_get_pkgtags.txt | 116 ++++++++++++++++++ 2 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_get_pkgtags.txt diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 574f3e194d..1a8c9d3725 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -380,10 +380,9 @@ func runGet(ctx context.Context, cmd *base.Command, args []string) { pkgs := load.PackagesAndErrors(ctx, pkgPatterns) load.CheckPackageErrors(pkgs) work.InstallPackages(ctx, pkgPatterns, pkgs) - // TODO(#40276): After Go 1.16, print a deprecation notice when building - // and installing main packages. 'go install pkg' or - // 'go install pkg@version' should be used instead. - // Give the specific argument to use if possible. + // TODO(#40276): After Go 1.16, print a deprecation notice when building and + // installing main packages. 'go install pkg' or 'go install pkg@version' + // should be used instead. Give the specific argument to use if possible. } if !modload.HasModRoot() { @@ -1453,7 +1452,18 @@ func (r *resolver) checkPackagesAndRetractions(ctx context.Context, pkgPatterns } } for _, pkg := range pkgs { - if _, _, err := modload.Lookup("", false, pkg); err != nil { + if dir, _, err := modload.Lookup("", false, pkg); err != nil { + if dir != "" && errors.Is(err, imports.ErrNoGo) { + // Since dir is non-empty, we must have located source files + // associated with either the package or its test — ErrNoGo must + // indicate that none of those source files happen to apply in this + // configuration. If we are actually building the package (no -d + // flag), the compiler will report the problem; otherwise, assume that + // the user is going to build or test it in some other configuration + // and suppress the error. + continue + } + base.SetExitStatus(1) if ambiguousErr := (*modload.AmbiguousImportError)(nil); errors.As(err, &ambiguousErr) { for _, m := range ambiguousErr.Modules { diff --git a/src/cmd/go/testdata/script/mod_get_pkgtags.txt b/src/cmd/go/testdata/script/mod_get_pkgtags.txt new file mode 100644 index 0000000000..c0a57f3fab --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_pkgtags.txt @@ -0,0 +1,116 @@ +# https://golang.org/issue/44106 +# 'go get' should fetch the transitive dependencies of packages regardless of +# tags, but shouldn't error out if the package is missing tag-guarded +# dependencies. + +# Control case: just adding the top-level module to the go.mod file does not +# fetch its dependencies. + +go mod edit -require example.net/tools@v0.1.0 +! go list -deps example.net/cmd/tool +stderr '^module example\.net/cmd provides package example\.net/cmd/tool and is replaced but not required; to add it:\n\tgo get example\.net/cmd@v0\.1\.0$' +go mod edit -droprequire example.net/tools + + +# 'go get -d' makes a best effort to fetch those dependencies, but shouldn't +# error out if dependencies of tag-guarded files are missing. + +go get -d example.net/tools@v0.1.0 + +! go list example.net/tools +stderr '^package example.net/tools: build constraints exclude all Go files in .*[/\\]tools$' + +go list -tags=tools -e -deps example.net/tools +stdout '^example.net/cmd/tool$' +stdout '^example.net/missing$' + +go list -deps example.net/cmd/tool + +! go list example.net/missing +stderr '^no required module provides package example.net/missing; to add it:\n\tgo get example.net/missing$' + + +# https://golang.org/issue/29268 +# 'go get' should fetch modules whose roots contain test-only packages, but +# without the -t flag shouldn't error out if the test has missing dependencies. + +go get -d example.net/testonly@v0.1.0 + +# With the -t flag, the test dependencies must resolve successfully. +! go get -d -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$' + + +# 'go get -d' should succeed for a module path that does not contain a package, +# but fail for a non-package subdirectory of a module. + +! go get -d example.net/missing/subdir@v0.1.0 +stderr '^go get: module example.net/missing@v0.1.0 found \(replaced by ./missing\), but does not contain package example.net/missing/subdir$' + +go get -d example.net/missing@v0.1.0 + + +# Getting the subdirectory should continue to fail even if the corresponding +# module is already present in the build list. + +! go get -d example.net/missing/subdir@v0.1.0 +stderr '^go get: module example.net/missing@v0.1.0 found \(replaced by ./missing\), but does not contain package example.net/missing/subdir$' + + +-- go.mod -- +module example.net/m + +go 1.15 + +replace ( + example.net/tools v0.1.0 => ./tools + example.net/cmd v0.1.0 => ./cmd + example.net/testonly v0.1.0 => ./testonly + example.net/missing v0.1.0 => ./missing +) + +-- tools/go.mod -- +module example.net/tools + +go 1.15 + +// Requirements intentionally omitted. + +-- tools/tools.go -- +// +build tools + +package tools + +import ( + _ "example.net/cmd/tool" + _ "example.net/missing" +) + +-- cmd/go.mod -- +module example.net/cmd + +go 1.16 +-- cmd/tool/tool.go -- +package main + +func main() {} + +-- testonly/go.mod -- +module example.net/testonly + +go 1.15 +-- testonly/testonly_test.go -- +package testonly_test + +import _ "example.net/missing" + +func Test(t *testing.T) {} + +-- missing/go.mod -- +module example.net/missing + +go 1.15 +-- missing/README.txt -- +There are no Go source files here. +-- missing/subdir/README.txt -- +There are no Go source files here either. -- GitLab From ed8079096fe2e78d6dcb8002758774dca6d24eee Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 10 Feb 2021 12:43:18 -0500 Subject: [PATCH 1742/1792] cmd/compile: mark concrete call of reflect.(*rtype).Method as REFLECTMETHOD For functions that call reflect.Type.Method (or MethodByName), we mark it as REFLECTMETHOD, which tells the linker that methods can be retrieved via reflection and the linker keeps all exported methods live. Currently, this marking expects exactly the interface call reflect.Type.Method (or MethodByName). But now the compiler can devirtualize that call to a concrete call reflect.(*rtype).Method (or MethodByName), which is not handled and causing the linker to discard methods too aggressively. Handle the latter in this CL. Fixes #44207. Change-Id: Ia4060472dbff6ab6a83d2ca8e60a3e3f180ee832 Reviewed-on: https://go-review.googlesource.com/c/go/+/290950 Trust: Cherry Zhang Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/walk.go | 16 +++++++++++++++- test/reflectmethod7.go | 24 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/reflectmethod7.go diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 2133a160b2..98ebb23991 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -550,8 +550,12 @@ opswitch: case OCLOSUREVAR, OCFUNC: case OCALLINTER, OCALLFUNC, OCALLMETH: - if n.Op == OCALLINTER { + if n.Op == OCALLINTER || n.Op == OCALLMETH { + // We expect both interface call reflect.Type.Method and concrete + // call reflect.(*rtype).Method. usemethod(n) + } + if n.Op == OCALLINTER { markUsedIfaceMethod(n) } @@ -3710,6 +3714,16 @@ func usemethod(n *Node) { } } + // Don't mark reflect.(*rtype).Method, etc. themselves in the reflect package. + // Those functions may be alive via the itab, which should not cause all methods + // alive. We only want to mark their callers. + if myimportpath == "reflect" { + switch Curfn.Func.Nname.Sym.Name { // TODO: is there a better way than hardcoding the names? + case "(*rtype).Method", "(*rtype).MethodByName", "(*interfaceType).Method", "(*interfaceType).MethodByName": + return + } + } + // Note: Don't rely on res0.Type.String() since its formatting depends on multiple factors // (including global variables such as numImports - was issue #19028). // Also need to check for reflect package itself (see Issue #38515). diff --git a/test/reflectmethod7.go b/test/reflectmethod7.go new file mode 100644 index 0000000000..42429978b4 --- /dev/null +++ b/test/reflectmethod7.go @@ -0,0 +1,24 @@ +// run + +// 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. + +// See issue 44207. + +package main + +import "reflect" + +type S int + +func (s S) M() {} + +func main() { + t := reflect.TypeOf(S(0)) + fn, ok := reflect.PtrTo(t).MethodByName("M") + if !ok { + panic("FAIL") + } + fn.Func.Call([]reflect.Value{reflect.New(t)}) +} -- GitLab From e5b08e6d5cecb646066c0cadddf6300e2a10ffb2 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 9 Feb 2021 13:46:53 -0500 Subject: [PATCH 1743/1792] io/fs: allow backslash in ValidPath, reject in os.DirFS.Open Rejecting backslash introduces problems with presenting underlying OS file systems that contain names with backslash. Rejecting backslash also does not Windows-proof the syntax, because colon can also be a path separator. And we are not going to reject colon from all names. So don't reject backslash either. There is a similar problem on Windows with names containing slashes, but those are more difficult (though not impossible) to create. Also document and enforce that paths must be UTF-8. Fixes #44166. Change-Id: Iac7a9a268025c1fd31010dbaf3f51e1660c7ae2a Reviewed-on: https://go-review.googlesource.com/c/go/+/290709 TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Trust: Russ Cox Run-TryBot: Russ Cox --- src/io/fs/fs.go | 23 ++++++++++++++--------- src/io/fs/fs_test.go | 7 ++++--- src/os/file.go | 13 ++++++++++++- src/os/os_test.go | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/io/fs/fs.go b/src/io/fs/fs.go index c330f123ad..3d2e2ee2ac 100644 --- a/src/io/fs/fs.go +++ b/src/io/fs/fs.go @@ -10,6 +10,7 @@ package fs import ( "internal/oserror" "time" + "unicode/utf8" ) // An FS provides access to a hierarchical file system. @@ -32,15 +33,22 @@ type FS interface { // ValidPath reports whether the given path name // is valid for use in a call to Open. -// Path names passed to open are unrooted, slash-separated -// sequences of path elements, like “x/y/z”. -// Path names must not contain a “.” or “..” or empty element, +// +// Path names passed to open are UTF-8-encoded, +// unrooted, slash-separated sequences of path elements, like “x/y/z”. +// Path names must not contain an element that is “.” or “..” or the empty string, // except for the special case that the root directory is named “.”. -// Leading and trailing slashes (like “/x” or “x/”) are not allowed. +// Paths must not start or end with a slash: “/x” and “x/” are invalid. // -// Paths are slash-separated on all systems, even Windows. -// Backslashes must not appear in path names. +// Note that paths are slash-separated on all systems, even Windows. +// Paths containing other characters such as backslash and colon +// are accepted as valid, but those characters must never be +// interpreted by an FS implementation as path element separators. func ValidPath(name string) bool { + if !utf8.ValidString(name) { + return false + } + if name == "." { // special case return true @@ -50,9 +58,6 @@ func ValidPath(name string) bool { for { i := 0 for i < len(name) && name[i] != '/' { - if name[i] == '\\' { - return false - } i++ } elem := name[:i] diff --git a/src/io/fs/fs_test.go b/src/io/fs/fs_test.go index 8d395fc0db..aae1a7606f 100644 --- a/src/io/fs/fs_test.go +++ b/src/io/fs/fs_test.go @@ -33,9 +33,10 @@ var isValidPathTests = []struct { {"x/..", false}, {"x/../y", false}, {"x//y", false}, - {`x\`, false}, - {`x\y`, false}, - {`\x`, false}, + {`x\`, true}, + {`x\y`, true}, + {`x:y`, true}, + {`\x`, true}, } func TestValidPath(t *testing.T) { diff --git a/src/os/file.go b/src/os/file.go index 416bc0efa6..52dd94339b 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -620,10 +620,21 @@ func DirFS(dir string) fs.FS { return dirFS(dir) } +func containsAny(s, chars string) bool { + for i := 0; i < len(s); i++ { + for j := 0; j < len(chars); j++ { + if s[i] == chars[j] { + return true + } + } + } + return false +} + type dirFS string func (dir dirFS) Open(name string) (fs.File, error) { - if !fs.ValidPath(name) { + if !fs.ValidPath(name) || runtime.GOOS == "windows" && containsAny(name, `\:`) { return nil, &PathError{Op: "open", Path: name, Err: ErrInvalid} } f, err := Open(string(dir) + "/" + name) diff --git a/src/os/os_test.go b/src/os/os_test.go index ee54b4aba1..a32e5fc11e 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -2719,6 +2719,40 @@ func TestDirFS(t *testing.T) { if err := fstest.TestFS(DirFS("./testdata/dirfs"), "a", "b", "dir/x"); err != nil { t.Fatal(err) } + + // Test that Open does not accept backslash as separator. + d := DirFS(".") + _, err := d.Open(`testdata\dirfs`) + if err == nil { + t.Fatalf(`Open testdata\dirfs succeeded`) + } +} + +func TestDirFSPathsValid(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skipf("skipping on Windows") + } + + d := t.TempDir() + if err := os.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 { + t.Fatal(err) + } + + fsys := os.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()) + } else { + t.Errorf("%q INVALID", e.Name()) + } + return nil + }) + if err != nil { + t.Fatal(err) + } } func TestReadFileProc(t *testing.T) { -- GitLab From 930c2c9a6810b54d84dc499120219a6cb4563fd7 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 9 Feb 2021 17:34:09 -0500 Subject: [PATCH 1744/1792] cmd/go: reject embedded files that can't be packed into modules If the file won't be packed into a module, don't put those files into embeds. Otherwise people will be surprised when things work locally but not when imported by another module. Observed on CL 290709 Change-Id: Ia0ef7d0e0f5e42473c2b774e57c843e68a365bc7 Reviewed-on: https://go-review.googlesource.com/c/go/+/290809 Trust: Russ Cox Run-TryBot: Russ Cox TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/go/internal/load/pkg.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 3a274a3ad1..8b12faf4cd 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -36,6 +36,8 @@ import ( "cmd/go/internal/str" "cmd/go/internal/trace" "cmd/internal/sys" + + "golang.org/x/mod/module" ) var IgnoreImports bool // control whether we ignore imports in packages @@ -2090,6 +2092,9 @@ func validEmbedPattern(pattern string) bool { // can't or won't be included in modules and therefore shouldn't be treated // as existing for embedding. func isBadEmbedName(name string) bool { + if err := module.CheckFilePath(name); err != nil { + return true + } switch name { // Empty string should be impossible but make it bad. case "": -- GitLab From 26ceae85a89dc4ea910cc0bfa209c85213a93725 Mon Sep 17 00:00:00 2001 From: DQNEO Date: Wed, 10 Feb 2021 14:46:54 +0900 Subject: [PATCH 1745/1792] spec: More precise wording in section on function calls. A caller is not always in a function. For example, a call can appear in top level declarations. e.g. var x = f() Change-Id: I29c4c3b7663249434fb2b8a6d0003267c77268cf Reviewed-on: https://go-review.googlesource.com/c/go/+/290849 Reviewed-by: Rob Pike Reviewed-by: Ian Lance Taylor Reviewed-by: Robert Griesemer Trust: Robert Griesemer --- doc/go_spec.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/go_spec.html b/doc/go_spec.html index c9e14a3fec..59c9ce3c43 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -3446,7 +3446,7 @@ In a function call, the function value and arguments are evaluated in After they are evaluated, the parameters of the call are passed by value to the function and the called function begins execution. The return parameters of the function are passed by value -back to the calling function when the function returns. +back to the caller when the function returns.

    -- GitLab From 864d4f1c6b364e13c0a4008bc203f336b0027f44 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 11 Feb 2021 10:27:55 -0500 Subject: [PATCH 1746/1792] cmd/go: multiple small 'go help' fixes * Link to privacy policies for proxy.golang.org and sum.golang.org in 'go help modules'. It's important that both policies are linked from the go command's documentation. * Fix wording and typo in 'go help vcs' following comments in CL 290992, which adds reference documentation for GOVCS. * Fix whitespace on GOVCS in 'go help environment'. For #41730 Change-Id: I86abceacd4962b748361244026f219157c9285e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/291230 Trust: Jay Conrod Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills TryBot-Result: Go Bot --- src/cmd/go/alldocs.go | 30 +++++++++++++++++++++-------- src/cmd/go/internal/help/helpdoc.go | 2 +- src/cmd/go/internal/modget/get.go | 17 +++++++++------- src/cmd/go/internal/modload/help.go | 13 +++++++++++-- 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 49d390297c..e7c63f0749 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1808,7 +1808,7 @@ // The directory where the go command will write // temporary source files, packages, and binaries. // GOVCS -// Lists version control commands that may be used with matching servers. +// Lists version control commands that may be used with matching servers. // See 'go help vcs'. // // Environment variables for use with cgo: @@ -2410,6 +2410,17 @@ // // For a detailed reference on modules, see https://golang.org/ref/mod. // +// By default, the go command may download modules from https://proxy.golang.org. +// It may authenticate modules using the checksum database at +// https://sum.golang.org. Both services are operated by the Go team at Google. +// The privacy policies for these services are available at +// https://proxy.golang.org/privacy and https://sum.golang.org/privacy, +// respectively. +// +// The go command's download behavior may be configured using GOPROXY, GOSUMDB, +// GOPRIVATE, and other environment variables. See 'go help environment' +// and https://golang.org/ref/mod#private-module-privacy for more information. +// // // Module authentication using go.sum // @@ -2868,20 +2879,23 @@ // legal reasons). Therefore, clients can still access public code served from // Bazaar, Fossil, or Subversion repositories by default, because those downloads // use the Go module mirror, which takes on the security risk of running the -// version control commands, using a custom sandbox. +// version control commands using a custom sandbox. // // The GOVCS variable can be used to change the allowed version control systems // for specific packages (identified by a module or import path). -// The GOVCS variable applies both when using modules and when using GOPATH. -// When using modules, the patterns match against the module path. -// When using GOPATH, the patterns match against the import path -// corresponding to the root of the version control repository. +// The GOVCS variable applies when building package in both module-aware mode +// and GOPATH mode. When using modules, the patterns match against the module path. +// When using GOPATH, the patterns match against the import path corresponding to +// the root of the version control repository. // // The general form of the GOVCS setting is a comma-separated list of // pattern:vcslist rules. The pattern is a glob pattern that must match // one or more leading elements of the module or import path. The vcslist // is a pipe-separated list of allowed version control commands, or "all" -// to allow use of any known command, or "off" to allow nothing. +// to allow use of any known command, or "off" to disallow all commands. +// Note that if a module matches a pattern with vcslist "off", it may still be +// downloaded if the origin server uses the "mod" scheme, which instructs the +// go command to download the module using the GOPROXY protocol. // The earliest matching pattern in the list applies, even if later patterns // might also match. // @@ -2889,7 +2903,7 @@ // // GOVCS=github.com:git,evil.com:off,*:git|hg // -// With this setting, code with an module or import path beginning with +// With this setting, code with a module or import path beginning with // github.com/ can only use git; paths on evil.com cannot use any version // control command, and all other paths (* matches everything) can use // only git or hg. diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index e07ad0e1db..57cee4ff96 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -542,7 +542,7 @@ General-purpose environment variables: The directory where the go command will write temporary source files, packages, and binaries. GOVCS - Lists version control commands that may be used with matching servers. + Lists version control commands that may be used with matching servers. See 'go help vcs'. Environment variables for use with cgo: diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 1a8c9d3725..dccacd3d1e 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -176,20 +176,23 @@ packages or when the mirror refuses to serve a public package (typically for legal reasons). Therefore, clients can still access public code served from Bazaar, Fossil, or Subversion repositories by default, because those downloads use the Go module mirror, which takes on the security risk of running the -version control commands, using a custom sandbox. +version control commands using a custom sandbox. The GOVCS variable can be used to change the allowed version control systems for specific packages (identified by a module or import path). -The GOVCS variable applies both when using modules and when using GOPATH. -When using modules, the patterns match against the module path. -When using GOPATH, the patterns match against the import path -corresponding to the root of the version control repository. +The GOVCS variable applies when building package in both module-aware mode +and GOPATH mode. When using modules, the patterns match against the module path. +When using GOPATH, the patterns match against the import path corresponding to +the root of the version control repository. The general form of the GOVCS setting is a comma-separated list of pattern:vcslist rules. The pattern is a glob pattern that must match one or more leading elements of the module or import path. The vcslist is a pipe-separated list of allowed version control commands, or "all" -to allow use of any known command, or "off" to allow nothing. +to allow use of any known command, or "off" to disallow all commands. +Note that if a module matches a pattern with vcslist "off", it may still be +downloaded if the origin server uses the "mod" scheme, which instructs the +go command to download the module using the GOPROXY protocol. The earliest matching pattern in the list applies, even if later patterns might also match. @@ -197,7 +200,7 @@ For example, consider: GOVCS=github.com:git,evil.com:off,*:git|hg -With this setting, code with an module or import path beginning with +With this setting, code with a module or import path beginning with github.com/ can only use git; paths on evil.com cannot use any version control command, and all other paths (* matches everything) can use only git or hg. diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go index 1cb58961be..fd39ddd94e 100644 --- a/src/cmd/go/internal/modload/help.go +++ b/src/cmd/go/internal/modload/help.go @@ -6,8 +6,6 @@ package modload import "cmd/go/internal/base" -// TODO(rsc): The "module code layout" section needs to be written. - var HelpModules = &base.Command{ UsageLine: "modules", Short: "modules, module versions, and more", @@ -22,6 +20,17 @@ For a series of tutorials on modules, see https://golang.org/doc/tutorial/create-module. For a detailed reference on modules, see https://golang.org/ref/mod. + +By default, the go command may download modules from https://proxy.golang.org. +It may authenticate modules using the checksum database at +https://sum.golang.org. Both services are operated by the Go team at Google. +The privacy policies for these services are available at +https://proxy.golang.org/privacy and https://sum.golang.org/privacy, +respectively. + +The go command's download behavior may be configured using GOPROXY, GOSUMDB, +GOPRIVATE, and other environment variables. See 'go help environment' +and https://golang.org/ref/mod#private-module-privacy for more information. `, } -- GitLab From 249da7ec020e194208c02c8eb6a04d017bf29fea Mon Sep 17 00:00:00 2001 From: Carlos Amedee Date: Wed, 10 Feb 2021 20:29:50 -0500 Subject: [PATCH 1747/1792] CONTRIBUTORS: update for the Go 1.16 release This update was created using the updatecontrib command: go get golang.org/x/build/cmd/updatecontrib cd gotip updatecontrib With manual changes based on publicly available information to canonicalize letter case and formatting for a few names. For #12042. Change-Id: I030b77e8ebcc7fe02106f0f264acdfb0b56e20d9 Reviewed-on: https://go-review.googlesource.com/c/go/+/291189 Trust: Carlos Amedee Run-TryBot: Carlos Amedee TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Reviewed-by: Alexander Rakoczy Reviewed-by: Dmitri Shuralyov --- CONTRIBUTORS | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index cebc92f53f..ccbe4627f3 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -30,6 +30,7 @@ Aaron Bieber Aaron Cannon Aaron France Aaron Jacobs +Aaron Jensen Aaron Kemp Aaron Patterson Aaron Stein @@ -71,9 +72,11 @@ Ahmet Alp Balkan Ahmet Soormally Ahmy Yulrizka Ahsun Ahmed +Aidan Coyle Aiden Scandella Ainar Garipov Aishraj Dahal +Ajanthan Balachandran Akhil Indurti Akihiro Suda Akshat Kumar @@ -104,9 +107,11 @@ Alex Buchanan Alex Carol Alex Gaynor Alex Harford +Alex Hays Alex Jin Alex Kohler Alex Myasoedov +Alex Opie Alex Plugaru Alex Schroeder Alex Sergeyev @@ -119,6 +124,7 @@ Alexander F Rødseth Alexander Greim Alexander Guz Alexander Kauer +Alexander Klauer Alexander Kucherenko Alexander Larsson Alexander Lourier @@ -150,16 +156,19 @@ Alexey Naidonov Alexey Neganov Alexey Palazhchenko Alexey Semenyuk +Alexey Vilenskiy Alexis Hildebrandt Alexis Hunt Alexis Imperial-Legrand Ali Farooq Ali Rizvi-Santiago Aliaksandr Valialkin +Alice Merrick Alif Rachmawadi Allan Simon Allen Li Alok Menghrajani +Alwin Doss Aman Gupta Amarjeet Anand Amir Mohammad Saied @@ -168,6 +177,8 @@ Amrut Joshi An Long An Xiao Anand K. Mistry +Ananya Saxena +Anatol Pomozov Anders Pearson Anderson Queiroz André Carvalho @@ -199,6 +210,7 @@ Andrew G. Morgan Andrew Gerrand Andrew Harding Andrew Jackura +Andrew Kemm Andrew Louis Andrew Lutomirski Andrew Medvedev @@ -216,6 +228,7 @@ Andrew Werner Andrew Wilkins Andrew Williams Andrew Z Allen +Andrey Bokhanko Andrey Mirtchovski Andrey Petrov Andrii Soldatenko @@ -230,6 +243,7 @@ Andy Maloney Andy Pan Andy Walker Andy Wang +Andy Williams Andzej Maciusovic Anfernee Yongkun Gui Angelo Bulfone @@ -274,6 +288,7 @@ Arne Hormann Arnout Engelen Aron Nopanen Artem Alekseev +Artem Khvastunov Artem Kolin Arthur Fabre Arthur Khashaev @@ -281,8 +296,10 @@ Artyom Pervukhin Arvindh Rajesh Tamilmani Ashish Gandhi Asim Shankar +Assel Meher Atin Malaviya Ato Araki +Atsushi Toyama Audrey Lim Audrius Butkevicius Augusto Roman @@ -291,6 +308,7 @@ Aurélien Rainone Aurélio A. Heckert Austin Clements Avi Flax +Aviv Klasquin Komissar awaw fumin Awn Umar Axel Wagner @@ -298,6 +316,7 @@ Ayan George Ayanamist Yang Ayke van Laethem Aymerick Jéhanne +Ayzat Sadykov Azat Kaumov Baiju Muthukadan Balaram Makam @@ -308,10 +327,12 @@ Bartosz Grzybowski Bartosz Oler Bastian Ike Ben Burkert +Ben Cartwright-Cox Ben Eitzen Ben Fried Ben Haines Ben Hoyt +Ben Kraft Ben Laurie Ben Lubar Ben Lynn @@ -319,6 +340,7 @@ Ben Olive Ben Schwartz Ben Shi Ben Toews +Benjamin Barenblat Benjamin Black Benjamin Cable Benjamin Hsieh @@ -356,6 +378,7 @@ Bobby Powers Boqin Qin Boris Nagaev Borja Clemente +Boshi Lian Brad Burch Brad Erickson Brad Fitzpatrick @@ -368,10 +391,12 @@ Bradford Lamson-Scribner Bradley Falzon Brady Catherman Brady Sullivan +Branden J. Brown Brandon Bennett Brandon Gilmore Brandon Philips Brandon Ryan +Brave Cow Brayden Cloud Brendan Daniel Tracey Brendan O'Dea @@ -389,6 +414,7 @@ Brian Slesinsky Brian Smith Brian Starke Bryan Alexander +Bryan Boreham Bryan C. Mills Bryan Chan Bryan Ford @@ -407,6 +433,7 @@ Carl Mastrangelo Carl Shapiro Carlisia Campos Carlo Alberto Ferraris +Carlos Alexandro Becker Carlos Amedee Carlos Castillo Carlos Cirello @@ -422,6 +449,7 @@ Casey Callendrello Casey Marshall Catalin Nicutar Catalin Patulea +Cathal O'Callaghan Cedric Staub Cezar Sá Espinola Chad Rosier @@ -434,10 +462,14 @@ Charles Kenney Charles L. Dorian Charles Lee Charles Weill +Charlotte Brandhorst-Satzkorn Chauncy Cullitan +Chen Zhidong Chen Zhihan Cherry Zhang Chew Choon Keat +Chiawen Chen +Chirag Sukhala Cholerae Hu Chotepud Teo Chris Ball @@ -460,6 +492,8 @@ Chris Raynor Chris Roche Chris Smith Chris Stockton +Chris Taylor +Chris Waldon Chris Zou Christian Alexander Christian Couder @@ -467,6 +501,7 @@ Christian Himpel Christian Muehlhaeuser Christian Pellegrin Christian R. Petrin +Christian Svensson Christine Hansmann Christoffer Buchholz Christoph Blecker @@ -474,6 +509,7 @@ Christoph Hack Christopher Cahoon Christopher Guiney Christopher Henderson +Christopher Hlubek Christopher Koch Christopher Loessl Christopher Nelson @@ -506,7 +542,10 @@ Costin Chirvasuta Craig Citro Cristian Staretu Cuihtlauac ALVARADO +Cuong Manh Le +Curtis La Graff Cyrill Schumacher +Dai Jie Daisuke Fujita Daisuke Suzuki Daker Fernandes Pinheiro @@ -525,12 +564,14 @@ Dan Peterson Dan Pupius Dan Scales Dan Sinclair +Daniel Cohen Daniel Cormier Daniël de Kok Daniel Fleischman Daniel Ingram Daniel Johansson Daniel Kerwin +Daniel Kessler Daniel Krech Daniel Kumor Daniel Langner @@ -538,10 +579,12 @@ Daniel Lidén Daniel Lublin Daniel Mangum Daniel Martí +Daniel McCarney Daniel Morsing Daniel Nadasi Daniel Nephin Daniel Ortiz Pereira da Silva +Daniel S. Fava Daniel Skinner Daniel Speichert Daniel Theophanes @@ -563,6 +606,7 @@ Dave Cheney Dave Day Dave Grijalva Dave MacFarlane +Dave Pifke Dave Russell David Anderson David Barnett @@ -593,6 +637,7 @@ David McLeish David Ndungu David NewHamlet David Presotto +David Qu David R. Jenni David Sansome David Stainton @@ -642,6 +687,7 @@ Diwaker Gupta Dmitri Goutnik Dmitri Popov Dmitri Shuralyov +Dmitrii Okunev Dmitriy Cherchenko Dmitriy Dudkin Dmitriy Shelenin @@ -655,6 +701,7 @@ Dmitry Yakunin Doga Fincan Domas Tamašauskas Domen Ipavec +Dominic Della Valle Dominic Green Dominik Honnef Dominik Vogt @@ -696,6 +743,7 @@ Elias Naur Elliot Morrison-Reed Ellison Leão Emerson Lin +Emil Bektimirov Emil Hessman Emil Mursalimov Emilien Kenler @@ -760,6 +808,7 @@ Fatih Arslan Fazal Majid Fazlul Shahriar Federico Bond +Federico Guerinoni Federico Simoncelli Fedor Indutny Fedor Korotkiy @@ -781,6 +830,7 @@ Florin Patan Folke Behrens Ford Hurley Francesc Campoy +Francesco Guardiani Francesco Renzi Francisco Claude Francisco Rojas @@ -811,8 +861,10 @@ Gabriel Russell Gareth Paul Jones Garret Kelly Garrick Evans +Garry McNulty Gary Burd Gary Elliott +Gaurav Singh Gaurish Sharma Gautham Thambidorai Gauthier Jolly @@ -827,6 +879,7 @@ Georg Reinke George Gkirtsou George Hartzell George Shammas +George Tsilias Gerasimos (Makis) Maropoulos Gerasimos Dimitriadis Gergely Brautigam @@ -862,6 +915,7 @@ GitHub User @frennkie (6499251) GitHub User @geedchin (11672310) GitHub User @GrigoriyMikhalkin (3637857) GitHub User @hengwu0 (41297446) <41297446+hengwu0@users.noreply.github.com> +GitHub User @hitzhangjie (3725760) GitHub User @itchyny (375258) GitHub User @jinmiaoluo (39730824) GitHub User @jopbrown (6345470) @@ -873,6 +927,7 @@ GitHub User @LotusFenn (13775899) GitHub User @ly303550688 (11519839) GitHub User @madiganz (18340029) GitHub User @maltalex (10195391) +GitHub User @markruler (38225900) GitHub User @Matts966 (28551465) GitHub User @micnncim (21333876) GitHub User @mkishere (224617) <224617+mkishere@users.noreply.github.com> @@ -886,6 +941,8 @@ GitHub User @ramenjuniti (32011829) GitHub User @saitarunreddy (21041941) GitHub User @shogo-ma (9860598) GitHub User @skanehira (7888591) +GitHub User @soolaugust (10558124) +GitHub User @surechen (7249331) GitHub User @tatsumack (4510569) GitHub User @tell-k (26263) GitHub User @tennashi (10219626) @@ -908,6 +965,7 @@ Gordon Tyler Graham King Graham Miller Grant Griffiths +Green Lightning Greg Poirier Greg Steuck Greg Thelen @@ -920,6 +978,7 @@ Guilherme Garnier Guilherme Goncalves Guilherme Rezende Guillaume J. Charmes +Guillaume Sottas Günther Noack Guobiao Mei Guoliang Wang @@ -936,6 +995,8 @@ HAMANO Tsukasa Han-Wen Nienhuys Hang Qian Hanjun Kim +Hanlin Shi +Haoran Luo Haosdent Huang Harald Nordgren Hari haran @@ -950,9 +1011,11 @@ Håvard Haugen He Liu Hector Chu Hector Martin Cantero +Hein Khant Zaw Henning Schmiedehausen Henrik Edwards Henrik Hodne +Henrique Vicente Henry Adi Sumarto Henry Bubert Henry Chang @@ -969,6 +1032,7 @@ Hironao OTSUBO Hiroshi Ioka Hitoshi Mitake Holden Huang +Songlin Jiang Hong Ruiqi Hongfei Tan Horacio Duran @@ -990,6 +1054,7 @@ Ian Haken Ian Kent Ian Lance Taylor Ian Leue +Ian Tay Ian Zapolsky Ibrahim AshShohail Icarus Sparry @@ -997,9 +1062,11 @@ Iccha Sethi Idora Shinatose Ignacio Hagopian Igor Bernstein +Igor Bolotnikov Igor Dolzhikov Igor Vashyst Igor Zhilianin +Ikko Ashimine Illya Yalovyy Ilya Sinelnikov Ilya Tocar @@ -1037,6 +1104,7 @@ Jacob Blain Christen Jacob H. Haven Jacob Hoffman-Andrews Jacob Walker +Jaden Teng Jae Kwon Jake B Jakob Borg @@ -1044,6 +1112,7 @@ Jakob Weisblat Jakub Čajka Jakub Kaczmarzyk Jakub Ryszard Czarnowicz +Jakub Warczarek Jamal Carvalho James Aguilar James Bardin @@ -1056,9 +1125,11 @@ James Eady James Fysh James Gray James Hartig +James Kasten James Lawrence James Meneghello James Myers +James Naftel James Neve James Nugent James P. Cooper @@ -1108,6 +1179,7 @@ Javier Kohen Javier Revillas Javier Segura Jay Conrod +Jay Lee Jay Taylor Jay Weisskopf Jean de Klerk @@ -1140,14 +1212,17 @@ Jeremy Jay Jeremy Schlatter Jeroen Bobbeldijk Jeroen Simonetti +Jérôme Doucet Jerrin Shaji George Jess Frazelle Jesse Szwedko Jesús Espino Jia Zhan Jiacai Liu +Jiahao Lu Jianing Yu Jianqiao Li +Jiayu Yi Jie Ma Jihyun Yu Jim Cote @@ -1183,6 +1258,7 @@ Joey Geiger Johan Brandhorst Johan Euphrosine Johan Jansson +Johan Knutzen Johan Sageryd John Asmuth John Beisley @@ -1210,6 +1286,7 @@ Johnny Luo Jon Chen Jon Johnson Jonas Bernoulli +Jonathan Albrecht Jonathan Allie Jonathan Amsterdam Jonathan Boulle @@ -1223,6 +1300,7 @@ Jonathan Pentecost Jonathan Pittman Jonathan Rudenberg Jonathan Stacks +Jonathan Swinney Jonathan Wills Jonathon Lacher Jongmin Kim @@ -1233,6 +1311,7 @@ Jordan Krage Jordan Lewis Jordan Liggitt Jordan Rhee +Jordan Rupprecht Jordi Martin Jorge Araya Jorge L. Fatta @@ -1276,6 +1355,7 @@ Julien Salleyron Julien Schmidt Julio Montes Jun Zhang +Junchen Li Junda Liu Jungho Ahn Junya Hayashi @@ -1287,6 +1367,7 @@ Justin Nuß Justyn Temme Kai Backman Kai Dong +Kai Lüke Kai Trukenmüller Kale Blankenship Kaleb Elwert @@ -1314,6 +1395,7 @@ Kazuhiro Sera KB Sriram Keegan Carruthers-Smith Kei Son +Keiichi Hirobe Keiji Yoshida Keisuke Kishimoto Keith Ball @@ -1322,6 +1404,7 @@ Keith Rarick Kelly Heller Kelsey Hightower Kelvin Foo Chuan Lyi +Kemal Elmizan Ken Friedenbach Ken Rockot Ken Sedgwick @@ -1331,6 +1414,7 @@ Kenji Kaneda Kenji Yano Kenneth Shaw Kenny Grant +Kensei Nakada Kenta Mori Kerollos Magdy Ketan Parmar @@ -1342,10 +1426,12 @@ Kevin Gillette Kevin Kirsche Kevin Klues Kevin Malachowski +Kevin Parsons Kevin Ruffin Kevin Vu Kevin Zita Keyan Pishdadian +Keyuan Li Kezhu Wang Khosrow Moossavi Kieran Colford @@ -1358,6 +1444,7 @@ Kirill Smelkov Kirill Tatchihin Kirk Han Kirklin McDonald +KJ Tsanaktsidis Klaus Post Kodie Goodwin Koichi Shiraishi @@ -1371,6 +1458,7 @@ Kris Kwiatkowski Kris Nova Kris Rousey Kristopher Watts +Krzysztof Dąbrowski Kshitij Saraogi Kun Li Kunpei Sakai @@ -1412,8 +1500,10 @@ Leonardo Comelli Leonel Quinteros Lev Shamardin Lewin Bormann +Lewis Waddicor Liam Haworth Lily Chung +Lingchao Xin Lion Yang Liz Rice Lloyd Dewolf @@ -1427,6 +1517,7 @@ Luan Santos Lubomir I. Ivanov Luca Bruno Luca Greco +Luca Spiller Lucas Bremgartner Lucas Clemente Lucien Stuker @@ -1450,6 +1541,8 @@ Maarten Bezemer Maciej Dębski Madhu Rajanna Magnus Hiie +Mahdi Hosseini Moghaddam +Maia Lee Maicon Costa Mak Kolybabi Maksym Trykur @@ -1470,6 +1563,7 @@ Marcel Edmund Franke Marcel van Lohuizen Marcelo Cantos Marcelo E. Magallon +Marco Gazerro Marco Hennings Marcus Weiner Marcus Willock @@ -1481,6 +1575,7 @@ Marius A. Eriksen Marius Nuennerich Mark Adams Mark Bucciarelli +Mark Dain Mark Glines Mark Harrison Mark Percival @@ -1533,6 +1628,7 @@ Máté Gulyás Matej Baćo Mateus Amin Mateusz Czapliński +Matheus Alcantara Mathias Beke Mathias Hall-Andersen Mathias Leppich @@ -1566,6 +1662,7 @@ Matthew Waters Matthieu Hauglustaine Matthieu Olivier Matthijs Kooijman +Max Drosdo.www Max Riveiro Max Schmitt Max Semenik @@ -1603,6 +1700,7 @@ Michael Hudson-Doyle Michael Kasch Michael Käufl Michael Kelly +Michaël Lévesque-Dion Michael Lewis Michael MacInnis Michael Marineau @@ -1624,6 +1722,7 @@ Michael Teichgräber Michael Traver Michael Vetter Michael Vogt +Michail Kargakis Michal Bohuslávek Michal Cierniak Michał Derkacz @@ -1633,6 +1732,7 @@ Michal Pristas Michal Rostecki Michalis Kargakis Michel Lespinasse +Michele Di Pede Mickael Kerjean Mickey Reiss Miek Gieben @@ -1670,6 +1770,7 @@ Miquel Sabaté Solà Mirko Hansen Miroslav Genov Misty De Meo +Mohamed Attahri Mohit Agarwal Mohit kumar Bajoria Mohit Verma @@ -1683,6 +1784,7 @@ Môshe van der Sterre Mostyn Bramley-Moore Mrunal Patel Muhammad Falak R Wani +Muhammad Hamza Farrukh Muhammed Uluyol Muir Manders Mukesh Sharma @@ -1692,6 +1794,7 @@ Naman Aggarwal Nan Deng Nao Yonashiro Naoki Kanatani +Natanael Copa Nate Wilkinson Nathan Cantelmo Nathan Caza @@ -1708,6 +1811,7 @@ Nathaniel Cook Naveen Kumar Sangi Neeilan Selvalingam Neelesh Chandola +Nehal J Wani Neil Lyons Neuman Vong Neven Sajko @@ -1760,6 +1864,7 @@ Noel Georgi Norberto Lopes Norman B. Lancaster Nuno Cruces +Obei Sideg Obeyda Djeffal Odin Ugedal Oleg Bulatov @@ -1769,12 +1874,17 @@ Oling Cat Oliver Hookins Oliver Powell Oliver Stenbom +Oliver Tan Oliver Tonnhofer Olivier Antoine Olivier Duperray Olivier Poitrey Olivier Saingre +Olivier Wulveryck Omar Jarjur +Onkar Jadhav +Ori Bernstein +Ori Rawlings Oryan Moshe Osamu TONOMORI Özgür Kesim @@ -1798,7 +1908,9 @@ Pat Moroney Patrick Barker Patrick Crosby Patrick Gavlin +Patrick Gundlach Patrick Higgins +Patrick Jones Patrick Lee Patrick Mézard Patrick Mylund Nielsen @@ -1811,6 +1923,9 @@ Paul Borman Paul Boyd Paul Chang Paul D. Weber +Paul Davis <43160081+Pawls@users.noreply.github.com> +Paul E. Murphy +Paul Forgey Paul Hammond Paul Hankin Paul Jolly @@ -1836,7 +1951,9 @@ Pavel Zinovkin Pavlo Sumkin Pawel Knap Pawel Szczur +Paweł Szulik Pei Xian Chee +Pei-Ming Wu Percy Wegmann Perry Abbott Petar Dambovaliev @@ -1876,6 +1993,7 @@ Philip Hofer Philip K. Warren Philip Nelson Philipp Stephani +Phillip Campbell <15082+phillc@users.noreply.github.com> Pierre Carru Pierre Durand Pierre Prinetti @@ -1885,6 +2003,7 @@ Pieter Droogendijk Pietro Gagliardi Piyush Mishra Plekhanov Maxim +Poh Zi How Polina Osadcha Pontus Leitzler Povilas Versockas @@ -1904,14 +2023,17 @@ Quentin Perez Quentin Renard Quentin Smith Quey-Liang Kao +Quim Muntal Quinn Slack Quinten Yearsley Quoc-Viet Nguyen +Radek Simko Radek Sohlich Radu Berinde Rafal Jeczalik Raghavendra Nagaraj Rahul Chaudhry +Rahul Wadhwani Raif S. Naffah Rajat Goel Rajath Agasthya @@ -1935,6 +2057,7 @@ Ren Ogaki Rens Rikkerink Rhys Hiltner Ricardo Padilha +Ricardo Pchevuzinske Katz Ricardo Seriani Richard Barnes Richard Crowley @@ -1991,6 +2114,7 @@ Roman Kollár Roman Shchekin Ron Hashimoto Ron Minnich +Ronnie Ebrin Ross Chater Ross Kinsey Ross Light @@ -2010,6 +2134,7 @@ Ryan Brown Ryan Canty Ryan Dahl Ryan Hitchman +Ryan Kohler Ryan Lower Ryan Roden-Corrent Ryan Seys @@ -2023,7 +2148,9 @@ S.Çağlar Onur Sabin Mihai Rapan Sad Pencil Sai Cheemalapati +Sai Kiran Dasika Sakeven Jiang +Salaheddin M. Mahmud Salmān Aljammāz Sam Arnold Sam Boyer @@ -2033,6 +2160,7 @@ Sam Ding Sam Hug Sam Thorogood Sam Whited +Sam Xie Sameer Ajmani Sami Commerot Sami Pönkänen @@ -2042,6 +2170,7 @@ Samuele Pedroni Sander van Harmelen Sanjay Menakuru Santhosh Kumar Tekuri +Santiago De la Cruz <51337247+xhit@users.noreply.github.com> Sarah Adams Sardorbek Pulatov Sascha Brawer @@ -2062,6 +2191,7 @@ Sean Chittenden Sean Christopherson Sean Dolphin Sean Harger +Sean Hildebrand Sean Liao Sean Rees Sebastiaan van Stijn @@ -2094,10 +2224,12 @@ Serhii Aheienko Seth Hoenig Seth Vargo Shahar Kohanim +Shailesh Suryawanshi Shamil Garatuev Shane Hansen Shang Jian Ding Shaozhen Ding +Shaquille Que Shaquille Wyan Que Shaun Dunning Shawn Elliott @@ -2108,8 +2240,11 @@ Shenghou Ma Shengjing Zhu Shengyu Zhang Shi Han Ng +ShihCheng Tu Shijie Hao +Shin Fan Shinji Tanaka +Shinnosuke Sawada <6warashi9@gmail.com> Shintaro Kaneko Shivakumar GN Shivani Singhal @@ -2121,17 +2256,21 @@ Silvan Jegen Simarpreet Singh Simon Drake Simon Ferquel +Simon Frei Simon Jefford Simon Rawet Simon Rozman +Simon Ser Simon Thulbourn Simon Whitehead Sina Siadat Sjoerd Siebinga Sokolov Yura Song Gao +Songjiayang Soojin Nam Søren L. Hansen +Sparrow Li Spencer Kocot Spencer Nelson Spencer Tung @@ -2140,12 +2279,14 @@ Srdjan Petrovic Sridhar Venkatakrishnan Srinidhi Kaushik StalkR +Stan Hu Stan Schwertly Stanislav Afanasev Steeve Morin Stefan Baebler Stefan Nilsson Stepan Shabalin +Stephan Klatt Stephan Renatus Stephan Zuercher Stéphane Travostino @@ -2163,13 +2304,16 @@ Steve Mynott Steve Newman Steve Phillips Steve Streeting +Steve Traut Steven Buss Steven Elliot Harris Steven Erenst Steven Hartland Steven Littiebrant +Steven Maude Steven Wilkin Stuart Jansen +Subham Sarkar Sue Spence Sugu Sougoumarane Suharsh Sivakumar @@ -2193,6 +2337,7 @@ Taesu Pyo Tai Le Taj Khattra Takashi Matsuo +Takashi Mima Takayoshi Nishida Takeshi YAMANASHI <9.nashi@gmail.com> Takuto Ikuta @@ -2221,6 +2366,7 @@ Thanatat Tamtan The Hatsune Daishi Thiago Avelino Thiago Fransosi Farina +Thom Wiggers Thomas Alan Copeland Thomas Bonfort Thomas Bouldin @@ -2245,6 +2391,7 @@ Tim Ebringer Tim Heckman Tim Henderson Tim Hockin +Tim King Tim Möhlmann Tim Swast Tim Wright @@ -2252,8 +2399,10 @@ Tim Xu Timmy Douglas Timo Savola Timo Truyts +Timothy Gu Timothy Studd Tipp Moseley +Tiwei Bie Tobias Assarsson Tobias Columbus Tobias Klauser @@ -2268,11 +2417,13 @@ Tom Lanyon Tom Levy Tom Limoncelli Tom Linford +Tom Panton Tom Parkin Tom Payne Tom Szymanski Tom Thorogood Tom Wilkie +Tom Zierbock Tomas Dabasinskas Tommy Schaefer Tomohiro Kusumoto @@ -2298,6 +2449,7 @@ Tristan Colgate Tristan Ooohry Tristan Rice Troels Thomsen +Trong Bui Trung Nguyen Tsuji Daishiro Tudor Golubenco @@ -2308,6 +2460,7 @@ Tyler Bunnell Tyler Treat Tyson Andre Tzach Shabtay +Tzu-Chiao Yeh Tzu-Jung Lee Udalov Max Ugorji Nwoke @@ -2316,6 +2469,7 @@ Ulrich Kunitz Umang Parmar Uriel Mangado Urvil Patel +Utkarsh Dixit <53217283+utkarsh-extc@users.noreply.github.com> Uttam C Pawar Vadim Grek Vadim Vygonets @@ -2327,6 +2481,7 @@ Venil Noronha Veselkov Konstantin Viacheslav Poturaev Victor Chudnovsky +Victor Michel Victor Vrantchan Vignesh Ramachandra Vikas Kedia @@ -2341,6 +2496,7 @@ Visweswara R Vitaly Zdanevich Vitor De Mario Vivek Sekhar +Vivek V Vivian Liang Vlad Krasnov Vladimir Evgrafov @@ -2392,6 +2548,7 @@ Wu Yunzhou Xi Ruoyao Xia Bin Xiangdong Ji +Xiaodong Liu Xing Xing Xingqang Bai Xu Fei @@ -2459,6 +2616,7 @@ Zhou Peng Ziad Hatahet Ziheng Liu Zorion Arrizabalaga +Zyad A. Ali Максадбек Ахмедов Максим Федосеев Роман Хавроненко -- GitLab From ff0e93ea313e53f08018b90bada2edee267a8f55 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 11 Feb 2021 16:24:26 -0500 Subject: [PATCH 1748/1792] doc/go1.16: note that package path elements beginning with '.' are disallowed For #43985 Change-Id: I1a16f66800c5c648703f0a0d2ad75024525a710f Reviewed-on: https://go-review.googlesource.com/c/go/+/291389 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Jay Conrod --- doc/go1.16.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index f6f72c3882..d5de0ee5ce 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -174,10 +174,12 @@ Do not send CLs removing the interior tags from such phrases. non-reproducible builds.

    -

    - The go command now disallows non-ASCII import paths in module - mode. Non-ASCII module paths have already been disallowed so this change - affects module subdirectory paths that contain non-ASCII characters. +

    + In module mode, the go command now disallows import paths that + include non-ASCII characters or path elements with a leading dot character + (.). Module paths with these characters were already disallowed + (see Module paths and versions), + so this change affects only paths within module subdirectories.

    Embedding Files

    -- GitLab From 66c27093d0df8be8a75b1ae35fe4ab2003fe028e Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Sat, 13 Feb 2021 02:45:51 +0000 Subject: [PATCH 1749/1792] cmd/link: fix typo in link_test.go specfic -> specific Change-Id: Icad0f70c77c866a1031a2929b90fef61fe92aaee GitHub-Last-Rev: f66b56491c0125f58c47f7f39410e0aeef2539be GitHub-Pull-Request: golang/go#44246 Reviewed-on: https://go-review.googlesource.com/c/go/+/291829 Reviewed-by: Ian Lance Taylor Trust: Matthew Dempsky --- src/cmd/link/link_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 8153c0b31b..08ddd00a0c 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -583,7 +583,7 @@ TEXT ·alignPc(SB),NOSPLIT, $0-0 ` // TestFuncAlign verifies that the address of a function can be aligned -// with a specfic value on arm64. +// with a specific value on arm64. func TestFuncAlign(t *testing.T) { if runtime.GOARCH != "arm64" || runtime.GOOS != "linux" { t.Skip("skipping on non-linux/arm64 platform") -- GitLab From 852ce7c2125ef7d59a24facc2b6c3df30d7f730d Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Sun, 14 Feb 2021 13:22:15 +1100 Subject: [PATCH 1750/1792] cmd/go: provide a more helpful suggestion for "go vet -?" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For the command go vet -? the output was, usage: go vet [-n] [-x] [-vettool prog] [build flags] [vet flags] [packages] Run 'go help vet' for details. Run 'go tool vet -help' for the vet tool's flags. but "go help vet" is perfunctory at best. (That's another issue I'm working on—see https://go-review.googlesource.com/c/tools/+/291909— but vendoring is required to sort that out.) Add another line and rewrite a bit to make it actually helpful: usage: go vet [-n] [-x] [-vettool prog] [build flags] [vet flags] [packages] Run 'go help vet' for details. Run 'go tool vet help' for a full list of flags and analyzers. Run 'go tool vet -help' for an overview. Change-Id: I9d8580f0573321a57d55875ac3185988ce3eaf64 Reviewed-on: https://go-review.googlesource.com/c/go/+/291929 Trust: Rob Pike Run-TryBot: Rob Pike TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/vet/vetflag.go | 3 ++- src/cmd/go/testdata/script/help.txt | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/cmd/go/internal/vet/vetflag.go b/src/cmd/go/internal/vet/vetflag.go index 5bf5cf4446..b5b3c462ff 100644 --- a/src/cmd/go/internal/vet/vetflag.go +++ b/src/cmd/go/internal/vet/vetflag.go @@ -184,7 +184,8 @@ func exitWithUsage() { if vetTool != "" { cmd = vetTool } - fmt.Fprintf(os.Stderr, "Run '%s -help' for the vet tool's flags.\n", cmd) + fmt.Fprintf(os.Stderr, "Run '%s help' for a full list of flags and analyzers.\n", cmd) + fmt.Fprintf(os.Stderr, "Run '%s -help' for an overview.\n", cmd) base.SetExitStatus(2) base.Exit() diff --git a/src/cmd/go/testdata/script/help.txt b/src/cmd/go/testdata/script/help.txt index 9752ede2e3..26a0194be5 100644 --- a/src/cmd/go/testdata/script/help.txt +++ b/src/cmd/go/testdata/script/help.txt @@ -34,9 +34,10 @@ stderr 'Run ''go help mod'' for usage.' # Earlier versions of Go printed the same as 'go -h' here. # Also make sure we print the short help line. ! go vet -h -stderr 'usage: go vet' -stderr 'Run ''go help vet'' for details' -stderr 'Run ''go tool vet -help'' for the vet tool''s flags' +stderr 'usage: go vet .*' +stderr 'Run ''go help vet'' for details.' +stderr 'Run ''go tool vet help'' for a full list of flags and analyzers.' +stderr 'Run ''go tool vet -help'' for an overview.' # Earlier versions of Go printed a large document here, instead of these two # lines. -- GitLab From 33d72fd4122a4b7e31e738d5d9283093966ec14a Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sun, 14 Feb 2021 17:21:56 -0800 Subject: [PATCH 1751/1792] doc/faq: update generics entry to reflect accepted proposal For #43651 Change-Id: Idb511f4c759d9a77de289938c19c2c1d4a542a17 Reviewed-on: https://go-review.googlesource.com/c/go/+/291990 Trust: Ian Lance Taylor Reviewed-by: Rob Pike --- doc/go_faq.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/go_faq.html b/doc/go_faq.html index 23a3080c9b..67dc0b9bd4 100644 --- a/doc/go_faq.html +++ b/doc/go_faq.html @@ -446,8 +446,10 @@ they compensate in interesting ways for the lack of X.

    Why does Go not have generic types?

    -Generics may well be added at some point. We don't feel an urgency for -them, although we understand some programmers do. +A language proposal +implementing a form of generic types has been accepted for +inclusion in the language. +If all goes well it will be available in the Go 1.18 release.

    -- GitLab From 30641e36aa5b547eee48565caa3078b0a2e7c185 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sun, 14 Feb 2021 17:14:41 -0800 Subject: [PATCH 1752/1792] internal/poll: if copy_file_range returns 0, assume it failed On current Linux kernels copy_file_range does not correctly handle files in certain special file systems, such as /proc. For those file systems it fails to copy any data and returns zero. This breaks Go's io.Copy for those files. Fix the problem by assuming that if copy_file_range returns 0 the first time it is called on a file, that that file is not supported. In that case fall back to just using read. This will force an extra system call when using io.Copy to copy a zero-sized normal file, but at least it will work correctly. For #36817 Fixes #44272 Change-Id: I02e81872cb70fda0ce5485e2ea712f219132e614 Reviewed-on: https://go-review.googlesource.com/c/go/+/291989 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Russ Cox --- src/internal/poll/copy_file_range_linux.go | 10 ++++++- src/os/readfrom_linux_test.go | 32 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/internal/poll/copy_file_range_linux.go b/src/internal/poll/copy_file_range_linux.go index fc34aef4cb..01b242a4ea 100644 --- a/src/internal/poll/copy_file_range_linux.go +++ b/src/internal/poll/copy_file_range_linux.go @@ -112,7 +112,15 @@ func CopyFileRange(dst, src *FD, remain int64) (written int64, handled bool, err return 0, false, nil case nil: if n == 0 { - // src is at EOF, which means we are done. + // If we did not read any bytes at all, + // then this file may be in a file system + // where copy_file_range silently fails. + // https://lore.kernel.org/linux-fsdevel/20210126233840.GG4626@dread.disaster.area/T/#m05753578c7f7882f6e9ffe01f981bc223edef2b0 + if written == 0 { + return 0, false, nil + } + // Otherwise src is at EOF, which means + // we are done. return written, true, nil } remain -= n diff --git a/src/os/readfrom_linux_test.go b/src/os/readfrom_linux_test.go index 37047175e6..1d145dadb0 100644 --- a/src/os/readfrom_linux_test.go +++ b/src/os/readfrom_linux_test.go @@ -361,3 +361,35 @@ func (h *copyFileRangeHook) install() { func (h *copyFileRangeHook) uninstall() { *PollCopyFileRangeP = h.original } + +// On some kernels copy_file_range fails on files in /proc. +func TestProcCopy(t *testing.T) { + const cmdlineFile = "/proc/self/cmdline" + cmdline, err := os.ReadFile(cmdlineFile) + if err != nil { + t.Skipf("can't read /proc file: %v", err) + } + in, err := os.Open(cmdlineFile) + if err != nil { + t.Fatal(err) + } + defer in.Close() + outFile := filepath.Join(t.TempDir(), "cmdline") + out, err := os.Create(outFile) + if err != nil { + t.Fatal(err) + } + if _, err := io.Copy(out, in); err != nil { + t.Fatal(err) + } + if err := out.Close(); err != nil { + t.Fatal(err) + } + copy, err := os.ReadFile(outFile) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(cmdline, copy) { + t.Errorf("copy of %q got %q want %q\n", cmdlineFile, copy, cmdline) + } +} -- GitLab From 626ef0812739ac7bb527dbdf4b0ed3a436c90901 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 12 Feb 2021 16:02:12 -0500 Subject: [PATCH 1753/1792] doc: remove install.html and install-source.html These live in x/website/content/doc now. The copies here just attract edits that have no actual effect. For #40496. For #41861. Change-Id: I2fdd7375e373949eb9a88f4cdca440b6a5d45eea Reviewed-on: https://go-review.googlesource.com/c/go/+/291709 Trust: Russ Cox Reviewed-by: Dmitri Shuralyov --- README.md | 10 +- doc/install-source.html | 777 ---------------------------------------- doc/install.html | 315 ---------------- 3 files changed, 4 insertions(+), 1098 deletions(-) delete mode 100644 doc/install-source.html delete mode 100644 doc/install.html diff --git a/README.md b/README.md index 49231bf25d..4ca3956de8 100644 --- a/README.md +++ b/README.md @@ -19,22 +19,20 @@ BSD-style license found in the LICENSE file. Official binary distributions are available at https://golang.org/dl/. After downloading a binary release, visit https://golang.org/doc/install -or load [doc/install.html](./doc/install.html) in your web browser for installation -instructions. +for installation instructions. #### Install From Source If a binary distribution is not available for your combination of operating system and architecture, visit -https://golang.org/doc/install/source or load [doc/install-source.html](./doc/install-source.html) -in your web browser for source installation instructions. +https://golang.org/doc/install/source +for source installation instructions. ### Contributing Go is the work of thousands of contributors. We appreciate your help! -To contribute, please read the contribution guidelines: - https://golang.org/doc/contribute.html +To contribute, please read the contribution guidelines at https://golang.org/doc/contribute.html. Note that the Go project uses the issue tracker for bug reports and proposals only. See https://golang.org/wiki/Questions for a list of diff --git a/doc/install-source.html b/doc/install-source.html deleted file mode 100644 index f0a909263c..0000000000 --- a/doc/install-source.html +++ /dev/null @@ -1,777 +0,0 @@ - - -

    Introduction

    - -

    -Go is an open source project, distributed under a -BSD-style license. -This document explains how to check out the sources, -build them on your own machine, and run them. -

    - -

    -Most users don't need to do this, and will instead install -from precompiled binary packages as described in -Getting Started, -a much simpler process. -If you want to help develop what goes into those precompiled -packages, though, read on. -

    - -
    - -

    -There are two official Go compiler toolchains. -This document focuses on the gc Go -compiler and tools. -For information on how to work on gccgo, a more traditional -compiler using the GCC back end, see -Setting up and using gccgo. -

    - -

    -The Go compilers support the following instruction sets: - -

    -
    - amd64, 386 -
    -
    - The x86 instruction set, 64- and 32-bit. -
    -
    - arm64, arm -
    -
    - The ARM instruction set, 64-bit (AArch64) and 32-bit. -
    -
    - mips64, mips64le, mips, mipsle -
    -
    - The MIPS instruction set, big- and little-endian, 64- and 32-bit. -
    -
    - ppc64, ppc64le -
    -
    - The 64-bit PowerPC instruction set, big- and little-endian. -
    -
    - riscv64 -
    -
    - The 64-bit RISC-V instruction set. -
    -
    - s390x -
    -
    - The IBM z/Architecture. -
    -
    - wasm -
    -
    - WebAssembly. -
    -
    -

    - -

    -The compilers can target the AIX, Android, DragonFly BSD, FreeBSD, -Illumos, Linux, macOS/iOS (Darwin), NetBSD, OpenBSD, Plan 9, Solaris, -and Windows operating systems (although not all operating systems -support all architectures). -

    - -

    -A list of ports which are considered "first class" is available at the -first class ports -wiki page. -

    - -

    -The full set of supported combinations is listed in the -discussion of environment variables below. -

    - -

    -See the main installation page for the overall system requirements. -The following additional constraints apply to systems that can be built only from source: -

    - -
      -
    • For Linux on PowerPC 64-bit, the minimum supported kernel version is 2.6.37, meaning that -Go does not support CentOS 6 on these systems. -
    • -
    - -
    - -

    Install Go compiler binaries for bootstrap

    - -

    -The Go toolchain is written in Go. To build it, you need a Go compiler installed. -The scripts that do the initial build of the tools look for a "go" command -in $PATH, so as long as you have Go installed in your -system and configured in your $PATH, you are ready to build Go -from source. -Or if you prefer you can set $GOROOT_BOOTSTRAP to the -root of a Go installation to use to build the new Go toolchain; -$GOROOT_BOOTSTRAP/bin/go should be the go command to use.

    - -

    -There are four possible ways to obtain a bootstrap toolchain: -

    - -
      -
    • Download a recent binary release of Go. -
    • Cross-compile a toolchain using a system with a working Go installation. -
    • Use gccgo. -
    • Compile a toolchain from Go 1.4, the last Go release with a compiler written in C. -
    - -

    -These approaches are detailed below. -

    - -

    Bootstrap toolchain from binary release

    - -

    -To use a binary release as a bootstrap toolchain, see -the downloads page or use any other -packaged Go distribution. -

    - -

    Bootstrap toolchain from cross-compiled source

    - -

    -To cross-compile a bootstrap toolchain from source, which is -necessary on systems Go 1.4 did not target (for -example, linux/ppc64le), install Go on a different system -and run bootstrap.bash. -

    - -

    -When run as (for example) -

    - -
    -$ GOOS=linux GOARCH=ppc64 ./bootstrap.bash
    -
    - -

    -bootstrap.bash cross-compiles a toolchain for that GOOS/GOARCH -combination, leaving the resulting tree in ../../go-${GOOS}-${GOARCH}-bootstrap. -That tree can be copied to a machine of the given target type -and used as GOROOT_BOOTSTRAP to bootstrap a local build. -

    - -

    Bootstrap toolchain using gccgo

    - -

    -To use gccgo as the bootstrap toolchain, you need to arrange -for $GOROOT_BOOTSTRAP/bin/go to be the go tool that comes -as part of gccgo 5. For example on Ubuntu Vivid: -

    - -
    -$ sudo apt-get install gccgo-5
    -$ sudo update-alternatives --set go /usr/bin/go-5
    -$ GOROOT_BOOTSTRAP=/usr ./make.bash
    -
    - -

    Bootstrap toolchain from C source code

    - -

    -To build a bootstrap toolchain from C source code, use -either the git branch release-branch.go1.4 or -go1.4-bootstrap-20171003.tar.gz, -which contains the Go 1.4 source code plus accumulated fixes -to keep the tools running on newer operating systems. -(Go 1.4 was the last distribution in which the toolchain was written in C.) -After unpacking the Go 1.4 source, cd to -the src subdirectory, set CGO_ENABLED=0 in -the environment, and run make.bash (or, -on Windows, make.bat). -

    - -

    -Once the Go 1.4 source has been unpacked into your GOROOT_BOOTSTRAP directory, -you must keep this git clone instance checked out to branch -release-branch.go1.4. Specifically, do not attempt to reuse -this git clone in the later step named "Fetch the repository." The go1.4 -bootstrap toolchain must be able to properly traverse the go1.4 sources -that it assumes are present under this repository root. -

    - -

    -Note that Go 1.4 does not run on all systems that later versions of Go do. -In particular, Go 1.4 does not support current versions of macOS. -On such systems, the bootstrap toolchain must be obtained using one of the other methods. -

    - -

    Install Git, if needed

    - -

    -To perform the next step you must have Git installed. (Check that you -have a git command before proceeding.) -

    - -

    -If you do not have a working Git installation, -follow the instructions on the -Git downloads page. -

    - -

    (Optional) Install a C compiler

    - -

    -To build a Go installation -with cgo support, which permits Go -programs to import C libraries, a C compiler such as gcc -or clang must be installed first. Do this using whatever -installation method is standard on the system. -

    - -

    -To build without cgo, set the environment variable -CGO_ENABLED=0 before running all.bash or -make.bash. -

    - -

    Fetch the repository

    - -

    Change to the directory where you intend to install Go, and make sure -the goroot directory does not exist. Then clone the repository -and check out the latest release tag (go1.12, -for example):

    - -
    -$ git clone https://go.googlesource.com/go goroot
    -$ cd goroot
    -$ git checkout <tag>
    -
    - -

    -Where <tag> is the version string of the release. -

    - -

    Go will be installed in the directory where it is checked out. For example, -if Go is checked out in $HOME/goroot, executables will be installed -in $HOME/goroot/bin. The directory may have any name, but note -that if Go is checked out in $HOME/go, it will conflict with -the default location of $GOPATH. -See GOPATH below.

    - -

    -Reminder: If you opted to also compile the bootstrap binaries from source (in an -earlier section), you still need to git clone again at this point -(to checkout the latest <tag>), because you must keep your -go1.4 repository distinct. -

    - - - -

    If you intend to modify the go source code, and -contribute your changes -to the project, then move your repository -off the release branch, and onto the master (development) branch. -Otherwise, skip this step.

    - -
    -$ git checkout master
    -
    - -

    Install Go

    - -

    -To build the Go distribution, run -

    - -
    -$ cd src
    -$ ./all.bash
    -
    - -

    -(To build under Windows use all.bat.) -

    - -

    -If all goes well, it will finish by printing output like: -

    - -
    -ALL TESTS PASSED
    -
    ----
    -Installed Go for linux/amd64 in /home/you/go.
    -Installed commands in /home/you/go/bin.
    -*** You need to add /home/you/go/bin to your $PATH. ***
    -
    - -

    -where the details on the last few lines reflect the operating system, -architecture, and root directory used during the install. -

    - -
    -

    -For more information about ways to control the build, see the discussion of -environment variables below. -all.bash (or all.bat) runs important tests for Go, -which can take more time than simply building Go. If you do not want to run -the test suite use make.bash (or make.bat) -instead. -

    -
    - - -

    Testing your installation

    - -

    -Check that Go is installed correctly by building a simple program. -

    - -

    -Create a file named hello.go and put the following program in it: -

    - -
    -package main
    -
    -import "fmt"
    -
    -func main() {
    -	fmt.Printf("hello, world\n")
    -}
    -
    - -

    -Then run it with the go tool: -

    - -
    -$ go run hello.go
    -hello, world
    -
    - -

    -If you see the "hello, world" message then Go is installed correctly. -

    - -

    Set up your work environment

    - -

    -You're almost done. -You just need to do a little more setup. -

    - -

    - -How to Write Go Code -Learn how to set up and use the Go tools - -

    - -

    -The How to Write Go Code document -provides essential setup instructions for using the Go tools. -

    - - -

    Install additional tools

    - -

    -The source code for several Go tools (including godoc) -is kept in the go.tools repository. -To install one of the tools (godoc in this case): -

    - -
    -$ go get golang.org/x/tools/cmd/godoc
    -
    - -

    -To install these tools, the go get command requires -that Git be installed locally. -

    - -

    -You must also have a workspace (GOPATH) set up; -see How to Write Go Code for the details. -

    - -

    Community resources

    - -

    -The usual community resources such as -#go-nuts on the Freenode IRC server -and the -Go Nuts -mailing list have active developers that can help you with problems -with your installation or your development work. -For those who wish to keep up to date, -there is another mailing list, golang-checkins, -that receives a message summarizing each checkin to the Go repository. -

    - -

    -Bugs can be reported using the Go issue tracker. -

    - - -

    Keeping up with releases

    - -

    -New releases are announced on the -golang-announce -mailing list. -Each announcement mentions the latest release tag, for instance, -go1.9. -

    - -

    -To update an existing tree to the latest release, you can run: -

    - -
    -$ cd go/src
    -$ git fetch
    -$ git checkout <tag>
    -$ ./all.bash
    -
    - -

    -Where <tag> is the version string of the release. -

    - - -

    Optional environment variables

    - -

    -The Go compilation environment can be customized by environment variables. -None is required by the build, but you may wish to set some -to override the defaults. -

    - -
      -
    • $GOROOT -

      -The root of the Go tree, often $HOME/go1.X. -Its value is built into the tree when it is compiled, and -defaults to the parent of the directory where all.bash was run. -There is no need to set this unless you want to switch between multiple -local copies of the repository. -

      -
    • - -
    • $GOROOT_FINAL -

      -The value assumed by installed binaries and scripts when -$GOROOT is not set explicitly. -It defaults to the value of $GOROOT. -If you want to build the Go tree in one location -but move it elsewhere after the build, set -$GOROOT_FINAL to the eventual location. -

      -
    • - -
    • $GOPATH -

      -The directory where Go projects outside the Go distribution are typically -checked out. For example, golang.org/x/tools might be checked out -to $GOPATH/src/golang.org/x/tools. Executables outside the -Go distribution are installed in $GOPATH/bin (or -$GOBIN, if set). Modules are downloaded and cached in -$GOPATH/pkg/mod. -

      - -

      The default location of $GOPATH is $HOME/go, -and it's not usually necessary to set GOPATH explicitly. However, -if you have checked out the Go distribution to $HOME/go, -you must set GOPATH to another location to avoid conflicts. -

      -
    • - -
    • $GOBIN -

      -The directory where executables outside the Go distribution are installed -using the go command. For example, -go get golang.org/x/tools/cmd/godoc downloads, builds, and -installs $GOBIN/godoc. By default, $GOBIN is -$GOPATH/bin (or $HOME/go/bin if GOPATH -is not set). After installing, you will want to add this directory to -your $PATH so you can use installed tools. -

      - -

      -Note that the Go distribution's executables are installed in -$GOROOT/bin (for executables invoked by people) or -$GOTOOLDIR (for executables invoked by the go command; -defaults to $GOROOT/pkg/$GOOS_GOARCH) instead of -$GOBIN. -

      -
    • - -
    • $GOOS and $GOARCH -

      -The name of the target operating system and compilation architecture. -These default to the values of $GOHOSTOS and -$GOHOSTARCH respectively (described below). -

    • - -

      -Choices for $GOOS are -android, darwin, dragonfly, -freebsd, illumos, ios, js, -linux, netbsd, openbsd, -plan9, solaris and windows. -

      - -

      -Choices for $GOARCH are -amd64 (64-bit x86, the most mature port), -386 (32-bit x86), arm (32-bit ARM), arm64 (64-bit ARM), -ppc64le (PowerPC 64-bit, little-endian), ppc64 (PowerPC 64-bit, big-endian), -mips64le (MIPS 64-bit, little-endian), mips64 (MIPS 64-bit, big-endian), -mipsle (MIPS 32-bit, little-endian), mips (MIPS 32-bit, big-endian), -s390x (IBM System z 64-bit, big-endian), and -wasm (WebAssembly 32-bit). -

      - -

      -The valid combinations of $GOOS and $GOARCH are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      $GOOS $GOARCH
      aix ppc64
      android 386
      android amd64
      android arm
      android arm64
      darwin amd64
      darwin arm64
      dragonfly amd64
      freebsd 386
      freebsd amd64
      freebsd arm
      illumos amd64
      ios arm64
      js wasm
      linux 386
      linux amd64
      linux arm
      linux arm64
      linux ppc64
      linux ppc64le
      linux mips
      linux mipsle
      linux mips64
      linux mips64le
      linux riscv64
      linux s390x
      netbsd 386
      netbsd amd64
      netbsd arm
      openbsd 386
      openbsd amd64
      openbsd arm
      openbsd arm64
      plan9 386
      plan9 amd64
      plan9 arm
      solaris amd64
      windows 386
      windows amd64
      -
      - -

    • $GOHOSTOS and $GOHOSTARCH -

      -The name of the host operating system and compilation architecture. -These default to the local system's operating system and -architecture. -

      -
    • - -

      -Valid choices are the same as for $GOOS and -$GOARCH, listed above. -The specified values must be compatible with the local system. -For example, you should not set $GOHOSTARCH to -arm on an x86 system. -

      - -
    • $GO386 (for 386 only, defaults to sse2) -

      -This variable controls how gc implements floating point computations. -

      -
        -
      • GO386=softfloat: use software floating point operations; should support all x86 chips (Pentium MMX or later).
      • -
      • GO386=sse2: use SSE2 for floating point operations; has better performance but only available on Pentium 4/Opteron/Athlon 64 or later.
      • -
      -
    • - -
    • $GOARM (for arm only; default is auto-detected if building -on the target processor, 6 if not) -

      -This sets the ARM floating point co-processor architecture version the run-time -should target. If you are compiling on the target system, its value will be auto-detected. -

      -
        -
      • GOARM=5: use software floating point; when CPU doesn't have VFP co-processor
      • -
      • GOARM=6: use VFPv1 only; default if cross compiling; usually ARM11 or better cores (VFPv2 or better is also supported)
      • -
      • GOARM=7: use VFPv3; usually Cortex-A cores
      • -
      -

      -If in doubt, leave this variable unset, and adjust it if required -when you first run the Go executable. -The GoARM page -on the Go community wiki -contains further details regarding Go's ARM support. -

      -
    • - -
    • $GOMIPS (for mips and mipsle only)
      $GOMIPS64 (for mips64 and mips64le only) -

      - These variables set whether to use floating point instructions. Set to "hardfloat" to use floating point instructions; this is the default. Set to "softfloat" to use soft floating point. -

      -
    • - -
    • $GOPPC64 (for ppc64 and ppc64le only) -

      -This variable sets the processor level (i.e. Instruction Set Architecture version) -for which the compiler will target. The default is power8. -

      -
        -
      • GOPPC64=power8: generate ISA v2.07 instructions
      • -
      • GOPPC64=power9: generate ISA v3.00 instructions
      • -
      -
    • - - -
    • $GOWASM (for wasm only) -

      - This variable is a comma separated list of experimental WebAssembly features that the compiled WebAssembly binary is allowed to use. - The default is to use no experimental features. -

      - -
    • - -
    - -

    -Note that $GOARCH and $GOOS identify the -target environment, not the environment you are running on. -In effect, you are always cross-compiling. -By architecture, we mean the kind of binaries -that the target environment can run: -an x86-64 system running a 32-bit-only operating system -must set GOARCH to 386, -not amd64. -

    - -

    -If you choose to override the defaults, -set these variables in your shell profile ($HOME/.bashrc, -$HOME/.profile, or equivalent). The settings might look -something like this: -

    - -
    -export GOARCH=amd64
    -export GOOS=linux
    -
    - -

    -although, to reiterate, none of these variables needs to be set to build, -install, and develop the Go tree. -

    diff --git a/doc/install.html b/doc/install.html deleted file mode 100644 index 706d66c007..0000000000 --- a/doc/install.html +++ /dev/null @@ -1,315 +0,0 @@ - - -
    - -

    Download the Go distribution

    - -

    - -Download Go -Click here to visit the downloads page - -

    - -

    -Official binary -distributions are available for the FreeBSD (release 10-STABLE and above), -Linux, macOS (10.11 and above), and Windows operating systems and -the 32-bit (386) and 64-bit (amd64) x86 processor -architectures. -

    - -

    -If a binary distribution is not available for your combination of operating -system and architecture, try -installing from source or -installing gccgo instead of gc. -

    - - -

    System requirements

    - -

    -Go binary distributions are available for these supported operating systems and architectures. -Please ensure your system meets these requirements before proceeding. -If your OS or architecture is not on the list, you may be able to -install from source or -use gccgo instead. -

    - - - - - - - - - - - - -
    Operating systemArchitecturesNotes

    FreeBSD 10.3 or later amd64, 386 Debian GNU/kFreeBSD not supported
    Linux 2.6.23 or later with glibc amd64, 386, arm, arm64,
    s390x, ppc64le
    CentOS/RHEL 5.x not supported.
    Install from source for other libc.
    macOS 10.11 or later amd64 use the clang or gcc that comes with Xcode for cgo support
    Windows 7, Server 2008R2 or later amd64, 386 use MinGW (386) or MinGW-W64 (amd64) gcc.
    No need for cygwin or msys.
    - -

    -A C compiler is required only if you plan to use -cgo.
    -You only need to install the command line tools for -Xcode. If you have already -installed Xcode 4.3+, you can install it from the Components tab of the -Downloads preferences panel. -

    - -
    - - -

    Install the Go tools

    - -

    -If you are upgrading from an older version of Go you must -first remove the existing version. -

    - -
    - -

    Linux, macOS, and FreeBSD tarballs

    - -

    -Download the archive -and extract it into /usr/local, creating a Go tree in -/usr/local/go. For example: -

    - -
    -tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
    -
    - -

    -Choose the archive file appropriate for your installation. -For instance, if you are installing Go version 1.2.1 for 64-bit x86 on Linux, -the archive you want is called go1.2.1.linux-amd64.tar.gz. -

    - -

    -(Typically these commands must be run as root or through sudo.) -

    - -

    -Add /usr/local/go/bin to the PATH environment -variable. You can do this by adding this line to your /etc/profile -(for a system-wide installation) or $HOME/.profile: -

    - -
    -export PATH=$PATH:/usr/local/go/bin
    -
    - -

    -Note: changes made to a profile file may not apply until the -next time you log into your computer. -To apply the changes immediately, just run the shell commands directly -or execute them from the profile using a command such as -source $HOME/.profile. -

    - -
    - -
    - -

    macOS package installer

    - -

    -Download the package file, -open it, and follow the prompts to install the Go tools. -The package installs the Go distribution to /usr/local/go. -

    - -

    -The package should put the /usr/local/go/bin directory in your -PATH environment variable. You may need to restart any open -Terminal sessions for the change to take effect. -

    - -
    - -
    - -

    Windows

    - -

    -The Go project provides two installation options for Windows users -(besides installing from source): -a zip archive that requires you to set some environment variables and an -MSI installer that configures your installation automatically. -

    - -
    - -

    MSI installer

    - -

    -Open the MSI file -and follow the prompts to install the Go tools. -By default, the installer puts the Go distribution in c:\Go. -

    - -

    -The installer should put the c:\Go\bin directory in your -PATH environment variable. You may need to restart any open -command prompts for the change to take effect. -

    - -
    - -
    - -

    Zip archive

    - -

    -Download the zip file and extract it into the directory of your choice (we suggest c:\Go). -

    - -

    -Add the bin subdirectory of your Go root (for example, c:\Go\bin) to your PATH environment variable. -

    - -
    - -

    Setting environment variables under Windows

    - -

    -Under Windows, you may set environment variables through the "Environment -Variables" button on the "Advanced" tab of the "System" control panel. Some -versions of Windows provide this control panel through the "Advanced System -Settings" option inside the "System" control panel. -

    - -
    - - -

    Test your installation

    - -

    -Check that Go is installed correctly by building a simple program, as follows. -

    - -

    -Create a file named hello.go that looks like: -

    - -
    -package main
    -
    -import "fmt"
    -
    -func main() {
    -	fmt.Printf("hello, world\n")
    -}
    -
    - -

    -Then build it with the go tool: -

    - -
    -$ go build hello.go
    -
    - -
    -C:\Users\Gopher\go\src\hello> go build hello.go
    -
    - -

    -The command above will build an executable named -hellohello.exe -in the current directory alongside your source code. -Execute it to see the greeting: -

    - -
    -$ ./hello
    -hello, world
    -
    - -
    -C:\Users\Gopher\go\src\hello> hello
    -hello, world
    -
    - -

    -If you see the "hello, world" message then your Go installation is working. -

    - -

    -Before rushing off to write Go code please read the -How to Write Go Code document, -which describes some essential concepts about using the Go tools. -

    - - -

    Installing extra Go versions

    - -

    -It may be useful to have multiple Go versions installed on the same machine, for -example, to ensure that a package's tests pass on multiple Go versions. -Once you have one Go version installed, you can install another (such as 1.10.7) -as follows: -

    - -
    -$ go get golang.org/dl/go1.10.7
    -$ go1.10.7 download
    -
    - -

    -The newly downloaded version can be used like go: -

    - -
    -$ go1.10.7 version
    -go version go1.10.7 linux/amd64
    -
    - -

    -All Go versions available via this method are listed on -the download page. -You can find where each of these extra Go versions is installed by looking -at its GOROOT; for example, go1.10.7 env GOROOT. -To uninstall a downloaded version, just remove its GOROOT directory -and the goX.Y.Z binary. -

    - - -

    Uninstalling Go

    - -

    -To remove an existing Go installation from your system delete the -go directory. This is usually /usr/local/go -under Linux, macOS, and FreeBSD or c:\Go -under Windows. -

    - -

    -You should also remove the Go bin directory from your -PATH environment variable. -Under Linux and FreeBSD you should edit /etc/profile or -$HOME/.profile. -If you installed Go with the macOS package then you -should remove the /etc/paths.d/go file. -Windows users should read the section about setting -environment variables under Windows. -

    - - -

    Getting help

    - -

    - For help, see the list of Go mailing lists, forums, and places to chat. -

    - -

    - Report bugs either by running “go bug”, or - manually at the Go issue tracker. -

    -- GitLab From 0cb3415154ff354b42db1d65073e9be71abcc970 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 12 Feb 2021 16:16:25 -0500 Subject: [PATCH 1754/1792] doc: remove all docs not tied to distribution They have moved to x/website in CL 291693. The docs that are left are the ones that are edited at the same time as development in this repository and are tied to the specific version of Go being developed. Those are: - the language spec - the memory model - the assembler manual - the current release's release notes Change-Id: I437c4d33ada1b1716b1919c3c939c2cacf407e83 Reviewed-on: https://go-review.googlesource.com/c/go/+/291711 Trust: Russ Cox Trust: Dmitri Shuralyov Reviewed-by: Dmitri Shuralyov --- doc/articles/go_command.html | 254 -- doc/articles/index.html | 8 - doc/articles/race_detector.html | 440 --- doc/articles/wiki/edit.html | 6 - doc/articles/wiki/final-noclosure.go | 105 - doc/articles/wiki/final-noerror.go | 56 - doc/articles/wiki/final-parsetemplate.go | 94 - doc/articles/wiki/final-template.go | 68 - doc/articles/wiki/final.go | 92 - doc/articles/wiki/final_test.go | 24 - doc/articles/wiki/go.mod | 3 - doc/articles/wiki/http-sample.go | 18 - doc/articles/wiki/index.html | 741 ----- doc/articles/wiki/notemplate.go | 59 - doc/articles/wiki/part1-noerror.go | 35 - doc/articles/wiki/part1.go | 38 - doc/articles/wiki/part2.go | 44 - doc/articles/wiki/part3-errorhandling.go | 76 - doc/articles/wiki/part3.go | 60 - doc/articles/wiki/test_Test.txt.good | 1 - doc/articles/wiki/test_edit.good | 6 - doc/articles/wiki/test_view.good | 5 - doc/articles/wiki/view.html | 5 - doc/articles/wiki/wiki_test.go | 165 - doc/cmd.html | 100 - doc/codewalk/codewalk.css | 234 -- doc/codewalk/codewalk.js | 305 -- doc/codewalk/codewalk.xml | 124 - doc/codewalk/codewalk_test.go | 52 - doc/codewalk/functions.xml | 105 - doc/codewalk/markov.go | 130 - doc/codewalk/markov.xml | 307 -- doc/codewalk/pig.go | 121 - doc/codewalk/popout.png | Bin 213 -> 0 bytes doc/codewalk/sharemem.xml | 181 -- doc/codewalk/urlpoll.go | 116 - doc/contribute.html | 1294 -------- doc/debugging_with_gdb.html | 554 ---- doc/diagnostics.html | 472 --- doc/editors.html | 33 - doc/effective_go.html | 3673 ---------------------- doc/gccgo_contribute.html | 112 - doc/gccgo_install.html | 533 ---- doc/go-logo-black.png | Bin 8843 -> 0 bytes doc/go-logo-blue.png | Bin 9360 -> 0 bytes doc/go-logo-white.png | Bin 21469 -> 0 bytes doc/go1.1.html | 1099 ------- doc/go1.10.html | 1448 --------- doc/go1.11.html | 934 ------ doc/go1.12.html | 949 ------ doc/go1.13.html | 1066 ------- doc/go1.14.html | 924 ------ doc/go1.15.html | 1064 ------- doc/go1.2.html | 979 ------ doc/go1.3.html | 608 ---- doc/go1.4.html | 896 ------ doc/go1.5.html | 1310 -------- doc/go1.6.html | 923 ------ doc/go1.7.html | 1281 -------- doc/go1.8.html | 1666 ---------- doc/go1.9.html | 1024 ------ doc/go1.html | 2038 ------------ doc/go1compat.html | 202 -- doc/go_faq.html | 2477 --------------- doc/gopher/README | 3 - doc/gopher/appenginegopher.jpg | Bin 135882 -> 0 bytes doc/gopher/appenginegophercolor.jpg | Bin 162023 -> 0 bytes doc/gopher/appenginelogo.gif | Bin 2105 -> 0 bytes doc/gopher/biplane.jpg | Bin 203420 -> 0 bytes doc/gopher/bumper.png | Bin 276215 -> 0 bytes doc/gopher/bumper192x108.png | Bin 8432 -> 0 bytes doc/gopher/bumper320x180.png | Bin 15098 -> 0 bytes doc/gopher/bumper480x270.png | Bin 26509 -> 0 bytes doc/gopher/bumper640x360.png | Bin 42013 -> 0 bytes doc/gopher/doc.png | Bin 4395 -> 0 bytes doc/gopher/favicon.svg | 238 -- doc/gopher/fiveyears.jpg | Bin 220526 -> 0 bytes doc/gopher/frontpage.png | Bin 17668 -> 0 bytes doc/gopher/gopherbw.png | Bin 171323 -> 0 bytes doc/gopher/gophercolor.png | Bin 169406 -> 0 bytes doc/gopher/gophercolor16x16.png | Bin 739 -> 0 bytes doc/gopher/help.png | Bin 5729 -> 0 bytes doc/gopher/modelsheet.jpg | Bin 85880 -> 0 bytes doc/gopher/pencil/gopherhat.jpg | Bin 129627 -> 0 bytes doc/gopher/pencil/gopherhelmet.jpg | Bin 151965 -> 0 bytes doc/gopher/pencil/gophermega.jpg | Bin 122348 -> 0 bytes doc/gopher/pencil/gopherrunning.jpg | Bin 86299 -> 0 bytes doc/gopher/pencil/gopherswim.jpg | Bin 158593 -> 0 bytes doc/gopher/pencil/gopherswrench.jpg | Bin 231095 -> 0 bytes doc/gopher/pkg.png | Bin 5409 -> 0 bytes doc/gopher/project.png | Bin 8042 -> 0 bytes doc/gopher/ref.png | Bin 5895 -> 0 bytes doc/gopher/run.png | Bin 9220 -> 0 bytes doc/gopher/talks.png | Bin 4877 -> 0 bytes doc/help.html | 96 - doc/ie.css | 1 - doc/play/fib.go | 19 - doc/play/hello.go | 9 - doc/play/life.go | 113 - doc/play/peano.go | 88 - doc/play/pi.go | 34 - doc/play/sieve.go | 36 - doc/play/solitaire.go | 117 - doc/play/tree.go | 100 - doc/progs/cgo1.go | 22 - doc/progs/cgo2.go | 22 - doc/progs/cgo3.go | 18 - doc/progs/cgo4.go | 18 - doc/progs/defer.go | 64 - doc/progs/defer2.go | 58 - doc/progs/eff_bytesize.go | 47 - doc/progs/eff_qr.go | 50 - doc/progs/eff_sequence.go | 49 - doc/progs/eff_unused1.go | 16 - doc/progs/eff_unused2.go | 20 - doc/progs/error.go | 127 - doc/progs/error2.go | 54 - doc/progs/error3.go | 63 - doc/progs/error4.go | 74 - doc/progs/go1.go | 245 -- doc/progs/gobs1.go | 22 - doc/progs/gobs2.go | 43 - doc/progs/image_draw.go | 142 - doc/progs/image_package1.go | 15 - doc/progs/image_package2.go | 16 - doc/progs/image_package3.go | 15 - doc/progs/image_package4.go | 16 - doc/progs/image_package5.go | 17 - doc/progs/image_package6.go | 17 - doc/progs/interface.go | 62 - doc/progs/interface2.go | 132 - doc/progs/json1.go | 88 - doc/progs/json2.go | 42 - doc/progs/json3.go | 73 - doc/progs/json4.go | 45 - doc/progs/json5.go | 31 - doc/progs/run.go | 229 -- doc/progs/slices.go | 63 - doc/progs/timeout1.go | 29 - doc/progs/timeout2.go | 28 - doc/share.png | Bin 2993 -> 0 bytes doc/tos.html | 11 - src/cmd/dist/test.go | 8 - 143 files changed, 34682 deletions(-) delete mode 100644 doc/articles/go_command.html delete mode 100644 doc/articles/index.html delete mode 100644 doc/articles/race_detector.html delete mode 100644 doc/articles/wiki/edit.html delete mode 100644 doc/articles/wiki/final-noclosure.go delete mode 100644 doc/articles/wiki/final-noerror.go delete mode 100644 doc/articles/wiki/final-parsetemplate.go delete mode 100644 doc/articles/wiki/final-template.go delete mode 100644 doc/articles/wiki/final.go delete mode 100644 doc/articles/wiki/final_test.go delete mode 100644 doc/articles/wiki/go.mod delete mode 100644 doc/articles/wiki/http-sample.go delete mode 100644 doc/articles/wiki/index.html delete mode 100644 doc/articles/wiki/notemplate.go delete mode 100644 doc/articles/wiki/part1-noerror.go delete mode 100644 doc/articles/wiki/part1.go delete mode 100644 doc/articles/wiki/part2.go delete mode 100644 doc/articles/wiki/part3-errorhandling.go delete mode 100644 doc/articles/wiki/part3.go delete mode 100644 doc/articles/wiki/test_Test.txt.good delete mode 100644 doc/articles/wiki/test_edit.good delete mode 100644 doc/articles/wiki/test_view.good delete mode 100644 doc/articles/wiki/view.html delete mode 100644 doc/articles/wiki/wiki_test.go delete mode 100644 doc/cmd.html delete mode 100644 doc/codewalk/codewalk.css delete mode 100644 doc/codewalk/codewalk.js delete mode 100644 doc/codewalk/codewalk.xml delete mode 100644 doc/codewalk/codewalk_test.go delete mode 100644 doc/codewalk/functions.xml delete mode 100644 doc/codewalk/markov.go delete mode 100644 doc/codewalk/markov.xml delete mode 100644 doc/codewalk/pig.go delete mode 100644 doc/codewalk/popout.png delete mode 100644 doc/codewalk/sharemem.xml delete mode 100644 doc/codewalk/urlpoll.go delete mode 100644 doc/contribute.html delete mode 100644 doc/debugging_with_gdb.html delete mode 100644 doc/diagnostics.html delete mode 100644 doc/editors.html delete mode 100644 doc/effective_go.html delete mode 100644 doc/gccgo_contribute.html delete mode 100644 doc/gccgo_install.html delete mode 100644 doc/go-logo-black.png delete mode 100644 doc/go-logo-blue.png delete mode 100644 doc/go-logo-white.png delete mode 100644 doc/go1.1.html delete mode 100644 doc/go1.10.html delete mode 100644 doc/go1.11.html delete mode 100644 doc/go1.12.html delete mode 100644 doc/go1.13.html delete mode 100644 doc/go1.14.html delete mode 100644 doc/go1.15.html delete mode 100644 doc/go1.2.html delete mode 100644 doc/go1.3.html delete mode 100644 doc/go1.4.html delete mode 100644 doc/go1.5.html delete mode 100644 doc/go1.6.html delete mode 100644 doc/go1.7.html delete mode 100644 doc/go1.8.html delete mode 100644 doc/go1.9.html delete mode 100644 doc/go1.html delete mode 100644 doc/go1compat.html delete mode 100644 doc/go_faq.html delete mode 100644 doc/gopher/README delete mode 100644 doc/gopher/appenginegopher.jpg delete mode 100644 doc/gopher/appenginegophercolor.jpg delete mode 100644 doc/gopher/appenginelogo.gif delete mode 100644 doc/gopher/biplane.jpg delete mode 100644 doc/gopher/bumper.png delete mode 100644 doc/gopher/bumper192x108.png delete mode 100644 doc/gopher/bumper320x180.png delete mode 100644 doc/gopher/bumper480x270.png delete mode 100644 doc/gopher/bumper640x360.png delete mode 100644 doc/gopher/doc.png delete mode 100644 doc/gopher/favicon.svg delete mode 100644 doc/gopher/fiveyears.jpg delete mode 100644 doc/gopher/frontpage.png delete mode 100644 doc/gopher/gopherbw.png delete mode 100644 doc/gopher/gophercolor.png delete mode 100644 doc/gopher/gophercolor16x16.png delete mode 100644 doc/gopher/help.png delete mode 100644 doc/gopher/modelsheet.jpg delete mode 100644 doc/gopher/pencil/gopherhat.jpg delete mode 100644 doc/gopher/pencil/gopherhelmet.jpg delete mode 100644 doc/gopher/pencil/gophermega.jpg delete mode 100644 doc/gopher/pencil/gopherrunning.jpg delete mode 100644 doc/gopher/pencil/gopherswim.jpg delete mode 100644 doc/gopher/pencil/gopherswrench.jpg delete mode 100644 doc/gopher/pkg.png delete mode 100644 doc/gopher/project.png delete mode 100644 doc/gopher/ref.png delete mode 100644 doc/gopher/run.png delete mode 100644 doc/gopher/talks.png delete mode 100644 doc/help.html delete mode 100644 doc/ie.css delete mode 100644 doc/play/fib.go delete mode 100644 doc/play/hello.go delete mode 100644 doc/play/life.go delete mode 100644 doc/play/peano.go delete mode 100644 doc/play/pi.go delete mode 100644 doc/play/sieve.go delete mode 100644 doc/play/solitaire.go delete mode 100644 doc/play/tree.go delete mode 100644 doc/progs/cgo1.go delete mode 100644 doc/progs/cgo2.go delete mode 100644 doc/progs/cgo3.go delete mode 100644 doc/progs/cgo4.go delete mode 100644 doc/progs/defer.go delete mode 100644 doc/progs/defer2.go delete mode 100644 doc/progs/eff_bytesize.go delete mode 100644 doc/progs/eff_qr.go delete mode 100644 doc/progs/eff_sequence.go delete mode 100644 doc/progs/eff_unused1.go delete mode 100644 doc/progs/eff_unused2.go delete mode 100644 doc/progs/error.go delete mode 100644 doc/progs/error2.go delete mode 100644 doc/progs/error3.go delete mode 100644 doc/progs/error4.go delete mode 100644 doc/progs/go1.go delete mode 100644 doc/progs/gobs1.go delete mode 100644 doc/progs/gobs2.go delete mode 100644 doc/progs/image_draw.go delete mode 100644 doc/progs/image_package1.go delete mode 100644 doc/progs/image_package2.go delete mode 100644 doc/progs/image_package3.go delete mode 100644 doc/progs/image_package4.go delete mode 100644 doc/progs/image_package5.go delete mode 100644 doc/progs/image_package6.go delete mode 100644 doc/progs/interface.go delete mode 100644 doc/progs/interface2.go delete mode 100644 doc/progs/json1.go delete mode 100644 doc/progs/json2.go delete mode 100644 doc/progs/json3.go delete mode 100644 doc/progs/json4.go delete mode 100644 doc/progs/json5.go delete mode 100644 doc/progs/run.go delete mode 100644 doc/progs/slices.go delete mode 100644 doc/progs/timeout1.go delete mode 100644 doc/progs/timeout2.go delete mode 100644 doc/share.png delete mode 100644 doc/tos.html diff --git a/doc/articles/go_command.html b/doc/articles/go_command.html deleted file mode 100644 index 5b6fd4d24b..0000000000 --- a/doc/articles/go_command.html +++ /dev/null @@ -1,254 +0,0 @@ - - -

    The Go distribution includes a command, named -"go", that -automates the downloading, building, installation, and testing of Go packages -and commands. This document talks about why we wrote a new command, what it -is, what it's not, and how to use it.

    - -

    Motivation

    - -

    You might have seen early Go talks in which Rob Pike jokes that the idea -for Go arose while waiting for a large Google server to compile. That -really was the motivation for Go: to build a language that worked well -for building the large software that Google writes and runs. It was -clear from the start that such a language must provide a way to -express dependencies between code libraries clearly, hence the package -grouping and the explicit import blocks. It was also clear from the -start that you might want arbitrary syntax for describing the code -being imported; this is why import paths are string literals.

    - -

    An explicit goal for Go from the beginning was to be able to build Go -code using only the information found in the source itself, not -needing to write a makefile or one of the many modern replacements for -makefiles. If Go needed a configuration file to explain how to build -your program, then Go would have failed.

    - -

    At first, there was no Go compiler, and the initial development -focused on building one and then building libraries for it. For -expedience, we postponed the automation of building Go code by using -make and writing makefiles. When compiling a single package involved -multiple invocations of the Go compiler, we even used a program to -write the makefiles for us. You can find it if you dig through the -repository history.

    - -

    The purpose of the new go command is our return to this ideal, that Go -programs should compile without configuration or additional effort on -the part of the developer beyond writing the necessary import -statements.

    - -

    Configuration versus convention

    - -

    The way to achieve the simplicity of a configuration-free system is to -establish conventions. The system works only to the extent that those conventions -are followed. When we first launched Go, many people published packages that -had to be installed in certain places, under certain names, using certain build -tools, in order to be used. That's understandable: that's the way it works in -most other languages. Over the last few years we consistently reminded people -about the goinstall command -(now replaced by go get) -and its conventions: first, that the import path is derived in a known way from -the URL of the source code; second, that the place to store the sources in -the local file system is derived in a known way from the import path; third, -that each directory in a source tree corresponds to a single package; and -fourth, that the package is built using only information in the source code. -Today, the vast majority of packages follow these conventions. -The Go ecosystem is simpler and more powerful as a result.

    - -

    We received many requests to allow a makefile in a package directory to -provide just a little extra configuration beyond what's in the source code. -But that would have introduced new rules. Because we did not accede to such -requests, we were able to write the go command and eliminate our use of make -or any other build system.

    - -

    It is important to understand that the go command is not a general -build tool. It cannot be configured and it does not attempt to build -anything but Go packages. These are important simplifying -assumptions: they simplify not only the implementation but also, more -important, the use of the tool itself.

    - -

    Go's conventions

    - -

    The go command requires that code adheres to a few key, -well-established conventions.

    - -

    First, the import path is derived in a known way from the URL of the -source code. For Bitbucket, GitHub, Google Code, and Launchpad, the -root directory of the repository is identified by the repository's -main URL, without the http:// prefix. Subdirectories are named by -adding to that path. -For example, the Go example programs are obtained by running

    - -
    -git clone https://github.com/golang/example
    -
    - -

    and thus the import path for the root directory of that repository is -"github.com/golang/example". -The stringutil -package is stored in a subdirectory, so its import path is -"github.com/golang/example/stringutil".

    - -

    These paths are on the long side, but in exchange we get an -automatically managed name space for import paths and the ability for -a tool like the go command to look at an unfamiliar import path and -deduce where to obtain the source code.

    - -

    Second, the place to store sources in the local file system is derived -in a known way from the import path, specifically -$GOPATH/src/<import-path>. -If unset, $GOPATH defaults to a subdirectory -named go in the user's home directory. -If $GOPATH is set to a list of paths, the go command tries -<dir>/src/<import-path> for each of the directories in -that list. -

    - -

    Each of those trees contains, by convention, a top-level directory named -"bin", for holding compiled executables, and a top-level directory -named "pkg", for holding compiled packages that can be imported, -and the "src" directory, for holding package source files. -Imposing this structure lets us keep each of these directory trees -self-contained: the compiled form and the sources are always near each -other.

    - -

    These naming conventions also let us work in the reverse direction, -from a directory name to its import path. This mapping is important -for many of the go command's subcommands, as we'll see below.

    - -

    Third, each directory in a source tree corresponds to a single -package. By restricting a directory to a single package, we don't have -to create hybrid import paths that specify first the directory and -then the package within that directory. Also, most file management -tools and UIs work on directories as fundamental units. Tying the -fundamental Go unit—the package—to file system structure means -that file system tools become Go package tools. Copying, moving, or -deleting a package corresponds to copying, moving, or deleting a -directory.

    - -

    Fourth, each package is built using only the information present in -the source files. This makes it much more likely that the tool will -be able to adapt to changing build environments and conditions. For -example, if we allowed extra configuration such as compiler flags or -command line recipes, then that configuration would need to be updated -each time the build tools changed; it would also be inherently tied -to the use of a specific toolchain.

    - -

    Getting started with the go command

    - -

    Finally, a quick tour of how to use the go command. -As mentioned above, the default $GOPATH on Unix is $HOME/go. -We'll store our programs there. -To use a different location, you can set $GOPATH; -see How to Write Go Code for details. - -

    We first add some source code. Suppose we want to use -the indexing library from the codesearch project along with a left-leaning -red-black tree. We can install both with the "go get" -subcommand:

    - -
    -$ go get github.com/google/codesearch/index
    -$ go get github.com/petar/GoLLRB/llrb
    -$
    -
    - -

    Both of these projects are now downloaded and installed into $HOME/go, -which contains the two directories -src/github.com/google/codesearch/index/ and -src/github.com/petar/GoLLRB/llrb/, along with the compiled -packages (in pkg/) for those libraries and their dependencies.

    - -

    Because we used version control systems (Mercurial and Git) to check -out the sources, the source tree also contains the other files in the -corresponding repositories, such as related packages. The "go list" -subcommand lists the import paths corresponding to its arguments, and -the pattern "./..." means start in the current directory -("./") and find all packages below that directory -("..."):

    - -
    -$ cd $HOME/go/src
    -$ go list ./...
    -github.com/google/codesearch/cmd/cgrep
    -github.com/google/codesearch/cmd/cindex
    -github.com/google/codesearch/cmd/csearch
    -github.com/google/codesearch/index
    -github.com/google/codesearch/regexp
    -github.com/google/codesearch/sparse
    -github.com/petar/GoLLRB/example
    -github.com/petar/GoLLRB/llrb
    -$
    -
    - -

    We can also test those packages:

    - -
    -$ go test ./...
    -?   	github.com/google/codesearch/cmd/cgrep	[no test files]
    -?   	github.com/google/codesearch/cmd/cindex	[no test files]
    -?   	github.com/google/codesearch/cmd/csearch	[no test files]
    -ok  	github.com/google/codesearch/index	0.203s
    -ok  	github.com/google/codesearch/regexp	0.017s
    -?   	github.com/google/codesearch/sparse	[no test files]
    -?       github.com/petar/GoLLRB/example          [no test files]
    -ok      github.com/petar/GoLLRB/llrb             0.231s
    -$
    -
    - -

    If a go subcommand is invoked with no paths listed, it operates on the -current directory:

    - -
    -$ cd github.com/google/codesearch/regexp
    -$ go list
    -github.com/google/codesearch/regexp
    -$ go test -v
    -=== RUN   TestNstateEnc
    ---- PASS: TestNstateEnc (0.00s)
    -=== RUN   TestMatch
    ---- PASS: TestMatch (0.00s)
    -=== RUN   TestGrep
    ---- PASS: TestGrep (0.00s)
    -PASS
    -ok  	github.com/google/codesearch/regexp	0.018s
    -$ go install
    -$
    -
    - -

    That "go install" subcommand installs the latest copy of the -package into the pkg directory. Because the go command can analyze the -dependency graph, "go install" also installs any packages that -this package imports but that are out of date, recursively.

    - -

    Notice that "go install" was able to determine the name of the -import path for the package in the current directory, because of the convention -for directory naming. It would be a little more convenient if we could pick -the name of the directory where we kept source code, and we probably wouldn't -pick such a long name, but that ability would require additional configuration -and complexity in the tool. Typing an extra directory name or two is a small -price to pay for the increased simplicity and power.

    - -

    Limitations

    - -

    As mentioned above, the go command is not a general-purpose build -tool. -In particular, it does not have any facility for generating Go -source files during a build, although it does provide -go -generate, -which can automate the creation of Go files before the build. -For more advanced build setups, you may need to write a -makefile (or a configuration file for the build tool of your choice) -to run whatever tool creates the Go files and then check those generated source files -into your repository. This is more work for you, the package author, -but it is significantly less work for your users, who can use -"go get" without needing to obtain and build -any additional tools.

    - -

    More information

    - -

    For more information, read How to Write Go Code -and see the go command documentation.

    diff --git a/doc/articles/index.html b/doc/articles/index.html deleted file mode 100644 index 9ddd669731..0000000000 --- a/doc/articles/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

    -See the Documents page and the -Blog index for a complete list of Go articles. -

    diff --git a/doc/articles/race_detector.html b/doc/articles/race_detector.html deleted file mode 100644 index 09188c15d5..0000000000 --- a/doc/articles/race_detector.html +++ /dev/null @@ -1,440 +0,0 @@ - - -

    Introduction

    - -

    -Data races are among the most common and hardest to debug types of bugs in concurrent systems. -A data race occurs when two goroutines access the same variable concurrently and at least one of the accesses is a write. -See the The Go Memory Model for details. -

    - -

    -Here is an example of a data race that can lead to crashes and memory corruption: -

    - -
    -func main() {
    -	c := make(chan bool)
    -	m := make(map[string]string)
    -	go func() {
    -		m["1"] = "a" // First conflicting access.
    -		c <- true
    -	}()
    -	m["2"] = "b" // Second conflicting access.
    -	<-c
    -	for k, v := range m {
    -		fmt.Println(k, v)
    -	}
    -}
    -
    - -

    Usage

    - -

    -To help diagnose such bugs, Go includes a built-in data race detector. -To use it, add the -race flag to the go command: -

    - -
    -$ go test -race mypkg    // to test the package
    -$ go run -race mysrc.go  // to run the source file
    -$ go build -race mycmd   // to build the command
    -$ go install -race mypkg // to install the package
    -
    - -

    Report Format

    - -

    -When the race detector finds a data race in the program, it prints a report. -The report contains stack traces for conflicting accesses, as well as stacks where the involved goroutines were created. -Here is an example: -

    - -
    -WARNING: DATA RACE
    -Read by goroutine 185:
    -  net.(*pollServer).AddFD()
    -      src/net/fd_unix.go:89 +0x398
    -  net.(*pollServer).WaitWrite()
    -      src/net/fd_unix.go:247 +0x45
    -  net.(*netFD).Write()
    -      src/net/fd_unix.go:540 +0x4d4
    -  net.(*conn).Write()
    -      src/net/net.go:129 +0x101
    -  net.func·060()
    -      src/net/timeout_test.go:603 +0xaf
    -
    -Previous write by goroutine 184:
    -  net.setWriteDeadline()
    -      src/net/sockopt_posix.go:135 +0xdf
    -  net.setDeadline()
    -      src/net/sockopt_posix.go:144 +0x9c
    -  net.(*conn).SetDeadline()
    -      src/net/net.go:161 +0xe3
    -  net.func·061()
    -      src/net/timeout_test.go:616 +0x3ed
    -
    -Goroutine 185 (running) created at:
    -  net.func·061()
    -      src/net/timeout_test.go:609 +0x288
    -
    -Goroutine 184 (running) created at:
    -  net.TestProlongTimeout()
    -      src/net/timeout_test.go:618 +0x298
    -  testing.tRunner()
    -      src/testing/testing.go:301 +0xe8
    -
    - -

    Options

    - -

    -The GORACE environment variable sets race detector options. -The format is: -

    - -
    -GORACE="option1=val1 option2=val2"
    -
    - -

    -The options are: -

    - -
      -
    • -log_path (default stderr): The race detector writes -its report to a file named log_path.pid. -The special names stdout -and stderr cause reports to be written to standard output and -standard error, respectively. -
    • - -
    • -exitcode (default 66): The exit status to use when -exiting after a detected race. -
    • - -
    • -strip_path_prefix (default ""): Strip this prefix -from all reported file paths, to make reports more concise. -
    • - -
    • -history_size (default 1): The per-goroutine memory -access history is 32K * 2**history_size elements. -Increasing this value can avoid a "failed to restore the stack" error in reports, at the -cost of increased memory usage. -
    • - -
    • -halt_on_error (default 0): Controls whether the program -exits after reporting first data race. -
    • - -
    • -atexit_sleep_ms (default 1000): Amount of milliseconds -to sleep in the main goroutine before exiting. -
    • -
    - -

    -Example: -

    - -
    -$ GORACE="log_path=/tmp/race/report strip_path_prefix=/my/go/sources/" go test -race
    -
    - -

    Excluding Tests

    - -

    -When you build with -race flag, the go command defines additional -build tag race. -You can use the tag to exclude some code and tests when running the race detector. -Some examples: -

    - -
    -// +build !race
    -
    -package foo
    -
    -// The test contains a data race. See issue 123.
    -func TestFoo(t *testing.T) {
    -	// ...
    -}
    -
    -// The test fails under the race detector due to timeouts.
    -func TestBar(t *testing.T) {
    -	// ...
    -}
    -
    -// The test takes too long under the race detector.
    -func TestBaz(t *testing.T) {
    -	// ...
    -}
    -
    - -

    How To Use

    - -

    -To start, run your tests using the race detector (go test -race). -The race detector only finds races that happen at runtime, so it can't find -races in code paths that are not executed. -If your tests have incomplete coverage, -you may find more races by running a binary built with -race under a realistic -workload. -

    - -

    Typical Data Races

    - -

    -Here are some typical data races. All of them can be detected with the race detector. -

    - -

    Race on loop counter

    - -
    -func main() {
    -	var wg sync.WaitGroup
    -	wg.Add(5)
    -	for i := 0; i < 5; i++ {
    -		go func() {
    -			fmt.Println(i) // Not the 'i' you are looking for.
    -			wg.Done()
    -		}()
    -	}
    -	wg.Wait()
    -}
    -
    - -

    -The variable i in the function literal is the same variable used by the loop, so -the read in the goroutine races with the loop increment. -(This program typically prints 55555, not 01234.) -The program can be fixed by making a copy of the variable: -

    - -
    -func main() {
    -	var wg sync.WaitGroup
    -	wg.Add(5)
    -	for i := 0; i < 5; i++ {
    -		go func(j int) {
    -			fmt.Println(j) // Good. Read local copy of the loop counter.
    -			wg.Done()
    -		}(i)
    -	}
    -	wg.Wait()
    -}
    -
    - -

    Accidentally shared variable

    - -
    -// ParallelWrite writes data to file1 and file2, returns the errors.
    -func ParallelWrite(data []byte) chan error {
    -	res := make(chan error, 2)
    -	f1, err := os.Create("file1")
    -	if err != nil {
    -		res <- err
    -	} else {
    -		go func() {
    -			// This err is shared with the main goroutine,
    -			// so the write races with the write below.
    -			_, err = f1.Write(data)
    -			res <- err
    -			f1.Close()
    -		}()
    -	}
    -	f2, err := os.Create("file2") // The second conflicting write to err.
    -	if err != nil {
    -		res <- err
    -	} else {
    -		go func() {
    -			_, err = f2.Write(data)
    -			res <- err
    -			f2.Close()
    -		}()
    -	}
    -	return res
    -}
    -
    - -

    -The fix is to introduce new variables in the goroutines (note the use of :=): -

    - -
    -			...
    -			_, err := f1.Write(data)
    -			...
    -			_, err := f2.Write(data)
    -			...
    -
    - -

    Unprotected global variable

    - -

    -If the following code is called from several goroutines, it leads to races on the service map. -Concurrent reads and writes of the same map are not safe: -

    - -
    -var service map[string]net.Addr
    -
    -func RegisterService(name string, addr net.Addr) {
    -	service[name] = addr
    -}
    -
    -func LookupService(name string) net.Addr {
    -	return service[name]
    -}
    -
    - -

    -To make the code safe, protect the accesses with a mutex: -

    - -
    -var (
    -	service   map[string]net.Addr
    -	serviceMu sync.Mutex
    -)
    -
    -func RegisterService(name string, addr net.Addr) {
    -	serviceMu.Lock()
    -	defer serviceMu.Unlock()
    -	service[name] = addr
    -}
    -
    -func LookupService(name string) net.Addr {
    -	serviceMu.Lock()
    -	defer serviceMu.Unlock()
    -	return service[name]
    -}
    -
    - -

    Primitive unprotected variable

    - -

    -Data races can happen on variables of primitive types as well (bool, int, int64, etc.), -as in this example: -

    - -
    -type Watchdog struct{ last int64 }
    -
    -func (w *Watchdog) KeepAlive() {
    -	w.last = time.Now().UnixNano() // First conflicting access.
    -}
    -
    -func (w *Watchdog) Start() {
    -	go func() {
    -		for {
    -			time.Sleep(time.Second)
    -			// Second conflicting access.
    -			if w.last < time.Now().Add(-10*time.Second).UnixNano() {
    -				fmt.Println("No keepalives for 10 seconds. Dying.")
    -				os.Exit(1)
    -			}
    -		}
    -	}()
    -}
    -
    - -

    -Even such "innocent" data races can lead to hard-to-debug problems caused by -non-atomicity of the memory accesses, -interference with compiler optimizations, -or reordering issues accessing processor memory . -

    - -

    -A typical fix for this race is to use a channel or a mutex. -To preserve the lock-free behavior, one can also use the -sync/atomic package. -

    - -
    -type Watchdog struct{ last int64 }
    -
    -func (w *Watchdog) KeepAlive() {
    -	atomic.StoreInt64(&w.last, time.Now().UnixNano())
    -}
    -
    -func (w *Watchdog) Start() {
    -	go func() {
    -		for {
    -			time.Sleep(time.Second)
    -			if atomic.LoadInt64(&w.last) < time.Now().Add(-10*time.Second).UnixNano() {
    -				fmt.Println("No keepalives for 10 seconds. Dying.")
    -				os.Exit(1)
    -			}
    -		}
    -	}()
    -}
    -
    - -

    Unsynchronized send and close operations

    - -

    -As this example demonstrates, unsynchronized send and close operations -on the same channel can also be a race condition: -

    - -
    -c := make(chan struct{}) // or buffered channel
    -
    -// The race detector cannot derive the happens before relation
    -// for the following send and close operations. These two operations
    -// are unsynchronized and happen concurrently.
    -go func() { c <- struct{}{} }()
    -close(c)
    -
    - -

    -According to the Go memory model, a send on a channel happens before -the corresponding receive from that channel completes. To synchronize -send and close operations, use a receive operation that guarantees -the send is done before the close: -

    - -
    -c := make(chan struct{}) // or buffered channel
    -
    -go func() { c <- struct{}{} }()
    -<-c
    -close(c)
    -
    - -

    Supported Systems

    - -

    - The race detector runs on - linux/amd64, linux/ppc64le, - linux/arm64, freebsd/amd64, - netbsd/amd64, darwin/amd64, - darwin/arm64, and windows/amd64. -

    - -

    Runtime Overhead

    - -

    -The cost of race detection varies by program, but for a typical program, memory -usage may increase by 5-10x and execution time by 2-20x. -

    - -

    -The race detector currently allocates an extra 8 bytes per defer -and recover statement. Those extra allocations are not recovered until the goroutine -exits. This means that if you have a long-running goroutine that is -periodically issuing defer and recover calls, -the program memory usage may grow without bound. These memory allocations -will not show up in the output of runtime.ReadMemStats or -runtime/pprof. -

    diff --git a/doc/articles/wiki/edit.html b/doc/articles/wiki/edit.html deleted file mode 100644 index 044c3bedea..0000000000 --- a/doc/articles/wiki/edit.html +++ /dev/null @@ -1,6 +0,0 @@ -

    Editing {{.Title}}

    - -
    -
    -
    -
    diff --git a/doc/articles/wiki/final-noclosure.go b/doc/articles/wiki/final-noclosure.go deleted file mode 100644 index d894e7d319..0000000000 --- a/doc/articles/wiki/final-noclosure.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "errors" - "html/template" - "io/ioutil" - "log" - "net/http" - "regexp" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func viewHandler(w http.ResponseWriter, r *http.Request) { - title, err := getTitle(w, r) - if err != nil { - return - } - p, err := loadPage(title) - if err != nil { - http.Redirect(w, r, "/edit/"+title, http.StatusFound) - return - } - renderTemplate(w, "view", p) -} - -func editHandler(w http.ResponseWriter, r *http.Request) { - title, err := getTitle(w, r) - if err != nil { - return - } - p, err := loadPage(title) - if err != nil { - p = &Page{Title: title} - } - renderTemplate(w, "edit", p) -} - -func saveHandler(w http.ResponseWriter, r *http.Request) { - title, err := getTitle(w, r) - if err != nil { - return - } - body := r.FormValue("body") - p := &Page{Title: title, Body: []byte(body)} - err = p.save() - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - http.Redirect(w, r, "/view/"+title, http.StatusFound) -} - -func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { - t, err := template.ParseFiles(tmpl + ".html") - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - err = t.Execute(w, p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -var validPath = regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$") - -func getTitle(w http.ResponseWriter, r *http.Request) (string, error) { - m := validPath.FindStringSubmatch(r.URL.Path) - if m == nil { - http.NotFound(w, r) - return "", errors.New("invalid Page Title") - } - return m[2], nil // The title is the second subexpression. -} - -func main() { - http.HandleFunc("/view/", viewHandler) - http.HandleFunc("/edit/", editHandler) - http.HandleFunc("/save/", saveHandler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/final-noerror.go b/doc/articles/wiki/final-noerror.go deleted file mode 100644 index 250236d42e..0000000000 --- a/doc/articles/wiki/final-noerror.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "html/template" - "io/ioutil" - "log" - "net/http" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func editHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/edit/"):] - p, err := loadPage(title) - if err != nil { - p = &Page{Title: title} - } - t, _ := template.ParseFiles("edit.html") - t.Execute(w, p) -} - -func viewHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/view/"):] - p, _ := loadPage(title) - t, _ := template.ParseFiles("view.html") - t.Execute(w, p) -} - -func main() { - http.HandleFunc("/view/", viewHandler) - http.HandleFunc("/edit/", editHandler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/final-parsetemplate.go b/doc/articles/wiki/final-parsetemplate.go deleted file mode 100644 index 0b90cbd3bc..0000000000 --- a/doc/articles/wiki/final-parsetemplate.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "html/template" - "io/ioutil" - "log" - "net/http" - "regexp" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func viewHandler(w http.ResponseWriter, r *http.Request, title string) { - p, err := loadPage(title) - if err != nil { - http.Redirect(w, r, "/edit/"+title, http.StatusFound) - return - } - renderTemplate(w, "view", p) -} - -func editHandler(w http.ResponseWriter, r *http.Request, title string) { - p, err := loadPage(title) - if err != nil { - p = &Page{Title: title} - } - renderTemplate(w, "edit", p) -} - -func saveHandler(w http.ResponseWriter, r *http.Request, title string) { - body := r.FormValue("body") - p := &Page{Title: title, Body: []byte(body)} - err := p.save() - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - http.Redirect(w, r, "/view/"+title, http.StatusFound) -} - -func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { - t, err := template.ParseFiles(tmpl + ".html") - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - err = t.Execute(w, p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -var validPath = regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$") - -func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - m := validPath.FindStringSubmatch(r.URL.Path) - if m == nil { - http.NotFound(w, r) - return - } - fn(w, r, m[2]) - } -} - -func main() { - http.HandleFunc("/view/", makeHandler(viewHandler)) - http.HandleFunc("/edit/", makeHandler(editHandler)) - http.HandleFunc("/save/", makeHandler(saveHandler)) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/final-template.go b/doc/articles/wiki/final-template.go deleted file mode 100644 index 5028664fe8..0000000000 --- a/doc/articles/wiki/final-template.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "html/template" - "io/ioutil" - "log" - "net/http" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func editHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/edit/"):] - p, err := loadPage(title) - if err != nil { - p = &Page{Title: title} - } - renderTemplate(w, "edit", p) -} - -func viewHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/view/"):] - p, _ := loadPage(title) - renderTemplate(w, "view", p) -} - -func saveHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/save/"):] - body := r.FormValue("body") - p := &Page{Title: title, Body: []byte(body)} - p.save() - http.Redirect(w, r, "/view/"+title, http.StatusFound) -} - -func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { - t, _ := template.ParseFiles(tmpl + ".html") - t.Execute(w, p) -} - -func main() { - http.HandleFunc("/view/", viewHandler) - http.HandleFunc("/edit/", editHandler) - http.HandleFunc("/save/", saveHandler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/final.go b/doc/articles/wiki/final.go deleted file mode 100644 index b1439b08a9..0000000000 --- a/doc/articles/wiki/final.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "html/template" - "io/ioutil" - "log" - "net/http" - "regexp" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func viewHandler(w http.ResponseWriter, r *http.Request, title string) { - p, err := loadPage(title) - if err != nil { - http.Redirect(w, r, "/edit/"+title, http.StatusFound) - return - } - renderTemplate(w, "view", p) -} - -func editHandler(w http.ResponseWriter, r *http.Request, title string) { - p, err := loadPage(title) - if err != nil { - p = &Page{Title: title} - } - renderTemplate(w, "edit", p) -} - -func saveHandler(w http.ResponseWriter, r *http.Request, title string) { - body := r.FormValue("body") - p := &Page{Title: title, Body: []byte(body)} - err := p.save() - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - http.Redirect(w, r, "/view/"+title, http.StatusFound) -} - -var templates = template.Must(template.ParseFiles("edit.html", "view.html")) - -func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { - err := templates.ExecuteTemplate(w, tmpl+".html", p) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -var validPath = regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$") - -func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - m := validPath.FindStringSubmatch(r.URL.Path) - if m == nil { - http.NotFound(w, r) - return - } - fn(w, r, m[2]) - } -} - -func main() { - http.HandleFunc("/view/", makeHandler(viewHandler)) - http.HandleFunc("/edit/", makeHandler(editHandler)) - http.HandleFunc("/save/", makeHandler(saveHandler)) - - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/final_test.go b/doc/articles/wiki/final_test.go deleted file mode 100644 index 764469976e..0000000000 --- a/doc/articles/wiki/final_test.go +++ /dev/null @@ -1,24 +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. - -// +build ignore - -package main - -import ( - "fmt" - "log" - "net" - "net/http" -) - -func serve() error { - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - log.Fatal(err) - } - fmt.Println(l.Addr().String()) - s := &http.Server{} - return s.Serve(l) -} diff --git a/doc/articles/wiki/go.mod b/doc/articles/wiki/go.mod deleted file mode 100644 index 38153ed79f..0000000000 --- a/doc/articles/wiki/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module doc/articles/wiki - -go 1.14 diff --git a/doc/articles/wiki/http-sample.go b/doc/articles/wiki/http-sample.go deleted file mode 100644 index 803b88c4eb..0000000000 --- a/doc/articles/wiki/http-sample.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build ignore - -package main - -import ( - "fmt" - "log" - "net/http" -) - -func handler(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) -} - -func main() { - http.HandleFunc("/", handler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/index.html b/doc/articles/wiki/index.html deleted file mode 100644 index a74a58e317..0000000000 --- a/doc/articles/wiki/index.html +++ /dev/null @@ -1,741 +0,0 @@ - - -

    Introduction

    - -

    -Covered in this tutorial: -

    -
      -
    • Creating a data structure with load and save methods
    • -
    • Using the net/http package to build web applications -
    • Using the html/template package to process HTML templates
    • -
    • Using the regexp package to validate user input
    • -
    • Using closures
    • -
    - -

    -Assumed knowledge: -

    -
      -
    • Programming experience
    • -
    • Understanding of basic web technologies (HTTP, HTML)
    • -
    • Some UNIX/DOS command-line knowledge
    • -
    - -

    Getting Started

    - -

    -At present, you need to have a FreeBSD, Linux, OS X, or Windows machine to run Go. -We will use $ to represent the command prompt. -

    - -

    -Install Go (see the Installation Instructions). -

    - -

    -Make a new directory for this tutorial inside your GOPATH and cd to it: -

    - -
    -$ mkdir gowiki
    -$ cd gowiki
    -
    - -

    -Create a file named wiki.go, open it in your favorite editor, and -add the following lines: -

    - -
    -package main
    -
    -import (
    -	"fmt"
    -	"io/ioutil"
    -)
    -
    - -

    -We import the fmt and ioutil packages from the Go -standard library. Later, as we implement additional functionality, we will -add more packages to this import declaration. -

    - -

    Data Structures

    - -

    -Let's start by defining the data structures. A wiki consists of a series of -interconnected pages, each of which has a title and a body (the page content). -Here, we define Page as a struct with two fields representing -the title and body. -

    - -{{code "doc/articles/wiki/part1.go" `/^type Page/` `/}/`}} - -

    -The type []byte means "a byte slice". -(See Slices: usage and -internals for more on slices.) -The Body element is a []byte rather than -string because that is the type expected by the io -libraries we will use, as you'll see below. -

    - -

    -The Page struct describes how page data will be stored in memory. -But what about persistent storage? We can address that by creating a -save method on Page: -

    - -{{code "doc/articles/wiki/part1.go" `/^func.*Page.*save/` `/}/`}} - -

    -This method's signature reads: "This is a method named save that -takes as its receiver p, a pointer to Page . It takes -no parameters, and returns a value of type error." -

    - -

    -This method will save the Page's Body to a text -file. For simplicity, we will use the Title as the file name. -

    - -

    -The save method returns an error value because -that is the return type of WriteFile (a standard library function -that writes a byte slice to a file). The save method returns the -error value, to let the application handle it should anything go wrong while -writing the file. If all goes well, Page.save() will return -nil (the zero-value for pointers, interfaces, and some other -types). -

    - -

    -The octal integer literal 0600, passed as the third parameter to -WriteFile, indicates that the file should be created with -read-write permissions for the current user only. (See the Unix man page -open(2) for details.) -

    - -

    -In addition to saving pages, we will want to load pages, too: -

    - -{{code "doc/articles/wiki/part1-noerror.go" `/^func loadPage/` `/^}/`}} - -

    -The function loadPage constructs the file name from the title -parameter, reads the file's contents into a new variable body, and -returns a pointer to a Page literal constructed with the proper -title and body values. -

    - -

    -Functions can return multiple values. The standard library function -io.ReadFile returns []byte and error. -In loadPage, error isn't being handled yet; the "blank identifier" -represented by the underscore (_) symbol is used to throw away the -error return value (in essence, assigning the value to nothing). -

    - -

    -But what happens if ReadFile encounters an error? For example, -the file might not exist. We should not ignore such errors. Let's modify the -function to return *Page and error. -

    - -{{code "doc/articles/wiki/part1.go" `/^func loadPage/` `/^}/`}} - -

    -Callers of this function can now check the second parameter; if it is -nil then it has successfully loaded a Page. If not, it will be an -error that can be handled by the caller (see the -language specification for details). -

    - -

    -At this point we have a simple data structure and the ability to save to and -load from a file. Let's write a main function to test what we've -written: -

    - -{{code "doc/articles/wiki/part1.go" `/^func main/` `/^}/`}} - -

    -After compiling and executing this code, a file named TestPage.txt -would be created, containing the contents of p1. The file would -then be read into the struct p2, and its Body element -printed to the screen. -

    - -

    -You can compile and run the program like this: -

    - -
    -$ go build wiki.go
    -$ ./wiki
    -This is a sample Page.
    -
    - -

    -(If you're using Windows you must type "wiki" without the -"./" to run the program.) -

    - -

    -Click here to view the code we've written so far. -

    - -

    Introducing the net/http package (an interlude)

    - -

    -Here's a full working example of a simple web server: -

    - -{{code "doc/articles/wiki/http-sample.go"}} - -

    -The main function begins with a call to -http.HandleFunc, which tells the http package to -handle all requests to the web root ("/") with -handler. -

    - -

    -It then calls http.ListenAndServe, specifying that it should -listen on port 8080 on any interface (":8080"). (Don't -worry about its second parameter, nil, for now.) -This function will block until the program is terminated. -

    - -

    -ListenAndServe always returns an error, since it only returns when an -unexpected error occurs. -In order to log that error we wrap the function call with log.Fatal. -

    - -

    -The function handler is of the type http.HandlerFunc. -It takes an http.ResponseWriter and an http.Request as -its arguments. -

    - -

    -An http.ResponseWriter value assembles the HTTP server's response; by writing -to it, we send data to the HTTP client. -

    - -

    -An http.Request is a data structure that represents the client -HTTP request. r.URL.Path is the path component -of the request URL. The trailing [1:] means -"create a sub-slice of Path from the 1st character to the end." -This drops the leading "/" from the path name. -

    - -

    -If you run this program and access the URL: -

    -
    http://localhost:8080/monkeys
    -

    -the program would present a page containing: -

    -
    Hi there, I love monkeys!
    - -

    Using net/http to serve wiki pages

    - -

    -To use the net/http package, it must be imported: -

    - -
    -import (
    -	"fmt"
    -	"io/ioutil"
    -	"log"
    -	"net/http"
    -)
    -
    - -

    -Let's create a handler, viewHandler that will allow users to -view a wiki page. It will handle URLs prefixed with "/view/". -

    - -{{code "doc/articles/wiki/part2.go" `/^func viewHandler/` `/^}/`}} - -

    -Again, note the use of _ to ignore the error -return value from loadPage. This is done here for simplicity -and generally considered bad practice. We will attend to this later. -

    - -

    -First, this function extracts the page title from r.URL.Path, -the path component of the request URL. -The Path is re-sliced with [len("/view/"):] to drop -the leading "/view/" component of the request path. -This is because the path will invariably begin with "/view/", -which is not part of the page's title. -

    - -

    -The function then loads the page data, formats the page with a string of simple -HTML, and writes it to w, the http.ResponseWriter. -

    - -

    -To use this handler, we rewrite our main function to -initialize http using the viewHandler to handle -any requests under the path /view/. -

    - -{{code "doc/articles/wiki/part2.go" `/^func main/` `/^}/`}} - -

    -Click here to view the code we've written so far. -

    - -

    -Let's create some page data (as test.txt), compile our code, and -try serving a wiki page. -

    - -

    -Open test.txt file in your editor, and save the string "Hello world" (without quotes) -in it. -

    - -
    -$ go build wiki.go
    -$ ./wiki
    -
    - -

    -(If you're using Windows you must type "wiki" without the -"./" to run the program.) -

    - -

    -With this web server running, a visit to http://localhost:8080/view/test -should show a page titled "test" containing the words "Hello world". -

    - -

    Editing Pages

    - -

    -A wiki is not a wiki without the ability to edit pages. Let's create two new -handlers: one named editHandler to display an 'edit page' form, -and the other named saveHandler to save the data entered via the -form. -

    - -

    -First, we add them to main(): -

    - -{{code "doc/articles/wiki/final-noclosure.go" `/^func main/` `/^}/`}} - -

    -The function editHandler loads the page -(or, if it doesn't exist, create an empty Page struct), -and displays an HTML form. -

    - -{{code "doc/articles/wiki/notemplate.go" `/^func editHandler/` `/^}/`}} - -

    -This function will work fine, but all that hard-coded HTML is ugly. -Of course, there is a better way. -

    - -

    The html/template package

    - -

    -The html/template package is part of the Go standard library. -We can use html/template to keep the HTML in a separate file, -allowing us to change the layout of our edit page without modifying the -underlying Go code. -

    - -

    -First, we must add html/template to the list of imports. We -also won't be using fmt anymore, so we have to remove that. -

    - -
    -import (
    -	"html/template"
    -	"io/ioutil"
    -	"net/http"
    -)
    -
    - -

    -Let's create a template file containing the HTML form. -Open a new file named edit.html, and add the following lines: -

    - -{{code "doc/articles/wiki/edit.html"}} - -

    -Modify editHandler to use the template, instead of the hard-coded -HTML: -

    - -{{code "doc/articles/wiki/final-noerror.go" `/^func editHandler/` `/^}/`}} - -

    -The function template.ParseFiles will read the contents of -edit.html and return a *template.Template. -

    - -

    -The method t.Execute executes the template, writing the -generated HTML to the http.ResponseWriter. -The .Title and .Body dotted identifiers refer to -p.Title and p.Body. -

    - -

    -Template directives are enclosed in double curly braces. -The printf "%s" .Body instruction is a function call -that outputs .Body as a string instead of a stream of bytes, -the same as a call to fmt.Printf. -The html/template package helps guarantee that only safe and -correct-looking HTML is generated by template actions. For instance, it -automatically escapes any greater than sign (>), replacing it -with &gt;, to make sure user data does not corrupt the form -HTML. -

    - -

    -Since we're working with templates now, let's create a template for our -viewHandler called view.html: -

    - -{{code "doc/articles/wiki/view.html"}} - -

    -Modify viewHandler accordingly: -

    - -{{code "doc/articles/wiki/final-noerror.go" `/^func viewHandler/` `/^}/`}} - -

    -Notice that we've used almost exactly the same templating code in both -handlers. Let's remove this duplication by moving the templating code -to its own function: -

    - -{{code "doc/articles/wiki/final-template.go" `/^func renderTemplate/` `/^}/`}} - -

    -And modify the handlers to use that function: -

    - -{{code "doc/articles/wiki/final-template.go" `/^func viewHandler/` `/^}/`}} -{{code "doc/articles/wiki/final-template.go" `/^func editHandler/` `/^}/`}} - -

    -If we comment out the registration of our unimplemented save handler in -main, we can once again build and test our program. -Click here to view the code we've written so far. -

    - -

    Handling non-existent pages

    - -

    -What if you visit -/view/APageThatDoesntExist? You'll see a page containing -HTML. This is because it ignores the error return value from -loadPage and continues to try and fill out the template -with no data. Instead, if the requested Page doesn't exist, it should -redirect the client to the edit Page so the content may be created: -

    - -{{code "doc/articles/wiki/part3-errorhandling.go" `/^func viewHandler/` `/^}/`}} - -

    -The http.Redirect function adds an HTTP status code of -http.StatusFound (302) and a Location -header to the HTTP response. -

    - -

    Saving Pages

    - -

    -The function saveHandler will handle the submission of forms -located on the edit pages. After uncommenting the related line in -main, let's implement the handler: -

    - -{{code "doc/articles/wiki/final-template.go" `/^func saveHandler/` `/^}/`}} - -

    -The page title (provided in the URL) and the form's only field, -Body, are stored in a new Page. -The save() method is then called to write the data to a file, -and the client is redirected to the /view/ page. -

    - -

    -The value returned by FormValue is of type string. -We must convert that value to []byte before it will fit into -the Page struct. We use []byte(body) to perform -the conversion. -

    - -

    Error handling

    - -

    -There are several places in our program where errors are being ignored. This -is bad practice, not least because when an error does occur the program will -have unintended behavior. A better solution is to handle the errors and return -an error message to the user. That way if something does go wrong, the server -will function exactly how we want and the user can be notified. -

    - -

    -First, let's handle the errors in renderTemplate: -

    - -{{code "doc/articles/wiki/final-parsetemplate.go" `/^func renderTemplate/` `/^}/`}} - -

    -The http.Error function sends a specified HTTP response code -(in this case "Internal Server Error") and error message. -Already the decision to put this in a separate function is paying off. -

    - -

    -Now let's fix up saveHandler: -

    - -{{code "doc/articles/wiki/part3-errorhandling.go" `/^func saveHandler/` `/^}/`}} - -

    -Any errors that occur during p.save() will be reported -to the user. -

    - -

    Template caching

    - -

    -There is an inefficiency in this code: renderTemplate calls -ParseFiles every time a page is rendered. -A better approach would be to call ParseFiles once at program -initialization, parsing all templates into a single *Template. -Then we can use the -ExecuteTemplate -method to render a specific template. -

    - -

    -First we create a global variable named templates, and initialize -it with ParseFiles. -

    - -{{code "doc/articles/wiki/final.go" `/var templates/`}} - -

    -The function template.Must is a convenience wrapper that panics -when passed a non-nil error value, and otherwise returns the -*Template unaltered. A panic is appropriate here; if the templates -can't be loaded the only sensible thing to do is exit the program. -

    - -

    -The ParseFiles function takes any number of string arguments that -identify our template files, and parses those files into templates that are -named after the base file name. If we were to add more templates to our -program, we would add their names to the ParseFiles call's -arguments. -

    - -

    -We then modify the renderTemplate function to call the -templates.ExecuteTemplate method with the name of the appropriate -template: -

    - -{{code "doc/articles/wiki/final.go" `/func renderTemplate/` `/^}/`}} - -

    -Note that the template name is the template file name, so we must -append ".html" to the tmpl argument. -

    - -

    Validation

    - -

    -As you may have observed, this program has a serious security flaw: a user -can supply an arbitrary path to be read/written on the server. To mitigate -this, we can write a function to validate the title with a regular expression. -

    - -

    -First, add "regexp" to the import list. -Then we can create a global variable to store our validation -expression: -

    - -{{code "doc/articles/wiki/final-noclosure.go" `/^var validPath/`}} - -

    -The function regexp.MustCompile will parse and compile the -regular expression, and return a regexp.Regexp. -MustCompile is distinct from Compile in that it will -panic if the expression compilation fails, while Compile returns -an error as a second parameter. -

    - -

    -Now, let's write a function that uses the validPath -expression to validate path and extract the page title: -

    - -{{code "doc/articles/wiki/final-noclosure.go" `/func getTitle/` `/^}/`}} - -

    -If the title is valid, it will be returned along with a nil -error value. If the title is invalid, the function will write a -"404 Not Found" error to the HTTP connection, and return an error to the -handler. To create a new error, we have to import the errors -package. -

    - -

    -Let's put a call to getTitle in each of the handlers: -

    - -{{code "doc/articles/wiki/final-noclosure.go" `/^func viewHandler/` `/^}/`}} -{{code "doc/articles/wiki/final-noclosure.go" `/^func editHandler/` `/^}/`}} -{{code "doc/articles/wiki/final-noclosure.go" `/^func saveHandler/` `/^}/`}} - -

    Introducing Function Literals and Closures

    - -

    -Catching the error condition in each handler introduces a lot of repeated code. -What if we could wrap each of the handlers in a function that does this -validation and error checking? Go's -function -literals provide a powerful means of abstracting functionality -that can help us here. -

    - -

    -First, we re-write the function definition of each of the handlers to accept -a title string: -

    - -
    -func viewHandler(w http.ResponseWriter, r *http.Request, title string)
    -func editHandler(w http.ResponseWriter, r *http.Request, title string)
    -func saveHandler(w http.ResponseWriter, r *http.Request, title string)
    -
    - -

    -Now let's define a wrapper function that takes a function of the above -type, and returns a function of type http.HandlerFunc -(suitable to be passed to the function http.HandleFunc): -

    - -
    -func makeHandler(fn func (http.ResponseWriter, *http.Request, string)) http.HandlerFunc {
    -	return func(w http.ResponseWriter, r *http.Request) {
    -		// Here we will extract the page title from the Request,
    -		// and call the provided handler 'fn'
    -	}
    -}
    -
    - -

    -The returned function is called a closure because it encloses values defined -outside of it. In this case, the variable fn (the single argument -to makeHandler) is enclosed by the closure. The variable -fn will be one of our save, edit, or view handlers. -

    - -

    -Now we can take the code from getTitle and use it here -(with some minor modifications): -

    - -{{code "doc/articles/wiki/final.go" `/func makeHandler/` `/^}/`}} - -

    -The closure returned by makeHandler is a function that takes -an http.ResponseWriter and http.Request (in other -words, an http.HandlerFunc). -The closure extracts the title from the request path, and -validates it with the validPath regexp. If the -title is invalid, an error will be written to the -ResponseWriter using the http.NotFound function. -If the title is valid, the enclosed handler function -fn will be called with the ResponseWriter, -Request, and title as arguments. -

    - -

    -Now we can wrap the handler functions with makeHandler in -main, before they are registered with the http -package: -

    - -{{code "doc/articles/wiki/final.go" `/func main/` `/^}/`}} - -

    -Finally we remove the calls to getTitle from the handler functions, -making them much simpler: -

    - -{{code "doc/articles/wiki/final.go" `/^func viewHandler/` `/^}/`}} -{{code "doc/articles/wiki/final.go" `/^func editHandler/` `/^}/`}} -{{code "doc/articles/wiki/final.go" `/^func saveHandler/` `/^}/`}} - -

    Try it out!

    - -

    -Click here to view the final code listing. -

    - -

    -Recompile the code, and run the app: -

    - -
    -$ go build wiki.go
    -$ ./wiki
    -
    - -

    -Visiting http://localhost:8080/view/ANewPage -should present you with the page edit form. You should then be able to -enter some text, click 'Save', and be redirected to the newly created page. -

    - -

    Other tasks

    - -

    -Here are some simple tasks you might want to tackle on your own: -

    - -
      -
    • Store templates in tmpl/ and page data in data/. -
    • Add a handler to make the web root redirect to - /view/FrontPage.
    • -
    • Spruce up the page templates by making them valid HTML and adding some - CSS rules.
    • -
    • Implement inter-page linking by converting instances of - [PageName] to
      - <a href="/view/PageName">PageName</a>. - (hint: you could use regexp.ReplaceAllFunc to do this) -
    • -
    diff --git a/doc/articles/wiki/notemplate.go b/doc/articles/wiki/notemplate.go deleted file mode 100644 index 4b358f298a..0000000000 --- a/doc/articles/wiki/notemplate.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "fmt" - "io/ioutil" - "log" - "net/http" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func viewHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/view/"):] - p, _ := loadPage(title) - fmt.Fprintf(w, "

    %s

    %s
    ", p.Title, p.Body) -} - -func editHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/edit/"):] - p, err := loadPage(title) - if err != nil { - p = &Page{Title: title} - } - fmt.Fprintf(w, "

    Editing %s

    "+ - "
    "+ - "
    "+ - ""+ - "
    ", - p.Title, p.Title, p.Body) -} - -func main() { - http.HandleFunc("/view/", viewHandler) - http.HandleFunc("/edit/", editHandler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/part1-noerror.go b/doc/articles/wiki/part1-noerror.go deleted file mode 100644 index 913c6dce2e..0000000000 --- a/doc/articles/wiki/part1-noerror.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "fmt" - "io/ioutil" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) *Page { - filename := title + ".txt" - body, _ := ioutil.ReadFile(filename) - return &Page{Title: title, Body: body} -} - -func main() { - p1 := &Page{Title: "TestPage", Body: []byte("This is a sample page.")} - p1.save() - p2 := loadPage("TestPage") - fmt.Println(string(p2.Body)) -} diff --git a/doc/articles/wiki/part1.go b/doc/articles/wiki/part1.go deleted file mode 100644 index 2ff1abd281..0000000000 --- a/doc/articles/wiki/part1.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "fmt" - "io/ioutil" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func main() { - p1 := &Page{Title: "TestPage", Body: []byte("This is a sample Page.")} - p1.save() - p2, _ := loadPage("TestPage") - fmt.Println(string(p2.Body)) -} diff --git a/doc/articles/wiki/part2.go b/doc/articles/wiki/part2.go deleted file mode 100644 index db92f4c710..0000000000 --- a/doc/articles/wiki/part2.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "fmt" - "io/ioutil" - "log" - "net/http" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func viewHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/view/"):] - p, _ := loadPage(title) - fmt.Fprintf(w, "

    %s

    %s
    ", p.Title, p.Body) -} - -func main() { - http.HandleFunc("/view/", viewHandler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/part3-errorhandling.go b/doc/articles/wiki/part3-errorhandling.go deleted file mode 100644 index 2c8b42d05a..0000000000 --- a/doc/articles/wiki/part3-errorhandling.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "html/template" - "io/ioutil" - "log" - "net/http" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { - t, _ := template.ParseFiles(tmpl + ".html") - t.Execute(w, p) -} - -func viewHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/view/"):] - p, err := loadPage(title) - if err != nil { - http.Redirect(w, r, "/edit/"+title, http.StatusFound) - return - } - renderTemplate(w, "view", p) -} - -func editHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/edit/"):] - p, err := loadPage(title) - if err != nil { - p = &Page{Title: title} - } - renderTemplate(w, "edit", p) -} - -func saveHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/save/"):] - body := r.FormValue("body") - p := &Page{Title: title, Body: []byte(body)} - err := p.save() - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - http.Redirect(w, r, "/view/"+title, http.StatusFound) -} - -func main() { - http.HandleFunc("/view/", viewHandler) - http.HandleFunc("/edit/", editHandler) - http.HandleFunc("/save/", saveHandler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/part3.go b/doc/articles/wiki/part3.go deleted file mode 100644 index 437ea336cb..0000000000 --- a/doc/articles/wiki/part3.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -import ( - "html/template" - "io/ioutil" - "log" - "net/http" -) - -type Page struct { - Title string - Body []byte -} - -func (p *Page) save() error { - filename := p.Title + ".txt" - return ioutil.WriteFile(filename, p.Body, 0600) -} - -func loadPage(title string) (*Page, error) { - filename := title + ".txt" - body, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return &Page{Title: title, Body: body}, nil -} - -func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) { - t, _ := template.ParseFiles(tmpl + ".html") - t.Execute(w, p) -} - -func viewHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/view/"):] - p, _ := loadPage(title) - renderTemplate(w, "view", p) -} - -func editHandler(w http.ResponseWriter, r *http.Request) { - title := r.URL.Path[len("/edit/"):] - p, err := loadPage(title) - if err != nil { - p = &Page{Title: title} - } - renderTemplate(w, "edit", p) -} - -func main() { - http.HandleFunc("/view/", viewHandler) - http.HandleFunc("/edit/", editHandler) - //http.HandleFunc("/save/", saveHandler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} diff --git a/doc/articles/wiki/test_Test.txt.good b/doc/articles/wiki/test_Test.txt.good deleted file mode 100644 index f0eec86f61..0000000000 --- a/doc/articles/wiki/test_Test.txt.good +++ /dev/null @@ -1 +0,0 @@ -some content \ No newline at end of file diff --git a/doc/articles/wiki/test_edit.good b/doc/articles/wiki/test_edit.good deleted file mode 100644 index 36c6dbb732..0000000000 --- a/doc/articles/wiki/test_edit.good +++ /dev/null @@ -1,6 +0,0 @@ -

    Editing Test

    - -
    -
    -
    -
    diff --git a/doc/articles/wiki/test_view.good b/doc/articles/wiki/test_view.good deleted file mode 100644 index 07e8edb22e..0000000000 --- a/doc/articles/wiki/test_view.good +++ /dev/null @@ -1,5 +0,0 @@ -

    Test

    - -

    [edit]

    - -
    some content
    diff --git a/doc/articles/wiki/view.html b/doc/articles/wiki/view.html deleted file mode 100644 index b1e87efe80..0000000000 --- a/doc/articles/wiki/view.html +++ /dev/null @@ -1,5 +0,0 @@ -

    {{.Title}}

    - -

    [edit]

    - -
    {{printf "%s" .Body}}
    diff --git a/doc/articles/wiki/wiki_test.go b/doc/articles/wiki/wiki_test.go deleted file mode 100644 index 1d976fd77e..0000000000 --- a/doc/articles/wiki/wiki_test.go +++ /dev/null @@ -1,165 +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 main_test - -import ( - "bytes" - "fmt" - "io/ioutil" - "net/http" - "os" - "os/exec" - "path/filepath" - "strings" - "testing" -) - -func TestSnippetsCompile(t *testing.T) { - if testing.Short() { - t.Skip("skipping slow builds in short mode") - } - - goFiles, err := filepath.Glob("*.go") - if err != nil { - t.Fatal(err) - } - - for _, f := range goFiles { - if strings.HasSuffix(f, "_test.go") { - continue - } - f := f - t.Run(f, func(t *testing.T) { - t.Parallel() - - cmd := exec.Command("go", "build", "-o", os.DevNull, f) - out, err := cmd.CombinedOutput() - if err != nil { - t.Errorf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out) - } - }) - } -} - -func TestWikiServer(t *testing.T) { - must := func(err error) { - if err != nil { - t.Helper() - t.Fatal(err) - } - } - - dir, err := ioutil.TempDir("", t.Name()) - must(err) - defer os.RemoveAll(dir) - - // We're testing a walkthrough example of how to write a server. - // - // That server hard-codes a port number to make the walkthrough simpler, but - // we can't assume that the hard-coded port is available on an arbitrary - // builder. So we'll patch out the hard-coded port, and replace it with a - // function that writes the server's address to stdout - // so that we can read it and know where to send the test requests. - - finalGo, err := ioutil.ReadFile("final.go") - must(err) - const patchOld = `log.Fatal(http.ListenAndServe(":8080", nil))` - patched := bytes.ReplaceAll(finalGo, []byte(patchOld), []byte(`log.Fatal(serve())`)) - if bytes.Equal(patched, finalGo) { - t.Fatalf("Can't patch final.go: %q not found.", patchOld) - } - must(ioutil.WriteFile(filepath.Join(dir, "final_patched.go"), patched, 0644)) - - // Build the server binary from the patched sources. - // The 'go' command requires that they all be in the same directory. - // final_test.go provides the implemtation for our serve function. - must(copyFile(filepath.Join(dir, "final_srv.go"), "final_test.go")) - cmd := exec.Command("go", "build", - "-o", filepath.Join(dir, "final.exe"), - filepath.Join(dir, "final_patched.go"), - filepath.Join(dir, "final_srv.go")) - out, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out) - } - - // Run the server in our temporary directory so that it can - // write its content there. It also needs a couple of template files, - // and looks for them in the same directory. - must(copyFile(filepath.Join(dir, "edit.html"), "edit.html")) - must(copyFile(filepath.Join(dir, "view.html"), "view.html")) - cmd = exec.Command(filepath.Join(dir, "final.exe")) - cmd.Dir = dir - stderr := bytes.NewBuffer(nil) - cmd.Stderr = stderr - stdout, err := cmd.StdoutPipe() - must(err) - must(cmd.Start()) - - defer func() { - cmd.Process.Kill() - err := cmd.Wait() - if stderr.Len() > 0 { - t.Logf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, stderr) - } - }() - - var addr string - if _, err := fmt.Fscanln(stdout, &addr); err != nil || addr == "" { - t.Fatalf("Failed to read server address: %v", err) - } - - // The server is up and has told us its address. - // Make sure that its HTTP API works as described in the article. - - r, err := http.Get(fmt.Sprintf("http://%s/edit/Test", addr)) - must(err) - responseMustMatchFile(t, r, "test_edit.good") - - r, err = http.Post(fmt.Sprintf("http://%s/save/Test", addr), - "application/x-www-form-urlencoded", - strings.NewReader("body=some%20content")) - must(err) - responseMustMatchFile(t, r, "test_view.good") - - gotTxt, err := ioutil.ReadFile(filepath.Join(dir, "Test.txt")) - must(err) - wantTxt, err := ioutil.ReadFile("test_Test.txt.good") - must(err) - if !bytes.Equal(wantTxt, gotTxt) { - t.Fatalf("Test.txt differs from expected after posting to /save.\ngot:\n%s\nwant:\n%s", gotTxt, wantTxt) - } - - r, err = http.Get(fmt.Sprintf("http://%s/view/Test", addr)) - must(err) - responseMustMatchFile(t, r, "test_view.good") -} - -func responseMustMatchFile(t *testing.T, r *http.Response, filename string) { - t.Helper() - - defer r.Body.Close() - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.Fatal(err) - } - - wantBody, err := ioutil.ReadFile(filename) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(body, wantBody) { - t.Fatalf("%v: body does not match %s.\ngot:\n%s\nwant:\n%s", r.Request.URL, filename, body, wantBody) - } -} - -func copyFile(dst, src string) error { - buf, err := ioutil.ReadFile(src) - if err != nil { - return err - } - return ioutil.WriteFile(dst, buf, 0644) -} diff --git a/doc/cmd.html b/doc/cmd.html deleted file mode 100644 index c3bd918144..0000000000 --- a/doc/cmd.html +++ /dev/null @@ -1,100 +0,0 @@ - - -

    -There is a suite of programs to build and process Go source code. -Instead of being run directly, programs in the suite are usually invoked -by the go program. -

    - -

    -The most common way to run these programs is as a subcommand of the go program, -for instance as go fmt. Run like this, the command operates on -complete packages of Go source code, with the go program invoking the -underlying binary with arguments appropriate to package-level processing. -

    - -

    -The programs can also be run as stand-alone binaries, with unmodified arguments, -using the go tool subcommand, such as go tool cgo. -For most commands this is mainly useful for debugging. -Some of the commands, such as pprof, are accessible only through -the go tool subcommand. -

    - -

    -Finally the fmt and godoc commands are installed -as regular binaries called gofmt and godoc because -they are so often referenced. -

    - -

    -Click on the links for more documentation, invocation methods, and usage details. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Name    Synopsis
    go     -The go program manages Go source code and runs the other -commands listed here. -See the command docs for usage -details. -
    cgo    Cgo enables the creation of Go packages that call C code.
    cover    Cover is a program for creating and analyzing the coverage profiles -generated by "go test -coverprofile".
    fix    Fix finds Go programs that use old features of the language and libraries -and rewrites them to use newer ones.
    fmt    Fmt formats Go packages, it is also available as an independent -gofmt command with more general options.
    godoc    Godoc extracts and generates documentation for Go packages.
    vet    Vet examines Go source code and reports suspicious constructs, such as Printf -calls whose arguments do not align with the format string.
    - -

    -This is an abridged list. See the full command reference -for documentation of the compilers and more. -

    diff --git a/doc/codewalk/codewalk.css b/doc/codewalk/codewalk.css deleted file mode 100644 index a0814e4d2d..0000000000 --- a/doc/codewalk/codewalk.css +++ /dev/null @@ -1,234 +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. -*/ - -#codewalk-main { - text-align: left; - width: 100%; - overflow: auto; -} - -#code-display { - border: 0; - width: 100%; -} - -.setting { - font-size: 8pt; - color: #888888; - padding: 5px; -} - -.hotkey { - text-decoration: underline; -} - -/* Style for Comments (the left-hand column) */ - -#comment-column { - margin: 0pt; - width: 30%; -} - -#comment-column.right { - float: right; -} - -#comment-column.left { - float: left; -} - -#comment-area { - overflow-x: hidden; - overflow-y: auto; -} - -.comment { - cursor: pointer; - font-size: 16px; - border: 2px solid #ba9836; - margin-bottom: 10px; - margin-right: 10px; /* yes, for both .left and .right */ -} - -.comment:last-child { - margin-bottom: 0px; -} - -.right .comment { - margin-left: 10px; -} - -.right .comment.first { -} - -.right .comment.last { -} - -.left .comment.first { -} - -.left .comment.last { -} - -.comment.selected { - border-color: #99b2cb; -} - -.right .comment.selected { - border-left-width: 12px; - margin-left: 0px; -} - -.left .comment.selected { - border-right-width: 12px; - margin-right: 0px; -} - -.comment-link { - display: none; -} - -.comment-title { - font-size: small; - font-weight: bold; - background-color: #fffff0; - padding-right: 10px; - padding-left: 10px; - padding-top: 5px; - padding-bottom: 5px; -} - -.right .comment-title { -} - -.left .comment-title { -} - -.comment.selected .comment-title { - background-color: #f8f8ff; -} - -.comment-text { - overflow: auto; - padding-left: 10px; - padding-right: 10px; - padding-top: 10px; - padding-bottom: 5px; - font-size: small; - line-height: 1.3em; -} - -.comment-text p { - margin-top: 0em; - margin-bottom: 0.5em; -} - -.comment-text p:last-child { - margin-bottom: 0em; -} - -.file-name { - font-size: x-small; - padding-top: 0px; - padding-bottom: 5px; -} - -.hidden-filepaths .file-name { - display: none; -} - -.path-dir { - color: #555; -} - -.path-file { - color: #555; -} - - -/* Style for Code (the right-hand column) */ - -/* Wrapper for the code column to make widths get calculated correctly */ -#code-column { - display: block; - position: relative; - margin: 0pt; - width: 70%; -} - -#code-column.left { - float: left; -} - -#code-column.right { - float: right; -} - -#code-area { - background-color: #f8f8ff; - border: 2px solid #99b2cb; - padding: 5px; -} - -.left #code-area { - margin-right: -1px; -} - -.right #code-area { - margin-left: -1px; -} - -#code-header { - margin-bottom: 5px; -} - -#code { - background-color: white; -} - -code { - font-size: 100%; -} - -.codewalkhighlight { - font-weight: bold; - background-color: #f8f8ff; -} - -#code-display { - margin-top: 0px; - margin-bottom: 0px; -} - -#sizer { - position: absolute; - cursor: col-resize; - left: 0px; - top: 0px; - width: 8px; -} - -/* Style for options (bottom strip) */ - -#code-options { - display: none; -} - -#code-options > span { - padding-right: 20px; -} - -#code-options .selected { - border-bottom: 1px dotted; -} - -#comment-options { - text-align: center; -} - -div#content { - padding-bottom: 0em; -} diff --git a/doc/codewalk/codewalk.js b/doc/codewalk/codewalk.js deleted file mode 100644 index 4f59a8fc89..0000000000 --- a/doc/codewalk/codewalk.js +++ /dev/null @@ -1,305 +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. - -/** - * A class to hold information about the Codewalk Viewer. - * @param {jQuery} context The top element in whose context the viewer should - * operate. It will not touch any elements above this one. - * @constructor - */ - var CodewalkViewer = function(context) { - this.context = context; - - /** - * The div that contains all of the comments and their controls. - */ - this.commentColumn = this.context.find('#comment-column'); - - /** - * The div that contains the comments proper. - */ - this.commentArea = this.context.find('#comment-area'); - - /** - * The div that wraps the iframe with the code, as well as the drop down menu - * listing the different files. - * @type {jQuery} - */ - this.codeColumn = this.context.find('#code-column'); - - /** - * The div that contains the code but excludes the options strip. - * @type {jQuery} - */ - this.codeArea = this.context.find('#code-area'); - - /** - * The iframe that holds the code (from Sourcerer). - * @type {jQuery} - */ - this.codeDisplay = this.context.find('#code-display'); - - /** - * The overlaid div used as a grab handle for sizing the code/comment panes. - * @type {jQuery} - */ - this.sizer = this.context.find('#sizer'); - - /** - * The full-screen overlay that ensures we don't lose track of the mouse - * while dragging. - * @type {jQuery} - */ - this.overlay = this.context.find('#overlay'); - - /** - * The hidden input field that we use to hold the focus so that we can detect - * shortcut keypresses. - * @type {jQuery} - */ - this.shortcutInput = this.context.find('#shortcut-input'); - - /** - * The last comment that was selected. - * @type {jQuery} - */ - this.lastSelected = null; -}; - -/** - * Minimum width of the comments or code pane, in pixels. - * @type {number} - */ -CodewalkViewer.MIN_PANE_WIDTH = 200; - -/** - * Navigate the code iframe to the given url and update the code popout link. - * @param {string} url The target URL. - * @param {Object} opt_window Window dependency injection for testing only. - */ -CodewalkViewer.prototype.navigateToCode = function(url, opt_window) { - if (!opt_window) opt_window = window; - // Each iframe is represented by two distinct objects in the DOM: an iframe - // object and a window object. These do not expose the same capabilities. - // Here we need to get the window representation to get the location member, - // so we access it directly through window[] since jQuery returns the iframe - // representation. - // We replace location rather than set so as not to create a history for code - // navigation. - opt_window['code-display'].location.replace(url); - var k = url.indexOf('&'); - if (k != -1) url = url.slice(0, k); - k = url.indexOf('fileprint='); - if (k != -1) url = url.slice(k+10, url.length); - this.context.find('#code-popout-link').attr('href', url); -}; - -/** - * Selects the first comment from the list and forces a refresh of the code - * view. - */ -CodewalkViewer.prototype.selectFirstComment = function() { - // TODO(rsc): handle case where there are no comments - var firstSourcererLink = this.context.find('.comment:first'); - this.changeSelectedComment(firstSourcererLink); -}; - -/** - * Sets the target on all links nested inside comments to be _blank. - */ -CodewalkViewer.prototype.targetCommentLinksAtBlank = function() { - this.context.find('.comment a[href], #description a[href]').each(function() { - if (!this.target) this.target = '_blank'; - }); -}; - -/** - * Installs event handlers for all the events we care about. - */ -CodewalkViewer.prototype.installEventHandlers = function() { - var self = this; - - this.context.find('.comment') - .click(function(event) { - if (jQuery(event.target).is('a[href]')) return true; - self.changeSelectedComment(jQuery(this)); - return false; - }); - - this.context.find('#code-selector') - .change(function() {self.navigateToCode(jQuery(this).val());}); - - this.context.find('#description-table .quote-feet.setting') - .click(function() {self.toggleDescription(jQuery(this)); return false;}); - - this.sizer - .mousedown(function(ev) {self.startSizerDrag(ev); return false;}); - this.overlay - .mouseup(function(ev) {self.endSizerDrag(ev); return false;}) - .mousemove(function(ev) {self.handleSizerDrag(ev); return false;}); - - this.context.find('#prev-comment') - .click(function() { - self.changeSelectedComment(self.lastSelected.prev()); return false; - }); - - this.context.find('#next-comment') - .click(function() { - self.changeSelectedComment(self.lastSelected.next()); return false; - }); - - // Workaround for Firefox 2 and 3, which steal focus from the main document - // whenever the iframe content is (re)loaded. The input field is not shown, - // but is a way for us to bring focus back to a place where we can detect - // keypresses. - this.context.find('#code-display') - .load(function(ev) {self.shortcutInput.focus();}); - - jQuery(document).keypress(function(ev) { - switch(ev.which) { - case 110: // 'n' - self.changeSelectedComment(self.lastSelected.next()); - return false; - case 112: // 'p' - self.changeSelectedComment(self.lastSelected.prev()); - return false; - default: // ignore - } - }); - - window.onresize = function() {self.updateHeight();}; -}; - -/** - * Starts dragging the pane sizer. - * @param {Object} ev The mousedown event that started us dragging. - */ -CodewalkViewer.prototype.startSizerDrag = function(ev) { - this.initialCodeWidth = this.codeColumn.width(); - this.initialCommentsWidth = this.commentColumn.width(); - this.initialMouseX = ev.pageX; - this.overlay.show(); -}; - -/** - * Handles dragging the pane sizer. - * @param {Object} ev The mousemove event updating dragging position. - */ -CodewalkViewer.prototype.handleSizerDrag = function(ev) { - var delta = ev.pageX - this.initialMouseX; - if (this.codeColumn.is('.right')) delta = -delta; - var proposedCodeWidth = this.initialCodeWidth + delta; - var proposedCommentWidth = this.initialCommentsWidth - delta; - var mw = CodewalkViewer.MIN_PANE_WIDTH; - if (proposedCodeWidth < mw) delta = mw - this.initialCodeWidth; - if (proposedCommentWidth < mw) delta = this.initialCommentsWidth - mw; - proposedCodeWidth = this.initialCodeWidth + delta; - proposedCommentWidth = this.initialCommentsWidth - delta; - // If window is too small, don't even try to resize. - if (proposedCodeWidth < mw || proposedCommentWidth < mw) return; - this.codeColumn.width(proposedCodeWidth); - this.commentColumn.width(proposedCommentWidth); - this.options.codeWidth = parseInt( - this.codeColumn.width() / - (this.codeColumn.width() + this.commentColumn.width()) * 100); - this.context.find('#code-column-width').text(this.options.codeWidth + '%'); -}; - -/** - * Ends dragging the pane sizer. - * @param {Object} ev The mouseup event that caused us to stop dragging. - */ -CodewalkViewer.prototype.endSizerDrag = function(ev) { - this.overlay.hide(); - this.updateHeight(); -}; - -/** - * Toggles the Codewalk description between being shown and hidden. - * @param {jQuery} target The target that was clicked to trigger this function. - */ -CodewalkViewer.prototype.toggleDescription = function(target) { - var description = this.context.find('#description'); - description.toggle(); - target.find('span').text(description.is(':hidden') ? 'show' : 'hide'); - this.updateHeight(); -}; - -/** - * Changes the side of the window on which the code is shown and saves the - * setting in a cookie. - * @param {string?} codeSide The side on which the code should be, either - * 'left' or 'right'. - */ -CodewalkViewer.prototype.changeCodeSide = function(codeSide) { - var commentSide = codeSide == 'left' ? 'right' : 'left'; - this.context.find('#set-code-' + codeSide).addClass('selected'); - this.context.find('#set-code-' + commentSide).removeClass('selected'); - // Remove previous side class and add new one. - this.codeColumn.addClass(codeSide).removeClass(commentSide); - this.commentColumn.addClass(commentSide).removeClass(codeSide); - this.sizer.css(codeSide, 'auto').css(commentSide, 0); - this.options.codeSide = codeSide; -}; - -/** - * Adds selected class to newly selected comment, removes selected style from - * previously selected comment, changes drop down options so that the correct - * file is selected, and updates the code popout link. - * @param {jQuery} target The target that was clicked to trigger this function. - */ -CodewalkViewer.prototype.changeSelectedComment = function(target) { - var currentFile = target.find('.comment-link').attr('href'); - if (!currentFile) return; - - if (!(this.lastSelected && this.lastSelected.get(0) === target.get(0))) { - if (this.lastSelected) this.lastSelected.removeClass('selected'); - target.addClass('selected'); - this.lastSelected = target; - var targetTop = target.position().top; - var parentTop = target.parent().position().top; - if (targetTop + target.height() > parentTop + target.parent().height() || - targetTop < parentTop) { - var delta = targetTop - parentTop; - target.parent().animate( - {'scrollTop': target.parent().scrollTop() + delta}, - Math.max(delta / 2, 200), 'swing'); - } - var fname = currentFile.match(/(?:select=|fileprint=)\/[^&]+/)[0]; - fname = fname.slice(fname.indexOf('=')+2, fname.length); - this.context.find('#code-selector').val(fname); - this.context.find('#prev-comment').toggleClass( - 'disabled', !target.prev().length); - this.context.find('#next-comment').toggleClass( - 'disabled', !target.next().length); - } - - // Force original file even if user hasn't changed comments since they may - // have navigated away from it within the iframe without us knowing. - this.navigateToCode(currentFile); -}; - -/** - * Updates the viewer by changing the height of the comments and code so that - * they fit within the height of the window. The function is typically called - * after the user changes the window size. - */ -CodewalkViewer.prototype.updateHeight = function() { - var windowHeight = jQuery(window).height() - 5 // GOK - var areaHeight = windowHeight - this.codeArea.offset().top - var footerHeight = this.context.find('#footer').outerHeight(true) - this.commentArea.height(areaHeight - footerHeight - this.context.find('#comment-options').outerHeight(true)) - var codeHeight = areaHeight - footerHeight - 15 // GOK - this.codeArea.height(codeHeight) - this.codeDisplay.height(codeHeight - this.codeDisplay.offset().top + this.codeArea.offset().top); - this.sizer.height(codeHeight); -}; - -window.initFuncs.push(function() { - var viewer = new CodewalkViewer(jQuery('#codewalk-main')); - viewer.selectFirstComment(); - viewer.targetCommentLinksAtBlank(); - viewer.installEventHandlers(); - viewer.updateHeight(); -}); diff --git a/doc/codewalk/codewalk.xml b/doc/codewalk/codewalk.xml deleted file mode 100644 index 34e6e91938..0000000000 --- a/doc/codewalk/codewalk.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - A codewalk is a guided tour through a piece of code. - It consists of a sequence of steps, each typically explaining - a highlighted section of code. -

    - - The godoc web server translates - an XML file like the one in the main window pane into the HTML - page that you're viewing now. -

    - - The codewalk with URL path /doc/codewalk/name - is loaded from the input file $GOROOT/doc/codewalk/name.xml. -

    - - This codewalk explains how to write a codewalk by examining - its own source code, - $GOROOT/doc/codewalk/codewalk.xml, - shown in the main window pane to the left. -
    - - - The codewalk input file is an XML file containing a single - <codewalk> element. - That element's title attribute gives the title - that is used both on the codewalk page and in the codewalk list. - - - - Each step in the codewalk is a <step> element - nested inside the main <codewalk>. - The step element's title attribute gives the step's title, - which is shown in a shaded bar above the main step text. - The element's src attribute specifies the source - code to show in the main window pane and, optionally, a range of - lines to highlight. -

    - - The first step in this codewalk does not highlight any lines: - its src is just a file name. -
    - - - The most complex part of the codewalk specification is - saying what lines to highlight. - Instead of ordinary line numbers, - the codewalk uses an address syntax that makes it possible - to describe the match by its content. - As the file gets edited, this descriptive address has a better - chance to continue to refer to the right section of the file. -

    - - To specify a source line, use a src attribute of the form - filename:address, - where address is an address in the syntax used by the text editors sam and acme. -

    - - The simplest address is a single regular expression. - The highlighted line in the main window pane shows that the - address for the “Title” step was /title=/, - which matches the first instance of that regular expression (title=) in the file. -
    - - - To highlight a range of source lines, the simplest address to use is - a pair of regular expressions - /regexp1/,/regexp2/. - The highlight begins with the line containing the first match for regexp1 - and ends with the line containing the first match for regexp2 - after the end of the match for regexp1. - Ignoring the HTML quoting, - The line containing the first match for regexp1 will be the first one highlighted, - and the line containing the first match for regexp2. -

    - - The address /<step/,/step>/ looks for the first instance of - <step in the file, and then starting after that point, - looks for the first instance of step>. - (Click on the “Steps” step above to see the highlight in action.) - Note that the < and > had to be written - using XML escapes in order to be valid XML. -
    - - - The /regexp/ - and /regexp1/,/regexp2/ - forms suffice for most highlighting. -

    - - The full address syntax is summarized in this table - (an excerpt of Table II from - The text editor sam): -

    - - - - - - - - - - - - - - - - - - - - -
    Simple addresses
    #nThe empty string after character n
    nLine n
    /regexp/The first following match of the regular expression
    $The null string at the end of the file
    Compound addresses
    a1+a2The address a2 evaluated starting at the right of a1
    a1-a2The address a2 evaluated in the reverse direction starting at the left of a1
    a1,a2From the left of a1 to the right of a2 (default 0,$).
    -
    - - - -
    diff --git a/doc/codewalk/codewalk_test.go b/doc/codewalk/codewalk_test.go deleted file mode 100644 index 31f078ac26..0000000000 --- a/doc/codewalk/codewalk_test.go +++ /dev/null @@ -1,52 +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 main_test - -import ( - "bytes" - "os" - "os/exec" - "strings" - "testing" -) - -// TestMarkov tests the code dependency of markov.xml. -func TestMarkov(t *testing.T) { - cmd := exec.Command("go", "run", "markov.go") - cmd.Stdin = strings.NewReader("foo") - cmd.Stderr = bytes.NewBuffer(nil) - out, err := cmd.Output() - if err != nil { - t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) - } - - if !bytes.Equal(out, []byte("foo\n")) { - t.Fatalf(`%s with input "foo" did not output "foo":\n%s`, strings.Join(cmd.Args, " "), out) - } -} - -// TestPig tests the code dependency of functions.xml. -func TestPig(t *testing.T) { - cmd := exec.Command("go", "run", "pig.go") - cmd.Stderr = bytes.NewBuffer(nil) - out, err := cmd.Output() - if err != nil { - t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) - } - - const want = "Wins, losses staying at k = 100: 210/990 (21.2%), 780/990 (78.8%)\n" - if !bytes.Contains(out, []byte(want)) { - t.Fatalf(`%s: unexpected output\ngot:\n%s\nwant output containing:\n%s`, strings.Join(cmd.Args, " "), out, want) - } -} - -// TestURLPoll tests the code dependency of sharemem.xml. -func TestURLPoll(t *testing.T) { - cmd := exec.Command("go", "build", "-o", os.DevNull, "urlpoll.go") - out, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out) - } -} diff --git a/doc/codewalk/functions.xml b/doc/codewalk/functions.xml deleted file mode 100644 index db518dcc06..0000000000 --- a/doc/codewalk/functions.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - Go supports first class functions, higher-order functions, user-defined - function types, function literals, closures, and multiple return values. -

    - - This rich feature set supports a functional programming style in a strongly - typed language. -

    - - In this codewalk we will look at a simple program that simulates a dice game - called Pig and evaluates - basic strategies. -
    - - - Pig is a two-player game played with a 6-sided die. Each turn, you may roll or stay. -
      -
    • If you roll a 1, you lose all points for your turn and play passes to - your opponent. Any other roll adds its value to your turn score.
    • -
    • If you stay, your turn score is added to your total score, and play passes - to your opponent.
    • -
    - - The first person to reach 100 total points wins. -

    - - The score type stores the scores of the current and opposing - players, in addition to the points accumulated during the current turn. -
    - - - In Go, functions can be passed around just like any other value. A function's - type signature describes the types of its arguments and return values. -

    - - The action type is a function that takes a score - and returns the resulting score and whether the current turn is - over. -

    - - If the turn is over, the player and opponent fields - in the resulting score should be swapped, as it is now the other player's - turn. -
    - - - Go functions can return multiple values. -

    - - The functions roll and stay each return a pair of - values. They also match the action type signature. These - action functions define the rules of Pig. -
    - - - A function can use other functions as arguments and return values. -

    - - A strategy is a function that takes a score as input - and returns an action to perform.
    - (Remember, an action is itself a function.) -
    - - - Anonymous functions can be declared in Go, as in this example. Function - literals are closures: they inherit the scope of the function in which they - are declared. -

    - - One basic strategy in Pig is to continue rolling until you have accumulated at - least k points in a turn, and then stay. The argument k is - enclosed by this function literal, which matches the strategy type - signature. -
    - - - We simulate a game of Pig by calling an action to update the - score until one player reaches 100 points. Each - action is selected by calling the strategy function - associated with the current player. - - - - The roundRobin function simulates a tournament and tallies wins. - Each strategy plays each other strategy gamesPerSeries times. - - - - Variadic functions like ratioString take a variable number of - arguments. These arguments are available as a slice inside the function. - - - - The main function defines 100 basic strategies, simulates a round - robin tournament, and then prints the win/loss record of each strategy. -

    - - Among these strategies, staying at 25 is best, but the optimal strategy for - Pig is much more complex. -
    - -
    diff --git a/doc/codewalk/markov.go b/doc/codewalk/markov.go deleted file mode 100644 index 5f62e05144..0000000000 --- a/doc/codewalk/markov.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Generating random text: a Markov chain algorithm - -Based on the program presented in the "Design and Implementation" chapter -of The Practice of Programming (Kernighan and Pike, Addison-Wesley 1999). -See also Computer Recreations, Scientific American 260, 122 - 125 (1989). - -A Markov chain algorithm generates text by creating a statistical model of -potential textual suffixes for a given prefix. Consider this text: - - I am not a number! I am a free man! - -Our Markov chain algorithm would arrange this text into this set of prefixes -and suffixes, or "chain": (This table assumes a prefix length of two words.) - - Prefix Suffix - - "" "" I - "" I am - I am a - I am not - a free man! - am a free - am not a - a number! I - number! I am - not a number! - -To generate text using this table we select an initial prefix ("I am", for -example), choose one of the suffixes associated with that prefix at random -with probability determined by the input statistics ("a"), -and then create a new prefix by removing the first word from the prefix -and appending the suffix (making the new prefix is "am a"). Repeat this process -until we can't find any suffixes for the current prefix or we exceed the word -limit. (The word limit is necessary as the chain table may contain cycles.) - -Our version of this program reads text from standard input, parsing it into a -Markov chain, and writes generated text to standard output. -The prefix and output lengths can be specified using the -prefix and -words -flags on the command-line. -*/ -package main - -import ( - "bufio" - "flag" - "fmt" - "io" - "math/rand" - "os" - "strings" - "time" -) - -// Prefix is a Markov chain prefix of one or more words. -type Prefix []string - -// String returns the Prefix as a string (for use as a map key). -func (p Prefix) String() string { - return strings.Join(p, " ") -} - -// Shift removes the first word from the Prefix and appends the given word. -func (p Prefix) Shift(word string) { - copy(p, p[1:]) - p[len(p)-1] = word -} - -// Chain contains a map ("chain") of prefixes to a list of suffixes. -// A prefix is a string of prefixLen words joined with spaces. -// A suffix is a single word. A prefix can have multiple suffixes. -type Chain struct { - chain map[string][]string - prefixLen int -} - -// NewChain returns a new Chain with prefixes of prefixLen words. -func NewChain(prefixLen int) *Chain { - return &Chain{make(map[string][]string), prefixLen} -} - -// Build reads text from the provided Reader and -// parses it into prefixes and suffixes that are stored in Chain. -func (c *Chain) Build(r io.Reader) { - br := bufio.NewReader(r) - p := make(Prefix, c.prefixLen) - for { - var s string - if _, err := fmt.Fscan(br, &s); err != nil { - break - } - key := p.String() - c.chain[key] = append(c.chain[key], s) - p.Shift(s) - } -} - -// Generate returns a string of at most n words generated from Chain. -func (c *Chain) Generate(n int) string { - p := make(Prefix, c.prefixLen) - var words []string - for i := 0; i < n; i++ { - choices := c.chain[p.String()] - if len(choices) == 0 { - break - } - next := choices[rand.Intn(len(choices))] - words = append(words, next) - p.Shift(next) - } - return strings.Join(words, " ") -} - -func main() { - // Register command-line flags. - numWords := flag.Int("words", 100, "maximum number of words to print") - prefixLen := flag.Int("prefix", 2, "prefix length in words") - - flag.Parse() // Parse command-line flags. - rand.Seed(time.Now().UnixNano()) // Seed the random number generator. - - c := NewChain(*prefixLen) // Initialize a new Chain. - c.Build(os.Stdin) // Build chains from standard input. - text := c.Generate(*numWords) // Generate text. - fmt.Println(text) // Write text to standard output. -} diff --git a/doc/codewalk/markov.xml b/doc/codewalk/markov.xml deleted file mode 100644 index 7e44840dc4..0000000000 --- a/doc/codewalk/markov.xml +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - This codewalk describes a program that generates random text using - a Markov chain algorithm. The package comment describes the algorithm - and the operation of the program. Please read it before continuing. - - - - A chain consists of a prefix and a suffix. Each prefix is a set - number of words, while a suffix is a single word. - A prefix can have an arbitrary number of suffixes. - To model this data, we use a map[string][]string. - Each map key is a prefix (a string) and its values are - lists of suffixes (a slice of strings, []string). -

    - Here is the example table from the package comment - as modeled by this data structure: -
    -map[string][]string{
    -	" ":          {"I"},
    -	" I":         {"am"},
    -	"I am":       {"a", "not"},
    -	"a free":     {"man!"},
    -	"am a":       {"free"},
    -	"am not":     {"a"},
    -	"a number!":  {"I"},
    -	"number! I":  {"am"},
    -	"not a":      {"number!"},
    -}
    - While each prefix consists of multiple words, we - store prefixes in the map as a single string. - It would seem more natural to store the prefix as a - []string, but we can't do this with a map because the - key type of a map must implement equality (and slices do not). -

    - Therefore, in most of our code we will model prefixes as a - []string and join the strings together with a space - to generate the map key: -
    -Prefix               Map key
    -
    -[]string{"", ""}     " "
    -[]string{"", "I"}    " I"
    -[]string{"I", "am"}  "I am"
    -
    -
    - - - The complete state of the chain table consists of the table itself and - the word length of the prefixes. The Chain struct stores - this data. - - - - The Chain struct has two unexported fields (those that - do not begin with an upper case character), and so we write a - NewChain constructor function that initializes the - chain map with make and sets the - prefixLen field. -

    - This is constructor function is not strictly necessary as this entire - program is within a single package (main) and therefore - there is little practical difference between exported and unexported - fields. We could just as easily write out the contents of this function - when we want to construct a new Chain. - But using these unexported fields is good practice; it clearly denotes - that only methods of Chain and its constructor function should access - those fields. Also, structuring Chain like this means we - could easily move it into its own package at some later date. -
    - - - Since we'll be working with prefixes often, we define a - Prefix type with the concrete type []string. - Defining a named type clearly allows us to be explicit when we are - working with a prefix instead of just a []string. - Also, in Go we can define methods on any named type (not just structs), - so we can add methods that operate on Prefix if we need to. - - - - The first method we define on Prefix is - String. It returns a string representation - of a Prefix by joining the slice elements together with - spaces. We will use this method to generate keys when working with - the chain map. - - - - The Build method reads text from an io.Reader - and parses it into prefixes and suffixes that are stored in the - Chain. -

    - The io.Reader is an - interface type that is widely used by the standard library and - other Go code. Our code uses the - fmt.Fscan function, which - reads space-separated values from an io.Reader. -

    - The Build method returns once the Reader's - Read method returns io.EOF (end of file) - or some other read error occurs. -
    - - - This function does many small reads, which can be inefficient for some - Readers. For efficiency we wrap the provided - io.Reader with - bufio.NewReader to create a - new io.Reader that provides buffering. - - - - At the top of the function we make a Prefix slice - p using the Chain's prefixLen - field as its length. - We'll use this variable to hold the current prefix and mutate it with - each new word we encounter. - - - - In our loop we read words from the Reader into a - string variable s using - fmt.Fscan. Since Fscan uses space to - separate each input value, each call will yield just one word - (including punctuation), which is exactly what we need. -

    - Fscan returns an error if it encounters a read error - (io.EOF, for example) or if it can't scan the requested - value (in our case, a single string). In either case we just want to - stop scanning, so we break out of the loop. -
    - - - The word stored in s is a new suffix. We add the new - prefix/suffix combination to the chain map by computing - the map key with p.String and appending the suffix - to the slice stored under that key. -

    - The built-in append function appends elements to a slice - and allocates new storage when necessary. When the provided slice is - nil, append allocates a new slice. - This behavior conveniently ties in with the semantics of our map: - retrieving an unset key returns the zero value of the value type and - the zero value of []string is nil. - When our program encounters a new prefix (yielding a nil - value in the map) append will allocate a new slice. -

    - For more information about the append function and slices - in general see the - Slices: usage and internals article. -
    - - - Before reading the next word our algorithm requires us to drop the - first word from the prefix and push the current suffix onto the prefix. -

    - When in this state -
    -p == Prefix{"I", "am"}
    -s == "not" 
    - the new value for p would be -
    -p == Prefix{"am", "not"}
    - This operation is also required during text generation so we put - the code to perform this mutation of the slice inside a method on - Prefix named Shift. -
    - - - The Shift method uses the built-in copy - function to copy the last len(p)-1 elements of p to - the start of the slice, effectively moving the elements - one index to the left (if you consider zero as the leftmost index). -
    -p := Prefix{"I", "am"}
    -copy(p, p[1:])
    -// p == Prefix{"am", "am"}
    - We then assign the provided word to the last index - of the slice: -
    -// suffix == "not"
    -p[len(p)-1] = suffix
    -// p == Prefix{"am", "not"}
    -
    - - - The Generate method is similar to Build - except that instead of reading words from a Reader - and storing them in a map, it reads words from the map and - appends them to a slice (words). -

    - Generate uses a conditional for loop to generate - up to n words. -
    - - - At each iteration of the loop we retrieve a list of potential suffixes - for the current prefix. We access the chain map at key - p.String() and assign its contents to choices. -

    - If len(choices) is zero we break out of the loop as there - are no potential suffixes for that prefix. - This test also works if the key isn't present in the map at all: - in that case, choices will be nil and the - length of a nil slice is zero. -
    - - - To choose a suffix we use the - rand.Intn function. - It returns a random integer up to (but not including) the provided - value. Passing in len(choices) gives us a random index - into the full length of the list. -

    - We use that index to pick our new suffix, assign it to - next and append it to the words slice. -

    - Next, we Shift the new suffix onto the prefix just as - we did in the Build method. -
    - - - Before returning the generated text as a string, we use the - strings.Join function to join the elements of - the words slice together, separated by spaces. - - - - To make it easy to tweak the prefix and generated text lengths we - use the flag package to parse - command-line flags. -

    - These calls to flag.Int register new flags with the - flag package. The arguments to Int are the - flag name, its default value, and a description. The Int - function returns a pointer to an integer that will contain the - user-supplied value (or the default value if the flag was omitted on - the command-line). -
    - - - The main function begins by parsing the command-line - flags with flag.Parse and seeding the rand - package's random number generator with the current time. -

    - If the command-line flags provided by the user are invalid the - flag.Parse function will print an informative usage - message and terminate the program. -
    - - - To create the new Chain we call NewChain - with the value of the prefix flag. -

    - To build the chain we call Build with - os.Stdin (which implements io.Reader) so - that it will read its input from standard input. -
    - - - Finally, to generate text we call Generate with - the value of the words flag and assigning the result - to the variable text. -

    - Then we call fmt.Println to write the text to standard - output, followed by a carriage return. -
    - - - To use this program, first build it with the - go command: -
    -$ go build markov.go
    - And then execute it while piping in some input text: -
    -$ echo "a man a plan a canal panama" \
    -	| ./markov -prefix=1
    -a plan a man a plan a canal panama
    - Here's a transcript of generating some text using the Go distribution's - README file as source material: -
    -$ ./markov -words=10 < $GOROOT/README
    -This is the source code repository for the Go source
    -$ ./markov -prefix=1 -words=10 < $GOROOT/README
    -This is the go directory (the one containing this README).
    -$ ./markov -prefix=1 -words=10 < $GOROOT/README
    -This is the variable if you have just untarred a
    -
    - - - The Generate function does a lot of allocations when it - builds the words slice. As an exercise, modify it to - take an io.Writer to which it incrementally writes the - generated text with Fprint. - Aside from being more efficient this makes Generate - more symmetrical to Build. - - -
    diff --git a/doc/codewalk/pig.go b/doc/codewalk/pig.go deleted file mode 100644 index 941daaed16..0000000000 --- a/doc/codewalk/pig.go +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2011 The Go Authors. 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" - "math/rand" -) - -const ( - win = 100 // The winning score in a game of Pig - gamesPerSeries = 10 // The number of games per series to simulate -) - -// A score includes scores accumulated in previous turns for each player, -// as well as the points scored by the current player in this turn. -type score struct { - player, opponent, thisTurn int -} - -// An action transitions stochastically to a resulting score. -type action func(current score) (result score, turnIsOver bool) - -// roll returns the (result, turnIsOver) outcome of simulating a die roll. -// If the roll value is 1, then thisTurn score is abandoned, and the players' -// roles swap. Otherwise, the roll value is added to thisTurn. -func roll(s score) (score, bool) { - outcome := rand.Intn(6) + 1 // A random int in [1, 6] - if outcome == 1 { - return score{s.opponent, s.player, 0}, true - } - return score{s.player, s.opponent, outcome + s.thisTurn}, false -} - -// stay returns the (result, turnIsOver) outcome of staying. -// thisTurn score is added to the player's score, and the players' roles swap. -func stay(s score) (score, bool) { - return score{s.opponent, s.player + s.thisTurn, 0}, true -} - -// A strategy chooses an action for any given score. -type strategy func(score) action - -// stayAtK returns a strategy that rolls until thisTurn is at least k, then stays. -func stayAtK(k int) strategy { - return func(s score) action { - if s.thisTurn >= k { - return stay - } - return roll - } -} - -// play simulates a Pig game and returns the winner (0 or 1). -func play(strategy0, strategy1 strategy) int { - strategies := []strategy{strategy0, strategy1} - var s score - var turnIsOver bool - currentPlayer := rand.Intn(2) // Randomly decide who plays first - for s.player+s.thisTurn < win { - action := strategies[currentPlayer](s) - s, turnIsOver = action(s) - if turnIsOver { - currentPlayer = (currentPlayer + 1) % 2 - } - } - return currentPlayer -} - -// roundRobin simulates a series of games between every pair of strategies. -func roundRobin(strategies []strategy) ([]int, int) { - wins := make([]int, len(strategies)) - for i := 0; i < len(strategies); i++ { - for j := i + 1; j < len(strategies); j++ { - for k := 0; k < gamesPerSeries; k++ { - winner := play(strategies[i], strategies[j]) - if winner == 0 { - wins[i]++ - } else { - wins[j]++ - } - } - } - } - gamesPerStrategy := gamesPerSeries * (len(strategies) - 1) // no self play - return wins, gamesPerStrategy -} - -// ratioString takes a list of integer values and returns a string that lists -// each value and its percentage of the sum of all values. -// e.g., ratios(1, 2, 3) = "1/6 (16.7%), 2/6 (33.3%), 3/6 (50.0%)" -func ratioString(vals ...int) string { - total := 0 - for _, val := range vals { - total += val - } - s := "" - for _, val := range vals { - if s != "" { - s += ", " - } - pct := 100 * float64(val) / float64(total) - s += fmt.Sprintf("%d/%d (%0.1f%%)", val, total, pct) - } - return s -} - -func main() { - strategies := make([]strategy, win) - for k := range strategies { - strategies[k] = stayAtK(k + 1) - } - wins, games := roundRobin(strategies) - - for k := range strategies { - fmt.Printf("Wins, losses staying at k =% 4d: %s\n", - k+1, ratioString(wins[k], games-wins[k])) - } -} diff --git a/doc/codewalk/popout.png b/doc/codewalk/popout.png deleted file mode 100644 index 9c0c23638bd536fb1ab1bdc7f11e2d86d7671016..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>l-x?T^wng|8C% z{*IUr{p@UG>gm(jXY(25&EAbP0l+XkKu+&RC diff --git a/doc/codewalk/sharemem.xml b/doc/codewalk/sharemem.xml deleted file mode 100644 index 8b47f12b7a..0000000000 --- a/doc/codewalk/sharemem.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - -Go's approach to concurrency differs from the traditional use of -threads and shared memory. Philosophically, it can be summarized: -

    -Don't communicate by sharing memory; share memory by communicating. -

    -Channels allow you to pass references to data structures between goroutines. -If you consider this as passing around ownership of the data (the ability to -read and write it), they become a powerful and expressive synchronization -mechanism. -

    -In this codewalk we will look at a simple program that polls a list of -URLs, checking their HTTP response codes and periodically printing their state. -
    - - -The State type represents the state of a URL. -

    -The Pollers send State values to the StateMonitor, -which maintains a map of the current state of each URL. -
    - - -A Resource represents the state of a URL to be polled: the URL itself -and the number of errors encountered since the last successful poll. -

    -When the program starts, it allocates one Resource for each URL. -The main goroutine and the Poller goroutines send the Resources to -each other on channels. -
    - - -Each Poller receives Resource pointers from an input channel. -In this program, the convention is that sending a Resource pointer on -a channel passes ownership of the underlying data from the sender -to the receiver. Because of this convention, we know that -no two goroutines will access this Resource at the same time. -This means we don't have to worry about locking to prevent concurrent -access to these data structures. -

    -The Poller processes the Resource by calling its Poll method. -

    -It sends a State value to the status channel, to inform the StateMonitor -of the result of the Poll. -

    -Finally, it sends the Resource pointer to the out channel. This can be -interpreted as the Poller saying "I'm done with this Resource" and -returning ownership of it to the main goroutine. -

    -Several goroutines run Pollers, processing Resources in parallel. -
    - - -The Poll method (of the Resource type) performs an HTTP HEAD request -for the Resource's URL and returns the HTTP response's status code. -If an error occurs, Poll logs the message to standard error and returns the -error string instead. - - - -The main function starts the Poller and StateMonitor goroutines -and then loops passing completed Resources back to the pending -channel after appropriate delays. - - - -First, main makes two channels of *Resource, pending and complete. -

    -Inside main, a new goroutine sends one Resource per URL to pending -and the main goroutine receives completed Resources from complete. -

    -The pending and complete channels are passed to each of the Poller -goroutines, within which they are known as in and out. -
    - - -StateMonitor will initialize and launch a goroutine that stores the state -of each Resource. We will look at this function in detail later. -

    -For now, the important thing to note is that it returns a channel of State, -which is saved as status and passed to the Poller goroutines. -
    - - -Now that it has the necessary channels, main launches a number of -Poller goroutines, passing the channels as arguments. -The channels provide the means of communication between the main, Poller, and -StateMonitor goroutines. - - - -To add the initial work to the system, main starts a new goroutine -that allocates and sends one Resource per URL to pending. -

    -The new goroutine is necessary because unbuffered channel sends and -receives are synchronous. That means these channel sends will block until -the Pollers are ready to read from pending. -

    -Were these sends performed in the main goroutine with fewer Pollers than -channel sends, the program would reach a deadlock situation, because -main would not yet be receiving from complete. -

    -Exercise for the reader: modify this part of the program to read a list of -URLs from a file. (You may want to move this goroutine into its own -named function.) -
    - - -When a Poller is done with a Resource, it sends it on the complete channel. -This loop receives those Resource pointers from complete. -For each received Resource, it starts a new goroutine calling -the Resource's Sleep method. Using a new goroutine for each -ensures that the sleeps can happen in parallel. -

    -Note that any single Resource pointer may only be sent on either pending or -complete at any one time. This ensures that a Resource is either being -handled by a Poller goroutine or sleeping, but never both simultaneously. -In this way, we share our Resource data by communicating. -
    - - -Sleep calls time.Sleep to pause before sending the Resource to done. -The pause will either be of a fixed length (pollInterval) plus an -additional delay proportional to the number of sequential errors (r.errCount). -

    -This is an example of a typical Go idiom: a function intended to run inside -a goroutine takes a channel, upon which it sends its return value -(or other indication of completed state). -
    - - -The StateMonitor receives State values on a channel and periodically -outputs the state of all Resources being polled by the program. - - - -The variable updates is a channel of State, on which the Poller goroutines -send State values. -

    -This channel is returned by the function. -
    - - -The variable urlStatus is a map of URLs to their most recent status. - - - -A time.Ticker is an object that repeatedly sends a value on a channel at a -specified interval. -

    -In this case, ticker triggers the printing of the current state to -standard output every updateInterval nanoseconds. -
    - - -StateMonitor will loop forever, selecting on two channels: -ticker.C and update. The select statement blocks until one of its -communications is ready to proceed. -

    -When StateMonitor receives a tick from ticker.C, it calls logState to -print the current state. When it receives a State update from updates, -it records the new status in the urlStatus map. -

    -Notice that this goroutine owns the urlStatus data structure, -ensuring that it can only be accessed sequentially. -This prevents memory corruption issues that might arise from parallel reads -and/or writes to a shared map. -
    - - -In this codewalk we have explored a simple example of using Go's concurrency -primitives to share memory through communication. -

    -This should provide a starting point from which to explore the ways in which -goroutines and channels can be used to write expressive and concise concurrent -programs. -
    - -
    diff --git a/doc/codewalk/urlpoll.go b/doc/codewalk/urlpoll.go deleted file mode 100644 index 1fb99581f0..0000000000 --- a/doc/codewalk/urlpoll.go +++ /dev/null @@ -1,116 +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 ( - "log" - "net/http" - "time" -) - -const ( - numPollers = 2 // number of Poller goroutines to launch - pollInterval = 60 * time.Second // how often to poll each URL - statusInterval = 10 * time.Second // how often to log status to stdout - errTimeout = 10 * time.Second // back-off timeout on error -) - -var urls = []string{ - "http://www.google.com/", - "http://golang.org/", - "http://blog.golang.org/", -} - -// State represents the last-known state of a URL. -type State struct { - url string - status string -} - -// StateMonitor maintains a map that stores the state of the URLs being -// polled, and prints the current state every updateInterval nanoseconds. -// It returns a chan State to which resource state should be sent. -func StateMonitor(updateInterval time.Duration) chan<- State { - updates := make(chan State) - urlStatus := make(map[string]string) - ticker := time.NewTicker(updateInterval) - go func() { - for { - select { - case <-ticker.C: - logState(urlStatus) - case s := <-updates: - urlStatus[s.url] = s.status - } - } - }() - return updates -} - -// logState prints a state map. -func logState(s map[string]string) { - log.Println("Current state:") - for k, v := range s { - log.Printf(" %s %s", k, v) - } -} - -// Resource represents an HTTP URL to be polled by this program. -type Resource struct { - url string - errCount int -} - -// Poll executes an HTTP HEAD request for url -// and returns the HTTP status string or an error string. -func (r *Resource) Poll() string { - resp, err := http.Head(r.url) - if err != nil { - log.Println("Error", r.url, err) - r.errCount++ - return err.Error() - } - r.errCount = 0 - return resp.Status -} - -// Sleep sleeps for an appropriate interval (dependent on error state) -// before sending the Resource to done. -func (r *Resource) Sleep(done chan<- *Resource) { - time.Sleep(pollInterval + errTimeout*time.Duration(r.errCount)) - done <- r -} - -func Poller(in <-chan *Resource, out chan<- *Resource, status chan<- State) { - for r := range in { - s := r.Poll() - status <- State{r.url, s} - out <- r - } -} - -func main() { - // Create our input and output channels. - pending, complete := make(chan *Resource), make(chan *Resource) - - // Launch the StateMonitor. - status := StateMonitor(statusInterval) - - // Launch some Poller goroutines. - for i := 0; i < numPollers; i++ { - go Poller(pending, complete, status) - } - - // Send some Resources to the pending queue. - go func() { - for _, url := range urls { - pending <- &Resource{url: url} - } - }() - - for r := range complete { - go r.Sleep(pending) - } -} diff --git a/doc/contribute.html b/doc/contribute.html deleted file mode 100644 index 66a47eb07e..0000000000 --- a/doc/contribute.html +++ /dev/null @@ -1,1294 +0,0 @@ - - -

    -The Go project welcomes all contributors. -

    - -

    -This document is a guide to help you through the process -of contributing to the Go project, which is a little different -from that used by other open source projects. -We assume you have a basic understanding of Git and Go. -

    - -

    -In addition to the information here, the Go community maintains a -CodeReview wiki page. -Feel free to contribute to the wiki as you learn the review process. -

    - -

    -Note that the gccgo front end lives elsewhere; -see Contributing to gccgo. -

    - -

    Becoming a contributor

    - -

    Overview

    - -

    -The first step is registering as a Go contributor and configuring your environment. -Here is a checklist of the required steps to follow: -

    - -
      -
    • -Step 0: Decide on a single Google Account you will be using to contribute to Go. -Use that account for all the following steps and make sure that git -is configured to create commits with that account's e-mail address. -
    • -
    • -Step 1: Sign and submit a -CLA (Contributor License Agreement). -
    • -
    • -Step 2: Configure authentication credentials for the Go Git repository. -Visit go.googlesource.com, click -"Generate Password" in the page's top right menu bar, and follow the -instructions. -
    • -
    • -Step 3: Register for Gerrit, the code review tool used by the Go team, -by visiting this page. -The CLA and the registration need to be done only once for your account. -
    • -
    • -Step 4: Install git-codereview by running -go get -u golang.org/x/review/git-codereview -
    • -
    - -

    -If you prefer, there is an automated tool that walks through these steps. -Just run: -

    - -
    -$ go get -u golang.org/x/tools/cmd/go-contrib-init
    -$ cd /code/to/edit
    -$ go-contrib-init
    -
    - -

    -The rest of this chapter elaborates on these instructions. -If you have completed the steps above (either manually or through the tool), jump to -Before contributing code. -

    - -

    Step 0: Select a Google Account

    - -

    -A contribution to Go is made through a Google account with a specific -e-mail address. -Make sure to use the same account throughout the process and -for all your subsequent contributions. -You may need to decide whether to use a personal address or a corporate address. -The choice will depend on who -will own the copyright for the code that you will be writing -and submitting. -You might want to discuss this topic with your employer before deciding which -account to use. -

    - -

    -Google accounts can either be Gmail e-mail accounts, G Suite organization accounts, or -accounts associated with an external e-mail address. -For instance, if you need to use -an existing corporate e-mail that is not managed through G Suite, you can create -an account associated -with your existing -e-mail address. -

    - -

    -You also need to make sure that your Git tool is configured to create commits -using your chosen e-mail address. -You can either configure Git globally -(as a default for all projects), or locally (for a single specific project). -You can check the current configuration with this command: -

    - -
    -$ git config --global user.email  # check current global config
    -$ git config user.email           # check current local config
    -
    - -

    -To change the configured address: -

    - -
    -$ git config --global user.email name@example.com   # change global config
    -$ git config user.email name@example.com            # change local config
    -
    - - -

    Step 1: Contributor License Agreement

    - -

    -Before sending your first change to the Go project -you must have completed one of the following two CLAs. -Which CLA you should sign depends on who owns the copyright to your work. -

    - - - -

    -You can check your currently signed agreements and sign new ones at -the Google Developers -Contributor License Agreements website. -If the copyright holder for your contribution has already completed the -agreement in connection with another Google open source project, -it does not need to be completed again. -

    - -

    -If the copyright holder for the code you are submitting changes—for example, -if you start contributing code on behalf of a new company—please send mail -to the golang-dev -mailing list. -This will let us know the situation so we can make sure an appropriate agreement is -completed and update the AUTHORS file. -

    - - -

    Step 2: Configure git authentication

    - -

    -The main Go repository is located at -go.googlesource.com, -a Git server hosted by Google. -Authentication on the web server is made through your Google account, but -you also need to configure git on your computer to access it. -Follow these steps: -

    - -
      -
    1. -Visit go.googlesource.com -and click on "Generate Password" in the page's top right menu bar. -You will be redirected to accounts.google.com to sign in. -
    2. -
    3. -After signing in, you will be taken to a page with the title "Configure Git". -This page contains a personalized script that when run locally will configure Git -to hold your unique authentication key. -This key is paired with one that is generated and stored on the server, -analogous to how SSH keys work. -
    4. -
    5. -Copy and run this script locally in your terminal to store your secret -authentication token in a .gitcookies file. -If you are using a Windows computer and running cmd, -you should instead follow the instructions in the yellow box to run the command; -otherwise run the regular script. -
    6. -
    - -

    Step 3: Create a Gerrit account

    - -

    -Gerrit is an open-source tool used by Go maintainers to discuss and review -code submissions. -

    - -

    -To register your account, visit -go-review.googlesource.com/login/ and sign in once using the same Google Account you used above. -

    - -

    Step 4: Install the git-codereview command

    - -

    -Changes to Go must be reviewed before they are accepted, no matter who makes the change. -A custom git command called git-codereview -simplifies sending changes to Gerrit. -

    - -

    -Install the git-codereview command by running, -

    - -
    -$ go get -u golang.org/x/review/git-codereview
    -
    - -

    -Make sure git-codereview is installed in your shell path, so that the -git command can find it. -Check that -

    - -
    -$ git codereview help
    -
    - -

    -prints help text, not an error. If it prints an error, make sure that -$GOPATH/bin is in your $PATH. -

    - -

    -On Windows, when using git-bash you must make sure that -git-codereview.exe is in your git exec-path. -Run git --exec-path to discover the right location then create a -symbolic link or just copy the executable from $GOPATH/bin to this -directory. -

    - - -

    Before contributing code

    - -

    -The project welcomes code patches, but to make sure things are well -coordinated you should discuss any significant change before starting -the work. -It's recommended that you signal your intention to contribute in the -issue tracker, either by filing -a new issue or by claiming -an existing one. -

    - -

    Where to contribute

    - -

    -The Go project consists of the main -go repository, which contains the -source code for the Go language, as well as many golang.org/x/... repostories. -These contain the various tools and infrastructure that support Go. For -example, golang.org/x/pkgsite -is for pkg.go.dev, -golang.org/x/playground -is for the Go playground, and -golang.org/x/tools contains -a variety of Go tools, including the Go language server, -gopls. You can see a -list of all the golang.org/x/... repositories on -go.googlesource.com. -

    - -

    Check the issue tracker

    - -

    -Whether you already know what contribution to make, or you are searching for -an idea, the issue tracker is -always the first place to go. -Issues are triaged to categorize them and manage the workflow. -

    - -

    -The majority of the golang.org/x/... repos also use the main Go -issue tracker. However, a few of these repositories manage their issues -separately, so please be sure to check the right tracker for the repository to -which you would like to contribute. -

    - -

    -Most issues will be marked with one of the following workflow labels: -

    - -
      -
    • - NeedsInvestigation: The issue is not fully understood - and requires analysis to understand the root cause. -
    • -
    • - NeedsDecision: the issue is relatively well understood, but the - Go team hasn't yet decided the best way to address it. - It would be better to wait for a decision before writing code. - If you are interested in working on an issue in this state, - feel free to "ping" maintainers in the issue's comments - if some time has passed without a decision. -
    • -
    • - NeedsFix: the issue is fully understood and code can be written - to fix it. -
    • -
    - -

    -You can use GitHub's search functionality to find issues to help out with. Examples: -

    - - - -

    Open an issue for any new problem

    - -

    -Excluding very trivial changes, all contributions should be connected -to an existing issue. -Feel free to open one and discuss your plans. -This process gives everyone a chance to validate the design, -helps prevent duplication of effort, -and ensures that the idea fits inside the goals for the language and tools. -It also checks that the design is sound before code is written; -the code review tool is not the place for high-level discussions. -

    - -

    -When planning work, please note that the Go project follows a six-month development cycle -for the main Go repository. The latter half of each cycle is a three-month -feature freeze during which only bug fixes and documentation updates are -accepted. New contributions can be sent during a feature freeze, but they will -not be merged until the freeze is over. The freeze applies to the entire main -repository as well as to the code in golang.org/x/... repositories that is -needed to build the binaries included in the release. See the lists of packages -vendored into -the standard library -and the go command. -

    - -

    -Significant changes to the language, libraries, or tools must go -through the -change proposal process -before they can be accepted. -

    - -

    -Sensitive security-related issues (only!) should be reported to security@golang.org. -

    - -

    Sending a change via GitHub

    - -

    -First-time contributors that are already familiar with the -GitHub flow -are encouraged to use the same process for Go contributions. -Even though Go -maintainers use Gerrit for code review, a bot called Gopherbot has been created to sync -GitHub pull requests to Gerrit. -

    - -

    -Open a pull request as you normally would. -Gopherbot will create a corresponding Gerrit change and post a link to -it on your GitHub pull request; updates to the pull request will also -get reflected in the Gerrit change. -When somebody comments on the change, their comment will be also -posted in your pull request, so you will get a notification. -

    - -

    -Some things to keep in mind: -

    - -
      -
    • -To update the pull request with new code, just push it to the branch; you can either -add more commits, or rebase and force-push (both styles are accepted). -
    • -
    • -If the request is accepted, all commits will be squashed, and the final -commit description will be composed by concatenating the pull request's -title and description. -The individual commits' descriptions will be discarded. -See Writing good commit messages for some -suggestions. -
    • -
    • -Gopherbot is unable to sync line-by-line codereview into GitHub: only the -contents of the overall comment on the request will be synced. -Remember you can always visit Gerrit to see the fine-grained review. -
    • -
    - -

    Sending a change via Gerrit

    - -

    -It is not possible to fully sync Gerrit and GitHub, at least at the moment, -so we recommend learning Gerrit. -It's different but powerful and familiarity with it will help you understand -the flow. -

    - -

    Overview

    - -

    -This is an overview of the overall process: -

    - -
      -
    • -Step 1: Clone the source code from go.googlesource.com and -make sure it's stable by compiling and testing it once. - -

      If you're making a change to the -main Go repository:

      - -
      -$ git clone https://go.googlesource.com/go
      -$ cd go/src
      -$ ./all.bash                                # compile and test
      -
      - -

      -If you're making a change to one of the golang.org/x/... repositories -(golang.org/x/tools, -in this example): -

      - -
      -$ git clone https://go.googlesource.com/tools
      -$ cd tools
      -$ go test ./...                             # compile and test
      -
      -
    • - -
    • -Step 2: Prepare changes in a new branch, created from the master branch. -To commit the changes, use git codereview change; that -will create or amend a single commit in the branch. -
      -$ git checkout -b mybranch
      -$ [edit files...]
      -$ git add [files...]
      -$ git codereview change   # create commit in the branch
      -$ [edit again...]
      -$ git add [files...]
      -$ git codereview change   # amend the existing commit with new changes
      -$ [etc.]
      -
      -
    • - -
    • -Step 3: Test your changes, either by running the tests in the package -you edited or by re-running all.bash. - -

      In the main Go repository:

      -
      -$ ./all.bash    # recompile and test
      -
      - -

      In a golang.org/x/... repository:

      -
      -$ go test ./... # recompile and test
      -
      -
    • - -
    • -Step 4: Send the changes for review to Gerrit using git -codereview mail (which doesn't use e-mail, despite the name). -
      -$ git codereview mail     # send changes to Gerrit
      -
      -
    • - -
    • -Step 5: After a review, apply changes to the same single commit -and mail them to Gerrit again: -
      -$ [edit files...]
      -$ git add [files...]
      -$ git codereview change   # update same commit
      -$ git codereview mail     # send to Gerrit again
      -
      -
    • -
    - -

    -The rest of this section describes these steps in more detail. -

    - - -

    Step 1: Clone the source code

    - -

    -In addition to a recent Go installation, you need to have a local copy of the source -checked out from the correct repository. -You can check out the Go source repo onto your local file system anywhere -you want as long as it's outside your GOPATH. -Clone from go.googlesource.com (not GitHub): -

    - -

    Main Go repository:

    -
    -$ git clone https://go.googlesource.com/go
    -$ cd go
    -
    - -

    golang.org/x/... repository

    -(golang.org/x/tools in this example): -
    -$ git clone https://go.googlesource.com/tools
    -$ cd tools
    -
    - -

    Step 2: Prepare changes in a new branch

    - -

    -Each Go change must be made in a separate branch, created from the master branch. -You can use -the normal git commands to create a branch and add changes to the -staging area: -

    - -
    -$ git checkout -b mybranch
    -$ [edit files...]
    -$ git add [files...]
    -
    - -

    -To commit changes, instead of git commit, use git codereview change. -

    - -
    -$ git codereview change
    -(open $EDITOR)
    -
    - -

    -You can edit the commit description in your favorite editor as usual. -The git codereview change command -will automatically add a unique Change-Id line near the bottom. -That line is used by Gerrit to match successive uploads of the same change. -Do not edit or delete it. -A Change-Id looks like this: -

    - -
    -Change-Id: I2fbdbffb3aab626c4b6f56348861b7909e3e8990
    -
    - -

    -The tool also checks that you've -run go fmt over the source code, and that -the commit message follows the suggested format. -

    - -

    -If you need to edit the files again, you can stage the new changes and -re-run git codereview change: each subsequent -run will amend the existing commit while preserving the Change-Id. -

    - -

    -Make sure that you always keep a single commit in each branch. -If you add more -commits by mistake, you can use git rebase to -squash them together -into a single one. -

    - - -

    Step 3: Test your changes

    - -

    -You've written and tested your code, but -before sending code out for review, run all the tests for the whole -tree to make sure the changes don't break other packages or programs. -

    - -

    In the main Go repository

    - -

    This can be done by running all.bash:

    - -
    -$ cd go/src
    -$ ./all.bash
    -
    - -

    -(To build under Windows use all.bat) -

    - -

    -After running for a while and printing a lot of testing output, the command should finish -by printing, -

    - -
    -ALL TESTS PASSED
    -
    - -

    -You can use make.bash instead of all.bash -to just build the compiler and the standard library without running the test suite. -Once the go tool is built, it will be installed as bin/go -under the directory in which you cloned the Go repository, and you can -run it directly from there. -See also -the section on how to test your changes quickly. -

    - -

    In the golang.org/x/... repositories

    - -

    -Run the tests for the entire repository -(golang.org/x/tools, -in this example): -

    - -
    -$ cd tools
    -$ go test ./...
    -
    - -

    -If you're concerned about the build status, -you can check the Build Dashboard. -Test failures may also be caught by the TryBots in code review. -

    - -

    -Some repositories, like -golang.org/x/vscode-go will -have different testing infrastructures, so always check the documentation -for the repository in which you are working. The README file in the root of the -repository will usually have this information. -

    - -

    Step 4: Send changes for review

    - -

    -Once the change is ready and tested over the whole tree, send it for review. -This is done with the mail sub-command which, despite its name, doesn't -directly mail anything; it just sends the change to Gerrit: -

    - -
    -$ git codereview mail
    -
    - -

    -Gerrit assigns your change a number and URL, which git codereview mail will print, something like: -

    - -
    -remote: New Changes:
    -remote:   https://go-review.googlesource.com/99999 math: improved Sin, Cos and Tan precision for very large arguments
    -
    - -

    -If you get an error instead, check the -Troubleshooting mail errors section. -

    - -

    -If your change relates to an open GitHub issue and you have followed the -suggested commit message format, the issue will be updated in a few minutes by a bot, -linking your Gerrit change to it in the comments. -

    - - -

    Step 5: Revise changes after a review

    - -

    -Go maintainers will review your code on Gerrit, and you will get notifications via e-mail. -You can see the review on Gerrit and comment on them there. -You can also reply -using e-mail -if you prefer. -

    - -

    -If you need to revise your change after the review, edit the files in -the same branch you previously created, add them to the Git staging -area, and then amend the commit with -git codereview change: -

    - -
    -$ git codereview change     # amend current commit
    -(open $EDITOR)
    -$ git codereview mail       # send new changes to Gerrit
    -
    - -

    -If you don't need to change the commit description, just save and exit from the editor. -Remember not to touch the special Change-Id line. -

    - -

    -Again, make sure that you always keep a single commit in each branch. -If you add more -commits by mistake, you can use git rebase to -squash them together -into a single one. -

    - -

    Good commit messages

    - -

    -Commit messages in Go follow a specific set of conventions, -which we discuss in this section. -

    - -

    -Here is an example of a good one: -

    - -
    -math: improve Sin, Cos and Tan precision for very large arguments
    -
    -The existing implementation has poor numerical properties for
    -large arguments, so use the McGillicutty algorithm to improve
    -accuracy above 1e10.
    -
    -The algorithm is described at https://wikipedia.org/wiki/McGillicutty_Algorithm
    -
    -Fixes #159
    -
    - -

    First line

    - -

    -The first line of the change description is conventionally a short one-line -summary of the change, prefixed by the primary affected package. -

    - -

    -A rule of thumb is that it should be written so to complete the sentence -"This change modifies Go to _____." -That means it does not start with a capital letter, is not a complete sentence, -and actually summarizes the result of the change. -

    - -

    -Follow the first line by a blank line. -

    - -

    Main content

    - -

    -The rest of the description elaborates and should provide context for the -change and explain what it does. -Write in complete sentences with correct punctuation, just like -for your comments in Go. -Don't use HTML, Markdown, or any other markup language. -

    - -

    -Add any relevant information, such as benchmark data if the change -affects performance. -The benchstat -tool is conventionally used to format -benchmark data for change descriptions. -

    - -

    Referencing issues

    - -

    -The special notation "Fixes #12345" associates the change with issue 12345 in the -Go issue tracker. -When this change is eventually applied, the issue -tracker will automatically mark the issue as fixed. -

    - -

    -If the change is a partial step towards the resolution of the issue, -write "Updates #12345" instead. -This will leave a comment in the issue linking back to the change in -Gerrit, but it will not close the issue when the change is applied. -

    - -

    -If you are sending a change against a golang.org/x/... repository, you must use -the fully-qualified syntax supported by GitHub to make sure the change is -linked to the issue in the main repository, not the x/ repository. -Most issues are tracked in the main repository's issue tracker. -The correct form is "Fixes golang/go#159". -

    - - -

    The review process

    - -

    -This section explains the review process in detail and how to approach -reviews after a change has been mailed. -

    - - -

    Common beginner mistakes

    - -

    -When a change is sent to Gerrit, it is usually triaged within a few days. -A maintainer will have a look and provide some initial review that for first-time -contributors usually focuses on basic cosmetics and common mistakes. -These include things like: -

    - -
      -
    • -Commit message not following the suggested -format. -
    • - -
    • -The lack of a linked GitHub issue. -The vast majority of changes -require a linked issue that describes the bug or the feature that the change -fixes or implements, and consensus should have been reached on the tracker -before proceeding with it. -Gerrit reviews do not discuss the merit of the change, -just its implementation. -
      -Only trivial or cosmetic changes will be accepted without an associated issue. -
    • - -
    • -Change sent during the freeze phase of the development cycle, when the tree -is closed for general changes. -In this case, -a maintainer might review the code with a line such as R=go1.12, -which means that it will be reviewed later when the tree opens for a new -development window. -You can add R=go1.XX as a comment yourself -if you know that it's not the correct time frame for the change. -
    • -
    - -

    Trybots

    - -

    -After an initial reading of your change, maintainers will trigger trybots, -a cluster of servers that will run the full test suite on several different -architectures. -Most trybots complete in a few minutes, at which point a link will -be posted in Gerrit where you can see the results. -

    - -

    -If the trybot run fails, follow the link and check the full logs of the -platforms on which the tests failed. -Try to understand what broke, update your patch to fix it, and upload again. -Maintainers will trigger a new trybot run to see -if the problem was fixed. -

    - -

    -Sometimes, the tree can be broken on some platforms for a few hours; if -the failure reported by the trybot doesn't seem related to your patch, go to the -Build Dashboard and check if the same -failure appears in other recent commits on the same platform. -In this case, -feel free to write a comment in Gerrit to mention that the failure is -unrelated to your change, to help maintainers understand the situation. -

    - -

    Reviews

    - -

    -The Go community values very thorough reviews. -Think of each review comment like a ticket: you are expected to somehow "close" it -by acting on it, either by implementing the suggestion or convincing the -reviewer otherwise. -

    - -

    -After you update the change, go through the review comments and make sure -to reply to every one. -You can click the "Done" button to reply -indicating that you've implemented the reviewer's suggestion; otherwise, -click on "Reply" and explain why you have not, or what you have done instead. -

    - -

    -It is perfectly normal for changes to go through several round of reviews, -with one or more reviewers making new comments every time -and then waiting for an updated change before reviewing again. -This cycle happens even for experienced contributors, so -don't be discouraged by it. -

    - -

    Voting conventions

    - -

    -As they near a decision, reviewers will make a "vote" on your change. -The Gerrit voting system involves an integer in the range -2 to +2: -

    - -
      -
    • - +2 The change is approved for being merged. - Only Go maintainers can cast a +2 vote. -
    • -
    • - +1 The change looks good, but either the reviewer is requesting - minor changes before approving it, or they are not a maintainer and cannot - approve it, but would like to encourage an approval. -
    • -
    • - -1 The change is not good the way it is but might be fixable. - A -1 vote will always have a comment explaining why the change is unacceptable. -
    • -
    • - -2 The change is blocked by a maintainer and cannot be approved. - Again, there will be a comment explaining the decision. -
    • -
    - -

    -At least two maintainers must approve of the change, and at least one -of those maintainers must +2 the change. -The second maintainer may cast a vote of Trust+1, meaning that the -change looks basically OK, but that the maintainer hasn't done the -detailed review required for a +2 vote. -

    - -

    Submitting an approved change

    - -

    -After the code has been +2'ed and Trust+1'ed, an approver will -apply it to the master branch using the Gerrit user interface. -This is called "submitting the change". -

    - -

    -The two steps (approving and submitting) are separate because in some cases maintainers -may want to approve it but not to submit it right away (for instance, -the tree could be temporarily frozen). -

    - -

    -Submitting a change checks it into the repository. -The change description will include a link to the code review, -which will be updated with a link to the change -in the repository. -Since the method used to integrate the changes is Git's "Cherry Pick", -the commit hashes in the repository will be changed by -the submit operation. -

    - -

    -If your change has been approved for a few days without being -submitted, feel free to write a comment in Gerrit requesting -submission. -

    - - -

    More information

    - -

    -In addition to the information here, the Go community maintains a CodeReview wiki page. -Feel free to contribute to this page as you learn more about the review process. -

    - - - -

    Miscellaneous topics

    - -

    -This section collects a number of other comments that are -outside the issue/edit/code review/submit process itself. -

    - - - - -

    -Files in the Go repository don't list author names, both to avoid clutter -and to avoid having to keep the lists up to date. -Instead, your name will appear in the -change log and in the CONTRIBUTORS file and perhaps the AUTHORS file. -These files are automatically generated from the commit logs periodically. -The AUTHORS file defines who “The Go -Authors”—the copyright holders—are. -

    - -

    -New files that you contribute should use the standard copyright header: -

    - -
    -// 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.
    -
    - -

    -(Use the current year if you're reading this in 2022 or beyond.) -Files in the repository are copyrighted the year they are added. -Do not update the copyright year on files that you change. -

    - - - - -

    Troubleshooting mail errors

    - -

    -The most common way that the git codereview mail -command fails is because the e-mail address in the commit does not match the one -that you used during the registration process. - -
    -If you see something like... -

    - -
    -remote: Processing changes: refs: 1, done
    -remote:
    -remote: ERROR:  In commit ab13517fa29487dcf8b0d48916c51639426c5ee9
    -remote: ERROR:  author email address XXXXXXXXXXXXXXXXXXX
    -remote: ERROR:  does not match your user account.
    -
    - -

    -you need to configure Git for this repository to use the -e-mail address that you registered with. -To change the e-mail address to ensure this doesn't happen again, run: -

    - -
    -$ git config user.email email@address.com
    -
    - -

    -Then change the commit to use this alternative e-mail address with this command: -

    - -
    -$ git commit --amend --author="Author Name <email@address.com>"
    -
    - -

    -Then retry by running: -

    - -
    -$ git codereview mail
    -
    - - -

    Quickly testing your changes

    - -

    -Running all.bash for every single change to the code tree -is burdensome. -Even though it is strongly suggested to run it before -sending a change, during the normal development cycle you may want -to compile and test only the package you are developing. -

    - -
      -
    • -In general, you can run make.bash instead of all.bash -to only rebuild the Go tool chain without running the whole test suite. -Or you -can run run.bash to only run the whole test suite without rebuilding -the tool chain. -You can think of all.bash as make.bash -followed by run.bash. -
    • - -
    • -In this section, we'll call the directory into which you cloned the Go repository $GODIR. -The go tool built by $GODIR/src/make.bash will be installed -in $GODIR/bin/go and you -can invoke it to test your code. -For instance, if you -have modified the compiler and you want to test how it affects the -test suite of your own project, just run go test -using it: - -
      -$ cd <MYPROJECTDIR>
      -$ $GODIR/bin/go test
      -
      -
    • - -
    • -If you're changing the standard library, you probably don't need to rebuild -the compiler: you can just run the tests for the package you've changed. -You can do that either with the Go version you normally use, or -with the Go compiler built from your clone (which is -sometimes required because the standard library code you're modifying -might require a newer version than the stable one you have installed). - -
      -$ cd $GODIR/src/crypto/sha1
      -$ [make changes...]
      -$ $GODIR/bin/go test .
      -
      -
    • - -
    • -If you're modifying the compiler itself, you can just recompile -the compile tool (which is the internal binary invoked -by go build to compile each single package). -After that, you will want to test it by compiling or running something. - -
      -$ cd $GODIR/src
      -$ [make changes...]
      -$ $GODIR/bin/go install cmd/compile
      -$ $GODIR/bin/go build [something...]   # test the new compiler
      -$ $GODIR/bin/go run [something...]     # test the new compiler
      -$ $GODIR/bin/go test [something...]    # test the new compiler
      -
      - -The same applies to other internal tools of the Go tool chain, -such as asm, cover, link, and so on. -Just recompile and install the tool using go -install cmd/<TOOL> and then use -the built Go binary to test it. -
    • - -
    • -In addition to the standard per-package tests, there is a top-level -test suite in $GODIR/test that contains -several black-box and regression tests. -The test suite is run -by all.bash but you can also run it manually: - -
      -$ cd $GODIR/test
      -$ $GODIR/bin/go run run.go
      -
      -
    - - -

    Specifying a reviewer / CCing others

    - -

    -Unless explicitly told otherwise, such as in the discussion leading -up to sending in the change, it's better not to specify a reviewer. -All changes are automatically CC'ed to the -golang-codereviews@googlegroups.com -mailing list. -If this is your first ever change, there may be a moderation -delay before it appears on the mailing list, to prevent spam. -

    - -

    -You can specify a reviewer or CC interested parties -using the -r or -cc options. -Both accept a comma-separated list of e-mail addresses: -

    - -
    -$ git codereview mail -r joe@golang.org -cc mabel@example.com,math-nuts@swtch.com
    -
    - - -

    Synchronize your client

    - -

    -While you were working, others might have submitted changes to the repository. -To update your local branch, run -

    - -
    -$ git codereview sync
    -
    - -

    -(Under the covers this runs -git pull -r.) -

    - - -

    Reviewing code by others

    - -

    -As part of the review process reviewers can propose changes directly (in the -GitHub workflow this would be someone else attaching commits to a pull request). - -You can import these changes proposed by someone else into your local Git repository. -On the Gerrit review page, click the "Download ▼" link in the upper right -corner, copy the "Checkout" command and run it from your local Git repo. -It will look something like this: -

    - -
    -$ git fetch https://go.googlesource.com/review refs/changes/21/13245/1 && git checkout FETCH_HEAD
    -
    - -

    -To revert, change back to the branch you were working in. -

    - - -

    Set up git aliases

    - -

    -The git-codereview command can be run directly from the shell -by typing, for instance, -

    - -
    -$ git codereview sync
    -
    - -

    -but it is more convenient to set up aliases for git-codereview's own -subcommands, so that the above becomes, -

    - -
    -$ git sync
    -
    - -

    -The git-codereview subcommands have been chosen to be distinct from -Git's own, so it's safe to define these aliases. -To install them, copy this text into your -Git configuration file (usually .gitconfig in your home directory): -

    - -
    -[alias]
    -	change = codereview change
    -	gofmt = codereview gofmt
    -	mail = codereview mail
    -	pending = codereview pending
    -	submit = codereview submit
    -	sync = codereview sync
    -
    - - -

    Sending multiple dependent changes

    - -

    -Advanced users may want to stack up related commits in a single branch. -Gerrit allows for changes to be dependent on each other, forming such a dependency chain. -Each change will need to be approved and submitted separately but the dependency -will be visible to reviewers. -

    - -

    -To send out a group of dependent changes, keep each change as a different commit under -the same branch, and then run: -

    - -
    -$ git codereview mail HEAD
    -
    - -

    -Make sure to explicitly specify HEAD, which is usually not required when sending -single changes. More details can be found in the git-codereview documentation. -

    diff --git a/doc/debugging_with_gdb.html b/doc/debugging_with_gdb.html deleted file mode 100644 index e1fb292f06..0000000000 --- a/doc/debugging_with_gdb.html +++ /dev/null @@ -1,554 +0,0 @@ - - - - - -

    -The following instructions apply to the standard toolchain -(the gc Go compiler and tools). -Gccgo has native gdb support. -

    -

    -Note that -Delve is a better -alternative to GDB when debugging Go programs built with the standard -toolchain. It understands the Go runtime, data structures, and -expressions better than GDB. Delve currently supports Linux, OSX, -and Windows on amd64. -For the most up-to-date list of supported platforms, please see - - the Delve documentation. -

    -
    - -

    -GDB does not understand Go programs well. -The stack management, threading, and runtime contain aspects that differ -enough from the execution model GDB expects that they can confuse -the debugger and cause incorrect results even when the program is -compiled with gccgo. -As a consequence, although GDB can be useful in some situations (e.g., -debugging Cgo code, or debugging the runtime itself), it is not -a reliable debugger for Go programs, particularly heavily concurrent -ones. Moreover, it is not a priority for the Go project to address -these issues, which are difficult. -

    - -

    -In short, the instructions below should be taken only as a guide to how -to use GDB when it works, not as a guarantee of success. - -Besides this overview you might want to consult the -GDB manual. -

    - -

    -

    - -

    Introduction

    - -

    -When you compile and link your Go programs with the gc toolchain -on Linux, macOS, FreeBSD or NetBSD, the resulting binaries contain DWARFv4 -debugging information that recent versions (≥7.5) of the GDB debugger can -use to inspect a live process or a core dump. -

    - -

    -Pass the '-w' flag to the linker to omit the debug information -(for example, go build -ldflags=-w prog.go). -

    - -

    -The code generated by the gc compiler includes inlining of -function invocations and registerization of variables. These optimizations -can sometimes make debugging with gdb harder. -If you find that you need to disable these optimizations, -build your program using go build -gcflags=all="-N -l". -

    - -

    -If you want to use gdb to inspect a core dump, you can trigger a dump -on a program crash, on systems that permit it, by setting -GOTRACEBACK=crash in the environment (see the - runtime package -documentation for more info). -

    - -

    Common Operations

    - -
      -
    • -Show file and line number for code, set breakpoints and disassemble: -
      (gdb) list
      -(gdb) list line
      -(gdb) list file.go:line
      -(gdb) break line
      -(gdb) break file.go:line
      -(gdb) disas
      -
    • -
    • -Show backtraces and unwind stack frames: -
      (gdb) bt
      -(gdb) frame n
      -
    • -
    • -Show the name, type and location on the stack frame of local variables, -arguments and return values: -
      (gdb) info locals
      -(gdb) info args
      -(gdb) p variable
      -(gdb) whatis variable
      -
    • -
    • -Show the name, type and location of global variables: -
      (gdb) info variables regexp
      -
    • -
    - - -

    Go Extensions

    - -

    -A recent extension mechanism to GDB allows it to load extension scripts for a -given binary. The toolchain uses this to extend GDB with a handful of -commands to inspect internals of the runtime code (such as goroutines) and to -pretty print the built-in map, slice and channel types. -

    - -
      -
    • -Pretty printing a string, slice, map, channel or interface: -
      (gdb) p var
      -
    • -
    • -A $len() and $cap() function for strings, slices and maps: -
      (gdb) p $len(var)
      -
    • -
    • -A function to cast interfaces to their dynamic types: -
      (gdb) p $dtype(var)
      -(gdb) iface var
      -

      Known issue: GDB can’t automatically find the dynamic -type of an interface value if its long name differs from its short name -(annoying when printing stacktraces, the pretty printer falls back to printing -the short type name and a pointer).

      -
    • -
    • -Inspecting goroutines: -
      (gdb) info goroutines
      -(gdb) goroutine n cmd
      -(gdb) help goroutine
      -For example: -
      (gdb) goroutine 12 bt
      -You can inspect all goroutines by passing all instead of a specific goroutine's ID. -For example: -
      (gdb) goroutine all bt
      -
    • -
    - -

    -If you'd like to see how this works, or want to extend it, take a look at src/runtime/runtime-gdb.py in -the Go source distribution. It depends on some special magic types -(hash<T,U>) and variables (runtime.m and -runtime.g) that the linker -(src/cmd/link/internal/ld/dwarf.go) ensures are described in -the DWARF code. -

    - -

    -If you're interested in what the debugging information looks like, run -objdump -W a.out and browse through the .debug_* -sections. -

    - - -

    Known Issues

    - -
      -
    1. String pretty printing only triggers for type string, not for types derived -from it.
    2. -
    3. Type information is missing for the C parts of the runtime library.
    4. -
    5. GDB does not understand Go’s name qualifications and treats -"fmt.Print" as an unstructured literal with a "." -that needs to be quoted. It objects even more strongly to method names of -the form pkg.(*MyType).Meth. -
    6. As of Go 1.11, debug information is compressed by default. -Older versions of gdb, such as the one available by default on MacOS, -do not understand the compression. -You can generate uncompressed debug information by using go -build -ldflags=-compressdwarf=false. -(For convenience you can put the -ldflags option in -the GOFLAGS -environment variable so that you don't have to specify it each time.) -
    7. -
    - -

    Tutorial

    - -

    -In this tutorial we will inspect the binary of the -regexp package's unit tests. To build the binary, -change to $GOROOT/src/regexp and run go test -c. -This should produce an executable file named regexp.test. -

    - - -

    Getting Started

    - -

    -Launch GDB, debugging regexp.test: -

    - -
    -$ gdb regexp.test
    -GNU gdb (GDB) 7.2-gg8
    -Copyright (C) 2010 Free Software Foundation, Inc.
    -License GPLv  3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    -Type "show copying" and "show warranty" for licensing/warranty details.
    -This GDB was configured as "x86_64-linux".
    -
    -Reading symbols from  /home/user/go/src/regexp/regexp.test...
    -done.
    -Loading Go Runtime support.
    -(gdb) 
    -
    - -

    -The message "Loading Go Runtime support" means that GDB loaded the -extension from $GOROOT/src/runtime/runtime-gdb.py. -

    - -

    -To help GDB find the Go runtime sources and the accompanying support script, -pass your $GOROOT with the '-d' flag: -

    - -
    -$ gdb regexp.test -d $GOROOT
    -
    - -

    -If for some reason GDB still can't find that directory or that script, you can load -it by hand by telling gdb (assuming you have the go sources in -~/go/): -

    - -
    -(gdb) source ~/go/src/runtime/runtime-gdb.py
    -Loading Go Runtime support.
    -
    - -

    Inspecting the source

    - -

    -Use the "l" or "list" command to inspect source code. -

    - -
    -(gdb) l
    -
    - -

    -List a specific part of the source parameterizing "list" with a -function name (it must be qualified with its package name). -

    - -
    -(gdb) l main.main
    -
    - -

    -List a specific file and line number: -

    - -
    -(gdb) l regexp.go:1
    -(gdb) # Hit enter to repeat last command. Here, this lists next 10 lines.
    -
    - - -

    Naming

    - -

    -Variable and function names must be qualified with the name of the packages -they belong to. The Compile function from the regexp -package is known to GDB as 'regexp.Compile'. -

    - -

    -Methods must be qualified with the name of their receiver types. For example, -the *Regexp type’s String method is known as -'regexp.(*Regexp).String'. -

    - -

    -Variables that shadow other variables are magically suffixed with a number in the debug info. -Variables referenced by closures will appear as pointers magically prefixed with '&'. -

    - -

    Setting breakpoints

    - -

    -Set a breakpoint at the TestFind function: -

    - -
    -(gdb) b 'regexp.TestFind'
    -Breakpoint 1 at 0x424908: file /home/user/go/src/regexp/find_test.go, line 148.
    -
    - -

    -Run the program: -

    - -
    -(gdb) run
    -Starting program: /home/user/go/src/regexp/regexp.test
    -
    -Breakpoint 1, regexp.TestFind (t=0xf8404a89c0) at /home/user/go/src/regexp/find_test.go:148
    -148	func TestFind(t *testing.T) {
    -
    - -

    -Execution has paused at the breakpoint. -See which goroutines are running, and what they're doing: -

    - -
    -(gdb) info goroutines
    -  1  waiting runtime.gosched
    -* 13  running runtime.goexit
    -
    - -

    -the one marked with the * is the current goroutine. -

    - -

    Inspecting the stack

    - -

    -Look at the stack trace for where we’ve paused the program: -

    - -
    -(gdb) bt  # backtrace
    -#0  regexp.TestFind (t=0xf8404a89c0) at /home/user/go/src/regexp/find_test.go:148
    -#1  0x000000000042f60b in testing.tRunner (t=0xf8404a89c0, test=0x573720) at /home/user/go/src/testing/testing.go:156
    -#2  0x000000000040df64 in runtime.initdone () at /home/user/go/src/runtime/proc.c:242
    -#3  0x000000f8404a89c0 in ?? ()
    -#4  0x0000000000573720 in ?? ()
    -#5  0x0000000000000000 in ?? ()
    -
    - -

    -The other goroutine, number 1, is stuck in runtime.gosched, blocked on a channel receive: -

    - -
    -(gdb) goroutine 1 bt
    -#0  0x000000000040facb in runtime.gosched () at /home/user/go/src/runtime/proc.c:873
    -#1  0x00000000004031c9 in runtime.chanrecv (c=void, ep=void, selected=void, received=void)
    - at  /home/user/go/src/runtime/chan.c:342
    -#2  0x0000000000403299 in runtime.chanrecv1 (t=void, c=void) at/home/user/go/src/runtime/chan.c:423
    -#3  0x000000000043075b in testing.RunTests (matchString={void (struct string, struct string, bool *, error *)}
    - 0x7ffff7f9ef60, tests=  []testing.InternalTest = {...}) at /home/user/go/src/testing/testing.go:201
    -#4  0x00000000004302b1 in testing.Main (matchString={void (struct string, struct string, bool *, error *)} 
    - 0x7ffff7f9ef80, tests= []testing.InternalTest = {...}, benchmarks= []testing.InternalBenchmark = {...})
    -at /home/user/go/src/testing/testing.go:168
    -#5  0x0000000000400dc1 in main.main () at /home/user/go/src/regexp/_testmain.go:98
    -#6  0x00000000004022e7 in runtime.mainstart () at /home/user/go/src/runtime/amd64/asm.s:78
    -#7  0x000000000040ea6f in runtime.initdone () at /home/user/go/src/runtime/proc.c:243
    -#8  0x0000000000000000 in ?? ()
    -
    - -

    -The stack frame shows we’re currently executing the regexp.TestFind function, as expected. -

    - -
    -(gdb) info frame
    -Stack level 0, frame at 0x7ffff7f9ff88:
    - rip = 0x425530 in regexp.TestFind (/home/user/go/src/regexp/find_test.go:148); 
    -    saved rip 0x430233
    - called by frame at 0x7ffff7f9ffa8
    - source language minimal.
    - Arglist at 0x7ffff7f9ff78, args: t=0xf840688b60
    - Locals at 0x7ffff7f9ff78, Previous frame's sp is 0x7ffff7f9ff88
    - Saved registers:
    -  rip at 0x7ffff7f9ff80
    -
    - -

    -The command info locals lists all variables local to the function and their values, but is a bit -dangerous to use, since it will also try to print uninitialized variables. Uninitialized slices may cause gdb to try -to print arbitrary large arrays. -

    - -

    -The function’s arguments: -

    - -
    -(gdb) info args
    -t = 0xf840688b60
    -
    - -

    -When printing the argument, notice that it’s a pointer to a -Regexp value. Note that GDB has incorrectly put the * -on the right-hand side of the type name and made up a 'struct' keyword, in traditional C style. -

    - -
    -(gdb) p re
    -(gdb) p t
    -$1 = (struct testing.T *) 0xf840688b60
    -(gdb) p t
    -$1 = (struct testing.T *) 0xf840688b60
    -(gdb) p *t
    -$2 = {errors = "", failed = false, ch = 0xf8406f5690}
    -(gdb) p *t->ch
    -$3 = struct hchan<*testing.T>
    -
    - -

    -That struct hchan<*testing.T> is the -runtime-internal representation of a channel. It is currently empty, -or gdb would have pretty-printed its contents. -

    - -

    -Stepping forward: -

    - -
    -(gdb) n  # execute next line
    -149             for _, test := range findTests {
    -(gdb)    # enter is repeat
    -150                     re := MustCompile(test.pat)
    -(gdb) p test.pat
    -$4 = ""
    -(gdb) p re
    -$5 = (struct regexp.Regexp *) 0xf84068d070
    -(gdb) p *re
    -$6 = {expr = "", prog = 0xf840688b80, prefix = "", prefixBytes =  []uint8, prefixComplete = true, 
    -  prefixRune = 0, cond = 0 '\000', numSubexp = 0, longest = false, mu = {state = 0, sema = 0}, 
    -  machine =  []*regexp.machine}
    -(gdb) p *re->prog
    -$7 = {Inst =  []regexp/syntax.Inst = {{Op = 5 '\005', Out = 0, Arg = 0, Rune =  []int}, {Op = 
    -    6 '\006', Out = 2, Arg = 0, Rune =  []int}, {Op = 4 '\004', Out = 0, Arg = 0, Rune =  []int}}, 
    -  Start = 1, NumCap = 2}
    -
    - - -

    -We can step into the Stringfunction call with "s": -

    - -
    -(gdb) s
    -regexp.(*Regexp).String (re=0xf84068d070, noname=void) at /home/user/go/src/regexp/regexp.go:97
    -97      func (re *Regexp) String() string {
    -
    - -

    -Get a stack trace to see where we are: -

    - -
    -(gdb) bt
    -#0  regexp.(*Regexp).String (re=0xf84068d070, noname=void)
    -    at /home/user/go/src/regexp/regexp.go:97
    -#1  0x0000000000425615 in regexp.TestFind (t=0xf840688b60)
    -    at /home/user/go/src/regexp/find_test.go:151
    -#2  0x0000000000430233 in testing.tRunner (t=0xf840688b60, test=0x5747b8)
    -    at /home/user/go/src/testing/testing.go:156
    -#3  0x000000000040ea6f in runtime.initdone () at /home/user/go/src/runtime/proc.c:243
    -....
    -
    - -

    -Look at the source code: -

    - -
    -(gdb) l
    -92              mu      sync.Mutex
    -93              machine []*machine
    -94      }
    -95
    -96      // String returns the source text used to compile the regular expression.
    -97      func (re *Regexp) String() string {
    -98              return re.expr
    -99      }
    -100
    -101     // Compile parses a regular expression and returns, if successful,
    -
    - -

    Pretty Printing

    - -

    -GDB's pretty printing mechanism is triggered by regexp matches on type names. An example for slices: -

    - -
    -(gdb) p utf
    -$22 =  []uint8 = {0 '\000', 0 '\000', 0 '\000', 0 '\000'}
    -
    - -

    -Since slices, arrays and strings are not C pointers, GDB can't interpret the subscripting operation for you, but -you can look inside the runtime representation to do that (tab completion helps here): -

    -
    -
    -(gdb) p slc
    -$11 =  []int = {0, 0}
    -(gdb) p slc-><TAB>
    -array  slc    len    
    -(gdb) p slc->array
    -$12 = (int *) 0xf84057af00
    -(gdb) p slc->array[1]
    -$13 = 0
    - - - -

    -The extension functions $len and $cap work on strings, arrays and slices: -

    - -
    -(gdb) p $len(utf)
    -$23 = 4
    -(gdb) p $cap(utf)
    -$24 = 4
    -
    - -

    -Channels and maps are 'reference' types, which gdb shows as pointers to C++-like types hash<int,string>*. Dereferencing will trigger prettyprinting -

    - -

    -Interfaces are represented in the runtime as a pointer to a type descriptor and a pointer to a value. The Go GDB runtime extension decodes this and automatically triggers pretty printing for the runtime type. The extension function $dtype decodes the dynamic type for you (examples are taken from a breakpoint at regexp.go line 293.) -

    - -
    -(gdb) p i
    -$4 = {str = "cbb"}
    -(gdb) whatis i
    -type = regexp.input
    -(gdb) p $dtype(i)
    -$26 = (struct regexp.inputBytes *) 0xf8400b4930
    -(gdb) iface i
    -regexp.input: struct regexp.inputBytes *
    -
    diff --git a/doc/diagnostics.html b/doc/diagnostics.html deleted file mode 100644 index 438cdce45f..0000000000 --- a/doc/diagnostics.html +++ /dev/null @@ -1,472 +0,0 @@ - - - - -

    Introduction

    - -

    -The Go ecosystem provides a large suite of APIs and tools to -diagnose logic and performance problems in Go programs. This page -summarizes the available tools and helps Go users pick the right one -for their specific problem. -

    - -

    -Diagnostics solutions can be categorized into the following groups: -

    - -
      -
    • Profiling: Profiling tools analyze the complexity and costs of a -Go program such as its memory usage and frequently called -functions to identify the expensive sections of a Go program.
    • -
    • Tracing: Tracing is a way to instrument code to analyze latency -throughout the lifecycle of a call or user request. Traces provide an -overview of how much latency each component contributes to the overall -latency in a system. Traces can span multiple Go processes.
    • -
    • Debugging: Debugging allows us to pause a Go program and examine -its execution. Program state and flow can be verified with debugging.
    • -
    • Runtime statistics and events: Collection and analysis of runtime stats and events -provides a high-level overview of the health of Go programs. Spikes/dips of metrics -helps us to identify changes in throughput, utilization, and performance.
    • -
    - -

    -Note: Some diagnostics tools may interfere with each other. For example, precise -memory profiling skews CPU profiles and goroutine blocking profiling affects scheduler -trace. Use tools in isolation to get more precise info. -

    - -

    Profiling

    - -

    -Profiling is useful for identifying expensive or frequently called sections -of code. The Go runtime provides -profiling data in the format expected by the -pprof visualization tool. -The profiling data can be collected during testing -via go test or endpoints made available from the -net/http/pprof package. Users need to collect the profiling data and use pprof tools to filter -and visualize the top code paths. -

    - -

    Predefined profiles provided by the runtime/pprof package:

    - -
      -
    • -cpu: CPU profile determines where a program spends -its time while actively consuming CPU cycles (as opposed to while sleeping or waiting for I/O). -
    • -
    • -heap: Heap profile reports memory allocation samples; -used to monitor current and historical memory usage, and to check for memory leaks. -
    • -
    • -threadcreate: Thread creation profile reports the sections -of the program that lead the creation of new OS threads. -
    • -
    • -goroutine: Goroutine profile reports the stack traces of all current goroutines. -
    • -
    • -block: Block profile shows where goroutines block waiting on synchronization -primitives (including timer channels). Block profile is not enabled by default; -use runtime.SetBlockProfileRate to enable it. -
    • -
    • -mutex: Mutex profile reports the lock contentions. When you think your -CPU is not fully utilized due to a mutex contention, use this profile. Mutex profile -is not enabled by default, see runtime.SetMutexProfileFraction to enable it. -
    • -
    - - -

    What other profilers can I use to profile Go programs?

    - -

    -On Linux, perf tools -can be used for profiling Go programs. Perf can profile -and unwind cgo/SWIG code and kernel, so it can be useful to get insights into -native/kernel performance bottlenecks. On macOS, -Instruments -suite can be used profile Go programs. -

    - -

    Can I profile my production services?

    - -

    Yes. It is safe to profile programs in production, but enabling -some profiles (e.g. the CPU profile) adds cost. You should expect to -see performance downgrade. The performance penalty can be estimated -by measuring the overhead of the profiler before turning it on in -production. -

    - -

    -You may want to periodically profile your production services. -Especially in a system with many replicas of a single process, selecting -a random replica periodically is a safe option. -Select a production process, profile it for -X seconds for every Y seconds and save the results for visualization and -analysis; then repeat periodically. Results may be manually and/or automatically -reviewed to find problems. -Collection of profiles can interfere with each other, -so it is recommended to collect only a single profile at a time. -

    - -

    -What are the best ways to visualize the profiling data? -

    - -

    -The Go tools provide text, graph, and callgrind -visualization of the profile data using -go tool pprof. -Read Profiling Go programs -to see them in action. -

    - -

    - -
    -Listing of the most expensive calls as text. -

    - -

    - -
    -Visualization of the most expensive calls as a graph. -

    - -

    Weblist view displays the expensive parts of the source line by line in -an HTML page. In the following example, 530ms is spent in the -runtime.concatstrings and cost of each line is presented -in the listing.

    - -

    - -
    -Visualization of the most expensive calls as weblist. -

    - -

    -Another way to visualize profile data is a flame graph. -Flame graphs allow you to move in a specific ancestry path, so you can zoom -in/out of specific sections of code. -The upstream pprof -has support for flame graphs. -

    - -

    - -
    -Flame graphs offers visualization to spot the most expensive code-paths. -

    - -

    Am I restricted to the built-in profiles?

    - -

    -Additionally to what is provided by the runtime, Go users can create -their custom profiles via pprof.Profile -and use the existing tools to examine them. -

    - -

    Can I serve the profiler handlers (/debug/pprof/...) on a different path and port?

    - -

    -Yes. The net/http/pprof package registers its handlers to the default -mux by default, but you can also register them yourself by using the handlers -exported from the package. -

    - -

    -For example, the following example will serve the pprof.Profile -handler on :7777 at /custom_debug_path/profile: -

    - -

    -

    -package main
    -
    -import (
    -	"log"
    -	"net/http"
    -	"net/http/pprof"
    -)
    -
    -func main() {
    -	mux := http.NewServeMux()
    -	mux.HandleFunc("/custom_debug_path/profile", pprof.Profile)
    -	log.Fatal(http.ListenAndServe(":7777", mux))
    -}
    -
    -

    - -

    Tracing

    - -

    -Tracing is a way to instrument code to analyze latency throughout the -lifecycle of a chain of calls. Go provides -golang.org/x/net/trace -package as a minimal tracing backend per Go node and provides a minimal -instrumentation library with a simple dashboard. Go also provides -an execution tracer to trace the runtime events within an interval. -

    - -

    Tracing enables us to:

    - -
      -
    • Instrument and analyze application latency in a Go process.
    • -
    • Measure the cost of specific calls in a long chain of calls.
    • -
    • Figure out the utilization and performance improvements. -Bottlenecks are not always obvious without tracing data.
    • -
    - -

    -In monolithic systems, it's relatively easy to collect diagnostic data -from the building blocks of a program. All modules live within one -process and share common resources to report logs, errors, and other -diagnostic information. Once your system grows beyond a single process and -starts to become distributed, it becomes harder to follow a call starting -from the front-end web server to all of its back-ends until a response is -returned back to the user. This is where distributed tracing plays a big -role to instrument and analyze your production systems. -

    - -

    -Distributed tracing is a way to instrument code to analyze latency throughout -the lifecycle of a user request. When a system is distributed and when -conventional profiling and debugging tools don’t scale, you might want -to use distributed tracing tools to analyze the performance of your user -requests and RPCs. -

    - -

    Distributed tracing enables us to:

    - -
      -
    • Instrument and profile application latency in a large system.
    • -
    • Track all RPCs within the lifecycle of a user request and see integration issues -that are only visible in production.
    • -
    • Figure out performance improvements that can be applied to our systems. -Many bottlenecks are not obvious before the collection of tracing data.
    • -
    - -

    The Go ecosystem provides various distributed tracing libraries per tracing system -and backend-agnostic ones.

    - - -

    Is there a way to automatically intercept each function call and create traces?

    - -

    -Go doesn’t provide a way to automatically intercept every function call and create -trace spans. You need to manually instrument your code to create, end, and annotate spans. -

    - -

    How should I propagate trace headers in Go libraries?

    - -

    -You can propagate trace identifiers and tags in the -context.Context. -There is no canonical trace key or common representation of trace headers -in the industry yet. Each tracing provider is responsible for providing propagation -utilities in their Go libraries. -

    - -

    -What other low-level events from the standard library or -runtime can be included in a trace? -

    - -

    -The standard library and runtime are trying to expose several additional APIs -to notify on low level internal events. For example, -httptrace.ClientTrace -provides APIs to follow low-level events in the life cycle of an outgoing request. -There is an ongoing effort to retrieve low-level runtime events from -the runtime execution tracer and allow users to define and record their user events. -

    - -

    Debugging

    - -

    -Debugging is the process of identifying why a program misbehaves. -Debuggers allow us to understand a program’s execution flow and current state. -There are several styles of debugging; this section will only focus on attaching -a debugger to a program and core dump debugging. -

    - -

    Go users mostly use the following debuggers:

    - -
      -
    • -Delve: -Delve is a debugger for the Go programming language. It has -support for Go’s runtime concepts and built-in types. Delve is -trying to be a fully featured reliable debugger for Go programs. -
    • -
    • -GDB: -Go provides GDB support via the standard Go compiler and Gccgo. -The stack management, threading, and runtime contain aspects that differ -enough from the execution model GDB expects that they can confuse the -debugger, even when the program is compiled with gccgo. Even though -GDB can be used to debug Go programs, it is not ideal and may -create confusion. -
    • -
    - -

    How well do debuggers work with Go programs?

    - -

    -The gc compiler performs optimizations such as -function inlining and variable registerization. These optimizations -sometimes make debugging with debuggers harder. There is an ongoing -effort to improve the quality of the DWARF information generated for -optimized binaries. Until those improvements are available, we recommend -disabling optimizations when building the code being debugged. The following -command builds a package with no compiler optimizations: - -

    -

    -$ go build -gcflags=all="-N -l"
    -
    -

    - -As part of the improvement effort, Go 1.10 introduced a new compiler -flag -dwarflocationlists. The flag causes the compiler to -add location lists that helps debuggers work with optimized binaries. -The following command builds a package with optimizations but with -the DWARF location lists: - -

    -

    -$ go build -gcflags="-dwarflocationlists=true"
    -
    -

    - -

    What’s the recommended debugger user interface?

    - -

    -Even though both delve and gdb provides CLIs, most editor integrations -and IDEs provides debugging-specific user interfaces. -

    - -

    Is it possible to do postmortem debugging with Go programs?

    - -

    -A core dump file is a file that contains the memory dump of a running -process and its process status. It is primarily used for post-mortem -debugging of a program and to understand its state -while it is still running. These two cases make debugging of core -dumps a good diagnostic aid to postmortem and analyze production -services. It is possible to obtain core files from Go programs and -use delve or gdb to debug, see the -core dump debugging -page for a step-by-step guide. -

    - -

    Runtime statistics and events

    - -

    -The runtime provides stats and reporting of internal events for -users to diagnose performance and utilization problems at the -runtime level. -

    - -

    -Users can monitor these stats to better understand the overall -health and performance of Go programs. -Some frequently monitored stats and states: -

    - -
      -
    • runtime.ReadMemStats -reports the metrics related to heap -allocation and garbage collection. Memory stats are useful for -monitoring how much memory resources a process is consuming, -whether the process can utilize memory well, and to catch -memory leaks.
    • -
    • debug.ReadGCStats -reads statistics about garbage collection. -It is useful to see how much of the resources are spent on GC pauses. -It also reports a timeline of garbage collector pauses and pause time percentiles.
    • -
    • debug.Stack -returns the current stack trace. Stack trace -is useful to see how many goroutines are currently running, -what they are doing, and whether they are blocked or not.
    • -
    • debug.WriteHeapDump -suspends the execution of all goroutines -and allows you to dump the heap to a file. A heap dump is a -snapshot of a Go process' memory at a given time. It contains all -allocated objects as well as goroutines, finalizers, and more.
    • -
    • runtime.NumGoroutine -returns the number of current goroutines. -The value can be monitored to see whether enough goroutines are -utilized, or to detect goroutine leaks.
    • -
    - -

    Execution tracer

    - -

    Go comes with a runtime execution tracer to capture a wide range -of runtime events. Scheduling, syscall, garbage collections, -heap size, and other events are collected by runtime and available -for visualization by the go tool trace. Execution tracer is a tool -to detect latency and utilization problems. You can examine how well -the CPU is utilized, and when networking or syscalls are a cause of -preemption for the goroutines.

    - -

    Tracer is useful to:

    -
      -
    • Understand how your goroutines execute.
    • -
    • Understand some of the core runtime events such as GC runs.
    • -
    • Identify poorly parallelized execution.
    • -
    - -

    However, it is not great for identifying hot spots such as -analyzing the cause of excessive memory or CPU usage. -Use profiling tools instead first to address them.

    - -

    - -

    - -

    Above, the go tool trace visualization shows the execution started -fine, and then it became serialized. It suggests that there might -be lock contention for a shared resource that creates a bottleneck.

    - -

    See go tool trace -to collect and analyze runtime traces. -

    - -

    GODEBUG

    - -

    Runtime also emits events and information if -GODEBUG -environmental variable is set accordingly.

    - -
      -
    • GODEBUG=gctrace=1 prints garbage collector events at -each collection, summarizing the amount of memory collected -and the length of the pause.
    • -
    • GODEBUG=inittrace=1 prints a summary of execution time and memory allocation -information for completed package initialization work.
    • -
    • GODEBUG=schedtrace=X prints scheduling events every X milliseconds.
    • -
    - -

    The GODEBUG environmental variable can be used to disable use of -instruction set extensions in the standard library and runtime.

    - -
      -
    • GODEBUG=cpu.all=off disables the use of all optional -instruction set extensions.
    • -
    • GODEBUG=cpu.extension=off disables use of instructions from the -specified instruction set extension.
      -extension is the lower case name for the instruction set extension -such as sse41 or avx.
    • -
    diff --git a/doc/editors.html b/doc/editors.html deleted file mode 100644 index e0d0c530e5..0000000000 --- a/doc/editors.html +++ /dev/null @@ -1,33 +0,0 @@ - - -

    Introduction

    - -

    - This document lists commonly used editor plugins and IDEs from the Go ecosystem - that make Go development more productive and seamless. - A comprehensive list of editor support and IDEs for Go development is available at - the wiki. -

    - -

    Options

    -

    -The Go ecosystem provides a variety of editor plugins and IDEs to enhance your day-to-day -editing, navigation, testing, and debugging experience. -

    - -
      -
    • Visual Studio Code: -Go extension provides support for the Go programming language
    • -
    • GoLand: GoLand is distributed either as a standalone IDE -or as a plugin for IntelliJ IDEA Ultimate
    • -
    • vim: vim-go plugin provides Go programming language support
    • - -

      -Note that these are only a few top solutions; a more comprehensive -community-maintained list of -IDEs and text editor plugins -is available at the Wiki. -

      diff --git a/doc/effective_go.html b/doc/effective_go.html deleted file mode 100644 index 7620402984..0000000000 --- a/doc/effective_go.html +++ /dev/null @@ -1,3673 +0,0 @@ - - -

      Introduction

      - -

      -Go is a new language. Although it borrows ideas from -existing languages, -it has unusual properties that make effective Go programs -different in character from programs written in its relatives. -A straightforward translation of a C++ or Java program into Go -is unlikely to produce a satisfactory result—Java programs -are written in Java, not Go. -On the other hand, thinking about the problem from a Go -perspective could produce a successful but quite different -program. -In other words, -to write Go well, it's important to understand its properties -and idioms. -It's also important to know the established conventions for -programming in Go, such as naming, formatting, program -construction, and so on, so that programs you write -will be easy for other Go programmers to understand. -

      - -

      -This document gives tips for writing clear, idiomatic Go code. -It augments the language specification, -the Tour of Go, -and How to Write Go Code, -all of which you -should read first. -

      - -

      Examples

      - -

      -The Go package sources -are intended to serve not -only as the core library but also as examples of how to -use the language. -Moreover, many of the packages contain working, self-contained -executable examples you can run directly from the -golang.org web site, such as -this one (if -necessary, click on the word "Example" to open it up). -If you have a question about how to approach a problem or how something -might be implemented, the documentation, code and examples in the -library can provide answers, ideas and -background. -

      - - -

      Formatting

      - -

      -Formatting issues are the most contentious -but the least consequential. -People can adapt to different formatting styles -but it's better if they don't have to, and -less time is devoted to the topic -if everyone adheres to the same style. -The problem is how to approach this Utopia without a long -prescriptive style guide. -

      - -

      -With Go we take an unusual -approach and let the machine -take care of most formatting issues. -The gofmt program -(also available as go fmt, which -operates at the package level rather than source file level) -reads a Go program -and emits the source in a standard style of indentation -and vertical alignment, retaining and if necessary -reformatting comments. -If you want to know how to handle some new layout -situation, run gofmt; if the answer doesn't -seem right, rearrange your program (or file a bug about gofmt), -don't work around it. -

      - -

      -As an example, there's no need to spend time lining up -the comments on the fields of a structure. -Gofmt will do that for you. Given the -declaration -

      - -
      -type T struct {
      -    name string // name of the object
      -    value int // its value
      -}
      -
      - -

      -gofmt will line up the columns: -

      - -
      -type T struct {
      -    name    string // name of the object
      -    value   int    // its value
      -}
      -
      - -

      -All Go code in the standard packages has been formatted with gofmt. -

      - - -

      -Some formatting details remain. Very briefly: -

      - -
      -
      Indentation
      -
      We use tabs for indentation and gofmt emits them by default. - Use spaces only if you must. -
      -
      Line length
      -
      - Go has no line length limit. Don't worry about overflowing a punched card. - If a line feels too long, wrap it and indent with an extra tab. -
      -
      Parentheses
      -
      - Go needs fewer parentheses than C and Java: control structures (if, - for, switch) do not have parentheses in - their syntax. - Also, the operator precedence hierarchy is shorter and clearer, so -
      -x<<8 + y<<16
      -
      - means what the spacing implies, unlike in the other languages. -
      -
      - -

      Commentary

      - -

      -Go provides C-style /* */ block comments -and C++-style // line comments. -Line comments are the norm; -block comments appear mostly as package comments, but -are useful within an expression or to disable large swaths of code. -

      - -

      -The program—and web server—godoc processes -Go source files to extract documentation about the contents of the -package. -Comments that appear before top-level declarations, with no intervening newlines, -are extracted along with the declaration to serve as explanatory text for the item. -The nature and style of these comments determines the -quality of the documentation godoc produces. -

      - -

      -Every package should have a package comment, a block -comment preceding the package clause. -For multi-file packages, the package comment only needs to be -present in one file, and any one will do. -The package comment should introduce the package and -provide information relevant to the package as a whole. -It will appear first on the godoc page and -should set up the detailed documentation that follows. -

      - -
      -/*
      -Package regexp implements a simple library for regular expressions.
      -
      -The syntax of the regular expressions accepted is:
      -
      -    regexp:
      -        concatenation { '|' concatenation }
      -    concatenation:
      -        { closure }
      -    closure:
      -        term [ '*' | '+' | '?' ]
      -    term:
      -        '^'
      -        '$'
      -        '.'
      -        character
      -        '[' [ '^' ] character-ranges ']'
      -        '(' regexp ')'
      -*/
      -package regexp
      -
      - -

      -If the package is simple, the package comment can be brief. -

      - -
      -// Package path implements utility routines for
      -// manipulating slash-separated filename paths.
      -
      - -

      -Comments do not need extra formatting such as banners of stars. -The generated output may not even be presented in a fixed-width font, so don't depend -on spacing for alignment—godoc, like gofmt, -takes care of that. -The comments are uninterpreted plain text, so HTML and other -annotations such as _this_ will reproduce verbatim and should -not be used. -One adjustment godoc does do is to display indented -text in a fixed-width font, suitable for program snippets. -The package comment for the -fmt package uses this to good effect. -

      - -

      -Depending on the context, godoc might not even -reformat comments, so make sure they look good straight up: -use correct spelling, punctuation, and sentence structure, -fold long lines, and so on. -

      - -

      -Inside a package, any comment immediately preceding a top-level declaration -serves as a doc comment for that declaration. -Every exported (capitalized) name in a program should -have a doc comment. -

      - -

      -Doc comments work best as complete sentences, which allow -a wide variety of automated presentations. -The first sentence should be a one-sentence summary that -starts with the name being declared. -

      - -
      -// Compile parses a regular expression and returns, if successful,
      -// a Regexp that can be used to match against text.
      -func Compile(str string) (*Regexp, error) {
      -
      - -

      -If every doc comment begins with the name of the item it describes, -you can use the doc -subcommand of the go tool -and run the output through grep. -Imagine you couldn't remember the name "Compile" but were looking for -the parsing function for regular expressions, so you ran -the command, -

      - -
      -$ go doc -all regexp | grep -i parse
      -
      - -

      -If all the doc comments in the package began, "This function...", grep -wouldn't help you remember the name. But because the package starts each -doc comment with the name, you'd see something like this, -which recalls the word you're looking for. -

      - -
      -$ go doc -all regexp | grep -i parse
      -    Compile parses a regular expression and returns, if successful, a Regexp
      -    MustCompile is like Compile but panics if the expression cannot be parsed.
      -    parsed. It simplifies safe initialization of global variables holding
      -$
      -
      - -

      -Go's declaration syntax allows grouping of declarations. -A single doc comment can introduce a group of related constants or variables. -Since the whole declaration is presented, such a comment can often be perfunctory. -

      - -
      -// Error codes returned by failures to parse an expression.
      -var (
      -    ErrInternal      = errors.New("regexp: internal error")
      -    ErrUnmatchedLpar = errors.New("regexp: unmatched '('")
      -    ErrUnmatchedRpar = errors.New("regexp: unmatched ')'")
      -    ...
      -)
      -
      - -

      -Grouping can also indicate relationships between items, -such as the fact that a set of variables is protected by a mutex. -

      - -
      -var (
      -    countLock   sync.Mutex
      -    inputCount  uint32
      -    outputCount uint32
      -    errorCount  uint32
      -)
      -
      - -

      Names

      - -

      -Names are as important in Go as in any other language. -They even have semantic effect: -the visibility of a name outside a package is determined by whether its -first character is upper case. -It's therefore worth spending a little time talking about naming conventions -in Go programs. -

      - - -

      Package names

      - -

      -When a package is imported, the package name becomes an accessor for the -contents. After -

      - -
      -import "bytes"
      -
      - -

      -the importing package can talk about bytes.Buffer. It's -helpful if everyone using the package can use the same name to refer to -its contents, which implies that the package name should be good: -short, concise, evocative. By convention, packages are given -lower case, single-word names; there should be no need for underscores -or mixedCaps. -Err on the side of brevity, since everyone using your -package will be typing that name. -And don't worry about collisions a priori. -The package name is only the default name for imports; it need not be unique -across all source code, and in the rare case of a collision the -importing package can choose a different name to use locally. -In any case, confusion is rare because the file name in the import -determines just which package is being used. -

      - -

      -Another convention is that the package name is the base name of -its source directory; -the package in src/encoding/base64 -is imported as "encoding/base64" but has name base64, -not encoding_base64 and not encodingBase64. -

      - -

      -The importer of a package will use the name to refer to its contents, -so exported names in the package can use that fact -to avoid stutter. -(Don't use the import . notation, which can simplify -tests that must run outside the package they are testing, but should otherwise be avoided.) -For instance, the buffered reader type in the bufio package is called Reader, -not BufReader, because users see it as bufio.Reader, -which is a clear, concise name. -Moreover, -because imported entities are always addressed with their package name, bufio.Reader -does not conflict with io.Reader. -Similarly, the function to make new instances of ring.Ring—which -is the definition of a constructor in Go—would -normally be called NewRing, but since -Ring is the only type exported by the package, and since the -package is called ring, it's called just New, -which clients of the package see as ring.New. -Use the package structure to help you choose good names. -

      - -

      -Another short example is once.Do; -once.Do(setup) reads well and would not be improved by -writing once.DoOrWaitUntilDone(setup). -Long names don't automatically make things more readable. -A helpful doc comment can often be more valuable than an extra long name. -

      - -

      Getters

      - -

      -Go doesn't provide automatic support for getters and setters. -There's nothing wrong with providing getters and setters yourself, -and it's often appropriate to do so, but it's neither idiomatic nor necessary -to put Get into the getter's name. If you have a field called -owner (lower case, unexported), the getter method should be -called Owner (upper case, exported), not GetOwner. -The use of upper-case names for export provides the hook to discriminate -the field from the method. -A setter function, if needed, will likely be called SetOwner. -Both names read well in practice: -

      -
      -owner := obj.Owner()
      -if owner != user {
      -    obj.SetOwner(user)
      -}
      -
      - -

      Interface names

      - -

      -By convention, one-method interfaces are named by -the method name plus an -er suffix or similar modification -to construct an agent noun: Reader, -Writer, Formatter, -CloseNotifier etc. -

      - -

      -There are a number of such names and it's productive to honor them and the function -names they capture. -Read, Write, Close, Flush, -String and so on have -canonical signatures and meanings. To avoid confusion, -don't give your method one of those names unless it -has the same signature and meaning. -Conversely, if your type implements a method with the -same meaning as a method on a well-known type, -give it the same name and signature; -call your string-converter method String not ToString. -

      - -

      MixedCaps

      - -

      -Finally, the convention in Go is to use MixedCaps -or mixedCaps rather than underscores to write -multiword names. -

      - -

      Semicolons

      - -

      -Like C, Go's formal grammar uses semicolons to terminate statements, -but unlike in C, those semicolons do not appear in the source. -Instead the lexer uses a simple rule to insert semicolons automatically -as it scans, so the input text is mostly free of them. -

      - -

      -The rule is this. If the last token before a newline is an identifier -(which includes words like int and float64), -a basic literal such as a number or string constant, or one of the -tokens -

      -
      -break continue fallthrough return ++ -- ) }
      -
      -

      -the lexer always inserts a semicolon after the token. -This could be summarized as, “if the newline comes -after a token that could end a statement, insert a semicolon”. -

      - -

      -A semicolon can also be omitted immediately before a closing brace, -so a statement such as -

      -
      -    go func() { for { dst <- <-src } }()
      -
      -

      -needs no semicolons. -Idiomatic Go programs have semicolons only in places such as -for loop clauses, to separate the initializer, condition, and -continuation elements. They are also necessary to separate multiple -statements on a line, should you write code that way. -

      - -

      -One consequence of the semicolon insertion rules -is that you cannot put the opening brace of a -control structure (if, for, switch, -or select) on the next line. If you do, a semicolon -will be inserted before the brace, which could cause unwanted -effects. Write them like this -

      - -
      -if i < f() {
      -    g()
      -}
      -
      -

      -not like this -

      -
      -if i < f()  // wrong!
      -{           // wrong!
      -    g()
      -}
      -
      - - -

      Control structures

      - -

      -The control structures of Go are related to those of C but differ -in important ways. -There is no do or while loop, only a -slightly generalized -for; -switch is more flexible; -if and switch accept an optional -initialization statement like that of for; -break and continue statements -take an optional label to identify what to break or continue; -and there are new control structures including a type switch and a -multiway communications multiplexer, select. -The syntax is also slightly different: -there are no parentheses -and the bodies must always be brace-delimited. -

      - -

      If

      - -

      -In Go a simple if looks like this: -

      -
      -if x > 0 {
      -    return y
      -}
      -
      - -

      -Mandatory braces encourage writing simple if statements -on multiple lines. It's good style to do so anyway, -especially when the body contains a control statement such as a -return or break. -

      - -

      -Since if and switch accept an initialization -statement, it's common to see one used to set up a local variable. -

      - -
      -if err := file.Chmod(0664); err != nil {
      -    log.Print(err)
      -    return err
      -}
      -
      - -

      -In the Go libraries, you'll find that -when an if statement doesn't flow into the next statement—that is, -the body ends in break, continue, -goto, or return—the unnecessary -else is omitted. -

      - -
      -f, err := os.Open(name)
      -if err != nil {
      -    return err
      -}
      -codeUsing(f)
      -
      - -

      -This is an example of a common situation where code must guard against a -sequence of error conditions. The code reads well if the -successful flow of control runs down the page, eliminating error cases -as they arise. Since error cases tend to end in return -statements, the resulting code needs no else statements. -

      - -
      -f, err := os.Open(name)
      -if err != nil {
      -    return err
      -}
      -d, err := f.Stat()
      -if err != nil {
      -    f.Close()
      -    return err
      -}
      -codeUsing(f, d)
      -
      - - -

      Redeclaration and reassignment

      - -

      -An aside: The last example in the previous section demonstrates a detail of how the -:= short declaration form works. -The declaration that calls os.Open reads, -

      - -
      -f, err := os.Open(name)
      -
      - -

      -This statement declares two variables, f and err. -A few lines later, the call to f.Stat reads, -

      - -
      -d, err := f.Stat()
      -
      - -

      -which looks as if it declares d and err. -Notice, though, that err appears in both statements. -This duplication is legal: err is declared by the first statement, -but only re-assigned in the second. -This means that the call to f.Stat uses the existing -err variable declared above, and just gives it a new value. -

      - -

      -In a := declaration a variable v may appear even -if it has already been declared, provided: -

      - -
        -
      • this declaration is in the same scope as the existing declaration of v -(if v is already declared in an outer scope, the declaration will create a new variable §),
      • -
      • the corresponding value in the initialization is assignable to v, and
      • -
      • there is at least one other variable that is created by the declaration.
      • -
      - -

      -This unusual property is pure pragmatism, -making it easy to use a single err value, for example, -in a long if-else chain. -You'll see it used often. -

      - -

      -§ It's worth noting here that in Go the scope of function parameters and return values -is the same as the function body, even though they appear lexically outside the braces -that enclose the body. -

      - -

      For

      - -

      -The Go for loop is similar to—but not the same as—C's. -It unifies for -and while and there is no do-while. -There are three forms, only one of which has semicolons. -

      -
      -// Like a C for
      -for init; condition; post { }
      -
      -// Like a C while
      -for condition { }
      -
      -// Like a C for(;;)
      -for { }
      -
      - -

      -Short declarations make it easy to declare the index variable right in the loop. -

      -
      -sum := 0
      -for i := 0; i < 10; i++ {
      -    sum += i
      -}
      -
      - -

      -If you're looping over an array, slice, string, or map, -or reading from a channel, a range clause can -manage the loop. -

      -
      -for key, value := range oldMap {
      -    newMap[key] = value
      -}
      -
      - -

      -If you only need the first item in the range (the key or index), drop the second: -

      -
      -for key := range m {
      -    if key.expired() {
      -        delete(m, key)
      -    }
      -}
      -
      - -

      -If you only need the second item in the range (the value), use the blank identifier, an underscore, to discard the first: -

      -
      -sum := 0
      -for _, value := range array {
      -    sum += value
      -}
      -
      - -

      -The blank identifier has many uses, as described in a later section. -

      - -

      -For strings, the range does more work for you, breaking out individual -Unicode code points by parsing the UTF-8. -Erroneous encodings consume one byte and produce the -replacement rune U+FFFD. -(The name (with associated builtin type) rune is Go terminology for a -single Unicode code point. -See the language specification -for details.) -The loop -

      -
      -for pos, char := range "日本\x80語" { // \x80 is an illegal UTF-8 encoding
      -    fmt.Printf("character %#U starts at byte position %d\n", char, pos)
      -}
      -
      -

      -prints -

      -
      -character U+65E5 '日' starts at byte position 0
      -character U+672C '本' starts at byte position 3
      -character U+FFFD '�' starts at byte position 6
      -character U+8A9E '語' starts at byte position 7
      -
      - -

      -Finally, Go has no comma operator and ++ and -- -are statements not expressions. -Thus if you want to run multiple variables in a for -you should use parallel assignment (although that precludes ++ and --). -

      -
      -// Reverse a
      -for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
      -    a[i], a[j] = a[j], a[i]
      -}
      -
      - -

      Switch

      - -

      -Go's switch is more general than C's. -The expressions need not be constants or even integers, -the cases are evaluated top to bottom until a match is found, -and if the switch has no expression it switches on -true. -It's therefore possible—and idiomatic—to write an -if-else-if-else -chain as a switch. -

      - -
      -func unhex(c byte) byte {
      -    switch {
      -    case '0' <= c && c <= '9':
      -        return c - '0'
      -    case 'a' <= c && c <= 'f':
      -        return c - 'a' + 10
      -    case 'A' <= c && c <= 'F':
      -        return c - 'A' + 10
      -    }
      -    return 0
      -}
      -
      - -

      -There is no automatic fall through, but cases can be presented -in comma-separated lists. -

      -
      -func shouldEscape(c byte) bool {
      -    switch c {
      -    case ' ', '?', '&', '=', '#', '+', '%':
      -        return true
      -    }
      -    return false
      -}
      -
      - -

      -Although they are not nearly as common in Go as some other C-like -languages, break statements can be used to terminate -a switch early. -Sometimes, though, it's necessary to break out of a surrounding loop, -not the switch, and in Go that can be accomplished by putting a label -on the loop and "breaking" to that label. -This example shows both uses. -

      - -
      -Loop:
      -	for n := 0; n < len(src); n += size {
      -		switch {
      -		case src[n] < sizeOne:
      -			if validateOnly {
      -				break
      -			}
      -			size = 1
      -			update(src[n])
      -
      -		case src[n] < sizeTwo:
      -			if n+1 >= len(src) {
      -				err = errShortInput
      -				break Loop
      -			}
      -			if validateOnly {
      -				break
      -			}
      -			size = 2
      -			update(src[n] + src[n+1]<<shift)
      -		}
      -	}
      -
      - -

      -Of course, the continue statement also accepts an optional label -but it applies only to loops. -

      - -

      -To close this section, here's a comparison routine for byte slices that uses two -switch statements: -

      -
      -// Compare returns an integer comparing the two byte slices,
      -// lexicographically.
      -// The result will be 0 if a == b, -1 if a < b, and +1 if a > b
      -func Compare(a, b []byte) int {
      -    for i := 0; i < len(a) && i < len(b); i++ {
      -        switch {
      -        case a[i] > b[i]:
      -            return 1
      -        case a[i] < b[i]:
      -            return -1
      -        }
      -    }
      -    switch {
      -    case len(a) > len(b):
      -        return 1
      -    case len(a) < len(b):
      -        return -1
      -    }
      -    return 0
      -}
      -
      - -

      Type switch

      - -

      -A switch can also be used to discover the dynamic type of an interface -variable. Such a type switch uses the syntax of a type -assertion with the keyword type inside the parentheses. -If the switch declares a variable in the expression, the variable will -have the corresponding type in each clause. -It's also idiomatic to reuse the name in such cases, in effect declaring -a new variable with the same name but a different type in each case. -

      -
      -var t interface{}
      -t = functionOfSomeType()
      -switch t := t.(type) {
      -default:
      -    fmt.Printf("unexpected type %T\n", t)     // %T prints whatever type t has
      -case bool:
      -    fmt.Printf("boolean %t\n", t)             // t has type bool
      -case int:
      -    fmt.Printf("integer %d\n", t)             // t has type int
      -case *bool:
      -    fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool
      -case *int:
      -    fmt.Printf("pointer to integer %d\n", *t) // t has type *int
      -}
      -
      - -

      Functions

      - -

      Multiple return values

      - -

      -One of Go's unusual features is that functions and methods -can return multiple values. This form can be used to -improve on a couple of clumsy idioms in C programs: in-band -error returns such as -1 for EOF -and modifying an argument passed by address. -

      - -

      -In C, a write error is signaled by a negative count with the -error code secreted away in a volatile location. -In Go, Write -can return a count and an error: “Yes, you wrote some -bytes but not all of them because you filled the device”. -The signature of the Write method on files from -package os is: -

      - -
      -func (file *File) Write(b []byte) (n int, err error)
      -
      - -

      -and as the documentation says, it returns the number of bytes -written and a non-nil error when n -!= len(b). -This is a common style; see the section on error handling for more examples. -

      - -

      -A similar approach obviates the need to pass a pointer to a return -value to simulate a reference parameter. -Here's a simple-minded function to -grab a number from a position in a byte slice, returning the number -and the next position. -

      - -
      -func nextInt(b []byte, i int) (int, int) {
      -    for ; i < len(b) && !isDigit(b[i]); i++ {
      -    }
      -    x := 0
      -    for ; i < len(b) && isDigit(b[i]); i++ {
      -        x = x*10 + int(b[i]) - '0'
      -    }
      -    return x, i
      -}
      -
      - -

      -You could use it to scan the numbers in an input slice b like this: -

      - -
      -    for i := 0; i < len(b); {
      -        x, i = nextInt(b, i)
      -        fmt.Println(x)
      -    }
      -
      - -

      Named result parameters

      - -

      -The return or result "parameters" of a Go function can be given names and -used as regular variables, just like the incoming parameters. -When named, they are initialized to the zero values for their types when -the function begins; if the function executes a return statement -with no arguments, the current values of the result parameters are -used as the returned values. -

      - -

      -The names are not mandatory but they can make code shorter and clearer: -they're documentation. -If we name the results of nextInt it becomes -obvious which returned int -is which. -

      - -
      -func nextInt(b []byte, pos int) (value, nextPos int) {
      -
      - -

      -Because named results are initialized and tied to an unadorned return, they can simplify -as well as clarify. Here's a version -of io.ReadFull that uses them well: -

      - -
      -func ReadFull(r Reader, buf []byte) (n int, err error) {
      -    for len(buf) > 0 && err == nil {
      -        var nr int
      -        nr, err = r.Read(buf)
      -        n += nr
      -        buf = buf[nr:]
      -    }
      -    return
      -}
      -
      - -

      Defer

      - -

      -Go's defer statement schedules a function call (the -deferred function) to be run immediately before the function -executing the defer returns. It's an unusual but -effective way to deal with situations such as resources that must be -released regardless of which path a function takes to return. The -canonical examples are unlocking a mutex or closing a file. -

      - -
      -// Contents returns the file's contents as a string.
      -func Contents(filename string) (string, error) {
      -    f, err := os.Open(filename)
      -    if err != nil {
      -        return "", err
      -    }
      -    defer f.Close()  // f.Close will run when we're finished.
      -
      -    var result []byte
      -    buf := make([]byte, 100)
      -    for {
      -        n, err := f.Read(buf[0:])
      -        result = append(result, buf[0:n]...) // append is discussed later.
      -        if err != nil {
      -            if err == io.EOF {
      -                break
      -            }
      -            return "", err  // f will be closed if we return here.
      -        }
      -    }
      -    return string(result), nil // f will be closed if we return here.
      -}
      -
      - -

      -Deferring a call to a function such as Close has two advantages. First, it -guarantees that you will never forget to close the file, a mistake -that's easy to make if you later edit the function to add a new return -path. Second, it means that the close sits near the open, -which is much clearer than placing it at the end of the function. -

      - -

      -The arguments to the deferred function (which include the receiver if -the function is a method) are evaluated when the defer -executes, not when the call executes. Besides avoiding worries -about variables changing values as the function executes, this means -that a single deferred call site can defer multiple function -executions. Here's a silly example. -

      - -
      -for i := 0; i < 5; i++ {
      -    defer fmt.Printf("%d ", i)
      -}
      -
      - -

      -Deferred functions are executed in LIFO order, so this code will cause -4 3 2 1 0 to be printed when the function returns. A -more plausible example is a simple way to trace function execution -through the program. We could write a couple of simple tracing -routines like this: -

      - -
      -func trace(s string)   { fmt.Println("entering:", s) }
      -func untrace(s string) { fmt.Println("leaving:", s) }
      -
      -// Use them like this:
      -func a() {
      -    trace("a")
      -    defer untrace("a")
      -    // do something....
      -}
      -
      - -

      -We can do better by exploiting the fact that arguments to deferred -functions are evaluated when the defer executes. The -tracing routine can set up the argument to the untracing routine. -This example: -

      - -
      -func trace(s string) string {
      -    fmt.Println("entering:", s)
      -    return s
      -}
      -
      -func un(s string) {
      -    fmt.Println("leaving:", s)
      -}
      -
      -func a() {
      -    defer un(trace("a"))
      -    fmt.Println("in a")
      -}
      -
      -func b() {
      -    defer un(trace("b"))
      -    fmt.Println("in b")
      -    a()
      -}
      -
      -func main() {
      -    b()
      -}
      -
      - -

      -prints -

      - -
      -entering: b
      -in b
      -entering: a
      -in a
      -leaving: a
      -leaving: b
      -
      - -

      -For programmers accustomed to block-level resource management from -other languages, defer may seem peculiar, but its most -interesting and powerful applications come precisely from the fact -that it's not block-based but function-based. In the section on -panic and recover we'll see another -example of its possibilities. -

      - -

      Data

      - -

      Allocation with new

      - -

      -Go has two allocation primitives, the built-in functions -new and make. -They do different things and apply to different types, which can be confusing, -but the rules are simple. -Let's talk about new first. -It's a built-in function that allocates memory, but unlike its namesakes -in some other languages it does not initialize the memory, -it only zeros it. -That is, -new(T) allocates zeroed storage for a new item of type -T and returns its address, a value of type *T. -In Go terminology, it returns a pointer to a newly allocated zero value of type -T. -

      - -

      -Since the memory returned by new is zeroed, it's helpful to arrange -when designing your data structures that the -zero value of each type can be used without further initialization. This means a user of -the data structure can create one with new and get right to -work. -For example, the documentation for bytes.Buffer states that -"the zero value for Buffer is an empty buffer ready to use." -Similarly, sync.Mutex does not -have an explicit constructor or Init method. -Instead, the zero value for a sync.Mutex -is defined to be an unlocked mutex. -

      - -

      -The zero-value-is-useful property works transitively. Consider this type declaration. -

      - -
      -type SyncedBuffer struct {
      -    lock    sync.Mutex
      -    buffer  bytes.Buffer
      -}
      -
      - -

      -Values of type SyncedBuffer are also ready to use immediately upon allocation -or just declaration. In the next snippet, both p and v will work -correctly without further arrangement. -

      - -
      -p := new(SyncedBuffer)  // type *SyncedBuffer
      -var v SyncedBuffer      // type  SyncedBuffer
      -
      - -

      Constructors and composite literals

      - -

      -Sometimes the zero value isn't good enough and an initializing -constructor is necessary, as in this example derived from -package os. -

      - -
      -func NewFile(fd int, name string) *File {
      -    if fd < 0 {
      -        return nil
      -    }
      -    f := new(File)
      -    f.fd = fd
      -    f.name = name
      -    f.dirinfo = nil
      -    f.nepipe = 0
      -    return f
      -}
      -
      - -

      -There's a lot of boiler plate in there. We can simplify it -using a composite literal, which is -an expression that creates a -new instance each time it is evaluated. -

      - -
      -func NewFile(fd int, name string) *File {
      -    if fd < 0 {
      -        return nil
      -    }
      -    f := File{fd, name, nil, 0}
      -    return &f
      -}
      -
      - -

      -Note that, unlike in C, it's perfectly OK to return the address of a local variable; -the storage associated with the variable survives after the function -returns. -In fact, taking the address of a composite literal -allocates a fresh instance each time it is evaluated, -so we can combine these last two lines. -

      - -
      -    return &File{fd, name, nil, 0}
      -
      - -

      -The fields of a composite literal are laid out in order and must all be present. -However, by labeling the elements explicitly as field:value -pairs, the initializers can appear in any -order, with the missing ones left as their respective zero values. Thus we could say -

      - -
      -    return &File{fd: fd, name: name}
      -
      - -

      -As a limiting case, if a composite literal contains no fields at all, it creates -a zero value for the type. The expressions new(File) and &File{} are equivalent. -

      - -

      -Composite literals can also be created for arrays, slices, and maps, -with the field labels being indices or map keys as appropriate. -In these examples, the initializations work regardless of the values of Enone, -Eio, and Einval, as long as they are distinct. -

      - -
      -a := [...]string   {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
      -s := []string      {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
      -m := map[int]string{Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
      -
      - -

      Allocation with make

      - -

      -Back to allocation. -The built-in function make(T, args) serves -a purpose different from new(T). -It creates slices, maps, and channels only, and it returns an initialized -(not zeroed) -value of type T (not *T). -The reason for the distinction -is that these three types represent, under the covers, references to data structures that -must be initialized before use. -A slice, for example, is a three-item descriptor -containing a pointer to the data (inside an array), the length, and the -capacity, and until those items are initialized, the slice is nil. -For slices, maps, and channels, -make initializes the internal data structure and prepares -the value for use. -For instance, -

      - -
      -make([]int, 10, 100)
      -
      - -

      -allocates an array of 100 ints and then creates a slice -structure with length 10 and a capacity of 100 pointing at the first -10 elements of the array. -(When making a slice, the capacity can be omitted; see the section on slices -for more information.) -In contrast, new([]int) returns a pointer to a newly allocated, zeroed slice -structure, that is, a pointer to a nil slice value. -

      - -

      -These examples illustrate the difference between new and -make. -

      - -
      -var p *[]int = new([]int)       // allocates slice structure; *p == nil; rarely useful
      -var v  []int = make([]int, 100) // the slice v now refers to a new array of 100 ints
      -
      -// Unnecessarily complex:
      -var p *[]int = new([]int)
      -*p = make([]int, 100, 100)
      -
      -// Idiomatic:
      -v := make([]int, 100)
      -
      - -

      -Remember that make applies only to maps, slices and channels -and does not return a pointer. -To obtain an explicit pointer allocate with new or take the address -of a variable explicitly. -

      - -

      Arrays

      - -

      -Arrays are useful when planning the detailed layout of memory and sometimes -can help avoid allocation, but primarily -they are a building block for slices, the subject of the next section. -To lay the foundation for that topic, here are a few words about arrays. -

      - -

      -There are major differences between the ways arrays work in Go and C. -In Go, -

      -
        -
      • -Arrays are values. Assigning one array to another copies all the elements. -
      • -
      • -In particular, if you pass an array to a function, it -will receive a copy of the array, not a pointer to it. -
      • -The size of an array is part of its type. The types [10]int -and [20]int are distinct. -
      • -
      - -

      -The value property can be useful but also expensive; if you want C-like behavior and efficiency, -you can pass a pointer to the array. -

      - -
      -func Sum(a *[3]float64) (sum float64) {
      -    for _, v := range *a {
      -        sum += v
      -    }
      -    return
      -}
      -
      -array := [...]float64{7.0, 8.5, 9.1}
      -x := Sum(&array)  // Note the explicit address-of operator
      -
      - -

      -But even this style isn't idiomatic Go. -Use slices instead. -

      - -

      Slices

      - -

      -Slices wrap arrays to give a more general, powerful, and convenient -interface to sequences of data. Except for items with explicit -dimension such as transformation matrices, most array programming in -Go is done with slices rather than simple arrays. -

      -

      -Slices hold references to an underlying array, and if you assign one -slice to another, both refer to the same array. -If a function takes a slice argument, changes it makes to -the elements of the slice will be visible to the caller, analogous to -passing a pointer to the underlying array. A Read -function can therefore accept a slice argument rather than a pointer -and a count; the length within the slice sets an upper -limit of how much data to read. Here is the signature of the -Read method of the File type in package -os: -

      -
      -func (f *File) Read(buf []byte) (n int, err error)
      -
      -

      -The method returns the number of bytes read and an error value, if -any. -To read into the first 32 bytes of a larger buffer -buf, slice (here used as a verb) the buffer. -

      -
      -    n, err := f.Read(buf[0:32])
      -
      -

      -Such slicing is common and efficient. In fact, leaving efficiency aside for -the moment, the following snippet would also read the first 32 bytes of the buffer. -

      -
      -    var n int
      -    var err error
      -    for i := 0; i < 32; i++ {
      -        nbytes, e := f.Read(buf[i:i+1])  // Read one byte.
      -        n += nbytes
      -        if nbytes == 0 || e != nil {
      -            err = e
      -            break
      -        }
      -    }
      -
      -

      -The length of a slice may be changed as long as it still fits within -the limits of the underlying array; just assign it to a slice of -itself. The capacity of a slice, accessible by the built-in -function cap, reports the maximum length the slice may -assume. Here is a function to append data to a slice. If the data -exceeds the capacity, the slice is reallocated. The -resulting slice is returned. The function uses the fact that -len and cap are legal when applied to the -nil slice, and return 0. -

      -
      -func Append(slice, data []byte) []byte {
      -    l := len(slice)
      -    if l + len(data) > cap(slice) {  // reallocate
      -        // Allocate double what's needed, for future growth.
      -        newSlice := make([]byte, (l+len(data))*2)
      -        // The copy function is predeclared and works for any slice type.
      -        copy(newSlice, slice)
      -        slice = newSlice
      -    }
      -    slice = slice[0:l+len(data)]
      -    copy(slice[l:], data)
      -    return slice
      -}
      -
      -

      -We must return the slice afterwards because, although Append -can modify the elements of slice, the slice itself (the run-time data -structure holding the pointer, length, and capacity) is passed by value. -

      - -

      -The idea of appending to a slice is so useful it's captured by the -append built-in function. To understand that function's -design, though, we need a little more information, so we'll return -to it later. -

      - -

      Two-dimensional slices

      - -

      -Go's arrays and slices are one-dimensional. -To create the equivalent of a 2D array or slice, it is necessary to define an array-of-arrays -or slice-of-slices, like this: -

      - -
      -type Transform [3][3]float64  // A 3x3 array, really an array of arrays.
      -type LinesOfText [][]byte     // A slice of byte slices.
      -
      - -

      -Because slices are variable-length, it is possible to have each inner -slice be a different length. -That can be a common situation, as in our LinesOfText -example: each line has an independent length. -

      - -
      -text := LinesOfText{
      -	[]byte("Now is the time"),
      -	[]byte("for all good gophers"),
      -	[]byte("to bring some fun to the party."),
      -}
      -
      - -

      -Sometimes it's necessary to allocate a 2D slice, a situation that can arise when -processing scan lines of pixels, for instance. -There are two ways to achieve this. -One is to allocate each slice independently; the other -is to allocate a single array and point the individual slices into it. -Which to use depends on your application. -If the slices might grow or shrink, they should be allocated independently -to avoid overwriting the next line; if not, it can be more efficient to construct -the object with a single allocation. -For reference, here are sketches of the two methods. -First, a line at a time: -

      - -
      -// Allocate the top-level slice.
      -picture := make([][]uint8, YSize) // One row per unit of y.
      -// Loop over the rows, allocating the slice for each row.
      -for i := range picture {
      -	picture[i] = make([]uint8, XSize)
      -}
      -
      - -

      -And now as one allocation, sliced into lines: -

      - -
      -// Allocate the top-level slice, the same as before.
      -picture := make([][]uint8, YSize) // One row per unit of y.
      -// Allocate one large slice to hold all the pixels.
      -pixels := make([]uint8, XSize*YSize) // Has type []uint8 even though picture is [][]uint8.
      -// Loop over the rows, slicing each row from the front of the remaining pixels slice.
      -for i := range picture {
      -	picture[i], pixels = pixels[:XSize], pixels[XSize:]
      -}
      -
      - -

      Maps

      - -

      -Maps are a convenient and powerful built-in data structure that associate -values of one type (the key) with values of another type -(the element or value). -The key can be of any type for which the equality operator is defined, -such as integers, -floating point and complex numbers, -strings, pointers, interfaces (as long as the dynamic type -supports equality), structs and arrays. -Slices cannot be used as map keys, -because equality is not defined on them. -Like slices, maps hold references to an underlying data structure. -If you pass a map to a function -that changes the contents of the map, the changes will be visible -in the caller. -

      -

      -Maps can be constructed using the usual composite literal syntax -with colon-separated key-value pairs, -so it's easy to build them during initialization. -

      -
      -var timeZone = map[string]int{
      -    "UTC":  0*60*60,
      -    "EST": -5*60*60,
      -    "CST": -6*60*60,
      -    "MST": -7*60*60,
      -    "PST": -8*60*60,
      -}
      -
      -

      -Assigning and fetching map values looks syntactically just like -doing the same for arrays and slices except that the index doesn't -need to be an integer. -

      -
      -offset := timeZone["EST"]
      -
      -

      -An attempt to fetch a map value with a key that -is not present in the map will return the zero value for the type -of the entries -in the map. For instance, if the map contains integers, looking -up a non-existent key will return 0. -A set can be implemented as a map with value type bool. -Set the map entry to true to put the value in the set, and then -test it by simple indexing. -

      -
      -attended := map[string]bool{
      -    "Ann": true,
      -    "Joe": true,
      -    ...
      -}
      -
      -if attended[person] { // will be false if person is not in the map
      -    fmt.Println(person, "was at the meeting")
      -}
      -
      -

      -Sometimes you need to distinguish a missing entry from -a zero value. Is there an entry for "UTC" -or is that 0 because it's not in the map at all? -You can discriminate with a form of multiple assignment. -

      -
      -var seconds int
      -var ok bool
      -seconds, ok = timeZone[tz]
      -
      -

      -For obvious reasons this is called the “comma ok” idiom. -In this example, if tz is present, seconds -will be set appropriately and ok will be true; if not, -seconds will be set to zero and ok will -be false. -Here's a function that puts it together with a nice error report: -

      -
      -func offset(tz string) int {
      -    if seconds, ok := timeZone[tz]; ok {
      -        return seconds
      -    }
      -    log.Println("unknown time zone:", tz)
      -    return 0
      -}
      -
      -

      -To test for presence in the map without worrying about the actual value, -you can use the blank identifier (_) -in place of the usual variable for the value. -

      -
      -_, present := timeZone[tz]
      -
      -

      -To delete a map entry, use the delete -built-in function, whose arguments are the map and the key to be deleted. -It's safe to do this even if the key is already absent -from the map. -

      -
      -delete(timeZone, "PDT")  // Now on Standard Time
      -
      - -

      Printing

      - -

      -Formatted printing in Go uses a style similar to C's printf -family but is richer and more general. The functions live in the fmt -package and have capitalized names: fmt.Printf, fmt.Fprintf, -fmt.Sprintf and so on. The string functions (Sprintf etc.) -return a string rather than filling in a provided buffer. -

      -

      -You don't need to provide a format string. For each of Printf, -Fprintf and Sprintf there is another pair -of functions, for instance Print and Println. -These functions do not take a format string but instead generate a default -format for each argument. The Println versions also insert a blank -between arguments and append a newline to the output while -the Print versions add blanks only if the operand on neither side is a string. -In this example each line produces the same output. -

      -
      -fmt.Printf("Hello %d\n", 23)
      -fmt.Fprint(os.Stdout, "Hello ", 23, "\n")
      -fmt.Println("Hello", 23)
      -fmt.Println(fmt.Sprint("Hello ", 23))
      -
      -

      -The formatted print functions fmt.Fprint -and friends take as a first argument any object -that implements the io.Writer interface; the variables os.Stdout -and os.Stderr are familiar instances. -

      -

      -Here things start to diverge from C. First, the numeric formats such as %d -do not take flags for signedness or size; instead, the printing routines use the -type of the argument to decide these properties. -

      -
      -var x uint64 = 1<<64 - 1
      -fmt.Printf("%d %x; %d %x\n", x, x, int64(x), int64(x))
      -
      -

      -prints -

      -
      -18446744073709551615 ffffffffffffffff; -1 -1
      -
      -

      -If you just want the default conversion, such as decimal for integers, you can use -the catchall format %v (for “value”); the result is exactly -what Print and Println would produce. -Moreover, that format can print any value, even arrays, slices, structs, and -maps. Here is a print statement for the time zone map defined in the previous section. -

      -
      -fmt.Printf("%v\n", timeZone)  // or just fmt.Println(timeZone)
      -
      -

      -which gives output: -

      -
      -map[CST:-21600 EST:-18000 MST:-25200 PST:-28800 UTC:0]
      -
      -

      -For maps, Printf and friends sort the output lexicographically by key. -

      -

      -When printing a struct, the modified format %+v annotates the -fields of the structure with their names, and for any value the alternate -format %#v prints the value in full Go syntax. -

      -
      -type T struct {
      -    a int
      -    b float64
      -    c string
      -}
      -t := &T{ 7, -2.35, "abc\tdef" }
      -fmt.Printf("%v\n", t)
      -fmt.Printf("%+v\n", t)
      -fmt.Printf("%#v\n", t)
      -fmt.Printf("%#v\n", timeZone)
      -
      -

      -prints -

      -
      -&{7 -2.35 abc   def}
      -&{a:7 b:-2.35 c:abc     def}
      -&main.T{a:7, b:-2.35, c:"abc\tdef"}
      -map[string]int{"CST":-21600, "EST":-18000, "MST":-25200, "PST":-28800, "UTC":0}
      -
      -

      -(Note the ampersands.) -That quoted string format is also available through %q when -applied to a value of type string or []byte. -The alternate format %#q will use backquotes instead if possible. -(The %q format also applies to integers and runes, producing a -single-quoted rune constant.) -Also, %x works on strings, byte arrays and byte slices as well as -on integers, generating a long hexadecimal string, and with -a space in the format (% x) it puts spaces between the bytes. -

      -

      -Another handy format is %T, which prints the type of a value. -

      -
      -fmt.Printf("%T\n", timeZone)
      -
      -

      -prints -

      -
      -map[string]int
      -
      -

      -If you want to control the default format for a custom type, all that's required is to define -a method with the signature String() string on the type. -For our simple type T, that might look like this. -

      -
      -func (t *T) String() string {
      -    return fmt.Sprintf("%d/%g/%q", t.a, t.b, t.c)
      -}
      -fmt.Printf("%v\n", t)
      -
      -

      -to print in the format -

      -
      -7/-2.35/"abc\tdef"
      -
      -

      -(If you need to print values of type T as well as pointers to T, -the receiver for String must be of value type; this example used a pointer because -that's more efficient and idiomatic for struct types. -See the section below on pointers vs. value receivers for more information.) -

      - -

      -Our String method is able to call Sprintf because the -print routines are fully reentrant and can be wrapped this way. -There is one important detail to understand about this approach, -however: don't construct a String method by calling -Sprintf in a way that will recur into your String -method indefinitely. This can happen if the Sprintf -call attempts to print the receiver directly as a string, which in -turn will invoke the method again. It's a common and easy mistake -to make, as this example shows. -

      - -
      -type MyString string
      -
      -func (m MyString) String() string {
      -    return fmt.Sprintf("MyString=%s", m) // Error: will recur forever.
      -}
      -
      - -

      -It's also easy to fix: convert the argument to the basic string type, which does not have the -method. -

      - -
      -type MyString string
      -func (m MyString) String() string {
      -    return fmt.Sprintf("MyString=%s", string(m)) // OK: note conversion.
      -}
      -
      - -

      -In the initialization section we'll see another technique that avoids this recursion. -

      - -

      -Another printing technique is to pass a print routine's arguments directly to another such routine. -The signature of Printf uses the type ...interface{} -for its final argument to specify that an arbitrary number of parameters (of arbitrary type) -can appear after the format. -

      -
      -func Printf(format string, v ...interface{}) (n int, err error) {
      -
      -

      -Within the function Printf, v acts like a variable of type -[]interface{} but if it is passed to another variadic function, it acts like -a regular list of arguments. -Here is the implementation of the -function log.Println we used above. It passes its arguments directly to -fmt.Sprintln for the actual formatting. -

      -
      -// Println prints to the standard logger in the manner of fmt.Println.
      -func Println(v ...interface{}) {
      -    std.Output(2, fmt.Sprintln(v...))  // Output takes parameters (int, string)
      -}
      -
      -

      -We write ... after v in the nested call to Sprintln to tell the -compiler to treat v as a list of arguments; otherwise it would just pass -v as a single slice argument. -

      -

      -There's even more to printing than we've covered here. See the godoc documentation -for package fmt for the details. -

      -

      -By the way, a ... parameter can be of a specific type, for instance ...int -for a min function that chooses the least of a list of integers: -

      -
      -func Min(a ...int) int {
      -    min := int(^uint(0) >> 1)  // largest int
      -    for _, i := range a {
      -        if i < min {
      -            min = i
      -        }
      -    }
      -    return min
      -}
      -
      - -

      Append

      -

      -Now we have the missing piece we needed to explain the design of -the append built-in function. The signature of append -is different from our custom Append function above. -Schematically, it's like this: -

      -
      -func append(slice []T, elements ...T) []T
      -
      -

      -where T is a placeholder for any given type. You can't -actually write a function in Go where the type T -is determined by the caller. -That's why append is built in: it needs support from the -compiler. -

      -

      -What append does is append the elements to the end of -the slice and return the result. The result needs to be returned -because, as with our hand-written Append, the underlying -array may change. This simple example -

      -
      -x := []int{1,2,3}
      -x = append(x, 4, 5, 6)
      -fmt.Println(x)
      -
      -

      -prints [1 2 3 4 5 6]. So append works a -little like Printf, collecting an arbitrary number of -arguments. -

      -

      -But what if we wanted to do what our Append does and -append a slice to a slice? Easy: use ... at the call -site, just as we did in the call to Output above. This -snippet produces identical output to the one above. -

      -
      -x := []int{1,2,3}
      -y := []int{4,5,6}
      -x = append(x, y...)
      -fmt.Println(x)
      -
      -

      -Without that ..., it wouldn't compile because the types -would be wrong; y is not of type int. -

      - -

      Initialization

      - -

      -Although it doesn't look superficially very different from -initialization in C or C++, initialization in Go is more powerful. -Complex structures can be built during initialization and the ordering -issues among initialized objects, even among different packages, are handled -correctly. -

      - -

      Constants

      - -

      -Constants in Go are just that—constant. -They are created at compile time, even when defined as -locals in functions, -and can only be numbers, characters (runes), strings or booleans. -Because of the compile-time restriction, the expressions -that define them must be constant expressions, -evaluatable by the compiler. For instance, -1<<3 is a constant expression, while -math.Sin(math.Pi/4) is not because -the function call to math.Sin needs -to happen at run time. -

      - -

      -In Go, enumerated constants are created using the iota -enumerator. Since iota can be part of an expression and -expressions can be implicitly repeated, it is easy to build intricate -sets of values. -

      -{{code "/doc/progs/eff_bytesize.go" `/^type ByteSize/` `/^\)/`}} -

      -The ability to attach a method such as String to any -user-defined type makes it possible for arbitrary values to format themselves -automatically for printing. -Although you'll see it most often applied to structs, this technique is also useful for -scalar types such as floating-point types like ByteSize. -

      -{{code "/doc/progs/eff_bytesize.go" `/^func.*ByteSize.*String/` `/^}/`}} -

      -The expression YB prints as 1.00YB, -while ByteSize(1e13) prints as 9.09TB. -

      - -

      -The use here of Sprintf -to implement ByteSize's String method is safe -(avoids recurring indefinitely) not because of a conversion but -because it calls Sprintf with %f, -which is not a string format: Sprintf will only call -the String method when it wants a string, and %f -wants a floating-point value. -

      - -

      Variables

      - -

      -Variables can be initialized just like constants but the -initializer can be a general expression computed at run time. -

      -
      -var (
      -    home   = os.Getenv("HOME")
      -    user   = os.Getenv("USER")
      -    gopath = os.Getenv("GOPATH")
      -)
      -
      - -

      The init function

      - -

      -Finally, each source file can define its own niladic init function to -set up whatever state is required. (Actually each file can have multiple -init functions.) -And finally means finally: init is called after all the -variable declarations in the package have evaluated their initializers, -and those are evaluated only after all the imported packages have been -initialized. -

      -

      -Besides initializations that cannot be expressed as declarations, -a common use of init functions is to verify or repair -correctness of the program state before real execution begins. -

      - -
      -func init() {
      -    if user == "" {
      -        log.Fatal("$USER not set")
      -    }
      -    if home == "" {
      -        home = "/home/" + user
      -    }
      -    if gopath == "" {
      -        gopath = home + "/go"
      -    }
      -    // gopath may be overridden by --gopath flag on command line.
      -    flag.StringVar(&gopath, "gopath", gopath, "override default GOPATH")
      -}
      -
      - -

      Methods

      - -

      Pointers vs. Values

      -

      -As we saw with ByteSize, -methods can be defined for any named type (except a pointer or an interface); -the receiver does not have to be a struct. -

      -

      -In the discussion of slices above, we wrote an Append -function. We can define it as a method on slices instead. To do -this, we first declare a named type to which we can bind the method, and -then make the receiver for the method a value of that type. -

      -
      -type ByteSlice []byte
      -
      -func (slice ByteSlice) Append(data []byte) []byte {
      -    // Body exactly the same as the Append function defined above.
      -}
      -
      -

      -This still requires the method to return the updated slice. We can -eliminate that clumsiness by redefining the method to take a -pointer to a ByteSlice as its receiver, so the -method can overwrite the caller's slice. -

      -
      -func (p *ByteSlice) Append(data []byte) {
      -    slice := *p
      -    // Body as above, without the return.
      -    *p = slice
      -}
      -
      -

      -In fact, we can do even better. If we modify our function so it looks -like a standard Write method, like this, -

      -
      -func (p *ByteSlice) Write(data []byte) (n int, err error) {
      -    slice := *p
      -    // Again as above.
      -    *p = slice
      -    return len(data), nil
      -}
      -
      -

      -then the type *ByteSlice satisfies the standard interface -io.Writer, which is handy. For instance, we can -print into one. -

      -
      -    var b ByteSlice
      -    fmt.Fprintf(&b, "This hour has %d days\n", 7)
      -
      -

      -We pass the address of a ByteSlice -because only *ByteSlice satisfies io.Writer. -The rule about pointers vs. values for receivers is that value methods -can be invoked on pointers and values, but pointer methods can only be -invoked on pointers. -

      - -

      -This rule arises because pointer methods can modify the receiver; invoking -them on a value would cause the method to receive a copy of the value, so -any modifications would be discarded. -The language therefore disallows this mistake. -There is a handy exception, though. When the value is addressable, the -language takes care of the common case of invoking a pointer method on a -value by inserting the address operator automatically. -In our example, the variable b is addressable, so we can call -its Write method with just b.Write. The compiler -will rewrite that to (&b).Write for us. -

      - -

      -By the way, the idea of using Write on a slice of bytes -is central to the implementation of bytes.Buffer. -

      - -

      Interfaces and other types

      - -

      Interfaces

      -

      -Interfaces in Go provide a way to specify the behavior of an -object: if something can do this, then it can be used -here. We've seen a couple of simple examples already; -custom printers can be implemented by a String method -while Fprintf can generate output to anything -with a Write method. -Interfaces with only one or two methods are common in Go code, and are -usually given a name derived from the method, such as io.Writer -for something that implements Write. -

      -

      -A type can implement multiple interfaces. -For instance, a collection can be sorted -by the routines in package sort if it implements -sort.Interface, which contains Len(), -Less(i, j int) bool, and Swap(i, j int), -and it could also have a custom formatter. -In this contrived example Sequence satisfies both. -

      -{{code "/doc/progs/eff_sequence.go" `/^type/` "$"}} - -

      Conversions

      - -

      -The String method of Sequence is recreating the -work that Sprint already does for slices. -(It also has complexity O(N²), which is poor.) We can share the -effort (and also speed it up) if we convert the Sequence to a plain -[]int before calling Sprint. -

      -
      -func (s Sequence) String() string {
      -    s = s.Copy()
      -    sort.Sort(s)
      -    return fmt.Sprint([]int(s))
      -}
      -
      -

      -This method is another example of the conversion technique for calling -Sprintf safely from a String method. -Because the two types (Sequence and []int) -are the same if we ignore the type name, it's legal to convert between them. -The conversion doesn't create a new value, it just temporarily acts -as though the existing value has a new type. -(There are other legal conversions, such as from integer to floating point, that -do create a new value.) -

      -

      -It's an idiom in Go programs to convert the -type of an expression to access a different -set of methods. As an example, we could use the existing -type sort.IntSlice to reduce the entire example -to this: -

      -
      -type Sequence []int
      -
      -// Method for printing - sorts the elements before printing
      -func (s Sequence) String() string {
      -    s = s.Copy()
      -    sort.IntSlice(s).Sort()
      -    return fmt.Sprint([]int(s))
      -}
      -
      -

      -Now, instead of having Sequence implement multiple -interfaces (sorting and printing), we're using the ability of a data item to be -converted to multiple types (Sequence, sort.IntSlice -and []int), each of which does some part of the job. -That's more unusual in practice but can be effective. -

      - -

      Interface conversions and type assertions

      - -

      -Type switches are a form of conversion: they take an interface and, for -each case in the switch, in a sense convert it to the type of that case. -Here's a simplified version of how the code under fmt.Printf turns a value into -a string using a type switch. -If it's already a string, we want the actual string value held by the interface, while if it has a -String method we want the result of calling the method. -

      - -
      -type Stringer interface {
      -    String() string
      -}
      -
      -var value interface{} // Value provided by caller.
      -switch str := value.(type) {
      -case string:
      -    return str
      -case Stringer:
      -    return str.String()
      -}
      -
      - -

      -The first case finds a concrete value; the second converts the interface into another interface. -It's perfectly fine to mix types this way. -

      - -

      -What if there's only one type we care about? If we know the value holds a string -and we just want to extract it? -A one-case type switch would do, but so would a type assertion. -A type assertion takes an interface value and extracts from it a value of the specified explicit type. -The syntax borrows from the clause opening a type switch, but with an explicit -type rather than the type keyword: -

      - -
      -value.(typeName)
      -
      - -

      -and the result is a new value with the static type typeName. -That type must either be the concrete type held by the interface, or a second interface -type that the value can be converted to. -To extract the string we know is in the value, we could write: -

      - -
      -str := value.(string)
      -
      - -

      -But if it turns out that the value does not contain a string, the program will crash with a run-time error. -To guard against that, use the "comma, ok" idiom to test, safely, whether the value is a string: -

      - -
      -str, ok := value.(string)
      -if ok {
      -    fmt.Printf("string value is: %q\n", str)
      -} else {
      -    fmt.Printf("value is not a string\n")
      -}
      -
      - -

      -If the type assertion fails, str will still exist and be of type string, but it will have -the zero value, an empty string. -

      - -

      -As an illustration of the capability, here's an if-else -statement that's equivalent to the type switch that opened this section. -

      - -
      -if str, ok := value.(string); ok {
      -    return str
      -} else if str, ok := value.(Stringer); ok {
      -    return str.String()
      -}
      -
      - -

      Generality

      -

      -If a type exists only to implement an interface and will -never have exported methods beyond that interface, there is -no need to export the type itself. -Exporting just the interface makes it clear the value has no -interesting behavior beyond what is described in the -interface. -It also avoids the need to repeat the documentation -on every instance of a common method. -

      -

      -In such cases, the constructor should return an interface value -rather than the implementing type. -As an example, in the hash libraries -both crc32.NewIEEE and adler32.New -return the interface type hash.Hash32. -Substituting the CRC-32 algorithm for Adler-32 in a Go program -requires only changing the constructor call; -the rest of the code is unaffected by the change of algorithm. -

      -

      -A similar approach allows the streaming cipher algorithms -in the various crypto packages to be -separated from the block ciphers they chain together. -The Block interface -in the crypto/cipher package specifies the -behavior of a block cipher, which provides encryption -of a single block of data. -Then, by analogy with the bufio package, -cipher packages that implement this interface -can be used to construct streaming ciphers, represented -by the Stream interface, without -knowing the details of the block encryption. -

      -

      -The crypto/cipher interfaces look like this: -

      -
      -type Block interface {
      -    BlockSize() int
      -    Encrypt(dst, src []byte)
      -    Decrypt(dst, src []byte)
      -}
      -
      -type Stream interface {
      -    XORKeyStream(dst, src []byte)
      -}
      -
      - -

      -Here's the definition of the counter mode (CTR) stream, -which turns a block cipher into a streaming cipher; notice -that the block cipher's details are abstracted away: -

      - -
      -// NewCTR returns a Stream that encrypts/decrypts using the given Block in
      -// counter mode. The length of iv must be the same as the Block's block size.
      -func NewCTR(block Block, iv []byte) Stream
      -
      -

      -NewCTR applies not -just to one specific encryption algorithm and data source but to any -implementation of the Block interface and any -Stream. Because they return -interface values, replacing CTR -encryption with other encryption modes is a localized change. The constructor -calls must be edited, but because the surrounding code must treat the result only -as a Stream, it won't notice the difference. -

      - -

      Interfaces and methods

      -

      -Since almost anything can have methods attached, almost anything can -satisfy an interface. One illustrative example is in the http -package, which defines the Handler interface. Any object -that implements Handler can serve HTTP requests. -

      -
      -type Handler interface {
      -    ServeHTTP(ResponseWriter, *Request)
      -}
      -
      -

      -ResponseWriter is itself an interface that provides access -to the methods needed to return the response to the client. -Those methods include the standard Write method, so an -http.ResponseWriter can be used wherever an io.Writer -can be used. -Request is a struct containing a parsed representation -of the request from the client. -

      -

      -For brevity, let's ignore POSTs and assume HTTP requests are always -GETs; that simplification does not affect the way the handlers are set up. -Here's a trivial implementation of a handler to count the number of times -the page is visited. -

      -
      -// Simple counter server.
      -type Counter struct {
      -    n int
      -}
      -
      -func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
      -    ctr.n++
      -    fmt.Fprintf(w, "counter = %d\n", ctr.n)
      -}
      -
      -

      -(Keeping with our theme, note how Fprintf can print to an -http.ResponseWriter.) -In a real server, access to ctr.n would need protection from -concurrent access. -See the sync and atomic packages for suggestions. -

      -

      -For reference, here's how to attach such a server to a node on the URL tree. -

      -
      -import "net/http"
      -...
      -ctr := new(Counter)
      -http.Handle("/counter", ctr)
      -
      -

      -But why make Counter a struct? An integer is all that's needed. -(The receiver needs to be a pointer so the increment is visible to the caller.) -

      -
      -// Simpler counter server.
      -type Counter int
      -
      -func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
      -    *ctr++
      -    fmt.Fprintf(w, "counter = %d\n", *ctr)
      -}
      -
      -

      -What if your program has some internal state that needs to be notified that a page -has been visited? Tie a channel to the web page. -

      -
      -// A channel that sends a notification on each visit.
      -// (Probably want the channel to be buffered.)
      -type Chan chan *http.Request
      -
      -func (ch Chan) ServeHTTP(w http.ResponseWriter, req *http.Request) {
      -    ch <- req
      -    fmt.Fprint(w, "notification sent")
      -}
      -
      -

      -Finally, let's say we wanted to present on /args the arguments -used when invoking the server binary. -It's easy to write a function to print the arguments. -

      -
      -func ArgServer() {
      -    fmt.Println(os.Args)
      -}
      -
      -

      -How do we turn that into an HTTP server? We could make ArgServer -a method of some type whose value we ignore, but there's a cleaner way. -Since we can define a method for any type except pointers and interfaces, -we can write a method for a function. -The http package contains this code: -

      -
      -// The HandlerFunc type is an adapter to allow the use of
      -// ordinary functions as HTTP handlers.  If f is a function
      -// with the appropriate signature, HandlerFunc(f) is a
      -// Handler object that calls f.
      -type HandlerFunc func(ResponseWriter, *Request)
      -
      -// ServeHTTP calls f(w, req).
      -func (f HandlerFunc) ServeHTTP(w ResponseWriter, req *Request) {
      -    f(w, req)
      -}
      -
      -

      -HandlerFunc is a type with a method, ServeHTTP, -so values of that type can serve HTTP requests. Look at the implementation -of the method: the receiver is a function, f, and the method -calls f. That may seem odd but it's not that different from, say, -the receiver being a channel and the method sending on the channel. -

      -

      -To make ArgServer into an HTTP server, we first modify it -to have the right signature. -

      -
      -// Argument server.
      -func ArgServer(w http.ResponseWriter, req *http.Request) {
      -    fmt.Fprintln(w, os.Args)
      -}
      -
      -

      -ArgServer now has same signature as HandlerFunc, -so it can be converted to that type to access its methods, -just as we converted Sequence to IntSlice -to access IntSlice.Sort. -The code to set it up is concise: -

      -
      -http.Handle("/args", http.HandlerFunc(ArgServer))
      -
      -

      -When someone visits the page /args, -the handler installed at that page has value ArgServer -and type HandlerFunc. -The HTTP server will invoke the method ServeHTTP -of that type, with ArgServer as the receiver, which will in turn call -ArgServer (via the invocation f(w, req) -inside HandlerFunc.ServeHTTP). -The arguments will then be displayed. -

      -

      -In this section we have made an HTTP server from a struct, an integer, -a channel, and a function, all because interfaces are just sets of -methods, which can be defined for (almost) any type. -

      - -

      The blank identifier

      - -

      -We've mentioned the blank identifier a couple of times now, in the context of -for range loops -and maps. -The blank identifier can be assigned or declared with any value of any type, with the -value discarded harmlessly. -It's a bit like writing to the Unix /dev/null file: -it represents a write-only value -to be used as a place-holder -where a variable is needed but the actual value is irrelevant. -It has uses beyond those we've seen already. -

      - -

      The blank identifier in multiple assignment

      - -

      -The use of a blank identifier in a for range loop is a -special case of a general situation: multiple assignment. -

      - -

      -If an assignment requires multiple values on the left side, -but one of the values will not be used by the program, -a blank identifier on the left-hand-side of -the assignment avoids the need -to create a dummy variable and makes it clear that the -value is to be discarded. -For instance, when calling a function that returns -a value and an error, but only the error is important, -use the blank identifier to discard the irrelevant value. -

      - -
      -if _, err := os.Stat(path); os.IsNotExist(err) {
      -	fmt.Printf("%s does not exist\n", path)
      -}
      -
      - -

      -Occasionally you'll see code that discards the error value in order -to ignore the error; this is terrible practice. Always check error returns; -they're provided for a reason. -

      - -
      -// Bad! This code will crash if path does not exist.
      -fi, _ := os.Stat(path)
      -if fi.IsDir() {
      -    fmt.Printf("%s is a directory\n", path)
      -}
      -
      - -

      Unused imports and variables

      - -

      -It is an error to import a package or to declare a variable without using it. -Unused imports bloat the program and slow compilation, -while a variable that is initialized but not used is at least -a wasted computation and perhaps indicative of a -larger bug. -When a program is under active development, however, -unused imports and variables often arise and it can -be annoying to delete them just to have the compilation proceed, -only to have them be needed again later. -The blank identifier provides a workaround. -

      -

      -This half-written program has two unused imports -(fmt and io) -and an unused variable (fd), -so it will not compile, but it would be nice to see if the -code so far is correct. -

      -{{code "/doc/progs/eff_unused1.go" `/package/` `$`}} -

      -To silence complaints about the unused imports, use a -blank identifier to refer to a symbol from the imported package. -Similarly, assigning the unused variable fd -to the blank identifier will silence the unused variable error. -This version of the program does compile. -

      -{{code "/doc/progs/eff_unused2.go" `/package/` `$`}} - -

      -By convention, the global declarations to silence import errors -should come right after the imports and be commented, -both to make them easy to find and as a reminder to clean things up later. -

      - -

      Import for side effect

      - -

      -An unused import like fmt or io in the -previous example should eventually be used or removed: -blank assignments identify code as a work in progress. -But sometimes it is useful to import a package only for its -side effects, without any explicit use. -For example, during its init function, -the net/http/pprof -package registers HTTP handlers that provide -debugging information. It has an exported API, but -most clients need only the handler registration and -access the data through a web page. -To import the package only for its side effects, rename the package -to the blank identifier: -

      -
      -import _ "net/http/pprof"
      -
      -

      -This form of import makes clear that the package is being -imported for its side effects, because there is no other possible -use of the package: in this file, it doesn't have a name. -(If it did, and we didn't use that name, the compiler would reject the program.) -

      - -

      Interface checks

      - -

      -As we saw in the discussion of interfaces above, -a type need not declare explicitly that it implements an interface. -Instead, a type implements the interface just by implementing the interface's methods. -In practice, most interface conversions are static and therefore checked at compile time. -For example, passing an *os.File to a function -expecting an io.Reader will not compile unless -*os.File implements the io.Reader interface. -

      - -

      -Some interface checks do happen at run-time, though. -One instance is in the encoding/json -package, which defines a Marshaler -interface. When the JSON encoder receives a value that implements that interface, -the encoder invokes the value's marshaling method to convert it to JSON -instead of doing the standard conversion. -The encoder checks this property at run time with a type assertion like: -

      - -
      -m, ok := val.(json.Marshaler)
      -
      - -

      -If it's necessary only to ask whether a type implements an interface, without -actually using the interface itself, perhaps as part of an error check, use the blank -identifier to ignore the type-asserted value: -

      - -
      -if _, ok := val.(json.Marshaler); ok {
      -    fmt.Printf("value %v of type %T implements json.Marshaler\n", val, val)
      -}
      -
      - -

      -One place this situation arises is when it is necessary to guarantee within the package implementing the type that -it actually satisfies the interface. -If a type—for example, -json.RawMessage—needs -a custom JSON representation, it should implement -json.Marshaler, but there are no static conversions that would -cause the compiler to verify this automatically. -If the type inadvertently fails to satisfy the interface, the JSON encoder will still work, -but will not use the custom implementation. -To guarantee that the implementation is correct, -a global declaration using the blank identifier can be used in the package: -

      -
      -var _ json.Marshaler = (*RawMessage)(nil)
      -
      -

      -In this declaration, the assignment involving a conversion of a -*RawMessage to a Marshaler -requires that *RawMessage implements Marshaler, -and that property will be checked at compile time. -Should the json.Marshaler interface change, this package -will no longer compile and we will be on notice that it needs to be updated. -

      - -

      -The appearance of the blank identifier in this construct indicates that -the declaration exists only for the type checking, -not to create a variable. -Don't do this for every type that satisfies an interface, though. -By convention, such declarations are only used -when there are no static conversions already present in the code, -which is a rare event. -

      - - -

      Embedding

      - -

      -Go does not provide the typical, type-driven notion of subclassing, -but it does have the ability to “borrow” pieces of an -implementation by embedding types within a struct or -interface. -

      -

      -Interface embedding is very simple. -We've mentioned the io.Reader and io.Writer interfaces before; -here are their definitions. -

      -
      -type Reader interface {
      -    Read(p []byte) (n int, err error)
      -}
      -
      -type Writer interface {
      -    Write(p []byte) (n int, err error)
      -}
      -
      -

      -The io package also exports several other interfaces -that specify objects that can implement several such methods. -For instance, there is io.ReadWriter, an interface -containing both Read and Write. -We could specify io.ReadWriter by listing the -two methods explicitly, but it's easier and more evocative -to embed the two interfaces to form the new one, like this: -

      -
      -// ReadWriter is the interface that combines the Reader and Writer interfaces.
      -type ReadWriter interface {
      -    Reader
      -    Writer
      -}
      -
      -

      -This says just what it looks like: A ReadWriter can do -what a Reader does and what a Writer -does; it is a union of the embedded interfaces. -Only interfaces can be embedded within interfaces. -

      -

      -The same basic idea applies to structs, but with more far-reaching -implications. The bufio package has two struct types, -bufio.Reader and bufio.Writer, each of -which of course implements the analogous interfaces from package -io. -And bufio also implements a buffered reader/writer, -which it does by combining a reader and a writer into one struct -using embedding: it lists the types within the struct -but does not give them field names. -

      -
      -// ReadWriter stores pointers to a Reader and a Writer.
      -// It implements io.ReadWriter.
      -type ReadWriter struct {
      -    *Reader  // *bufio.Reader
      -    *Writer  // *bufio.Writer
      -}
      -
      -

      -The embedded elements are pointers to structs and of course -must be initialized to point to valid structs before they -can be used. -The ReadWriter struct could be written as -

      -
      -type ReadWriter struct {
      -    reader *Reader
      -    writer *Writer
      -}
      -
      -

      -but then to promote the methods of the fields and to -satisfy the io interfaces, we would also need -to provide forwarding methods, like this: -

      -
      -func (rw *ReadWriter) Read(p []byte) (n int, err error) {
      -    return rw.reader.Read(p)
      -}
      -
      -

      -By embedding the structs directly, we avoid this bookkeeping. -The methods of embedded types come along for free, which means that bufio.ReadWriter -not only has the methods of bufio.Reader and bufio.Writer, -it also satisfies all three interfaces: -io.Reader, -io.Writer, and -io.ReadWriter. -

      -

      -There's an important way in which embedding differs from subclassing. When we embed a type, -the methods of that type become methods of the outer type, -but when they are invoked the receiver of the method is the inner type, not the outer one. -In our example, when the Read method of a bufio.ReadWriter is -invoked, it has exactly the same effect as the forwarding method written out above; -the receiver is the reader field of the ReadWriter, not the -ReadWriter itself. -

      -

      -Embedding can also be a simple convenience. -This example shows an embedded field alongside a regular, named field. -

      -
      -type Job struct {
      -    Command string
      -    *log.Logger
      -}
      -
      -

      -The Job type now has the Print, Printf, Println -and other -methods of *log.Logger. We could have given the Logger -a field name, of course, but it's not necessary to do so. And now, once -initialized, we can -log to the Job: -

      -
      -job.Println("starting now...")
      -
      -

      -The Logger is a regular field of the Job struct, -so we can initialize it in the usual way inside the constructor for Job, like this, -

      -
      -func NewJob(command string, logger *log.Logger) *Job {
      -    return &Job{command, logger}
      -}
      -
      -

      -or with a composite literal, -

      -
      -job := &Job{command, log.New(os.Stderr, "Job: ", log.Ldate)}
      -
      -

      -If we need to refer to an embedded field directly, the type name of the field, -ignoring the package qualifier, serves as a field name, as it did -in the Read method of our ReadWriter struct. -Here, if we needed to access the -*log.Logger of a Job variable job, -we would write job.Logger, -which would be useful if we wanted to refine the methods of Logger. -

      -
      -func (job *Job) Printf(format string, args ...interface{}) {
      -    job.Logger.Printf("%q: %s", job.Command, fmt.Sprintf(format, args...))
      -}
      -
      -

      -Embedding types introduces the problem of name conflicts but the rules to resolve -them are simple. -First, a field or method X hides any other item X in a more deeply -nested part of the type. -If log.Logger contained a field or method called Command, the Command field -of Job would dominate it. -

      -

      -Second, if the same name appears at the same nesting level, it is usually an error; -it would be erroneous to embed log.Logger if the Job struct -contained another field or method called Logger. -However, if the duplicate name is never mentioned in the program outside the type definition, it is OK. -This qualification provides some protection against changes made to types embedded from outside; there -is no problem if a field is added that conflicts with another field in another subtype if neither field -is ever used. -

      - - -

      Concurrency

      - -

      Share by communicating

      - -

      -Concurrent programming is a large topic and there is space only for some -Go-specific highlights here. -

      -

      -Concurrent programming in many environments is made difficult by the -subtleties required to implement correct access to shared variables. Go encourages -a different approach in which shared values are passed around on channels -and, in fact, never actively shared by separate threads of execution. -Only one goroutine has access to the value at any given time. -Data races cannot occur, by design. -To encourage this way of thinking we have reduced it to a slogan: -

      -
      -Do not communicate by sharing memory; -instead, share memory by communicating. -
      -

      -This approach can be taken too far. Reference counts may be best done -by putting a mutex around an integer variable, for instance. But as a -high-level approach, using channels to control access makes it easier -to write clear, correct programs. -

      -

      -One way to think about this model is to consider a typical single-threaded -program running on one CPU. It has no need for synchronization primitives. -Now run another such instance; it too needs no synchronization. Now let those -two communicate; if the communication is the synchronizer, there's still no need -for other synchronization. Unix pipelines, for example, fit this model -perfectly. Although Go's approach to concurrency originates in Hoare's -Communicating Sequential Processes (CSP), -it can also be seen as a type-safe generalization of Unix pipes. -

      - -

      Goroutines

      - -

      -They're called goroutines because the existing -terms—threads, coroutines, processes, and so on—convey -inaccurate connotations. A goroutine has a simple model: it is a -function executing concurrently with other goroutines in the same -address space. It is lightweight, costing little more than the -allocation of stack space. -And the stacks start small, so they are cheap, and grow -by allocating (and freeing) heap storage as required. -

      -

      -Goroutines are multiplexed onto multiple OS threads so if one should -block, such as while waiting for I/O, others continue to run. Their -design hides many of the complexities of thread creation and -management. -

      -

      -Prefix a function or method call with the go -keyword to run the call in a new goroutine. -When the call completes, the goroutine -exits, silently. (The effect is similar to the Unix shell's -& notation for running a command in the -background.) -

      -
      -go list.Sort()  // run list.Sort concurrently; don't wait for it.
      -
      -

      -A function literal can be handy in a goroutine invocation. -

      -
      -func Announce(message string, delay time.Duration) {
      -    go func() {
      -        time.Sleep(delay)
      -        fmt.Println(message)
      -    }()  // Note the parentheses - must call the function.
      -}
      -
      -

      -In Go, function literals are closures: the implementation makes -sure the variables referred to by the function survive as long as they are active. -

      -

      -These examples aren't too practical because the functions have no way of signaling -completion. For that, we need channels. -

      - -

      Channels

      - -

      -Like maps, channels are allocated with make, and -the resulting value acts as a reference to an underlying data structure. -If an optional integer parameter is provided, it sets the buffer size for the channel. -The default is zero, for an unbuffered or synchronous channel. -

      -
      -ci := make(chan int)            // unbuffered channel of integers
      -cj := make(chan int, 0)         // unbuffered channel of integers
      -cs := make(chan *os.File, 100)  // buffered channel of pointers to Files
      -
      -

      -Unbuffered channels combine communication—the exchange of a value—with -synchronization—guaranteeing that two calculations (goroutines) are in -a known state. -

      -

      -There are lots of nice idioms using channels. Here's one to get us started. -In the previous section we launched a sort in the background. A channel -can allow the launching goroutine to wait for the sort to complete. -

      -
      -c := make(chan int)  // Allocate a channel.
      -// Start the sort in a goroutine; when it completes, signal on the channel.
      -go func() {
      -    list.Sort()
      -    c <- 1  // Send a signal; value does not matter.
      -}()
      -doSomethingForAWhile()
      -<-c   // Wait for sort to finish; discard sent value.
      -
      -

      -Receivers always block until there is data to receive. -If the channel is unbuffered, the sender blocks until the receiver has -received the value. -If the channel has a buffer, the sender blocks only until the -value has been copied to the buffer; if the buffer is full, this -means waiting until some receiver has retrieved a value. -

      -

      -A buffered channel can be used like a semaphore, for instance to -limit throughput. In this example, incoming requests are passed -to handle, which sends a value into the channel, processes -the request, and then receives a value from the channel -to ready the “semaphore” for the next consumer. -The capacity of the channel buffer limits the number of -simultaneous calls to process. -

      -
      -var sem = make(chan int, MaxOutstanding)
      -
      -func handle(r *Request) {
      -    sem <- 1    // Wait for active queue to drain.
      -    process(r)  // May take a long time.
      -    <-sem       // Done; enable next request to run.
      -}
      -
      -func Serve(queue chan *Request) {
      -    for {
      -        req := <-queue
      -        go handle(req)  // Don't wait for handle to finish.
      -    }
      -}
      -
      - -

      -Once MaxOutstanding handlers are executing process, -any more will block trying to send into the filled channel buffer, -until one of the existing handlers finishes and receives from the buffer. -

      - -

      -This design has a problem, though: Serve -creates a new goroutine for -every incoming request, even though only MaxOutstanding -of them can run at any moment. -As a result, the program can consume unlimited resources if the requests come in too fast. -We can address that deficiency by changing Serve to -gate the creation of the goroutines. -Here's an obvious solution, but beware it has a bug we'll fix subsequently: -

      - -
      -func Serve(queue chan *Request) {
      -    for req := range queue {
      -        sem <- 1
      -        go func() {
      -            process(req) // Buggy; see explanation below.
      -            <-sem
      -        }()
      -    }
      -}
      - -

      -The bug is that in a Go for loop, the loop variable -is reused for each iteration, so the req -variable is shared across all goroutines. -That's not what we want. -We need to make sure that req is unique for each goroutine. -Here's one way to do that, passing the value of req as an argument -to the closure in the goroutine: -

      - -
      -func Serve(queue chan *Request) {
      -    for req := range queue {
      -        sem <- 1
      -        go func(req *Request) {
      -            process(req)
      -            <-sem
      -        }(req)
      -    }
      -}
      - -

      -Compare this version with the previous to see the difference in how -the closure is declared and run. -Another solution is just to create a new variable with the same -name, as in this example: -

      - -
      -func Serve(queue chan *Request) {
      -    for req := range queue {
      -        req := req // Create new instance of req for the goroutine.
      -        sem <- 1
      -        go func() {
      -            process(req)
      -            <-sem
      -        }()
      -    }
      -}
      - -

      -It may seem odd to write -

      - -
      -req := req
      -
      - -

      -but it's legal and idiomatic in Go to do this. -You get a fresh version of the variable with the same name, deliberately -shadowing the loop variable locally but unique to each goroutine. -

      - -

      -Going back to the general problem of writing the server, -another approach that manages resources well is to start a fixed -number of handle goroutines all reading from the request -channel. -The number of goroutines limits the number of simultaneous -calls to process. -This Serve function also accepts a channel on which -it will be told to exit; after launching the goroutines it blocks -receiving from that channel. -

      - -
      -func handle(queue chan *Request) {
      -    for r := range queue {
      -        process(r)
      -    }
      -}
      -
      -func Serve(clientRequests chan *Request, quit chan bool) {
      -    // Start handlers
      -    for i := 0; i < MaxOutstanding; i++ {
      -        go handle(clientRequests)
      -    }
      -    <-quit  // Wait to be told to exit.
      -}
      -
      - -

      Channels of channels

      -

      -One of the most important properties of Go is that -a channel is a first-class value that can be allocated and passed -around like any other. A common use of this property is -to implement safe, parallel demultiplexing. -

      -

      -In the example in the previous section, handle was -an idealized handler for a request but we didn't define the -type it was handling. If that type includes a channel on which -to reply, each client can provide its own path for the answer. -Here's a schematic definition of type Request. -

      -
      -type Request struct {
      -    args        []int
      -    f           func([]int) int
      -    resultChan  chan int
      -}
      -
      -

      -The client provides a function and its arguments, as well as -a channel inside the request object on which to receive the answer. -

      -
      -func sum(a []int) (s int) {
      -    for _, v := range a {
      -        s += v
      -    }
      -    return
      -}
      -
      -request := &Request{[]int{3, 4, 5}, sum, make(chan int)}
      -// Send request
      -clientRequests <- request
      -// Wait for response.
      -fmt.Printf("answer: %d\n", <-request.resultChan)
      -
      -

      -On the server side, the handler function is the only thing that changes. -

      -
      -func handle(queue chan *Request) {
      -    for req := range queue {
      -        req.resultChan <- req.f(req.args)
      -    }
      -}
      -
      -

      -There's clearly a lot more to do to make it realistic, but this -code is a framework for a rate-limited, parallel, non-blocking RPC -system, and there's not a mutex in sight. -

      - -

      Parallelization

      -

      -Another application of these ideas is to parallelize a calculation -across multiple CPU cores. If the calculation can be broken into -separate pieces that can execute independently, it can be parallelized, -with a channel to signal when each piece completes. -

      -

      -Let's say we have an expensive operation to perform on a vector of items, -and that the value of the operation on each item is independent, -as in this idealized example. -

      -
      -type Vector []float64
      -
      -// Apply the operation to v[i], v[i+1] ... up to v[n-1].
      -func (v Vector) DoSome(i, n int, u Vector, c chan int) {
      -    for ; i < n; i++ {
      -        v[i] += u.Op(v[i])
      -    }
      -    c <- 1    // signal that this piece is done
      -}
      -
      -

      -We launch the pieces independently in a loop, one per CPU. -They can complete in any order but it doesn't matter; we just -count the completion signals by draining the channel after -launching all the goroutines. -

      -
      -const numCPU = 4 // number of CPU cores
      -
      -func (v Vector) DoAll(u Vector) {
      -    c := make(chan int, numCPU)  // Buffering optional but sensible.
      -    for i := 0; i < numCPU; i++ {
      -        go v.DoSome(i*len(v)/numCPU, (i+1)*len(v)/numCPU, u, c)
      -    }
      -    // Drain the channel.
      -    for i := 0; i < numCPU; i++ {
      -        <-c    // wait for one task to complete
      -    }
      -    // All done.
      -}
      -
      -

      -Rather than create a constant value for numCPU, we can ask the runtime what -value is appropriate. -The function runtime.NumCPU -returns the number of hardware CPU cores in the machine, so we could write -

      -
      -var numCPU = runtime.NumCPU()
      -
      -

      -There is also a function -runtime.GOMAXPROCS, -which reports (or sets) -the user-specified number of cores that a Go program can have running -simultaneously. -It defaults to the value of runtime.NumCPU but can be -overridden by setting the similarly named shell environment variable -or by calling the function with a positive number. Calling it with -zero just queries the value. -Therefore if we want to honor the user's resource request, we should write -

      -
      -var numCPU = runtime.GOMAXPROCS(0)
      -
      -

      -Be sure not to confuse the ideas of concurrency—structuring a program -as independently executing components—and parallelism—executing -calculations in parallel for efficiency on multiple CPUs. -Although the concurrency features of Go can make some problems easy -to structure as parallel computations, Go is a concurrent language, -not a parallel one, and not all parallelization problems fit Go's model. -For a discussion of the distinction, see the talk cited in -this -blog post. - -

      A leaky buffer

      - -

      -The tools of concurrent programming can even make non-concurrent -ideas easier to express. Here's an example abstracted from an RPC -package. The client goroutine loops receiving data from some source, -perhaps a network. To avoid allocating and freeing buffers, it keeps -a free list, and uses a buffered channel to represent it. If the -channel is empty, a new buffer gets allocated. -Once the message buffer is ready, it's sent to the server on -serverChan. -

      -
      -var freeList = make(chan *Buffer, 100)
      -var serverChan = make(chan *Buffer)
      -
      -func client() {
      -    for {
      -        var b *Buffer
      -        // Grab a buffer if available; allocate if not.
      -        select {
      -        case b = <-freeList:
      -            // Got one; nothing more to do.
      -        default:
      -            // None free, so allocate a new one.
      -            b = new(Buffer)
      -        }
      -        load(b)              // Read next message from the net.
      -        serverChan <- b      // Send to server.
      -    }
      -}
      -
      -

      -The server loop receives each message from the client, processes it, -and returns the buffer to the free list. -

      -
      -func server() {
      -    for {
      -        b := <-serverChan    // Wait for work.
      -        process(b)
      -        // Reuse buffer if there's room.
      -        select {
      -        case freeList <- b:
      -            // Buffer on free list; nothing more to do.
      -        default:
      -            // Free list full, just carry on.
      -        }
      -    }
      -}
      -
      -

      -The client attempts to retrieve a buffer from freeList; -if none is available, it allocates a fresh one. -The server's send to freeList puts b back -on the free list unless the list is full, in which case the -buffer is dropped on the floor to be reclaimed by -the garbage collector. -(The default clauses in the select -statements execute when no other case is ready, -meaning that the selects never block.) -This implementation builds a leaky bucket free list -in just a few lines, relying on the buffered channel and -the garbage collector for bookkeeping. -

      - -

      Errors

      - -

      -Library routines must often return some sort of error indication to -the caller. -As mentioned earlier, Go's multivalue return makes it -easy to return a detailed error description alongside the normal -return value. -It is good style to use this feature to provide detailed error information. -For example, as we'll see, os.Open doesn't -just return a nil pointer on failure, it also returns an -error value that describes what went wrong. -

      - -

      -By convention, errors have type error, -a simple built-in interface. -

      -
      -type error interface {
      -    Error() string
      -}
      -
      -

      -A library writer is free to implement this interface with a -richer model under the covers, making it possible not only -to see the error but also to provide some context. -As mentioned, alongside the usual *os.File -return value, os.Open also returns an -error value. -If the file is opened successfully, the error will be nil, -but when there is a problem, it will hold an -os.PathError: -

      -
      -// PathError records an error and the operation and
      -// file path that caused it.
      -type PathError struct {
      -    Op string    // "open", "unlink", etc.
      -    Path string  // The associated file.
      -    Err error    // Returned by the system call.
      -}
      -
      -func (e *PathError) Error() string {
      -    return e.Op + " " + e.Path + ": " + e.Err.Error()
      -}
      -
      -

      -PathError's Error generates -a string like this: -

      -
      -open /etc/passwx: no such file or directory
      -
      -

      -Such an error, which includes the problematic file name, the -operation, and the operating system error it triggered, is useful even -if printed far from the call that caused it; -it is much more informative than the plain -"no such file or directory". -

      - -

      -When feasible, error strings should identify their origin, such as by having -a prefix naming the operation or package that generated the error. For example, in package -image, the string representation for a decoding error due to an -unknown format is "image: unknown format". -

      - -

      -Callers that care about the precise error details can -use a type switch or a type assertion to look for specific -errors and extract details. For PathErrors -this might include examining the internal Err -field for recoverable failures. -

      - -
      -for try := 0; try < 2; try++ {
      -    file, err = os.Create(filename)
      -    if err == nil {
      -        return
      -    }
      -    if e, ok := err.(*os.PathError); ok && e.Err == syscall.ENOSPC {
      -        deleteTempFiles()  // Recover some space.
      -        continue
      -    }
      -    return
      -}
      -
      - -

      -The second if statement here is another type assertion. -If it fails, ok will be false, and e -will be nil. -If it succeeds, ok will be true, which means the -error was of type *os.PathError, and then so is e, -which we can examine for more information about the error. -

      - -

      Panic

      - -

      -The usual way to report an error to a caller is to return an -error as an extra return value. The canonical -Read method is a well-known instance; it returns a byte -count and an error. But what if the error is -unrecoverable? Sometimes the program simply cannot continue. -

      - -

      -For this purpose, there is a built-in function panic -that in effect creates a run-time error that will stop the program -(but see the next section). The function takes a single argument -of arbitrary type—often a string—to be printed as the -program dies. It's also a way to indicate that something impossible has -happened, such as exiting an infinite loop. -

      - - -
      -// A toy implementation of cube root using Newton's method.
      -func CubeRoot(x float64) float64 {
      -    z := x/3   // Arbitrary initial value
      -    for i := 0; i < 1e6; i++ {
      -        prevz := z
      -        z -= (z*z*z-x) / (3*z*z)
      -        if veryClose(z, prevz) {
      -            return z
      -        }
      -    }
      -    // A million iterations has not converged; something is wrong.
      -    panic(fmt.Sprintf("CubeRoot(%g) did not converge", x))
      -}
      -
      - -

      -This is only an example but real library functions should -avoid panic. If the problem can be masked or worked -around, it's always better to let things continue to run rather -than taking down the whole program. One possible counterexample -is during initialization: if the library truly cannot set itself up, -it might be reasonable to panic, so to speak. -

      - -
      -var user = os.Getenv("USER")
      -
      -func init() {
      -    if user == "" {
      -        panic("no value for $USER")
      -    }
      -}
      -
      - -

      Recover

      - -

      -When panic is called, including implicitly for run-time -errors such as indexing a slice out of bounds or failing a type -assertion, it immediately stops execution of the current function -and begins unwinding the stack of the goroutine, running any deferred -functions along the way. If that unwinding reaches the top of the -goroutine's stack, the program dies. However, it is possible to -use the built-in function recover to regain control -of the goroutine and resume normal execution. -

      - -

      -A call to recover stops the unwinding and returns the -argument passed to panic. Because the only code that -runs while unwinding is inside deferred functions, recover -is only useful inside deferred functions. -

      - -

      -One application of recover is to shut down a failing goroutine -inside a server without killing the other executing goroutines. -

      - -
      -func server(workChan <-chan *Work) {
      -    for work := range workChan {
      -        go safelyDo(work)
      -    }
      -}
      -
      -func safelyDo(work *Work) {
      -    defer func() {
      -        if err := recover(); err != nil {
      -            log.Println("work failed:", err)
      -        }
      -    }()
      -    do(work)
      -}
      -
      - -

      -In this example, if do(work) panics, the result will be -logged and the goroutine will exit cleanly without disturbing the -others. There's no need to do anything else in the deferred closure; -calling recover handles the condition completely. -

      - -

      -Because recover always returns nil unless called directly -from a deferred function, deferred code can call library routines that themselves -use panic and recover without failing. As an example, -the deferred function in safelyDo might call a logging function before -calling recover, and that logging code would run unaffected -by the panicking state. -

      - -

      -With our recovery pattern in place, the do -function (and anything it calls) can get out of any bad situation -cleanly by calling panic. We can use that idea to -simplify error handling in complex software. Let's look at an -idealized version of a regexp package, which reports -parsing errors by calling panic with a local -error type. Here's the definition of Error, -an error method, and the Compile function. -

      - -
      -// Error is the type of a parse error; it satisfies the error interface.
      -type Error string
      -func (e Error) Error() string {
      -    return string(e)
      -}
      -
      -// error is a method of *Regexp that reports parsing errors by
      -// panicking with an Error.
      -func (regexp *Regexp) error(err string) {
      -    panic(Error(err))
      -}
      -
      -// Compile returns a parsed representation of the regular expression.
      -func Compile(str string) (regexp *Regexp, err error) {
      -    regexp = new(Regexp)
      -    // doParse will panic if there is a parse error.
      -    defer func() {
      -        if e := recover(); e != nil {
      -            regexp = nil    // Clear return value.
      -            err = e.(Error) // Will re-panic if not a parse error.
      -        }
      -    }()
      -    return regexp.doParse(str), nil
      -}
      -
      - -

      -If doParse panics, the recovery block will set the -return value to nil—deferred functions can modify -named return values. It will then check, in the assignment -to err, that the problem was a parse error by asserting -that it has the local type Error. -If it does not, the type assertion will fail, causing a run-time error -that continues the stack unwinding as though nothing had interrupted -it. -This check means that if something unexpected happens, such -as an index out of bounds, the code will fail even though we -are using panic and recover to handle -parse errors. -

      - -

      -With error handling in place, the error method (because it's a -method bound to a type, it's fine, even natural, for it to have the same name -as the builtin error type) -makes it easy to report parse errors without worrying about unwinding -the parse stack by hand: -

      - -
      -if pos == 0 {
      -    re.error("'*' illegal at start of expression")
      -}
      -
      - -

      -Useful though this pattern is, it should be used only within a package. -Parse turns its internal panic calls into -error values; it does not expose panics -to its client. That is a good rule to follow. -

      - -

      -By the way, this re-panic idiom changes the panic value if an actual -error occurs. However, both the original and new failures will be -presented in the crash report, so the root cause of the problem will -still be visible. Thus this simple re-panic approach is usually -sufficient—it's a crash after all—but if you want to -display only the original value, you can write a little more code to -filter unexpected problems and re-panic with the original error. -That's left as an exercise for the reader. -

      - - -

      A web server

      - -

      -Let's finish with a complete Go program, a web server. -This one is actually a kind of web re-server. -Google provides a service at chart.apis.google.com -that does automatic formatting of data into charts and graphs. -It's hard to use interactively, though, -because you need to put the data into the URL as a query. -The program here provides a nicer interface to one form of data: given a short piece of text, -it calls on the chart server to produce a QR code, a matrix of boxes that encode the -text. -That image can be grabbed with your cell phone's camera and interpreted as, -for instance, a URL, saving you typing the URL into the phone's tiny keyboard. -

      -

      -Here's the complete program. -An explanation follows. -

      -{{code "/doc/progs/eff_qr.go" `/package/` `$`}} -

      -The pieces up to main should be easy to follow. -The one flag sets a default HTTP port for our server. The template -variable templ is where the fun happens. It builds an HTML template -that will be executed by the server to display the page; more about -that in a moment. -

      -

      -The main function parses the flags and, using the mechanism -we talked about above, binds the function QR to the root path -for the server. Then http.ListenAndServe is called to start the -server; it blocks while the server runs. -

      -

      -QR just receives the request, which contains form data, and -executes the template on the data in the form value named s. -

      -

      -The template package html/template is powerful; -this program just touches on its capabilities. -In essence, it rewrites a piece of HTML text on the fly by substituting elements derived -from data items passed to templ.Execute, in this case the -form value. -Within the template text (templateStr), -double-brace-delimited pieces denote template actions. -The piece from {{html "{{if .}}"}} -to {{html "{{end}}"}} executes only if the value of the current data item, called . (dot), -is non-empty. -That is, when the string is empty, this piece of the template is suppressed. -

      -

      -The two snippets {{html "{{.}}"}} say to show the data presented to -the template—the query string—on the web page. -The HTML template package automatically provides appropriate escaping so the -text is safe to display. -

      -

      -The rest of the template string is just the HTML to show when the page loads. -If this is too quick an explanation, see the documentation -for the template package for a more thorough discussion. -

      -

      -And there you have it: a useful web server in a few lines of code plus some -data-driven HTML text. -Go is powerful enough to make a lot happen in a few lines. -

      - - diff --git a/doc/gccgo_contribute.html b/doc/gccgo_contribute.html deleted file mode 100644 index 395902d7cb..0000000000 --- a/doc/gccgo_contribute.html +++ /dev/null @@ -1,112 +0,0 @@ - - -

      Introduction

      - -

      -These are some notes on contributing to the gccgo frontend for GCC. -For information on contributing to parts of Go other than gccgo, -see Contributing to the Go project. For -information on building gccgo for yourself, -see Setting up and using gccgo. -For more of the gritty details on the process of doing development -with the gccgo frontend, -see the -file HACKING in the gofrontend repository. -

      - -

      Legal Prerequisites

      - -

      -You must follow the Go copyright -rules for all changes to the gccgo frontend and the associated -libgo library. Code that is part of GCC rather than gccgo must follow -the general GCC -contribution rules. -

      - -

      Code

      - -

      -The master sources for the gccgo frontend may be found at -https://go.googlesource.com/gofrontend. -They are mirrored -at https://github.com/golang/gofrontend. -The master sources are not buildable by themselves, but only in -conjunction with GCC (in the future, other compilers may be -supported). Changes made to the gccgo frontend are also applied to -the GCC source code repository hosted at gcc.gnu.org. In -the gofrontend repository, the go directory -is mirrored to the gcc/go/gofrontend directory in the GCC -repository, and the gofrontend libgo -directory is mirrored to the GCC libgo directory. In -addition, the test directory -from the main Go repository -is mirrored to the gcc/testsuite/go.test/test directory -in the GCC repository. -

      - -

      -Changes to these directories always flow from the master sources to -the GCC repository. The files should never be changed in the GCC -repository except by changing them in the master sources and mirroring -them. -

      - -

      -The gccgo frontend is written in C++. -It follows the GNU and GCC coding standards for C++. -In writing code for the frontend, follow the formatting of the -surrounding code. -Almost all GCC-specific code is not in the frontend proper and is -instead in the GCC sources in the gcc/go directory. -

      - -

      -The run-time library for gccgo is mostly the same as the library -in the main Go repository. -The library code in the Go repository is periodically merged into -the libgo/go directory of the gofrontend and -then the GCC repositories, using the shell -script libgo/merge.sh. Accordingly, most library changes -should be made in the main Go repository. The files outside -of libgo/go are gccgo-specific; that said, some of the -files in libgo/runtime are based on files -in src/runtime in the main Go repository. -

      - -

      Testing

      - -

      -All patches must be tested. A patch that introduces new failures is -not acceptable. -

      - -

      -To run the gccgo test suite, run make check-go in your -build directory. This will run various tests -under gcc/testsuite/go.* and will also run -the libgo testsuite. This copy of the tests from the -main Go repository is run using the DejaGNU script found -in gcc/testsuite/go.test/go-test.exp. -

      - -

      -Most new tests should be submitted to the main Go repository for later -mirroring into the GCC repository. If there is a need for specific -tests for gccgo, they should go in -the gcc/testsuite/go.go-torture -or gcc/testsuite/go.dg directories in the GCC repository. -

      - -

      Submitting Changes

      - -

      -Changes to the Go frontend should follow the same process as for the -main Go repository, only for the gofrontend project and -the gofrontend-dev@googlegroups.com mailing list -rather than the go project and the -golang-dev@googlegroups.com mailing list. Those changes -will then be merged into the GCC sources. -

      diff --git a/doc/gccgo_install.html b/doc/gccgo_install.html deleted file mode 100644 index c478a9ea2d..0000000000 --- a/doc/gccgo_install.html +++ /dev/null @@ -1,533 +0,0 @@ - - -

      -This document explains how to use gccgo, a compiler for -the Go language. The gccgo compiler is a new frontend -for GCC, the widely used GNU compiler. Although the -frontend itself is under a BSD-style license, gccgo is -normally used as part of GCC and is then covered by -the GNU General Public -License (the license covers gccgo itself as part of GCC; it -does not cover code generated by gccgo). -

      - -

      -Note that gccgo is not the gc compiler; see -the Installing Go instructions for that -compiler. -

      - -

      Releases

      - -

      -The simplest way to install gccgo is to install a GCC binary release -built to include Go support. GCC binary releases are available from -various -websites and are typically included as part of GNU/Linux -distributions. We expect that most people who build these binaries -will include Go support. -

      - -

      -The GCC 4.7.1 release and all later 4.7 releases include a complete -Go 1 compiler and libraries. -

      - -

      -Due to timing, the GCC 4.8.0 and 4.8.1 releases are close to but not -identical to Go 1.1. The GCC 4.8.2 release includes a complete Go -1.1.2 implementation. -

      - -

      -The GCC 4.9 releases include a complete Go 1.2 implementation. -

      - -

      -The GCC 5 releases include a complete implementation of the Go 1.4 -user libraries. The Go 1.4 runtime is not fully merged, but that -should not be visible to Go programs. -

      - -

      -The GCC 6 releases include a complete implementation of the Go 1.6.1 -user libraries. The Go 1.6 runtime is not fully merged, but that -should not be visible to Go programs. -

      - -

      -The GCC 7 releases include a complete implementation of the Go 1.8.1 -user libraries. As with earlier releases, the Go 1.8 runtime is not -fully merged, but that should not be visible to Go programs. -

      - -

      -The GCC 8 releases include a complete implementation of the Go 1.10.1 -release. The Go 1.10 runtime has now been fully merged into the GCC -development sources, and concurrent garbage collection is fully -supported. -

      - -

      -The GCC 9 releases include a complete implementation of the Go 1.12.2 -release. -

      - -

      Source code

      - -

      -If you cannot use a release, or prefer to build gccgo for yourself, the -gccgo source code is accessible via Git. The GCC web site has -instructions for getting the GCC -source code. The gccgo source code is included. As a convenience, a -stable version of the Go support is available in the -devel/gccgo branch of the main GCC code repository: -git://gcc.gnu.org/git/gcc.git. -This branch is periodically updated with stable Go compiler sources. -

      - -

      -Note that although gcc.gnu.org is the most convenient way -to get the source code for the Go frontend, it is not where the master -sources live. If you want to contribute changes to the Go frontend -compiler, see Contributing to -gccgo. -

      - - -

      Building

      - -

      -Building gccgo is just like building GCC -with one or two additional options. See -the instructions on the gcc web -site. When you run configure, add the -option --enable-languages=c,c++,go (along with other -languages you may want to build). If you are targeting a 32-bit x86, -then you will want to build gccgo to default to -supporting locked compare and exchange instructions; do this by also -using the configure option --with-arch=i586 -(or a newer architecture, depending on where you need your programs to -run). If you are targeting a 64-bit x86, but sometimes want to use -the -m32 option, then use the configure -option --with-arch-32=i586. -

      - -

      Gold

      - -

      -On x86 GNU/Linux systems the gccgo compiler is able to -use a small discontiguous stack for goroutines. This permits programs -to run many more goroutines, since each goroutine can use a relatively -small stack. Doing this requires using the gold linker version 2.22 -or later. You can either install GNU binutils 2.22 or later, or you -can build gold yourself. -

      - -

      -To build gold yourself, build the GNU binutils, -using --enable-gold=default when you run -the configure script. Before building, you must install -the flex and bison packages. A typical sequence would look like -this (you can replace /opt/gold with any directory to -which you have write access): -

      - -
      -git clone git://sourceware.org/git/binutils-gdb.git
      -mkdir binutils-objdir
      -cd binutils-objdir
      -../binutils-gdb/configure --enable-gold=default --prefix=/opt/gold
      -make
      -make install
      -
      - -

      -However you install gold, when you configure gccgo, use the -option --with-ld=GOLD_BINARY. -

      - -

      Prerequisites

      - -

      -A number of prerequisites are required to build GCC, as -described on -the gcc web -site. It is important to install all the prerequisites before -running the gcc configure script. -The prerequisite libraries can be conveniently downloaded using the -script contrib/download_prerequisites in the GCC sources. - -

      Build commands

      - -

      -Once all the prerequisites are installed, then a typical build and -install sequence would look like this (only use -the --with-ld option if you are using the gold linker as -described above): -

      - -
      -git clone --branch devel/gccgo git://gcc.gnu.org/git/gcc.git gccgo
      -mkdir objdir
      -cd objdir
      -../gccgo/configure --prefix=/opt/gccgo --enable-languages=c,c++,go --with-ld=/opt/gold/bin/ld
      -make
      -make install
      -
      - -

      Using gccgo

      - -

      -The gccgo compiler works like other gcc frontends. As of GCC 5 the gccgo -installation also includes a version of the go command, -which may be used to build Go programs as described at -https://golang.org/cmd/go. -

      - -

      -To compile a file without using the go command: -

      - -
      -gccgo -c file.go
      -
      - -

      -That produces file.o. To link files together to form an -executable: -

      - -
      -gccgo -o file file.o
      -
      - -

      -To run the resulting file, you will need to tell the program where to -find the compiled Go packages. There are a few ways to do this: -

      - -
        -
      • -

        -Set the LD_LIBRARY_PATH environment variable: -

        - -
        -LD_LIBRARY_PATH=${prefix}/lib/gcc/MACHINE/VERSION
        -[or]
        -LD_LIBRARY_PATH=${prefix}/lib64/gcc/MACHINE/VERSION
        -export LD_LIBRARY_PATH
        -
        - -

        -Here ${prefix} is the --prefix option used -when building gccgo. For a binary install this is -normally /usr. Whether to use lib -or lib64 depends on the target. -Typically lib64 is correct for x86_64 systems, -and lib is correct for other systems. The idea is to -name the directory where libgo.so is found. -

        - -
      • - -
      • -

        -Passing a -Wl,-R option when you link (replace lib with -lib64 if appropriate for your system): -

        - -
        -go build -gccgoflags -Wl,-R,${prefix}/lib/gcc/MACHINE/VERSION
        -[or]
        -gccgo -o file file.o -Wl,-R,${prefix}/lib/gcc/MACHINE/VERSION
        -
        -
      • - -
      • -

        -Use the -static-libgo option to link statically against -the compiled packages. -

        -
      • - -
      • -

        -Use the -static option to do a fully static link (the -default for the gc compiler). -

        -
      • -
      - -

      Options

      - -

      -The gccgo compiler supports all GCC options -that are language independent, notably the -O -and -g options. -

      - -

      -The -fgo-pkgpath=PKGPATH option may be used to set a -unique prefix for the package being compiled. -This option is automatically used by the go command, but you may want -to use it if you invoke gccgo directly. -This option is intended for use with large -programs that contain many packages, in order to allow multiple -packages to use the same identifier as the package name. -The PKGPATH may be any string; a good choice for the -string is the path used to import the package. -

      - -

      -The -I and -L options, which are synonyms -for the compiler, may be used to set the search path for finding -imports. -These options are not needed if you build with the go command. -

      - -

      Imports

      - -

      -When you compile a file that exports something, the export -information will be stored directly in the object file. -If you build with gccgo directly, rather than with the go command, -then when you import a package, you must tell gccgo how to find the -file. -

      - -

      -When you import the package FILE with gccgo, -it will look for the import data in the following files, and use the -first one that it finds. - -

        -
      • FILE.gox -
      • libFILE.so -
      • libFILE.a -
      • FILE.o -
      - -

      -FILE.gox, when used, will typically contain -nothing but export data. This can be generated from -FILE.o via -

      - -
      -objcopy -j .go_export FILE.o FILE.gox
      -
      - -

      -The gccgo compiler will look in the current -directory for import files. In more complex scenarios you -may pass the -I or -L option to -gccgo. Both options take directories to search. The --L option is also passed to the linker. -

      - -

      -The gccgo compiler does not currently (2015-06-15) record -the file name of imported packages in the object file. You must -arrange for the imported data to be linked into the program. -Again, this is not necessary when building with the go command. -

      - -
      -gccgo -c mypackage.go              # Exports mypackage
      -gccgo -c main.go                   # Imports mypackage
      -gccgo -o main main.o mypackage.o   # Explicitly links with mypackage.o
      -
      - -

      Debugging

      - -

      -If you use the -g option when you compile, you can run -gdb on your executable. The debugger has only limited -knowledge about Go. You can set breakpoints, single-step, -etc. You can print variables, but they will be printed as though they -had C/C++ types. For numeric types this doesn't matter. Go strings -and interfaces will show up as two-element structures. Go -maps and channels are always represented as C pointers to run-time -structures. -

      - -

      C Interoperability

      - -

      -When using gccgo there is limited interoperability with C, -or with C++ code compiled using extern "C". -

      - -

      Types

      - -

      -Basic types map directly: an int32 in Go is -an int32_t in C, an int64 is -an int64_t, etc. -The Go type int is an integer that is the same size as a -pointer, and as such corresponds to the C type intptr_t. -Go byte is equivalent to C unsigned char. -Pointers in Go are pointers in C. -A Go struct is the same as C struct with the -same fields and types. -

      - -

      -The Go string type is currently defined as a two-element -structure (this is subject to change): -

      - -
      -struct __go_string {
      -  const unsigned char *__data;
      -  intptr_t __length;
      -};
      -
      - -

      -You can't pass arrays between C and Go. However, a pointer to an -array in Go is equivalent to a C pointer to the -equivalent of the element type. -For example, Go *[10]int is equivalent to C int*, -assuming that the C pointer does point to 10 elements. -

      - -

      -A slice in Go is a structure. The current definition is -(this is subject to change): -

      - -
      -struct __go_slice {
      -  void *__values;
      -  intptr_t __count;
      -  intptr_t __capacity;
      -};
      -
      - -

      -The type of a Go function is a pointer to a struct (this is -subject to change). The first field in the -struct points to the code of the function, which will be equivalent to -a pointer to a C function whose parameter types are equivalent, with -an additional trailing parameter. The trailing parameter is the -closure, and the argument to pass is a pointer to the Go function -struct. - -When a Go function returns more than one value, the C function returns -a struct. For example, these functions are roughly equivalent: -

      - -
      -func GoFunction(int) (int, float64)
      -struct { int i; float64 f; } CFunction(int, void*)
      -
      - -

      -Go interface, channel, and map -types have no corresponding C type (interface is a -two-element struct and channel and map are -pointers to structs in C, but the structs are deliberately undocumented). C -enum types correspond to some integer type, but precisely -which one is difficult to predict in general; use a cast. C union -types have no corresponding Go type. C struct types containing -bitfields have no corresponding Go type. C++ class types have -no corresponding Go type. -

      - -

      -Memory allocation is completely different between C and Go, as Go uses -garbage collection. The exact guidelines in this area are undetermined, -but it is likely that it will be permitted to pass a pointer to allocated -memory from C to Go. The responsibility of eventually freeing the pointer -will remain with C side, and of course if the C side frees the pointer -while the Go side still has a copy the program will fail. When passing a -pointer from Go to C, the Go function must retain a visible copy of it in -some Go variable. Otherwise the Go garbage collector may delete the -pointer while the C function is still using it. -

      - -

      Function names

      - -

      -Go code can call C functions directly using a Go extension implemented -in gccgo: a function declaration may be preceded by -//extern NAME. For example, here is how the C function -open can be declared in Go: -

      - -
      -//extern open
      -func c_open(name *byte, mode int, perm int) int
      -
      - -

      -The C function naturally expects a NUL-terminated string, which in -Go is equivalent to a pointer to an array (not a slice!) of -byte with a terminating zero byte. So a sample call -from Go would look like (after importing the syscall package): -

      - -
      -var name = [4]byte{'f', 'o', 'o', 0};
      -i := c_open(&name[0], syscall.O_RDONLY, 0);
      -
      - -

      -(this serves as an example only, to open a file in Go please use Go's -os.Open function instead). -

      - -

      -Note that if the C function can block, such as in a call -to read, calling the C function may block the Go program. -Unless you have a clear understanding of what you are doing, all calls -between C and Go should be implemented through cgo or SWIG, as for -the gc compiler. -

      - -

      -The name of Go functions accessed from C is subject to change. At present -the name of a Go function that does not have a receiver is -prefix.package.Functionname. The prefix is set by -the -fgo-prefix option used when the package is compiled; -if the option is not used, the default is go. -To call the function from C you must set the name using -a GCC extension. -

      - -
      -extern int go_function(int) __asm__ ("myprefix.mypackage.Function");
      -
      - -

      -Automatic generation of Go declarations from C source code

      - -

      -The Go version of GCC supports automatically generating -Go declarations from C code. The facility is rather awkward, and most -users should use the cgo program with -the -gccgo option instead. -

      - -

      -Compile your C code as usual, and add the option --fdump-go-spec=FILENAME. This will create the -file FILENAME as a side effect of the -compilation. This file will contain Go declarations for the types, -variables and functions declared in the C code. C types that can not -be represented in Go will be recorded as comments in the Go code. The -generated file will not have a package declaration, but -can otherwise be compiled directly by gccgo. -

      - -

      -This procedure is full of unstated caveats and restrictions and we make no -guarantee that it will not change in the future. It is more useful as a -starting point for real Go code than as a regular procedure. -

      diff --git a/doc/go-logo-black.png b/doc/go-logo-black.png deleted file mode 100644 index 3077ebdad0726b3fbf7451897cbeaa33b3cb0bb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8843 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 UuXH?TU|?YIboFyt=akR{07!DhwEzGB diff --git a/doc/go1.1.html b/doc/go1.1.html deleted file mode 100644 index f615c97e81..0000000000 --- a/doc/go1.1.html +++ /dev/null @@ -1,1099 +0,0 @@ - - -

      Introduction to Go 1.1

      - -

      -The release of Go version 1 (Go 1 or Go 1.0 for short) -in March of 2012 introduced a new period -of stability in the Go language and libraries. -That stability has helped nourish a growing community of Go users -and systems around the world. -Several "point" releases since -then—1.0.1, 1.0.2, and 1.0.3—have been issued. -These point releases fixed known bugs but made -no non-critical changes to the implementation. -

      - -

      -This new release, Go 1.1, keeps the promise -of compatibility but adds a couple of significant -(backwards-compatible, of course) language changes, has a long list -of (again, compatible) library changes, and -includes major work on the implementation of the compilers, -libraries, and run-time. -The focus is on performance. -Benchmarking is an inexact science at best, but we see significant, -sometimes dramatic speedups for many of our test programs. -We trust that many of our users' programs will also see improvements -just by updating their Go installation and recompiling. -

      - -

      -This document summarizes the changes between Go 1 and Go 1.1. -Very little if any code will need modification to run with Go 1.1, -although a couple of rare error cases surface with this release -and need to be addressed if they arise. -Details appear below; see the discussion of -64-bit ints and Unicode literals -in particular. -

      - -

      Changes to the language

      - -

      -The Go compatibility document promises -that programs written to the Go 1 language specification will continue to operate, -and those promises are maintained. -In the interest of firming up the specification, though, there are -details about some error cases that have been clarified. -There are also some new language features. -

      - -

      Integer division by zero

      - -

      -In Go 1, integer division by a constant zero produced a run-time panic: -

      - -
      -func f(x int) int {
      -	return x/0
      -}
      -
      - -

      -In Go 1.1, an integer division by constant zero is not a legal program, so it is a compile-time error. -

      - -

      Surrogates in Unicode literals

      - -

      -The definition of string and rune literals has been refined to exclude surrogate halves from the -set of valid Unicode code points. -See the Unicode section for more information. -

      - -

      Method values

      - -

      -Go 1.1 now implements -method values, -which are functions that have been bound to a specific receiver value. -For instance, given a -Writer -value w, -the expression -w.Write, -a method value, is a function that will always write to w; it is equivalent to -a function literal closing over w: -

      - -
      -func (p []byte) (n int, err error) {
      -	return w.Write(p)
      -}
      -
      - -

      -Method values are distinct from method expressions, which generate functions -from methods of a given type; the method expression (*bufio.Writer).Write -is equivalent to a function with an extra first argument, a receiver of type -(*bufio.Writer): -

      - -
      -func (w *bufio.Writer, p []byte) (n int, err error) {
      -	return w.Write(p)
      -}
      -
      - -

      -Updating: No existing code is affected; the change is strictly backward-compatible. -

      - -

      Return requirements

      - -

      -Before Go 1.1, a function that returned a value needed an explicit "return" -or call to panic at -the end of the function; this was a simple way to make the programmer -be explicit about the meaning of the function. But there are many cases -where a final "return" is clearly unnecessary, such as a function with -only an infinite "for" loop. -

      - -

      -In Go 1.1, the rule about final "return" statements is more permissive. -It introduces the concept of a -terminating statement, -a statement that is guaranteed to be the last one a function executes. -Examples include -"for" loops with no condition and "if-else" -statements in which each half ends in a "return". -If the final statement of a function can be shown syntactically to -be a terminating statement, no final "return" statement is needed. -

      - -

      -Note that the rule is purely syntactic: it pays no attention to the values in the -code and therefore requires no complex analysis. -

      - -

      -Updating: The change is backward-compatible, but existing code -with superfluous "return" statements and calls to panic may -be simplified manually. -Such code can be identified by go vet. -

      - -

      Changes to the implementations and tools

      - -

      Status of gccgo

      - -

      -The GCC release schedule does not coincide with the Go release schedule, so some skew is inevitable in -gccgo's releases. -The 4.8.0 version of GCC shipped in March, 2013 and includes a nearly-Go 1.1 version of gccgo. -Its library is a little behind the release, but the biggest difference is that method values are not implemented. -Sometime around July 2013, we expect 4.8.2 of GCC to ship with a gccgo -providing a complete Go 1.1 implementation. -

      - -

      Command-line flag parsing

      - -

      -In the gc toolchain, the compilers and linkers now use the -same command-line flag parsing rules as the Go flag package, a departure -from the traditional Unix flag parsing. This may affect scripts that invoke -the tool directly. -For example, -go tool 6c -Fw -Dfoo must now be written -go tool 6c -F -w -D foo. -

      - -

      Size of int on 64-bit platforms

      - -

      -The language allows the implementation to choose whether the int type and -uint types are 32 or 64 bits. Previous Go implementations made int -and uint 32 bits on all systems. Both the gc and gccgo implementations -now make -int and uint 64 bits on 64-bit platforms such as AMD64/x86-64. -Among other things, this enables the allocation of slices with -more than 2 billion elements on 64-bit platforms. -

      - -

      -Updating: -Most programs will be unaffected by this change. -Because Go does not allow implicit conversions between distinct -numeric types, -no programs will stop compiling due to this change. -However, programs that contain implicit assumptions -that int is only 32 bits may change behavior. -For example, this code prints a positive number on 64-bit systems and -a negative one on 32-bit systems: -

      - -
      -x := ^uint32(0) // x is 0xffffffff
      -i := int(x)     // i is -1 on 32-bit systems, 0xffffffff on 64-bit
      -fmt.Println(i)
      -
      - -

      Portable code intending 32-bit sign extension (yielding -1 on all systems) -would instead say: -

      - -
      -i := int(int32(x))
      -
      - -

      Heap size on 64-bit architectures

      - -

      -On 64-bit architectures, the maximum heap size has been enlarged substantially, -from a few gigabytes to several tens of gigabytes. -(The exact details depend on the system and may change.) -

      - -

      -On 32-bit architectures, the heap size has not changed. -

      - -

      -Updating: -This change should have no effect on existing programs beyond allowing them -to run with larger heaps. -

      - -

      Unicode

      - -

      -To make it possible to represent code points greater than 65535 in UTF-16, -Unicode defines surrogate halves, -a range of code points to be used only in the assembly of large values, and only in UTF-16. -The code points in that surrogate range are illegal for any other purpose. -In Go 1.1, this constraint is honored by the compiler, libraries, and run-time: -a surrogate half is illegal as a rune value, when encoded as UTF-8, or when -encoded in isolation as UTF-16. -When encountered, for example in converting from a rune to UTF-8, it is -treated as an encoding error and will yield the replacement rune, -utf8.RuneError, -U+FFFD. -

      - -

      -This program, -

      - -
      -import "fmt"
      -
      -func main() {
      -    fmt.Printf("%+q\n", string(0xD800))
      -}
      -
      - -

      -printed "\ud800" in Go 1.0, but prints "\ufffd" in Go 1.1. -

      - -

      -Surrogate-half Unicode values are now illegal in rune and string constants, so constants such as -'\ud800' and "\ud800" are now rejected by the compilers. -When written explicitly as UTF-8 encoded bytes, -such strings can still be created, as in "\xed\xa0\x80". -However, when such a string is decoded as a sequence of runes, as in a range loop, it will yield only utf8.RuneError -values. -

      - -

      -The Unicode byte order mark U+FEFF, encoded in UTF-8, is now permitted as the first -character of a Go source file. -Even though its appearance in the byte-order-free UTF-8 encoding is clearly unnecessary, -some editors add the mark as a kind of "magic number" identifying a UTF-8 encoded file. -

      - -

      -Updating: -Most programs will be unaffected by the surrogate change. -Programs that depend on the old behavior should be modified to avoid the issue. -The byte-order-mark change is strictly backward-compatible. -

      - -

      Race detector

      - -

      -A major addition to the tools is a race detector, a way to -find bugs in programs caused by concurrent access of the same -variable, where at least one of the accesses is a write. -This new facility is built into the go tool. -For now, it is only available on Linux, Mac OS X, and Windows systems with -64-bit x86 processors. -To enable it, set the -race flag when building or testing your program -(for instance, go test -race). -The race detector is documented in a separate article. -

      - -

      The gc assemblers

      - -

      -Due to the change of the int to 64 bits and -a new internal representation of functions, -the arrangement of function arguments on the stack has changed in the gc toolchain. -Functions written in assembly will need to be revised at least -to adjust frame pointer offsets. -

      - -

      -Updating: -The go vet command now checks that functions implemented in assembly -match the Go function prototypes they implement. -

      - -

      Changes to the go command

      - -

      -The go command has acquired several -changes intended to improve the experience for new Go users. -

      - -

      -First, when compiling, testing, or running Go code, the go command will now give more detailed error messages, -including a list of paths searched, when a package cannot be located. -

      - -
      -$ go build foo/quxx
      -can't load package: package foo/quxx: cannot find package "foo/quxx" in any of:
      -        /home/you/go/src/pkg/foo/quxx (from $GOROOT)
      -        /home/you/src/foo/quxx (from $GOPATH)
      -
      - -

      -Second, the go get command no longer allows $GOROOT -as the default destination when downloading package source. -To use the go get -command, a valid $GOPATH is now required. -

      - -
      -$ GOPATH= go get code.google.com/p/foo/quxx
      -package code.google.com/p/foo/quxx: cannot download, $GOPATH not set. For more details see: go help gopath
      -
      - -

      -Finally, as a result of the previous change, the go get command will also fail -when $GOPATH and $GOROOT are set to the same value. -

      - -
      -$ GOPATH=$GOROOT go get code.google.com/p/foo/quxx
      -warning: GOPATH set to GOROOT (/home/you/go) has no effect
      -package code.google.com/p/foo/quxx: cannot download, $GOPATH must not be set to $GOROOT. For more details see: go help gopath
      -
      - -

      Changes to the go test command

      - -

      -The go test -command no longer deletes the binary when run with profiling enabled, -to make it easier to analyze the profile. -The implementation sets the -c flag automatically, so after running, -

      - -
      -$ go test -cpuprofile cpuprof.out mypackage
      -
      - -

      -the file mypackage.test will be left in the directory where go test was run. -

      - -

      -The go test -command can now generate profiling information -that reports where goroutines are blocked, that is, -where they tend to stall waiting for an event such as a channel communication. -The information is presented as a -blocking profile -enabled with the --blockprofile -option of -go test. -Run go help test for more information. -

      - -

      Changes to the go fix command

      - -

      -The fix command, usually run as -go fix, no longer applies fixes to update code from -before Go 1 to use Go 1 APIs. -To update pre-Go 1 code to Go 1.1, use a Go 1.0 toolchain -to convert the code to Go 1.0 first. -

      - -

      Build constraints

      - -

      -The "go1.1" tag has been added to the list of default -build constraints. -This permits packages to take advantage of the new features in Go 1.1 while -remaining compatible with earlier versions of Go. -

      - -

      -To build a file only with Go 1.1 and above, add this build constraint: -

      - -
      -// +build go1.1
      -
      - -

      -To build a file only with Go 1.0.x, use the converse constraint: -

      - -
      -// +build !go1.1
      -
      - -

      Additional platforms

      - -

      -The Go 1.1 toolchain adds experimental support for freebsd/arm, -netbsd/386, netbsd/amd64, netbsd/arm, -openbsd/386 and openbsd/amd64 platforms. -

      - -

      -An ARMv6 or later processor is required for freebsd/arm or -netbsd/arm. -

      - -

      -Go 1.1 adds experimental support for cgo on linux/arm. -

      - -

      Cross compilation

      - -

      -When cross-compiling, the go tool will disable cgo -support by default. -

      - -

      -To explicitly enable cgo, set CGO_ENABLED=1. -

      - -

      Performance

      - -

      -The performance of code compiled with the Go 1.1 gc tool suite should be noticeably -better for most Go programs. -Typical improvements relative to Go 1.0 seem to be about 30%-40%, sometimes -much more, but occasionally less or even non-existent. -There are too many small performance-driven tweaks through the tools and libraries -to list them all here, but the following major changes are worth noting: -

      - -
        -
      • The gc compilers generate better code in many cases, most noticeably for -floating point on the 32-bit Intel architecture.
      • -
      • The gc compilers do more in-lining, including for some operations -in the run-time such as append -and interface conversions.
      • -
      • There is a new implementation of Go maps with significant reduction in -memory footprint and CPU time.
      • -
      • The garbage collector has been made more parallel, which can reduce -latencies for programs running on multiple CPUs.
      • -
      • The garbage collector is also more precise, which costs a small amount of -CPU time but can reduce the size of the heap significantly, especially -on 32-bit architectures.
      • -
      • Due to tighter coupling of the run-time and network libraries, fewer -context switches are required on network operations.
      • -
      - -

      Changes to the standard library

      - -

      bufio.Scanner

      - -

      -The various routines to scan textual input in the -bufio -package, -ReadBytes, -ReadString -and particularly -ReadLine, -are needlessly complex to use for simple purposes. -In Go 1.1, a new type, -Scanner, -has been added to make it easier to do simple tasks such as -read the input as a sequence of lines or space-delimited words. -It simplifies the problem by terminating the scan on problematic -input such as pathologically long lines, and having a simple -default: line-oriented input, with each line stripped of its terminator. -Here is code to reproduce the input a line at a time: -

      - -
      -scanner := bufio.NewScanner(os.Stdin)
      -for scanner.Scan() {
      -    fmt.Println(scanner.Text()) // Println will add back the final '\n'
      -}
      -if err := scanner.Err(); err != nil {
      -    fmt.Fprintln(os.Stderr, "reading standard input:", err)
      -}
      -
      - -

      -Scanning behavior can be adjusted through a function to control subdividing the input -(see the documentation for SplitFunc), -but for tough problems or the need to continue past errors, the older interface -may still be required. -

      - -

      net

      - -

      -The protocol-specific resolvers in the net package were formerly -lax about the network name passed in. -Although the documentation was clear -that the only valid networks for -ResolveTCPAddr -are "tcp", -"tcp4", and "tcp6", the Go 1.0 implementation silently accepted any string. -The Go 1.1 implementation returns an error if the network is not one of those strings. -The same is true of the other protocol-specific resolvers ResolveIPAddr, -ResolveUDPAddr, and -ResolveUnixAddr. -

      - -

      -The previous implementation of -ListenUnixgram -returned a -UDPConn as -a representation of the connection endpoint. -The Go 1.1 implementation instead returns a -UnixConn -to allow reading and writing -with its -ReadFrom -and -WriteTo -methods. -

      - -

      -The data structures -IPAddr, -TCPAddr, and -UDPAddr -add a new string field called Zone. -Code using untagged composite literals (e.g. net.TCPAddr{ip, port}) -instead of tagged literals (net.TCPAddr{IP: ip, Port: port}) -will break due to the new field. -The Go 1 compatibility rules allow this change: client code must use tagged literals to avoid such breakages. -

      - -

      -Updating: -To correct breakage caused by the new struct field, -go fix will rewrite code to add tags for these types. -More generally, go vet will identify composite literals that -should be revised to use field tags. -

      - -

      reflect

      - -

      -The reflect package has several significant additions. -

      - -

      -It is now possible to run a "select" statement using -the reflect package; see the description of -Select -and -SelectCase -for details. -

      - -

      -The new method -Value.Convert -(or -Type.ConvertibleTo) -provides functionality to execute a Go conversion or type assertion operation -on a -Value -(or test for its possibility). -

      - -

      -The new function -MakeFunc -creates a wrapper function to make it easier to call a function with existing -Values, -doing the standard Go conversions among the arguments, for instance -to pass an actual int to a formal interface{}. -

      - -

      -Finally, the new functions -ChanOf, -MapOf -and -SliceOf -construct new -Types -from existing types, for example to construct the type []T given -only T. -

      - - -

      time

      -

      -On FreeBSD, Linux, NetBSD, OS X and OpenBSD, previous versions of the -time package -returned times with microsecond precision. -The Go 1.1 implementation on these -systems now returns times with nanosecond precision. -Programs that write to an external format with microsecond precision -and read it back, expecting to recover the original value, will be affected -by the loss of precision. -There are two new methods of Time, -Round -and -Truncate, -that can be used to remove precision from a time before passing it to -external storage. -

      - -

      -The new method -YearDay -returns the one-indexed integral day number of the year specified by the time value. -

      - -

      -The -Timer -type has a new method -Reset -that modifies the timer to expire after a specified duration. -

      - -

      -Finally, the new function -ParseInLocation -is like the existing -Parse -but parses the time in the context of a location (time zone), ignoring -time zone information in the parsed string. -This function addresses a common source of confusion in the time API. -

      - -

      -Updating: -Code that needs to read and write times using an external format with -lower precision should be modified to use the new methods. -

      - -

      Exp and old subtrees moved to go.exp and go.text subrepositories

      - -

      -To make it easier for binary distributions to access them if desired, the exp -and old source subtrees, which are not included in binary distributions, -have been moved to the new go.exp subrepository at -code.google.com/p/go.exp. To access the ssa package, -for example, run -

      - -
      -$ go get code.google.com/p/go.exp/ssa
      -
      - -

      -and then in Go source, -

      - -
      -import "code.google.com/p/go.exp/ssa"
      -
      - -

      -The old package exp/norm has also been moved, but to a new repository -go.text, where the Unicode APIs and other text-related packages will -be developed. -

      - -

      New packages

      - -

      -There are three new packages. -

      - -
        -
      • -The go/format package provides -a convenient way for a program to access the formatting capabilities of the -go fmt command. -It has two functions, -Node to format a Go parser -Node, -and -Source -to reformat arbitrary Go source code into the standard format as provided by the -go fmt command. -
      • - -
      • -The net/http/cookiejar package provides the basics for managing HTTP cookies. -
      • - -
      • -The runtime/race package provides low-level facilities for data race detection. -It is internal to the race detector and does not otherwise export any user-visible functionality. -
      • -
      - -

      Minor changes to the library

      - -

      -The following list summarizes a number of minor changes to the library, mostly additions. -See the relevant package documentation for more information about each change. -

      - -
        -
      • -The bytes package has two new functions, -TrimPrefix -and -TrimSuffix, -with self-evident properties. -Also, the Buffer type -has a new method -Grow that -provides some control over memory allocation inside the buffer. -Finally, the -Reader type now has a -WriteTo method -so it implements the -io.WriterTo interface. -
      • - -
      • -The compress/gzip package has -a new Flush -method for its -Writer -type that flushes its underlying flate.Writer. -
      • - -
      • -The crypto/hmac package has a new function, -Equal, to compare two MACs. -
      • - -
      • -The crypto/x509 package -now supports PEM blocks (see -DecryptPEMBlock for instance), -and a new function -ParseECPrivateKey to parse elliptic curve private keys. -
      • - -
      • -The database/sql package -has a new -Ping -method for its -DB -type that tests the health of the connection. -
      • - -
      • -The database/sql/driver package -has a new -Queryer -interface that a -Conn -may implement to improve performance. -
      • - -
      • -The encoding/json package's -Decoder -has a new method -Buffered -to provide access to the remaining data in its buffer, -as well as a new method -UseNumber -to unmarshal a value into the new type -Number, -a string, rather than a float64. -
      • - -
      • -The encoding/xml package -has a new function, -EscapeText, -which writes escaped XML output, -and a method on -Encoder, -Indent, -to specify indented output. -
      • - -
      • -In the go/ast package, a -new type CommentMap -and associated methods makes it easier to extract and process comments in Go programs. -
      • - -
      • -In the go/doc package, -the parser now keeps better track of stylized annotations such as TODO(joe) -throughout the code, -information that the godoc -command can filter or present according to the value of the -notes flag. -
      • - -
      • -The undocumented and only partially implemented "noescape" feature of the -html/template -package has been removed; programs that depend on it will break. -
      • - -
      • -The image/jpeg package now -reads progressive JPEG files and handles a few more subsampling configurations. -
      • - -
      • -The io package now exports the -io.ByteWriter interface to capture the common -functionality of writing a byte at a time. -It also exports a new error, ErrNoProgress, -used to indicate a Read implementation is looping without delivering data. -
      • - -
      • -The log/syslog package now provides better support -for OS-specific logging features. -
      • - -
      • -The math/big package's -Int type -now has methods -MarshalJSON -and -UnmarshalJSON -to convert to and from a JSON representation. -Also, -Int -can now convert directly to and from a uint64 using -Uint64 -and -SetUint64, -while -Rat -can do the same with float64 using -Float64 -and -SetFloat64. -
      • - -
      • -The mime/multipart package -has a new method for its -Writer, -SetBoundary, -to define the boundary separator used to package the output. -The Reader also now -transparently decodes any quoted-printable parts and removes -the Content-Transfer-Encoding header when doing so. -
      • - -
      • -The -net package's -ListenUnixgram -function has changed return types: it now returns a -UnixConn -rather than a -UDPConn, which was -clearly a mistake in Go 1.0. -Since this API change fixes a bug, it is permitted by the Go 1 compatibility rules. -
      • - -
      • -The net package includes a new type, -Dialer, to supply options to -Dial. -
      • - -
      • -The net package adds support for -link-local IPv6 addresses with zone qualifiers, such as fe80::1%lo0. -The address structures IPAddr, -UDPAddr, and -TCPAddr -record the zone in a new field, and functions that expect string forms of these addresses, such as -Dial, -ResolveIPAddr, -ResolveUDPAddr, and -ResolveTCPAddr, -now accept the zone-qualified form. -
      • - -
      • -The net package adds -LookupNS to its suite of resolving functions. -LookupNS returns the NS records for a host name. -
      • - -
      • -The net package adds protocol-specific -packet reading and writing methods to -IPConn -(ReadMsgIP -and WriteMsgIP) and -UDPConn -(ReadMsgUDP and -WriteMsgUDP). -These are specialized versions of PacketConn's -ReadFrom and WriteTo methods that provide access to out-of-band data associated -with the packets. -
      • - -
      • -The net package adds methods to -UnixConn to allow closing half of the connection -(CloseRead and -CloseWrite), -matching the existing methods of TCPConn. -
      • - -
      • -The net/http package includes several new additions. -ParseTime parses a time string, trying -several common HTTP time formats. -The PostFormValue method of -Request is like -FormValue but ignores URL parameters. -The CloseNotifier interface provides a mechanism -for a server handler to discover when a client has disconnected. -The ServeMux type now has a -Handler method to access a path's -Handler without executing it. -The Transport can now cancel an in-flight request with -CancelRequest. -Finally, the Transport is now more aggressive at closing TCP connections when -a Response.Body is closed before -being fully consumed. -
      • - -
      • -The net/mail package has two new functions, -ParseAddress and -ParseAddressList, -to parse RFC 5322-formatted mail addresses into -Address structures. -
      • - -
      • -The net/smtp package's -Client type has a new method, -Hello, -which transmits a HELO or EHLO message to the server. -
      • - -
      • -The net/textproto package -has two new functions, -TrimBytes and -TrimString, -which do ASCII-only trimming of leading and trailing spaces. -
      • - -
      • -The new method os.FileMode.IsRegular makes it easy to ask if a file is a plain file. -
      • - -
      • -The os/signal package has a new function, -Stop, which stops the package delivering -any further signals to the channel. -
      • - -
      • -The regexp package -now supports Unix-original leftmost-longest matches through the -Regexp.Longest -method, while -Regexp.Split slices -strings into pieces based on separators defined by the regular expression. -
      • - -
      • -The runtime/debug package -has three new functions regarding memory usage. -The FreeOSMemory -function triggers a run of the garbage collector and then attempts to return unused -memory to the operating system; -the ReadGCStats -function retrieves statistics about the collector; and -SetGCPercent -provides a programmatic way to control how often the collector runs, -including disabling it altogether. -
      • - -
      • -The sort package has a new function, -Reverse. -Wrapping the argument of a call to -sort.Sort -with a call to Reverse causes the sort order to be reversed. -
      • - -
      • -The strings package has two new functions, -TrimPrefix -and -TrimSuffix -with self-evident properties, and the new method -Reader.WriteTo so the -Reader -type now implements the -io.WriterTo interface. -
      • - -
      • -The syscall package's -Fchflags function on various BSDs -(including Darwin) has changed signature. -It now takes an int as the first parameter instead of a string. -Since this API change fixes a bug, it is permitted by the Go 1 compatibility rules. -
      • -
      • -The syscall package also has received many updates -to make it more inclusive of constants and system calls for each supported operating system. -
      • - -
      • -The testing package now automates the generation of allocation -statistics in tests and benchmarks using the new -AllocsPerRun function. And the -ReportAllocs -method on testing.B will enable printing of -memory allocation statistics for the calling benchmark. It also introduces the -AllocsPerOp method of -BenchmarkResult. -There is also a new -Verbose function to test the state of the -v -command-line flag, -and a new -Skip method of -testing.B and -testing.T -to simplify skipping an inappropriate test. -
      • - -
      • -In the text/template -and -html/template packages, -templates can now use parentheses to group the elements of pipelines, simplifying the construction of complex pipelines. -Also, as part of the new parser, the -Node interface got two new methods to provide -better error reporting. -Although this violates the Go 1 compatibility rules, -no existing code should be affected because this interface is explicitly intended only to be used -by the -text/template -and -html/template -packages and there are safeguards to guarantee that. -
      • - -
      • -The implementation of the unicode package has been updated to Unicode version 6.2.0. -
      • - -
      • -In the unicode/utf8 package, -the new function ValidRune reports whether the rune is a valid Unicode code point. -To be valid, a rune must be in range and not be a surrogate half. -
      • -
      diff --git a/doc/go1.10.html b/doc/go1.10.html deleted file mode 100644 index 853f874ded..0000000000 --- a/doc/go1.10.html +++ /dev/null @@ -1,1448 +0,0 @@ - - - - - - -

      Introduction to Go 1.10

      - -

      -The latest Go release, version 1.10, arrives six months after Go 1.9. -Most of its changes are in the implementation of the toolchain, runtime, and libraries. -As always, the release maintains the Go 1 promise of compatibility. -We expect almost all Go programs to continue to compile and run as before. -

      - -

      -This release improves caching of built packages, -adds caching of successful test results, -runs vet automatically during tests, -and -permits passing string values directly between Go and C using cgo. -A new hard-coded set of safe compiler options may cause -unexpected invalid -flag errors in code that built successfully with older -releases. -

      - -

      Changes to the language

      - -

      -There are no significant changes to the language specification. -

      - -

      -A corner case involving shifts of untyped constants has been clarified, -and as a result the compilers have been updated to allow the index expression -x[1.0 << s] where s is an unsigned integer; -the go/types package already did. -

      - -

      -The grammar for method expressions has been updated to relax the -syntax to allow any type expression as a receiver; -this matches what the compilers were already implementing. -For example, struct{io.Reader}.Read is a valid, if unusual, -method expression that the compilers already accepted and is -now permitted by the language grammar. -

      - -

      Ports

      - -

      -There are no new supported operating systems or processor architectures in this release. -Most of the work has focused on strengthening the support for existing ports, -in particular new instructions in the assembler -and improvements to the code generated by the compilers. -

      - -

      -As announced in the Go 1.9 release notes, -Go 1.10 now requires FreeBSD 10.3 or later; -support for FreeBSD 9.3 has been removed. -

      - -

      -Go now runs on NetBSD again but requires the unreleased NetBSD 8. -Only GOARCH amd64 and 386 have -been fixed. The arm port is still broken. -

      - -

      -On 32-bit MIPS systems, the new environment variable settings -GOMIPS=hardfloat (the default) and -GOMIPS=softfloat select whether to use -hardware instructions or software emulation for floating-point computations. -

      - -

      -Go 1.10 is the last release that will run on OpenBSD 6.0. -Go 1.11 will require OpenBSD 6.2. -

      - -

      -Go 1.10 is the last release that will run on OS X 10.8 Mountain Lion or OS X 10.9 Mavericks. -Go 1.11 will require OS X 10.10 Yosemite or later. -

      - -

      -Go 1.10 is the last release that will run on Windows XP or Windows Vista. -Go 1.11 will require Windows 7 or later. -

      - -

      Tools

      - -

      Default GOROOT & GOTMPDIR

      - -

      -If the environment variable $GOROOT is unset, -the go tool previously used the default GOROOT -set during toolchain compilation. -Now, before falling back to that default, the go tool attempts to -deduce GOROOT from its own executable path. -This allows binary distributions to be unpacked anywhere in the -file system and then be used without setting GOROOT -explicitly. -

      - -

      -By default, the go tool creates its temporary files and directories -in the system temporary directory (for example, $TMPDIR on Unix). -If the new environment variable $GOTMPDIR is set, -the go tool will creates its temporary files and directories in that directory instead. -

      - -

      Build & Install

      - -

      -The go build command now detects out-of-date packages -purely based on the content of source files, specified build flags, and metadata stored in the compiled packages. -Modification times are no longer consulted or relevant. -The old advice to add -a to force a rebuild in cases where -the modification times were misleading for one reason or another -(for example, changes in build flags) is no longer necessary: -builds now always detect when packages must be rebuilt. -(If you observe otherwise, please file a bug.) -

      - -

      -The go build -asmflags, -gcflags, -gccgoflags, and -ldflags options -now apply by default only to the packages listed directly on the command line. -For example, go build -gcflags=-m mypkg -passes the compiler the -m flag when building mypkg -but not its dependencies. -The new, more general form -asmflags=pattern=flags (and similarly for the others) -applies the flags only to the packages matching the pattern. -For example: go install -ldflags=cmd/gofmt=-X=main.version=1.2.3 cmd/... -installs all the commands matching cmd/... but only applies the -X option -to the linker flags for cmd/gofmt. -For more details, see go help build. -

      - -

      -The go build command now maintains a cache of -recently built packages, separate from the installed packages in $GOROOT/pkg or $GOPATH/pkg. -The effect of the cache should be to speed builds that do not explicitly install packages -or when switching between different copies of source code (for example, when changing -back and forth between different branches in a version control system). -The old advice to add the -i flag for speed, as in go build -i -or go test -i, -is no longer necessary: builds run just as fast without -i. -For more details, see go help cache. -

      - -

      -The go install command now installs only the -packages and commands listed directly on the command line. -For example, go install cmd/gofmt -installs the gofmt program but not any of the packages on which it depends. -The new build cache makes future commands still run as quickly as if the -dependencies had been installed. -To force the installation of dependencies, use the new -go install -i flag. -Installing dependency packages should not be necessary in general, -and the very concept of installed packages may disappear in a future release. -

      - -

      -Many details of the go build implementation have changed to support these improvements. -One new requirement implied by these changes is that -binary-only packages must now declare accurate import blocks in their -stub source code, so that those imports can be made available when -linking a program using the binary-only package. -For more details, see go help filetype. -

      - -

      Test

      - -

      -The go test command now caches test results: -if the test executable and command line match a previous run -and the files and environment variables consulted by that run -have not changed either, go test will print -the previous test output, replacing the elapsed time with the string “(cached).” -Test caching applies only to successful test results; -only to go test -commands with an explicit list of packages; and -only to command lines using a subset of the --cpu, -list, -parallel, --run, -short, and -v test flags. -The idiomatic way to bypass test caching is to use -count=1. -

      - -

      -The go test command now automatically runs -go vet on the package being tested, -to identify significant problems before running the test. -Any such problems are treated like build errors and prevent execution of the test. -Only a high-confidence subset of the available go vet -checks are enabled for this automatic check. -To disable the running of go vet, use -go test -vet=off. -

      - -

      -The go test -coverpkg flag now -interprets its argument as a comma-separated list of patterns to match against -the dependencies of each test, not as a list of packages to load anew. -For example, go test -coverpkg=all -is now a meaningful way to run a test with coverage enabled for the test package -and all its dependencies. -Also, the go test -coverprofile option is now -supported when running multiple tests. -

      - -

      -In case of failure due to timeout, tests are now more likely to write their profiles before exiting. -

      - -

      -The go test command now always -merges the standard output and standard error from a given test binary execution -and writes both to go test's standard output. -In past releases, go test only applied this -merging most of the time. -

      - -

      -The go test -v output -now includes PAUSE and CONT status update -lines to mark when parallel tests pause and continue. -

      - -

      -The new go test -failfast flag -disables running additional tests after any test fails. -Note that tests running in parallel with the failing test are allowed to complete. -

      - -

      -Finally, the new go test -json flag -filters test output through the new command -go tool test2json -to produce a machine-readable JSON-formatted description of test execution. -This allows the creation of rich presentations of test execution -in IDEs and other tools. -

      - - -

      -For more details about all these changes, -see go help test -and the test2json documentation. -

      - -

      Cgo

      - -

      -Options specified by cgo using #cgo CFLAGS and the like -are now checked against a list of permitted options. -This closes a security hole in which a downloaded package uses -compiler options like --fplugin -to run arbitrary code on the machine where it is being built. -This can cause a build error such as invalid flag in #cgo CFLAGS. -For more background, and how to handle this error, see -https://golang.org/s/invalidflag. -

      - -

      -Cgo now implements a C typedef like “typedef X Y” using a Go type alias, -so that Go code may use the types C.X and C.Y interchangeably. -It also now supports the use of niladic function-like macros. -Also, the documentation has been updated to clarify that -Go structs and Go arrays are not supported in the type signatures of cgo-exported functions. -

      - -

      -Cgo now supports direct access to Go string values from C. -Functions in the C preamble may use the type _GoString_ -to accept a Go string as an argument. -C code may call _GoStringLen and _GoStringPtr -for direct access to the contents of the string. -A value of type _GoString_ -may be passed in a call to an exported Go function that takes an argument of Go type string. -

      - -

      -During toolchain bootstrap, the environment variables CC and CC_FOR_TARGET specify -the default C compiler that the resulting toolchain will use for host and target builds, respectively. -However, if the toolchain will be used with multiple targets, it may be necessary to specify a different C compiler for each -(for example, a different compiler for darwin/arm64 versus linux/ppc64le). -The new set of environment variables CC_FOR_goos_goarch -allows specifying a different default C compiler for each target. -Note that these variables only apply during toolchain bootstrap, -to set the defaults used by the resulting toolchain. -Later go build commands use the CC environment -variable or else the built-in default. -

      - -

      -Cgo now translates some C types that would normally map to a pointer -type in Go, to a uintptr instead. These types include -the CFTypeRef hierarchy in Darwin's CoreFoundation -framework and the jobject hierarchy in Java's JNI -interface. -

      - -

      -These types must be uintptr on the Go side because they -would otherwise confuse the Go garbage collector; they are sometimes -not really pointers but data structures encoded in a pointer-sized integer. -Pointers to Go memory must not be stored in these uintptr values. -

      - -

      -Because of this change, values of the affected types need to be -zero-initialized with the constant 0 instead of the -constant nil. Go 1.10 provides gofix -modules to help with that rewrite: -

      - -
      -go tool fix -r cftype <pkg>
      -go tool fix -r jni <pkg>
      -
      - -

      -For more details, see the cgo documentation. -

      - -

      Doc

      - -

      -The go doc tool now adds functions returning slices of T or *T -to the display of type T, similar to the existing behavior for functions returning single T or *T results. -For example: -

      - -
      -$ go doc mail.Address
      -package mail // import "net/mail"
      -
      -type Address struct {
      -	Name    string
      -	Address string
      -}
      -    Address represents a single mail address.
      -
      -func ParseAddress(address string) (*Address, error)
      -func ParseAddressList(list string) ([]*Address, error)
      -func (a *Address) String() string
      -$
      -
      - -

      -Previously, ParseAddressList was only shown in the package overview (go doc mail). -

      - -

      Fix

      - -

      -The go fix tool now replaces imports of "golang.org/x/net/context" -with "context". -(Forwarding aliases in the former make it completely equivalent to the latter when using Go 1.9 or later.) -

      - -

      Get

      - -

      -The go get command now supports Fossil source code repositories. -

      - -

      Pprof

      - -

      -The blocking and mutex profiles produced by the runtime/pprof package -now include symbol information, so they can be viewed -in go tool pprof -without the binary that produced the profile. -(All other profile types were changed to include symbol information in Go 1.9.) -

      - -

      -The go tool pprof -profile visualizer has been updated to git version 9e20b5b (2017-11-08) -from github.com/google/pprof, -which includes an updated web interface. -

      - -

      Vet

      - -

      -The go vet command now always has access to -complete, up-to-date type information when checking packages, even for packages using cgo or vendored imports. -The reports should be more accurate as a result. -Note that only go vet has access to this information; -the more low-level go tool vet does not -and should be avoided except when working on vet itself. -(As of Go 1.9, go vet provides access to all the same flags as -go tool vet.) -

      - -

      Diagnostics

      - -

      -This release includes a new overview of available Go program diagnostic tools. -

      - -

      Gofmt

      - -

      -Two minor details of the default formatting of Go source code have changed. -First, certain complex three-index slice expressions previously formatted like -x[i+1 : j:k] and now -format with more consistent spacing: x[i+1 : j : k]. -Second, single-method interface literals written on a single line, -which are sometimes used in type assertions, -are no longer split onto multiple lines. -

      - -

      -Note that these kinds of minor updates to gofmt are expected from time to time. -In general, we recommend against building systems that check that source code -matches the output of a specific version of gofmt. -For example, a continuous integration test that fails if any code already checked into -a repository is not “properly formatted” is inherently fragile and not recommended. -

      - -

      -If multiple programs must agree about which version of gofmt is used to format a source file, -we recommend that they do this by arranging to invoke the same gofmt binary. -For example, in the Go open source repository, our Git pre-commit hook is written in Go -and could import go/format directly, but instead it invokes the gofmt -binary found in the current path, so that the pre-commit hook need not be recompiled -each time gofmt changes. -

      - -

      Compiler Toolchain

      - -

      -The compiler includes many improvements to the performance of generated code, -spread fairly evenly across the supported architectures. -

      - -

      -The DWARF debug information recorded in binaries has been improved in a few ways: -constant values are now recorded; -line number information is more accurate, making source-level stepping through a program work better; -and each package is now presented as its own DWARF compilation unit. -

      - -

      -The various build modes -have been ported to more systems. -Specifically, c-shared now works on linux/ppc64le, windows/386, and windows/amd64; -pie now works on darwin/amd64 and also forces the use of external linking on all systems; -and plugin now works on linux/ppc64le and darwin/amd64. -

      - -

      -The linux/ppc64le port now requires the use of external linking -with any programs that use cgo, even uses by the standard library. -

      - -

      Assembler

      - -

      -For the ARM 32-bit port, the assembler now supports the instructions -BFC, -BFI, -BFX, -BFXU, -FMULAD, -FMULAF, -FMULSD, -FMULSF, -FNMULAD, -FNMULAF, -FNMULSD, -FNMULSF, -MULAD, -MULAF, -MULSD, -MULSF, -NMULAD, -NMULAF, -NMULD, -NMULF, -NMULSD, -NMULSF, -XTAB, -XTABU, -XTAH, -and -XTAHU. -

      - -

      -For the ARM 64-bit port, the assembler now supports the -VADD, -VADDP, -VADDV, -VAND, -VCMEQ, -VDUP, -VEOR, -VLD1, -VMOV, -VMOVI, -VMOVS, -VORR, -VREV32, -and -VST1 -instructions. -

      - -

      -For the PowerPC 64-bit port, the assembler now supports the POWER9 instructions -ADDEX, -CMPEQB, -COPY, -DARN, -LDMX, -MADDHD, -MADDHDU, -MADDLD, -MFVSRLD, -MTVSRDD, -MTVSRWS, -PASTECC, -VCMPNEZB, -VCMPNEZBCC, -and -VMSUMUDM. -

      - -

      -For the S390X port, the assembler now supports the -TMHH, -TMHL, -TMLH, -and -TMLL -instructions. -

      - -

      -For the X86 64-bit port, the assembler now supports 359 new instructions, -including the full AVX, AVX2, BMI, BMI2, F16C, FMA3, SSE2, SSE3, SSSE3, SSE4.1, and SSE4.2 extension sets. -The assembler also no longer implements MOVL $0, AX -as an XORL instruction, -to avoid clearing the condition flags unexpectedly. -

      - -

      Gccgo

      - -

      -Due to the alignment of Go's semiannual release schedule with GCC's -annual release schedule, -GCC release 7 contains the Go 1.8.3 version of gccgo. -We expect that the next release, GCC 8, will contain the Go 1.10 -version of gccgo. -

      - -

      Runtime

      - -

      -The behavior of nested calls to -LockOSThread and -UnlockOSThread -has changed. -These functions control whether a goroutine is locked to a specific operating system thread, -so that the goroutine only runs on that thread, and the thread only runs that goroutine. -Previously, calling LockOSThread more than once in a row -was equivalent to calling it once, and a single UnlockOSThread -always unlocked the thread. -Now, the calls nest: if LockOSThread is called multiple times, -UnlockOSThread must be called the same number of times -in order to unlock the thread. -Existing code that was careful not to nest these calls will remain correct. -Existing code that incorrectly assumed the calls nested will become correct. -Most uses of these functions in public Go source code falls into the second category. -

      - -

      -Because one common use of LockOSThread and UnlockOSThread -is to allow Go code to reliably modify thread-local state (for example, Linux or Plan 9 name spaces), -the runtime now treats locked threads as unsuitable for reuse or for creating new threads. -

      - -

      -Stack traces no longer include implicit wrapper functions (previously marked <autogenerated>), -unless a fault or panic happens in the wrapper itself. -As a result, skip counts passed to functions like Caller -should now always match the structure of the code as written, rather than depending on -optimization decisions and implementation details. -

      - -

      -The garbage collector has been modified to reduce its impact on allocation latency. -It now uses a smaller fraction of the overall CPU when running, but it may run more of the time. -The total CPU consumed by the garbage collector has not changed significantly. -

      - -

      -The GOROOT function -now defaults (when the $GOROOT environment variable is not set) -to the GOROOT or GOROOT_FINAL in effect -at the time the calling program was compiled. -Previously it used the GOROOT or GOROOT_FINAL in effect -at the time the toolchain that compiled the calling program was compiled. -

      - -

      -There is no longer a limit on the GOMAXPROCS setting. -(In Go 1.9 the limit was 1024.) -

      - -

      Performance

      - -

      -As always, the changes are so general and varied that precise -statements about performance are difficult to make. Most programs -should run a bit faster, due to speedups in the garbage collector, -better generated code, and optimizations in the core library. -

      - -

      Garbage Collector

      - -

      -Many applications should experience significantly lower allocation latency and overall performance overhead when the garbage collector is active. -

      - -

      Core library

      - -

      -All of the changes to the standard library are minor. -The changes in bytes -and net/url are the most likely to require updating of existing programs. -

      - -

      Minor changes to the library

      - -

      -As always, there are various minor changes and updates to the library, -made with the Go 1 promise of compatibility -in mind. -

      - -
      archive/tar
      -
      -

      -In general, the handling of special header formats is significantly improved and expanded. -

      -

      -FileInfoHeader has always -recorded the Unix UID and GID numbers from its os.FileInfo argument -(specifically, from the system-dependent information returned by the FileInfo's Sys method) -in the returned Header. -Now it also records the user and group names corresponding to those IDs, -as well as the major and minor device numbers for device files. -

      -

      -The new Header.Format field -of type Format -controls which tar header format the Writer uses. -The default, as before, is to select the most widely-supported header type -that can encode the fields needed by the header (USTAR if possible, or else PAX if possible, or else GNU). -The Reader sets Header.Format for each header it reads. -

      -

      -Reader and the Writer now support arbitrary PAX records, -using the new Header.PAXRecords field, -a generalization of the existing Xattrs field. -

      -

      -The Reader no longer insists that the file name or link name in GNU headers -be valid UTF-8. -

      -

      -When writing PAX- or GNU-format headers, the Writer now includes -the Header.AccessTime and Header.ChangeTime fields (if set). -When writing PAX-format headers, the times include sub-second precision. -

      -
      - -
      archive/zip
      -
      -

      -Go 1.10 adds more complete support for times and character set encodings in ZIP archives. -

      -

      -The original ZIP format used the standard MS-DOS encoding of year, month, day, hour, minute, and second into fields in two 16-bit values. -That encoding cannot represent time zones or odd seconds, so multiple extensions have been -introduced to allow richer encodings. -In Go 1.10, the Reader and Writer -now support the widely-understood Info-Zip extension that encodes the time separately in the 32-bit Unix “seconds since epoch” form. -The FileHeader's new Modified field of type time.Time -obsoletes the ModifiedTime and ModifiedDate fields, which continue to hold the MS-DOS encoding. -The Reader and Writer now adopt the common -convention that a ZIP archive storing a time zone-independent Unix time -also stores the local time in the MS-DOS field, -so that the time zone offset can be inferred. -For compatibility, the ModTime and -SetModTime methods -behave the same as in earlier releases; new code should use Modified directly. -

      -

      -The header for each file in a ZIP archive has a flag bit indicating whether -the name and comment fields are encoded as UTF-8, as opposed to a system-specific default encoding. -In Go 1.8 and earlier, the Writer never set the UTF-8 bit. -In Go 1.9, the Writer changed to set the UTF-8 bit almost always. -This broke the creation of ZIP archives containing Shift-JIS file names. -In Go 1.10, the Writer now sets the UTF-8 bit only when -both the name and the comment field are valid UTF-8 and at least one is non-ASCII. -Because non-ASCII encodings very rarely look like valid UTF-8, the new -heuristic should be correct nearly all the time. -Setting a FileHeader's new NonUTF8 field to true -disables the heuristic entirely for that file. -

      -

      -The Writer also now supports setting the end-of-central-directory record's comment field, -by calling the Writer's new SetComment method. -

      -
      - -
      bufio
      -
      -

      -The new Reader.Size -and Writer.Size -methods report the Reader or Writer's underlying buffer size. -

      -
      - -
      bytes
      -
      -

      -The -Fields, -FieldsFunc, -Split, -and -SplitAfter -functions have always returned subslices of their inputs. -Go 1.10 changes each returned subslice to have capacity equal to its length, -so that appending to one cannot overwrite adjacent data in the original input. -

      -
      - -
      crypto/cipher
      -
      -

      -NewOFB now panics if given -an initialization vector of incorrect length, like the other constructors in the -package always have. -(Previously it returned a nil Stream implementation.) -

      -
      - -
      crypto/tls
      -
      -

      -The TLS server now advertises support for SHA-512 signatures when using TLS 1.2. -The server already supported the signatures, but some clients would not select -them unless explicitly advertised. -

      -
      - -
      crypto/x509
      -
      -

      -Certificate.Verify -now enforces the name constraints for all -names contained in the certificate, not just the one name that a client has asked about. -Extended key usage restrictions are similarly now checked all at once. -As a result, after a certificate has been validated, now it can be trusted in its entirety. -It is no longer necessary to revalidate the certificate for each additional name -or key usage. -

      - -

      -Parsed certificates also now report URI names and IP, email, and URI constraints, using the new -Certificate fields -URIs, PermittedIPRanges, ExcludedIPRanges, -PermittedEmailAddresses, ExcludedEmailAddresses, -PermittedURIDomains, and ExcludedURIDomains. Certificates with -invalid values for those fields are now rejected. -

      - -

      -The new MarshalPKCS1PublicKey -and ParsePKCS1PublicKey -functions convert an RSA public key to and from PKCS#1-encoded form. -

      - -

      -The new MarshalPKCS8PrivateKey -function converts a private key to PKCS#8-encoded form. -(ParsePKCS8PrivateKey -has existed since Go 1.) -

      -
      - -
      crypto/x509/pkix
      -
      -

      -Name now implements a -String method that -formats the X.509 distinguished name in the standard RFC 2253 format. -

      -
      - -
      database/sql/driver
      -
      -

      -Drivers that currently hold on to the destination buffer provided by -driver.Rows.Next should ensure they no longer -write to a buffer assigned to the destination array outside of that call. -Drivers must be careful that underlying buffers are not modified when closing -driver.Rows. -

      -

      -Drivers that want to construct a sql.DB for -their clients can now implement the Connector interface -and call the new sql.OpenDB function, -instead of needing to encode all configuration into a string -passed to sql.Open. -

      -

      -Drivers that want to parse the configuration string only once per sql.DB -instead of once per sql.Conn, -or that want access to each sql.Conn's underlying context, -can make their Driver -implementations also implement DriverContext's -new OpenConnector method. -

      -

      -Drivers that implement ExecerContext -no longer need to implement Execer; -similarly, drivers that implement QueryerContext -no longer need to implement Queryer. -Previously, even if the context-based interfaces were implemented they were ignored -unless the non-context-based interfaces were also implemented. -

      -

      -To allow drivers to better isolate different clients using a cached driver connection in succession, -if a Conn implements the new -SessionResetter interface, -database/sql will now call ResetSession before -reusing the Conn for a new client. -

      -
      - -
      debug/elf
      -
      -

      -This release adds 348 new relocation constants divided between the relocation types -R_386, -R_AARCH64, -R_ARM, -R_PPC64, -and -R_X86_64. -

      -
      - -
      debug/macho
      -
      -

      -Go 1.10 adds support for reading relocations from Mach-O sections, -using the Section struct's new Relocs field -and the new Reloc, -RelocTypeARM, -RelocTypeARM64, -RelocTypeGeneric, -and -RelocTypeX86_64 -types and associated constants. -

      -

      -Go 1.10 also adds support for the LC_RPATH load command, -represented by the types -RpathCmd and -Rpath, -and new named constants -for the various flag bits found in headers. -

      -
      - -
      encoding/asn1
      -
      -

      -Marshal now correctly encodes -strings containing asterisks as type UTF8String instead of PrintableString, -unless the string is in a struct field with a tag forcing the use of PrintableString. -Marshal also now respects struct tags containing application directives. -

      -

      -The new MarshalWithParams -function marshals its argument as if the additional params were its associated -struct field tag. -

      -

      -Unmarshal now respects -struct field tags using the explicit and tag -directives. -

      -

      -Both Marshal and Unmarshal now support a new struct field tag -numeric, indicating an ASN.1 NumericString. -

      -
      - -
      encoding/csv
      -
      -

      -Reader now disallows the use of -nonsensical Comma and Comment settings, -such as NUL, carriage return, newline, invalid runes, and the Unicode replacement character, -or setting Comma and Comment equal to each other. -

      -

      -In the case of a syntax error in a CSV record that spans multiple input lines, Reader -now reports the line on which the record started in the ParseError's new StartLine field. -

      -
      - -
      encoding/hex
      -
      -

      -The new functions -NewEncoder -and -NewDecoder -provide streaming conversions to and from hexadecimal, -analogous to equivalent functions already in -encoding/base32 -and -encoding/base64. -

      - -

      -When the functions -Decode -and -DecodeString -encounter malformed input, -they now return the number of bytes already converted -along with the error. -Previously they always returned a count of 0 with any error. -

      -
      - -
      encoding/json
      -
      -

      -The Decoder -adds a new method -DisallowUnknownFields -that causes it to report inputs with unknown JSON fields as a decoding error. -(The default behavior has always been to discard unknown fields.) -

      - -

      -As a result of fixing a reflect bug, -Unmarshal -can no longer decode into fields inside -embedded pointers to unexported struct types, -because it cannot initialize the unexported embedded pointer -to point at fresh storage. -Unmarshal now returns an error in this case. -

      -
      - -
      encoding/pem
      -
      -

      -Encode -and -EncodeToMemory -no longer generate partial output when presented with a -block that is impossible to encode as PEM data. -

      -
      - -
      encoding/xml
      -
      -

      -The new function -NewTokenDecoder -is like -NewDecoder -but creates a decoder reading from a TokenReader -instead of an XML-formatted byte stream. -This is meant to enable the construction of XML stream transformers in client libraries. -

      -
      - -
      flag
      -
      -

      -The default -Usage function now prints -its first line of output to -CommandLine.Output() -instead of assuming os.Stderr, -so that the usage message is properly redirected for -clients using CommandLine.SetOutput. -

      -

      -PrintDefaults now -adds appropriate indentation after newlines in flag usage strings, -so that multi-line usage strings display nicely. -

      -

      -FlagSet adds new methods -ErrorHandling, -Name, -and -Output, -to retrieve the settings passed to -NewFlagSet -and -FlagSet.SetOutput. -

      -
      - -
      go/doc
      -
      -

      -To support the doc change described above, -functions returning slices of T, *T, **T, and so on -are now reported in T's Type's Funcs list, -instead of in the Package's Funcs list. -

      -
      - -
      go/importer
      -
      -

      -The For function now accepts a non-nil lookup argument. -

      -
      - -
      go/printer
      -
      -

      -The changes to the default formatting of Go source code -discussed in the gofmt section above -are implemented in the go/printer package -and also affect the output of the higher-level go/format package. -

      -
      - -
      hash
      -
      -

      -Implementations of the Hash interface are now -encouraged to implement encoding.BinaryMarshaler -and encoding.BinaryUnmarshaler -to allow saving and recreating their internal state, -and all implementations in the standard library -(hash/crc32, crypto/sha256, and so on) -now implement those interfaces. -

      -
      - -
      html/template
      -
      -

      -The new Srcset content -type allows for proper handling of values within the -srcset -attribute of img tags. -

      -
      - -
      math/big
      -
      -

      -Int now supports conversions to and from bases 2 through 62 -in its SetString and Text methods. -(Previously it only allowed bases 2 through 36.) -The value of the constant MaxBase has been updated. -

      -

      -Int adds a new -CmpAbs method -that is like Cmp but -compares only the absolute values (not the signs) of its arguments. -

      -

      -Float adds a new -Sqrt method to -compute square roots. -

      -
      - -
      math/cmplx
      -
      -

      -Branch cuts and other boundary cases in -Asin, -Asinh, -Atan, -and -Sqrt -have been corrected to match the definitions used in the C99 standard. -

      -
      - -
      math/rand
      -
      -

      -The new Shuffle function and corresponding -Rand.Shuffle method -shuffle an input sequence. -

      -
      - -
      math
      -
      -

      -The new functions -Round -and -RoundToEven -round their arguments to the nearest floating-point integer; -Round rounds a half-integer to its larger integer neighbor (away from zero) -while RoundToEven rounds a half-integer to its even integer neighbor. -

      - -

      -The new functions -Erfinv -and -Erfcinv -compute the inverse error function and the -inverse complementary error function. -

      -
      - -
      mime/multipart
      -
      -

      -Reader -now accepts parts with empty filename attributes. -

      -
      - -
      mime
      -
      -

      -ParseMediaType now discards -invalid attribute values; previously it returned those values as empty strings. -

      -
      - -
      net
      -
      -

      -The Conn and -Listener implementations -in this package now guarantee that when Close returns, -the underlying file descriptor has been closed. -(In earlier releases, if the Close stopped pending I/O -in other goroutines, the closing of the file descriptor could happen in one of those -goroutines shortly after Close returned.) -

      - -

      -TCPListener and -UnixListener -now implement -syscall.Conn, -to allow setting options on the underlying file descriptor -using syscall.RawConn.Control. -

      - -

      -The Conn implementations returned by Pipe -now support setting read and write deadlines. -

      - -

      -The IPConn.ReadMsgIP, -IPConn.WriteMsgIP, -UDPConn.ReadMsgUDP, -and -UDPConn.WriteMsgUDP, -methods are now implemented on Windows. -

      -
      - -
      net/http
      -
      -

      -On the client side, an HTTP proxy (most commonly configured by -ProxyFromEnvironment) -can now be specified as an https:// URL, -meaning that the client connects to the proxy over HTTPS before issuing a standard, proxied HTTP request. -(Previously, HTTP proxy URLs were required to begin with http:// or socks5://.) -

      -

      -On the server side, FileServer and its single-file equivalent ServeFile -now apply If-Range checks to HEAD requests. -FileServer also now reports directory read failures to the Server's ErrorLog. -The content-serving handlers also now omit the Content-Type header when serving zero-length content. -

      -

      -ResponseWriter's WriteHeader method now panics -if passed an invalid (non-3-digit) status code. -

      -

      - -The Server will no longer add an implicit Content-Type when a Handler does not write any output. -

      -

      -Redirect now sets the Content-Type header before writing its HTTP response. -

      -
      - -
      net/mail
      -
      -

      -ParseAddress and -ParseAddressList -now support a variety of obsolete address formats. -

      -
      - -
      net/smtp
      -
      -

      -The Client adds a new -Noop method, -to test whether the server is still responding. -It also now defends against possible SMTP injection in the inputs -to the Hello -and Verify methods. -

      -
      - -
      net/textproto
      -
      -

      -ReadMIMEHeader -now rejects any header that begins with a continuation (indented) header line. -Previously a header with an indented first line was treated as if the first line -were not indented. -

      -
      - -
      net/url
      -
      -

      -ResolveReference -now preserves multiple leading slashes in the target URL. -Previously it rewrote multiple leading slashes to a single slash, -which resulted in the http.Client -following certain redirects incorrectly. -

      -

      -For example, this code's output has changed: -

      -
      -base, _ := url.Parse("http://host//path//to/page1")
      -target, _ := url.Parse("page2")
      -fmt.Println(base.ResolveReference(target))
      -
      -

      -Note the doubled slashes around path. -In Go 1.9 and earlier, the resolved URL was http://host/path//to/page2: -the doubled slash before path was incorrectly rewritten -to a single slash, while the doubled slash after path was -correctly preserved. -Go 1.10 preserves both doubled slashes, resolving to http://host//path//to/page2 -as required by RFC 3986. -

      - -

      This change may break existing buggy programs that unintentionally -construct a base URL with a leading doubled slash in the path and inadvertently -depend on ResolveReference to correct that mistake. -For example, this can happen if code adds a host prefix -like http://host/ to a path like /my/api, -resulting in a URL with a doubled slash: http://host//my/api. -

      - -

      -UserInfo's methods -now treat a nil receiver as equivalent to a pointer to a zero UserInfo. -Previously, they panicked. -

      -
      - -
      os
      -
      -

      -File adds new methods -SetDeadline, -SetReadDeadline, -and -SetWriteDeadline -that allow setting I/O deadlines when the -underlying file descriptor supports non-blocking I/O operations. -The definition of these methods matches those in net.Conn. -If an I/O method fails due to missing a deadline, it will return a -timeout error; the -new IsTimeout function -reports whether an error represents a timeout. -

      - -

      -Also matching net.Conn, -File's -Close method -now guarantee that when Close returns, -the underlying file descriptor has been closed. -(In earlier releases, -if the Close stopped pending I/O -in other goroutines, the closing of the file descriptor could happen in one of those -goroutines shortly after Close returned.) -

      - -

      -On BSD, macOS, and Solaris systems, -Chtimes -now supports setting file times with nanosecond precision -(assuming the underlying file system can represent them). -

      -
      - -
      reflect
      -
      -

      -The Copy function now allows copying -from a string into a byte array or byte slice, to match the -built-in copy function. -

      - -

      -In structs, embedded pointers to unexported struct types were -previously incorrectly reported with an empty PkgPath -in the corresponding StructField, -with the result that for those fields, -and Value.CanSet -incorrectly returned true and -Value.Set -incorrectly succeeded. -The underlying metadata has been corrected; -for those fields, -CanSet now correctly returns false -and Set now correctly panics. -This may affect reflection-based unmarshalers -that could previously unmarshal into such fields -but no longer can. -For example, see the encoding/json notes. -

      -
      - -
      runtime/pprof
      -
      -

      -As noted above, the blocking and mutex profiles -now include symbol information so that they can be viewed without needing -the binary that generated them. -

      -
      - -
      strconv
      -
      -

      -ParseUint now returns -the maximum magnitude integer of the appropriate size -with any ErrRange error, as it was already documented to do. -Previously it returned 0 with ErrRange errors. -

      -
      - -
      strings
      -
      -

      -A new type -Builder is a replacement for -bytes.Buffer for the use case of -accumulating text into a string result. -The Builder's API is a restricted subset of bytes.Buffer's -that allows it to safely avoid making a duplicate copy of the data -during the String method. -

      -
      - -
      syscall
      -
      -

      -On Windows, -the new SysProcAttr field Token, -of type Token allows the creation of a process that -runs as another user during StartProcess -(and therefore also during os.StartProcess and -exec.Cmd.Start). -The new function CreateProcessAsUser -gives access to the underlying system call. -

      - -

      -On BSD, macOS, and Solaris systems, UtimesNano -is now implemented. -

      -
      - -
      time
      -
      -

      -LoadLocation now uses the directory -or uncompressed zip file named by the $ZONEINFO -environment variable before looking in the default system-specific list of -known installation locations or in $GOROOT/lib/time/zoneinfo.zip. -

      -

      -The new function LoadLocationFromTZData -allows conversion of IANA time zone file data to a Location. -

      -
      - -
      unicode
      -
      -

      -The unicode package and associated -support throughout the system has been upgraded from Unicode 9.0 to -Unicode 10.0, -which adds 8,518 new characters, including four new scripts, one new property, -a Bitcoin currency symbol, and 56 new emoji. -

      -
      diff --git a/doc/go1.11.html b/doc/go1.11.html deleted file mode 100644 index 483ecd872f..0000000000 --- a/doc/go1.11.html +++ /dev/null @@ -1,934 +0,0 @@ - - - - - - -

      Introduction to Go 1.11

      - -

      - The latest Go release, version 1.11, arrives six months after Go 1.10. - Most of its changes are in the implementation of the toolchain, runtime, and libraries. - As always, the release maintains the Go 1 promise of compatibility. - We expect almost all Go programs to continue to compile and run as before. -

      - -

      Changes to the language

      - -

      - There are no changes to the language specification. -

      - -

      Ports

      - -

      - As announced in the Go 1.10 release notes, Go 1.11 now requires - OpenBSD 6.2 or later, macOS 10.10 Yosemite or later, or Windows 7 or later; - support for previous versions of these operating systems has been removed. -

      - -

      - Go 1.11 supports the upcoming OpenBSD 6.4 release. Due to changes in - the OpenBSD kernel, older versions of Go will not work on OpenBSD 6.4. -

      - -

      - There are known issues with NetBSD on i386 hardware. -

      - -

      - The race detector is now supported on linux/ppc64le - and, to a lesser extent, on netbsd/amd64. The NetBSD race detector support - has known issues. -

      - -

      - The memory sanitizer (-msan) is now supported on linux/arm64. -

      - -

      - The build modes c-shared and c-archive are now supported on - freebsd/amd64. -

      - -

      - On 64-bit MIPS systems, the new environment variable settings - GOMIPS64=hardfloat (the default) and - GOMIPS64=softfloat select whether to use - hardware instructions or software emulation for floating-point computations. - For 32-bit systems, the environment variable is still GOMIPS, - as added in Go 1.10. -

      - -

      - On soft-float ARM systems (GOARM=5), Go now uses a more - efficient software floating point interface. This is transparent to - Go code, but ARM assembly that uses floating-point instructions not - guarded on GOARM will break and must be ported to - the new interface. -

      - -

      - Go 1.11 on ARMv7 no longer requires a Linux kernel configured - with KUSER_HELPERS. This setting is enabled in default - kernel configurations, but is sometimes disabled in stripped-down - configurations. -

      - -

      WebAssembly

      -

      - Go 1.11 adds an experimental port to WebAssembly - (js/wasm). -

      -

      - Go programs currently compile to one WebAssembly module that - includes the Go runtime for goroutine scheduling, garbage - collection, maps, etc. - As a result, the resulting size is at minimum around - 2 MB, or 500 KB compressed. Go programs can call into JavaScript - using the new experimental - syscall/js package. - Binary size and interop with other languages has not yet been a - priority but may be addressed in future releases. -

      -

      - As a result of the addition of the new GOOS value - "js" and GOARCH value "wasm", - Go files named *_js.go or *_wasm.go will - now be ignored by Go - tools except when those GOOS/GOARCH values are being used. - If you have existing filenames matching those patterns, you will need to rename them. -

      -

      - More information can be found on the - WebAssembly wiki page. -

      - -

      RISC-V GOARCH values reserved

      -

      - The main Go compiler does not yet support the RISC-V architecture - but we've reserved the GOARCH values - "riscv" and "riscv64", as used by Gccgo, - which does support RISC-V. This means that Go files - named *_riscv.go will now also - be ignored by Go - tools except when those GOOS/GOARCH values are being used. -

      - -

      Tools

      - -

      Modules, package versioning, and dependency management

      -

      - Go 1.11 adds preliminary support for a new concept called “modules,” - an alternative to GOPATH with integrated support for versioning and - package distribution. - Using modules, developers are no longer confined to working inside GOPATH, - version dependency information is explicit yet lightweight, - and builds are more reliable and reproducible. -

      - -

      - Module support is considered experimental. - Details are likely to change in response to feedback from Go 1.11 users, - and we have more tools planned. - Although the details of module support may change, projects that convert - to modules using Go 1.11 will continue to work with Go 1.12 and later. - If you encounter bugs using modules, - please file issues - so we can fix them. For more information, see the - go command documentation. -

      - -

      Import path restriction

      - -

      - Because Go module support assigns special meaning to the - @ symbol in command line operations, - the go command now disallows the use of - import paths containing @ symbols. - Such import paths were never allowed by go get, - so this restriction can only affect users building - custom GOPATH trees by other means. -

      - -

      Package loading

      - -

      - The new package - golang.org/x/tools/go/packages - provides a simple API for locating and loading packages of Go source code. - Although not yet part of the standard library, for many tasks it - effectively replaces the go/build - package, whose API is unable to fully support modules. - Because it runs an external query command such as - go list - to obtain information about Go packages, it enables the construction of - analysis tools that work equally well with alternative build systems - such as Bazel - and Buck. -

      - -

      Build cache requirement

      - -

      - Go 1.11 will be the last release to support setting the environment - variable GOCACHE=off to disable the - build cache, - introduced in Go 1.10. - Starting in Go 1.12, the build cache will be required, - as a step toward eliminating $GOPATH/pkg. - The module and package loading support described above - already require that the build cache be enabled. - If you have disabled the build cache to avoid problems you encountered, - please file an issue to let us know about them. -

      - -

      Compiler toolchain

      - -

      - More functions are now eligible for inlining by default, including - functions that call panic. -

      - -

      - The compiler toolchain now supports column information - in line - directives. -

      - -

      - A new package export data format has been introduced. - This should be transparent to end users, except for speeding up - build times for large Go projects. - If it does cause problems, it can be turned off again by - passing -gcflags=all=-iexport=false to - the go tool when building a binary. -

      - -

      - The compiler now rejects unused variables declared in a type switch - guard, such as x in the following example: -

      -
      -func f(v interface{}) {
      -	switch x := v.(type) {
      -	}
      -}
      -
      -

      - This was already rejected by both gccgo - and go/types. -

      - -

      Assembler

      - -

      - The assembler for amd64 now accepts AVX512 instructions. -

      - -

      Debugging

      - -

      - The compiler now produces significantly more accurate debug - information for optimized binaries, including variable location - information, line numbers, and breakpoint locations. - - This should make it possible to debug binaries - compiled without -N -l. - - There are still limitations to the quality of the debug information, - some of which are fundamental, and some of which will continue to - improve with future releases. -

      - -

      - DWARF sections are now compressed by default because of the expanded - and more accurate debug information produced by the compiler. - - This is transparent to most ELF tools (such as debuggers on Linux - and *BSD) and is supported by the Delve debugger on all platforms, - but has limited support in the native tools on macOS and Windows. - - To disable DWARF compression, - pass -ldflags=-compressdwarf=false to - the go tool when building a binary. -

      - -

      - Go 1.11 adds experimental support for calling Go functions from - within a debugger. - - This is useful, for example, to call String methods - when paused at a breakpoint. - - This is currently only supported by Delve (version 1.1.0 and up). -

      - -

      Test

      - -

      - Since Go 1.10, the go test command runs - go vet on the package being tested, - to identify problems before running the test. Since vet - typechecks the code with go/types - before running, tests that do not typecheck will now fail. - - In particular, tests that contain an unused variable inside a - closure compiled with Go 1.10, because the Go compiler incorrectly - accepted them (Issue #3059), - but will now fail, since go/types correctly reports an - "unused variable" error in this case. -

      - -

      - The -memprofile flag - to go test now defaults to the - "allocs" profile, which records the total bytes allocated since the - test began (including garbage-collected bytes). -

      - -

      Vet

      - -

      - The go vet - command now reports a fatal error when the package under analysis - does not typecheck. Previously, a type checking error simply caused - a warning to be printed, and vet to exit with status 1. -

      - -

      - Additionally, go vet - has become more robust when format-checking printf wrappers. - Vet now detects the mistake in this example: -

      - -
      -func wrapper(s string, args ...interface{}) {
      -	fmt.Printf(s, args...)
      -}
      -
      -func main() {
      -	wrapper("%s", 42)
      -}
      -
      - -

      Trace

      - -

      - With the new runtime/trace - package's user - annotation API, users can record application-level information - in execution traces and create groups of related goroutines. - The go tool trace - command visualizes this information in the trace view and the new - user task/region analysis page. -

      - -

      Cgo

      - -

      -Since Go 1.10, cgo has translated some C pointer types to the Go -type uintptr. These types include -the CFTypeRef hierarchy in Darwin's CoreFoundation -framework and the jobject hierarchy in Java's JNI -interface. In Go 1.11, several improvements have been made to the code -that detects these types. Code that uses these types may need some -updating. See the Go 1.10 release notes for -details. -

      - -

      Go command

      - -

      - The environment variable GOFLAGS may now be used - to set default flags for the go command. - This is useful in certain situations. - Linking can be noticeably slower on underpowered systems due to DWARF, - and users may want to set -ldflags=-w by default. - For modules, some users and CI systems will want vendoring always, - so they should set -mod=vendor by default. - For more information, see the go - command documentation. -

      - -

      Godoc

      - -

      - Go 1.11 will be the last release to support godoc's command-line interface. - In future releases, godoc will only be a web server. Users should use - go doc for command-line help output instead. -

      - -

      - The godoc web server now shows which version of Go introduced - new API features. The initial Go version of types, funcs, and methods are shown - right-aligned. For example, see UserCacheDir, with "1.11" - on the right side. For struct fields, inline comments are added when the struct field was - added in a Go version other than when the type itself was introduced. - For a struct field example, see - ClientTrace.Got1xxResponse. -

      - -

      Gofmt

      - -

      - One minor detail of the default formatting of Go source code has changed. - When formatting expression lists with inline comments, the comments were - aligned according to a heuristic. - However, in some cases the alignment would be split up too easily, or - introduce too much whitespace. - The heuristic has been changed to behave better for human-written code. -

      - -

      - Note that these kinds of minor updates to gofmt are expected from time to - time. - In general, systems that need consistent formatting of Go source code should - use a specific version of the gofmt binary. - See the go/format package documentation for more - information. -

      - -

      Run

      - -

      - - The go run - command now allows a single import path, a directory name or a - pattern matching a single package. - This allows go run pkg or go run dir, most importantly go run . -

      - -

      Runtime

      - -

      - The runtime now uses a sparse heap layout so there is no longer a - limit to the size of the Go heap (previously, the limit was 512GiB). - This also fixes rare "address space conflict" failures in mixed Go/C - binaries or binaries compiled with -race. -

      - -

      - On macOS and iOS, the runtime now uses libSystem.dylib instead of - calling the kernel directly. This should make Go binaries more - compatible with future versions of macOS and iOS. - The syscall package still makes direct - system calls; fixing this is planned for a future release. -

      - -

      Performance

      - -

      -As always, the changes are so general and varied that precise -statements about performance are difficult to make. Most programs -should run a bit faster, due to better generated code and -optimizations in the core library. -

      - -

      -There were multiple performance changes to the math/big -package as well as many changes across the tree specific to GOARCH=arm64. -

      - -

      Compiler toolchain

      - -

      - The compiler now optimizes map clearing operations of the form: -

      -
      -for k := range m {
      -	delete(m, k)
      -}
      -
      - -

      - The compiler now optimizes slice extension of the form - append(s, make([]T, n)...). -

      - -

      - The compiler now performs significantly more aggressive bounds-check - and branch elimination. Notably, it now recognizes transitive - relations, so if i<j and j<len(s), - it can use these facts to eliminate the bounds check - for s[i]. It also understands simple arithmetic such - as s[i-10] and can recognize more inductive cases in - loops. Furthermore, the compiler now uses bounds information to more - aggressively optimize shift operations. -

      - -

      Core library

      - -

      - All of the changes to the standard library are minor. -

      - -

      Minor changes to the library

      - -

      - As always, there are various minor changes and updates to the library, - made with the Go 1 promise of compatibility - in mind. -

      - - - - - - -
      crypto
      -
      -

      - Certain crypto operations, including - ecdsa.Sign, - rsa.EncryptPKCS1v15 and - rsa.GenerateKey, - now randomly read an extra byte of randomness to ensure tests don't rely on internal behavior. -

      - -
      - -
      crypto/cipher
      -
      -

      - The new function NewGCMWithTagSize - implements Galois Counter Mode with non-standard tag lengths for compatibility with existing cryptosystems. -

      - -
      - -
      crypto/rsa
      -
      -

      - PublicKey now implements a - Size method that - returns the modulus size in bytes. -

      - -
      - -
      crypto/tls
      -
      -

      - ConnectionState's new - ExportKeyingMaterial - method allows exporting keying material bound to the - connection according to RFC 5705. -

      - -
      - -
      crypto/x509
      -
      -

      - The deprecated, legacy behavior of treating the CommonName field as - a hostname when no Subject Alternative Names are present is now disabled when the CN is not a - valid hostname. - The CommonName can be completely ignored by adding the experimental value - x509ignoreCN=1 to the GODEBUG environment variable. - When the CN is ignored, certificates without SANs validate under chains with name constraints - instead of returning NameConstraintsWithoutSANs. -

      - -

      - Extended key usage restrictions are again checked only if they appear in the KeyUsages - field of VerifyOptions, instead of always being checked. - This matches the behavior of Go 1.9 and earlier. -

      - -

      - The value returned by SystemCertPool - is now cached and might not reflect system changes between invocations. -

      - -
      - -
      debug/elf
      -
      -

      - More ELFOSABI - and EM - constants have been added. -

      - -
      - -
      encoding/asn1
      -
      -

      - Marshal and Unmarshal - now support "private" class annotations for fields. -

      - -
      - -
      encoding/base32
      -
      -

      - The decoder now consistently - returns io.ErrUnexpectedEOF for an incomplete - chunk. Previously it would return io.EOF in some - cases. -

      - -
      - -
      encoding/csv
      -
      -

      - The Reader now rejects attempts to set - the Comma - field to a double-quote character, as double-quote characters - already have a special meaning in CSV. -

      - -
      - - - -
      html/template
      -
      -

      - The package has changed its behavior when a typed interface - value is passed to an implicit escaper function. Previously such - a value was written out as (an escaped form) - of <nil>. Now such values are ignored, just - as an untyped nil value is (and always has been) - ignored. -

      - -
      - -
      image/gif
      -
      -

      - Non-looping animated GIFs are now supported. They are denoted by having a - LoopCount of -1. -

      - -
      - -
      io/ioutil
      -
      -

      - The TempFile - function now supports specifying where the random characters in - the filename are placed. If the prefix argument - includes a "*", the random string replaces the - "*". For example, a prefix argument of "myname.*.bat" will - result in a random filename such as - "myname.123456.bat". If no "*" is - included the old behavior is retained, and the random digits are - appended to the end. -

      - -
      - -
      math/big
      -
      - -

      - ModInverse now returns nil when g and n are not relatively prime. The result was previously undefined. -

      - -
      - -
      mime/multipart
      -
      -

      - The handling of form-data with missing/empty file names has been - restored to the behavior in Go 1.9: in the - Form for - the form-data part the value is available in - the Value field rather than the File - field. In Go releases 1.10 through 1.10.3 a form-data part with - a missing/empty file name and a non-empty "Content-Type" field - was stored in the File field. This change was a - mistake in 1.10 and has been reverted to the 1.9 behavior. -

      - -
      - -
      mime/quotedprintable
      -
      -

      - To support invalid input found in the wild, the package now - permits non-ASCII bytes but does not validate their encoding. -

      - -
      - -
      net
      -
      -

      - The new ListenConfig type and the new - Dialer.Control field permit - setting socket options before accepting and creating connections, respectively. -

      - -

      - The syscall.RawConn Read - and Write methods now work correctly on Windows. -

      - -

      - The net package now automatically uses the - splice system call - on Linux when copying data between TCP connections in - TCPConn.ReadFrom, as called by - io.Copy. The result is faster, more efficient TCP proxying. -

      - -

      - The TCPConn.File, - UDPConn.File, - UnixConn.File, - and IPConn.File - methods no longer put the returned *os.File into - blocking mode. -

      - -
      - -
      net/http
      -
      -

      - The Transport type has a - new MaxConnsPerHost - option that permits limiting the maximum number of connections - per host. -

      - -

      - The Cookie type has a new - SameSite field - (of new type also named - SameSite) to represent the new cookie attribute recently supported by most browsers. - The net/http's Transport does not use the SameSite - attribute itself, but the package supports parsing and serializing the - attribute for browsers to use. -

      - -

      - It is no longer allowed to reuse a Server - after a call to - Shutdown or - Close. It was never officially supported - in the past and had often surprising behavior. Now, all future calls to the server's Serve - methods will return errors after a shutdown or close. -

      - - - -

      - The constant StatusMisdirectedRequest is now defined for HTTP status code 421. -

      - -

      - The HTTP server will no longer cancel contexts or send on - CloseNotifier - channels upon receiving pipelined HTTP/1.1 requests. Browsers do - not use HTTP pipelining, but some clients (such as - Debian's apt) may be configured to do so. -

      - -

      - ProxyFromEnvironment, which is used by the - DefaultTransport, now - supports CIDR notation and ports in the NO_PROXY environment variable. -

      - -
      - -
      net/http/httputil
      -
      -

      - The - ReverseProxy - has a new - ErrorHandler - option to permit changing how errors are handled. -

      - -

      - The ReverseProxy now also passes - "TE: trailers" request headers - through to the backend, as required by the gRPC protocol. -

      - -
      - -
      os
      -
      -

      - The new UserCacheDir function - returns the default root directory to use for user-specific cached data. -

      - -

      - The new ModeIrregular - is a FileMode bit to represent - that a file is not a regular file, but nothing else is known about it, or that - it's not a socket, device, named pipe, symlink, or other file type for which - Go has a defined mode bit. -

      - -

      - Symlink now works - for unprivileged users on Windows 10 on machines with Developer - Mode enabled. -

      - -

      - When a non-blocking descriptor is passed - to NewFile, the - resulting *File will be kept in non-blocking - mode. This means that I/O for that *File will use - the runtime poller rather than a separate thread, and that - the SetDeadline - methods will work. -

      - -
      - -
      os/signal
      -
      -

      - The new Ignored function reports - whether a signal is currently ignored. -

      - -
      - -
      os/user
      -
      -

      - The os/user package can now be built in pure Go - mode using the build tag "osusergo", - independent of the use of the environment - variable CGO_ENABLED=0. Previously the only way to use - the package's pure Go implementation was to disable cgo - support across the entire program. -

      - -
      - - - -
      runtime
      -
      - -

      - Setting the GODEBUG=tracebackancestors=N - environment variable now extends tracebacks with the stacks at - which goroutines were created, where N limits the - number of ancestor goroutines to report. -

      - -
      - -
      runtime/pprof
      -
      -

      - This release adds a new "allocs" profile type that profiles - total number of bytes allocated since the program began - (including garbage-collected bytes). This is identical to the - existing "heap" profile viewed in -alloc_space mode. - Now go test -memprofile=... reports an "allocs" profile - instead of "heap" profile. -

      - -
      - -
      sync
      -
      -

      - The mutex profile now includes reader/writer contention - for RWMutex. - Writer/writer contention was already included in the mutex - profile. -

      - -
      - -
      syscall
      -
      -

      - On Windows, several fields were changed from uintptr to a new - Pointer - type to avoid problems with Go's garbage collector. The same change was made - to the golang.org/x/sys/windows - package. For any code affected, users should first migrate away from the syscall - package to the golang.org/x/sys/windows package, and then change - to using the Pointer, while obeying the - unsafe.Pointer conversion rules. -

      - -

      - On Linux, the flags parameter to - Faccessat - is now implemented just as in glibc. In earlier Go releases the - flags parameter was ignored. -

      - -

      - On Linux, the flags parameter to - Fchmodat - is now validated. Linux's fchmodat doesn't support the flags parameter - so we now mimic glibc's behavior and return an error if it's non-zero. -

      - -
      - -
      text/scanner
      -
      -

      - The Scanner.Scan method now returns - the RawString token - instead of String - for raw string literals. -

      - -
      - -
      text/template
      -
      -

      - Modifying template variables via assignments is now permitted via the = token: -

      -
      -  {{"{{"}} $v := "init" {{"}}"}}
      -  {{"{{"}} if true {{"}}"}}
      -    {{"{{"}} $v = "changed" {{"}}"}}
      -  {{"{{"}} end {{"}}"}}
      -  v: {{"{{"}} $v {{"}}"}} {{"{{"}}/* "changed" */{{"}}"}}
      - -

      - In previous versions untyped nil values passed to - template functions were ignored. They are now passed as normal - arguments. -

      - -
      - -
      time
      -
      -

      - Parsing of timezones denoted by sign and offset is now - supported. In previous versions, numeric timezone names - (such as +03) were not considered valid, and only - three-letter abbreviations (such as MST) were accepted - when expecting a timezone name. -

      -
      diff --git a/doc/go1.12.html b/doc/go1.12.html deleted file mode 100644 index a8b0c87fe5..0000000000 --- a/doc/go1.12.html +++ /dev/null @@ -1,949 +0,0 @@ - - - - - - -

      Introduction to Go 1.12

      - -

      - The latest Go release, version 1.12, arrives six months after Go 1.11. - Most of its changes are in the implementation of the toolchain, runtime, and libraries. - As always, the release maintains the Go 1 promise of compatibility. - We expect almost all Go programs to continue to compile and run as before. -

      - -

      Changes to the language

      - -

      - There are no changes to the language specification. -

      - -

      Ports

      - -

      - The race detector is now supported on linux/arm64. -

      - -

      - Go 1.12 is the last release that is supported on FreeBSD 10.x, which has - already reached end-of-life. Go 1.13 will require FreeBSD 11.2+ or FreeBSD - 12.0+. - FreeBSD 12.0+ requires a kernel with the COMPAT_FREEBSD11 option set (this is the default). -

      - -

      - cgo is now supported on linux/ppc64. -

      - -

      - hurd is now a recognized value for GOOS, reserved - for the GNU/Hurd system for use with gccgo. -

      - -

      Windows

      - -

      - Go's new windows/arm port supports running Go on Windows 10 - IoT Core on 32-bit ARM chips such as the Raspberry Pi 3. -

      - -

      AIX

      - -

      - Go now supports AIX 7.2 and later on POWER8 architectures (aix/ppc64). External linking, cgo, pprof and the race detector aren't yet supported. -

      - -

      Darwin

      - -

      - Go 1.12 is the last release that will run on macOS 10.10 Yosemite. - Go 1.13 will require macOS 10.11 El Capitan or later. -

      - -

      - libSystem is now used when making syscalls on Darwin, - ensuring forward-compatibility with future versions of macOS and iOS. - - The switch to libSystem triggered additional App Store - checks for private API usage. Since it is considered private, - syscall.Getdirentries now always fails with - ENOSYS on iOS. - Additionally, syscall.Setrlimit - reports invalid argument in places where it historically - succeeded. These consequences are not specific to Go and users should expect - behavioral parity with libSystem's implementation going forward. -

      - -

      Tools

      - -

      go tool vet no longer supported

      - -

      - The go vet command has been rewritten to serve as the - base for a range of different source code analysis tools. See - the golang.org/x/tools/go/analysis - package for details. A side-effect is that go tool vet - is no longer supported. External tools that use go tool - vet must be changed to use go - vet. Using go vet instead of go tool - vet should work with all supported versions of Go. -

      - -

      - As part of this change, the experimental -shadow option - is no longer available with go vet. Checking for - variable shadowing may now be done using -

      -go get -u golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
      -go vet -vettool=$(which shadow)
      -
      -

      - -

      Tour

      - -

      -The Go tour is no longer included in the main binary distribution. To -run the tour locally, instead of running go tool tour, -manually install it: -

      -go get -u golang.org/x/tour
      -tour
      -
      -

      - -

      Build cache requirement

      - -

      - The build cache is now - required as a step toward eliminating - $GOPATH/pkg. Setting the environment variable - GOCACHE=off will cause go commands that write to the - cache to fail. -

      - -

      Binary-only packages

      - -

      - Go 1.12 is the last release that will support binary-only packages. -

      - -

      Cgo

      - -

      - Go 1.12 will translate the C type EGLDisplay to the Go type uintptr. - This change is similar to how Go 1.10 and newer treats Darwin's CoreFoundation - and Java's JNI types. See the - cgo documentation - for more information. -

      - -

      - Mangled C names are no longer accepted in packages that use Cgo. Use the Cgo - names instead. For example, use the documented cgo name C.char - rather than the mangled name _Ctype_char that cgo generates. -

      - -

      Modules

      - -

      - When GO111MODULE is set to on, the go - command now supports module-aware operations outside of a module directory, - provided that those operations do not need to resolve import paths relative to - the current directory or explicitly edit the go.mod file. - Commands such as go get, - go list, and - go mod download behave as if in a - module with initially-empty requirements. - In this mode, go env GOMOD reports - the system's null device (/dev/null or NUL). -

      - -

      - go commands that download and extract modules are now safe to - invoke concurrently. - The module cache (GOPATH/pkg/mod) must reside in a filesystem that - supports file locking. -

      - -

      - The go directive in a go.mod file now indicates the - version of the language used by the files within that module. - It will be set to the current release - (go 1.12) if no existing version is - present. - If the go directive for a module specifies a - version newer than the toolchain in use, the go command - will attempt to build the packages regardless, and will note the mismatch only if - that build fails. -

      - -

      - This changed use of the go directive means that if you - use Go 1.12 to build a module, thus recording go 1.12 - in the go.mod file, you will get an error when - attempting to build the same module with Go 1.11 through Go 1.11.3. - Go 1.11.4 or later will work fine, as will releases older than Go 1.11. - If you must use Go 1.11 through 1.11.3, you can avoid the problem by - setting the language version to 1.11, using the Go 1.12 go tool, - via go mod edit -go=1.11. -

      - -

      - When an import cannot be resolved using the active modules, - the go command will now try to use the modules mentioned in the - main module's replace directives before consulting the module - cache and the usual network sources. - If a matching replacement is found but the replace directive does - not specify a version, the go command uses a pseudo-version - derived from the zero time.Time (such - as v0.0.0-00010101000000-000000000000). -

      - -

      Compiler toolchain

      - -

      - The compiler's live variable analysis has improved. This may mean that - finalizers will be executed sooner in this release than in previous - releases. If that is a problem, consider the appropriate addition of a - runtime.KeepAlive call. -

      - -

      - More functions are now eligible for inlining by default, including - functions that do nothing but call another function. - This extra inlining makes it additionally important to use - runtime.CallersFrames - instead of iterating over the result of - runtime.Callers directly. -

      -// Old code which no longer works correctly (it will miss inlined call frames).
      -var pcs [10]uintptr
      -n := runtime.Callers(1, pcs[:])
      -for _, pc := range pcs[:n] {
      -	f := runtime.FuncForPC(pc)
      -	if f != nil {
      -		fmt.Println(f.Name())
      -	}
      -}
      -
      -
      -// New code which will work correctly.
      -var pcs [10]uintptr
      -n := runtime.Callers(1, pcs[:])
      -frames := runtime.CallersFrames(pcs[:n])
      -for {
      -	frame, more := frames.Next()
      -	fmt.Println(frame.Function)
      -	if !more {
      -		break
      -	}
      -}
      -
      -

      - -

      - Wrappers generated by the compiler to implement method expressions - are no longer reported - by runtime.CallersFrames - and runtime.Stack. They - are also not printed in panic stack traces. - - This change aligns the gc toolchain to match - the gccgo toolchain, which already elided such wrappers - from stack traces. - - Clients of these APIs might need to adjust for the missing - frames. For code that must interoperate between 1.11 and 1.12 - releases, you can replace the method expression x.M - with the function literal func (...) { x.M(...) } . -

      - -

      - The compiler now accepts a -lang flag to set the Go language - version to use. For example, -lang=go1.8 causes the compiler to - emit an error if the program uses type aliases, which were added in Go 1.9. - Language changes made before Go 1.12 are not consistently enforced. -

      - -

      - The compiler toolchain now uses different conventions to call Go - functions and assembly functions. This should be invisible to users, - except for calls that simultaneously cross between Go and - assembly and cross a package boundary. If linking results - in an error like "relocation target not defined for ABIInternal (but - is defined for ABI0)", please refer to the - compatibility section - of the ABI design document. -

      - -

      - There have been many improvements to the DWARF debug information - produced by the compiler, including improvements to argument - printing and variable location information. -

      - -

      - Go programs now also maintain stack frame pointers on linux/arm64 - for the benefit of profiling tools like perf. The frame pointer - maintenance has a small run-time overhead that varies but averages around 3%. - To build a toolchain that does not use frame pointers, set - GOEXPERIMENT=noframepointer when running make.bash. -

      - -

      - The obsolete "safe" compiler mode (enabled by the -u gcflag) has been removed. -

      - -

      godoc and go doc

      - -

      - In Go 1.12, godoc no longer has a command-line interface and - is only a web server. Users should use go doc - for command-line help output instead. Go 1.12 is the last release that will - include the godoc webserver; in Go 1.13 it will be available - via go get. -

      - -

      - go doc now supports the -all flag, - which will cause it to print all exported APIs and their documentation, - as the godoc command line used to do. -

      - -

      - go doc also now includes the -src flag, - which will show the target's source code. -

      - -

      Trace

      - -

      - The trace tool now supports plotting mutator utilization curves, - including cross-references to the execution trace. These are useful - for analyzing the impact of the garbage collector on application - latency and throughput. -

      - -

      Assembler

      - -

      - On arm64, the platform register was renamed from - R18 to R18_PLATFORM to prevent accidental - use, as the OS could choose to reserve this register. -

      - -

      Runtime

      - -

      - Go 1.12 significantly improves the performance of sweeping when a - large fraction of the heap remains live. This reduces allocation - latency immediately following a garbage collection. -

      - -

      - The Go runtime now releases memory back to the operating system more - aggressively, particularly in response to large allocations that - can't reuse existing heap space. -

      - -

      - The Go runtime's timer and deadline code is faster and scales better - with higher numbers of CPUs. In particular, this improves the - performance of manipulating network connection deadlines. -

      - -

      - On Linux, the runtime now uses MADV_FREE to release unused - memory. This is more efficient but may result in higher reported - RSS. The kernel will reclaim the unused data when it is needed. - To revert to the Go 1.11 behavior (MADV_DONTNEED), set the - environment variable GODEBUG=madvdontneed=1. -

      - -

      - Adding cpu.extension=off to the - GODEBUG environment - variable now disables the use of optional CPU instruction - set extensions in the standard library and runtime. This is not - yet supported on Windows. -

      - -

      - Go 1.12 improves the accuracy of memory profiles by fixing - overcounting of large heap allocations. -

      - -

      - Tracebacks, runtime.Caller, - and runtime.Callers no longer include - compiler-generated initialization functions. Doing a traceback - during the initialization of a global variable will now show a - function named PKG.init.ializers. -

      - -

      Core library

      - -

      TLS 1.3

      - -

      - Go 1.12 adds opt-in support for TLS 1.3 in the crypto/tls package as - specified by RFC 8446. It can - be enabled by adding the value tls13=1 to the GODEBUG - environment variable. It will be enabled by default in Go 1.13. -

      - -

      - To negotiate TLS 1.3, make sure you do not set an explicit MaxVersion in - Config and run your program with - the environment variable GODEBUG=tls13=1 set. -

      - -

      - All TLS 1.2 features except TLSUnique in - ConnectionState - and renegotiation are available in TLS 1.3 and provide equivalent or - better security and performance. Note that even though TLS 1.3 is backwards - compatible with previous versions, certain legacy systems might not work - correctly when attempting to negotiate it. RSA certificate keys too small - to be secure (including 512-bit keys) will not work with TLS 1.3. -

      - -

      - TLS 1.3 cipher suites are not configurable. All supported cipher suites are - safe, and if PreferServerCipherSuites is set in - Config the preference order - is based on the available hardware. -

      - -

      - Early data (also called "0-RTT mode") is not currently supported as a - client or server. Additionally, a Go 1.12 server does not support skipping - unexpected early data if a client sends it. Since TLS 1.3 0-RTT mode - involves clients keeping state regarding which servers support 0-RTT, - a Go 1.12 server cannot be part of a load-balancing pool where some other - servers do support 0-RTT. If switching a domain from a server that supported - 0-RTT to a Go 1.12 server, 0-RTT would have to be disabled for at least the - lifetime of the issued session tickets before the switch to ensure - uninterrupted operation. -

      - -

      - In TLS 1.3 the client is the last one to speak in the handshake, so if it causes - an error to occur on the server, it will be returned on the client by the first - Read, not by - Handshake. For - example, that will be the case if the server rejects the client certificate. - Similarly, session tickets are now post-handshake messages, so are only - received by the client upon its first - Read. -

      - -

      Minor changes to the library

      - -

      - As always, there are various minor changes and updates to the library, - made with the Go 1 promise of compatibility - in mind. -

      - - - -
      bufio
      -
      -

      - Reader's UnreadRune and - UnreadByte methods will now return an error - if they are called after Peek. -

      - -
      - -
      bytes
      -
      -

      - The new function ReplaceAll returns a copy of - a byte slice with all non-overlapping instances of a value replaced by another. -

      - -

      - A pointer to a zero-value Reader is now - functionally equivalent to NewReader(nil). - Prior to Go 1.12, the former could not be used as a substitute for the latter in all cases. -

      - -
      - -
      crypto/rand
      -
      -

      - A warning will now be printed to standard error the first time - Reader.Read is blocked for more than 60 seconds waiting - to read entropy from the kernel. -

      - -

      - On FreeBSD, Reader now uses the getrandom - system call if available, /dev/urandom otherwise. -

      - -
      - -
      crypto/rc4
      -
      -

      - This release removes the assembly implementations, leaving only - the pure Go version. The Go compiler generates code that is - either slightly better or slightly worse, depending on the exact - CPU. RC4 is insecure and should only be used for compatibility - with legacy systems. -

      - -
      - -
      crypto/tls
      -
      -

      - If a client sends an initial message that does not look like TLS, the server - will no longer reply with an alert, and it will expose the underlying - net.Conn in the new field Conn of - RecordHeaderError. -

      - -
      - -
      database/sql
      -
      -

      - A query cursor can now be obtained by passing a - *Rows - value to the Row.Scan method. -

      - -
      - -
      expvar
      -
      -

      - The new Delete method allows - for deletion of key/value pairs from a Map. -

      - -
      - -
      fmt
      -
      -

      - Maps are now printed in key-sorted order to ease testing. The ordering rules are: -

        -
      • When applicable, nil compares low -
      • ints, floats, and strings order by < -
      • NaN compares less than non-NaN floats -
      • bool compares false before true -
      • Complex compares real, then imaginary -
      • Pointers compare by machine address -
      • Channel values compare by machine address -
      • Structs compare each field in turn -
      • Arrays compare each element in turn -
      • Interface values compare first by reflect.Type describing the concrete type - and then by concrete value as described in the previous rules. -
      -

      - -

      - When printing maps, non-reflexive key values like NaN were previously - displayed as <nil>. As of this release, the correct values are printed. -

      - -
      - -
      go/doc
      -
      -

      - To address some outstanding issues in cmd/doc, - this package has a new Mode bit, - PreserveAST, which controls whether AST data is cleared. -

      - -
      - -
      go/token
      -
      -

      - The File type has a new - LineStart field, - which returns the position of the start of a given line. This is especially useful - in programs that occasionally handle non-Go files, such as assembly, but wish to use - the token.Pos mechanism to identify file positions. -

      - -
      - -
      image
      -
      -

      - The RegisterFormat function is now safe for concurrent use. -

      - -
      - -
      image/png
      -
      -

      - Paletted images with fewer than 16 colors now encode to smaller outputs. -

      - -
      - -
      io
      -
      -

      - The new StringWriter interface wraps the - WriteString function. -

      - -
      - -
      math
      -
      -

      - The functions - Sin, - Cos, - Tan, - and Sincos now - apply Payne-Hanek range reduction to huge arguments. This - produces more accurate answers, but they will not be bit-for-bit - identical with the results in earlier releases. -

      -
      - -
      math/bits
      -
      -

      - New extended precision operations Add, Sub, Mul, and Div are available in uint, uint32, and uint64 versions. -

      - -
      - -
      net
      -
      -

      - The - Dialer.DualStack setting is now ignored and deprecated; - RFC 6555 Fast Fallback ("Happy Eyeballs") is now enabled by default. To disable, set - Dialer.FallbackDelay to a negative value. -

      - -

      - Similarly, TCP keep-alives are now enabled by default if - Dialer.KeepAlive is zero. - To disable, set it to a negative value. -

      - -

      - On Linux, the splice system call is now used when copying from a - UnixConn to a - TCPConn. -

      -
      - -
      net/http
      -
      -

      - The HTTP server now rejects misdirected HTTP requests to HTTPS servers with a plaintext "400 Bad Request" response. -

      - -

      - The new Client.CloseIdleConnections - method calls the Client's underlying Transport's CloseIdleConnections - if it has one. -

      - -

      - The Transport no longer rejects HTTP responses which declare - HTTP Trailers but don't use chunked encoding. Instead, the declared trailers are now just ignored. -

      - -

      - The Transport no longer handles MAX_CONCURRENT_STREAMS values - advertised from HTTP/2 servers as strictly as it did during Go 1.10 and Go 1.11. The default behavior is now back - to how it was in Go 1.9: each connection to a server can have up to MAX_CONCURRENT_STREAMS requests - active and then new TCP connections are created as needed. In Go 1.10 and Go 1.11 the http2 package - would block and wait for requests to finish instead of creating new connections. - To get the stricter behavior back, import the - golang.org/x/net/http2 package - directly and set - Transport.StrictMaxConcurrentStreams to - true. -

      - -
      - -
      net/url
      -
      -

      - Parse, - ParseRequestURI, - and - URL.Parse - now return an - error for URLs containing ASCII control characters, which includes NULL, - tab, and newlines. -

      - -
      - -
      net/http/httputil
      -
      -

      - The ReverseProxy now automatically - proxies WebSocket requests. -

      - -
      - -
      os
      -
      -

      - The new ProcessState.ExitCode method - returns the process's exit code. -

      - -

      - ModeCharDevice has been added to the ModeType bitmask, allowing for - ModeDevice | ModeCharDevice to be recovered when masking a - FileMode with ModeType. -

      - -

      - The new function UserHomeDir returns the - current user's home directory. -

      - -

      - RemoveAll now supports paths longer than 4096 characters - on most Unix systems. -

      - -

      - File.Sync now uses F_FULLFSYNC on macOS - to correctly flush the file contents to permanent storage. - This may cause the method to run more slowly than in previous releases. -

      - -

      - File now supports - a SyscallConn - method returning - a syscall.RawConn - interface value. This may be used to invoke system-specific - operations on the underlying file descriptor. -

      - -
      - -
      path/filepath
      -
      -

      - The IsAbs function now returns true when passed - a reserved filename on Windows such as NUL. - List of reserved names. -

      - -
      - -
      reflect
      -
      -

      - A new MapIter type is - an iterator for ranging over a map. This type is exposed through the - Value type's new - MapRange method. - This follows the same iteration semantics as a range statement, with Next - to advance the iterator, and Key/Value to access each entry. -

      - -
      - -
      regexp
      -
      -

      - Copy is no longer necessary - to avoid lock contention, so it has been given a partial deprecation comment. - Copy - may still be appropriate if the reason for its use is to make two copies with - different Longest settings. -

      - -
      - -
      runtime/debug
      -
      -

      - A new BuildInfo type - exposes the build information read from the running binary, available only in - binaries built with module support. This includes the main package path, main - module information, and the module dependencies. This type is given through the - ReadBuildInfo function - on BuildInfo. -

      - -
      - -
      strings
      -
      -

      - The new function ReplaceAll returns a copy of - a string with all non-overlapping instances of a value replaced by another. -

      - -

      - A pointer to a zero-value Reader is now - functionally equivalent to NewReader(nil). - Prior to Go 1.12, the former could not be used as a substitute for the latter in all cases. -

      - -

      - The new Builder.Cap method returns the capacity of the builder's underlying byte slice. -

      - -

      - The character mapping functions Map, - Title, - ToLower, - ToLowerSpecial, - ToTitle, - ToTitleSpecial, - ToUpper, and - ToUpperSpecial - now always guarantee to return valid UTF-8. In earlier releases, if the input was invalid UTF-8 but no character replacements - needed to be applied, these routines incorrectly returned the invalid UTF-8 unmodified. -

      - -
      - -
      syscall
      -
      -

      - 64-bit inodes are now supported on FreeBSD 12. Some types have been adjusted accordingly. -

      - -

      - The Unix socket - (AF_UNIX) - address family is now supported for compatible versions of Windows. -

      - -

      - The new function Syscall18 - has been introduced for Windows, allowing for calls with up to 18 arguments. -

      - -
      - -
      syscall/js
      -
      -

      -

      - The Callback type and NewCallback function have been renamed; - they are now called - Func and - FuncOf, respectively. - This is a breaking change, but WebAssembly support is still experimental - and not yet subject to the - Go 1 compatibility promise. Any code using the - old names will need to be updated. -

      - -

      - If a type implements the new - Wrapper - interface, - ValueOf - will use it to return the JavaScript value for that type. -

      - -

      - The meaning of the zero - Value - has changed. It now represents the JavaScript undefined value - instead of the number zero. - This is a breaking change, but WebAssembly support is still experimental - and not yet subject to the - Go 1 compatibility promise. Any code relying on - the zero Value - to mean the number zero will need to be updated. -

      - -

      - The new - Value.Truthy - method reports the - JavaScript "truthiness" - of a given value. -

      - -
      - -
      testing
      -
      -

      - The -benchtime flag now supports setting an explicit iteration count instead of a time when the value ends with an "x". For example, -benchtime=100x runs the benchmark 100 times. -

      - -
      - -
      text/template
      -
      -

      - When executing a template, long context values are no longer truncated in errors. -

      -

      - executing "tmpl" at <.very.deep.context.v...>: map has no entry for key "notpresent" -

      -

      - is now -

      -

      - executing "tmpl" at <.very.deep.context.value.notpresent>: map has no entry for key "notpresent" -

      - -
      -

      - If a user-defined function called by a template panics, the - panic is now caught and returned as an error by - the Execute or ExecuteTemplate method. -

      -
      - -
      time
      -
      -

      - The time zone database in $GOROOT/lib/time/zoneinfo.zip - has been updated to version 2018i. Note that this ZIP file is - only used if a time zone database is not provided by the operating - system. -

      - -
      - -
      unsafe
      -
      -

      - It is invalid to convert a nil unsafe.Pointer to uintptr and back with arithmetic. - (This was already invalid, but will now cause the compiler to misbehave.) -

      - -
      diff --git a/doc/go1.13.html b/doc/go1.13.html deleted file mode 100644 index 8f4035d87f..0000000000 --- a/doc/go1.13.html +++ /dev/null @@ -1,1066 +0,0 @@ - - - - - - -

      Introduction to Go 1.13

      - -

      - The latest Go release, version 1.13, arrives six months after Go 1.12. - Most of its changes are in the implementation of the toolchain, runtime, and libraries. - As always, the release maintains the Go 1 promise of compatibility. - We expect almost all Go programs to continue to compile and run as before. -

      - -

      - As of Go 1.13, the go command by default downloads and authenticates - modules using the Go module mirror and Go checksum database run by Google. See - https://proxy.golang.org/privacy - for privacy information about these services and the - go command documentation - for configuration details including how to disable the use of these servers or use - different ones. If you depend on non-public modules, see the - documentation for configuring your environment. -

      - -

      Changes to the language

      - -

      - Per the number literal proposal, - Go 1.13 supports a more uniform and modernized set of number literal prefixes. -

        -
      • - Binary integer literals: - The prefix 0b or 0B indicates a binary integer literal - such as 0b1011. -
      • - -
      • - Octal integer literals: - The prefix 0o or 0O indicates an octal integer literal - such as 0o660. - The existing octal notation indicated by a leading 0 followed by - octal digits remains valid. -
      • - -
      • - Hexadecimal floating point literals: - The prefix 0x or 0X may now be used to express the mantissa of a - floating-point number in hexadecimal format such as 0x1.0p-1021. - A hexadecimal floating-point number must always have an exponent, written as the letter - p or P followed by an exponent in decimal. The exponent scales - the mantissa by 2 to the power of the exponent. -
      • - -
      • - Imaginary literals: - The imaginary suffix i may now be used with any (binary, decimal, hexadecimal) - integer or floating-point literal. -
      • - -
      • - Digit separators: - The digits of any number literal may now be separated (grouped) using underscores, such as - in 1_000_000, 0b_1010_0110, or 3.1415_9265. - An underscore may appear between any two digits or the literal prefix and the first digit. -
      • -
      -

      - -

      - Per the signed shift counts proposal - Go 1.13 removes the restriction that a shift count - must be unsigned. This change eliminates the need for many artificial uint conversions, - solely introduced to satisfy this (now removed) restriction of the << and >> operators. -

      - -

      - These language changes were implemented by changes to the compiler, and corresponding internal changes to the library - packages go/scanner and - text/scanner (number literals), - and go/types (signed shift counts). -

      - -

      - If your code uses modules and your go.mod files specifies a language version, be sure - it is set to at least 1.13 to get access to these language changes. - You can do this by editing the go.mod file directly, or you can run - go mod edit -go=1.13. -

      - -

      Ports

      - -

      - Go 1.13 is the last release that will run on Native Client (NaCl). -

      - -

      - For GOARCH=wasm, the new environment variable GOWASM takes a comma-separated list of experimental features that the binary gets compiled with. - The valid values are documented here. -

      - -

      AIX

      - -

      - AIX on PPC64 (aix/ppc64) now supports cgo, external - linking, and the c-archive and pie build - modes. -

      - -

      Android

      - -

      - Go programs are now compatible with Android 10. -

      - -

      Darwin

      - -

      - As announced in the Go 1.12 release notes, - Go 1.13 now requires macOS 10.11 El Capitan or later; - support for previous versions has been discontinued. -

      - -

      FreeBSD

      - -

      - As announced in the Go 1.12 release notes, - Go 1.13 now requires FreeBSD 11.2 or later; - support for previous versions has been discontinued. - FreeBSD 12.0 or later requires a kernel with the COMPAT_FREEBSD11 - option set (this is the default). -

      - -

      Illumos

      - -

      - Go now supports Illumos with GOOS=illumos. - The illumos build tag implies the solaris - build tag. -

      - -

      Windows

      - -

      - The Windows version specified by internally-linked Windows binaries - is now Windows 7 rather than NT 4.0. This was already the minimum - required version for Go, but can affect the behavior of system calls - that have a backwards-compatibility mode. These will now behave as - documented. Externally-linked binaries (any program using cgo) have - always specified a more recent Windows version. -

      - -

      Tools

      - -

      Modules

      - -

      Environment variables

      - -

      - The GO111MODULE - environment variable continues to default to auto, but - the auto setting now activates the module-aware mode of - the go command whenever the current working directory contains, - or is below a directory containing, a go.mod file — even if the - current directory is within GOPATH/src. This change simplifies - the migration of existing code within GOPATH/src and the ongoing - maintenance of module-aware packages alongside non-module-aware importers. -

      - -

      - The new - GOPRIVATE - environment variable indicates module paths that are not publicly available. - It serves as the default value for the lower-level GONOPROXY - and GONOSUMDB variables, which provide finer-grained control over - which modules are fetched via proxy and verified using the checksum database. -

      - -

      - The GOPROXY - environment variable may now be set to a comma-separated list of proxy - URLs or the special token direct, and - its default value is - now https://proxy.golang.org,direct. When resolving a package - path to its containing module, the go command will try all - candidate module paths on each proxy in the list in succession. An unreachable - proxy or HTTP status code other than 404 or 410 terminates the search without - consulting the remaining proxies. -

      - -

      - The new - GOSUMDB - environment variable identifies the name, and optionally the public key and - server URL, of the database to consult for checksums of modules that are not - yet listed in the main module's go.sum file. - If GOSUMDB does not include an explicit URL, the URL is chosen by - probing the GOPROXY URLs for an endpoint indicating support for - the checksum database, falling back to a direct connection to the named - database if it is not supported by any proxy. If GOSUMDB is set - to off, the checksum database is not consulted and only the - existing checksums in the go.sum file are verified. -

      - -

      - Users who cannot reach the default proxy and checksum database (for example, - due to a firewalled or sandboxed configuration) may disable their use by - setting GOPROXY to direct, and/or - GOSUMDB to off. - go env -w - can be used to set the default values for these variables independent of - platform: -

      -
      -go env -w GOPROXY=direct
      -go env -w GOSUMDB=off
      -
      - -

      go get

      - -

      - In module-aware mode, - go get - with the -u flag now updates a smaller set of modules that is - more consistent with the set of packages updated by - go get -u in GOPATH mode. - go get -u continues to update the - modules and packages named on the command line, but additionally updates only - the modules containing the packages imported by the named packages, - rather than the transitive module requirements of the modules containing the - named packages. -

      - -

      - Note in particular that go get -u - (without additional arguments) now updates only the transitive imports of the - package in the current directory. To instead update all of the packages - transitively imported by the main module (including test dependencies), use - go get -u all. -

      - -

      - As a result of the above changes to - go get -u, the - go get subcommand no longer supports - the -m flag, which caused go get to - stop before loading packages. The -d flag remains supported, and - continues to cause go get to stop after downloading - the source code needed to build dependencies of the named packages. -

      - -

      - By default, go get -u in module mode - upgrades only non-test dependencies, as in GOPATH mode. It now also accepts - the -t flag, which (as in GOPATH mode) - causes go get to include the packages imported - by tests of the packages named on the command line. -

      - -

      - In module-aware mode, the go get subcommand now - supports the version suffix @patch. The @patch - suffix indicates that the named module, or module containing the named - package, should be updated to the highest patch release with the same - major and minor versions as the version found in the build list. -

      - -

      - If a module passed as an argument to go get - without a version suffix is already required at a newer version than the - latest released version, it will remain at the newer version. This is - consistent with the behavior of the -u flag for module - dependencies. This prevents unexpected downgrades from pre-release versions. - The new version suffix @upgrade explicitly requests this - behavior. @latest explicitly requests the latest version - regardless of the current version. -

      - -

      Version validation

      - -

      - When extracting a module from a version control system, the go - command now performs additional validation on the requested version string. -

      - -

      - The +incompatible version annotation bypasses the requirement - of semantic - import versioning for repositories that predate the introduction of - modules. The go command now verifies that such a version does not - include an explicit go.mod file. -

      - -

      - The go command now verifies the mapping - between pseudo-versions and - version-control metadata. Specifically: -

        -
      • The version prefix must be of the form vX.0.0, or derived - from a tag on an ancestor of the named revision, or derived from a tag that - includes build metadata on - the named revision itself.
      • - -
      • The date string must match the UTC timestamp of the revision.
      • - -
      • The short name of the revision must use the same number of characters as - what the go command would generate. (For SHA-1 hashes as used - by git, a 12-digit prefix.)
      • -
      -

      - -

      - If a require directive in the - main module uses - an invalid pseudo-version, it can usually be corrected by redacting the - version to just the commit hash and re-running a go command, such - as go list -m all - or go mod tidy. For example, -

      -
      require github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c
      -

      can be redacted to

      -
      require github.com/docker/docker e7b5f7dbe98c
      -

      which currently resolves to

      -
      require github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c
      - -

      - If one of the transitive dependencies of the main module requires an invalid - version or pseudo-version, the invalid version can be replaced with a valid - one using a - replace directive in - the go.mod file of the main module. If the replacement is a - commit hash, it will be resolved to the appropriate pseudo-version as above. - For example, -

      -
      replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker e7b5f7dbe98c
      -

      currently resolves to

      -
      replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c
      - -

      Go command

      - -

      - The go env - command now accepts a -w flag to set the per-user default value - of an environment variable recognized by the - go command, and a corresponding -u flag to unset a - previously-set default. Defaults set via - go env -w are stored in the - go/env file within - os.UserConfigDir(). -

      - -

      - The - go version command now accepts arguments naming - executables and directories. When invoked on an executable, - go version prints the version of Go used to build - the executable. If the -m flag is used, - go version prints the executable's embedded module - version information, if available. When invoked on a directory, - go version prints information about executables - contained in the directory and its subdirectories. -

      - -

      - The new go - build flag -trimpath removes all file system paths - from the compiled executable, to improve build reproducibility. -

      - -

      - If the -o flag passed to go build - refers to an existing directory, go build will now - write executable files within that directory for main packages - matching its package arguments. -

      - -

      - The go build flag -tags now takes a - comma-separated list of build tags, to allow for multiple tags in - GOFLAGS. The - space-separated form is deprecated but still recognized and will be maintained. -

      - -

      - go - generate now sets the generate build tag so that - files may be searched for directives but ignored during build. -

      - -

      - As announced in the Go 1.12 release - notes, binary-only packages are no longer supported. Building a binary-only - package (marked with a //go:binary-only-package comment) now - results in an error. -

      - -

      Compiler toolchain

      - -

      - The compiler has a new implementation of escape analysis that is - more precise. For most Go code should be an improvement (in other - words, more Go variables and expressions allocated on the stack - instead of heap). However, this increased precision may also break - invalid code that happened to work before (for example, code that - violates - the unsafe.Pointer - safety rules). If you notice any regressions that appear - related, the old escape analysis pass can be re-enabled - with go build -gcflags=all=-newescape=false. - The option to use the old escape analysis will be removed in a - future release. -

      - -

      - The compiler no longer emits floating point or complex constants - to go_asm.h files. These have always been emitted in a - form that could not be used as numeric constant in assembly code. -

      - -

      Assembler

      - -

      - The assembler now supports many of the atomic instructions - introduced in ARM v8.1. -

      - -

      gofmt

      - -

      - gofmt (and with that go fmt) now canonicalizes - number literal prefixes and exponents to use lower-case letters, but - leaves hexadecimal digits alone. This improves readability when using the new octal prefix - (0O becomes 0o), and the rewrite is applied consistently. - gofmt now also removes unnecessary leading zeroes from a decimal integer - imaginary literal. (For backwards-compatibility, an integer imaginary literal - starting with 0 is considered a decimal, not an octal number. - Removing superfluous leading zeroes avoids potential confusion.) - For instance, 0B1010, 0XabcDEF, 0O660, - 1.2E3, and 01i become 0b1010, 0xabcDEF, - 0o660, 1.2e3, and 1i after applying gofmt. -

      - -

      godoc and go doc

      - -

      - The godoc webserver is no longer included in the main binary distribution. - To run the godoc webserver locally, manually install it first: -

      -go get golang.org/x/tools/cmd/godoc
      -godoc
      -
      -

      - -

      - The - go doc - command now always includes the package clause in its output, except for - commands. This replaces the previous behavior where a heuristic was used, - causing the package clause to be omitted under certain conditions. -

      - -

      Runtime

      - -

      - Out of range panic messages now include the index that was out of - bounds and the length (or capacity) of the slice. For - example, s[3] on a slice of length 1 will panic with - "runtime error: index out of range [3] with length 1". -

      - -

      - This release improves performance of most uses of defer - by 30%. -

      - -

      - The runtime is now more aggressive at returning memory to the - operating system to make it available to co-tenant applications. - Previously, the runtime could retain memory for five or more minutes - following a spike in the heap size. It will now begin returning it - promptly after the heap shrinks. However, on many OSes, including - Linux, the OS itself reclaims memory lazily, so process RSS will not - decrease until the system is under memory pressure. -

      - -

      Core library

      - -

      TLS 1.3

      - -

      - As announced in Go 1.12, Go 1.13 enables support for TLS 1.3 in the - crypto/tls package by default. It can be disabled by adding the - value tls13=0 to the GODEBUG - environment variable. The opt-out will be removed in Go 1.14. -

      - -

      - See the Go 1.12 release notes for important - compatibility information. -

      - -

      crypto/ed25519

      - -

      - The new crypto/ed25519 - package implements the Ed25519 signature - scheme. This functionality was previously provided by the - golang.org/x/crypto/ed25519 - package, which becomes a wrapper for - crypto/ed25519 when used with Go 1.13+. -

      - -

      Error wrapping

      - -

      - Go 1.13 contains support for error wrapping, as first proposed in - the - Error Values proposal and discussed on the - associated issue. -

      -

      - An error e can wrap another error w by providing - an Unwrap method that returns w. Both e - and w are available to programs, allowing e to provide - additional context to w or to reinterpret it while still allowing - programs to make decisions based on w. -

      -

      - To support wrapping, fmt.Errorf now has a %w - verb for creating wrapped errors, and three new functions in - the errors package ( - errors.Unwrap, - errors.Is and - errors.As) simplify unwrapping - and inspecting wrapped errors. -

      -

      - For more information, read the errors package - documentation, or see - the Error Value FAQ. - There will soon be a blog post as well. -

      - -

      Minor changes to the library

      - -

      - As always, there are various minor changes and updates to the library, - made with the Go 1 promise of compatibility - in mind. -

      - -
      bytes
      -
      -

      - The new ToValidUTF8 function returns a - copy of a given byte slice with each run of invalid UTF-8 byte sequences replaced by a given slice. -

      - -
      - -
      context
      -
      -

      - The formatting of contexts returned by WithValue no longer depends on fmt and will not stringify in the same way. Code that depends on the exact previous stringification might be affected. -

      - -
      - -
      crypto/tls
      -
      -

      - Support for SSL version 3.0 (SSLv3) - is now deprecated and will be removed in Go 1.14. Note that SSLv3 is the - cryptographically broken - protocol predating TLS. -

      - -

      - SSLv3 was always disabled by default, other than in Go 1.12, when it was - mistakenly enabled by default server-side. It is now again disabled by - default. (SSLv3 was never supported client-side.) -

      - -

      - Ed25519 certificates are now supported in TLS versions 1.2 and 1.3. -

      - -
      - -
      crypto/x509
      -
      -

      - Ed25519 keys are now supported in certificates and certificate requests - according to RFC 8410, as well as by the - ParsePKCS8PrivateKey, - MarshalPKCS8PrivateKey, - and ParsePKIXPublicKey functions. -

      - -

      - The paths searched for system roots now include /etc/ssl/cert.pem - to support the default location in Alpine Linux 3.7+. -

      - -
      - -
      database/sql
      -
      -

      - The new NullTime type represents a time.Time that may be null. -

      - -

      - The new NullInt32 type represents an int32 that may be null. -

      - -
      - -
      debug/dwarf
      -
      -

      - The Data.Type - method no longer panics if it encounters an unknown DWARF tag in - the type graph. Instead, it represents that component of the - type with - an UnsupportedType - object. -

      - -
      - -
      errors
      -
      - -

      - The new function As finds the first - error in a given error’s chain (sequence of wrapped errors) - that matches a given target’s type, and if so, sets the target to that error value. -

      -

      - The new function Is reports whether a given error value matches an - error in another’s chain. -

      -

      - The new function Unwrap returns the result of calling - Unwrap on a given error, if one exists. -

      - -
      - -
      fmt
      -
      - -

      - The printing verbs %x and %X now format floating-point and - complex numbers in hexadecimal notation, in lower-case and upper-case respectively. -

      - - -

      - The new printing verb %O formats integers in base 8, emitting the 0o prefix. -

      - - -

      - The scanner now accepts hexadecimal floating-point values, digit-separating underscores - and leading 0b and 0o prefixes. - See the Changes to the language for details. -

      - - -

      The Errorf function - has a new verb, %w, whose operand must be an error. - The error returned from Errorf will have an - Unwrap method which returns the operand of %w. -

      - -
      - - -
      go/scanner
      -
      -

      - The scanner has been updated to recognize the new Go number literals, specifically - binary literals with 0b/0B prefix, octal literals with 0o/0O prefix, - and floating-point numbers with hexadecimal mantissa. The imaginary suffix i may now be used with any number - literal, and underscores may used as digit separators for grouping. - See the Changes to the language for details. -

      - -
      - -
      go/types
      -
      -

      - The type-checker has been updated to follow the new rules for integer shifts. - See the Changes to the language for details. -

      - -
      - - - -
      html/template
      -
      -

      - When using a <script> tag with "module" set as the - type attribute, code will now be interpreted as JavaScript module script. -

      - -
      - -
      log
      -
      -

      - The new Writer function returns the output destination for the standard logger. -

      - -
      - -
      math/big
      -
      -

      - The new Rat.SetUint64 method sets the Rat to a uint64 value. -

      - -

      - For Float.Parse, if base is 0, underscores - may be used between digits for readability. - See the Changes to the language for details. -

      - -

      - For Int.SetString, if base is 0, underscores - may be used between digits for readability. - See the Changes to the language for details. -

      - -

      - Rat.SetString now accepts non-decimal floating point representations. -

      - -
      - -
      math/bits
      -
      -

      - The execution time of Add, - Sub, - Mul, - RotateLeft, and - ReverseBytes is now - guaranteed to be independent of the inputs. -

      - -
      - -
      net
      -
      -

      - On Unix systems where use-vc is set in resolv.conf, TCP is used for DNS resolution. -

      - -

      - The new field ListenConfig.KeepAlive - specifies the keep-alive period for network connections accepted by the listener. - If this field is 0 (the default) TCP keep-alives will be enabled. - To disable them, set it to a negative value. -

      -

      - Note that the error returned from I/O on a connection that was - closed by a keep-alive timeout will have a - Timeout method that returns true if called. - This can make a keep-alive error difficult to distinguish from - an error returned due to a missed deadline as set by the - SetDeadline - method and similar methods. - Code that uses deadlines and checks for them with - the Timeout method or - with os.IsTimeout - may want to disable keep-alives, or - use errors.Is(syscall.ETIMEDOUT) (on Unix systems) - which will return true for a keep-alive timeout and false for a - deadline timeout. -

      - -
      - -
      net/http
      -
      -

      - The new fields Transport.WriteBufferSize - and Transport.ReadBufferSize - allow one to specify the sizes of the write and read buffers for a Transport. - If either field is zero, a default size of 4KB is used. -

      - -

      - The new field Transport.ForceAttemptHTTP2 - controls whether HTTP/2 is enabled when a non-zero Dial, DialTLS, or DialContext - func or TLSClientConfig is provided. -

      - -

      - Transport.MaxConnsPerHost now works - properly with HTTP/2. -

      - -

      - TimeoutHandler's - ResponseWriter now implements the - Pusher interface. -

      - -

      - The StatusCode 103 "Early Hints" has been added. -

      - -

      - Transport now uses the Request.Body's - io.ReaderFrom implementation if available, to optimize writing the body. -

      - -

      - On encountering unsupported transfer-encodings, http.Server now - returns a "501 Unimplemented" status as mandated by the HTTP specification RFC 7230 Section 3.3.1. -

      - -

      - The new Server fields - BaseContext and - ConnContext - allow finer control over the Context values provided to requests and connections. -

      - -

      - http.DetectContentType now correctly detects RAR signatures, and can now also detect RAR v5 signatures. -

      - -

      - The new Header method - Clone returns a copy of the receiver. -

      - -

      - A new function NewRequestWithContext has been added and it - accepts a Context that controls the entire lifetime of - the created outgoing Request, suitable for use with - Client.Do and Transport.RoundTrip. -

      - -

      - The Transport no longer logs errors when servers - gracefully shut down idle connections using a "408 Request Timeout" response. -

      - -
      - -
      os
      -
      -

      - The new UserConfigDir function - returns the default directory to use for user-specific configuration data. -

      - -

      - If a File is opened using the O_APPEND flag, its - WriteAt method will always return an error. -

      - -
      - -
      os/exec
      -
      -

      - On Windows, the environment for a Cmd always inherits the - %SYSTEMROOT% value of the parent process unless the - Cmd.Env field includes an explicit value for it. -

      - -
      - -
      reflect
      -
      -

      - The new Value.IsZero method reports whether a Value is the zero value for its type. -

      - -

      - The MakeFunc function now allows assignment conversions on returned values, instead of requiring exact type match. This is particularly useful when the type being returned is an interface type, but the value actually returned is a concrete value implementing that type. -

      - -
      - -
      runtime
      -
      -

      - Tracebacks, runtime.Caller, - and runtime.Callers now refer to the function that - initializes the global variables of PKG - as PKG.init instead of PKG.init.ializers. -

      - -
      - -
      strconv
      -
      -

      - For strconv.ParseFloat, - strconv.ParseInt - and strconv.ParseUint, - if base is 0, underscores may be used between digits for readability. - See the Changes to the language for details. -

      - -
      - -
      strings
      -
      -

      - The new ToValidUTF8 function returns a - copy of a given string with each run of invalid UTF-8 byte sequences replaced by a given string. -

      - -
      - -
      sync
      -
      -

      - The fast paths of Mutex.Lock, Mutex.Unlock, - RWMutex.Lock, RWMutex.RUnlock, and - Once.Do are now inlined in their callers. - For the uncontended cases on amd64, these changes make Once.Do twice as fast, and the - Mutex/RWMutex methods up to 10% faster. -

      - -

      - Large Pool no longer increase stop-the-world pause times. -

      - -

      - Pool no longer needs to be completely repopulated after every GC. It now retains some objects across GCs, - as opposed to releasing all objects, reducing load spikes for heavy users of Pool. -

      - -
      - -
      syscall
      -
      -

      - Uses of _getdirentries64 have been removed from - Darwin builds, to allow Go binaries to be uploaded to the macOS - App Store. -

      - -

      - The new ProcessAttributes and ThreadAttributes fields in - SysProcAttr have been introduced for Windows, - exposing security settings when creating new processes. -

      - -

      - EINVAL is no longer returned in zero - Chmod mode on Windows. -

      - -

      - Values of type Errno can be tested against error values in - the os package, - like ErrExist, using - errors.Is. -

      - -
      - -
      syscall/js
      -
      -

      - TypedArrayOf has been replaced by - CopyBytesToGo and - CopyBytesToJS for copying bytes - between a byte slice and a Uint8Array. -

      - -
      - -
      testing
      -
      -

      - When running benchmarks, B.N is no longer rounded. -

      - -

      - The new method B.ReportMetric lets users report - custom benchmark metrics and override built-in metrics. -

      - -

      - Testing flags are now registered in the new Init function, - which is invoked by the generated main function for the test. - As a result, testing flags are now only registered when running a test binary, - and packages that call flag.Parse during package initialization may cause tests to fail. -

      - -
      - -
      text/scanner
      -
      -

      - The scanner has been updated to recognize the new Go number literals, specifically - binary literals with 0b/0B prefix, octal literals with 0o/0O prefix, - and floating-point numbers with hexadecimal mantissa. - Also, the new AllowDigitSeparators - mode allows number literals to contain underscores as digit separators (off by default for backwards-compatibility). - See the Changes to the language for details. -

      - -
      - -
      text/template
      -
      -

      - The new slice function - returns the result of slicing its first argument by the following arguments. -

      - -
      - -
      time
      -
      -

      - Day-of-year is now supported by Format - and Parse. -

      - -

      - The new Duration methods - Microseconds and - Milliseconds return - the duration as an integer count of their respectively named units. -

      - -
      - -
      unicode
      -
      -

      - The unicode package and associated - support throughout the system has been upgraded from Unicode 10.0 to - Unicode 11.0, - which adds 684 new characters, including seven new scripts, and 66 new emoji. -

      - -
      diff --git a/doc/go1.14.html b/doc/go1.14.html deleted file mode 100644 index 410e0cbf7c..0000000000 --- a/doc/go1.14.html +++ /dev/null @@ -1,924 +0,0 @@ - - - - - - -

      Introduction to Go 1.14

      - -

      - The latest Go release, version 1.14, arrives six months after Go 1.13. - Most of its changes are in the implementation of the toolchain, runtime, and libraries. - As always, the release maintains the Go 1 promise of compatibility. - We expect almost all Go programs to continue to compile and run as before. -

      - -

      - Module support in the go command is now ready for production use, - and we encourage all users to migrate to Go - modules for dependency management. If you are unable to migrate due to a problem in the Go - toolchain, please ensure that the problem has an - open issue - filed. (If the issue is not on the Go1.15 milestone, please let us - know why it prevents you from migrating so that we can prioritize it - appropriately.) -

      - -

      Changes to the language

      - -

      - Per the overlapping interfaces proposal, - Go 1.14 now permits embedding of interfaces with overlapping method sets: - methods from an embedded interface may have the same names and identical signatures - as methods already present in the (embedding) interface. This solves problems that typically - (but not exclusively) occur with diamond-shaped embedding graphs. - Explicitly declared methods in an interface must remain - unique, as before. -

      - -

      Ports

      - -

      Darwin

      - -

      - Go 1.14 is the last release that will run on macOS 10.11 El Capitan. - Go 1.15 will require macOS 10.12 Sierra or later. -

      - -

      - Go 1.14 is the last Go release to support 32-bit binaries on - macOS (the darwin/386 port). They are no longer - supported by macOS, starting with macOS 10.15 (Catalina). - Go continues to support the 64-bit darwin/amd64 port. -

      - -

      - Go 1.14 will likely be the last Go release to support 32-bit - binaries on iOS, iPadOS, watchOS, and tvOS - (the darwin/arm port). Go continues to support the - 64-bit darwin/arm64 port. -

      - -

      Windows

      - -

      - Go binaries on Windows now - have DEP - (Data Execution Prevention) enabled. -

      - -

      - On Windows, creating a file - via os.OpenFile with - the os.O_CREATE flag, or - via syscall.Open with - the syscall.O_CREAT - flag, will now create the file as read-only if the - bit 0o200 (owner write permission) is not set in the - permission argument. This makes the behavior on Windows more like - that on Unix systems. -

      - -

      WebAssembly

      - -

      - JavaScript values referenced from Go via js.Value - objects can now be garbage collected. -

      - -

      - js.Value values can no longer be compared using - the == operator, and instead must be compared using - their Equal method. -

      - -

      - js.Value now - has IsUndefined, IsNull, - and IsNaN methods. -

      - -

      RISC-V

      - -

      - Go 1.14 contains experimental support for 64-bit RISC-V on Linux - (GOOS=linux, GOARCH=riscv64). Be aware - that performance, assembly syntax stability, and possibly - correctness are a work in progress. -

      - -

      FreeBSD

      - -

      - Go now supports the 64-bit ARM architecture on FreeBSD 12.0 or later (the - freebsd/arm64 port). -

      - -

      Native Client (NaCl)

      - -

      - As announced in the Go 1.13 release notes, - Go 1.14 drops support for the Native Client platform (GOOS=nacl). -

      - -

      Illumos

      - -

      - The runtime now respects zone CPU caps - (the zone.cpu-cap resource control) - for runtime.NumCPU and the default value - of GOMAXPROCS. -

      - -

      Tools

      - -

      Go command

      - -

      Vendoring

      - - -

      - When the main module contains a top-level vendor directory and - its go.mod file specifies go 1.14 or - higher, the go command now defaults to -mod=vendor - for operations that accept that flag. A new value for that flag, - -mod=mod, causes the go command to instead load - modules from the module cache (as when no vendor directory is - present). -

      - -

      - When -mod=vendor is set (explicitly or by default), the - go command now verifies that the main module's - vendor/modules.txt file is consistent with its - go.mod file. -

      - -

      - go list -m no longer silently omits - transitive dependencies that do not provide packages in - the vendor directory. It now fails explicitly if - -mod=vendor is set and information is requested for a module not - mentioned in vendor/modules.txt. -

      - -

      Flags

      - -

      - The go get command no longer accepts - the -mod flag. Previously, the flag's setting either - was ignored or - caused the build to fail. -

      - -

      - -mod=readonly is now set by default when the go.mod - file is read-only and no top-level vendor directory is present. -

      - -

      - -modcacherw is a new flag that instructs the go - command to leave newly-created directories in the module cache at their - default permissions rather than making them read-only. - The use of this flag makes it more likely that tests or other tools will - accidentally add files not included in the module's verified checksum. - However, it allows the use of rm -rf - (instead of go clean -modcache) - to remove the module cache. -

      - -

      - -modfile=file is a new flag that instructs the go - command to read (and possibly write) an alternate go.mod file - instead of the one in the module root directory. A file - named go.mod must still be present in order to determine the - module root directory, but it is not accessed. When -modfile is - specified, an alternate go.sum file is also used: its path is - derived from the -modfile flag by trimming the .mod - extension and appending .sum. -

      - -

      Environment variables

      - -

      - GOINSECURE is a new environment variable that instructs - the go command to not require an HTTPS connection, and to skip - certificate validation, when fetching certain modules directly from their - origins. Like the existing GOPRIVATE variable, the value - of GOINSECURE is a comma-separated list of glob patterns. -

      - -

      Commands outside modules

      - -

      - When module-aware mode is enabled explicitly (by setting - GO111MODULE=on), most module commands have more - limited functionality if no go.mod file is present. For - example, go build, - go run, and other build commands can only build - packages in the standard library and packages specified as .go - files on the command line. -

      - -

      - Previously, the go command would resolve each package path - to the latest version of a module but would not record the module path - or version. This resulted in slow, - non-reproducible builds. -

      - -

      - go get continues to work as before, as do - go mod download and - go list -m with explicit versions. -

      - -

      +incompatible versions

      - - -

      - If the latest version of a module contains a go.mod file, - go get will no longer upgrade to an - incompatible - major version of that module unless such a version is requested explicitly - or is already required. - go list also omits incompatible major versions - for such a module when fetching directly from version control, but may - include them if reported by a proxy. -

      - - -

      go.mod file maintenance

      - - -

      - go commands other than - go mod tidy no longer - remove a require directive that specifies a version of an indirect dependency - that is already implied by other (transitive) dependencies of the main - module. -

      - -

      - go commands other than - go mod tidy no longer - edit the go.mod file if the changes are only cosmetic. -

      - -

      - When -mod=readonly is set, go commands will no - longer fail due to a missing go directive or an erroneous - // indirect comment. -

      - -

      Module downloading

      - -

      - The go command now supports Subversion repositories in module mode. -

      - -

      - The go command now includes snippets of plain-text error messages - from module proxies and other HTTP servers. - An error message will only be shown if it is valid UTF-8 and consists of only - graphic characters and spaces. -

      - -

      Testing

      - -

      - go test -v now streams t.Log output as it happens, - rather than at the end of all tests. -

      - -

      Runtime

      - -

      - This release improves the performance of most uses - of defer to incur almost zero overhead compared to - calling the deferred function directly. - As a result, defer can now be used in - performance-critical code without overhead concerns. -

      - -

      - Goroutines are now asynchronously preemptible. - As a result, loops without function calls no longer potentially - deadlock the scheduler or significantly delay garbage collection. - This is supported on all platforms except windows/arm, - darwin/arm, js/wasm, and - plan9/*. -

      - -

      - A consequence of the implementation of preemption is that on Unix - systems, including Linux and macOS systems, programs built with Go - 1.14 will receive more signals than programs built with earlier - releases. - This means that programs that use packages - like syscall - or golang.org/x/sys/unix - will see more slow system calls fail with EINTR errors. - Those programs will have to handle those errors in some way, most - likely looping to try the system call again. For more - information about this - see man - 7 signal for Linux systems or similar documentation for - other systems. -

      - -

      - The page allocator is more efficient and incurs significantly less - lock contention at high values of GOMAXPROCS. - This is most noticeable as lower latency and higher throughput for - large allocations being done in parallel and at a high rate. -

      - -

      - Internal timers, used by - time.After, - time.Tick, - net.Conn.SetDeadline, - and friends, are more efficient, with less lock contention and fewer - context switches. - This is a performance improvement that should not cause any user - visible changes. -

      - -

      Compiler

      - -

      - This release adds -d=checkptr as a compile-time option - for adding instrumentation to check that Go code is following - unsafe.Pointer safety rules dynamically. - This option is enabled by default (except on Windows) with - the -race or -msan flags, and can be - disabled with -gcflags=all=-d=checkptr=0. - Specifically, -d=checkptr checks the following: -

      - -
        -
      1. - When converting unsafe.Pointer to *T, - the resulting pointer must be aligned appropriately - for T. -
      2. -
      3. - If the result of pointer arithmetic points into a Go heap object, - one of the unsafe.Pointer-typed operands must point - into the same object. -
      4. -
      - -

      - Using -d=checkptr is not currently recommended on - Windows because it causes false alerts in the standard library. -

      - -

      - The compiler can now emit machine-readable logs of key optimizations - using the -json flag, including inlining, escape - analysis, bounds-check elimination, and nil-check elimination. -

      - -

      - Detailed escape analysis diagnostics (-m=2) now work again. - This had been dropped from the new escape analysis implementation in - the previous release. -

      - -

      - All Go symbols in macOS binaries now begin with an underscore, - following platform conventions. -

      - -

      - This release includes experimental support for compiler-inserted - coverage instrumentation for fuzzing. - See issue 14565 for more - details. - This API may change in future releases. -

      - -

      - Bounds check elimination now uses information from slice creation and can - eliminate checks for indexes with types smaller than int. -

      - -

      Core library

      - -

      New byte sequence hashing package

      - -

      - Go 1.14 includes a new package, - hash/maphash, - which provides hash functions on byte sequences. - These hash functions are intended to be used to implement hash tables or - other data structures that need to map arbitrary strings or byte - sequences to a uniform distribution on unsigned 64-bit integers. -

      -

      - The hash functions are collision-resistant but not cryptographically secure. -

      -

      - The hash value of a given byte sequence is consistent within a - single process, but will be different in different processes. -

      - -

      Minor changes to the library

      - -

      - As always, there are various minor changes and updates to the library, - made with the Go 1 promise of compatibility - in mind. -

      - -
      crypto/tls
      -
      -

      - Support for SSL version 3.0 (SSLv3) has been removed. Note that SSLv3 is the - cryptographically broken - protocol predating TLS. -

      - -

      - TLS 1.3 can't be disabled via the GODEBUG environment - variable anymore. Use the - Config.MaxVersion - field to configure TLS versions. -

      - -

      - When multiple certificate chains are provided through the - Config.Certificates - field, the first one compatible with the peer is now automatically - selected. This allows for example providing an ECDSA and an RSA - certificate, and letting the package automatically select the best one. - Note that the performance of this selection is going to be poor unless the - Certificate.Leaf - field is set. The - Config.NameToCertificate - field, which only supports associating a single certificate with - a give name, is now deprecated and should be left as nil. - Similarly the - Config.BuildNameToCertificate - method, which builds the NameToCertificate field - from the leaf certificates, is now deprecated and should not be - called. -

      - -

      - The new CipherSuites - and InsecureCipherSuites - functions return a list of currently implemented cipher suites. - The new CipherSuiteName - function returns a name for a cipher suite ID. -

      - -

      - The new - (*ClientHelloInfo).SupportsCertificate and - - (*CertificateRequestInfo).SupportsCertificate - methods expose whether a peer supports a certain certificate. -

      - -

      - The tls package no longer supports the legacy Next Protocol - Negotiation (NPN) extension and now only supports ALPN. In previous - releases it supported both. There are no API changes and applications - should function identically as before. Most other clients and servers have - already removed NPN support in favor of the standardized ALPN. -

      - -

      - RSA-PSS signatures are now used when supported in TLS 1.2 handshakes. This - won't affect most applications, but custom - Certificate.PrivateKey - implementations that don't support RSA-PSS signatures will need to use the new - - Certificate.SupportedSignatureAlgorithms - field to disable them. -

      - -

      - Config.Certificates and - Config.GetCertificate - can now both be nil if - Config.GetConfigForClient - is set. If the callbacks return neither certificates nor an error, the - unrecognized_name is now sent. -

      - -

      - The new CertificateRequestInfo.Version - field provides the TLS version to client certificates callbacks. -

      - -

      - The new TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 and - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 constants use - the final names for the cipher suites previously referred to as - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 and - TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305. -

      -
      -
      - -
      crypto/x509
      -
      -

      - Certificate.CreateCRL - now supports Ed25519 issuers. -

      -
      -
      - -
      debug/dwarf
      -
      -

      - The debug/dwarf package now supports reading DWARF - version 5. -

      -

      - The new - method (*Data).AddSection - supports adding arbitrary new DWARF sections from the input file - to the DWARF Data. -

      - -

      - The new - method (*Reader).ByteOrder - returns the byte order of the current compilation unit. - This may be used to interpret attributes that are encoded in the - native ordering, such as location descriptions. -

      - -

      - The new - method (*LineReader).Files - returns the file name table from a line reader. - This may be used to interpret the value of DWARF attributes such - as AttrDeclFile. -

      -
      -
      - -
      encoding/asn1
      -
      -

      - Unmarshal - now supports ASN.1 string type BMPString, represented by the new - TagBMPString - constant. -

      -
      -
      - -
      encoding/json
      -
      -

      - The Decoder - type supports a new - method InputOffset - that returns the input stream byte offset of the current - decoder position. -

      - -

      - Compact no longer - escapes the U+2028 and U+2029 characters, which - was never a documented feature. For proper escaping, see HTMLEscape. -

      - -

      - Number no longer - accepts invalid numbers, to follow the documented behavior more closely. - If a program needs to accept invalid numbers like the empty string, - consider wrapping the type with Unmarshaler. -

      - -

      - Unmarshal - can now support map keys with string underlying type which implement - encoding.TextUnmarshaler. -

      -
      -
      - -
      go/build
      -
      -

      - The Context - type has a new field Dir which may be used to set - the working directory for the build. - The default is the current directory of the running process. - In module mode, this is used to locate the main module. -

      -
      -
      - -
      go/doc
      -
      -

      - The new - function NewFromFiles - computes package documentation from a list - of *ast.File's and associates examples with the - appropriate package elements. - The new information is available in a new Examples - field - in the Package, Type, - and Func types, and a - new Suffix - field in - the Example - type. -

      -
      -
      - -
      io/ioutil
      -
      -

      - TempDir can now create directories - whose names have predictable prefixes and suffixes. - As with TempFile, if the pattern - contains a '*', the random string replaces the last '*'. -

      -
      -
      - -
      log
      -
      -

      - The - new Lmsgprefix - flag may be used to tell the logging functions to emit the - optional output prefix immediately before the log message rather - than at the start of the line. -

      -
      -
      - -
      math
      -
      -

      - The new FMA function - computes x*y+z in floating point with no - intermediate rounding of the x*y - computation. Several architectures implement this computation - using dedicated hardware instructions for additional performance. -

      -
      -
      - -
      math/big
      -
      -

      - The GCD method - now allows the inputs a and b to be - zero or negative. -

      -
      -
      - -
      math/bits
      -
      -

      - The new functions - Rem, - Rem32, and - Rem64 - support computing a remainder even when the quotient overflows. -

      -
      -
      - -
      mime
      -
      -

      - The default type of .js and .mjs files - is now text/javascript rather - than application/javascript. - This is in accordance - with an - IETF draft that treats application/javascript as obsolete. -

      -
      -
      - -
      mime/multipart
      -
      -

      - The - new Reader - method NextRawPart - supports fetching the next MIME part without transparently - decoding quoted-printable data. -

      -
      -
      - -
      net/http
      -
      -

      - The new Header - method Values - can be used to fetch all values associated with a - canonicalized key. -

      - -

      - The - new Transport - field DialTLSContext - can be used to specify an optional dial function for creating - TLS connections for non-proxied HTTPS requests. - This new field can be used instead - of DialTLS, - which is now considered deprecated; DialTLS will - continue to work, but new code should - use DialTLSContext, which allows the transport to - cancel dials as soon as they are no longer needed. -

      - -

      - On Windows, ServeFile now correctly - serves files larger than 2GB. -

      -
      -
      - -
      net/http/httptest
      -
      -

      - The - new Server - field EnableHTTP2 - supports enabling HTTP/2 on the test server. -

      -
      -
      - -
      net/textproto
      -
      -

      - The - new MIMEHeader - method Values - can be used to fetch all values associated with a canonicalized - key. -

      -
      -
      - -
      net/url
      -
      -

      - When parsing of a URL fails - (for example by Parse - or ParseRequestURI), - the resulting Error message - will now quote the unparsable URL. - This provides clearer structure and consistency with other parsing errors. -

      -
      -
      - -
      os/signal
      -
      -

      - On Windows, - the CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, - and CTRL_SHUTDOWN_EVENT events now generate - a syscall.SIGTERM signal, similar to how Control-C - and Control-Break generate a syscall.SIGINT signal. -

      -
      -
      - -
      plugin
      -
      -

      - The plugin package now supports freebsd/amd64. -

      -
      -
      - -
      reflect
      -
      -

      - StructOf now - supports creating struct types with unexported fields, by - setting the PkgPath field in - a StructField element. -

      -
      -
      - -
      runtime
      -
      -

      - runtime.Goexit can no longer be aborted by a - recursive panic/recover. -

      - -

      - On macOS, SIGPIPE is no longer forwarded to signal - handlers installed before the Go runtime is initialized. - This is necessary because macOS delivers SIGPIPE - to the main thread - rather than the thread writing to the closed pipe. -

      -
      -
      - -
      runtime/pprof
      -
      -

      - The generated profile no longer includes the pseudo-PCs used for inline - marks. Symbol information of inlined functions is encoded in - the format - the pprof tool expects. This is a fix for the regression introduced - during recent releases. -

      -
      -
      - -
      strconv
      -
      -

      - The NumError - type now has - an Unwrap - method that may be used to retrieve the reason that a conversion - failed. - This supports using NumError values - with errors.Is to see - if the underlying error - is strconv.ErrRange - or strconv.ErrSyntax. -

      -
      -
      - -
      sync
      -
      -

      - Unlocking a highly contended Mutex now directly - yields the CPU to the next goroutine waiting for - that Mutex. This significantly improves the - performance of highly contended mutexes on high CPU count - machines. -

      -
      -
      - -
      testing
      -
      -

      - The testing package now supports cleanup functions, called after - a test or benchmark has finished, by calling - T.Cleanup or - B.Cleanup respectively. -

      -
      -
      - -
      text/template
      -
      -

      - The text/template package now correctly reports errors when a - parenthesized argument is used as a function. - This most commonly shows up in erroneous cases like - {{if (eq .F "a") or (eq .F "b")}}. - This should be written as {{if or (eq .F "a") (eq .F "b")}}. - The erroneous case never worked as expected, and will now be - reported with an error can't give argument to non-function. -

      -
      -
      - -
      unicode
      -
      -

      - The unicode package and associated - support throughout the system has been upgraded from Unicode 11.0 to - Unicode 12.0, - which adds 554 new characters, including four new scripts, and 61 new emoji. -

      -
      -
      diff --git a/doc/go1.15.html b/doc/go1.15.html deleted file mode 100644 index c9997c0ca3..0000000000 --- a/doc/go1.15.html +++ /dev/null @@ -1,1064 +0,0 @@ - - - - - - -

      Introduction to Go 1.15

      - -

      - The latest Go release, version 1.15, arrives six months after Go 1.14. - Most of its changes are in the implementation of the toolchain, runtime, and libraries. - As always, the release maintains the Go 1 promise of compatibility. - We expect almost all Go programs to continue to compile and run as before. -

      - -

      - Go 1.15 includes substantial improvements to the linker, - improves allocation for small objects at high core counts, and - deprecates X.509 CommonName. - GOPROXY now supports skipping proxies that return errors and - a new embedded tzdata package has been added. -

      - -

      Changes to the language

      - -

      - There are no changes to the language. -

      - -

      Ports

      - -

      Darwin

      - -

      - As announced in the Go 1.14 release - notes, Go 1.15 requires macOS 10.12 Sierra or later; support for - previous versions has been discontinued. -

      - -

      - As announced in the Go 1.14 release - notes, Go 1.15 drops support for 32-bit binaries on macOS, iOS, - iPadOS, watchOS, and tvOS (the darwin/386 - and darwin/arm ports). Go continues to support the - 64-bit darwin/amd64 and darwin/arm64 ports. -

      - -

      Windows

      - -

      - Go now generates Windows ASLR executables when -buildmode=pie - cmd/link flag is provided. Go command uses -buildmode=pie - by default on Windows. -

      - -

      - The -race and -msan flags now always - enable -d=checkptr, which checks uses - of unsafe.Pointer. This was previously the case on all - OSes except Windows. -

      - -

      - Go-built DLLs no longer cause the process to exit when it receives a - signal (such as Ctrl-C at a terminal). -

      - -

      Android

      - -

      - When linking binaries for Android, Go 1.15 explicitly selects - the lld linker available in recent versions of the NDK. - The lld linker avoids crashes on some devices, and is - planned to become the default NDK linker in a future NDK version. -

      - -

      OpenBSD

      - -

      - Go 1.15 adds support for OpenBSD 6.7 on GOARCH=arm - and GOARCH=arm64. Previous versions of Go already - supported OpenBSD 6.7 on GOARCH=386 - and GOARCH=amd64. -

      - -

      RISC-V

      - -

      - There has been progress in improving the stability and performance - of the 64-bit RISC-V port on Linux (GOOS=linux, - GOARCH=riscv64). It also now supports asynchronous - preemption. -

      - -

      386

      - -

      - Go 1.15 is the last release to support x87-only floating-point - hardware (GO386=387). Future releases will require at - least SSE2 support on 386, raising Go's - minimum GOARCH=386 requirement to the Intel Pentium 4 - (released in 2000) or AMD Opteron/Athlon 64 (released in 2003). -

      - -

      Tools

      - -

      Go command

      - -

      - The GOPROXY environment variable now supports skipping proxies - that return errors. Proxy URLs may now be separated with either commas - (,) or pipe characters (|). If a proxy URL is - followed by a comma, the go command will only try the next proxy - in the list after a 404 or 410 HTTP response. If a proxy URL is followed by a - pipe character, the go command will try the next proxy in the - list after any error. Note that the default value of GOPROXY - remains https://proxy.golang.org,direct, which does not fall - back to direct in case of errors. -

      - -

      go test

      - -

      - Changing the -timeout flag now invalidates cached test results. A - cached result for a test run with a long timeout will no longer count as - passing when go test is re-invoked with a short one. -

      - -

      Flag parsing

      - -

      - Various flag parsing issues in go test and - go vet have been fixed. Notably, flags specified - in GOFLAGS are handled more consistently, and - the -outputdir flag now interprets relative paths relative to the - working directory of the go command (rather than the working - directory of each individual test). -

      - -

      Module cache

      - -

      - The location of the module cache may now be set with - the GOMODCACHE environment variable. The default value of - GOMODCACHE is GOPATH[0]/pkg/mod, the location of the - module cache before this change. -

      - -

      - A workaround is now available for Windows "Access is denied" errors in - go commands that access the module cache, caused by external - programs concurrently scanning the file system (see - issue #36568). The workaround is - not enabled by default because it is not safe to use when Go versions lower - than 1.14.2 and 1.13.10 are running concurrently with the same module cache. - It can be enabled by explicitly setting the environment variable - GODEBUG=modcacheunzipinplace=1. -

      - -

      Vet

      - -

      New warning for string(x)

      - -

      - The vet tool now warns about conversions of the - form string(x) where x has an integer type - other than rune or byte. - Experience with Go has shown that many conversions of this form - erroneously assume that string(x) evaluates to the - string representation of the integer x. - It actually evaluates to a string containing the UTF-8 encoding of - the value of x. - For example, string(9786) does not evaluate to the - string "9786"; it evaluates to the - string "\xe2\x98\xba", or "☺". -

      - -

      - Code that is using string(x) correctly can be rewritten - to string(rune(x)). - Or, in some cases, calling utf8.EncodeRune(buf, x) with - a suitable byte slice buf may be the right solution. - Other code should most likely use strconv.Itoa - or fmt.Sprint. -

      - -

      - This new vet check is enabled by default when - using go test. -

      - -

      - We are considering prohibiting the conversion in a future release of Go. - That is, the language would change to only - permit string(x) for integer x when the - type of x is rune or byte. - Such a language change would not be backward compatible. - We are using this vet check as a first trial step toward changing - the language. -

      - -

      New warning for impossible interface conversions

      - -

      - The vet tool now warns about type assertions from one interface type - to another interface type when the type assertion will always fail. - This will happen if both interface types implement a method with the - same name but with a different type signature. -

      - -

      - There is no reason to write a type assertion that always fails, so - any code that triggers this vet check should be rewritten. -

      - -

      - This new vet check is enabled by default when - using go test. -

      - -

      - We are considering prohibiting impossible interface type assertions - in a future release of Go. - Such a language change would not be backward compatible. - We are using this vet check as a first trial step toward changing - the language. -

      - -

      Runtime

      - -

      - If panic is invoked with a value whose type is derived from any - of: bool, complex64, complex128, float32, float64, - int, int8, int16, int32, int64, string, - uint, uint8, uint16, uint32, uint64, uintptr, - then the value will be printed, instead of just its address. - Previously, this was only true for values of exactly these types. -

      - -

      - On a Unix system, if the kill command - or kill system call is used to send - a SIGSEGV, SIGBUS, - or SIGFPE signal to a Go program, and if the signal - is not being handled via - os/signal.Notify, - the Go program will now reliably crash with a stack trace. - In earlier releases the behavior was unpredictable. -

      - -

      - Allocation of small objects now performs much better at high core - counts, and has lower worst-case latency. -

      - -

      - Converting a small integer value into an interface value no longer - causes allocation. -

      - -

      - Non-blocking receives on closed channels now perform as well as - non-blocking receives on open channels. -

      - -

      Compiler

      - -

      - Package unsafe's safety - rules allow converting an unsafe.Pointer - into uintptr when calling certain - functions. Previously, in some cases, the compiler allowed multiple - chained conversions (for example, syscall.Syscall(…, - uintptr(uintptr(ptr)), …)). The compiler - now requires exactly one conversion. Code that used multiple - conversions should be updated to satisfy the safety rules. -

      - -

      - Go 1.15 reduces typical binary sizes by around 5% compared to Go - 1.14 by eliminating certain types of GC metadata and more - aggressively eliminating unused type metadata. -

      - -

      - The toolchain now mitigates - Intel - CPU erratum SKX102 on GOARCH=amd64 by aligning - functions to 32 byte boundaries and padding jump instructions. While - this padding increases binary sizes, this is more than made up for - by the binary size improvements mentioned above. -

      - -

      - Go 1.15 adds a -spectre flag to both the - compiler and the assembler, to allow enabling Spectre mitigations. - These should almost never be needed and are provided mainly as a - “defense in depth” mechanism. - See the Spectre wiki page for details. -

      - -

      - The compiler now rejects //go: compiler directives that - have no meaning for the declaration they are applied to with a - "misplaced compiler directive" error. Such misapplied directives - were broken before, but were silently ignored by the compiler. -

      - -

      - The compiler's -json optimization logging now reports - large (>= 128 byte) copies and includes explanations of escape - analysis decisions. -

      - -

      Linker

      - -

      - This release includes substantial improvements to the Go linker, - which reduce linker resource usage (both time and memory) and - improve code robustness/maintainability. -

      - -

      - For a representative set of large Go programs, linking is 20% faster - and requires 30% less memory on average, for ELF-based - OSes (Linux, FreeBSD, NetBSD, OpenBSD, Dragonfly, and Solaris) - running on amd64 architectures, with more modest - improvements for other architecture/OS combinations. -

      - -

      - The key contributors to better linker performance are a newly - redesigned object file format, and a revamping of internal - phases to increase concurrency (for example, applying relocations to - symbols in parallel). Object files in Go 1.15 are slightly larger - than their 1.14 equivalents. -

      - -

      - These changes are part of a multi-release project - to modernize the Go - linker, meaning that there will be additional linker - improvements expected in future releases. -

      - -

      - The linker now defaults to internal linking mode - for -buildmode=pie on - linux/amd64 and linux/arm64, so these - configurations no longer require a C linker. External linking - mode (which was the default in Go 1.14 for - -buildmode=pie) can still be requested with - -ldflags=-linkmode=external flag. -

      - -

      Objdump

      - -

      - The objdump tool now supports - disassembling in GNU assembler syntax with the -gnu - flag. -

      - -

      Core library

      - -

      New embedded tzdata package

      - -

      - Go 1.15 includes a new package, - time/tzdata, - that permits embedding the timezone database into a program. - Importing this package (as import _ "time/tzdata") - permits the program to find timezone information even if the - timezone database is not available on the local system. - You can also embed the timezone database by building - with -tags timetzdata. - Either approach increases the size of the program by about 800 KB. -

      - -

      Cgo

      - -

      - Go 1.15 will translate the C type EGLConfig to the - Go type uintptr. This change is similar to how Go - 1.12 and newer treats EGLDisplay, Darwin's CoreFoundation and - Java's JNI types. See the cgo - documentation for more information. -

      - -

      - In Go 1.15.3 and later, cgo will not permit Go code to allocate an - undefined struct type (a C struct defined as just struct - S; or similar) on the stack or heap. - Go code will only be permitted to use pointers to those types. - Allocating an instance of such a struct and passing a pointer, or a - full struct value, to C code was always unsafe and unlikely to work - correctly; it is now forbidden. - The fix is to either rewrite the Go code to use only pointers, or to - ensure that the Go code sees the full definition of the struct by - including the appropriate C header file. -

      - -

      X.509 CommonName deprecation

      - -

      - The deprecated, legacy behavior of treating the CommonName - field on X.509 certificates as a host name when no Subject Alternative Names - are present is now disabled by default. It can be temporarily re-enabled by - adding the value x509ignoreCN=0 to the GODEBUG - environment variable. -

      - -

      - Note that if the CommonName is an invalid host name, it's always - ignored, regardless of GODEBUG settings. Invalid names include - those with any characters other than letters, digits, hyphens and underscores, - and those with empty labels or trailing dots. -

      - -

      Minor changes to the library

      - -

      - As always, there are various minor changes and updates to the library, - made with the Go 1 promise of compatibility - in mind. -

      - -
      bufio
      -
      -

      - When a Scanner is - used with an invalid - io.Reader that - incorrectly returns a negative number from Read, - the Scanner will no longer panic, but will instead - return the new error - ErrBadReadCount. -

      -
      -
      - -
      context
      -
      -

      - Creating a derived Context using a nil parent is now explicitly - disallowed. Any attempt to do so with the - WithValue, - WithDeadline, or - WithCancel functions - will cause a panic. -

      -
      -
      - -
      crypto
      -
      -

      - The PrivateKey and PublicKey types in the - crypto/rsa, - crypto/ecdsa, and - crypto/ed25519 packages - now have an Equal method to compare keys for equivalence - or to make type-safe interfaces for public keys. The method signature - is compatible with - go-cmp's - definition of equality. -

      - -

      - Hash now implements - fmt.Stringer. -

      -
      -
      - -
      crypto/ecdsa
      -
      -

      - The new SignASN1 - and VerifyASN1 - functions allow generating and verifying ECDSA signatures in the standard - ASN.1 DER encoding. -

      -
      -
      - -
      crypto/elliptic
      -
      -

      - The new MarshalCompressed - and UnmarshalCompressed - functions allow encoding and decoding NIST elliptic curve points in compressed format. -

      -
      -
      - -
      crypto/rsa
      -
      -

      - VerifyPKCS1v15 - now rejects invalid short signatures with missing leading zeroes, according to RFC 8017. -

      -
      -
      - -
      crypto/tls
      -
      -

      - The new - Dialer - type and its - DialContext - method permit using a context to both connect and handshake with a TLS server. -

      - -

      - The new - VerifyConnection - callback on the Config type - allows custom verification logic for every connection. It has access to the - ConnectionState - which includes peer certificates, SCTs, and stapled OCSP responses. -

      - -

      - Auto-generated session ticket keys are now automatically rotated every 24 hours, - with a lifetime of 7 days, to limit their impact on forward secrecy. -

      - -

      - Session ticket lifetimes in TLS 1.2 and earlier, where the session keys - are reused for resumed connections, are now limited to 7 days, also to - limit their impact on forward secrecy. -

      - -

      - The client-side downgrade protection checks specified in RFC 8446 are now - enforced. This has the potential to cause connection errors for clients - encountering middleboxes that behave like unauthorized downgrade attacks. -

      - -

      - SignatureScheme, - CurveID, and - ClientAuthType - now implement fmt.Stringer. -

      - -

      - The ConnectionState - fields OCSPResponse and SignedCertificateTimestamps - are now repopulated on client-side resumed connections. -

      - -

      - tls.Conn - now returns an opaque error on permanently broken connections, wrapping - the temporary - net.Error. To access the - original net.Error, use - errors.As (or - errors.Unwrap) instead of a - type assertion. -

      -
      -
      - -
      crypto/x509
      -
      -

      - If either the name on the certificate or the name being verified (with - VerifyOptions.DNSName - or VerifyHostname) - are invalid, they will now be compared case-insensitively without further - processing (without honoring wildcards or stripping trailing dots). - Invalid names include those with any characters other than letters, - digits, hyphens and underscores, those with empty labels, and names on - certificates with trailing dots. -

      - -

      - The new CreateRevocationList - function and RevocationList type - allow creating RFC 5280-compliant X.509 v2 Certificate Revocation Lists. -

      - -

      - CreateCertificate - now automatically generates the SubjectKeyId if the template - is a CA and doesn't explicitly specify one. -

      - -

      - CreateCertificate - now returns an error if the template specifies MaxPathLen but is not a CA. -

      - -

      - On Unix systems other than macOS, the SSL_CERT_DIR - environment variable can now be a colon-separated list. -

      - -

      - On macOS, binaries are now always linked against - Security.framework to extract the system trust roots, - regardless of whether cgo is available. The resulting behavior should be - more consistent with the OS verifier. -

      -
      -
      - -
      crypto/x509/pkix
      -
      -

      - Name.String - now prints non-standard attributes from - Names if - ExtraNames is nil. -

      -
      -
      - -
      database/sql
      -
      -

      - The new DB.SetConnMaxIdleTime - method allows removing a connection from the connection pool after - it has been idle for a period of time, without regard to the total - lifespan of the connection. The DBStats.MaxIdleTimeClosed - field shows the total number of connections closed due to - DB.SetConnMaxIdleTime. -

      - -

      - The new Row.Err getter - allows checking for query errors without calling - Row.Scan. -

      -
      -
      - -
      database/sql/driver
      -
      -

      - The new Validator - interface may be implemented by Conn to allow drivers - to signal if a connection is valid or if it should be discarded. -

      -
      -
      - -
      debug/pe
      -
      -

      - The package now defines the - IMAGE_FILE, IMAGE_SUBSYSTEM, - and IMAGE_DLLCHARACTERISTICS constants used by the - PE file format. -

      -
      -
      - -
      encoding/asn1
      -
      -

      - Marshal now sorts the components - of SET OF according to X.690 DER. -

      - -

      - Unmarshal now rejects tags and - Object Identifiers which are not minimally encoded according to X.690 DER. -

      -
      -
      - -
      encoding/json
      -
      -

      - The package now has an internal limit to the maximum depth of - nesting when decoding. This reduces the possibility that a - deeply nested input could use large quantities of stack memory, - or even cause a "goroutine stack exceeds limit" panic. -

      -
      -
      - -
      flag
      -
      -

      - When the flag package sees -h or -help, - and those flags are not defined, it now prints a usage message. - If the FlagSet was created with - ExitOnError, - FlagSet.Parse would then - exit with a status of 2. In this release, the exit status for -h - or -help has been changed to 0. In particular, this applies to - the default handling of command line flags. -

      -
      -
      - -
      fmt
      -
      -

      - The printing verbs %#g and %#G now preserve - trailing zeros for floating-point values. -

      -
      -
      - -
      go/format
      -
      -

      - The Source and - Node functions - now canonicalize number literal prefixes and exponents as part - of formatting Go source code. This matches the behavior of the - gofmt command as it - was implemented since Go 1.13. -

      -
      -
      - -
      html/template
      -
      -

      - The package now uses Unicode escapes (\uNNNN) in all - JavaScript and JSON contexts. This fixes escaping errors in - application/ld+json and application/json - contexts. -

      -
      -
      - -
      io/ioutil
      -
      -

      - TempDir and - TempFile - now reject patterns that contain path separators. - That is, calls such as ioutil.TempFile("/tmp", "../base*") will no longer succeed. - This prevents unintended directory traversal. -

      -
      -
      - -
      math/big
      -
      -

      - The new Int.FillBytes - method allows serializing to fixed-size pre-allocated byte slices. -

      -
      -
      - -
      math/cmplx
      -
      -

      - The functions in this package were updated to conform to the C99 standard - (Annex G IEC 60559-compatible complex arithmetic) with respect to handling - of special arguments such as infinity, NaN and signed zero. -

      -
      -
      - -
      net
      -
      -

      - If an I/O operation exceeds a deadline set by - the Conn.SetDeadline, - Conn.SetReadDeadline, - or Conn.SetWriteDeadline methods, it will now - return an error that is or wraps - os.ErrDeadlineExceeded. - This may be used to reliably detect whether an error is due to - an exceeded deadline. - Earlier releases recommended calling the Timeout - method on the error, but I/O operations can return errors for - which Timeout returns true although a - deadline has not been exceeded. -

      - -

      - The new Resolver.LookupIP - method supports IP lookups that are both network-specific and accept a context. -

      -
      -
      - -
      net/http
      -
      -

      - Parsing is now stricter as a hardening measure against request smuggling attacks: - non-ASCII white space is no longer trimmed like SP and HTAB, and support for the - "identity" Transfer-Encoding was dropped. -

      -
      -
      - -
      net/http/httputil
      -
      -

      - ReverseProxy - now supports not modifying the X-Forwarded-For - header when the incoming Request.Header map entry - for that field is nil. -

      - -

      - When a Switching Protocol (like WebSocket) request handled by - ReverseProxy - is canceled, the backend connection is now correctly closed. -

      -
      -
      - -
      net/http/pprof
      -
      -

      - All profile endpoints now support a "seconds" parameter. When present, - the endpoint profiles for the specified number of seconds and reports the difference. - The meaning of the "seconds" parameter in the cpu profile and - the trace endpoints is unchanged. -

      -
      -
      - -
      net/url
      -
      -

      - The new URL field - RawFragment and method EscapedFragment - provide detail about and control over the exact encoding of a particular fragment. - These are analogous to - RawPath and EscapedPath. -

      -

      - The new URL - method Redacted - returns the URL in string form with any password replaced with xxxxx. -

      -
      -
      - -
      os
      -
      -

      - If an I/O operation exceeds a deadline set by - the File.SetDeadline, - File.SetReadDeadline, - or File.SetWriteDeadline - methods, it will now return an error that is or wraps - os.ErrDeadlineExceeded. - This may be used to reliably detect whether an error is due to - an exceeded deadline. - Earlier releases recommended calling the Timeout - method on the error, but I/O operations can return errors for - which Timeout returns true although a - deadline has not been exceeded. -

      - -

      - Packages os and net now automatically - retry system calls that fail with EINTR. Previously - this led to spurious failures, which became more common in Go - 1.14 with the addition of asynchronous preemption. Now this is - handled transparently. -

      - -

      - The os.File type now - supports a ReadFrom - method. This permits the use of the copy_file_range - system call on some systems when using - io.Copy to copy data - from one os.File to another. A consequence is that - io.CopyBuffer - will not always use the provided buffer when copying to a - os.File. If a program wants to force the use of - the provided buffer, it can be done by writing - io.CopyBuffer(struct{ io.Writer }{dst}, src, buf). -

      -
      -
      - -
      plugin
      -
      -

      - DWARF generation is now supported (and enabled by default) for -buildmode=plugin on macOS. -

      -
      -
      -

      - Building with -buildmode=plugin is now supported on freebsd/amd64. -

      -
      -
      - -
      reflect
      -
      -

      - Package reflect now disallows accessing methods of all - non-exported fields, whereas previously it allowed accessing - those of non-exported, embedded fields. Code that relies on the - previous behavior should be updated to instead access the - corresponding promoted method of the enclosing variable. -

      -
      -
      - -
      regexp
      -
      -

      - The new Regexp.SubexpIndex - method returns the index of the first subexpression with the given name - within the regular expression. -

      -
      -
      - -
      runtime
      -
      -

      - Several functions, including - ReadMemStats - and - GoroutineProfile, - no longer block if a garbage collection is in progress. -

      -
      -
      - -
      runtime/pprof
      -
      -

      - The goroutine profile now includes the profile labels associated with each - goroutine at the time of profiling. This feature is not yet implemented for - the profile reported with debug=2. -

      -
      -
      - -
      strconv
      -
      -

      - FormatComplex and ParseComplex are added for working with complex numbers. -

      -

      - FormatComplex converts a complex number into a string of the form (a+bi), where a and b are the real and imaginary parts. -

      -

      - ParseComplex converts a string into a complex number of a specified precision. ParseComplex accepts complex numbers in the format N+Ni. -

      -
      -
      - -
      sync
      -
      -

      - The new method - Map.LoadAndDelete - atomically deletes a key and returns the previous value if present. -

      -

      - The method - Map.Delete - is more efficient. -

      -
      -
      - -
      syscall
      -
      -

      - On Unix systems, functions that use - SysProcAttr - will now reject attempts to set both the Setctty - and Foreground fields, as they both use - the Ctty field but do so in incompatible ways. - We expect that few existing programs set both fields. -

      -

      - Setting the Setctty field now requires that the - Ctty field be set to a file descriptor number in the - child process, as determined by the ProcAttr.Files field. - Using a child descriptor always worked, but there were certain - cases where using a parent file descriptor also happened to work. - Some programs that set Setctty will need to change - the value of Ctty to use a child descriptor number. -

      - -

      - It is now possible to call - system calls that return floating point values - on windows/amd64. -

      -
      -
      - -
      testing
      -
      -

      - The testing.T type now has a - Deadline method - that reports the time at which the test binary will have exceeded its - timeout. -

      - -

      - A TestMain function is no longer required to call - os.Exit. If a TestMain function returns, - the test binary will call os.Exit with the value returned - by m.Run. -

      - -

      - The new methods - T.TempDir and - B.TempDir - return temporary directories that are automatically cleaned up - at the end of the test. -

      - -

      - go test -v now groups output by - test name, rather than printing the test name on each line. -

      -
      -
      - -
      text/template
      -
      -

      - JSEscape now - consistently uses Unicode escapes (\u00XX), which are - compatible with JSON. -

      -
      -
      - -
      time
      -
      -

      - The new method - Ticker.Reset - supports changing the duration of a ticker. -

      - -

      - When returning an error, ParseDuration now quotes the original value. -

      -
      -
      diff --git a/doc/go1.2.html b/doc/go1.2.html deleted file mode 100644 index 1f6051418c..0000000000 --- a/doc/go1.2.html +++ /dev/null @@ -1,979 +0,0 @@ - - -

      Introduction to Go 1.2

      - -

      -Since the release of Go version 1.1 in April, 2013, -the release schedule has been shortened to make the release process more efficient. -This release, Go version 1.2 or Go 1.2 for short, arrives roughly six months after 1.1, -while 1.1 took over a year to appear after 1.0. -Because of the shorter time scale, 1.2 is a smaller delta than the step from 1.0 to 1.1, -but it still has some significant developments, including -a better scheduler and one new language feature. -Of course, Go 1.2 keeps the promise -of compatibility. -The overwhelming majority of programs built with Go 1.1 (or 1.0 for that matter) -will run without any changes whatsoever when moved to 1.2, -although the introduction of one restriction -to a corner of the language may expose already-incorrect code -(see the discussion of the use of nil). -

      - -

      Changes to the language

      - -

      -In the interest of firming up the specification, one corner case has been clarified, -with consequences for programs. -There is also one new language feature. -

      - -

      Use of nil

      - -

      -The language now specifies that, for safety reasons, -certain uses of nil pointers are guaranteed to trigger a run-time panic. -For instance, in Go 1.0, given code like -

      - -
      -type T struct {
      -    X [1<<24]byte
      -    Field int32
      -}
      -
      -func main() {
      -    var x *T
      -    ...
      -}
      -
      - -

      -the nil pointer x could be used to access memory incorrectly: -the expression x.Field could access memory at address 1<<24. -To prevent such unsafe behavior, in Go 1.2 the compilers now guarantee that any indirection through -a nil pointer, such as illustrated here but also in nil pointers to arrays, nil interface values, -nil slices, and so on, will either panic or return a correct, safe non-nil value. -In short, any expression that explicitly or implicitly requires evaluation of a nil address is an error. -The implementation may inject extra tests into the compiled program to enforce this behavior. -

      - -

      -Further details are in the -design document. -

      - -

      -Updating: -Most code that depended on the old behavior is erroneous and will fail when run. -Such programs will need to be updated by hand. -

      - -

      Three-index slices

      - -

      -Go 1.2 adds the ability to specify the capacity as well as the length when using a slicing operation -on an existing array or slice. -A slicing operation creates a new slice by describing a contiguous section of an already-created array or slice: -

      - -
      -var array [10]int
      -slice := array[2:4]
      -
      - -

      -The capacity of the slice is the maximum number of elements that the slice may hold, even after reslicing; -it reflects the size of the underlying array. -In this example, the capacity of the slice variable is 8. -

      - -

      -Go 1.2 adds new syntax to allow a slicing operation to specify the capacity as well as the length. -A second -colon introduces the capacity value, which must be less than or equal to the capacity of the -source slice or array, adjusted for the origin. For instance, -

      - -
      -slice = array[2:4:7]
      -
      - -

      -sets the slice to have the same length as in the earlier example but its capacity is now only 5 elements (7-2). -It is impossible to use this new slice value to access the last three elements of the original array. -

      - -

      -In this three-index notation, a missing first index ([:i:j]) defaults to zero but the other -two indices must always be specified explicitly. -It is possible that future releases of Go may introduce default values for these indices. -

      - -

      -Further details are in the -design document. -

      - -

      -Updating: -This is a backwards-compatible change that affects no existing programs. -

      - -

      Changes to the implementations and tools

      - -

      Pre-emption in the scheduler

      - -

      -In prior releases, a goroutine that was looping forever could starve out other -goroutines on the same thread, a serious problem when GOMAXPROCS -provided only one user thread. -In Go 1.2, this is partially addressed: The scheduler is invoked occasionally -upon entry to a function. -This means that any loop that includes a (non-inlined) function call can -be pre-empted, allowing other goroutines to run on the same thread. -

      - -

      Limit on the number of threads

      - -

      -Go 1.2 introduces a configurable limit (default 10,000) to the total number of threads -a single program may have in its address space, to avoid resource starvation -issues in some environments. -Note that goroutines are multiplexed onto threads so this limit does not directly -limit the number of goroutines, only the number that may be simultaneously blocked -in a system call. -In practice, the limit is hard to reach. -

      - -

      -The new SetMaxThreads function in the -runtime/debug package controls the thread count limit. -

      - -

      -Updating: -Few functions will be affected by the limit, but if a program dies because it hits the -limit, it could be modified to call SetMaxThreads to set a higher count. -Even better would be to refactor the program to need fewer threads, reducing consumption -of kernel resources. -

      - -

      Stack size

      - -

      -In Go 1.2, the minimum size of the stack when a goroutine is created has been lifted from 4KB to 8KB. -Many programs were suffering performance problems with the old size, which had a tendency -to introduce expensive stack-segment switching in performance-critical sections. -The new number was determined by empirical testing. -

      - -

      -At the other end, the new function SetMaxStack -in the runtime/debug package controls -the maximum size of a single goroutine's stack. -The default is 1GB on 64-bit systems and 250MB on 32-bit systems. -Before Go 1.2, it was too easy for a runaway recursion to consume all the memory on a machine. -

      - -

      -Updating: -The increased minimum stack size may cause programs with many goroutines to use -more memory. There is no workaround, but plans for future releases -include new stack management technology that should address the problem better. -

      - -

      Cgo and C++

      - -

      -The cgo command will now invoke the C++ -compiler to build any pieces of the linked-to library that are written in C++; -the documentation has more detail. -

      - -

      Godoc and vet moved to the go.tools subrepository

      - -

      -Both binaries are still included with the distribution, but the source code for the -godoc and vet commands has moved to the -go.tools subrepository. -

      - -

      -Also, the core of the godoc program has been split into a -library, -while the command itself is in a separate -directory. -The move allows the code to be updated easily and the separation into a library and command -makes it easier to construct custom binaries for local sites and different deployment methods. -

      - -

      -Updating: -Since godoc and vet are not part of the library, -no client Go code depends on the their source and no updating is required. -

      - -

      -The binary distributions available from golang.org -include these binaries, so users of these distributions are unaffected. -

      - -

      -When building from source, users must use "go get" to install godoc and vet. -(The binaries will continue to be installed in their usual locations, not -$GOPATH/bin.) -

      - -
      -$ go get code.google.com/p/go.tools/cmd/godoc
      -$ go get code.google.com/p/go.tools/cmd/vet
      -
      - -

      Status of gccgo

      - -

      -We expect the future GCC 4.9 release to include gccgo with full -support for Go 1.2. -In the current (4.8.2) release of GCC, gccgo implements Go 1.1.2. -

      - -

      Changes to the gc compiler and linker

      - -

      -Go 1.2 has several semantic changes to the workings of the gc compiler suite. -Most users will be unaffected by them. -

      - -

      -The cgo command now -works when C++ is included in the library being linked against. -See the cgo documentation -for details. -

      - -

      -The gc compiler displayed a vestigial detail of its origins when -a program had no package clause: it assumed -the file was in package main. -The past has been erased, and a missing package clause -is now an error. -

      - -

      -On the ARM, the toolchain supports "external linking", which -is a step towards being able to build shared libraries with the gc -toolchain and to provide dynamic linking support for environments -in which that is necessary. -

      - -

      -In the runtime for the ARM, with 5a, it used to be possible to refer -to the runtime-internal m (machine) and g -(goroutine) variables using R9 and R10 directly. -It is now necessary to refer to them by their proper names. -

      - -

      -Also on the ARM, the 5l linker (sic) now defines the -MOVBS and MOVHS instructions -as synonyms of MOVB and MOVH, -to make clearer the separation between signed and unsigned -sub-word moves; the unsigned versions already existed with a -U suffix. -

      - -

      Test coverage

      - -

      -One major new feature of go test is -that it can now compute and, with help from a new, separately installed -"go tool cover" program, display test coverage results. -

      - -

      -The cover tool is part of the -go.tools -subrepository. -It can be installed by running -

      - -
      -$ go get code.google.com/p/go.tools/cmd/cover
      -
      - -

      -The cover tool does two things. -First, when "go test" is given the -cover flag, it is run automatically -to rewrite the source for the package and insert instrumentation statements. -The test is then compiled and run as usual, and basic coverage statistics are reported: -

      - -
      -$ go test -cover fmt
      -ok  	fmt	0.060s	coverage: 91.4% of statements
      -$
      -
      - -

      -Second, for more detailed reports, different flags to "go test" can create a coverage profile file, -which the cover program, invoked with "go tool cover", can then analyze. -

      - -

      -Details on how to generate and analyze coverage statistics can be found by running the commands -

      - -
      -$ go help testflag
      -$ go tool cover -help
      -
      - -

      The go doc command is deleted

      - -

      -The "go doc" command is deleted. -Note that the godoc tool itself is not deleted, -just the wrapping of it by the go command. -All it did was show the documents for a package by package path, -which godoc itself already does with more flexibility. -It has therefore been deleted to reduce the number of documentation tools and, -as part of the restructuring of godoc, encourage better options in future. -

      - -

      -Updating: For those who still need the precise functionality of running -

      - -
      -$ go doc
      -
      - -

      -in a directory, the behavior is identical to running -

      - -
      -$ godoc .
      -
      - -

      Changes to the go command

      - -

      -The go get command -now has a -t flag that causes it to download the dependencies -of the tests run by the package, not just those of the package itself. -By default, as before, dependencies of the tests are not downloaded. -

      - -

      Performance

      - -

      -There are a number of significant performance improvements in the standard library; here are a few of them. -

      - -
        - -
      • -The compress/bzip2 -decompresses about 30% faster. -
      • - -
      • -The crypto/des package -is about five times faster. -
      • - -
      • -The encoding/json package -encodes about 30% faster. -
      • - -
      • -Networking performance on Windows and BSD systems is about 30% faster through the use -of an integrated network poller in the runtime, similar to what was done for Linux and OS X -in Go 1.1. -
      • - -
      - -

      Changes to the standard library

      - - -

      The archive/tar and archive/zip packages

      - -

      -The -archive/tar -and -archive/zip -packages have had a change to their semantics that may break existing programs. -The issue is that they both provided an implementation of the -os.FileInfo -interface that was not compliant with the specification for that interface. -In particular, their Name method returned the full -path name of the entry, but the interface specification requires that -the method return only the base name (final path element). -

      - -

      -Updating: Since this behavior was newly implemented and -a bit obscure, it is possible that no code depends on the broken behavior. -If there are programs that do depend on it, they will need to be identified -and fixed manually. -

      - -

      The new encoding package

      - -

      -There is a new package, encoding, -that defines a set of standard encoding interfaces that may be used to -build custom marshalers and unmarshalers for packages such as -encoding/xml, -encoding/json, -and -encoding/binary. -These new interfaces have been used to tidy up some implementations in -the standard library. -

      - -

      -The new interfaces are called -BinaryMarshaler, -BinaryUnmarshaler, -TextMarshaler, -and -TextUnmarshaler. -Full details are in the documentation for the package -and a separate design document. -

      - -

      The fmt package

      - -

      -The fmt package's formatted print -routines such as Printf -now allow the data items to be printed to be accessed in arbitrary order -by using an indexing operation in the formatting specifications. -Wherever an argument is to be fetched from the argument list for formatting, -either as the value to be formatted or as a width or specification integer, -a new optional indexing notation [n] -fetches argument n instead. -The value of n is 1-indexed. -After such an indexing operating, the next argument to be fetched by normal -processing will be n+1. -

      - -

      -For example, the normal Printf call -

      - -
      -fmt.Sprintf("%c %c %c\n", 'a', 'b', 'c')
      -
      - -

      -would create the string "a b c", but with indexing operations like this, -

      - -
      -fmt.Sprintf("%[3]c %[1]c %c\n", 'a', 'b', 'c')
      -
      - -

      -the result is ""c a b". The [3] index accesses the third formatting -argument, which is 'c', [1] accesses the first, 'a', -and then the next fetch accesses the argument following that one, 'b'. -

      - -

      -The motivation for this feature is programmable format statements to access -the arguments in different order for localization, but it has other uses: -

      - -
      -log.Printf("trace: value %v of type %[1]T\n", expensiveFunction(a.b[c]))
      -
      - -

      -Updating: The change to the syntax of format specifications -is strictly backwards compatible, so it affects no working programs. -

      - -

      The text/template and html/template packages

      - -

      -The -text/template package -has a couple of changes in Go 1.2, both of which are also mirrored in the -html/template package. -

      - -

      -First, there are new default functions for comparing basic types. -The functions are listed in this table, which shows their names and -the associated familiar comparison operator. -

      - - - - - - - - - - - - - - - - - - - - - - - -
      Name Operator
      eq ==
      ne !=
      lt <
      le <=
      gt >
      ge >=
      - -

      -These functions behave slightly differently from the corresponding Go operators. -First, they operate only on basic types (bool, int, -float64, string, etc.). -(Go allows comparison of arrays and structs as well, under some circumstances.) -Second, values can be compared as long as they are the same sort of value: -any signed integer value can be compared to any other signed integer value for example. (Go -does not permit comparing an int8 and an int16). -Finally, the eq function (only) allows comparison of the first -argument with one or more following arguments. The template in this example, -

      - -
      -{{"{{"}}if eq .A 1 2 3 {{"}}"}} equal {{"{{"}}else{{"}}"}} not equal {{"{{"}}end{{"}}"}}
      -
      - -

      -reports "equal" if .A is equal to any of 1, 2, or 3. -

      - -

      -The second change is that a small addition to the grammar makes "if else if" chains easier to write. -Instead of writing, -

      - -
      -{{"{{"}}if eq .A 1{{"}}"}} X {{"{{"}}else{{"}}"}} {{"{{"}}if eq .A 2{{"}}"}} Y {{"{{"}}end{{"}}"}} {{"{{"}}end{{"}}"}} 
      -
      - -

      -one can fold the second "if" into the "else" and have only one "end", like this: -

      - -
      -{{"{{"}}if eq .A 1{{"}}"}} X {{"{{"}}else if eq .A 2{{"}}"}} Y {{"{{"}}end{{"}}"}}
      -
      - -

      -The two forms are identical in effect; the difference is just in the syntax. -

      - -

      -Updating: Neither the "else if" change nor the comparison functions -affect existing programs. Those that -already define functions called eq and so on through a function -map are unaffected because the associated function map will override the new -default function definitions. -

      - -

      New packages

      - -

      -There are two new packages. -

      - - - -

      Minor changes to the library

      - -

      -The following list summarizes a number of minor changes to the library, mostly additions. -See the relevant package documentation for more information about each change. -

      - -
        - -
      • -The archive/zip package -adds the -DataOffset accessor -to return the offset of a file's (possibly compressed) data within the archive. -
      • - -
      • -The bufio package -adds Reset -methods to Reader and -Writer. -These methods allow the Readers -and Writers -to be re-used on new input and output readers and writers, saving -allocation overhead. -
      • - -
      • -The compress/bzip2 -can now decompress concatenated archives. -
      • - -
      • -The compress/flate -package adds a Reset -method on the Writer, -to make it possible to reduce allocation when, for instance, constructing an -archive to hold multiple compressed files. -
      • - -
      • -The compress/gzip package's -Writer type adds a -Reset -so it may be reused. -
      • - -
      • -The compress/zlib package's -Writer type adds a -Reset -so it may be reused. -
      • - -
      • -The container/heap package -adds a Fix -method to provide a more efficient way to update an item's position in the heap. -
      • - -
      • -The container/list package -adds the MoveBefore -and -MoveAfter -methods, which implement the obvious rearrangement. -
      • - -
      • -The crypto/cipher package -adds the a new GCM mode (Galois Counter Mode), which is almost always -used with AES encryption. -
      • - -
      • -The -crypto/md5 package -adds a new Sum function -to simplify hashing without sacrificing performance. -
      • - -
      • -Similarly, the -crypto/sha1 package -adds a new Sum function. -
      • - -
      • -Also, the -crypto/sha256 package -adds Sum256 -and Sum224 functions. -
      • - -
      • -Finally, the crypto/sha512 package -adds Sum512 and -Sum384 functions. -
      • - -
      • -The crypto/x509 package -adds support for reading and writing arbitrary extensions. -
      • - -
      • -The crypto/tls package adds -support for TLS 1.1, 1.2 and AES-GCM. -
      • - -
      • -The database/sql package adds a -SetMaxOpenConns -method on DB to limit the -number of open connections to the database. -
      • - -
      • -The encoding/csv package -now always allows trailing commas on fields. -
      • - -
      • -The encoding/gob package -now treats channel and function fields of structures as if they were unexported, -even if they are not. That is, it ignores them completely. Previously they would -trigger an error, which could cause unexpected compatibility problems if an -embedded structure added such a field. -The package also now supports the generic BinaryMarshaler and -BinaryUnmarshaler interfaces of the -encoding package -described above. -
      • - -
      • -The encoding/json package -now will always escape ampersands as "\u0026" when printing strings. -It will now accept but correct invalid UTF-8 in -Marshal -(such input was previously rejected). -Finally, it now supports the generic encoding interfaces of the -encoding package -described above. -
      • - -
      • -The encoding/xml package -now allows attributes stored in pointers to be marshaled. -It also supports the generic encoding interfaces of the -encoding package -described above through the new -Marshaler, -Unmarshaler, -and related -MarshalerAttr and -UnmarshalerAttr -interfaces. -The package also adds a -Flush method -to the -Encoder -type for use by custom encoders. See the documentation for -EncodeToken -to see how to use it. -
      • - -
      • -The flag package now -has a Getter interface -to allow the value of a flag to be retrieved. Due to the -Go 1 compatibility guidelines, this method cannot be added to the existing -Value -interface, but all the existing standard flag types implement it. -The package also now exports the CommandLine -flag set, which holds the flags from the command line. -
      • - -
      • -The go/ast package's -SliceExpr struct -has a new boolean field, Slice3, which is set to true -when representing a slice expression with three indices (two colons). -The default is false, representing the usual two-index form. -
      • - -
      • -The go/build package adds -the AllTags field -to the Package type, -to make it easier to process build tags. -
      • - -
      • -The image/draw package now -exports an interface, Drawer, -that wraps the standard Draw method. -The Porter-Duff operators now implement this interface, in effect binding an operation to -the draw operator rather than providing it explicitly. -Given a paletted image as its destination, the new -FloydSteinberg -implementation of the -Drawer -interface will use the Floyd-Steinberg error diffusion algorithm to draw the image. -To create palettes suitable for such processing, the new -Quantizer interface -represents implementations of quantization algorithms that choose a palette -given a full-color image. -There are no implementations of this interface in the library. -
      • - -
      • -The image/gif package -can now create GIF files using the new -Encode -and EncodeAll -functions. -Their options argument allows specification of an image -Quantizer to use; -if it is nil, the generated GIF will use the -Plan9 -color map (palette) defined in the new -image/color/palette package. -The options also specify a -Drawer -to use to create the output image; -if it is nil, Floyd-Steinberg error diffusion is used. -
      • - -
      • -The Copy method of the -io package now prioritizes its -arguments differently. -If one argument implements WriterTo -and the other implements ReaderFrom, -Copy will now invoke -WriterTo to do the work, -so that less intermediate buffering is required in general. -
      • - -
      • -The net package requires cgo by default -because the host operating system must in general mediate network call setup. -On some systems, though, it is possible to use the network without cgo, and useful -to do so, for instance to avoid dynamic linking. -The new build tag netgo (off by default) allows the construction of a -net package in pure Go on those systems where it is possible. -
      • - -
      • -The net package adds a new field -DualStack to the Dialer -struct for TCP connection setup using a dual IP stack as described in -RFC 6555. -
      • - -
      • -The net/http package will no longer -transmit cookies that are incorrect according to -RFC 6265. -It just logs an error and sends nothing. -Also, -the net/http package's -ReadResponse -function now permits the *Request parameter to be nil, -whereupon it assumes a GET request. -Finally, an HTTP server will now serve HEAD -requests transparently, without the need for special casing in handler code. -While serving a HEAD request, writes to a -Handler's -ResponseWriter -are absorbed by the -Server -and the client receives an empty body as required by the HTTP specification. -
      • - -
      • -The os/exec package's -Cmd.StdinPipe method -returns an io.WriteCloser, but has changed its concrete -implementation from *os.File to an unexported type that embeds -*os.File, and it is now safe to close the returned value. -Before Go 1.2, there was an unavoidable race that this change fixes. -Code that needs access to the methods of *os.File can use an -interface type assertion, such as wc.(interface{ Sync() error }). -
      • - -
      • -The runtime package relaxes -the constraints on finalizer functions in -SetFinalizer: the -actual argument can now be any type that is assignable to the formal type of -the function, as is the case for any normal function call in Go. -
      • - -
      • -The sort package has a new -Stable function that implements -stable sorting. It is less efficient than the normal sort algorithm, however. -
      • - -
      • -The strings package adds -an IndexByte -function for consistency with the bytes package. -
      • - -
      • -The sync/atomic package -adds a new set of swap functions that atomically exchange the argument with the -value stored in the pointer, returning the old value. -The functions are -SwapInt32, -SwapInt64, -SwapUint32, -SwapUint64, -SwapUintptr, -and -SwapPointer, -which swaps an unsafe.Pointer. -
      • - -
      • -The syscall package now implements -Sendfile for Darwin. -
      • - -
      • -The testing package -now exports the TB interface. -It records the methods in common with the -T -and -B types, -to make it easier to share code between tests and benchmarks. -Also, the -AllocsPerRun -function now quantizes the return value to an integer (although it -still has type float64), to round off any error caused by -initialization and make the result more repeatable. -
      • - -
      • -The text/template package -now automatically dereferences pointer values when evaluating the arguments -to "escape" functions such as "html", to bring the behavior of such functions -in agreement with that of other printing functions such as "printf". -
      • - -
      • -In the time package, the -Parse function -and -Format -method -now handle time zone offsets with seconds, such as in the historical -date "1871-01-01T05:33:02+00:34:08". -Also, pattern matching in the formats for those routines is stricter: a non-lowercase letter -must now follow the standard words such as "Jan" and "Mon". -
      • - -
      • -The unicode package -adds In, -a nicer-to-use but equivalent version of the original -IsOneOf, -to see whether a character is a member of a Unicode category. -
      • - -
      diff --git a/doc/go1.3.html b/doc/go1.3.html deleted file mode 100644 index 18b3ec65d2..0000000000 --- a/doc/go1.3.html +++ /dev/null @@ -1,608 +0,0 @@ - - -

      Introduction to Go 1.3

      - -

      -The latest Go release, version 1.3, arrives six months after 1.2, -and contains no language changes. -It focuses primarily on implementation work, providing -precise garbage collection, -a major refactoring of the compiler toolchain that results in -faster builds, especially for large projects, -significant performance improvements across the board, -and support for DragonFly BSD, Solaris, Plan 9 and Google's Native Client architecture (NaCl). -It also has an important refinement to the memory model regarding synchronization. -As always, Go 1.3 keeps the promise -of compatibility, -and almost everything -will continue to compile and run without change when moved to 1.3. -

      - -

      Changes to the supported operating systems and architectures

      - -

      Removal of support for Windows 2000

      - -

      -Microsoft stopped supporting Windows 2000 in 2010. -Since it has implementation difficulties -regarding exception handling (signals in Unix terminology), -as of Go 1.3 it is not supported by Go either. -

      - -

      Support for DragonFly BSD

      - -

      -Go 1.3 now includes experimental support for DragonFly BSD on the amd64 (64-bit x86) and 386 (32-bit x86) architectures. -It uses DragonFly BSD 3.6 or above. -

      - -

      Support for FreeBSD

      - -

      -It was not announced at the time, but since the release of Go 1.2, support for Go on FreeBSD -requires FreeBSD 8 or above. -

      - -

      -As of Go 1.3, support for Go on FreeBSD requires that the kernel be compiled with the -COMPAT_FREEBSD32 flag configured. -

      - -

      -In concert with the switch to EABI syscalls for ARM platforms, Go 1.3 will run only on FreeBSD 10. -The x86 platforms, 386 and amd64, are unaffected. -

      - -

      Support for Native Client

      - -

      -Support for the Native Client virtual machine architecture has returned to Go with the 1.3 release. -It runs on the 32-bit Intel architectures (GOARCH=386) and also on 64-bit Intel, but using -32-bit pointers (GOARCH=amd64p32). -There is not yet support for Native Client on ARM. -Note that this is Native Client (NaCl), not Portable Native Client (PNaCl). -Details about Native Client are here; -how to set up the Go version is described here. -

      - -

      Support for NetBSD

      - -

      -As of Go 1.3, support for Go on NetBSD requires NetBSD 6.0 or above. -

      - -

      Support for OpenBSD

      - -

      -As of Go 1.3, support for Go on OpenBSD requires OpenBSD 5.5 or above. -

      - -

      Support for Plan 9

      - -

      -Go 1.3 now includes experimental support for Plan 9 on the 386 (32-bit x86) architecture. -It requires the Tsemacquire syscall, which has been in Plan 9 since June, 2012. -

      - -

      Support for Solaris

      - -

      -Go 1.3 now includes experimental support for Solaris on the amd64 (64-bit x86) architecture. -It requires illumos, Solaris 11 or above. -

      - -

      Changes to the memory model

      - -

      -The Go 1.3 memory model adds a new rule -concerning sending and receiving on buffered channels, -to make explicit that a buffered channel can be used as a simple -semaphore, using a send into the -channel to acquire and a receive from the channel to release. -This is not a language change, just a clarification about an expected property of communication. -

      - -

      Changes to the implementations and tools

      - -

      Stack

      - -

      -Go 1.3 has changed the implementation of goroutine stacks away from the old, -"segmented" model to a contiguous model. -When a goroutine needs more stack -than is available, its stack is transferred to a larger single block of memory. -The overhead of this transfer operation amortizes well and eliminates the old "hot spot" -problem when a calculation repeatedly steps across a segment boundary. -Details including performance numbers are in this -design document. -

      - -

      Changes to the garbage collector

      - -

      -For a while now, the garbage collector has been precise when examining -values in the heap; the Go 1.3 release adds equivalent precision to values on the stack. -This means that a non-pointer Go value such as an integer will never be mistaken for a -pointer and prevent unused memory from being reclaimed. -

      - -

      -Starting with Go 1.3, the runtime assumes that values with pointer type -contain pointers and other values do not. -This assumption is fundamental to the precise behavior of both stack expansion -and garbage collection. -Programs that use package unsafe -to store integers in pointer-typed values are illegal and will crash if the runtime detects the behavior. -Programs that use package unsafe to store pointers -in integer-typed values are also illegal but more difficult to diagnose during execution. -Because the pointers are hidden from the runtime, a stack expansion or garbage collection -may reclaim the memory they point at, creating -dangling pointers. -

      - -

      -Updating: Code that uses unsafe.Pointer to convert -an integer-typed value held in memory into a pointer is illegal and must be rewritten. -Such code can be identified by go vet. -

      - -

      Map iteration

      - -

      -Iterations over small maps no longer happen in a consistent order. -Go 1 defines that “The iteration order over maps -is not specified and is not guaranteed to be the same from one iteration to the next.” -To keep code from depending on map iteration order, -Go 1.0 started each map iteration at a random index in the map. -A new map implementation introduced in Go 1.1 neglected to randomize -iteration for maps with eight or fewer entries, although the iteration order -can still vary from system to system. -This has allowed people to write Go 1.1 and Go 1.2 programs that -depend on small map iteration order and therefore only work reliably on certain systems. -Go 1.3 reintroduces random iteration for small maps in order to flush out these bugs. -

      - -

      -Updating: If code assumes a fixed iteration order for small maps, -it will break and must be rewritten not to make that assumption. -Because only small maps are affected, the problem arises most often in tests. -

      - - - -

      -As part of the general overhaul to -the Go linker, the compilers and linkers have been refactored. -The linker is still a C program, but now the instruction selection phase that -was part of the linker has been moved to the compiler through the creation of a new -library called liblink. -By doing instruction selection only once, when the package is first compiled, -this can speed up compilation of large projects significantly. -

      - -

      -Updating: Although this is a major internal change, it should have no -effect on programs. -

      - -

      Status of gccgo

      - -

      -GCC release 4.9 will contain the Go 1.2 (not 1.3) version of gccgo. -The release schedules for the GCC and Go projects do not coincide, -which means that 1.3 will be available in the development branch but -that the next GCC release, 4.10, will likely have the Go 1.4 version of gccgo. -

      - -

      Changes to the go command

      - -

      -The cmd/go command has several new -features. -The go run and -go test subcommands -support a new -exec option to specify an alternate -way to run the resulting binary. -Its immediate purpose is to support NaCl. -

      - -

      -The test coverage support of the go test -subcommand now automatically sets the coverage mode to -atomic -when the race detector is enabled, to eliminate false reports about unsafe -access to coverage counters. -

      - -

      -The go test subcommand -now always builds the package, even if it has no test files. -Previously, it would do nothing if no test files were present. -

      - -

      -The go build subcommand -supports a new -i option to install dependencies -of the specified target, but not the target itself. -

      - -

      -Cross compiling with cgo enabled -is now supported. -The CC_FOR_TARGET and CXX_FOR_TARGET environment -variables are used when running all.bash to specify the cross compilers -for C and C++ code, respectively. -

      - -

      -Finally, the go command now supports packages that import Objective-C -files (suffixed .m) through cgo. -

      - -

      Changes to cgo

      - -

      -The cmd/cgo command, -which processes import "C" declarations in Go packages, -has corrected a serious bug that may cause some packages to stop compiling. -Previously, all pointers to incomplete struct types translated to the Go type *[0]byte, -with the effect that the Go compiler could not diagnose passing one kind of struct pointer -to a function expecting another. -Go 1.3 corrects this mistake by translating each different -incomplete struct to a different named type. -

      - -

      -Given the C declaration typedef struct S T for an incomplete struct S, -some Go code used this bug to refer to the types C.struct_S and C.T interchangeably. -Cgo now explicitly allows this use, even for completed struct types. -However, some Go code also used this bug to pass (for example) a *C.FILE -from one package to another. -This is not legal and no longer works: in general Go packages -should avoid exposing C types and names in their APIs. -

      - -

      -Updating: Code confusing pointers to incomplete types or -passing them across package boundaries will no longer compile -and must be rewritten. -If the conversion is correct and must be preserved, -use an explicit conversion via unsafe.Pointer. -

      - -

      SWIG 3.0 required for programs that use SWIG

      - -

      -For Go programs that use SWIG, SWIG version 3.0 is now required. -The cmd/go command will now link the -SWIG generated object files directly into the binary, rather than -building and linking with a shared library. -

      - -

      Command-line flag parsing

      - -

      -In the gc toolchain, the assemblers now use the -same command-line flag parsing rules as the Go flag package, a departure -from the traditional Unix flag parsing. -This may affect scripts that invoke the tool directly. -For example, -go tool 6a -SDfoo must now be written -go tool 6a -S -D foo. -(The same change was made to the compilers and linkers in Go 1.1.) -

      - -

      Changes to godoc

      -

      -When invoked with the -analysis flag, -godoc -now performs sophisticated static -analysis of the code it indexes. -The results of analysis are presented in both the source view and the -package documentation view, and include the call graph of each package -and the relationships between -definitions and references, -types and their methods, -interfaces and their implementations, -send and receive operations on channels, -functions and their callers, and -call sites and their callees. -

      - -

      Miscellany

      - -

      -The program misc/benchcmp that compares -performance across benchmarking runs has been rewritten. -Once a shell and awk script in the main repository, it is now a Go program in the go.tools repo. -Documentation is here. -

      - -

      -For the few of us that build Go distributions, the tool misc/dist has been -moved and renamed; it now lives in misc/makerelease, still in the main repository. -

      - -

      Performance

      - -

      -The performance of Go binaries for this release has improved in many cases due to changes -in the runtime and garbage collection, plus some changes to libraries. -Significant instances include: -

      - -
        - -
      • -The runtime handles defers more efficiently, reducing the memory footprint by about two kilobytes -per goroutine that calls defer. -
      • - -
      • -The garbage collector has been sped up, using a concurrent sweep algorithm, -better parallelization, and larger pages. -The cumulative effect can be a 50-70% reduction in collector pause time. -
      • - -
      • -The race detector (see this guide) -is now about 40% faster. -
      • - -
      • -The regular expression package regexp -is now significantly faster for certain simple expressions due to the implementation of -a second, one-pass execution engine. -The choice of which engine to use is automatic; -the details are hidden from the user. -
      • - -
      - -

      -Also, the runtime now includes in stack dumps how long a goroutine has been blocked, -which can be useful information when debugging deadlocks or performance issues. -

      - -

      Changes to the standard library

      - -

      New packages

      - -

      -A new package debug/plan9obj was added to the standard library. -It implements access to Plan 9 a.out object files. -

      - -

      Major changes to the library

      - -

      -A previous bug in crypto/tls -made it possible to skip verification in TLS inadvertently. -In Go 1.3, the bug is fixed: one must specify either ServerName or -InsecureSkipVerify, and if ServerName is specified it is enforced. -This may break existing code that incorrectly depended on insecure -behavior. -

      - -

      -There is an important new type added to the standard library: sync.Pool. -It provides an efficient mechanism for implementing certain types of caches whose memory -can be reclaimed automatically by the system. -

      - -

      -The testing package's benchmarking helper, -B, now has a -RunParallel method -to make it easier to run benchmarks that exercise multiple CPUs. -

      - -

      -Updating: The crypto/tls fix may break existing code, but such -code was erroneous and should be updated. -

      - -

      Minor changes to the library

      - -

      -The following list summarizes a number of minor changes to the library, mostly additions. -See the relevant package documentation for more information about each change. -

      - -
        - -
      • In the crypto/tls package, -a new DialWithDialer -function lets one establish a TLS connection using an existing dialer, making it easier -to control dial options such as timeouts. -The package also now reports the TLS version used by the connection in the -ConnectionState -struct. -
      • - -
      • The CreateCertificate -function of the crypto/tls package -now supports parsing (and elsewhere, serialization) of PKCS #10 certificate -signature requests. -
      • - -
      • -The formatted print functions of the fmt package now define %F -as a synonym for %f when printing floating-point values. -
      • - -
      • -The math/big package's -Int and -Rat types -now implement -encoding.TextMarshaler and -encoding.TextUnmarshaler. -
      • - -
      • -The complex power function, Pow, -now specifies the behavior when the first argument is zero. -It was undefined before. -The details are in the documentation for the function. -
      • - -
      • -The net/http package now exposes the -properties of a TLS connection used to make a client request in the new -Response.TLS field. -
      • - -
      • -The net/http package now -allows setting an optional server error logger -with Server.ErrorLog. -The default is still that all errors go to stderr. -
      • - -
      • -The net/http package now -supports disabling HTTP keep-alive connections on the server -with Server.SetKeepAlivesEnabled. -The default continues to be that the server does keep-alive (reuses -connections for multiple requests) by default. -Only resource-constrained servers or those in the process of graceful -shutdown will want to disable them. -
      • - -
      • -The net/http package adds an optional -Transport.TLSHandshakeTimeout -setting to cap the amount of time HTTP client requests will wait for -TLS handshakes to complete. -It's now also set by default -on DefaultTransport. -
      • - -
      • -The net/http package's -DefaultTransport, -used by the HTTP client code, now -enables TCP -keep-alives by default. -Other Transport -values with a nil Dial field continue to function the same -as before: no TCP keep-alives are used. -
      • - -
      • -The net/http package -now enables TCP -keep-alives for incoming server requests when -ListenAndServe -or -ListenAndServeTLS -are used. -When a server is started otherwise, TCP keep-alives are not enabled. -
      • - -
      • -The net/http package now -provides an -optional Server.ConnState -callback to hook various phases of a server connection's lifecycle -(see ConnState). -This can be used to implement rate limiting or graceful shutdown. -
      • - -
      • -The net/http package's HTTP -client now has an -optional Client.Timeout -field to specify an end-to-end timeout on requests made using the -client. -
      • - -
      • -The net/http package's -Request.ParseMultipartForm -method will now return an error if the body's Content-Type -is not multipart/form-data. -Prior to Go 1.3 it would silently fail and return nil. -Code that relies on the previous behavior should be updated. -
      • - -
      • In the net package, -the Dialer struct now -has a KeepAlive option to specify a keep-alive period for the connection. -
      • - -
      • -The net/http package's -Transport -now closes Request.Body -consistently, even on error. -
      • - -
      • -The os/exec package now implements -what the documentation has always said with regard to relative paths for the binary. -In particular, it only calls LookPath -when the binary's file name contains no path separators. -
      • - -
      • -The SetMapIndex -function in the reflect package -no longer panics when deleting from a nil map. -
      • - -
      • -If the main goroutine calls -runtime.Goexit -and all other goroutines finish execution, the program now always crashes, -reporting a detected deadlock. -Earlier versions of Go handled this situation inconsistently: most instances -were reported as deadlocks, but some trivial cases exited cleanly instead. -
      • - -
      • -The runtime/debug package now has a new function -debug.WriteHeapDump -that writes out a description of the heap. -
      • - -
      • -The CanBackquote -function in the strconv package -now considers the DEL character, U+007F, to be -non-printing. -
      • - -
      • -The syscall package now provides -SendmsgN -as an alternate version of -Sendmsg -that returns the number of bytes written. -
      • - -
      • -On Windows, the syscall package now -supports the cdecl calling convention through the addition of a new function -NewCallbackCDecl -alongside the existing function -NewCallback. -
      • - -
      • -The testing package now -diagnoses tests that call panic(nil), which are almost always erroneous. -Also, tests now write profiles (if invoked with profiling flags) even on failure. -
      • - -
      • -The unicode package and associated -support throughout the system has been upgraded from -Unicode 6.2.0 to Unicode 6.3.0. -
      • - -
      diff --git a/doc/go1.4.html b/doc/go1.4.html deleted file mode 100644 index c8f7c9c525..0000000000 --- a/doc/go1.4.html +++ /dev/null @@ -1,896 +0,0 @@ - - -

      Introduction to Go 1.4

      - -

      -The latest Go release, version 1.4, arrives as scheduled six months after 1.3. -

      - -

      -It contains only one tiny language change, -in the form of a backwards-compatible simple variant of for-range loop, -and a possibly breaking change to the compiler involving methods on pointers-to-pointers. -

      - -

      -The release focuses primarily on implementation work, improving the garbage collector -and preparing the ground for a fully concurrent collector to be rolled out in the -next few releases. -Stacks are now contiguous, reallocated when necessary rather than linking on new -"segments"; -this release therefore eliminates the notorious "hot stack split" problem. -There are some new tools available including support in the go command -for build-time source code generation. -The release also adds support for ARM processors on Android and Native Client (NaCl) -and for AMD64 on Plan 9. -

      - -

      -As always, Go 1.4 keeps the promise -of compatibility, -and almost everything -will continue to compile and run without change when moved to 1.4. -

      - -

      Changes to the language

      - -

      For-range loops

      -

      -Up until Go 1.3, for-range loop had two forms -

      - -
      -for i, v := range x {
      -	...
      -}
      -
      - -

      -and -

      - -
      -for i := range x {
      -	...
      -}
      -
      - -

      -If one was not interested in the loop values, only the iteration itself, it was still -necessary to mention a variable (probably the blank identifier, as in -for _ = range x), because -the form -

      - -
      -for range x {
      -	...
      -}
      -
      - -

      -was not syntactically permitted. -

      - -

      -This situation seemed awkward, so as of Go 1.4 the variable-free form is now legal. -The pattern arises rarely but the code can be cleaner when it does. -

      - -

      -Updating: The change is strictly backwards compatible to existing Go -programs, but tools that analyze Go parse trees may need to be modified to accept -this new form as the -Key field of RangeStmt -may now be nil. -

      - -

      Method calls on **T

      - -

      -Given these declarations, -

      - -
      -type T int
      -func (T) M() {}
      -var x **T
      -
      - -

      -both gc and gccgo accepted the method call -

      - -
      -x.M()
      -
      - -

      -which is a double dereference of the pointer-to-pointer x. -The Go specification allows a single dereference to be inserted automatically, -but not two, so this call is erroneous according to the language definition. -It has therefore been disallowed in Go 1.4, which is a breaking change, -although very few programs will be affected. -

      - -

      -Updating: Code that depends on the old, erroneous behavior will no longer -compile but is easy to fix by adding an explicit dereference. -

      - -

      Changes to the supported operating systems and architectures

      - -

      Android

      - -

      -Go 1.4 can build binaries for ARM processors running the Android operating system. -It can also build a .so library that can be loaded by an Android application -using the supporting packages in the mobile subrepository. -A brief description of the plans for this experimental port are available -here. -

      - -

      NaCl on ARM

      - -

      -The previous release introduced Native Client (NaCl) support for the 32-bit x86 -(GOARCH=386) -and 64-bit x86 using 32-bit pointers (GOARCH=amd64p32). -The 1.4 release adds NaCl support for ARM (GOARCH=arm). -

      - -

      Plan9 on AMD64

      - -

      -This release adds support for the Plan 9 operating system on AMD64 processors, -provided the kernel supports the nsec system call and uses 4K pages. -

      - -

      Changes to the compatibility guidelines

      - -

      -The unsafe package allows one -to defeat Go's type system by exploiting internal details of the implementation -or machine representation of data. -It was never explicitly specified what use of unsafe meant -with respect to compatibility as specified in the -Go compatibility guidelines. -The answer, of course, is that we can make no promise of compatibility -for code that does unsafe things. -

      - -

      -We have clarified this situation in the documentation included in the release. -The Go compatibility guidelines and the -docs for the unsafe package -are now explicit that unsafe code is not guaranteed to remain compatible. -

      - -

      -Updating: Nothing technical has changed; this is just a clarification -of the documentation. -

      - - -

      Changes to the implementations and tools

      - -

      Changes to the runtime

      - -

      -Prior to Go 1.4, the runtime (garbage collector, concurrency support, interface management, -maps, slices, strings, ...) was mostly written in C, with some assembler support. -In 1.4, much of the code has been translated to Go so that the garbage collector can scan -the stacks of programs in the runtime and get accurate information about what variables -are active. -This change was large but should have no semantic effect on programs. -

      - -

      -This rewrite allows the garbage collector in 1.4 to be fully precise, -meaning that it is aware of the location of all active pointers in the program. -This means the heap will be smaller as there will be no false positives keeping non-pointers alive. -Other related changes also reduce the heap size, which is smaller by 10%-30% overall -relative to the previous release. -

      - -

      -A consequence is that stacks are no longer segmented, eliminating the "hot split" problem. -When a stack limit is reached, a new, larger stack is allocated, all active frames for -the goroutine are copied there, and any pointers into the stack are updated. -Performance can be noticeably better in some cases and is always more predictable. -Details are available in the design document. -

      - -

      -The use of contiguous stacks means that stacks can start smaller without triggering performance issues, -so the default starting size for a goroutine's stack in 1.4 has been reduced from 8192 bytes to 2048 bytes. -

      - -

      -As preparation for the concurrent garbage collector scheduled for the 1.5 release, -writes to pointer values in the heap are now done by a function call, -called a write barrier, rather than directly from the function updating the value. -In this next release, this will permit the garbage collector to mediate writes to the heap while it is running. -This change has no semantic effect on programs in 1.4, but was -included in the release to test the compiler and the resulting performance. -

      - -

      -The implementation of interface values has been modified. -In earlier releases, the interface contained a word that was either a pointer or a one-word -scalar value, depending on the type of the concrete object stored. -This implementation was problematical for the garbage collector, -so as of 1.4 interface values always hold a pointer. -In running programs, most interface values were pointers anyway, -so the effect is minimal, but programs that store integers (for example) in -interfaces will see more allocations. -

      - -

      -As of Go 1.3, the runtime crashes if it finds a memory word that should contain -a valid pointer but instead contains an obviously invalid pointer (for example, the value 3). -Programs that store integers in pointer values may run afoul of this check and crash. -In Go 1.4, setting the GODEBUG variable -invalidptr=0 disables -the crash as a workaround, but we cannot guarantee that future releases will be -able to avoid the crash; the correct fix is to rewrite code not to alias integers and pointers. -

      - -

      Assembly

      - -

      -The language accepted by the assemblers cmd/5a, cmd/6a -and cmd/8a has had several changes, -mostly to make it easier to deliver type information to the runtime. -

      - -

      -First, the textflag.h file that defines flags for TEXT directives -has been copied from the linker source directory to a standard location so it can be -included with the simple directive -

      - -
      -#include "textflag.h"
      -
      - -

      -The more important changes are in how assembler source can define the necessary -type information. -For most programs it will suffice to move data -definitions (DATA and GLOBL directives) -out of assembly into Go files -and to write a Go declaration for each assembly function. -The assembly document describes what to do. -

      - -

      -Updating: -Assembly files that include textflag.h from its old -location will still work, but should be updated. -For the type information, most assembly routines will need no change, -but all should be examined. -Assembly source files that define data, -functions with non-empty stack frames, or functions that return pointers -need particular attention. -A description of the necessary (but simple) changes -is in the assembly document. -

      - -

      -More information about these changes is in the assembly document. -

      - -

      Status of gccgo

      - -

      -The release schedules for the GCC and Go projects do not coincide. -GCC release 4.9 contains the Go 1.2 version of gccgo. -The next release, GCC 5, will likely have the Go 1.4 version of gccgo. -

      - -

      Internal packages

      - -

      -Go's package system makes it easy to structure programs into components with clean boundaries, -but there are only two forms of access: local (unexported) and global (exported). -Sometimes one wishes to have components that are not exported, -for instance to avoid acquiring clients of interfaces to code that is part of a public repository -but not intended for use outside the program to which it belongs. -

      - -

      -The Go language does not have the power to enforce this distinction, but as of Go 1.4 the -go command introduces -a mechanism to define "internal" packages that may not be imported by packages outside -the source subtree in which they reside. -

      - -

      -To create such a package, place it in a directory named internal or in a subdirectory of a directory -named internal. -When the go command sees an import of a package with internal in its path, -it verifies that the package doing the import -is within the tree rooted at the parent of the internal directory. -For example, a package .../a/b/c/internal/d/e/f -can be imported only by code in the directory tree rooted at .../a/b/c. -It cannot be imported by code in .../a/b/g or in any other repository. -

      - -

      -For Go 1.4, the internal package mechanism is enforced for the main Go repository; -from 1.5 and onward it will be enforced for any repository. -

      - -

      -Full details of the mechanism are in -the design document. -

      - -

      Canonical import paths

      - -

      -Code often lives in repositories hosted by public services such as github.com, -meaning that the import paths for packages begin with the name of the hosting service, -github.com/rsc/pdf for example. -One can use -an existing mechanism -to provide a "custom" or "vanity" import path such as -rsc.io/pdf, but -that creates two valid import paths for the package. -That is a problem: one may inadvertently import the package through the two -distinct paths in a single program, which is wasteful; -miss an update to a package because the path being used is not recognized to be -out of date; -or break clients using the old path by moving the package to a different hosting service. -

      - -

      -Go 1.4 introduces an annotation for package clauses in Go source that identify a canonical -import path for the package. -If an import is attempted using a path that is not canonical, -the go command -will refuse to compile the importing package. -

      - -

      -The syntax is simple: put an identifying comment on the package line. -For our example, the package clause would read: -

      - -
      -package pdf // import "rsc.io/pdf"
      -
      - -

      -With this in place, -the go command will -refuse to compile a package that imports github.com/rsc/pdf, -ensuring that the code can be moved without breaking users. -

      - -

      -The check is at build time, not download time, so if go get -fails because of this check, the mis-imported package has been copied to the local machine -and should be removed manually. -

      - -

      -To complement this new feature, a check has been added at update time to verify -that the local package's remote repository matches that of its custom import. -The go get -u command will fail to -update a package if its remote repository has changed since it was first -downloaded. -The new -f flag overrides this check. -

      - -

      -Further information is in -the design document. -

      - -

      Import paths for the subrepositories

      - -

      -The Go project subrepositories (code.google.com/p/go.tools and so on) -are now available under custom import paths replacing code.google.com/p/go. with golang.org/x/, -as in golang.org/x/tools. -We will add canonical import comments to the code around June 1, 2015, -at which point Go 1.4 and later will stop accepting the old code.google.com paths. -

      - -

      -Updating: All code that imports from subrepositories should change -to use the new golang.org paths. -Go 1.0 and later can resolve and import the new paths, so updating will not break -compatibility with older releases. -Code that has not updated will stop compiling with Go 1.4 around June 1, 2015. -

      - -

      The go generate subcommand

      - -

      -The go command has a new subcommand, -go generate, -to automate the running of tools to generate source code before compilation. -For example, it can be used to run the yacc -compiler-compiler on a .y file to produce the Go source file implementing the grammar, -or to automate the generation of String methods for typed constants using the new -stringer -tool in the golang.org/x/tools subrepository. -

      - -

      -For more information, see the -design document. -

      - -

      Change to file name handling

      - -

      -Build constraints, also known as build tags, control compilation by including or excluding files -(see the documentation /go/build). -Compilation can also be controlled by the name of the file itself by "tagging" the file with -a suffix (before the .go or .s extension) with an underscore -and the name of the architecture or operating system. -For instance, the file gopher_arm.go will only be compiled if the target -processor is an ARM. -

      - -

      -Before Go 1.4, a file called just arm.go was similarly tagged, but this behavior -can break sources when new architectures are added, causing files to suddenly become tagged. -In 1.4, therefore, a file will be tagged in this manner only if the tag (architecture or operating -system name) is preceded by an underscore. -

      - -

      -Updating: Packages that depend on the old behavior will no longer compile correctly. -Files with names like windows.go or amd64.go should either -have explicit build tags added to the source or be renamed to something like -os_windows.go or support_amd64.go. -

      - -

      Other changes to the go command

      - -

      -There were a number of minor changes to the -cmd/go -command worth noting. -

      - -
        - -
      • -Unless cgo is being used to build the package, -the go command now refuses to compile C source files, -since the relevant C compilers -(6c etc.) -are intended to be removed from the installation in some future release. -(They are used today only to build part of the runtime.) -It is difficult to use them correctly in any case, so any extant uses are likely incorrect, -so we have disabled them. -
      • - -
      • -The go test -subcommand has a new flag, -o, to set the name of the resulting binary, -corresponding to the same flag in other subcommands. -The non-functional -file flag has been removed. -
      • - -
      • -The go test -subcommand will compile and link all *_test.go files in the package, -even when there are no Test functions in them. -It previously ignored such files. -
      • - -
      • -The behavior of the -go build -subcommand's --a flag has been changed for non-development installations. -For installations running a released distribution, the -a flag will no longer -rebuild the standard library and commands, to avoid overwriting the installation's files. -
      • - -
      - -

      Changes to package source layout

      - -

      -In the main Go source repository, the source code for the packages was kept in -the directory src/pkg, which made sense but differed from -other repositories, including the Go subrepositories. -In Go 1.4, the pkg level of the source tree is now gone, so for example -the fmt package's source, once kept in -directory src/pkg/fmt, now lives one level higher in src/fmt. -

      - -

      -Updating: Tools like godoc that discover source code -need to know about the new location. All tools and services maintained by the Go team -have been updated. -

      - - -

      SWIG

      - -

      -Due to runtime changes in this release, Go 1.4 requires SWIG 3.0.3. -

      - -

      Miscellany

      - -

      -The standard repository's top-level misc directory used to contain -Go support for editors and IDEs: plugins, initialization scripts and so on. -Maintaining these was becoming time-consuming -and needed external help because many of the editors listed were not used by -members of the core team. -It also required us to make decisions about which plugin was best for a given -editor, even for editors we do not use. -

      - -

      -The Go community at large is much better suited to managing this information. -In Go 1.4, therefore, this support has been removed from the repository. -Instead, there is a curated, informative list of what's available on -a wiki page. -

      - -

      Performance

      - -

      -Most programs will run about the same speed or slightly faster in 1.4 than in 1.3; -some will be slightly slower. -There are many changes, making it hard to be precise about what to expect. -

      - -

      -As mentioned above, much of the runtime was translated to Go from C, -which led to some reduction in heap sizes. -It also improved performance slightly because the Go compiler is better -at optimization, due to things like inlining, than the C compiler used to build -the runtime. -

      - -

      -The garbage collector was sped up, leading to measurable improvements for -garbage-heavy programs. -On the other hand, the new write barriers slow things down again, typically -by about the same amount but, depending on their behavior, some programs -may be somewhat slower or faster. -

      - -

      -Library changes that affect performance are documented below. -

      - -

      Changes to the standard library

      - -

      New packages

      - -

      -There are no new packages in this release. -

      - -

      Major changes to the library

      - -

      bufio.Scanner

      - -

      -The Scanner type in the -bufio package -has had a bug fixed that may require changes to custom -split functions. -The bug made it impossible to generate an empty token at EOF; the fix -changes the end conditions seen by the split function. -Previously, scanning stopped at EOF if there was no more data. -As of 1.4, the split function will be called once at EOF after input is exhausted, -so the split function can generate a final empty token -as the documentation already promised. -

      - -

      -Updating: Custom split functions may need to be modified to -handle empty tokens at EOF as desired. -

      - -

      syscall

      - -

      -The syscall package is now frozen except -for changes needed to maintain the core repository. -In particular, it will no longer be extended to support new or different system calls -that are not used by the core. -The reasons are described at length in a -separate document. -

      - -

      -A new subrepository, golang.org/x/sys, -has been created to serve as the location for new developments to support system -calls on all kernels. -It has a nicer structure, with three packages that each hold the implementation of -system calls for one of -Unix, -Windows and -Plan 9. -These packages will be curated more generously, accepting all reasonable changes -that reflect kernel interfaces in those operating systems. -See the documentation and the article mentioned above for more information. -

      - -

      -Updating: Existing programs are not affected as the syscall -package is largely unchanged from the 1.3 release. -Future development that requires system calls not in the syscall package -should build on golang.org/x/sys instead. -

      - -

      Minor changes to the library

      - -

      -The following list summarizes a number of minor changes to the library, mostly additions. -See the relevant package documentation for more information about each change. -

      - -
        - -
      • -The archive/zip package's -Writer now supports a -Flush method. -
      • - -
      • -The compress/flate, -compress/gzip, -and compress/zlib -packages now support a Reset method -for the decompressors, allowing them to reuse buffers and improve performance. -The compress/gzip package also has a -Multistream method to control support -for multistream files. -
      • - -
      • -The crypto package now has a -Signer interface, implemented by the -PrivateKey types in -crypto/ecdsa and -crypto/rsa. -
      • - -
      • -The crypto/tls package -now supports ALPN as defined in RFC 7301. -
      • - -
      • -The crypto/tls package -now supports programmatic selection of server certificates -through the new CertificateForName function -of the Config struct. -
      • - -
      • -Also in the crypto/tls package, the server now supports -TLS_FALLBACK_SCSV -to help clients detect fallback attacks. -(The Go client does not support fallback at all, so it is not vulnerable to -those attacks.) -
      • - -
      • -The database/sql package can now list all registered -Drivers. -
      • - -
      • -The debug/dwarf package now supports -UnspecifiedTypes. -
      • - -
      • -In the encoding/asn1 package, -optional elements with a default value will now only be omitted if they have that value. -
      • - -
      • -The encoding/csv package no longer -quotes empty strings but does quote the end-of-data marker \. (backslash dot). -This is permitted by the definition of CSV and allows it to work better with Postgres. -
      • - -
      • -The encoding/gob package has been rewritten to eliminate -the use of unsafe operations, allowing it to be used in environments that do not permit use of the -unsafe package. -For typical uses it will be 10-30% slower, but the delta is dependent on the type of the data and -in some cases, especially involving arrays, it can be faster. -There is no functional change. -
      • - -
      • -The encoding/xml package's -Decoder can now report its input offset. -
      • - -
      • -In the fmt package, -formatting of pointers to maps has changed to be consistent with that of pointers -to structs, arrays, and so on. -For instance, &map[string]int{"one": 1} now prints by default as -&map[one: 1] rather than as a hexadecimal pointer value. -
      • - -
      • -The image package's -Image -implementations like -RGBA and -Gray have specialized -RGBAAt and -GrayAt methods alongside the general -At method. -
      • - -
      • -The image/png package now has an -Encoder -type to control the compression level used for encoding. -
      • - -
      • -The math package now has a -Nextafter32 function. -
      • - -
      • -The net/http package's -Request type -has a new BasicAuth method -that returns the username and password from authenticated requests using the -HTTP Basic Authentication -Scheme. -
      • - -
      • The net/http package's -Transport type -has a new DialTLS hook -that allows customizing the behavior of outbound TLS connections. -
      • - -
      • -The net/http/httputil package's -ReverseProxy type -has a new field, -ErrorLog, that -provides user control of logging. -
      • - -
      • -The os package -now implements symbolic links on the Windows operating system -through the Symlink function. -Other operating systems already have this functionality. -There is also a new Unsetenv function. -
      • - -
      • -The reflect package's -Type interface -has a new method, Comparable, -that reports whether the type implements general comparisons. -
      • - -
      • -Also in the reflect package, the -Value interface is now three instead of four words -because of changes to the implementation of interfaces in the runtime. -This saves memory but has no semantic effect. -
      • - -
      • -The runtime package -now implements monotonic clocks on Windows, -as it already did for the other systems. -
      • - -
      • -The runtime package's -Mallocs counter -now counts very small allocations that were missed in Go 1.3. -This may break tests using ReadMemStats -or AllocsPerRun -due to the more accurate answer. -
      • - -
      • -In the runtime package, -an array PauseEnd -has been added to the -MemStats -and GCStats structs. -This array is a circular buffer of times when garbage collection pauses ended. -The corresponding pause durations are already recorded in -PauseNs -
      • - -
      • -The runtime/race package -now supports FreeBSD, which means the -go command's -race -flag now works on FreeBSD. -
      • - -
      • -The sync/atomic package -has a new type, Value. -Value provides an efficient mechanism for atomic loads and -stores of values of arbitrary type. -
      • - -
      • -In the syscall package's -implementation on Linux, the -Setuid -and Setgid have been disabled -because those system calls operate on the calling thread, not the whole process, which is -different from other platforms and not the expected result. -
      • - -
      • -The testing package -has a new facility to provide more control over running a set of tests. -If the test code contains a function -
        -func TestMain(m *testing.M) 
        -
        - -that function will be called instead of running the tests directly. -The M struct contains methods to access and run the tests. -
      • - -
      • -Also in the testing package, -a new Coverage -function reports the current test coverage fraction, -enabling individual tests to report how much they are contributing to the -overall coverage. -
      • - -
      • -The text/scanner package's -Scanner type -has a new function, -IsIdentRune, -allowing one to control the definition of an identifier when scanning. -
      • - -
      • -The text/template package's boolean -functions eq, lt, and so on have been generalized to allow comparison -of signed and unsigned integers, simplifying their use in practice. -(Previously one could only compare values of the same signedness.) -All negative values compare less than all unsigned values. -
      • - -
      • -The time package now uses the standard symbol for the micro prefix, -the micro symbol (U+00B5 'µ'), to print microsecond durations. -ParseDuration still accepts us -but the package no longer prints microseconds as us. -
        -Updating: Code that depends on the output format of durations -but does not use ParseDuration will need to be updated. -
      • - -
      diff --git a/doc/go1.5.html b/doc/go1.5.html deleted file mode 100644 index 2c77cf4169..0000000000 --- a/doc/go1.5.html +++ /dev/null @@ -1,1310 +0,0 @@ - - - -

      Introduction to Go 1.5

      - -

      -The latest Go release, version 1.5, -is a significant release, including major architectural changes to the implementation. -Despite that, we expect almost all Go programs to continue to compile and run as before, -because the release still maintains the Go 1 promise -of compatibility. -

      - -

      -The biggest developments in the implementation are: -

      - -
        - -
      • -The compiler and runtime are now written entirely in Go (with a little assembler). -C is no longer involved in the implementation, and so the C compiler that was -once necessary for building the distribution is gone. -
      • - -
      • -The garbage collector is now concurrent and provides dramatically lower -pause times by running, when possible, in parallel with other goroutines. -
      • - -
      • -By default, Go programs run with GOMAXPROCS set to the -number of cores available; in prior releases it defaulted to 1. -
      • - -
      • -Support for internal packages -is now provided for all repositories, not just the Go core. -
      • - -
      • -The go command now provides experimental -support for "vendoring" external dependencies. -
      • - -
      • -A new go tool trace command supports fine-grained -tracing of program execution. -
      • - -
      • -A new go doc command (distinct from godoc) -is customized for command-line use. -
      • - -
      - -

      -These and a number of other changes to the implementation and tools -are discussed below. -

      - -

      -The release also contains one small language change involving map literals. -

      - -

      -Finally, the timing of the release -strays from the usual six-month interval, -both to provide more time to prepare this major release and to shift the schedule thereafter to -time the release dates more conveniently. -

      - -

      Changes to the language

      - -

      Map literals

      - -

      -Due to an oversight, the rule that allowed the element type to be elided from slice literals was not -applied to map keys. -This has been corrected in Go 1.5. -An example will make this clear. -As of Go 1.5, this map literal, -

      - -
      -m := map[Point]string{
      -    Point{29.935523, 52.891566}:   "Persepolis",
      -    Point{-25.352594, 131.034361}: "Uluru",
      -    Point{37.422455, -122.084306}: "Googleplex",
      -}
      -
      - -

      -may be written as follows, without the Point type listed explicitly: -

      - -
      -m := map[Point]string{
      -    {29.935523, 52.891566}:   "Persepolis",
      -    {-25.352594, 131.034361}: "Uluru",
      -    {37.422455, -122.084306}: "Googleplex",
      -}
      -
      - -

      The Implementation

      - -

      No more C

      - -

      -The compiler and runtime are now implemented in Go and assembler, without C. -The only C source left in the tree is related to testing or to cgo. -There was a C compiler in the tree in 1.4 and earlier. -It was used to build the runtime; a custom compiler was necessary in part to -guarantee the C code would work with the stack management of goroutines. -Since the runtime is in Go now, there is no need for this C compiler and it is gone. -Details of the process to eliminate C are discussed elsewhere. -

      - -

      -The conversion from C was done with the help of custom tools created for the job. -Most important, the compiler was actually moved by automatic translation of -the C code into Go. -It is in effect the same program in a different language. -It is not a new implementation -of the compiler so we expect the process will not have introduced new compiler -bugs. -An overview of this process is available in the slides for -this presentation. -

      - -

      Compiler and tools

      - -

      -Independent of but encouraged by the move to Go, the names of the tools have changed. -The old names 6g, 8g and so on are gone; instead there -is just one binary, accessible as go tool compile, -that compiles Go source into binaries suitable for the architecture and operating system -specified by $GOARCH and $GOOS. -Similarly, there is now one linker (go tool link) -and one assembler (go tool asm). -The linker was translated automatically from the old C implementation, -but the assembler is a new native Go implementation discussed -in more detail below. -

      - -

      -Similar to the drop of the names 6g, 8g, and so on, -the output of the compiler and assembler are now given a plain .o suffix -rather than .8, .6, etc. -

      - - -

      Garbage collector

      - -

      -The garbage collector has been re-engineered for 1.5 as part of the development -outlined in the design document. -Expected latencies are much lower than with the collector -in prior releases, through a combination of advanced algorithms, -better scheduling of the collector, -and running more of the collection in parallel with the user program. -The "stop the world" phase of the collector -will almost always be under 10 milliseconds and usually much less. -

      - -

      -For systems that benefit from low latency, such as user-responsive web sites, -the drop in expected latency with the new collector may be important. -

      - -

      -Details of the new collector were presented in a -talk at GopherCon 2015. -

      - -

      Runtime

      - -

      -In Go 1.5, the order in which goroutines are scheduled has been changed. -The properties of the scheduler were never defined by the language, -but programs that depend on the scheduling order may be broken -by this change. -We have seen a few (erroneous) programs affected by this change. -If you have programs that implicitly depend on the scheduling -order, you will need to update them. -

      - -

      -Another potentially breaking change is that the runtime now -sets the default number of threads to run simultaneously, -defined by GOMAXPROCS, to the number -of cores available on the CPU. -In prior releases the default was 1. -Programs that do not expect to run with multiple cores may -break inadvertently. -They can be updated by removing the restriction or by setting -GOMAXPROCS explicitly. -For a more detailed discussion of this change, see -the design document. -

      - -

      Build

      - -

      -Now that the Go compiler and runtime are implemented in Go, a Go compiler -must be available to compile the distribution from source. -Thus, to build the Go core, a working Go distribution must already be in place. -(Go programmers who do not work on the core are unaffected by this change.) -Any Go 1.4 or later distribution (including gccgo) will serve. -For details, see the design document. -

      - -

      Ports

      - -

      -Due mostly to the industry's move away from the 32-bit x86 architecture, -the set of binary downloads provided is reduced in 1.5. -A distribution for the OS X operating system is provided only for the -amd64 architecture, not 386. -Similarly, the ports for Snow Leopard (Apple OS X 10.6) still work but are no -longer released as a download or maintained since Apple no longer maintains that version -of the operating system. -Also, the dragonfly/386 port is no longer supported at all -because DragonflyBSD itself no longer supports the 32-bit 386 architecture. -

      - -

      -There are however several new ports available to be built from source. -These include darwin/arm and darwin/arm64. -The new port linux/arm64 is mostly in place, but cgo -is only supported using external linking. -

      - -

      -Also available as experiments are ppc64 -and ppc64le (64-bit PowerPC, big- and little-endian). -Both these ports support cgo but -only with internal linking. -

      - -

      -On FreeBSD, Go 1.5 requires FreeBSD 8-STABLE+ because of its new use of the SYSCALL instruction. -

      - -

      -On NaCl, Go 1.5 requires SDK version pepper-41. Later pepper versions are not -compatible due to the removal of the sRPC subsystem from the NaCl runtime. -

      - -

      -On Darwin, the use of the system X.509 certificate interface can be disabled -with the ios build tag. -

      - -

      -The Solaris port now has full support for cgo and the packages -net and -crypto/x509, -as well as a number of other fixes and improvements. -

      - -

      Tools

      - -

      Translating

      - -

      -As part of the process to eliminate C from the tree, the compiler and -linker were translated from C to Go. -It was a genuine (machine assisted) translation, so the new programs are essentially -the old programs translated rather than new ones with new bugs. -We are confident the translation process has introduced few if any new bugs, -and in fact uncovered a number of previously unknown bugs, now fixed. -

      - -

      -The assembler is a new program, however; it is described below. -

      - -

      Renaming

      - -

      -The suites of programs that were the compilers (6g, 8g, etc.), -the assemblers (6a, 8a, etc.), -and the linkers (6l, 8l, etc.) -have each been consolidated into a single tool that is configured -by the environment variables GOOS and GOARCH. -The old names are gone; the new tools are available through the go tool -mechanism as go tool compile, -go tool asm, -and go tool link. -Also, the file suffixes .6, .8, etc. for the -intermediate object files are also gone; now they are just plain .o files. -

      - -

      -For example, to build and link a program on amd64 for Darwin -using the tools directly, rather than through go build, -one would run: -

      - -
      -$ export GOOS=darwin GOARCH=amd64
      -$ go tool compile program.go
      -$ go tool link program.o
      -
      - -

      Moving

      - -

      -Because the go/types package -has now moved into the main repository (see below), -the vet and -cover -tools have also been moved. -They are no longer maintained in the external golang.org/x/tools repository, -although (deprecated) source still resides there for compatibility with old releases. -

      - -

      Compiler

      - -

      -As described above, the compiler in Go 1.5 is a single Go program, -translated from the old C source, that replaces 6g, 8g, -and so on. -Its target is configured by the environment variables GOOS and GOARCH. -

      - -

      -The 1.5 compiler is mostly equivalent to the old, -but some internal details have changed. -One significant change is that evaluation of constants now uses -the math/big package -rather than a custom (and less well tested) implementation of high precision -arithmetic. -We do not expect this to affect the results. -

      - -

      -For the amd64 architecture only, the compiler has a new option, -dynlink, -that assists dynamic linking by supporting references to Go symbols -defined in external shared libraries. -

      - -

      Assembler

      - -

      -Like the compiler and linker, the assembler in Go 1.5 is a single program -that replaces the suite of assemblers (6a, -8a, etc.) and the environment variables -GOARCH and GOOS -configure the architecture and operating system. -Unlike the other programs, the assembler is a wholly new program -written in Go. -

      - -

      -The new assembler is very nearly compatible with the previous -ones, but there are a few changes that may affect some -assembler source files. -See the updated assembler guide -for more specific information about these changes. In summary: - -

      - -

      -First, the expression evaluation used for constants is a little -different. -It now uses unsigned 64-bit arithmetic and the precedence -of operators (+, -, <<, etc.) -comes from Go, not C. -We expect these changes to affect very few programs but -manual verification may be required. -

      - -

      -Perhaps more important is that on machines where -SP or PC is only an alias -for a numbered register, -such as R13 for the stack pointer and -R15 for the hardware program counter -on ARM, -a reference to such a register that does not include a symbol -is now illegal. -For example, SP and 4(SP) are -illegal but sym+4(SP) is fine. -On such machines, to refer to the hardware register use its -true R name. -

      - -

      -One minor change is that some of the old assemblers -permitted the notation -

      - -
      -constant=value
      -
      - -

      -to define a named constant. -Since this is always possible to do with the traditional -C-like #define notation, which is still -supported (the assembler includes an implementation -of a simplified C preprocessor), the feature was removed. -

      - - - -

      -The linker in Go 1.5 is now one Go program, -that replaces 6l, 8l, etc. -Its operating system and instruction set are specified -by the environment variables GOOS and GOARCH. -

      - -

      -There are several other changes. -The most significant is the addition of a -buildmode option that -expands the style of linking; it now supports -situations such as building shared libraries and allowing other languages -to call into Go libraries. -Some of these were outlined in a design document. -For a list of the available build modes and their use, run -

      - -
      -$ go help buildmode
      -
      - -

      -Another minor change is that the linker no longer records build time stamps in -the header of Windows executables. -Also, although this may be fixed, Windows cgo executables are missing some -DWARF information. -

      - -

      -Finally, the -X flag, which takes two arguments, -as in -

      - -
      --X importpath.name value
      -
      - -

      -now also accepts a more common Go flag style with a single argument -that is itself a name=value pair: -

      - -
      --X importpath.name=value
      -
      - -

      -Although the old syntax still works, it is recommended that uses of this -flag in scripts and the like be updated to the new form. -

      - -

      Go command

      - -

      -The go command's basic operation -is unchanged, but there are a number of changes worth noting. -

      - -

      -The previous release introduced the idea of a directory internal to a package -being unimportable through the go command. -In 1.4, it was tested with the introduction of some internal elements -in the core repository. -As suggested in the design document, -that change is now being made available to all repositories. -The rules are explained in the design document, but in summary any -package in or under a directory named internal may -be imported by packages rooted in the same subtree. -Existing packages with directory elements named internal may be -inadvertently broken by this change, which was why it was advertised -in the last release. -

      - -

      -Another change in how packages are handled is the experimental -addition of support for "vendoring". -For details, see the documentation for the go command -and the design document. -

      - -

      -There have also been several minor changes. -Read the documentation for full details. -

      - -
        - -
      • -SWIG support has been updated such that -.swig and .swigcxx -now require SWIG 3.0.6 or later. -
      • - -
      • -The install subcommand now removes the -binary created by the build subcommand -in the source directory, if present, -to avoid problems having two binaries present in the tree. -
      • - -
      • -The std (standard library) wildcard package name -now excludes commands. -A new cmd wildcard covers the commands. -
      • - -
      • -A new -asmflags build option -sets flags to pass to the assembler. -However, -the -ccflags build option has been dropped; -it was specific to the old, now deleted C compiler . -
      • - -
      • -A new -buildmode build option -sets the build mode, described above. -
      • - -
      • -A new -pkgdir build option -sets the location of installed package archives, -to help isolate custom builds. -
      • - -
      • -A new -toolexec build option -allows substitution of a different command to invoke -the compiler and so on. -This acts as a custom replacement for go tool. -
      • - -
      • -The test subcommand now has a -count -flag to specify how many times to run each test and benchmark. -The testing package -does the work here, through the -test.count flag. -
      • - -
      • -The generate subcommand has a couple of new features. -The -run option specifies a regular expression to select which directives -to execute; this was proposed but never implemented in 1.4. -The executing pattern now has access to two new environment variables: -$GOLINE returns the source line number of the directive -and $DOLLAR expands to a dollar sign. -
      • - -
      • -The get subcommand now has a -insecure -flag that must be enabled if fetching from an insecure repository, one that -does not encrypt the connection. -
      • - -
      - -

      Go vet command

      - -

      -The go tool vet command now does -more thorough validation of struct tags. -

      - -

      Trace command

      - -

      -A new tool is available for dynamic execution tracing of Go programs. -The usage is analogous to how the test coverage tool works. -Generation of traces is integrated into go test, -and then a separate execution of the tracing tool itself analyzes the results: -

      - -
      -$ go test -trace=trace.out path/to/package
      -$ go tool trace [flags] pkg.test trace.out
      -
      - -

      -The flags enable the output to be displayed in a browser window. -For details, run go tool trace -help. -There is also a description of the tracing facility in this -talk -from GopherCon 2015. -

      - -

      Go doc command

      - -

      -A few releases back, the go doc -command was deleted as being unnecessary. -One could always run "godoc ." instead. -The 1.5 release introduces a new go doc -command with a more convenient command-line interface than -godoc's. -It is designed for command-line usage specifically, and provides a more -compact and focused presentation of the documentation for a package -or its elements, according to the invocation. -It also provides case-insensitive matching and -support for showing the documentation for unexported symbols. -For details run "go help doc". -

      - -

      Cgo

      - -

      -When parsing #cgo lines, -the invocation ${SRCDIR} is now -expanded into the path to the source directory. -This allows options to be passed to the -compiler and linker that involve file paths relative to the -source code directory. Without the expansion the paths would be -invalid when the current working directory changes. -

      - -

      -Solaris now has full cgo support. -

      - -

      -On Windows, cgo now uses external linking by default. -

      - -

      -When a C struct ends with a zero-sized field, but the struct itself is -not zero-sized, Go code can no longer refer to the zero-sized field. -Any such references will have to be rewritten. -

      - -

      Performance

      - -

      -As always, the changes are so general and varied that precise statements -about performance are difficult to make. -The changes are even broader ranging than usual in this release, which -includes a new garbage collector and a conversion of the runtime to Go. -Some programs may run faster, some slower. -On average the programs in the Go 1 benchmark suite run a few percent faster in Go 1.5 -than they did in Go 1.4, -while as mentioned above the garbage collector's pauses are -dramatically shorter, and almost always under 10 milliseconds. -

      - -

      -Builds in Go 1.5 will be slower by a factor of about two. -The automatic translation of the compiler and linker from C to Go resulted in -unidiomatic Go code that performs poorly compared to well-written Go. -Analysis tools and refactoring helped to improve the code, but much remains to be done. -Further profiling and optimization will continue in Go 1.6 and future releases. -For more details, see these slides -and associated video. -

      - -

      Core library

      - -

      Flag

      - -

      -The flag package's -PrintDefaults -function, and method on FlagSet, -have been modified to create nicer usage messages. -The format has been changed to be more human-friendly and in the usage -messages a word quoted with `backquotes` is taken to be the name of the -flag's operand to display in the usage message. -For instance, a flag created with the invocation, -

      - -
      -cpuFlag = flag.Int("cpu", 1, "run `N` processes in parallel")
      -
      - -

      -will show the help message, -

      - -
      --cpu N
      -    	run N processes in parallel (default 1)
      -
      - -

      -Also, the default is now listed only when it is not the zero value for the type. -

      - -

      Floats in math/big

      - -

      -The math/big package -has a new, fundamental data type, -Float, -which implements arbitrary-precision floating-point numbers. -A Float value is represented by a boolean sign, -a variable-length mantissa, and a 32-bit fixed-size signed exponent. -The precision of a Float (the mantissa size in bits) -can be specified explicitly or is otherwise determined by the first -operation that creates the value. -Once created, the size of a Float's mantissa may be modified with the -SetPrec method. -Floats support the concept of infinities, such as are created by -overflow, but values that would lead to the equivalent of IEEE 754 NaNs -trigger a panic. -Float operations support all IEEE-754 rounding modes. -When the precision is set to 24 (53) bits, -operations that stay within the range of normalized float32 -(float64) -values produce the same results as the corresponding IEEE-754 -arithmetic on those values. -

      - -

      Go types

      - -

      -The go/types package -up to now has been maintained in the golang.org/x -repository; as of Go 1.5 it has been relocated to the main repository. -The code at the old location is now deprecated. -There is also a modest API change in the package, discussed below. -

      - -

      -Associated with this move, the -go/constant -package also moved to the main repository; -it was golang.org/x/tools/exact before. -The go/importer package -also moved to the main repository, -as well as some tools described above. -

      - -

      Net

      - -

      -The DNS resolver in the net package has almost always used cgo to access -the system interface. -A change in Go 1.5 means that on most Unix systems DNS resolution -will no longer require cgo, which simplifies execution -on those platforms. -Now, if the system's networking configuration permits, the native Go resolver -will suffice. -The important effect of this change is that each DNS resolution occupies a goroutine -rather than a thread, -so a program with multiple outstanding DNS requests will consume fewer operating -system resources. -

      - -

      -The decision of how to run the resolver applies at run time, not build time. -The netgo build tag that has been used to enforce the use -of the Go resolver is no longer necessary, although it still works. -A new netcgo build tag forces the use of the cgo resolver at -build time. -To force cgo resolution at run time set -GODEBUG=netdns=cgo in the environment. -More debug options are documented here. -

      - -

      -This change applies to Unix systems only. -Windows, Mac OS X, and Plan 9 systems behave as before. -

      - -

      Reflect

      - -

      -The reflect package -has two new functions: ArrayOf -and FuncOf. -These functions, analogous to the extant -SliceOf function, -create new types at runtime to describe arrays and functions. -

      - -

      Hardening

      - -

      -Several dozen bugs were found in the standard library -through randomized testing with the -go-fuzz tool. -Bugs were fixed in the -archive/tar, -archive/zip, -compress/flate, -encoding/gob, -fmt, -html/template, -image/gif, -image/jpeg, -image/png, and -text/template, -packages. -The fixes harden the implementation against incorrect and malicious inputs. -

      - -

      Minor changes to the library

      - -
        - -
      • -The archive/zip package's -Writer type now has a -SetOffset -method to specify the location within the output stream at which to write the archive. -
      • - -
      • -The Reader in the -bufio package now has a -Discard -method to discard data from the input. -
      • - -
      • -In the bytes package, -the Buffer type -now has a Cap method -that reports the number of bytes allocated within the buffer. -Similarly, in both the bytes -and strings packages, -the Reader -type now has a Size -method that reports the original length of the underlying slice or string. -
      • - -
      • -Both the bytes and -strings packages -also now have a LastIndexByte -function that locates the rightmost byte with that value in the argument. -
      • - -
      • -The crypto package -has a new interface, Decrypter, -that abstracts the behavior of a private key used in asymmetric decryption. -
      • - -
      • -In the crypto/cipher package, -the documentation for the Stream -interface has been clarified regarding the behavior when the source and destination are -different lengths. -If the destination is shorter than the source, the method will panic. -This is not a change in the implementation, only the documentation. -
      • - -
      • -Also in the crypto/cipher package, -there is now support for nonce lengths other than 96 bytes in AES's Galois/Counter mode (GCM), -which some protocols require. -
      • - -
      • -In the crypto/elliptic package, -there is now a Name field in the -CurveParams struct, -and the curves implemented in the package have been given names. -These names provide a safer way to select a curve, as opposed to -selecting its bit size, for cryptographic systems that are curve-dependent. -
      • - -
      • -Also in the crypto/elliptic package, -the Unmarshal function -now verifies that the point is actually on the curve. -(If it is not, the function returns nils). -This change guards against certain attacks. -
      • - -
      • -The crypto/sha512 -package now has support for the two truncated versions of -the SHA-512 hash algorithm, SHA-512/224 and SHA-512/256. -
      • - -
      • -The crypto/tls package -minimum protocol version now defaults to TLS 1.0. -The old default, SSLv3, is still available through Config if needed. -
      • - -
      • -The crypto/tls package -now supports Signed Certificate Timestamps (SCTs) as specified in RFC 6962. -The server serves them if they are listed in the -Certificate struct, -and the client requests them and exposes them, if present, -in its ConnectionState struct. - -
      • -The stapled OCSP response to a crypto/tls client connection, -previously only available via the -OCSPResponse method, -is now exposed in the ConnectionState struct. -
      • - -
      • -The crypto/tls server implementation -will now always call the -GetCertificate function in -the Config struct -to select a certificate for the connection when none is supplied. -
      • - -
      • -Finally, the session ticket keys in the -crypto/tls package -can now be changed while the server is running. -This is done through the new -SetSessionTicketKeys -method of the -Config type. -
      • - -
      • -In the crypto/x509 package, -wildcards are now accepted only in the leftmost label as defined in -the specification. -
      • - -
      • -Also in the crypto/x509 package, -the handling of unknown critical extensions has been changed. -They used to cause parse errors but now they are parsed and caused errors only -in Verify. -The new field UnhandledCriticalExtensions of -Certificate records these extensions. -
      • - -
      • -The DB type of the -database/sql package -now has a Stats method -to retrieve database statistics. -
      • - -
      • -The debug/dwarf -package has extensive additions to better support DWARF version 4. -See for example the definition of the new type -Class. -
      • - -
      • -The debug/dwarf package -also now supports decoding of DWARF line tables. -
      • - -
      • -The debug/elf -package now has support for the 64-bit PowerPC architecture. -
      • - -
      • -The encoding/base64 package -now supports unpadded encodings through two new encoding variables, -RawStdEncoding and -RawURLEncoding. -
      • - -
      • -The encoding/json package -now returns an UnmarshalTypeError -if a JSON value is not appropriate for the target variable or component -to which it is being unmarshaled. -
      • - -
      • -The encoding/json's -Decoder -type has a new method that provides a streaming interface for decoding -a JSON document: -Token. -It also interoperates with the existing functionality of Decode, -which will continue a decode operation already started with Decoder.Token. -
      • - -
      • -The flag package -has a new function, UnquoteUsage, -to assist in the creation of usage messages using the new convention -described above. -
      • - -
      • -In the fmt package, -a value of type Value now -prints what it holds, rather than use the reflect.Value's Stringer -method, which produces things like <int Value>. -
      • - -
      • -The EmptyStmt type -in the go/ast package now -has a boolean Implicit field that records whether the -semicolon was implicitly added or was present in the source. -
      • - -
      • -For forward compatibility the go/build package -reserves GOARCH values for a number of architectures that Go might support one day. -This is not a promise that it will. -Also, the Package struct -now has a PkgTargetRoot field that stores the -architecture-dependent root directory in which to install, if known. -
      • - -
      • -The (newly migrated) go/types -package allows one to control the prefix attached to package-level names using -the new Qualifier -function type as an argument to several functions. This is an API change for -the package, but since it is new to the core, it is not breaking the Go 1 compatibility -rules since code that uses the package must explicitly ask for it at its new location. -To update, run -go fix on your package. -
      • - -
      • -In the image package, -the Rectangle type -now implements the Image interface, -so a Rectangle can serve as a mask when drawing. -
      • - -
      • -Also in the image package, -to assist in the handling of some JPEG images, -there is now support for 4:1:1 and 4:1:0 YCbCr subsampling and basic -CMYK support, represented by the new image.CMYK struct. -
      • - -
      • -The image/color package -adds basic CMYK support, through the new -CMYK struct, -the CMYKModel color model, and the -CMYKToRGB function, as -needed by some JPEG images. -
      • - -
      • -Also in the image/color package, -the conversion of a YCbCr -value to RGBA has become more precise. -Previously, the low 8 bits were just an echo of the high 8 bits; -now they contain more accurate information. -Because of the echo property of the old code, the operation -uint8(r) to extract an 8-bit red value worked, but is incorrect. -In Go 1.5, that operation may yield a different value. -The correct code is, and always was, to select the high 8 bits: -uint8(r>>8). -Incidentally, the image/draw package -provides better support for such conversions; see -this blog post -for more information. -
      • - -
      • -Finally, as of Go 1.5 the closest match check in -Index -now honors the alpha channel. -
      • - -
      • -The image/gif package -includes a couple of generalizations. -A multiple-frame GIF file can now have an overall bounds different -from all the contained single frames' bounds. -Also, the GIF struct -now has a Disposal field -that specifies the disposal method for each frame. -
      • - -
      • -The io package -adds a CopyBuffer function -that is like Copy but -uses a caller-provided buffer, permitting control of allocation and buffer size. -
      • - -
      • -The log package -has a new LUTC flag -that causes time stamps to be printed in the UTC time zone. -It also adds a SetOutput method -for user-created loggers. -
      • - -
      • -In Go 1.4, Max was not detecting all possible NaN bit patterns. -This is fixed in Go 1.5, so programs that use math.Max on data including NaNs may behave differently, -but now correctly according to the IEEE754 definition of NaNs. -
      • - -
      • -The math/big package -adds a new Jacobi -function for integers and a new -ModSqrt -method for the Int type. -
      • - -
      • -The mime package -adds a new WordDecoder type -to decode MIME headers containing RFC 204-encoded words. -It also provides BEncoding and -QEncoding -as implementations of the encoding schemes of RFC 2045 and RFC 2047. -
      • - -
      • -The mime package also adds an -ExtensionsByType -function that returns the MIME extensions know to be associated with a given MIME type. -
      • - -
      • -There is a new mime/quotedprintable -package that implements the quoted-printable encoding defined by RFC 2045. -
      • - -
      • -The net package will now -Dial hostnames by trying each -IP address in order until one succeeds. -The Dialer.DualStack -mode now implements Happy Eyeballs -(RFC 6555) by giving the -first address family a 300ms head start; this value can be overridden by -the new Dialer.FallbackDelay. -
      • - -
      • -A number of inconsistencies in the types returned by errors in the -net package have been -tidied up. -Most now return an -OpError value -with more information than before. -Also, the OpError -type now includes a Source field that holds the local -network address. -
      • - -
      • -The net/http package now -has support for setting trailers from a server Handler. -For details, see the documentation for -ResponseWriter. -
      • - -
      • -There is a new method to cancel a net/http -Request by setting the new -Request.Cancel -field. -It is supported by http.Transport. -The Cancel field's type is compatible with the -context.Context.Done -return value. -
      • - -
      • -Also in the net/http package, -there is code to ignore the zero Time value -in the ServeContent function. -As of Go 1.5, it now also ignores a time value equal to the Unix epoch. -
      • - -
      • -The net/http/fcgi package -exports two new errors, -ErrConnClosed and -ErrRequestAborted, -to report the corresponding error conditions. -
      • - -
      • -The net/http/cgi package -had a bug that mishandled the values of the environment variables -REMOTE_ADDR and REMOTE_HOST. -This has been fixed. -Also, starting with Go 1.5 the package sets the REMOTE_PORT -variable. -
      • - -
      • -The net/mail package -adds an AddressParser -type that can parse mail addresses. -
      • - -
      • -The net/smtp package -now has a TLSConnectionState -accessor to the Client -type that returns the client's TLS state. -
      • - -
      • -The os package -has a new LookupEnv function -that is similar to Getenv -but can distinguish between an empty environment variable and a missing one. -
      • - -
      • -The os/signal package -adds new Ignore and -Reset functions. -
      • - -
      • -The runtime, -runtime/trace, -and net/http/pprof packages -each have new functions to support the tracing facilities described above: -ReadTrace, -StartTrace, -StopTrace, -Start, -Stop, and -Trace. -See the respective documentation for details. -
      • - -
      • -The runtime/pprof package -by default now includes overall memory statistics in all memory profiles. -
      • - -
      • -The strings package -has a new Compare function. -This is present to provide symmetry with the bytes package -but is otherwise unnecessary as strings support comparison natively. -
      • - -
      • -The WaitGroup implementation in -package sync -now diagnoses code that races a call to Add -against a return from Wait. -If it detects this condition, the implementation panics. -
      • - -
      • -In the syscall package, -the Linux SysProcAttr struct now has a -GidMappingsEnableSetgroups field, made necessary -by security changes in Linux 3.19. -On all Unix systems, the struct also has new Foreground and Pgid fields -to provide more control when exec'ing. -On Darwin, there is now a Syscall9 function -to support calls with too many arguments. -
      • - -
      • -The testing/quick will now -generate nil values for pointer types, -making it possible to use with recursive data structures. -Also, the package now supports generation of array types. -
      • - -
      • -In the text/template and -html/template packages, -integer constants too large to be represented as a Go integer now trigger a -parse error. Before, they were silently converted to floating point, losing -precision. -
      • - -
      • -Also in the text/template and -html/template packages, -a new Option method -allows customization of the behavior of the template during execution. -The sole implemented option allows control over how a missing key is -handled when indexing a map. -The default, which can now be overridden, is as before: to continue with an invalid value. -
      • - -
      • -The time package's -Time type has a new method -AppendFormat, -which can be used to avoid allocation when printing a time value. -
      • - -
      • -The unicode package and associated -support throughout the system has been upgraded from version 7.0 to -Unicode 8.0. -
      • - -
      diff --git a/doc/go1.6.html b/doc/go1.6.html deleted file mode 100644 index c8ec7e7991..0000000000 --- a/doc/go1.6.html +++ /dev/null @@ -1,923 +0,0 @@ - - - - - - -

      Introduction to Go 1.6

      - -

      -The latest Go release, version 1.6, arrives six months after 1.5. -Most of its changes are in the implementation of the language, runtime, and libraries. -There are no changes to the language specification. -As always, the release maintains the Go 1 promise of compatibility. -We expect almost all Go programs to continue to compile and run as before. -

      - -

      -The release adds new ports to Linux on 64-bit MIPS and Android on 32-bit x86; -defined and enforced rules for sharing Go pointers with C; -transparent, automatic support for HTTP/2; -and a new mechanism for template reuse. -

      - -

      Changes to the language

      - -

      -There are no language changes in this release. -

      - -

      Ports

      - -

      -Go 1.6 adds experimental ports to -Linux on 64-bit MIPS (linux/mips64 and linux/mips64le). -These ports support cgo but only with internal linking. -

      - -

      -Go 1.6 also adds an experimental port to Android on 32-bit x86 (android/386). -

      - -

      -On FreeBSD, Go 1.6 defaults to using clang, not gcc, as the external C compiler. -

      - -

      -On Linux on little-endian 64-bit PowerPC (linux/ppc64le), -Go 1.6 now supports cgo with external linking and -is roughly feature complete. -

      - -

      -On NaCl, Go 1.5 required SDK version pepper-41. -Go 1.6 adds support for later SDK versions. -

      - -

      -On 32-bit x86 systems using the -dynlink or -shared compilation modes, -the register CX is now overwritten by certain memory references and should -be avoided in hand-written assembly. -See the assembly documentation for details. -

      - -

      Tools

      - -

      Cgo

      - -

      -There is one major change to cgo, along with one minor change. -

      - -

      -The major change is the definition of rules for sharing Go pointers with C code, -to ensure that such C code can coexist with Go's garbage collector. -Briefly, Go and C may share memory allocated by Go -when a pointer to that memory is passed to C as part of a cgo call, -provided that the memory itself contains no pointers to Go-allocated memory, -and provided that C does not retain the pointer after the call returns. -These rules are checked by the runtime during program execution: -if the runtime detects a violation, it prints a diagnosis and crashes the program. -The checks can be disabled by setting the environment variable -GODEBUG=cgocheck=0, but note that the vast majority of -code identified by the checks is subtly incompatible with garbage collection -in one way or another. -Disabling the checks will typically only lead to more mysterious failure modes. -Fixing the code in question should be strongly preferred -over turning off the checks. -See the cgo documentation for more details. -

      - -

      -The minor change is -the addition of explicit C.complexfloat and C.complexdouble types, -separate from Go's complex64 and complex128. -Matching the other numeric types, C's complex types and Go's complex type are -no longer interchangeable. -

      - -

      Compiler Toolchain

      - -

      -The compiler toolchain is mostly unchanged. -Internally, the most significant change is that the parser is now hand-written -instead of generated from yacc. -

      - -

      -The compiler, linker, and go command have a new flag -msan, -analogous to -race and only available on linux/amd64, -that enables interoperation with the Clang MemorySanitizer. -Such interoperation is useful mainly for testing a program containing suspect C or C++ code. -

      - -

      -The linker has a new option -libgcc to set the expected location -of the C compiler support library when linking cgo code. -The option is only consulted when using -linkmode=internal, -and it may be set to none to disable the use of a support library. -

      - -

      -The implementation of build modes started in Go 1.5 has been expanded to more systems. -This release adds support for the c-shared mode on android/386, android/amd64, -android/arm64, linux/386, and linux/arm64; -for the shared mode on linux/386, linux/arm, linux/amd64, and linux/ppc64le; -and for the new pie mode (generating position-independent executables) on -android/386, android/amd64, android/arm, android/arm64, linux/386, -linux/amd64, linux/arm, linux/arm64, and linux/ppc64le. -See the design document for details. -

      - -

      -As a reminder, the linker's -X flag changed in Go 1.5. -In Go 1.4 and earlier, it took two arguments, as in -

      - -
      --X importpath.name value
      -
      - -

      -Go 1.5 added an alternative syntax using a single argument -that is itself a name=value pair: -

      - -
      --X importpath.name=value
      -
      - -

      -In Go 1.5 the old syntax was still accepted, after printing a warning -suggesting use of the new syntax instead. -Go 1.6 continues to accept the old syntax and print the warning. -Go 1.7 will remove support for the old syntax. -

      - -

      Gccgo

      - -

      -The release schedules for the GCC and Go projects do not coincide. -GCC release 5 contains the Go 1.4 version of gccgo. -The next release, GCC 6, will have the Go 1.6.1 version of gccgo. -

      - -

      Go command

      - -

      -The go command's basic operation -is unchanged, but there are a number of changes worth noting. -

      - -

      -Go 1.5 introduced experimental support for vendoring, -enabled by setting the GO15VENDOREXPERIMENT environment variable to 1. -Go 1.6 keeps the vendoring support, no longer considered experimental, -and enables it by default. -It can be disabled explicitly by setting -the GO15VENDOREXPERIMENT environment variable to 0. -Go 1.7 will remove support for the environment variable. -

      - -

      -The most likely problem caused by enabling vendoring by default happens -in source trees containing an existing directory named vendor that -does not expect to be interpreted according to new vendoring semantics. -In this case, the simplest fix is to rename the directory to anything other -than vendor and update any affected import paths. -

      - -

      -For details about vendoring, -see the documentation for the go command -and the design document. -

      - -

      -There is a new build flag, -msan, -that compiles Go with support for the LLVM memory sanitizer. -This is intended mainly for use when linking against C or C++ code -that is being checked with the memory sanitizer. -

      - -

      Go doc command

      - -

      -Go 1.5 introduced the -go doc command, -which allows references to packages using only the package name, as in -go doc http. -In the event of ambiguity, the Go 1.5 behavior was to use the package -with the lexicographically earliest import path. -In Go 1.6, ambiguity is resolved by preferring import paths with -fewer elements, breaking ties using lexicographic comparison. -An important effect of this change is that original copies of packages -are now preferred over vendored copies. -Successful searches also tend to run faster. -

      - -

      Go vet command

      - -

      -The go vet command now diagnoses -passing function or method values as arguments to Printf, -such as when passing f where f() was intended. -

      - -

      Performance

      - -

      -As always, the changes are so general and varied that precise statements -about performance are difficult to make. -Some programs may run faster, some slower. -On average the programs in the Go 1 benchmark suite run a few percent faster in Go 1.6 -than they did in Go 1.5. -The garbage collector's pauses are even lower than in Go 1.5, -especially for programs using -a large amount of memory. -

      - -

      -There have been significant optimizations bringing more than 10% improvements -to implementations of the -compress/bzip2, -compress/gzip, -crypto/aes, -crypto/elliptic, -crypto/ecdsa, and -sort packages. -

      - -

      Core library

      - -

      HTTP/2

      - -

      -Go 1.6 adds transparent support in the -net/http package -for the new HTTP/2 protocol. -Go clients and servers will automatically use HTTP/2 as appropriate when using HTTPS. -There is no exported API specific to details of the HTTP/2 protocol handling, -just as there is no exported API specific to HTTP/1.1. -

      - -

      -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. -

      - -

      -Programs that must adjust HTTP/2 protocol-specific details can import and use -golang.org/x/net/http2, -in particular its -ConfigureServer -and -ConfigureTransport -functions. -

      - -

      Runtime

      - -

      -The runtime has added lightweight, best-effort detection of concurrent misuse of maps. -As always, if one goroutine is writing to a map, no other goroutine should be -reading or writing the map concurrently. -If the runtime detects this condition, it prints a diagnosis and crashes the program. -The best way to find out more about the problem is to run the program -under the -race detector, -which will more reliably identify the race -and give more detail. -

      - -

      -For program-ending panics, the runtime now by default -prints only the stack of the running goroutine, -not all existing goroutines. -Usually only the current goroutine is relevant to a panic, -so omitting the others significantly reduces irrelevant output -in a crash message. -To see the stacks from all goroutines in crash messages, set the environment variable -GOTRACEBACK to all -or call -debug.SetTraceback -before the crash, and rerun the program. -See the runtime documentation for details. -

      - -

      -Updating: -Uncaught panics intended to dump the state of the entire program, -such as when a timeout is detected or when explicitly handling a received signal, -should now call debug.SetTraceback("all") before panicking. -Searching for uses of -signal.Notify may help identify such code. -

      - -

      -On Windows, Go programs in Go 1.5 and earlier forced -the global Windows timer resolution to 1ms at startup -by calling timeBeginPeriod(1). -Go no longer needs this for good scheduler performance, -and changing the global timer resolution caused problems on some systems, -so the call has been removed. -

      - -

      -When using -buildmode=c-archive or --buildmode=c-shared to build an archive or a shared -library, the handling of signals has changed. -In Go 1.5 the archive or shared library would install a signal handler -for most signals. -In Go 1.6 it will only install a signal handler for the -synchronous signals needed to handle run-time panics in Go code: -SIGBUS, SIGFPE, SIGSEGV. -See the os/signal package for more -details. -

      - -

      Reflect

      - -

      -The -reflect package has -resolved a long-standing incompatibility -between the gc and gccgo toolchains -regarding embedded unexported struct types containing exported fields. -Code that walks data structures using reflection, especially to implement -serialization in the spirit -of the -encoding/json and -encoding/xml packages, -may need to be updated. -

      - -

      -The problem arises when using reflection to walk through -an embedded unexported struct-typed field -into an exported field of that struct. -In this case, reflect had incorrectly reported -the embedded field as exported, by returning an empty Field.PkgPath. -Now it correctly reports the field as unexported -but ignores that fact when evaluating access to exported fields -contained within the struct. -

      - -

      -Updating: -Typically, code that previously walked over structs and used -

      - -
      -f.PkgPath != ""
      -
      - -

      -to exclude inaccessible fields -should now use -

      - -
      -f.PkgPath != "" && !f.Anonymous
      -
      - -

      -For example, see the changes to the implementations of -encoding/json and -encoding/xml. -

      - -

      Sorting

      - -

      -In the -sort -package, -the implementation of -Sort -has been rewritten to make about 10% fewer calls to the -Interface's -Less and Swap -methods, with a corresponding overall time savings. -The new algorithm does choose a different ordering than before -for values that compare equal (those pairs for which Less(i, j) and Less(j, i) are false). -

      - -

      -Updating: -The definition of Sort makes no guarantee about the final order of equal values, -but the new behavior may still break programs that expect a specific order. -Such programs should either refine their Less implementations -to report the desired order -or should switch to -Stable, -which preserves the original input order -of equal values. -

      - -

      Templates

      - -

      -In the -text/template package, -there are two significant new features to make writing templates easier. -

      - -

      -First, it is now possible to trim spaces around template actions, -which can make template definitions more readable. -A minus sign at the beginning of an action says to trim space before the action, -and a minus sign at the end of an action says to trim space after the action. -For example, the template -

      - -
      -{{"{{"}}23 -}}
      -   <
      -{{"{{"}}- 45}}
      -
      - -

      -formats as 23<45. -

      - -

      -Second, the new {{"{{"}}block}} action, -combined with allowing redefinition of named templates, -provides a simple way to define pieces of a template that -can be replaced in different instantiations. -There is an example -in the text/template package that demonstrates this new feature. -

      - -

      Minor changes to the library

      - -
        - -
      • -The archive/tar package's -implementation corrects many bugs in rare corner cases of the file format. -One visible change is that the -Reader type's -Read method -now presents the content of special file types as being empty, -returning io.EOF immediately. -
      • - -
      • -In the archive/zip package, the -Reader type now has a -RegisterDecompressor method, -and the -Writer type now has a -RegisterCompressor method, -enabling control over compression options for individual zip files. -These take precedence over the pre-existing global -RegisterDecompressor and -RegisterCompressor functions. -
      • - -
      • -The bufio package's -Scanner type now has a -Buffer method, -to specify an initial buffer and maximum buffer size to use during scanning. -This makes it possible, when needed, to scan tokens larger than -MaxScanTokenSize. -Also for the Scanner, the package now defines the -ErrFinalToken error value, for use by -split functions to abort processing or to return a final empty token. -
      • - -
      • -The compress/flate package -has deprecated its -ReadError and -WriteError error implementations. -In Go 1.5 they were only rarely returned when an error was encountered; -now they are never returned, although they remain defined for compatibility. -
      • - -
      • -The compress/flate, -compress/gzip, and -compress/zlib packages -now report -io.ErrUnexpectedEOF for truncated input streams, instead of -io.EOF. -
      • - -
      • -The crypto/cipher package now -overwrites the destination buffer in the event of a GCM decryption failure. -This is to allow the AESNI code to avoid using a temporary buffer. -
      • - -
      • -The crypto/tls package -has a variety of minor changes. -It now allows -Listen -to succeed when the -Config -has a nil Certificates, as long as the GetCertificate callback is set, -it adds support for RSA with AES-GCM cipher suites, -and -it adds a -RecordHeaderError -to allow clients (in particular, the net/http package) -to report a better error when attempting a TLS connection to a non-TLS server. -
      • - -
      • -The crypto/x509 package -now permits certificates to contain negative serial numbers -(technically an error, but unfortunately common in practice), -and it defines a new -InsecureAlgorithmError -to give a better error message when rejecting a certificate -signed with an insecure algorithm like MD5. -
      • - -
      • -The debug/dwarf and -debug/elf packages -together add support for compressed DWARF sections. -User code needs no updating: the sections are decompressed automatically when read. -
      • - -
      • -The debug/elf package -adds support for general compressed ELF sections. -User code needs no updating: the sections are decompressed automatically when read. -However, compressed -Sections do not support random access: -they have a nil ReaderAt field. -
      • - -
      • -The encoding/asn1 package -now exports -tag and class constants -useful for advanced parsing of ASN.1 structures. -
      • - -
      • -Also in the encoding/asn1 package, -Unmarshal now rejects various non-standard integer and length encodings. -
      • - -
      • -The encoding/base64 package's -Decoder has been fixed -to process the final bytes of its input. Previously it processed as many four-byte tokens as -possible but ignored the remainder, up to three bytes. -The Decoder therefore now handles inputs in unpadded encodings (like -RawURLEncoding) correctly, -but it also rejects inputs in padded encodings that are truncated or end with invalid bytes, -such as trailing spaces. -
      • - -
      • -The encoding/json package -now checks the syntax of a -Number -before marshaling it, requiring that it conforms to the JSON specification for numeric values. -As in previous releases, the zero Number (an empty string) is marshaled as a literal 0 (zero). -
      • - -
      • -The encoding/xml package's -Marshal -function now supports a cdata attribute, such as chardata -but encoding its argument in one or more <![CDATA[ ... ]]> tags. -
      • - -
      • -Also in the encoding/xml package, -Decoder's -Token method -now reports an error when encountering EOF before seeing all open tags closed, -consistent with its general requirement that tags in the input be properly matched. -To avoid that requirement, use -RawToken. -
      • - -
      • -The fmt package now allows -any integer type as an argument to -Printf's * width and precision specification. -In previous releases, the argument to * was required to have type int. -
      • - -
      • -Also in the fmt package, -Scanf can now scan hexadecimal strings using %X, as an alias for %x. -Both formats accept any mix of upper- and lower-case hexadecimal. -
      • - -
      • -The image -and -image/color packages -add -NYCbCrA -and -NYCbCrA -types, to support Y'CbCr images with non-premultiplied alpha. -
      • - -
      • -The io package's -MultiWriter -implementation now implements a WriteString method, -for use by -WriteString. -
      • - -
      • -In the math/big package, -Int adds -Append -and -Text -methods to give more control over printing. -
      • - -
      • -Also in the math/big package, -Float now implements -encoding.TextMarshaler and -encoding.TextUnmarshaler, -allowing it to be serialized in a natural form by the -encoding/json and -encoding/xml packages. -
      • - -
      • -Also in the math/big package, -Float's -Append method now supports the special precision argument -1. -As in -strconv.ParseFloat, -precision -1 means to use the smallest number of digits necessary such that -Parse -reading the result into a Float of the same precision -will yield the original value. -
      • - -
      • -The math/rand package -adds a -Read -function, and likewise -Rand adds a -Read method. -These make it easier to generate pseudorandom test data. -Note that, like the rest of the package, -these should not be used in cryptographic settings; -for such purposes, use the crypto/rand package instead. -
      • - -
      • -The net package's -ParseMAC function now accepts 20-byte IP-over-InfiniBand (IPoIB) link-layer addresses. -
      • - - -
      • -Also in the net package, -there have been a few changes to DNS lookups. -First, the -DNSError error implementation now implements -Error, -and in particular its new -IsTemporary -method returns true for DNS server errors. -Second, DNS lookup functions such as -LookupAddr -now return rooted domain names (with a trailing dot) -on Plan 9 and Windows, to match the behavior of Go on Unix systems. -
      • - -
      • -The net/http package has -a number of minor additions beyond the HTTP/2 support already discussed. -First, the -FileServer now sorts its generated directory listings by file name. -Second, the -ServeFile function now refuses to serve a result -if the request's URL path contains “..” (dot-dot) as a path element. -Programs should typically use FileServer and -Dir -instead of calling ServeFile directly. -Programs that need to serve file content in response to requests for URLs containing dot-dot can -still call ServeContent. -Third, the -Client now allows user code to set the -Expect: 100-continue header (see -Transport.ExpectContinueTimeout). -Fourth, there are -five new error codes: -StatusPreconditionRequired (428), -StatusTooManyRequests (429), -StatusRequestHeaderFieldsTooLarge (431), and -StatusNetworkAuthenticationRequired (511) from RFC 6585, -as well as the recently-approved -StatusUnavailableForLegalReasons (451). -Fifth, the implementation and documentation of -CloseNotifier -has been substantially changed. -The Hijacker -interface now works correctly on connections that have previously -been used with CloseNotifier. -The documentation now describes when CloseNotifier -is expected to work. -
      • - -
      • -Also in the net/http package, -there are a few changes related to the handling of a -Request data structure with its Method field set to the empty string. -An empty Method field has always been documented as an alias for "GET" -and it remains so. -However, Go 1.6 fixes a few routines that did not treat an empty -Method the same as an explicit "GET". -Most notably, in previous releases -Client followed redirects only with -Method set explicitly to "GET"; -in Go 1.6 Client also follows redirects for the empty Method. -Finally, -NewRequest accepts a method argument that has not been -documented as allowed to be empty. -In past releases, passing an empty method argument resulted -in a Request with an empty Method field. -In Go 1.6, the resulting Request always has an initialized -Method field: if its argument is an empty string, NewRequest -sets the Method field in the returned Request to "GET". -
      • - -
      • -The net/http/httptest package's -ResponseRecorder now initializes a default Content-Type header -using the same content-sniffing algorithm as in -http.Server. -
      • - -
      • -The net/url package's -Parse is now stricter and more spec-compliant regarding the parsing -of host names. -For example, spaces in the host name are no longer accepted. -
      • - -
      • -Also in the net/url package, -the Error type now implements -net.Error. -
      • - -
      • -The os package's -IsExist, -IsNotExist, -and -IsPermission -now return correct results when inquiring about an -SyscallError. -
      • - -
      • -On Unix-like systems, when a write -to os.Stdout -or os.Stderr (more precisely, an os.File -opened for file descriptor 1 or 2) fails due to a broken pipe error, -the program will raise a SIGPIPE signal. -By default this will cause the program to exit; this may be changed by -calling the -os/signal -Notify function -for syscall.SIGPIPE. -A write to a broken pipe on a file descriptor other 1 or 2 will simply -return syscall.EPIPE (possibly wrapped in -os.PathError -and/or os.SyscallError) -to the caller. -The old behavior of raising an uncatchable SIGPIPE signal -after 10 consecutive writes to a broken pipe no longer occurs. -
      • - -
      • -In the os/exec package, -Cmd's -Output method continues to return an -ExitError when a command exits with an unsuccessful status. -If standard error would otherwise have been discarded, -the returned ExitError now holds a prefix and suffix -(currently 32 kB) of the failed command's standard error output, -for debugging or for inclusion in error messages. -The ExitError's -String -method does not show the captured standard error; -programs must retrieve it from the data structure -separately. -
      • - -
      • -On Windows, the path/filepath package's -Join function now correctly handles the case when the base is a relative drive path. -For example, Join(`c:`, `a`) now -returns `c:a` instead of `c:\a` as in past releases. -This may affect code that expects the incorrect result. -
      • - -
      • -In the regexp package, -the -Regexp type has always been safe for use by -concurrent goroutines. -It uses a sync.Mutex to protect -a cache of scratch spaces used during regular expression searches. -Some high-concurrency servers using the same Regexp from many goroutines -have seen degraded performance due to contention on that mutex. -To help such servers, Regexp now has a -Copy method, -which makes a copy of a Regexp that shares most of the structure -of the original but has its own scratch space cache. -Two goroutines can use different copies of a Regexp -without mutex contention. -A copy does have additional space overhead, so Copy -should only be used when contention has been observed. -
      • - -
      • -The strconv package adds -IsGraphic, -similar to IsPrint. -It also adds -QuoteToGraphic, -QuoteRuneToGraphic, -AppendQuoteToGraphic, -and -AppendQuoteRuneToGraphic, -analogous to -QuoteToASCII, -QuoteRuneToASCII, -and so on. -The ASCII family escapes all space characters except ASCII space (U+0020). -In contrast, the Graphic family does not escape any Unicode space characters (category Zs). -
      • - -
      • -In the testing package, -when a test calls -t.Parallel, -that test is paused until all non-parallel tests complete, and then -that test continues execution with all other parallel tests. -Go 1.6 changes the time reported for such a test: -previously the time counted only the parallel execution, -but now it also counts the time from the start of testing -until the call to t.Parallel. -
      • - -
      • -The text/template package -contains two minor changes, in addition to the major changes -described above. -First, it adds a new -ExecError type -returned for any error during -Execute -that does not originate in a Write to the underlying writer. -Callers can distinguish template usage errors from I/O errors by checking for -ExecError. -Second, the -Funcs method -now checks that the names used as keys in the -FuncMap -are identifiers that can appear in a template function invocation. -If not, Funcs panics. -
      • - -
      • -The time package's -Parse function has always rejected any day of month larger than 31, -such as January 32. -In Go 1.6, Parse now also rejects February 29 in non-leap years, -February 30, February 31, April 31, June 31, September 31, and November 31. -
      • - -
      - diff --git a/doc/go1.7.html b/doc/go1.7.html deleted file mode 100644 index 61076fd091..0000000000 --- a/doc/go1.7.html +++ /dev/null @@ -1,1281 +0,0 @@ - - - - - - - - -

      Introduction to Go 1.7

      - -

      -The latest Go release, version 1.7, arrives six months after 1.6. -Most of its changes are in the implementation of the toolchain, runtime, and libraries. -There is one minor change to the language specification. -As always, the release maintains the Go 1 promise of compatibility. -We expect almost all Go programs to continue to compile and run as before. -

      - -

      -The release adds a port to IBM LinuxOne; -updates the x86-64 compiler back end to generate more efficient code; -includes the context package, promoted from the -x/net subrepository -and now used in the standard library; -and adds support in the testing package for -creating hierarchies of tests and benchmarks. -The release also finalizes the vendoring support -started in Go 1.5, making it a standard feature. -

      - -

      Changes to the language

      - -

      -There is one tiny language change in this release. -The section on terminating statements -clarifies that to determine whether a statement list ends in a terminating statement, -the “final non-empty statement” is considered the end, -matching the existing behavior of the gc and gccgo compiler toolchains. -In earlier releases the definition referred only to the “final statement,” -leaving the effect of trailing empty statements at the least unclear. -The go/types -package has been updated to match the gc and gccgo compiler toolchains -in this respect. -This change has no effect on the correctness of existing programs. -

      - -

      Ports

      - -

      -Go 1.7 adds support for macOS 10.12 Sierra. -Binaries built with versions of Go before 1.7 will not work -correctly on Sierra. -

      - -

      -Go 1.7 adds an experimental port to Linux on z Systems (linux/s390x) -and the beginning of a port to Plan 9 on ARM (plan9/arm). -

      - -

      -The experimental ports to Linux on 64-bit MIPS (linux/mips64 and linux/mips64le) -added in Go 1.6 now have full support for cgo and external linking. -

      - -

      -The experimental port to Linux on little-endian 64-bit PowerPC (linux/ppc64le) -now requires the POWER8 architecture or later. -Big-endian 64-bit PowerPC (linux/ppc64) only requires the -POWER5 architecture. -

      - -

      -The OpenBSD port now requires OpenBSD 5.6 or later, for access to the getentropy(2) system call. -

      - -

      Known Issues

      - -

      -There are some instabilities on FreeBSD that are known but not understood. -These can lead to program crashes in rare cases. -See issue 16136, -issue 15658, -and issue 16396. -Any help in solving these FreeBSD-specific issues would be appreciated. -

      - -

      Tools

      - -

      Assembler

      - -

      -For 64-bit ARM systems, the vector register names have been -corrected to V0 through V31; -previous releases incorrectly referred to them as V32 through V63. -

      - -

      -For 64-bit x86 systems, the following instructions have been added: -PCMPESTRI, -RORXL, -RORXQ, -VINSERTI128, -VPADDD, -VPADDQ, -VPALIGNR, -VPBLENDD, -VPERM2F128, -VPERM2I128, -VPOR, -VPSHUFB, -VPSHUFD, -VPSLLD, -VPSLLDQ, -VPSLLQ, -VPSRLD, -VPSRLDQ, -and -VPSRLQ. -

      - -

      Compiler Toolchain

      - -

      -This release includes a new code generation back end for 64-bit x86 systems, -following a proposal from 2015 -that has been under development since then. -The new back end, based on -SSA, -generates more compact, more efficient code -and provides a better platform for optimizations -such as bounds check elimination. -The new back end reduces the CPU time required by -our benchmark programs by 5-35%. -

      - -

      -For this release, the new back end can be disabled by passing --ssa=0 to the compiler. -If you find that your program compiles or runs successfully -only with the new back end disabled, please -file a bug report. -

      - -

      -The format of exported metadata written by the compiler in package archives has changed: -the old textual format has been replaced by a more compact binary format. -This results in somewhat smaller package archives and fixes a few -long-standing corner case bugs. -

      - -

      -For this release, the new export format can be disabled by passing --newexport=0 to the compiler. -If you find that your program compiles or runs successfully -only with the new export format disabled, please -file a bug report. -

      - -

      -The linker's -X option no longer supports the unusual two-argument form --X name value, -as announced in the Go 1.6 release -and in warnings printed by the linker. -Use -X name=value instead. -

      - -

      -The compiler and linker have been optimized and run significantly faster in this release than in Go 1.6, -although they are still slower than we would like and will continue to be optimized in future releases. -

      - -

      -Due to changes across the compiler toolchain and standard library, -binaries built with this release should typically be smaller than binaries -built with Go 1.6, -sometimes by as much as 20-30%. -

      - -

      -On x86-64 systems, Go programs now maintain stack frame pointers -as expected by profiling tools like Linux's perf and Intel's VTune, -making it easier to analyze and optimize Go programs using these tools. -The frame pointer maintenance has a small run-time overhead that varies -but averages around 2%. We hope to reduce this cost in future releases. -To build a toolchain that does not use frame pointers, set -GOEXPERIMENT=noframepointer when running -make.bash, make.bat, or make.rc. -

      - -

      Cgo

      - -

      -Packages using cgo may now include -Fortran source files (in addition to C, C++, Objective C, and SWIG), -although the Go bindings must still use C language APIs. -

      - -

      -Go bindings may now use a new helper function C.CBytes. -In contrast to C.CString, which takes a Go string -and returns a *C.byte (a C char*), -C.CBytes takes a Go []byte -and returns an unsafe.Pointer (a C void*). -

      - -

      -Packages and binaries built using cgo have in past releases -produced different output on each build, -due to the embedding of temporary directory names. -When using this release with -new enough versions of GCC or Clang -(those that support the -fdebug-prefix-map option), -those builds should finally be deterministic. -

      - -

      Gccgo

      - -

      -Due to the alignment of Go's semiannual release schedule with GCC's annual release schedule, -GCC release 6 contains the Go 1.6.1 version of gccgo. -The next release, GCC 7, will likely have the Go 1.8 version of gccgo. -

      - -

      Go command

      - -

      -The go command's basic operation -is unchanged, but there are a number of changes worth noting. -

      - -

      -This release removes support for the GO15VENDOREXPERIMENT environment variable, -as announced in the Go 1.6 release. -Vendoring support -is now a standard feature of the go command and toolchain. -

      - -

      -The Package data structure made available to -“go list” now includes a -StaleReason field explaining why a particular package -is or is not considered stale (in need of rebuilding). -This field is available to the -f or -json -options and is useful for understanding why a target is being rebuilt. -

      - -

      -The “go get” command now supports -import paths referring to git.openstack.org. -

      - -

      -This release adds experimental, minimal support for building programs using -binary-only packages, -packages distributed in binary form -without the corresponding source code. -This feature is needed in some commercial settings -but is not intended to be fully integrated into the rest of the toolchain. -For example, tools that assume access to complete source code -will not work with such packages, and there are no plans to support -such packages in the “go get” command. -

      - -

      Go doc

      - -

      -The “go doc” command -now groups constructors with the type they construct, -following godoc. -

      - -

      Go vet

      - -

      -The “go vet” command -has more accurate analysis in its -copylock and -printf checks, -and a new -tests check that checks the name and signature of likely test functions. -To avoid confusion with the new -tests check, the old, unadvertised --test option has been removed; it was equivalent to -all -shadow. -

      - -

      -The vet command also has a new check, --lostcancel, which detects failure to call the -cancelation function returned by the WithCancel, -WithTimeout, and WithDeadline functions in -Go 1.7's new context package (see below). -Failure to call the function prevents the new Context -from being reclaimed until its parent is cancelled. -(The background context is never cancelled.) -

      - -

      Go tool dist

      - -

      -The new subcommand “go tool dist list” -prints all supported operating system/architecture pairs. -

      - -

      Go tool trace

      - -

      -The “go tool trace” command, -introduced in Go 1.5, -has been refined in various ways. -

      - -

      -First, collecting traces is significantly more efficient than in past releases. -In this release, the typical execution-time overhead of collecting a trace is about 25%; -in past releases it was at least 400%. -Second, trace files now include file and line number information, -making them more self-contained and making the -original executable optional when running the trace tool. -Third, the trace tool now breaks up large traces to avoid limits -in the browser-based viewer. -

      - -

      -Although the trace file format has changed in this release, -the Go 1.7 tools can still read traces from earlier releases. -

      - -

      Performance

      - -

      -As always, the changes are so general and varied that precise statements -about performance are difficult to make. -Most programs should run a bit faster, -due to speedups in the garbage collector and -optimizations in the core library. -On x86-64 systems, many programs will run significantly faster, -due to improvements in generated code brought by the -new compiler back end. -As noted above, in our own benchmarks, -the code generation changes alone typically reduce program CPU time by 5-35%. -

      - -

      - -There have been significant optimizations bringing more than 10% improvements -to implementations in the -crypto/sha1, -crypto/sha256, -encoding/binary, -fmt, -hash/adler32, -hash/crc32, -hash/crc64, -image/color, -math/big, -strconv, -strings, -unicode, -and -unicode/utf16 -packages. -

      - -

      -Garbage collection pauses should be significantly shorter than they -were in Go 1.6 for programs with large numbers of idle goroutines, -substantial stack size fluctuation, or large package-level variables. -

      - -

      Core library

      - -

      Context

      - -

      -Go 1.7 moves the golang.org/x/net/context package -into the standard library as context. -This allows the use of contexts for cancelation, timeouts, and passing -request-scoped data in other standard library packages, -including -net, -net/http, -and -os/exec, -as noted below. -

      - -

      -For more information about contexts, see the -package documentation -and the Go blog post -“Go Concurrent Patterns: Context.” -

      - -

      HTTP Tracing

      - -

      -Go 1.7 introduces net/http/httptrace, -a package that provides mechanisms for tracing events within HTTP requests. -

      - -

      Testing

      - -

      -The testing package now supports the definition -of tests with subtests and benchmarks with sub-benchmarks. -This support makes it easy to write table-driven benchmarks -and to create hierarchical tests. -It also provides a way to share common setup and tear-down code. -See the package documentation for details. -

      - -

      Runtime

      - -

      -All panics started by the runtime now use panic values -that implement both the -builtin error, -and -runtime.Error, -as -required by the language specification. -

      - -

      -During panics, if a signal's name is known, it will be printed in the stack trace. -Otherwise, the signal's number will be used, as it was before Go1.7. -

      - -

      -The new function -KeepAlive -provides an explicit mechanism for declaring -that an allocated object must be considered reachable -at a particular point in a program, -typically to delay the execution of an associated finalizer. -

      - -

      -The new function -CallersFrames -translates a PC slice obtained from -Callers -into a sequence of frames corresponding to the call stack. -This new API should be preferred instead of direct use of -FuncForPC, -because the frame sequence can more accurately describe -call stacks with inlined function calls. -

      - -

      -The new function -SetCgoTraceback -facilitates tighter integration between Go and C code executing -in the same process called using cgo. -

      - -

      -On 32-bit systems, the runtime can now use memory allocated -by the operating system anywhere in the address space, -eliminating the -“memory allocated by OS not in usable range” failure -common in some environments. -

      - -

      -The runtime can now return unused memory to the operating system on -all architectures. -In Go 1.6 and earlier, the runtime could not -release memory on ARM64, 64-bit PowerPC, or MIPS. -

      - -

      -On Windows, Go programs in Go 1.5 and earlier forced -the global Windows timer resolution to 1ms at startup -by calling timeBeginPeriod(1). -Changing the global timer resolution caused problems on some systems, -and testing suggested that the call was not needed for good scheduler performance, -so Go 1.6 removed the call. -Go 1.7 brings the call back: under some workloads the call -is still needed for good scheduler performance. -

      - - -

      Minor changes to the library

      - -

      -As always, there are various minor changes and updates to the library, -made with the Go 1 promise of compatibility -in mind. -

      - -
      bufio
      - -
      -

      -In previous releases of Go, if -Reader's -Peek method -were asked for more bytes than fit in the underlying buffer, -it would return an empty slice and the error ErrBufferFull. -Now it returns the entire underlying buffer, still accompanied by the error ErrBufferFull. -

      -
      -
      - -
      bytes
      - -
      -

      -The new functions -ContainsAny and -ContainsRune -have been added for symmetry with -the strings package. -

      - -

      -In previous releases of Go, if -Reader's -Read method -were asked for zero bytes with no data remaining, it would -return a count of 0 and no error. -Now it returns a count of 0 and the error -io.EOF. -

      - -

      -The -Reader type has a new method -Reset to allow reuse of a Reader. -

      -
      -
      - -
      compress/flate
      - -
      -

      -There are many performance optimizations throughout the package. -Decompression speed is improved by about 10%, -while compression for DefaultCompression is twice as fast. -

      - -

      -In addition to those general improvements, -the -BestSpeed -compressor has been replaced entirely and uses an -algorithm similar to Snappy, -resulting in about a 2.5X speed increase, -although the output can be 5-10% larger than with the previous algorithm. -

      - -

      -There is also a new compression level -HuffmanOnly -that applies Huffman but not Lempel-Ziv encoding. -Forgoing Lempel-Ziv encoding means that -HuffmanOnly runs about 3X faster than the new BestSpeed -but at the cost of producing compressed outputs that are 20-40% larger than those -generated by the new BestSpeed. -

      - -

      -It is important to note that both -BestSpeed and HuffmanOnly produce a compressed output that is -RFC 1951 compliant. -In other words, any valid DEFLATE decompressor will continue to be able to decompress these outputs. -

      - -

      -Lastly, there is a minor change to the decompressor's implementation of -io.Reader. In previous versions, -the decompressor deferred reporting -io.EOF until exactly no more bytes could be read. -Now, it reports -io.EOF more eagerly when reading the last set of bytes. -

      -
      -
      - -
      crypto/tls
      - -
      -

      -The TLS implementation sends the first few data packets on each connection -using small record sizes, gradually increasing to the TLS maximum record size. -This heuristic reduces the amount of data that must be received before -the first packet can be decrypted, improving communication latency over -low-bandwidth networks. -Setting -Config's -DynamicRecordSizingDisabled field to true -forces the behavior of Go 1.6 and earlier, where packets are -as large as possible from the start of the connection. -

      - -

      -The TLS client now has optional, limited support for server-initiated renegotiation, -enabled by setting the -Config's -Renegotiation field. -This is needed for connecting to many Microsoft Azure servers. -

      - -

      -The errors returned by the package now consistently begin with a -tls: prefix. -In past releases, some errors used a crypto/tls: prefix, -some used a tls: prefix, and some had no prefix at all. -

      - -

      -When generating self-signed certificates, the package no longer sets the -“Authority Key Identifier” field by default. -

      -
      -
      - -
      crypto/x509
      - -
      -

      -The new function -SystemCertPool -provides access to the entire system certificate pool if available. -There is also a new associated error type -SystemRootsError. -

      -
      -
      - -
      debug/dwarf
      - -
      -

      -The -Reader type's new -SeekPC method and the -Data type's new -Ranges method -help to find the compilation unit to pass to a -LineReader -and to identify the specific function for a given program counter. -

      -
      -
      - -
      debug/elf
      - -
      -

      -The new -R_390 relocation type -and its many predefined constants -support the S390 port. -

      -
      -
      - -
      encoding/asn1
      - -
      -

      -The ASN.1 decoder now rejects non-minimal integer encodings. -This may cause the package to reject some invalid but formerly accepted ASN.1 data. -

      -
      -
      - -
      encoding/json
      - -
      -

      -The -Encoder's new -SetIndent method -sets the indentation parameters for JSON encoding, -like in the top-level -Indent function. -

      - -

      -The -Encoder's new -SetEscapeHTML method -controls whether the -&, <, and > -characters in quoted strings should be escaped as -\u0026, \u003c, and \u003e, -respectively. -As in previous releases, the encoder defaults to applying this escaping, -to avoid certain problems that can arise when embedding JSON in HTML. -

      - -

      -In earlier versions of Go, this package only supported encoding and decoding -maps using keys with string types. -Go 1.7 adds support for maps using keys with integer types: -the encoding uses a quoted decimal representation as the JSON key. -Go 1.7 also adds support for encoding maps using non-string keys that implement -the MarshalText -(see -encoding.TextMarshaler) -method, -as well as support for decoding maps using non-string keys that implement -the UnmarshalText -(see -encoding.TextUnmarshaler) -method. -These methods are ignored for keys with string types in order to preserve -the encoding and decoding used in earlier versions of Go. -

      - -

      -When encoding a slice of typed bytes, -Marshal -now generates an array of elements encoded using -that byte type's -MarshalJSON -or -MarshalText -method if present, -only falling back to the default base64-encoded string data if neither method is available. -Earlier versions of Go accept both the original base64-encoded string encoding -and the array encoding (assuming the byte type also implements -UnmarshalJSON -or -UnmarshalText -as appropriate), -so this change should be semantically backwards compatible with earlier versions of Go, -even though it does change the chosen encoding. -

      -
      -
      - -
      go/build
      - -
      -

      -To implement the go command's new support for binary-only packages -and for Fortran code in cgo-based packages, -the -Package type -adds new fields BinaryOnly, CgoFFLAGS, and FFiles. -

      -
      -
      - -
      go/doc
      - -
      -

      -To support the corresponding change in go test described above, -Example struct adds a Unordered field -indicating whether the example may generate its output lines in any order. -

      -
      -
      - -
      io
      - -
      -

      -The package adds new constants -SeekStart, SeekCurrent, and SeekEnd, -for use with -Seeker -implementations. -These constants are preferred over os.SEEK_SET, os.SEEK_CUR, and os.SEEK_END, -but the latter will be preserved for compatibility. -

      -
      -
      - -
      math/big
      - -
      -

      -The -Float type adds -GobEncode and -GobDecode methods, -so that values of type Float can now be encoded and decoded using the -encoding/gob -package. -

      -
      -
      - -
      math/rand
      - -
      -

      -The -Read function and -Rand's -Read method -now produce a pseudo-random stream of bytes that is consistent and not -dependent on the size of the input buffer. -

      - -

      -The documentation clarifies that -Rand's Seed -and Read methods -are not safe to call concurrently, though the global -functions Seed -and Read are (and have -always been) safe. -

      -
      -
      - -
      mime/multipart
      - -
      -

      -The -Writer -implementation now emits each multipart section's header sorted by key. -Previously, iteration over a map caused the section header to use a -non-deterministic order. -

      -
      -
      - -
      net
      - -
      -

      -As part of the introduction of context, the -Dialer type has a new method -DialContext, like -Dial but adding the -context.Context -for the dial operation. -The context is intended to obsolete the Dialer's -Cancel and Deadline fields, -but the implementation continues to respect them, -for backwards compatibility. -

      - -

      -The -IP type's -String method has changed its result for invalid IP addresses. -In past releases, if an IP byte slice had length other than 0, 4, or 16, String -returned "?". -Go 1.7 adds the hexadecimal encoding of the bytes, as in "?12ab". -

      - -

      -The pure Go name resolution -implementation now respects nsswitch.conf's -stated preference for the priority of DNS lookups compared to -local file (that is, /etc/hosts) lookups. -

      -
      -
      - -
      net/http
      - -
      -

      -ResponseWriter's -documentation now makes clear that beginning to write the response -may prevent future reads on the request body. -For maximal compatibility, implementations are encouraged to -read the request body completely before writing any part of the response. -

      - -

      -As part of the introduction of context, the -Request has a new methods -Context, to retrieve the associated context, and -WithContext, to construct a copy of Request -with a modified context. -

      - -

      -In the -Server implementation, -Serve records in the request context -both the underlying *Server using the key ServerContextKey -and the local address on which the request was received (a -Addr) using the key LocalAddrContextKey. -For example, the address on which a request received is -req.Context().Value(http.LocalAddrContextKey).(net.Addr). -

      - -

      -The server's Serve method -now only enables HTTP/2 support if the Server.TLSConfig field is nil -or includes "h2" in its TLSConfig.NextProtos. -

      - -

      -The server implementation now -pads response codes less than 100 to three digits -as required by the protocol, -so that w.WriteHeader(5) uses the HTTP response -status 005, not just 5. -

      - -

      -The server implementation now correctly sends only one "Transfer-Encoding" header when "chunked" -is set explicitly, following RFC 7230. -

      - -

      -The server implementation is now stricter about rejecting requests with invalid HTTP versions. -Invalid requests claiming to be HTTP/0.x are now rejected (HTTP/0.9 was never fully supported), -and plaintext HTTP/2 requests other than the "PRI * HTTP/2.0" upgrade request are now rejected as well. -The server continues to handle encrypted HTTP/2 requests. -

      - -

      -In the server, a 200 status code is sent back by the timeout handler on an empty -response body, instead of sending back 0 as the status code. -

      - -

      -In the client, the -Transport implementation passes the request context -to any dial operation connecting to the remote server. -If a custom dialer is needed, the new Transport field -DialContext is preferred over the existing Dial field, -to allow the transport to supply a context. -

      - -

      -The -Transport also adds fields -IdleConnTimeout, -MaxIdleConns, -and -MaxResponseHeaderBytes -to help control client resources consumed -by idle or chatty servers. -

      - -

      -A -Client's configured CheckRedirect function can now -return ErrUseLastResponse to indicate that the -most recent redirect response should be returned as the -result of the HTTP request. -That response is now available to the CheckRedirect function -as req.Response. -

      - -

      -Since Go 1, the default behavior of the HTTP client is -to request server-side compression -using the Accept-Encoding request header -and then to decompress the response body transparently, -and this behavior is adjustable using the -Transport's DisableCompression field. -In Go 1.7, to aid the implementation of HTTP proxies, the -Response's new -Uncompressed field reports whether -this transparent decompression took place. -

      - -

      -DetectContentType -adds support for a few new audio and video content types. -

      -
      -
      - -
      net/http/cgi
      - -
      -

      -The -Handler -adds a new field -Stderr -that allows redirection of the child process's -standard error away from the host process's -standard error. -

      -
      -
      - -
      net/http/httptest
      - -
      -

      -The new function -NewRequest -prepares a new -http.Request -suitable for passing to an -http.Handler during a test. -

      - -

      -The -ResponseRecorder's new -Result method -returns the recorded -http.Response. -Tests that need to check the response's headers or trailers -should call Result and inspect the response fields -instead of accessing -ResponseRecorder's HeaderMap directly. -

      -
      -
      - -
      net/http/httputil
      - -
      -

      -The -ReverseProxy implementation now responds with “502 Bad Gateway” -when it cannot reach a back end; in earlier releases it responded with “500 Internal Server Error.” -

      - -

      -Both -ClientConn and -ServerConn have been documented as deprecated. -They are low-level, old, and unused by Go's current HTTP stack -and will no longer be updated. -Programs should use -http.Client, -http.Transport, -and -http.Server -instead. -

      -
      -
      - -
      net/http/pprof
      - -
      -

      -The runtime trace HTTP handler, installed to handle the path /debug/pprof/trace, -now accepts a fractional number in its seconds query parameter, -allowing collection of traces for intervals smaller than one second. -This is especially useful on busy servers. -

      -
      -
      - -
      net/mail
      - -
      -

      -The address parser now allows unescaped UTF-8 text in addresses -following RFC 6532, -but it does not apply any normalization to the result. -For compatibility with older mail parsers, -the address encoder, namely -Address's -String method, -continues to escape all UTF-8 text following RFC 5322. -

      - -

      -The ParseAddress -function and -the AddressParser.Parse -method are stricter. -They used to ignore any characters following an e-mail address, but -will now return an error for anything other than whitespace. -

      -
      -
      - -
      net/url
      - -
      -

      -The -URL's -new ForceQuery field -records whether the URL must have a query string, -in order to distinguish URLs without query strings (like /search) -from URLs with empty query strings (like /search?). -

      -
      -
      - -
      os
      - -
      -

      -IsExist now returns true for syscall.ENOTEMPTY, -on systems where that error exists. -

      - -

      -On Windows, -Remove now removes read-only files when possible, -making the implementation behave as on -non-Windows systems. -

      -
      -
      - -
      os/exec
      - -
      -

      -As part of the introduction of context, -the new constructor -CommandContext -is like -Command but includes a context that can be used to cancel the command execution. -

      -
      -
      - -
      os/user
      - -
      -

      -The -Current -function is now implemented even when cgo is not available. -

      - -

      -The new -Group type, -along with the lookup functions -LookupGroup and -LookupGroupId -and the new field GroupIds in the User struct, -provides access to system-specific user group information. -

      -
      -
      - -
      reflect
      - -
      -

      -Although -Value's -Field method has always been documented to panic -if the given field number i is out of range, it has instead -silently returned a zero -Value. -Go 1.7 changes the method to behave as documented. -

      - -

      -The new -StructOf -function constructs a struct type at run time. -It completes the set of type constructors, joining -ArrayOf, -ChanOf, -FuncOf, -MapOf, -PtrTo, -and -SliceOf. -

      - -

      -StructTag's -new method -Lookup -is like -Get -but distinguishes the tag not containing the given key -from the tag associating an empty string with the given key. -

      - -

      -The -Method and -NumMethod -methods of -Type and -Value -no longer return or count unexported methods. -

      -
      -
      - -
      strings
      - -
      -

      -In previous releases of Go, if -Reader's -Read method -were asked for zero bytes with no data remaining, it would -return a count of 0 and no error. -Now it returns a count of 0 and the error -io.EOF. -

      - -

      -The -Reader type has a new method -Reset to allow reuse of a Reader. -

      -
      -
      - -
      time
      - -
      -

      -Duration's -time.Duration.String method now reports the zero duration as "0s", not "0". -ParseDuration continues to accept both forms. -

      - -

      -The method call time.Local.String() now returns "Local" on all systems; -in earlier releases, it returned an empty string on Windows. -

      - -

      -The time zone database in -$GOROOT/lib/time has been updated -to IANA release 2016d. -This fallback database is only used when the system time zone database -cannot be found, for example on Windows. -The Windows time zone abbreviation list has also been updated. -

      -
      -
      - -
      syscall
      - -
      -

      -On Linux, the -SysProcAttr struct -(as used in -os/exec.Cmd's SysProcAttr field) -has a new Unshareflags field. -If the field is nonzero, the child process created by -ForkExec -(as used in exec.Cmd's Run method) -will call the -unshare(2) -system call before executing the new program. -

      -
      -
      - - -
      unicode
      - -
      -

      -The unicode package and associated -support throughout the system has been upgraded from version 8.0 to -Unicode 9.0. -

      -
      -
      diff --git a/doc/go1.8.html b/doc/go1.8.html deleted file mode 100644 index 2a47fac420..0000000000 --- a/doc/go1.8.html +++ /dev/null @@ -1,1666 +0,0 @@ - - - - - - -

      Introduction to Go 1.8

      - -

      -The latest Go release, version 1.8, arrives six months after Go 1.7. -Most of its changes are in the implementation of the toolchain, runtime, and libraries. -There are two minor changes to the language specification. -As always, the release maintains the Go 1 promise of compatibility. -We expect almost all Go programs to continue to compile and run as before. -

      - -

      -The release adds support for 32-bit MIPS, -updates the compiler back end to generate more efficient code, -reduces GC pauses by eliminating stop-the-world stack rescanning, -adds HTTP/2 Push support, -adds HTTP graceful shutdown, -adds more context support, -enables profiling mutexes, -and simplifies sorting slices. -

      - -

      Changes to the language

      - -

      - When explicitly converting a value from one struct type to another, - as of Go 1.8 the tags are ignored. Thus two structs that differ - only in their tags may be converted from one to the other: -

      - -
      -func example() {
      -	type T1 struct {
      -		X int `json:"foo"`
      -	}
      -	type T2 struct {
      -		X int `json:"bar"`
      -	}
      -	var v1 T1
      -	var v2 T2
      -	v1 = T1(v2) // now legal
      -}
      -
      - - -

      - The language specification now only requires that implementations - support up to 16-bit exponents in floating-point constants. This does not affect - either the “gc” or - gccgo compilers, both of - which still support 32-bit exponents. -

      - -

      Ports

      - -

      -Go now supports 32-bit MIPS on Linux for both big-endian -(linux/mips) and little-endian machines -(linux/mipsle) that implement the MIPS32r1 instruction set with FPU -or kernel FPU emulation. Note that many common MIPS-based routers lack an FPU and -have firmware that doesn't enable kernel FPU emulation; Go won't run on such machines. -

      - -

      -On DragonFly BSD, Go now requires DragonFly 4.4.4 or later. -

      - -

      -On OpenBSD, Go now requires OpenBSD 5.9 or later. -

      - -

      -The Plan 9 port's networking support is now much more complete -and matches the behavior of Unix and Windows with respect to deadlines -and cancelation. For Plan 9 kernel requirements, see the -Plan 9 wiki page. -

      - -

      - Go 1.8 now only supports OS X 10.8 or later. This is likely the last - Go release to support 10.8. Compiling Go or running - binaries on older OS X versions is untested. -

      - -

      - Go 1.8 will be the last release to support Linux on ARMv5E and ARMv6 processors: - Go 1.9 will likely require the ARMv6K (as found in the Raspberry Pi 1) or later. - To identify whether a Linux system is ARMv6K or later, run - “go tool dist -check-armv6k” - (to facilitate testing, it is also possible to just copy the dist command to the - system without installing a full copy of Go 1.8) - and if the program terminates with output "ARMv6K supported." then the system - implements ARMv6K or later. - Go on non-Linux ARM systems already requires ARMv6K or later. -

      - - -

      Known Issues

      - -

      -There are some instabilities on FreeBSD and NetBSD that are known but not understood. -These can lead to program crashes in rare cases. -See -issue 15658 and -issue 16511. -Any help in solving these issues would be appreciated. -

      - -

      Tools

      - -

      Assembler

      - -

      -For 64-bit x86 systems, the following instructions have been added: -VBROADCASTSD, -BROADCASTSS, -MOVDDUP, -MOVSHDUP, -MOVSLDUP, -VMOVDDUP, -VMOVSHDUP, and -VMOVSLDUP. -

      - -

      -For 64-bit PPC systems, the common vector scalar instructions have been -added: -LXS, -LXSDX, -LXSI, -LXSIWAX, -LXSIWZX, -LXV, -LXVD2X, -LXVDSX, -LXVW4X, -MFVSR, -MFVSRD, -MFVSRWZ, -MTVSR, -MTVSRD, -MTVSRWA, -MTVSRWZ, -STXS, -STXSDX, -STXSI, -STXSIWX, -STXV, -STXVD2X, -STXVW4X, -XSCV, -XSCVDPSP, -XSCVDPSPN, -XSCVDPSXDS, -XSCVDPSXWS, -XSCVDPUXDS, -XSCVDPUXWS, -XSCVSPDP, -XSCVSPDPN, -XSCVSXDDP, -XSCVSXDSP, -XSCVUXDDP, -XSCVUXDSP, -XSCVX, -XSCVXP, -XVCV, -XVCVDPSP, -XVCVDPSXDS, -XVCVDPSXWS, -XVCVDPUXDS, -XVCVDPUXWS, -XVCVSPDP, -XVCVSPSXDS, -XVCVSPSXWS, -XVCVSPUXDS, -XVCVSPUXWS, -XVCVSXDDP, -XVCVSXDSP, -XVCVSXWDP, -XVCVSXWSP, -XVCVUXDDP, -XVCVUXDSP, -XVCVUXWDP, -XVCVUXWSP, -XVCVX, -XVCVXP, -XXLAND, -XXLANDC, -XXLANDQ, -XXLEQV, -XXLNAND, -XXLNOR, -XXLOR, -XXLORC, -XXLORQ, -XXLXOR, -XXMRG, -XXMRGHW, -XXMRGLW, -XXPERM, -XXPERMDI, -XXSEL, -XXSI, -XXSLDWI, -XXSPLT, and -XXSPLTW. -

      - -

      Yacc

      - -

      -The yacc tool (previously available by running -“go tool yacc”) has been removed. -As of Go 1.7 it was no longer used by the Go compiler. -It has moved to the “tools” repository and is now available at -golang.org/x/tools/cmd/goyacc. -

      - -

      Fix

      - -

      - The fix tool has a new “context” - fix to change imports from “golang.org/x/net/context” - to “context”. -

      - -

      Pprof

      - -

      - The pprof tool can now profile TLS servers - and skip certificate validation by using the “https+insecure” - URL scheme. -

      - -

      - The callgrind output now has instruction-level granularity. -

      - -

      Trace

      - -

      - The trace tool has a new -pprof flag for - producing pprof-compatible blocking and latency profiles from an - execution trace. -

      - -

      - Garbage collection events are now shown more clearly in the - execution trace viewer. Garbage collection activity is shown on its - own row and GC helper goroutines are annotated with their roles. -

      - -

      Vet

      - -

      Vet is stricter in some ways and looser where it - previously caused false positives.

      - -

      Vet now checks for copying an array of locks, - duplicate JSON and XML struct field tags, - non-space-separated struct tags, - deferred calls to HTTP Response.Body.Close - before checking errors, and - indexed arguments in Printf. - It also improves existing checks.

      -

      - -

      Compiler Toolchain

      - -

      -Go 1.7 introduced a new compiler back end for 64-bit x86 systems. -In Go 1.8, that back end has been developed further and is now used for -all architectures. -

      - -

      -The new back end, based on -static single assignment form (SSA), -generates more compact, more efficient code -and provides a better platform for optimizations -such as bounds check elimination. -The new back end reduces the CPU time required by -our benchmark programs by 20-30% -on 32-bit ARM systems. For 64-bit x86 systems, which already used the SSA back end in -Go 1.7, the gains are a more modest 0-10%. Other architectures will likely -see improvements closer to the 32-bit ARM numbers. -

      - -

      - The temporary -ssa=0 compiler flag introduced in Go 1.7 - to disable the new back end has been removed in Go 1.8. -

      - -

      - In addition to enabling the new compiler back end for all systems, - Go 1.8 also introduces a new compiler front end. The new compiler - front end should not be noticeable to users but is the foundation for - future performance work. -

      - -

      - The compiler and linker have been optimized and run faster in this - release than in Go 1.7, although they are still slower than we would - like and will continue to be optimized in future releases. - Compared to the previous release, Go 1.8 is - about 15% faster. -

      - -

      Cgo

      - -

      -The Go tool now remembers the value of the CGO_ENABLED environment -variable set during make.bash and applies it to all future compilations -by default to fix issue #12808. -When doing native compilation, it is rarely necessary to explicitly set -the CGO_ENABLED environment variable as make.bash -will detect the correct setting automatically. The main reason to explicitly -set the CGO_ENABLED environment variable is when your environment -supports cgo, but you explicitly do not want cgo support, in which case, set -CGO_ENABLED=0 during make.bash or all.bash. -

      - -

      -The environment variable PKG_CONFIG may now be used to -set the program to run to handle #cgo pkg-config -directives. The default is pkg-config, the program -always used by earlier releases. This is intended to make it easier -to cross-compile -cgo code. -

      - -

      -The cgo tool now supports a -srcdir -option, which is used by the go command. -

      - -

      -If cgo code calls C.malloc, and -malloc returns NULL, the program will now -crash with an out of memory error. -C.malloc will never return nil. -Unlike most C functions, C.malloc may not be used in a -two-result form returning an errno value. -

      - -

      -If cgo is used to call a C function passing a -pointer to a C union, and if the C union can contain any pointer -values, and if cgo pointer -checking is enabled (as it is by default), the union value is now -checked for Go pointers. -

      - -

      Gccgo

      - -

      -Due to the alignment of Go's semiannual release schedule with GCC's -annual release schedule, -GCC release 6 contains the Go 1.6.1 version of gccgo. -We expect that the next release, GCC 7, will contain the Go 1.8 -version of gccgo. -

      - -

      Default GOPATH

      - -

      - The - GOPATH - environment variable now has a default value if it - is unset. It defaults to - $HOME/go on Unix and - %USERPROFILE%/go on Windows. -

      - -

      Go get

      - -

      - The “go get” command now always respects - HTTP proxy environment variables, regardless of whether - the -insecure flag is used. In previous releases, the - -insecure flag had the side effect of not using proxies. -

      - -

      Go bug

      - -

      - The new - “go bug” - command starts a bug report on GitHub, prefilled - with information about the current system. -

      - -

      Go doc

      - -

      - The - “go doc” - command now groups constants and variables with their type, - following the behavior of - godoc. -

      - -

      - In order to improve the readability of doc's - output, each summary of the first-level items is guaranteed to - occupy a single line. -

      - -

      - Documentation for a specific method in an interface definition can - now be requested, as in - “go doc net.Conn.SetDeadline”. -

      - -

      Plugins

      - -

      - Go now provides early support for plugins with a “plugin” - build mode for generating plugins written in Go, and a - new plugin package for - loading such plugins at run time. Plugin support is currently only - available on Linux. Please report any issues. -

      - -

      Runtime

      - -

      Argument Liveness

      - -

      - The garbage collector no longer considers - arguments live throughout the entirety of a function. For more - information, and for how to force a variable to remain live, see - the runtime.KeepAlive - function added in Go 1.7. -

      - -

      - Updating: - Code that sets a finalizer on an allocated object may need to add - calls to runtime.KeepAlive in functions or methods - using that object. - Read the - KeepAlive - documentation and its example for more details. -

      - -

      Concurrent Map Misuse

      - -

      -In Go 1.6, the runtime -added lightweight, -best-effort detection of concurrent misuse of maps. This release -improves that detector with support for detecting programs that -concurrently write to and iterate over a map. -

      -

      -As always, if one goroutine is writing to a map, no other goroutine should be -reading (which includes iterating) or writing the map concurrently. -If the runtime detects this condition, it prints a diagnosis and crashes the program. -The best way to find out more about the problem is to run the program -under the -race detector, -which will more reliably identify the race -and give more detail. -

      - -

      MemStats Documentation

      - -

      - The runtime.MemStats - type has been more thoroughly documented. -

      - -

      Performance

      - -

      -As always, the changes are so general and varied that precise statements -about performance are difficult to make. -Most programs should run a bit faster, -due to speedups in the garbage collector and -optimizations in the standard library. -

      - -

      -There have been optimizations to implementations in the -bytes, -crypto/aes, -crypto/cipher, -crypto/elliptic, -crypto/sha256, -crypto/sha512, -encoding/asn1, -encoding/csv, -encoding/hex, -encoding/json, -hash/crc32, -image/color, -image/draw, -math, -math/big, -reflect, -regexp, -runtime, -strconv, -strings, -syscall, -text/template, and -unicode/utf8 -packages. -

      - -

      Garbage Collector

      - -

      - Garbage collection pauses should be significantly shorter than they - were in Go 1.7, usually under 100 microseconds and often as low as - 10 microseconds. - See the - document on eliminating stop-the-world stack re-scanning - for details. More work remains for Go 1.9. -

      - -

      Defer

      - - -

      - The overhead of deferred - function calls has been reduced by about half. -

      - -

      Cgo

      - -

      The overhead of calls from Go into C has been reduced by about half.

      - -

      Standard library

      - -

      Examples

      - -

      -Examples have been added to the documentation across many packages. -

      - -

      Sort

      - -

      -The sort package -now includes a convenience function -Slice to sort a -slice given a less function. - -In many cases this means that writing a new sorter type is not -necessary. -

      - -

      -Also new are -SliceStable and -SliceIsSorted. -

      - -

      HTTP/2 Push

      - -

      -The net/http package now includes a -mechanism to -send HTTP/2 server pushes from a -Handler. -Similar to the existing Flusher and Hijacker -interfaces, an HTTP/2 -ResponseWriter -now implements the new -Pusher interface. -

      - -

      HTTP Server Graceful Shutdown

      - -

      - The HTTP Server now has support for graceful shutdown using the new - Server.Shutdown - method and abrupt shutdown using the new - Server.Close - method. -

      - -

      More Context Support

      - -

      - Continuing Go 1.7's adoption - of context.Context - into the standard library, Go 1.8 adds more context support - to existing packages: -

      - - - -

      Mutex Contention Profiling

      - -

      - The runtime and tools now support profiling contended mutexes. -

      - -

      - Most users will want to use the new -mutexprofile - flag with “go test”, - and then use pprof on the resultant file. -

      - -

      - Lower-level support is also available via the new - MutexProfile - and - SetMutexProfileFraction. -

      - -

      - A known limitation for Go 1.8 is that the profile only reports contention for - sync.Mutex, - not - sync.RWMutex. -

      - -

      Minor changes to the library

      - -

      -As always, there are various minor changes and updates to the library, -made with the Go 1 promise of compatibility -in mind. The following sections list the user visible changes and additions. -Optimizations and minor bug fixes are not listed. -

      - -
      archive/tar
      -
      - -

      - The tar implementation corrects many bugs in corner cases of the file format. - The Reader - is now able to process tar files in the PAX format with entries larger than 8GB. - The Writer - no longer produces invalid tar files in some situations involving long pathnames. -

      - -
      -
      - -
      compress/flate
      -
      - -

      - There have been some minor fixes to the encoder to improve the - compression ratio in certain situations. As a result, the exact - encoded output of DEFLATE may be different from Go 1.7. Since - DEFLATE is the underlying compression of gzip, png, zlib, and zip, - those formats may have changed outputs. -

      - -

      - The encoder, when operating in - NoCompression - mode, now produces a consistent output that is not dependent on - the size of the slices passed to the - Write - method. -

      - -

      - The decoder, upon encountering an error, now returns any - buffered data it had uncompressed along with the error. -

      - -
      -
      - - -
      compress/gzip
      -
      - -

      - The Writer - now encodes a zero MTIME field when - the Header.ModTime - field is the zero value. - - In previous releases of Go, the Writer would encode - a nonsensical value. - - Similarly, - the Reader - now reports a zero encoded MTIME field as a zero - Header.ModTime. -

      - -
      -
      - -
      context
      -
      -

      - The DeadlineExceeded - error now implements - net.Error - and reports true for both the Timeout and - Temporary methods. -

      -
      -
      - -
      crypto/tls
      -
      -

      - The new method - Conn.CloseWrite - allows TLS connections to be half closed. -

      - -

      - The new method - Config.Clone - clones a TLS configuration. -

      - -

      - - The new Config.GetConfigForClient - callback allows selecting a configuration for a client dynamically, based - on the client's - ClientHelloInfo. - - - The ClientHelloInfo - struct now has new - fields Conn, SignatureSchemes (using - the new - type SignatureScheme), - SupportedProtos, and SupportedVersions. -

      - -

      - The new Config.GetClientCertificate - callback allows selecting a client certificate based on the server's - TLS CertificateRequest message, represented by the new - CertificateRequestInfo. -

      - -

      - The new - Config.KeyLogWriter - allows debugging TLS connections - in WireShark and - similar tools. -

      - -

      - The new - Config.VerifyPeerCertificate - callback allows additional validation of a peer's presented certificate. -

      - -

      - The crypto/tls package now implements basic - countermeasures against CBC padding oracles. There should be - no explicit secret-dependent timings, but it does not attempt to - normalize memory accesses to prevent cache timing leaks. -

      - -

      - The crypto/tls package now supports - X25519 and - ChaCha20-Poly1305. - ChaCha20-Poly1305 is now prioritized unless - hardware support for AES-GCM is present. -

      - -

      - AES-128-CBC cipher suites with SHA-256 are also - now supported, but disabled by default. -

      - -
      -
      - -
      crypto/x509
      -
      -

      - PSS signatures are now supported. -

      - -

      - UnknownAuthorityError - now has a Cert field, reporting the untrusted - certificate. -

      - -

      - Certificate validation is more permissive in a few cases and - stricter in a few other cases. - -

      - -

      - Root certificates will now also be looked for - at /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem - on Linux, to support RHEL and CentOS. -

      - -
      -
      - -
      database/sql
      -
      -

      - The package now supports context.Context. There are new methods - ending in Context such as - DB.QueryContext and - DB.PrepareContext - that take context arguments. Using the new Context methods ensures that - connections are closed and returned to the connection pool when the - request is done; enables canceling in-progress queries - should the driver support that; and allows the database - pool to cancel waiting for the next available connection. -

      -

      - The IsolationLevel - can now be set when starting a transaction by setting the isolation level - on TxOptions.Isolation and passing - it to DB.BeginTx. - An error will be returned if an isolation level is selected that the driver - does not support. A read-only attribute may also be set on the transaction - by setting TxOptions.ReadOnly - to true. -

      -

      - Queries now expose the SQL column type information for drivers that support it. - Rows can return ColumnTypes - which can include SQL type information, column type lengths, and the Go type. -

      -

      - A Rows - can now represent multiple result sets. After - Rows.Next returns false, - Rows.NextResultSet - may be called to advance to the next result set. The existing Rows - should continue to be used after it advances to the next result set. -

      -

      - NamedArg may be used - as query arguments. The new function Named - helps create a NamedArg - more succinctly. -

      - If a driver supports the new - Pinger - interface, the - DB.Ping - and - DB.PingContext - methods will use that interface to check whether a - database connection is still valid. -

      -

      - The new Context query methods work for all drivers, but - Context cancelation is not responsive unless the driver has been - updated to use them. The other features require driver support in - database/sql/driver. - Driver authors should review the new interfaces. Users of existing - driver should review the driver documentation to see what - it supports and any system specific documentation on each feature. -

      -
      -
      - -
      debug/pe
      -
      -

      - The package has been extended and is now used by - the Go linker to read gcc-generated object files. - The new - File.StringTable - and - Section.Relocs - fields provide access to the COFF string table and COFF relocations. - The new - File.COFFSymbols - allows low-level access to the COFF symbol table. -

      -
      -
      - -
      encoding/base64
      -
      -

      - The new - Encoding.Strict - method returns an Encoding that causes the decoder - to return an error when the trailing padding bits are not zero. -

      -
      -
      - -
      encoding/binary
      -
      -

      - Read - and - Write - now support booleans. -

      -
      -
      - -
      encoding/json
      -
      - -

      - UnmarshalTypeError - now includes the struct and field name. -

      - -

      - A nil Marshaler - now marshals as a JSON null value. -

      - -

      - A RawMessage value now - marshals the same as its pointer type. -

      - -

      - Marshal - encodes floating-point numbers using the same format as in ES6, - preferring decimal (not exponential) notation for a wider range of values. - In particular, all floating-point integers up to 264 format the - same as the equivalent int64 representation. -

      - -

      - In previous versions of Go, unmarshaling a JSON null into an - Unmarshaler - was considered a no-op; now the Unmarshaler's - UnmarshalJSON method is called with the JSON literal - null and can define the semantics of that case. -

      - -
      -
      - -
      encoding/pem
      -
      -

      - Decode - is now strict about the format of the ending line. -

      -
      -
      - -
      encoding/xml
      -
      -

      - Unmarshal - now has wildcard support for collecting all attributes using - the new ",any,attr" struct tag. -

      -
      -
      - -
      expvar
      -
      -

      - The new methods - Int.Value, - String.Value, - Float.Value, and - Func.Value - report the current value of an exported variable. -

      - -

      - The new - function Handler - returns the package's HTTP handler, to enable installing it in - non-standard locations. -

      -
      -
      - -
      fmt
      -
      -

      - Scanf, - Fscanf, and - Sscanf now - handle spaces differently and more consistently than - previous releases. See the - scanning documentation - for details. -

      -
      -
      - -
      go/doc
      -
      -

      - The new IsPredeclared - function reports whether a string is a predeclared identifier. -

      -
      -
      - -
      go/types
      -
      -

      - The new function - Default - returns the default "typed" type for an "untyped" type. -

      - -

      - The alignment of complex64 now matches - the Go compiler. -

      -
      -
      - -
      html/template
      -
      -

      - The package now validates - the "type" attribute on - a <script> tag. -

      -
      -
      - -
      image/png
      -
      -

      - Decode - (and DecodeConfig) - now supports True Color and grayscale transparency. -

      -

      - Encoder - is now faster and creates smaller output - when encoding paletted images. -

      -
      -
      - -
      math/big
      -
      -

      - The new method - Int.Sqrt - calculates ⌊√x⌋. -

      - -

      - The new method - Float.Scan - is a support routine for - fmt.Scanner. -

      - -

      - Int.ModInverse - now supports negative numbers. -

      - -
      -
      - -
      math/rand
      -
      - -

      - The new Rand.Uint64 - method returns uint64 values. The - new Source64 - interface describes sources capable of generating such values - directly; otherwise the Rand.Uint64 method - constructs a uint64 from two calls - to Source's - Int63 method. -

      - -
      -
      - -
      mime
      -
      -

      - ParseMediaType - now preserves unnecessary backslash escapes as literals, - in order to support MSIE. - When MSIE sends a full file path (in “intranet mode”), it does not - escape backslashes: “C:\dev\go\foo.txt”, not - “C:\\dev\\go\\foo.txt”. - If we see an unnecessary backslash escape, we now assume it is from MSIE - and intended as a literal backslash. - No known MIME generators emit unnecessary backslash escapes - for simple token characters like numbers and letters. -

      -
      -
      - -
      mime/quotedprintable
      -
      - -

      - The - Reader's - parsing has been relaxed in two ways to accept - more input seen in the wild. - - - First, it accepts an equals sign (=) not followed - by two hex digits as a literal equal sign. - - - Second, it silently ignores a trailing equals sign at the end of - an encoded input. -

      - -
      -
      - -
      net
      -
      - -

      - The Conn documentation - has been updated to clarify expectations of an interface - implementation. Updates in the net/http packages - depend on implementations obeying the documentation. -

      -

      Updating: implementations of the Conn interface should verify - they implement the documented semantics. The - golang.org/x/net/nettest - package will exercise a Conn and validate it behaves properly. -

      - -

      - The new method - UnixListener.SetUnlinkOnClose - sets whether the underlying socket file should be removed from the file system when - the listener is closed. -

      - -

      - The new Buffers type permits - writing to the network more efficiently from multiple discontiguous buffers - in memory. On certain machines, for certain types of connections, - this is optimized into an OS-specific batch write operation (such as writev). -

      - -

      - The new Resolver looks up names and numbers - and supports context.Context. - The Dialer now has an optional - Resolver field. -

      - -

      - Interfaces is now supported on Solaris. -

      - -

      - The Go DNS resolver now supports resolv.conf's “rotate” - and “option ndots:0” options. The “ndots” option is - now respected in the same way as libresolve. -

      - -
      -
      - -
      net/http
      -
      - -

      Server changes:

      -
        -
      • The server now supports graceful shutdown support, mentioned above.
      • - -
      • - The Server - adds configuration options - ReadHeaderTimeout and IdleTimeout - and documents WriteTimeout. -
      • - -
      • - FileServer - and - ServeContent - now support HTTP If-Match conditional requests, - in addition to the previous If-None-Match - support for ETags properly formatted according to RFC 7232, section 2.3. -
      • -
      - -

      - There are several additions to what a server's Handler can do: -

      - -
        -
      • - The Context - returned - by Request.Context - is canceled if the underlying net.Conn - closes. For instance, if the user closes their browser in the - middle of a slow request, the Handler can now - detect that the user is gone. This complements the - existing CloseNotifier - support. This functionality requires that the underlying - net.Conn implements - recently clarified interface documentation. -
      • - -
      • - To serve trailers produced after the header has already been written, - see the new - TrailerPrefix - mechanism. -
      • - -
      • - A Handler can now abort a response by panicking - with the error - ErrAbortHandler. -
      • - -
      • - A Write of zero bytes to a - ResponseWriter - is now defined as a - way to test whether a ResponseWriter has been hijacked: - if so, the Write returns - ErrHijacked - without printing an error - to the server's error log. -
      • - -
      - -

      Client & Transport changes:

      -
        -
      • - The Client - now copies most request headers on redirect. See - the documentation - on the Client type for details. -
      • - -
      • - The Transport - now supports international domain names. Consequently, so do - Get and other helpers. -
      • - -
      • - The Client now supports 301, 307, and 308 redirects. - - For example, Client.Post now follows 301 - redirects, converting them to GET requests - without bodies, like it did for 302 and 303 redirect responses - previously. - - The Client now also follows 307 and 308 - redirects, preserving the original request method and body, if - any. If the redirect requires resending the request body, the - request must have the new - Request.GetBody - field defined. - NewRequest - sets Request.GetBody automatically for common - body types. -
      • - -
      • - The Transport now rejects requests for URLs with - ports containing non-digit characters. -
      • - -
      • - The Transport will now retry non-idempotent - requests if no bytes were written before a network failure - and the request has no body. -
      • - -
      • - The - new Transport.ProxyConnectHeader - allows configuration of header values to send to a proxy - during a CONNECT request. -
      • - -
      • - The DefaultTransport.Dialer - now enables DualStack ("Happy Eyeballs") support, - allowing the use of IPv4 as a backup if it looks like IPv6 might be - failing. -
      • - -
      • - The Transport - no longer reads a byte of a non-nil - Request.Body - when the - Request.ContentLength - is zero to determine whether the ContentLength - is actually zero or just undefined. - To explicitly signal that a body has zero length, - either set it to nil, or set it to the new value - NoBody. - The new NoBody value is intended for use by Request - constructor functions; it is used by - NewRequest. -
      • -
      - -
      -
      - -
      net/http/httptrace
      -
      -

      - There is now support for tracing a client request's TLS handshakes with - the new - ClientTrace.TLSHandshakeStart - and - ClientTrace.TLSHandshakeDone. -

      -
      -
      - -
      net/http/httputil
      -
      -

      - The ReverseProxy - has a new optional hook, - ModifyResponse, - for modifying the response from the back end before proxying it to the client. -

      - -
      -
      - -
      net/mail
      -
      - -

      - Empty quoted strings are once again allowed in the name part of - an address. That is, Go 1.4 and earlier accepted - "" <gopher@example.com>, - but Go 1.5 introduced a bug that rejected this address. - The address is recognized again. -

      - -

      - The - Header.Date - method has always provided a way to parse - the Date: header. - A new function - ParseDate - allows parsing dates found in other - header lines, such as the Resent-Date: header. -

      - -
      -
      - -
      net/smtp
      -
      - -

      - If an implementation of the - Auth.Start - method returns an empty toServer value, - the package no longer sends - trailing whitespace in the SMTP AUTH command, - which some servers rejected. -

      - -
      -
      - -
      net/url
      -
      - -

      - The new functions - PathEscape - and - PathUnescape - are similar to the query escaping and unescaping functions but - for path elements. -

      - -

      - The new methods - URL.Hostname - and - URL.Port - return the hostname and port fields of a URL, - correctly handling the case where the port may not be present. -

      - -

      - The existing method - URL.ResolveReference - now properly handles paths with escaped bytes without losing - the escaping. -

      - -

      - The URL type now implements - encoding.BinaryMarshaler and - encoding.BinaryUnmarshaler, - making it possible to process URLs in gob data. -

      - -

      - Following RFC 3986, - Parse - now rejects URLs like this_that:other/thing instead of - interpreting them as relative paths (this_that is not a valid scheme). - To force interpretation as a relative path, - such URLs should be prefixed with “./”. - The URL.String method now inserts this prefix as needed. -

      - -
      -
      - -
      os
      -
      -

      - The new function - Executable returns - the path name of the running executable. -

      - -

      - An attempt to call a method on - an os.File that has - already been closed will now return the new error - value os.ErrClosed. - Previously it returned a system-specific error such - as syscall.EBADF. -

      - -

      - On Unix systems, os.Rename - will now return an error when used to rename a directory to an - existing empty directory. - Previously it would fail when renaming to a non-empty directory - but succeed when renaming to an empty directory. - This makes the behavior on Unix correspond to that of other systems. -

      - -

      - On Windows, long absolute paths are now transparently converted to - extended-length paths (paths that start with “\\?\”). - This permits the package to work with files whose path names are - longer than 260 characters. -

      - -

      - On Windows, os.IsExist - will now return true for the system - error ERROR_DIR_NOT_EMPTY. - This roughly corresponds to the existing handling of the Unix - error ENOTEMPTY. -

      - -

      - On Plan 9, files that are not served by #M will now - have ModeDevice set in - the value returned - by FileInfo.Mode. -

      -
      -
      - -
      path/filepath
      -
      -

      - A number of bugs and corner cases on Windows were fixed: - Abs now calls Clean as documented, - Glob now matches - “\\?\c:\*”, - EvalSymlinks now - correctly handles “C:.”, and - Clean now properly - handles a leading “..” in the path. -

      -
      -
      - -
      reflect
      -
      -

      - The new function - Swapper was - added to support sort.Slice. -

      -
      -
      - -
      strconv
      -
      -

      - The Unquote - function now strips carriage returns (\r) in - backquoted raw strings, following the - Go language semantics. -

      -
      -
      - -
      syscall
      -
      -

      - The Getpagesize - now returns the system's size, rather than a constant value. - Previously it always returned 4KB. -

      - -

      - The signature - of Utimes has - changed on Solaris to match all the other Unix systems' - signature. Portable code should continue to use - os.Chtimes instead. -

      - -

      - The X__cmsg_data field has been removed from - Cmsghdr. -

      -
      -
      - -
      text/template
      -
      -

      - Template.Execute - can now take a - reflect.Value as its data - argument, and - FuncMap - functions can also accept and return reflect.Value. -

      - -
      -
      - -
      time
      -
      - -

      The new function - Until complements - the analogous Since function. -

      - -

      - ParseDuration - now accepts long fractional parts. -

      - -

      - Parse - now rejects dates before the start of a month, such as June 0; - it already rejected dates beyond the end of the month, such as - June 31 and July 32. -

      - -

      - The tzdata database has been updated to version - 2016j for systems that don't already have a local time zone - database. -

      - -

      -

      -
      - -
      testing
      -
      -

      - The new method - T.Name - (and B.Name) returns the name of the current - test or benchmark. -

      - -

      - The new function - CoverMode - reports the test coverage mode. -

      - -

      - Tests and benchmarks are now marked as failed if the race - detector is enabled and a data race occurs during execution. - Previously, individual test cases would appear to pass, - and only the overall execution of the test binary would fail. -

      - -

      - The signature of the - MainStart - function has changed, as allowed by the documentation. It is an - internal detail and not part of the Go 1 compatibility promise. - If you're not calling MainStart directly but see - errors, that likely means you set the - normally-empty GOROOT environment variable and it - doesn't match the version of your go command's binary. -

      - -
      -
      - -
      unicode
      -
      -

      - SimpleFold - now returns its argument unchanged if the provided input was an invalid rune. - Previously, the implementation failed with an index bounds check panic. -

      -
      -
      diff --git a/doc/go1.9.html b/doc/go1.9.html deleted file mode 100644 index 86ee257d03..0000000000 --- a/doc/go1.9.html +++ /dev/null @@ -1,1024 +0,0 @@ - - - - - - -

      Introduction to Go 1.9

      - -

      - The latest Go release, version 1.9, arrives six months - after Go 1.8 and is the tenth release in - the Go 1.x - series. - There are two changes to the language: - adding support for type aliases and defining when implementations - may fuse floating point operations. - Most of the changes are in the implementation of the toolchain, - runtime, and libraries. - As always, the release maintains the Go 1 - promise of compatibility. - We expect almost all Go programs to continue to compile and run as - before. -

      - -

      - The release - adds transparent monotonic time support, - parallelizes compilation of functions within a package, - better supports test helper functions, - includes a new bit manipulation package, - and has a new concurrent map type. -

      - -

      Changes to the language

      - -

      - There are two changes to the language. -

      -

      - Go now supports type aliases to support gradual code repair while - moving a type between packages. - The type alias - design document - and an - article on refactoring cover the problem in detail. - In short, a type alias declaration has the form: -

      - -
      -type T1 = T2
      -
      - -

      - This declaration introduces an alias name T1—an - alternate spelling—for the type denoted by T2; that is, - both T1 and T2 denote the same type. -

      - -

      - A smaller language change is that the - language specification - now states when implementations are allowed to fuse floating - point operations together, such as by using an architecture's "fused - multiply and add" (FMA) instruction to compute x*y + z - without rounding the intermediate result x*y. - To force the intermediate rounding, write float64(x*y) + z. -

      - -

      Ports

      - -

      - There are no new supported operating systems or processor - architectures in this release. -

      - -

      ppc64x requires POWER8

      - -

      - Both GOARCH=ppc64 and GOARCH=ppc64le now - require at least POWER8 support. In previous releases, - only GOARCH=ppc64le required POWER8 and the big - endian ppc64 architecture supported older - hardware. -

      - -

      FreeBSD

      - -

      - Go 1.9 is the last release that will run on FreeBSD 9.3, - which is already - unsupported by FreeBSD. - Go 1.10 will require FreeBSD 10.3+. -

      - -

      OpenBSD 6.0

      - -

      - Go 1.9 now enables PT_TLS generation for cgo binaries and thus - requires OpenBSD 6.0 or newer. Go 1.9 no longer supports - OpenBSD 5.9. -

      - -

      Known Issues

      - -

      - There are some instabilities on FreeBSD that are known but not understood. - These can lead to program crashes in rare cases. - See issue 15658. - Any help in solving this FreeBSD-specific issue would be appreciated. -

      - -

      - Go stopped running NetBSD builders during the Go 1.9 development - cycle due to NetBSD kernel crashes, up to and including NetBSD 7.1. - As Go 1.9 is being released, NetBSD 7.1.1 is being released with a fix. - However, at this time we have no NetBSD builders passing our test suite. - Any help investigating the - various NetBSD issues - would be appreciated. -

      - -

      Tools

      - -

      Parallel Compilation

      - -

      - The Go compiler now supports compiling a package's functions in parallel, taking - advantage of multiple cores. This is in addition to the go command's - existing support for parallel compilation of separate packages. - Parallel compilation is on by default, but it can be disabled by setting the - environment variable GO19CONCURRENTCOMPILATION to 0. -

      - -

      Vendor matching with ./...

      - -

      - By popular request, ./... no longer matches packages - in vendor directories in tools accepting package names, - such as go test. To match vendor - directories, write ./vendor/.... -

      - -

      Moved GOROOT

      - -

      - The go tool will now use the path from which it - was invoked to attempt to locate the root of the Go install tree. - This means that if the entire Go installation is moved to a new - location, the go tool should continue to work as usual. - This may be overridden by setting GOROOT in the environment, - which should only be done in unusual circumstances. - Note that this does not affect the result of - the runtime.GOROOT function, which - will continue to report the original installation location; - this may be fixed in later releases. -

      - -

      Compiler Toolchain

      - -

      - Complex division is now C99-compatible. This has always been the - case in gccgo and is now fixed in the gc toolchain. -

      - -

      - The linker will now generate DWARF information for cgo executables on Windows. -

      - -

      - The compiler now includes lexical scopes in the generated DWARF if the - -N -l flags are provided, allowing - debuggers to hide variables that are not in scope. The .debug_info - section is now DWARF version 4. -

      - -

      - The values of GOARM and GO386 now affect a - compiled package's build ID, as used by the go tool's - dependency caching. -

      - -

      Assembler

      - -

      - The four-operand ARM MULA instruction is now assembled correctly, - with the addend register as the third argument and the result - register as the fourth and final argument. - In previous releases, the two meanings were reversed. - The three-operand form, in which the fourth argument is implicitly - the same as the third, is unaffected. - Code using four-operand MULA instructions - will need to be updated, but we believe this form is very rarely used. - MULAWT and MULAWB were already - using the correct order in all forms and are unchanged. -

      - -

      - The assembler now supports ADDSUBPS/PD, completing the - two missing x86 SSE3 instructions. -

      - -

      Doc

      - -

      - Long lists of arguments are now truncated. This improves the readability - of go doc on some generated code. -

      - -

      - Viewing documentation on struct fields is now supported. - For example, go doc http.Client.Jar. -

      - -

      Env

      - -

      - The new go env -json flag - enables JSON output, instead of the default OS-specific output - format. -

      - -

      Test

      - -

      - The go test - command accepts a new -list flag, which takes a regular - expression as an argument and prints to stdout the name of any - tests, benchmarks, or examples that match it, without running them. -

      - - -

      Pprof

      - -

      - Profiles produced by the runtime/pprof package now - include symbol information, so they can be viewed - in go tool pprof - without the binary that produced the profile. -

      - -

      - The go tool pprof command now - uses the HTTP proxy information defined in the environment, using - http.ProxyFromEnvironment. -

      - -

      Vet

      - - -

      - The vet command - has been better integrated into the - go tool, - so go vet now supports all standard build - flags while vet's own flags are now available - from go vet as well as - from go tool vet. -

      - -

      Gccgo

      - -

      -Due to the alignment of Go's semiannual release schedule with GCC's -annual release schedule, -GCC release 7 contains the Go 1.8.3 version of gccgo. -We expect that the next release, GCC 8, will contain the Go 1.10 -version of gccgo. -

      - -

      Runtime

      - -

      Call stacks with inlined frames

      - -

      - Users of - runtime.Callers - should avoid directly inspecting the resulting PC slice and instead use - runtime.CallersFrames - to get a complete view of the call stack, or - runtime.Caller - to get information about a single caller. - This is because an individual element of the PC slice cannot account - for inlined frames or other nuances of the call stack. -

      - -

      - Specifically, code that directly iterates over the PC slice and uses - functions such as - runtime.FuncForPC - to resolve each PC individually will miss inlined frames. - To get a complete view of the stack, such code should instead use - CallersFrames. - Likewise, code should not assume that the length returned by - Callers is any indication of the call depth. - It should instead count the number of frames returned by - CallersFrames. -

      - -

      - Code that queries a single caller at a specific depth should use - Caller rather than passing a slice of length 1 to - Callers. -

      - -

      - runtime.CallersFrames - has been available since Go 1.7, so code can be updated prior to - upgrading to Go 1.9. -

      - -

      Performance

      - -

      - As always, the changes are so general and varied that precise - statements about performance are difficult to make. Most programs - should run a bit faster, due to speedups in the garbage collector, - better generated code, and optimizations in the core library. -

      - -

      Garbage Collector

      - -

      - Library functions that used to trigger stop-the-world garbage - collection now trigger concurrent garbage collection. - - Specifically, runtime.GC, - debug.SetGCPercent, - and - debug.FreeOSMemory, - now trigger concurrent garbage collection, blocking only the calling - goroutine until the garbage collection is done. -

      - -

      - The - debug.SetGCPercent - function only triggers a garbage collection if one is immediately - necessary because of the new GOGC value. - This makes it possible to adjust GOGC on-the-fly. -

      - -

      - Large object allocation performance is significantly improved in - applications using large (>50GB) heaps containing many large - objects. -

      - -

      - The runtime.ReadMemStats - function now takes less than 100µs even for very large heaps. -

      - -

      Core library

      - -

      Transparent Monotonic Time support

      - -

      - The time package now transparently - tracks monotonic time in each Time - value, making computing durations between two Time values - a safe operation in the presence of wall clock adjustments. - See the package docs and - design document - for details. -

      - -

      New bit manipulation package

      - -

      - Go 1.9 includes a new package, - math/bits, with optimized - implementations for manipulating bits. On most architectures, - functions in this package are additionally recognized by the - compiler and treated as intrinsics for additional performance. -

      - -

      Test Helper Functions

      - -

      - The - new (*T).Helper - and (*B).Helper - methods mark the calling function as a test helper function. When - printing file and line information, that function will be skipped. - This permits writing test helper functions while still having useful - line numbers for users. -

      - -

      Concurrent Map

      - -

      - The new Map type - in the sync package - is a concurrent map with amortized-constant-time loads, stores, and - deletes. It is safe for multiple goroutines to call a Map's methods - concurrently. -

      - -

      Profiler Labels

      - -

      - The runtime/pprof package - now supports adding labels to pprof profiler records. - Labels form a key-value map that is used to distinguish calls of the - same function in different contexts when looking at profiles - with the pprof command. - The pprof package's - new Do function - runs code associated with some provided labels. Other new functions - in the package help work with labels. -

      - -
    - - -

    Minor changes to the library

    - -

    - As always, there are various minor changes and updates to the library, - made with the Go 1 promise of compatibility - in mind. -

    - -
    archive/zip
    -
    -

    - The - ZIP Writer - now sets the UTF-8 bit in - the FileHeader.Flags - when appropriate. -

    - -
    - -
    crypto/rand
    -
    -

    - On Linux, Go now calls the getrandom system call - without the GRND_NONBLOCK flag; it will now block - until the kernel has sufficient randomness. On kernels predating - the getrandom system call, Go continues to read - from /dev/urandom. -

    - -
    - -
    crypto/x509
    -
    -

    - - On Unix systems the environment - variables SSL_CERT_FILE - and SSL_CERT_DIR can now be used to override the - system default locations for the SSL certificate file and SSL - certificate files directory, respectively. -

    - -

    The FreeBSD file /usr/local/etc/ssl/cert.pem is - now included in the certificate search path. -

    - -

    - - The package now supports excluded domains in name constraints. - In addition to enforcing such constraints, - CreateCertificate - will create certificates with excluded name constraints - if the provided template certificate has the new - field - ExcludedDNSDomains - populated. -

    - -

    - - If any SAN extension, including with no DNS names, is present - in the certificate, then the Common Name from - Subject is ignored. - In previous releases, the code tested only whether DNS-name SANs were - present in a certificate. -

    - -
    - -
    database/sql
    -
    -

    - The package will now use a cached Stmt if - available in Tx.Stmt. - This prevents statements from being re-prepared each time - Tx.Stmt is called. -

    - -

    - The package now allows drivers to implement their own argument checkers by implementing - driver.NamedValueChecker. - This also allows drivers to support OUTPUT and INOUT parameter types. - Out should be used to return output parameters - when supported by the driver. -

    - -

    - Rows.Scan can now scan user-defined string types. - Previously the package supported scanning into numeric types like type Int int64. It now also supports - scanning into string types like type String string. -

    - -

    - The new DB.Conn method returns the new - Conn type representing an - exclusive connection to the database from the connection pool. All queries run on - a Conn will use the same underlying - connection until Conn.Close is called - to return the connection to the connection pool. -

    - -
    - -
    encoding/asn1
    -
    -

    - The new - NullBytes - and - NullRawValue - represent the ASN.1 NULL type. -

    - -
    - -
    encoding/base32
    -
    -

    - The new Encoding.WithPadding - method adds support for custom padding characters and disabling padding. -

    - -
    - -
    encoding/csv
    -
    -

    - The new field - Reader.ReuseRecord - controls whether calls to - Read - may return a slice sharing the backing array of the previous - call's returned slice for improved performance. -

    - -
    - -
    fmt
    -
    -

    - The sharp flag ('#') is now supported when printing - floating point and complex numbers. It will always print a - decimal point - for %e, %E, %f, %F, %g - and %G; it will not remove trailing zeros - for %g and %G. -

    - -
    - -
    hash/fnv
    -
    -

    - The package now includes 128-bit FNV-1 and FNV-1a hash support with - New128 and - New128a, respectively. -

    - -
    - -
    html/template
    -
    -

    - The package now reports an error if a predefined escaper (one of - "html", "urlquery" and "js") is found in a pipeline and does not match - what the auto-escaper would have decided on its own. - This avoids certain security or correctness issues. - Now use of one of these escapers is always either a no-op or an error. - (The no-op case eases migration from text/template.) -

    - -
    - -
    image
    -
    -

    - The Rectangle.Intersect - method now returns a zero Rectangle when called on - adjacent but non-overlapping rectangles, as documented. In - earlier releases it would incorrectly return an empty but - non-zero Rectangle. -

    - -
    - -
    image/color
    -
    -

    - The YCbCr to RGBA conversion formula has been tweaked to ensure - that rounding adjustments span the complete [0, 0xffff] RGBA - range. -

    - -
    - -
    image/png
    -
    -

    - The new Encoder.BufferPool - field allows specifying an EncoderBufferPool, - that will be used by the encoder to get temporary EncoderBuffer - buffers when encoding a PNG image. - - The use of a BufferPool reduces the number of - memory allocations performed while encoding multiple images. -

    - -

    - The package now supports the decoding of transparent 8-bit - grayscale ("Gray8") images. -

    - -
    - -
    math/big
    -
    -

    - The new - IsInt64 - and - IsUint64 - methods report whether an Int - may be represented as an int64 or uint64 - value. -

    - -
    - -
    mime/multipart
    -
    -

    - The new - FileHeader.Size - field describes the size of a file in a multipart message. -

    - -
    - -
    net
    -
    -

    - The new - Resolver.StrictErrors - provides control over how Go's built-in DNS resolver handles - temporary errors during queries composed of multiple sub-queries, - such as an A+AAAA address lookup. -

    - -

    - The new - Resolver.Dial - allows a Resolver to use a custom dial function. -

    - -

    - JoinHostPort now only places an address in square brackets if the host contains a colon. - In previous releases it would also wrap addresses in square brackets if they contained a percent ('%') sign. -

    - -

    - The new methods - TCPConn.SyscallConn, - IPConn.SyscallConn, - UDPConn.SyscallConn, - and - UnixConn.SyscallConn - provide access to the connections' underlying file descriptors. -

    - -

    - It is now safe to call Dial with the address obtained from - (*TCPListener).String() after creating the listener with - Listen("tcp", ":0"). - Previously it failed on some machines with half-configured IPv6 stacks. -

    - -
    - -
    net/http
    -
    - -

    - The Cookie.String method, used for - Cookie and Set-Cookie headers, now encloses values in double quotes - if the value contains either a space or a comma. -

    - -

    Server changes:

    -
      -
    • - ServeMux now ignores ports in the host - header when matching handlers. The host is matched unmodified for CONNECT requests. -
    • - -
    • - The new Server.ServeTLS method wraps - Server.Serve with added TLS support. -
    • - -
    • - Server.WriteTimeout - now applies to HTTP/2 connections and is enforced per-stream. -
    • - -
    • - HTTP/2 now uses the priority write scheduler by default. - Frames are scheduled by following HTTP/2 priorities as described in - RFC 7540 Section 5.3. -
    • - -
    • - The HTTP handler returned by StripPrefix - now calls its provided handler with a modified clone of the original *http.Request. - Any code storing per-request state in maps keyed by *http.Request should - use - Request.Context, - Request.WithContext, - and - context.WithValue instead. -
    • - -
    • - LocalAddrContextKey now contains - the connection's actual network address instead of the interface address used by the listener. -
    • -
    - -

    Client & Transport changes:

    -
      -
    • - The Transport - now supports making requests via SOCKS5 proxy when the URL returned by - Transport.Proxy - has the scheme socks5. -
    • -
    - -
    - -
    net/http/fcgi
    -
    -

    - The new - ProcessEnv - function returns FastCGI environment variables associated with an HTTP request - for which there are no appropriate - http.Request - fields, such as REMOTE_USER. -

    - -
    - -
    net/http/httptest
    -
    -

    - The new - Server.Client - method returns an HTTP client configured for making requests to the test server. -

    - -

    - The new - Server.Certificate - method returns the test server's TLS certificate, if any. -

    - -
    - -
    net/http/httputil
    -
    -

    - The ReverseProxy - now proxies all HTTP/2 response trailers, even those not declared in the initial response - header. Such undeclared trailers are used by the gRPC protocol. -

    - -
    - -
    os
    -
    -

    - The os package now uses the internal runtime poller - for file I/O. - This reduces the number of threads required for read/write - operations on pipes, and it eliminates races when one goroutine - closes a file while another is using the file for I/O. -

    - -
    -

    - On Windows, - Args - is now populated without shell32.dll, improving process start-up time by 1-7 ms. -

    - -
    - -
    os/exec
    -
    -

    - The os/exec package now prevents child processes from being created with - any duplicate environment variables. - If Cmd.Env - contains duplicate environment keys, only the last - value in the slice for each duplicate key is used. -

    - -
    - -
    os/user
    -
    -

    - Lookup and - LookupId now - work on Unix systems when CGO_ENABLED=0 by reading - the /etc/passwd file. -

    - -

    - LookupGroup and - LookupGroupId now - work on Unix systems when CGO_ENABLED=0 by reading - the /etc/group file. -

    - -
    - -
    reflect
    -
    -

    - The new - MakeMapWithSize - function creates a map with a capacity hint. -

    - -
    - -
    runtime
    -
    -

    - Tracebacks generated by the runtime and recorded in profiles are - now accurate in the presence of inlining. - To retrieve tracebacks programmatically, applications should use - runtime.CallersFrames - rather than directly iterating over the results of - runtime.Callers. -

    - -

    - On Windows, Go no longer forces the system timer to run at high - resolution when the program is idle. - This should reduce the impact of Go programs on battery life. -

    - -

    - On FreeBSD, GOMAXPROCS and - runtime.NumCPU - are now based on the process' CPU mask, rather than the total - number of CPUs. -

    - -

    - The runtime has preliminary support for Android O. -

    - -
    - -
    runtime/debug
    -
    -

    - Calling - SetGCPercent - with a negative value no longer runs an immediate garbage collection. -

    - -
    - -
    runtime/trace
    -
    -

    - The execution trace now displays mark assist events, which - indicate when an application goroutine is forced to assist - garbage collection because it is allocating too quickly. -

    - -

    - "Sweep" events now encompass the entire process of finding free - space for an allocation, rather than recording each individual - span that is swept. - This reduces allocation latency when tracing allocation-heavy - programs. - The sweep event shows how many bytes were swept and how many - were reclaimed. -

    - -
    - -
    sync
    -
    -

    - Mutex is now more fair. -

    - -
    - -
    syscall
    -
    -

    - The new field - Credential.NoSetGroups - controls whether Unix systems make a setgroups system call - to set supplementary groups when starting a new process. -

    - -

    - The new field - SysProcAttr.AmbientCaps - allows setting ambient capabilities on Linux 4.3+ when creating - a new process. -

    - -

    - On 64-bit x86 Linux, process creation latency has been optimized with - use of CLONE_VFORK and CLONE_VM. -

    - -

    - The new - Conn - interface describes some types in the - net - package that can provide access to their underlying file descriptor - using the new - RawConn - interface. -

    - -
    - - -
    testing/quick
    -
    -

    - The package now chooses values in the full range when - generating int64 and uint64 random - numbers; in earlier releases generated values were always - limited to the [-262, 262) range. -

    - -

    - In previous releases, using a nil - Config.Rand - value caused a fixed deterministic random number generator to be used. - It now uses a random number generator seeded with the current time. - For the old behavior, set Config.Rand to rand.New(rand.NewSource(0)). -

    - -
    - -
    text/template
    -
    -

    - The handling of empty blocks, which was broken by a Go 1.8 - change that made the result dependent on the order of templates, - has been fixed, restoring the old Go 1.7 behavior. -

    - -
    - -
    time
    -
    -

    - The new methods - Duration.Round - and - Duration.Truncate - handle rounding and truncating durations to multiples of a given duration. -

    - -

    - Retrieving the time and sleeping now work correctly under Wine. -

    - -

    - If a Time value has a monotonic clock reading, its - string representation (as returned by String) now includes a - final field "m=±value", where value is the - monotonic clock reading formatted as a decimal number of seconds. -

    - -

    - The included tzdata timezone database has been - updated to version 2017b. As always, it is only used if the - system does not already have the database available. -

    - -
    diff --git a/doc/go1.html b/doc/go1.html deleted file mode 100644 index 939ee24df5..0000000000 --- a/doc/go1.html +++ /dev/null @@ -1,2038 +0,0 @@ - - -

    Introduction to Go 1

    - -

    -Go version 1, Go 1 for short, defines a language and a set of core libraries -that provide a stable foundation for creating reliable products, projects, and -publications. -

    - -

    -The driving motivation for Go 1 is stability for its users. People should be able to -write Go programs and expect that they will continue to compile and run without -change, on a time scale of years, including in production environments such as -Google App Engine. Similarly, people should be able to write books about Go, be -able to say which version of Go the book is describing, and have that version -number still be meaningful much later. -

    - -

    -Code that compiles in Go 1 should, with few exceptions, continue to compile and -run throughout the lifetime of that version, even as we issue updates and bug -fixes such as Go version 1.1, 1.2, and so on. Other than critical fixes, changes -made to the language and library for subsequent releases of Go 1 may -add functionality but will not break existing Go 1 programs. -The Go 1 compatibility document -explains the compatibility guidelines in more detail. -

    - -

    -Go 1 is a representation of Go as it used today, not a wholesale rethinking of -the language. We avoided designing new features and instead focused on cleaning -up problems and inconsistencies and improving portability. There are a number -changes to the Go language and packages that we had considered for some time and -prototyped but not released primarily because they are significant and -backwards-incompatible. Go 1 was an opportunity to get them out, which is -helpful for the long term, but also means that Go 1 introduces incompatibilities -for old programs. Fortunately, the go fix tool can -automate much of the work needed to bring programs up to the Go 1 standard. -

    - -

    -This document outlines the major changes in Go 1 that will affect programmers -updating existing code; its reference point is the prior release, r60 (tagged as -r60.3). It also explains how to update code from r60 to run under Go 1. -

    - -

    Changes to the language

    - -

    Append

    - -

    -The append predeclared variadic function makes it easy to grow a slice -by adding elements to the end. -A common use is to add bytes to the end of a byte slice when generating output. -However, append did not provide a way to append a string to a []byte, -which is another common case. -

    - -{{code "/doc/progs/go1.go" `/greeting := ..byte/` `/append.*hello/`}} - -

    -By analogy with the similar property of copy, Go 1 -permits a string to be appended (byte-wise) directly to a byte -slice, reducing the friction between strings and byte slices. -The conversion is no longer necessary: -

    - -{{code "/doc/progs/go1.go" `/append.*world/`}} - -

    -Updating: -This is a new feature, so existing code needs no changes. -

    - -

    Close

    - -

    -The close predeclared function provides a mechanism -for a sender to signal that no more values will be sent. -It is important to the implementation of for range -loops over channels and is helpful in other situations. -Partly by design and partly because of race conditions that can occur otherwise, -it is intended for use only by the goroutine sending on the channel, -not by the goroutine receiving data. -However, before Go 1 there was no compile-time checking that close -was being used correctly. -

    - -

    -To close this gap, at least in part, Go 1 disallows close on receive-only channels. -Attempting to close such a channel is a compile-time error. -

    - -
    -    var c chan int
    -    var csend chan<- int = c
    -    var crecv <-chan int = c
    -    close(c)     // legal
    -    close(csend) // legal
    -    close(crecv) // illegal
    -
    - -

    -Updating: -Existing code that attempts to close a receive-only channel was -erroneous even before Go 1 and should be fixed. The compiler will -now reject such code. -

    - -

    Composite literals

    - -

    -In Go 1, a composite literal of array, slice, or map type can elide the -type specification for the elements' initializers if they are of pointer type. -All four of the initializations in this example are legal; the last one was illegal before Go 1. -

    - -{{code "/doc/progs/go1.go" `/type Date struct/` `/STOP/`}} - -

    -Updating: -This change has no effect on existing code, but the command -gofmt -s applied to existing source -will, among other things, elide explicit element types wherever permitted. -

    - - -

    Goroutines during init

    - -

    -The old language defined that go statements executed during initialization created goroutines but that they did not begin to run until initialization of the entire program was complete. -This introduced clumsiness in many places and, in effect, limited the utility -of the init construct: -if it was possible for another package to use the library during initialization, the library -was forced to avoid goroutines. -This design was done for reasons of simplicity and safety but, -as our confidence in the language grew, it seemed unnecessary. -Running goroutines during initialization is no more complex or unsafe than running them during normal execution. -

    - -

    -In Go 1, code that uses goroutines can be called from -init routines and global initialization expressions -without introducing a deadlock. -

    - -{{code "/doc/progs/go1.go" `/PackageGlobal/` `/^}/`}} - -

    -Updating: -This is a new feature, so existing code needs no changes, -although it's possible that code that depends on goroutines not starting before main will break. -There was no such code in the standard repository. -

    - -

    The rune type

    - -

    -The language spec allows the int type to be 32 or 64 bits wide, but current implementations set int to 32 bits even on 64-bit platforms. -It would be preferable to have int be 64 bits on 64-bit platforms. -(There are important consequences for indexing large slices.) -However, this change would waste space when processing Unicode characters with -the old language because the int type was also used to hold Unicode code points: each code point would waste an extra 32 bits of storage if int grew from 32 bits to 64. -

    - -

    -To make changing to 64-bit int feasible, -Go 1 introduces a new basic type, rune, to represent -individual Unicode code points. -It is an alias for int32, analogous to byte -as an alias for uint8. -

    - -

    -Character literals such as 'a', '語', and '\u0345' -now have default type rune, -analogous to 1.0 having default type float64. -A variable initialized to a character constant will therefore -have type rune unless otherwise specified. -

    - -

    -Libraries have been updated to use rune rather than int -when appropriate. For instance, the functions unicode.ToLower and -relatives now take and return a rune. -

    - -{{code "/doc/progs/go1.go" `/STARTRUNE/` `/ENDRUNE/`}} - -

    -Updating: -Most source code will be unaffected by this because the type inference from -:= initializers introduces the new type silently, and it propagates -from there. -Some code may get type errors that a trivial conversion will resolve. -

    - -

    The error type

    - -

    -Go 1 introduces a new built-in type, error, which has the following definition: -

    - -
    -    type error interface {
    -        Error() string
    -    }
    -
    - -

    -Since the consequences of this type are all in the package library, -it is discussed below. -

    - -

    Deleting from maps

    - -

    -In the old language, to delete the entry with key k from map m, one wrote the statement, -

    - -
    -    m[k] = value, false
    -
    - -

    -This syntax was a peculiar special case, the only two-to-one assignment. -It required passing a value (usually ignored) that is evaluated but discarded, -plus a boolean that was nearly always the constant false. -It did the job but was odd and a point of contention. -

    - -

    -In Go 1, that syntax has gone; instead there is a new built-in -function, delete. The call -

    - -{{code "/doc/progs/go1.go" `/delete\(m, k\)/`}} - -

    -will delete the map entry retrieved by the expression m[k]. -There is no return value. Deleting a non-existent entry is a no-op. -

    - -

    -Updating: -Running go fix will convert expressions of the form m[k] = value, -false into delete(m, k) when it is clear that -the ignored value can be safely discarded from the program and -false refers to the predefined boolean constant. -The fix tool -will flag other uses of the syntax for inspection by the programmer. -

    - -

    Iterating in maps

    - -

    -The old language specification did not define the order of iteration for maps, -and in practice it differed across hardware platforms. -This caused tests that iterated over maps to be fragile and non-portable, with the -unpleasant property that a test might always pass on one machine but break on another. -

    - -

    -In Go 1, the order in which elements are visited when iterating -over a map using a for range statement -is defined to be unpredictable, even if the same loop is run multiple -times with the same map. -Code should not assume that the elements are visited in any particular order. -

    - -

    -This change means that code that depends on iteration order is very likely to break early and be fixed long before it becomes a problem. -Just as important, it allows the map implementation to ensure better map balancing even when programs are using range loops to select an element from a map. -

    - -{{code "/doc/progs/go1.go" `/Sunday/` `/^ }/`}} - -

    -Updating: -This is one change where tools cannot help. Most existing code -will be unaffected, but some programs may break or misbehave; we -recommend manual checking of all range statements over maps to -verify they do not depend on iteration order. There were a few such -examples in the standard repository; they have been fixed. -Note that it was already incorrect to depend on the iteration order, which -was unspecified. This change codifies the unpredictability. -

    - -

    Multiple assignment

    - -

    -The language specification has long guaranteed that in assignments -the right-hand-side expressions are all evaluated before any left-hand-side expressions are assigned. -To guarantee predictable behavior, -Go 1 refines the specification further. -

    - -

    -If the left-hand side of the assignment -statement contains expressions that require evaluation, such as -function calls or array indexing operations, these will all be done -using the usual left-to-right rule before any variables are assigned -their value. Once everything is evaluated, the actual assignments -proceed in left-to-right order. -

    - -

    -These examples illustrate the behavior. -

    - -{{code "/doc/progs/go1.go" `/sa :=/` `/then sc.0. = 2/`}} - -

    -Updating: -This is one change where tools cannot help, but breakage is unlikely. -No code in the standard repository was broken by this change, and code -that depended on the previous unspecified behavior was already incorrect. -

    - -

    Returns and shadowed variables

    - -

    -A common mistake is to use return (without arguments) after an assignment to a variable that has the same name as a result variable but is not the same variable. -This situation is called shadowing: the result variable has been shadowed by another variable with the same name declared in an inner scope. -

    - -

    -In functions with named return values, -the Go 1 compilers disallow return statements without arguments if any of the named return values is shadowed at the point of the return statement. -(It isn't part of the specification, because this is one area we are still exploring; -the situation is analogous to the compilers rejecting functions that do not end with an explicit return statement.) -

    - -

    -This function implicitly returns a shadowed return value and will be rejected by the compiler: -

    - -
    -    func Bug() (i, j, k int) {
    -        for i = 0; i < 5; i++ {
    -            for j := 0; j < 5; j++ { // Redeclares j.
    -                k += i*j
    -                if k > 100 {
    -                    return // Rejected: j is shadowed here.
    -                }
    -            }
    -        }
    -        return // OK: j is not shadowed here.
    -    }
    -
    - -

    -Updating: -Code that shadows return values in this way will be rejected by the compiler and will need to be fixed by hand. -The few cases that arose in the standard repository were mostly bugs. -

    - -

    Copying structs with unexported fields

    - -

    -The old language did not allow a package to make a copy of a struct value containing unexported fields belonging to a different package. -There was, however, a required exception for a method receiver; -also, the implementations of copy and append have never honored the restriction. -

    - -

    -Go 1 will allow packages to copy struct values containing unexported fields from other packages. -Besides resolving the inconsistency, -this change admits a new kind of API: a package can return an opaque value without resorting to a pointer or interface. -The new implementations of time.Time and -reflect.Value are examples of types taking advantage of this new property. -

    - -

    -As an example, if package p includes the definitions, -

    - -
    -    type Struct struct {
    -        Public int
    -        secret int
    -    }
    -    func NewStruct(a int) Struct {  // Note: not a pointer.
    -        return Struct{a, f(a)}
    -    }
    -    func (s Struct) String() string {
    -        return fmt.Sprintf("{%d (secret %d)}", s.Public, s.secret)
    -    }
    -
    - -

    -a package that imports p can assign and copy values of type -p.Struct at will. -Behind the scenes the unexported fields will be assigned and copied just -as if they were exported, -but the client code will never be aware of them. The code -

    - -
    -    import "p"
    -
    -    myStruct := p.NewStruct(23)
    -    copyOfMyStruct := myStruct
    -    fmt.Println(myStruct, copyOfMyStruct)
    -
    - -

    -will show that the secret field of the struct has been copied to the new value. -

    - -

    -Updating: -This is a new feature, so existing code needs no changes. -

    - -

    Equality

    - -

    -Before Go 1, the language did not define equality on struct and array values. -This meant, -among other things, that structs and arrays could not be used as map keys. -On the other hand, Go did define equality on function and map values. -Function equality was problematic in the presence of closures -(when are two closures equal?) -while map equality compared pointers, not the maps' content, which was usually -not what the user would want. -

    - -

    -Go 1 addressed these issues. -First, structs and arrays can be compared for equality and inequality -(== and !=), -and therefore be used as map keys, -provided they are composed from elements for which equality is also defined, -using element-wise comparison. -

    - -{{code "/doc/progs/go1.go" `/type Day struct/` `/Printf/`}} - -

    -Second, Go 1 removes the definition of equality for function values, -except for comparison with nil. -Finally, map equality is gone too, also except for comparison with nil. -

    - -

    -Note that equality is still undefined for slices, for which the -calculation is in general infeasible. Also note that the ordered -comparison operators (< <= -> >=) are still undefined for -structs and arrays. - -

    -Updating: -Struct and array equality is a new feature, so existing code needs no changes. -Existing code that depends on function or map equality will be -rejected by the compiler and will need to be fixed by hand. -Few programs will be affected, but the fix may require some -redesign. -

    - -

    The package hierarchy

    - -

    -Go 1 addresses many deficiencies in the old standard library and -cleans up a number of packages, making them more internally consistent -and portable. -

    - -

    -This section describes how the packages have been rearranged in Go 1. -Some have moved, some have been renamed, some have been deleted. -New packages are described in later sections. -

    - -

    The package hierarchy

    - -

    -Go 1 has a rearranged package hierarchy that groups related items -into subdirectories. For instance, utf8 and -utf16 now occupy subdirectories of unicode. -Also, some packages have moved into -subrepositories of -code.google.com/p/go -while others have been deleted outright. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Old pathNew path

    asn1 encoding/asn1
    csv encoding/csv
    gob encoding/gob
    json encoding/json
    xml encoding/xml

    exp/template/html html/template

    big math/big
    cmath math/cmplx
    rand math/rand

    http net/http
    http/cgi net/http/cgi
    http/fcgi net/http/fcgi
    http/httptest net/http/httptest
    http/pprof net/http/pprof
    mail net/mail
    rpc net/rpc
    rpc/jsonrpc net/rpc/jsonrpc
    smtp net/smtp
    url net/url

    exec os/exec

    scanner text/scanner
    tabwriter text/tabwriter
    template text/template
    template/parse text/template/parse

    utf8 unicode/utf8
    utf16 unicode/utf16
    - -

    -Note that the package names for the old cmath and -exp/template/html packages have changed to cmplx -and template. -

    - -

    -Updating: -Running go fix will update all imports and package renames for packages that -remain inside the standard repository. Programs that import packages -that are no longer in the standard repository will need to be edited -by hand. -

    - -

    The package tree exp

    - -

    -Because they are not standardized, the packages under the exp directory will not be available in the -standard Go 1 release distributions, although they will be available in source code form -in the repository for -developers who wish to use them. -

    - -

    -Several packages have moved under exp at the time of Go 1's release: -

    - -
      -
    • ebnf
    • -
    • html
    • -
    • go/types
    • -
    - -

    -(The EscapeString and UnescapeString types remain -in package html.) -

    - -

    -All these packages are available under the same names, with the prefix exp/: exp/ebnf etc. -

    - -

    -Also, the utf8.String type has been moved to its own package, exp/utf8string. -

    - -

    -Finally, the gotype command now resides in exp/gotype, while -ebnflint is now in exp/ebnflint. -If they are installed, they now reside in $GOROOT/bin/tool. -

    - -

    -Updating: -Code that uses packages in exp will need to be updated by hand, -or else compiled from an installation that has exp available. -The go fix tool or the compiler will complain about such uses. -

    - -

    The package tree old

    - -

    -Because they are deprecated, the packages under the old directory will not be available in the -standard Go 1 release distributions, although they will be available in source code form for -developers who wish to use them. -

    - -

    -The packages in their new locations are: -

    - -
      -
    • old/netchan
    • -
    - -

    -Updating: -Code that uses packages now in old will need to be updated by hand, -or else compiled from an installation that has old available. -The go fix tool will warn about such uses. -

    - -

    Deleted packages

    - -

    -Go 1 deletes several packages outright: -

    - -
      -
    • container/vector
    • -
    • exp/datafmt
    • -
    • go/typechecker
    • -
    • old/regexp
    • -
    • old/template
    • -
    • try
    • -
    - -

    -and also the command gotry. -

    - -

    -Updating: -Code that uses container/vector should be updated to use -slices directly. See -the Go -Language Community Wiki for some suggestions. -Code that uses the other packages (there should be almost zero) will need to be rethought. -

    - -

    Packages moving to subrepositories

    - -

    -Go 1 has moved a number of packages into other repositories, usually sub-repositories of -the main Go repository. -This table lists the old and new import paths: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OldNew

    crypto/bcrypt code.google.com/p/go.crypto/bcrypt
    crypto/blowfish code.google.com/p/go.crypto/blowfish
    crypto/cast5 code.google.com/p/go.crypto/cast5
    crypto/md4 code.google.com/p/go.crypto/md4
    crypto/ocsp code.google.com/p/go.crypto/ocsp
    crypto/openpgp code.google.com/p/go.crypto/openpgp
    crypto/openpgp/armor code.google.com/p/go.crypto/openpgp/armor
    crypto/openpgp/elgamal code.google.com/p/go.crypto/openpgp/elgamal
    crypto/openpgp/errors code.google.com/p/go.crypto/openpgp/errors
    crypto/openpgp/packet code.google.com/p/go.crypto/openpgp/packet
    crypto/openpgp/s2k code.google.com/p/go.crypto/openpgp/s2k
    crypto/ripemd160 code.google.com/p/go.crypto/ripemd160
    crypto/twofish code.google.com/p/go.crypto/twofish
    crypto/xtea code.google.com/p/go.crypto/xtea
    exp/ssh code.google.com/p/go.crypto/ssh

    image/bmp code.google.com/p/go.image/bmp
    image/tiff code.google.com/p/go.image/tiff

    net/dict code.google.com/p/go.net/dict
    net/websocket code.google.com/p/go.net/websocket
    exp/spdy code.google.com/p/go.net/spdy

    encoding/git85 code.google.com/p/go.codereview/git85
    patch code.google.com/p/go.codereview/patch

    exp/wingui code.google.com/p/gowingui
    - -

    -Updating: -Running go fix will update imports of these packages to use the new import paths. -Installations that depend on these packages will need to install them using -a go get command. -

    - -

    Major changes to the library

    - -

    -This section describes significant changes to the core libraries, the ones that -affect the most programs. -

    - -

    The error type and errors package

    - -

    -The placement of os.Error in package os is mostly historical: errors first came up when implementing package os, and they seemed system-related at the time. -Since then it has become clear that errors are more fundamental than the operating system. For example, it would be nice to use Errors in packages that os depends on, like syscall. -Also, having Error in os introduces many dependencies on os that would otherwise not exist. -

    - -

    -Go 1 solves these problems by introducing a built-in error interface type and a separate errors package (analogous to bytes and strings) that contains utility functions. -It replaces os.NewError with -errors.New, -giving errors a more central place in the environment. -

    - -

    -So the widely-used String method does not cause accidental satisfaction -of the error interface, the error interface uses instead -the name Error for that method: -

    - -
    -    type error interface {
    -        Error() string
    -    }
    -
    - -

    -The fmt library automatically invokes Error, as it already -does for String, for easy printing of error values. -

    - -{{code "/doc/progs/go1.go" `/START ERROR EXAMPLE/` `/END ERROR EXAMPLE/`}} - -

    -All standard packages have been updated to use the new interface; the old os.Error is gone. -

    - -

    -A new package, errors, contains the function -

    - -
    -func New(text string) error
    -
    - -

    -to turn a string into an error. It replaces the old os.NewError. -

    - -{{code "/doc/progs/go1.go" `/ErrSyntax/`}} - -

    -Updating: -Running go fix will update almost all code affected by the change. -Code that defines error types with a String method will need to be updated -by hand to rename the methods to Error. -

    - -

    System call errors

    - -

    -The old syscall package, which predated os.Error -(and just about everything else), -returned errors as int values. -In turn, the os package forwarded many of these errors, such -as EINVAL, but using a different set of errors on each platform. -This behavior was unpleasant and unportable. -

    - -

    -In Go 1, the -syscall -package instead returns an error for system call errors. -On Unix, the implementation is done by a -syscall.Errno type -that satisfies error and replaces the old os.Errno. -

    - -

    -The changes affecting os.EINVAL and relatives are -described elsewhere. - -

    -Updating: -Running go fix will update almost all code affected by the change. -Regardless, most code should use the os package -rather than syscall and so will be unaffected. -

    - -

    Time

    - -

    -Time is always a challenge to support well in a programming language. -The old Go time package had int64 units, no -real type safety, -and no distinction between absolute times and durations. -

    - -

    -One of the most sweeping changes in the Go 1 library is therefore a -complete redesign of the -time package. -Instead of an integer number of nanoseconds as an int64, -and a separate *time.Time type to deal with human -units such as hours and years, -there are now two fundamental types: -time.Time -(a value, so the * is gone), which represents a moment in time; -and time.Duration, -which represents an interval. -Both have nanosecond resolution. -A Time can represent any time into the ancient -past and remote future, while a Duration can -span plus or minus only about 290 years. -There are methods on these types, plus a number of helpful -predefined constant durations such as time.Second. -

    - -

    -Among the new methods are things like -Time.Add, -which adds a Duration to a Time, and -Time.Sub, -which subtracts two Times to yield a Duration. -

    - -

    -The most important semantic change is that the Unix epoch (Jan 1, 1970) is now -relevant only for those functions and methods that mention Unix: -time.Unix -and the Unix -and UnixNano methods -of the Time type. -In particular, -time.Now -returns a time.Time value rather than, in the old -API, an integer nanosecond count since the Unix epoch. -

    - -{{code "/doc/progs/go1.go" `/sleepUntil/` `/^}/`}} - -

    -The new types, methods, and constants have been propagated through -all the standard packages that use time, such as os and -its representation of file time stamps. -

    - -

    -Updating: -The go fix tool will update many uses of the old time package to use the new -types and methods, although it does not replace values such as 1e9 -representing nanoseconds per second. -Also, because of type changes in some of the values that arise, -some of the expressions rewritten by the fix tool may require -further hand editing; in such cases the rewrite will include -the correct function or method for the old functionality, but -may have the wrong type or require further analysis. -

    - -

    Minor changes to the library

    - -

    -This section describes smaller changes, such as those to less commonly -used packages or that affect -few programs beyond the need to run go fix. -This category includes packages that are new in Go 1. -Collectively they improve portability, regularize behavior, and -make the interfaces more modern and Go-like. -

    - -

    The archive/zip package

    - -

    -In Go 1, *zip.Writer no -longer has a Write method. Its presence was a mistake. -

    - -

    -Updating: -What little code is affected will be caught by the compiler and must be updated by hand. -

    - -

    The bufio package

    - -

    -In Go 1, bufio.NewReaderSize -and -bufio.NewWriterSize -functions no longer return an error for invalid sizes. -If the argument size is too small or invalid, it is adjusted. -

    - -

    -Updating: -Running go fix will update calls that assign the error to _. -Calls that aren't fixed will be caught by the compiler and must be updated by hand. -

    - -

    The compress/flate, compress/gzip and compress/zlib packages

    - -

    -In Go 1, the NewWriterXxx functions in -compress/flate, -compress/gzip and -compress/zlib -all return (*Writer, error) if they take a compression level, -and *Writer otherwise. Package gzip's -Compressor and Decompressor types have been renamed -to Writer and Reader. Package flate's -WrongValueError type has been removed. -

    - -

    -Updating -Running go fix will update old names and calls that assign the error to _. -Calls that aren't fixed will be caught by the compiler and must be updated by hand. -

    - -

    The crypto/aes and crypto/des packages

    - -

    -In Go 1, the Reset method has been removed. Go does not guarantee -that memory is not copied and therefore this method was misleading. -

    - -

    -The cipher-specific types *aes.Cipher, *des.Cipher, -and *des.TripleDESCipher have been removed in favor of -cipher.Block. -

    - -

    -Updating: -Remove the calls to Reset. Replace uses of the specific cipher types with -cipher.Block. -

    - -

    The crypto/elliptic package

    - -

    -In Go 1, elliptic.Curve -has been made an interface to permit alternative implementations. The curve -parameters have been moved to the -elliptic.CurveParams -structure. -

    - -

    -Updating: -Existing users of *elliptic.Curve will need to change to -simply elliptic.Curve. Calls to Marshal, -Unmarshal and GenerateKey are now functions -in crypto/elliptic that take an elliptic.Curve -as their first argument. -

    - -

    The crypto/hmac package

    - -

    -In Go 1, the hash-specific functions, such as hmac.NewMD5, have -been removed from crypto/hmac. Instead, hmac.New takes -a function that returns a hash.Hash, such as md5.New. -

    - -

    -Updating: -Running go fix will perform the needed changes. -

    - -

    The crypto/x509 package

    - -

    -In Go 1, the -CreateCertificate -function and -CreateCRL -method in crypto/x509 have been altered to take an -interface{} where they previously took a *rsa.PublicKey -or *rsa.PrivateKey. This will allow other public key algorithms -to be implemented in the future. -

    - -

    -Updating: -No changes will be needed. -

    - -

    The encoding/binary package

    - -

    -In Go 1, the binary.TotalSize function has been replaced by -Size, -which takes an interface{} argument rather than -a reflect.Value. -

    - -

    -Updating: -What little code is affected will be caught by the compiler and must be updated by hand. -

    - -

    The encoding/xml package

    - -

    -In Go 1, the xml package -has been brought closer in design to the other marshaling packages such -as encoding/gob. -

    - -

    -The old Parser type is renamed -Decoder and has a new -Decode method. An -Encoder type was also introduced. -

    - -

    -The functions Marshal -and Unmarshal -work with []byte values now. To work with streams, -use the new Encoder -and Decoder types. -

    - -

    -When marshaling or unmarshaling values, the format of supported flags in -field tags has changed to be closer to the -json package -(`xml:"name,flag"`). The matching done between field tags, field -names, and the XML attribute and element names is now case-sensitive. -The XMLName field tag, if present, must also match the name -of the XML element being marshaled. -

    - -

    -Updating: -Running go fix will update most uses of the package except for some calls to -Unmarshal. Special care must be taken with field tags, -since the fix tool will not update them and if not fixed by hand they will -misbehave silently in some cases. For example, the old -"attr" is now written ",attr" while plain -"attr" remains valid but with a different meaning. -

    - -

    The expvar package

    - -

    -In Go 1, the RemoveAll function has been removed. -The Iter function and Iter method on *Map have -been replaced by -Do -and -(*Map).Do. -

    - -

    -Updating: -Most code using expvar will not need changing. The rare code that used -Iter can be updated to pass a closure to Do to achieve the same effect. -

    - -

    The flag package

    - -

    -In Go 1, the interface flag.Value has changed slightly. -The Set method now returns an error instead of -a bool to indicate success or failure. -

    - -

    -There is also a new kind of flag, Duration, to support argument -values specifying time intervals. -Values for such flags must be given units, just as time.Duration -formats them: 10s, 1h30m, etc. -

    - -{{code "/doc/progs/go1.go" `/timeout/`}} - -

    -Updating: -Programs that implement their own flags will need minor manual fixes to update their -Set methods. -The Duration flag is new and affects no existing code. -

    - - -

    The go/* packages

    - -

    -Several packages under go have slightly revised APIs. -

    - -

    -A concrete Mode type was introduced for configuration mode flags -in the packages -go/scanner, -go/parser, -go/printer, and -go/doc. -

    - -

    -The modes AllowIllegalChars and InsertSemis have been removed -from the go/scanner package. They were mostly -useful for scanning text other then Go source files. Instead, the -text/scanner package should be used -for that purpose. -

    - -

    -The ErrorHandler provided -to the scanner's Init method is -now simply a function rather than an interface. The ErrorVector type has -been removed in favor of the (existing) ErrorList -type, and the ErrorVector methods have been migrated. Instead of embedding -an ErrorVector in a client of the scanner, now a client should maintain -an ErrorList. -

    - -

    -The set of parse functions provided by the go/parser -package has been reduced to the primary parse function -ParseFile, and a couple of -convenience functions ParseDir -and ParseExpr. -

    - -

    -The go/printer package supports an additional -configuration mode SourcePos; -if set, the printer will emit //line comments such that the generated -output contains the original source code position information. The new type -CommentedNode can be -used to provide comments associated with an arbitrary -ast.Node (until now only -ast.File carried comment information). -

    - -

    -The type names of the go/doc package have been -streamlined by removing the Doc suffix: PackageDoc -is now Package, ValueDoc is Value, etc. -Also, all types now consistently have a Name field (or Names, -in the case of type Value) and Type.Factories has become -Type.Funcs. -Instead of calling doc.NewPackageDoc(pkg, importpath), -documentation for a package is created with: -

    - -
    -    doc.New(pkg, importpath, mode)
    -
    - -

    -where the new mode parameter specifies the operation mode: -if set to AllDecls, all declarations -(not just exported ones) are considered. -The function NewFileDoc was removed, and the function -CommentText has become the method -Text of -ast.CommentGroup. -

    - -

    -In package go/token, the -token.FileSet method Files -(which originally returned a channel of *token.Files) has been replaced -with the iterator Iterate that -accepts a function argument instead. -

    - -

    -In package go/build, the API -has been nearly completely replaced. -The package still computes Go package information -but it does not run the build: the Cmd and Script -types are gone. -(To build code, use the new -go command instead.) -The DirInfo type is now named -Package. -FindTree and ScanDir are replaced by -Import -and -ImportDir. -

    - -

    -Updating: -Code that uses packages in go will have to be updated by hand; the -compiler will reject incorrect uses. Templates used in conjunction with any of the -go/doc types may need manual fixes; the renamed fields will lead -to run-time errors. -

    - -

    The hash package

    - -

    -In Go 1, the definition of hash.Hash includes -a new method, BlockSize. This new method is used primarily in the -cryptographic libraries. -

    - -

    -The Sum method of the -hash.Hash interface now takes a -[]byte argument, to which the hash value will be appended. -The previous behavior can be recreated by adding a nil argument to the call. -

    - -

    -Updating: -Existing implementations of hash.Hash will need to add a -BlockSize method. Hashes that process the input one byte at -a time can implement BlockSize to return 1. -Running go fix will update calls to the Sum methods of the various -implementations of hash.Hash. -

    - -

    -Updating: -Since the package's functionality is new, no updating is necessary. -

    - -

    The http package

    - -

    -In Go 1 the http package is refactored, -putting some of the utilities into a -httputil subdirectory. -These pieces are only rarely needed by HTTP clients. -The affected items are: -

    - -
      -
    • ClientConn
    • -
    • DumpRequest
    • -
    • DumpRequestOut
    • -
    • DumpResponse
    • -
    • NewChunkedReader
    • -
    • NewChunkedWriter
    • -
    • NewClientConn
    • -
    • NewProxyClientConn
    • -
    • NewServerConn
    • -
    • NewSingleHostReverseProxy
    • -
    • ReverseProxy
    • -
    • ServerConn
    • -
    - -

    -The Request.RawURL field has been removed; it was a -historical artifact. -

    - -

    -The Handle and HandleFunc -functions, and the similarly-named methods of ServeMux, -now panic if an attempt is made to register the same pattern twice. -

    - -

    -Updating: -Running go fix will update the few programs that are affected except for -uses of RawURL, which must be fixed by hand. -

    - -

    The image package

    - -

    -The image package has had a number of -minor changes, rearrangements and renamings. -

    - -

    -Most of the color handling code has been moved into its own package, -image/color. -For the elements that moved, a symmetry arises; for instance, -each pixel of an -image.RGBA -is a -color.RGBA. -

    - -

    -The old image/ycbcr package has been folded, with some -renamings, into the -image -and -image/color -packages. -

    - -

    -The old image.ColorImage type is still in the image -package but has been renamed -image.Uniform, -while image.Tiled has been removed. -

    - -

    -This table lists the renamings. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    OldNew

    image.Color color.Color
    image.ColorModel color.Model
    image.ColorModelFunc color.ModelFunc
    image.PalettedColorModel color.Palette

    image.RGBAColor color.RGBA
    image.RGBA64Color color.RGBA64
    image.NRGBAColor color.NRGBA
    image.NRGBA64Color color.NRGBA64
    image.AlphaColor color.Alpha
    image.Alpha16Color color.Alpha16
    image.GrayColor color.Gray
    image.Gray16Color color.Gray16

    image.RGBAColorModel color.RGBAModel
    image.RGBA64ColorModel color.RGBA64Model
    image.NRGBAColorModel color.NRGBAModel
    image.NRGBA64ColorModel color.NRGBA64Model
    image.AlphaColorModel color.AlphaModel
    image.Alpha16ColorModel color.Alpha16Model
    image.GrayColorModel color.GrayModel
    image.Gray16ColorModel color.Gray16Model

    ycbcr.RGBToYCbCr color.RGBToYCbCr
    ycbcr.YCbCrToRGB color.YCbCrToRGB
    ycbcr.YCbCrColorModel color.YCbCrModel
    ycbcr.YCbCrColor color.YCbCr
    ycbcr.YCbCr image.YCbCr

    ycbcr.SubsampleRatio444 image.YCbCrSubsampleRatio444
    ycbcr.SubsampleRatio422 image.YCbCrSubsampleRatio422
    ycbcr.SubsampleRatio420 image.YCbCrSubsampleRatio420

    image.ColorImage image.Uniform
    - -

    -The image package's New functions -(NewRGBA, -NewRGBA64, etc.) -take an image.Rectangle as an argument -instead of four integers. -

    - -

    -Finally, there are new predefined color.Color variables -color.Black, -color.White, -color.Opaque -and -color.Transparent. -

    - -

    -Updating: -Running go fix will update almost all code affected by the change. -

    - -

    The log/syslog package

    - -

    -In Go 1, the syslog.NewLogger -function returns an error as well as a log.Logger. -

    - -

    -Updating: -What little code is affected will be caught by the compiler and must be updated by hand. -

    - -

    The mime package

    - -

    -In Go 1, the FormatMediaType function -of the mime package has been simplified to make it -consistent with -ParseMediaType. -It now takes "text/html" rather than "text" and "html". -

    - -

    -Updating: -What little code is affected will be caught by the compiler and must be updated by hand. -

    - -

    The net package

    - -

    -In Go 1, the various SetTimeout, -SetReadTimeout, and SetWriteTimeout methods -have been replaced with -SetDeadline, -SetReadDeadline, and -SetWriteDeadline, -respectively. Rather than taking a timeout value in nanoseconds that -apply to any activity on the connection, the new methods set an -absolute deadline (as a time.Time value) after which -reads and writes will time out and no longer block. -

    - -

    -There are also new functions -net.DialTimeout -to simplify timing out dialing a network address and -net.ListenMulticastUDP -to allow multicast UDP to listen concurrently across multiple listeners. -The net.ListenMulticastUDP function replaces the old -JoinGroup and LeaveGroup methods. -

    - -

    -Updating: -Code that uses the old methods will fail to compile and must be updated by hand. -The semantic change makes it difficult for the fix tool to update automatically. -

    - -

    The os package

    - -

    -The Time function has been removed; callers should use -the Time type from the -time package. -

    - -

    -The Exec function has been removed; callers should use -Exec from the syscall package, where available. -

    - -

    -The ShellExpand function has been renamed to ExpandEnv. -

    - -

    -The NewFile function -now takes a uintptr fd, instead of an int. -The Fd method on files now -also returns a uintptr. -

    - -

    -There are no longer error constants such as EINVAL -in the os package, since the set of values varied with -the underlying operating system. There are new portable functions like -IsPermission -to test common error properties, plus a few new error values -with more Go-like names, such as -ErrPermission -and -ErrNotExist. -

    - -

    -The Getenverror function has been removed. To distinguish -between a non-existent environment variable and an empty string, -use os.Environ or -syscall.Getenv. -

    - - -

    -The Process.Wait method has -dropped its option argument and the associated constants are gone -from the package. -Also, the function Wait is gone; only the method of -the Process type persists. -

    - -

    -The Waitmsg type returned by -Process.Wait -has been replaced with a more portable -ProcessState -type with accessor methods to recover information about the -process. -Because of changes to Wait, the ProcessState -value always describes an exited process. -Portability concerns simplified the interface in other ways, but the values returned by the -ProcessState.Sys and -ProcessState.SysUsage -methods can be type-asserted to underlying system-specific data structures such as -syscall.WaitStatus and -syscall.Rusage on Unix. -

    - -

    -Updating: -Running go fix will drop a zero argument to Process.Wait. -All other changes will be caught by the compiler and must be updated by hand. -

    - -

    The os.FileInfo type

    - -

    -Go 1 redefines the os.FileInfo type, -changing it from a struct to an interface: -

    - -
    -    type FileInfo interface {
    -        Name() string       // base name of the file
    -        Size() int64        // length in bytes
    -        Mode() FileMode     // file mode bits
    -        ModTime() time.Time // modification time
    -        IsDir() bool        // abbreviation for Mode().IsDir()
    -        Sys() interface{}   // underlying data source (can return nil)
    -    }
    -
    - -

    -The file mode information has been moved into a subtype called -os.FileMode, -a simple integer type with IsDir, Perm, and String -methods. -

    - -

    -The system-specific details of file modes and properties such as (on Unix) -i-number have been removed from FileInfo altogether. -Instead, each operating system's os package provides an -implementation of the FileInfo interface, which -has a Sys method that returns the -system-specific representation of file metadata. -For instance, to discover the i-number of a file on a Unix system, unpack -the FileInfo like this: -

    - -
    -    fi, err := os.Stat("hello.go")
    -    if err != nil {
    -        log.Fatal(err)
    -    }
    -    // Check that it's a Unix file.
    -    unixStat, ok := fi.Sys().(*syscall.Stat_t)
    -    if !ok {
    -        log.Fatal("hello.go: not a Unix file")
    -    }
    -    fmt.Printf("file i-number: %d\n", unixStat.Ino)
    -
    - -

    -Assuming (which is unwise) that "hello.go" is a Unix file, -the i-number expression could be contracted to -

    - -
    -    fi.Sys().(*syscall.Stat_t).Ino
    -
    - -

    -The vast majority of uses of FileInfo need only the methods -of the standard interface. -

    - -

    -The os package no longer contains wrappers for the POSIX errors -such as ENOENT. -For the few programs that need to verify particular error conditions, there are -now the boolean functions -IsExist, -IsNotExist -and -IsPermission. -

    - -{{code "/doc/progs/go1.go" `/os\.Open/` `/}/`}} - -

    -Updating: -Running go fix will update code that uses the old equivalent of the current os.FileInfo -and os.FileMode API. -Code that needs system-specific file details will need to be updated by hand. -Code that uses the old POSIX error values from the os package -will fail to compile and will also need to be updated by hand. -

    - -

    The os/signal package

    - -

    -The os/signal package in Go 1 replaces the -Incoming function, which returned a channel -that received all incoming signals, -with the selective Notify function, which asks -for delivery of specific signals on an existing channel. -

    - -

    -Updating: -Code must be updated by hand. -A literal translation of -

    -
    -c := signal.Incoming()
    -
    -

    -is -

    -
    -c := make(chan os.Signal, 1)
    -signal.Notify(c) // ask for all signals
    -
    -

    -but most code should list the specific signals it wants to handle instead: -

    -
    -c := make(chan os.Signal, 1)
    -signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT)
    -
    - -

    The path/filepath package

    - -

    -In Go 1, the Walk function of the -path/filepath package -has been changed to take a function value of type -WalkFunc -instead of a Visitor interface value. -WalkFunc unifies the handling of both files and directories. -

    - -
    -    type WalkFunc func(path string, info os.FileInfo, err error) error
    -
    - -

    -The WalkFunc function will be called even for files or directories that could not be opened; -in such cases the error argument will describe the failure. -If a directory's contents are to be skipped, -the function should return the value filepath.SkipDir -

    - -{{code "/doc/progs/go1.go" `/STARTWALK/` `/ENDWALK/`}} - -

    -Updating: -The change simplifies most code but has subtle consequences, so affected programs -will need to be updated by hand. -The compiler will catch code using the old interface. -

    - -

    The regexp package

    - -

    -The regexp package has been rewritten. -It has the same interface but the specification of the regular expressions -it supports has changed from the old "egrep" form to that of -RE2. -

    - -

    -Updating: -Code that uses the package should have its regular expressions checked by hand. -

    - -

    The runtime package

    - -

    -In Go 1, much of the API exported by package -runtime has been removed in favor of -functionality provided by other packages. -Code using the runtime.Type interface -or its specific concrete type implementations should -now use package reflect. -Code using runtime.Semacquire or runtime.Semrelease -should use channels or the abstractions in package sync. -The runtime.Alloc, runtime.Free, -and runtime.Lookup functions, an unsafe API created for -debugging the memory allocator, have no replacement. -

    - -

    -Before, runtime.MemStats was a global variable holding -statistics about memory allocation, and calls to runtime.UpdateMemStats -ensured that it was up to date. -In Go 1, runtime.MemStats is a struct type, and code should use -runtime.ReadMemStats -to obtain the current statistics. -

    - -

    -The package adds a new function, -runtime.NumCPU, that returns the number of CPUs available -for parallel execution, as reported by the operating system kernel. -Its value can inform the setting of GOMAXPROCS. -The runtime.Cgocalls and runtime.Goroutines functions -have been renamed to runtime.NumCgoCall and runtime.NumGoroutine. -

    - -

    -Updating: -Running go fix will update code for the function renamings. -Other code will need to be updated by hand. -

    - -

    The strconv package

    - -

    -In Go 1, the -strconv -package has been significantly reworked to make it more Go-like and less C-like, -although Atoi lives on (it's similar to -int(ParseInt(x, 10, 0)), as does -Itoa(x) (FormatInt(int64(x), 10)). -There are also new variants of some of the functions that append to byte slices rather than -return strings, to allow control over allocation. -

    - -

    -This table summarizes the renamings; see the -package documentation -for full details. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Old callNew call

    Atob(x) ParseBool(x)

    Atof32(x) ParseFloat(x, 32)§
    Atof64(x) ParseFloat(x, 64)
    AtofN(x, n) ParseFloat(x, n)

    Atoi(x) Atoi(x)
    Atoi(x) ParseInt(x, 10, 0)§
    Atoi64(x) ParseInt(x, 10, 64)

    Atoui(x) ParseUint(x, 10, 0)§
    Atoui64(x) ParseUint(x, 10, 64)

    Btoi64(x, b) ParseInt(x, b, 64)
    Btoui64(x, b) ParseUint(x, b, 64)

    Btoa(x) FormatBool(x)

    Ftoa32(x, f, p) FormatFloat(float64(x), f, p, 32)
    Ftoa64(x, f, p) FormatFloat(x, f, p, 64)
    FtoaN(x, f, p, n) FormatFloat(x, f, p, n)

    Itoa(x) Itoa(x)
    Itoa(x) FormatInt(int64(x), 10)
    Itoa64(x) FormatInt(x, 10)

    Itob(x, b) FormatInt(int64(x), b)
    Itob64(x, b) FormatInt(x, b)

    Uitoa(x) FormatUint(uint64(x), 10)
    Uitoa64(x) FormatUint(x, 10)

    Uitob(x, b) FormatUint(uint64(x), b)
    Uitob64(x, b) FormatUint(x, b)
    - -

    -Updating: -Running go fix will update almost all code affected by the change. -
    Atoi persists but Atoui and Atof32 do not, so -they may require -a cast that must be added by hand; the go fix tool will warn about it. -

    - - -

    The template packages

    - -

    -The template and exp/template/html packages have moved to -text/template and -html/template. -More significant, the interface to these packages has been simplified. -The template language is the same, but the concept of "template set" is gone -and the functions and methods of the packages have changed accordingly, -often by elimination. -

    - -

    -Instead of sets, a Template object -may contain multiple named template definitions, -in effect constructing -name spaces for template invocation. -A template can invoke any other template associated with it, but only those -templates associated with it. -The simplest way to associate templates is to parse them together, something -made easier with the new structure of the packages. -

    - -

    -Updating: -The imports will be updated by fix tool. -Single-template uses will be otherwise be largely unaffected. -Code that uses multiple templates in concert will need to be updated by hand. -The examples in -the documentation for text/template can provide guidance. -

    - -

    The testing package

    - -

    -The testing package has a type, B, passed as an argument to benchmark functions. -In Go 1, B has new methods, analogous to those of T, enabling -logging and failure reporting. -

    - -{{code "/doc/progs/go1.go" `/func.*Benchmark/` `/^}/`}} - -

    -Updating: -Existing code is unaffected, although benchmarks that use println -or panic should be updated to use the new methods. -

    - -

    The testing/script package

    - -

    -The testing/script package has been deleted. It was a dreg. -

    - -

    -Updating: -No code is likely to be affected. -

    - -

    The unsafe package

    - -

    -In Go 1, the functions -unsafe.Typeof, unsafe.Reflect, -unsafe.Unreflect, unsafe.New, and -unsafe.NewArray have been removed; -they duplicated safer functionality provided by -package reflect. -

    - -

    -Updating: -Code using these functions must be rewritten to use -package reflect. -The changes to encoding/gob and the protocol buffer library -may be helpful as examples. -

    - -

    The url package

    - -

    -In Go 1 several fields from the url.URL type -were removed or replaced. -

    - -

    -The String method now -predictably rebuilds an encoded URL string using all of URL's -fields as necessary. The resulting string will also no longer have -passwords escaped. -

    - -

    -The Raw field has been removed. In most cases the String -method may be used in its place. -

    - -

    -The old RawUserinfo field is replaced by the User -field, of type *net.Userinfo. -Values of this type may be created using the new net.User -and net.UserPassword -functions. The EscapeUserinfo and UnescapeUserinfo -functions are also gone. -

    - -

    -The RawAuthority field has been removed. The same information is -available in the Host and User fields. -

    - -

    -The RawPath field and the EncodedPath method have -been removed. The path information in rooted URLs (with a slash following the -schema) is now available only in decoded form in the Path field. -Occasionally, the encoded data may be required to obtain information that -was lost in the decoding process. These cases must be handled by accessing -the data the URL was built from. -

    - -

    -URLs with non-rooted paths, such as "mailto:dev@golang.org?subject=Hi", -are also handled differently. The OpaquePath boolean field has been -removed and a new Opaque string field introduced to hold the encoded -path for such URLs. In Go 1, the cited URL parses as: -

    - -
    -    URL{
    -        Scheme: "mailto",
    -        Opaque: "dev@golang.org",
    -        RawQuery: "subject=Hi",
    -    }
    -
    - -

    -A new RequestURI method was -added to URL. -

    - -

    -The ParseWithReference function has been renamed to ParseWithFragment. -

    - -

    -Updating: -Code that uses the old fields will fail to compile and must be updated by hand. -The semantic changes make it difficult for the fix tool to update automatically. -

    - -

    The go command

    - -

    -Go 1 introduces the go command, a tool for fetching, -building, and installing Go packages and commands. The go command -does away with makefiles, instead using Go source code to find dependencies and -determine build conditions. Most existing Go programs will no longer require -makefiles to be built. -

    - -

    -See How to Write Go Code for a primer on the -go command and the go command documentation -for the full details. -

    - -

    -Updating: -Projects that depend on the Go project's old makefile-based build -infrastructure (Make.pkg, Make.cmd, and so on) should -switch to using the go command for building Go code and, if -necessary, rewrite their makefiles to perform any auxiliary build tasks. -

    - -

    The cgo command

    - -

    -In Go 1, the cgo command -uses a different _cgo_export.h -file, which is generated for packages containing //export lines. -The _cgo_export.h file now begins with the C preamble comment, -so that exported function definitions can use types defined there. -This has the effect of compiling the preamble multiple times, so a -package using //export must not put function definitions -or variable initializations in the C preamble. -

    - -

    Packaged releases

    - -

    -One of the most significant changes associated with Go 1 is the availability -of prepackaged, downloadable distributions. -They are available for many combinations of architecture and operating system -(including Windows) and the list will grow. -Installation details are described on the -Getting Started page, while -the distributions themselves are listed on the -downloads page. diff --git a/doc/go1compat.html b/doc/go1compat.html deleted file mode 100644 index a5624ef5f6..0000000000 --- a/doc/go1compat.html +++ /dev/null @@ -1,202 +0,0 @@ - - -

    Introduction

    -

    -The release of Go version 1, Go 1 for short, is a major milestone -in the development of the language. Go 1 is a stable platform for -the growth of programs and projects written in Go. -

    - -

    -Go 1 defines two things: first, the specification of the language; -and second, the specification of a set of core APIs, the "standard -packages" of the Go library. The Go 1 release includes their -implementation in the form of two compiler suites (gc and gccgo), -and the core libraries themselves. -

    - -

    -It is intended that programs written to the Go 1 specification will -continue to compile and run correctly, unchanged, over the lifetime -of that specification. At some indefinite point, a Go 2 specification -may arise, but until that time, Go programs that work today should -continue to work even as future "point" releases of Go 1 arise (Go -1.1, Go 1.2, etc.). -

    - -

    -Compatibility is at the source level. Binary compatibility for -compiled packages is not guaranteed between releases. After a point -release, Go source will need to be recompiled to link against the -new release. -

    - -

    -The APIs may grow, acquiring new packages and features, but not in -a way that breaks existing Go 1 code. -

    - -

    Expectations

    - -

    -Although we expect that the vast majority of programs will maintain -this compatibility over time, it is impossible to guarantee that -no future change will break any program. This document is an attempt -to set expectations for the compatibility of Go 1 software in the -future. There are a number of ways in which a program that compiles -and runs today may fail to do so after a future point release. They -are all unlikely but worth recording. -

    - -
      -
    • -Security. A security issue in the specification or implementation -may come to light whose resolution requires breaking compatibility. -We reserve the right to address such security issues. -
    • - -
    • -Unspecified behavior. The Go specification tries to be explicit -about most properties of the language, but there are some aspects -that are undefined. Programs that depend on such unspecified behavior -may break in future releases. -
    • - -
    • -Specification errors. If it becomes necessary to address an -inconsistency or incompleteness in the specification, resolving the -issue could affect the meaning or legality of existing programs. -We reserve the right to address such issues, including updating the -implementations. Except for security issues, no incompatible changes -to the specification would be made. -
    • - -
    • -Bugs. If a compiler or library has a bug that violates the -specification, a program that depends on the buggy behavior may -break if the bug is fixed. We reserve the right to fix such bugs. -
    • - -
    • -Struct literals. For the addition of features in later point -releases, it may be necessary to add fields to exported structs in -the API. Code that uses unkeyed struct literals (such as pkg.T{3, -"x"}) to create values of these types would fail to compile after -such a change. However, code that uses keyed literals (pkg.T{A: -3, B: "x"}) will continue to compile after such a change. We will -update such data structures in a way that allows keyed struct -literals to remain compatible, although unkeyed literals may fail -to compile. (There are also more intricate cases involving nested -data structures or interfaces, but they have the same resolution.) -We therefore recommend that composite literals whose type is defined -in a separate package should use the keyed notation. -
    • - -
    • -Methods. As with struct fields, it may be necessary to add methods -to types. -Under some circumstances, such as when the type is embedded in -a struct along with another type, -the addition of the new method may break -the struct by creating a conflict with an existing method of the other -embedded type. -We cannot protect against this rare case and do not guarantee compatibility -should it arise. -
    • - -
    • -Dot imports. If a program imports a standard package -using import . "path", additional names defined in the -imported package in future releases may conflict with other names -defined in the program. We do not recommend the use of import . -outside of tests, and using it may cause a program to fail -to compile in future releases. -
    • - -
    • -Use of package unsafe. Packages that import -unsafe -may depend on internal properties of the Go implementation. -We reserve the right to make changes to the implementation -that may break such programs. -
    • - -
    - -

    -Of course, for all of these possibilities, should they arise, we -would endeavor whenever feasible to update the specification, -compilers, or libraries without affecting existing code. -

    - -

    -These same considerations apply to successive point releases. For -instance, code that runs under Go 1.2 should be compatible with Go -1.2.1, Go 1.3, Go 1.4, etc., although not necessarily with Go 1.1 -since it may use features added only in Go 1.2 -

    - -

    -Features added between releases, available in the source repository -but not part of the numbered binary releases, are under active -development. No promise of compatibility is made for software using -such features until they have been released. -

    - -

    -Finally, although it is not a correctness issue, it is possible -that the performance of a program may be affected by -changes in the implementation of the compilers or libraries upon -which it depends. -No guarantee can be made about the performance of a -given program between releases. -

    - -

    -Although these expectations apply to Go 1 itself, we hope similar -considerations would be made for the development of externally -developed software based on Go 1. -

    - -

    Sub-repositories

    - -

    -Code in sub-repositories of the main go tree, such as -golang.org/x/net, -may be developed under -looser compatibility requirements. However, the sub-repositories -will be tagged as appropriate to identify versions that are compatible -with the Go 1 point releases. -

    - -

    Operating systems

    - -

    -It is impossible to guarantee long-term compatibility with operating -system interfaces, which are changed by outside parties. -The syscall package -is therefore outside the purview of the guarantees made here. -As of Go version 1.4, the syscall package is frozen. -Any evolution of the system call interface must be supported elsewhere, -such as in the -go.sys subrepository. -For details and background, see -this document. -

    - -

    Tools

    - -

    -Finally, the Go toolchain (compilers, linkers, build tools, and so -on) is under active development and may change behavior. This -means, for instance, that scripts that depend on the location and -properties of the tools may be broken by a point release. -

    - -

    -These caveats aside, we believe that Go 1 will be a firm foundation -for the development of Go and its ecosystem. -

    diff --git a/doc/go_faq.html b/doc/go_faq.html deleted file mode 100644 index 67dc0b9bd4..0000000000 --- a/doc/go_faq.html +++ /dev/null @@ -1,2477 +0,0 @@ - - -

    Origins

    - -

    -What is the purpose of the project?

    - -

    -At the time of Go's inception, only a decade ago, the programming world was different from today. -Production software was usually written in C++ or Java, -GitHub did not exist, most computers were not yet multiprocessors, -and other than Visual Studio and Eclipse there were few IDEs or other high-level tools available -at all, let alone for free on the Internet. -

    - -

    -Meanwhile, we had become frustrated by the undue complexity required to use -the languages we worked with to develop server software. -Computers had become enormously quicker since languages such as -C, C++ and Java were first developed but the act of programming had not -itself advanced nearly as much. -Also, it was clear that multiprocessors were becoming universal but -most languages offered little help to program them efficiently -and safely. -

    - -

    -We decided to take a step back and think about what major issues were -going to dominate software engineering in the years ahead as technology -developed, and how a new language might help address them. -For instance, the rise of multicore CPUs argued that a language should -provide first-class support for some sort of concurrency or parallelism. -And to make resource management tractable in a large concurrent program, -garbage collection, or at least some sort of safe automatic memory management was required. -

    - -

    -These considerations led to -a -series of discussions from which Go arose, first as a set of ideas and -desiderata, then as a language. -An overarching goal was that Go do more to help the working programmer -by enabling tooling, automating mundane tasks such as code formatting, -and removing obstacles to working on large code bases. -

    - -

    -A much more expansive description of the goals of Go and how -they are met, or at least approached, is available in the article, -Go at Google: -Language Design in the Service of Software Engineering. -

    - -

    -What is the history of the project?

    -

    -Robert Griesemer, Rob Pike and Ken Thompson started sketching the -goals for a new language on the white board on September 21, 2007. -Within a few days the goals had settled into a plan to do something -and a fair idea of what it would be. Design continued part-time in -parallel with unrelated work. By January 2008, Ken had started work -on a compiler with which to explore ideas; it generated C code as its -output. By mid-year the language had become a full-time project and -had settled enough to attempt a production compiler. In May 2008, -Ian Taylor independently started on a GCC front end for Go using the -draft specification. Russ Cox joined in late 2008 and helped move the language -and libraries from prototype to reality. -

    - -

    -Go became a public open source project on November 10, 2009. -Countless people from the community have contributed ideas, discussions, and code. -

    - -

    -There are now millions of Go programmers—gophers—around the world, -and there are more every day. -Go's success has far exceeded our expectations. -

    - -

    -What's the origin of the gopher mascot?

    - -

    -The mascot and logo were designed by -Renée French, who also designed -Glenda, -the Plan 9 bunny. -A blog post -about the gopher explains how it was -derived from one she used for a WFMU -T-shirt design some years ago. -The logo and mascot are covered by the -Creative Commons Attribution 3.0 -license. -

    - -

    -The gopher has a -model sheet -illustrating his characteristics and how to represent them correctly. -The model sheet was first shown in a -talk -by Renée at Gophercon in 2016. -He has unique features; he's the Go gopher, not just any old gopher. -

    - -

    -Is the language called Go or Golang?

    - -

    -The language is called Go. -The "golang" moniker arose because the web site is -golang.org, not -go.org, which was not available to us. -Many use the golang name, though, and it is handy as -a label. -For instance, the Twitter tag for the language is "#golang". -The language's name is just plain Go, regardless. -

    - -

    -A side note: Although the -official logo -has two capital letters, the language name is written Go, not GO. -

    - -

    -Why did you create a new language?

    - -

    -Go was born out of frustration with existing languages and -environments for the work we were doing at Google. -Programming had become too -difficult and the choice of languages was partly to blame. One had to -choose either efficient compilation, efficient execution, or ease of -programming; all three were not available in the same mainstream -language. Programmers who could were choosing ease over -safety and efficiency by moving to dynamically typed languages such as -Python and JavaScript rather than C++ or, to a lesser extent, Java. -

    - -

    -We were not alone in our concerns. -After many years with a pretty quiet landscape for programming languages, -Go was among the first of several new languages—Rust, -Elixir, Swift, and more—that have made programming language development -an active, almost mainstream field again. -

    - -

    -Go addressed these issues by attempting to combine the ease of programming of an interpreted, -dynamically typed -language with the efficiency and safety of a statically typed, compiled language. -It also aimed to be modern, with support for networked and multicore -computing. Finally, working with Go is intended to be fast: it should take -at most a few seconds to build a large executable on a single computer. -To meet these goals required addressing a number of -linguistic issues: an expressive but lightweight type system; -concurrency and garbage collection; rigid dependency specification; -and so on. These cannot be addressed well by libraries or tools; a new -language was called for. -

    - -

    -The article Go at Google -discusses the background and motivation behind the design of the Go language, -as well as providing more detail about many of the answers presented in this FAQ. -

    - - -

    -What are Go's ancestors?

    -

    -Go is mostly in the C family (basic syntax), -with significant input from the Pascal/Modula/Oberon -family (declarations, packages), -plus some ideas from languages -inspired by Tony Hoare's CSP, -such as Newsqueak and Limbo (concurrency). -However, it is a new language across the board. -In every respect the language was designed by thinking -about what programmers do and how to make programming, at least the -kind of programming we do, more effective, which means more fun. -

    - -

    -What are the guiding principles in the design?

    - -

    -When Go was designed, Java and C++ were the most commonly -used languages for writing servers, at least at Google. -We felt that these languages required -too much bookkeeping and repetition. -Some programmers reacted by moving towards more dynamic, -fluid languages like Python, at the cost of efficiency and -type safety. -We felt it should be possible to have the efficiency, -the safety, and the fluidity in a single language. -

    - -

    -Go attempts to reduce the amount of typing in both senses of the word. -Throughout its design, we have tried to reduce clutter and -complexity. There are no forward declarations and no header files; -everything is declared exactly once. Initialization is expressive, -automatic, and easy to use. Syntax is clean and light on keywords. -Stuttering (foo.Foo* myFoo = new(foo.Foo)) is reduced by -simple type derivation using the := -declare-and-initialize construct. And perhaps most radically, there -is no type hierarchy: types just are, they don't have to -announce their relationships. These simplifications allow Go to be -expressive yet comprehensible without sacrificing, well, sophistication. -

    -

    -Another important principle is to keep the concepts orthogonal. -Methods can be implemented for any type; structures represent data while -interfaces represent abstraction; and so on. Orthogonality makes it -easier to understand what happens when things combine. -

    - -

    Usage

    - -

    -Is Google using Go internally?

    - -

    -Yes. Go is used widely in production inside Google. -One easy example is the server behind -golang.org. -It's just the godoc -document server running in a production configuration on -Google App Engine. -

    - -

    -A more significant instance is Google's download server, dl.google.com, -which delivers Chrome binaries and other large installables such as apt-get -packages. -

    - -

    -Go is not the only language used at Google, far from it, but it is a key language -for a number of areas including -site reliability -engineering (SRE) -and large-scale data processing. -

    - -

    -What other companies use Go?

    - -

    -Go usage is growing worldwide, especially but by no means exclusively -in the cloud computing space. -A couple of major cloud infrastructure projects written in Go are -Docker and Kubernetes, -but there are many more. -

    - -

    -It's not just cloud, though. -The Go Wiki includes a -page, -updated regularly, that lists some of the many companies using Go. -

    - -

    -The Wiki also has a page with links to -success stories -about companies and projects that are using the language. -

    - - - -

    -It is possible to use C and Go together in the same address space, -but it is not a natural fit and can require special interface software. -Also, linking C with Go code gives up the memory -safety and stack management properties that Go provides. -Sometimes it's absolutely necessary to use C libraries to solve a problem, -but doing so always introduces an element of risk not present with -pure Go code, so do so with care. -

    - -

    -If you do need to use C with Go, how to proceed depends on the Go -compiler implementation. -There are three Go compiler implementations supported by the -Go team. -These are gc, the default compiler, -gccgo, which uses the GCC back end, -and a somewhat less mature gollvm, which uses the LLVM infrastructure. -

    - -

    -Gc uses a different calling convention and linker from C and -therefore cannot be called directly from C programs, or vice versa. -The cgo program provides the mechanism for a -“foreign function interface” to allow safe calling of -C libraries from Go code. -SWIG extends this capability to C++ libraries. -

    - -

    -You can also use cgo and SWIG with Gccgo and gollvm. -Since they use a traditional API, it's also possible, with great care, -to link code from these compilers directly with GCC/LLVM-compiled C or C++ programs. -However, doing so safely requires an understanding of the calling conventions for -all languages concerned, as well as concern for stack limits when calling C or C++ -from Go. -

    - -

    -What IDEs does Go support?

    - -

    -The Go project does not include a custom IDE, but the language and -libraries have been designed to make it easy to analyze source code. -As a consequence, most well-known editors and IDEs support Go well, -either directly or through a plugin. -

    - -

    -The list of well-known IDEs and editors that have good Go support -available includes Emacs, Vim, VSCode, Atom, Eclipse, Sublime, IntelliJ -(through a custom variant called Goland), and many more. -Chances are your favorite environment is a productive one for -programming in Go. -

    - -

    -Does Go support Google's protocol buffers?

    - -

    -A separate open source project provides the necessary compiler plugin and library. -It is available at -github.com/golang/protobuf/. -

    - - -

    -Can I translate the Go home page into another language?

    - -

    -Absolutely. We encourage developers to make Go Language sites in their own languages. -However, if you choose to add the Google logo or branding to your site -(it does not appear on golang.org), -you will need to abide by the guidelines at -www.google.com/permissions/guidelines.html -

    - -

    Design

    - -

    -Does Go have a runtime?

    - -

    -Go does have an extensive library, called the runtime, -that is part of every Go program. -The runtime library implements garbage collection, concurrency, -stack management, and other critical features of the Go language. -Although it is more central to the language, Go's runtime is analogous -to libc, the C library. -

    - -

    -It is important to understand, however, that Go's runtime does not -include a virtual machine, such as is provided by the Java runtime. -Go programs are compiled ahead of time to native machine code -(or JavaScript or WebAssembly, for some variant implementations). -Thus, although the term is often used to describe the virtual -environment in which a program runs, in Go the word “runtime” -is just the name given to the library providing critical language services. -

    - -

    -What's up with Unicode identifiers?

    - -

    -When designing Go, we wanted to make sure that it was not -overly ASCII-centric, -which meant extending the space of identifiers from the -confines of 7-bit ASCII. -Go's rule—identifier characters must be -letters or digits as defined by Unicode—is simple to understand -and to implement but has restrictions. -Combining characters are -excluded by design, for instance, -and that excludes some languages such as Devanagari. -

    - -

    -This rule has one other unfortunate consequence. -Since an exported identifier must begin with an -upper-case letter, identifiers created from characters -in some languages can, by definition, not be exported. -For now the -only solution is to use something like X日本語, which -is clearly unsatisfactory. -

    - -

    -Since the earliest version of the language, there has been considerable -thought into how best to expand the identifier space to accommodate -programmers using other native languages. -Exactly what to do remains an active topic of discussion, and a future -version of the language may be more liberal in its definition -of an identifier. -For instance, it might adopt some of the ideas from the Unicode -organization's recommendations -for identifiers. -Whatever happens, it must be done compatibly while preserving -(or perhaps expanding) the way letter case determines visibility of -identifiers, which remains one of our favorite features of Go. -

    - -

    -For the time being, we have a simple rule that can be expanded later -without breaking programs, one that avoids bugs that would surely arise -from a rule that admits ambiguous identifiers. -

    - -

    Why does Go not have feature X?

    - -

    -Every language contains novel features and omits someone's favorite -feature. Go was designed with an eye on felicity of programming, speed of -compilation, orthogonality of concepts, and the need to support features -such as concurrency and garbage collection. Your favorite feature may be -missing because it doesn't fit, because it affects compilation speed or -clarity of design, or because it would make the fundamental system model -too difficult. -

    - -

    -If it bothers you that Go is missing feature X, -please forgive us and investigate the features that Go does have. You might find that -they compensate in interesting ways for the lack of X. -

    - -

    -Why does Go not have generic types?

    -

    -A language proposal -implementing a form of generic types has been accepted for -inclusion in the language. -If all goes well it will be available in the Go 1.18 release. -

    - -

    -Go was intended as a language for writing server programs that would be -easy to maintain over time. -(See this -article for more background.) -The design concentrated on things like scalability, readability, and -concurrency. -Polymorphic programming did not seem essential to the language's -goals at the time, and so was left out for simplicity. -

    - -

    -The language is more mature now, and there is scope to consider -some form of generic programming. -However, there remain some caveats. -

    - -

    -Generics are convenient but they come at a cost in -complexity in the type system and run-time. We haven't yet found a -design that gives value proportionate to the complexity, although we -continue to think about it. Meanwhile, Go's built-in maps and slices, -plus the ability to use the empty interface to construct containers -(with explicit unboxing) mean in many cases it is possible to write -code that does what generics would enable, if less smoothly. -

    - -

    -The topic remains open. -For a look at several previous unsuccessful attempts to -design a good generics solution for Go, see -this proposal. -

    - -

    -Why does Go not have exceptions?

    -

    -We believe that coupling exceptions to a control -structure, as in the try-catch-finally idiom, results in -convoluted code. It also tends to encourage programmers to label -too many ordinary errors, such as failing to open a file, as -exceptional. -

    - -

    -Go takes a different approach. For plain error handling, Go's multi-value -returns make it easy to report an error without overloading the return value. -A canonical error type, coupled -with Go's other features, makes error handling pleasant but quite different -from that in other languages. -

    - -

    -Go also has a couple -of built-in functions to signal and recover from truly exceptional -conditions. The recovery mechanism is executed only as part of a -function's state being torn down after an error, which is sufficient -to handle catastrophe but requires no extra control structures and, -when used well, can result in clean error-handling code. -

    - -

    -See the Defer, Panic, and Recover article for details. -Also, the Errors are values blog post -describes one approach to handling errors cleanly in Go by demonstrating that, -since errors are just values, the full power of Go can be deployed in error handling. -

    - -

    -Why does Go not have assertions?

    - -

    -Go doesn't provide assertions. They are undeniably convenient, but our -experience has been that programmers use them as a crutch to avoid thinking -about proper error handling and reporting. Proper error handling means that -servers continue to operate instead of crashing after a non-fatal error. -Proper error reporting means that errors are direct and to the point, -saving the programmer from interpreting a large crash trace. Precise -errors are particularly important when the programmer seeing the errors is -not familiar with the code. -

    - -

    -We understand that this is a point of contention. There are many things in -the Go language and libraries that differ from modern practices, simply -because we feel it's sometimes worth trying a different approach. -

    - -

    -Why build concurrency on the ideas of CSP?

    -

    -Concurrency and multi-threaded programming have over time -developed a reputation for difficulty. We believe this is due partly to complex -designs such as -pthreads -and partly to overemphasis on low-level details -such as mutexes, condition variables, and memory barriers. -Higher-level interfaces enable much simpler code, even if there are still -mutexes and such under the covers. -

    - -

    -One of the most successful models for providing high-level linguistic support -for concurrency comes from Hoare's Communicating Sequential Processes, or CSP. -Occam and Erlang are two well known languages that stem from CSP. -Go's concurrency primitives derive from a different part of the family tree -whose main contribution is the powerful notion of channels as first class objects. -Experience with several earlier languages has shown that the CSP model -fits well into a procedural language framework. -

    - -

    -Why goroutines instead of threads?

    -

    -Goroutines are part of making concurrency easy to use. The idea, which has -been around for a while, is to multiplex independently executing -functions—coroutines—onto a set of threads. -When a coroutine blocks, such as by calling a blocking system call, -the run-time automatically moves other coroutines on the same operating -system thread to a different, runnable thread so they won't be blocked. -The programmer sees none of this, which is the point. -The result, which we call goroutines, can be very cheap: they have little -overhead beyond the memory for the stack, which is just a few kilobytes. -

    - -

    -To make the stacks small, Go's run-time uses resizable, bounded stacks. A newly -minted goroutine is given a few kilobytes, which is almost always enough. -When it isn't, the run-time grows (and shrinks) the memory for storing -the stack automatically, allowing many goroutines to live in a modest -amount of memory. -The CPU overhead averages about three cheap instructions per function call. -It is practical to create hundreds of thousands of goroutines in the same -address space. -If goroutines were just threads, system resources would -run out at a much smaller number. -

    - -

    -Why are map operations not defined to be atomic?

    - -

    -After long discussion it was decided that the typical use of maps did not require -safe access from multiple goroutines, and in those cases where it did, the map was -probably part of some larger data structure or computation that was already -synchronized. Therefore requiring that all map operations grab a mutex would slow -down most programs and add safety to few. This was not an easy decision, -however, since it means uncontrolled map access can crash the program. -

    - -

    -The language does not preclude atomic map updates. When required, such -as when hosting an untrusted program, the implementation could interlock -map access. -

    - -

    -Map access is unsafe only when updates are occurring. -As long as all goroutines are only reading—looking up elements in the map, -including iterating through it using a -for range loop—and not changing the map -by assigning to elements or doing deletions, -it is safe for them to access the map concurrently without synchronization. -

    - -

    -As an aid to correct map use, some implementations of the language -contain a special check that automatically reports at run time when a map is modified -unsafely by concurrent execution. -

    - -

    -Will you accept my language change?

    - -

    -People often suggest improvements to the language—the -mailing list -contains a rich history of such discussions—but very few of these changes have -been accepted. -

    - -

    -Although Go is an open source project, the language and libraries are protected -by a compatibility promise that prevents -changes that break existing programs, at least at the source code level -(programs may need to be recompiled occasionally to stay current). -If your proposal violates the Go 1 specification we cannot even entertain the -idea, regardless of its merit. -A future major release of Go may be incompatible with Go 1, but discussions -on that topic have only just begun and one thing is certain: -there will be very few such incompatibilities introduced in the process. -Moreover, the compatibility promise encourages us to provide an automatic path -forward for old programs to adapt should that situation arise. -

    - -

    -Even if your proposal is compatible with the Go 1 spec, it might -not be in the spirit of Go's design goals. -The article Go -at Google: Language Design in the Service of Software Engineering -explains Go's origins and the motivation behind its design. -

    - -

    Types

    - -

    -Is Go an object-oriented language?

    - -

    -Yes and no. Although Go has types and methods and allows an -object-oriented style of programming, there is no type hierarchy. -The concept of “interface” in Go provides a different approach that -we believe is easy to use and in some ways more general. There are -also ways to embed types in other types to provide something -analogous—but not identical—to subclassing. -Moreover, methods in Go are more general than in C++ or Java: -they can be defined for any sort of data, even built-in types such -as plain, “unboxed” integers. -They are not restricted to structs (classes). -

    - -

    -Also, the lack of a type hierarchy makes “objects” in Go feel much more -lightweight than in languages such as C++ or Java. -

    - -

    -How do I get dynamic dispatch of methods?

    - -

    -The only way to have dynamically dispatched methods is through an -interface. Methods on a struct or any other concrete type are always resolved statically. -

    - -

    -Why is there no type inheritance?

    -

    -Object-oriented programming, at least in the best-known languages, -involves too much discussion of the relationships between types, -relationships that often could be derived automatically. Go takes a -different approach. -

    - -

    -Rather than requiring the programmer to declare ahead of time that two -types are related, in Go a type automatically satisfies any interface -that specifies a subset of its methods. Besides reducing the -bookkeeping, this approach has real advantages. Types can satisfy -many interfaces at once, without the complexities of traditional -multiple inheritance. -Interfaces can be very lightweight—an interface with -one or even zero methods can express a useful concept. -Interfaces can be added after the fact if a new idea comes along -or for testing—without annotating the original types. -Because there are no explicit relationships between types -and interfaces, there is no type hierarchy to manage or discuss. -

    - -

    -It's possible to use these ideas to construct something analogous to -type-safe Unix pipes. For instance, see how fmt.Fprintf -enables formatted printing to any output, not just a file, or how the -bufio package can be completely separate from file I/O, -or how the image packages generate compressed -image files. All these ideas stem from a single interface -(io.Writer) representing a single method -(Write). And that's only scratching the surface. -Go's interfaces have a profound influence on how programs are structured. -

    - -

    -It takes some getting used to but this implicit style of type -dependency is one of the most productive things about Go. -

    - -

    -Why is len a function and not a method?

    -

    -We debated this issue but decided -implementing len and friends as functions was fine in practice and -didn't complicate questions about the interface (in the Go type sense) -of basic types. -

    - -

    -Why does Go not support overloading of methods and operators?

    -

    -Method dispatch is simplified if it doesn't need to do type matching as well. -Experience with other languages told us that having a variety of -methods with the same name but different signatures was occasionally useful -but that it could also be confusing and fragile in practice. Matching only by name -and requiring consistency in the types was a major simplifying decision -in Go's type system. -

    - -

    -Regarding operator overloading, it seems more a convenience than an absolute -requirement. Again, things are simpler without it. -

    - -

    -Why doesn't Go have "implements" declarations?

    - -

    -A Go type satisfies an interface by implementing the methods of that interface, -nothing more. This property allows interfaces to be defined and used without -needing to modify existing code. It enables a kind of -structural typing that -promotes separation of concerns and improves code re-use, and makes it easier -to build on patterns that emerge as the code develops. -The semantics of interfaces is one of the main reasons for Go's nimble, -lightweight feel. -

    - -

    -See the question on type inheritance for more detail. -

    - -

    -How can I guarantee my type satisfies an interface?

    - -

    -You can ask the compiler to check that the type T implements the -interface I by attempting an assignment using the zero value for -T or pointer to T, as appropriate: -

    - -
    -type T struct{}
    -var _ I = T{}       // Verify that T implements I.
    -var _ I = (*T)(nil) // Verify that *T implements I.
    -
    - -

    -If T (or *T, accordingly) doesn't implement -I, the mistake will be caught at compile time. -

    - -

    -If you wish the users of an interface to explicitly declare that they implement -it, you can add a method with a descriptive name to the interface's method set. -For example: -

    - -
    -type Fooer interface {
    -    Foo()
    -    ImplementsFooer()
    -}
    -
    - -

    -A type must then implement the ImplementsFooer method to be a -Fooer, clearly documenting the fact and announcing it in -go doc's output. -

    - -
    -type Bar struct{}
    -func (b Bar) ImplementsFooer() {}
    -func (b Bar) Foo() {}
    -
    - -

    -Most code doesn't make use of such constraints, since they limit the utility of -the interface idea. Sometimes, though, they're necessary to resolve ambiguities -among similar interfaces. -

    - -

    -Why doesn't type T satisfy the Equal interface?

    - -

    -Consider this simple interface to represent an object that can compare -itself with another value: -

    - -
    -type Equaler interface {
    -    Equal(Equaler) bool
    -}
    -
    - -

    -and this type, T: -

    - -
    -type T int
    -func (t T) Equal(u T) bool { return t == u } // does not satisfy Equaler
    -
    - -

    -Unlike the analogous situation in some polymorphic type systems, -T does not implement Equaler. -The argument type of T.Equal is T, -not literally the required type Equaler. -

    - -

    -In Go, the type system does not promote the argument of -Equal; that is the programmer's responsibility, as -illustrated by the type T2, which does implement -Equaler: -

    - -
    -type T2 int
    -func (t T2) Equal(u Equaler) bool { return t == u.(T2) }  // satisfies Equaler
    -
    - -

    -Even this isn't like other type systems, though, because in Go any -type that satisfies Equaler could be passed as the -argument to T2.Equal, and at run time we must -check that the argument is of type T2. -Some languages arrange to make that guarantee at compile time. -

    - -

    -A related example goes the other way: -

    - -
    -type Opener interface {
    -   Open() Reader
    -}
    -
    -func (t T3) Open() *os.File
    -
    - -

    -In Go, T3 does not satisfy Opener, -although it might in another language. -

    - -

    -While it is true that Go's type system does less for the programmer -in such cases, the lack of subtyping makes the rules about -interface satisfaction very easy to state: are the function's names -and signatures exactly those of the interface? -Go's rule is also easy to implement efficiently. -We feel these benefits offset the lack of -automatic type promotion. Should Go one day adopt some form of polymorphic -typing, we expect there would be a way to express the idea of these -examples and also have them be statically checked. -

    - -

    -Can I convert a []T to an []interface{}?

    - -

    -Not directly. -It is disallowed by the language specification because the two types -do not have the same representation in memory. -It is necessary to copy the elements individually to the destination -slice. This example converts a slice of int to a slice of -interface{}: -

    - -
    -t := []int{1, 2, 3, 4}
    -s := make([]interface{}, len(t))
    -for i, v := range t {
    -    s[i] = v
    -}
    -
    - -

    -Can I convert []T1 to []T2 if T1 and T2 have the same underlying type?

    - -This last line of this code sample does not compile. - -
    -type T1 int
    -type T2 int
    -var t1 T1
    -var x = T2(t1) // OK
    -var st1 []T1
    -var sx = ([]T2)(st1) // NOT OK
    -
    - -

    -In Go, types are closely tied to methods, in that every named type has -a (possibly empty) method set. -The general rule is that you can change the name of the type being -converted (and thus possibly change its method set) but you can't -change the name (and method set) of elements of a composite type. -Go requires you to be explicit about type conversions. -

    - -

    -Why is my nil error value not equal to nil? -

    - -

    -Under the covers, interfaces are implemented as two elements, a type T -and a value V. -V is a concrete value such as an int, -struct or pointer, never an interface itself, and has -type T. -For instance, if we store the int value 3 in an interface, -the resulting interface value has, schematically, -(T=int, V=3). -The value V is also known as the interface's -dynamic value, -since a given interface variable might hold different values V -(and corresponding types T) -during the execution of the program. -

    - -

    -An interface value is nil only if the V and T -are both unset, (T=nil, V is not set), -In particular, a nil interface will always hold a nil type. -If we store a nil pointer of type *int inside -an interface value, the inner type will be *int regardless of the value of the pointer: -(T=*int, V=nil). -Such an interface value will therefore be non-nil -even when the pointer value V inside is nil. -

    - -

    -This situation can be confusing, and arises when a nil value is -stored inside an interface value such as an error return: -

    - -
    -func returnsError() error {
    -	var p *MyError = nil
    -	if bad() {
    -		p = ErrBad
    -	}
    -	return p // Will always return a non-nil error.
    -}
    -
    - -

    -If all goes well, the function returns a nil p, -so the return value is an error interface -value holding (T=*MyError, V=nil). -This means that if the caller compares the returned error to nil, -it will always look as if there was an error even if nothing bad happened. -To return a proper nil error to the caller, -the function must return an explicit nil: -

    - - -
    -func returnsError() error {
    -	if bad() {
    -		return ErrBad
    -	}
    -	return nil
    -}
    -
    - -

    -It's a good idea for functions -that return errors always to use the error type in -their signature (as we did above) rather than a concrete type such -as *MyError, to help guarantee the error is -created correctly. As an example, -os.Open -returns an error even though, if not nil, -it's always of concrete type -*os.PathError. -

    - -

    -Similar situations to those described here can arise whenever interfaces are used. -Just keep in mind that if any concrete value -has been stored in the interface, the interface will not be nil. -For more information, see -The Laws of Reflection. -

    - - -

    -Why are there no untagged unions, as in C?

    - -

    -Untagged unions would violate Go's memory safety -guarantees. -

    - -

    -Why does Go not have variant types?

    - -

    -Variant types, also known as algebraic types, provide a way to specify -that a value might take one of a set of other types, but only those -types. A common example in systems programming would specify that an -error is, say, a network error, a security error or an application -error and allow the caller to discriminate the source of the problem -by examining the type of the error. Another example is a syntax tree -in which each node can be a different type: declaration, statement, -assignment and so on. -

    - -

    -We considered adding variant types to Go, but after discussion -decided to leave them out because they overlap in confusing ways -with interfaces. What would happen if the elements of a variant type -were themselves interfaces? -

    - -

    -Also, some of what variant types address is already covered by the -language. The error example is easy to express using an interface -value to hold the error and a type switch to discriminate cases. The -syntax tree example is also doable, although not as elegantly. -

    - -

    -Why does Go not have covariant result types?

    - -

    -Covariant result types would mean that an interface like -

    - -
    -type Copyable interface {
    -	Copy() interface{}
    -}
    -
    - -

    -would be satisfied by the method -

    - -
    -func (v Value) Copy() Value
    -
    - -

    because Value implements the empty interface. -In Go method types must match exactly, so Value does not -implement Copyable. -Go separates the notion of what a -type does—its methods—from the type's implementation. -If two methods return different types, they are not doing the same thing. -Programmers who want covariant result types are often trying to -express a type hierarchy through interfaces. -In Go it's more natural to have a clean separation between interface -and implementation. -

    - -

    Values

    - -

    -Why does Go not provide implicit numeric conversions?

    - -

    -The convenience of automatic conversion between numeric types in C is -outweighed by the confusion it causes. When is an expression unsigned? -How big is the value? Does it overflow? Is the result portable, independent -of the machine on which it executes? -It also complicates the compiler; “the usual arithmetic conversions” -are not easy to implement and inconsistent across architectures. -For reasons of portability, we decided to make things clear and straightforward -at the cost of some explicit conversions in the code. -The definition of constants in Go—arbitrary precision values free -of signedness and size annotations—ameliorates matters considerably, -though. -

    - -

    -A related detail is that, unlike in C, int and int64 -are distinct types even if int is a 64-bit type. The int -type is generic; if you care about how many bits an integer holds, Go -encourages you to be explicit. -

    - -

    -How do constants work in Go?

    - -

    -Although Go is strict about conversion between variables of different -numeric types, constants in the language are much more flexible. -Literal constants such as 23, 3.14159 -and math.Pi -occupy a sort of ideal number space, with arbitrary precision and -no overflow or underflow. -For instance, the value of math.Pi is specified to 63 places -in the source code, and constant expressions involving the value keep -precision beyond what a float64 could hold. -Only when the constant or constant expression is assigned to a -variable—a memory location in the program—does -it become a "computer" number with -the usual floating-point properties and precision. -

    - -

    -Also, -because they are just numbers, not typed values, constants in Go can be -used more freely than variables, thereby softening some of the awkwardness -around the strict conversion rules. -One can write expressions such as -

    - -
    -sqrt2 := math.Sqrt(2)
    -
    - -

    -without complaint from the compiler because the ideal number 2 -can be converted safely and accurately -to a float64 for the call to math.Sqrt. -

    - -

    -A blog post titled Constants -explores this topic in more detail. -

    - -

    -Why are maps built in?

    -

    -The same reason strings are: they are such a powerful and important data -structure that providing one excellent implementation with syntactic support -makes programming more pleasant. We believe that Go's implementation of maps -is strong enough that it will serve for the vast majority of uses. -If a specific application can benefit from a custom implementation, it's possible -to write one but it will not be as convenient syntactically; this seems a reasonable tradeoff. -

    - -

    -Why don't maps allow slices as keys?

    -

    -Map lookup requires an equality operator, which slices do not implement. -They don't implement equality because equality is not well defined on such types; -there are multiple considerations involving shallow vs. deep comparison, pointer vs. -value comparison, how to deal with recursive types, and so on. -We may revisit this issue—and implementing equality for slices -will not invalidate any existing programs—but without a clear idea of what -equality of slices should mean, it was simpler to leave it out for now. -

    - -

    -In Go 1, unlike prior releases, equality is defined for structs and arrays, so such -types can be used as map keys. Slices still do not have a definition of equality, though. -

    - -

    -Why are maps, slices, and channels references while arrays are values?

    -

    -There's a lot of history on that topic. Early on, maps and channels -were syntactically pointers and it was impossible to declare or use a -non-pointer instance. Also, we struggled with how arrays should work. -Eventually we decided that the strict separation of pointers and -values made the language harder to use. Changing these -types to act as references to the associated, shared data structures resolved -these issues. This change added some regrettable complexity to the -language but had a large effect on usability: Go became a more -productive, comfortable language when it was introduced. -

    - -

    Writing Code

    - -

    -How are libraries documented?

    - -

    -There is a program, godoc, written in Go, that extracts -package documentation from the source code and serves it as a web -page with links to declarations, files, and so on. -An instance is running at -golang.org/pkg/. -In fact, godoc implements the full site at -golang.org/. -

    - -

    -A godoc instance may be configured to provide rich, -interactive static analyses of symbols in the programs it displays; details are -listed here. -

    - -

    -For access to documentation from the command line, the -go tool has a -doc -subcommand that provides a textual interface to the same information. -

    - -

    -Is there a Go programming style guide?

    - -

    -There is no explicit style guide, although there is certainly -a recognizable "Go style". -

    - -

    -Go has established conventions to guide decisions around -naming, layout, and file organization. -The document Effective Go -contains some advice on these topics. -More directly, the program gofmt is a pretty-printer -whose purpose is to enforce layout rules; it replaces the usual -compendium of do's and don'ts that allows interpretation. -All the Go code in the repository, and the vast majority in the -open source world, has been run through gofmt. -

    - -

    -The document titled -Go Code Review Comments -is a collection of very short essays about details of Go idiom that are often -missed by programmers. -It is a handy reference for people doing code reviews for Go projects. -

    - -

    -How do I submit patches to the Go libraries?

    - -

    -The library sources are in the src directory of the repository. -If you want to make a significant change, please discuss on the mailing list before embarking. -

    - -

    -See the document -Contributing to the Go project -for more information about how to proceed. -

    - -

    -Why does "go get" use HTTPS when cloning a repository?

    - -

    -Companies often permit outgoing traffic only on the standard TCP ports 80 (HTTP) -and 443 (HTTPS), blocking outgoing traffic on other ports, including TCP port 9418 -(git) and TCP port 22 (SSH). -When using HTTPS instead of HTTP, git enforces certificate validation by -default, providing protection against man-in-the-middle, eavesdropping and tampering attacks. -The go get command therefore uses HTTPS for safety. -

    - -

    -Git can be configured to authenticate over HTTPS or to use SSH in place of HTTPS. -To authenticate over HTTPS, you can add a line -to the $HOME/.netrc file that git consults: -

    -
    -machine github.com login USERNAME password APIKEY
    -
    -

    -For GitHub accounts, the password can be a -personal access token. -

    - -

    -Git can also be configured to use SSH in place of HTTPS for URLs matching a given prefix. -For example, to use SSH for all GitHub access, -add these lines to your ~/.gitconfig: -

    -
    -[url "ssh://git@github.com/"]
    -	insteadOf = https://github.com/
    -
    - -

    -How should I manage package versions using "go get"?

    - -

    -Since the inception of the project, Go has had no explicit concept of package versions, -but that is changing. -Versioning is a source of significant complexity, especially in large code bases, -and it has taken some time to develop an -approach that works well at scale in a large enough -variety of situations to be appropriate to supply to all Go users. -

    - -

    -The Go 1.11 release adds new, experimental support -for package versioning to the go command, -in the form of Go modules. -For more information, see the Go 1.11 release notes -and the go command documentation. -

    - -

    -Regardless of the actual package management technology, -"go get" and the larger Go toolchain does provide isolation of -packages with different import paths. -For example, the standard library's html/template and text/template -coexist even though both are "package template". -This observation leads to some advice for package authors and package users. -

    - -

    -Packages intended for public use should try to maintain backwards compatibility as they evolve. -The Go 1 compatibility guidelines are a good reference here: -don't remove exported names, encourage tagged composite literals, and so on. -If different functionality is required, add a new name instead of changing an old one. -If a complete break is required, create a new package with a new import path. -

    - -

    -If you're using an externally supplied package and worry that it might change in -unexpected ways, but are not yet using Go modules, -the simplest solution is to copy it to your local repository. -This is the approach Google takes internally and is supported by the -go command through a technique called "vendoring". -This involves -storing a copy of the dependency under a new import path that identifies it as a local copy. -See the design -document for details. -

    - -

    Pointers and Allocation

    - -

    -When are function parameters passed by value?

    - -

    -As in all languages in the C family, everything in Go is passed by value. -That is, a function always gets a copy of the -thing being passed, as if there were an assignment statement assigning the -value to the parameter. For instance, passing an int value -to a function makes a copy of the int, and passing a pointer -value makes a copy of the pointer, but not the data it points to. -(See a later -section for a discussion of how this affects method receivers.) -

    - -

    -Map and slice values behave like pointers: they are descriptors that -contain pointers to the underlying map or slice data. Copying a map or -slice value doesn't copy the data it points to. Copying an interface value -makes a copy of the thing stored in the interface value. If the interface -value holds a struct, copying the interface value makes a copy of the -struct. If the interface value holds a pointer, copying the interface value -makes a copy of the pointer, but again not the data it points to. -

    - -

    -Note that this discussion is about the semantics of the operations. -Actual implementations may apply optimizations to avoid copying -as long as the optimizations do not change the semantics. -

    - -

    -When should I use a pointer to an interface?

    - -

    -Almost never. Pointers to interface values arise only in rare, tricky situations involving -disguising an interface value's type for delayed evaluation. -

    - -

    -It is a common mistake to pass a pointer to an interface value -to a function expecting an interface. The compiler will complain about this -error but the situation can still be confusing, because sometimes a -pointer -is necessary to satisfy an interface. -The insight is that although a pointer to a concrete type can satisfy -an interface, with one exception a pointer to an interface can never satisfy an interface. -

    - -

    -Consider the variable declaration, -

    - -
    -var w io.Writer
    -
    - -

    -The printing function fmt.Fprintf takes as its first argument -a value that satisfies io.Writer—something that implements -the canonical Write method. Thus we can write -

    - -
    -fmt.Fprintf(w, "hello, world\n")
    -
    - -

    -If however we pass the address of w, the program will not compile. -

    - -
    -fmt.Fprintf(&w, "hello, world\n") // Compile-time error.
    -
    - -

    -The one exception is that any value, even a pointer to an interface, can be assigned to -a variable of empty interface type (interface{}). -Even so, it's almost certainly a mistake if the value is a pointer to an interface; -the result can be confusing. -

    - -

    -Should I define methods on values or pointers?

    - -
    -func (s *MyStruct) pointerMethod() { } // method on pointer
    -func (s MyStruct)  valueMethod()   { } // method on value
    -
    - -

    -For programmers unaccustomed to pointers, the distinction between these -two examples can be confusing, but the situation is actually very simple. -When defining a method on a type, the receiver (s in the above -examples) behaves exactly as if it were an argument to the method. -Whether to define the receiver as a value or as a pointer is the same -question, then, as whether a function argument should be a value or -a pointer. -There are several considerations. -

    - -

    -First, and most important, does the method need to modify the -receiver? -If it does, the receiver must be a pointer. -(Slices and maps act as references, so their story is a little -more subtle, but for instance to change the length of a slice -in a method the receiver must still be a pointer.) -In the examples above, if pointerMethod modifies -the fields of s, -the caller will see those changes, but valueMethod -is called with a copy of the caller's argument (that's the definition -of passing a value), so changes it makes will be invisible to the caller. -

    - -

    -By the way, in Java method receivers are always pointers, -although their pointer nature is somewhat disguised -(and there is a proposal to add value receivers to the language). -It is the value receivers in Go that are unusual. -

    - -

    -Second is the consideration of efficiency. If the receiver is large, -a big struct for instance, it will be much cheaper to -use a pointer receiver. -

    - -

    -Next is consistency. If some of the methods of the type must have -pointer receivers, the rest should too, so the method set is -consistent regardless of how the type is used. -See the section on method sets -for details. -

    - -

    -For types such as basic types, slices, and small structs, -a value receiver is very cheap so unless the semantics of the method -requires a pointer, a value receiver is efficient and clear. -

    - - -

    -What's the difference between new and make?

    - -

    -In short: new allocates memory, while make initializes -the slice, map, and channel types. -

    - -

    -See the relevant section -of Effective Go for more details. -

    - -

    -What is the size of an int on a 64 bit machine?

    - -

    -The sizes of int and uint are implementation-specific -but the same as each other on a given platform. -For portability, code that relies on a particular -size of value should use an explicitly sized type, like int64. -On 32-bit machines the compilers use 32-bit integers by default, -while on 64-bit machines integers have 64 bits. -(Historically, this was not always true.) -

    - -

    -On the other hand, floating-point scalars and complex -types are always sized (there are no float or complex basic types), -because programmers should be aware of precision when using floating-point numbers. -The default type used for an (untyped) floating-point constant is float64. -Thus foo := 3.0 declares a variable foo -of type float64. -For a float32 variable initialized by an (untyped) constant, the variable type -must be specified explicitly in the variable declaration: -

    - -
    -var foo float32 = 3.0
    -
    - -

    -Alternatively, the constant must be given a type with a conversion as in -foo := float32(3.0). -

    - -

    -How do I know whether a variable is allocated on the heap or the stack?

    - -

    -From a correctness standpoint, you don't need to know. -Each variable in Go exists as long as there are references to it. -The storage location chosen by the implementation is irrelevant to the -semantics of the language. -

    - -

    -The storage location does have an effect on writing efficient programs. -When possible, the Go compilers will allocate variables that are -local to a function in that function's stack frame. However, if the -compiler cannot prove that the variable is not referenced after the -function returns, then the compiler must allocate the variable on the -garbage-collected heap to avoid dangling pointer errors. -Also, if a local variable is very large, it might make more sense -to store it on the heap rather than the stack. -

    - -

    -In the current compilers, if a variable has its address taken, that variable -is a candidate for allocation on the heap. However, a basic escape -analysis recognizes some cases when such variables will not -live past the return from the function and can reside on the stack. -

    - -

    -Why does my Go process use so much virtual memory?

    - -

    -The Go memory allocator reserves a large region of virtual memory as an arena -for allocations. This virtual memory is local to the specific Go process; the -reservation does not deprive other processes of memory. -

    - -

    -To find the amount of actual memory allocated to a Go process, use the Unix -top command and consult the RES (Linux) or -RSIZE (macOS) columns. - -

    - -

    Concurrency

    - -

    -What operations are atomic? What about mutexes?

    - -

    -A description of the atomicity of operations in Go can be found in -the Go Memory Model document. -

    - -

    -Low-level synchronization and atomic primitives are available in the -sync and -sync/atomic -packages. -These packages are good for simple tasks such as incrementing -reference counts or guaranteeing small-scale mutual exclusion. -

    - -

    -For higher-level operations, such as coordination among -concurrent servers, higher-level techniques can lead -to nicer programs, and Go supports this approach through -its goroutines and channels. -For instance, you can structure your program so that only one -goroutine at a time is ever responsible for a particular piece of data. -That approach is summarized by the original -Go proverb, -

    - -

    -Do not communicate by sharing memory. Instead, share memory by communicating. -

    - -

    -See the Share Memory By Communicating code walk -and its -associated article for a detailed discussion of this concept. -

    - -

    -Large concurrent programs are likely to borrow from both these toolkits. -

    - -

    -Why doesn't my program run faster with more CPUs?

    - -

    -Whether a program runs faster with more CPUs depends on the problem -it is solving. -The Go language provides concurrency primitives, such as goroutines -and channels, but concurrency only enables parallelism -when the underlying problem is intrinsically parallel. -Problems that are intrinsically sequential cannot be sped up by adding -more CPUs, while those that can be broken into pieces that can -execute in parallel can be sped up, sometimes dramatically. -

    - -

    -Sometimes adding more CPUs can slow a program down. -In practical terms, programs that spend more time -synchronizing or communicating than doing useful computation -may experience performance degradation when using -multiple OS threads. -This is because passing data between threads involves switching -contexts, which has significant cost, and that cost can increase -with more CPUs. -For instance, the prime sieve example -from the Go specification has no significant parallelism although it launches many -goroutines; increasing the number of threads (CPUs) is more likely to slow it down than -to speed it up. -

    - -

    -For more detail on this topic see the talk entitled -Concurrency -is not Parallelism. - -

    -How can I control the number of CPUs?

    - -

    -The number of CPUs available simultaneously to executing goroutines is -controlled by the GOMAXPROCS shell environment variable, -whose default value is the number of CPU cores available. -Programs with the potential for parallel execution should therefore -achieve it by default on a multiple-CPU machine. -To change the number of parallel CPUs to use, -set the environment variable or use the similarly-named -function -of the runtime package to configure the -run-time support to utilize a different number of threads. -Setting it to 1 eliminates the possibility of true parallelism, -forcing independent goroutines to take turns executing. -

    - -

    -The runtime can allocate more threads than the value -of GOMAXPROCS to service multiple outstanding -I/O requests. -GOMAXPROCS only affects how many goroutines -can actually execute at once; arbitrarily more may be blocked -in system calls. -

    - -

    -Go's goroutine scheduler is not as good as it needs to be, although it -has improved over time. -In the future, it may better optimize its use of OS threads. -For now, if there are performance issues, -setting GOMAXPROCS on a per-application basis may help. -

    - - -

    -Why is there no goroutine ID?

    - -

    -Goroutines do not have names; they are just anonymous workers. -They expose no unique identifier, name, or data structure to the programmer. -Some people are surprised by this, expecting the go -statement to return some item that can be used to access and control -the goroutine later. -

    - -

    -The fundamental reason goroutines are anonymous is so that -the full Go language is available when programming concurrent code. -By contrast, the usage patterns that develop when threads and goroutines are -named can restrict what a library using them can do. -

    - -

    -Here is an illustration of the difficulties. -Once one names a goroutine and constructs a model around -it, it becomes special, and one is tempted to associate all computation -with that goroutine, ignoring the possibility -of using multiple, possibly shared goroutines for the processing. -If the net/http package associated per-request -state with a goroutine, -clients would be unable to use more goroutines -when serving a request. -

    - -

    -Moreover, experience with libraries such as those for graphics systems -that require all processing to occur on the "main thread" -has shown how awkward and limiting the approach can be when -deployed in a concurrent language. -The very existence of a special thread or goroutine forces -the programmer to distort the program to avoid crashes -and other problems caused by inadvertently operating -on the wrong thread. -

    - -

    -For those cases where a particular goroutine is truly special, -the language provides features such as channels that can be -used in flexible ways to interact with it. -

    - -

    Functions and Methods

    - -

    -Why do T and *T have different method sets?

    - -

    -As the Go specification says, -the method set of a type T consists of all methods -with receiver type T, -while that of the corresponding pointer -type *T consists of all methods with receiver *T or -T. -That means the method set of *T -includes that of T, -but not the reverse. -

    - -

    -This distinction arises because -if an interface value contains a pointer *T, -a method call can obtain a value by dereferencing the pointer, -but if an interface value contains a value T, -there is no safe way for a method call to obtain a pointer. -(Doing so would allow a method to modify the contents of -the value inside the interface, which is not permitted by -the language specification.) -

    - -

    -Even in cases where the compiler could take the address of a value -to pass to the method, if the method modifies the value the changes -will be lost in the caller. -As an example, if the Write method of -bytes.Buffer -used a value receiver rather than a pointer, -this code: -

    - -
    -var buf bytes.Buffer
    -io.Copy(buf, os.Stdin)
    -
    - -

    -would copy standard input into a copy of buf, -not into buf itself. -This is almost never the desired behavior. -

    - -

    -What happens with closures running as goroutines?

    - -

    -Some confusion may arise when using closures with concurrency. -Consider the following program: -

    - -
    -func main() {
    -    done := make(chan bool)
    -
    -    values := []string{"a", "b", "c"}
    -    for _, v := range values {
    -        go func() {
    -            fmt.Println(v)
    -            done <- true
    -        }()
    -    }
    -
    -    // wait for all goroutines to complete before exiting
    -    for _ = range values {
    -        <-done
    -    }
    -}
    -
    - -

    -One might mistakenly expect to see a, b, c as the output. -What you'll probably see instead is c, c, c. This is because -each iteration of the loop uses the same instance of the variable v, so -each closure shares that single variable. When the closure runs, it prints the -value of v at the time fmt.Println is executed, -but v may have been modified since the goroutine was launched. -To help detect this and other problems before they happen, run -go vet. -

    - -

    -To bind the current value of v to each closure as it is launched, one -must modify the inner loop to create a new variable each iteration. -One way is to pass the variable as an argument to the closure: -

    - -
    -    for _, v := range values {
    -        go func(u string) {
    -            fmt.Println(u)
    -            done <- true
    -        }(v)
    -    }
    -
    - -

    -In this example, the value of v is passed as an argument to the -anonymous function. That value is then accessible inside the function as -the variable u. -

    - -

    -Even easier is just to create a new variable, using a declaration style that may -seem odd but works fine in Go: -

    - -
    -    for _, v := range values {
    -        v := v // create a new 'v'.
    -        go func() {
    -            fmt.Println(v)
    -            done <- true
    -        }()
    -    }
    -
    - -

    -This behavior of the language, not defining a new variable for -each iteration, may have been a mistake in retrospect. -It may be addressed in a later version but, for compatibility, -cannot change in Go version 1. -

    - -

    Control flow

    - -

    -Why does Go not have the ?: operator?

    - -

    -There is no ternary testing operation in Go. -You may use the following to achieve the same -result: -

    - -
    -if expr {
    -    n = trueVal
    -} else {
    -    n = falseVal
    -}
    -
    - -

    -The reason ?: is absent from Go is that the language's designers -had seen the operation used too often to create impenetrably complex expressions. -The if-else form, although longer, -is unquestionably clearer. -A language needs only one conditional control flow construct. -

    - -

    Packages and Testing

    - -

    -How do I create a multifile package?

    - -

    -Put all the source files for the package in a directory by themselves. -Source files can refer to items from different files at will; there is -no need for forward declarations or a header file. -

    - -

    -Other than being split into multiple files, the package will compile and test -just like a single-file package. -

    - -

    -How do I write a unit test?

    - -

    -Create a new file ending in _test.go in the same directory -as your package sources. Inside that file, import "testing" -and write functions of the form -

    - -
    -func TestFoo(t *testing.T) {
    -    ...
    -}
    -
    - -

    -Run go test in that directory. -That script finds the Test functions, -builds a test binary, and runs it. -

    - -

    See the How to Write Go Code document, -the testing package -and the go test subcommand for more details. -

    - -

    -Where is my favorite helper function for testing?

    - -

    -Go's standard testing package makes it easy to write unit tests, but it lacks -features provided in other language's testing frameworks such as assertion functions. -An earlier section of this document explained why Go -doesn't have assertions, and -the same arguments apply to the use of assert in tests. -Proper error handling means letting other tests run after one has failed, so -that the person debugging the failure gets a complete picture of what is -wrong. It is more useful for a test to report that -isPrime gives the wrong answer for 2, 3, 5, and 7 (or for -2, 4, 8, and 16) than to report that isPrime gives the wrong -answer for 2 and therefore no more tests were run. The programmer who -triggers the test failure may not be familiar with the code that fails. -Time invested writing a good error message now pays off later when the -test breaks. -

    - -

    -A related point is that testing frameworks tend to develop into mini-languages -of their own, with conditionals and controls and printing mechanisms, -but Go already has all those capabilities; why recreate them? -We'd rather write tests in Go; it's one fewer language to learn and the -approach keeps the tests straightforward and easy to understand. -

    - -

    -If the amount of extra code required to write -good errors seems repetitive and overwhelming, the test might work better if -table-driven, iterating over a list of inputs and outputs defined -in a data structure (Go has excellent support for data structure literals). -The work to write a good test and good error messages will then be amortized over many -test cases. The standard Go library is full of illustrative examples, such as in -the formatting tests for the fmt package. -

    - -

    -Why isn't X in the standard library?

    - -

    -The standard library's purpose is to support the runtime, connect to -the operating system, and provide key functionality that many Go -programs require, such as formatted I/O and networking. -It also contains elements important for web programming, including -cryptography and support for standards like HTTP, JSON, and XML. -

    - -

    -There is no clear criterion that defines what is included because for -a long time, this was the only Go library. -There are criteria that define what gets added today, however. -

    - -

    -New additions to the standard library are rare and the bar for -inclusion is high. -Code included in the standard library bears a large ongoing maintenance cost -(often borne by those other than the original author), -is subject to the Go 1 compatibility promise -(blocking fixes to any flaws in the API), -and is subject to the Go -release schedule, -preventing bug fixes from being available to users quickly. -

    - -

    -Most new code should live outside of the standard library and be accessible -via the go tool's -go get command. -Such code can have its own maintainers, release cycle, -and compatibility guarantees. -Users can find packages and read their documentation at -godoc.org. -

    - -

    -Although there are pieces in the standard library that don't really belong, -such as log/syslog, we continue to maintain everything in the -library because of the Go 1 compatibility promise. -But we encourage most new code to live elsewhere. -

    - -

    Implementation

    - -

    -What compiler technology is used to build the compilers?

    - -

    -There are several production compilers for Go, and a number of others -in development for various platforms. -

    - -

    -The default compiler, gc, is included with the -Go distribution as part of the support for the go -command. -Gc was originally written in C -because of the difficulties of bootstrapping—you'd need a Go compiler to -set up a Go environment. -But things have advanced and since the Go 1.5 release the compiler has been -a Go program. -The compiler was converted from C to Go using automatic translation tools, as -described in this design document -and talk. -Thus the compiler is now "self-hosting", which means we needed to face -the bootstrapping problem. -The solution is to have a working Go installation already in place, -just as one normally has with a working C installation. -The story of how to bring up a new Go environment from source -is described here and -here. -

    - -

    -Gc is written in Go with a recursive descent parser -and uses a custom loader, also written in Go but -based on the Plan 9 loader, to generate ELF/Mach-O/PE binaries. -

    - -

    -At the beginning of the project we considered using LLVM for -gc but decided it was too large and slow to meet -our performance goals. -More important in retrospect, starting with LLVM would have made it -harder to introduce some of the ABI and related changes, such as -stack management, that Go requires but are not part of the standard -C setup. -A new LLVM implementation -is starting to come together now, however. -

    - -

    -The Gccgo compiler is a front end written in C++ -with a recursive descent parser coupled to the -standard GCC back end. -

    - -

    -Go turned out to be a fine language in which to implement a Go compiler, -although that was not its original goal. -Not being self-hosting from the beginning allowed Go's design to -concentrate on its original use case, which was networked servers. -Had we decided Go should compile itself early on, we might have -ended up with a language targeted more for compiler construction, -which is a worthy goal but not the one we had initially. -

    - -

    -Although gc does not use them (yet?), a native lexer and -parser are available in the go package -and there is also a native type checker. -

    - -

    -How is the run-time support implemented?

    - -

    -Again due to bootstrapping issues, the run-time code was originally written mostly in C (with a -tiny bit of assembler) but it has since been translated to Go -(except for some assembler bits). -Gccgo's run-time support uses glibc. -The gccgo compiler implements goroutines using -a technique called segmented stacks, -supported by recent modifications to the gold linker. -Gollvm similarly is built on the corresponding -LLVM infrastructure. -

    - -

    -Why is my trivial program such a large binary?

    - -

    -The linker in the gc toolchain -creates statically-linked binaries by default. -All Go binaries therefore include the Go -runtime, along with the run-time type information necessary to support dynamic -type checks, reflection, and even panic-time stack traces. -

    - -

    -A simple C "hello, world" program compiled and linked statically using -gcc on Linux is around 750 kB, including an implementation of -printf. -An equivalent Go program using -fmt.Printf weighs a couple of megabytes, but that includes -more powerful run-time support and type and debugging information. -

    - -

    -A Go program compiled with gc can be linked with -the -ldflags=-w flag to disable DWARF generation, -removing debugging information from the binary but with no -other loss of functionality. -This can reduce the binary size substantially. -

    - -

    -Can I stop these complaints about my unused variable/import?

    - -

    -The presence of an unused variable may indicate a bug, while -unused imports just slow down compilation, -an effect that can become substantial as a program accumulates -code and programmers over time. -For these reasons, Go refuses to compile programs with unused -variables or imports, -trading short-term convenience for long-term build speed and -program clarity. -

    - -

    -Still, when developing code, it's common to create these situations -temporarily and it can be annoying to have to edit them out before the -program will compile. -

    - -

    -Some have asked for a compiler option to turn those checks off -or at least reduce them to warnings. -Such an option has not been added, though, -because compiler options should not affect the semantics of the -language and because the Go compiler does not report warnings, only -errors that prevent compilation. -

    - -

    -There are two reasons for having no warnings. First, if it's worth -complaining about, it's worth fixing in the code. (And if it's not -worth fixing, it's not worth mentioning.) Second, having the compiler -generate warnings encourages the implementation to warn about weak -cases that can make compilation noisy, masking real errors that -should be fixed. -

    - -

    -It's easy to address the situation, though. Use the blank identifier -to let unused things persist while you're developing. -

    - -
    -import "unused"
    -
    -// This declaration marks the import as used by referencing an
    -// item from the package.
    -var _ = unused.Item  // TODO: Delete before committing!
    -
    -func main() {
    -    debugData := debug.Profile()
    -    _ = debugData // Used only during debugging.
    -    ....
    -}
    -
    - -

    -Nowadays, most Go programmers use a tool, -goimports, -which automatically rewrites a Go source file to have the correct imports, -eliminating the unused imports issue in practice. -This program is easily connected to most editors to run automatically when a Go source file is written. -

    - -

    -Why does my virus-scanning software think my Go distribution or compiled binary is infected?

    - -

    -This is a common occurrence, especially on Windows machines, and is almost always a false positive. -Commercial virus scanning programs are often confused by the structure of Go binaries, which -they don't see as often as those compiled from other languages. -

    - -

    -If you've just installed the Go distribution and the system reports it is infected, that's certainly a mistake. -To be really thorough, you can verify the download by comparing the checksum with those on the -downloads page. -

    - -

    -In any case, if you believe the report is in error, please report a bug to the supplier of your virus scanner. -Maybe in time virus scanners can learn to understand Go programs. -

    - -

    Performance

    - -

    -Why does Go perform badly on benchmark X?

    - -

    -One of Go's design goals is to approach the performance of C for comparable -programs, yet on some benchmarks it does quite poorly, including several -in golang.org/x/exp/shootout. -The slowest depend on libraries for which versions of comparable performance -are not available in Go. -For instance, pidigits.go -depends on a multi-precision math package, and the C -versions, unlike Go's, use GMP (which is -written in optimized assembler). -Benchmarks that depend on regular expressions -(regex-dna.go, -for instance) are essentially comparing Go's native regexp package to -mature, highly optimized regular expression libraries like PCRE. -

    - -

    -Benchmark games are won by extensive tuning and the Go versions of most -of the benchmarks need attention. If you measure comparable C -and Go programs -(reverse-complement.go -is one example), you'll see the two languages are much closer in raw performance -than this suite would indicate. -

    - -

    -Still, there is room for improvement. The compilers are good but could be -better, many libraries need major performance work, and the garbage collector -isn't fast enough yet. (Even if it were, taking care not to generate unnecessary -garbage can have a huge effect.) -

    - -

    -In any case, Go can often be very competitive. -There has been significant improvement in the performance of many programs -as the language and tools have developed. -See the blog post about -profiling -Go programs for an informative example. - -

    Changes from C

    - -

    -Why is the syntax so different from C?

    -

    -Other than declaration syntax, the differences are not major and stem -from two desires. First, the syntax should feel light, without too -many mandatory keywords, repetition, or arcana. Second, the language -has been designed to be easy to analyze -and can be parsed without a symbol table. This makes it much easier -to build tools such as debuggers, dependency analyzers, automated -documentation extractors, IDE plug-ins, and so on. C and its -descendants are notoriously difficult in this regard. -

    - -

    -Why are declarations backwards?

    -

    -They're only backwards if you're used to C. In C, the notion is that a -variable is declared like an expression denoting its type, which is a -nice idea, but the type and expression grammars don't mix very well and -the results can be confusing; consider function pointers. Go mostly -separates expression and type syntax and that simplifies things (using -prefix * for pointers is an exception that proves the rule). In C, -the declaration -

    -
    -    int* a, b;
    -
    -

    -declares a to be a pointer but not b; in Go -

    -
    -    var a, b *int
    -
    -

    -declares both to be pointers. This is clearer and more regular. -Also, the := short declaration form argues that a full variable -declaration should present the same order as := so -

    -
    -    var a uint64 = 1
    -
    -

    -has the same effect as -

    -
    -    a := uint64(1)
    -
    -

    -Parsing is also simplified by having a distinct grammar for types that -is not just the expression grammar; keywords such as func -and chan keep things clear. -

    - -

    -See the article about -Go's Declaration Syntax -for more details. -

    - -

    -Why is there no pointer arithmetic?

    -

    -Safety. Without pointer arithmetic it's possible to create a -language that can never derive an illegal address that succeeds -incorrectly. Compiler and hardware technology have advanced to the -point where a loop using array indices can be as efficient as a loop -using pointer arithmetic. Also, the lack of pointer arithmetic can -simplify the implementation of the garbage collector. -

    - -

    -Why are ++ and -- statements and not expressions? And why postfix, not prefix?

    -

    -Without pointer arithmetic, the convenience value of pre- and postfix -increment operators drops. By removing them from the expression -hierarchy altogether, expression syntax is simplified and the messy -issues around order of evaluation of ++ and -- -(consider f(i++) and p[i] = q[++i]) -are eliminated as well. The simplification is -significant. As for postfix vs. prefix, either would work fine but -the postfix version is more traditional; insistence on prefix arose -with the STL, a library for a language whose name contains, ironically, a -postfix increment. -

    - -

    -Why are there braces but no semicolons? And why can't I put the opening -brace on the next line?

    -

    -Go uses brace brackets for statement grouping, a syntax familiar to -programmers who have worked with any language in the C family. -Semicolons, however, are for parsers, not for people, and we wanted to -eliminate them as much as possible. To achieve this goal, Go borrows -a trick from BCPL: the semicolons that separate statements are in the -formal grammar but are injected automatically, without lookahead, by -the lexer at the end of any line that could be the end of a statement. -This works very well in practice but has the effect that it forces a -brace style. For instance, the opening brace of a function cannot -appear on a line by itself. -

    - -

    -Some have argued that the lexer should do lookahead to permit the -brace to live on the next line. We disagree. Since Go code is meant -to be formatted automatically by -gofmt, -some style must be chosen. That style may differ from what -you've used in C or Java, but Go is a different language and -gofmt's style is as good as any other. More -important—much more important—the advantages of a single, -programmatically mandated format for all Go programs greatly outweigh -any perceived disadvantages of the particular style. -Note too that Go's style means that an interactive implementation of -Go can use the standard syntax one line at a time without special rules. -

    - -

    -Why do garbage collection? Won't it be too expensive?

    -

    -One of the biggest sources of bookkeeping in systems programs is -managing the lifetimes of allocated objects. -In languages such as C in which it is done manually, -it can consume a significant amount of programmer time and is -often the cause of pernicious bugs. -Even in languages like C++ or Rust that provide mechanisms -to assist, those mechanisms can have a significant effect on the -design of the software, often adding programming overhead -of its own. -We felt it was critical to eliminate such -programmer overheads, and advances in garbage collection -technology in the last few years gave us confidence that it -could be implemented cheaply enough, and with low enough -latency, that it could be a viable approach for networked -systems. -

    - -

    -Much of the difficulty of concurrent programming -has its roots in the object lifetime problem: -as objects get passed among threads it becomes cumbersome -to guarantee they become freed safely. -Automatic garbage collection makes concurrent code far easier to write. -Of course, implementing garbage collection in a concurrent environment is -itself a challenge, but meeting it once rather than in every -program helps everyone. -

    - -

    -Finally, concurrency aside, garbage collection makes interfaces -simpler because they don't need to specify how memory is managed across them. -

    - -

    -This is not to say that the recent work in languages -like Rust that bring new ideas to the problem of managing -resources is misguided; we encourage this work and are excited to see -how it evolves. -But Go takes a more traditional approach by addressing -object lifetimes through -garbage collection, and garbage collection alone. -

    - -

    -The current implementation is a mark-and-sweep collector. -If the machine is a multiprocessor, the collector runs on a separate CPU -core in parallel with the main program. -Major work on the collector in recent years has reduced pause times -often to the sub-millisecond range, even for large heaps, -all but eliminating one of the major objections to garbage collection -in networked servers. -Work continues to refine the algorithm, reduce overhead and -latency further, and to explore new approaches. -The 2018 -ISMM keynote -by Rick Hudson of the Go team -describes the progress so far and suggests some future approaches. -

    - -

    -On the topic of performance, keep in mind that Go gives the programmer -considerable control over memory layout and allocation, much more than -is typical in garbage-collected languages. A careful programmer can reduce -the garbage collection overhead dramatically by using the language well; -see the article about -profiling -Go programs for a worked example, including a demonstration of Go's -profiling tools. -

    diff --git a/doc/gopher/README b/doc/gopher/README deleted file mode 100644 index d4ca8a1c2d..0000000000 --- a/doc/gopher/README +++ /dev/null @@ -1,3 +0,0 @@ -The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) -The design is licensed under the Creative Commons 3.0 Attributions license. -Read this article for more details: https://blog.golang.org/gopher diff --git a/doc/gopher/appenginegopher.jpg b/doc/gopher/appenginegopher.jpg deleted file mode 100644 index 0a64306666a6f9506c551760718cd3af71cd0e69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135882 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%0A_-+~oW7!>URJ7XA?b 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 IIQ{=k03uTyMgRZ+ diff --git a/doc/gopher/appenginegophercolor.jpg b/doc/gopher/appenginegophercolor.jpg deleted file mode 100644 index 68795a99b3d84712f638ef577789655d1e2dc7ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162023 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%0DIeEoa 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%0DCI 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 diff --git a/doc/gopher/appenginelogo.gif b/doc/gopher/appenginelogo.gif deleted file mode 100644 index 46b3c1eeb8884cf9b8cb7d8e1d698dab8b6b2c80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2105 zcmZ?wbhEHb)Mt=m*#4gZ3|tr(Iv5zvFt{)JsIv! zW_UM`;oUnWB_#%iGzNxM3=Ho;bXpoi=qd*PcOZdPp$w~5G0c0%@Q#7uoj=3>P=^1j z82^@Hbb!E_jx!7$XIwhYbab3K z(*cSk7mza|f3kqo;pP4>0CwtzVIg?@LOrM!EXHK4cck*3^$#*>`-<>@9?%kQ- z5C=JvVbwf_cc73C4P6zwYM%eQRjU|QtqNVWYSp}X@8-Q@nD@?q-n)78-o0D(|Nm}K zpvUfJ*u9G3KPaSQV|T~yUKRR(_il#WyJL6n-o0wo|5g7PR{alM^?%hF22ikq0vH_D zpfm#Z!lp5Wl7^=z$eEsZ?@nd_g*4ddckhDa?%thz_wHR# z3S#gCg)2C5yz^%O1u!_QL1}89KghlF-o1Or@a~=eyLTYgJ5X9-0EH_!ae$IiXeh{; zq5nZ?YE|feu+#tlXZZggB=rCPf5rdYey$c z6p|_x0&)`b6f70eit=+6(hV6Df3h$*urV;`fU*uK7cp@BXZX)4~+x)F4=xM@zc`{XJ0H;N}7IT($Sd@MGMn+rr#`W|Nnota3hD( zt?Ks*BL0GjYHdv}DZiu~U8YWW)H!8;bGcjcQ&rP;DN*ADrvP)8f^b*KW`-a9ULAJ~ zuRAq`9E@{4vq!{DwBYaM-cp^?@Cm*ZovDhxX=e-$$D{@*#hHiN2s+lj;(XGlHNSJ} z1Az{X)MGKlf`&)Z)>j_8(Bs16)FRpUlXZzg!`Uy7ljQGS4JdkN;2c?;Rl6m^x%jKc zWks2V?U!3RCS2?FS*97HD!6ookWjlxYM8j-Op7pA7jvaWr(|a;2nA1Dm69~GU9<4X z1J_koR68X9PcWNfeMt2CELWjxTVHtUbY@O)nU-f2peD;(l(>X#;;M_X%f-4n7B1(? zR=HlocK2YGqy4#3AJ?U>QrS!F`7SLCNwc}~P*3OOvrxx(AqOWGFg1pTFP`R_am=ZC z#>HEkm`%OJRqvWqpUC*1vM6O+djgZRabS^kKnu5N+f#?AP2#h6vqn~(P)K!%4x08u zs3dmD86I%~aQaJO7-{KGMeNPDNR|&52Wru(P9*Om~MvWx}$feaay}<5GVqJTQKHC_p0Q%!m0LE(gByD>bzgvMYsd z`Q~rl{c!7jpEG-06tcO>7Dq@5ah0$q8FLgp^hrAt@JK)@ByhgNJD<`!Jc948os|`I zafo()eKF-&Oxw&8xAc}9PEi(Y7PuH8%B$EWk)Tnea!tW^(+v^hcLvR=WsY?r39$y8 zr5x^CE`Gf@<=#}a%e`E4JzG*z)I5UIN(Co!sy2rx&a$4H+SD=M@bBRst(g&SQ63?C zA|`2-awZ+KU&4D_eg54&X@M0onlGfhpGul!s!i333Q&`o8*!nW>F)B2vMab;Ud%rf znW7Tj&x%NYj<;Sp7^W><5t3%J#Y7Vsxyt~#qc5I1sn{+s7r_7YsyP{Smm;I|+wc>SD_^kp)Mh0sDrIxD2 diff --git a/doc/gopher/biplane.jpg b/doc/gopher/biplane.jpg deleted file mode 100644 index d5e666f963281db3fa1f05df6c24bdf375e1c2f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203420 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𝔷L_ALl)pD~{>|_OYd`#Fc*x(e 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≀T)06s=)ozaluHpi)Mzeb%IjZQ0N3 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 diff --git a/doc/gopher/bumper.png b/doc/gopher/bumper.png deleted file mode 100644 index b357cdf47d5ba30da0f54b853fbf4afa9429790d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276215 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
    XYmDSoR8~}< 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

    J0DcnYic%ztPmKs<-VPM=EwbiDaL~ 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 diff --git a/doc/gopher/bumper192x108.png b/doc/gopher/bumper192x108.png deleted file mode 100644 index 925474e7638d7fc18bcf4accf53eeaec3d6dc447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8432 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 z 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%0D)eLxRsA0uCe%Ltd&p(^KgQ}g-p!UOw7Xmk4 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 diff --git a/doc/gopher/gophercolor.png b/doc/gopher/gophercolor.png deleted file mode 100644 index b5f8d01ff6a06b1beaeb11ad50d472f56dff7cd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169406 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

  • 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 E07k20HUIzs diff --git a/doc/gopher/help.png b/doc/gopher/help.png deleted file mode 100644 index 6ee523898d7f1bacb4264b949bf92e8b6c5fa01a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5729 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 N!PC{xWt~$(69D9x80P>0 diff --git a/doc/gopher/modelsheet.jpg b/doc/gopher/modelsheet.jpg deleted file mode 100644 index c31e35a6df619070bb4ba182557ca1cea9f2d78b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85880 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


    #Ha`rzq=Yc2m7(qn2j zRHSD*s&cNlzjAqga+}|olludM{I0Igxp3&Mum+3lu4*1$5y2&Ak^*G+iGdaY{xx`X zDc<9w+LjyN)^S9yOp`guy>oez`^BcWw>!AB{En~p{r4v-lIPI6j4B2Lk)DNnBKo_Z zcG{ekjTBzhd;T=jj!I6prOns#{u)jf*uKi8{UOut@OLNV=az76mCoe*vfxp3;^pQ0 zDh_|vcba@U>Wq=EWZ#{Cue%t}T-*B8(NCuRr@i<#nY!?w{gY) z2ASFh&2Yokw4OQ*ZpUpjI8-O|Fqe@)J?N4eKV=JTQT94ME(XA*?m2q&OeL)^YHxiKUZJHyxhnwy~$!> z(3w?>t5)&Z>^~Xy@x!vp#pmNc_tYg{SY4c9fAR5`YmSGaR-~@nF=g_%Z>!hDOpSDN z%=@x>Ew|4V-BQt>SnqrugTSX#CNh624~trLb@GF|q4i~ZLZu(~-LBmCpTTYFY`+z) z3tLkj#W!=DTCTMAWY(51p{M>cOtUkdp8fo7w1?^`YOX3d!^4|fKB z)F}P2KmTo!#pV4bHOJE{OVy^XJfAPT`owCT*4HmrY9F7F(069*gFQ)kj#gSdv-^LZ z>bE&;^NGE^fpwB46_!^0G*lSP_@P{E^|zoF7Gt{xeMd z@X&7Ue+J9)YL?HsdjduK{NFR?`+4kGfAj=j>RvbP<8Al1oj%>?z2*GRQ{9|_x~We2 zwvsASbe)`E%u|i|n8azH@bO3g;SU=F4sGH8c}mwlXj@}T$=<1vH<=4HRv({#|1#3!_@YPE~TQ2m8yDVzS;2Wp8s5W__zPh6a1QY+~%wk z`L$#*bI07XV8Osi|IA;u z67j$ow^LjHE_5i1o9~>s_V_c|))%_GmkOgMg!FCsen0Jaeg7NXoZj%P8^c7Xuvhc;dillrb0#UOssI+9@?AhqA`N0XPHr}9G+hOoKceicgSNU1%^^kT^NTk`dQ zRqHN}zg2AuZ#4RUs;dl)cG=K$`r5L&{#yWq-Hw@?9~POgv-k4jNC}3Prc)vU>1=s2>04wo2`KRg6Qupnuzu2`gh%vR!+lx8sKSRQ~xyvhCPC4)fKH@F%&0V3) zxBKBFFNvhBp!2}fEN1KL?)|Xq(M7c<91Cqfu%4Z1eQC+$m}hncpK6bu(fbt{vCgt6 zErmBA`>caX-aY%X*KLkId#~|I{Q5@!r`LXM+n%rVH+hQg%e=Ga78I7PU%J<_cIl%# z89%t}ZQ|E06rHlj^GT!Z-GrbOS02ZAzBsk!?8ml$@%z_SMt@fP`lR#if_fi=ubfH? zE;M?{%Ri_)d2VC!3f+fV4+<98i5%|GTUK?g;R5rYf@9Lh`s}W}s&jeUvD>ybd3W$b zlb7)_fvQ?d%VgYNzy9%{Ju*tsi9uxH``~?CTdF<5Vw6chtS%pw=aiNA3z5udK@# z{xVvmaPolEignNT=kFFO@Mg%ky3$lS$!t&atiS6*@05Kz%C&vn!M?{E4@K{el+#Rd z3o5_UH@ocndHwoxu9*clU*wl+xt$Q5GO126sw7HwyG{S=bGA?9@4OO>vF5nmtn@qoGpO4xe#+gM(xmh@z~TP>wvyjz4}V{%;%ly%5M5vXFHrh2%ZlZ} zf&G%3QyG2sfI8!|&FcSO`VPKq@|5U%$iO0~5D)tbDd#uK+}xaY%HrCp^#`wSEjsGT z`1-zPE64ZSx0z#{Pp!SZ?%s{)!nDmFvT8yWZFt3AqjYW0-uzW7`cj^X9ckVuV*2{w zoaE2OpLW!Br(e=ZnwM8vqOoU%r)kv3CzYm|@taR~r2Qy9G_T?^>(sN&@h^*REzwa7 zYmyW(2{h#3ti7_Fty1)`wYJ(u$fY)1PI!gY}tL5@Jgw7bWyG>|SeG zKk?t2)WoRcTnZb5 zK>K>Dy&=X$zpZnRPuF^=BLBHRF2P%SwWVr`@RY<|ANe@!)-v#)teC&a$?%=olDyOZ z3Lgi%bx*y!+wI)Jz=njSjY~7Ko<@q!KFa2^<^1V>eV0zr$2LWW-b6nvx+;=TnNv~K zvFTS11OIiN{|ryPGj8<+)dpSg%(*ggrzKz9lK1h=6ZkUja{aMS@8x)JuU50(G>GBb zWeu)C54FV|OueV4U3`0b!jpT8wG%o1ti7~o=g#Q%9o3Rf8#-CzuQ;7LbNGmHct?Ed zk2;>V%3`-GHQQI-<)5~xD`m=t?bMy5_HZt(HI^@4sk+I_oO*mNDXUoW%zp8TAv*^>g zN*khA8>CHY5s0{A8ro~IUho@J>&FCxU9Uc$>G|Yx{j6fI^1J{BhZL`W7ZwV%#Qi&^I}+KJp-e)~92 zPW~ev1wQGH9}Tbgf`Hd8tAZmj4X% zx3OF?sjfb*a#Z?1gQoQt+ilCfob!El|5Ps18_!C)d6zb8YdftAjgZ^REF2g8+-U3b zr=~&&1p>8q9eH)RiEDfCw^n7<_8U5Hf7|%$yq@Rz=j`S6qDO)YJUAm&XIv0}*F2X$ zpZDAQx!rD`#n-T`$=J$JedSH&jg(8*BfN@|U6mF*JR*MZUxbn6)ZLF3TsObR@rSCj^Yil@pTt&&eEPQPSL&71dFM{OR#X&R z!7Kjgx6gwRrGF=MKYTfN{fYgVuY1i6Urqkcuw+TE3)7tN6*p>rU0+u&?VHEB&}nH3 z3*S7^!@r}aP7{1-!EoivTII)H<$eEY1E``@z^t zHHm4e_HL>7+hP)9xhHPU-(P%de;G@`g2E^FVn2H{oaHm!CSld3k8*grg zyo@>O%q8Qe+s(K8y6#z5t5l;&5B{BZZb)ODvx@(w$j|ci`&f7QDK^b>o*=5e;^UD# zot;t*94~_(&q@9){>k}tUH$ecSpi}0OJgOcEy?3#Xswcew(9x${kePp<3diP*|6_&D{PY zK7D^AlM}YqDXa<%|2DPO|LOcQxyok?qEu|c-hI0fvqp9LRY9rz>$&HDzMm^~-?z_V zucd}3Oa5Lh&et~{`W}D!ZF1GCwd|5tK7S2Uqyy`sGjO?K7 zM;1NJm2HPTE_v_COA7rlqv(g^?#a&AH-0-8|LknN|Be~DYkJZ{)!celY-QNYv{$;f zvM_gFy;!ki&GXb{zF(WQnUyaXUv*>&nHqbem3RA%_t$0?S6=?&d&f1*z5CiEK0S|{ z8kQxdVazku%dXsKe0o>k>a{Wc#Wrg9zqh)$nm;~b_nRxUPI%{khUB@yr}qW^`eRt& z-wLwzb>Zy@~_@>N<;i2t7rztTCMx<4_WuOR`K-St3PLO zPt;3s#7V z{%E{gG3o7}wZCn4^B8~H{(RZ;`huWqj7lyi&UlL`DJ|h*vQxY9{{Ek-_pM^vpTAwY zr_FlBlAg8Plf72Hj0&%x@Gs|;T>PK2m%m2WM;$9EdwoFg;Re&ctDbE3yQ-U3Sn+8= zktd6J)stP?Uw1W3eeC<{PU8Yu^V@9yCQQ1d-#T?>#oBEDt#6wWt~Q&q-PkBSuX%mV zbz{jXv-(oH=3QA^-)5%rWKn3=tjV#vf6EAp7&+{jxk`I`uW0=`oo~kynCDGVndP;W*Sh{G zm|fjx6KW^?plbeH`!fj}Rx5R~va&tND|^3vtC9S(`P%EYE<4M+WL`^4V2YDyquP?m z4^O{8=eRE8)6Z~E!?**tx_kpRxe6^h>ZKnTmZn~J_fzr{d)u=%+1a{NE?#arw)P{F z`D!ty?rs0%H<_Q?pSUV#_3zlDj!SL#e)3%UYH6L)eYU&&7bkJ&M(lNOkNt4(+7FKf z*V&ge9s?bLC>Z0rnEmCkEjF!uqFG{sCpZ)L_c?x@uXC_oI{J>f#hpC!Uj-;$P3J*!pMpz6)D-mYi76uzTvQ2u$a{uV1-HH|mz8 zl8xmb4+*}<&;RVy-#qgfTb%0*;r&VG(hqNWU1EsQFp*}woE0o$_Dn@<(SEzBcJg(~ zxiTAP83%0pv-D!-~9+p3k- zR(U(cRkQy3iw%{l@nX)W>X1&6?=IvGU)JrVTph_HuG9Kk~a)qJMGN z!dF#)e?NK}Dtu(}hyKG{?{cR-T=Ab_la_|nb<6k9^q;zQ{%lYEDjUZXWyUi}QR{X5 z)71MLzMW^U%lpr8PWx3{;PcXDF`QdEmI$t2d3H&!)T*qG-cyszja9?n%EfM;|KiuZ zy-zCNnu=AdV-dR)9epgA6OT@|8Sv@HEf-P;};H_yU$lo z^Om^b%Cn&}kX_Vk6364KW%j9M+}9sHJ-zv-{-@{w?|!F$m$p4j?$2v$sL?$?;h}5P z$5+SPZtcAB)?VdJ-Yw(OG%aq1CwZbBtFFHdX#CH>Jz4RmbEZy+!6)T!zFc3JwtQon z@8`EA{`BftJJARw!FdgQ?OE?9Nyn?_2XT5`VQ!mH8R0JBD$TgTV&$h5N>gs+et&8| zMR?Lw7FN^cc{65Jx*6{0T~T=W-JgXFRx4f`PsE|aZh_h zyVAO?Ng}e}mN%@mll{+-{_xz&r|W;75b0v%TYSz;i>2%Ig~{6vTqv^6y_4>A=|6*| z$=}HOi_N}@A_?YqN`th2Gk>e=c@ZT(=gs=gFL#V5l_@Wjlik0WZ%ygdw29&c62Xtw z9bbOW;P;nFQyBjVI-hFVkuja?Vp~9^kVTW{g7^JGO%)fu{ABjKxp>BDN$o2agF&KeBDlQ(Y%=#egTY>iVPnmv4RgvcrUJ>NauQQ!U`yuvBEnO68-$@6Xki|4h`8 zTC%Hk-GZcT|Gr;J^3raOn&0Uv{?otV#JB!u@kTGonIv{(2`rYH(bW`jwNW=zUi{W? zlen427xx>kd-j?Ag=hPbQ<0T&v)P!Ja?0}kXDBPJ_AOj8Lp1UC*{&wfU+(92YFzp{ zJ#pXTyt$i#(^stL`eu>K^T=_V9&d5l+1U~=B!W5LuQ?&puu_uqGhd_JO77@$dmd(8 zk^0XtKjy)|!cW{Up8SovWxr~3+gIiFtNPA#p3m=oAbn-pn=L;o(^)^Sn=#Mty6Vh` z`_caT+?^Vck41R@z2-jt`2M76$!9a#Rp(E=S8_RVd&Ax*f{cMO3V|VSGown=Y{4n{ShI@pD14J^%L3<=bqN z%L`9TVz{?FcjLs3Uwv{~6y*6Y`~778b1v4amg(u1lPYbmgin9ZJ~?A0?-9N~$12!A z2c7ceTCaO+x63J)jmILV&$>Qm&WiJ=i?%-5@<4j2@zQ@Tl?PtEn;+yB;UImfg-bv@ zEBErFTYLA(d@JiMf8{K7{ZSm~PASKdxYyU3^J}bH&$F7``FfCPuT?UvbWS@DUm80V zHmcLhxAYW~B?G7Iiz@j8k6|iP!?&sGte4f$4qIk$!l{cZWIpfi$&GpX79qO6?tzVY z>;GCDt=e`VZ0mjIJFf+AYw+B0xLmgnD^HyR@V{`${ew={n)K4-q|bl&&N;$1zP zIwQSWMSiqan7{eE^gl!UqoQ*AXVZ2+Yv~KyJ5Ok1$Fts$>#G^WFWXE0P+5QYbZ>MX zclUgyZHwzO>qRDJaTZBE?t{~Th=Ur zUJ0$+LPeNG1oh$>XE&TZSX>Zuhb@oUoN-E0a6?{>kVDxa>%DxMvEd!sJ57(MeoE~< zbjhQU{WeFb{;9co@0u?$sNWP35&3p5^O^n68i}J!*l(OJVb5; z=YQQ}P`iBApR-SYtbJ$d@>QAlkIhL|2bB2+TQrEigGs}%lji=Uti{1 zyYnctEJ;_h51abV_%_O#U+4C3Q*Qw{P_|^Dg_mu|z zwk!62oNd8-R(Pm1uv&ky=shl$tSG9zQ_iMn-c3Eho2?$w>wBw$>*on`+sC$eb!`l| z61=N-llAJ#k{FYD3vK3neEsc5iHfdOb?{r6XL2Q^(7o1+&o9A~W^7-t$gazuIs+L za5%Z>#HuyUURLjKdj4lRV92axbf!Z=A@!yGKseT=BV7i|1~8!?jY zviIjpJ(u{*|5Qi)`YcIX)wwrzXxWKt z`mwvp`P97JSTALJp&p4Y=BUQ|hrd2|-gfoh4$*R!S!K8H^UMmHaQvnGrt-sLx>^@< z+#Mf2o-Sy&ereRY2fxD)i)HUvwA$k;(|!dumC0?(`8Rp|JNvIfS2fhldDFj(YpWj= zTNNf>>~*la`no}XhKkYkN2@Ncwa%-1^Yi$B21_ZOt+JV62iJ8UTYct^{h`3jfYrxZ z_np@d_!G~azfbc&gT>c+x%uW-ILoGJOzynXQn+c>1;LP;?pZ~yiSu53YPqx}`HIQE zu;7jC&;QliyqJ}V-)1fJ3L6)JXiZ!OYlj+~n=-;T%?bi{OBnAmyV>iD;B3}O2uT+7!* zAChwNSh(!xDSLze47OYBRm3I-mW4fdvr1!G=lw?}-{qefpRX(Y&oJlSuO&>iY8O=> zcq`7BCv;)eF1N7R>+RpOo8H_%OexS_L zt&=ZQig`^|WSzCADOCHL^tYM2uiHvK=|3~u`gdtp(&++^CrhpuZWKK?k#E1qe(oI2 z3l%>eHr?lRD7sx;QIW9FiuX!zg5Af4XDRcR?z>>S{k=~|WutD%@9?P(i+(o-M&-vZ zx5@tb^yk85XLV+oWS=`3KUp+S$1B9>#G3hB*PE4#Vt;M=WBD}v)3pVYUDItBe3|Jo zaYfh@M=p^)tM;GyQs7mX7oW6xZt$n(Pj&wp!V*`!iYnPONpvBblX5!mW&`e%QHD|G zcFLQcZ{Dv}ua$Hm=SY6OOp#C|SJ#vZYVj%J z3l>VxlI^dX&&Ot0^I5IAYU7e5?MU`zvTmmpv)DveGR@t8N}^K!`Pp}EN$mmC%)fM3 zZPqeh_OSd%^tbq<(f1Fl#Krz+m@{+Jm1kvp+a5_fo;)&dHtX+rrpbTK>=(cP&tGpV z`!m(y?VWvtVkR-fOms7J9vJJ86*E)f@vVTHWNi->sRH?Dlrw zO{ps-kB$1gDw!%SXU%z1m-or#y7~K6hYiENczJUKop{CTf586k{H)#SbM_n5bZu}n zTe$e1cV1#hc6ZU1AP%m>mzh?6*sgs1QP8~~fj{$~TYTZ3w$)QM=@I7>8Kq6Lw(Gfe z{P4Kz&iv1>D)_Wq#kL)dd5_bkSS)yCzVM~rT=$EUfBX75IQAKdHB7qu$#JQdm$l)Y zZ*ThrH|GcO*ZybN%#qXQ12Yc(K2^2HQ)746ZF& z6)ktzZTRB!e%(JyKmE~MfBV(8^O`yxTpPoJj@GBVcRm_k_u{ba;iso}cirCOeUh8u z>Wzl*+kaLu&yDt+e&w;Moz|@X3_KH^wO1@)dB4@*kdSQI+kLiC%Zr0}&ESWgo&SFw zJRr=(u^zNy#QN=Q4Gq!dwdazwG%xF$WmTj}!djbY2QKe;>>4Vaao_?l_}Ey8P+;`UAEzWHvi{|^XBpAi>>17UOr|G+r+Bl z^pRuj$x7F_v>wa$Wsfau-+rH2^Pj=k*!JkDR))=+_xhbVeWFG*?Z=PpQUN9JZ9bL% zc|2|Fvxfb9Ik{J)*RhDGFSQJwYW{@%i{-0&jrw!OKa(zES?Yf*glf2t%Z9GqfMKx{t zaY13>qqfd(QH`sNZ^gNMQeD=+{2=QFC5kS26d%`ky^^9*27BKuP25 zY^?>U#gcB0y_r)B&Gxv8sxy19a%!08oTIn%`T~bK#qBYxW6LDXd3X!Xnp*T-J!p7W z`HRJdg2KCnOC66a*%toFVB2?>rk560&3nrwg|GZ+%`M7wV2_(yH|LpL=AVgMt_XGn zNIzP3PicyY^>ePz@lSJ)^}I;i;JqVJe)saI36(W0d1ddapU>ZV{_-uoC2@}~-m_G3 z6SNLx77_`qR$TPq$3EffD-YU#+NAg8uH(AWio-XX1RSF5?|3>p?EbR;t$zDYOVvyN z8O(FvtWnx|`FZfs_7!_QST?=?dov{Px4X6Zl>L?^udjquPMG>*=G3DcFXOgK^Su7$ zJ}>uuLV3@mHT+`iYt3%-Oo_~Tt;NZj`L^wJwP2zmgWds|z_@k1TAa6*ZIKZBny@q9 zzqg9dmQ5r+ z1wVPMD|&aa>&_W08lN_5EV-U_y(#?OoSo@bf38*E6-~OTr{1W}{c^@4ucnAxSG7&@ zN9qqe+5D;hY?G{P%I=AWR<&s>8LUtU?)5G|cX;8?cjulgiTPp8x@aq>sq6|r|B|~& z=31fOmpjy-n`wOM>(rU$)(^k#eYEd}fq})Fn;Ux?9&oRAozdsC_*Y7F$R)=aR*XkN zE+0N_d3|Qh@;=yj>Rc;_U0pi=PsURko*3 z>?yoC`)%!tIDwe#)-$Vy<3K)8~s@gBaQ`X&>!a$zXQm{g3bGU0%c`Z@rf2 znfpY|V2kye>MowyH}4(!9lq6<)%|xxX}(S2a^r6+ciP=wEphp%b(o#4mc;z44Jtdu z4cDYCEK^yXzdiPtOy*gKWoipdZ@dqD+!S*0X5SmL-@hJkPyfQwGHddsb{pBB_rxQo zoR`?q_)tw!V$+9Pix%hkUfH;6{!@Ftn=*eUEZP*_snFzfsW((4^-kZF+b?d-e3P&0 z;gXmZr@PgfcaQPX7dpvN7K%MB@3Ob|=ge?)3-Y^qqxSa0){P;4+&g18rZO!F-dmRr zzb6-T5bz6Al?u=X2s21-F^|b!v};OYs6vx%pEXp>EN9)1IiF@UEV%PT{JdT5wB$vEBCn#S>XX+8rx`HsSK(QF zxxQ`H?^$}4x6l2{zh?6_nfKe06Waw=ADZ@RUEG`_somBmj{cOh;fQ~}v|`Q+`^oYX z!|xTfxn51u&hS=959fCZ>zDO-ye0GCan)CIs-AE7&!Atg_$6NB*4nLexVETlG|daW zw`}j{)e%4KI40IHF#X64oD?0eAFZ@X@4FUm1}txbB*)=52AOyoHimEY07_1kfC zgX7P+&(5EYzIu7TQBLm>fkhqblo)5un0U>>>4I+7p30)Q+0Pg3S^V>C`ZMjt#Y^vM zzg(nZ!o8!&*SY9!1fTr}@6RXhKl{%xf6sBV*}^Xh|7Jx-oOE;H7ys0!b9d#p_TOUX z?K5`q&)M2B>r>h8_JEF)uT7>dY7Ypjxcn&6?lh;6?axr@hvydl%={^y`s^gzg8X?= z8!~w^l2^)jeb6}*X24t+YEx%?{J|sRn{t7lTC8-Zgq2-n?NZ^|t9{g!J?EvFR7ID< zl04g$Z5NLT1dBlWAE`oY%sX~P{C*hynqy7*t)}^YV*bx&B&)5{vJO}Net(8oprP9o zc2Sk^4TpS#Kl^)Me#Bo|v|`D3`@<_2p37ZTSLU`|NTtYdd&h)xURN$xDK+nqJ?HS} z=+C{&<7O(hhc1ZkeC@Q?QkTC@eXWi8p|!@Jmz_I&vC`CaqNHQlx+7hJ+dms5Zndh3 ze)8D!Kf|1+%j>!Ki1UOQthxP1Ve+xLcJtqyo4Dv-;jLILo1!%nH!clrySx2Y@uHV@ zHQRSNRPrylzRoMR^hElLf^*hO3!}asoq9O+P2nVXsY=ASaVHN|Jm;)yJI z#_c~3e=<50syFdd0q5$g-#^|zyuIer`g#8uRHSZM&#qr(@mO;56&>%50T~M}FV}q? z{4cz%z&H7Xv!llJpbceAOI<^^GpzbO|K|FrkFN|$kIhbgI^)rmlAlj@3A1+wST0p@ zK49P=@rP?q`>*|c{xzLH*RT3nbdI}nZCZF`pv#=qlDv05|7h0C@9wQiUr{spXK(&9 zX_r~oO1?A~Ch$F7{gJEeQP$2YTY8Hu*Y>RX6EVSDIXP~o+V(w7E^a)G){U`$zy1E` zG0&{_22=D3<-EsIcV@Y3U)nu+``u1ym9(foUPpwtx*svvAMt75-1>|U9DyxM#1=db zvI?6mXL+RFaKFyG(!HAUvAY`cE?Fjim9OKI?dC7(As4>RE^qM^zGCp(dExu0zm^6YuX~?h zn)tH8_T+6LE2qev_Z$C4 zp4fB!XC>R(eA6W-M3+5bZh5v}kYyU%)I0pQ&RhL#{^WN2^k1%G~pJSg87613o|!vZ<$a22t# z4Tl+4y!;XVyn8iE|K+N=uj7|9hsYyczG~{+9ofR1C{hG0mDazlAH;@$^|Etxl_zh=Gm-u)`FZ}oqV=EW{y8S^ad|7JOAzC^YbhM7l%L2(7}b5)&EN9b z_Fv@Fe%;LJR$IRqIKJw1)@i&Lxnt3_H5raF5e!?FJ$e7F`1<_``zLA(pI)8y?aGcy zxu*E873(TC*l&t|nD%$_#@h?N*>yi{-5ikM%G~jY<95!>h?hqhzG~EDwkzEb^vZ2Y zZfj~6XPUXGgPke%=90sO6aJ>1WUbWD4vzZ$e9nIc>xY|mUwEhU{_W#QYPp?1UWgZ6 zSvBEL-C5r3`!?>+ZLN-<5?^UQZOJ?-<<{p$S1XN0`!D_bG-v8Pt3NvT#noQ6=s&BC zJ~wNQ+Mn9Ik1M4%>pk7^hpX;VRsL^J-+$^K&d1jU{`1N@yR38T&85A|`Yir(sFrqU zU2B?cpu>OsKZD7~^Zq}LPlVaUZSA^sPP9wnik4PaA@hQBGZRw}we*;UF8lH4=C0Im zgF8>3o$X2IGT8SyAmSVQ^9g^8&rGoC)nAPpOb#(|MSGptt@+_oObN?xM^olcagbcfxNibg8Y~J9L3Mw%bp~m zw@zWwxnmFi>hWFD*W}>Iy2R%^x$gQ;^|i(Fs{fKJ52fzg+*2EtWs-GS=%C-J{|sk$ zsCWHmSbbW}pw78+b>PLNO)orV^`t-e`{-9u;0Z2=ump?1-so@Jep{T}|6FX(>9SQx zQ`|mHx@6U7eL00oduvuD|HH|=>i-I*R0UKndu?)C72o(OY>RS!`?~)O*|*ic)qn1q zl{(v9N615x{icdsd*1HSQ@j2wy0&G-%ViB-8<%P{FgYsCwa#x1{Lj$&XS?$8;*YJ` zCsx?jReyOu*;f5?)?@#G>+P3Aqh?*`TQ>Xe?ex$K^~P)8hjJSP9Zsl^E8#UhV|Z6< z!rg*z+)opu9vq!uX0NfrLg>+1RTjYs{$`a*wLc~;7^Wnoeo4$KpQ)t=xNB^Xp zo9ACIhI8S|9^|+y|J%Mz=BM?UU&s0*pYED;PeQ_aW#K7jCs#(9zQgt1kL0!sfQ*=KpjhlRTo*Rp2wq+@H)Gc+qg7XGJ_Y91 zd2`9PeEEL3JA0wVZPwM3F6~p^ ze3MUE;k>G9E}f5^{c1cPZ}_qLqukG;@tDN(SB!S?0;qprW@EU*8W`ds@$n5@Twsf}858nT!j z9pACX&Aj?%{Uw*L(Ql==LN0{!>a6S86nKKmZ29@;&5w5edK|Vu!_=n6D&cx*0#nz< zm-_=h9Xh?VzT=B5Z`paly0Q%OZB=KVTwf{e@Ofs)ME|?C87q}1eq?)kHuHDs+c~#S z7Fk!eNhWtDH!zC|Hm(fzdQ&w||KvWM@A{M9{X8nPaH*ZL^R?!~x2^c*^t^qw!erf} zotj<2hv!{AETTG9)?ZA{`fdEf z`8f#_%y0bIuADD;-DtmIRPgh@GrX=vpLVA{J7W$i-ftW$Jbn3Hp{080)SxYE{qMGJ z-!&WG*ew9_aXEd~9f>PNTxe4RecU1$thcZxzOq0yOlNizhf*} z^X;;%&P{!`EjI4CS7t(ya->+gi)VnG2?L+uj>j+mGaQ}TyU*tJ{?GmMr_@JR`}(~T z^}NVzs~y1b_eR2%#UJx{Kh&N7HS?V>yR)G~!}?bH_MBN!ksks-Ej;XTLF2Z_+1VO$ zcR#M)xz2_w?ToL1&2??5Nyi#eibFs1gq`+k@LX2B-?Z|bt)0-a@(K9`*c#;T#W9tPJWbr zXYQ4X@4xH0KAqe@@jt_J$Ct(g9`}5qW2-lCS*Nt=>!>6@ zlDWB;t%z9VdE@{djietw>(zphVs|7S_ur-O4Z|STLiFI4W zmkTO#ZTvB9%AKy?@Bam!JN|V3S#96Y%RLQjTmiyY4AvH}jClRguPe0i@D2SiR~ES) zhB0OqU5|tvRHUCIM}7Je?(oOdc5`p#;ZOItua->++`e$xp)IdJEq^>m{Jj07@4xnT zTuzxNC9uXbV#g%+n>RwseupmqEw-%k^|}31H&@n0JldA2x>xJs<}-DCE`?l{3`>mU z6j%S*`eT#4=)bj34OQRH(%O5aTgv+=XQW_9p@hu73nF<_pWe1^e|rA;lNOEWxCML{@72uxmQnLx?tkNJ|>9|eRG<(m;Gq`v9mPp ze!A7P&Yv@D7rZQVf9+_#`uL^Pr>_L0J9#C4^!mU3x99CVx6h|vWxm|(7Pp_BjcrfW z+wFJf&i1}8<|p$qDro9S-_~27RIWd754)bN?_c;m;X?LoGi4JcM<30-+hly%kJQu{ z$*;|8m{E1t9f%#)V?(g`rD)|%kGYqq@t(sV5Y}F8csBOQ;?S~)FEl#dV>vDBt>|CI< zn{lgV?0*Ix`%7OLUv@ULv1jQ$Uf*A1w>_oLzUL47$``f!de~QP2+%4Qz45yuy>&D^+gQ_{)S$+59VLXS%hvvC^W+9_K$7yxO`rUH;FO9T8twdoJSn_Nng4l;B{e z_h+|>tkt^u^xM9ey|16_&g2o?bfJksW$p{t>8d#)|d(PxI?G z?`2@A% zH$fWYH#esp`Js^X_xQtxbrIS^4$Q@;_uZ|FH9o%o^VIuuuH7;^`1D4eN|R=X(D^*k z9|DyOr#R}OYZMBetomZ}gYDyiPfO+%TzjXtcImWt930auW;SFhO>6Wh{C4uUQOM`i zA2au9rC0x1{%6^xoVUDZzc%*0{L8+k#aQFZm9L9xr#+GW)*bTiT2;H(W!9dIi5iL_ z0p)*+vX`Do=DM=-{lo7m+kIwc?!5E9-SMDgOtnsHSk`Z+n6Go0f0iYrYV;eQeD}KDU zaNs!1uz;s5XHnsTk9W77zAeLQoN8QnVDjBH$u(Wsv#u{%^2WDJ^t^dp>c8YWnLU>y z7fy36O%Dw^8oZnD$RG8GYol%6KIga2wky8!nk6V!)TZuipad(2luG%cs`ZnKxL6Z3zTinQGRRDb*!JZZjuU543Atw?_(F@m1A>Lg9504bJz3lpWko<;Gi1+LzxSG^7u2oU4HZa#WwSQo|-jBY}Jb|bCp>ivmV;a^^U>DE=TkG z^YTy6mTVT*ObFP>BJ5wg$?ezNq^H~(_nNn|`!8$fS-5xV1)V8LuKt2?`)t1*{kLJV zM(p&ry#GG;W-jje_i0L^*M*6W{;#id>*aHX)K-UToq)?wL*UDj>U$*Begz#f0nj-X=U@5ybTxsePNd6 zKg8=BBEblX9N=IOHqW+^=8 zSfAVL^^w)L>T*tZ)~uT5?gcUpN=xeJw-w&E+x+6sdXv9al1nq4PJPjk%&6E{8g`@b z#~-uT^Q!+mnjX4mTg2MV$=7#g*lGuDS`q5>_T-Lf!KYW`vp(MEWV3SRYblQC?w2Z! zSDQB~x3AdpBRT8e#Z{X=rc}ML&n&(?fBL`D?bp^``8z$fBT38l+sbnrmu~i0b%HVK z9mDJQU&2)d1hv|e12iw+U&p>Lxb&OnZx_M)c|RZX|2$D`Yjr%dK-oXYS$)M>!$+$Q ztaUPY7$tk~N9JXV@~4v8E05-$V3s{?$sHWv$Q7RWdvj2IhWVj7neX2xT<8eXbAD5^ z?N{~l=!=h{D-KOv`Pl2vCRe5!1qRFT4KMg4k9j5@fAf9)hhK#b%%$rzy|{QFI|p-a z!q)&_H_ORdw18_-L&>s;`^(~TZmyoScXJwOuV<>ELT=;4@;tW%*XuujIA{O!>Cf5O zKdYbqRNJL5d*qSF0>KqYn+o!DPI0SsUB9mVxK|L_GTWQG zP$PEbA;;gB?yctw)HindyZj6PQ}0_bDz81fZl4L0Gi-e*wW=s6Lhs&kJH7pzR?nS% zdPDTRvxQX;wc`{ngv}0WsrjAwrmA<^thV^T$G?>S(p46@DoBGS(V4ic(Tt2PIMXzrk7LVtt%hA5_?%F-0 zGZ}0Zmp>o=tn9si)_ae6uP^N^xahQRy6q{Z-3;7?j@_%RmZk0e3kv>dE6z% z&;`p51TXVk6d*1?+bkob|n(tPBxc+k4&)2-%r^CJlt{0Ux z@|Inso)a6O7t013t_nBH$#f{txt8&J;{F(wDc4m07t_d2f;8`kx80E{|OOeJh0nw`%&ooRfa$Kg0C3 zOQQFF-C%Swz;9JDKi}8S-1G8hw%&s4@{68!7f9@y$HF`H=EX9Z&ShV0 z>SyzAu|Bz#rP(=><-D{`_(iq{b1Y_kNcmT&^pW9j*Xs1JKYKr`EnZ;dzDiQg@?N}` zk+aC7sQIFdiAt^i8AAI7j~Z`$A(wf1YpCa2r;{g&l$SlP{T;qj(sJvbh7DRX}{11OT zVLo3!{hM5IbIYHFvy|3Nc43&HWl+bsoBh#Nxtq`Trk|Q-9Dl-;W!?j4?c+Sb9?AJ$ zhJhc0A3Ohj{@J+Vi(vKJWWT0Y(y>@(kd$(7_W56cO& zj7*G}JYn^fHrM4x?w@@)$N7AmciA5P6`6rCQRiNf7kVD zWBgC(hBYeH_$CZZ6Z~w06Z=SdM6aS3FE4ks9Cd~SJztHg`&#P&6 za~yJa^G?aLDz)JIbKop1nH?R?93=nIv>?=EDU;7Xt%pSQpc$ z-<2=-EB$9Umk>Rz?|#(w>WGR9KJk+#ajo}TySv7H(|YB5^VWZIe-=0OnRH-zqQzVe z9*bFT4o^_|y>k8Cxyt_6gno%=IIzh5e)x6maU&7F`Nw%L%lAy&(ew2F%wH|$9r&c<1t?PUXrA-dGfUQ!>9d34WX) zzH)h=M{d5DtB8eWD!UwqCFrpDPOk^Nzf#J>_k{KyHD{XdSD1gs-)e1xnb-rHz4DJ1 z1YVhS;l1Ddx8XOQ|)UAVGfYsK^Ed4<9bM<-ftx*D_oNJOFkJ;8_Ht`@KP=TsLK zdtUt|Z>ZxR}qw?k7;E-`G0-59g#sW`L73AVr~ z70;gUv&g@!zb`K5rc1cMG&zTdzE>M2CvP}0ZSQhP*<{WSU0>f{w%Pmh;(rE<&up7h zO|P!rv&iT=6I+_%5{0JI#~-CV{ua9Wa3#XSEqN`dmaAxRbD@{&+W3w%;c`Ruup3i zD8}E_hzs@aG*ij{Z7*K;Q|!uC`JZ9G<^*Pae_Jl%t+PQ>UeckdBSoh1#o2G|N_FQ& zf27yB|2c5kB-$@b+t>Vho@%yJlhLOQ$={~Wum4nhAuj%N>a>MY{xU0)C(Yrqn$1yjb%8~ReMD^^(l4v~3oSNUh(r9YQB+CFMTu5$XL!@=v{y}q`svidW>_r-dh zyu_w+2Rg1w@rUd`Qn6T9;_rmsjSm+5i51W3cxjh=>Fm*6k>?F|WlRgpZRJpY)BMp= zt4@Bub^p`;XU^`~`6~Yw8}AIO5;I*XJ@;jNz08;GQ~z9)TPk&etCQ=?`u4sO?(D4z zOQg0k9PX~}YVzauWKRCnv5sZl{dspcv{m!pGxU0Yg{Q4@`sso!Bdr+slgyj}T@AAQ zhj;vEuuA8;zV@=`#6?&0h1A2RCB7D`EBu%)UD)5Gv9{tz={d=t+n?OfThJc5edq33 znfK?fSke-4ZIWrF)w;)TYGPhD|7TFMHw@x+h>TvV)S30->_;{elf@xh?Gyvb&d0u# z`hGq4;?#pWjQ5wH=6$xyoXcsl^Uig5UHQL)4mk^st}4$j*ExPU!>Lc`W2#D@*5Pjc z?nl3U!~V|S9LVvXVNS`mR=w1)q}Wu(vIl;Lb_XEYKQK~3$Yw|1n6@84%{?z2Ec6FPE>Slc_>%%u0=@|d!mn;X~q{kRgw zbJdjPO77*HikBdz>wff}YO>RsmG7hWS!`kUvdGgbVm&tAKGgH(%|QpotcZ;_g7?*& z{&V|t-|YG|_p&CQ);^Q8qxJElrQX;3^#i>HWW~R4{Si8qtM2li;!o#K?+RPAw%Ahr z)g|!`OP!=J#v5~|O?h&smHn1HpYn=-MfYy8^t%e4%#yj}Hsiq6QpK_=t%j}l)_$xg zJQrR0yf;12KRh^X&z58z7T| z26=nWWMoy-KH6pOHR+-Mk*w9n|7AY23;)D^eXCjej;?<_uWAw#GmGz zWR|`$xu*O8E+q{H#j$c@z3XeSJno-)0}cxsm*QO@u?ik`)(?3xppbY zmG4OYjqAS>kCbygTJY##<9)rYXM56_xz|5?G*A6Ny8h?mGcP-CoAjts%#^w4tbgqv ztMvXoKYvcn&6mD=+IY{MnNnU2TimtItSEndK5_fukM+AgssHqT8c}n%Quj)m=d!-1 zH#?ahKJW~6Vn5QeseWVK{H^nTeo~(r?AOTD#LBQV`^%O0!S}67*Y4|;uK#?SSFlmy52%0E z=_!!7Pc$y`)a?uMGfuo)x%jw!K<)9IPw$__KS`N3YsOU*g^9+-yElu=unR@)iLBI& z^Ai52dfCeSiQa+fAO!ox;EtyqUer~S$d`WB*n`4u4+9{t+eQ{8m=ZyUbhpq)N;x?^6r3 zes!6JWqp#Fp8EUgE%n(_CoelsyB9j??30~t+d_4j*i#~sAI7P!s?hs0q439&AMLT9 zray~`irwPzUgxzkqsXOAt50|&D-?cMC6W2DE7kj;p>vNeR7qwa-s`EGsLslyx6 zb$OX=^j&2Qg|DIqFM6IxdT?E%p}^$Y!`-EaqSx9OTIW=yTYR2AMfWRrbZ5{dPCYJ> zxGeLRn@zRE7F+nOd}^_FD`&2L$+7L17ynrJ*l0#{*LtRp{kNZfSoJ4f=z3D|nOond zZ?!-Dx6;(}t)|RpVF`^CEk}jG#i;>YpMF%@vcEMvcl*hI2HRKHL&`E9Z)sW8P?ny2 z(bfN;LzQj)u{L6V+utFo$EZO(NGmRY@etZ8j^xd!xxmYz&EpUSAypg_j(^wiGcY6yqUi?PpYf^xl3Q8((KjC zOYF`OGh*Iy@_(50PigAy{o9_~CEd7tw6uK1t9;%y-!7b~H3~3DXKpfocT>aGNNSIU z=ilkRzf69WY`Yge_wrwWt3HMVK{&4<6O0}}kzGKyaBI+W=ZXK=J<^@WB7y$4^_De;CMxAlD%y8To8 z^wok9Py3jXwfAXJ!cZ2HL(|0{z zdHT7p72*0ltNduKLeD1c0+FyFzP}m%QB52#|1(IvpLgy*!yNbP`6^FS3z$tpG%}Ag z#?3B!eS7`x^b7oYhr&eF52Q@UF`Tqta8B^&%>lnKoooE|-P`OiQcj)mq zf3#25>1fRJH+^Nsc8)V)+PPa@xr=#{nAR-r3VyTg=sxEv<8?CeS@(*jCU5;Ka&20` zfk$TBoYs2oQ(rPgQ{K#`|G?__?SZE@`Wl}(zwor~(lbmdty3RuuTm6hNHz-Hr*Vm<2 ze*HP6)M65}QpJelgt`ajl~livV!YB|9n2B-p1y(f_+HaeDU9#R>!k) z$IY49u2d)QWAB1ujDo!LkJM84BMsek%K ziLRZ*RC8|M29ejUH~2Sc&g;9hriH`oZQFx@G_@IWo(v}IMDCpONYFmL;PsD(i8BRl zJ$XIu{4P1v>-5Uv5#QN>Y{v(-|0=?B*GDg28@+OU+~IYeYf4Szw^)@~Dr~tT=E}bD zWsHG$tG!NWjKOixiD9PG7BigB;bh_cB>SwF%{J;%hMrbXh{hKcIkm+}=I5;{)Bfe3 zj;-AC(SNl^-Ic}_8vZxc|K-Kir`vizottGFbj$LQX}IV~1Jg4_jmMKCofG30W^B@Y zy2HY|H23UIxANHShgNqh>oRMqe_O@&<)0<<=krtc`$UA@o-D*2ywsAb#5(v}#eCV% zXa8mVS(R(-J==4`_B_2emQ&)pXX-GRuqb_dzyIi*?WdS&YxVhT}UL1G2;oJ&HRTyYMm_yc`88?^9`s*~+pz`&)zZkdONSNMjE|R6WJnzRlZ3j!?psLHu9WVdg zqqi@8#uf&H)Tq$R9ZI_^o`lDKIwIAhx-RK!kn6(r$)El+SUsO%bNWg2d#$V>tFCAd z4woX1{D75@_^v#@$$$7`b*|K=N|TEJ3@$St#s#%;7hLhU>aVrjzGKqSI;oGbzj|KS z`G59XzW9~FmY~mDch30L7|P>$gwZ8sz5F+q@cz%~%l9mP&RrX4pje0^a`kWG zljIwF!>a@|G;i+@u$QsjwsTeZZJy*A0ychnyhR=B*k=hGR^GLA)20d8J4Gc=)ZBmK zS-N^-NqS-qZ_4)7g$bh97T33ziz=@dJ#YVW`-x3k`>(8jx^2S-qmGFQY02l-9&NUa zQ(x;4ZgS52*O0?rUWG7Z^e{UJqeRTVIm7kx_=&s3L^y-%8qbaitrcY)H`OLt!x<>zBu$+C$ z^ELI#HA{bqos;*}P`TUxrpT=j{Rd zB4O53qiWUHaVo&pv-Mo9 z`g6q>Rq{0-`Tsn(pO^n;?PZS*ae;-;o*au|I<~Nx`S-H^ev_pA{+}zCpNxyRxRu*1 z(OBoBE6-Y)j;>dcrx{coPySQ2xjKFN;r%ghdl$PGKD~W)lCetR!P6JxR3t z)oQmt>o0w|QE@9;BW&402DauKrH8B6E2+c_sWM$yvDA$H_+f>*oIi~hYAzRS7ytJ0 zto{+LtFoEDy+8eqJi6a_|8r@RwMMsIhi=`O?Hw@ZX^;NOT@2N7?#oVJo_LP?$$X1! zx$s|ScL{`L2JG=$b*CY0#r=m-tg`jfyL$V|_Me)6{`U{lpSnwhJb5my7Vy&SG5V-5 zA>%~vQL*{rQbp^J+Vb#%JSFDxp}9}VNKoS=H&TTmlu>ByAxAY zuz7C3|8h(D`8LlJQ`5BBgDYqQ~xpxpRjpY)vCWjv?BBxMSKJr7vy@|x#rB{J{~4Yu{n@+3L)X;vuc?5fv$0s= zp*cI*7`mqYy=kA{X`kL#ny*?{mSLB&qdM2}%p`XqpR!l$m{oZ*viM57c{5^aN^g8w zCwJ@ar)7`#@kchk?`Dpev^E*|Gd81Oo7*B3#BT4XtEg{YnXhp z;+=F=O{o9%N%AM_O-`8nc>8XtP*7vU+?SW%%o4o(D}6z3s*r;6K8_`2%tC@~(eX_s`!S2G{{`jwZq;nc>RZfrowD;~5Cd(d=h-=SG-BTt^3zT&i;i%XW^YZ9F+363@ z&42R#EN{8%l`XHicYD^Y)cU38@cj3o$VoweMQ1Xbtg_6%-ygS|{n_VCsorDr*Q)Gm zy0av}Q^sYzBvVIap>ELIQ_H{AXK;mEwNKmgGkImBjxqa_qaI8P1ia?{E=fIkZ?e^i zW$yJ&Qy4B>_;ytCangw;v$!VvGdA2=GNHBV?W5}c&+A-E-|HM)>!vh8Tk2}Wk0y<} zzT-bPw^q(RIn7FG>$cV6tFukRXLapjTd+86zhnH?*zf16%j^C#Oh0wqN=ILHg{{cO zm3PE7AMB}=njiS>@x!_7C+5$Z6m#Nxk%*u&msQiE7QS=LzlCFO)J{F`^CB+QJV3cf zbw)_={S7Dc=9f9z3)<_~*l*p#_s88|xLxpc?8cl$+O6NO-T59E{KrUp&CM-ad-%6- z{tUMH{_H=4j*h=>>nX-$jfn|vD%u`j%hKz&aoRJ4{+)C`YfHR-h9weRM;`KPrtu5mo>?Ob-e|4r{UJJXNn z-CktAVpx^2_y^CVV_Ykj-@L(9y1qtMMeQ9Mm)FTF=8Xpf7Q0z&T+3=>7<1F5@w$%G zms4s@kk#e(|1Ux+A#laBx#aBB`{vu?a&B%~={RE+*Breo?gt_+E$I5Q`}tY_pQpUV zuI+hWmOM+6XG2@7SS0fafmw%N9{*?<(CZg_W9o06W5Pd6pS~!`Sb9zF?>evLVoPGD zKav;DTmINjUk7pT4$~1qN-!`8!@BZu3+cs~1UVr*xPv@GG zeEphVmO9FO_@%Y#VaLs74wi=NZ{2Pg^O$c z_2Bv5{~4Z3*=*P*<>e=~aHZRVd(G=^zUub)p&+5SO_KZb)n8GWMKgIBW&Hix*T?64 zP=B7cJvU$U;APcHjZGdW{>?sm(t)ex+J2$wkKB*m+WEYeIqI{_H@#^(Z;wuM2$fjV zAkd_`;_*h^6WjhXd{DMN|77};kbMce+GDOJP13m0F81cNlI%(T4{u%nHtye_XLtKT z&C2YI6^l%xxJsn|N@{J{5aG)CeygEpj>yIpA|m(Zw~5}(0%M(Okk`_1*2?5y6ocuJ>=Hh|Xd(ak;YZ8E@^a zl688zhkt&)y?<)_9D&z@&Z#T!xJ{o_lrjB^)2Ac6VR3@fxFo%{T9%}Kd}J%QIBR}{ z!-LDy{ua6C+N-igZDHnpq{1~P+$`tj2GKW(7n&#Vn`K@&DcI%8DiQGG@{98pKeNvS zzo`10@m<)YNmF9gl*J3AHCR`inaAsAvp=)1>iVf&lj5V4SH3dxGF)Rc<+A*2;fd@q z%&IfB&z33Q=1vJKKG44@J8p4utNDdbc8g{;Wh}nEOf)MhC}y!STc6XGFp+ilu2}z- zJih1ZQ^~i>c3jcj853(DH=&Br>&ns){;P2}pT}F;?JZ3%|K)a$QFRB)2Ae3usP%^) zd}6Qbov>FtaQkk9)1}PHGn;2lbQditbYrh`?sb;kcKEz$rs1paM%n)vUgj4(lM}n> zwKBA&ZN-8Yk@LUpf8cTA`=mWzYoF@YJv#TUyiZUw-nG7>@oCzWt4;4tS&BWpI=}eC z^UXG^pWVpMeK6q;vov3f!;jV~<}1HzCC#>66-qFd-*fY*e~oF`8ka&=>4iT_kA$6F z*ZA0Jl@{lM@Af(hSHDQ-#;FUfS7iv^>+$jrU!lD5PqkP*hs_SI&4!QtJ6N^1J$aKI z_4d!6`jZdqvL@B*cJ5ngQ`8xMy*ENWxKl(vp}*CuX#G#8nOFZa=-Zo${S`_+Igdqd zBk$?up+DDsy}hl<_|(6`t=HaOiuPn~zJEJse&+N;u8~rU*WJ|GwoCMHMYiOMLN%!A6&r^Bm+$~$bm!;BW8z*0xsQbu;OM_G9{=_F);bo8a)`_LQ5I*_+vwPXJ zZ(3oV5sDLn7MlM!A-(W!)_;cMZ);iq%)hjL?VAOCpZtRYSmPRsmcPvrsl9UEEn~x$ z!j%iwmfQY%_;ubN*E-!9E0;RhnOGEchAx`LbzO{SZ2)iP#=n)I2~6-=ed(}6!69`@ z+8NLpUS>I~WIx$It8UKBI8tIg`GN7_`Z@c2KHZy}T)ob_oZ~vbnTvaz-TD=lf>I1` z7*}noyP*5q=eUJ#^Lg35XTl9nR%X@;oe4@hRj0}m!m!b0OF`Xn`Oca4Y0IzJPcF0D z)-H3Zf}P9PzO|-KzFzjj{C`ElpWfLPpAL>YEHLjEtBt_qk4zc9V#}9({TO(?uR`y; z+pbOftx7i91pS&*vGe8aV#jaw8JGWdoL%d-t%%od=W63_ajSLJoj$4YMRk9w(^s37*XHxpT>f+O z%Hz*%>rDQtDXo)XSU9~=`j5}C7PG%UtLvv;w0|!5pF!i@R@l8-(K!B`{hM8#*FNLrH4BbxXfSoO$?dD z$nr&***8Vyr{04E?b8m&8}9F1-{-t_FPoct!F@qlj&uHv7r(PyAv)>NaXWGv*Qk9E0+_`-G&&zoxe{Np8b?nu{ zcS|aD`ER+#xq6tSz1{Hm!{zSKeX<{Be>&{4qu2FhaKYx#MGxGa${wXC9!y<+$a8rX z&$s;(zHIllxaYS;ls)%YskX!pje|SpENkX^|GrjYPN~ViGarxtd2;?)%Dvbwjkjq_ zPfiS3suG%fvV6j-i;Enx4)1#2wQkSORh9F@GZIrB^qvOisH}EjYRhhnzfq?0`Ct9a zbLW4C|J2V-lMmk2DOD-8Q2voe)5cVe=%TvgO4aLgM1Quf{+WET$Rj5=_ufY*>!Yqg zuMVu5D!uW^iH)DQ|19{n+_3pGyWQX#2w7QVY5 z`*W5?iZp(h9CvsBGNF4BM^{wM=}=gI^Bt>u`)SMYx%;(qO(UM9Jw4OFEHx`=ifrw< zO8w8`pOU1Lmiy0C-Yd%-s%)|#KOk>w;(rEZ^LQD>jn^-q5|>}}?&;T1Q4!B0qEA*u z9yVAS-n3t6@gwceC)Uqf^K^F5roCHse_1ri{lTf-ogAthk3a0pzq#`7GSSB$Ii`J^Vb?7*i9La8a&uQw!f2ThEoxkbk%l%rFm##;2X@)(s+?%NA z*3u-w#Hd`n)z^5*(Yi=cMbqT#>#n}s?<1cp>{Vy}#5F7AZ9tV^^Hi3OjVm6laaj0z z=j|ND>n8Kp-kLIL?ML1jBfhYpv(!wVOuyxlcls^~vM^5^q&_kW(i znYsGsrqD}oA8QJRPO6x(T|cyadFYKF*B}1QIsC0$=g+cFYpUkYP;T=wzHMm|wL;O; z=A`m$;oqCLA3i$$Xu~hXpM}ia6_-0@LIh9$E?%EGLBy+ZuV&1|+b#|aKe(zBwrXt& zeYx*%pRVugDKX4G8Ec3wJ zysCEDjC66PcY5AjMPDu2SXgvli)aSey7~FpXHTm({=|3Bd%u3vdFx}Jrr67vd^z`@ zVWa=e7mJ_HU6#uxy*eS*QPDqc_xsE5&RbXh{#Q83`}9pyef^ldb0%s3I>C_i)#iIS z>#DOiy}D{55AV7BpTXkjGcTJBI_vgy@|;>c?dsjIE$?ik|K_~UqkISp^W{7&EUpFy);P1rT# z-7}R_42m2Ktjcd1{bs)0t8^y%nD|nIC%KL5mT>KSrhh&+^UI9)dPlN8yGvE2Z07Iy z{G+PzMu?npf6ULdt6tq&dv3iF=U!&x9SJcktXW${?KjzpAom=+P z6`G#@^mA8V-E?I8k*oO~?~d;N&#-!1Rn##dRtdr5wY^2|93c+-pIqA~p<}pQ?QO4z z^Pl>&SDr4=@=V_T;YdmVzuw-?6YpoHD&4)L=(f=G!}_0de!l$AU};)icQ0|9*mr@` z>B1&!bG7FCU(q;wf=gpk$FfF#)rs4GN1FU+m{a}PZt1#3adEDa;XOhZL*yLhw@vx* zWA&N$8(+>lc;U2f7Sk*yb6bwv+oUy(929sz_ReVDn>pdWsju$7nZ_Dnr3|~}+B??P zb)`>!_a$?EY5FX&CwdWQ=1yUjd%j$W(|*g@kCXSap1b@r_h)U^cEQ+POfQ(29M$IA z@BZ4i^W|J||LBU0MGe6@6OQe1(`?j}xYTgriT9bPO*gdFBRSS;-zYyn>p#QiiMO6D zeAaL7UodTx=h7p6ZE-9dH{4GpYe*M)%(4{l{1}{nTfwVduV$7>uA27F1r_?WCZ000 z8a!5?Sh{Mzbi*0V{SPPUpW(N3e_AW_Gn6Zx{LazQJp! zN6#D;ygR#$s-B#5j#Dx4)Hv-R)pht`+LPHFFYfDAZvG;DM0I;t#$uI*kRs8iC!0(8 zvYMxVQd*~3zApC8NxcOPD@rsX3V$?AjQF(RpL=NO-(`0S!bkV>AN}w< zSbXjNq+eV2^|MIj&bhaSXSIs9gOrIvjnS1~y^3i+W~@K|=zPQrn|Z2frb{(!&v`5I zI{5EAs1OXgqCvWO+ub6|l~LAB?!El`f6jR~cg^;QL6u6Y_~M57jbG`-O* zTe<$|?Qg3m_Mi0i$_@`SUbAU)VOi&qiJ#aXF}{v!zJC0G+`Q$Nmwi=c=P{geU&bo+ z+1Xz0;C(DRw`KAlGP{wWy*k;ygNyIq@7yo*cEoJZEOKBxez&1ino-G+EBXpc_+iWR zIs0`=&eq9^2a4+}YC8KKcz=1>-{MpEXU9*ubU5|ZQU0rI-`2W^h^VaPFkPU2S*z|u zs!e=Vy6~sHSB!7FFMid_$$7**D6VHo>krNQ-=g0<_WKELxN2}b zS`fP9nB=R*5pN zy*AwveQ?Uvs{fgY=|9O6d#*l-_SL)O`DMnv8}_o7HZ^FUe$>1D@m8%p{kIPNXVCq* z@{8oct(zvq{Yg#Xnj@RCHX}T5@e!@JU(%P_v_D@_+8wd1&(+X?)#J|GZ7&1&m7cW^ z&h${}diy@AXUeTROiaze&5Z1tFMSlRiZpOFI+d^AR`~vGY~Y{0OU{-^wao1Z@KEVL zY*+mAl;qa6S&u{a?268gtYDe5UMN*?&BnefjvGz>GnB1&JZ*LSiQMevcMPvQX1Oy- z@SoDdmU<=+E#bEdp76`ffAz=i+Naj8jtj@OthLIG`~BQyQ+Glc(-ieXJ4$obZR{8R zS9(x`tI@CdYw{GS{28rkQ|{-KL5|BY%Yko60QX~3Wj1JNf>|Y}@@B*rbNR%a;8=G2 zso%{9{Xb9CE5&EcOX<6I-uwCT)7t)e=S6}&y{>sC{_qvCkXzywmQ@<_xqjBoFV%q} zWr2rw|JooLz*EoE9_ed&ZKY(IU+#Yf{&_q9Gt8;{%yDhYjGz?3(-MohG^88K9tUpJ z*;}9fbl!~1Z&?n8mfg<3-tO!g#v=POe^$KCp^qQ5IBu^vbaPMha;vEsp{<^Gc=$7) zSVwzW-afX1bG@83i4h73vchy=xsz3Li z!89v4)7&RhY~@RFH|JB9f?OwqzfGRLEI#e;{JeQwyN$EL{dJZKo>Xa5bZV#y`0}42 z{B8O!dj*>ZbqiUyUXg3@TCveG>x$skY^Sx?v-0QdyQIf@s`>N^7RGJIRSX2Z-umtD z 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 MTw@IV^Z(xj04ieq9{>OV diff --git a/doc/gopher/pencil/gophermega.jpg b/doc/gopher/pencil/gophermega.jpg deleted file mode 100644 index 779fb073accf312eed597ef9571f200dc6034a23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122348 zcmex=%(V3=9km%nKMH zcK`p+z_5S`W(TX@0%jPS#T}%Ofq{XIkr|?vfeqO&j7kWd?85o&ZSlQS)IJvkP z(Ipufn3!Rb0t}2SjLb|dOswo|9IVVd#*7S1g3K(6LWZo4fr-LOg^fmRA`=&GbW&Ck z4LX=)Y*N&8(V1O!Qt*d|ACrqs#TIR9R&$vglHz)3afzAurO-#IpEkD~zFhkFvzz*q zC9PYg9=Y=5%hIh!uRi@6mR8m_ZP~VC*PeYdcMnf5Z=b$=`|<0~zY8)jF)=c+uz=mf z&cP8ya%q)awM^?5K-d zdy=K!W=mZ)ndIr^sWK^OlBdd)C6hc=HC1p31pmMAH3Y0+O58WYzUn(t$C{p79%En* zdM-3+PShr=clo#GcTeo~opDp_lA+GZbApk7IZo`|Zu)k!R(s&I+mik-R-Rb@#k}4! zQTx}$OE;bSgSXB#*Xqv;Gkq@{z1zaxKV0s{-QJ1+r2m;;UAAZS@qkxzgTF2JU3I)9 zX4dTPNs;MGOCJ~Sm0Q~UMLybK`@7ZZ*H+zGwSV#Tm&RhJw-)}=zCYJ5KY(YuKEtjx zH5abs@0WdGyXMsT%eOHfc)T_PbWY?{#joL2le~hw`B(l;KYp}y&9N_Q(zFj77royS*zMf^ zgWIU=&g){+f1R%W{~31kAOEWPmAU`x%7t5>Jh2y7UV1x!@o#s&OW#7iTZH%Bxi#

    ?<+W)@@Nf?P=8Q!hGdfZ)g`SM4GGi5!O_^-*) zm#AQme^ws!XU(<$46Uo*-1yIMCgt9CG4-oWMv_;omb|ldwt95E{@~;JH>c$O^Im=E ztNrUv&07qN%nlZumqM*JuTA$pQ_Ipl+jZHdyBr0{+j9S1@~S)~KmF@zqu;F8lKw^> z*?8sh3!7_yUQ3ik7oJ$rUUzQoy;HND|1ANvi}U-bq%))KY#dDXT3%+ zSa(Tu_AI`eLbvnl|0Lb`wc^z4U+XVPhlug$R46zY2lM^ifBKjA%wHeB+P_v0+pl|9 z?N0dPQmvP()%G+*=hij<&H8t?BKtps%lCS#BUA1$e5r}rb^q$_eHXvhZhCWWmiL@% zA)LS6!u`LN$9C6=UH^60`sZwW-(Olq;gO+R?*{9wJoxp-g>N>JtV{B;XVp)++Wyu2 z)rDVMzt+yRR=QYwPH(&JuV2-7q>dZy5B|ej8g^>`^gqvE{A+spOaAS=-CzCX7k^pr zb;l=c>rBf?v*>7@oL#qeB}exiPVN1ze)IMD`jxTuOTXBA{_>g>yzKP8<+rcBd->z0 zMdggSC6?D8T}_tXuDjuRZ1|G@49TBg{3|-OE$8InMdzQdkCG4H)gPT7eg1{zm0f@I z=A1gG9%>|;94GN=<;miczum%@{b#szKkWRode8Wmp?VuH@7wnE-i&{}aeU$~$1<~B z|82j;ckA1}{TqYBY<>j&1tzfKTpC z&g}Rc<9}Doz8U{}ec5;a;;*(QQ{JiUe7$c=d}&$yr4P5$R7GdspFKPOW@fE#{>s-$ zM%NdQHB3>E(>=sk5UaHh*0m`Q<;u;{ObHy1s0zTVL|Zh%I&D&zT1@XHIz^cJ1Hy zh4zaM-?w}9Vb$@KL9cfn+O}V7q3M@3HK&)HklPy?9vf})y{=#DnaZ;LSNF~Co;a!K zb#nI0y@v0Py!dgz+cDAfd8v8C`_iA5k#bvg_Wu>u+5YlbOz+p}OCLQBu8%&xbZvFC zY}khTd13Mw&aPMO{a1FYu-4mf?Z5Ibb^V{iZmcfZzed)0VM&jT-a@}T?!wG*$h#dfB|PM&FdH$1cLyQpenxAuPa2HEBb-=imA zdSg)@^*1&lA$7)0y+XY^f7WOhZp!)3(7H8S&-zuwW^uba?l)hvC;#HBdlZxVa{Jv& z@2U@G*Uvjv#=QT_^3SU`diwvr1kU}+d*7#;**3*pn{@G!!^Mk>RYGXxHzL!`{C&S~BGwsJMEz(da+Jv%UQ< z_c|_H*Ks}XZy$vpodNyqbyXhegt0u1F+h65hwT|6+SDCMVvbVIoY;TrV@xM)_ z&eyWHzdG-3iR#+|3_rYBFE#Cz z_R595EdLo)CoG-X>lbIbWBc}6^Nm-d4j)WDn0)*1vYo0n!FJof#%=BGoO}6`p_RY? z`4bWrk3PPBI$JJ2e4W<)FxxQGv+0Z7U&p^(_gDVKm8$i=UpB4ywbl3f9F2o(w%n9k zyeaSO$yYOD9lyTWtogIzuGJ~C$Y1=?+CS%i$(Dbm@BeH4rK0yM&zv|_=4QR(WNqU5 zmAxlczFE7zeAWA=6lP&J-KVq z&EIx@cdFm6zjFW0cI_{A>tEZadzJp%b;WQOfB4DbCC_VTi_9~-^!<9zv-zj>JcW2LgRX_jsm%p96_@kGvNZ!_c z@7Atu7NXA|S{}Z#?pgn(-|F|h@4jF3t*-0Ue$Obc(&?(#baL&3e_g)!;QXbu_PzIB z+^s#c-aY@%efJx?uAcpydZe^gUte^s{_2%>hnZ5>f7x5c|Lg0Gb?g5beVH%>z1CT~ z!LI+(FZmfOO8lBTzcw#^^t^P=p1x(bBRG!L&YNbNms!3c`JvUe*i^p1@@prj`R+S< z<*3Du=gHBrCY#;1NnP8z_{H|mQFj-r+O#{~`_Hg8@j}D_tIe}lST~+IlD^BXf9Jl% z;u$;YKi27

    !8-gGHaeQStr{@35;2dSJ>sp}qyA6l6 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 diff --git a/doc/gopher/pencil/gopherrunning.jpg b/doc/gopher/pencil/gopherrunning.jpg deleted file mode 100644 index eeeddf106f4c0742ccaaa9cd5c9b4c2c6e5f57ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86299 zcmex=zMa3=9km%nKMH zcK`p+z_5S`W(RZ40%kbd7Nn4Yfq{*Y8KRbf4cRY@N(jF&Y9afDi4kT7qY)F_Y~c{7 zc^**zfa(7?{=a450sA7}*_VOw|2qagFpnXn0i^E#ZH5*G9u5u;P7WSUP98ySE^a|l zejXlvQ3+vTQDI>TK^`!GQeZX)!N|+a&CACtz{e*b!pFxa0wVZCAX)?=6c3cb&cs0W!D7@1gD+1NQaxwsk8 zB^eo*m|>Cv42&#{%uFmytn6$Ytjs*dj0{YI%q)sRhOCZ(iNZ>SjYe!D6BllDQdSWS zI+$c^Qq*+OnO${K@P~&VlZ#Eo7Hw))bD12H;(BOtiJADN&_}7CHn$wUT>AL4oBEU` zty`uZx$@-8(yd3YKK&Y&R@OFc*|uZXo_#ZS4^J;|pT2zi@$1jO3oNTMRtRU^@jF>>0jlWv=R)>8q0)8gk*(>jd8HsEb>B zlBM5fOI!Vd4Z4)AKf|Hm?AoYH!HHl)kW97zf8lG$ zB*)XIj~zO;SzGI1s3`CG>K)Ag{yew7b*!$+%V*ND`fK+l$Nbv*JdC~kK^jB-w@~@z ze-mHIdR_JteRjR+f#bSkor&F&yKddM`}IFVOZpF!DKAwfd1~^-rJ0GU{h7^L+9bs} z$$L)Orfr71=co3UUsyZu`-+6GI(&-*ce5+)>AF?6XY{-&SXuDR`hjFFI~6a(!a`zm_NWw*IPj zeJQKEyQ)l7ViH5)vTYl7XSDt5&$yrd?NadRuWRP7v5)Zgu{B>5>uWLdO4_fR-$EUV zv+k7Hwe9<}>ie(xFUqg~>x?}5vOae9)z6=ucja*#&-N%gSmwWLe&D`^$^Q=Tdw%6x zXzu_ z{q`jJKg07a>(j5ly7{_i4!2IC-fv^ginR~wo4>Bze>MG2+WlX*^qqd)jSo0i@BT{U zZ~N*ihZC1r*OrCxosX7#yLI==`o?X$-lcyN3ffhE-G=+qiqj%d|^~5vg_GVfg-@49vPW$y;?7px6nw^__Mf-m6 z*W@GY*B*Y!Tlk?Y;{KmQ=P$1FepM$M%f2T5Yxdel7yhjN9(#G$>{WSxb{+hxyY6*I z@%@SJpJ&Is|117V)pi+s*vq+|+pL#A4V|J@cDh!*UChe6?8ddf{EL5{x^?*VUFjv; zh2E`P?|<^p(r@PW;y1G;4!oYbckA1{P%F#(X(zsFMa~bb+xws4T-I$jU!B#aTlc>I zGRNCv<<;=yxxoi&t@m9FJ74Eo|KaxEPR-YsJXNOrXZU~dYiRt6gru)B)&`qy?(1&g z%TQhB$e%ppo7mp|&(FX7zFVFvzf?Ri-2UrwjmNP~MW6Hzz4*5C zYg%gZ?#rgP{`MZUjAXF<@x#A--D$n_<(t*t%-g!Jf5oJEjjG3P-LZ=Ome+c1*ZhEU z#=rL2`Bpjz+4h}1b#A%Uy!rlrl2?7LKM*{%>g6wA$sK>Kx{BY5KQ-K#+c1gq@7?$9 zw>R!PA9;5DwSVQ8R{z{G<=U^ad91eFM&}kfoIb|G@K{jo_;k}9S2lmo-K=uuR{TG{ z`&I2%@3mOPNy|@pJo#$g+Gca3rPnG5B>+dEXQ}DH^?;xGOx3;os~JMCX<#-m4%A3na`-5s5|XyLY9H_Wy!KDd@!{IzqmU%1<= zZM)O#*wSC~+qf6l)W{Zez`^{UBL{_ba9`6X^i3i|DuaO}~= zw`nix?!No;clBwbx{YbIsjDTgZ|B;#>C~HZFU=EdkKMZ8XB)k%tjzRW_4m}vaj(8b z{+@rXZfe!DG*!tR(-WVV*Glq~hHdzseeC-7KUa^G%>NjFxr#ryJ~A(Kd+q$iku| z?cM)8dTzJt^4&JH2kze}<&zyY%0l zTikznSG{{~-s(kja#p`9-^0`I{YyKGZ)JaK-Tswd_Rss5|8wh|$mw4%{W>aIa>l3J zcEg|UPch$`O6(Ub+8_R+{_uZ>{Lhzy^IzSMSo~W2>YtkDY!*+#H)}1Mdp5TrXWzQm z{|w%Lq@Mj-Tw)_P@$33^kH36~@9jCIRk}{9Ti!g`*SBnaV7X2ps+6U2 zxu>e~VtIL~jbXMv%QmVQZEM@&|0(jVi>Jzz$EC;FO8pwXOXS~PlQN^TOs+V>e$8{; zshwX>POm@vX3m@f*@+FWKCfioy)h>(ddB^y(Xsx^|Lxeiag+9`W2@B`o5mfxad`Q~ zihK7L+s_IL0@Z_2;U3ODbce(m4df2*%(?O$E8 z&BR>XT(<4bG}8tD`mMT-z23Vv+wN-o{=fFWLa(Synj`gZZ*9oNO;)|RCCo2xT;Fs; z!FK<`jlJ7n?EWsGzuEe=vwX)Xy@M~d@$NLgb2;{=PWh!{M;AW6dVJ~If0L(HYj6J} zrdt1P(Y}`C$L+tGmT~hxZ|lAPTuEj5xx(UI{a0-ME&c7h?B>LapK~NlQWG0K2Qpv! zl9&D0{^GW6_1Eej*7{%Ed;hVq{@SN}Gr#(aY*%TwI{n!pBU@5>ua@?PU8igB&;8Gk z`=4R)7kATjnb{4+9!-1;ns)r#{Z;FGX_nRftKYA-&yD%jbRg#VZ&?Suv}gYrnl`8Z z-8N}nxyawNU9;*om#(?L_3@XO@7JgHoI0Ae&Gb08zTW=L#--nbu2=1ryZ@{<{zLbr zs`h|mFL(5vI;mo~#B@!9e)YY_n^tA6ocB9#>${twIU!a0&Smm0<^Jckq{dFl-E4H> z+BNyqccs(Cu7_`&_xxYhvt6OzzUusESp8R6_0j8HqBHZ)Ww-B`Bmb$~|5R~Y%=^o= zOK0-bzhAO^{Y%+&_BF}Y>OA|jHeR_Kx~8-&JX`t7qF-xxi*?r*?b%?rep}V|Yu+;) zSKcfM<1jM6-rfH?^GmsTb-C^rP!WF_lI);OrC@38)Tz66GZf2l$6P+h?j&ygRqwUo zi!;A=Px??~C3~#vtLnL<8>;?V9p1tJLI1b?zvguli|$9gE_Z)rF+cjngfjt#Ra+DM z{#eWYdBe8%-ZIhmdG4EEZvLa>RW)Tw#J7lJH=~ZH0AwNZC>?csWHNvZcr$K3x6&XQM+ zUuqh^ntyfK%~$hg_ovQsew(nR2-$QPnVo}ccSpODz)DW>dJ3^ zbiMwc;X#(N{i-L;-+Y*z)1=Fi4>QWYlMc>a(!rWNt1G z%YmH341ca|U9nPgt;Z|gim!KrZ@4Y&E%vaBo}c#ZKf~>enGrjF&bam{Wka;H(ysz3dg=>FL=dmB5; z@}iGM{CHD3?MBMsD07RqIXmxP%{shmS#oXdv3)z)SCsr-y?5;|)hm(SAKz~O8Lhi( zo2~on)*o;7Gp$=1x~*j9rq?rL^EYn0AHVdQjP_C8&0oTQO~3il{!68Jps)OgOwHY` z*JG+e_r|Zf`rBUeoZhjOpYpzxLT66u+r|WnclGHcG-1j~7 zYHqUWT>mv8h8tcK=Nx$XF2}xr@#>RQ|BI#mD6BXVLq$ zwWb^2rpYBgQ}O#F_4udVb;}$bv!nkRV&xvFzmc^tnK`2@^!B$M{x9xsX8vCLQuDUo zBu~x%S0VYr={0YTezt6;{EQQm|5eYpYBDL<OH*S5EM|Af1srs=t@_rF{W^7M+lxj&+c-~Z%qweo=DM^D_6e|a}M zqHN}^_m?d9@7fY>dgb5RQk$MVlRGDNf3tbM?RMn!{%^B2HyCc&cgH^TU;oanA(~A3@8ek?y_4aBrwte6DPSke)xs5%mlm9bZyc@r4 zH|vSNE-!b?HMV}urpzoo-7h)nn}O+qotl}xcGBCmfBrKBmY&q~RGH)z z~#I>6ZKI=Yfo;LfAviIu#wf0p6Si+){F4&6uY|qOZ$I@hW`xfBmZ&c zUys&WyYmARpe;udmzh8E0 zPu<4u@JqD}?-uKAtB!d6VNLlD|KI-U%l9qaeQDP=_K1V)?U&!uJHEZ0mqYob;TyYW z5%=#D)vcb{*n0W>iB~MO6W89(j=B50`9Fipt-TuMt6tCf&)~VWz9q)o|JUBD`__l% zU-L1)-X41J`;(IHIoY`($6tNpmX{Dhqjx(DV=(Oc};G@^xO$@-?r51`|kTXyZ*Xf)43T| zeP#}4Q+w6AR!omhZvP?m@>kvVKhoD?|1-o|^@U|0zj|)gzs-%&s^2$AMep-AyISU% z8X3C#ALIN7{~5NmPQJ8@KW5*$)n7}$CYJtDpDlI$`b(P$X8Y!x(Vii5_CLefzw6&z z+qZsskXM=Ax-U6hYj&^s>i93@75kMzm6G=&r9D;dAIg*pKiHK_U+X0$4}Va z-OSZbbM^o7boSq`zo*riU;VdocCyZ|^E1P0OLmt=m|T(UdA!B-X6VgV_DaX>%aDi{k-vI&{g%4dw$hrn4{dJ$YX9n< zXwSADv8t(OtPZ{AnY{Cx^|j*fQQyt)mw)a~RhhDM_SJvuOXh8UX>HdZbc^S5am=%b zvySD2A! z1_lNpkV@x*l02BR7@TvGir}1}^kQE)$GIra8NtabL2!JMa*E+He(5D;aE@zkjtiXQ znOA}^+9^3Z-9ITS88oyBas&fIkh_yJXh0Uk3rbN?NXaiva>#!G;)1bzQ67evQx2v& zr=paQ(7X~i<)9o;Y=QNH2&bGB1#IF$#W^Kl@qmgPho%D{r69~zmYQ6WU*wWlk_hqv zIGzL21Bzks3}S=S1*8XnoXy~qng%fj&DxOs0<6{sC+9%K1B#LzB0(lWVvqSPm@U8* z0S+1_7!6LHYG64&FbO8?8z8z^c)?uI2)PYdr6im$2jVk-2J<<=B-mh(s5&T(Gca&5 zfPKfnz`z6&W&Q$ICB$F~R;UXa`38$Hf@Qyh*)j|a|FHt*7f=^*fYpI)U}Ruma)4l{ zoE%sV+gZJ>fQixD3p;3=GUQ3?TP~GUPFoFk~{6Fyt_#GNdr*G8lv123Chc zzlJZOQQi{=1X>y4ntPB7}ZBBk(I!GS~ zgOUI;->D=&7s3a5g@GX`J);E52YHLFI43hXwKy!t2b2{VQS4y_%RzG}JDB6?0?`Yy ziGe-6D8IA-MTjlGC^J1X51KxCT!TTT`-8<87#MgHOH1) zNv$aHEcOWT^?_wq4wx{CV$O{GqAJIn%yd{t@k2cC0TX6mU|>&4O-n2V7ayEusYNAN zl!w8DQI&Hir90>6jQ>Yxr$%R|MrWr+XQxJIr$%R|MrWr+XQxJI zr$B@2qq9?^vs0t9Q=_v}qq9?^vs0t9Q=_v}qq9?^vr|OQT>ZZZ9-~tPkIR9^{~198 zocs)q3@Hrx3`q>B3<@aoL7a zhrGNQB_#z``ucgrdWoQw^Lokox%w4}1^R}12Ko#(_7w$*$=RtT3Q4KynR&KK?|1K4 zQpilPRSGxtHSjHPPR+>ls47YguJQ{>uF6ifOi{A8Q?RM9s>m(KO)W`OsL0L9E4Hez zRRSAsl~-&964qBz04piUwp9YJZC8l!4N!2-FG^J~)icmdHZU_(Ff-9JG%>I=vD8s8 zGB7mIH#E{WFxNFSurf8bGB8wt0wp^Io1&C7s~{IQs9i-VX|_sGPnDOK>y;bpKhp88yV>qrKIT=SLT%@R_NvxE5l51Ni9w;$^_4dDS%8&Ov*1Uu~kxn8e5TD z05=wESiuygB*WDelosWHEl)|-Pt8fqP0cGQ);H8M1bH74F1ZE1zHsGOjm^!4t1d2a zEi1vVx)?OxtRIwGoL^d$oa$PZnpdI>b65dvO9XZ!;L_lj2Wcv>axO|uEXgkl$Vb$l8#iD#FA87B_jhvBV7YyT?5k)*iH*=LqjVA1Bg=J)RM%M#F9kf6z8X8 zrd1MDnv!glmS2>cSYoS`nVXoNs-IPmnhv(k*VoE3uec;JFFDoI#a5{zw?Hp5GsVi- zz`)ee)ZEb6#K_3Z!qCvd(agog#N5Qy($UDo%+Uy@*Cju>6cm3jy(uKj0E-r8k2=D=Qt@0qNIY3MpW@KRab`7%H=&~-z zESLn5G;4A}5orAyXhE7$N@_7^r5tEsR(g3!K?wr`V+;cWgGf>~m<{R|ie!fbIWsUY zwlFX-@sy-ifb=pr=ND9hmxm~T`aueiK38yMaY<@!v4Uq_a(+=kK5Rh{)DDpIc#)fv zAOUJ(P&h)&Lxc}P3?c&}lS_-rKs0FYICv?e0)qjA1495qB11jH0*0duZy3cHT^LIl zS1{gV5@QNtn!t2{S(rJJc_H%~7E6{6mRqcPtgWo~*euzmv3+9?XWz}C#L>m^g)@=! z0+%D#7H&=M1w2wbQ+b7WC-DjMP2-p0Uo4;_utU&Q@QP5X&=28W5fzcWqT!-n#3qRw ziC>YZkd%`=CY3KOEqy|!Ojcd?mRz5_i~Jvjt%`+8dP;AV*Qyk#nyCI%JE-2J5vr-A z`9bS|_9UHDT`N67y;u523>FyH8pRmfn#h|no4z!=V7}90iRA>VI_q4UINLxwS9@y* zV@Dk)HD@Ik1y^}D1$Si+bx&O{6K@+Ici&*Y1poYi`oM`nOM`cXTnv2~&J-aRX%!U_ zT@f=gc2C@c1hz!oq_E_Mlr^b0(>XFMGBdO0W?#%@&$G|3DA-i^u2{Pyt8`V_n+pBP zlB!)bjI~~MQ|li#>NV9gpKXwk&h`y_F%WPOouUyKlYahHaZnHgDN#vTgegtDXCIyY4x= zFKqvVgE@zO9%(-&etgAA>r>~>B%l3te$qwlOGmFHUj27{&P|(Jckk5SQ@(%VVcui0 zC;Ojez7TnN@OA!M`F9sSG<`Dt{Oaq1@8LfMex3T$`p@zIf27Uu;3V~8_At@z? zFFoQ=Yv$yVkZhUa>b7J{*yT_SsZWnTgEp(DmbOlXY*@#!U){nZBBP>X#)=&$ZoK%R zY3Ui6S=l*r<<65gU;fmx@`}o;>YBA`*Qr~te*M42zyT`J>>0j)%elEZ?d)tb+EMoZ zFVMx7i!`_8)QS~Rf7}bKFVt_JKL7tE>e{CUM4FTxzzqo@WnwQu}|E>Q-Tfp8fx8bg|_+U2GvMFI|K zwfN3Mwyi%KpZe=Ft8HEBnwqt6=bbYZMH9&g!kY2b~si!?&8(SQ zPJE8B!@;W!H{RKB+~+AKzNkq5Pke?vWx8xBCBQu-N*nH;Om-Pxy21vrhM(2h0xl&PX;`Qm)6o==X^uGj^_0o#(0A#ZuwAbV+G4FTg)CDFU-1PVJA1B2shs2Rm5|@wa~mULLaS1rol=|c zcUT`S+uy^y$uQGcCEX$Ruw-D`{DS*!&-RXU+eGZ=i7ho zvP#{z^ylHHx3lYG->uD0n|g1~TB)lE6E?2kI;|R-k?j_{61uM^4|~c%+rOmG>+%}<*U$+-|$)gN&7RE zpoqWWex+=+hPsiHI0bwbCGLE}!O_<9u+H2izyIMc&!6f)muLQ5{Z#b&!rsK4U13{y zZFf4}v#~MwW2=cmSMA-+%Tk3MJVfmznj|An@2xdc?t1&-x_tk@^V$2KYnz5%+OPBV zP>Rm|u!@P@43!>poI`@9to1xE^q=9J*d1s7=dyFII~g*&>Nxq?OW9w2`snV|u!gqc zk0JeAPi}s-bw1MrsUnUDh72uVhhN$arHK(3OsN1l#{Sly7)mZf0R(b#6L~PH%B?biTQL{YzD{ZBkp7e0cnA*C&PGBbS-%=X}}7IW7CeC8hIu@-rSC;SxTz+u-H?Hks(k zzKc^mc6bJctvcb{E|dN3aDd$00+(NJmz1@=*dfF5Rb&JEwyScc=jzw}E6(`k)V6<; zcG1dLo5WSOE#+lc_w~fAy1JinzmDc7UQMisan;F*EsH!@s#2uD##QksT>kTfswiKx z`Gtj|dvDEH^4OANOTpWt9xC!}=1;vIaQmOPl@FMt+Vr$;uhKE`MyAHw9Xgev?uHls zTH0Q=H#Yg}b?bh><@aHauDL#1DXV>|rD@NOF1gmu$8nEUKUSXinYnhBc5Bg<$cEph z3L)PY$ok3LcwM%AVU)RB?{?3Ss}Vt4WeXDaZZ%;F436Ua&%pOwW_sDBNgGeCabQn= zd|3={6KOsfb>@`FusI!~CZZ-Qk4blkuj$gfUbwZUV14LS-M1GnZ0cfTeSNXvhWvh; zss9-)lh--?XP7Rvsp>z2wDNJONm`YE)E3MtzqdQRz5cnp>4`tvf395o+Ss++ChT;< zCFewiJ~wA>wx?0zQ6aywKUyyOoql1r{m)bJ$`Mh&e!aaiOX;-AwQt{kt@yR)>edIU z3A5jbPVW29u;*`IB*xNu{w%CNGkL|{J;5B0cI}8ZR$9JVal)SXoatrb01x1;{@e(iSOd3F7oXJ5YBa(RSZ z`gwI>-vc41)-UX8ty9D13;ky}!1L+b-k)cS7f0RrRn@s`*3ZcG>t_B9xV(AGr5Voy zCN(uMc$}O59>-V4GGymBM_apQs zszfcFyXlU5PT;c%M`Bu8?=(DY$+~mkk#C*I2^pcvDR*>x4EJqLxM(6YY0^>YLYE20 zRSGABcc|I%S#8YkS|wVWcKBSebjY>0x1O%!jgpAJYP@RmN0ptWp({fdu_n8%Sf`$y z{%oyc@-FUIyR@s$JrOogzUC1=U6R#Pt3uBG&HBTW=GvdXKVx6y?!Ur%OSQYpquu%+ zX&$}h;>M$*lbkMCl;^$w-TwJjHu0Y)>`T3n(sw&_XJ?brG_kj5o96kPImp4(8e;VE z$$fd&AD89^pOXJPc~|bQk2@x=E%}*hw&B$!4~spkJ$3462>w4F15sq<9Q*r(ANb``{#Eyu&XS$U6-1Xw5pHHth+W%Z;F8e zf5t!W%MbB$v-X~y`lQ?BLUhcY>HN&MPi-{2H2sO5ND*tS#di6|=?hNQKj*Xgl{_mk zGh^46ZAa}ksvg$eVtmXc9@0`q17hZo(>GkURESt;Oihb`coUJTmz0jJg8r~Q2 zIMhk@PNB}#AC_8WPv>pBT>o6sra84#ZoTc6>s1q47fgEgsJu`qw4c34)LpuvQuDXw z3iG3Fh^z*w2&2z={-8~&{S^yv(bS-{^UheMuS`m6rzxU!M4ernmb z16A!$mQQ)N&6`{D}8AhowA=0~IU|ORcc)GOs^z%6@_dgezW$nNE z^vjsoBiDIlChzp}E_k{m(`%KNXZ;GG==&?{s;3`eSGa1E1sUu4$~ZC+(0Cx8DC${rTQy z>+Pl{eP1bi>&SZ6Dl|LfVPq>}_Gt61GXUCN- zfA!CZnQarkug%GQMLpK{d?jsB zpVtzGs!!JGK3n&0+1ultZR9ImlA_T3J?TMnl+=X_mybjG1ILb?xwv?j#N7s+mZp%2 z7bXU7-Y?8BGq>E@b5-vxEEN&^sJ`m6*F$9v&b1K}ST*OIj{MIsr~l9T z%LhGeE-zDjws8NYM?XTRPny-dHFIlK*N^m>^~Uwjjcd*qugtR2f4X*V@72~hmu??l z8ymBvz|bRd?tv*swzw(ucOGf7v`@GBx#nNZzr3HvqpoaOx#z&ESxYq5^R^y{jxOQq zddsz#FK6W|ljiyCrlp~ew8gi6^4tI1-(b(7U$yDZZ4uMHpAq`?FzA*D!_0XuI+NCT z%0w@h^Zr<09`j{Y{W;B_-GQBJ7k-xcR2dx5mA0YJ?AH;qkLMB#8QY>h2Or&GWfM35 z*6nGf`a1s^&Z)TOFFj&foA)h!lE&MKnmH`lxsoB=zh~twS^VjVMCsx4iuLE@e(Imn z=ef7^%yqFd4?LAMo~_-;*RiTEMA#{O=VL$Lxy7gIC;#*Nbjbe~v-_6Iww_V}7hD!h zD>}0A_L0e#_xZgwnH?P;#Z z%tdZj1-vo4lbn1ZH~GsoqZ1u$2d?cG&D>k|w$0EbKwnMg^!?gz%R7&9+|KP!en0)w zsRe7R=lv{^&73tmc=>7RgW0F%i}%-*T0b>f&1JCSm?ux3oeJB$d(sa}ewog_5Fexv zK556T77>O1y2Xs~l|}bnU3{b%x`Z`CK*RBN{ema@XX>1{?AbW)u0n5&@?q(M-&(J# zdH=onw0_?H=Tdu4uFVRv>t1nu>C5Q?_Sd>@FFGmhwo<0h^$3^K{XG-jpD}-1_(=Th zzWhHEKVN_PY`5yQY5nEd%ct&XtC+ZBW^xvTa?o$h+8LLVKj(Bi|7?FgWow_L{?dKZ zq$gHdWSm*Y+%i#g))WqJtEq9k9}S)!&zV;l{`qf&KLT&lSGRH_qxzUy@Z-v#RrzZ_d(rPp=$N>vb~hX-|0?u*j?M zK=*$JOY3FFpB;W`e)-nJDI3}YTCXN0bxg9dNIqJ@{>a~c+g|giZ?){_qWEV_OS`;o z;$QYJOIa?gzO+QZ;qcK}W}-YAp3H@}*ID{2MhU*Ddio5lw=n-d!NDPyR+f3q#q&b{ zGt8O$`RUsy+v2DFi=Vo1-*vs*oRmE#Tz1=z28tKlnX#60xhOl2&C34_7Tr%`_5HT} zI)81Qsl1>5x_jK6N&G4q%)68(FxLL-;eNjV=h6LoS+i`e?eaREU2{l1deWJ*r&ubE zX8U&S4E~WmXZ?Q$eVda{em>psS#<8(fAiBORSCMjIx<-+w4Hm#L9GKqcN~^~HotW^ zU!(q2+zb`d4Swt41vJ)X7is&`Z=;HtK!(&5`r;RQr=3zxPkv^LBaVZIA8O zOkON$y7a=ZH$C3>r1OypT8_b9tC{zCz2f(|xj9uVbU_lMTJ!VHy=OEy^~`Mi&vTUe zTV(9=GMWB;WAvi1W#L?VwRf7Fb1(nTVCns{zOb@zdB(0eQmtQiREk-s^mli7@;F;- zP2hOrA9&kx+uZ*Qmc5IztF|p&kiDyS`ZTp@cb7>{pS<(yW#;v4^fgD$(musJxaWB-kZ8g`MB_H#@N<3e>OF3&R(@x##t#{Zszrdx6VdPIMJ%o-VNZVC2eO zU3r;-CwJO?d3xNccHhi&7H<|oj!8xqALA4lA87jBFiZ~h6Ok#uEqf$v%Y6feu;z8o zpMz>o(75Xq4%6ky&S0JklSWlS^z1sXqgoOduCMq}l~VNTkj2%t_lzDnIxWm%zr-f^ zO3wH4*KF~=M|V96kN(uHR5bmu`jOc=*XR5vdD*;W!%q8d{k8Vkl2-NI+Z|Mw%Q0MO zc3@ck>O6m4TAf$6oXh5`?-sVbdg73fUAAePd~Qf*R71r?#w5yU0QXfjv;mmbJT{= zM927Pj-}^+p7GUo{&YF!MvU#z6Rnptxg-VGEB8t!Omubn%zH9^y6^W##nWEbf1V;g z>(}!s53g^DP2$$x-E7uhzpO+2(ze~R9tv5vPL1qW4G#P*FaEY9iMRT*{paqpa-P?} zu6#btLS@&Mi%0iP$avmmHiN$lzuC!eycN6XgQ|Ew{O{To29X8Q3|7HUXD)XC?L6Uwt-)NA7A1c0^rWBhgx$a_~bm5(Jxj#$(JpF9{ z^x1a)wZ&Eux?fh7X6H)^dTO6=cqq~nqFn4{^ugNf{gL#`{2G<3{XW}u%dJd1`!b-D zWyQrE6NJx*CU7h~DVV^TWvHpQu+!Oc(IiJZk=HTm*K95?c`Q{#H!U;azcmj&o6=`;8I z{m)?8X+DEH%P!zb{+G3;$zSpmm##6EJRRsI$=$X>eX4Xy@Wp+K2W@Wt?EKmN+*Uhq z_8Fl&_itrs%Pn2zS+2DD*4i~)OCKpLVDb-G;9zO_@c8t%Vn35VX@8bJx4q1&tb4ik z`AU9osYVIn_`qdXr=Knl+UokrSR@~B}$hTX5rp)rS?U@v{Urj_twUY0P>h>SA z58JZ-XVAKSTHUKw%h%{yw!6aKJrgxsPfc*t^pa~yiEC2@n>POF&;R^0+2`Z6hAUm4mIpcp`4&p# zD^;9c`NA{t-rQY3dOvtfp2|%}{Ed$u zzpA=CQNhneC`3?E{#5*n^X4zjr(5OpuFd>3<12TN#IZj!_Uox^v_dSE~Vvm?&+M?rHo15=J%VH z{Mm9*FGcCqP4xuEud?C`6k9o7IxV<rz9CI<2HCumNrKjVKgR{PwqmUcIsa4N#ZrCkJG0-qy!gI^~$2t(8}g(9($qCQ8kj zQJ5*(SQld__1oSoNBQ~}2~%(L_NI$dG+DxT*!xv%{=EEO;l-RaUwPe6d5bvwsSmA~ zb+1fX&>JF9X`Ji0ab0Ep=fnSs_HLOivEa|1 zYbCEwf8XV?j?->ecWH|Iluet~WXaD7&5IX5@qDJu!Jj*SuKn4+^7@yvN1sn$w!iDU z|K&WpRYxnt)&#lCag^S?>crFV%W>}Wk9Ply{O7Z7?=p=mUv{rt?{es!u!`Z)Y;~bp zgUyz1hF%Lk1?_S0tLGP!e66ote@-Fu*83@IzpOX2+2&iX6!S{(_Tg;VLu+!DnPfK# zTT3ZjpKMVvmKd9QZQK zVPC=+i32JDKk~S zgehgoNL(*_^7=@ZnPjE#zoOfrpVb!XE^Y0Y$?_&RaMw(QmZ)DVWn7(^e=AIX`aASh z#k#8f?w|KfUhUAc-O%Qb%Mz!`l}=YyEHst=c9KP^McjGr?lr5l<9MW(pJoG>ldH<# zw^sFb>}2(LvgKxGywtxv&*qhVn!0TDa_`)7j)}4rqRb0zJ=Xi}e2{;x|L5_&ey9G` z8~k(>(+<<+y<;TSyUI@Kgoo|6#BKLq=Rb>7+;Lg&hB52BdqML#*ZSl*D)e0ySyw*) z#CzM9`(m%G-M8}9?N^3doFdoS%KIK!6?m0oz_pigOUzT=GzMSx}cAr^7t=aL9k}=|k z1*YAUsGZ>6Cj3f@b?KE96Ngz>gtWJxwltsrpFy)`|N5mzwo8>TRVHzL?s)vwVqwzi zlM~*C<^NDSuN0pVHqYHm%IUCL=lTq`>cyq37q`y(#PB8>CWm4}dgt|6Oo!Y#rtMIw{?ceqMhvS29-@kQN z^w*xI&=Mi#Wv@b89ans_P!Kq@c;RVq`h%@1K$)3sSeA2hbLovQP!%kKfjcZ=3eyhR zo8Hy!>n|?()05FYpMSgKpMC1LZ6^QJP0h~#d3{;sX7@`^`yH?3%=fd}^WAKs!=+Uo zS}R}enJj6?G{@@AKl{tZEOoMWp|_+p^-_C6^_Jf$mBC;#?;(Km3U?m>%}$%%6jQj)Yt)y&LuF z(Ip3=^ZuLtyme2lIwo?A|LBR(*)x~lTK?(D>l5{ps*<7)uK$-DbL;l)7-o|wBd?1w zJEn$pT-0g{3(HgB-#oA5)3Yv{^UGz;KRtJxbx+sI-8bH+@0zWh#G)x85l<^;{`}*8 zbccLv{F^@_=R^L*)WzI>F)!wl@|6b>?-#WCO#8ThrAX0sqeEs2Qu=0r|NKgpMwKl) zkb5}?d0EKRK(B8W?&~Ti`&|+<-Lb>tmXp(`RFXfH z4jh~Rn*V81XT7@W?rmGAUHW7CZDG;Im*4KV+?jOA`1N*4bH&Jrs+{T?_qS%{C;l@i z+N>{pn$7&|teM82lghuEyxB9JrA=}?=~F1=v}(sQJA>|j9ujiTKRKV==$g7X;-u0m z?~2c&6?+qu%Y{tzgr^EWc(!oI#OrT9oy&ec|L1YrWGA7lZ5vOU?wNe{OynY`PC=E0 z5kJEk0;Ed+#Z7I=yjT3We^P0+t+D5hy_@H3R?#g=o4L5f?@sG>DW(N0(-L-HwpO23 z|6Fy?#h;PStbMJxo1ewu@5{`vN=r0OL9ws@CWav`GD^ZY-W)?NIzeX{*?#XXJB z{xcY#eR5am>+@^5y0;#^y1S?};((%uk-_88WGC&pW!y8~F+QkMU9R|<;ost}#j97O zno7L6xj8v9Ye~h!xRoiB4x9?vG@(-KyL#Twb6fv2s2{GD)^>>u`Rsh5__5cf>velS zACjMMKXKOGYfFpQyl65n5Wlvqx7Ji^&aB1N zc;<%vc6fh8b18qX@wNG%yW(fvswuc#8THKGIc(C$d)ECS9XCDLyN)G4=veJ)FOhux z(d+q6d-kss7MI>}#AZde=JMkYGH-2tIVr?C;H#W%;mys-at06j*vwv>5=j2o7^z@Y{YECX)yN9#XFud(; z%92Li#{m{I&3q3SUaa`^cjN2xn*SNjxx5O$7M1#b#-7#1%UsK4uA8?-E@I z5`JaEXSpS*0n0h7=5hRe?sp|;Yqo}|tX0X*%{yEtNiIrwb?VTfR!<3Sq*W#9NDIY` zB9q(9riF1z@%fy|V30j&$+7#-txuuTmfR{mwl-_hX91UGAx}O}=RCl0|I9)6pYi;C z&QJd{%$fWth^^vD@C(1(b&qCcBun)h>+myM>clXe$lSWzj#|EY_L4kbCza z#$AWupdgcbd?0JBalnJTJ@G%KCUfjJ`7^yRy|gxWm80$6UfwU$KDk>R;&}e?Lz4U9 zk9l_Ik9K6l&;IB1nI&%Pw9Pr;&0daEnK>Ra>^7Pl${qW<{q3{6ym@jr?(k&_-7&nO z(dCvBwo*ZAs;$AQ`ZNC-)NVF>|J4&VapPm@bN6NxhsyJ7g_j5Z+xYl8Z|_I< zXH#2#EuUc zezSJwmrpB=*33z1Tyd!?KDWzw+ryPdcl#NL`qGNJK`xB=*NSNKN-H?{E zO#55(4*RyE{b%mx`)$9hYX03fTSoD;Wxfl8+2dDiBKP}iej5Kgyz*{#UFrTSr|$9! zF3ZSC+tGV{lHy7&l}G-!eq>+GoU8q>FzeL$plhiccW=6)moL|wZMr2XV{!9DURSL< z+3Iq>+e7~|Xxq+T@XzB_T1X_@ zTk%uZ*ezY=u;KWLN#SozGk429&pjunwMrvYgn7g5uc=6*0ZAF0wtLJE&2^9J_Rl)A z{9-_DRM3L3hThMUDnI`#l0We;vMbwh<&s^uju)zk30i!OUE9Gcx$Nrt&-GKP(7Jm|(bK)7zg0|nW)Y(m*lzm#o745_zP92ayg z8=Ph}Ze;(FGWm~a-ZCXYPt~Jks~I#HO_t~6>~p;Mp#QpeN}uzGHW!&4C(M5 zmxV-JG2U%x&!p>KXUTN6UbA$s)uC^v&Y!93J)_(mb+GtQbjw7+=?^9~Pnzs>;?&ig z$JhP^ToikC%isKEdB#U$l{2qc_XK&}n@}0GN>hFRyW5W*?cF@L^7|*V{|u)M?pH29 z?RD8PKVMz7Y8+ZJAd-bt5Pk{T^ z%sWSR_fA{j`SID)V9vr{aJR-`T2g8(<^S?i*EUmAFy(HNND`c^>sTR+Mnw`dHr&J$=|SZ zLFYdIjX1Jlrf6;E&5O&5j(6OhUKjo01-HTTxaceEbxlv(21y6#mgMT%d#{_ZVPo4Q zlikM)f_oZNRSf@R)d}2u@Bj1Ye}=QC{q24#ojT{fXLiV?E3UP+j~0d{JZWf+?F`Vo zUVqruJ=e0(?UpNp;O)F0DpFlfpPg;JHG`i~RC#gkcIT+{>HBT>{F~=-nf2IG!^QTC zkBKZ?sKe^&Tc-WJR`Rp`8LQdxugj|z?cO=-;d8fHJzsPpolDnRC7yq}Z~3B^{|dKU z*>l$D_R9&oy^VfpeVpcM&+Wo4-|4OJqwMLt8K2uHy{kF7=HRpL{pNe;Pd>vjO-%UA z##>JNI={qinx}XzPWShTyE_H{%zV-R^QgUrcV>0v&qT8&rrx$j=QO|EUg09-($%9} zaVtV~`ef6}raw{h{i>Ful=+YayQzXfydDeJ-Tn4{`fSY`O4Do^)>ZueR}}yG^O<{| z^L`!o@~(KBzQt^sIMX{t!+q0SV;5?lTCs-j46D}JpCdn8DrH_lf7t#l zJFlpEzFpWUbxqGacuUK)Ne+<#D*k6#<}*H+)0J`>)U#9jtoy7xwRrLCkFL)+dgjN7 zGag-gaw3D_CS8xe`|>J{i~cjHhA2Ke|MO_Rfq(JR`>$@rL@iq=?XcN@vBj2K>Uz%3 z%I?BBJ~b z7PM}N7`m%cG zdNq%P%MW)?Tr9b!B*AM?0jOSbZXRxf9y69(m{M85hFHAB0w>0nCuGLPT zW_gQjW@HyyC4VLO{;@s#WWM}o`13gYId|oAXS?V<+InjjIp@sVZldP#w0B!V%n4bp zz{5*Q?0JnZXloff;dQiel-2IZJd%CR(Uq;&_hqm{k?ynoW|_NG=N>(K_K>UWrp}n% z3{2OST>19#Jahdy@4B+gx`M7-=TF_*Qyyh|eO3P2g$lc?^pAJH;}>?`YO!Cc=+TYX zpYA_7pZlLJ$osk^?b8Lb3vRbs{;k=tr!?u}jER;T9{Z_$T&#cm!}Cr58PxtWJeRSV z|I=PzvPa{p(rWPDazA3fXQ z)3U{8lNa8-wdrWJq~J;8&C8WId*>O5m`ZJ&{M%kk_@Bo=pRD>BcIo}GpMB()Zi!}- zstH(bnLA65UwN-;Y1QgY8y>&v@9%%J@_bpP^rzo`pN`E;OwAT(Oz3cx(GGrjO!Jt* z@uHPGqW&`oPp+;t4bwQtaN)|V{QXfff~pf#Grx&cTwv1lDu3H==){tFcv9Pf$2UHj z>bTioUa@fXw>#g~1-mNtxYV8J)2aG$dvAg6t*K#YI;$G;IPNq%?(bw@YV|;R#sqh* z1v;lfPtV`te0jyPEA0CmP4^1jdv~waWQp4&|92A)Ok3*s*fsHH(^me%Io^>QKkuLZ zwfI+*+U`%M7p+OU%d#|$@s_75lfl6yI{UZ2{IoXnw~hF@St-BLHYTpOTdTKHcG8kr zWpmRma$lSFbhW~Ssfv$(taQ15Z|3vA(Py>upS^X8t#{wHpXrgK(JqPf0%gOsv9c?w zOzYHwqtdt5KNtGXU{)$`P$~4+&m7T&3Gx$?(%`>h{|^QY7md@g_bpJCR+ztYQ=Ogi=KU9Qo+P`kCemUAj|?OQGM z_T?1jZFdy#|wDfN;+;vItGW@ z^4XgOzHHsq$)u*fK=MKT&og(uJhuGKE}3L!eA<~?Azi8c5lgdIK-brw=`GJpC$yQo zzJ6PCiGJkFRZp%hne=Dd%BR=su6{rF)qZZx+RUf1%mF*DF4_CpM!@F6EpOvk#oZIk ze_vu{;5^kC#4onswypSo28;A{*|Uz%U2iJ=S|az_Gs`7c(jMx_sM$m=>dkal*>ocN z@xpvp8l|RXUPCxaZVTN4Lwq2Lgnrt1z zUu}+dveolt-oxgxI4LrztaF~heTlv~*LL1Yk%ai?v(0Il>#Xv@vaFR zPlJwJUt4IocI}U%N1VNmS-t)3k6XfzowL}tQ_*Q-(}IdO4Ch3j_5VDfe=1fwX7i_C zS>ENV;$t`z#a6%8DQ;W5riWkj$BVt$Ct8;k$rgX^KK-w(^3Q(JKl@_3JPvG~nHF8W zd-m?Dw`3npzsxmnwKd}_m9BZy)qfN(sdK92_u18V`|LLn&_rY#u*-nX_P)chSSW?yWs}89f@Z8mFE29j}{fd~lxIh5rnO^_n)XYyO2_ zzGt~)p7HX7E7!cvmtEo%7;b3Ld#d!O?VNAvPs9H_(QAGFLjCe`*UL2*ljLNb zeShq=j}t!T);L44WW|aVygPmr#Xfs~MpylGm~s3ob4}L$%PKvUS-j@1@>D24&t8}H zulVQX&-HzMX4{x( zdi0Hv?kOFPimjWERk|Db?D1rc3~ByYwCcjz;=8xZIujRVUaP8`pEvE>w+`h#6%j7Y z9k+Qjl>+ZVtD4*|Ztttu{;w$g^Mbn>N&KqWLZ*MjWAud% zPC3z}bm~w_(fXI0FPSTt8h6zB)dgnl+P5;7eWuPViLDJOoC-bST+VF;ry}bvaP8l+ zoAsUDgi8IBx565i-afoMnmc2j#Yx|vHHNGBLhnx(6}8m+wZ%nU^)3U`?2?~JH#ak| z``q-6k}6$xW8#|@i@iWx8*K}t|WtmSWJnh3!0CZ~mt_^_i^P zC-ch>cTG8To+)Ofq4qK76^VXxCi>m{ygvTo*ZZfBf0o_z=-4^#ExN3W?s#2tJ$P!O z{IZp&dbRpHxoZ2nAFQiV|5teWvsN^(SFG@vrc3OfMV>u7B^}+}zNg2;&_QK_vAKv{ zlg4^>zT;i1uJBjA6gSx7$>W~FwP^2)#r1WIYb@AyZcgBSaoFjUqeAcbwo3kgMcpSn z*S+|3-#y*rd)TRGV%tq-Xmjnl^6zw^sO0D7u#NK$eSEm1W64BQmCl2~fmZ}K9x#ll zO7agf)Hi*!=X8xq4u_WGjab5yqXl0!=0J0$^|c^mFIFs^kEy4}V0 z+wwhVIfrz$_3XRh!TmmyZavDFaQ~!`=;mLiPrTJqczPf_`FH%5&=+@%Z>59?l(T@Xzv7N_FiH$%Y4fI@%nOx!HBu`(=ky zKHdA}afvxV&V!|4SN;k6Rblh_m)7h2XLxQ{vtqmU!YuQubt}0YCf+*rEn|%bJ#HL+?Mv2}?6vo9(yr#t zc>A!`R%5CNpJvoYxf}YRl#WzBtJ(;jmtU^%gVS{3N0xe-hx2FtXP6WfKj$llDQDjM zocE8rq8+{o{|apjxYNuf)!*@N|IL_>^3U#1GQEGQ-qdXAf;;iIBK@^$ zow(uMSfj%k3$*3891%ajK3SJy9V`SMhLUqa-6 zhEl&+R?*c*cgoooU#Xw=pJDp7sIrY_J8d*o-!J45K5{hQ<1UiD6 zV>kPLGXLry`+PRteJe))-7Gt|yQ|$E9c-}4-0|`IdH%YLN_*Eo^FOO>y75vV?&b9jUM}Wq zHrehyXxec|Za#60(keq_9+{?qo^lTYTeRX*1(U3PL+)Rc*;dpp|Ao~4IOyy0On zt5bZsVw8DuRIT2hbyv3h=D6f5J!M*XZ_cd}Hj&op*V4@St}t8_-7zng>&LF1_k|Nq zpU#@M`{z>oElT{&e%AY6Tzgmf>XzFUu1{BaZEj^-wS0!c`#XZ$s`4a5C)R0A zV*6*YFDHAw;+*TB^-p)M%Gf@UW&KKNRoCo~TxH5H&(E{ zbMO4f-QE_VNB5KmdP<)>v0F9DGipj6Q>(-J(8u#V>Yq!6vQHC!b!$;p*u6;-{~0c} z2(6lUgi|uM*<6JA&%FD5<&EEw#ualQYbm3z-`@E?X3x#db!%?Sxp3Sj&5||bx$)=! z3{S!*)Eh*cUH8&3<_^Etx}%MSd2dx5e@r|XI(G&CXYswX7 zsmnK9M*!=v=)A8!+)41Zq{|px4GT{cVtJXH(`FT9ZC@#xi z^+-`>Sb4F}TE#AVuT7UH&zN|*SERV$zF1i6e+CQR1(nOauI27ITe|XQ<%0Vj=~o)J zS62#nc$v;xp`zHcXxCPb)c*|X*8NlJpG*H|&?(t1QM2E!>(;UP>84B8m(~~RTw3~U zu0%wNTl%Uljax>-t3E#7Rvztb9W7mvtMkx9ckRWbCXFjvDj5u+0U8VpIfnHQ5m_A4 zM$fssq4`X>;BBYtrmTyX{b#7I=Sn{Z8i&X~H&;Jk@9dMijCD2_KdvS@y>uC7&@n6Sf@?WW93riN3pF-;2(t{46mZ5z$IL2%Iq zQRxZh41I@oXmI5igG$L@rc(~8o+3P&f$y{f!5JJh5vu$zeb3g78>hW`<_A+f^+Uxo8+~UPIX4|hdW{}IAdDbeZX+}CY zBvOSmIBzeHuTi`5TyUoHG%q$+MPaW@#Ie3`9o}XZ3;QQ+LJ8*oe$V&T`sTipW&QiCHH5mW6Jq;({_F7*;v=Ud!o`#oe;4{dse-&pIOPH z@#n=SxBh2)t)6M0ws^0X95zjBR^FJ{(KhLV%sk>F!Zl3ebFZW6(hD_M9=)!(K_lb|J-p;qIx3AYP zjn{j%{km9{PrKv1inQpTOT(w8O{_Kh?Xq3mZpM@9g}1+LIifFZQ@A_;nuC`p}*ZiNg&mwFtK0Pg)cFlFtt%stI6G9r6 z@UB|Y-@ZI%*3zoU*JWojWQAoGGcV?9(wvw6`TNtjxn^sXkFrV?ZBpq{E?Ohe9<=_d zZ&va7xPm{^X1iYgYAJJA^t>c*L;rV`rcI)&gOfPf_KV**Z~ro?_Url?x@$_bXM68{ zYp`UyhNQ}aLI;6hg?W95;2a7n#5Ok}M>#D6Qgxw%z+9jKM+WzdS9T^d^V8t`}u=^-Okr zSFz`J3&oI|6uU7i>^+T6F-MjX7>MYH7PdGaFy>aEO zSQ|C}_B@_Hlm2Yq{^!J>50_t;{L9+5?TX5k($_CUQ?^BW^sJSR*|YfXO_f5omEx*j zzPqu%t@UY=SXA<;HBdAuEHJ>|Z}uBL$zX89hDB~BD1(~iEU45_&g$xFvip!ZeYT`_ zVejk%=~MPU*V^;jZ0>@Si(Zy*ih4EO#bw?cU1iVE*eM@Vf+|1$IQ8$UWW}cw_y0WF zJ|Wj;@6(XaS2p?9u736AQnb^=%~l*UbT)npK6*GbGc;_`jrCx6XgEV8F z*Hv5(yYD^o+2l*TA{+Ylcrq86-FbW4E}*WmE+eac#=qPhnR+U@QU`BYTS#22zkM)vGt&0hz~`5Yby{GF#f z)xTfnxsc<^7gjBGdx9df%+5@9lM$IH>5-av;fmnA%YQol+}-v0U*9aV-P~tay%bo# zdd1mej@o%kUoj|mebkM6|M^_$e+Emzr}Fx@PK)jS{bS9t9m$odo4961IyE^L%5VO_ z|7rEftRnrNflqh;6}rZ6{#q`%+woINknJH(<*#XT>{%8aX}NlrG0tA{@d>T%#`8V? zGicPDUvl@X+SFv8Lx%aR7xv89)8q1L?Xe&Sjw1o4eNeE$mzE7v^xI-$F|drGE&r?gLmBG)8s2K$`y^HKHZWPe`!ciG!6;M$hoGnAuZ z4zK(${Z;?#rZekOOu~QEDToG`2CuvM*1Iyyg=dXS(1NZ!e&=m^=8_xNF>A6bS-oxC zF}Kof*E5}IZknDxoGW{N#n(WUg&v{z)>IbCAGT@# z8TjP&ZQb<9Yr;XBJag8an{z*Qh3BM*oA+1ETQoH)|6}?^`=7^m=s&u=c+>t38@F~H zyXm@Snuy`lsYwM3=6;LQ^R?5Z^^DD>o(4A>7S$$AgL^(v05Ul-rBhQ zyvwRq5vHl8zds?mm!L{<0Jpe`?Nv!Y)9$V6G=P74hxB1WTpTUy( zS#&S=NvUlsvl5MO-roIrhFJWjI^A6tWPX~Lm+HQ~vOS#tROX$N${#~lZ+mjlfob_+ zRrzTvpEf?b?fK`f{lcYDVGpDl)|rZ`|{Tjb^8w=jYxLK5A4HD5dN!b$zx<&)Q9&mRcIDzxnF$<@z~x!R=@E#q8WXt@%pN z$s>(d0-7{jrMA4Er}Syt>g7MZ&ldWxxwZH0zL|yU@~)?h&Pp@LD2K{~n)ewB{Lk;_p*;KND)kmyrLS$j{ABx{gh-!&+iO;wKeW|R zBIu4p(G#tlwdgR27~({8M*Dd}Y-q!{tBk$?Lo{&N4h* zxFkzZu<&bVaFeUV{L5b(R}~j5p0L>N=a)WsMTCL3HFF&aNQjbUE>I*I* zO|KB%e*KP*ivyl3{OP-t`|dsOzU{JSkIlOtcv5a|?%&%d4mz=iKWWwA*0krYdtdwc z<^89oYp-sf77%m0HcZdq*5Y|ZTVmMWeKj?;srq-$-+8qd*MX@v5zJ9i%+6nAkXF8( zM_F13shn?aP8DKhw4U1*2P-^oZcbC-+sXUq(A9XK3wiGpWtMP-=sMi#%0JQQ_5Ac% z-aSWu9{%}wd1dTVv&kn*O*kgm^nSHikT$EBvuC;Zn%tuo@2o$Oe(iOH>z+WTCA*en z%Nu3+FVp-eyi;8qt)y!Gb#iIT)|W@F{0_ED|5tcFbK1Sq`7XPfKKnF1dYLlwjjCGx zDwC~xo&^l5p@$eEcglB9I3M#bu(Ijiv-=*GxBT@vy*zVQ=oS|i7thBf5f@j~soL{f zRR}(u`|DEpER*^hkM|vs`m*dlgO2cQvz)_bIg76()-Bm+)l#}r_xk$S-psf2YW{rr zH0fvisa?w^^v17qR`Hk3{4mv2d%y3W>gOkapUy1V>sD6Q&DOPO^gcf z46`FHl}*Zg$=Z8lHTQ`*(wFq^G(M`+Q{cPu((9S$`Yki1FU`wP4LZc#ovtC(vtYuZ zmi33X+8FL?Tk@;3_qmYGNeTB^kxORYJ*stNr^$@~jl=wEud1$1f0k?Y+wtq{@IJ?{ zq1)qwoDSqz{JS7>*Y9Z6+xf0*b=9x`S-C9h*WAfbueNWSxcBPnKl(gt8oPF|*Qsr} zZ=?M4vbyy8QMY*R&l|Z*^&#v|QUA{7Aj*o9yOm@}IlQ&34Ue*)@0BybH2c z+O>AxGoSxD6OA^7gT9|YJzk6!k1>(7CLpxSu|UhsLs8$=17B<=iAAwpQf(<oIPh$ z?L_~=`S$k4e|qIwYmYQd`)sUj>6R>|7`5R~*?)%Q32UvQO{cx{)%tYVXYYnSOXWS2 zGm=J7D(y-)Mc>)}n8J$FrWUvyY{Cf~6x zR==B{K7XDZclB#*(eKk$DHr~AUwOBtWM_HRB)zKixQ&dd~X;BN>$)Rq6nAb=s{ z0#mukN91M3|1W?4miziGxH^Tm9A-?gdfQs{e#Vx1-J6~(vc)~Kvjv{2^ks-T-tFJ; ze$MZB(A3+XeV_iG*|t5ZYs-YAU)xi{QUqr#nVI#V@W(Xu#~<^3T3^Y3p0R&&*|hTo zrv7Wag^x>i-Q~HHKGm|2-`{U>L7nZ20<-!587wFMOs=iY%x699HJyupMXQG7#XH(e zf0~1AkJ<^HS~jz6{^wcpQ!ZtRg?$eeI1tw;pLHoGtj^u}LLSLc2&iN^1V5atmXJKSw_;pE*f$ORt-D$1+D9 z2RXjLtFiuU3tybRopqU~{>ZQLWuK~6IO%;!a5rEUjQWun{4eug{PB`&#g%QxxTjV; zGCXaQaq!u4MyEr2IvIlZc_+`)oEoRjFTA2;qKAfa$wKz3N1%SrjCYz*)sIxX-Bz*~ z^NETqdOIii^ZT=P5tnL~SJ<2_+BVHdv@<>7Pp#A8PMh*qT5gr6{}p6^dhfa8bKLHq zowBc92|AzmzT6Sk(x15`s z6VrB`*;VqUX^p_;cju?ypEGOj-Rm<=bHyWeY>VE#F1OfL^m&BtUwuEbG@HbzHidb6 z=D#UgR<-?K;XDidnvIKYALy*x7I6EQdGVp-irf~i5Dk;NM>U)l+*+Dt@qA?{)0MvE zE1`3UK3Zlbb{0~Pj2=x{xp4X2`&&R`(~YbbG9Jnd?AaE#c{s{Z493l z{`egb&LPzr>!zh`nmOy8>2rn0TJ8sgV`rE;*hwgV?vL4YdC%tR+Tx;# zheceMJ)5`Sv4oCi@J8$Wc}$zHnfjmQKkKVjp&+i!d&Xlz^aX`R^)$Y~Zvl*PAv{c9 zbAEL{-R8e4YR#A4dxmGE0#l<5UsTonF)CfQcXwe*sovpLQeAzE`J6PQc@8?9b(NI) z?0idg%CaJ+kEZL}DzyI<3H>{}IAhJ5$CKR3B4QR4cuUO-T^==mx6NhQCikjR>4o_w zy?HFV>IF7h@T_9?32~d6XFV_UE?a5-$^FJZQ&TRPp3QgLzIn&wFmG-4OUu5<_DtNm zCsS$q^CO(n6XS3GomKM7|EX`7^!i9wkM4wFg zW`9|^F6HyG-UYX|?3(*U?9R)VRhQPp^k!~X-fLsr@N@I$<)^EzPyX7Q#W}sV`_65f zm{#sX4xDF%TDF`1XnY*@pF!pMw0iyj4B89-oc`>(ZFBjG*vQJ}fZfI}*9{gQ`LN)b zYVXB{$A=o2EQ@8z*miyi|MdE#L1nVvuO&sNByCMu&wUAbc+@??OnKeU3$drBFh=e) z7YdutcjU_T?KyRMUy)iKSkBQ>`dqd*|LJ}G`&pkSzr1zilR;p(wuFvTv+uXtHk{Az z+gGmsS7aS07x*b9swZrtr~LKQN!M;1&E+}8uWaNcYduSDe|nAW#r@CuYL4v^*l^9} z!nKzb$~*RV-O|fR-KM(0waER@();u7i`L&vt-sLWU-Mq^v(k}wb6ihu%T%4yC2;ol zQCEc=3w=HN%-hq1ZvJODzrXb8yl0Yo&P=-Labbq7cDUCR(I*FExMYvV^R7lSCT)P)=A}yZ~8O)Kf|1vm!C(AZQs3P*VdMp%Q=2VfVj7ir z_&>ur&AJrbCEw@ef3}_0x;QiJ)19*`9n^Nt-Rb(;?~M56MO{-CD6MFI_?TPq|pX?41>{l^uuYG3fHWyAt{` z_GnS?e+CQVC+!#Zt0#Xpy}JMER)3?rXDi)!9W$j(0(4U6_Afj9y{rE8ui`6Rd&1^> z{+x@}t=*hhwq@(aY4cB&{W5-f{rS2+J)57;JidHwtGpNbH9=IUDB{VZJq=#Mv1jYk zOc#gkeChx5u<^=UnO5K0SNiLmPpw#=ezH4=tu-=K(}Cem&3^{|1m&WrOYMhcA+_(Z zT}}MG9FiiR*=B9$5|CmIx)Zgq)}J^le%49*^==70-d!gZ@>t_%F3@7? znwot5(SL?;8_S=~PtL}loW5<>)<^C#IhUeTmvFxLm1Ls4LdQeljmQ0`bN>B$#OwCv zyi9!PSB|fos@JQSj(7DREc_N#bG~ZZ#M^(fo_=dGed0XrZUm!~`_IeUs@OmIf69)% zuK(yW>(iXYjH=#&%u4g$3n$Ael@;l5f(rOD`{bW~OIr>}+E4jQUl? zrXz8+k=IWzdeM*c+4j$MlP^8JRX=x=LS9+(2 zRmQ$s(3fy&^Ct5p%Z#LU^Lc5_e*bZEBLAPKeCspqC%=2#SLt;@j>|!9b_1jJtjqUp z@}F>@(6zaqu9Y2hQ|MFw+LqKG;g9`NEbJxMy8V8B!T+@U*|+MUeYX11R~GI!JKR!k z=<;!6e^c|T#uG(%n%K8h**jhN@{Zxwt|i=lTC5g*%2~4i{!DQ#7ikc9(4=Mlw#)X6 z=eHR=I=ikZc1mn+xVm83?{6pUXP8!`Hw7v)pIYd6N6^3KQ~2|^IcIb7n2z#rJUp`W zYNp$&wfpiz*+tu}NOHcMcz5DuSmtgj)S0C%9 zUR>7q-nHq)u5%TJHs74OzMtITvC?kADwloqXXf3xW0|R7%o^HR z(H5|RfuYuB`@wm+e;#fA^l$zzFAcR_rJ;$u8-fkvLz8txyRK-M=6@^Yu(4DP>p|5W^GeVw1~UfbJ!H<)d5KYDPA*p#Y+ zb9~%MWH9wtp^o@;xoGXeoX_ch9-7a5F#p`G`_tc>a#shI9n3YU z6fwDcl7aPx?~CK7TJO&FF6OB_SN-kV@z-VZdiTG3F3+Ld@uQM!<%%rk3lp@Dzj@!h zaBCmyqvrLuO_TR(Zdc0e*2!4ZrD1maiH70C!v{`8o@u;2X*HvZ2y@2*>D<`Y*AFw# z);N6mvfkR0H_uBkaV+?F|Mp?VfBhSKn?+?rH9Y0T6_2(2y~*(T{Ol5b^~_E2ulqJE zJ~8oD-kv2BXRTT#HDB=l-@cy@@=fY0E02H9_q+B*+t)E+bNt$v%(7{PTlZc)yQY|b zb?e;NAE%FnxVJwrDtWU1?)Dw^&*k=OmCCEUI2?IhZ~cD;&v^bYTdRK$V$O2R(wO8Q zmCA7DOj1}}{M|3FW8O)Ey7>%QlRI*ksxKFg`oc8xv;DuK<}=&H|K)sn|7GX19ou*H z+3VlYSh|4g#FGmXByUddHTxmCT}FGp!+!>~H!7F+>+IQ@tGmUlTt2ADb8YUUzIzt8 zLWPVv9%TwOMzA7{Vtm{3fD)_%^gyJ3HGfDMS0=7x0Y64Y6PLL3giw zXW{w4{^v>f#4oe`?Y&o2UDQ3dn5W1$-}$vpz$YQkQ00dS2RUrZPcHxS$mFr_m3JnK z%Xl~4a+N82I?cRxO1t55Rh|VOP4f2a-F!=6g4_M{1?zsSgAQ9T?cDx#(L{-mtyMol z-tOP#YTB!CR%`EuFt@mxNbcjVnkR}_0xo(4$8V{u30YPof9C$F+w!J2{24A!`t~Se zsiEq%3%{1}@c=<1^bg%L0`2m5Mxw#@{ z-~z_cN4X*yE*UNA(wCc4apjw}@SXJY^*>L|NXkDWtLFJU zWZOiZ;+5-F{IVoxwQWi8zf-)v&Oh^-UGyiv#i{wL?`G}F+0JwA)Wz0L$+s@&4>@d2 z@W{WH)ARQD?{kso^8TEf7r9UBPEC&9(tWeGmv3BBtPsN9@b|$J4;f4ITk@~@Y?hz@ z&oJX(+2`4D>lQ83wRQTn@d!uH%EipSFQTVLlu4Hzir4*Ve%9PzZn@`%Ur)-8ZTyw9 z=HH@O;g|1r@ML7!&3Pl|e97j}x9bIeou2!CW?kTUXMytpg=_y;suHKJ`Ca zxBlsdU3TkFS?Wn@tMs@Zu@erTfZ`+Upa_~pOF?&Vf)Q4J1hTrE`?i8o<-8Dw4Tew`DugT2VZCi1ne68KNg4??_ zO;-O@Ec+UFVd{j1si6s8Z{t)xCch1SyRRzw)8x;eyk)hHyYIeO8}3paUA=s#Yn}j$ zpr^6Voh6~GtNOZ+^1snI!9K4v-o7s9=cTtLZ?!7&bQWb>n*7L9oZ6zRzG@TK7MITn zy#Yt-_?9m#w?Cc#^Qdiltk|yY^Je8*Nw1jp$Xi=8r6cAJ=hI1+dLj*Bp}~SH(`WP~RMPyn- z_Y3Yn%^T_j+IDqV-@FR7poXs|gS25lWq9+y)Xd9qKg-_Tx~MemT|}zDVQYbY#bAdc z`NyBmH!Ahls>`a2{g(kjPm)DzAyJ@j}w7#PfR5Z!OH6`itRDIV6=iPqW8o!8t z!vCzc{n_>@Z%cRRyWG0ERpI(ur_)l-6^%Pr=`0ZNS5@g+FFV~@F6XMO_CCh>VH+Bq zJqsqby-4}N-XDB@@^&Hsw}PsvZeoMjcVy0CUdQeh{pZ&H% zukv>E)tbNm87$SG?`3w|xpm(~n~C+JXQq{Z^OpVOUY@YXwUSX)V%^)LF8L}&zp6j{ zs9pag{^WY~pF!1o{bcPp_1E9xj9s$5`@y7p_P(*4ehw2VYqd?-{f3EoyORIm*wyn5_M6rmPq*8lblK*SwKf|0U7fPcuuAh;zT@<4txc{Zpu7kfjrY;Hkv_VB_ z)}+O6mHg&Kkci66}o2`<4)VD0Q)pMoEjj-Jh{T4s{U47%wA6JnL zDGG9qyS~1#Dmf7LOJ%~TRjolP3pE7ts!BgHFvsVZ%=UGcsnS$nbPT+;^-%X*4wgr% zb#XI#q~7s8F21+*#JZi!&$D(%pL2GaxPHlzX?Yq9i-m*y?iN2+f4**}-p-#V_4-YZ ze2k5Id0K3iqE3Lf`U;l(m#a7S%!^xo_;km)gZZfo>S8K6GS03zUCQ%Pr7>@g%{o?Z zE3FGsSFYs7S3RF)bNZRQQC8K~b@LZw1>U{oGvRoyjFV-uk=2KkCkK1A|2+R2H$_NR z{!{yzi&vrp~!#v|Qt% zua#S(wh>FxA7=jUxmLCNepD_v_FnW*<_4c@i#&w`_w30NKJ>6+(S9x7AMXz@_X_98 z-LLiMVRcdJ{^vD8j{3`%ywl1EoL#W{&xULKC-0{FZ`^xn-5bUB?%Q`V&5e#sFLruLjDX_LB+NakH9uTMYh z|1DDgg1y$#%Udem?Ag5F#;dUNxySw;donw_BTs+lOt0MwZDJjyJ+3~mC_Oj-sr=7l z(%jl_?L%g`O^h(VmXrH5uK4yHuC^r~cm3M9q0&xLwEw-`^_;gGe)4;4*d(@X+C+Dz zS=|*^+-6_e66m0PZ-(=_O1+D3?y)r4X|)O&Y;kdLVBk-jXZPpbe}*}=8|RwJx_kEK zno2UAl-=VPs-hiM7voxI6)}S@y z{|p`%A6_ZF)WjV=VQNP9>F*s?VywRmx$Jb0RjmJX_;dW({|uk|<&v(xeVeP&cB}G% zZ;-g%qGQfgt;!Ccmaj<6vlsrOb6=!+|HXQ({|x86{zd$p>>hpPs<7uwAzd+RXStY{NekO)d7F*e=?hzn7!iO>$1AmC+E|dIH&B{9#|CKWwKmT z#>n7NV{h@4%Km@F?4Q;hE7+B`*lekX$}awF=Bgx%r_=6iKB?g1YINlE$&T1d%lfu{ zj(_I! z^N74%rq$8C&(^Pbarwo!3l7_^^)9`A;+34+*M+=V9tR4z!u;w#2J|XFJbrDT_ouLl zPkQ;TyIi(BGwoq_tiRj5urj^K8>Obn`#h4$N^P!p@|^a4>EO%vpj7%Xq>O8*ON@%n zF0&7u^ybj2Ljfx)PTcEc`KZwB;K4iJe7`}d{rb8T=VX~~6Tw#oN0ER>tVZUs%=Q~jce_8)mdfN<0s!Mopm}uXVZzdwXYAIdHurc)5pHHIS$%^ zA4{jsUgA6N_@CK-PF~(~b(!0?^6nBPC9&DvibYnl?0enHe$1cL`x?AP6SPF9vy-u` z|L=`OTfUht`|)6LQMtNa^I^ug0@t@E=C&6*_!aNBiCZ>1v9MTKK*-pMLpo&cD!0Fz z56quYRl9HU&&EZS{b8SZH~;mL?rt|W=zCP~>4Z`*qs}I`LryD$)=F(ID!Z*zKg+Im zN7E%uM|Beu*pc zlsUqvbI_BkHL_wx<4P5|xSMbCPui>8c{Sbr+^rs0op)=SGQ|E&Y27-Zb;70vOZ}I% zx*t6@|EbKo2|wM;8Ji+WkYHm(x;I)x=%Zh6^auCSfT zTR-(StvaC;GBZT$M1v+nb+Fif29C^ri+K@edN`G58!oiIlJD4k^l7Y=c_izc)JuCf z12Th8XI-29uqP^aitb4T*L;Bma{n2wJXo;MmEnwoZNavmp~;gI%9cIeXtJ!B-|EGN z7-yYcd6m$omlv#jdHqLvOZ{`@FaFw@X6Ng^C3(;FJlXY($@AA8!<~$+91pK-wfJj! zvi`X|>+wHp>-GLd9F#rfC;N2w%tU8FKbwGwoBu@Tf2^JJn{nY?g_O>233lOwM;(j; zvz8y)-{$eCHEBX?l;-`V8Fdw#*0S1IrHQ`Zhdifxc0QInif)MgJEi?QefyNqn1JRT zKZ9*%{%i(aCc-|m=4S1)T)SV@!aPB}&i>mxMD9-WIubh5pZRLGe|P`U$MdSD|0`Vn zSx#T+=lZi%)B0=XrSF`&ZnA4zew1a`|10W=krYC zjWfSRxlc0f<}JAwz4XoX%g0K3jX2p?Yc`n$J@q$Mmzol3QSkIgdeo=;e;yp4RkGIM zw*HKVyFYz>y60Qf(&LiJyJp?vs3-SWhJ)fUHPoGe; zepTk@*X7qv>)a~(^>5P&1+9&tC(>^e+*%|3@Y{L4f5Dae9-sb~(^j3`9eQc~dcD-k zhwpHNzdEmXP$?{7MV6$$(A~Nds+(WLPdCk2|7P(_)kyKCc@E8SPP>EoT{ccWV(^Sz zY3sfAgrcj5g+!Xz3$pt_jpLh}QyJKO_9X9GG|5-jW`9-;Xe@ca~yYl_K zcKx}~e@XkN{aLHqBF-`SmEN@n#Y})A3KZ_mj&^?Ty|N9V=jdDG8^U#t4Ib@{1X zx=pHkcW!n_h!E)0`p)F8r|~Lf(XMYl>TJ@V8Fcwt+KDw#p)n(Hz&76HjO>^Q-hSyT^?=DWMU8g+XP1$Z%rML5z zizT;XjZU$4NhtMkteui8wBknBw;NBc-8v_6|DmXQolEKZAonxj>{SlDZ5ph`X=glS z3(cmw*Lc1QYHJCp=jqO#HD{8_M3>#mCHYs#CTp$z^ZI_?OzEp%qbrj%-X1yQ;vu(i z)uAm5zpbkj|5p@$s%+Q%=|}G#>h9EuUADbrv(mJi_32d;t}wif{d~MG_Hu51>f@ z{cDRC|1DxPy|n1WOTpA9N4)0n%YI8;xcu_`bepw>ywAF`ZCg6+EhbbQYO!jX{YR-m z!1Ke&E{{7q4VmsNn);DNIBILTtYHnP;6?OY{$t)Ebnot`?tm2wZF;q=bNv1@l$jir z)bVPHYyA82vQ$EAL+@f%p(*QqGPZ5+ZS**hpj&)+{k&T0CI4N<2TzVysaT-H}U!IAmSrUR-a&6ju8UY@|PX$70= z>hOn*zw-Y)ZhyXP^74!V_h);nvaLNUZbdt;R9a#nc=E!MKO*}z4mF0o{ucbRcH)xw zs8@nZuP%9M6Rc73#EGLsIZ5-z*TWV^wH#MiU-{3#QwMchu)u=JEmd=GPIJs@Yv>DI zXu3Rio4lV}>Dee=y?d4_Qwjq;CANn$t?^VpY@`04!BVrj_}SUGjOUjxz0x&JG24Dt zXWG4{7&n)Fi$2(#c(h5wzjyY7h}e+LZhtzT?9Hv&q*t18-DgYnk!cc_HaVJz3vw)6 zQpn0+(lN>Kfz{_KxysY~jcazV*yUQQt$HT& zqc&>&3L)1Yo=FXt7sf?bq+|#GdH8AZD>aU<8O!E{=)PRib?Rsg*TkDs_l3Nlm-L@u zPUoL1e~p*bwQSho-M>yy<-IW5LvG;g=(PgW3Pva8D^vg}&X=;8x&1Fv*UP{$2s_3&Rf41|* zY~@$c3#>(dd-;2P`%~a_ZN9)lmIm$E#@ipD6T`5UG1}^)Gugh|Eg^E5Sr%Th2W?h< z=n77%DM!-AQFC2zw&yM<&Ul||^CUlW)e7A|Wj}wLesQ_p;#aRYYl}tqn{M-ATEG0p z;l=k)C@$S1c${nNY9+0<_=e>M$$s_1E910`Qh$d2T>Eq4&+up3uVuqee=q*2_wVmo zlhabi<~3biEG~0%mfJJs=L)~&g$*A6-kP6XDg0Ubv|aV(#aBwWkIpkVn_n#JZlNc* z;^M9=7y4$J1|11q`6YGJ>Mny7E9|{y^&d%{_3hN#=~Fmtc{4YjUZ3~Vb>;iLW=EFn z@HoqP$TvJn?Bo8cH)SU^9;~We6vE$PxVCnabmiKk>G`GQx`#P;8hfpIcxvK)#tjP= zemKwjFXvx*<>t>upZs-xy4^XRo~jbguj(A@E3-dArAWi~C&R^!ciZ{ry#KWOlY6wU zy?^_;2{&V%MHUALDorfSFW7&_V8(psL@{tuM-c0EYbr0{D5b)*hwjZ19f7U)2Y+vD1)QQ6{oth4Q2S3}G|BW}mdn-TaxYGk-K**&g4XIL2@ajtxPYQJCQ z=JWEOrxm=~`01j_cVXofy?GYv-&KTsdL)r^Y>K>Hj#%Pt{_w?`+D)E|D$UPqyyLt&D@@6nW3SPFhNy%&6Pace zimI%-Fg3yc!6w%y>#festGH~Et+}N6^!u_2yO{FiT%A1*T`&+;3@MaPx10Je{9LJZ zb@t~EqEp-pMGwu`X<-vLn`^Su-GB1k*0r5#RvVVIXy!exySiYl0irp&^73s^hCx2c z3tDiaQ8zrFwLe_y<6FkQ{PeHqr~M6&l&(L&WbdSZ+QDiIUgzYM^)7SEXi0F9a+Tll zWBKC`QgW7G%}-r7x|#q1UnPtMYammaDJ9mY)PL#dMKbhM;nMQ;x!(?a z@;h;cmEU!Nym(Z_?+2CdC;AH=wEh$8`Qi3Hhd)=JeQ%l&VVDs4cvi%ZnF0%Hr^r27 zYku3ZerCP3&Dtlr=CAFNuP%t5y;R8U;#v(~his{N+dbteU$&Tc4jlYa8}S zUguVP?2BWM?y7Ctz!&CSC^B!0--*z64>h88!3re+C`<=Q1T3Z`OW|)baYc z?MT$xt6#tFX}di|=+~XcO~HrU7ChJ_mNcJbe!i`(*z`k;I?R*LunX}rKHSURaKeA? zpY^6^XYbfqF{LdjfUU^4O!kG@?fo^M#Ap9$einUu_FC1aJvN4hO^>`?ZKh8R?GETt zcotsx@#BY_&tc1#$KJ}?d@JjH*>x5Ewb92`HFxQ+bO@Ph2qWFsBj_R%AfeO{aYuU)&9Kt^yFw8-?C-VshpbWqAR4Ye34YjKl@%^b!OrU z*K-Dzj7q&LZ%)84%+GT+a0 z`*ZBi)~ow<^h{pg)v~PBSTdp4t zrBar2rQ}qX`g?~q>UuIyu;E;vzm)UK`E^O#n!c&t{WhU+eGuaZgMaIB&95;#3oAD4|3i+Xf;5UD?Tnk71vnPo zky{KZ+hF2{?2X)Qwgn$svsB8yQS&3)y=7Zp?s)rmzM;MG+PpvWf3Et~BYe2Jd|B+) zqieT_P27A~c8g|_ZRvuru=U5DKN4A0@T0F*`OluKdir0yJ@u5^Zk%TkcF*R&*&C;t zXZmvcHlL$Kkg+M0K84zcC9|!rl-e6!whVtJ|J1a9&Jm+Mmv6_u{3QA2`Sv_E%X9aZ zS_ykK#@&3bf5!gw{d1D0-ZMY~zoevtI3=A3x*zbt%^m zyEkmuxpT8wRZLask?DfB&z)hudrC=$Uua)X-OR_oPkpLySGAvd|MT>JiJJ_fvUBxz z7S?`UIZwrnoA>aUONVnN@0XpXwm9cM!`;%l$h$iA&kgN$o>#Db`Cc~BPyF((dDlXF zTefDba9Ar-;~gr`DS7Elz5Ra%-LLAQ8$Qd=HGCyH6=PkUGDEs>YHUC5ayFL&-f?W?RDPegq!%XI(jJShM9_366ot83Pl zM6TOX@mBBJ-A5DabIhvVe=7epP5-p6)vebN0?}FK7dw`B zow^%#Ni5EfvtUm{Qk`1y;pu)d`}96$E^Cy3=NVBUsLRTEYj>@jgx$TnTve+guWWSf z`T9+%J#XrPs(byWcjR|DY+?@R$vm04W8Ihay+-1z{>9(EyYSc1Jx*=`sgFcHv0PcH z!nN+7dyV_5I zfAjt~&u8qp$YK}w=kVsed$;#l+zfq}s8IOm)x`;6YaCzug-G+)d^`VS>l~|Rt;s7Q zwN>Zz3r8Pe;C^Wlzu9SV2aD{h%G|f}n&Y(>wm!&z=db>wEXmhDpX)i}pAUaFZNFw> zeb!p*5^#X>qg6)Tk*r>^k6ykK4B^?!x;&)+Nmv-flF{pq?ners9J%vMXpTWK)Sb782=UiaU;$6uLFd8s3K>~x%ax53>A*4Od7c|zX$o|j#fxz{e@ z)uV8sEe2Z}Li+A*?yt+Q%dV_GRTsW*-_<*ReHT?M+uE~o#}q5ULncX<#?BdS;w^a&4p9;Rd*w3!6e&?RspMQV$e|~=@ z;bPv>S>L|iQ|U}fyJxh@H*7)I_BWrFA35vlp85)WB{!(Z#IpG2=4PqOd3#}{E2vBj zP-t*mVcldPx2Vax@b_Z%!bjTkZS0?`mz?;s@n?h0@$?n3x9;CvbvyRB(5LoS%O@27 zzJGUX<`G@H%Qaq}F<-v_d8|HL`LqAiuf2DIZLgHAxz=55qr@4d(RSxlL(lD5Q*K*d zVcWR!t)p`kcwIHDxCglpWPM;j)x+F#6Y~qLEu%E08_ZNDUYe`v(^R?r)AG}CxgF6z zyM4A_$vHA_(b_XvuTQiETv3|(=t#I__?-RE<-XkfvvuVQx#)~76=|Dh@tR3j2&nG8 za=1IDIPm-g2E8-;x89pm)BQaD=W$-`Pv;(*$_7Vf=)}F1JNdZFd-<27xNvVJ#lDV> zSAVwit&;w>GSYn3o|Vh)R0e&!yL8%R-zywfa&?urRaensEbnQV|c_dw|1TQ#ZE8Vc`hx>RpJRqXbswa@o| z`kgI&IB#NQ_*t`6CredcWT)vZP*v%j_~YIL&*y2qt6y4e zoqe!&`TZC-wKW0LwhFEdaF_oc`sMKYgX(tm!e(XpivJnT8D^G=@3Q^vYP+RO&|l?b z#fI4@<9`2sXsxvA>yPQ*`;Sa}c-U6>Y5eK8%C2pZZ*!B|UOim=Rn30yBuD<6Ja0VT z)!)pY^upvui<;&Xq0>&g1@`N1^m1#tAgZ}T#6)|;t;HLTUKQ$K`eSly@$CbTZ!+f< zO6n#T?z+-9Q}p_tsmZG+s!VJ&`a5kwVnFtV>lVvr+N-H-u$p;!%a3&ld*X7AI_%Ip zGTBX`OQ`6_T2r+a$01=?H7FKixn%?!v8+-bC@K%s!Z1HPRILsRoDJAXqD<} z$7M&nR-NVHQy%hQOYn)dCmIqAW!5r1=1=#}NZmZ^+a>TZ_%hR8(<&Y5ZBsf#GWAM}_3mhxTtNURr<7 z=GFCG@pJUP{J7(2GVM~3rP!Qhk;;C2NBV3%WPhgb|FgPi*Zk>!OSkl2b%{9R(8SFo zGB0GQomP|8^+!K8e!rEwCv4IV8_6DTZ5PqZsIUc1R?oZYpDUKk(5bnbv|7kh+e5PZ zW5A0Z4?Z&y)7SsDRek@&?fCW2CWh>uxKqS#YREArQLa;m*IHeFc;8l= zcTQgOBsLpY|DDo}*Y~;9e13X)MW(pf#}$D}R_uA*Cq35h)t+x}bM|N1t@v3i)3z1% zdgi%b(_8NOs4-z{YWWNmh7glE?8?96Goy>=JKAg3T&#RHU;X8+v(M%hE;(PsGdbe! z;^P{Rjxw_r2drCQv4Z_)TZu`<1qKlO>Hia&4ue#tyn>&-Jclilt*+VfTJ{(StC z5O?N+eV?Aq+UO*IDSq{l4W`Q_x;ZOX28B=hck|}$Y5e~g=GbokY&LgQ=4a<63kA2t zEjhp9?m=rOua!zSpMU9EuCDL$=yCty`EE+ZDp^kgHmuc-femifV_E&Oz;OlJlAPLp z&~YK4aw@=7RH668!f%$4(pBAJjqg?uQF)tB=l?vlpWL?i$?vlsCITlDWj?LF@{!Z) zni+e)@=@>FNk^mKrW^lfm}BrcZ*p?>>Yt%sE%t3!R_wZe?MX|=fnwh~+Ki*F~n|x9#Zmqub3YJwNE8m`;u<+@lN$DaMHZBKRGSFYo_4N{|s|7KJi?uN}Foevt4XgZPJ#oCqfoCeM4tf z%#v%^uC|sx#^kd7bGiL`Z}b+=JM6Np@d2-t*9uOqbDIS2pZ&;n_4U>LGdDcC{i*#_ zfOoOhO9Ow~E6<`km-rQlXIie*xvHRQ$6$Bfahu;;ldG}Yf{qy8KAyJhcgbOo+#rD~ zcecmxUS?;y{MPTJt-q=tACR7S=lX|bhKs}UqCfqc|Mu~Yj|>|B&Xnb>V(vJdE7R1P z-6}P&llM+eo9P{aEbCy4{j=+}9yym5rsnirE>bCwX-qyb!Il4aAgcT~=4q7g z(tVTl*XZ7Uy-6om#?{uLTc?Nl`hEfaLsiR^$w96TnXK<7*)IG6Y zlx4;1<7MX;?VtK<>%P@bUV9$7uxEj$Vn;y(OMI&%$DVz9Tzh8Dew2LrX43vh zb@of{tENb6YB8=2Ye=79|6HNuH^-l+$t(8mob}1^rLjk*V5rKf2@cFo-|>+S(r_s8?h z{#=}WW}g3N)2ny4u6=ri$ueoHcctu4|H5FYj}tZp1mq|uEq?U6(f+wyy}^G5gQU-o ze(ImQzAWM^cch-~tfWbI+P2urHm#J|r_M0_ch-LX`iw1i<{X#gWp4b)zjdppb@lfn z>(`5!L6W4&{H&8PG~PtE7)nVi>*$t>G-M=ET6sdt6yjvs%cCPWlEL>QMm zVJpfp>SQ@7-&&@;<5rP|vc*1s0uHVNW%UoPY&Ix9W&w{hL4?&Ee#>q76} ze--C+G4HFb-{pw?85J>EQYEVkvsES8pAYQzXe_HpZlW}-a&B&( z@~^0}wsgLBR#o8CY1TU;RRSGLP8LsIE$uS?@}v3Rx!SBtYJHEcSqiPPSS?~LweLT}VbtRfZ@M}r{Jz4( z_H6d$?S3~Q&Du&izxY^--s$XllhI&27*2ncg?-3Ec4}BKX6x4)Lo- zV#z@gOnyhWa`*e^gq!6od+Ogdb;aw4vHux(_S|gCx#_}uU0~KVOIL|-j;;AR5%&%p zeazAr%2J|Sf7~Mfnfue&sZXbzX5o-?Rg7$U6OrerwBYS+oAPJ>8BYHV_PvreEz3DK z=f#Dp(A2V^O{@x{>;(+#kMI@rTiiICS~uND#fiz$L-@@s26h7t$5aRZ`h7cJ%|BIt z_Aa;2rw^BpTv+0>Rwv_(Qe04I#;V(^-Z)yu<^5-vGvi{-?viWM9)2}vnsAiyhm(B6 zv@)4Y*A>!RYd25)IsLQae+I+S+i8>7ws%=Fc0Nm8Z20)#T@M>q?yHXX7JOS)Yxt*g zOVjmFk56yA;B$G^jiU5<7a&WX*dRTdacIGo1nA9`CmZokqc2icIRtD0DS zS&N@u|MOIQ#(UHFGnrrJ=5pVPUK1SU&0IJ&_v-R=2Kz&mSMqOPj&J!p=gady59=py zea&38>rHvH|Msn&CSmhRcl5v7ZaT@e_fb+~W3OZ1oC%`mQ&iWi;^E$6{gM68DpRYn z6U*l&glwyrQ1?J_)#XPl@8b{KWoO@FTW$Y*`mA+pmhAF=u{d*WUSh}AP4idU3!1MK z>H1isu)Xs~h4*i}fBzZgM76!LKe?B8ok~+m>f~3&QM*pcY><@bT+z{3xiR^0|DipO zAI@EdHt?~njzF)==KjmL9dkG1dfKIBsXeQ-W*Mf5Ff9?#s&V)E>A526&QI>oRF@Y#yXF5pes1>vtUpDkN9xe4@6#?gi{3pO zK4+3h__I?>cTAGVjr(~8wy<%9mehQK8**Rl-=gifOgqKHnZRLFW@6p!b>T0&rYpA; zV{la8Z{Bm(W&t81(u|k&&2nz~?3uFGV};U!3tc~C_AFvlm>6Uw&$H*|#x>Q+viqcD zdS9Cb+&Qk~v9ObEPOHPZyTxbr&%WorYv2~-_|xSxlO|rXuv|2aar*R|fl(6} z@3n;1UHEWVUjJX{&&i>?ytP|7^A2B$II=?a6sJWi+Y-Lz)8+ntz7#)Y{^vfk@4IZw z!)3z$g|U!p=6bS1 z?q;RP=eAk-UtTT>3_6v$*L>Ms<7fMyt?R9S^4B@^n%c#A3OyHYXO#+jZEroY>dbe$ zMH86xJ^nM~cjQIB>i>Dn-v0K_*`GcgcA50m_1c8CqlpC<&*{F2aN6|l?8%tLg<9gB zfA0$(x9Xq${@!`tT|0R!-Q-$?G}cDd`}}Nwrun|+{Lh)IU;p|y`)g&+@~L0BZN1X^ zF0MJ$UGIH8WQvB);eL@HJ2$icwyEo`Kd1ZCNMGw;)Qb-;J$Y#%^Qzm8k4YZUluYeQ z(7e>%@gVw<%<8!}uO1c`dBn)-|5@|)dr67UAx++rOL#PtllXquC@|H{`C0gLsrt-4 z+kft@uU%F(t;~G-#HCNqOzy~iA63ezJgaSvXwaOLRV#SaPDR^I`{!Eg{x9_J;)s{q zX4w>-w&`6S;WORf$TK%y_x=Yf?FAoxct01EOk5gwnn?5h@jDFSAg@C>ej9xy%i4d= zAVr(&)+}HUVQMImaDOIk@hfcrxk&voO>Bp z8ylTEdgZf%%h6Wng80q<83dnRw0|yOZ)D1A9M*q2{IX+ps)^x}eUl8osBB+TH_2*k ziv6yy+TYyO!peSReqoeNah+Hm#?ZeUyscy9-r}^gvu0o0k64a?JT?GrZw9_&zr`#( zC4@QHp*lhAa-h%An{#~b%&-<(v`VbYe8G=wf2oIj+n;tvU$I%xm(V_oEzW7nhjWsv z|3#ns)qA8)cCOYJ9y;X-mKHbtbCmY~S-3GX>XUX+!|LLxS#zRXIlg>UsJ*do z>d(l`2rdtlb}wD+}z_1+1o0a{}maXa=C08|Hb0n!-z?h z`?j1F-4l51SkJnJ`zw||3ig|MrHfTQ+&z=4)cUMc z_0&AWQ?Hft4llC$_;;(^>_5*x8&@WutlGBhPox;<>^zkTf;*ZdF1&v{-)_&;>a~@d z&q(Rqs_WPNw>`6Ny1<=7*9{%BY(u9vO?WSL$nVmpkjJlbzMNlo&uznO?+aUAYvxYk ztko;$%**Bp_B{E7Gxo=475#0VPbX@eKGnlofBv|lTwYnT&lGJwHlqkl^{T$vU(V0m zzAJvF&C8$t&vgA=K0UamGOKdoWWU~oF3C56U1DW(nsx58E3B#$bUs-w`DOd3VCO3} zdw*s=eXAb6wd;Jy<}DE^TU(u$Xh*F{?o@s#!q(O{^TOt|v$OX1``p~rpfGDzQ<)so zT%*ruv;XjMdeFd44P=D;26u?VwY)QTD&7aa-)emH{^#jd_S3)eYdIIM<(!$kt0zi# zQ?tr;=g5RD3JYVm zeY^AgaVrX(BX(+4e#{Z=9M_EOFHeoMOC^M|Ia0Dd zioX2*zbjR_L$3o@zM{;WRX6Bt)(|q~n^aTFHkGJPo^hq4lneWP~ z`M8^bE&lwv9H*z1Ztlf%v_H>w?)&Vq=WD2H=i-TaiWC05y*S~`q4wo*H$Oi=x$F3h zE%N3k{zYtEK127fN1oI}^_?NYLXUeqLd6UY+Fe|J^z`(%>1BU@{5hfdWJk&C2mPzF zw(WVVdnVV0?;-cu6DyTFg6}*B^$z_mtu@_ma{FNNQuhkw9jm>IHH>r&kM!Mn%zey3 z`ay8~-Cx~j>(14BZZuFaJj(e<^Ju`8cYCY(Wp>`IHOnfPw#CF`G4Ja5X~q0!^^GE4 z+~WOu_scTDZ0H zk8_EwaG(Cr{>|Ou*WY^2n*6R%E%@v#b?h9oz8-VGe#fM2zpaOPptU#XqzUXXaC1{@ z`Fg+mI(u$znjy4=DP*FZ8M{i@-#(@EvpVN-*ST*O_{TWgrWtB+g%1WLcB7Y<}wOpRPZPPu1o9 z`EXIu`(Ig=*=(M6pDSD+^)=JFGy<5yTzdmn|84$Qcb45AGzKj9FVcJAi*UQdt0fDU zXBTgZ)Ri-p5e>!!| zwg0S?>e~w!^I60Te7=>%=%sJ3o;t&Nmt@j%)Ab^~s}DC91nqpMF}WpUNkA+2_6^YG zotx9KPSU}``;^YA5Mzdzi;gBM7n;aBs2i+hEw?>!Ti-0__J4+$WsFl+-VyXlH~ze> zZTqxO$CQjtnk$_RigZ{hy6lVXp5o{F&;6esJwM&%_KO!qzvf3~#$NcNDd-updR~s@ zuZ*V$>`$Dzv-wi|=hpuWGYVr~u72X{^zD&vuuo&^<09ptF0D8b&YcfkgO=2ozTQ_I zAb0^B?~s@V6(FerA*ObU8*E?H-$En-kOa*2XJ<=2ZOOT~-kf1d)CFPR*6MJ*-J#n) zo<2LeDYS?eaHOQM$W?CI_;0vd>69WG$|sl(meQM@M^J>zgfb%XQ;Hl zy55J1j&bH3ly6GfK z&w^rZhw851eD@wi_doybq?n&zMW;ms__|f;f^(XBj{w(@j zT^IK+_2sYD17IkbU%@-K#5i1e~UwDF5^5>%Q)FFQVEeE{lzE ze5T#HSNzhaiEsU{N$jaxnB?uT@NkigrL!t)+zGl2|Q^SrnBc{N~-9~ zqto-Rwi(@N`h8|g?5}`pvr9fME9gIe|ICh>{->u`Hy6r8%{`f&s~cxFGw$udF9%&y zZL-X5ruPTkd=!7W|HNPa&&lVe-TL}O`217L_sm&~ID34AisT{_r#(C^QmnjRe(P`R z`P;u*pN?Xi{dBL?Ww%SYm#+J7?N#2sy@z2%hZ)n1!r6ym0r3CY_ir#Zw5&&?8rS9I zbg0CsFDvjrdtS5O`1bv1WzmFw=6MXC!tUoe&E=H*?0){2+Uh6wEn;G_H1yuBP3dtg zHJU6T@b78a(uh_KN8Z1WjB6slO#fFHeQsm+J-6+b<&yH>C`C$%*9T7tp67LNh28s` z=bbcl_ve9*Q^=d0_QyEwlGZ45g3C?g?7DRwo?a}zXV#x>Qh4%!szYAE#GrsrrW)mU@*DPCd}eK{$3E*_ zYL~|4IhQTDEEvCantVJzKmPN?{|vM2fOAZrnI`8 z&sncR`Fvad{|pv)e>y&`*W#?X|5SU&dY!GWBf>%T?5 zJQ1=a(Lc96x846Rd^Iw*txPC!mc_q&S>DdgX|HVf1hRjnZrLblE8rQ%)_j2ZkMZ;P zKTrQNOnH-dWx;kf722Ti&%zip zW^iY`8?8sY{=~j=n$;@%O7oEs`}5h>l_sZGJP*~lxbGbETIrqZb3O!KHEH=A`gQKT zwd&XM-^JWCc@}Z)7I%t<%JyHgJykqXc`7dV%<zJdw zv(n_zx%3dZ$$K0&K6MjK3`_hS`PBaG`SbBcS=-CSciCRsoV(0xP11%v+qU$vG%`(_ zAkK5=@TN;<3x7l}H$B<^=dt>pATGOA=ghyQs}KIQ#Ze%&~`&it=y1GN7}-n?eC z@OpFJs}uKM?fQ6rj+E@Rr9aD`9nn?xwKnO9GwppiSLN~13FjErmj9>`?@qsx|MU3! zGjH|J#YJ>o<6f41TZQB3_jKoPUX!9XeEgTUxaM8Q(}Sy~F7LA@B^nn;8Lz* zaov`e)0FrX%3fGE@%#Kd`m_C?;-~#H7G2!3^V0c<_JHY^_eb=vwTfMHG%Wnl!Ks#O zy^C)@diWth`@VAJuYczbNAA9|;9BpTWf2Q6zdiDC^{;N>=DbEvnHMVl@}1#t)9XGR z|MU3k_1Wuk^=odIm;bW5C-HR4C7lOmViOc6U#oMTkaS6#CE<18KkpS8f4!f|tG<*A zy{vHg%jt}_xoam`=q~DXuo3iNn7Ge3Y;N_oFE4K-!#lp`k^Akau>#}u-+e#ZESRgw z#??sq*CFW9Y3-I_FB2l~X&lVdj0!1K-ucff-T6PmoUjXD zWbHk+ZxZ_;TXs?7Sgh%qch|d)o!jJd$wR)gBz|k)x%nr&j|giD7Es@tBk9K zTOEIC#@K~8R5Ci%x7jbaZEB4;*47?h*AnjB#(Z6+9ZYUK_{X)U)geL>9qjEg&V#T9zK z$XDnKJg})bRMG#)ofQ^;Vy3q_?td=odvEc&s8`~}G2YL_H|^?r^eU_^)#G;myOgO* zjJyIDI_yc7sk>}lWckjUJGJSKR_`5wGuc6IhnMkki8`%2z`$NN6F%ghb{?&Fc7_)= zT>%eQus3A7D`&g)hcsU4I`%p~K+uWfUi**d=jQ)BS%1pyvgz)(wfA5BviY-g(jyI* z^|FT!DHc2s3^=tle)IAEBad^s>(80}T=Fyj%&qF1uQvJ0ExF{b+I3uGhw*ftQ!C~y zVptKzuwB2&Y3Env(^Y$_`sRw9a`w_FORsSC$F|wKJ(tcy|3z$aY(Qila_WL1K+&o?@f_91oi)~eE+Br zwD%ig7Xps#Wccm%?B~4`SvpQs87%x&-1RTL((HcBrafDC2PA1cvp99pUG>G)H|4*K zpB|rQv%C61BGl%7SMl6+Prx7Fx8prFj*}b3}zLc)oZ4bAkPaU;Z-~ z{jAGWc>4O-n^`@1F{duOty*a~VG*Zg>zn-?kCwHhuYLPYc}JW_)feezN3S;ywuL$O zR})`E3+$e9R8Y}-k_Ll9UR_E$%b(x-E}PufIlCgO$|$?Q>EiY)cdv@i+I}duH`B@N z<~}X1bdCQEbBeD2S-C1ZDLY@`?Be*@J4Ls87wP3*t4QGDwwaO=#!!{OeA43NpPg^H z!-XBCkJT}6k9xB;c>l#Fq~vFh*=Y!6RCpiwE_44j#7cHVA=VQ0ZDxMGOjAK*D8JGc zwz+M$zn^FS&u}idlHJM7Tx!|E6?##Bei6QK z7ROzmoJA#>$vl&^HMJHkUw)zd?Yz=IQ$HV>b$reno%iqArYEvq4B2scaddQUz@D0G z+T974Hcjf^_;mY`b<9;Yw&#29~-p}pJ{=(zq$g>V_>E%v`*HwQ1eEg)?taaV>$BuD# z-ZL-Qyz=3>_TEgtC5+eYk}Eq)Wtq=Szjm$bz|CXduH~n5ZRpdpxzWIXE9i}H)PlG3 zF8ybi6ZGfM^`%|6PuHafZPNJiHt$~Ojy}(bNvB^`^?oem`or;`p-k8M`Hq~WMo0Q$ z-Z4IM``s1r^&se!O;E@oVjL&WN6UEHzub%uS#t4L*1l7XNSbypSlPy@G=w{-!a#AQ z-^@qdDpyL@pF1me`NXBD%KiYy7pGa6?p;&Scx^2g=+R)<`Om&}eiL8FlRf)7U;f*g zWVEU+B;b|({f2PeR}%!S$~ghvwZDdc|6I!|ALftj6z+4{RusfPJD2`b`MIvM>(#d<(Un2Mrf>i#820ryz0R; zMMZ$aPW0eTn48ni&PJbtKuI7uH(eW+maRK%+5T+FX2%6tla7~dt5KS=^h)E7LlwfW z1Oo$>*DYRFasAU}ucmmT`DZ-y^7Hk#yf;wtwy~SKZ@$TNb#Zme;_X7oMdBUmk5&fUZv6hw zVqMM=CJvou7tZ@-Y>dwtGIcJ7wx+l39bw&}-ZCcDpYo8tUY;xI$T!xi=EHEo&o^Y1xa znIF+}x;)>kYqD=S%eBc%_RZbIKD}$|YLmppdiLp8yZ`>!X}9e&+w@|dV#%XBC%3;_ z$I<7SX?JSV0__D5$|D3+zsq$0lwI)^0i^Jg*P zzsjbriivW}W?qy3o<6^Zt7TE^zx{u+Waky zhau;KYfNBNUvTGfl&dRG8T;|%{o7n?K0ep5S-se|Lak4F)ta(TcU1cGHhFK7tThbv zf0p0s{+Y+()6>7_RxY|3e|N^2>w+phi8d3a1$eSQZ)>>1d}(hVq=W(a5-CL?>K&g5 zO$|!}_71g%`CN~TjIJ&Wa-P7sG=ovS>e9>;_BQ!j-ddluntN@7t+z++9PcBF>JM)< z`M1mqxw%hXa9-e_nNo49f41hYmN$!iIWK0@yj^NNaw|=boR$_iEpIBw^l!Ft?~h6A zcJKTpn5bl{|_3J54YG4=U#@d+iXPp;X@ZxFfUqSJSqTCbuuvDArE-br_g>Xk2kwJtrg-7KSf*~yGf z?Nb{%mbvbXRMwa@f&b{)iTg9#MLqJ?|8#!FUEO`RjAh64GvN~s=BL(XoZ2>_HqPHS zW#0Yi@6`=AeqE-xKl@T>N{_kgr@qZU8&||;UdlRj@3L>}*{xr~r@du;Jk4u4J72)$ zh?5*s)>fr^Y&KWB#9XyvdX4z?h}b1Pwsv|t2R%h!cpL?dB65Dct+8$)uL4i@(a@E? zzw;l@^8?)}@Mqtp{1WNgQ#NnQOzPRQ*`NKIMU6`n!@}FeQJ;Q)K3hLQe#S5Uska`x z?ATE2uw~liSfi@4ZFM^)SzKFkwNq%5-kq?umur4${w#ks`>)rz;MEYportv_SyX>wNRRkW`8b9gf*LOoYZ)*zbf}jy2PKCyEZqU4xbb|L#eO(%#Wm zvnq<4`Tn;`$D&hBdtW;-B*(>8l^oo;Y3kG~RsyFEtvX!b_zpffl8&R#HpQxRebuA1 zl&`f$4+L-Ro>ZOSeK+5CgXqp3A@--EHoo2PDy!_o(fiNbCT+Ky+NyVG%fyY5$__pr z5f?m8`SOco@wfIL_5IxZFY!Oax!4S;xUDOG+WT$1rsk1caXbFf+G)=uo_Zc#bI91! z(!@wk_mow!jD2SI@ju6ZuKzjx=g!I%nRY>+e(TPWYAJ}y)|bdsH@q9ec+9+U>iKtE z>u*I&z4}z1d(Mk0_9x}fBe!+^XE-A+rT$~au{L*WwwQFC!`Y!%))y>^^l?BBQ3ow7r3<76+`c?qvHnO_ zmgigFJyxIvD-x$7J!;Q-iio`5-kOXl31+e; ztk4aNjL@F!6u;nE)s^R3f3E$xezB%=Y0Uks>1^hGW|J%)$NB2LVp<_RIY``w@#of` z{Y&Z+qK>bPK3?(&q4F?Y7PBtcQ0~0W-?uL9;u$yo6}+l?KI>TTLg&QdB?nb>SH^Q6iOhYt zppw}kV7IZ_M^T%o{hPPz9ZY44zIB`@?~_v3>J#3UELTG2{(kfmEf1!OacTLoI{fln zfYfEo@p`mxGVjqcy9dwb?SHPUlep)T+j^PHd*bG(1-~@#lu&%eG);lY@9Mg%=h*)< zSZvQ;^KxIIr}DKmwY}p>8*pOqH6}joyj*+q;7w1KlxT<@~dLA ze)el=+qTXRFg(h8reKoGhf^|(k1MS#u~~imEvu!jZ@ufJkS6ONa+xB#+$L#T24r|J zT+fmGy1S~&Ym2FD?aM!gepwleuP@6^i49>(cBl%^+gZ6esc27P#fgmm4`EyGd|Pp! z*;)6DuF{VYTlXsaEt!6Oqr)EA zD=g;#$`?l`A zv}Nbk>f*w+)B2A0bX_>{$l^)JSN22PYc9?>XfJR2c+Td}!vBheKW#sGNLuB}q+hSn zrf6)jj|l1GymfQ#nbH@p4ru*xZ?4xX^f#(M7gu@C)=5_H)_woStE0}YjCggj;6Fo1 zG`o=_v$+Y6%;}RVtj^l*-=gP=h)=dz{Bz~csf8;uies{F<<6UOw*Kkbythju^P(br ziu%{x@(`W)%;wO%#7FrXdZp4GF8^nEF7@Z^&kZH#P3qF_onQV+Y~nBdl#5lyCuIZn zuTh+T+2%;b+5`GpHKB2qx9YX(pUc+F{~578ciGwETGa=x6W`DAd;RhPQ?KLk38ByI zb5?E6GhTk{XSw@^9lx&jP7(0C`c=i_s$}CI_G0GFI})@+o<+^+rHI?w2{y zrke3JH#ZCWp7#Ma>p`>I3$6K!uj`w+*4$rqdPU?NSD7tFZpp3-M0B@0nx1E>tFDW9 z8Rfa}%GSR@jykJe=XowRY4G^Ulg0S>iecc%+E1eY87!VZd%c%EcCyd5w(xBmm#kUp zHNAC)Sef&QV;rfu=lNOJ-Tcaade#)Hw%NHhPV@F8#dg@b$L>x%mveI?=e!2(-Wd(m z&2bB^l$@)7HaG3uQ4y~z9tTxd`7$+?aq(stKTrSjMEzM%QF0Ot1Y}>X; zNgw_uv~d=6a%x00X`bA7{?kX9P3iv`EFS)3UR?RxdBbPhe+!g1WIhqUr4#nAr(a8G z<=KB10vPfXK4gV_%A4=7XXC<%%4DzYn>O~ivu>&qJjUxUyKC0mS9TS3pIBE5STcpy zWP3dkKU-JiYj<^VlcQjnqs%#N37v{n{m)e9HNRXQ^ZEO1d*eMfY)&qI5q7U{-t@^n zsiE3Mm#Q4+9{SXA$*C*i)8AF4yi@-(SX_RZZ}@7~v&HphOH6*4{9fI1UDs{i#5-{@ zvs-6|&Wrf5hRvvN)x_0uxxbJ9cD@mbR-C}IG^ka*ankk9g$v(QJ!kpzZ|k-EJ-dxw zgcaV4Tiq)5*(<5_T0m&?M5hq8^)e6Uf9|~(xXa(@{JN++FY{$5aZA2=n`gJ-ZKdq( z+Qfefw)(!QHWke0AO6^PUB4pIpgKgx;-ie$x7#d`Gn&9|01b0NX8U?4nM{>37j+X+ zzHRgLx&O~2?=`cFvf@LgPIud@R_)7G`gO~1?VmBzcQzTEICW-=zi;&AWv3df(@kdo zE7NmtTp6zs`T9`}eYU&gEmZ=1LZGSTdaDn_JHx+W1H1k-tU#Ij5h@ z0d1Ch?rPo2ycN6l>z!Fku5IU3-4(cAEn-R9g#4UDn&%dnWRvC@eaD($@9)nU9Zpk0sSVH~X{fSJ|}h)3%F6 zEjnrP>+hDvS<>Dfn)0hu;@^wjyx@FP)3`>dogwo-!{<4-VzzyBFHM!*`YQU)tKw*t zd;2vMG%Xq2ButfSAI|TeUS3 zQX+0i?5s-l_B*ChH1V`d`*gkt=Fn^PR`wRQwfv`Nscs2)HOX^He0;3PG>f#ZL)z6H z3+J?bxfPZk1a4_gZ`L%2($z3m3aCU%!;)Z8`JbxU^Z- zDbF@~Ola8n%jdmHx9`mrhWy(98P2hstz3Wqe&y$|w&yOp_D7#I`D-S&IWpwe6$dRI zMVCeMW}Dw!e*W^e{|poCr*6!Mil6?jW_xmN>QaYo*OoowSTd7cQQ3Uu5p%T(Regu% zEcx;8T1hmo*=4^D*KDCaK1)439P#%X6;XU+L|jLD2+vc9w)OgBM$Hu<$doR>Xuzu}*?PkHrE zMTuU$d-m~?uQuwBgwi?Du&aaHj{2tgDQ*=cwBUj{Vv)9BeYZyhBAC@-zB3<3nUHSW5 z_S3am)=%?zBsJDC7o{n%KH^ZHvEs(t*w5`hm!G|Ut8Av&%4e75Ca<`6;=;{{#)zcm z$(!tto|?qEpvX=j^YOg;i#GG0{b#VtGMiLcmL0Zf-#+uO3$MbbU%OuHu28?$X+w~H zpqH!4>R0B=y^e>bo?l=;ZJ)!Xn#P6PvSyk})84E-dZj4FyG+R6SGdVj|L76c->)az zfGbW&RDw!ma7hVU5^+Q7YnM|5@9%uS+aZ5GpQ-;mXm1!!1 zdnRpI{z>-_U7MvQ(}iA%8GCGw?RQy{z@oZh zi>h#U$)i~3=NC?gYUXuS^WCo76OH5mq#^Tg!MKngdkSQ)&CD&{t-!xE`u1UE{hygn zJ-_N-+P=$o>AA%(_wL*^NhGs(PtTeYmjr`kCwi}Uo_M$VU*YFZhtEWHTr0I@lKiR> zCYY^|7ASsoCr8r?#X7!}wPjBazC0=1qxSt@q57w5-;O=@nRV@%ty%QJ6;Y7~i*-D6 zOHLb9Dm^;ft{;0t>krqdrGbUg?|&ZE*XT74@eh0TI_%0M6RWAW-3yBrS>AgY5>mKe zlH1d*5w#-Tr|Unr|7VycWp%zhH`R9UlWm)$Y;XBpyt91Gzr~(1D?}%Lf3Rjrf#Xq& z?>3*O|9Le3>HWFa{dQiR^olpxzgMX_X!FkM>II7NcQ$)WdG^uJ$n9*DrFCH%t8V`dX9*fHgj*NW6YhlAM;yD#Uw5Ug}}5igAM&6w<)!?A5zD6f*x zGNV&h)+;SpnYW}`#-!ip@7TVvZ@V>h@~tTkCi345VRT?<3p(W*a%pz@nf+() z8XdYGZ~m?E@!rODiWxl@JG&hfOJ{dDFy$Rzpc^>v9%zvL^ORlBCv0)$J#brm`y7*| z$kd9^DW4TelHJ$uuld@O|4JcWaG$-Ing50>uYI>KE4DwwZ*X$y?U_Gy;wA~2tUJIW z+m-zEMBrU_Nv8d!H@D^ zo7V5H*Zj|*xkXg?R&b+?^DwJHd-?{VRUi@XH$~@CpvrV2{Y%)9( zSDn}+x5S|0RN*9b_GzbI_5VD6{#3kPWzfMtx3ki&Y(1N{G4|Er9&@P_F(^-mT*LzoNST3}-H_?Q2cWefjeH zqSUMT(Xy2bx%9h2r;U!Y} z(+5sQaMv$#5Ve&4tTt2ji0}@tX-=LmcQT}(z5ny%ef`R6hiiI!0~M~6HZ{+7vs=$H zvEAnIgv?E%kH77I9Jla4gM~AXd6e%Zwu$q&J5!=7B}H7%H>`61){v(@S-z!q;_t|J zuSLGRy<`>KvFxs0kML}PT?rdD|KNQ&Pwqd%oW5&Yx9;BCyJ+{MQx%u4nrsi7b?8y% z%!a3jmWZ-Xd=}`*wO`JwUfW)G%Uy2gPw!`M_2rVkd@<5tyOGEw%d1?AH7Yu?yq2%E zUcc{N*X2Cj^gfG+^`1#(OtV*VcqrG)sCqOSWwnmQZwJ-DA`dW!@IwvhL~5sx=SnkIuWXeOuc#ktP;S zk>oC|1_s#%<_$;T^J&m23sg#NM*J${Dn6zr5hllX{$G|=Z2wo3e!i~t?EYzAUUwwy z*(DSkGqbrkx`JaRe`v2`QOD64wQFX9E?2B9`Xp?&wp7cjO~kxB=3c1z8c|8XRRTJJ zN`EKZ=?hBC6<$=-kX!}GlgHWNJ9&b!^tTf9ztHbd6B zay6) zx3_(EUinfiyg{V$ai3f7%MhJCD?-AS770GfO^&{>-28G@+_Whle;F+)T(oIR=kY7- z-9_~Q$B))%Z%&_Yb8%%|X6CeS)3fb6hQ{vCH&+c=!RL^D0Zd{t_x;}kNYMbcZo=C5Klg>O&<_hf%Fs+o|demax*Pn_% zwV%zd)pNc6^_Z2#ucU3&kounrrV?zG##1M zX3AXK%J9y=J*O=3^6~p-IXB(*?wf<%#fJ-{f^TaGI9Ok}ypg>=XV1+Isz3i8&iBgy zyukAD{-39O!`+FYlg8vyTu3Z!V z&oC=&epufljYZS!y{0p{c3K*^axGB0XeY<&t^Ql*S9P+%tV^0qA6NA^9u@t#~D>$EvYI|nEv#`j`%K};7|V1+NbSw5XqoyoFq&i!!46vjn6+Z@C4xGakQuCv?zXWf5>Igy|4wJ&hz zpPTZZLGb=&XWPA3j=4-@3m9fiyz~9{rtkOgZsKD0xunv)BjN3b26Ha4<@-BMte>OLbkoO@Re6G` za#r8J+v(@-pE)ac?Dtuztw*HxE_zwD_m}QZ@3MInPYO0g>uaVsh_9ZfP`l1vT;}`o zCtx#Fw1%z-v30!h<@Nh{YX2GLOzL{?d)*}0>C~fR_nzH~ zyyL%OQs_RuT%N#-GnY&}G|$U2C-XXoz0$L-S8eX?Ywc}awm4fM`*g2f*u>DDxEW!S zs|subzO1P~JKw?N(XnHE*#{3XoPOYToHgxKVt{*0)6e}UzRgR%Y^rTEWzt(YgC`#s zPV@>9T_~G zmEqt9OwNrHJ-t#}RtY&Vrm#<7`6_yA%Yo}h!<+wIP%p^z>I%1De|~+oTkF%aj*q&s zyI0Sc#i6v#Q!3cFOG75)qltR4<7u1xpXp0~{ysZ@c2(@Ug-iB)yA|oNF6`I2MG{K) z(u4$F-I=%7|Hyo6I`@-AF&fk0X zAiLaPJ^1+MR;%r-PES^>+OYD*rMc|qWTTBb|WVlmva{0ri&uPa#L{0WRvGA0kqQb<>Kav}mp}T^5Gcq^6js2WFw6YA1Ad#LuZ+Ya&a@UJ>JWBp1=N_-`&?%?`M_#XVAa#v&q){ z;?kR&^)8&b6W3IzxI)RuoVo7n;rl<2+wz}{YJc|j?z8QtS8ml#o-y^=q>RTilUf!S z>eM7_2DLYTUR||c*r@n?>7o|b01XDFX4%=M3~Q~CZoaIC&jZXhGYx4vvN7S<0;xb( zh6M}cMDK&QcR~`z%}t%lvKpMe+Zt-VOWYP$Y~dj&@tKJofalbJg2^mUd;KixL* z?Gx{?Na@#xa=N^gtb7~`d0hEpeD@s9F4{M5zS7^~q=XqAPq<%gaol0btt?X1v)e=b zd+G-6pMB9cmT%c`rR2A6+O4e4m;AFeg0UwN8DZ!XMG4 z8m{L5W`0)wSLA<2>e|Ymoih94wrmSr{;BVDqKb-UVTvbot_I00CI6A!9l-B+>5mheA zFh9>(`QGo-`Z@N->la+HIjMVmhMw58u+IEqrN~=*a@|^%i}<2d9cwia_dFxU zagj4%GS9}<1!;^cPqkdm$=uNz&f;Mfs=YVlJ)wDss`Z@?CPoq)QhZR;ymQ&h+BY1iqA$ zXKwAS&@K#%jQ$=kHT_ln{QYs8FE0CZ>yE7d84cYnrzO{_GQXZ)__RCxygZ$|Ilv}sM?3a!^Par?rf;1b_r!vzn}5UHG?GgT&h<)F)d;`+ z65W5|zEYfo%C4J&c(*M3%Tv)So{{BW&9}Ru_C@jO{qy4zuPd~@lGlBCZThX1Tjs94R<1a8>eQ1Q zqMbpZ?tvet{IXg9llf`BN#*IY->-{V`L4OuGWqsV)hCzFOgA$#ZhESF&8Z?#{-MVG z^hf8H)dhb#H}$El*kzYXxsSJR+uW+alkT^8eB_)20K(>4FqZASXn>=@h`j?}K->fioWO7G{fKj(jLeDa?`|9IhZS+jrN zUcOb|Rh#eJ`&ek{maK_)PF(x!De18&;@aaYvFF~*xfP>u>B%LV`{||Yd5f|+zozV( zb?@4{ukUz|O?h>q@4``ajnIi97YqsyKYFNq@`(Dh65a6Ab$*}!p1u0>bMMkSYd)S8 zIm>!w^Q{HjYE9ZFo@O{DWSW1gj8hkI|}1donY^A=3de{bvJf9u@o+@Fd0_VeG@oGf2{G_5y3CF~#P%x61yw7HcB zOY;dXVs+(NU^D0TR0}mZ=bw>JIrMptm|b#~tgdd(<>}?gEzGbuZoH)?_I`(J(z`n? znem$^$`;h~3SCs|&{;~I}tUq*Qz2c<>ACLb{Gk>h)u}nE?@~x&Fa@9{FT<$dVPmrnZ zn#H4fb!!HPYR6aM1@d-Rmx0DZu775C?f1#ox$~-As`Sjo&23x4CcJfY67x7Kv6a<7 z`DWBSmCLy~@AJd`qa)wRaNRy=uJNoSX?J13!ES5g6)IZw*4OR&{xh62_*taQuXl8L zZQ$Ci9+!+OC6bTsb$-p~vLG&G(VOGP^CDmUXy!PyVPWjvZSVX4;+-;s6vj6|nYHNVVJ%CpIod%L@Auc|e8_*6x3GR?U83)^*Or&8b!BI9zI(oBtGE9u=E%jo z$HE`IikwsWY(Yi%rvD7*lz&EtZu+aaF5WrCdOj@DI8HEANQ2iT4T+$|_p4xSoPc#-<#jeOirDh8%=f$euGW9eZFh}{ zJVopd2Pd|2n9A}gXD@hh&3NhAr9A@YB~rUwdPOJLS{5pB6)jlb$7|s1WNW%`tt+d! zseQ-sf;h+a0E^#cZ@;9@U6C1lq1Lj}YgLyZLujCD;0A^=NyI*YmknE`k8ItRxs!ou z8v7IDnLbHAkMeg9WfmTPzE zlBMXE)tMKURlbc~+7{`kI!R1VRC-Fbt75ZU>EAt5z5g><=F3gZ&MS@8^Y&G9f3W?| zzRl{atf~qwYnC)H{&uOo(fa<+(_{U5b4x|%ywY2HGfdig(FeaX@Ag=J3VpXu`qe#~NHF>GJEPT$!+}x&QEw^myr9@K&pv zE{zVpoHwe!BQNeiZmPmt-Z!MaIZW7azn-`6=9BuLr{N-Blp9YzRz5MYK;{PT<&E-U zZpZ&Tnzp<&*{*Z7^_`Q_yKcO?_DS?dbj8z*&PV$utP0GIt1nl+X0N#C{L<5=?Jq@= zb2`55TT(0{C}+5O%|S7Ruc^0s+&_OmBw4TjHRI3Td=^2ISzC`Dxo|f|$LOT&!2lVt zNq&lpJG6@nB8C5~JyyIo-DiL2->}Q6A`f$}Gi_S!yX#%ngK2+f75+;-$v)+s>FHjs zU-x~tPX02j?NGG#l61Gm_o^XNtgh%FTzrRu0#{K8H?d7+=tzYriaVz_# zlFe6gb01HOiz+!K$*3cytYoh#UH;{IyW+n1KaaNcugKoDciq~RFMmzi^lMVoD_y2r zw>=W=W;LA%UGiuv`xTj(zw1(odh(F1~S6$FXPPZNG_Ci>!1K#ajwi85?g@%ky;0-#Ty0#b?`gT+ZFM?!%_H+O8^R4biX3k67-F3oa+pZ-BxBo`T`*?m!%v}6CZeqbD zo&DM0riMTKZvP~&y?V({vuoVDo6Ej)O-@R%sciGJ^ZKu%{5n_GbzId;NNEmo z5%T0${x(5O#N=n~s+H$w&-&Uvqo(&~cj>}^so9tB$H-bP>Ux(x?--}}rHRw@*Mv_x z@|H>aSK-+gD_Cc}A|D!r2=u9*cWE)HC>UUa$H zdzQ&3?$0(ivsymmSbw#0<<)7yyeo3ul=Huq&Q+b3U7p>bnssFL@BOZo|IUkK-k<$v z?z8n;bpgxfu6D2cE^z0zx3srX%+C5X9|L$eWOQQ0ik@;8{dV}{ImhYJ^V8*4Vapf9 zoy>o_Gyd|fOV7K^cI=pU@1DB9>k|zLlc{+!Q{^B1She%3@V~cjFpqV~Ncdpud{`8psYBcot;#1*^s%%+Z9ORle2usr6& z{O9}sJTcq5_-A9zpY3_}Zc(uv`RgB7oOvhQvzeo@uk`W3e;#jk z^XGBDD>|h!OS`93-&K>p$MHAAf2qi%V}d7p3__pmKX>+9xb4@czvVAp6NsGRDtK(w zs-~`Gvsc{6-FBl8rLH+UAKS=|%d9T0<}25i!RwjBwVy$~kbqQ`21n&2`}5CdZ85R^ zCcj=|SJ&hyCf1DV{|wtZ&a;?vo@(sY75(<&%KP^|PvU3ppKKTN`IO1@vWa zNGwHDTZ_;8;9j%T9~D;@*ME&mN zl|5~lzg=qot@DmQl|SX5mUF+naNA|oU9)c8yJXF>eb3HW&saP{6gWlJoNBnNe1G=5 z_-$8f)~>h}x~TJQN^h6YI+2wtc{r5U2NXXSpZw?MFX^+_rD6;-uNU_QE)~Dk#rgK} z)*de|on!7MDvOkk?H70aXjWVBNpH2-`h_pQU;8MLtFOCg=k}h39UV^`LX0MGnAk~b zopDfT(&7)CvP#rx#iB+B+ctQpf(mm`Y;0V$G&@W;I4~;5hLr*7>Lp02-}r8+fZO?~ z5UHB)chW`wT>D%)t$%4O+ZDwvvnrm7J*}?2f%(s}f0Uju zEl>4)d(Sjud9u`^qIh2>uZ}&}AL-oBtbV?=UhzMJUddUZ?A)qTmJ?LhYzsPSlQqY} z*Fl+!>z%W0cI>y?Z+;ara50G7n)2GG3{reRTr=AYd5j8KW^XO1RD`JtWzD{?Z)V!a z?W$11e53r|nPt7QUK>^@wI6HOQQ%_La;=x&pW}4LHO%AGjKz7{ev2G~4j<0?_Wfu| zt4i-fW-~6IU3lmjRm>6$H2wwhO{Pg*pwMu^$eg1lG>C+o)7yX)g zeAS0D6VEFc8CxBfI{AU)hE|isukJ{m(g%0!rv7I*XZ7=+{uzFSh^$Ll+iq=Jw)#c9 zXQIf4+lQ6@xTy*YojtVByZOk(ZDl$)T^qEvsBHIQa=WLFb@L)9reHoSxo?(}GD#=< z-=WO54ew$ZjhJTwbkQEiaSgn_3 zh5t2+b75|+D;5}sW;oBk`7g-8f3k`E>FV_wFT!?BOq&+nIqBP-50Oc`cdjW`jCd7# zVJg$Ub92qU#Xns>Md{Q2X$cn}drne)_WtWKUd>7sz2gr}?k!(-@1_l+J^;tbe5|MX zq!x;3Uy!;syYwe?lCcl0c5F^PW2Q{eN z$vL#;{`#7meWI_XAG#-5zFK3s?Dwa4@*mDi`19-YzXc{gOZfHIh)2DBpz$qe>5-!g zA9))_*B%i0?dMc?{%!gkoAXci+h+e~SoE&uXv(jrYjl#l*QzD*OpXpR=htGLs1la) ztkdt%{_K3m{|x8sGor4oG~FV#Y=*+6FDDeDJ)UgqDE()0>eH!}U$b@NK0S`Pd}PD% z(jvKt`<>4=I?Eh$=iV7c-^k(W&M~_UwHQdnW&^Wm~!6tnSsd`{ouWbzB#_G(&0U4$XrnGZG^%hBDfC ztzR+K_Mgl*@u&JvYuox*UbBRo1v$$ss-6*k-N@8si=x{ZrXMw%cOMmU>sq}*`tpL6 z-;Tm|V1ol3yyN*g>Ip?tR;|)lz!;Qac4yY)FE}Qq7ct)G`eOaNfQeOvfiR4<+8|gr;sEFiLTy)Gd(Nr$TW$rjFLOnF5AGjeW~8+UjlcJ{|dio z?si3LM}vW1u3y8(1?z9!o6E<4cB=2m^>KGM8?y$Ty-<-?*I@NH_L}L_8#(1KV-&7z z?aoM^R93$^lw|@d=dwciv**vo+MgB+idC5Oex@MD+lC3NjpnJ|m>?pwh2`HxW}E5R zYbr0F=dQJzyf`-crEv>?WpduKcN&p5f9MOVtH~{R!Wb7f|IPEI^;-Lt_bh)Vovm-W zW%~ATW37|ryuYTF&asX8RoqsQ<$fdlfqhE)iZ8!8zWi_r6gt2fwY}-f?+t0l9tCGW z#A*bH@4E5OZ)XFe%3+yrws1*$IFDmco$PjQFTtp}uVX*yKl2s4S6wD# z5D?m_o*2Y&f2rHg&%gf_6@Q98{mb%-&G+J>3+GMJuHCz+q%S$kH2q0en|)_sO7i)K z=WQ#)&xY@xT9>!0x;yjMrFWW&f?F;{{%2V1Cuzy=eKlcO)07`8b_aa<=Ktq$`k$xQ zX4EZwB5!x*f>+13Z?m?(-Z{--sfVL-<#vgzFPWRupeI9Gc)D*Yhd=dt! z%Z}81C`dS-H}{X@=@l&DtEKqo+HVFQ2#e%LSfJe3+j;mugH?(3Suct7i|ZF(GHtA7 zy<)ZgYU^R`Xl4U+G`{3o*`>FZN|zU!PYR%Vt=;>V9_E#LS7d zORp?VoTSt(<1LsZD0w1b;k?*=I`5`c{hO;hbI+_t7HhB8`iJb$P~tv4F>lI^_fd&+ zCMiUTF-Ub?XE62UvJgkAM?n5 z#=PQ7X_wzy+>dqUndmR@<*-tpOt%GVx$cpRRbLjIS3CYZ-?;LkslNJ)Lf;ksg{7t^ z_PTlUOk4MKZso5Szq_k{hrBAjD*w56|MXkO`ZHC2EuFKgw6n`lcFJVVTi&gTsw)#i z15P}fdVl`qc`GizNxJ+%z||{cRs;KKR?I*{>*|6PtozSk1D<@Ig}m^^Ea&d)*=AqA zo$bl^8P*dr_a}2y$qNa=+stu?)O(7fR+^-mFg0ASdHSDWMxAeW{G}yZcD0!F$hb*_ zHYSv_lt129^Z4_BhCh$L&;DZF{rYWq_|{y#OOi5K;ai`4Y-3GUb2?hV^>@OmDFNCi zSDx9kw{qdZqRH9D_Z(#k6x42Cj+8U^(2aH8J!y_C=MCnU>wiYRvOmH9^JMgWo$Lvf zY7erc&QFz1*nDw`;j!ynY12%^g{@CX6i=$XG@q#|P$Kdh4IF%YO#R zYF$2KB{p|;R$%E!8FS#^nfiPy3N^IZzp z#=O6fqjC4T<+Hs%d)MB2*|okhHGjq4)!x~!z4!B;{nS@!H*u@-+V0lr|M7Mb$4D{l^)w~6_GvR zRNdC}d~1K*ee(;?6`T^iIrZ?u-juX|Z!XqPxBb5S<;0suRWke~txU@q-fzFW??)C^3>EAH3&&*1&SYTw%BE|*^w-Z*>cT1e!zeBVihQcD^ebdnwi*ykVb zwJ~3t@k?**GhMG^@BJppCW-Fcv#;-!>$Z8%9@g*P+L-L(=-*Pb{CHeUY-^#s>T4_8 zbBj|K+5_st7PC(_!5jC?V{7j@>-PM^ubR2-S|7svVvJY+3#u#2+UI#i?()e! z@4j$r)-9BJCB8^ovgF3H2|+AV4(*Rt%dWV3dZ)&Hp~A=WZvWZx=k2HWvrJy3>`h$q zs>mnjXz!g>`_??X!|&wPIy1gmBxSwoeQUPamArqrO>)nKPq@_*QqMQTWIpr1^qhUW zdyre4kg8&e_TH+ppJ{2_UT^IArrtlSDPy5hW^&&^|4b7*7oTqI$$N{Yyxk`LYFcI~ z^Q0wHe>l7gPbfaSe|G&Osb#y%6YV-rmUJu&yHXNx@wVzguOR;jmp5Fx8QsSh6{h^y z`P2KH{ZzT4i#7+Vix>Xn@RnV?DZ;VfrRl2Mr$lBQmEgK${ptC~dD_Pp7g@4?&RhF) z0I5K{kF%atXsSG)-TOSo}>>}c1JW^ z@`NP$zTWP?CHX#I^(XV`x{!wROJ9C;tS)rhH8bnYTLT0U0nvh?E+kSLIWCU z*$J$Eg32t6`&+vSJouBdp6e@Y7UfL#ZL_>9r?jIg!ghGC$PBw)=qb`6Q;^lh&>T>F zvVP8ghAD<|*@BfTb>#!*ozo0|C9vz*Dhc!Vf*g!bnO0eD7g)OT{lotZRzJfYJ6;R3 z*N(UseJfTwV(Gs{>qV}M8yZ&LpVHOUvrMb>$38vztw%PWmdm)XDK$Fn%+OP!(^@)lkV5^Mt_s8ar@dG^%2>+ zu;Xv)EEDIKhc4|ddVHq;)6Vo&`!(w=&uw0vy({(I!tDITFYis+6%ZJ{bIbfmYc_tY zl=HuLEHN-@bI}jGQ}b>v{FfM&og^1kdw1fFnGd^PPvqbfoaD&$MEIn;ih}IkPigBU zLd)Zh1kHE@4K*aHH_d@xNrN?NuVzEa&TX6Bc6eH@SrXj9v(;WF=yuTdU8#aQeoUXr zcZOHn`Mv+u?%m344v#0WEnatc-3_isr?2-avwRSVmu)q_f1Bg0y#DPw=5h=ZJd5wV zefa5|>$CZ%c#XV!-Getf%AURAwRt;3@WUtCUR~RMPkylTiT#=VKaa~sfARj;8?kRE zL#3|Lj!dafZqve)?A(e)qb4qQ3ygE_zj@A-eS*#R1>M*8Z<=)EeJ&J?7}|FP0W3oo9rD}y5f#QQmpOuD_>Tf>$x{m zt)bI5t887h)v0IJ9m=!Rd8L&$aC_xh2X8gN)@8vyNP(O#k-~Ad(2Ov9#tYwXJmEi6 zw(XL0!Dq&oQ`H}d{Fa^^^?m)rc`E-I=FI+ltb5Tx@#%}U{JOWkW=~?9K(FJ+kPBD3 zuJ@~k{gZqiy_V^4)P*fAZPM*mm1ke9=1}m^o%%k$nd_vw$&VeY_KP`PyyE^bao@`N zCATX#9X>rv_Q|&}D<7qE(Ti*&g&rN5xxAI7(UZrHugHFx_;l7q7k4jz>i#^erFMXNIbnB7zTfa+npQnN?mYA<;FFC4ogSee|g!F z=UUNX)7QU(+B{zx8?N`i$$g^msq=^D2^XGmXKeG^cqEBcDZ=yNOKnl-kF1LYv_iuB zKg(}zdz>oz;l7SQIcORHR-=Fm$W!VC42NF7bP4-Z^~g*m|8jraeDRKt=PcL#%dbrK zzjl85R;6t{Z!U5!)qZ(WCE=peR~`2^mv{WjxmcH0S@g-`vj4S(QnS2Y9v9Hw-Nmq! z@9P~d!R9qKH|tW$g%=5WoZ0$x_l4ir)qnZVRM;hULM1F*G|@rxNO+d;ovw#lR=-*_ z!|z<>M)}j1zdp#!Su*Wzc$Zl6$60v?E(p~aDL>QKbgX*x_|j9Iw2n2LudLpGURTNd z`SGXwXS<7Sr}e&c*wwn{)4lud(qa!eTSNty-4&lw$7{pU;2KoHa^c^lM6y$_hENCrg+(Om94f6mQ6B&8!~F zSPqH;DNUul&!KKPQ_{#zpPFk~GPO&i>$1PcW6;K+bCRukyBY58se99tJ>6`Limt9`guvZZj<;q$d4E3s z^n0D`b)~a^-m+YKb*a#iH!UrT8&B=$KcanlUB$EW=l(N1{GIJ9AF=n!w8#Ea^K#Zr z44q~oR%w={=oyZYbx6r6YwGfQmt ze1W4C#jUHH$C`mgjP>rDP!=?fu!bE|(p_04}3dhW@@BNh1*`VA|q z?)_c*+;!q{;omXgkG`L`___I0xA&(j+oQHmF43<38x^ADv2LDwrT`m{;1V4%ch;R7 z9A?7q>q*4Ow-~OylM0Z!hP2{%26x zbG7{0ewFChECJiKZ}={lZaK5wNTr_ZS8IKC)~xq8W<7U5i&DUVc}Oc`kTU>8;hC!3 z>)KVnQ4eW%ZBP()I@WyW(*DB&JLe|$-kce-LTyb&?;g){ygx7gyt(9GZ04l3hK*1jMzzVg<4ujso)|5$%ry>DkXW!nK0Pl>#kq$!^wLp9FWXWQ(2 zZf}@bb$n*p&JF$-!am(zzVd5oh4^bO<>J>$S2lVkbDUcFZSgb9oSXOl?Ds!$*V*@T z`E=9um*WDu{RECCr`nv&EnhG6fvvQAipLoV*AMgJ*2cO1h}t*f;{NA4HVZ{t*WRDS zdVhM$u{Vvig2~5DJ=J-le(CwKO`96e=vL<5o4eiP^S|zA9M?YGsyI`;(pyve$Yw5a z2I1f%e^=E`lGRqWH+ujb;ahOf}lf|)qjSx_!U#uD_)yh zQ+TjBgzwnQ#&wTN-+)$~ZR)Mgoj%*}M!3{D@uCdFNq(Jz6Qr6q{C?S}awR!>#(}IO z2Rd1qAKSep~c-p5N#Bv+7OkjVC>K zzh=rEYsbCiS;_C9ODiYcF!s(nrtrjrYlESD=PcuorB7uif4Y3uF6FcN62|NHNy^lBLjC!fDup2&QyUoT zxHj@`%{XKGu~z-l@6W-ftIGOIS+{bu^{SHXYB$d0E`PR+`PHhXFty9t@y+i&UgxC?&F{r354UD%(?pVrTK z`{=Le`ly%_4@6p1daSv)X60m9>VG_WMXG)ENzu@XwE^Ml{?@SC7?@1d`N;G@NV1n> zrRYkL+us~d+*`QB0|V@&dRNc$|IaX|@z2gJohth-{n?eaYu_wRy?1Z! zxFu&uu+;mwYg-4-U{bbc*LraN=h3_Vr?@7JN zRbf-tKb)`ipTTs`c z@&vdFDYs|H*eUwts>t^f=5uQfXD*JK z8y&Qx&)Op7^E6K;ExsiiO}@RJC-!;ybJ_dz{`|V7*DN=GO{JE^tjFP-_dU+^P8P1} zdRAh}8=9K&v-HaieI4x!`}IrLTm6d5`cyx0t-bg0>dIWT%`z{(nTw0P^9kZ;DB(KS zJiEU)B~qySj9sZDXb9QnbLNtl({{x^oqNS9_sqS-=t_kU_0ZG@ogb$7$?uue{_xRh z>5In|C*+^e|9Pzc%D%;Of}TD z<~OO7`gZI;!$Iex;^-Lt!DFo z2Fu9j_PW`t7gf%DbnW4wm3{PXV> z{w3>lKb`A-ZBL{eb9#|2ck@fZSAsGvLJXxgt!1evkIdS`UnsNfx@f4{9@mO17x=!Y z=Wtf8e?0J@9S+EV-z!OD@ZObX(-?F|jz{jL@7Wt}7P= zFY|wSZ=(Pe zIatAJ{qy$|bQ>FMjwXF)vpUvUEL>y~#>KD2mT+5B*;0LW{d0poOJ!RxTuiUjPi$P) z%Mx?Rv`5+6?&XGO3kp|eeF}Z}F-7}~{pV>>#V`5SWK_MLeOvMZuj0dGldEg|1y(ig z7EQRnIlg;a;eCt$4Cg#6AD8{J@5?AG05?ysvg$E_B;0C7y)Sl21Ht?R9s2z~}mPzG~*JyR#j1qcp^? zwrz4rstR0G#&|R%^TT%c*yD$t=apRl&+uIS&*^11vZmSje_iza|>1$W_;LWb=s!6+hfVX z_%=6rap4mmW#jJuE7~1;Y5m$|*K0Pf%#e%e+5KvJ)e45=0WJauPbQ_OFWM-gvv61L z_LNWUf1Z>-y*}sdntIo)6Z!8%BiF_lS@G=`R}jd_{I>5}iN~IkiL0Y(i!MdH(|yMn zGRb_^Rt-jWi|^0=evW_n=+-HdT~`-8Hr={8RyyMe>#2)fp&bkVg#}-DuJE5>PR!?B zM}Ia}FM7R8cU|Ygj# z?TnD*j|=;a_INNb$!7^=Z@9NR`0ze!^KGEA^*z$^E_|n{ZcaNprR@H;gly!wPoGm= zk-Z{ZlggMa-antV_Lu(2TWdc|RTA6w>6FSupH&T-tTV&Qn18y*e6auX_&>ul8@bp& z$1i`m>-99xS;6^_HTLQKmv#9{yi>Wh^mk@* zE(l#9y?*2JoC#GQS1C6KU0ItM!2jh)bWoG>(HRCWJd~3!&9A%3`MG~?$$Isd*Q2(r zt(4t2o9m>`?OdqunF%QmcBa9+6b{Ac%b_OrvQrpS4Cyf;~`dF@!e)_q4S@9Nj? zo-Rx4L;_E_rc9hF85-$Z)%j=ZpQb+-_k8YcpSjj;$}i@vTcG4+v&4y zPCn_4KK(D@vd)%h(ND`~>ZzuOZ`-?L?jms>sqB_T6MtV?DHydk`uiSD`6IbMi`Q1( z_t<&8WNviK6_p(ucMC?I%{ACH?bAa+#`H*an}fF^l^Ok){b$IGvPzkE`d`tK+0w1o za_(Nbb&FGPolwRr^~$~C4O)^68gGSmKJ!0*YR3H8HV2<*ly>|2`DRtV-zpfbvE_Tf zMMs?#d+x?IK1ktObEnd@qV96icKMnAqAr#4+TF9Q^Zc6f#qwaW;I>^2?GaCAg{c|% zRv!QN``P`Ir#7X1KKr%xPkGs_`Ab>01^TKj(sOn?BirNLnb3UY`G=3X!5`#r9`ZH+ z{GZ{>wz%A;Yu7`!?e7l$b!Fl$txF2idSY}Vl-(73RT88p?R?k0>-0MN=bGnXZS= z$~@|EWbRs%BY$PxpZZxl!V~{9SgQWqUY&C5?7Znq?qyv2)?Zjym|rwqrl*EwG zuJ>n5oZo!ayJGSDKf|2PKW8tmlgmy0viuV3oJ$eMrWXT98aqwcEqEL8m>x@3lwJJX3HyOo2dAN^)&FQ@sjSl_fR z<>&3s;;}m}F4%r`$=0@$d26<8lo56{>00yVlQ=`ilavQ*c;=s#{ITKrX)(c$UJmS(gkAh;9NW2Q z?`4*-_MoPNiQ6mQEqpZL>^akXUzQGMe*al5+DHCaB>zlZURmdznf~eP)Ruc0d-hBX zI`&KR!S?-|w|eT`ICNQMN^1VSLNz@bu`Pa<*KAh)WUl?$nXR_HcFFA*=^=CX`@GcE z$|~C)VA9uqan?PTij+qYoyy6QU$YOkRV_aiKg}wvGhK#FqW975CBpYy=17%xbsOVWa(%x09spRWqz|F5kIv!!hT3(Au+iI-2KPUZvys#MYa|C2HO&gZE!@c<#(~ zl<~T}?LWh_!iWnE6;fPXx_(zo@)zesC^bbjPkdEVsHuBo*_txt&ZXu|OA>Q-**Fw% ziRroSb;`;LKQzyFL)(9b)7REBa!Wirk!f1BIe&w^&FACK-an1&U47(oR$2J0IUX)d z=Qy84{P5P$IikG6#!T6PmX)9QoyC#(=u{PUaXCjtT^)WL#vb3n)#v@mun_v z?VowgbHzcC%XhP9mHyf6TlDSvM9;$PlZQGIwO(Rp=mY7O^`;NS5DNywFzT)|3<}zK5xu~}$@4?r%>AjOOPOQ)H3#T9Zg0#vevI1-C0`f7?}*^YTB#7lZg| z`@?=6`q_143BwAH=RD^wZgRQL^*-RzF<$X+$BOGM>(2#blw0-ui~eMz9{bs(z_%cG zQP4(}vS*Wo(lQ(qKUy)|m+Eibr}FfOz2Tm>D=P2(`gHxAajff8ww-?ki&P?%rd=yb zoo4-`!E@?EO_hm%_xBWb`K>*_yw0mG&Sn104Ow+Do3sBj=-2hnI`%$hmWZb4-`zX- zRx^H?aZ;k=lhVFPACto*->lbpAywDB)HyRVGe75RW?FVd5TnYvtaAq$ST^3JBveSc?d;@-9-`<2wki7uUEJ&ZiS4}4<(yKM&pP5#Z9B83Z`*c# zvINU&mPKLH%uAnaWS#toXRdtzp*IHW{7>)L+P%2`>FOEtUr*%j^*iP^t9pLiGqIlA zM~#k&MWpJ#{IF`(u8Yy%Le{%~nm^~+r=#oVOuM^pW3r7{@a?MN&V6fTugt2BUaWOe zAY5Bq>*JFXZ%^(NvQl0CL~UpB+FP%7)y)*!yCB~5N%*HD+r{|u^}W3|?aAgB+wQbt zk;B<7b2&s$_CNj4@aNIGooh0p&it$KSiIx<+r&vK+tj2_OV51q-SAo~6SEAbKz^Xp zQ9n7gYxSSoF4;b9TUh)|d#0YwB~CF$9=nNqdLJh%9sd?$zSN!j-EFa)DG~ocd)%tM zujK0G+^Q>^Zgl^4w3qk%OTuEjhFO2yd&M8gZ~hmi{WSmQvF=>4*rZF(-kD$ix_ae0 z$>bK-m98x7l{;Eb89ds!_3#9zztbL-SsGlie=hlF=IW#Axhqevypwq?tUFO`_Sa=y zr!tg^olOE;-1DwJ-v3*4(aZk~7T13kO?26m5qOp-u3LBSk;$=~cI)IXg$a2aY$~?T z+Q0eF#E&m;sZX%kDY|!$?$TSUB3b(G@_1A%Qg&m%d8_Npe&xy1-X3cwEGg7U$XQse z@p2z0L+-z8`HRi|Nt`lY9VZ<$=ao&F#8;KxqkM6S`qv`6j;%bLAlbQ=;9|apSf%E*X0UD-?r?!>!`BXWJ<%S&Y46k4u7&^)5pkO-(~7)n;Y zi$5*fxa|J2MJlmo|E{KPp15Sn-c8d=`}@wUSm<16&wniYCiG+X+!ch&J_udUi==zUS` z^X4=Om~?0B{#CUO$@4;ag{oqBGNR`cFFt0cySMje?tcc0tv^e?PkKFTTW>`z_w(7_ zUH|-j_ey43uXdGMDqzzuzg!`|rJ~^ROJ8M&i(jOZ(-+@#PR%|&eR00jk*x~484Jo7 z5~usNgAeQJsMJV{aUPDnui=iAJ8GN*-W*+w)MGWT6wYJMo~)7j?JT5CAZWpTG_ zX&;Q3pyj^*al<>C*{M4Dl3U%TUcU5IP=qDSx-stVIWu{s7oTo9^4^^i#I1bnnz6iU zP>+O^fi+ve;lG`y{FO5Qob4v$V?Zi}#)5 z2=DO_srXT|u`^kyC}_dzkoP-R{(NdTH>W;5*)Q(dzJC@wn#`7~-ZTrm)qGp$$Wo7w zE7%Y1II+OhZqXO@3I7?QrmVkY2tMs%w$uw1Hz%())~sbc+FKoE`63t{0;71ho7z{N zKDMcCZPhpX<3iOQ5-T~Q+eFyUH!=+&^R4=-)?&Dc{eHEm|DOb~a5T)Bg7s_1u=Q}EG@ zA}PVQoG%^@WZ?(biBL>G9G~c;g2scQmLaVrO#iB-6lTESK ns=pKciMAcZE$1P5(AO)!*DE}Sq>F~ZZpM>PA#sOf+y9#YMaDLn diff --git a/doc/gopher/pencil/gopherswim.jpg b/doc/gopher/pencil/gopherswim.jpg deleted file mode 100644 index 2f32877121b120778ed3e360b8f9f089c59487a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158593 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 v_8G|_60|u zhjP(7et|1rCO=YdE?yAzeVJ?N`k$xHtGxL5OKiG-se@|1my)*d)W-_xkCytIE?oC# z?`)+D_2<%mhA#bkZ*I*OccW9UCBE#lW0>d1s^J*?_`}Eba=zRDGt8NG(dI#3uFm_1 zmlR#uJWZJtOP)zuY8EZ**OFqgc>6Jbf^PP|qB?F5*SULl-H%n>*pnq_wb*2}tb<9I zqT~VHk2&=-!Y%D*{bw+;IsU9R?xF6wYwv7bZpK`ks;vG>i|bfp_eYtX=3+_psr&S| zR+T?JKELMo>e+jP#5Zl2_3-JWZ_i8|_j8

    2*-=$qxP&{r3I+8}XCwPn?xLRrjF4 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

    F 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 OjrR73pni4z|C;~>bguyb diff --git a/doc/gopher/pkg.png b/doc/gopher/pkg.png deleted file mode 100644 index ac96551b5560ae794b87e46c6882743483fb6d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5409 zcmeAS@N?(olHy`uVBq!ia0y~yU}?EfE^Sq9tUT_L_YAs>cNt7GT9>frxXLk+BPNY6nKl~~t9*8P zX09_$M^bbAey))|$cg2#5WuLe{ z`aKeUHv5?V;r$T~?g{M+RzDD37_w0Q&|W1irE1s1uKPQDh0KNaD+MZQs#p4G#YaW` zYVn!5X4f0topzPtKkd1qMY*SbnQ~8SeW+%DY2e?LWdVD=l|zC(KQ~`veCuhoa#vVY zQ`Pz}{SrC`YfQTgx0y~fPc^H}EIU}U{HV}r&al#JJIxBWHI}XWc8%{?pOs(MIWIk~ zb)WLM-kp+rHE&m(+C4M7cl!?3asK0Q#&Qre}ImiA`e z4tCC*&Rw2~CwVoqgYuUZr$nTrrJX&yZ^r3)>GR_QH>~^+yRpnO?B%LW=Ayr*s)p{) zlE~isYS}gWoGaO@GVN|_T@SlawJ`6B)@Q{h|G(R5HaX4zpS5Y-t%s6Q#=p~R z=TA2H{-x$KtG9TkPG0P%+{kC2s`}?xH z#bxm~{;{(c^Zm8CROj>ON7v+Q%g@dAwEO+~&ywz2)BEB)_xyVQYtC%5?eFfb+`qi$ z|B=Icjwktlvp-#<`03Mw*MGKudaqZL@hj!m&#Tv2?;oz``eXHV`Pcc6|Nm#;W#Bj2 zmA_7!fq{Xuz$3Dlfq`2Xgc%uT&5>YWU|=ut^mS#w!_3B@CLr2%UMB zOQR}7Lei(LpL6ESOG{hZ%aiAoOq$#`(`UJFzwKNfA)iHMCY{G>4|c5RlwuVva28qg zxGOM6bifOg@4H{W|9w|onTe6Xfkl9IU&8}yN0%qR-|e5o@Q^`4;ODz<_qk?zsIfHG@AqN) z`Ay&kHx(Xde=U0Vg9%{_0m>pu3a_$JXehu{55{bdGdH+%4)`glkGn*%wxa% z*3;!fPJBMst1sJMX>L_-OkJ~yB}{Ky`h(M(Zy8r8au_VjDdo_6>6(^cxc8^Vg8ix= z=V(9pdGDH>i0=zcyOZ)?d0yQp7HCa=Z^UfhKKZ3Mr&54xj9|ovZ*jFEVdooO|9LLK zXtT~YH;Loc&Hoz~hz2b_yGJBrWnbvMqh9wpozpao< z;CXhXHtwL5?a?6rx^|5R2j}U<)U-DWzB&24a$bZ(+=e|K!ktGB$}dVUC@e@_f9oQH zz`S$&o-sAfNH`K;`&YfH!=Fha+3x1C?%7;>8REC>w2}B~ck$ud&UrJt* zZ=S+|kgE4*cFxz?x4WXZxsvg3bMWoUefL%sMfmEusdRlzsN`TP`);GeklH-(Kq&dpxVw}go?l{xwNH|wh_0;kyO z>?r@AId#$5V}>7?G+rz%X9=49KBC_Hg=|A{VoK7H3(d2i^UB%2KE2|kuv+bA_4PNO zeM$8^|B-X!x^tUs!wNO3%J}%^|f*No0C=>?Q37o(YNcj{}Ph_-C$$)p@#zX zcN!!6pK@$%WU%`6@XU{H!OwD6!lv7=SrNWH?0Nlslf+lsqD$STi(ir6#`!??-iB=q zPIUq=o}9RGnL#-_`Q{VMTb~t=kA$&@q&#tWG z(w3+E?|J*zt_WTkJv-!WRdD;dwXwCzZ&#P5hN*KO%jwTvuJ?7%Zz0>Y#>@LoYt-y` z|F`&)TWI&Pm7)1&6tAJobq6P8 zn)a>|>-AdvddrM6RdX+1h}*6BYtP-2-60&p-VDVN`=p`_U*pzOz9sMHle!P;&RNRr9n4WU47*{H*EIdryHVtPQ@0lH!H7FsX)J%0DXW^K;DJWYG4 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 diff --git a/doc/gopher/project.png b/doc/gopher/project.png deleted file mode 100644 index 24603f30689c9e360729fbb881128131049b62e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8042 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 diff --git a/doc/gopher/ref.png b/doc/gopher/ref.png deleted file mode 100644 index 0508f6ec6164c9fcabebb999737e602826341e01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5895 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 ghSK&NQ{MAW{M^Krm2HYwLO~zopr0Hr&iUH||9 diff --git a/doc/gopher/run.png b/doc/gopher/run.png deleted file mode 100644 index eb690e3f22a749bb4f2e64d002bb94b45871a7a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9220 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 P(DEKnS3j3^P6=nh3JU&y`8_=;M8$#Si&0e& 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 m{Cs - -
    - -

    Get help

    - - - -{{if not $.GoogleCN}} -
    -

    -Get help from Go users, and share your work on the official mailing list. -

    -

    -Search the golang-nuts -archives and consult the FAQ and -wiki before posting. -

    - -

    Go Forum

    -

    -The Go Forum is a discussion -forum for Go programmers. -

    - -

    Gophers Discord

    -

    -Get live support and talk with other gophers on the Go Discord. -

    - -

    Gopher Slack

    -

    Get live support from other users in the Go slack channel.

    - -

    Go IRC Channel

    -

    Get live support at #go-nuts on irc.freenode.net, the official -Go IRC channel.

    -{{end}} - -

    Frequently Asked Questions (FAQ)

    -

    Answers to common questions about Go.

    - -{{if not $.GoogleCN}} -

    Stay informed

    - -

    Go Announcements Mailing List

    -

    -Subscribe to -golang-announce -for important announcements, such as the availability of new Go releases. -

    - -

    Go Blog

    -

    The Go project's official blog.

    - -

    @golang at Twitter

    -

    The Go project's official Twitter account.

    - -

    golang sub-Reddit

    -

    -The golang sub-Reddit is a place -for Go news and discussion. -

    - -

    Go Time Podcast

    -

    -The Go Time podcast is a panel of Go experts and special guests -discussing the Go programming language, the community, and everything in between. -

    -{{end}} - -

    Community resources

    - -

    Go User Groups

    -

    -Each month in places around the world, groups of Go programmers ("gophers") -meet to talk about Go. Find a chapter near you. -

    - -{{if not $.GoogleCN}} -

    Go Playground

    -

    A place to write, run, and share Go code.

    - -

    Go Wiki

    -

    A wiki maintained by the Go community.

    -{{end}} - -

    Code of Conduct

    -

    -Guidelines for participating in Go community spaces -and a reporting process for handling issues. -

    - diff --git a/doc/ie.css b/doc/ie.css deleted file mode 100644 index bb89d54be2..0000000000 --- a/doc/ie.css +++ /dev/null @@ -1 +0,0 @@ -#nav-main li { display: inline; } diff --git a/doc/play/fib.go b/doc/play/fib.go deleted file mode 100644 index 19e4721028..0000000000 --- a/doc/play/fib.go +++ /dev/null @@ -1,19 +0,0 @@ -package main - -import "fmt" - -// fib returns a function that returns -// successive Fibonacci numbers. -func fib() func() int { - a, b := 0, 1 - return func() int { - a, b = b, a+b - return a - } -} - -func main() { - f := fib() - // Function calls are evaluated left-to-right. - fmt.Println(f(), f(), f(), f(), f()) -} diff --git a/doc/play/hello.go b/doc/play/hello.go deleted file mode 100644 index 3badf12538..0000000000 --- a/doc/play/hello.go +++ /dev/null @@ -1,9 +0,0 @@ -// You can edit this code! -// Click here and start typing. -package main - -import "fmt" - -func main() { - fmt.Println("Hello, 世界") -} diff --git a/doc/play/life.go b/doc/play/life.go deleted file mode 100644 index 51afb61f3d..0000000000 --- a/doc/play/life.go +++ /dev/null @@ -1,113 +0,0 @@ -// An implementation of Conway's Game of Life. -package main - -import ( - "bytes" - "fmt" - "math/rand" - "time" -) - -// Field represents a two-dimensional field of cells. -type Field struct { - s [][]bool - w, h int -} - -// NewField returns an empty field of the specified width and height. -func NewField(w, h int) *Field { - s := make([][]bool, h) - for i := range s { - s[i] = make([]bool, w) - } - return &Field{s: s, w: w, h: h} -} - -// Set sets the state of the specified cell to the given value. -func (f *Field) Set(x, y int, b bool) { - f.s[y][x] = b -} - -// Alive reports whether the specified cell is alive. -// If the x or y coordinates are outside the field boundaries they are wrapped -// toroidally. For instance, an x value of -1 is treated as width-1. -func (f *Field) Alive(x, y int) bool { - x += f.w - x %= f.w - y += f.h - y %= f.h - return f.s[y][x] -} - -// Next returns the state of the specified cell at the next time step. -func (f *Field) Next(x, y int) bool { - // Count the adjacent cells that are alive. - alive := 0 - for i := -1; i <= 1; i++ { - for j := -1; j <= 1; j++ { - if (j != 0 || i != 0) && f.Alive(x+i, y+j) { - alive++ - } - } - } - // Return next state according to the game rules: - // exactly 3 neighbors: on, - // exactly 2 neighbors: maintain current state, - // otherwise: off. - return alive == 3 || alive == 2 && f.Alive(x, y) -} - -// Life stores the state of a round of Conway's Game of Life. -type Life struct { - a, b *Field - w, h int -} - -// NewLife returns a new Life game state with a random initial state. -func NewLife(w, h int) *Life { - a := NewField(w, h) - for i := 0; i < (w * h / 4); i++ { - a.Set(rand.Intn(w), rand.Intn(h), true) - } - return &Life{ - a: a, b: NewField(w, h), - w: w, h: h, - } -} - -// Step advances the game by one instant, recomputing and updating all cells. -func (l *Life) Step() { - // Update the state of the next field (b) from the current field (a). - for y := 0; y < l.h; y++ { - for x := 0; x < l.w; x++ { - l.b.Set(x, y, l.a.Next(x, y)) - } - } - // Swap fields a and b. - l.a, l.b = l.b, l.a -} - -// String returns the game board as a string. -func (l *Life) String() string { - var buf bytes.Buffer - for y := 0; y < l.h; y++ { - for x := 0; x < l.w; x++ { - b := byte(' ') - if l.a.Alive(x, y) { - b = '*' - } - buf.WriteByte(b) - } - buf.WriteByte('\n') - } - return buf.String() -} - -func main() { - l := NewLife(40, 15) - for i := 0; i < 300; i++ { - l.Step() - fmt.Print("\x0c", l) // Clear screen and print field. - time.Sleep(time.Second / 30) - } -} diff --git a/doc/play/peano.go b/doc/play/peano.go deleted file mode 100644 index 214fe1b613..0000000000 --- a/doc/play/peano.go +++ /dev/null @@ -1,88 +0,0 @@ -// Peano integers are represented by a linked -// list whose nodes contain no data -// (the nodes are the data). -// http://en.wikipedia.org/wiki/Peano_axioms - -// This program demonstrates that Go's automatic -// stack management can handle heavily recursive -// computations. - -package main - -import "fmt" - -// Number is a pointer to a Number -type Number *Number - -// The arithmetic value of a Number is the -// count of the nodes comprising the list. -// (See the count function below.) - -// ------------------------------------- -// Peano primitives - -func zero() *Number { - return nil -} - -func isZero(x *Number) bool { - return x == nil -} - -func add1(x *Number) *Number { - e := new(Number) - *e = x - return e -} - -func sub1(x *Number) *Number { - return *x -} - -func add(x, y *Number) *Number { - if isZero(y) { - return x - } - return add(add1(x), sub1(y)) -} - -func mul(x, y *Number) *Number { - if isZero(x) || isZero(y) { - return zero() - } - return add(mul(x, sub1(y)), x) -} - -func fact(n *Number) *Number { - if isZero(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 isZero(x) { - return 0 - } - return count(sub1(x)) + 1 -} - -// ------------------------------------- -// Print i! for i in [0,9] - -func main() { - for i := 0; i <= 9; i++ { - f := count(fact(gen(i))) - fmt.Println(i, "! =", f) - } -} diff --git a/doc/play/pi.go b/doc/play/pi.go deleted file mode 100644 index f61884e888..0000000000 --- a/doc/play/pi.go +++ /dev/null @@ -1,34 +0,0 @@ -// Concurrent computation of pi. -// See https://goo.gl/la6Kli. -// -// This demonstrates Go's ability to handle -// large numbers of concurrent processes. -// It is an unreasonable way to calculate pi. -package main - -import ( - "fmt" - "math" -) - -func main() { - fmt.Println(pi(5000)) -} - -// pi launches n goroutines to compute an -// approximation of pi. -func pi(n int) float64 { - ch := make(chan float64) - for k := 0; k <= n; k++ { - go term(ch, float64(k)) - } - f := 0.0 - for k := 0; k <= n; k++ { - f += <-ch - } - return f -} - -func term(ch chan float64, k float64) { - ch <- 4 * math.Pow(-1, k) / (2*k + 1) -} diff --git a/doc/play/sieve.go b/doc/play/sieve.go deleted file mode 100644 index 519093453f..0000000000 --- a/doc/play/sieve.go +++ /dev/null @@ -1,36 +0,0 @@ -// A concurrent prime sieve - -package main - -import "fmt" - -// Send the sequence 2, 3, 4, ... to channel 'ch'. -func Generate(ch chan<- int) { - for i := 2; ; i++ { - ch <- i // Send 'i' to channel 'ch'. - } -} - -// Copy the values from channel 'in' to channel 'out', -// removing those divisible by 'prime'. -func Filter(in <-chan int, out chan<- int, prime int) { - for { - i := <-in // Receive value from 'in'. - if i%prime != 0 { - out <- i // Send 'i' to 'out'. - } - } -} - -// The prime sieve: Daisy-chain Filter processes. -func main() { - ch := make(chan int) // Create a new channel. - go Generate(ch) // Launch Generate goroutine. - for i := 0; i < 10; i++ { - prime := <-ch - fmt.Println(prime) - ch1 := make(chan int) - go Filter(ch, ch1, prime) - ch = ch1 - } -} diff --git a/doc/play/solitaire.go b/doc/play/solitaire.go deleted file mode 100644 index 15022aa194..0000000000 --- a/doc/play/solitaire.go +++ /dev/null @@ -1,117 +0,0 @@ -// This program solves the (English) peg -// solitaire board game. -// http://en.wikipedia.org/wiki/Peg_solitaire - -package main - -import "fmt" - -const N = 11 + 1 // length of a row (+1 for \n) - -// The board must be surrounded by 2 illegal -// fields in each direction so that move() -// doesn't need to check the board boundaries. -// Periods represent illegal fields, -// ● are pegs, and ○ are holes. - -var board = []rune( - `........... -........... -....●●●.... -....●●●.... -..●●●●●●●.. -..●●●○●●●.. -..●●●●●●●.. -....●●●.... -....●●●.... -........... -........... -`) - -// center is the position of the center hole if -// there is a single one; otherwise it is -1. -var center int - -func init() { - n := 0 - for pos, field := range board { - if field == '○' { - center = pos - n++ - } - } - if n != 1 { - center = -1 // no single hole - } -} - -var moves int // number of times move is called - -// move tests if there is a peg at position pos that -// can jump over another peg in direction dir. If the -// move is valid, it is executed and move returns true. -// Otherwise, move returns false. -func move(pos, dir int) bool { - moves++ - if board[pos] == '●' && board[pos+dir] == '●' && board[pos+2*dir] == '○' { - board[pos] = '○' - board[pos+dir] = '○' - board[pos+2*dir] = '●' - return true - } - return false -} - -// unmove reverts a previously executed valid move. -func unmove(pos, dir int) { - board[pos] = '●' - board[pos+dir] = '●' - board[pos+2*dir] = '○' -} - -// solve tries to find a sequence of moves such that -// there is only one peg left at the end; if center is -// >= 0, that last peg must be in the center position. -// If a solution is found, solve prints the board after -// each move in a backward fashion (i.e., the last -// board position is printed first, all the way back to -// the starting board position). -func solve() bool { - var last, n int - for pos, field := range board { - // try each board position - if field == '●' { - // found a peg - for _, dir := range [...]int{-1, -N, +1, +N} { - // try each direction - if move(pos, dir) { - // a valid move was found and executed, - // see if this new board has a solution - if solve() { - unmove(pos, dir) - fmt.Println(string(board)) - return true - } - unmove(pos, dir) - } - } - last = pos - n++ - } - } - // tried each possible move - if n == 1 && (center < 0 || last == center) { - // there's only one peg left - fmt.Println(string(board)) - return true - } - // no solution found for this board - return false -} - -func main() { - if !solve() { - fmt.Println("no solution found") - } - fmt.Println(moves, "moves tried") -} diff --git a/doc/play/tree.go b/doc/play/tree.go deleted file mode 100644 index 3790e6cda5..0000000000 --- a/doc/play/tree.go +++ /dev/null @@ -1,100 +0,0 @@ -// Go's concurrency primitives make it easy to -// express concurrent concepts, such as -// this binary tree comparison. -// -// Trees may be of different shapes, -// but have the same contents. For example: -// -// 4 6 -// 2 6 4 7 -// 1 3 5 7 2 5 -// 1 3 -// -// This program compares a pair of trees by -// walking each in its own goroutine, -// sending their contents through a channel -// to a third goroutine that compares them. - -package main - -import ( - "fmt" - "math/rand" -) - -// A Tree is a binary tree with integer values. -type Tree struct { - Left *Tree - Value int - Right *Tree -} - -// Walk traverses a tree depth-first, -// sending each Value on a channel. -func Walk(t *Tree, ch chan int) { - if t == nil { - return - } - Walk(t.Left, ch) - ch <- t.Value - Walk(t.Right, ch) -} - -// Walker launches Walk in a new goroutine, -// and returns a read-only channel of values. -func Walker(t *Tree) <-chan int { - ch := make(chan int) - go func() { - Walk(t, ch) - close(ch) - }() - return ch -} - -// Compare reads values from two Walkers -// that run simultaneously, and returns true -// if t1 and t2 have the same contents. -func Compare(t1, t2 *Tree) bool { - c1, c2 := Walker(t1), Walker(t2) - for { - v1, ok1 := <-c1 - v2, ok2 := <-c2 - if !ok1 || !ok2 { - return ok1 == ok2 - } - if v1 != v2 { - break - } - } - return false -} - -// New returns a new, random binary tree -// holding the values 1k, 2k, ..., nk. -func New(n, k int) *Tree { - var t *Tree - for _, v := range rand.Perm(n) { - t = insert(t, (1+v)*k) - } - return t -} - -func insert(t *Tree, v int) *Tree { - if t == nil { - return &Tree{nil, v, nil} - } - if v < t.Value { - t.Left = insert(t.Left, v) - return t - } - t.Right = insert(t.Right, v) - return t -} - -func main() { - t1 := New(100, 1) - fmt.Println(Compare(t1, New(100, 1)), "Same Contents") - fmt.Println(Compare(t1, New(99, 1)), "Differing Sizes") - fmt.Println(Compare(t1, New(100, 2)), "Differing Values") - fmt.Println(Compare(t1, New(101, 2)), "Dissimilar") -} diff --git a/doc/progs/cgo1.go b/doc/progs/cgo1.go deleted file mode 100644 index d559e13931..0000000000 --- a/doc/progs/cgo1.go +++ /dev/null @@ -1,22 +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 rand - -/* -#include -*/ -import "C" - -// STOP OMIT -func Random() int { - return int(C.rand()) -} - -// STOP OMIT -func Seed(i int) { - C.srand(C.uint(i)) -} - -// END OMIT diff --git a/doc/progs/cgo2.go b/doc/progs/cgo2.go deleted file mode 100644 index da07aa49e6..0000000000 --- a/doc/progs/cgo2.go +++ /dev/null @@ -1,22 +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 rand2 - -/* -#include -*/ -import "C" - -func Random() int { - var r C.int = C.rand() - return int(r) -} - -// STOP OMIT -func Seed(i int) { - C.srand(C.uint(i)) -} - -// END OMIT diff --git a/doc/progs/cgo3.go b/doc/progs/cgo3.go deleted file mode 100644 index d5cedf4960..0000000000 --- a/doc/progs/cgo3.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package print - -// #include -// #include -import "C" -import "unsafe" - -func Print(s string) { - cs := C.CString(s) - C.fputs(cs, (*C.FILE)(C.stdout)) - C.free(unsafe.Pointer(cs)) -} - -// END OMIT diff --git a/doc/progs/cgo4.go b/doc/progs/cgo4.go deleted file mode 100644 index dbb07e84fe..0000000000 --- a/doc/progs/cgo4.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package print - -// #include -// #include -import "C" -import "unsafe" - -func Print(s string) { - cs := C.CString(s) - defer C.free(unsafe.Pointer(cs)) - C.fputs(cs, (*C.FILE)(C.stdout)) -} - -// END OMIT diff --git a/doc/progs/defer.go b/doc/progs/defer.go deleted file mode 100644 index 2e11020abf..0000000000 --- a/doc/progs/defer.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the code snippets included in "Defer, Panic, and Recover." - -package main - -import ( - "fmt" - "io" - "os" -) - -func a() { - i := 0 - defer fmt.Println(i) - i++ - return -} - -// STOP OMIT - -func b() { - for i := 0; i < 4; i++ { - defer fmt.Print(i) - } -} - -// STOP OMIT - -func c() (i int) { - defer func() { i++ }() - return 1 -} - -// STOP OMIT - -// Initial version. -func CopyFile(dstName, srcName string) (written int64, err error) { - src, err := os.Open(srcName) - if err != nil { - return - } - - dst, err := os.Create(dstName) - if err != nil { - return - } - - written, err = io.Copy(dst, src) - dst.Close() - src.Close() - return -} - -// STOP OMIT - -func main() { - a() - b() - fmt.Println() - fmt.Println(c()) -} diff --git a/doc/progs/defer2.go b/doc/progs/defer2.go deleted file mode 100644 index cad66b0702..0000000000 --- a/doc/progs/defer2.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the code snippets included in "Defer, Panic, and Recover." - -package main - -import "fmt" -import "io" // OMIT -import "os" // OMIT - -func main() { - f() - fmt.Println("Returned normally from f.") -} - -func f() { - defer func() { - if r := recover(); r != nil { - fmt.Println("Recovered in f", r) - } - }() - fmt.Println("Calling g.") - g(0) - fmt.Println("Returned normally from g.") -} - -func g(i int) { - if i > 3 { - fmt.Println("Panicking!") - panic(fmt.Sprintf("%v", i)) - } - defer fmt.Println("Defer in g", i) - fmt.Println("Printing in g", i) - g(i + 1) -} - -// STOP OMIT - -// Revised version. -func CopyFile(dstName, srcName string) (written int64, err error) { - src, err := os.Open(srcName) - if err != nil { - return - } - defer src.Close() - - dst, err := os.Create(dstName) - if err != nil { - return - } - defer dst.Close() - - return io.Copy(dst, src) -} - -// STOP OMIT diff --git a/doc/progs/eff_bytesize.go b/doc/progs/eff_bytesize.go deleted file mode 100644 index b45961114d..0000000000 --- a/doc/progs/eff_bytesize.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import "fmt" - -type ByteSize float64 - -const ( - _ = iota // ignore first value by assigning to blank identifier - KB ByteSize = 1 << (10 * iota) - MB - GB - TB - PB - EB - ZB - YB -) - -func (b ByteSize) String() string { - switch { - case b >= YB: - return fmt.Sprintf("%.2fYB", b/YB) - case b >= ZB: - return fmt.Sprintf("%.2fZB", b/ZB) - case b >= EB: - return fmt.Sprintf("%.2fEB", b/EB) - case b >= PB: - return fmt.Sprintf("%.2fPB", b/PB) - case b >= TB: - return fmt.Sprintf("%.2fTB", b/TB) - case b >= GB: - return fmt.Sprintf("%.2fGB", b/GB) - case b >= MB: - return fmt.Sprintf("%.2fMB", b/MB) - case b >= KB: - return fmt.Sprintf("%.2fKB", b/KB) - } - return fmt.Sprintf("%.2fB", b) -} - -func main() { - fmt.Println(YB, ByteSize(1e13)) -} diff --git a/doc/progs/eff_qr.go b/doc/progs/eff_qr.go deleted file mode 100644 index f2055f08c3..0000000000 --- a/doc/progs/eff_qr.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "flag" - "html/template" - "log" - "net/http" -) - -var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18 - -var templ = template.Must(template.New("qr").Parse(templateStr)) - -func main() { - flag.Parse() - http.Handle("/", http.HandlerFunc(QR)) - err := http.ListenAndServe(*addr, nil) - if err != nil { - log.Fatal("ListenAndServe:", err) - } -} - -func QR(w http.ResponseWriter, req *http.Request) { - templ.Execute(w, req.FormValue("s")) -} - -const templateStr = ` - - -QR Link Generator - - -{{if .}} - -
    -{{.}} -
    -
    -{{end}} -
    - - -
    - - -` diff --git a/doc/progs/eff_sequence.go b/doc/progs/eff_sequence.go deleted file mode 100644 index ab1826b6ee..0000000000 --- a/doc/progs/eff_sequence.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "sort" -) - -func main() { - seq := Sequence{6, 2, -1, 44, 16} - sort.Sort(seq) - fmt.Println(seq) -} - -type Sequence []int - -// Methods required by sort.Interface. -func (s Sequence) Len() int { - return len(s) -} -func (s Sequence) Less(i, j int) bool { - return s[i] < s[j] -} -func (s Sequence) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -// Copy returns a copy of the Sequence. -func (s Sequence) Copy() Sequence { - copy := make(Sequence, 0, len(s)) - return append(copy, s...) -} - -// Method for printing - sorts the elements before printing. -func (s Sequence) String() string { - s = s.Copy() // Make a copy; don't overwrite argument. - sort.Sort(s) - str := "[" - for i, elem := range s { // Loop is O(N²); will fix that in next example. - if i > 0 { - str += " " - } - str += fmt.Sprint(elem) - } - return str + "]" -} diff --git a/doc/progs/eff_unused1.go b/doc/progs/eff_unused1.go deleted file mode 100644 index 285d55eee5..0000000000 --- a/doc/progs/eff_unused1.go +++ /dev/null @@ -1,16 +0,0 @@ -package main - -import ( - "fmt" - "io" - "log" - "os" -) - -func main() { - fd, err := os.Open("test.go") - if err != nil { - log.Fatal(err) - } - // TODO: use fd. -} diff --git a/doc/progs/eff_unused2.go b/doc/progs/eff_unused2.go deleted file mode 100644 index 92eb74e053..0000000000 --- a/doc/progs/eff_unused2.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - "fmt" - "io" - "log" - "os" -) - -var _ = fmt.Printf // For debugging; delete when done. -var _ io.Reader // For debugging; delete when done. - -func main() { - fd, err := os.Open("test.go") - if err != nil { - log.Fatal(err) - } - // TODO: use fd. - _ = fd -} diff --git a/doc/progs/error.go b/doc/progs/error.go deleted file mode 100644 index e776cdba17..0000000000 --- a/doc/progs/error.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the code snippets included in "Error Handling and Go." - -package main - -import ( - "encoding/json" - "errors" - "fmt" - "log" - "net" - "os" - "time" -) - -type File struct{} - -func Open(name string) (file *File, err error) { - // OMIT - panic(1) - // STOP OMIT -} - -func openFile() { // OMIT - f, err := os.Open("filename.ext") - if err != nil { - log.Fatal(err) - } - // do something with the open *File f - // STOP OMIT - _ = f -} - -// errorString is a trivial implementation of error. -type errorString struct { - s string -} - -func (e *errorString) Error() string { - return e.s -} - -// STOP OMIT - -// New returns an error that formats as the given text. -func New(text string) error { - return &errorString{text} -} - -// STOP OMIT - -func Sqrt(f float64) (float64, error) { - if f < 0 { - return 0, errors.New("math: square root of negative number") - } - // implementation - return 0, nil // OMIT -} - -// STOP OMIT - -func printErr() (int, error) { // OMIT - f, err := Sqrt(-1) - if err != nil { - fmt.Println(err) - } - // STOP OMIT - // fmtError OMIT - if f < 0 { - return 0, fmt.Errorf("math: square root of negative number %g", f) - } - // STOP OMIT - return 0, nil -} - -type NegativeSqrtError float64 - -func (f NegativeSqrtError) Error() string { - return fmt.Sprintf("math: square root of negative number %g", float64(f)) -} - -// STOP OMIT - -type SyntaxError struct { - msg string // description of error - Offset int64 // error occurred after reading Offset bytes -} - -func (e *SyntaxError) Error() string { return e.msg } - -// STOP OMIT - -func decodeError(dec *json.Decoder, val struct{}) error { // OMIT - var f os.FileInfo // OMIT - if err := dec.Decode(&val); err != nil { - if serr, ok := err.(*json.SyntaxError); ok { - line, col := findLine(f, serr.Offset) - return fmt.Errorf("%s:%d:%d: %v", f.Name(), line, col, err) - } - return err - } - // STOP OMIT - return nil -} - -func findLine(os.FileInfo, int64) (int, int) { - // place holder; no need to run - return 0, 0 -} - -func netError(err error) { // OMIT - for { // OMIT - if nerr, ok := err.(net.Error); ok && nerr.Temporary() { - time.Sleep(1e9) - continue - } - if err != nil { - log.Fatal(err) - } - // STOP OMIT - } -} - -func main() {} diff --git a/doc/progs/error2.go b/doc/progs/error2.go deleted file mode 100644 index 086b6710d3..0000000000 --- a/doc/progs/error2.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the code snippets included in "Error Handling and Go." - -package main - -import ( - "net/http" - "text/template" -) - -func init() { - http.HandleFunc("/view", viewRecord) -} - -func viewRecord(w http.ResponseWriter, r *http.Request) { - c := appengine.NewContext(r) - key := datastore.NewKey(c, "Record", r.FormValue("id"), 0, nil) - record := new(Record) - if err := datastore.Get(c, key, record); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - if err := viewTemplate.Execute(w, record); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -// STOP OMIT - -type ap struct{} - -func (ap) NewContext(*http.Request) *ctx { return nil } - -type ctx struct{} - -func (*ctx) Errorf(string, ...interface{}) {} - -var appengine ap - -type ds struct{} - -func (ds) NewKey(*ctx, string, string, int, *int) string { return "" } -func (ds) Get(*ctx, string, *Record) error { return nil } - -var datastore ds - -type Record struct{} - -var viewTemplate *template.Template - -func main() {} diff --git a/doc/progs/error3.go b/doc/progs/error3.go deleted file mode 100644 index d9e56b5d64..0000000000 --- a/doc/progs/error3.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 file contains the code snippets included in "Error Handling and Go." - -package main - -import ( - "net/http" - "text/template" -) - -func init() { - http.Handle("/view", appHandler(viewRecord)) -} - -// STOP OMIT - -func viewRecord(w http.ResponseWriter, r *http.Request) error { - c := appengine.NewContext(r) - key := datastore.NewKey(c, "Record", r.FormValue("id"), 0, nil) - record := new(Record) - if err := datastore.Get(c, key, record); err != nil { - return err - } - return viewTemplate.Execute(w, record) -} - -// STOP OMIT - -type appHandler func(http.ResponseWriter, *http.Request) error - -func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if err := fn(w, r); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} - -// STOP OMIT - -type ap struct{} - -func (ap) NewContext(*http.Request) *ctx { return nil } - -type ctx struct{} - -func (*ctx) Errorf(string, ...interface{}) {} - -var appengine ap - -type ds struct{} - -func (ds) NewKey(*ctx, string, string, int, *int) string { return "" } -func (ds) Get(*ctx, string, *Record) error { return nil } - -var datastore ds - -type Record struct{} - -var viewTemplate *template.Template - -func main() {} diff --git a/doc/progs/error4.go b/doc/progs/error4.go deleted file mode 100644 index 8b2f3049de..0000000000 --- a/doc/progs/error4.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the code snippets included in "Error Handling and Go." - -package main - -import ( - "net/http" - "text/template" -) - -type appError struct { - Error error - Message string - Code int -} - -// STOP OMIT - -type appHandler func(http.ResponseWriter, *http.Request) *appError - -func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if e := fn(w, r); e != nil { // e is *appError, not error. - c := appengine.NewContext(r) - c.Errorf("%v", e.Error) - http.Error(w, e.Message, e.Code) - } -} - -// STOP OMIT - -func viewRecord(w http.ResponseWriter, r *http.Request) *appError { - c := appengine.NewContext(r) - key := datastore.NewKey(c, "Record", r.FormValue("id"), 0, nil) - record := new(Record) - if err := datastore.Get(c, key, record); err != nil { - return &appError{err, "Record not found", 404} - } - if err := viewTemplate.Execute(w, record); err != nil { - return &appError{err, "Can't display record", 500} - } - return nil -} - -// STOP OMIT - -func init() { - http.Handle("/view", appHandler(viewRecord)) -} - -type ap struct{} - -func (ap) NewContext(*http.Request) *ctx { return nil } - -type ctx struct{} - -func (*ctx) Errorf(string, ...interface{}) {} - -var appengine ap - -type ds struct{} - -func (ds) NewKey(*ctx, string, string, int, *int) string { return "" } -func (ds) Get(*ctx, string, *Record) error { return nil } - -var datastore ds - -type Record struct{} - -var viewTemplate *template.Template - -func main() {} diff --git a/doc/progs/go1.go b/doc/progs/go1.go deleted file mode 100644 index 50fd93441f..0000000000 --- a/doc/progs/go1.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright 2011 The Go 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 examples to embed in the Go 1 release notes document. - -package main - -import ( - "errors" - "flag" - "fmt" - "log" - "os" - "path/filepath" - "testing" - "time" - "unicode" -) - -func main() { - flag.Parse() - stringAppend() - mapDelete() - mapIteration() - multipleAssignment() - structEquality() - compositeLiterals() - runeType() - errorExample() - timePackage() - walkExample() - osIsExist() -} - -var timeout = flag.Duration("timeout", 30*time.Second, "how long to wait for completion") - -func init() { - // canonicalize the logging - log.SetFlags(0) -} - -func mapDelete() { - m := map[string]int{"7": 7, "23": 23} - k := "7" - delete(m, k) - if m["7"] != 0 || m["23"] != 23 { - log.Fatal("mapDelete:", m) - } -} - -func stringAppend() { - greeting := []byte{} - greeting = append(greeting, []byte("hello ")...) - greeting = append(greeting, "world"...) - if string(greeting) != "hello world" { - log.Fatal("stringAppend: ", string(greeting)) - } -} - -func mapIteration() { - m := map[string]int{"Sunday": 0, "Monday": 1} - for name, value := range m { - // This loop should not assume Sunday will be visited first. - f(name, value) - } -} - -func f(string, int) { -} - -func assert(t bool) { - if !t { - log.Panic("assertion fail") - } -} - -func multipleAssignment() { - sa := []int{1, 2, 3} - i := 0 - i, sa[i] = 1, 2 // sets i = 1, sa[0] = 2 - - sb := []int{1, 2, 3} - j := 0 - sb[j], j = 2, 1 // sets sb[0] = 2, j = 1 - - sc := []int{1, 2, 3} - sc[0], sc[0] = 1, 2 // sets sc[0] = 1, then sc[0] = 2 (so sc[0] = 2 at end) - - assert(i == 1 && sa[0] == 2) - assert(j == 1 && sb[0] == 2) - assert(sc[0] == 2) -} - -func structEquality() { - type Day struct { - long string - short string - } - Christmas := Day{"Christmas", "XMas"} - Thanksgiving := Day{"Thanksgiving", "Turkey"} - holiday := map[Day]bool{ - Christmas: true, - Thanksgiving: true, - } - fmt.Printf("Christmas is a holiday: %t\n", holiday[Christmas]) -} - -func compositeLiterals() { - type Date struct { - month string - day int - } - // Struct values, fully qualified; always legal. - holiday1 := []Date{ - Date{"Feb", 14}, - Date{"Nov", 11}, - Date{"Dec", 25}, - } - // Struct values, type name elided; always legal. - holiday2 := []Date{ - {"Feb", 14}, - {"Nov", 11}, - {"Dec", 25}, - } - // Pointers, fully qualified, always legal. - holiday3 := []*Date{ - &Date{"Feb", 14}, - &Date{"Nov", 11}, - &Date{"Dec", 25}, - } - // Pointers, type name elided; legal in Go 1. - holiday4 := []*Date{ - {"Feb", 14}, - {"Nov", 11}, - {"Dec", 25}, - } - // STOP OMIT - _, _, _, _ = holiday1, holiday2, holiday3, holiday4 -} - -func runeType() { - // STARTRUNE OMIT - delta := 'δ' // delta has type rune. - var DELTA rune - DELTA = unicode.ToUpper(delta) - epsilon := unicode.ToLower(DELTA + 1) - if epsilon != 'δ'+1 { - log.Fatal("inconsistent casing for Greek") - } - // ENDRUNE OMIT -} - -// START ERROR EXAMPLE OMIT -type SyntaxError struct { - File string - Line int - Message string -} - -func (se *SyntaxError) Error() string { - return fmt.Sprintf("%s:%d: %s", se.File, se.Line, se.Message) -} - -// END ERROR EXAMPLE OMIT - -func errorExample() { - var ErrSyntax = errors.New("syntax error") - _ = ErrSyntax - se := &SyntaxError{"file", 7, "error"} - got := fmt.Sprint(se) - const expect = "file:7: error" - if got != expect { - log.Fatalf("errorsPackage: expected %q got %q", expect, got) - } -} - -// sleepUntil sleeps until the specified time. It returns immediately if it's too late. -func sleepUntil(wakeup time.Time) { - now := time.Now() // A Time. - if !wakeup.After(now) { - return - } - delta := wakeup.Sub(now) // A Duration. - fmt.Printf("Sleeping for %.3fs\n", delta.Seconds()) - time.Sleep(delta) -} - -func timePackage() { - sleepUntil(time.Now().Add(123 * time.Millisecond)) -} - -func walkExample() { - // STARTWALK OMIT - markFn := func(path string, info os.FileInfo, err error) error { - if path == "pictures" { // Will skip walking of directory pictures and its contents. - return filepath.SkipDir - } - if err != nil { - return err - } - log.Println(path) - return nil - } - err := filepath.Walk(".", markFn) - if err != nil { - log.Fatal(err) - } - // ENDWALK OMIT -} - -func initializationFunction(c chan int) { - c <- 1 -} - -var PackageGlobal int - -func init() { - c := make(chan int) - go initializationFunction(c) - PackageGlobal = <-c -} - -func BenchmarkSprintf(b *testing.B) { - // Verify correctness before running benchmark. - b.StopTimer() - got := fmt.Sprintf("%x", 23) - const expect = "17" - if expect != got { - b.Fatalf("expected %q; got %q", expect, got) - } - b.StartTimer() - for i := 0; i < b.N; i++ { - fmt.Sprintf("%x", 23) - } -} - -func osIsExist() { - name := "go1.go" - f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) - if os.IsExist(err) { - log.Printf("%s already exists", name) - } - _ = f -} diff --git a/doc/progs/gobs1.go b/doc/progs/gobs1.go deleted file mode 100644 index 7077ca159f..0000000000 --- a/doc/progs/gobs1.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package gobs1 - -type T struct{ X, Y, Z int } // Only exported fields are encoded and decoded. -var t = T{X: 7, Y: 0, Z: 8} - -// STOP OMIT - -type U struct{ X, Y *int8 } // Note: pointers to int8s -var u U - -// STOP OMIT - -type Node struct { - Value int - Left, Right *Node -} - -// STOP OMIT diff --git a/doc/progs/gobs2.go b/doc/progs/gobs2.go deleted file mode 100644 index 85bb41cdca..0000000000 --- a/doc/progs/gobs2.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "bytes" - "encoding/gob" - "fmt" - "log" -) - -type P struct { - X, Y, Z int - Name string -} - -type Q struct { - X, Y *int32 - Name string -} - -func main() { - // Initialize the encoder and decoder. Normally enc and dec would be - // bound to network connections and the encoder and decoder would - // run in different processes. - var network bytes.Buffer // Stand-in for a network connection - enc := gob.NewEncoder(&network) // Will write to network. - dec := gob.NewDecoder(&network) // Will read from network. - // Encode (send) the value. - err := enc.Encode(P{3, 4, 5, "Pythagoras"}) - if err != nil { - log.Fatal("encode error:", err) - } - // Decode (receive) the value. - var q Q - err = dec.Decode(&q) - if err != nil { - log.Fatal("decode error:", err) - } - fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y) -} diff --git a/doc/progs/image_draw.go b/doc/progs/image_draw.go deleted file mode 100644 index bb73c8a714..0000000000 --- a/doc/progs/image_draw.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the code snippets included in "The Go image/draw package." - -package main - -import ( - "image" - "image/color" - "image/draw" -) - -func main() { - Color() - Rect() - RectAndScroll() - ConvAndCircle() - Glyph() -} - -func Color() { - c := color.RGBA{255, 0, 255, 255} - r := image.Rect(0, 0, 640, 480) - dst := image.NewRGBA(r) - - // ZERO OMIT - // image.ZP is the zero point -- the origin. - draw.Draw(dst, r, &image.Uniform{c}, image.ZP, draw.Src) - // STOP OMIT - - // BLUE OMIT - m := image.NewRGBA(image.Rect(0, 0, 640, 480)) - blue := color.RGBA{0, 0, 255, 255} - draw.Draw(m, m.Bounds(), &image.Uniform{blue}, image.ZP, draw.Src) - // STOP OMIT - - // RESET OMIT - draw.Draw(m, m.Bounds(), image.Transparent, image.ZP, draw.Src) - // STOP OMIT -} - -func Rect() { - dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) - sr := image.Rect(0, 0, 200, 200) - src := image.Black - dp := image.Point{100, 100} - - // RECT OMIT - r := image.Rectangle{dp, dp.Add(sr.Size())} - draw.Draw(dst, r, src, sr.Min, draw.Src) - // STOP OMIT -} - -func RectAndScroll() { - dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) - sr := image.Rect(0, 0, 200, 200) - src := image.Black - dp := image.Point{100, 100} - - // RECT2 OMIT - r := sr.Sub(sr.Min).Add(dp) - draw.Draw(dst, r, src, sr.Min, draw.Src) - // STOP OMIT - - m := dst - - // SCROLL OMIT - b := m.Bounds() - p := image.Pt(0, 20) - // Note that even though the second argument is b, - // the effective rectangle is smaller due to clipping. - draw.Draw(m, b, m, b.Min.Add(p), draw.Src) - dirtyRect := b.Intersect(image.Rect(b.Min.X, b.Max.Y-20, b.Max.X, b.Max.Y)) - // STOP OMIT - - _ = dirtyRect // noop -} - -func ConvAndCircle() { - src := image.NewRGBA(image.Rect(0, 0, 640, 480)) - dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) - - // CONV OMIT - b := src.Bounds() - m := image.NewRGBA(b) - draw.Draw(m, b, src, b.Min, draw.Src) - // STOP OMIT - - p := image.Point{100, 100} - r := 50 - - // CIRCLE2 OMIT - draw.DrawMask(dst, dst.Bounds(), src, image.ZP, &circle{p, r}, image.ZP, draw.Over) - // STOP OMIT -} - -func theGlyphImageForAFont() image.Image { - return image.NewRGBA(image.Rect(0, 0, 640, 480)) -} - -func theBoundsFor(index int) image.Rectangle { - return image.Rect(0, 0, 32, 32) -} - -func Glyph() { - p := image.Point{100, 100} - dst := image.NewRGBA(image.Rect(0, 0, 640, 480)) - glyphIndex := 42 - - // GLYPH OMIT - src := &image.Uniform{color.RGBA{0, 0, 255, 255}} - mask := theGlyphImageForAFont() - mr := theBoundsFor(glyphIndex) - draw.DrawMask(dst, mr.Sub(mr.Min).Add(p), src, image.ZP, mask, mr.Min, draw.Over) - // STOP OMIT -} - -//CIRCLESTRUCT OMIT -type circle struct { - p image.Point - r int -} - -func (c *circle) ColorModel() color.Model { - return color.AlphaModel -} - -func (c *circle) Bounds() image.Rectangle { - return image.Rect(c.p.X-c.r, c.p.Y-c.r, c.p.X+c.r, c.p.Y+c.r) -} - -func (c *circle) At(x, y int) color.Color { - xx, yy, rr := float64(x-c.p.X)+0.5, float64(y-c.p.Y)+0.5, float64(c.r) - if xx*xx+yy*yy < rr*rr { - return color.Alpha{255} - } - return color.Alpha{0} -} - -//STOP OMIT diff --git a/doc/progs/image_package1.go b/doc/progs/image_package1.go deleted file mode 100644 index c4c401e729..0000000000 --- a/doc/progs/image_package1.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "image" -) - -func main() { - p := image.Point{2, 1} - fmt.Println("X is", p.X, "Y is", p.Y) -} diff --git a/doc/progs/image_package2.go b/doc/progs/image_package2.go deleted file mode 100644 index fcb5d9fd03..0000000000 --- a/doc/progs/image_package2.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "image" -) - -func main() { - r := image.Rect(2, 1, 5, 5) - // Dx and Dy return a rectangle's width and height. - fmt.Println(r.Dx(), r.Dy(), image.Pt(0, 0).In(r)) // prints 3 4 false -} diff --git a/doc/progs/image_package3.go b/doc/progs/image_package3.go deleted file mode 100644 index 13d0f08079..0000000000 --- a/doc/progs/image_package3.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "image" -) - -func main() { - r := image.Rect(2, 1, 5, 5).Add(image.Pt(-4, -2)) - fmt.Println(r.Dx(), r.Dy(), image.Pt(0, 0).In(r)) // prints 3 4 true -} diff --git a/doc/progs/image_package4.go b/doc/progs/image_package4.go deleted file mode 100644 index c46fddf07a..0000000000 --- a/doc/progs/image_package4.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "image" -) - -func main() { - r := image.Rect(0, 0, 4, 3).Intersect(image.Rect(2, 2, 5, 5)) - // Size returns a rectangle's width and height, as a Point. - fmt.Printf("%#v\n", r.Size()) // prints image.Point{X:2, Y:1} -} diff --git a/doc/progs/image_package5.go b/doc/progs/image_package5.go deleted file mode 100644 index 0bb5c7608e..0000000000 --- a/doc/progs/image_package5.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "image" - "image/color" -) - -func main() { - m := image.NewRGBA(image.Rect(0, 0, 640, 480)) - m.Set(5, 5, color.RGBA{255, 0, 0, 255}) - fmt.Println(m.At(5, 5)) -} diff --git a/doc/progs/image_package6.go b/doc/progs/image_package6.go deleted file mode 100644 index 62eeecdb92..0000000000 --- a/doc/progs/image_package6.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "fmt" - "image" -) - -func main() { - m0 := image.NewRGBA(image.Rect(0, 0, 8, 5)) - m1 := m0.SubImage(image.Rect(1, 2, 5, 5)).(*image.RGBA) - fmt.Println(m0.Bounds().Dx(), m1.Bounds().Dx()) // prints 8, 4 - fmt.Println(m0.Stride == m1.Stride) // prints true -} diff --git a/doc/progs/interface.go b/doc/progs/interface.go deleted file mode 100644 index c2925d590d..0000000000 --- a/doc/progs/interface.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the code snippets included in "The Laws of Reflection." - -package main - -import ( - "bufio" - "bytes" - "io" - "os" -) - -type MyInt int - -var i int -var j MyInt - -// STOP OMIT - -// Reader is the interface that wraps the basic Read method. -type Reader interface { - Read(p []byte) (n int, err error) -} - -// Writer is the interface that wraps the basic Write method. -type Writer interface { - Write(p []byte) (n int, err error) -} - -// STOP OMIT - -func readers() { // OMIT - var r io.Reader - r = os.Stdin - r = bufio.NewReader(r) - r = new(bytes.Buffer) - // and so on - // STOP OMIT -} - -func typeAssertions() (interface{}, error) { // OMIT - var r io.Reader - tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0) - if err != nil { - return nil, err - } - r = tty - // STOP OMIT - var w io.Writer - w = r.(io.Writer) - // STOP OMIT - var empty interface{} - empty = w - // STOP OMIT - return empty, err -} - -func main() { -} diff --git a/doc/progs/interface2.go b/doc/progs/interface2.go deleted file mode 100644 index a541d94e48..0000000000 --- a/doc/progs/interface2.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file contains the code snippets included in "The Laws of Reflection." - -package main - -import ( - "fmt" - "reflect" -) - -func main() { - var x float64 = 3.4 - fmt.Println("type:", reflect.TypeOf(x)) - // STOP OMIT - // TODO(proppy): test output OMIT -} - -// STOP main OMIT - -func f1() { - // START f1 OMIT - var x float64 = 3.4 - v := reflect.ValueOf(x) - fmt.Println("type:", v.Type()) - fmt.Println("kind is float64:", v.Kind() == reflect.Float64) - fmt.Println("value:", v.Float()) - // STOP OMIT -} - -func f2() { - // START f2 OMIT - var x uint8 = 'x' - v := reflect.ValueOf(x) - fmt.Println("type:", v.Type()) // uint8. - fmt.Println("kind is uint8: ", v.Kind() == reflect.Uint8) // true. - x = uint8(v.Uint()) // v.Uint returns a uint64. - // STOP OMIT -} - -func f3() { - // START f3 OMIT - type MyInt int - var x MyInt = 7 - v := reflect.ValueOf(x) - // STOP OMIT - // START f3b OMIT - y := v.Interface().(float64) // y will have type float64. - fmt.Println(y) - // STOP OMIT - // START f3c OMIT - fmt.Println(v.Interface()) - // STOP OMIT - // START f3d OMIT - fmt.Printf("value is %7.1e\n", v.Interface()) - // STOP OMIT -} - -func f4() { - // START f4 OMIT - var x float64 = 3.4 - v := reflect.ValueOf(x) - v.SetFloat(7.1) // Error: will panic. - // STOP OMIT -} - -func f5() { - // START f5 OMIT - var x float64 = 3.4 - v := reflect.ValueOf(x) - fmt.Println("settability of v:", v.CanSet()) - // STOP OMIT -} - -func f6() { - // START f6 OMIT - var x float64 = 3.4 - v := reflect.ValueOf(x) - // STOP OMIT - // START f6b OMIT - v.SetFloat(7.1) - // STOP OMIT -} - -func f7() { - // START f7 OMIT - var x float64 = 3.4 - p := reflect.ValueOf(&x) // Note: take the address of x. - fmt.Println("type of p:", p.Type()) - fmt.Println("settability of p:", p.CanSet()) - // STOP OMIT - // START f7b OMIT - v := p.Elem() - fmt.Println("settability of v:", v.CanSet()) - // STOP OMIT - // START f7c OMIT - v.SetFloat(7.1) - fmt.Println(v.Interface()) - fmt.Println(x) - // STOP OMIT -} - -func f8() { - // START f8 OMIT - type T struct { - A int - B string - } - t := T{23, "skidoo"} - s := reflect.ValueOf(&t).Elem() - typeOfT := s.Type() - for i := 0; i < s.NumField(); i++ { - f := s.Field(i) - fmt.Printf("%d: %s %s = %v\n", i, - typeOfT.Field(i).Name, f.Type(), f.Interface()) - } - // STOP OMIT - // START f8b OMIT - s.Field(0).SetInt(77) - s.Field(1).SetString("Sunset Strip") - fmt.Println("t is now", t) - // STOP OMIT -} - -func f9() { - // START f9 OMIT - var x float64 = 3.4 - fmt.Println("value:", reflect.ValueOf(x)) - // STOP OMIT -} diff --git a/doc/progs/json1.go b/doc/progs/json1.go deleted file mode 100644 index 9804efbaae..0000000000 --- a/doc/progs/json1.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "encoding/json" - "log" - "reflect" -) - -type Message struct { - Name string - Body string - Time int64 -} - -// STOP OMIT - -func Encode() { - m := Message{"Alice", "Hello", 1294706395881547000} - b, err := json.Marshal(m) - - if err != nil { - panic(err) - } - - expected := []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`) - if !reflect.DeepEqual(b, expected) { - log.Panicf("Error marshaling %q, expected %q, got %q.", m, expected, b) - } - -} - -func Decode() { - b := []byte(`{"Name":"Alice","Body":"Hello","Time":1294706395881547000}`) - var m Message - err := json.Unmarshal(b, &m) - - if err != nil { - panic(err) - } - - expected := Message{ - Name: "Alice", - Body: "Hello", - Time: 1294706395881547000, - } - - if !reflect.DeepEqual(m, expected) { - log.Panicf("Error unmarshaling %q, expected %q, got %q.", b, expected, m) - } - - m = Message{ - Name: "Alice", - Body: "Hello", - Time: 1294706395881547000, - } - - // STOP OMIT -} - -func PartialDecode() { - b := []byte(`{"Name":"Bob","Food":"Pickle"}`) - var m Message - err := json.Unmarshal(b, &m) - - // STOP OMIT - - if err != nil { - panic(err) - } - - expected := Message{ - Name: "Bob", - } - - if !reflect.DeepEqual(expected, m) { - log.Panicf("Error unmarshaling %q, expected %q, got %q.", b, expected, m) - } -} - -func main() { - Encode() - Decode() - PartialDecode() -} diff --git a/doc/progs/json2.go b/doc/progs/json2.go deleted file mode 100644 index 6089ae6710..0000000000 --- a/doc/progs/json2.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 main - -import ( - "fmt" - "math" -) - -func InterfaceExample() { - var i interface{} - i = "a string" - i = 2011 - i = 2.777 - - // STOP OMIT - - r := i.(float64) - fmt.Println("the circle's area", math.Pi*r*r) - - // STOP OMIT - - switch v := i.(type) { - case int: - fmt.Println("twice i is", v*2) - case float64: - fmt.Println("the reciprocal of i is", 1/v) - case string: - h := len(v) / 2 - fmt.Println("i swapped by halves is", v[h:]+v[:h]) - default: - // i isn't one of the types above - } - - // STOP OMIT -} - -func main() { - InterfaceExample() -} diff --git a/doc/progs/json3.go b/doc/progs/json3.go deleted file mode 100644 index 442c155b08..0000000000 --- a/doc/progs/json3.go +++ /dev/null @@ -1,73 +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 ( - "encoding/json" - "fmt" - "log" - "reflect" -) - -func Decode() { - b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`) - - var f interface{} - err := json.Unmarshal(b, &f) - - // STOP OMIT - - if err != nil { - panic(err) - } - - expected := map[string]interface{}{ - "Name": "Wednesday", - "Age": float64(6), - "Parents": []interface{}{ - "Gomez", - "Morticia", - }, - } - - if !reflect.DeepEqual(f, expected) { - log.Panicf("Error unmarshaling %q, expected %q, got %q", b, expected, f) - } - - f = map[string]interface{}{ - "Name": "Wednesday", - "Age": 6, - "Parents": []interface{}{ - "Gomez", - "Morticia", - }, - } - - // STOP OMIT - - m := f.(map[string]interface{}) - - for k, v := range m { - switch vv := v.(type) { - case string: - fmt.Println(k, "is string", vv) - case int: - fmt.Println(k, "is int", vv) - case []interface{}: - fmt.Println(k, "is an array:") - for i, u := range vv { - fmt.Println(i, u) - } - default: - fmt.Println(k, "is of a type I don't know how to handle") - } - } - - // STOP OMIT -} - -func main() { - Decode() -} diff --git a/doc/progs/json4.go b/doc/progs/json4.go deleted file mode 100644 index 1c7e5b4cfa..0000000000 --- a/doc/progs/json4.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "encoding/json" - "log" - "reflect" -) - -type FamilyMember struct { - Name string - Age int - Parents []string -} - -// STOP OMIT - -func Decode() { - b := []byte(`{"Name":"Bob","Age":20,"Parents":["Morticia", "Gomez"]}`) - var m FamilyMember - err := json.Unmarshal(b, &m) - - // STOP OMIT - - if err != nil { - panic(err) - } - - expected := FamilyMember{ - Name: "Bob", - Age: 20, - Parents: []string{"Morticia", "Gomez"}, - } - - if !reflect.DeepEqual(expected, m) { - log.Panicf("Error unmarshaling %q, expected %q, got %q", b, expected, m) - } -} - -func main() { - Decode() -} diff --git a/doc/progs/json5.go b/doc/progs/json5.go deleted file mode 100644 index 6d7a4ca8c4..0000000000 --- a/doc/progs/json5.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "encoding/json" - "log" - "os" -) - -func main() { - dec := json.NewDecoder(os.Stdin) - enc := json.NewEncoder(os.Stdout) - for { - var v map[string]interface{} - if err := dec.Decode(&v); err != nil { - log.Println(err) - return - } - for k := range v { - if k != "Name" { - delete(v, k) - } - } - if err := enc.Encode(&v); err != nil { - log.Println(err) - } - } -} diff --git a/doc/progs/run.go b/doc/progs/run.go deleted file mode 100644 index 8ac75cdcff..0000000000 --- a/doc/progs/run.go +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// run runs the docs tests found in this directory. -package main - -import ( - "bytes" - "flag" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "regexp" - "runtime" - "strings" - "time" -) - -const usage = `go run run.go [tests] - -run.go runs the docs tests in this directory. -If no tests are provided, it runs all tests. -Tests may be specified without their .go suffix. -` - -func main() { - start := time.Now() - - flag.Usage = func() { - fmt.Fprintf(os.Stderr, usage) - flag.PrintDefaults() - os.Exit(2) - } - - flag.Parse() - if flag.NArg() == 0 { - // run all tests - fixcgo() - } else { - // run specified tests - onlyTest(flag.Args()...) - } - - tmpdir, err := ioutil.TempDir("", "go-progs") - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - - // ratec limits the number of tests running concurrently. - // None of the tests are intensive, so don't bother - // trying to manually adjust for slow builders. - ratec := make(chan bool, runtime.NumCPU()) - errc := make(chan error, len(tests)) - - for _, tt := range tests { - tt := tt - ratec <- true - go func() { - errc <- test(tmpdir, tt.file, tt.want) - <-ratec - }() - } - - var rc int - for range tests { - if err := <-errc; err != nil { - fmt.Fprintln(os.Stderr, err) - rc = 1 - } - } - os.Remove(tmpdir) - if rc == 0 { - fmt.Printf("ok\t%s\t%s\n", filepath.Base(os.Args[0]), time.Since(start).Round(time.Millisecond)) - } - os.Exit(rc) -} - -// test builds the test in the given file. -// If want is non-empty, test also runs the test -// and checks that the output matches the regexp want. -func test(tmpdir, file, want string) error { - // Build the program. - prog := filepath.Join(tmpdir, file+".exe") - cmd := exec.Command("go", "build", "-o", prog, file+".go") - out, err := cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("go build %s.go failed: %v\nOutput:\n%s", file, err, out) - } - defer os.Remove(prog) - - // Only run the test if we have output to check. - if want == "" { - return nil - } - - cmd = exec.Command(prog) - out, err = cmd.CombinedOutput() - if err != nil { - return fmt.Errorf("%s failed: %v\nOutput:\n%s", file, err, out) - } - - // Canonicalize output. - out = bytes.TrimRight(out, "\n") - out = bytes.ReplaceAll(out, []byte{'\n'}, []byte{' '}) - - // Check the result. - match, err := regexp.Match(want, out) - if err != nil { - return fmt.Errorf("failed to parse regexp %q: %v", want, err) - } - if !match { - return fmt.Errorf("%s.go:\n%q\ndoes not match %s", file, out, want) - } - - return nil -} - -type testcase struct { - file string - want string -} - -var tests = []testcase{ - // defer_panic_recover - {"defer", `^0 3210 2$`}, - {"defer2", `^Calling g. Printing in g 0 Printing in g 1 Printing in g 2 Printing in g 3 Panicking! Defer in g 3 Defer in g 2 Defer in g 1 Defer in g 0 Recovered in f 4 Returned normally from f.$`}, - - // effective_go - {"eff_bytesize", `^1.00YB 9.09TB$`}, - {"eff_qr", ""}, - {"eff_sequence", `^\[-1 2 6 16 44\]$`}, - {"eff_unused2", ""}, - - // error_handling - {"error", ""}, - {"error2", ""}, - {"error3", ""}, - {"error4", ""}, - - // law_of_reflection - {"interface", ""}, - {"interface2", `^type: float64$`}, - - // c_go_cgo - {"cgo1", ""}, - {"cgo2", ""}, - {"cgo3", ""}, - {"cgo4", ""}, - - // timeout - {"timeout1", ""}, - {"timeout2", ""}, - - // gobs - {"gobs1", ""}, - {"gobs2", ""}, - - // json - {"json1", `^$`}, - {"json2", `the reciprocal of i is`}, - {"json3", `Age is int 6`}, - {"json4", `^$`}, - {"json5", ""}, - - // image_package - {"image_package1", `^X is 2 Y is 1$`}, - {"image_package2", `^3 4 false$`}, - {"image_package3", `^3 4 true$`}, - {"image_package4", `^image.Point{X:2, Y:1}$`}, - {"image_package5", `^{255 0 0 255}$`}, - {"image_package6", `^8 4 true$`}, - - // other - {"go1", `^Christmas is a holiday: true .*go1.go already exists$`}, - {"slices", ""}, -} - -func onlyTest(files ...string) { - var new []testcase -NextFile: - for _, file := range files { - file = strings.TrimSuffix(file, ".go") - for _, tt := range tests { - if tt.file == file { - new = append(new, tt) - continue NextFile - } - } - fmt.Fprintf(os.Stderr, "test %s.go not found\n", file) - os.Exit(1) - } - tests = new -} - -func skipTest(file string) { - for i, tt := range tests { - if tt.file == file { - copy(tests[i:], tests[i+1:]) - tests = tests[:len(tests)-1] - return - } - } - panic("delete(" + file + "): not found") -} - -func fixcgo() { - if os.Getenv("CGO_ENABLED") != "1" { - skipTest("cgo1") - skipTest("cgo2") - skipTest("cgo3") - skipTest("cgo4") - return - } - - switch runtime.GOOS { - case "freebsd": - // cgo1 and cgo2 don't run on freebsd, srandom has a different signature - skipTest("cgo1") - skipTest("cgo2") - case "netbsd": - // cgo1 and cgo2 don't run on netbsd, srandom has a different signature - skipTest("cgo1") - skipTest("cgo2") - } -} diff --git a/doc/progs/slices.go b/doc/progs/slices.go deleted file mode 100644 index 967a3e76bd..0000000000 --- a/doc/progs/slices.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package main - -import ( - "io/ioutil" - "regexp" -) - -func AppendByte(slice []byte, data ...byte) []byte { - m := len(slice) - n := m + len(data) - if n > cap(slice) { // if necessary, reallocate - // allocate double what's needed, for future growth. - newSlice := make([]byte, (n+1)*2) - copy(newSlice, slice) - slice = newSlice - } - slice = slice[0:n] - copy(slice[m:n], data) - return slice -} - -// STOP OMIT - -// Filter returns a new slice holding only -// the elements of s that satisfy fn. -func Filter(s []int, fn func(int) bool) []int { - var p []int // == nil - for _, i := range s { - if fn(i) { - p = append(p, i) - } - } - return p -} - -// STOP OMIT - -var digitRegexp = regexp.MustCompile("[0-9]+") - -func FindDigits(filename string) []byte { - b, _ := ioutil.ReadFile(filename) - return digitRegexp.Find(b) -} - -// STOP OMIT - -func CopyDigits(filename string) []byte { - b, _ := ioutil.ReadFile(filename) - b = digitRegexp.Find(b) - c := make([]byte, len(b)) - copy(c, b) - return c -} - -// STOP OMIT - -func main() { - // place holder; no need to run -} diff --git a/doc/progs/timeout1.go b/doc/progs/timeout1.go deleted file mode 100644 index 353ba6908e..0000000000 --- a/doc/progs/timeout1.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package timeout - -import ( - "time" -) - -func Timeout() { - ch := make(chan bool, 1) - timeout := make(chan bool, 1) - go func() { - time.Sleep(1 * time.Second) - timeout <- true - }() - - // STOP OMIT - - select { - case <-ch: - // a read from ch has occurred - case <-timeout: - // the read from ch has timed out - } - - // STOP OMIT -} diff --git a/doc/progs/timeout2.go b/doc/progs/timeout2.go deleted file mode 100644 index b0d34eabf8..0000000000 --- a/doc/progs/timeout2.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 query - -type Conn string - -func (c Conn) DoQuery(query string) Result { - return Result("result") -} - -type Result string - -func Query(conns []Conn, query string) Result { - ch := make(chan Result, 1) - for _, conn := range conns { - go func(c Conn) { - select { - case ch <- c.DoQuery(query): - default: - } - }(conn) - } - return <-ch -} - -// STOP OMIT diff --git a/doc/share.png b/doc/share.png deleted file mode 100644 index c04f0c71aa3de279e176974ca5dfc43d297791e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2993 zcmeAS@N?(olHy`uVBq!ia0y~yV31^BU=ZhEVqjn>Y%F$RVBngZ>FgZf>Flf!P?VpR znUl)EU~ziw>F-tE`^e7simdtL3j@^81kmw&foW%$In zEMNwsHp2n&4%fg&yDzSsoh5ga8JJZanA{kWHf?ITH*w;^2lBa#xJ$M*Sad%3u5#dgs(Ys+1ho->8Ig-!L6`kZ!KmTc8 zzNKN{J`QE83Zu!IkC+@@IX(K4BPM=P(Nl1n*oI0bh7%so4>V6b<+A0Zv1!DIpEHf; zv~TeIwEtzne`n*!WhYaLQf+RZHb4CPpnCdJ_jZMRtxai` zI?L+6$Sg0CSXith^4sOCq5qkViBCP6lAcFQl6!4?{N+r=O*M{16)isYr_Brdii49M zJ)d#*8Q~YO`OeM@I{=C^5>m zC@q%Vz}9zwk-<>i-6nWX{<4Cp9mjn|FYlcwePH7PV-_84?pA(5**LU}} zS2L}Au>W|Oa=Lm66T^=y-)A^0GW?#fH(>Wi+hzZGG#_&@4O$z-->~yO zFtFgdbx^Z_FNW#*0p9{~8{kos?%Cm(S=$8r7Ofj)K{^WN~^l=b*gnqzGz}1o7-9D%)T)BqRtntFHt3&ySVN) zWk;$!mno zIA%Ba9$t5BT0(hp^v2j5c5ejAWZDm}e0Zkt-3|^JVfAC856T|$Jv{d)?_pb^{0Egi zeD}oU8~l%Oe~|tt`a|uHqe8{kHazV3!&kQ9kq2A7S zM^icGI5nY%Hg^%sWWNvBhjPJLu9UY zyz);C{=D+{%I7PcO+Kl4t$Xm*kBg5IUJsT;hGdGRbYS(>!;u-9I%8@G(qjudg+gi5u_^XUkFql54@lgmAq zV%F}A|Gewjj%nM%7EBAso_?)zZTKy%TXDBCZ#})0zQw&X!%EJ|W^U2k%~tv^PLl>NjI14(HykgxbmE4_y^PI)yDt_ehbFfbt}ER9QCYaFbNNZG$ySrCmqi4p zUoN?PcbWOw1Y`EiA)B){OF!GNbFt<5n(dYIS&tn$>XZ#SbN~tLf)%tH_{gSE#o>_ zyH>mTcAI~D_D$xu?YHkT8GMO+vt@V5?z6D6?2?I=ai7aGXVRRkIc#&L&QYH0Jx70c zLQGA}wViW{e!h71LaWU7)vxKZmqzc3o_zZ=>oIN%Zay7}qU*)!yRPr@wtXSzDfioE z$-G_je9l{)Umo`>E@yq!dcpkQ_a^V1@2#(0Q|n@C;j!{WM@V2s?yOjI7jz6V}WrgJdy#rlO_Eo#+_70lypnc5e)4$Q5z}M7$9^B3e$-q1Z2XqAi(6T~vcx&LE9n{P zZL}+_+4%pFYWS+aEefrAuR2}QRF?E*3KR2rQ1l0ruUrJA7+1zJ2 z?~KPfPr2luo60uDZQ6U|>6^el>*YPhlOD|rn)YeV>vMO{$@+fvS?f`I^z+lukN1|a zE`94e+o#{deumv#!TA?Y9sfM}hdOJBd4i* zKbL$qd&0Z!V_fiVv8dU5wpGvlx9d;o;n&R9&2tp;JnnzE?e@AiRr-E@*ZnIq*H7JV zSO22@fcz}(CtNP9%(L&Bz5grtSNZ+%drrF##kR(G-*64@UfZqRWj}p`*SdcxpM#(J zUycsi_GOyYw0AeV?rPn*wf}5!wDZiQ$h?~uzHNA$`}E7FMW4P~PkX;3C^3Fxxq9L9 zl;vBDwronCesJB|-FD$i!|tyAwlZ(+#Wk91X5Kk_uQt2?`n+j-qpG{V*WEgPyL`Rb zhHY!ltyq_2UsnI^Upo6EzAt~?{3%Y}TUA^5cY1SE^QE>GZQQ+ny}iD(e3zar*u13j z%Y{kK=KQ~9-(_sfS(zJ}scXm7=h3(4hw97e{}wB{@9wvh&$i5~*z=6#txKTvm2InX z*Vt~2y*2T|#d4z`Ddo$fpLfQut+TE0`X2H%^XcWK=^g2x&il+iYioT^^-Wc2Uv=J! z>dNnjKX;$IzjMO}r}sxEbWhi3jj_7__-^sHO~0Q8hsUg+v*%UK*1xkJZ{7Bq@4Ek= zXCH2N#vQ-6P1?`gDsR`FH*caZls}vHd~Naezj^Vy4(}*_oA=}HzJE9VRWp0DE%|=q z`@H+-cl>|m_^o+m`)m0`IZ@lNikOcspFQusU$%d{m+aEz?0?zT+xOP}D(Eo%@~MA~ zy&eB^`^7e^B`!*4*5v*Eb0y=zi?ib0@jUxQ_RXmZ{jmJeeAD&5aq|C9zh3`3x%*h# z{f>J+`*kaqe|z_!`uF#{k0(C%SNkCxJlR$Lik(SK$-f()HUC{caplzc9p|UU`|K~N z@-*pl8x-Q*1Ud|61CThV}ERWL`vi+?e=sU6<$a zhFRIm=KlEnU0y}YOn#StQ>24(gWj*d&*fY8e*M7Q;do@3{(@Ww>xqX~Ok*sz mpH(=!gZszDqNyni3}%`}Iw#GAjxjJWFnGH9xvX - -

    -The Go website (the "Website") is hosted by Google. -By using and/or visiting the Website, you consent to be bound by Google's general -Terms of Service -and Google's general -Privacy Policy. -

    diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 955ce2a063..4f081c9f88 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -727,14 +727,6 @@ func (t *tester) registerTests() { } } - // Doc tests only run on builders. - // They find problems approximately never. - if goos != "js" && goos != "android" && !t.iOS() && os.Getenv("GO_BUILDER_NAME") != "" { - t.registerTest("doc_progs", "../doc/progs", "go", "run", "run.go") - t.registerTest("wiki", "../doc/articles/wiki", t.goTest(), ".") - t.registerTest("codewalk", "../doc/codewalk", t.goTest(), "codewalk_test.go") - } - if goos != "android" && !t.iOS() { // There are no tests in this directory, only benchmarks. // Check that the test binary builds but don't bother running it. -- GitLab From f0d23c9dbb2142b975fa8fb13a57213d0c15bdd1 Mon Sep 17 00:00:00 2001 From: Wei Fu Date: Sun, 24 Jan 2021 18:21:06 +0800 Subject: [PATCH 1755/1792] internal/poll: netpollcheckerr before sendfile In net/http package, the ServeContent/ServeFile doesn't check the I/O timeout error from chunkWriter or *net.TCPConn, which means that both HTTP status and headers might be missing when WriteTimeout happens. If the poll.SendFile() doesn't check the *poll.FD state before sending data, the client will only receive the response body with status and report "malformed http response/status code". This patch is to enable netpollcheckerr before sendfile, which should align with normal *poll.FD.Write() and Splice(). Fixes #43822 Change-Id: I32517e3f261bab883a58b577b813ef189214b954 Reviewed-on: https://go-review.googlesource.com/c/go/+/285914 Reviewed-by: Emmanuel Odeke Trust: Emmanuel Odeke Trust: Bryan C. Mills Run-TryBot: Emmanuel Odeke --- src/internal/poll/sendfile_bsd.go | 4 ++ src/internal/poll/sendfile_linux.go | 3 ++ src/internal/poll/sendfile_solaris.go | 3 ++ src/net/sendfile_test.go | 65 +++++++++++++++++++++++++++ 4 files changed, 75 insertions(+) diff --git a/src/internal/poll/sendfile_bsd.go b/src/internal/poll/sendfile_bsd.go index a24e41dcaa..66005a9f5c 100644 --- a/src/internal/poll/sendfile_bsd.go +++ b/src/internal/poll/sendfile_bsd.go @@ -18,6 +18,10 @@ func SendFile(dstFD *FD, src int, pos, remain int64) (int64, error) { return 0, err } defer dstFD.writeUnlock() + if err := dstFD.pd.prepareWrite(dstFD.isFile); err != nil { + return 0, err + } + dst := int(dstFD.Sysfd) var written int64 var err error diff --git a/src/internal/poll/sendfile_linux.go b/src/internal/poll/sendfile_linux.go index d64283007d..d6442e8666 100644 --- a/src/internal/poll/sendfile_linux.go +++ b/src/internal/poll/sendfile_linux.go @@ -16,6 +16,9 @@ func SendFile(dstFD *FD, src int, remain int64) (int64, error) { return 0, err } defer dstFD.writeUnlock() + if err := dstFD.pd.prepareWrite(dstFD.isFile); err != nil { + return 0, err + } dst := int(dstFD.Sysfd) var written int64 diff --git a/src/internal/poll/sendfile_solaris.go b/src/internal/poll/sendfile_solaris.go index 762992e9eb..748c85131e 100644 --- a/src/internal/poll/sendfile_solaris.go +++ b/src/internal/poll/sendfile_solaris.go @@ -20,6 +20,9 @@ func SendFile(dstFD *FD, src int, pos, remain int64) (int64, error) { return 0, err } defer dstFD.writeUnlock() + if err := dstFD.pd.prepareWrite(dstFD.isFile); err != nil { + return 0, err + } dst := int(dstFD.Sysfd) var written int64 diff --git a/src/net/sendfile_test.go b/src/net/sendfile_test.go index 657a36599f..d6057fd839 100644 --- a/src/net/sendfile_test.go +++ b/src/net/sendfile_test.go @@ -10,8 +10,10 @@ import ( "bytes" "crypto/sha256" "encoding/hex" + "errors" "fmt" "io" + "io/ioutil" "os" "runtime" "sync" @@ -313,3 +315,66 @@ func TestSendfilePipe(t *testing.T) { wg.Wait() } + +// Issue 43822: tests that returns EOF when conn write timeout. +func TestSendfileOnWriteTimeoutExceeded(t *testing.T) { + ln, err := newLocalListener("tcp") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + errc := make(chan error, 1) + go func(ln Listener) (retErr error) { + defer func() { + errc <- retErr + close(errc) + }() + + conn, err := ln.Accept() + if err != nil { + return err + } + defer conn.Close() + + // Set the write deadline in the past(1h ago). It makes + // sure that it is always write timeout. + if err := conn.SetWriteDeadline(time.Now().Add(-1 * time.Hour)); err != nil { + return err + } + + f, err := os.Open(newton) + if err != nil { + return err + } + defer f.Close() + + _, err = io.Copy(conn, f) + if errors.Is(err, os.ErrDeadlineExceeded) { + return nil + } + + if err == nil { + err = fmt.Errorf("expected ErrDeadlineExceeded, but got nil") + } + return err + }(ln) + + conn, err := Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatal(err) + } + defer conn.Close() + + n, err := io.Copy(ioutil.Discard, conn) + if err != nil { + t.Fatalf("expected nil error, but got %v", err) + } + if n != 0 { + t.Fatalf("expected receive zero, but got %d byte(s)", n) + } + + if err := <-errc; err != nil { + t.Fatal(err) + } +} -- GitLab From 353e111455d6b81fdce0a6d3190baba6adca3372 Mon Sep 17 00:00:00 2001 From: KimMachineGun Date: Tue, 16 Feb 2021 15:51:32 +0000 Subject: [PATCH 1756/1792] doc/go1.16: fix mismatched id attribute For #40700. Change-Id: I186a21899404bfb79c08bfa8623caf9da74b6b0d GitHub-Last-Rev: 25d240db3c0e2a923720bb9667ef0599ec06819e GitHub-Pull-Request: golang/go#44145 Reviewed-on: https://go-review.googlesource.com/c/go/+/290329 Trust: Ian Lance Taylor Reviewed-by: Dmitri Shuralyov --- doc/go1.16.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index d5de0ee5ce..08f5d5431e 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -317,7 +317,7 @@ Do not send CLs removing the interior tags from such phrases.

    Vet

    -

    New warning for invalid testing.T use in +

    New warning for invalid testing.T use in goroutines

    -- GitLab From 6530f2617f3100d8f1036afc5cb9b30b36628aaa Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Sat, 13 Feb 2021 02:44:11 +0000 Subject: [PATCH 1757/1792] doc/go1.16: remove draft notice Fixes #40700. Change-Id: I99ed479d1bb3cdf469c0209720c728276182a7a9 Reviewed-on: https://go-review.googlesource.com/c/go/+/291809 Reviewed-by: Alexander Rakoczy Reviewed-by: Carlos Amedee Trust: Alexander Rakoczy Run-TryBot: Alexander Rakoczy TryBot-Result: Go Bot --- doc/go1.16.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/go1.16.html b/doc/go1.16.html index 08f5d5431e..0beb62d160 100644 --- a/doc/go1.16.html +++ b/doc/go1.16.html @@ -14,13 +14,13 @@ Do not send CLs removing the interior tags from such phrases. main ul li { margin: 0.5em 0; } -

    DRAFT RELEASE NOTES — Introduction to Go 1.16

    +

    Introduction to Go 1.16

    - - Go 1.16 is not yet released. These are work-in-progress - release notes. Go 1.16 is expected to be released in February 2021. - + The latest Go release, version 1.16, arrives six months after Go 1.15. + Most of its changes are in the implementation of the toolchain, runtime, and libraries. + As always, the release maintains the Go 1 promise of compatibility. + We expect almost all Go programs to continue to compile and run as before.

    Changes to the language

    @@ -505,7 +505,7 @@ func TestFoo(t *testing.T) { On the consumer side, the new http.FS function converts an fs.FS to an - http.Handler. + http.FileSystem. Also, the html/template and text/template packages’ ParseFS @@ -952,7 +952,7 @@ func TestFoo(t *testing.T) {

    The new http.FS function converts an fs.FS - to an http.Handler. + to an http.FileSystem.

    Go Nuts Mailing List

    FWV9paK+(S+njAd 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 z%0A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

  • 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 diff --git a/doc/gopher/bumper480x270.png b/doc/gopher/bumper480x270.png deleted file mode 100644 index cf187151fd6a5ae7e1333b7286020e6965fdc9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26509 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 G2~7a0d&Oe_ diff --git a/doc/gopher/bumper640x360.png b/doc/gopher/bumper640x360.png deleted file mode 100644 index a5073e0d1a5adb1bd7ef8778ba90d04e560dfad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42013 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 Uzv29Vfq{X+)78&qol`;+0B6_HSpWb4 diff --git a/doc/gopher/doc.png b/doc/gopher/doc.png deleted file mode 100644 index e15a3234d5d2c87e4e6afc226d971e8ab0c65d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4395 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 L)z4*}Q$iB}&USvP diff --git a/doc/gopher/favicon.svg b/doc/gopher/favicon.svg deleted file mode 100644 index e5a68fe29e..0000000000 --- a/doc/gopher/favicon.svg +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/gopher/fiveyears.jpg b/doc/gopher/fiveyears.jpg deleted file mode 100644 index df1064868ef8fac1d0b3d66617e470266d70e7f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220526 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%0AHKBGJ?~^uSyT9anb7AJ63Sm*`$l{) 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�HJPf1T+H+$)w&8H-n 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 YZ`ZH%Gr4k!fq{X+)78&qol`;+03bkI{{R30 diff --git a/doc/gopher/gopherbw.png b/doc/gopher/gopherbw.png deleted file mode 100644 index 3bfe85dc16fc7c691010a088ea467f8159697d08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171323 zcmeAS@N?(olHy`uVBq!ia0y~y;1>m94mJh`hBM0*cQP<=S!Oyr2Lxo~m*f{`L7=A<$(cpRTQtvn>;x>)=9z2#L4&l)fVwcXo&fZQt}8m(r__ACCp``fJn#&b`=f{LkZUqoqV@z-Rsuu`TptC@5gKM-){cC z^Y@#*=cB|KCN0;WKAp{*al$F#56w1nUJ6bOEP2Dwz$ll{pvmA9=C&(-Lp6uM$1>?q0by%kle@l%)kMOotiNv}c}7zZ`oh=<>`xG7Mtx|3n%+x^>Cb zb(_i7ZCgxCjE(-T3ix08Ip6EfZPzNvA3M_p*8cB)yZ+B5DTahIomrbdck8a>YB;CM zaN_Roq{|iz4NF$!%U<8Vi{IBqzmv&vSMSEcu&`-@(+?X7iGSh$>)*bA;re~)Dt7Ps zKV68m{OFU|)u6XdT3c7u_r&t_CB~65yB^MO{~^!*uT+lBaZUx_{KLYoEuG7HPJ0V% zoqhZn*N#jZtLfk8&-%fC_}`MFJHclC)FXU8t zA#H_(R`aTbRVyTa$yssEZC~fmd?7Z2XI5KX`@Mr4K20k(2(4k2KFo82^IN0ygU|w| zJ#6P%xgW?DsNP|aZ?%5#`Ge^XGaD}Z=H~(p0)kSDx+Ii%j<9}oUo@ejrGJfk*95L5 zjG3;xCfYqwGwM2{kRK=^!s_ZSxhN-a-iiPb?yYQFFRV9|;Ne}|yYWy(l9Hk4jIA?-&e-`# zKa)ulFz%aqIBDajh}t!>*W^zh;o8u8L+ef8o5(i;WlX=>+>fk$aHinh4hHVt@ z$R3<~koTclA$Nu59<_UH@B7mq7k^m#!>z{rpH&^xeuoKa8NzQk6kAjdsX3`GoLVsP zL&Jwj9xAH@*LF6#=oKn&oK(?MG1J1W#(R?D%ZV`_7gZE9*yPQ)|7QAtxq^lzMf

    -- GitLab From 1004a7cb31ae31d2ca0b54b507b996c12403d54c Mon Sep 17 00:00:00 2001 From: Branden J Brown Date: Mon, 15 Feb 2021 23:12:15 -0500 Subject: [PATCH 1758/1792] runtime/metrics: update documentation to current interface The package documentation referenced sample metadata that was removed in CL 282632. Update this documentation to be less specific about what metadata is available. Additionally, the documentation on the Sample type referred to Descriptions instead of All as the source of metrics names. Fixes #44280. Change-Id: I24fc63a744bf498cb4cd5bda56c1599f6dd75929 Reviewed-on: https://go-review.googlesource.com/c/go/+/292309 Reviewed-by: Michael Knyszek Trust: Michael Knyszek Trust: Dmitri Shuralyov Run-TryBot: Michael Knyszek TryBot-Result: Go Bot --- src/runtime/metrics/doc.go | 4 +--- src/runtime/metrics/sample.go | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/runtime/metrics/doc.go b/src/runtime/metrics/doc.go index 5da050f973..7f790afc12 100644 --- a/src/runtime/metrics/doc.go +++ b/src/runtime/metrics/doc.go @@ -16,9 +16,7 @@ Interface Metrics are designated by a string key, rather than, for example, a field name in a struct. The full list of supported metrics is always available in the slice of Descriptions returned by All. Each Description also includes useful information -about the metric, such as how to display it (for example, gauge vs. counter) -and how difficult or disruptive it is to obtain it (for example, do you need to -stop the world?). +about the metric. Thus, users of this API are encouraged to sample supported metrics defined by the slice returned by All to remain compatible across Go versions. Of course, situations diff --git a/src/runtime/metrics/sample.go b/src/runtime/metrics/sample.go index b3933e266e..4cf8cdf799 100644 --- a/src/runtime/metrics/sample.go +++ b/src/runtime/metrics/sample.go @@ -14,7 +14,7 @@ type Sample struct { // Name is the name of the metric sampled. // // It must correspond to a name in one of the metric descriptions - // returned by Descriptions. + // returned by All. Name string // Value is the value of the metric sample. -- GitLab From f21be2fdc6f1becdbed1592ea0b245cdeedc5ac8 Mon Sep 17 00:00:00 2001 From: Alexander Rakoczy Date: Tue, 16 Feb 2021 12:33:50 -0500 Subject: [PATCH 1759/1792] [release-branch.go1.16] go1.16 Change-Id: I4c1350e0cb74ebfde5832973979e02997476d16c Reviewed-on: https://go-review.googlesource.com/c/go/+/292609 TryBot-Result: Go Bot Trust: Alexander Rakoczy Run-TryBot: Alexander Rakoczy Reviewed-by: Dmitri Shuralyov Reviewed-by: Carlos Amedee --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1903322150..166e7aec71 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -go1.16rc1 \ No newline at end of file +go1.16 \ No newline at end of file -- GitLab From 1a7e9af1536280fc90a9adea9c3ae5b4be968898 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 17 Feb 2021 12:03:13 -0800 Subject: [PATCH 1760/1792] [release-branch.go1.16] runtime/cgo: add cast in C code to avoid C compiler warning For #44340 Fixes #44346 Change-Id: Id80dd1f44a988b653933732afcc8e49a826affc4 Reviewed-on: https://go-review.googlesource.com/c/go/+/293209 Reviewed-by: Andrew G. Morgan Reviewed-by: Bryan C. Mills Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor (cherry picked from commit 07ef3135253321176704bce6e629a07ac02bf1c6) Reviewed-on: https://go-review.googlesource.com/c/go/+/293411 TryBot-Result: Go Bot --- src/runtime/cgo/linux_syscall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/cgo/linux_syscall.c b/src/runtime/cgo/linux_syscall.c index 56f3d67d8b..59761c8b40 100644 --- a/src/runtime/cgo/linux_syscall.c +++ b/src/runtime/cgo/linux_syscall.c @@ -32,7 +32,7 @@ typedef struct { #define SET_RETVAL(fn) \ uintptr_t ret = (uintptr_t) fn ; \ - if (ret == -1) { \ + if (ret == (uintptr_t) -1) { \ x->retval = (uintptr_t) errno; \ } else \ x->retval = ret -- GitLab From 0b8c416688d3742608bc4d486fc80c17e39f4d0c Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 16 Feb 2021 10:16:06 -0800 Subject: [PATCH 1761/1792] [release-branch.go1.16] README: pull gopher image from website Fixes breakage accidentally introduced by https://golang.org/cl/291711. Fixes #44402. Updates #44295. Change-Id: I76f3e5577d1d24027d4ed2a725b5b749ab2d059c Reviewed-on: https://go-review.googlesource.com/c/go/+/292629 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick (cherry picked from commit 6f3da9d2f6b4f7dbbe5d15260d87ed2a84488fde) Reviewed-on: https://go-review.googlesource.com/c/go/+/293843 TryBot-Result: Go Bot Reviewed-by: Ian Lance Taylor Trust: Dmitri Shuralyov Run-TryBot: Dmitri Shuralyov --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ca3956de8..837734b6e5 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Go is an open source programming language that makes it easy to build simple, reliable, and efficient software. -![Gopher image](doc/gopher/fiveyears.jpg) +![Gopher image](https://golang.org/doc/gopher/fiveyears.jpg) *Gopher image by [Renee French][rf], licensed under [Creative Commons 3.0 Attributions license][cc3-by].* Our canonical Git repository is located at https://go.googlesource.com/go. -- GitLab From b7e0eb49d8bb76ea0d98db53beef7209d9bd96d9 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 20 Feb 2021 11:25:15 -0800 Subject: [PATCH 1762/1792] [release-branch.go1.16] syscall: add explicit ios build tag This permits analysis of the syscall package by tools built with older versions of Go that do not recognize ios as a GOOS. For #44459 Fixes #44462 Change-Id: I79cec2ffe0dbcbc2dc45a385e556dc9e62033125 Reviewed-on: https://go-review.googlesource.com/c/go/+/294634 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick TryBot-Result: Go Bot (cherry picked from commit 03d36d8198428a6970ba01f5de41c264acbff8fc) Reviewed-on: https://go-review.googlesource.com/c/go/+/294635 Reviewed-by: Cherry Zhang --- src/syscall/ptrace_ios.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/syscall/ptrace_ios.go b/src/syscall/ptrace_ios.go index 2f61a88a08..5209d1e0dd 100644 --- a/src/syscall/ptrace_ios.go +++ b/src/syscall/ptrace_ios.go @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build ios +// +build ios + package syscall // Nosplit because it is called from forkAndExecInChild. -- GitLab From ddeae6b248e5130fe634047c3ca5964f5fa4e3dd Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 17 Feb 2021 17:49:40 -0800 Subject: [PATCH 1763/1792] [release-branch.go1.16] cmd/compile: declare inlined result params early for empty returns The code for delayed declaration of inlined result parameters only handles non-empty return statements. This is generally okay, because we already early declare if there are any (non-blank) named result parameters. But if a user writes a function with only blank result parameters and with exactly one return statement, which is empty, then they could end up hitting the dreaded "Value live at entry" ICE. This CL fixes the issue by ensuring we always early declare inlined result parameters if there are any empty return statements. Fixes #44358. Change-Id: I315f3853be436452883b1ce31da1bdffdf24d506 Reviewed-on: https://go-review.googlesource.com/c/go/+/293293 TryBot-Result: Go Bot Trust: Matthew Dempsky Run-TryBot: Matthew Dempsky Reviewed-by: Cuong Manh Le Reviewed-by: David Chase Reviewed-on: https://go-review.googlesource.com/c/go/+/296569 --- src/cmd/compile/internal/gc/inl.go | 18 +++++++++++++----- test/fixedbugs/issue44355.dir/a.go | 7 +++++++ test/fixedbugs/issue44355.dir/b.go | 9 +++++++++ test/fixedbugs/issue44355.go | 7 +++++++ 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 test/fixedbugs/issue44355.dir/a.go create mode 100644 test/fixedbugs/issue44355.dir/b.go create mode 100644 test/fixedbugs/issue44355.go diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index 600d12b59b..a8cc01082a 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -1053,18 +1053,26 @@ func mkinlcall(n, fn *Node, maxCost int32, inlMap map[*Node]bool) *Node { } } + // We can delay declaring+initializing result parameters if: + // (1) there's exactly one "return" statement in the inlined function; + // (2) it's not an empty return statement (#44355); and + // (3) the result parameters aren't named. + delayretvars := true + nreturns := 0 inspectList(asNodes(fn.Func.Inl.Body), func(n *Node) bool { if n != nil && n.Op == ORETURN { nreturns++ + if n.List.Len() == 0 { + delayretvars = false // empty return statement (case 2) + } } return true }) - // We can delay declaring+initializing result parameters if: - // (1) there's only one "return" statement in the inlined - // function, and (2) the result parameters aren't named. - delayretvars := nreturns == 1 + if nreturns != 1 { + delayretvars = false // not exactly one return statement (case 1) + } // temporaries for return values. var retvars []*Node @@ -1074,7 +1082,7 @@ func mkinlcall(n, fn *Node, maxCost int32, inlMap map[*Node]bool) *Node { m = inlvar(n) m = typecheck(m, ctxExpr) inlvars[n] = m - delayretvars = false // found a named result parameter + delayretvars = false // found a named result parameter (case 3) } else { // anonymous return values, synthesize names for use in assignment that replaces return m = retvar(t, i) diff --git a/test/fixedbugs/issue44355.dir/a.go b/test/fixedbugs/issue44355.dir/a.go new file mode 100644 index 0000000000..0f63c6fd98 --- /dev/null +++ b/test/fixedbugs/issue44355.dir/a.go @@ -0,0 +1,7 @@ +// 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 a + +func F() (_ *int) { return nil } diff --git a/test/fixedbugs/issue44355.dir/b.go b/test/fixedbugs/issue44355.dir/b.go new file mode 100644 index 0000000000..09d5bde887 --- /dev/null +++ b/test/fixedbugs/issue44355.dir/b.go @@ -0,0 +1,9 @@ +// 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 b + +import "./a" + +var _ = a.F() diff --git a/test/fixedbugs/issue44355.go b/test/fixedbugs/issue44355.go new file mode 100644 index 0000000000..d406838588 --- /dev/null +++ b/test/fixedbugs/issue44355.go @@ -0,0 +1,7 @@ +// compiledir + +// 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 ignored -- GitLab From 18e5d75ffb3c8d2be8c92f801aded70321e0b84b Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 19 Feb 2021 10:09:15 -0500 Subject: [PATCH 1764/1792] [release-branch.go1.16] cmd/compile: fix panic in DWARF-gen handling obfuscated code DWARF generation uses variable source positions (file/line/col) as a way to uniquely identify locals and parameters, as part of the process of matching up post-optimization variables with the corresponding pre-optimization versions (since the DWARF needs to be in terms of the original source constructs). This strategy can run into problems when compiling obfuscated or machine-generated code, where you can in some circumstances wind up with two local variables that appear to have the same name, file, line, and column. This patch changes DWARF generation to skip over such duplicates as opposed to issuing a fatal error (if an obfuscation tool is in use, it is unlikely that a human being will be able to make much sense of DWARF info in any case). Fixes #44433. Change-Id: I198022d184701aa9ec3dce42c005d29b72d2e321 Reviewed-on: https://go-review.googlesource.com/c/go/+/294289 TryBot-Result: Go Bot Reviewed-by: David Chase Reviewed-by: Jeremy Faller Reviewed-by: Cherry Zhang Trust: Than McIntosh Run-TryBot: Than McIntosh (cherry picked from commit e78e04ce39b9df316edda08f43f253f5e9ac509e) Reviewed-on: https://go-review.googlesource.com/c/go/+/294789 --- src/cmd/compile/internal/gc/dwinl.go | 3 ++- test/fixedbugs/issue44378.go | 40 ++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue44378.go diff --git a/src/cmd/compile/internal/gc/dwinl.go b/src/cmd/compile/internal/gc/dwinl.go index bb5ae61cbb..31d076814c 100644 --- a/src/cmd/compile/internal/gc/dwinl.go +++ b/src/cmd/compile/internal/gc/dwinl.go @@ -243,7 +243,8 @@ func makePreinlineDclMap(fnsym *obj.LSym) map[varPos]int { DeclCol: pos.Col(), } if _, found := m[vp]; found { - Fatalf("child dcl collision on symbol %s within %v\n", n.Sym.Name, fnsym.Name) + // We can see collisions (variables with the same name/file/line/col) in obfuscated or machine-generated code -- see issue 44378 for an example. Skip duplicates in such cases, since it is unlikely that a human will be debugging such code. + continue } m[vp] = i } diff --git a/test/fixedbugs/issue44378.go b/test/fixedbugs/issue44378.go new file mode 100644 index 0000000000..58c88d573f --- /dev/null +++ b/test/fixedbugs/issue44378.go @@ -0,0 +1,40 @@ +// compile + +// 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 test case caused a panic in the compiler's DWARF gen code. + +// Note to future maintainers of this code: +// +// ** Do NOT run gofmt when editing this file ** +// +// In order for the buggy behavior to be triggered in the compiler, +// we need to have a the function of interest all on one gigantic line. + +package a + +type O interface{} +type IO int +type OS int + +type A struct { + x int +} + +// original versions of the two function +func (p *A) UO(o O) { + p.r(o, o) +} +func (p *A) r(o1, o2 O) { + switch x := o1.(type) { + case *IO: + p.x = int(*x) + case *OS: + p.x = int(*x + 2) + } +} + +// see note above about the importance of all this code winding up on one line. +var myverylongname0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 int ; func (p *A) UO2(o O) { p.r2(o, o); }; func (p *A) r2(o1, o2 O) { switch x := o1.(type) { case *IO: p.x = int(*x); case *OS: p.x = int(*x + 2); } } -- GitLab From ca9cd629fb0609c9a2b6f6bf91ac6c6d33071be6 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Fri, 26 Feb 2021 10:17:09 +0700 Subject: [PATCH 1765/1792] [release-branch.go1.16] cmd/compile: fix mishandling of unsafe-uintptr arguments with call method in go/defer In CL 253457, we did the same fix for direct function calls. But for method calls, the receiver argument also need to be passed through the wrapper function, which we are not doing so the compiler crashes with the code in #44415. It will be nicer if we can rewrite OCALLMETHOD to normal OCALLFUNC, but that will be for future CL. The passing receiver argument to wrapper function is easier for backporting to go1.16 branch. Fixes #44464 Change-Id: I03607a64429042c6066ce673931db9769deb3124 Reviewed-on: https://go-review.googlesource.com/c/go/+/296490 Trust: Cuong Manh Le Run-TryBot: Cuong Manh Le Reviewed-by: Matthew Dempsky TryBot-Result: Go Bot Reviewed-on: https://go-review.googlesource.com/c/go/+/296769 Trust: Bryan C. Mills --- src/cmd/compile/internal/gc/walk.go | 21 +++++++++++++++---- test/fixedbugs/issue24491a.go | 31 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 98ebb23991..02a7269ff8 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -3927,15 +3927,22 @@ func wrapCall(n *Node, init *Nodes) *Node { } } + wrapArgs := n.List.Slice() + // If there's a receiver argument, it needs to be passed through the wrapper too. + if n.Op == OCALLMETH || n.Op == OCALLINTER { + recv := n.Left.Left + wrapArgs = append([]*Node{recv}, wrapArgs...) + } + // origArgs keeps track of what argument is uintptr-unsafe/unsafe-uintptr conversion. - origArgs := make([]*Node, n.List.Len()) + origArgs := make([]*Node, len(wrapArgs)) t := nod(OTFUNC, nil, nil) - for i, arg := range n.List.Slice() { + for i, arg := range wrapArgs { s := lookupN("a", i) if !isBuiltinCall && arg.Op == OCONVNOP && arg.Type.IsUintptr() && arg.Left.Type.IsUnsafePtr() { origArgs[i] = arg arg = arg.Left - n.List.SetIndex(i, arg) + wrapArgs[i] = arg } t.List.Append(symfield(s, arg.Type)) } @@ -3953,6 +3960,12 @@ func wrapCall(n *Node, init *Nodes) *Node { arg.Type = origArg.Type args[i] = arg } + if n.Op == OCALLMETH || n.Op == OCALLINTER { + // Move wrapped receiver argument back to its appropriate place. + recv := typecheck(args[0], ctxExpr) + n.Left.Left = recv + args = args[1:] + } call := nod(n.Op, nil, nil) if !isBuiltinCall { call.Op = OCALL @@ -3970,7 +3983,7 @@ func wrapCall(n *Node, init *Nodes) *Node { call = nod(OCALL, nil, nil) call.Left = fn.Func.Nname - call.List.Set(n.List.Slice()) + call.List.Set(wrapArgs) call = typecheck(call, ctxStmt) call = walkexpr(call, init) return call diff --git a/test/fixedbugs/issue24491a.go b/test/fixedbugs/issue24491a.go index 8accf8c0a3..d30b65b233 100644 --- a/test/fixedbugs/issue24491a.go +++ b/test/fixedbugs/issue24491a.go @@ -48,6 +48,14 @@ func f() int { return test("return", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup())) } +type S struct{} + +//go:noinline +//go:uintptrescapes +func (S) test(s string, p, q uintptr, rest ...uintptr) int { + return test(s, p, q, rest...) +} + func main() { test("normal", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup())) <-done @@ -60,6 +68,29 @@ func main() { }() <-done + func() { + for { + defer test("defer in for loop", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup())) + break + } + }() + + <-done + func() { + s := &S{} + defer s.test("method call", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup())) + }() + <-done + + func() { + s := &S{} + for { + defer s.test("defer method loop", uintptr(setup()), uintptr(setup()), uintptr(setup()), uintptr(setup())) + break + } + }() + <-done + f() <-done } -- GitLab From e0bd146a13f73038e0f7b5e85d49feec1d0d3f3c Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 22 Feb 2021 15:05:20 -0500 Subject: [PATCH 1766/1792] [release-branch.go1.16] cmd/go: fix version validation in 'go mod edit -exclude' The fix is to pull in CL 295931 from the x/mod repo. Updates #44497 Fixes #44498 Change-Id: I008b58d0f4bb48c09d4f1e6ed31d11a714f87dc0 Reviewed-on: https://go-review.googlesource.com/c/go/+/295150 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Jay Conrod Reviewed-by: Michael Matloob (cherry picked from commit 691ac806d20616fab66bb50752edfa9e4e9f8151) Reviewed-on: https://go-review.googlesource.com/c/go/+/295930 --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- src/cmd/go/testdata/script/mod_edit.txt | 16 ++++- .../vendor/golang.org/x/mod/modfile/rule.go | 65 +++++++++++++------ src/cmd/vendor/modules.txt | 2 +- 5 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 235e28f64f..0ec5e5c8ac 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -6,7 +6,7 @@ require ( github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2 golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 - golang.org/x/mod v0.4.1 + golang.org/x/mod v0.4.2-0.20210301183607-b038bf73c007 golang.org/x/sys v0.0.0-20201204225414-ed752295db88 // indirect golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 70aae0b4cc..90f81a0414 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -14,8 +14,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2-0.20210301183607-b038bf73c007 h1:tz4qROOcnBtykU8oV3AkBPsGL0fKxBIIduvIReyUYnA= +golang.org/x/mod v0.4.2-0.20210301183607-b038bf73c007/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= diff --git a/src/cmd/go/testdata/script/mod_edit.txt b/src/cmd/go/testdata/script/mod_edit.txt index d7e681e831..9da69306da 100644 --- a/src/cmd/go/testdata/script/mod_edit.txt +++ b/src/cmd/go/testdata/script/mod_edit.txt @@ -16,9 +16,9 @@ cmpenv go.mod $WORK/go.mod.init cmpenv go.mod $WORK/go.mod.init # go mod edits -go mod edit -droprequire=x.1 -require=x.1@v1.0.0 -require=x.2@v1.1.0 -droprequire=x.2 -exclude='x.1 @ v1.2.0' -exclude=x.1@v1.2.1 -replace=x.1@v1.3.0=y.1@v1.4.0 -replace='x.1@v1.4.0 = ../z' -retract=v1.6.0 -retract=[v1.1.0,v1.2.0] -retract=[v1.3.0,v1.4.0] -retract=v1.0.0 +go mod edit -droprequire=x.1 -require=x.1@v1.0.0 -require=x.2@v1.1.0 -droprequire=x.2 -exclude='x.1 @ v1.2.0' -exclude=x.1@v1.2.1 -exclude=x.1@v2.0.0+incompatible -replace=x.1@v1.3.0=y.1@v1.4.0 -replace='x.1@v1.4.0 = ../z' -retract=v1.6.0 -retract=[v1.1.0,v1.2.0] -retract=[v1.3.0,v1.4.0] -retract=v1.0.0 cmpenv go.mod $WORK/go.mod.edit1 -go mod edit -droprequire=x.1 -dropexclude=x.1@v1.2.1 -dropreplace=x.1@v1.3.0 -require=x.3@v1.99.0 -dropretract=v1.0.0 -dropretract=[v1.1.0,v1.2.0] +go mod edit -droprequire=x.1 -dropexclude=x.1@v1.2.1 -dropexclude=x.1@v2.0.0+incompatible -dropreplace=x.1@v1.3.0 -require=x.3@v1.99.0 -dropretract=v1.0.0 -dropretract=[v1.1.0,v1.2.0] cmpenv go.mod $WORK/go.mod.edit2 # -exclude and -retract reject invalid versions. @@ -27,6 +27,17 @@ stderr '^go mod: -exclude=example.com/m@bad: version "bad" invalid: must be of t ! go mod edit -retract=bad stderr '^go mod: -retract=bad: version "bad" invalid: must be of the form v1.2.3$' +! go mod edit -exclude=example.com/m@v2.0.0 +stderr '^go mod: -exclude=example.com/m@v2\.0\.0: version "v2\.0\.0" invalid: should be v2\.0\.0\+incompatible \(or module example\.com/m/v2\)$' + +! go mod edit -exclude=example.com/m/v2@v1.0.0 +stderr '^go mod: -exclude=example.com/m/v2@v1\.0\.0: version "v1\.0\.0" invalid: should be v2, not v1$' + +! go mod edit -exclude=gopkg.in/example.v1@v2.0.0 +stderr '^go mod: -exclude=gopkg\.in/example\.v1@v2\.0\.0: version "v2\.0\.0" invalid: should be v1, not v2$' + +cmpenv go.mod $WORK/go.mod.edit2 + # go mod edit -json go mod edit -json cmpenv stdout $WORK/go.mod.json @@ -88,6 +99,7 @@ require x.1 v1.0.0 exclude ( x.1 v1.2.0 x.1 v1.2.1 + x.1 v2.0.0+incompatible ) replace ( 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 c6a189dbe0..8fcf96b713 100644 --- a/src/cmd/vendor/golang.org/x/mod/modfile/rule.go +++ b/src/cmd/vendor/golang.org/x/mod/modfile/rule.go @@ -835,11 +835,8 @@ func (f *File) DropRequire(path string) error { // AddExclude adds a exclude statement to the mod file. Errors if the provided // version is not a canonical version string func (f *File) AddExclude(path, vers string) error { - if !isCanonicalVersion(vers) { - return &module.InvalidVersionError{ - Version: vers, - Err: errors.New("must be of the form v1.2.3"), - } + if err := checkCanonicalVersion(path, vers); err != nil { + return err } var hint *Line @@ -916,17 +913,15 @@ func (f *File) DropReplace(oldPath, oldVers string) error { // AddRetract adds a retract statement to the mod file. Errors if the provided // version interval does not consist of canonical version strings func (f *File) AddRetract(vi VersionInterval, rationale string) error { - if !isCanonicalVersion(vi.High) { - return &module.InvalidVersionError{ - Version: vi.High, - Err: errors.New("must be of the form v1.2.3"), - } + var path string + if f.Module != nil { + path = f.Module.Mod.Path } - if !isCanonicalVersion(vi.Low) { - return &module.InvalidVersionError{ - Version: vi.Low, - Err: errors.New("must be of the form v1.2.3"), - } + if err := checkCanonicalVersion(path, vi.High); err != nil { + return err + } + if err := checkCanonicalVersion(path, vi.Low); err != nil { + return err } r := &Retract{ @@ -1086,8 +1081,40 @@ func lineRetractLess(li, lj *Line) bool { return semver.Compare(vii.High, vij.High) > 0 } -// isCanonicalVersion tests if the provided version string represents a valid -// canonical version. -func isCanonicalVersion(vers string) bool { - return vers != "" && semver.Canonical(vers) == vers +// checkCanonicalVersion returns a non-nil error if vers is not a canonical +// version string or does not match the major version of path. +// +// If path is non-empty, the error text suggests a format with a major version +// corresponding to the path. +func checkCanonicalVersion(path, vers string) error { + _, pathMajor, pathMajorOk := module.SplitPathVersion(path) + + if vers == "" || vers != module.CanonicalVersion(vers) { + if pathMajor == "" { + return &module.InvalidVersionError{ + Version: vers, + Err: fmt.Errorf("must be of the form v1.2.3"), + } + } + return &module.InvalidVersionError{ + Version: vers, + Err: fmt.Errorf("must be of the form %s.2.3", module.PathMajorPrefix(pathMajor)), + } + } + + if pathMajorOk { + if err := module.CheckPathMajor(vers, pathMajor); err != nil { + if pathMajor == "" { + // In this context, the user probably wrote "v2.3.4" when they meant + // "v2.3.4+incompatible". Suggest that instead of "v0 or v1". + return &module.InvalidVersionError{ + Version: vers, + Err: fmt.Errorf("should be %s+incompatible (or module %s/%v)", vers, path, semver.Major(vers)), + } + } + return err + } + } + + return nil } diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index e033984956..d961695a2b 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -28,7 +28,7 @@ golang.org/x/arch/x86/x86asm golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ssh/terminal -# golang.org/x/mod v0.4.1 +# golang.org/x/mod v0.4.2-0.20210301183607-b038bf73c007 ## explicit golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile -- GitLab From 4fd2617cd86ffe21ddd0fda6d8ae30eec1178faa Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Tue, 23 Feb 2021 13:29:40 +0100 Subject: [PATCH 1767/1792] [release-branch.go1.16] syscall: do not overflow key memory in GetQueuedCompletionStatus The third argument to GetQueuedCompletionStatus is a pointer to a uintptr, not a uint32. Users of this functions have therefore been corrupting their memory every time they used it. Either that memory corruption was silent (dangerous), or their programs didn't work so they chose a different API to use. This fixes the problem by passing through an intermediate buffer. Updates #44538. Fixes #44593. Change-Id: Icacd71f705b36e41e52bd8c4d74898559a27522f Reviewed-on: https://go-review.googlesource.com/c/go/+/296150 Trust: Jason A. Donenfeld Run-TryBot: Jason A. Donenfeld TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills --- src/syscall/syscall_windows.go | 34 ++++++++++++++++++++++++++++++--- src/syscall/zsyscall_windows.go | 6 +++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go index ba69133d81..69cef52545 100644 --- a/src/syscall/syscall_windows.go +++ b/src/syscall/syscall_windows.go @@ -213,9 +213,9 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetEndOfFile(handle Handle) (err error) //sys GetSystemTimeAsFileTime(time *Filetime) //sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] -//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) -//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) -//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) +//sys createIoCompletionPort(filehandle Handle, cphandle Handle, key uintptr, threadcnt uint32) (handle Handle, err error) = CreateIoCompletionPort +//sys getQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uintptr, overlapped **Overlapped, timeout uint32) (err error) = GetQueuedCompletionStatus +//sys postQueuedCompletionStatus(cphandle Handle, qty uint32, key uintptr, overlapped *Overlapped) (err error) = PostQueuedCompletionStatus //sys CancelIo(s Handle) (err error) //sys CancelIoEx(s Handle, o *Overlapped) (err error) //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW @@ -1209,3 +1209,31 @@ func Readlink(path string, buf []byte) (n int, err error) { return n, nil } + +// Deprecated: CreateIoCompletionPort has the wrong function signature. Use x/sys/windows.CreateIoCompletionPort. +func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (Handle, error) { + return createIoCompletionPort(filehandle, cphandle, uintptr(key), threadcnt) +} + +// Deprecated: GetQueuedCompletionStatus has the wrong function signature. Use x/sys/windows.GetQueuedCompletionStatus. +func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) error { + var ukey uintptr + var pukey *uintptr + if key != nil { + ukey = uintptr(*key) + pukey = &ukey + } + err := getQueuedCompletionStatus(cphandle, qty, pukey, overlapped, timeout) + if key != nil { + *key = uint32(ukey) + if uintptr(*key) != ukey && err == nil { + err = errorspkg.New("GetQueuedCompletionStatus returned key overflow") + } + } + return err +} + +// Deprecated: PostQueuedCompletionStatus has the wrong function signature. Use x/sys/windows.PostQueuedCompletionStatus. +func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) error { + return postQueuedCompletionStatus(cphandle, qty, uintptr(key), overlapped) +} diff --git a/src/syscall/zsyscall_windows.go b/src/syscall/zsyscall_windows.go index 2166be595b..b1480ba7df 100644 --- a/src/syscall/zsyscall_windows.go +++ b/src/syscall/zsyscall_windows.go @@ -515,7 +515,7 @@ func CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr return } -func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) { +func createIoCompletionPort(filehandle Handle, cphandle Handle, key uintptr, threadcnt uint32) (handle Handle, err error) { r0, _, e1 := Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0) handle = Handle(r0) if handle == 0 { @@ -822,7 +822,7 @@ func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, return } -func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) { +func getQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uintptr, overlapped **Overlapped, timeout uint32) (err error) { r1, _, e1 := Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0) if r1 == 0 { err = errnoErr(e1) @@ -954,7 +954,7 @@ func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err return } -func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) { +func postQueuedCompletionStatus(cphandle Handle, qty uint32, key uintptr, overlapped *Overlapped) (err error) { r1, _, e1 := Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0) if r1 == 0 { err = errnoErr(e1) -- GitLab From 88f91b709e022900e481261a3c72604b4f01040e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 25 Feb 2021 10:01:56 -0800 Subject: [PATCH 1768/1792] [release-branch.go1.16] time: correct unusual extension string cases This fixes two uncommon cases. First, the tzdata code permits timezone offsets up to 24 * 7, although the POSIX TZ parsing does not. The tzdata code uses this to specify a day of week in some cases. Second, we incorrectly rejected a negative time offset for when a time zone change comes into effect. For #44385 Fixes #44618 Change-Id: I5f2efc1d385e9bfa974a0de3fa81e7a94b827602 Reviewed-on: https://go-review.googlesource.com/c/go/+/296392 Trust: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot Reviewed-by: Tobias Klauser (cherry picked from commit d9fd38e68ba00a51c2c7363150688d0e7687ef84) Reviewed-on: https://go-review.googlesource.com/c/go/+/297230 --- src/time/zoneinfo.go | 6 ++-- src/time/zoneinfo_test.go | 60 +++++++++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/time/zoneinfo.go b/src/time/zoneinfo.go index c3662297c7..6db9443474 100644 --- a/src/time/zoneinfo.go +++ b/src/time/zoneinfo.go @@ -377,8 +377,10 @@ func tzsetOffset(s string) (offset int, rest string, ok bool) { neg = true } + // The tzdata code permits values up to 24 * 7 here, + // although POSIX does not. var hours int - hours, s, ok = tzsetNum(s, 0, 24) + hours, s, ok = tzsetNum(s, 0, 24*7) if !ok { return 0, "", false } @@ -487,7 +489,7 @@ func tzsetRule(s string) (rule, string, bool) { } offset, s, ok := tzsetOffset(s[1:]) - if !ok || offset < 0 { + if !ok { return rule{}, "", false } r.time = offset diff --git a/src/time/zoneinfo_test.go b/src/time/zoneinfo_test.go index 277b68f798..d043e1e9f1 100644 --- a/src/time/zoneinfo_test.go +++ b/src/time/zoneinfo_test.go @@ -183,22 +183,50 @@ func TestMalformedTZData(t *testing.T) { } } -func TestLoadLocationFromTZDataSlim(t *testing.T) { - // A 2020b slim tzdata for Europe/Berlin - tzData := "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\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#3<-02>,M3.5.0/-2,M10.5.0/-1\n", + wantName: "-03", + wantOffset: -10800, + }, + { + // 2021a slim tzdata for Asia/Gaza. + zoneName: "Asia/Gaza", + tzData: "TZif3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\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\x00s\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\u007f\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@\u007f\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\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`\x02\x01\x02\x01\x02\x01\x02\x01\x02\x01\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\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-2EEST,M3.4.4/48,M10.4.4/49\n", + wantName: "EET", + wantOffset: 7200, + }, +} - reference, err := time.LoadLocationFromTZData("Europe/Berlin", []byte(tzData)) - if err != nil { - t.Fatal(err) - } +func TestLoadLocationFromTZDataSlim(t *testing.T) { + for _, test := range slimTests { + reference, err := time.LoadLocationFromTZData(test.zoneName, []byte(test.tzData)) + if err != nil { + t.Fatal(err) + } - d := time.Date(2020, time.October, 29, 15, 30, 0, 0, reference) - tzName, tzOffset := d.Zone() - if want := "CET"; tzName != want { - t.Errorf("Zone name == %s, want %s", tzName, want) - } - if want := 3600; tzOffset != want { - t.Errorf("Zone offset == %d, want %d", tzOffset, want) + d := time.Date(2020, time.October, 29, 15, 30, 0, 0, reference) + tzName, tzOffset := d.Zone() + if tzName != test.wantName { + t.Errorf("Zone name == %s, want %s", tzName, test.wantName) + } + if tzOffset != test.wantOffset { + t.Errorf("Zone offset == %d, want %d", tzOffset, test.wantOffset) + } } } @@ -263,7 +291,8 @@ func TestTzsetOffset(t *testing.T) { {"+08", 8 * 60 * 60, "", true}, {"-01:02:03", -1*60*60 - 2*60 - 3, "", true}, {"01", 1 * 60 * 60, "", true}, - {"100", 0, "", false}, + {"100", 100 * 60 * 60, "", true}, + {"1000", 0, "", false}, {"8PDT", 8 * 60 * 60, "PDT", true}, } { off, out, ok := time.TzsetOffset(test.in) @@ -288,6 +317,7 @@ func TestTzsetRule(t *testing.T) { {"30/03:00:00", time.Rule{Kind: time.RuleDOY, Day: 30, Time: 3 * 60 * 60}, "", true}, {"M4.5.6/03:00:00", time.Rule{Kind: time.RuleMonthWeekDay, Mon: 4, Week: 5, Day: 6, Time: 3 * 60 * 60}, "", true}, {"M4.5.7/03:00:00", time.Rule{}, "", false}, + {"M4.5.6/-04", time.Rule{Kind: time.RuleMonthWeekDay, Mon: 4, Week: 5, Day: 6, Time: -4 * 60 * 60}, "", true}, } { r, out, ok := time.TzsetRule(test.in) if r != test.r || out != test.out || ok != test.ok { -- GitLab From 292abd96ae8a9f857cc606a870c576a69b3e624e Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Sat, 27 Feb 2021 09:41:19 -0800 Subject: [PATCH 1769/1792] [release-branch.go1.16] cmd/compile: fix escape analysis of heap-allocated results One of escape analysis's responsibilities is to summarize whether/how each function parameter flows to the heap so we can correctly incorporate those flows into callers' escape analysis data flow graphs. As an optimization, we separately record when parameters flow to result parameters, so that we can more precisely analyze parameter flows based on how the results are used at the call site. However, if a named result parameter itself needs to be heap allocated, this optimization isn't safe and the parameter needs to be recorded as flowing to heap rather than flowing to result. Escape analysis used to get this correct because it conservatively rewalked the data-flow graph multiple times. So even though it would incorrectly record the result parameter flow, it would separately find a flow to the heap. However, CL 196811 (specifically, case 3) optimized the walking logic to reduce unnecessary rewalks causing us to stop finding the extra heap flow. This CL fixes the issue by correcting location.leakTo to be sensitive to sink.escapes and not record result-flows when the result parameter escapes to the heap. Fixes #44659. Change-Id: I48742ed35a6cab591094e2d23a439e205bd65c50 Reviewed-on: https://go-review.googlesource.com/c/go/+/297289 Trust: Matthew Dempsky Run-TryBot: Matthew Dempsky TryBot-Result: Go Bot Reviewed-by: Keith Randall Reviewed-on: https://go-review.googlesource.com/c/go/+/297290 --- src/cmd/compile/internal/gc/escape.go | 7 ++++--- test/escape5.go | 11 +++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/gc/escape.go b/src/cmd/compile/internal/gc/escape.go index 618bdf78e2..f719892d17 100644 --- a/src/cmd/compile/internal/gc/escape.go +++ b/src/cmd/compile/internal/gc/escape.go @@ -1376,9 +1376,10 @@ func containsClosure(f, c *Node) bool { // leak records that parameter l leaks to sink. func (l *EscLocation) leakTo(sink *EscLocation, derefs int) { - // If sink is a result parameter and we can fit return bits - // into the escape analysis tag, then record a return leak. - if sink.isName(PPARAMOUT) && sink.curfn == l.curfn { + // If sink is a result parameter that doesn't escape (#44614) + // and we can fit return bits into the escape analysis tag, + // then record as a result leak. + if !sink.escapes && sink.isName(PPARAMOUT) && sink.curfn == l.curfn { // TODO(mdempsky): Eliminate dependency on Vargen here. ri := int(sink.n.Name.Vargen) - 1 if ri < numEscResults { diff --git a/test/escape5.go b/test/escape5.go index 2ed2023cd2..82be2c38e7 100644 --- a/test/escape5.go +++ b/test/escape5.go @@ -269,3 +269,14 @@ func f28369(n int) int { return 1 + f28369(n-1) } + +// Issue 44614: parameters that flow to a heap-allocated result +// parameter must be recorded as a heap-flow rather than a +// result-flow. + +// N.B., must match "leaking param: p", +// but *not* "leaking param: p to result r level=0". +func f(p *int) (r *int) { // ERROR "leaking param: p$" "moved to heap: r" + sink4 = &r + return p +} -- GitLab From a9547ad8adc72d245dac4408eaaef33aa331478a Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 25 Feb 2021 20:01:53 -0500 Subject: [PATCH 1770/1792] [release-branch.go1.16] cmd/link: handle types as converted to interface when dynlink When using plugins, a type (whose value) may be pass to a plugin and get converted to interface there, or vice versa. We need to treat the type as potentially converted to interface, and retain its methods. Updates #44586. Fixes #44638. Change-Id: I80dd35e68baedaa852a317543ccd78d94628d13b Reviewed-on: https://go-review.googlesource.com/c/go/+/296709 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh (cherry picked from commit a655208c9ecd2fee4de6deff35a863b1c28a091c) Reviewed-on: https://go-review.googlesource.com/c/go/+/296910 --- misc/cgo/testplugin/plugin_test.go | 13 ++++---- misc/cgo/testplugin/testdata/method2/main.go | 32 +++++++++++++++++++ misc/cgo/testplugin/testdata/method2/p/p.go | 9 ++++++ .../cgo/testplugin/testdata/method2/plugin.go | 11 +++++++ src/cmd/link/internal/ld/deadcode.go | 7 ++++ 5 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 misc/cgo/testplugin/testdata/method2/main.go create mode 100644 misc/cgo/testplugin/testdata/method2/p/p.go create mode 100644 misc/cgo/testplugin/testdata/method2/plugin.go diff --git a/misc/cgo/testplugin/plugin_test.go b/misc/cgo/testplugin/plugin_test.go index 9055dbda04..2d991012c8 100644 --- a/misc/cgo/testplugin/plugin_test.go +++ b/misc/cgo/testplugin/plugin_test.go @@ -201,12 +201,11 @@ 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") +} - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - cmd := exec.CommandContext(ctx, "./method.exe") - out, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out) - } +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") } diff --git a/misc/cgo/testplugin/testdata/method2/main.go b/misc/cgo/testplugin/testdata/method2/main.go new file mode 100644 index 0000000000..6a87e7b6a0 --- /dev/null +++ b/misc/cgo/testplugin/testdata/method2/main.go @@ -0,0 +1,32 @@ +// 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. + +// A type can be passed to a plugin and converted to interface +// there. So its methods need to be live. + +package main + +import ( + "plugin" + + "testplugin/method2/p" +) + +var t p.T + +type I interface { M() } + +func main() { + pl, err := plugin.Open("method2.so") + if err != nil { + panic(err) + } + + f, err := pl.Lookup("F") + if err != nil { + panic(err) + } + + f.(func(p.T) interface{})(t).(I).M() +} diff --git a/misc/cgo/testplugin/testdata/method2/p/p.go b/misc/cgo/testplugin/testdata/method2/p/p.go new file mode 100644 index 0000000000..acb526acec --- /dev/null +++ b/misc/cgo/testplugin/testdata/method2/p/p.go @@ -0,0 +1,9 @@ +// 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 p + +type T int + +func (T) M() { println("M") } diff --git a/misc/cgo/testplugin/testdata/method2/plugin.go b/misc/cgo/testplugin/testdata/method2/plugin.go new file mode 100644 index 0000000000..6198e7648e --- /dev/null +++ b/misc/cgo/testplugin/testdata/method2/plugin.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. + +package main + +import "testplugin/method2/p" + +func main() {} + +func F(t p.T) interface{} { return t } diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 245076a83a..bfa8640ba9 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -24,6 +24,7 @@ type deadcodePass struct { ifaceMethod map[methodsig]bool // methods declared in reached interfaces markableMethods []methodref // methods of reached types reflectSeen bool // whether we have seen a reflect method call + dynlink bool methodsigstmp []methodsig // scratch buffer for decoding method signatures } @@ -34,6 +35,7 @@ func (d *deadcodePass) init() { if objabi.Fieldtrack_enabled != 0 { d.ldr.Reachparent = make([]loader.Sym, d.ldr.NSym()) } + d.dynlink = d.ctxt.DynlinkingGo() if d.ctxt.BuildMode == BuildModeShared { // Mark all symbols defined in this library as reachable when @@ -111,6 +113,11 @@ func (d *deadcodePass) flood() { var usedInIface bool if isgotype { + if d.dynlink { + // When dynaamic linking, a type may be passed across DSO + // boundary and get converted to interface at the other side. + d.ldr.SetAttrUsedInIface(symIdx, true) + } usedInIface = d.ldr.AttrUsedInIface(symIdx) } -- GitLab From 2b7243a62fb294362266c40022644eb36ed7b43f Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Sat, 27 Feb 2021 23:06:23 -0500 Subject: [PATCH 1771/1792] [release-branch.go1.16] cmd/go: add missing newline to retraction warning message Updates #44674 Fixes #44676 Change-Id: Icbdb79084bf7bd2f52cc0a53abcc1ec6f0c4a1bf Reviewed-on: https://go-review.googlesource.com/c/go/+/297350 Reviewed-by: Bryan C. Mills Reviewed-by: Jay Conrod Run-TryBot: Bryan C. Mills TryBot-Result: Go Bot Trust: Jay Conrod (cherry picked from commit 87beecd6dfd3b12ed30785ec502f7380dc79ec29) Reviewed-on: https://go-review.googlesource.com/c/go/+/297633 Trust: Bryan C. Mills --- src/cmd/go/internal/modget/get.go | 2 +- src/cmd/go/testdata/script/mod_get_retract.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index dccacd3d1e..5a98408a32 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -1514,7 +1514,7 @@ func (r *resolver) checkPackagesAndRetractions(ctx context.Context, pkgPatterns } } if retractPath != "" { - fmt.Fprintf(os.Stderr, "go: to switch to the latest unretracted version, run:\n\tgo get %s@latest", retractPath) + fmt.Fprintf(os.Stderr, "go: to switch to the latest unretracted version, run:\n\tgo get %s@latest\n", retractPath) } } diff --git a/src/cmd/go/testdata/script/mod_get_retract.txt b/src/cmd/go/testdata/script/mod_get_retract.txt index fe0ac88629..560fa7bfb2 100644 --- a/src/cmd/go/testdata/script/mod_get_retract.txt +++ b/src/cmd/go/testdata/script/mod_get_retract.txt @@ -11,7 +11,7 @@ cp go.mod.orig go.mod go mod edit -require example.com/retract/self/prev@v1.9.0 go get -d example.com/retract/self/prev stderr '^go: warning: example.com/retract/self/prev@v1.9.0: retracted by module author: self$' -stderr '^go: to switch to the latest unretracted version, run:\n\tgo get example.com/retract/self/prev@latest$' +stderr '^go: to switch to the latest unretracted version, run:\n\tgo get example.com/retract/self/prev@latest\n$' go list -m example.com/retract/self/prev stdout '^example.com/retract/self/prev v1.9.0$' -- GitLab From 047ca22916333a850bfdea1db4920120911e5cb0 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 24 Feb 2021 18:24:45 -0500 Subject: [PATCH 1772/1792] [release-branch.go1.16] cmd: upgrade golang.org/x/mod to fix go.mod parser modfile.Parse passed an empty string to the VersionFixer for the module path. This caused errors for v2+ versions. For #44496 Change-Id: I13b86b6ecf6815c4bc9a96ec0668284c9228c205 Reviewed-on: https://go-review.googlesource.com/c/go/+/296131 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills (cherry picked from commit bcac57f89c0ec609e6fbebcbcd42bb73fdaef2f0) Reviewed-on: https://go-review.googlesource.com/c/go/+/297990 Reviewed-by: Dmitri Shuralyov --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- .../script/mod_retract_fix_version.txt | 24 +++++ .../vendor/golang.org/x/mod/modfile/rule.go | 102 ++++++++++++++---- src/cmd/vendor/modules.txt | 2 +- 5 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_retract_fix_version.txt diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 0ec5e5c8ac..5b52a13a54 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -6,7 +6,7 @@ require ( github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2 golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 - golang.org/x/mod v0.4.2-0.20210301183607-b038bf73c007 + golang.org/x/mod v0.4.2-0.20210302225016-2823f815b3c9 golang.org/x/sys v0.0.0-20201204225414-ed752295db88 // indirect golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 90f81a0414..e0d6f84fec 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -14,8 +14,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2-0.20210301183607-b038bf73c007 h1:tz4qROOcnBtykU8oV3AkBPsGL0fKxBIIduvIReyUYnA= -golang.org/x/mod v0.4.2-0.20210301183607-b038bf73c007/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2-0.20210302225016-2823f815b3c9 h1:wqmbyuVn5unGTrBfqBTXWG8fCBY7eM1kldUTIrVRCiQ= +golang.org/x/mod v0.4.2-0.20210302225016-2823f815b3c9/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= diff --git a/src/cmd/go/testdata/script/mod_retract_fix_version.txt b/src/cmd/go/testdata/script/mod_retract_fix_version.txt new file mode 100644 index 0000000000..f8099ec93e --- /dev/null +++ b/src/cmd/go/testdata/script/mod_retract_fix_version.txt @@ -0,0 +1,24 @@ +# retract must not be used without a module directive. +! go list -m all +stderr 'go.mod:3: no module directive found, so retract cannot be used$' + +# Commands that update go.mod should fix non-canonical versions in +# retract directives. +# Verifies #44494. +go mod edit -module=rsc.io/quote/v2 +! go list -m all +stderr '^go: updates to go.mod needed; to update it:\n\tgo mod tidy$' +go mod tidy +go list -m all +cmp go.mod go.mod.want + +-- go.mod -- +go 1.16 + +retract latest +-- go.mod.want -- +go 1.16 + +retract v2.0.1 + +module rsc.io/quote/v2 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 8fcf96b713..f8c9384985 100644 --- a/src/cmd/vendor/golang.org/x/mod/modfile/rule.go +++ b/src/cmd/vendor/golang.org/x/mod/modfile/rule.go @@ -125,6 +125,12 @@ func (f *File) AddComment(text string) { type VersionFixer func(path, version string) (string, error) +// errDontFix is returned by a VersionFixer to indicate the version should be +// left alone, even if it's not canonical. +var dontFixRetract VersionFixer = func(_, vers string) (string, error) { + return vers, nil +} + // Parse parses the data, reported in errors as being from file, // into a File struct. It applies fix, if non-nil, to canonicalize all module versions found. func Parse(file string, data []byte, fix VersionFixer) (*File, error) { @@ -142,7 +148,7 @@ func ParseLax(file string, data []byte, fix VersionFixer) (*File, error) { return parseToFile(file, data, fix, false) } -func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File, error) { +func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (parsed *File, err error) { fs, err := parse(file, data) if err != nil { return nil, err @@ -150,8 +156,18 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File f := &File{ Syntax: fs, } - var errs ErrorList + + // fix versions in retract directives after the file is parsed. + // We need the module path to fix versions, and it might be at the end. + defer func() { + oldLen := len(errs) + f.fixRetract(fix, &errs) + if len(errs) > oldLen { + parsed, err = nil, errs + } + }() + for _, x := range fs.Stmt { switch x := x.(type) { case *Line: @@ -370,7 +386,7 @@ func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, a case "retract": rationale := parseRetractRationale(block, line) - vi, err := parseVersionInterval(verb, &args, fix) + vi, err := parseVersionInterval(verb, "", &args, dontFixRetract) if err != nil { if strict { wrapError(err) @@ -397,6 +413,47 @@ func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, a } } +// fixRetract applies fix to each retract directive in f, appending any errors +// to errs. +// +// Most versions are fixed as we parse the file, but for retract directives, +// the relevant module path is the one specified with the module directive, +// and that might appear at the end of the file (or not at all). +func (f *File) fixRetract(fix VersionFixer, errs *ErrorList) { + if fix == nil { + return + } + path := "" + if f.Module != nil { + path = f.Module.Mod.Path + } + var r *Retract + wrapError := func(err error) { + *errs = append(*errs, Error{ + Filename: f.Syntax.Name, + Pos: r.Syntax.Start, + Err: err, + }) + } + + for _, r = range f.Retract { + if path == "" { + wrapError(errors.New("no module directive found, so retract cannot be used")) + return // only print the first one of these + } + + args := r.Syntax.Token + if args[0] == "retract" { + args = args[1:] + } + vi, err := parseVersionInterval("retract", path, &args, fix) + if err != nil { + wrapError(err) + } + r.VersionInterval = vi + } +} + // isIndirect reports whether line has a "// indirect" comment, // meaning it is in go.mod only for its effect on indirect dependencies, // so that it can be dropped entirely once the effective version of the @@ -491,13 +548,13 @@ func AutoQuote(s string) string { return s } -func parseVersionInterval(verb string, args *[]string, fix VersionFixer) (VersionInterval, error) { +func parseVersionInterval(verb string, path string, args *[]string, fix VersionFixer) (VersionInterval, error) { toks := *args if len(toks) == 0 || toks[0] == "(" { return VersionInterval{}, fmt.Errorf("expected '[' or version") } if toks[0] != "[" { - v, err := parseVersion(verb, "", &toks[0], fix) + v, err := parseVersion(verb, path, &toks[0], fix) if err != nil { return VersionInterval{}, err } @@ -509,7 +566,7 @@ func parseVersionInterval(verb string, args *[]string, fix VersionFixer) (Versio if len(toks) == 0 { return VersionInterval{}, fmt.Errorf("expected version after '['") } - low, err := parseVersion(verb, "", &toks[0], fix) + low, err := parseVersion(verb, path, &toks[0], fix) if err != nil { return VersionInterval{}, err } @@ -523,7 +580,7 @@ func parseVersionInterval(verb string, args *[]string, fix VersionFixer) (Versio if len(toks) == 0 { return VersionInterval{}, fmt.Errorf("expected version after ','") } - high, err := parseVersion(verb, "", &toks[0], fix) + high, err := parseVersion(verb, path, &toks[0], fix) if err != nil { return VersionInterval{}, err } @@ -631,8 +688,7 @@ func parseVersion(verb string, path string, s *string, fix VersionFixer) (string } } if fix != nil { - var err error - t, err = fix(path, t) + fixed, err := fix(path, t) if err != nil { if err, ok := err.(*module.ModuleError); ok { return "", &Error{ @@ -643,19 +699,23 @@ func parseVersion(verb string, path string, s *string, fix VersionFixer) (string } return "", err } + t = fixed + } else { + cv := module.CanonicalVersion(t) + if cv == "" { + return "", &Error{ + Verb: verb, + ModPath: path, + Err: &module.InvalidVersionError{ + Version: t, + Err: errors.New("must be of the form v1.2.3"), + }, + } + } + t = cv } - if v := module.CanonicalVersion(t); v != "" { - *s = v - return *s, nil - } - return "", &Error{ - Verb: verb, - ModPath: path, - Err: &module.InvalidVersionError{ - Version: t, - Err: errors.New("must be of the form v1.2.3"), - }, - } + *s = t + return *s, nil } func modulePathMajor(path string) (string, error) { diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index d961695a2b..64caf62b8b 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -28,7 +28,7 @@ golang.org/x/arch/x86/x86asm golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ssh/terminal -# golang.org/x/mod v0.4.2-0.20210301183607-b038bf73c007 +# golang.org/x/mod v0.4.2-0.20210302225016-2823f815b3c9 ## explicit golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile -- GitLab From a9ba734e4df7d4006b18dfc6f8f4272da828c6ef Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 25 Feb 2021 18:38:43 -0500 Subject: [PATCH 1773/1792] [release-branch.go1.16] cmd/go/internal/modload: don't query when fixing canonical versions If a canonical version is passed to fixVersion when loading the main go.mod and that version don't match the module path's major version suffix, don't call Query. Query doesn't return a useful error in this case when the path is malformed, for example, when it doens't have a dot in the first path element. It's better to report the major version mismatch error. Fixes #44496 Change-Id: I97b1f64aee894fa0db6fb637aa03a51357ee782c Reviewed-on: https://go-review.googlesource.com/c/go/+/296590 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills (cherry picked from commit 5fafc0bbd4819578e58e5b9163981b0074ab0b01) Reviewed-on: https://go-review.googlesource.com/c/go/+/297989 Reviewed-by: Dmitri Shuralyov --- src/cmd/go/internal/modload/init.go | 5 ++-- .../script/mod_retract_fix_version.txt | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index bc8d17e0a5..4de5ac9303 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -539,9 +539,10 @@ func fixVersion(ctx context.Context, fixed *bool) modfile.VersionFixer { } } if vers != "" && module.CanonicalVersion(vers) == vers { - if err := module.CheckPathMajor(vers, pathMajor); err == nil { - return vers, nil + if err := module.CheckPathMajor(vers, pathMajor); err != nil { + return "", module.VersionError(module.Version{Path: path, Version: vers}, err) } + return vers, nil } info, err := Query(ctx, path, vers, "", nil) diff --git a/src/cmd/go/testdata/script/mod_retract_fix_version.txt b/src/cmd/go/testdata/script/mod_retract_fix_version.txt index f8099ec93e..e45758b627 100644 --- a/src/cmd/go/testdata/script/mod_retract_fix_version.txt +++ b/src/cmd/go/testdata/script/mod_retract_fix_version.txt @@ -12,6 +12,18 @@ go mod tidy go list -m all cmp go.mod go.mod.want +# If a retracted version doesn't match the module's major version suffx, +# an error should be reported. +! go mod edit -retract=v3.0.1 +stderr '^go mod: -retract=v3.0.1: version "v3.0.1" invalid: should be v2, not v3$' +cp go.mod.mismatch-v2 go.mod +! go list -m all +stderr 'go.mod:3: retract rsc.io/quote/v2: version "v3.0.1" invalid: should be v2, not v3$' + +cp go.mod.mismatch-v1 go.mod +! go list -m all +stderr 'go.mod:3: retract rsc.io/quote: version "v3.0.1" invalid: should be v0 or v1, not v3$' + -- go.mod -- go 1.16 @@ -22,3 +34,15 @@ go 1.16 retract v2.0.1 module rsc.io/quote/v2 +-- go.mod.mismatch-v2 -- +go 1.16 + +retract v3.0.1 + +module rsc.io/quote/v2 +-- go.mod.mismatch-v1 -- +go 1.16 + +retract v3.0.1 + +module rsc.io/quote -- GitLab From 3068d55c2f5437fc255f31332d34bb2409b82ae7 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 1 Mar 2021 10:00:09 -0500 Subject: [PATCH 1774/1792] [release-branch.go1.16] cmd: upgrade golang.org/x/mod to relax import path check This incorporates CL 298009, which allows leading dots in import path elements but not module path elements. Also added a test. Fixes #44647 Updates #34992 Change-Id: I2d5faabd8f7b23a7943d3f3ccb6707ab5dc2ce3c Reviewed-on: https://go-review.googlesource.com/c/go/+/297530 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills (cherry picked from commit 97bdac03aee805cfa54e7762037a568d85339970) Reviewed-on: https://go-review.googlesource.com/c/go/+/297912 Reviewed-by: Dmitri Shuralyov --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- src/cmd/go/internal/get/get.go | 30 +++++++++++++- .../go/testdata/script/mod_invalid_path.txt | 24 +++++++++++ .../vendor/golang.org/x/mod/module/module.go | 40 ++++++++++++------- src/cmd/vendor/modules.txt | 2 +- 6 files changed, 82 insertions(+), 20 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 5b52a13a54..35582f3975 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -6,7 +6,7 @@ require ( github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2 golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 - golang.org/x/mod v0.4.2-0.20210302225016-2823f815b3c9 + golang.org/x/mod v0.4.2-0.20210302225053-d515b24adc21 golang.org/x/sys v0.0.0-20201204225414-ed752295db88 // indirect golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index e0d6f84fec..10340d441f 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -14,8 +14,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2-0.20210302225016-2823f815b3c9 h1:wqmbyuVn5unGTrBfqBTXWG8fCBY7eM1kldUTIrVRCiQ= -golang.org/x/mod v0.4.2-0.20210302225016-2823f815b3c9/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2-0.20210302225053-d515b24adc21 h1:FnWKa8BJXkVQ+16E52jkfBOJPx2cG8y/6X376nOgSM4= +golang.org/x/mod v0.4.2-0.20210302225053-d515b24adc21/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index 38ff3823f2..329a2f5eda 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -431,7 +431,7 @@ func downloadPackage(p *load.Package) error { } importPrefix = importPrefix[:slash] } - if err := module.CheckImportPath(importPrefix); err != nil { + if err := checkImportPath(importPrefix); err != nil { return fmt.Errorf("%s: invalid import path: %v", p.ImportPath, err) } security := web.SecureOnly @@ -591,3 +591,31 @@ func selectTag(goVersion string, tags []string) (match string) { } return "" } + +// checkImportPath is like module.CheckImportPath, but it forbids leading dots +// in path elements. This can lead to 'go get' creating .git and other VCS +// directories in places we might run VCS tools later. +func checkImportPath(path string) error { + if err := module.CheckImportPath(path); err != nil { + return err + } + checkElem := func(elem string) error { + if elem[0] == '.' { + return fmt.Errorf("malformed import path %q: leading dot in path element", path) + } + return nil + } + elemStart := 0 + for i, r := range path { + if r == '/' { + if err := checkElem(path[elemStart:]); err != nil { + return err + } + elemStart = i + 1 + } + } + if err := checkElem(path[elemStart:]); err != nil { + return err + } + return nil +} diff --git a/src/cmd/go/testdata/script/mod_invalid_path.txt b/src/cmd/go/testdata/script/mod_invalid_path.txt index 667828839f..c8c075daae 100644 --- a/src/cmd/go/testdata/script/mod_invalid_path.txt +++ b/src/cmd/go/testdata/script/mod_invalid_path.txt @@ -23,6 +23,20 @@ cd $WORK/gopath/src/badname ! go list . stderr 'invalid module path' +# Test that an import path containing an element with a leading dot is valid, +# but such a module path is not. +# Verifies #43985. +cd $WORK/gopath/src/dotname +go list ./.dot +stdout '^example.com/dotname/.dot$' +go list ./use +stdout '^example.com/dotname/use$' +! go list -m example.com/dotname/.dot@latest +stderr '^go list -m: example.com/dotname/.dot@latest: malformed module path "example.com/dotname/.dot": leading dot in path element$' +go get -d example.com/dotname/.dot +go get -d example.com/dotname/use +go mod tidy + -- mod/go.mod -- -- mod/foo.go -- @@ -38,3 +52,13 @@ module .\. -- badname/foo.go -- package badname +-- dotname/go.mod -- +module example.com/dotname + +go 1.16 +-- dotname/.dot/dot.go -- +package dot +-- dotname/use/use.go -- +package use + +import _ "example.com/dotname/.dot" 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 c1c5263c42..272baeef17 100644 --- a/src/cmd/vendor/golang.org/x/mod/module/module.go +++ b/src/cmd/vendor/golang.org/x/mod/module/module.go @@ -270,7 +270,7 @@ func fileNameOK(r rune) bool { // CheckPath checks that a module path is valid. // A valid module path is a valid import path, as checked by CheckImportPath, -// with two additional constraints. +// 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, // ASCII digits, dots (U+002E), and dashes (U+002D); @@ -280,8 +280,9 @@ func fileNameOK(r rune) bool { // and must not contain any dots. For paths beginning with "gopkg.in/", // this second requirement is replaced by a requirement that the path // follow the gopkg.in server's conventions. +// Third, no path element may begin with a dot. func CheckPath(path string) error { - if err := checkPath(path, false); err != nil { + if err := checkPath(path, modulePath); err != nil { return fmt.Errorf("malformed module path %q: %v", path, err) } i := strings.Index(path, "/") @@ -315,7 +316,7 @@ func CheckPath(path string) error { // // A valid path element is a non-empty string made up of // ASCII letters, ASCII digits, and limited ASCII punctuation: - . _ and ~. -// It must not begin or end with a dot (U+002E), nor contain two dots in a row. +// It must not end with a dot (U+002E), nor contain two dots in a row. // // The element prefix up to the first dot must not be a reserved file name // on Windows, regardless of case (CON, com1, NuL, and so on). The element @@ -326,19 +327,29 @@ func CheckPath(path string) error { // top-level package documentation for additional information about // subtleties of Unicode. func CheckImportPath(path string) error { - if err := checkPath(path, false); err != nil { + if err := checkPath(path, importPath); err != nil { return fmt.Errorf("malformed import path %q: %v", path, err) } return nil } +// pathKind indicates what kind of path we're checking. Module paths, +// import paths, and file paths have different restrictions. +type pathKind int + +const ( + modulePath pathKind = iota + importPath + filePath +) + // checkPath checks that a general path is valid. // It returns an error describing why but not mentioning path. // Because these checks apply to both module paths and import paths, // the caller is expected to add the "malformed ___ path %q: " prefix. // fileName indicates whether the final element of the path is a file name // (as opposed to a directory name). -func checkPath(path string, fileName bool) error { +func checkPath(path string, kind pathKind) error { if !utf8.ValidString(path) { return fmt.Errorf("invalid UTF-8") } @@ -357,35 +368,34 @@ func checkPath(path string, fileName bool) error { elemStart := 0 for i, r := range path { if r == '/' { - if err := checkElem(path[elemStart:i], fileName); err != nil { + if err := checkElem(path[elemStart:i], kind); err != nil { return err } elemStart = i + 1 } } - if err := checkElem(path[elemStart:], fileName); err != nil { + if err := checkElem(path[elemStart:], kind); err != nil { return err } return nil } // checkElem checks whether an individual path element is valid. -// fileName indicates whether the element is a file name (not a directory name). -func checkElem(elem string, fileName bool) error { +func checkElem(elem string, kind pathKind) error { if elem == "" { return fmt.Errorf("empty path element") } if strings.Count(elem, ".") == len(elem) { return fmt.Errorf("invalid path element %q", elem) } - if elem[0] == '.' && !fileName { + if elem[0] == '.' && kind == modulePath { return fmt.Errorf("leading dot in path element") } if elem[len(elem)-1] == '.' { return fmt.Errorf("trailing dot in path element") } charOK := pathOK - if fileName { + if kind == filePath { charOK = fileNameOK } for _, r := range elem { @@ -406,7 +416,7 @@ func checkElem(elem string, fileName bool) error { } } - if fileName { + if kind == filePath { // don't check for Windows short-names in file names. They're // only an issue for import paths. return nil @@ -444,7 +454,7 @@ func checkElem(elem string, fileName bool) error { // top-level package documentation for additional information about // subtleties of Unicode. func CheckFilePath(path string) error { - if err := checkPath(path, true); err != nil { + if err := checkPath(path, filePath); err != nil { return fmt.Errorf("malformed file path %q: %v", path, err) } return nil @@ -647,7 +657,7 @@ func EscapePath(path string) (escaped string, err error) { // Versions are allowed to be in non-semver form but must be valid file names // and not contain exclamation marks. func EscapeVersion(v string) (escaped string, err error) { - if err := checkElem(v, true); err != nil || strings.Contains(v, "!") { + if err := checkElem(v, filePath); err != nil || strings.Contains(v, "!") { return "", &InvalidVersionError{ Version: v, Err: fmt.Errorf("disallowed version string"), @@ -706,7 +716,7 @@ func UnescapeVersion(escaped string) (v string, err error) { if !ok { return "", fmt.Errorf("invalid escaped version %q", escaped) } - if err := checkElem(v, true); err != nil { + if err := checkElem(v, filePath); err != nil { return "", fmt.Errorf("invalid escaped version %q: %v", v, err) } return v, nil diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 64caf62b8b..10842768a8 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -28,7 +28,7 @@ golang.org/x/arch/x86/x86asm golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ssh/terminal -# golang.org/x/mod v0.4.2-0.20210302225016-2823f815b3c9 +# golang.org/x/mod v0.4.2-0.20210302225053-d515b24adc21 ## explicit golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile -- GitLab From d86e53e896eca907ad67300c0bb495e3dd925358 Mon Sep 17 00:00:00 2001 From: Katie Hockman Date: Mon, 1 Mar 2021 09:54:00 -0500 Subject: [PATCH 1775/1792] [release-branch.go1.16-security] encoding/xml: prevent infinite loop while decoding This change properly handles a TokenReader which returns an EOF in the middle of an open XML element. Thanks to Sam Whited for reporting this. Fixes CVE-2021-27918 Change-Id: Id02a3f3def4a1b415fa2d9a8e3b373eb6cb0f433 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1004594 Reviewed-by: Russ Cox Reviewed-by: Roland Shoemaker Reviewed-by: Filippo Valsorda (cherry picked from commit e7ce1f6746223ec7b4caa3b1ece25d9be3864710) Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1014235 --- src/encoding/xml/xml.go | 19 ++++--- src/encoding/xml/xml_test.go | 104 +++++++++++++++++++++++++++-------- 2 files changed, 92 insertions(+), 31 deletions(-) diff --git a/src/encoding/xml/xml.go b/src/encoding/xml/xml.go index adaf4daf19..6f9594d7ba 100644 --- a/src/encoding/xml/xml.go +++ b/src/encoding/xml/xml.go @@ -271,7 +271,7 @@ func NewTokenDecoder(t TokenReader) *Decoder { // it will return an error. // // Token implements XML name spaces as described by -// https://www.w3.org/TR/REC-xml-names/. Each of the +// https://www.w3.org/TR/REC-xml-names/. Each of the // Name structures contained in the Token has the Space // set to the URL identifying its name space when known. // If Token encounters an unrecognized name space prefix, @@ -285,16 +285,17 @@ func (d *Decoder) Token() (Token, error) { if d.nextToken != nil { t = d.nextToken d.nextToken = nil - } else if t, err = d.rawToken(); err != nil { - switch { - case err == io.EOF && d.t != nil: - err = nil - case err == io.EOF && d.stk != nil && d.stk.kind != stkEOF: - err = d.syntaxError("unexpected EOF") + } else { + if t, err = d.rawToken(); t == nil && err != nil { + if err == io.EOF && d.stk != nil && d.stk.kind != stkEOF { + err = d.syntaxError("unexpected EOF") + } + return nil, err } - return t, err + // We still have a token to process, so clear any + // errors (e.g. EOF) and proceed. + err = nil } - if !d.Strict { if t1, ok := d.autoClose(t); ok { d.nextToken = t diff --git a/src/encoding/xml/xml_test.go b/src/encoding/xml/xml_test.go index efddca43e9..5672ebb375 100644 --- a/src/encoding/xml/xml_test.go +++ b/src/encoding/xml/xml_test.go @@ -33,30 +33,90 @@ func (t *toks) Token() (Token, error) { func TestDecodeEOF(t *testing.T) { start := StartElement{Name: Name{Local: "test"}} - t.Run("EarlyEOF", func(t *testing.T) { - d := NewTokenDecoder(&toks{earlyEOF: true, t: []Token{ - start, - start.End(), - }}) - err := d.Decode(&struct { - XMLName Name `xml:"test"` - }{}) - if err != nil { - t.Error(err) + tests := []struct { + name string + tokens []Token + ok bool + }{ + { + name: "OK", + tokens: []Token{ + start, + start.End(), + }, + ok: true, + }, + { + name: "Malformed", + tokens: []Token{ + start, + StartElement{Name: Name{Local: "bad"}}, + start.End(), + }, + ok: false, + }, + } + for _, tc := range tests { + for _, eof := range []bool{true, false} { + name := fmt.Sprintf("%s/earlyEOF=%v", tc.name, eof) + t.Run(name, func(t *testing.T) { + d := NewTokenDecoder(&toks{ + earlyEOF: eof, + t: tc.tokens, + }) + err := d.Decode(&struct { + XMLName Name `xml:"test"` + }{}) + if tc.ok && err != nil { + t.Fatalf("d.Decode: expected nil error, got %v", err) + } + if _, ok := err.(*SyntaxError); !tc.ok && !ok { + t.Errorf("d.Decode: expected syntax error, got %v", err) + } + }) } - }) - t.Run("LateEOF", func(t *testing.T) { - d := NewTokenDecoder(&toks{t: []Token{ - start, - start.End(), - }}) - err := d.Decode(&struct { - XMLName Name `xml:"test"` - }{}) - if err != nil { - t.Error(err) + } +} + +type toksNil struct { + returnEOF bool + t []Token +} + +func (t *toksNil) Token() (Token, error) { + if len(t.t) == 0 { + if !t.returnEOF { + // Return nil, nil before returning an EOF. It's legal, but + // discouraged. + t.returnEOF = true + return nil, nil } - }) + return nil, io.EOF + } + var tok Token + tok, t.t = t.t[0], t.t[1:] + return tok, nil +} + +func TestDecodeNilToken(t *testing.T) { + for _, strict := range []bool{true, false} { + name := fmt.Sprintf("Strict=%v", strict) + t.Run(name, func(t *testing.T) { + start := StartElement{Name: Name{Local: "test"}} + bad := StartElement{Name: Name{Local: "bad"}} + d := NewTokenDecoder(&toksNil{ + // Malformed + t: []Token{start, bad, start.End()}, + }) + d.Strict = strict + err := d.Decode(&struct { + XMLName Name `xml:"test"` + }{}) + if _, ok := err.(*SyntaxError); !ok { + t.Errorf("d.Decode: expected syntax error, got %v", err) + } + }) + } } const testInput = ` -- GitLab From 634d28d78ccbeb6e86f8bfeba030ea8be518f8fa Mon Sep 17 00:00:00 2001 From: Roland Shoemaker Date: Tue, 2 Mar 2021 10:00:53 -0800 Subject: [PATCH 1776/1792] [release-branch.go1.16-security] archive/zip: fix panic in Reader.Open When operating on a Zip file that contains a file prefixed with "../", Open(...) would cause a panic in toValidName when attempting to strip the prefixed path components. Fixes CVE-2021-27919 Change-Id: Ic755d8126cb0897e2cbbdacf572439c38dde7b35 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1004761 Reviewed-by: Filippo Valsorda Reviewed-by: Russ Cox Reviewed-by: Katie Hockman (cherry picked from commit ce22003b26eaf8e4a690757f699aae7062d41472) Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1013753 Reviewed-by: Roland Shoemaker --- src/archive/zip/reader.go | 2 +- src/archive/zip/reader_test.go | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go index 8b4e77875f..c288ad965b 100644 --- a/src/archive/zip/reader.go +++ b/src/archive/zip/reader.go @@ -664,7 +664,7 @@ func toValidName(name string) string { if strings.HasPrefix(p, "/") { p = p[len("/"):] } - for strings.HasPrefix(name, "../") { + for strings.HasPrefix(p, "../") { p = p[len("../"):] } return p diff --git a/src/archive/zip/reader_test.go b/src/archive/zip/reader_test.go index 34e96f7da4..5faf1f49b5 100644 --- a/src/archive/zip/reader_test.go +++ b/src/archive/zip/reader_test.go @@ -1081,3 +1081,38 @@ func TestFS(t *testing.T) { t.Fatal(err) } } + +func TestCVE202127919(t *testing.T) { + // 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, + } + r, err := NewReader(bytes.NewReader([]byte(data)), int64(len(data))) + if err != nil { + t.Fatalf("Error reading the archive: %v", err) + } + _, err = r.Open("test.txt") + if err != nil { + t.Errorf("Error reading file: %v", err) + } +} -- GitLab From e9e0473681e581040b4adcd64b53967e1572fe8d Mon Sep 17 00:00:00 2001 From: Alexander Rakoczy Date: Tue, 9 Mar 2021 16:22:44 -0500 Subject: [PATCH 1777/1792] [release-branch.go1.16-security] go1.16.1 Change-Id: I4999d72caf9462554a2a6f1d761244cafec34718 Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/1014541 Reviewed-by: Katie Hockman --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 166e7aec71..81026a006a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -go1.16 \ No newline at end of file +go1.16.1 \ No newline at end of file -- GitLab From 6e041884406421d329b9c6064f3c13104628c876 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 4 Mar 2021 11:50:31 -0500 Subject: [PATCH 1778/1792] [release-branch.go1.16] cmd/go: don't report missing std import errors for tidy and vendor 'go mod tidy' and 'go mod vendor' normally report errors when a package can't be imported, even if the import appears in a file that wouldn't be compiled by the current version of Go. These errors are common for packages introduced in higher versions of Go, like "embed" in 1.16. This change causes 'go mod tidy' and 'go mod vendor' to ignore missing package errors if the import path appears to come from the standard library because it lacks a dot in the first path element. Fixes #44793 Updates #27063 Change-Id: I61d6443e77ab95fd8c0d1514f57ef4c8885a77cc Reviewed-on: https://go-review.googlesource.com/c/go/+/298749 Trust: Jay Conrod Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills TryBot-Result: Go Bot (cherry picked from commit 56d52e661114be60fb1893b034ac0c5976b622af) Reviewed-on: https://go-review.googlesource.com/c/go/+/298949 --- src/cmd/go/internal/modcmd/tidy.go | 9 +++++---- src/cmd/go/internal/modcmd/vendor.go | 9 +++++---- src/cmd/go/internal/modload/load.go | 13 ++++++++++++- src/cmd/go/testdata/script/mod_tidy_error.txt | 4 ++-- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index 3b83d87a8e..8bc9ed50be 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -62,10 +62,11 @@ func runTidy(ctx context.Context, cmd *base.Command, args []string) { modload.RootMode = modload.NeedRoot modload.LoadPackages(ctx, modload.PackageOpts{ - Tags: imports.AnyTags(), - ResolveMissingImports: true, - LoadTests: true, - AllowErrors: tidyE, + Tags: imports.AnyTags(), + ResolveMissingImports: true, + LoadTests: true, + AllowErrors: tidyE, + SilenceMissingStdImports: true, }, "all") modload.TidyBuildList() diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index d3ed9e00e2..ac1fb7720a 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -64,10 +64,11 @@ func runVendor(ctx context.Context, cmd *base.Command, args []string) { modload.RootMode = modload.NeedRoot loadOpts := modload.PackageOpts{ - Tags: imports.AnyTags(), - ResolveMissingImports: true, - UseVendorAll: true, - AllowErrors: vendorE, + Tags: imports.AnyTags(), + ResolveMissingImports: true, + UseVendorAll: true, + AllowErrors: vendorE, + SilenceMissingStdImports: true, } _, pkgs := modload.LoadPackages(ctx, loadOpts, "all") diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 6d87acc6d3..154fc3c6f0 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -170,6 +170,12 @@ type PackageOpts struct { // that occur while loading packages. SilenceErrors implies AllowErrors. SilenceErrors bool + // SilenceMissingStdImports indicates that LoadPackages should not print + // errors or terminate the process if an imported package is missing, and the + // import path looks like it might be in the standard library (perhaps in a + // future version). + SilenceMissingStdImports bool + // SilenceUnmatchedWarnings suppresses the warnings normally emitted for // patterns that did not match any packages. SilenceUnmatchedWarnings bool @@ -287,8 +293,13 @@ func LoadPackages(ctx context.Context, opts PackageOpts, patterns ...string) (ma sumErr.importerIsTest = importer.testOf != nil } } + silence := opts.SilenceErrors + if stdErr := (*ImportMissingError)(nil); errors.As(pkg.err, &stdErr) && + stdErr.isStd && opts.SilenceMissingStdImports { + silence = true + } - if !opts.SilenceErrors { + if !silence { if opts.AllowErrors { fmt.Fprintf(os.Stderr, "%s: %v\n", pkg.stackText(), pkg.err) } else { diff --git a/src/cmd/go/testdata/script/mod_tidy_error.txt b/src/cmd/go/testdata/script/mod_tidy_error.txt index b6c24ceaf7..395537b1a7 100644 --- a/src/cmd/go/testdata/script/mod_tidy_error.txt +++ b/src/cmd/go/testdata/script/mod_tidy_error.txt @@ -4,12 +4,12 @@ env GO111MODULE=on # 'go mod tidy' and 'go mod vendor' should not hide loading errors. ! go mod tidy -stderr '^issue27063 imports\n\tnonexist: package nonexist is not in GOROOT \(.*\)' +! 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' ! go mod vendor -stderr '^issue27063 imports\n\tnonexist: package nonexist is not in GOROOT \(.*\)' +! 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' -- GitLab From 5993fbbd4853f4c6062980908c274bacb6f927dc Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 4 Mar 2021 10:35:17 -0500 Subject: [PATCH 1779/1792] [release-branch.go1.16] cmd/go: clarify errors for commands run outside a module The new error message tells the user what was wrong (no go.mod found) and directs them to 'go help modules', which links to tutorials. Includes test fix from CL 298794 Fixes #44746 Change-Id: I98f31fec4a8757eb1792b45491519da4c552cb0f Reviewed-on: https://go-review.googlesource.com/c/go/+/298650 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills (cherry picked from commit b87e9b9f68f1eb0d685fd250b3b47495710e0059) Reviewed-on: https://go-review.googlesource.com/c/go/+/298929 --- src/cmd/go/internal/modget/query.go | 2 +- src/cmd/go/internal/modload/import.go | 18 ++++--- src/cmd/go/internal/modload/init.go | 6 ++- src/cmd/go/internal/modload/list.go | 2 +- src/cmd/go/internal/run/run.go | 20 +------ .../go/testdata/script/mod_convert_dep.txt | 2 +- src/cmd/go/testdata/script/mod_find.txt | 2 +- .../script/mod_install_pkg_version.txt | 4 +- src/cmd/go/testdata/script/mod_outside.txt | 52 +++++++++---------- src/go/build/build_test.go | 2 +- 10 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/cmd/go/internal/modget/query.go b/src/cmd/go/internal/modget/query.go index d8364c8c0d..1a5a60f7eb 100644 --- a/src/cmd/go/internal/modget/query.go +++ b/src/cmd/go/internal/modget/query.go @@ -186,7 +186,7 @@ func (q *query) validate() error { if q.pattern == "all" { // If there is no main module, "all" is not meaningful. if !modload.HasModRoot() { - return fmt.Errorf(`cannot match "all": working directory is not part of a module`) + return fmt.Errorf(`cannot match "all": %v`, modload.ErrNoModRoot) } if !versionOkForMainModule(q.version) { // TODO(bcmills): "all@none" seems like a totally reasonable way to diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 182429aee4..995641c9f1 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -51,7 +51,7 @@ func (e *ImportMissingError) Error() string { if e.isStd { return fmt.Sprintf("package %s is not in GOROOT (%s)", e.Path, filepath.Join(cfg.GOROOT, "src", e.Path)) } - if e.QueryErr != nil { + if e.QueryErr != nil && e.QueryErr != ErrNoModRoot { return fmt.Sprintf("cannot find module providing package %s: %v", e.Path, e.QueryErr) } if cfg.BuildMod == "mod" || (cfg.BuildMod == "readonly" && allowMissingModuleImports) { @@ -66,13 +66,11 @@ func (e *ImportMissingError) Error() string { return fmt.Sprintf("module %s provides package %s and is replaced but not required; to add it:\n\tgo get %s", e.replaced.Path, e.Path, suggestArg) } - suggestion := "" - if !HasModRoot() { - suggestion = ": working directory is not part of a module" - } else { - suggestion = fmt.Sprintf("; to add it:\n\tgo get %s", e.Path) + message := fmt.Sprintf("no required module provides package %s", e.Path) + if e.QueryErr != nil { + return fmt.Sprintf("%s: %v", message, e.QueryErr) } - return fmt.Sprintf("no required module provides package %s%s", e.Path, suggestion) + return fmt.Sprintf("%s; to add it:\n\tgo get %s", message, e.Path) } if e.newMissingVersion != "" { @@ -318,7 +316,11 @@ func importFromBuildList(ctx context.Context, path string, buildList []module.Ve return mods[0], dirs[0], nil } - return module.Version{}, "", &ImportMissingError{Path: path, isStd: pathIsStd} + var queryErr error + if !HasModRoot() { + queryErr = ErrNoModRoot + } + return module.Version{}, "", &ImportMissingError{Path: path, QueryErr: queryErr, isStd: pathIsStd} } // queryImport attempts to locate a module that can be added to the current diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 4de5ac9303..8ec1c8681a 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -177,7 +177,7 @@ func Init() { 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: cannot find main module; see 'go help modules'") + base.Fatalf("go: %v", ErrNoModRoot) } if !mustUseModules { // GO111MODULE is 'auto', and we can't find a module root. @@ -338,9 +338,11 @@ func die() { } 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: cannot find main module; see 'go help modules'") + base.Fatalf("go: %v", ErrNoModRoot) } +var ErrNoModRoot = errors.New("go.mod file not found in current directory or any parent directory; see 'go help modules'") + // LoadModFile sets Target and, if there is a main module, parses the initial // build list from its go.mod file. // diff --git a/src/cmd/go/internal/modload/list.go b/src/cmd/go/internal/modload/list.go index 3491f941cd..7b1aa7fd41 100644 --- a/src/cmd/go/internal/modload/list.go +++ b/src/cmd/go/internal/modload/list.go @@ -73,7 +73,7 @@ func listModules(ctx context.Context, args []string, listVersions, listRetracted base.Fatalf("go: cannot use relative path %s to specify module", arg) } if !HasModRoot() && (arg == "all" || strings.Contains(arg, "...")) { - base.Fatalf("go: cannot match %q: working directory is not part of a module", arg) + base.Fatalf("go: cannot match %q: %v", arg, ErrNoModRoot) } if i := strings.Index(arg, "@"); i >= 0 { path := arg[:i] diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index 99578b244c..666b1a0e56 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -96,28 +96,12 @@ func runRun(ctx context.Context, cmd *base.Command, args []string) { base.Fatalf("go run: no go files listed") } cmdArgs := args[i:] - if p.Error != nil { - base.Fatalf("%s", p.Error) - } + load.CheckPackageErrors([]*load.Package{p}) - p.Internal.OmitDebug = true - if len(p.DepsErrors) > 0 { - // 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. - printed := map[*load.PackageError]bool{} - for _, err := range p.DepsErrors { - if !printed[err] { - printed[err] = true - base.Errorf("%s", err) - } - } - } - base.ExitIfErrors() if p.Name != "main" { base.Fatalf("go run: cannot run non-main package") } + p.Internal.OmitDebug = true p.Target = "" // must build - not up to date if p.Internal.CmdlineFiles { //set executable name if go file is given as cmd-argument diff --git a/src/cmd/go/testdata/script/mod_convert_dep.txt b/src/cmd/go/testdata/script/mod_convert_dep.txt index ad22aca5be..875a836fd2 100644 --- a/src/cmd/go/testdata/script/mod_convert_dep.txt +++ b/src/cmd/go/testdata/script/mod_convert_dep.txt @@ -18,7 +18,7 @@ stdout '^m$' # Test that we ignore directories when trying to find alternate config files. cd $WORK/gopkgdir/x ! go list . -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' ! stderr 'Gopkg.lock' -- $WORK/test/Gopkg.lock -- diff --git a/src/cmd/go/testdata/script/mod_find.txt b/src/cmd/go/testdata/script/mod_find.txt index 9468acfd33..1e01973ff4 100644 --- a/src/cmd/go/testdata/script/mod_find.txt +++ b/src/cmd/go/testdata/script/mod_find.txt @@ -49,7 +49,7 @@ rm go.mod # Test that we ignore directories when trying to find go.mod. cd $WORK/gomoddir ! go list . -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' [!symlink] stop 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 e27ebc5cc5..6ed600ff71 100644 --- a/src/cmd/go/testdata/script/mod_install_pkg_version.txt +++ b/src/cmd/go/testdata/script/mod_install_pkg_version.txt @@ -59,9 +59,9 @@ rm $GOPATH/bin env GO111MODULE=on go mod download rsc.io/fortune@v1.0.0 ! go install $GOPATH/pkg/mod/rsc.io/fortune@v1.0.0 -stderr '^go: cannot find main module; see ''go help modules''$' +stderr '^go: go\.mod file not found in current directory or any parent directory; see ''go help modules''$' ! go install ../pkg/mod/rsc.io/fortune@v1.0.0 -stderr '^go: cannot find main module; see ''go help modules''$' +stderr '^go: go\.mod file not found in current directory or any parent directory; see ''go help modules''$' mkdir tmp cd tmp go mod init tmp diff --git a/src/cmd/go/testdata/script/mod_outside.txt b/src/cmd/go/testdata/script/mod_outside.txt index 8f01b5d242..565589268e 100644 --- a/src/cmd/go/testdata/script/mod_outside.txt +++ b/src/cmd/go/testdata/script/mod_outside.txt @@ -12,13 +12,13 @@ stdout 'NUL|/dev/null' # 'go list' without arguments implicitly operates on the current directory, # which is not in a module. ! go list -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' go list -m stdout '^command-line-arguments$' # 'go list' in the working directory should fail even if there is a a 'package # main' present: without a main module, we do not know its package path. ! go list ./needmod -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go list all' lists the transitive import graph of the main module, # which is empty if there is no main module. @@ -41,7 +41,7 @@ stdout 'command-line-arguments' # 'go list' on a package from a module should fail. ! go list example.com/printversion -stderr '^no required module provides package example.com/printversion: working directory is not part of a module$' +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''$' # 'go list -m' with an explicit version should resolve that version. @@ -54,19 +54,19 @@ stdout 'v1.0.0\s+v1.0.1\s+v1.1.0' # 'go list -m all' should fail. "all" is not meaningful outside of a module. ! go list -m all -stderr 'go: cannot match "all": working directory is not part of a module' +stderr 'go: cannot match "all": go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go list -m all' should also fail. ! go list -m example.com/printversion@v1.0.0 all -stderr 'go: cannot match "all": working directory is not part of a module' +stderr 'go: cannot match "all": go.mod file not found in current directory or any parent directory; see ''go help modules''$' ! stdout 'example.com/version' # 'go list -m' with wildcards should fail. Wildcards match modules in the # build list, so they aren't meaningful outside a module. ! go list -m ... -stderr 'go: cannot match "...": working directory is not part of a module' +stderr 'go: cannot match "...": go.mod file not found in current directory or any parent directory; see ''go help modules''$' ! go list -m rsc.io/quote/... -stderr 'go: cannot match "rsc.io/quote/...": working directory is not part of a module' +stderr 'go: cannot match "rsc.io/quote/...": go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go clean' should skip the current directory if it isn't in a module. @@ -76,20 +76,20 @@ go clean -n # 'go mod graph' should fail, since there's no module graph. ! go mod graph -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go mod why' should fail, since there is no main module to depend on anything. ! go mod why -m example.com/version -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go mod edit', 'go mod tidy', and 'go mod fmt' should fail: # there is no go.mod file to edit. ! go mod tidy -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' ! go mod edit -fmt -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' ! go mod edit -require example.com/version@v1.0.0 -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go mod download' without arguments should report an error. @@ -104,33 +104,33 @@ exists $GOPATH/pkg/mod/cache/download/example.com/printversion/@v/v1.0.0.zip # 'go mod download all' should fail. "all" is not meaningful outside of a module. ! go mod download all -stderr 'go: cannot match "all": working directory is not part of a module' +stderr 'go: cannot match "all": go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go mod vendor' should fail: it starts by clearing the existing vendor # directory, and we don't know where that is. ! go mod vendor -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go mod verify' should fail: we have no modules to verify. ! go mod verify -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go get' without arguments implicitly operates on the main module, and thus # should fail. ! go get -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' ! go get -u -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' ! go get -u ./needmod -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go get -u all' upgrades the transitive import graph of the main module, # which is empty. ! go get -u all -stderr 'go get: cannot match "all": working directory is not part of a module' +stderr '^go get: cannot match "all": go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go get' should check the proposed module graph for consistency, # even though we won't write it anywhere. @@ -147,16 +147,16 @@ exists $GOPATH/pkg/mod/example.com/version@v1.0.0 # 'go build' without arguments implicitly operates on the current directory, and should fail. cd needmod ! go build -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' cd .. # 'go build' of a non-module directory should fail too. ! go build ./needmod -stderr 'cannot find main module' +stderr '^go: go.mod file not found in current directory or any parent directory; see ''go help modules''$' # 'go build' of source files should fail if they import anything outside std. ! go build -n ./needmod/needmod.go -stderr '^needmod[/\\]needmod.go:10:2: no required module provides package example.com/version: working directory is not part of a module$' +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 build' of source files should succeed if they do not import anything outside std. go build -n -o ignore ./stdonly/stdonly.go @@ -179,7 +179,7 @@ go doc fmt # 'go doc' should fail for a package path outside a module. ! go doc example.com/version -stderr 'doc: no required module provides package example.com/version: working directory is not part of a module' +stderr 'doc: 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' with a version should succeed if all constraints are met. # See mod_install_pkg_version. @@ -194,7 +194,7 @@ stderr '^go install: version is required when current directory is not in a modu # 'go install' should fail if a source file imports a package that must be # resolved to a module. ! go install ./needmod/needmod.go -stderr 'needmod[/\\]needmod.go:10:2: no required module provides package example.com/version: working directory is not part of a module' +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' should succeed with a package in GOROOT. go install cmd/addr2line @@ -206,12 +206,12 @@ stderr 'can only use path@version syntax with' # '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: working directory is not part of a module$' +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''$' # 'go run' should fail if a source file imports a package that must be # resolved to a module. ! go run ./needmod/needmod.go -stderr '^needmod[/\\]needmod.go:10:2: no required module provides package example.com/version: working directory is not part of a module$' +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 fmt' should be able to format files outside of a module. diff --git a/src/go/build/build_test.go b/src/go/build/build_test.go index d8f264cac7..d13ea810a7 100644 --- a/src/go/build/build_test.go +++ b/src/go/build/build_test.go @@ -612,7 +612,7 @@ func TestImportPackageOutsideModule(t *testing.T) { ctxt.GOPATH = gopath ctxt.Dir = filepath.Join(gopath, "src/example.com/p") - want := "working directory is not part of a module" + want := "go.mod file not found in current directory or any parent directory" if _, err := ctxt.Import("example.com/p", gopath, FindOnly); err == nil { t.Fatal("importing package when no go.mod is present succeeded unexpectedly") } else if errStr := err.Error(); !strings.Contains(errStr, want) { -- GitLab From 3979fb9af9ccfc0b7ccb613dcf256b18c2c295f0 Mon Sep 17 00:00:00 2001 From: Carlos Amedee Date: Thu, 11 Mar 2021 11:19:33 -0500 Subject: [PATCH 1780/1792] [release-branch.go1.16] go1.16.2 Change-Id: I0513a9731e0e0d57bfeda0ffab1c5787edc916f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/300969 Run-TryBot: Carlos Amedee TryBot-Result: Go Bot Reviewed-by: Dmitri Shuralyov Trust: Carlos Amedee --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 81026a006a..d47e8e7081 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -go1.16.1 \ No newline at end of file +go1.16.2 \ No newline at end of file -- GitLab From 0da04a662a8e46f688bc65bf4fc5440226babe59 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Wed, 10 Mar 2021 16:06:47 -0500 Subject: [PATCH 1781/1792] [release-branch.go1.16] runtime, time: disable preemption in addtimer The timerpMask optimization updates a mask of Ps (potentially) containing timers in pidleget / pidleput. For correctness, it depends on the assumption that new timers can only be added to a P's own heap. addtimer violates this assumption if it is preempted after computing pp. That G may then run on a different P, but adding a timer to the original P's heap. Avoid this by disabling preemption while pp is in use. Other uses of doaddtimer should be OK: * moveTimers: always moves to the current P's heap * modtimer, cleantimers, addAdjustedTimers, runtimer: does not add net new timers to the heap while locked For #44868 Fixes #44869 Change-Id: I4a5d080865e854931d0a3a09a51ca36879101d72 Reviewed-on: https://go-review.googlesource.com/c/go/+/300610 Trust: Michael Pratt Run-TryBot: Michael Pratt Reviewed-by: Michael Knyszek Reviewed-by: Ian Lance Taylor TryBot-Result: Go Bot (cherry picked from commit aa26687e457d825fc9c580e8c029b768e0e70d38) Reviewed-on: https://go-review.googlesource.com/c/go/+/300611 --- src/runtime/time.go | 5 +++++ src/time/sleep_test.go | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/runtime/time.go b/src/runtime/time.go index 8ab2a03430..dee6a674e4 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -263,6 +263,9 @@ func addtimer(t *timer) { when := t.when + // Disable preemption while using pp to avoid changing another P's heap. + mp := acquirem() + pp := getg().m.p.ptr() lock(&pp.timersLock) cleantimers(pp) @@ -270,6 +273,8 @@ func addtimer(t *timer) { unlock(&pp.timersLock) wakeNetPoller(when) + + releasem(mp) } // doaddtimer adds t to the current P's heap. diff --git a/src/time/sleep_test.go b/src/time/sleep_test.go index 084ac33f51..6ee0631a85 100644 --- a/src/time/sleep_test.go +++ b/src/time/sleep_test.go @@ -511,6 +511,22 @@ func TestZeroTimerStopPanics(t *testing.T) { tr.Stop() } +// Test that zero duration timers aren't missed by the scheduler. Regression test for issue 44868. +func TestZeroTimer(t *testing.T) { + if testing.Short() { + t.Skip("-short") + } + + for i := 0; i < 1000000; i++ { + s := Now() + ti := NewTimer(0) + <-ti.C + if diff := Since(s); diff > 2*Second { + t.Errorf("Expected time to get value from Timer channel in less than 2 sec, took %v", diff) + } + } +} + // Benchmark timer latency when the thread that creates the timer is busy with // other work and the timers must be serviced by other threads. // https://golang.org/issue/38860 -- GitLab From f39c4deee812b577ffb84b78e62ce4392d2baeb1 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 12 Mar 2021 13:48:32 -0500 Subject: [PATCH 1782/1792] [release-branch.go1.16] cmd/go: fix godoc formatting for text from 'go help install' Fixes #44860 Change-Id: I5a12c6437a91ce59307483ffcc70e084edc32197 Reviewed-on: https://go-review.googlesource.com/c/go/+/301329 Trust: Jay Conrod Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills Reviewed-by: Dmitri Shuralyov TryBot-Result: Go Bot (cherry picked from commit 86bbf4beee276b9a7f9a427a9d1a9277bd904709) Reviewed-on: https://go-review.googlesource.com/c/go/+/301429 --- src/cmd/go/alldocs.go | 20 ++++++++++++-------- src/cmd/go/internal/work/build.go | 20 ++++++++++++-------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index e7c63f0749..84f89c9d2d 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -692,18 +692,22 @@ // arguments must satisfy the following constraints: // // - Arguments must be package paths or package patterns (with "..." wildcards). -// They must not be standard packages (like fmt), meta-patterns (std, cmd, -// all), or relative or absolute file paths. +// They must not be standard packages (like fmt), meta-patterns (std, cmd, +// all), or relative or absolute file paths. +// // - All arguments must have the same version suffix. Different queries are not -// allowed, even if they refer to the same version. +// allowed, even if they refer to the same version. +// // - All arguments must refer to packages in the same module at the same version. +// // - No module is considered the "main" module. If the module containing -// packages named on the command line has a go.mod file, it must not contain -// directives (replace and exclude) that would cause it to be interpreted -// differently than if it were the main module. The module must not require -// a higher version of itself. +// packages named on the command line has a go.mod file, it must not contain +// directives (replace and exclude) that would cause it to be interpreted +// differently than if it were the main module. The module must not require +// a higher version of itself. +// // - Package path arguments must refer to main packages. Pattern arguments -// will only match main packages. +// will only match main packages. // // If the arguments don't have version suffixes, "go install" may run in // module-aware mode or GOPATH mode, depending on the GO111MODULE environment diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 780d639c5d..f024b07b22 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -482,18 +482,22 @@ To eliminate ambiguity about which module versions are used in the build, the arguments must satisfy the following constraints: - Arguments must be package paths or package patterns (with "..." wildcards). - They must not be standard packages (like fmt), meta-patterns (std, cmd, - all), or relative or absolute file paths. +They must not be standard packages (like fmt), meta-patterns (std, cmd, +all), or relative or absolute file paths. + - All arguments must have the same version suffix. Different queries are not - allowed, even if they refer to the same version. +allowed, even if they refer to the same version. + - All arguments must refer to packages in the same module at the same version. + - No module is considered the "main" module. If the module containing - packages named on the command line has a go.mod file, it must not contain - directives (replace and exclude) that would cause it to be interpreted - differently than if it were the main module. The module must not require - a higher version of itself. +packages named on the command line has a go.mod file, it must not contain +directives (replace and exclude) that would cause it to be interpreted +differently than if it were the main module. The module must not require +a higher version of itself. + - Package path arguments must refer to main packages. Pattern arguments - will only match main packages. +will only match main packages. If the arguments don't have version suffixes, "go install" may run in module-aware mode or GOPATH mode, depending on the GO111MODULE environment -- GitLab From 902d16e97bffe3faf49f48e67c43f7a0827f862c Mon Sep 17 00:00:00 2001 From: Tao Qingyun Date: Thu, 18 Mar 2021 00:10:38 +0000 Subject: [PATCH 1783/1792] [release-branch.go1.16] testing: update helperNames just before checking it parent's helperNames has not been set when frameSkip called, moving helperNames initilazing to frameSkip. For #44887 Fixes #44888 Change-Id: I5107c5951033e5e47d1ac441eac3ba5344a7bdc0 GitHub-Last-Rev: 44b90b2e2eeca8e2bb4a2084ec6fdd279c88f76d GitHub-Pull-Request: golang/go#45071 Reviewed-on: https://go-review.googlesource.com/c/go/+/302469 Trust: Cherry Zhang Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Go Bot (cherry picked from commit 67048432026062a98a3937a865aeb05a398148c5) Reviewed-on: https://go-review.googlesource.com/c/go/+/303189 Trust: Ian Lance Taylor Reviewed-by: Emmanuel Odeke --- src/testing/helper_test.go | 32 ++++++++++++++++++++++++++++++++ src/testing/testing.go | 15 +++++++-------- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/testing/helper_test.go b/src/testing/helper_test.go index 8858196cf0..b27fd62ee8 100644 --- a/src/testing/helper_test.go +++ b/src/testing/helper_test.go @@ -71,6 +71,38 @@ func TestTBHelperParallel(t *T) { } } +func TestTBHelperLineNumer(t *T) { + var buf bytes.Buffer + ctx := newTestContext(1, newMatcher(regexp.MatchString, "", "")) + t1 := &T{ + common: common{ + signal: make(chan bool), + w: &buf, + }, + context: ctx, + } + t1.Run("Test", func(t *T) { + helperA := func(t *T) { + t.Helper() + t.Run("subtest", func(t *T) { + t.Helper() + t.Fatal("fatal error message") + }) + } + helperA(t) + }) + + want := "helper_test.go:92: fatal error message" + got := "" + lines := strings.Split(strings.TrimSpace(buf.String()), "\n") + if len(lines) > 0 { + got = strings.TrimSpace(lines[len(lines)-1]) + } + if got != want { + t.Errorf("got output:\n\n%v\nwant:\n\n%v", got, want) + } +} + type noopWriter int func (nw *noopWriter) Write(b []byte) (int, error) { return len(b), nil } diff --git a/src/testing/testing.go b/src/testing/testing.go index 80354d5ce8..dec39d24da 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -509,6 +509,13 @@ func (c *common) frameSkip(skip int) runtime.Frame { } return prevFrame } + // If more helper PCs have been added since we last did the conversion + if c.helperNames == nil { + c.helperNames = make(map[string]struct{}) + for pc := range c.helperPCs { + c.helperNames[pcToName(pc)] = struct{}{} + } + } if _, ok := c.helperNames[frame.Function]; !ok { // Found a frame that wasn't inside a helper function. return frame @@ -521,14 +528,6 @@ func (c *common) frameSkip(skip int) runtime.Frame { // and inserts the final newline if needed and indentation spaces for formatting. // This function must be called with c.mu held. func (c *common) decorate(s string, skip int) string { - // If more helper PCs have been added since we last did the conversion - if c.helperNames == nil { - c.helperNames = make(map[string]struct{}) - for pc := range c.helperPCs { - c.helperNames[pcToName(pc)] = struct{}{} - } - } - frame := c.frameSkip(skip) file := frame.File line := frame.Line -- GitLab From 33fb47921f65d941b232da2ab542191c9978b4dc Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 3 Mar 2021 16:30:22 -0500 Subject: [PATCH 1784/1792] [release-branch.go1.16] cmd/go/internal/modfetch: detect and recover from missing ziphash file Previously, if an extracted module directory existed in the module cache, but the corresponding ziphash file did not, if the sum was missing from go.sum, we would not verify the sum. This caused 'go get' not to write missing sums. 'go build' in readonly mode (now the default) checks for missing sums and doesn't attempt to fetch modules that can't be verified against go.sum. With this change, when requesting the module directory with modfetch.DownloadDir, if the ziphash file is missing, the go command will re-hash the zip without downloading or re-extracting it again. Note that the go command creates the ziphash file before the module directory, but another program could remove it separately, and it might not be present after a crash. Fixes #44812 Change-Id: I64551e048a3ba17d069de1ec123d5b8b2757543c Reviewed-on: https://go-review.googlesource.com/c/go/+/298352 Trust: Jay Conrod Run-TryBot: Jay Conrod TryBot-Result: Go Bot Reviewed-by: Bryan C. Mills (cherry picked from commit 302a400316319501748c0f034464fa70e7815272) Reviewed-on: https://go-review.googlesource.com/c/go/+/298851 --- src/cmd/go/internal/modfetch/cache.go | 17 ++++ src/cmd/go/internal/modfetch/fetch.go | 77 ++++++++++++------- .../script/mod_get_missing_ziphash.txt | 55 +++++++++++++ src/cmd/go/testdata/script/mod_verify.txt | 7 +- 4 files changed, 125 insertions(+), 31 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_get_missing_ziphash.txt diff --git a/src/cmd/go/internal/modfetch/cache.go b/src/cmd/go/internal/modfetch/cache.go index 3a2ff63721..07e046c8cb 100644 --- a/src/cmd/go/internal/modfetch/cache.go +++ b/src/cmd/go/internal/modfetch/cache.go @@ -84,6 +84,7 @@ func DownloadDir(m module.Version) (string, error) { return "", err } + // Check whether the directory itself exists. dir := filepath.Join(cfg.GOMODCACHE, enc+"@"+encVer) if fi, err := os.Stat(dir); os.IsNotExist(err) { return dir, err @@ -92,6 +93,9 @@ func DownloadDir(m module.Version) (string, error) { } else if !fi.IsDir() { return dir, &DownloadDirPartialError{dir, errors.New("not a directory")} } + + // 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") if err != nil { return dir, err @@ -101,6 +105,19 @@ func DownloadDir(m module.Version) (string, error) { } else if !os.IsNotExist(err) { return dir, err } + + // Check if a .ziphash file exists. It should be created before the + // zip is extracted, but if it was deleted (by another program?), we need + // to re-calculate it. + ziphashPath, err := CachePath(m, "ziphash") + if err != nil { + return dir, err + } + if _, err := os.Stat(ziphashPath); os.IsNotExist(err) { + return dir, &DownloadDirPartialError{dir, errors.New("ziphash file is missing")} + } else if err != nil { + return dir, err + } return dir, nil } diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index c55c3cf253..eb7d30e0ab 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -170,13 +170,16 @@ func DownloadZip(ctx context.Context, mod module.Version) (zipfile string, err e if err != nil { return cached{"", err} } + ziphashfile := zipfile + "hash" - // Skip locking if the zipfile already exists. + // Return without locking if the zip and ziphash files exist. if _, err := os.Stat(zipfile); err == nil { - return cached{zipfile, nil} + if _, err := os.Stat(ziphashfile); err == nil { + return cached{zipfile, nil} + } } - // The zip file does not exist. Acquire the lock and create it. + // 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) } @@ -186,14 +189,6 @@ func DownloadZip(ctx context.Context, mod module.Version) (zipfile string, err e } defer unlock() - // Double-check that the zipfile was not created while we were waiting for - // the lock. - if _, err := os.Stat(zipfile); err == nil { - return cached{zipfile, nil} - } - if err := os.MkdirAll(filepath.Dir(zipfile), 0777); err != nil { - return cached{"", err} - } if err := downloadZip(ctx, mod, zipfile); err != nil { return cached{"", err} } @@ -206,6 +201,25 @@ func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err e ctx, span := trace.StartSpan(ctx, "modfetch.downloadZip "+zipfile) defer span.Done() + // Double-check that the zipfile was not created while we were waiting for + // the lock in DownloadZip. + ziphashfile := zipfile + "hash" + var zipExists, ziphashExists bool + if _, err := os.Stat(zipfile); err == nil { + zipExists = true + } + if _, err := os.Stat(ziphashfile); err == nil { + ziphashExists = true + } + if zipExists && ziphashExists { + return nil + } + + // Create parent directories. + if err := os.MkdirAll(filepath.Dir(zipfile), 0777); err != nil { + return err + } + // Clean up any remaining tempfiles from previous runs. // This is only safe to do because the lock file ensures that their // writers are no longer active. @@ -217,6 +231,12 @@ func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err e } } + // If the zip file exists, the ziphash file must have been deleted + // or lost after a file system crash. Re-hash the zip without downloading. + if zipExists { + return hashZip(mod, zipfile, ziphashfile) + } + // From here to the os.Rename call below is functionally almost equivalent to // renameio.WriteToFile, with one key difference: we want to validate the // contents of the file (by hashing it) before we commit it. Because the file @@ -289,15 +309,7 @@ func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err e } // Hash the zip file and check the sum before renaming to the final location. - hash, err := dirhash.HashZip(f.Name(), dirhash.DefaultHash) - if err != nil { - return err - } - if err := checkModSum(mod, hash); err != nil { - return err - } - - if err := renameio.WriteFile(zipfile+"hash", []byte(hash), 0666); err != nil { + if err := hashZip(mod, f.Name(), ziphashfile); err != nil { return err } if err := os.Rename(f.Name(), zipfile); err != nil { @@ -309,6 +321,22 @@ func downloadZip(ctx context.Context, mod module.Version, zipfile string) (err e return nil } +// hashZip reads the zip file opened in f, then writes the hash to ziphashfile, +// overwriting that file if it exists. +// +// If the hash does not match go.sum (or the sumdb if enabled), hashZip returns +// an error and does not write ziphashfile. +func hashZip(mod module.Version, zipfile, ziphashfile string) error { + hash, err := dirhash.HashZip(zipfile, dirhash.DefaultHash) + if err != nil { + return err + } + if err := checkModSum(mod, hash); err != nil { + return err + } + return renameio.WriteFile(ziphashfile, []byte(hash), 0666) +} + // makeDirsReadOnly makes a best-effort attempt to remove write permissions for dir // and its transitive contents. func makeDirsReadOnly(dir string) { @@ -452,11 +480,6 @@ func HaveSum(mod module.Version) bool { // checkMod checks the given module's checksum. func checkMod(mod module.Version) { - if cfg.GOMODCACHE == "" { - // Do not use current directory. - return - } - // Do the file I/O before acquiring the go.sum lock. ziphash, err := CachePath(mod, "ziphash") if err != nil { @@ -464,10 +487,6 @@ func checkMod(mod module.Version) { } data, err := renameio.ReadFile(ziphash) if err != nil { - if errors.Is(err, fs.ErrNotExist) { - // This can happen if someone does rm -rf GOPATH/src/cache/download. So it goes. - return - } base.Fatalf("verifying %v", module.VersionError(mod, err)) } h := strings.TrimSpace(string(data)) diff --git a/src/cmd/go/testdata/script/mod_get_missing_ziphash.txt b/src/cmd/go/testdata/script/mod_get_missing_ziphash.txt new file mode 100644 index 0000000000..8f6793edf5 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_missing_ziphash.txt @@ -0,0 +1,55 @@ +# Test that if the module cache contains an extracted source directory but not +# a ziphash, 'go build' complains about a missing sum, and 'go get' adds +# the sum. Verifies #44749. + +# With a tidy go.sum, go build succeeds. This also populates the module cache. +cp go.sum.tidy go.sum +go build -n use +env GOPROXY=off +env GOSUMDB=off + +# Control case: if we delete the hash for rsc.io/quote v1.5.2, +# 'go build' reports an error. 'go get' adds the sum. +cp go.sum.bug go.sum +! go build -n use +stderr '^use.go:3:8: missing go.sum entry for module providing package rsc.io/quote \(imported by use\); to add:\n\tgo get use$' +go get -d use +cmp go.sum go.sum.tidy +go build -n use + +# If we delete the hash *and* the ziphash file, we should see the same behavior. +cp go.sum.bug go.sum +rm $WORK/gopath/pkg/mod/cache/download/rsc.io/quote/@v/v1.5.2.ziphash +! go build -n use +stderr '^use.go:3:8: missing go.sum entry for module providing package rsc.io/quote \(imported by use\); to add:\n\tgo get use$' +go get -d use +cmp go.sum go.sum.tidy +go build -n use + +-- go.mod -- +module use + +go 1.17 + +require rsc.io/quote v1.5.2 +-- go.sum.tidy -- +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:pvCbr/wm8HzDD3fVywevekufpn6tCGPY3spdHeZJEsw= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +rsc.io/quote v1.5.2 h1:3fEykkD9k7lYzXqCYrwGAf7iNhbk4yCjHmKBN9td4L0= +rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= +rsc.io/sampler v1.3.0 h1:HLGR/BgEtI3r0uymSP/nl2uPLsUnNJX8toRyhfpBTII= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/testonly v1.0.0 h1:K/VWHdO+Jv7woUXG0GzVNx1czBXUt3Ib1deaMn+xk64= +rsc.io/testonly v1.0.0/go.mod h1:OqmGbIFOcF+XrFReLOGZ6BhMM7uMBiQwZsyNmh74SzY= +-- go.sum.bug -- +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:pvCbr/wm8HzDD3fVywevekufpn6tCGPY3spdHeZJEsw= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0= +rsc.io/sampler v1.3.0 h1:HLGR/BgEtI3r0uymSP/nl2uPLsUnNJX8toRyhfpBTII= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +rsc.io/testonly v1.0.0 h1:K/VWHdO+Jv7woUXG0GzVNx1czBXUt3Ib1deaMn+xk64= +rsc.io/testonly v1.0.0/go.mod h1:OqmGbIFOcF+XrFReLOGZ6BhMM7uMBiQwZsyNmh74SzY= +-- use.go -- +package use + +import _ "rsc.io/quote" diff --git a/src/cmd/go/testdata/script/mod_verify.txt b/src/cmd/go/testdata/script/mod_verify.txt index 43812d069f..b5106659a9 100644 --- a/src/cmd/go/testdata/script/mod_verify.txt +++ b/src/cmd/go/testdata/script/mod_verify.txt @@ -48,10 +48,13 @@ go mod tidy grep '^rsc.io/quote v1.1.0/go.mod ' go.sum grep '^rsc.io/quote v1.1.0 ' go.sum -# sync should ignore missing ziphash; verify should not +# verify should fail on a missing ziphash. tidy should restore it. rm $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.1.0.ziphash -go mod tidy ! go mod verify +stderr '^rsc.io/quote v1.1.0: missing ziphash: open '$GOPATH'[/\\]pkg[/\\]mod[/\\]cache[/\\]download[/\\]rsc.io[/\\]quote[/\\]@v[/\\]v1.1.0.ziphash' +go mod tidy +exists $GOPATH/pkg/mod/cache/download/rsc.io/quote/@v/v1.1.0.ziphash +go mod verify # Packages below module root should not be mentioned in go.sum. rm go.sum -- GitLab From ac59d7abb9ab5ec31cb0fe1eaccbdf3b17edbde0 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 12 Mar 2021 23:21:09 -0500 Subject: [PATCH 1785/1792] [release-branch.go1.16] cmd/compile, cmd/link: dynamically export writable static tmps Static tmps are private to a package, but with plugins a package can be shared among multiple DSOs. They need to have a consistent view of the static tmps, especially for writable ones. So export them. (Read-only static tmps have the same values anyway, so it doesn't matter. Also Mach-O doesn't support dynamically exporting read-only symbols anyway.) Updates #44956. Fixes #45030. Change-Id: I921e25b7ab73cd5d5347800eccdb7931e3448779 Reviewed-on: https://go-review.googlesource.com/c/go/+/301793 Trust: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh (cherry picked from commit de012bc095359e1b552d4ea6fb6b2995f3ab04f5) Reviewed-on: https://go-review.googlesource.com/c/go/+/302449 --- misc/cgo/testplugin/plugin_test.go | 7 +++ .../testdata/issue44956/base/base.go | 7 +++ .../testplugin/testdata/issue44956/main.go | 47 +++++++++++++++++++ .../testplugin/testdata/issue44956/plugin1.go | 9 ++++ .../testplugin/testdata/issue44956/plugin2.go | 11 +++++ src/cmd/compile/internal/gc/sinit.go | 4 +- src/cmd/link/internal/ld/symtab.go | 13 +++-- 7 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 misc/cgo/testplugin/testdata/issue44956/base/base.go create mode 100644 misc/cgo/testplugin/testdata/issue44956/main.go create mode 100644 misc/cgo/testplugin/testdata/issue44956/plugin1.go create mode 100644 misc/cgo/testplugin/testdata/issue44956/plugin2.go diff --git a/misc/cgo/testplugin/plugin_test.go b/misc/cgo/testplugin/plugin_test.go index 2d991012c8..8869528015 100644 --- a/misc/cgo/testplugin/plugin_test.go +++ b/misc/cgo/testplugin/plugin_test.go @@ -209,3 +209,10 @@ func TestMethod2(t *testing.T) { goCmd(t, "build", "-o", "method2.exe", "./method2/main.go") run(t, "./method2.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") +} diff --git a/misc/cgo/testplugin/testdata/issue44956/base/base.go b/misc/cgo/testplugin/testdata/issue44956/base/base.go new file mode 100644 index 0000000000..609aa0dff4 --- /dev/null +++ b/misc/cgo/testplugin/testdata/issue44956/base/base.go @@ -0,0 +1,7 @@ +// 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 base + +var X = &map[int]int{123: 456} diff --git a/misc/cgo/testplugin/testdata/issue44956/main.go b/misc/cgo/testplugin/testdata/issue44956/main.go new file mode 100644 index 0000000000..287a60585e --- /dev/null +++ b/misc/cgo/testplugin/testdata/issue44956/main.go @@ -0,0 +1,47 @@ +// 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 44956: writable static temp is not exported correctly. +// In the test below, package base is +// +// X = &map{...} +// +// which compiles to +// +// X = &stmp // static +// stmp = makemap(...) // in init function +// +// plugin1 and plugin2 both import base. plugin1 doesn't use +// base.X, so that symbol is deadcoded in plugin1. +// +// plugin1 is loaded first. base.init runs at that point, which +// initialize base.stmp. +// +// plugin2 is then loaded. base.init already ran, so it doesn't run +// again. When base.stmp is not exported, plugin2's base.X points to +// its own private base.stmp, which is not initialized, fail. + +package main + +import "plugin" + +func main() { + _, err := plugin.Open("issue44956p1.so") + if err != nil { + panic("FAIL") + } + + p2, err := plugin.Open("issue44956p2.so") + if err != nil { + panic("FAIL") + } + f, err := p2.Lookup("F") + if err != nil { + panic("FAIL") + } + x := f.(func() *map[int]int)() + if x == nil || (*x)[123] != 456 { + panic("FAIL") + } +} diff --git a/misc/cgo/testplugin/testdata/issue44956/plugin1.go b/misc/cgo/testplugin/testdata/issue44956/plugin1.go new file mode 100644 index 0000000000..499fa31abf --- /dev/null +++ b/misc/cgo/testplugin/testdata/issue44956/plugin1.go @@ -0,0 +1,9 @@ +// 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 main + +import _ "testplugin/issue44956/base" + +func main() {} diff --git a/misc/cgo/testplugin/testdata/issue44956/plugin2.go b/misc/cgo/testplugin/testdata/issue44956/plugin2.go new file mode 100644 index 0000000000..a73542ca71 --- /dev/null +++ b/misc/cgo/testplugin/testdata/issue44956/plugin2.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. + +package main + +import "testplugin/issue44956/base" + +func F() *map[int]int { return base.X } + +func main() {} diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 212fcc022d..4d0837bc74 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -363,15 +363,15 @@ func staticname(t *types.Type) *Node { n := newname(lookup(fmt.Sprintf("%s%d", obj.StaticNamePref, statuniqgen))) statuniqgen++ addvar(n, t, PEXTERN) - n.Sym.Linksym().Set(obj.AttrLocal, true) return n } -// readonlystaticname returns a name backed by a (writable) static data symbol. +// readonlystaticname returns a name backed by a read-only static data symbol. func readonlystaticname(t *types.Type) *Node { n := staticname(t) n.MarkReadonly() n.Sym.Linksym().Set(obj.AttrContentAddressable, true) + n.Sym.Linksym().Set(obj.AttrLocal, true) return n } diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index c98e4de03f..f54cf9ea2f 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -31,6 +31,7 @@ package ld import ( + "cmd/internal/obj" "cmd/internal/objabi" "cmd/link/internal/loader" "cmd/link/internal/sym" @@ -102,10 +103,14 @@ func putelfsym(ctxt *Link, x loader.Sym, typ elf.SymType, curbind elf.SymBind) { elfshnum = xosect.Elfsect.(*ElfShdr).shnum } + sname := ldr.SymExtname(x) + // One pass for each binding: elf.STB_LOCAL, elf.STB_GLOBAL, // maybe one day elf.STB_WEAK. bind := elf.STB_GLOBAL - if ldr.IsFileLocal(x) || ldr.AttrVisibilityHidden(x) || ldr.AttrLocal(x) { + if ldr.IsFileLocal(x) && !isStaticTmp(sname) || ldr.AttrVisibilityHidden(x) || ldr.AttrLocal(x) { + // Static tmp is package local, but a package can be shared among multiple DSOs. + // They need to have a single view of the static tmp that are writable. bind = elf.STB_LOCAL } @@ -140,8 +145,6 @@ func putelfsym(ctxt *Link, x loader.Sym, typ elf.SymType, curbind elf.SymBind) { other |= 3 << 5 } - sname := ldr.SymExtname(x) - // When dynamically linking, we create Symbols by reading the names from // the symbol tables of the shared libraries and so the names need to // match exactly. Tools like DTrace will have to wait for now. @@ -823,3 +826,7 @@ func setCarrierSize(typ sym.SymKind, sz int64) { } CarrierSymByType[typ].Size = sz } + +func isStaticTmp(name string) bool { + return strings.Contains(name, "."+obj.StaticNamePref) +} -- GitLab From 9c7463ca903863a0c67b3f76454b37da0a400c13 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 16 Feb 2021 10:20:58 -0500 Subject: [PATCH 1786/1792] [release-branch.go1.16] cmd/link: generate trampoline for inter-dependent packages Currently, in the trampoline generation pass we expect packages are laid out in dependency order, so a cross-package jump always has a known target address so we can check if a trampoline is needed. With linknames, there can be cycles in the package dependency graph, making this algorithm no longer work. For them, as the target address is unkown we conservatively generate a trampoline. This may generate unnecessary trampolines (if the packages turn out laid together), but package cycles are extremely rare so this is fine. Updates #44639. Fixes #44640. Change-Id: I2dc2998edacbda27d726fc79452313a21d07787a Reviewed-on: https://go-review.googlesource.com/c/go/+/292490 Trust: Cherry Zhang Reviewed-by: Than McIntosh (cherry picked from commit 098504c73ff6ece19566a1ac811ceed73be7c81d) Reviewed-on: https://go-review.googlesource.com/c/go/+/296909 Run-TryBot: Cherry Zhang TryBot-Result: Go Bot --- src/cmd/link/internal/arm/asm.go | 16 +++++++++++----- src/cmd/link/internal/ld/data.go | 12 +++++------- src/cmd/link/internal/ppc64/asm.go | 12 +++++++++--- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 755b472694..03caeae7be 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -370,10 +370,16 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) { r := relocs.At(ri) switch r.Type() { case objabi.R_CALLARM: - // r.Add is the instruction - // low 24-bit encodes the target address - t := (ldr.SymValue(rs) + int64(signext24(r.Add()&0xffffff)*4) - (ldr.SymValue(s) + int64(r.Off()))) / 4 - if t > 0x7fffff || t < -0x800000 || (*ld.FlagDebugTramp > 1 && ldr.SymPkg(s) != ldr.SymPkg(rs)) { + var t int64 + // ldr.SymValue(rs) == 0 indicates a cross-package jump to a function that is not yet + // laid out. Conservatively use a trampoline. This should be rare, as we lay out packages + // in dependency order. + if ldr.SymValue(rs) != 0 { + // r.Add is the instruction + // low 24-bit encodes the target address + 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)) { // 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. @@ -445,7 +451,7 @@ func gentramp(arch *sys.Arch, linkmode ld.LinkMode, ldr *loader.Loader, tramp *l arch.ByteOrder.PutUint32(P[8:], o3) tramp.SetData(P) - if linkmode == ld.LinkExternal { + if linkmode == ld.LinkExternal || ldr.SymValue(target) == 0 { r, _ := tramp.AddRel(objabi.R_ADDR) r.SetOff(8) r.SetSiz(4) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 6013e0ab0a..52035e9630 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -106,14 +106,12 @@ func trampoline(ctxt *Link, s loader.Sym) { } rs = ldr.ResolveABIAlias(rs) if ldr.SymValue(rs) == 0 && (ldr.SymType(rs) != sym.SDYNIMPORT && ldr.SymType(rs) != sym.SUNDEFEXT) { - if ldr.SymPkg(rs) != ldr.SymPkg(s) { - if !isRuntimeDepPkg(ldr.SymPkg(s)) || !isRuntimeDepPkg(ldr.SymPkg(rs)) { - ctxt.Errorf(s, "unresolved inter-package jump to %s(%s) from %s", ldr.SymName(rs), ldr.SymPkg(rs), ldr.SymPkg(s)) - } - // runtime and its dependent packages may call to each other. - // they are fine, as they will be laid down together. + if ldr.SymPkg(rs) == ldr.SymPkg(s) { + continue // symbols in the same package are laid out together + } + if isRuntimeDepPkg(ldr.SymPkg(s)) && isRuntimeDepPkg(ldr.SymPkg(rs)) { + continue // runtime packages are laid out together } - continue } thearch.Trampoline(ctxt, ldr, ri, rs, s) diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 5bf3898eb9..602f0b5299 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -656,13 +656,19 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) { relocs := ldr.Relocs(s) r := relocs.At(ri) - t := ldr.SymValue(rs) + r.Add() - (ldr.SymValue(s) + int64(r.Off())) + var t int64 + // ldr.SymValue(rs) == 0 indicates a cross-package jump to a function that is not yet + // laid out. Conservatively use a trampoline. This should be rare, as we lay out packages + // in dependency order. + if ldr.SymValue(rs) != 0 { + t = ldr.SymValue(rs) + r.Add() - (ldr.SymValue(s) + int64(r.Off())) + } switch r.Type() { case objabi.R_CALLPOWER: // If branch offset is too far then create a trampoline. - if (ctxt.IsExternal() && ldr.SymSect(s) != ldr.SymSect(rs)) || (ctxt.IsInternal() && int64(int32(t<<6)>>6) != t) || (*ld.FlagDebugTramp > 1 && ldr.SymPkg(s) != ldr.SymPkg(rs)) { + if (ctxt.IsExternal() && ldr.SymSect(s) != ldr.SymSect(rs)) || (ctxt.IsInternal() && int64(int32(t<<6)>>6) != t) || ldr.SymValue(rs) == 0 || (*ld.FlagDebugTramp > 1 && ldr.SymPkg(s) != ldr.SymPkg(rs)) { var tramp loader.Sym for i := 0; ; i++ { @@ -749,7 +755,7 @@ func gentramp(ctxt *ld.Link, ldr *loader.Loader, tramp *loader.SymbolBuilder, ta // With external linking, the target address must be // relocated using LO and HA - if ctxt.IsExternal() { + if ctxt.IsExternal() || ldr.SymValue(target) == 0 { r, _ := tramp.AddRel(objabi.R_ADDRPOWER) r.SetOff(0) r.SetSiz(8) // generates 2 relocations: HA + LO -- GitLab From 1d967ab95c43b6b8810ca53d6a18aff85e59a3b6 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 26 Jan 2021 21:14:43 -0500 Subject: [PATCH 1787/1792] [release-branch.go1.16] build: set GOPATH consistently in run.bash, run.bat, run.rc We used to clear GOPATH in all the build scripts. Clearing GOPATH is misleading at best, since you just end up with the default GOPATH (%USERPROFILE%\go on Windows). Unless that's your GOROOT, in which case you end up with a fatal error from the go command (#43938). run.bash changed to setting GOPATH=/dev/null, which has no clear analogue on Windows. run.rc still clears GOPATH. Change them all to set GOPATH to a non-existent directory /nonexist-gopath or c:\nonexist-gopath. For #45238. Fixes #45240. Change-Id: I51edd66d37ff6a891b0d0541d91ecba97fbbb03d Reviewed-on: https://go-review.googlesource.com/c/go/+/288818 Trust: Russ Cox Trust: Jason A. Donenfeld Reviewed-by: Cherry Zhang Reviewed-by: Alex Brainman Reviewed-by: Jason A. Donenfeld (cherry picked from commit bb6efb96092cc8ae398c29e3b052a0051c746f88) Reviewed-on: https://go-review.googlesource.com/c/go/+/304772 Run-TryBot: Dmitri Shuralyov TryBot-Result: Go Bot Reviewed-by: Alexander Rakoczy Reviewed-by: Carlos Amedee Trust: Carlos Amedee --- src/run.bash | 10 +--------- src/run.bat | 4 +--- src/run.rc | 9 ++++----- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/run.bash b/src/run.bash index 706b4b60ee..2123c509f8 100755 --- a/src/run.bash +++ b/src/run.bash @@ -23,15 +23,7 @@ fi eval $(../bin/go env) export GOROOT # The api test requires GOROOT to be set, so set it to match ../bin/go. - -# We disallow local import for non-local packages, if $GOROOT happens -# to be under $GOPATH, then some tests below will fail. $GOPATH needs -# to be set to a non-empty string, else Go will set a default value -# that may also conflict with $GOROOT. The $GOPATH value doesn't need -# to point to an actual directory, it just needs to pass the semantic -# checks performed by Go. Use $GOROOT to define $GOPATH so that we -# don't blunder into a user-defined symbolic link. -export GOPATH=/dev/null +export GOPATH=/nonexist-gopath unset CDPATH # in case user has it set export GOBIN=$GOROOT/bin # Issue 14340 diff --git a/src/run.bat b/src/run.bat index c299671c13..edcaf52659 100644 --- a/src/run.bat +++ b/src/run.bat @@ -18,9 +18,7 @@ setlocal set GOBUILDFAIL=0 -:: we disallow local import for non-local packages, if %GOROOT% happens -:: to be under %GOPATH%, then some tests below will fail -set GOPATH= +set GOPATH=c:\nonexist-gopath :: Issue 14340: ignore GOBIN during all.bat. set GOBIN= set GOFLAGS= diff --git a/src/run.rc b/src/run.rc index ab7abfa991..a7b4801207 100755 --- a/src/run.rc +++ b/src/run.rc @@ -12,10 +12,9 @@ if(! test -f ../bin/go){ eval `{../bin/go env} -GOPATH = () # we disallow local import for non-local packages, if $GOROOT happens - # to be under $GOPATH, then some tests below will fail -GOBIN = () # Issue 14340 -GOFLAGS = () -GO111MODULE = () +GOPATH=/nonexist-gopath +GOBIN=() # Issue 14340 +GOFLAGS=() +GO111MODULE=() exec ../bin/go tool dist test -rebuild $* -- GitLab From 2940614c63ed1351c47038db4ec613a37d1e72fd Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 9 Mar 2021 17:23:04 -0500 Subject: [PATCH 1788/1792] [release-branch.go1.16] cmd/go: allow '+' in package import paths in module mode This change upgrades x/mod to pull in the fix from CL 300152. Updates #44776. Fixes #44885. Change-Id: I273f41df2abfff76d91315b7f19fce851c8770d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/300176 Trust: Bryan C. Mills Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod TryBot-Result: Go Bot (cherry picked from commit d33e2192a71c33a604af247161ba1d2c1969e4c7) Reviewed-on: https://go-review.googlesource.com/c/go/+/300153 --- src/cmd/go.mod | 2 +- src/cmd/go.sum | 4 +- .../testdata/script/mod_invalid_path_plus.txt | 32 ++++++++++++++++ .../vendor/golang.org/x/mod/module/module.go | 38 +++++++++++++++---- src/cmd/vendor/modules.txt | 2 +- 5 files changed, 66 insertions(+), 12 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_invalid_path_plus.txt diff --git a/src/cmd/go.mod b/src/cmd/go.mod index 35582f3975..70b1b0690b 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -6,7 +6,7 @@ require ( github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2 golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 - golang.org/x/mod v0.4.2-0.20210302225053-d515b24adc21 + golang.org/x/mod v0.4.2-0.20210325185522-dbbbf8a3c6ea golang.org/x/sys v0.0.0-20201204225414-ed752295db88 // indirect golang.org/x/tools v0.0.0-20210107193943-4ed967dd8eff ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 10340d441f..edda18b526 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -14,8 +14,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2-0.20210302225053-d515b24adc21 h1:FnWKa8BJXkVQ+16E52jkfBOJPx2cG8y/6X376nOgSM4= -golang.org/x/mod v0.4.2-0.20210302225053-d515b24adc21/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2-0.20210325185522-dbbbf8a3c6ea h1:zAn46O7Vmm6KdLXx+635hPZSArrt/wNctv4Ab70Jw3k= +golang.org/x/mod v0.4.2-0.20210325185522-dbbbf8a3c6ea/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= diff --git a/src/cmd/go/testdata/script/mod_invalid_path_plus.txt b/src/cmd/go/testdata/script/mod_invalid_path_plus.txt new file mode 100644 index 0000000000..2f2488f01b --- /dev/null +++ b/src/cmd/go/testdata/script/mod_invalid_path_plus.txt @@ -0,0 +1,32 @@ +# https://golang.org/issue/44776 +# The '+' character should be disallowed in module paths, but allowed in package +# paths within valid modules. + +go get -d example.net/cmd +go list example.net/cmd/x++ + +! go list -versions -m 'example.net/bad++' +stderr '^go list -m: module example.net/bad\+\+: malformed module path "example.net/bad\+\+": invalid char ''\+''$' + +# TODO(bcmills): 'go get -d example.net/cmd/x++' should also work, but currently +# it does not. This might be fixed by https://golang.org/cl/297891. +! go get -d example.net/cmd/x++ +stderr '^go get: malformed module path "example.net/cmd/x\+\+": invalid char ''\+''$' + +-- go.mod -- +module example.com/m + +go 1.16 + +replace ( + example.net/cmd => ./cmd +) + +-- cmd/go.mod -- +module example.net/cmd + +go 1.16 +-- cmd/x++/main.go -- +package main + +func main() {} 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 272baeef17..0e03014837 100644 --- a/src/cmd/vendor/golang.org/x/mod/module/module.go +++ b/src/cmd/vendor/golang.org/x/mod/module/module.go @@ -224,12 +224,16 @@ func firstPathOK(r rune) bool { 'a' <= r && r <= 'z' } -// pathOK reports whether r can appear in an import path element. +// modPathOK reports whether r can appear in a module path element. // Paths can be ASCII letters, ASCII digits, and limited ASCII punctuation: - . _ and ~. -// This matches what "go get" has historically recognized in import paths. +// +// This matches what "go get" has historically recognized in import paths, +// and avoids confusing sequences like '%20' or '+' that would change meaning +// if used in a URL. +// // TODO(rsc): We would like to allow Unicode letters, but that requires additional // care in the safe encoding (see "escaped paths" above). -func pathOK(r rune) bool { +func modPathOK(r rune) bool { if r < utf8.RuneSelf { return r == '-' || r == '.' || r == '_' || r == '~' || '0' <= r && r <= '9' || @@ -239,6 +243,17 @@ func pathOK(r rune) bool { return false } +// modPathOK reports whether r can appear in a package import path element. +// +// Import paths are intermediate between module paths and file paths: we allow +// disallow characters that would be confusing or ambiguous as arguments to +// 'go get' (such as '@' and ' ' ), but allow certain characters that are +// otherwise-unambiguous on the command line and historically used for some +// binary names (such as '++' as a suffix for compiler binaries and wrappers). +func importPathOK(r rune) bool { + return modPathOK(r) || r == '+' +} + // fileNameOK reports whether r can appear in a file name. // For now we allow all Unicode letters but otherwise limit to pathOK plus a few more punctuation characters. // If we expand the set of allowed characters here, we have to @@ -394,12 +409,19 @@ func checkElem(elem string, kind pathKind) error { if elem[len(elem)-1] == '.' { return fmt.Errorf("trailing dot in path element") } - charOK := pathOK - if kind == filePath { - charOK = fileNameOK - } for _, r := range elem { - if !charOK(r) { + ok := false + switch kind { + case modulePath: + ok = modPathOK(r) + case importPath: + ok = importPathOK(r) + case filePath: + ok = fileNameOK(r) + default: + panic(fmt.Sprintf("internal error: invalid kind %v", kind)) + } + if !ok { return fmt.Errorf("invalid char %q", r) } } diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 10842768a8..ae2c0a00cc 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -28,7 +28,7 @@ golang.org/x/arch/x86/x86asm golang.org/x/crypto/ed25519 golang.org/x/crypto/ed25519/internal/edwards25519 golang.org/x/crypto/ssh/terminal -# golang.org/x/mod v0.4.2-0.20210302225053-d515b24adc21 +# golang.org/x/mod v0.4.2-0.20210325185522-dbbbf8a3c6ea ## explicit golang.org/x/mod/internal/lazyregexp golang.org/x/mod/modfile -- GitLab From 3a45c13094e2bf1ac1430ce6af8b8be80bf0938e Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 23 Mar 2021 14:48:47 -0700 Subject: [PATCH 1789/1792] [release-branch.go1.16] cmd/compile: disable shortcircuit optimization for intertwined phi values We need to be careful that when doing value graph surgery, we not re-substitute a value that has already been substituted. That can lead to confusing a previous iteration's value with the current iteration's value. The simple fix in this CL just aborts the optimization if it detects intertwined phis (a phi which is the argument to another phi). It might be possible to keep the optimization with a more complicated CL, but: 1) This CL is clearly safe to backport. 2) There were no instances of this abort triggering in all.bash, prior to the test introduced in this CL. Fixes #45192 Change-Id: I2411dca03948653c053291f6829a76bec0c32330 Reviewed-on: https://go-review.googlesource.com/c/go/+/304251 Trust: Keith Randall Trust: Josh Bleecher Snyder Run-TryBot: Keith Randall TryBot-Result: Go Bot Reviewed-by: Josh Bleecher Snyder (cherry picked from commit 771c57e68ed5ef2bbb0eafc0d48419f59d143932) Reviewed-on: https://go-review.googlesource.com/c/go/+/304530 --- src/cmd/compile/internal/ssa/shortcircuit.go | 18 ++++++++++++ test/fixedbugs/issue45175.go | 29 ++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 test/fixedbugs/issue45175.go diff --git a/src/cmd/compile/internal/ssa/shortcircuit.go b/src/cmd/compile/internal/ssa/shortcircuit.go index 7b4ee2e81c..4dd86ec74f 100644 --- a/src/cmd/compile/internal/ssa/shortcircuit.go +++ b/src/cmd/compile/internal/ssa/shortcircuit.go @@ -138,6 +138,24 @@ func shortcircuitBlock(b *Block) bool { if len(b.Values) != nval+nOtherPhi { return false } + if nOtherPhi > 0 { + // Check for any phi which is the argument of another phi. + // These cases are tricky, as substitutions done by replaceUses + // are no longer trivial to do in any ordering. See issue 45175. + m := make(map[*Value]bool, 1+nOtherPhi) + for _, v := range b.Values { + if v.Op == OpPhi { + m[v] = true + } + } + for v := range m { + for _, a := range v.Args { + if a != v && m[a] { + return false + } + } + } + } // Locate index of first const phi arg. cidx := -1 diff --git a/test/fixedbugs/issue45175.go b/test/fixedbugs/issue45175.go new file mode 100644 index 0000000000..02dfe8a0a9 --- /dev/null +++ b/test/fixedbugs/issue45175.go @@ -0,0 +1,29 @@ +// run + +// 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 main + +//go:noinline +func f(c bool) int { + b := true + x := 0 + y := 1 + for b { + b = false + y = x + x = 2 + if c { + return 3 + } + } + return y +} + +func main() { + if got := f(false); got != 0 { + panic(got) + } +} -- GitLab From 887c0d890fd33a72cc1de6316252ba37649145cb Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Thu, 11 Mar 2021 12:28:45 -0500 Subject: [PATCH 1790/1792] [release-branch.go1.16] runtime: non-strict InlTreeIndex lookup in Frames.Next When using cgo, some of the frames can be provided by cgoTraceback, a cgo-provided function to generate C tracebacks. Unlike Go tracebacks, cgoTraceback has no particular guarantees that it produces valid tracebacks. If one of the (invalid) frames happens to put the PC in the alignment region at the end of a function (filled with int 3's on amd64), then Frames.Next will find a valid funcInfo for the PC, but pcdatavalue will panic because PCDATA doesn't cover this PC. Tolerate this case by doing a non-strict PCDATA lookup. We'll still show a bogus frame, but at least avoid throwing. For #44971 Fixes #45303 Change-Id: I9eed728470d6f264179a7615bd19845c941db78c Reviewed-on: https://go-review.googlesource.com/c/go/+/301369 Trust: Michael Pratt Run-TryBot: Michael Pratt TryBot-Result: Go Bot Reviewed-by: Cherry Zhang (cherry picked from commit e4a4161f1f3157550846e1b6bd4fe83aae15778e) Reviewed-on: https://go-review.googlesource.com/c/go/+/305889 --- src/runtime/symtab.go | 4 +- src/runtime/symtab_test.go | 85 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index 7667f23f1d..09225fb03a 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -102,7 +102,9 @@ func (ci *Frames) Next() (frame Frame, more bool) { name := funcname(funcInfo) if inldata := funcdata(funcInfo, _FUNCDATA_InlTree); inldata != nil { inltree := (*[1 << 20]inlinedCall)(inldata) - ix := pcdatavalue(funcInfo, _PCDATA_InlTreeIndex, pc, nil) + // 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 diff --git a/src/runtime/symtab_test.go b/src/runtime/symtab_test.go index 01e5002659..ffa07c7f3a 100644 --- a/src/runtime/symtab_test.go +++ b/src/runtime/symtab_test.go @@ -8,6 +8,7 @@ import ( "runtime" "strings" "testing" + "unsafe" ) func TestCaller(t *testing.T) { @@ -165,3 +166,87 @@ func TestNilName(t *testing.T) { t.Errorf("Name() = %q, want %q", got, "") } } + +var dummy int + +func inlined() { + // Side effect to prevent elimination of this entire function. + dummy = 42 +} + +// A function with an InlTree. Returns a PC within the function body. +// +// No inline to ensure this complete function appears in output. +// +//go:noinline +func tracebackFunc(t *testing.T) uintptr { + // This body must be more complex than a single call to inlined to get + // an inline tree. + inlined() + inlined() + + // Acquire a PC in this function. + pc, _, _, ok := runtime.Caller(0) + if !ok { + t.Fatalf("Caller(0) got ok false, want true") + } + + return pc +} + +// Test that CallersFrames handles PCs in the alignment region between +// functions (int 3 on amd64) without crashing. +// +// Go will never generate a stack trace containing such an address, as it is +// not a valid call site. However, the cgo traceback function passed to +// runtime.SetCgoTraceback may not be completely accurate and may incorrect +// provide PCs in Go code or the alignement region between functions. +// +// Go obviously doesn't easily expose the problematic PCs to running programs, +// so this test is a bit fragile. Some details: +// +// * tracebackFunc is our target function. We want to get a PC in the +// alignment region following this function. This function also has other +// functions inlined into it to ensure it has an InlTree (this was the source +// of the bug in issue 44971). +// +// * We acquire a PC in tracebackFunc, walking forwards until FuncForPC says +// we're in a new function. The last PC of the function according to FuncForPC +// should be in the alignment region (assuming the function isn't already +// perfectly aligned). +// +// This is a regression test for issue 44971. +func TestFunctionAlignmentTraceback(t *testing.T) { + pc := tracebackFunc(t) + + // Double-check we got the right PC. + f := runtime.FuncForPC(pc) + if !strings.HasSuffix(f.Name(), "tracebackFunc") { + t.Fatalf("Caller(0) = %+v, want tracebackFunc", f) + } + + // Iterate forward until we find a different function. Back up one + // instruction is (hopefully) an alignment instruction. + for runtime.FuncForPC(pc) == f { + pc++ + } + pc-- + + // Is this an alignment region filler instruction? We only check this + // on amd64 for simplicity. If this function has no filler, then we may + // get a false negative, but will never get a false positive. + if runtime.GOARCH == "amd64" { + code := *(*uint8)(unsafe.Pointer(pc)) + if code != 0xcc { // INT $3 + t.Errorf("PC %v code got %#x want 0xcc", pc, code) + } + } + + // Finally ensure that Frames.Next doesn't crash when processing this + // PC. + frames := runtime.CallersFrames([]uintptr{pc}) + frame, _ := frames.Next() + if frame.Func != f { + t.Errorf("frames.Next() got %+v want %+v", frame.Func, f) + } +} -- GitLab From 96139f25993f3d8122e27a6fec877a4d4f69f83b Mon Sep 17 00:00:00 2001 From: Pat Gavlin Date: Fri, 26 Mar 2021 14:46:37 +0000 Subject: [PATCH 1791/1792] [release-branch.go1.16] cmd/compile: fix long RMW bit operations on AMD64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under certain circumstances, the existing rules for bit operations can produce code that writes beyond its intended bounds. For example, consider the following code: func repro(b []byte, addr, bit int32) { _ = b[3] v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 | 1<<(bit&31) b[0] = byte(v) b[1] = byte(v >> 8) b[2] = byte(v >> 16) b[3] = byte(v >> 24) } Roughly speaking: 1. The expression `1 << (bit & 31)` is rewritten into `(SHLL 1 bit)` 2. The expression `uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24` is rewritten into `(MOVLload &b[0])` 3. The statements `b[0] = byte(v) ... b[3] = byte(v >> 24)` are rewritten into `(MOVLstore &b[0], v)` 4. `(ORL (SHLL 1, bit) (MOVLload &b[0]))` is rewritten into `(BTSL (MOVLload &b[0]) bit)`. This is a valid transformation because the destination is a register: in this case, the bit offset is masked by the number of bits in the destination register. This is identical to the masking performed by `SHL`. 5. `(MOVLstore &b[0] (BTSL (MOVLload &b[0]) bit))` is rewritten into `(BTSLmodify &b[0] bit)`. This is an invalid transformation because the destination is memory: in this case, the bit offset is not masked, and the chosen instruction may write outside its intended 32-bit location. These changes fix the invalid rewrite performed in step (5) by explicitly maksing the bit offset operand to `BT(S|R|C)(L|Q)modify`. In the example above, the adjusted rules produce `(BTSLmodify &b[0] (ANDLconst [31] bit))` in step (5). These changes also add several new rules to rewrite bit sets, toggles, and clears that are rooted at `(OR|XOR|AND)(L|Q)modify` operators into appropriate `BT(S|R|C)(L|Q)modify` operators. These rules catch cases where `MOV(L|Q)store ((OR|XOR|AND)(L|Q) ...)` is rewritten to `(OR|XOR|AND)(L|Q)modify` before the `(OR|XOR|AND)(L|Q) ...` can be rewritten to `BT(S|R|C)(L|Q) ...`. Overall, compilecmp reports small improvements in code size on darwin/amd64 when the changes to the compiler itself are exlcuded: file before after Δ % runtime.s 536464 536412 -52 -0.010% bytes.s 32629 32593 -36 -0.110% strings.s 44565 44529 -36 -0.081% os/signal.s 7967 7959 -8 -0.100% cmd/vendor/golang.org/x/sys/unix.s 81686 81678 -8 -0.010% math/big.s 188235 188253 +18 +0.010% cmd/link/internal/loader.s 89295 89056 -239 -0.268% cmd/link/internal/ld.s 633551 633232 -319 -0.050% cmd/link/internal/arm.s 18934 18928 -6 -0.032% cmd/link/internal/arm64.s 31814 31801 -13 -0.041% cmd/link/internal/riscv64.s 7347 7345 -2 -0.027% cmd/compile/internal/ssa.s 4029173 4033066 +3893 +0.097% total 21298280 21301472 +3192 +0.015% Fixes #45253 Change-Id: I2e560548b515865129e1724e150e30540e9d29ce GitHub-Last-Rev: ab94ede1d097f920a9d1d3da403c8e4a3d8f6d44 GitHub-Pull-Request: golang/go#45242 Reviewed-on: https://go-review.googlesource.com/c/go/+/305069 Trust: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Go Bot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/AMD64.rules | 24 +- src/cmd/compile/internal/ssa/gen/AMD64Ops.go | 5 + src/cmd/compile/internal/ssa/rewriteAMD64.go | 229 +++++++++++++++++-- test/codegen/bits.go | 10 +- 4 files changed, 244 insertions(+), 24 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/AMD64.rules b/src/cmd/compile/internal/ssa/gen/AMD64.rules index a866a967b9..5de1e1ec31 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64.rules +++ b/src/cmd/compile/internal/ssa/gen/AMD64.rules @@ -623,6 +623,14 @@ // Recognize bit setting (a |= 1< (BTS(Q|L) x y) (XOR(Q|L) (SHL(Q|L) (MOV(Q|L)const [1]) y) x) => (BTC(Q|L) x y) +(ORLmodify [off] {sym} ptr s:(SHLL (MOVLconst [1]) x) mem) => + (BTSLmodify [off] {sym} ptr (ANDLconst [31] x) mem) +(ORQmodify [off] {sym} ptr s:(SHLQ (MOVQconst [1]) x) mem) => + (BTSQmodify [off] {sym} ptr (ANDQconst [63] x) mem) +(XORLmodify [off] {sym} ptr s:(SHLL (MOVLconst [1]) x) mem) => + (BTCLmodify [off] {sym} ptr (ANDLconst [31] x) mem) +(XORQmodify [off] {sym} ptr s:(SHLQ (MOVQconst [1]) x) mem) => + (BTCQmodify [off] {sym} ptr (ANDQconst [63] x) mem) // Convert ORconst into BTS, if the code gets smaller, with boundary being // (ORL $40,AX is 3 bytes, ORL $80,AX is 6 bytes). @@ -645,6 +653,10 @@ => (BTRQconst [int8(log64(^c))] x) (ANDL (MOVLconst [c]) x) && isUint32PowerOfTwo(int64(^c)) && uint64(^c) >= 128 => (BTRLconst [int8(log32(^c))] x) +(ANDLmodify [off] {sym} ptr (NOTL s:(SHLL (MOVLconst [1]) x)) mem) => + (BTRLmodify [off] {sym} ptr (ANDLconst [31] x) mem) +(ANDQmodify [off] {sym} ptr (NOTQ s:(SHLQ (MOVQconst [1]) x)) mem) => + (BTRQmodify [off] {sym} ptr (ANDQconst [63] x) mem) // Special-case bit patterns on first/last bit. // generic.rules changes ANDs of high-part/low-part masks into a couple of shifts, @@ -2050,11 +2062,15 @@ ((ADD|SUB|MUL|DIV)SD x l:(MOVSDload [off] {sym} ptr mem)) && canMergeLoadClobber(v, l, x) && clobber(l) => ((ADD|SUB|MUL|DIV)SDload x [off] {sym} ptr mem) ((ADD|SUB|MUL|DIV)SS x l:(MOVSSload [off] {sym} ptr mem)) && canMergeLoadClobber(v, l, x) && clobber(l) => ((ADD|SUB|MUL|DIV)SSload x [off] {sym} ptr mem) (MOVLstore {sym} [off] ptr y:((ADD|AND|OR|XOR)Lload x [off] {sym} ptr mem) mem) && y.Uses==1 && clobber(y) => ((ADD|AND|OR|XOR)Lmodify [off] {sym} ptr x mem) -(MOVLstore {sym} [off] ptr y:((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)L l:(MOVLload [off] {sym} ptr mem) x) mem) && y.Uses==1 && l.Uses==1 && clobber(y, l) => - ((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Lmodify [off] {sym} ptr x mem) +(MOVLstore {sym} [off] ptr y:((ADD|SUB|AND|OR|XOR)L l:(MOVLload [off] {sym} ptr mem) x) mem) && y.Uses==1 && l.Uses==1 && clobber(y, l) => + ((ADD|SUB|AND|OR|XOR)Lmodify [off] {sym} ptr x mem) +(MOVLstore {sym} [off] ptr y:((BTC|BTR|BTS)L l:(MOVLload [off] {sym} ptr mem) x) mem) && y.Uses==1 && l.Uses==1 && clobber(y, l) => + ((BTC|BTR|BTS)Lmodify [off] {sym} ptr (ANDLconst [31] x) mem) (MOVQstore {sym} [off] ptr y:((ADD|AND|OR|XOR)Qload x [off] {sym} ptr mem) mem) && y.Uses==1 && clobber(y) => ((ADD|AND|OR|XOR)Qmodify [off] {sym} ptr x mem) -(MOVQstore {sym} [off] ptr y:((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Q l:(MOVQload [off] {sym} ptr mem) x) mem) && y.Uses==1 && l.Uses==1 && clobber(y, l) => - ((ADD|SUB|AND|OR|XOR|BTC|BTR|BTS)Qmodify [off] {sym} ptr x mem) +(MOVQstore {sym} [off] ptr y:((ADD|SUB|AND|OR|XOR)Q l:(MOVQload [off] {sym} ptr mem) x) mem) && y.Uses==1 && l.Uses==1 && clobber(y, l) => + ((ADD|SUB|AND|OR|XOR)Qmodify [off] {sym} ptr x mem) +(MOVQstore {sym} [off] ptr y:((BTC|BTR|BTS)Q l:(MOVQload [off] {sym} ptr mem) x) mem) && y.Uses==1 && l.Uses==1 && clobber(y, l) => + ((BTC|BTR|BTS)Qmodify [off] {sym} ptr (ANDQconst [63] x) mem) // Merge ADDQconst and LEAQ into atomic loads. (MOV(Q|L|B)atomicload [off1] {sym} (ADDQconst [off2] ptr) mem) && is32Bit(int64(off1)+int64(off2)) => diff --git a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go index de5372670b..a87581b68f 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go @@ -358,6 +358,11 @@ func init() { {name: "BTSQconst", argLength: 1, reg: gp11, asm: "BTSQ", resultInArg0: true, clobberFlags: true, aux: "Int8"}, // set bit auxint in arg0, 0 <= auxint < 64 // direct bit operation on memory operand + // + // Note that these operations do not mask the bit offset (arg1), and will write beyond their expected + // bounds if that argument is larger than 64/32 (for BT*Q and BT*L, respectively). If the compiler + // cannot prove that arg1 is in range, it must be explicitly masked (see e.g. the patterns that produce + // BT*modify from (MOVstore (BT* (MOVLload ptr mem) x) mem)). {name: "BTCQmodify", argLength: 3, reg: gpstore, asm: "BTCQ", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // complement bit arg1 in 64-bit arg0+auxint+aux, arg2=mem {name: "BTCLmodify", argLength: 3, reg: gpstore, asm: "BTCL", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // complement bit arg1 in 32-bit arg0+auxint+aux, arg2=mem {name: "BTSQmodify", argLength: 3, reg: gpstore, asm: "BTSQ", aux: "SymOff", typ: "Mem", clobberFlags: true, faultOnNilArg0: true, symEffect: "Read,Write"}, // set bit arg1 in 64-bit arg0+auxint+aux, arg2=mem diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index 75d4ff7357..8272a406d9 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -2998,6 +2998,36 @@ func rewriteValueAMD64_OpAMD64ANDLmodify(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] + b := v.Block + // match: (ANDLmodify [off] {sym} ptr (NOTL s:(SHLL (MOVLconst [1]) x)) mem) + // result: (BTRLmodify [off] {sym} ptr (ANDLconst [31] x) mem) + for { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + ptr := v_0 + if v_1.Op != OpAMD64NOTL { + break + } + s := v_1.Args[0] + if s.Op != OpAMD64SHLL { + break + } + t := s.Type + x := s.Args[1] + s_0 := s.Args[0] + if s_0.Op != OpAMD64MOVLconst || auxIntToInt32(s_0.AuxInt) != 1 { + break + } + mem := v_2 + v.reset(OpAMD64BTRLmodify) + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) + v0 := b.NewValue0(v.Pos, OpAMD64ANDLconst, t) + v0.AuxInt = int32ToAuxInt(31) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) + return true + } // match: (ANDLmodify [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(int64(off1)+int64(off2)) // result: (ANDLmodify [off1+off2] {sym} base val mem) @@ -3377,6 +3407,36 @@ func rewriteValueAMD64_OpAMD64ANDQmodify(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] + b := v.Block + // match: (ANDQmodify [off] {sym} ptr (NOTQ s:(SHLQ (MOVQconst [1]) x)) mem) + // result: (BTRQmodify [off] {sym} ptr (ANDQconst [63] x) mem) + for { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + ptr := v_0 + if v_1.Op != OpAMD64NOTQ { + break + } + s := v_1.Args[0] + if s.Op != OpAMD64SHLQ { + break + } + t := s.Type + x := s.Args[1] + s_0 := s.Args[0] + if s_0.Op != OpAMD64MOVQconst || auxIntToInt64(s_0.AuxInt) != 1 { + break + } + mem := v_2 + v.reset(OpAMD64BTRQmodify) + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) + v0 := b.NewValue0(v.Pos, OpAMD64ANDQconst, t) + v0.AuxInt = int32ToAuxInt(63) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) + return true + } // match: (ANDQmodify [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(int64(off1)+int64(off2)) // result: (ANDQmodify [off1+off2] {sym} base val mem) @@ -12709,9 +12769,9 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { } break } - // match: (MOVLstore {sym} [off] ptr y:(BTCL l:(MOVLload [off] {sym} ptr mem) x) mem) + // match: (MOVLstore {sym} [off] ptr y:(BTCL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y, l) - // result: (BTCLmodify [off] {sym} ptr x mem) + // result: (BTCLmodify [off] {sym} ptr (ANDLconst [31] x) mem) for { off := auxIntToInt32(v.AuxInt) sym := auxToSym(v.Aux) @@ -12720,6 +12780,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { if y.Op != OpAMD64BTCL { break } + t := y.Type x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload || auxIntToInt32(l.AuxInt) != off || auxToSym(l.Aux) != sym { @@ -12732,12 +12793,15 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { v.reset(OpAMD64BTCLmodify) v.AuxInt = int32ToAuxInt(off) v.Aux = symToAux(sym) - v.AddArg3(ptr, x, mem) + v0 := b.NewValue0(l.Pos, OpAMD64ANDLconst, t) + v0.AuxInt = int32ToAuxInt(31) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(BTRL l:(MOVLload [off] {sym} ptr mem) x) mem) + // match: (MOVLstore {sym} [off] ptr y:(BTRL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y, l) - // result: (BTRLmodify [off] {sym} ptr x mem) + // result: (BTRLmodify [off] {sym} ptr (ANDLconst [31] x) mem) for { off := auxIntToInt32(v.AuxInt) sym := auxToSym(v.Aux) @@ -12746,6 +12810,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { if y.Op != OpAMD64BTRL { break } + t := y.Type x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload || auxIntToInt32(l.AuxInt) != off || auxToSym(l.Aux) != sym { @@ -12758,12 +12823,15 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { v.reset(OpAMD64BTRLmodify) v.AuxInt = int32ToAuxInt(off) v.Aux = symToAux(sym) - v.AddArg3(ptr, x, mem) + v0 := b.NewValue0(l.Pos, OpAMD64ANDLconst, t) + v0.AuxInt = int32ToAuxInt(31) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) return true } - // match: (MOVLstore {sym} [off] ptr y:(BTSL l:(MOVLload [off] {sym} ptr mem) x) mem) + // match: (MOVLstore {sym} [off] ptr y:(BTSL l:(MOVLload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y, l) - // result: (BTSLmodify [off] {sym} ptr x mem) + // result: (BTSLmodify [off] {sym} ptr (ANDLconst [31] x) mem) for { off := auxIntToInt32(v.AuxInt) sym := auxToSym(v.Aux) @@ -12772,6 +12840,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { if y.Op != OpAMD64BTSL { break } + t := y.Type x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload || auxIntToInt32(l.AuxInt) != off || auxToSym(l.Aux) != sym { @@ -12784,7 +12853,10 @@ func rewriteValueAMD64_OpAMD64MOVLstore(v *Value) bool { v.reset(OpAMD64BTSLmodify) v.AuxInt = int32ToAuxInt(off) v.Aux = symToAux(sym) - v.AddArg3(ptr, x, mem) + v0 := b.NewValue0(l.Pos, OpAMD64ANDLconst, t) + v0.AuxInt = int32ToAuxInt(31) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) return true } // match: (MOVLstore [off] {sym} ptr a:(ADDLconst [c] l:(MOVLload [off] {sym} ptr2 mem)) mem) @@ -13525,6 +13597,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] + b := v.Block // match: (MOVQstore [off1] {sym} (ADDQconst [off2] ptr) val mem) // cond: is32Bit(int64(off1)+int64(off2)) // result: (MOVQstore [off1+off2] {sym} ptr val mem) @@ -13890,9 +13963,9 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { } break } - // match: (MOVQstore {sym} [off] ptr y:(BTCQ l:(MOVQload [off] {sym} ptr mem) x) mem) + // match: (MOVQstore {sym} [off] ptr y:(BTCQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y, l) - // result: (BTCQmodify [off] {sym} ptr x mem) + // result: (BTCQmodify [off] {sym} ptr (ANDQconst [63] x) mem) for { off := auxIntToInt32(v.AuxInt) sym := auxToSym(v.Aux) @@ -13901,6 +13974,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { if y.Op != OpAMD64BTCQ { break } + t := y.Type x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload || auxIntToInt32(l.AuxInt) != off || auxToSym(l.Aux) != sym { @@ -13913,12 +13987,15 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { v.reset(OpAMD64BTCQmodify) v.AuxInt = int32ToAuxInt(off) v.Aux = symToAux(sym) - v.AddArg3(ptr, x, mem) + v0 := b.NewValue0(l.Pos, OpAMD64ANDQconst, t) + v0.AuxInt = int32ToAuxInt(63) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) return true } - // match: (MOVQstore {sym} [off] ptr y:(BTRQ l:(MOVQload [off] {sym} ptr mem) x) mem) + // match: (MOVQstore {sym} [off] ptr y:(BTRQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y, l) - // result: (BTRQmodify [off] {sym} ptr x mem) + // result: (BTRQmodify [off] {sym} ptr (ANDQconst [63] x) mem) for { off := auxIntToInt32(v.AuxInt) sym := auxToSym(v.Aux) @@ -13927,6 +14004,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { if y.Op != OpAMD64BTRQ { break } + t := y.Type x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload || auxIntToInt32(l.AuxInt) != off || auxToSym(l.Aux) != sym { @@ -13939,12 +14017,15 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { v.reset(OpAMD64BTRQmodify) v.AuxInt = int32ToAuxInt(off) v.Aux = symToAux(sym) - v.AddArg3(ptr, x, mem) + v0 := b.NewValue0(l.Pos, OpAMD64ANDQconst, t) + v0.AuxInt = int32ToAuxInt(63) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) return true } - // match: (MOVQstore {sym} [off] ptr y:(BTSQ l:(MOVQload [off] {sym} ptr mem) x) mem) + // match: (MOVQstore {sym} [off] ptr y:(BTSQ l:(MOVQload [off] {sym} ptr mem) x) mem) // cond: y.Uses==1 && l.Uses==1 && clobber(y, l) - // result: (BTSQmodify [off] {sym} ptr x mem) + // result: (BTSQmodify [off] {sym} ptr (ANDQconst [63] x) mem) for { off := auxIntToInt32(v.AuxInt) sym := auxToSym(v.Aux) @@ -13953,6 +14034,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { if y.Op != OpAMD64BTSQ { break } + t := y.Type x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload || auxIntToInt32(l.AuxInt) != off || auxToSym(l.Aux) != sym { @@ -13965,7 +14047,10 @@ func rewriteValueAMD64_OpAMD64MOVQstore(v *Value) bool { v.reset(OpAMD64BTSQmodify) v.AuxInt = int32ToAuxInt(off) v.Aux = symToAux(sym) - v.AddArg3(ptr, x, mem) + v0 := b.NewValue0(l.Pos, OpAMD64ANDQconst, t) + v0.AuxInt = int32ToAuxInt(63) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) return true } // match: (MOVQstore [off] {sym} ptr a:(ADDQconst [c] l:(MOVQload [off] {sym} ptr2 mem)) mem) @@ -18352,6 +18437,33 @@ func rewriteValueAMD64_OpAMD64ORLmodify(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] + b := v.Block + // match: (ORLmodify [off] {sym} ptr s:(SHLL (MOVLconst [1]) x) mem) + // result: (BTSLmodify [off] {sym} ptr (ANDLconst [31] x) mem) + for { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + ptr := v_0 + s := v_1 + if s.Op != OpAMD64SHLL { + break + } + t := s.Type + x := s.Args[1] + s_0 := s.Args[0] + if s_0.Op != OpAMD64MOVLconst || auxIntToInt32(s_0.AuxInt) != 1 { + break + } + mem := v_2 + v.reset(OpAMD64BTSLmodify) + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) + v0 := b.NewValue0(v.Pos, OpAMD64ANDLconst, t) + v0.AuxInt = int32ToAuxInt(31) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) + return true + } // match: (ORLmodify [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(int64(off1)+int64(off2)) // result: (ORLmodify [off1+off2] {sym} base val mem) @@ -19979,6 +20091,33 @@ func rewriteValueAMD64_OpAMD64ORQmodify(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] + b := v.Block + // match: (ORQmodify [off] {sym} ptr s:(SHLQ (MOVQconst [1]) x) mem) + // result: (BTSQmodify [off] {sym} ptr (ANDQconst [63] x) mem) + for { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + ptr := v_0 + s := v_1 + if s.Op != OpAMD64SHLQ { + break + } + t := s.Type + x := s.Args[1] + s_0 := s.Args[0] + if s_0.Op != OpAMD64MOVQconst || auxIntToInt64(s_0.AuxInt) != 1 { + break + } + mem := v_2 + v.reset(OpAMD64BTSQmodify) + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) + v0 := b.NewValue0(v.Pos, OpAMD64ANDQconst, t) + v0.AuxInt = int32ToAuxInt(63) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) + return true + } // match: (ORQmodify [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(int64(off1)+int64(off2)) // result: (ORQmodify [off1+off2] {sym} base val mem) @@ -28014,6 +28153,33 @@ func rewriteValueAMD64_OpAMD64XORLmodify(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] + b := v.Block + // match: (XORLmodify [off] {sym} ptr s:(SHLL (MOVLconst [1]) x) mem) + // result: (BTCLmodify [off] {sym} ptr (ANDLconst [31] x) mem) + for { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + ptr := v_0 + s := v_1 + if s.Op != OpAMD64SHLL { + break + } + t := s.Type + x := s.Args[1] + s_0 := s.Args[0] + if s_0.Op != OpAMD64MOVLconst || auxIntToInt32(s_0.AuxInt) != 1 { + break + } + mem := v_2 + v.reset(OpAMD64BTCLmodify) + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) + v0 := b.NewValue0(v.Pos, OpAMD64ANDLconst, t) + v0.AuxInt = int32ToAuxInt(31) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) + return true + } // match: (XORLmodify [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(int64(off1)+int64(off2)) // result: (XORLmodify [off1+off2] {sym} base val mem) @@ -28382,6 +28548,33 @@ func rewriteValueAMD64_OpAMD64XORQmodify(v *Value) bool { v_2 := v.Args[2] v_1 := v.Args[1] v_0 := v.Args[0] + b := v.Block + // match: (XORQmodify [off] {sym} ptr s:(SHLQ (MOVQconst [1]) x) mem) + // result: (BTCQmodify [off] {sym} ptr (ANDQconst [63] x) mem) + for { + off := auxIntToInt32(v.AuxInt) + sym := auxToSym(v.Aux) + ptr := v_0 + s := v_1 + if s.Op != OpAMD64SHLQ { + break + } + t := s.Type + x := s.Args[1] + s_0 := s.Args[0] + if s_0.Op != OpAMD64MOVQconst || auxIntToInt64(s_0.AuxInt) != 1 { + break + } + mem := v_2 + v.reset(OpAMD64BTCQmodify) + v.AuxInt = int32ToAuxInt(off) + v.Aux = symToAux(sym) + v0 := b.NewValue0(v.Pos, OpAMD64ANDQconst, t) + v0.AuxInt = int32ToAuxInt(63) + v0.AddArg(x) + v.AddArg3(ptr, v0, mem) + return true + } // match: (XORQmodify [off1] {sym} (ADDQconst [off2] base) val mem) // cond: is32Bit(int64(off1)+int64(off2)) // result: (XORQmodify [off1+off2] {sym} base val mem) diff --git a/test/codegen/bits.go b/test/codegen/bits.go index 4508eba487..6f7502292a 100644 --- a/test/codegen/bits.go +++ b/test/codegen/bits.go @@ -262,8 +262,8 @@ func bitcompl32(a, b uint32) (n uint32) { return n } -// check direct operation on memory with constant source -func bitOpOnMem(a []uint32) { +// check direct operation on memory with constant and shifted constant sources +func bitOpOnMem(a []uint32, b, c, d uint32) { // amd64:`ANDL\s[$]200,\s\([A-Z]+\)` a[0] &= 200 // amd64:`ORL\s[$]220,\s4\([A-Z]+\)` @@ -276,6 +276,12 @@ func bitOpOnMem(a []uint32) { a[4] |= 0x4000 // amd64:`BTCL\s[$]13,\s20\([A-Z]+\)`,-`XORL` a[5] ^= 0x2000 + // amd64:`BTRL\s[A-Z]+,\s24\([A-Z]+\)` + a[6] &^= 1 << (b & 31) + // amd64:`BTSL\s[A-Z]+,\s28\([A-Z]+\)` + a[7] |= 1 << (c & 31) + // amd64:`BTCL\s[A-Z]+,\s32\([A-Z]+\)` + a[8] ^= 1 << (d & 31) } func bitcheckMostNegative(b uint8) bool { -- GitLab From 9baddd3f21230c55f0ad2a10f5f20579dcf0a0bb Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Thu, 1 Apr 2021 11:28:29 -0400 Subject: [PATCH 1792/1792] [release-branch.go1.16] go1.16.3 Change-Id: Iace7cfec757a6d0bac25f729be5ecb2ae3b59d74 Reviewed-on: https://go-review.googlesource.com/c/go/+/306569 Run-TryBot: Dmitri Shuralyov Run-TryBot: Carlos Amedee Reviewed-by: Dmitri Shuralyov Reviewed-by: David Chase TryBot-Result: Go Bot --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d47e8e7081..ea60ca03a0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -go1.16.2 \ No newline at end of file +go1.16.3 \ No newline at end of file -- GitLab

    + tls.Conn + now returns an opaque error on permanently broken connections, wrapping + the temporary + net.Error. To access the + original net.Error, use + errors.As (or + errors.Unwrap) instead of a + type assertion. +